From 3d79333affff9a3b260e5a4a01242eca5eb74649 Mon Sep 17 00:00:00 2001 From: Toru Nagashima Date: Mon, 16 Jul 2018 19:55:39 +0900 Subject: [PATCH] New: `prefer-global/*` rules --- .eslintrc.js | 11 ++++ README.md | 5 ++ docs/rules/prefer-global/buffer.md | 64 +++++++++++++++++++ docs/rules/prefer-global/console.md | 64 +++++++++++++++++++ docs/rules/prefer-global/process.md | 64 +++++++++++++++++++ docs/rules/prefer-global/url-search-params.md | 64 +++++++++++++++++++ docs/rules/prefer-global/url.md | 64 +++++++++++++++++++ lib/index.js | 5 ++ lib/rules/prefer-global/buffer.js | 42 ++++++++++++ lib/rules/prefer-global/console.js | 39 +++++++++++ lib/rules/prefer-global/process.js | 39 +++++++++++ lib/rules/prefer-global/url-search-params.js | 42 ++++++++++++ lib/rules/prefer-global/url.js | 41 ++++++++++++ lib/util/define-prefer-global-handlers.js | 41 ++++++++++++ tests/lib/rules/prefer-global/buffer.js | 49 ++++++++++++++ tests/lib/rules/prefer-global/console.js | 46 +++++++++++++ tests/lib/rules/prefer-global/process.js | 46 +++++++++++++ .../rules/prefer-global/url-search-params.js | 49 ++++++++++++++ tests/lib/rules/prefer-global/url.js | 46 +++++++++++++ 19 files changed, 821 insertions(+) create mode 100644 docs/rules/prefer-global/buffer.md create mode 100644 docs/rules/prefer-global/console.md create mode 100644 docs/rules/prefer-global/process.md create mode 100644 docs/rules/prefer-global/url-search-params.md create mode 100644 docs/rules/prefer-global/url.md create mode 100644 lib/rules/prefer-global/buffer.js create mode 100644 lib/rules/prefer-global/console.js create mode 100644 lib/rules/prefer-global/process.js create mode 100644 lib/rules/prefer-global/url-search-params.js create mode 100644 lib/rules/prefer-global/url.js create mode 100644 lib/util/define-prefer-global-handlers.js create mode 100644 tests/lib/rules/prefer-global/buffer.js create mode 100644 tests/lib/rules/prefer-global/console.js create mode 100644 tests/lib/rules/prefer-global/process.js create mode 100644 tests/lib/rules/prefer-global/url-search-params.js create mode 100644 tests/lib/rules/prefer-global/url.js diff --git a/.eslintrc.js b/.eslintrc.js index 6a5f12e3..241b1de5 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -31,5 +31,16 @@ module.exports = { ], }, }, + { + files: ["**/rules/prefer-global/*.js"], + rules: { + "@mysticatea/eslint-plugin/require-meta-docs-url": [ + "error", + { + pattern: `https://github.com/mysticatea/eslint-plugin-node/blob/v${version}/docs/rules/prefer-global/{{name}}.md`, + }, + ], + }, + }, ], } diff --git a/README.md b/README.md index 0d387e50..3b2ae134 100644 --- a/README.md +++ b/README.md @@ -76,6 +76,11 @@ $ npm install --save-dev eslint eslint-plugin-node | Rule ID | Description | | |:--------|:------------|:--:| | [node/exports-style](./docs/rules/exports-style.md) | enforce either `module.exports` or `exports` | | +| [node/prefer-global/buffer](./docs/rules/prefer-global/buffer.md) | enforce either `Buffer` or `require("buffer").Buffer` | | +| [node/prefer-global/console](./docs/rules/prefer-global/console.md) | enforce either `console` or `require("console")` | | +| [node/prefer-global/process](./docs/rules/prefer-global/process.md) | enforce either `process` or `require("process")` | | +| [node/prefer-global/url-search-params](./docs/rules/prefer-global/url-search-params.md) | enforce either `URLSearchParams` or `require("url").URLSearchParams` | | +| [node/prefer-global/url](./docs/rules/prefer-global/url.md) | enforce either `URL` or `require("url").URL` | | diff --git a/docs/rules/prefer-global/buffer.md b/docs/rules/prefer-global/buffer.md new file mode 100644 index 00000000..99ac3821 --- /dev/null +++ b/docs/rules/prefer-global/buffer.md @@ -0,0 +1,64 @@ +# enforce either `Buffer` or `require("buffer").Buffer` (prefer-global/buffer) + +The `Buffer` class of `buffer` module is defined as a global variable. + +```js +console.log(Buffer === require("buffer").Buffer) //→ true +``` + +It will be readable if we use either `Buffer` consistently. + +## Rule Details + +This rule enforces which `Buffer` we should use. + +### Options + +This rule has a string option. + +```json +{ + "node/prefer-global/buffer": ["error", "always" | "never"] +} +``` + +- `"always"` (default) ... enforces to use the global variable `Buffer` rather than `require("buffer").Buffer`. +- `"never"` ... enforces to use `require("buffer").Buffer` rather than the global variable `Buffer`. + +#### always + +Examples of :-1: **incorrect** code for this rule: + +```js +/*eslint node/prefer-global/buffer: [error]*/ + +const { Buffer } = require("buffer") +const b = Buffer.alloc(16) +``` + +Examples of :+1: **correct** code for this rule: + +```js +/*eslint node/prefer-global/buffer: [error]*/ + +const b = Buffer.alloc(16) +``` + +#### never + +Examples of :-1: **incorrect** code for the `"never"` option: + +```js +/*eslint node/prefer-global/buffer: [error, never]*/ + +const b = Buffer.alloc(16) +``` + +Examples of :+1: **correct** code for the `"never"` option: + +```js +/*eslint node/prefer-global/buffer: [error, never]*/ + +const { Buffer } = require("buffer") +const b = Buffer.alloc(16) +``` diff --git a/docs/rules/prefer-global/console.md b/docs/rules/prefer-global/console.md new file mode 100644 index 00000000..9629dc9a --- /dev/null +++ b/docs/rules/prefer-global/console.md @@ -0,0 +1,64 @@ +# enforce either `console` or `require("console")` (prefer-global/console) + +The `console` module is defined as a global variable. + +```js +console.log(console === require("console")) //→ true +``` + +It will be readable if we use either `console` consistently. + +## Rule Details + +This rule enforces which `console` we should use. + +### Options + +This rule has a string option. + +```json +{ + "node/prefer-global/console": ["error", "always" | "never"] +} +``` + +- `"always"` (default) ... enforces to use the global variable `console` rather than `require("console")`. +- `"never"` ... enforces to use `require("console")` rather than the global variable `console`. + +#### always + +Examples of :-1: **incorrect** code for this rule: + +```js +/*eslint node/prefer-global/console: [error]*/ + +const console = require("console") +console.log("hello") +``` + +Examples of :+1: **correct** code for this rule: + +```js +/*eslint node/prefer-global/console: [error]*/ + +console.log("hello") +``` + +#### never + +Examples of :-1: **incorrect** code for the `"never"` option: + +```js +/*eslint node/prefer-global/console: [error, never]*/ + +console.log("hello") +``` + +Examples of :+1: **correct** code for the `"never"` option: + +```js +/*eslint node/prefer-global/console: [error, never]*/ + +const console = require("console") +console.log("hello") +``` diff --git a/docs/rules/prefer-global/process.md b/docs/rules/prefer-global/process.md new file mode 100644 index 00000000..4d2188cb --- /dev/null +++ b/docs/rules/prefer-global/process.md @@ -0,0 +1,64 @@ +# enforce either `process` or `require("process")` (prefer-global/process) + +The `process` module is defined as a global variable. + +```js +process.log(process === require("process")) //→ true +``` + +It will be readable if we use either `process` consistently. + +## Rule Details + +This rule enforces which `process` we should use. + +### Options + +This rule has a string option. + +```json +{ + "node/prefer-global/process": ["error", "always" | "never"] +} +``` + +- `"always"` (default) ... enforces to use the global variable `process` rather than `require("process")`. +- `"never"` ... enforces to use `require("process")` rather than the global variable `process`. + +#### always + +Examples of :-1: **incorrect** code for this rule: + +```js +/*eslint node/prefer-global/process: [error]*/ + +const process = require("process") +process.exit(0) +``` + +Examples of :+1: **correct** code for this rule: + +```js +/*eslint node/prefer-global/process: [error]*/ + +process.exit(0) +``` + +#### never + +Examples of :-1: **incorrect** code for the `"never"` option: + +```js +/*eslint node/prefer-global/process: [error, never]*/ + +process.exit(0) +``` + +Examples of :+1: **correct** code for the `"never"` option: + +```js +/*eslint node/prefer-global/process: [error, never]*/ + +const process = require("process") +process.exit(0) +``` diff --git a/docs/rules/prefer-global/url-search-params.md b/docs/rules/prefer-global/url-search-params.md new file mode 100644 index 00000000..51212490 --- /dev/null +++ b/docs/rules/prefer-global/url-search-params.md @@ -0,0 +1,64 @@ +# enforce either `URLSearchParams` or `require("url").URLSearchParams` (prefer-global/url) + +The `URLSearchParams` class of `url` module is defined as a global variable. + +```js +console.log(URLSearchParams === require("url").URLSearchParams) //→ true +``` + +It will be readable if we use either `URLSearchParams` consistently. + +## Rule Details + +This rule enforces which `URLSearchParams` we should use. + +### Options + +This rule has a string option. + +```json +{ + "node/prefer-global/url": ["error", "always" | "never"] +} +``` + +- `"always"` (default) ... enforces to use the global variable `URLSearchParams` rather than `require("url").URLSearchParams`. +- `"never"` ... enforces to use `require("url").URLSearchParams` rather than the global variable `URLSearchParams`. + +#### always + +Examples of :-1: **incorrect** code for this rule: + +```js +/*eslint node/prefer-global/url: [error]*/ + +const { URLSearchParams } = require("url") +const u = new URLSearchParams(s) +``` + +Examples of :+1: **correct** code for this rule: + +```js +/*eslint node/prefer-global/url: [error]*/ + +const u = new URLSearchParams(s) +``` + +#### never + +Examples of :-1: **incorrect** code for the `"never"` option: + +```js +/*eslint node/prefer-global/url: [error, never]*/ + +const u = new URLSearchParams(s) +``` + +Examples of :+1: **correct** code for the `"never"` option: + +```js +/*eslint node/prefer-global/url: [error, never]*/ + +const { URLSearchParams } = require("url") +const u = new URLSearchParams(s) +``` diff --git a/docs/rules/prefer-global/url.md b/docs/rules/prefer-global/url.md new file mode 100644 index 00000000..be21459b --- /dev/null +++ b/docs/rules/prefer-global/url.md @@ -0,0 +1,64 @@ +# enforce either `URL` or `require("url").URL` (prefer-global/url) + +The `URL` class of `url` module is defined as a global variable. + +```js +console.log(URL === require("url").URL) //→ true +``` + +It will be readable if we use either `URL` consistently. + +## Rule Details + +This rule enforces which `URL` we should use. + +### Options + +This rule has a string option. + +```json +{ + "node/prefer-global/url": ["error", "always" | "never"] +} +``` + +- `"always"` (default) ... enforces to use the global variable `URL` rather than `require("url").URL`. +- `"never"` ... enforces to use `require("url").URL` rather than the global variable `URL`. + +#### always + +Examples of :-1: **incorrect** code for this rule: + +```js +/*eslint node/prefer-global/url: [error]*/ + +const { URL } = require("url") +const u = new URL(s) +``` + +Examples of :+1: **correct** code for this rule: + +```js +/*eslint node/prefer-global/url: [error]*/ + +const u = new URL(s) +``` + +#### never + +Examples of :-1: **incorrect** code for the `"never"` option: + +```js +/*eslint node/prefer-global/url: [error, never]*/ + +const u = new URL(s) +``` + +Examples of :+1: **correct** code for the `"never"` option: + +```js +/*eslint node/prefer-global/url: [error, never]*/ + +const { URL } = require("url") +const u = new URL(s) +``` diff --git a/lib/index.js b/lib/index.js index c4843b7b..4b5f9a98 100644 --- a/lib/index.js +++ b/lib/index.js @@ -18,6 +18,11 @@ module.exports = { "no-unsupported-features/es-builtins": require("./rules/no-unsupported-features/es-builtins"), "no-unsupported-features/es-syntax": require("./rules/no-unsupported-features/es-syntax"), "no-unsupported-features/node-builtins": require("./rules/no-unsupported-features/node-builtins"), + "prefer-global/buffer": require("./rules/prefer-global/buffer"), + "prefer-global/console": require("./rules/prefer-global/console"), + "prefer-global/process": require("./rules/prefer-global/process"), + "prefer-global/url-search-params": require("./rules/prefer-global/url-search-params"), + "prefer-global/url": require("./rules/prefer-global/url"), "process-exit-as-throw": require("./rules/process-exit-as-throw"), shebang: require("./rules/shebang"), diff --git a/lib/rules/prefer-global/buffer.js b/lib/rules/prefer-global/buffer.js new file mode 100644 index 00000000..dd87006e --- /dev/null +++ b/lib/rules/prefer-global/buffer.js @@ -0,0 +1,42 @@ +/** + * @author Toru Nagashima + * See LICENSE file in root directory for full license. + */ +"use strict" + +const { READ } = require("eslint-utils") +const defineHandlers = require("../../util/define-prefer-global-handlers") + +module.exports = { + meta: { + docs: { + description: + 'enforce either `Buffer` or `require("buffer").Buffer`', + category: "Stylistic Issues", + recommended: false, + url: + "https://github.com/mysticatea/eslint-plugin-node/blob/v6.0.1/docs/rules/prefer-global/buffer.md", + }, + fixable: null, + schema: [{ enum: ["always", "never"] }], + messages: { + preferGlobal: + "Unexpected use of 'require(\"buffer\").Buffer'. Use the global variable 'Buffer' instead.", + preferModule: + "Unexpected use of the global variable 'Buffer'. Use 'require(\"buffer\").Buffer' instead.", + }, + }, + + create(context) { + return defineHandlers(context, { + globals: { + Buffer: { [READ]: true }, + }, + modules: { + buffer: { + Buffer: { [READ]: true }, + }, + }, + }) + }, +} diff --git a/lib/rules/prefer-global/console.js b/lib/rules/prefer-global/console.js new file mode 100644 index 00000000..367ea038 --- /dev/null +++ b/lib/rules/prefer-global/console.js @@ -0,0 +1,39 @@ +/** + * @author Toru Nagashima + * See LICENSE file in root directory for full license. + */ +"use strict" + +const { READ } = require("eslint-utils") +const defineHandlers = require("../../util/define-prefer-global-handlers") + +module.exports = { + meta: { + docs: { + description: 'enforce either `console` or `require("console")`', + category: "Stylistic Issues", + recommended: false, + url: + "https://github.com/mysticatea/eslint-plugin-node/blob/v6.0.1/docs/rules/prefer-global/console.md", + }, + fixable: null, + schema: [{ enum: ["always", "never"] }], + messages: { + preferGlobal: + "Unexpected use of 'require(\"console\")'. Use the global variable 'console' instead.", + preferModule: + "Unexpected use of the global variable 'console'. Use 'require(\"console\")' instead.", + }, + }, + + create(context) { + return defineHandlers(context, { + globals: { + console: { [READ]: true }, + }, + modules: { + console: { [READ]: true }, + }, + }) + }, +} diff --git a/lib/rules/prefer-global/process.js b/lib/rules/prefer-global/process.js new file mode 100644 index 00000000..a20b0bda --- /dev/null +++ b/lib/rules/prefer-global/process.js @@ -0,0 +1,39 @@ +/** + * @author Toru Nagashima + * See LICENSE file in root directory for full license. + */ +"use strict" + +const { READ } = require("eslint-utils") +const defineHandlers = require("../../util/define-prefer-global-handlers") + +module.exports = { + meta: { + docs: { + description: 'enforce either `process` or `require("process")`', + category: "Stylistic Issues", + recommended: false, + url: + "https://github.com/mysticatea/eslint-plugin-node/blob/v6.0.1/docs/rules/prefer-global/process.md", + }, + fixable: null, + schema: [{ enum: ["always", "never"] }], + messages: { + preferGlobal: + "Unexpected use of 'require(\"process\")'. Use the global variable 'process' instead.", + preferModule: + "Unexpected use of the global variable 'process'. Use 'require(\"process\")' instead.", + }, + }, + + create(context) { + return defineHandlers(context, { + globals: { + process: { [READ]: true }, + }, + modules: { + process: { [READ]: true }, + }, + }) + }, +} diff --git a/lib/rules/prefer-global/url-search-params.js b/lib/rules/prefer-global/url-search-params.js new file mode 100644 index 00000000..51ed099a --- /dev/null +++ b/lib/rules/prefer-global/url-search-params.js @@ -0,0 +1,42 @@ +/** + * @author Toru Nagashima + * See LICENSE file in root directory for full license. + */ +"use strict" + +const { READ } = require("eslint-utils") +const defineHandlers = require("../../util/define-prefer-global-handlers") + +module.exports = { + meta: { + docs: { + description: + 'enforce either `URLSearchParams` or `require("url").URLSearchParams`', + category: "Stylistic Issues", + recommended: false, + url: + "https://github.com/mysticatea/eslint-plugin-node/blob/v6.0.1/docs/rules/prefer-global/url-search-params.md", + }, + fixable: null, + schema: [{ enum: ["always", "never"] }], + messages: { + preferGlobal: + "Unexpected use of 'require(\"url\").URLSearchParams'. Use the global variable 'URLSearchParams' instead.", + preferModule: + "Unexpected use of the global variable 'URLSearchParams'. Use 'require(\"url\").URLSearchParams' instead.", + }, + }, + + create(context) { + return defineHandlers(context, { + globals: { + URLSearchParams: { [READ]: true }, + }, + modules: { + url: { + URLSearchParams: { [READ]: true }, + }, + }, + }) + }, +} diff --git a/lib/rules/prefer-global/url.js b/lib/rules/prefer-global/url.js new file mode 100644 index 00000000..0b9386e8 --- /dev/null +++ b/lib/rules/prefer-global/url.js @@ -0,0 +1,41 @@ +/** + * @author Toru Nagashima + * See LICENSE file in root directory for full license. + */ +"use strict" + +const { READ } = require("eslint-utils") +const defineHandlers = require("../../util/define-prefer-global-handlers") + +module.exports = { + meta: { + docs: { + description: 'enforce either `URL` or `require("url").URL`', + category: "Stylistic Issues", + recommended: false, + url: + "https://github.com/mysticatea/eslint-plugin-node/blob/v6.0.1/docs/rules/prefer-global/url.md", + }, + fixable: null, + schema: [{ enum: ["always", "never"] }], + messages: { + preferGlobal: + "Unexpected use of 'require(\"url\").URL'. Use the global variable 'URL' instead.", + preferModule: + "Unexpected use of the global variable 'URL'. Use 'require(\"url\").URL' instead.", + }, + }, + + create(context) { + return defineHandlers(context, { + globals: { + URL: { [READ]: true }, + }, + modules: { + url: { + URL: { [READ]: true }, + }, + }, + }) + }, +} diff --git a/lib/util/define-prefer-global-handlers.js b/lib/util/define-prefer-global-handlers.js new file mode 100644 index 00000000..56a927dc --- /dev/null +++ b/lib/util/define-prefer-global-handlers.js @@ -0,0 +1,41 @@ +/** + * @author Toru Nagashima + * See LICENSE file in root directory for full license. + */ +"use strict" + +const { ReferenceTracker } = require("eslint-utils") + +module.exports = function definePreferGlobalHandlers(context, trackMap) { + const mode = context.options[0] || "always" + const verify = { + always() { + const tracker = new ReferenceTracker(context.getScope(), { + mode: "legacy", + }) + + for (const { node } of [ + ...tracker.iterateCjsReferences(trackMap.modules), + ...tracker.iterateEsmReferences(trackMap.modules), + ]) { + context.report({ node, messageId: "preferGlobal" }) + } + }, + + never() { + const tracker = new ReferenceTracker(context.getScope()) + + for (const { node } of tracker.iterateGlobalReferences( + trackMap.globals + )) { + context.report({ node, messageId: "preferModule" }) + } + }, + } + + return { + "Program:exit"() { + verify[mode]() + }, + } +} diff --git a/tests/lib/rules/prefer-global/buffer.js b/tests/lib/rules/prefer-global/buffer.js new file mode 100644 index 00000000..529c0dee --- /dev/null +++ b/tests/lib/rules/prefer-global/buffer.js @@ -0,0 +1,49 @@ +/** + * @author Toru Nagashima + * See LICENSE file in root directory for full license. + */ +"use strict" + +const RuleTester = require("eslint").RuleTester +const rule = require("../../../../lib/rules/prefer-global/buffer") + +new RuleTester({ + parserOptions: { + ecmaVersion: 2015, + }, + globals: { + Buffer: false, + require: false, + }, +}).run("prefer-global/buffer", rule, { + valid: [ + "var b = Buffer.alloc(10)", + { + code: "var b = Buffer.alloc(10)", + options: ["always"], + }, + { + code: + "var { Buffer } = require('buffer'); var b = Buffer.alloc(10)", + options: ["never"], + }, + ], + invalid: [ + { + code: + "var { Buffer } = require('buffer'); var b = Buffer.alloc(10)", + errors: [{ messageId: "preferGlobal" }], + }, + { + code: + "var { Buffer } = require('buffer'); var b = Buffer.alloc(10)", + options: ["always"], + errors: [{ messageId: "preferGlobal" }], + }, + { + code: "var b = Buffer.alloc(10)", + options: ["never"], + errors: [{ messageId: "preferModule" }], + }, + ], +}) diff --git a/tests/lib/rules/prefer-global/console.js b/tests/lib/rules/prefer-global/console.js new file mode 100644 index 00000000..2eebdfc7 --- /dev/null +++ b/tests/lib/rules/prefer-global/console.js @@ -0,0 +1,46 @@ +/** + * @author Toru Nagashima + * See LICENSE file in root directory for full license. + */ +"use strict" + +const RuleTester = require("eslint").RuleTester +const rule = require("../../../../lib/rules/prefer-global/console") + +new RuleTester({ + parserOptions: { + ecmaVersion: 2015, + }, + globals: { + console: false, + require: false, + }, +}).run("prefer-global/console", rule, { + valid: [ + "console.log(10)", + { + code: "console.log(10)", + options: ["always"], + }, + { + code: "var console = require('console'); console.log(10)", + options: ["never"], + }, + ], + invalid: [ + { + code: "var console = require('console'); console.log(10)", + errors: [{ messageId: "preferGlobal" }], + }, + { + code: "var console = require('console'); console.log(10)", + options: ["always"], + errors: [{ messageId: "preferGlobal" }], + }, + { + code: "console.log(10)", + options: ["never"], + errors: [{ messageId: "preferModule" }], + }, + ], +}) diff --git a/tests/lib/rules/prefer-global/process.js b/tests/lib/rules/prefer-global/process.js new file mode 100644 index 00000000..08c6910d --- /dev/null +++ b/tests/lib/rules/prefer-global/process.js @@ -0,0 +1,46 @@ +/** + * @author Toru Nagashima + * See LICENSE file in root directory for full license. + */ +"use strict" + +const RuleTester = require("eslint").RuleTester +const rule = require("../../../../lib/rules/prefer-global/process") + +new RuleTester({ + parserOptions: { + ecmaVersion: 2015, + }, + globals: { + process: false, + require: false, + }, +}).run("prefer-global/process", rule, { + valid: [ + "process.exit(0)", + { + code: "process.exit(0)", + options: ["always"], + }, + { + code: "var process = require('process'); process.exit(0)", + options: ["never"], + }, + ], + invalid: [ + { + code: "var process = require('process'); process.exit(0)", + errors: [{ messageId: "preferGlobal" }], + }, + { + code: "var process = require('process'); process.exit(0)", + options: ["always"], + errors: [{ messageId: "preferGlobal" }], + }, + { + code: "process.exit(0)", + options: ["never"], + errors: [{ messageId: "preferModule" }], + }, + ], +}) diff --git a/tests/lib/rules/prefer-global/url-search-params.js b/tests/lib/rules/prefer-global/url-search-params.js new file mode 100644 index 00000000..1bcca9b0 --- /dev/null +++ b/tests/lib/rules/prefer-global/url-search-params.js @@ -0,0 +1,49 @@ +/** + * @author Toru Nagashima + * See LICENSE file in root directory for full license. + */ +"use strict" + +const RuleTester = require("eslint").RuleTester +const rule = require("../../../../lib/rules/prefer-global/url-search-params") + +new RuleTester({ + parserOptions: { + ecmaVersion: 2015, + }, + globals: { + URLSearchParams: false, + require: false, + }, +}).run("prefer-global/url-search-params", rule, { + valid: [ + "var b = new URLSearchParams(s)", + { + code: "var b = new URLSearchParams(s)", + options: ["always"], + }, + { + code: + "var { URLSearchParams } = require('url'); var b = new URLSearchParams(s)", + options: ["never"], + }, + ], + invalid: [ + { + code: + "var { URLSearchParams } = require('url'); var b = new URLSearchParams(s)", + errors: [{ messageId: "preferGlobal" }], + }, + { + code: + "var { URLSearchParams } = require('url'); var b = new URLSearchParams(s)", + options: ["always"], + errors: [{ messageId: "preferGlobal" }], + }, + { + code: "var b = new URLSearchParams(s)", + options: ["never"], + errors: [{ messageId: "preferModule" }], + }, + ], +}) diff --git a/tests/lib/rules/prefer-global/url.js b/tests/lib/rules/prefer-global/url.js new file mode 100644 index 00000000..ffd631cb --- /dev/null +++ b/tests/lib/rules/prefer-global/url.js @@ -0,0 +1,46 @@ +/** + * @author Toru Nagashima + * See LICENSE file in root directory for full license. + */ +"use strict" + +const RuleTester = require("eslint").RuleTester +const rule = require("../../../../lib/rules/prefer-global/url") + +new RuleTester({ + parserOptions: { + ecmaVersion: 2015, + }, + globals: { + URL: false, + require: false, + }, +}).run("prefer-global/url", rule, { + valid: [ + "var b = new URL(s)", + { + code: "var b = new URL(s)", + options: ["always"], + }, + { + code: "var { URL } = require('url'); var b = new URL(s)", + options: ["never"], + }, + ], + invalid: [ + { + code: "var { URL } = require('url'); var b = new URL(s)", + errors: [{ messageId: "preferGlobal" }], + }, + { + code: "var { URL } = require('url'); var b = new URL(s)", + options: ["always"], + errors: [{ messageId: "preferGlobal" }], + }, + { + code: "var b = new URL(s)", + options: ["never"], + errors: [{ messageId: "preferModule" }], + }, + ], +})