From a75c63800e8e695aa836736d4ddc6c84d9076ee2 Mon Sep 17 00:00:00 2001 From: Toru Nagashima Date: Fri, 2 Jun 2017 09:52:44 +0900 Subject: [PATCH] New: `no-extraneous-*` rules (refs #71) --- README.md | 18 +-- docs/rules/no-extraneous-import.md | 60 ++++++++++ docs/rules/no-extraneous-require.md | 60 ++++++++++ lib/rules/no-extraneous-import.js | 68 +++++++++++ lib/rules/no-extraneous-require.js | 68 +++++++++++ lib/util/check-extraneous.js | 95 +++++++++++++++ .../dependencies/node_modules/@bbb/aaa.js | 0 .../dependencies/node_modules/aaa.js | 0 .../dependencies/node_modules/bbb.js | 0 .../no-extraneous/dependencies/package.json | 9 ++ .../devDependencies/node_modules/@bbb/aaa.js | 0 .../devDependencies/node_modules/aaa.js | 0 .../devDependencies/node_modules/bbb.js | 0 .../devDependencies/package.json | 9 ++ .../noDependencies/node_modules/@bbb/aaa.js | 0 .../noDependencies/node_modules/aaa.js | 0 .../noDependencies/node_modules/bbb.js | 0 .../no-extraneous/noDependencies/package.json | 5 + .../node_modules/@bbb/aaa.js | 0 .../optionalDependencies/node_modules/aaa.js | 0 .../optionalDependencies/node_modules/bbb.js | 0 .../optionalDependencies/package.json | 9 ++ .../peerDependencies/node_modules/@bbb/aaa.js | 0 .../peerDependencies/node_modules/aaa.js | 0 .../peerDependencies/node_modules/bbb.js | 0 .../peerDependencies/package.json | 9 ++ tests/lib/rules/no-extraneous-import.js | 98 ++++++++++++++++ tests/lib/rules/no-extraneous-require.js | 110 ++++++++++++++++++ 28 files changed, 610 insertions(+), 8 deletions(-) create mode 100644 docs/rules/no-extraneous-import.md create mode 100644 docs/rules/no-extraneous-require.md create mode 100644 lib/rules/no-extraneous-import.js create mode 100644 lib/rules/no-extraneous-require.js create mode 100644 lib/util/check-extraneous.js create mode 100644 tests/fixtures/no-extraneous/dependencies/node_modules/@bbb/aaa.js create mode 100644 tests/fixtures/no-extraneous/dependencies/node_modules/aaa.js create mode 100644 tests/fixtures/no-extraneous/dependencies/node_modules/bbb.js create mode 100644 tests/fixtures/no-extraneous/dependencies/package.json create mode 100644 tests/fixtures/no-extraneous/devDependencies/node_modules/@bbb/aaa.js create mode 100644 tests/fixtures/no-extraneous/devDependencies/node_modules/aaa.js create mode 100644 tests/fixtures/no-extraneous/devDependencies/node_modules/bbb.js create mode 100644 tests/fixtures/no-extraneous/devDependencies/package.json create mode 100644 tests/fixtures/no-extraneous/noDependencies/node_modules/@bbb/aaa.js create mode 100644 tests/fixtures/no-extraneous/noDependencies/node_modules/aaa.js create mode 100644 tests/fixtures/no-extraneous/noDependencies/node_modules/bbb.js create mode 100644 tests/fixtures/no-extraneous/noDependencies/package.json create mode 100644 tests/fixtures/no-extraneous/optionalDependencies/node_modules/@bbb/aaa.js create mode 100644 tests/fixtures/no-extraneous/optionalDependencies/node_modules/aaa.js create mode 100644 tests/fixtures/no-extraneous/optionalDependencies/node_modules/bbb.js create mode 100644 tests/fixtures/no-extraneous/optionalDependencies/package.json create mode 100644 tests/fixtures/no-extraneous/peerDependencies/node_modules/@bbb/aaa.js create mode 100644 tests/fixtures/no-extraneous/peerDependencies/node_modules/aaa.js create mode 100644 tests/fixtures/no-extraneous/peerDependencies/node_modules/bbb.js create mode 100644 tests/fixtures/no-extraneous/peerDependencies/package.json create mode 100644 tests/lib/rules/no-extraneous-import.js create mode 100644 tests/lib/rules/no-extraneous-require.js diff --git a/README.md b/README.md index e11e052b..9ea10c4c 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ Additional ESLint's rules for Node.js ## :cd: Install & Usage ``` -> npm install --save-dev eslint eslint-plugin-node +$ npm install --save-dev eslint eslint-plugin-node ``` - Requires Node.js `^4.0.0 || >=6.0.0` @@ -45,22 +45,24 @@ Additional ESLint's rules for Node.js ## :bulb: Rules +- :star: - the mark of recommended rules. +- :pencil: - the mark of fixable rules. + | | | Rule ID | Description | |:------:|:--------:|:-----------------------------------------------------------------|:------------| | | | [exports-style](docs/rules/exports-style.md) | Enforce either `module.exports` or `exports`. | :star: | | [no-deprecated-api](docs/rules/no-deprecated-api.md) | Disallow deprecated API. -| | | [no-missing-import](docs/rules/no-missing-import.md) | Disallow `import` declarations for files that don't exist. :warning: -| :star: | | [no-missing-require](docs/rules/no-missing-require.md) | Disallow `require()`s for files that don't exist. +| | | [no-extraneous-import](docs/rules/no-extraneous-import.md) | Disallow `import` declarations of extraneous packages. :warning: +| :star: | | [no-extraneous-require](docs/rules/no-extraneous-require.md) | Disallow `require()` expressions of extraneous packages. +| | | [no-missing-import](docs/rules/no-missing-import.md) | Disallow `import` declarations of files that don't exist. :warning: +| :star: | | [no-missing-require](docs/rules/no-missing-require.md) | Disallow `require()` expressions of files that don't exist. | :star: | | [no-unpublished-bin](docs/rules/no-unpublished-bin.md) | Disallow `bin` files that npm ignores. -| | | [no-unpublished-import](docs/rules/no-unpublished-import.md) | Disallow `import` declarations for files that npm ignores. :warning: -| :star: | | [no-unpublished-require](docs/rules/no-unpublished-require.md) | Disallow `require()`s for files that npm ignores. +| | | [no-unpublished-import](docs/rules/no-unpublished-import.md) | Disallow `import` declarations of files that npm ignores. :warning: +| :star: | | [no-unpublished-require](docs/rules/no-unpublished-require.md) | Disallow `require()` expressions of files that npm ignores. | :star: | | [no-unsupported-features](docs/rules/no-unsupported-features.md) | Disallow unsupported ECMAScript features on the specified version. | :star: | | [process-exit-as-throw](docs/rules/process-exit-as-throw.md) | Make the same code path as throw at `process.exit()`. | :star: | :pencil: | [shebang](docs/rules/shebang.md) | Suggest correct usage of shebang. -- :star: - the mark of a recommended rule. -- :pencil: - the mark of a fixable rule. - ## :wrench: Configs This plugin provides `plugin:node/recommended` preset config. diff --git a/docs/rules/no-extraneous-import.md b/docs/rules/no-extraneous-import.md new file mode 100644 index 00000000..4ab6b733 --- /dev/null +++ b/docs/rules/no-extraneous-import.md @@ -0,0 +1,60 @@ +# Disallow `import` declarations which import extraneous modules (no-extraneous-import) + +If a `import` declaration's source is extraneous (it's not written in `package.json`), the program works in local, but will not work after dependencies are re-installed. It will cause troubles to your team/contributors. +This rule disallows `import` declarations of extraneous modules. + +## Rule Details + +This rule warns `import` declarations of extraneous modules. + +## Options + +```json +{ + "rules": { + "node/no-extraneous-import": ["error", { + "allowModules": [] + }] + } +} +``` + +### allowModules + +Some platforms have additional embedded modules. +For example, Electron has `electron` module. + +We can specify additional embedded modules with this option. +This option is an array of strings as module names. + +```json +{ + "rules": { + "node/no-extraneous-import": ["error", { + "allowModules": ["electron"] + }] + } +} +``` + +## Shared Settings + +The following options can be set by [shared settings](http://eslint.org/docs/user-guide/configuring.html#adding-shared-settings). +Several rules have the same option, but we can set this option at once. + +- `allowModules` + +For Example: + +```json +{ + "settings": { + "node": { + "allowModules": ["electron"] + } + }, + "rules": { + "node/no-extraneous-import": "error" + } +} +``` diff --git a/docs/rules/no-extraneous-require.md b/docs/rules/no-extraneous-require.md new file mode 100644 index 00000000..4a8fd5e5 --- /dev/null +++ b/docs/rules/no-extraneous-require.md @@ -0,0 +1,60 @@ +# Disallow `require()`s which import extraneous modules (no-extraneous-require) + +If a `require()`'s target is extraneous (it's not written in `package.json`), the program works in local, but will not work after dependencies are re-installed. It will cause troubles to your team/contributors. +This rule disallows `require()` of extraneous modules. + +## Rule Details + +This rule warns `require()` of extraneous modules. + +## Options + +```json +{ + "rules": { + "node/no-extraneous-require": ["error", { + "allowModules": [] + }] + } +} +``` + +### allowModules + +Some platforms have additional embedded modules. +For example, Electron has `electron` module. + +We can specify additional embedded modules with this option. +This option is an array of strings as module names. + +```json +{ + "rules": { + "node/no-extraneous-require": ["error", { + "allowModules": ["electron"] + }] + } +} +``` + +## Shared Settings + +The following options can be set by [shared settings](http://eslint.org/docs/user-guide/configuring.html#adding-shared-settings). +Several rules have the same option, but we can set this option at once. + +- `allowModules` + +For Example: + +```json +{ + "settings": { + "node": { + "allowModules": ["electron"] + } + }, + "rules": { + "node/no-extraneous-require": "error" + } +} +``` diff --git a/lib/rules/no-extraneous-import.js b/lib/rules/no-extraneous-import.js new file mode 100644 index 00000000..0ac1c1e3 --- /dev/null +++ b/lib/rules/no-extraneous-import.js @@ -0,0 +1,68 @@ +/** + * @author Toru Nagashima + * @copyright 2017 Toru Nagashima. All rights reserved. + * See LICENSE file in root directory for full license. + */ +"use strict" + +//------------------------------------------------------------------------------ +// Requirements +//------------------------------------------------------------------------------ + +const checkExtraneous = require("../util/check-extraneous") +const getAllowModules = require("../util/get-allow-modules") +const getConvertPath = require("../util/get-convert-path") +const getImportTargets = require("../util/get-import-export-targets") + +//------------------------------------------------------------------------------ +// Helpers +//------------------------------------------------------------------------------ + +/** + * The definition of this rule. + * + * @param {RuleContext} context - The rule context to check. + * @returns {object} The definition of this rule. + */ +function create(context) { + const filePath = context.getFilename() + if (filePath === "") { + return {} + } + + return { + "Program:exit"(node) { + checkExtraneous( + context, + filePath, + getImportTargets(context, node, false) + ) + }, + } +} + +//------------------------------------------------------------------------------ +// Rule Definition +//------------------------------------------------------------------------------ + +module.exports = { + create, + meta: { + docs: { + description: "disallow `import` declarations of extraneous packages", + category: "Possible Errors", + recommended: false, + }, + fixable: false, + schema: [ + { + type: "object", + properties: { + allowModules: getAllowModules.schema, + convertPath: getConvertPath.schema, + }, + additionalProperties: false, + }, + ], + }, +} diff --git a/lib/rules/no-extraneous-require.js b/lib/rules/no-extraneous-require.js new file mode 100644 index 00000000..6c226899 --- /dev/null +++ b/lib/rules/no-extraneous-require.js @@ -0,0 +1,68 @@ +/** + * @author Toru Nagashima + * @copyright 2017 Toru Nagashima. All rights reserved. + * See LICENSE file in root directory for full license. + */ +"use strict" + +//------------------------------------------------------------------------------ +// Requirements +//------------------------------------------------------------------------------ + +const checkExtraneous = require("../util/check-extraneous") +const getAllowModules = require("../util/get-allow-modules") +const getConvertPath = require("../util/get-convert-path") +const getRequireTargets = require("../util/get-require-targets") + +//------------------------------------------------------------------------------ +// Helpers +//------------------------------------------------------------------------------ + +/** + * The definition of this rule. + * + * @param {RuleContext} context - The rule context to check. + * @returns {object} The definition of this rule. + */ +function create(context) { + const filePath = context.getFilename() + if (filePath === "") { + return {} + } + + return { + "Program:exit"() { + checkExtraneous( + context, + filePath, + getRequireTargets(context, false) + ) + }, + } +} + +//------------------------------------------------------------------------------ +// Rule Definition +//------------------------------------------------------------------------------ + +module.exports = { + create, + meta: { + docs: { + description: "disallow `require()` expressions for extraneous packages", + category: "Possible Errors", + recommended: false, + }, + fixable: false, + schema: [ + { + type: "object", + properties: { + allowModules: getAllowModules.schema, + convertPath: getConvertPath.schema, + }, + additionalProperties: false, + }, + ], + }, +} diff --git a/lib/util/check-extraneous.js b/lib/util/check-extraneous.js new file mode 100644 index 00000000..064fe35c --- /dev/null +++ b/lib/util/check-extraneous.js @@ -0,0 +1,95 @@ +/** + * @author Toru Nagashima + * @copyright 2017 Toru Nagashima. All rights reserved. + * See LICENSE file in root directory for full license. + */ +"use strict" + +//------------------------------------------------------------------------------ +// Requirements +//------------------------------------------------------------------------------ + +const path = require("path") +const resolve = require("resolve") +const getAllowModules = require("./get-allow-modules") +const getConvertPath = require("./get-convert-path") +const getPackageJson = require("./get-package-json") + +//------------------------------------------------------------------------------ +// Helpers +//------------------------------------------------------------------------------ + +/** + * Check whether the given package exists or not. + * @param {string} name The package name to check. + * @param {string} basedir The path to starting directory. + * @returns {boolean} `true` if the package was found. + */ +function exists(name, basedir) { + try { + resolve.sync(name, {basedir}) + return true + } + catch (_err) { + return false + } +} + +//------------------------------------------------------------------------------ +// Public Interface +//------------------------------------------------------------------------------ + +/** + * Checks whether or not each requirement target is published via package.json. + * + * It reads package.json and checks the target exists in `dependencies`. + * + * @param {RuleContext} context - A context to report. + * @param {string} filePath - The current file path. + * @param {ImportTarget[]} targets - A list of target information to check. + * @returns {void} + */ +module.exports = function checkForExtraeous(context, filePath, targets) { + const packageInfo = getPackageJson(filePath) + if (!packageInfo) { + return + } + + const allowed = new Set(getAllowModules(context)) + const convertPath = getConvertPath(context) + const rootPath = path.dirname(packageInfo.filePath) + const convertedPath = path.resolve( + rootPath, + convertPath( + path.relative(rootPath, path.resolve(filePath)) + ) + ) + const basedir = path.dirname(convertedPath) + const dependencies = new Set( + [].concat( + Object.keys(packageInfo.dependencies || {}), + Object.keys(packageInfo.devDependencies || {}), + Object.keys(packageInfo.peerDependencies || {}), + Object.keys(packageInfo.optionalDependencies || {}) + ) + ) + + for (const target of targets) { + const name = target.moduleName + const extraneous = ( + name != null && + !dependencies.has(name) && + !allowed.has(name) && + exists(name, basedir) + ) + + if (extraneous) { + context.report({ + node: target.node, + loc: target.node.loc, + message: "\"{{moduleName}}\" is extraneous.", + data: target, + }) + } + } +} diff --git a/tests/fixtures/no-extraneous/dependencies/node_modules/@bbb/aaa.js b/tests/fixtures/no-extraneous/dependencies/node_modules/@bbb/aaa.js new file mode 100644 index 00000000..e69de29b diff --git a/tests/fixtures/no-extraneous/dependencies/node_modules/aaa.js b/tests/fixtures/no-extraneous/dependencies/node_modules/aaa.js new file mode 100644 index 00000000..e69de29b diff --git a/tests/fixtures/no-extraneous/dependencies/node_modules/bbb.js b/tests/fixtures/no-extraneous/dependencies/node_modules/bbb.js new file mode 100644 index 00000000..e69de29b diff --git a/tests/fixtures/no-extraneous/dependencies/package.json b/tests/fixtures/no-extraneous/dependencies/package.json new file mode 100644 index 00000000..8b76ec12 --- /dev/null +++ b/tests/fixtures/no-extraneous/dependencies/package.json @@ -0,0 +1,9 @@ +{ + "private": true, + "name": "test", + "version": "0.0.0", + "dependencies": { + "aaa": "0.0.0", + "@bbb/aaa": "0.0.0" + } +} diff --git a/tests/fixtures/no-extraneous/devDependencies/node_modules/@bbb/aaa.js b/tests/fixtures/no-extraneous/devDependencies/node_modules/@bbb/aaa.js new file mode 100644 index 00000000..e69de29b diff --git a/tests/fixtures/no-extraneous/devDependencies/node_modules/aaa.js b/tests/fixtures/no-extraneous/devDependencies/node_modules/aaa.js new file mode 100644 index 00000000..e69de29b diff --git a/tests/fixtures/no-extraneous/devDependencies/node_modules/bbb.js b/tests/fixtures/no-extraneous/devDependencies/node_modules/bbb.js new file mode 100644 index 00000000..e69de29b diff --git a/tests/fixtures/no-extraneous/devDependencies/package.json b/tests/fixtures/no-extraneous/devDependencies/package.json new file mode 100644 index 00000000..c79c1f04 --- /dev/null +++ b/tests/fixtures/no-extraneous/devDependencies/package.json @@ -0,0 +1,9 @@ +{ + "private": true, + "name": "test", + "version": "0.0.0", + "devDependencies": { + "aaa": "0.0.0", + "@bbb/aaa": "0.0.0" + } +} diff --git a/tests/fixtures/no-extraneous/noDependencies/node_modules/@bbb/aaa.js b/tests/fixtures/no-extraneous/noDependencies/node_modules/@bbb/aaa.js new file mode 100644 index 00000000..e69de29b diff --git a/tests/fixtures/no-extraneous/noDependencies/node_modules/aaa.js b/tests/fixtures/no-extraneous/noDependencies/node_modules/aaa.js new file mode 100644 index 00000000..e69de29b diff --git a/tests/fixtures/no-extraneous/noDependencies/node_modules/bbb.js b/tests/fixtures/no-extraneous/noDependencies/node_modules/bbb.js new file mode 100644 index 00000000..e69de29b diff --git a/tests/fixtures/no-extraneous/noDependencies/package.json b/tests/fixtures/no-extraneous/noDependencies/package.json new file mode 100644 index 00000000..7f2bc18b --- /dev/null +++ b/tests/fixtures/no-extraneous/noDependencies/package.json @@ -0,0 +1,5 @@ +{ + "private": true, + "name": "test", + "version": "0.0.0" +} diff --git a/tests/fixtures/no-extraneous/optionalDependencies/node_modules/@bbb/aaa.js b/tests/fixtures/no-extraneous/optionalDependencies/node_modules/@bbb/aaa.js new file mode 100644 index 00000000..e69de29b diff --git a/tests/fixtures/no-extraneous/optionalDependencies/node_modules/aaa.js b/tests/fixtures/no-extraneous/optionalDependencies/node_modules/aaa.js new file mode 100644 index 00000000..e69de29b diff --git a/tests/fixtures/no-extraneous/optionalDependencies/node_modules/bbb.js b/tests/fixtures/no-extraneous/optionalDependencies/node_modules/bbb.js new file mode 100644 index 00000000..e69de29b diff --git a/tests/fixtures/no-extraneous/optionalDependencies/package.json b/tests/fixtures/no-extraneous/optionalDependencies/package.json new file mode 100644 index 00000000..d9911a87 --- /dev/null +++ b/tests/fixtures/no-extraneous/optionalDependencies/package.json @@ -0,0 +1,9 @@ +{ + "private": true, + "name": "test", + "version": "0.0.0", + "optionalDependencies": { + "aaa": "0.0.0", + "@bbb/aaa": "0.0.0" + } +} diff --git a/tests/fixtures/no-extraneous/peerDependencies/node_modules/@bbb/aaa.js b/tests/fixtures/no-extraneous/peerDependencies/node_modules/@bbb/aaa.js new file mode 100644 index 00000000..e69de29b diff --git a/tests/fixtures/no-extraneous/peerDependencies/node_modules/aaa.js b/tests/fixtures/no-extraneous/peerDependencies/node_modules/aaa.js new file mode 100644 index 00000000..e69de29b diff --git a/tests/fixtures/no-extraneous/peerDependencies/node_modules/bbb.js b/tests/fixtures/no-extraneous/peerDependencies/node_modules/bbb.js new file mode 100644 index 00000000..e69de29b diff --git a/tests/fixtures/no-extraneous/peerDependencies/package.json b/tests/fixtures/no-extraneous/peerDependencies/package.json new file mode 100644 index 00000000..fb5b115f --- /dev/null +++ b/tests/fixtures/no-extraneous/peerDependencies/package.json @@ -0,0 +1,9 @@ +{ + "private": true, + "name": "test", + "version": "0.0.0", + "peerDependencies": { + "aaa": "0.0.0", + "@bbb/aaa": "0.0.0" + } +} diff --git a/tests/lib/rules/no-extraneous-import.js b/tests/lib/rules/no-extraneous-import.js new file mode 100644 index 00000000..91e894d3 --- /dev/null +++ b/tests/lib/rules/no-extraneous-import.js @@ -0,0 +1,98 @@ +/** + * @author Toru Nagashima + * @copyright 2017 Toru Nagashima. All rights reserved. + * See LICENSE file in root directory for full license. + */ +"use strict" + +//------------------------------------------------------------------------------ +// Requirements +//------------------------------------------------------------------------------ + +const path = require("path") +const RuleTester = require("eslint").RuleTester +const rule = require("../../../lib/rules/no-extraneous-import") + +//------------------------------------------------------------------------------ +// Helpers +//------------------------------------------------------------------------------ + +/** + * Makes a file path to a fixture. + * @param {string} name - A name. + * @returns {string} A file path to a fixture. + */ +function fixture(name) { + return path.resolve(__dirname, "../../fixtures/no-extraneous", name) +} + +//------------------------------------------------------------------------------ +// Tests +//------------------------------------------------------------------------------ + +const tester = new RuleTester({parserOptions: {sourceType: "module"}}) + +tester.run("no-extraneous-import", rule, { + valid: [ + { + filename: fixture("dependencies/a.js"), + code: "import bbb from './bbb'", + }, + { + filename: fixture("dependencies/a.js"), + code: "import aaa from 'aaa'", + }, + { + filename: fixture("dependencies/a.js"), + code: "import bbb from 'aaa/bbb'", + }, + { + filename: fixture("dependencies/a.js"), + code: "import aaa from '@bbb/aaa'", + }, + { + filename: fixture("dependencies/a.js"), + code: "import bbb from '@bbb/aaa/bbb'", + }, + { + filename: fixture("devDependencies/a.js"), + code: "import aaa from 'aaa'", + }, + { + filename: fixture("peerDependencies/a.js"), + code: "import aaa from 'aaa'", + }, + { + filename: fixture("optionalDependencies/a.js"), + code: "import aaa from 'aaa'", + }, + + // missing packages are warned by no-missing-import + { + filename: fixture("dependencies/a.js"), + code: "import ccc from 'ccc'", + }, + ], + invalid: [ + { + filename: fixture("dependencies/a.js"), + code: "import bbb from 'bbb'", + errors: ["\"bbb\" is extraneous."], + }, + { + filename: fixture("devDependencies/a.js"), + code: "import bbb from 'bbb'", + errors: ["\"bbb\" is extraneous."], + }, + { + filename: fixture("peerDependencies/a.js"), + code: "import bbb from 'bbb'", + errors: ["\"bbb\" is extraneous."], + }, + { + filename: fixture("optionalDependencies/a.js"), + code: "import bbb from 'bbb'", + errors: ["\"bbb\" is extraneous."], + }, + ], +}) diff --git a/tests/lib/rules/no-extraneous-require.js b/tests/lib/rules/no-extraneous-require.js new file mode 100644 index 00000000..e6f4e185 --- /dev/null +++ b/tests/lib/rules/no-extraneous-require.js @@ -0,0 +1,110 @@ +/** + * @author Toru Nagashima + * @copyright 2017 Toru Nagashima. All rights reserved. + * See LICENSE file in root directory for full license. + */ +"use strict" + +//------------------------------------------------------------------------------ +// Requirements +//------------------------------------------------------------------------------ + +const path = require("path") +const RuleTester = require("eslint").RuleTester +const rule = require("../../../lib/rules/no-extraneous-require") + +//------------------------------------------------------------------------------ +// Helpers +//------------------------------------------------------------------------------ + +/** + * Makes a file path to a fixture. + * @param {string} name - A name. + * @returns {string} A file path to a fixture. + */ +function fixture(name) { + return path.resolve(__dirname, "../../fixtures/no-extraneous", name) +} + +//------------------------------------------------------------------------------ +// Tests +//------------------------------------------------------------------------------ + +const tester = new RuleTester({env: {node: true}}) + +tester.run("no-extraneous-require", rule, { + valid: [ + { + filename: fixture("dependencies/a.js"), + code: "$.require('bbb')", + }, + { + filename: fixture("dependencies/a.js"), + code: "require('./bbb')", + }, + { + filename: fixture("dependencies/a.js"), + code: "require('b'+'bb')", + }, + { + filename: fixture("dependencies/a.js"), + code: "require(bbb)", + }, + { + filename: fixture("dependencies/a.js"), + code: "require('aaa')", + }, + { + filename: fixture("dependencies/a.js"), + code: "require('aaa/bbb')", + }, + { + filename: fixture("dependencies/a.js"), + code: "require('@bbb/aaa')", + }, + { + filename: fixture("dependencies/a.js"), + code: "require('@bbb/aaa/bbb')", + }, + { + filename: fixture("devDependencies/a.js"), + code: "require('aaa')", + }, + { + filename: fixture("peerDependencies/a.js"), + code: "require('aaa')", + }, + { + filename: fixture("optionalDependencies/a.js"), + code: "require('aaa')", + }, + + // missing packages are warned by no-missing-require + { + filename: fixture("dependencies/a.js"), + code: "require('ccc')", + }, + ], + invalid: [ + { + filename: fixture("dependencies/a.js"), + code: "require('bbb')", + errors: ["\"bbb\" is extraneous."], + }, + { + filename: fixture("devDependencies/a.js"), + code: "require('bbb')", + errors: ["\"bbb\" is extraneous."], + }, + { + filename: fixture("peerDependencies/a.js"), + code: "require('bbb')", + errors: ["\"bbb\" is extraneous."], + }, + { + filename: fixture("optionalDependencies/a.js"), + code: "require('bbb')", + errors: ["\"bbb\" is extraneous."], + }, + ], +})