From 065f3f1bac14353023f5b0ee3c60aae1b3c084c0 Mon Sep 17 00:00:00 2001 From: vikr01 Date: Thu, 25 Oct 2018 20:42:32 -0700 Subject: [PATCH] add option esmodule to no-dynamic-require --- src/rules/no-dynamic-require.js | 30 +++++++++- tests/src/rules/no-dynamic-require.js | 85 +++++++++++++++++++++++++++ 2 files changed, 113 insertions(+), 2 deletions(-) diff --git a/src/rules/no-dynamic-require.js b/src/rules/no-dynamic-require.js index 5726d72ca3..1e7419c602 100644 --- a/src/rules/no-dynamic-require.js +++ b/src/rules/no-dynamic-require.js @@ -8,6 +8,12 @@ function isRequire(node) { node.arguments.length >= 1 } +function isDynamicImport(node) { + return node && + node.callee && + node.callee.type === 'Import' +} + function isStaticValue(arg) { return arg.type === 'Literal' || (arg.type === 'TemplateLiteral' && arg.expressions.length === 0) @@ -18,17 +24,37 @@ module.exports = { docs: { url: docsUrl('no-dynamic-require'), }, + schema: [ + { + type: 'object', + properties: { + esmodule: { + type: 'boolean', + }, + }, + additionalProperties: false, + }, + ], }, create: function (context) { + const options = context.options[0] || {} + return { CallExpression(node) { - if (isRequire(node) && !isStaticValue(node.arguments[0])) { - context.report({ + if(!node.arguments[0] || isStaticValue(node.arguments[0])) return + if (isRequire(node)) { + return context.report({ node, message: 'Calls to require() should use string literals', }) } + else if(options.esmodule && isDynamicImport(node)) { + return context.report({ + node, + message: 'Calls to import() should use string literals', + }) + } }, } }, diff --git a/tests/src/rules/no-dynamic-require.js b/tests/src/rules/no-dynamic-require.js index 8793d0dd8e..c28c41b3d4 100644 --- a/tests/src/rules/no-dynamic-require.js +++ b/tests/src/rules/no-dynamic-require.js @@ -10,6 +10,11 @@ const error = { message: 'Calls to require() should use string literals', } +const dynamicImportError = { + ruleId: 'no-dynamic-require', + message: 'Calls to import() should use string literals', +} + ruleTester.run('no-dynamic-require', rule, { valid: [ test({ code: 'import _ from "lodash"'}), @@ -23,6 +28,59 @@ ruleTester.run('no-dynamic-require', rule, { test({ code: 'var foo = require(`foo`)'}), test({ code: 'var foo = require("./foo")'}), test({ code: 'var foo = require("@scope/foo")'}), + + //dynamic import + test({ + code: 'import("foo")', + parser: 'babel-eslint', + options: [{esmodule: true}], + }), + test({ + code: 'import(`foo`)', + parser: 'babel-eslint', + options: [{esmodule: true}], + }), + test({ + code: 'import("./foo")', + parser: 'babel-eslint', + options: [{esmodule: true}], + }), + test({ + code: 'import("@scope/foo")', + parser: 'babel-eslint', + options: [{esmodule: true}], + }), + test({ + code: 'var foo = import("foo")', + parser: 'babel-eslint', + options: [{esmodule: true}], + }), + test({ + code: 'var foo = import(`foo`)', + parser: 'babel-eslint', + options: [{esmodule: true}], + }), + test({ + code: 'var foo = import("./foo")', + parser: 'babel-eslint', + options: [{esmodule: true}], + }), + test({ + code: 'var foo = import("@scope/foo")', + parser: 'babel-eslint', + options: [{esmodule: true}], + }), + test({ + code: 'import("../" + name)', + errors: [dynamicImportError], + parser: 'babel-eslint', + options: [{esmodule: false}], + }), + test({ + code: 'import(`../${name}`)', + errors: [dynamicImportError], + parser: 'babel-eslint', + }), ], invalid: [ test({ @@ -44,6 +102,33 @@ ruleTester.run('no-dynamic-require', rule, { test({ code: 'require(name + "foo", "bar")', errors: [error], + options: [{esmodule: true}], + }), + + // dynamic import + test({ + code: 'import("../" + name)', + errors: [dynamicImportError], + parser: 'babel-eslint', + options: [{esmodule: true}], + }), + test({ + code: 'import(`../${name}`)', + errors: [dynamicImportError], + parser: 'babel-eslint', + options: [{esmodule: true}], + }), + test({ + code: 'import(name)', + errors: [dynamicImportError], + parser: 'babel-eslint', + options: [{esmodule: true}], + }), + test({ + code: 'import(name())', + errors: [dynamicImportError], + parser: 'babel-eslint', + options: [{esmodule: true}], }), ], })