forked from ChromeDevTools/devtools-frontend
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathenforce-default-import-name.js
72 lines (64 loc) · 2.04 KB
/
enforce-default-import-name.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
// Copyright 2024 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
'use strict';
const path = require('path');
function isStarAsImportSpecifier(specifiers) {
return specifiers.length === 1 && specifiers[0].type === 'ImportNamespaceSpecifier';
}
/**
* @type {import('eslint').Rule.RuleModule}
*/
module.exports = {
meta: {
type: 'problem',
docs: {
description: 'enforce default names for certain module imports',
category: 'Possible Errors',
},
fixable: 'code',
messages: {
invalidName: 'When importing {{importPath}}, the name used must be {{requiredName}}'
},
schema: {
type: 'array',
items: {
type: 'object',
properties: {
modulePath: {type: 'string'},
importName: {type: 'string'}
}
}
}
},
create: function(context) {
const filename = context.filename ?? context.getFilename();
const importingFileName = path.resolve(filename);
const importingDir = path.dirname(importingFileName);
return {
ImportDeclaration(node) {
if(!isStarAsImportSpecifier(node.specifiers)) {
// We only support checking `import * as X` based on the DevTools
// conventions for module imports.
return;
}
const importPath = path.normalize(node.source.value);
const importPathForErrorMessage = node.source.value.replace(/\\/g, '/');
const absoluteImportPath = path.resolve(importingDir, importPath);
const importNameInCode = node.specifiers[0].local.name;
for (const check of context.options) {
if(absoluteImportPath === check.modulePath && importNameInCode !== check.importName) {
context.report({
messageId: 'invalidName',
node,
data: {
importPath: importPathForErrorMessage,
requiredName: check.importName,
}
});
}
}
}
};
}
};