Skip to content

Commit 9ea1536

Browse files
committed
[New] no-dynamic-require: support dynamic import with espree
1 parent 0ded887 commit 9ea1536

File tree

2 files changed

+146
-75
lines changed

2 files changed

+146
-75
lines changed

src/rules/no-dynamic-require.js

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ function isStaticValue(arg) {
1919
(arg.type === 'TemplateLiteral' && arg.expressions.length === 0);
2020
}
2121

22+
const dynamicImportErrorMessage = 'Calls to import() should use string literals';
23+
2224
module.exports = {
2325
meta: {
2426
type: 'suggestion',
@@ -55,10 +57,19 @@ module.exports = {
5557
if (options.esmodule && isDynamicImport(node)) {
5658
return context.report({
5759
node,
58-
message: 'Calls to import() should use string literals',
60+
message: dynamicImportErrorMessage,
5961
});
6062
}
6163
},
64+
ImportExpression(node) {
65+
if (!options.esmodule || isStaticValue(node.source)) {
66+
return;
67+
}
68+
return context.report({
69+
node,
70+
message: dynamicImportErrorMessage,
71+
});
72+
},
6273
};
6374
},
6475
};

tests/src/rules/no-dynamic-require.js

Lines changed: 134 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
1-
import { parsers, test } from '../utils';
1+
import { parsers, test, testVersion } from '../utils';
22

33
import { RuleTester } from 'eslint';
4+
import flatMap from 'array.prototype.flatmap';
45

56
const ruleTester = new RuleTester();
67
const rule = require('rules/no-dynamic-require');
78

9+
const espree = require.resolve('espree');
10+
811
const error = {
912
message: 'Calls to require() should use string literals',
1013
};
@@ -28,56 +31,93 @@ ruleTester.run('no-dynamic-require', rule, {
2831
test({ code: 'var foo = require("@scope/foo")' }),
2932

3033
//dynamic import
31-
test({
32-
code: 'import("foo")',
33-
parser: parsers.BABEL_OLD,
34-
options: [{ esmodule: true }],
35-
}),
36-
test({
37-
code: 'import(`foo`)',
38-
parser: parsers.BABEL_OLD,
39-
options: [{ esmodule: true }],
40-
}),
41-
test({
42-
code: 'import("./foo")',
43-
parser: parsers.BABEL_OLD,
44-
options: [{ esmodule: true }],
45-
}),
46-
test({
47-
code: 'import("@scope/foo")',
48-
parser: parsers.BABEL_OLD,
49-
options: [{ esmodule: true }],
50-
}),
51-
test({
52-
code: 'var foo = import("foo")',
53-
parser: parsers.BABEL_OLD,
54-
options: [{ esmodule: true }],
55-
}),
56-
test({
57-
code: 'var foo = import(`foo`)',
58-
parser: parsers.BABEL_OLD,
59-
options: [{ esmodule: true }],
60-
}),
61-
test({
62-
code: 'var foo = import("./foo")',
63-
parser: parsers.BABEL_OLD,
64-
options: [{ esmodule: true }],
65-
}),
66-
test({
67-
code: 'var foo = import("@scope/foo")',
68-
parser: parsers.BABEL_OLD,
69-
options: [{ esmodule: true }],
70-
}),
71-
test({
72-
code: 'import("../" + name)',
73-
errors: [dynamicImportError],
74-
parser: parsers.BABEL_OLD,
75-
options: [{ esmodule: false }],
76-
}),
77-
test({
78-
code: 'import(`../${name}`)',
79-
errors: [dynamicImportError],
80-
parser: parsers.BABEL_OLD,
34+
...flatMap([espree, parsers.BABEL_OLD], (parser) => {
35+
const _test =
36+
parser === espree
37+
? (testObj) => testVersion('>= 6.2.0', () => testObj)
38+
: (testObj) => test(testObj);
39+
return [
40+
_test({
41+
code: 'import("foo")',
42+
options: [{ esmodule: true }],
43+
parser,
44+
parserOptions: {
45+
ecmaVersion: 2020,
46+
},
47+
}),
48+
_test({
49+
code: 'import(`foo`)',
50+
options: [{ esmodule: true }],
51+
parser,
52+
parserOptions: {
53+
ecmaVersion: 2020,
54+
},
55+
}),
56+
_test({
57+
code: 'import("./foo")',
58+
options: [{ esmodule: true }],
59+
parser,
60+
parserOptions: {
61+
ecmaVersion: 2020,
62+
},
63+
}),
64+
_test({
65+
code: 'import("@scope/foo")',
66+
options: [{ esmodule: true }],
67+
parser,
68+
parserOptions: {
69+
ecmaVersion: 2020,
70+
},
71+
}),
72+
_test({
73+
code: 'var foo = import("foo")',
74+
options: [{ esmodule: true }],
75+
parser,
76+
parserOptions: {
77+
ecmaVersion: 2020,
78+
},
79+
}),
80+
_test({
81+
code: 'var foo = import(`foo`)',
82+
options: [{ esmodule: true }],
83+
parser,
84+
parserOptions: {
85+
ecmaVersion: 2020,
86+
},
87+
}),
88+
_test({
89+
code: 'var foo = import("./foo")',
90+
options: [{ esmodule: true }],
91+
parser,
92+
parserOptions: {
93+
ecmaVersion: 2020,
94+
},
95+
}),
96+
_test({
97+
code: 'var foo = import("@scope/foo")',
98+
options: [{ esmodule: true }],
99+
parser,
100+
parserOptions: {
101+
ecmaVersion: 2020,
102+
},
103+
}),
104+
_test({
105+
code: 'import("../" + name)',
106+
errors: [dynamicImportError],
107+
parser,
108+
parserOptions: {
109+
ecmaVersion: 2020,
110+
},
111+
}),
112+
_test({
113+
code: 'import(`../${name}`)',
114+
errors: [dynamicImportError],
115+
parser,
116+
parserOptions: {
117+
ecmaVersion: 2020,
118+
},
119+
}),
120+
];
81121
}),
82122
],
83123
invalid: [
@@ -104,29 +144,49 @@ ruleTester.run('no-dynamic-require', rule, {
104144
}),
105145

106146
// dynamic import
107-
test({
108-
code: 'import("../" + name)',
109-
errors: [dynamicImportError],
110-
parser: parsers.BABEL_OLD,
111-
options: [{ esmodule: true }],
112-
}),
113-
test({
114-
code: 'import(`../${name}`)',
115-
errors: [dynamicImportError],
116-
parser: parsers.BABEL_OLD,
117-
options: [{ esmodule: true }],
118-
}),
119-
test({
120-
code: 'import(name)',
121-
errors: [dynamicImportError],
122-
parser: parsers.BABEL_OLD,
123-
options: [{ esmodule: true }],
124-
}),
125-
test({
126-
code: 'import(name())',
127-
errors: [dynamicImportError],
128-
parser: parsers.BABEL_OLD,
129-
options: [{ esmodule: true }],
147+
...flatMap([espree, parsers.BABEL_OLD], (parser) => {
148+
const _test =
149+
parser === espree
150+
? (testObj) => testVersion('>= 6.2.0', () => testObj)
151+
: (testObj) => test(testObj);
152+
return [
153+
_test({
154+
code: 'import("../" + name)',
155+
errors: [dynamicImportError],
156+
options: [{ esmodule: true }],
157+
parser,
158+
parserOptions: {
159+
ecmaVersion: 2020,
160+
},
161+
}),
162+
_test({
163+
code: 'import(`../${name}`)',
164+
errors: [dynamicImportError],
165+
options: [{ esmodule: true }],
166+
parser,
167+
parserOptions: {
168+
ecmaVersion: 2020,
169+
},
170+
}),
171+
_test({
172+
code: 'import(name)',
173+
errors: [dynamicImportError],
174+
options: [{ esmodule: true }],
175+
parser,
176+
parserOptions: {
177+
ecmaVersion: 2020,
178+
},
179+
}),
180+
_test({
181+
code: 'import(name())',
182+
errors: [dynamicImportError],
183+
options: [{ esmodule: true }],
184+
parser,
185+
parserOptions: {
186+
ecmaVersion: 2020,
187+
},
188+
}),
189+
];
130190
}),
131191
test({
132192
code: 'require(`foo${x}`)',

0 commit comments

Comments
 (0)