Skip to content

Commit 7163824

Browse files
vikr01ljharb
authored andcommittedOct 26, 2018
[New] no-dynamic-require: add option esmodule
See #700.
1 parent 00d7bc8 commit 7163824

File tree

3 files changed

+118
-3
lines changed

3 files changed

+118
-3
lines changed
 

‎CHANGELOG.md

+4
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@ This change log adheres to standards from [Keep a CHANGELOG](http://keepachangel
66

77
## [Unreleased]
88

9+
### Added
10+
- [`no-dynamic-require`]: add option `esmodule` ([#1223], thanks [@vikr01])
11+
912
### Fixed
1013
- [`no-duplicates`]: ensure autofix avoids excessive newlines ([#2028], thanks [@ertrzyiks])
1114
- [`extensions`]: avoid crashing on partially typed import/export statements ([#2118], thanks [@ljharb])
@@ -888,6 +891,7 @@ for info on changes for earlier releases.
888891
[#1619]: https://github.com/benmosher/eslint-plugin-import/pull/1619
889892
[#1612]: https://github.com/benmosher/eslint-plugin-import/pull/1612
890893
[#1611]: https://github.com/benmosher/eslint-plugin-import/pull/1611
894+
[#1223]: https://github.com/benmosher/eslint-plugin-import/pull/1223
891895
[#1605]: https://github.com/benmosher/eslint-plugin-import/pull/1605
892896
[#1586]: https://github.com/benmosher/eslint-plugin-import/pull/1586
893897
[#1572]: https://github.com/benmosher/eslint-plugin-import/pull/1572

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

+30-3
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,12 @@ function isRequire(node) {
88
node.arguments.length >= 1;
99
}
1010

11+
function isDynamicImport(node) {
12+
return node &&
13+
node.callee &&
14+
node.callee.type === 'Import';
15+
}
16+
1117
function isStaticValue(arg) {
1218
return arg.type === 'Literal' ||
1319
(arg.type === 'TemplateLiteral' && arg.expressions.length === 0);
@@ -19,18 +25,39 @@ module.exports = {
1925
docs: {
2026
url: docsUrl('no-dynamic-require'),
2127
},
22-
schema: [],
28+
schema: [
29+
{
30+
type: 'object',
31+
properties: {
32+
esmodule: {
33+
type: 'boolean',
34+
},
35+
},
36+
additionalProperties: false,
37+
},
38+
],
2339
},
2440

2541
create: function (context) {
42+
const options = context.options[0] || {};
43+
2644
return {
2745
CallExpression(node) {
28-
if (isRequire(node) && !isStaticValue(node.arguments[0])) {
29-
context.report({
46+
if (!node.arguments[0] || isStaticValue(node.arguments[0])) {
47+
return;
48+
}
49+
if (isRequire(node)) {
50+
return context.report({
3051
node,
3152
message: 'Calls to require() should use string literals',
3253
});
3354
}
55+
if (options.esmodule && isDynamicImport(node)) {
56+
return context.report({
57+
node,
58+
message: 'Calls to import() should use string literals',
59+
});
60+
}
3461
},
3562
};
3663
},

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

+84
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,10 @@ const error = {
99
message: 'Calls to require() should use string literals',
1010
};
1111

12+
const dynamicImportError = {
13+
message: 'Calls to import() should use string literals',
14+
};
15+
1216
ruleTester.run('no-dynamic-require', rule, {
1317
valid: [
1418
test({ code: 'import _ from "lodash"' }),
@@ -22,6 +26,59 @@ ruleTester.run('no-dynamic-require', rule, {
2226
test({ code: 'var foo = require(`foo`)' }),
2327
test({ code: 'var foo = require("./foo")' }),
2428
test({ code: 'var foo = require("@scope/foo")' }),
29+
30+
//dynamic import
31+
test({
32+
code: 'import("foo")',
33+
parser: require.resolve('babel-eslint'),
34+
options: [{ esmodule: true }],
35+
}),
36+
test({
37+
code: 'import(`foo`)',
38+
parser: require.resolve('babel-eslint'),
39+
options: [{ esmodule: true }],
40+
}),
41+
test({
42+
code: 'import("./foo")',
43+
parser: require.resolve('babel-eslint'),
44+
options: [{ esmodule: true }],
45+
}),
46+
test({
47+
code: 'import("@scope/foo")',
48+
parser: require.resolve('babel-eslint'),
49+
options: [{ esmodule: true }],
50+
}),
51+
test({
52+
code: 'var foo = import("foo")',
53+
parser: require.resolve('babel-eslint'),
54+
options: [{ esmodule: true }],
55+
}),
56+
test({
57+
code: 'var foo = import(`foo`)',
58+
parser: require.resolve('babel-eslint'),
59+
options: [{ esmodule: true }],
60+
}),
61+
test({
62+
code: 'var foo = import("./foo")',
63+
parser: require.resolve('babel-eslint'),
64+
options: [{ esmodule: true }],
65+
}),
66+
test({
67+
code: 'var foo = import("@scope/foo")',
68+
parser: require.resolve('babel-eslint'),
69+
options: [{ esmodule: true }],
70+
}),
71+
test({
72+
code: 'import("../" + name)',
73+
errors: [dynamicImportError],
74+
parser: require.resolve('babel-eslint'),
75+
options: [{ esmodule: false }],
76+
}),
77+
test({
78+
code: 'import(`../${name}`)',
79+
errors: [dynamicImportError],
80+
parser: require.resolve('babel-eslint'),
81+
}),
2582
],
2683
invalid: [
2784
test({
@@ -43,6 +100,33 @@ ruleTester.run('no-dynamic-require', rule, {
43100
test({
44101
code: 'require(name + "foo", "bar")',
45102
errors: [error],
103+
options: [{ esmodule: true }],
104+
}),
105+
106+
// dynamic import
107+
test({
108+
code: 'import("../" + name)',
109+
errors: [dynamicImportError],
110+
parser: require.resolve('babel-eslint'),
111+
options: [{ esmodule: true }],
112+
}),
113+
test({
114+
code: 'import(`../${name}`)',
115+
errors: [dynamicImportError],
116+
parser: require.resolve('babel-eslint'),
117+
options: [{ esmodule: true }],
118+
}),
119+
test({
120+
code: 'import(name)',
121+
errors: [dynamicImportError],
122+
parser: require.resolve('babel-eslint'),
123+
options: [{ esmodule: true }],
124+
}),
125+
test({
126+
code: 'import(name())',
127+
errors: [dynamicImportError],
128+
parser: require.resolve('babel-eslint'),
129+
options: [{ esmodule: true }],
46130
}),
47131
test({
48132
code: 'require(`foo${x}`)',

0 commit comments

Comments
 (0)
Please sign in to comment.