Skip to content

Commit 46ed54d

Browse files
committed
New: add two prefer-global rules
1 parent d153b93 commit 46ed54d

File tree

9 files changed

+328
-0
lines changed

9 files changed

+328
-0
lines changed

Diff for: README.md

+2
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,8 @@ $ npm install --save-dev eslint eslint-plugin-node
8484
| [node/prefer-global/buffer](./docs/rules/prefer-global/buffer.md) | enforce either `Buffer` or `require("buffer").Buffer` | |
8585
| [node/prefer-global/console](./docs/rules/prefer-global/console.md) | enforce either `console` or `require("console")` | |
8686
| [node/prefer-global/process](./docs/rules/prefer-global/process.md) | enforce either `process` or `require("process")` | |
87+
| [node/prefer-global/text-decoder](./docs/rules/prefer-global/text-decoder.md) | enforce either `TextDecoder` or `require("util").TextDecoder` | |
88+
| [node/prefer-global/text-encoder](./docs/rules/prefer-global/text-encoder.md) | enforce either `TextEncoder` or `require("util").TextEncoder` | |
8789
| [node/prefer-global/url-search-params](./docs/rules/prefer-global/url-search-params.md) | enforce either `URLSearchParams` or `require("url").URLSearchParams` | |
8890
| [node/prefer-global/url](./docs/rules/prefer-global/url.md) | enforce either `URL` or `require("url").URL` | |
8991

Diff for: docs/rules/prefer-global/text-decoder.md

+64
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
# enforce either `TextDecoder` or `require("util").TextDecoder` (prefer-global/text-decoder)
2+
3+
The `TextDecoder` class of `util` module is defined as a global variable.
4+
5+
```js
6+
console.log(TextDecoder === require("util").TextDecoder) //→ true
7+
```
8+
9+
It will be readable if we use either `TextDecoder` consistently.
10+
11+
## Rule Details
12+
13+
This rule enforces which `TextDecoder` we should use.
14+
15+
### Options
16+
17+
This rule has a string option.
18+
19+
```json
20+
{
21+
"node/prefer-global/text-decoder": ["error", "always" | "never"]
22+
}
23+
```
24+
25+
- `"always"` (default) ... enforces to use the global variable `TextDecoder` rather than `require("util").TextDecoder`.
26+
- `"never"` ... enforces to use `require("util").TextDecoder` rather than the global variable `TextDecoder`.
27+
28+
#### always
29+
30+
Examples of :-1: **incorrect** code for this rule:
31+
32+
```js
33+
/*eslint node/prefer-global/text-decoder: [error]*/
34+
35+
const { TextDecoder } = require("util")
36+
const u = new TextDecoder(s)
37+
```
38+
39+
Examples of :+1: **correct** code for this rule:
40+
41+
```js
42+
/*eslint node/prefer-global/text-decoder: [error]*/
43+
44+
const u = new TextDecoder(s)
45+
```
46+
47+
#### never
48+
49+
Examples of :-1: **incorrect** code for the `"never"` option:
50+
51+
```js
52+
/*eslint node/prefer-global/text-decoder: [error, never]*/
53+
54+
const u = new TextDecoder(s)
55+
```
56+
57+
Examples of :+1: **correct** code for the `"never"` option:
58+
59+
```js
60+
/*eslint node/prefer-global/text-decoder: [error, never]*/
61+
62+
const { TextDecoder } = require("util")
63+
const u = new TextDecoder(s)
64+
```

Diff for: docs/rules/prefer-global/text-encoder.md

+64
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
# enforce either `TextEncoder` or `require("util").TextEncoder` (prefer-global/text-encoder)
2+
3+
The `TextEncoder` class of `util` module is defined as a global variable.
4+
5+
```js
6+
console.log(TextEncoder === require("util").TextEncoder) //→ true
7+
```
8+
9+
It will be readable if we use either `TextEncoder` consistently.
10+
11+
## Rule Details
12+
13+
This rule enforces which `TextEncoder` we should use.
14+
15+
### Options
16+
17+
This rule has a string option.
18+
19+
```json
20+
{
21+
"node/prefer-global/text-encoder": ["error", "always" | "never"]
22+
}
23+
```
24+
25+
- `"always"` (default) ... enforces to use the global variable `TextEncoder` rather than `require("util").TextEncoder`.
26+
- `"never"` ... enforces to use `require("util").TextEncoder` rather than the global variable `TextEncoder`.
27+
28+
#### always
29+
30+
Examples of :-1: **incorrect** code for this rule:
31+
32+
```js
33+
/*eslint node/prefer-global/text-encoder: [error]*/
34+
35+
const { TextEncoder } = require("util")
36+
const u = new TextEncoder(s)
37+
```
38+
39+
Examples of :+1: **correct** code for this rule:
40+
41+
```js
42+
/*eslint node/prefer-global/text-encoder: [error]*/
43+
44+
const u = new TextEncoder(s)
45+
```
46+
47+
#### never
48+
49+
Examples of :-1: **incorrect** code for the `"never"` option:
50+
51+
```js
52+
/*eslint node/prefer-global/text-encoder: [error, never]*/
53+
54+
const u = new TextEncoder(s)
55+
```
56+
57+
Examples of :+1: **correct** code for the `"never"` option:
58+
59+
```js
60+
/*eslint node/prefer-global/text-encoder: [error, never]*/
61+
62+
const { TextEncoder } = require("util")
63+
const u = new TextEncoder(s)
64+
```

Diff for: lib/configs/recommended.json

+2
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@
3030
"node/prefer-global/buffer": "off",
3131
"node/prefer-global/console": "off",
3232
"node/prefer-global/process": "off",
33+
"node/prefer-global/text-decoder": "off",
34+
"node/prefer-global/text-encoder": "off",
3335
"node/prefer-global/url-search-params": "off",
3436
"node/prefer-global/url": "off",
3537
"node/process-exit-as-throw": "error",

Diff for: lib/index.js

+2
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ module.exports = {
2121
"prefer-global/buffer": require("./rules/prefer-global/buffer"),
2222
"prefer-global/console": require("./rules/prefer-global/console"),
2323
"prefer-global/process": require("./rules/prefer-global/process"),
24+
"prefer-global/text-decoder": require("./rules/prefer-global/text-decoder"),
25+
"prefer-global/text-encoder": require("./rules/prefer-global/text-encoder"),
2426
"prefer-global/url-search-params": require("./rules/prefer-global/url-search-params"),
2527
"prefer-global/url": require("./rules/prefer-global/url"),
2628
"process-exit-as-throw": require("./rules/process-exit-as-throw"),

Diff for: lib/rules/prefer-global/text-decoder.js

+48
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
/**
2+
* @author Toru Nagashima
3+
* See LICENSE file in root directory for full license.
4+
*/
5+
"use strict"
6+
7+
const { READ } = require("eslint-utils")
8+
const checkForPreferGlobal = require("../../util/check-prefer-global")
9+
10+
const trackMap = {
11+
globals: {
12+
TextDecoder: { [READ]: true },
13+
},
14+
modules: {
15+
util: {
16+
TextDecoder: { [READ]: true },
17+
},
18+
},
19+
}
20+
21+
module.exports = {
22+
meta: {
23+
docs: {
24+
description:
25+
'enforce either `TextDecoder` or `require("util").TextDecoder`',
26+
category: "Stylistic Issues",
27+
recommended: false,
28+
url:
29+
"https://github.com/mysticatea/eslint-plugin-node/blob/v7.0.1/docs/rules/prefer-global/text-decoder.md",
30+
},
31+
fixable: null,
32+
schema: [{ enum: ["always", "never"] }],
33+
messages: {
34+
preferGlobal:
35+
"Unexpected use of 'require(\"util\").TextDecoder'. Use the global variable 'TextDecoder' instead.",
36+
preferModule:
37+
"Unexpected use of the global variable 'TextDecoder'. Use 'require(\"util\").TextDecoder' instead.",
38+
},
39+
},
40+
41+
create(context) {
42+
return {
43+
"Program:exit"() {
44+
checkForPreferGlobal(context, trackMap)
45+
},
46+
}
47+
},
48+
}

Diff for: lib/rules/prefer-global/text-encoder.js

+48
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
/**
2+
* @author Toru Nagashima
3+
* See LICENSE file in root directory for full license.
4+
*/
5+
"use strict"
6+
7+
const { READ } = require("eslint-utils")
8+
const checkForPreferGlobal = require("../../util/check-prefer-global")
9+
10+
const trackMap = {
11+
globals: {
12+
TextEncoder: { [READ]: true },
13+
},
14+
modules: {
15+
util: {
16+
TextEncoder: { [READ]: true },
17+
},
18+
},
19+
}
20+
21+
module.exports = {
22+
meta: {
23+
docs: {
24+
description:
25+
'enforce either `TextEncoder` or `require("util").TextEncoder`',
26+
category: "Stylistic Issues",
27+
recommended: false,
28+
url:
29+
"https://github.com/mysticatea/eslint-plugin-node/blob/v7.0.1/docs/rules/prefer-global/text-encoder.md",
30+
},
31+
fixable: null,
32+
schema: [{ enum: ["always", "never"] }],
33+
messages: {
34+
preferGlobal:
35+
"Unexpected use of 'require(\"util\").TextEncoder'. Use the global variable 'TextEncoder' instead.",
36+
preferModule:
37+
"Unexpected use of the global variable 'TextEncoder'. Use 'require(\"util\").TextEncoder' instead.",
38+
},
39+
},
40+
41+
create(context) {
42+
return {
43+
"Program:exit"() {
44+
checkForPreferGlobal(context, trackMap)
45+
},
46+
}
47+
},
48+
}

Diff for: tests/lib/rules/prefer-global/text-decoder.js

+49
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
/**
2+
* @author Toru Nagashima
3+
* See LICENSE file in root directory for full license.
4+
*/
5+
"use strict"
6+
7+
const RuleTester = require("eslint").RuleTester
8+
const rule = require("../../../../lib/rules/prefer-global/text-decoder")
9+
10+
new RuleTester({
11+
parserOptions: {
12+
ecmaVersion: 2015,
13+
},
14+
globals: {
15+
TextDecoder: false,
16+
require: false,
17+
},
18+
}).run("prefer-global/text-decoder", rule, {
19+
valid: [
20+
"var b = new TextDecoder(s)",
21+
{
22+
code: "var b = new TextDecoder(s)",
23+
options: ["always"],
24+
},
25+
{
26+
code:
27+
"var { TextDecoder } = require('util'); var b = new TextDecoder(s)",
28+
options: ["never"],
29+
},
30+
],
31+
invalid: [
32+
{
33+
code:
34+
"var { TextDecoder } = require('util'); var b = new TextDecoder(s)",
35+
errors: [{ messageId: "preferGlobal" }],
36+
},
37+
{
38+
code:
39+
"var { TextDecoder } = require('util'); var b = new TextDecoder(s)",
40+
options: ["always"],
41+
errors: [{ messageId: "preferGlobal" }],
42+
},
43+
{
44+
code: "var b = new TextDecoder(s)",
45+
options: ["never"],
46+
errors: [{ messageId: "preferModule" }],
47+
},
48+
],
49+
})

Diff for: tests/lib/rules/prefer-global/text-encoder.js

+49
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
/**
2+
* @author Toru Nagashima
3+
* See LICENSE file in root directory for full license.
4+
*/
5+
"use strict"
6+
7+
const RuleTester = require("eslint").RuleTester
8+
const rule = require("../../../../lib/rules/prefer-global/text-encoder")
9+
10+
new RuleTester({
11+
parserOptions: {
12+
ecmaVersion: 2015,
13+
},
14+
globals: {
15+
TextEncoder: false,
16+
require: false,
17+
},
18+
}).run("prefer-global/text-encoder", rule, {
19+
valid: [
20+
"var b = new TextEncoder(s)",
21+
{
22+
code: "var b = new TextEncoder(s)",
23+
options: ["always"],
24+
},
25+
{
26+
code:
27+
"var { TextEncoder } = require('util'); var b = new TextEncoder(s)",
28+
options: ["never"],
29+
},
30+
],
31+
invalid: [
32+
{
33+
code:
34+
"var { TextEncoder } = require('util'); var b = new TextEncoder(s)",
35+
errors: [{ messageId: "preferGlobal" }],
36+
},
37+
{
38+
code:
39+
"var { TextEncoder } = require('util'); var b = new TextEncoder(s)",
40+
options: ["always"],
41+
errors: [{ messageId: "preferGlobal" }],
42+
},
43+
{
44+
code: "var b = new TextEncoder(s)",
45+
options: ["never"],
46+
errors: [{ messageId: "preferModule" }],
47+
},
48+
],
49+
})

0 commit comments

Comments
 (0)