eslint-plugin-unicorn 38.0.1 → 41.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (126) hide show
  1. package/configs/all.js +5 -13
  2. package/configs/recommended.js +20 -13
  3. package/index.js +3 -2
  4. package/package.json +71 -28
  5. package/readme.md +37 -141
  6. package/rules/better-regex.js +3 -0
  7. package/rules/catch-error-name.js +4 -1
  8. package/rules/consistent-destructuring.js +2 -0
  9. package/rules/consistent-function-scoping.js +10 -6
  10. package/rules/custom-error-definition.js +2 -0
  11. package/rules/empty-brace-spaces.js +2 -2
  12. package/rules/error-message.js +2 -0
  13. package/rules/escape-case.js +2 -0
  14. package/rules/expiring-todo-comments.js +23 -12
  15. package/rules/explicit-length-check.js +2 -0
  16. package/rules/filename-case.js +4 -12
  17. package/rules/fix/append-argument.js +1 -1
  18. package/rules/fix/index.js +3 -0
  19. package/rules/fix/remove-argument.js +2 -1
  20. package/rules/fix/remove-parentheses.js +11 -0
  21. package/rules/fix/replace-argument.js +8 -0
  22. package/rules/fix/replace-string-literal.js +11 -0
  23. package/rules/import-index.js +3 -1
  24. package/rules/import-style.js +69 -70
  25. package/rules/new-for-builtins.js +2 -0
  26. package/rules/no-abusive-eslint-disable.js +2 -0
  27. package/rules/no-array-callback-reference.js +9 -8
  28. package/rules/no-array-for-each.js +6 -1
  29. package/rules/no-array-method-this-argument.js +1 -0
  30. package/rules/no-array-push-push.js +12 -3
  31. package/rules/no-array-reduce.js +3 -0
  32. package/rules/no-await-expression-member.js +84 -0
  33. package/rules/no-console-spaces.js +2 -0
  34. package/rules/no-document-cookie.js +3 -2
  35. package/rules/no-empty-file.js +15 -1
  36. package/rules/no-for-loop.js +2 -0
  37. package/rules/no-hex-escape.js +2 -0
  38. package/rules/no-instanceof-array.js +2 -0
  39. package/rules/no-invalid-remove-event-listener.js +1 -1
  40. package/rules/no-keyword-prefix.js +3 -2
  41. package/rules/no-lonely-if.js +2 -0
  42. package/rules/no-nested-ternary.js +2 -0
  43. package/rules/no-new-array.js +22 -19
  44. package/rules/no-new-buffer.js +7 -4
  45. package/rules/no-null.js +3 -1
  46. package/rules/no-object-as-default-parameter.js +2 -0
  47. package/rules/no-process-exit.js +2 -0
  48. package/rules/no-static-only-class.js +2 -1
  49. package/rules/no-thenable.js +127 -0
  50. package/rules/no-this-assignment.js +2 -0
  51. package/rules/no-unreadable-array-destructuring.js +2 -0
  52. package/rules/no-unsafe-regex.js +2 -0
  53. package/rules/no-unused-properties.js +2 -0
  54. package/rules/no-useless-fallback-in-spread.js +3 -9
  55. package/rules/no-useless-length-check.js +1 -0
  56. package/rules/no-useless-promise-resolve-reject.js +204 -0
  57. package/rules/no-useless-spread.js +3 -6
  58. package/rules/no-useless-undefined.js +6 -2
  59. package/rules/no-zero-fractions.js +2 -0
  60. package/rules/number-literal-case.js +2 -0
  61. package/rules/numeric-separators-style.js +3 -2
  62. package/rules/prefer-add-event-listener.js +7 -1
  63. package/rules/prefer-array-find.js +4 -2
  64. package/rules/prefer-array-flat-map.js +2 -0
  65. package/rules/prefer-array-flat.js +2 -1
  66. package/rules/prefer-array-index-of.js +1 -0
  67. package/rules/prefer-array-some.js +2 -0
  68. package/rules/prefer-at.js +44 -28
  69. package/rules/prefer-code-point.js +56 -0
  70. package/rules/prefer-date-now.js +2 -0
  71. package/rules/prefer-default-parameters.js +3 -1
  72. package/rules/prefer-dom-node-append.js +2 -0
  73. package/rules/prefer-dom-node-dataset.js +50 -27
  74. package/rules/prefer-dom-node-remove.js +2 -0
  75. package/rules/prefer-dom-node-text-content.js +2 -0
  76. package/rules/prefer-export-from.js +187 -78
  77. package/rules/prefer-includes.js +2 -0
  78. package/rules/prefer-json-parse-buffer.js +158 -0
  79. package/rules/prefer-keyboard-event-key.js +18 -7
  80. package/rules/prefer-math-trunc.js +7 -5
  81. package/rules/prefer-modern-dom-apis.js +2 -0
  82. package/rules/prefer-module.js +16 -14
  83. package/rules/prefer-negative-index.js +2 -0
  84. package/rules/prefer-node-protocol.js +4 -3
  85. package/rules/prefer-number-properties.js +3 -1
  86. package/rules/prefer-object-from-entries.js +4 -5
  87. package/rules/prefer-optional-catch-binding.js +2 -0
  88. package/rules/prefer-prototype-methods.js +3 -2
  89. package/rules/prefer-query-selector.js +2 -0
  90. package/rules/prefer-reflect-apply.js +7 -5
  91. package/rules/prefer-regexp-test.js +2 -0
  92. package/rules/prefer-set-has.js +4 -2
  93. package/rules/prefer-spread.js +2 -0
  94. package/rules/prefer-string-replace-all.js +2 -0
  95. package/rules/prefer-string-slice.js +126 -132
  96. package/rules/prefer-string-starts-ends-with.js +2 -0
  97. package/rules/prefer-string-trim-start-end.js +2 -0
  98. package/rules/prefer-switch.js +3 -1
  99. package/rules/prefer-ternary.js +3 -1
  100. package/rules/prefer-top-level-await.js +34 -2
  101. package/rules/prefer-type-error.js +2 -0
  102. package/rules/prevent-abbreviations.js +78 -72
  103. package/rules/relative-url-style.js +109 -0
  104. package/rules/require-array-join-separator.js +1 -0
  105. package/rules/require-number-to-fixed-digits-argument.js +9 -5
  106. package/rules/require-post-message-target-origin.js +1 -0
  107. package/rules/selectors/not-dom-node.js +2 -1
  108. package/rules/string-content.js +3 -1
  109. package/rules/template-indent.js +12 -4
  110. package/rules/text-encoding-identifier-case.js +69 -0
  111. package/rules/throw-new-error.js +3 -1
  112. package/rules/utils/create-deprecated-rules.js +1 -1
  113. package/rules/utils/get-builtin-rule.js +1 -1
  114. package/rules/utils/get-key-name.js +39 -0
  115. package/rules/utils/get-references.js +3 -3
  116. package/rules/utils/get-variable-identifiers.js +2 -3
  117. package/rules/utils/is-function-self-used-inside.js +1 -1
  118. package/rules/utils/is-number.js +224 -0
  119. package/rules/utils/is-same-reference.js +4 -4
  120. package/rules/utils/rule.js +41 -3
  121. package/rules/utils/should-add-parentheses-to-logical-expression-child.js +2 -1
  122. package/rules/utils/should-add-parentheses-to-member-expression-object.js +1 -1
  123. package/configs/base.js +0 -13
  124. package/configs/conflicting-rules.js +0 -6
  125. package/rules/prefer-object-has-own.js +0 -105
  126. package/rules/utils/get-property-name.js +0 -30
package/configs/all.js CHANGED
@@ -1,17 +1,9 @@
1
1
  'use strict';
2
- const conflictingRules = require('./conflicting-rules.js');
2
+ const {rules, ...baseConfigs} = require('./recommended.js');
3
3
 
4
4
  module.exports = {
5
- ...require('./base.js'),
6
- rules: {
7
- ...Object.fromEntries(
8
- Object.entries(require('./recommended.js').rules)
9
- .filter(
10
- ruleEntry =>
11
- !Object.keys(conflictingRules.rules).includes(ruleEntry[0]),
12
- )
13
- .map(ruleEntry => [ruleEntry[0], 'error']),
14
- ),
15
- ...conflictingRules.rules,
16
- },
5
+ ...baseConfigs,
6
+ rules: Object.fromEntries(Object.entries(rules).map(
7
+ ([ruleId, severity]) => [ruleId, ruleId.startsWith('unicorn/') ? 'error' : severity],
8
+ )),
17
9
  };
@@ -1,6 +1,15 @@
1
1
  'use strict';
2
2
  module.exports = {
3
- ...require('./base.js'),
3
+ env: {
4
+ es2022: true,
5
+ },
6
+ parserOptions: {
7
+ ecmaVersion: 'latest',
8
+ sourceType: 'module',
9
+ },
10
+ plugins: [
11
+ 'unicorn',
12
+ ],
4
13
  rules: {
5
14
  'unicorn/better-regex': 'error',
6
15
  'unicorn/catch-error-name': 'error',
@@ -22,6 +31,7 @@ module.exports = {
22
31
  'unicorn/no-array-method-this-argument': 'error',
23
32
  'unicorn/no-array-push-push': 'error',
24
33
  'unicorn/no-array-reduce': 'error',
34
+ 'unicorn/no-await-expression-member': 'error',
25
35
  'unicorn/no-console-spaces': 'error',
26
36
  'unicorn/no-document-cookie': 'error',
27
37
  'unicorn/no-empty-file': 'error',
@@ -39,12 +49,14 @@ module.exports = {
39
49
  'unicorn/no-object-as-default-parameter': 'error',
40
50
  'unicorn/no-process-exit': 'error',
41
51
  'unicorn/no-static-only-class': 'error',
52
+ 'unicorn/no-thenable': 'error',
42
53
  'unicorn/no-this-assignment': 'error',
43
54
  'unicorn/no-unreadable-array-destructuring': 'error',
44
55
  'unicorn/no-unsafe-regex': 'off',
45
56
  'unicorn/no-unused-properties': 'off',
46
57
  'unicorn/no-useless-fallback-in-spread': 'error',
47
58
  'unicorn/no-useless-length-check': 'error',
59
+ 'unicorn/no-useless-promise-resolve-reject': 'error',
48
60
  'unicorn/no-useless-spread': 'error',
49
61
  'unicorn/no-useless-undefined': 'error',
50
62
  'unicorn/no-zero-fractions': 'error',
@@ -58,6 +70,7 @@ module.exports = {
58
70
  'unicorn/prefer-array-some': 'error',
59
71
  // TODO: Enable this by default when targeting a Node.js version that supports `Array#at`.
60
72
  'unicorn/prefer-at': 'off',
73
+ 'unicorn/prefer-code-point': 'error',
61
74
  'unicorn/prefer-date-now': 'error',
62
75
  'unicorn/prefer-default-parameters': 'error',
63
76
  'unicorn/prefer-dom-node-append': 'error',
@@ -66,6 +79,7 @@ module.exports = {
66
79
  'unicorn/prefer-dom-node-text-content': 'error',
67
80
  'unicorn/prefer-export-from': 'error',
68
81
  'unicorn/prefer-includes': 'error',
82
+ 'unicorn/prefer-json-parse-buffer': 'error',
69
83
  'unicorn/prefer-keyboard-event-key': 'error',
70
84
  'unicorn/prefer-math-trunc': 'error',
71
85
  'unicorn/prefer-modern-dom-apis': 'error',
@@ -74,8 +88,6 @@ module.exports = {
74
88
  'unicorn/prefer-node-protocol': 'error',
75
89
  'unicorn/prefer-number-properties': 'error',
76
90
  'unicorn/prefer-object-from-entries': 'error',
77
- // TODO: Enable this by default when targeting Node.js 16.
78
- 'unicorn/prefer-object-has-own': 'off',
79
91
  'unicorn/prefer-optional-catch-binding': 'error',
80
92
  'unicorn/prefer-prototype-methods': 'error',
81
93
  'unicorn/prefer-query-selector': 'error',
@@ -94,20 +106,15 @@ module.exports = {
94
106
  'unicorn/prefer-top-level-await': 'off',
95
107
  'unicorn/prefer-type-error': 'error',
96
108
  'unicorn/prevent-abbreviations': 'error',
109
+ 'unicorn/relative-url-style': 'error',
97
110
  'unicorn/require-array-join-separator': 'error',
98
111
  'unicorn/require-number-to-fixed-digits-argument': 'error',
99
- 'unicorn/require-post-message-target-origin': 'error',
112
+ // Turned off because we can't distinguish `widow.postMessage` and `{Worker,MessagePort,Client,BroadcastChannel}#postMessage()`
113
+ // See #1396
114
+ 'unicorn/require-post-message-target-origin': 'off',
100
115
  'unicorn/string-content': 'off',
101
116
  'unicorn/template-indent': 'warn',
117
+ 'unicorn/text-encoding-identifier-case': 'error',
102
118
  'unicorn/throw-new-error': 'error',
103
- ...require('./conflicting-rules.js').rules,
104
119
  },
105
- overrides: [
106
- {
107
- files: ['*.ts', '*.tsx'],
108
- rules: {
109
- 'unicorn/require-post-message-target-origin': 'off',
110
- },
111
- },
112
- ],
113
120
  };
package/index.js CHANGED
@@ -2,7 +2,7 @@
2
2
  const createDeprecatedRules = require('./rules/utils/create-deprecated-rules.js');
3
3
  const {loadRules} = require('./rules/utils/rule.js');
4
4
  const recommendedConfig = require('./configs/recommended.js');
5
- const all = require('./configs/all.js');
5
+ const allRulesEnabledConfig = require('./configs/all.js');
6
6
 
7
7
  const deprecatedRules = createDeprecatedRules({
8
8
  // {ruleId: ReplacementRuleId | ReplacementRuleId[]}, if no replacement, use `{ruleId: []}`
@@ -15,6 +15,7 @@ const deprecatedRules = createDeprecatedRules({
15
15
  'prefer-flat-map': 'unicorn/prefer-array-flat-map',
16
16
  'prefer-node-append': 'unicorn/prefer-dom-node-append',
17
17
  'prefer-node-remove': 'unicorn/prefer-dom-node-remove',
18
+ 'prefer-object-has-own': 'prefer-object-has-own',
18
19
  'prefer-replace-all': 'unicorn/prefer-string-replace-all',
19
20
  'prefer-starts-ends-with': 'unicorn/prefer-string-starts-ends-with',
20
21
  'prefer-text-content': 'unicorn/prefer-dom-node-text-content',
@@ -29,6 +30,6 @@ module.exports = {
29
30
  },
30
31
  configs: {
31
32
  recommended: recommendedConfig,
32
- all,
33
+ all: allRulesEnabledConfig,
33
34
  },
34
35
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "eslint-plugin-unicorn",
3
- "version": "38.0.1",
3
+ "version": "41.0.0",
4
4
  "description": "Various awesome ESLint rules",
5
5
  "license": "MIT",
6
6
  "repository": "sindresorhus/eslint-plugin-unicorn",
@@ -14,13 +14,21 @@
14
14
  "node": ">=12"
15
15
  },
16
16
  "scripts": {
17
- "test": "xo && nyc ava",
18
- "create-rule": "node ./scripts/create-rule.mjs && npm run generate-rules-table && npm run generate-usage-example",
19
- "run-rules-on-codebase": "node ./test/run-rules-on-codebase/lint.mjs",
17
+ "create-rule": "node ./scripts/create-rule.mjs && npm run generate-rule-notices && npm run generate-rules-table",
18
+ "fix": "run-p --continue-on-error fix:*",
19
+ "fix:js": "npm run lint:js -- --fix",
20
+ "fix:md": "npm run lint:md -- --fix",
21
+ "generate-rule-notices": "node ./scripts/generate-rule-notices.mjs",
22
+ "generate-rules-table": "node ./scripts/generate-rules-table.mjs",
20
23
  "integration": "node ./test/integration/test.mjs",
24
+ "lint": "run-p --continue-on-error lint:*",
25
+ "lint:js": "xo",
26
+ "lint:md": "markdownlint \"**/*.md\"",
27
+ "lint:package-json": "npmPkgJsonLint .",
28
+ "run-rules-on-codebase": "node ./test/run-rules-on-codebase/lint.mjs",
21
29
  "smoke": "eslint-remote-tester --config ./test/smoke/eslint-remote-tester.config.js",
22
- "generate-rules-table": "node ./scripts/generate-rules-table.mjs",
23
- "generate-usage-example": "node ./scripts/generate-usage-example.mjs"
30
+ "test": "npm-run-all --continue-on-error lint test:*",
31
+ "test:js": "c8 ava"
24
32
  },
25
33
  "files": [
26
34
  "index.js",
@@ -38,48 +46,51 @@
38
46
  "xo"
39
47
  ],
40
48
  "dependencies": {
41
- "@babel/helper-validator-identifier": "^7.14.9",
42
- "ci-info": "^3.2.0",
49
+ "@babel/helper-validator-identifier": "^7.15.7",
50
+ "ci-info": "^3.3.0",
43
51
  "clean-regexp": "^1.0.0",
44
- "eslint-template-visitor": "^2.3.2",
45
52
  "eslint-utils": "^3.0.0",
46
53
  "esquery": "^1.4.0",
47
- "indent-string": "4",
54
+ "indent-string": "^4.0.0",
48
55
  "is-builtin-module": "^3.1.0",
49
56
  "lodash": "^4.17.21",
50
57
  "pluralize": "^8.0.0",
51
58
  "read-pkg-up": "^7.0.1",
52
- "regexp-tree": "^0.1.23",
59
+ "regexp-tree": "^0.1.24",
53
60
  "safe-regex": "^2.1.1",
54
61
  "semver": "^7.3.5",
55
62
  "strip-indent": "^3.0.0"
56
63
  },
57
64
  "devDependencies": {
58
- "@babel/code-frame": "^7.14.5",
59
- "@babel/core": "^7.15.5",
60
- "@babel/eslint-parser": "^7.16.0",
65
+ "@babel/code-frame": "^7.16.0",
66
+ "@babel/core": "^7.16.5",
67
+ "@babel/eslint-parser": "^7.16.5",
61
68
  "@lubien/fixture-beta-package": "^1.0.0-beta.1",
62
- "@typescript-eslint/parser": "^5.2.0",
69
+ "@typescript-eslint/parser": "^5.7.0",
63
70
  "ava": "^3.15.0",
64
- "chalk": "^4.1.2",
65
- "enquirer": "2.3.6",
66
- "eslint": "^8.0.0",
71
+ "c8": "^7.11.0",
72
+ "chalk": "^5.0.0",
73
+ "enquirer": "^2.3.6",
74
+ "eslint": "^8.8.0",
67
75
  "eslint-ava-rule-tester": "^4.0.0",
68
- "eslint-plugin-eslint-plugin": "^4.0.2",
76
+ "eslint-plugin-eslint-plugin": "^4.1.0",
77
+ "eslint-plugin-internal-rules": "file:./scripts/internal-rules/",
69
78
  "eslint-remote-tester": "^2.0.1",
70
79
  "eslint-remote-tester-repositories": "^0.0.3",
71
- "execa": "^5.1.1",
80
+ "execa": "^6.0.0",
72
81
  "listr": "^0.14.3",
73
- "lodash-es": "4.17.21",
82
+ "lodash-es": "^4.17.21",
83
+ "markdownlint-cli": "^0.30.0",
74
84
  "mem": "^9.0.1",
75
- "nyc": "^15.1.0",
85
+ "npm-package-json-lint": "^5.4.2",
86
+ "npm-run-all": "^4.1.5",
76
87
  "outdent": "^0.8.0",
77
- "typescript": "^4.4.2",
78
- "vue-eslint-parser": "^8.0.0",
79
- "xo": "^0.46.3"
88
+ "typescript": "^4.5.4",
89
+ "vue-eslint-parser": "^8.0.1",
90
+ "xo": "^0.47.0"
80
91
  },
81
92
  "peerDependencies": {
82
- "eslint": ">=7.32.0"
93
+ "eslint": ">=8.8.0"
83
94
  },
84
95
  "ava": {
85
96
  "files": [
@@ -87,7 +98,7 @@
87
98
  "test/unit/*.mjs"
88
99
  ]
89
100
  },
90
- "nyc": {
101
+ "c8": {
91
102
  "reporter": [
92
103
  "text",
93
104
  "lcov"
@@ -100,7 +111,16 @@
100
111
  "test/integration/{fixtures,fixtures-local}/**"
101
112
  ],
102
113
  "rules": {
103
- "unicorn/no-null": "error"
114
+ "unicorn/no-null": "error",
115
+ "unicorn/prefer-array-flat": [
116
+ "error",
117
+ {
118
+ "functions": [
119
+ "flat",
120
+ "flatten"
121
+ ]
122
+ }
123
+ ]
104
124
  },
105
125
  "overrides": [
106
126
  {
@@ -136,7 +156,30 @@
136
156
  "eslint-plugin/require-meta-has-suggestions": "off",
137
157
  "eslint-plugin/require-meta-schema": "off"
138
158
  }
159
+ },
160
+ {
161
+ "files": [
162
+ "rules/**/*.js"
163
+ ],
164
+ "plugins": [
165
+ "internal-rules"
166
+ ],
167
+ "rules": {
168
+ "internal-rules/prefer-negative-boolean-attribute": "error"
169
+ }
139
170
  }
140
171
  ]
172
+ },
173
+ "npmpackagejsonlint": {
174
+ "rules": {
175
+ "prefer-caret-version-devDependencies": [
176
+ "error",
177
+ {
178
+ "exceptions": [
179
+ "eslint-plugin-internal-rules"
180
+ ]
181
+ }
182
+ ]
183
+ }
141
184
  }
142
185
  }
package/readme.md CHANGED
@@ -1,5 +1,6 @@
1
1
  # eslint-plugin-unicorn [![Coverage Status](https://codecov.io/gh/sindresorhus/eslint-plugin-unicorn/branch/main/graph/badge.svg)](https://codecov.io/gh/sindresorhus/eslint-plugin-unicorn/branch/main) [![npm version](https://img.shields.io/npm/v/eslint-plugin-unicorn.svg?style=flat)](https://npmjs.com/package/eslint-plugin-unicorn)
2
2
 
3
+ <!-- markdownlint-disable-next-line no-inline-html -->
3
4
  <img src="https://cloud.githubusercontent.com/assets/170270/18659176/1cc373d0-7f33-11e6-890f-0ba35362ee7e.jpg" width="180" align="right">
4
5
 
5
6
  > Various awesome ESLint rules
@@ -10,22 +11,20 @@ You might want to check out [XO](https://github.com/xojs/xo), which includes thi
10
11
 
11
12
  ## Install
12
13
 
13
- ```console
14
- $ npm install --save-dev eslint eslint-plugin-unicorn
14
+ ```sh
15
+ npm install --save-dev eslint eslint-plugin-unicorn
15
16
  ```
16
17
 
17
18
  ## Usage
18
19
 
19
- Configure it in `package.json`.
20
+ Use a [preset config](#preset-configs) or configure each rules in `package.json`.
20
21
 
21
- <!-- Do not manually modify this table. Run: `npm run generate-usage-example` -->
22
- <!-- USAGE_EXAMPLE_START -->
23
22
  ```json
24
23
  {
25
24
  "name": "my-awesome-project",
26
25
  "eslintConfig": {
27
26
  "env": {
28
- "es6": true
27
+ "es2022": true
29
28
  },
30
29
  "parserOptions": {
31
30
  "ecmaVersion": "latest",
@@ -36,127 +35,22 @@ Configure it in `package.json`.
36
35
  ],
37
36
  "rules": {
38
37
  "unicorn/better-regex": "error",
39
- "unicorn/catch-error-name": "error",
40
- "unicorn/consistent-destructuring": "error",
41
- "unicorn/consistent-function-scoping": "error",
42
- "unicorn/custom-error-definition": "off",
43
- "unicorn/empty-brace-spaces": "error",
44
- "unicorn/error-message": "error",
45
- "unicorn/escape-case": "error",
46
- "unicorn/expiring-todo-comments": "error",
47
- "unicorn/explicit-length-check": "error",
48
- "unicorn/filename-case": "error",
49
- "unicorn/import-index": "off",
50
- "unicorn/import-style": "error",
51
- "unicorn/new-for-builtins": "error",
52
- "unicorn/no-abusive-eslint-disable": "error",
53
- "unicorn/no-array-callback-reference": "error",
54
- "unicorn/no-array-for-each": "error",
55
- "unicorn/no-array-method-this-argument": "error",
56
- "unicorn/no-array-push-push": "error",
57
- "unicorn/no-array-reduce": "error",
58
- "unicorn/no-console-spaces": "error",
59
- "unicorn/no-document-cookie": "error",
60
- "unicorn/no-empty-file": "error",
61
- "unicorn/no-for-loop": "error",
62
- "unicorn/no-hex-escape": "error",
63
- "unicorn/no-instanceof-array": "error",
64
- "unicorn/no-invalid-remove-event-listener": "error",
65
- "unicorn/no-keyword-prefix": "off",
66
- "unicorn/no-lonely-if": "error",
67
- "no-nested-ternary": "off",
68
- "unicorn/no-nested-ternary": "error",
69
- "unicorn/no-new-array": "error",
70
- "unicorn/no-new-buffer": "error",
71
- "unicorn/no-null": "error",
72
- "unicorn/no-object-as-default-parameter": "error",
73
- "unicorn/no-process-exit": "error",
74
- "unicorn/no-static-only-class": "error",
75
- "unicorn/no-this-assignment": "error",
76
- "unicorn/no-unreadable-array-destructuring": "error",
77
- "unicorn/no-unsafe-regex": "off",
78
- "unicorn/no-unused-properties": "off",
79
- "unicorn/no-useless-fallback-in-spread": "error",
80
- "unicorn/no-useless-length-check": "error",
81
- "unicorn/no-useless-spread": "error",
82
- "unicorn/no-useless-undefined": "error",
83
- "unicorn/no-zero-fractions": "error",
84
- "unicorn/number-literal-case": "error",
85
- "unicorn/numeric-separators-style": "error",
86
- "unicorn/prefer-add-event-listener": "error",
87
- "unicorn/prefer-array-find": "error",
88
- "unicorn/prefer-array-flat": "error",
89
- "unicorn/prefer-array-flat-map": "error",
90
- "unicorn/prefer-array-index-of": "error",
91
- "unicorn/prefer-array-some": "error",
92
- "unicorn/prefer-at": "off",
93
- "unicorn/prefer-date-now": "error",
94
- "unicorn/prefer-default-parameters": "error",
95
- "unicorn/prefer-dom-node-append": "error",
96
- "unicorn/prefer-dom-node-dataset": "error",
97
- "unicorn/prefer-dom-node-remove": "error",
98
- "unicorn/prefer-dom-node-text-content": "error",
99
- "unicorn/prefer-export-from": "error",
100
- "unicorn/prefer-includes": "error",
101
- "unicorn/prefer-keyboard-event-key": "error",
102
- "unicorn/prefer-math-trunc": "error",
103
- "unicorn/prefer-modern-dom-apis": "error",
104
- "unicorn/prefer-module": "error",
105
- "unicorn/prefer-negative-index": "error",
106
- "unicorn/prefer-node-protocol": "error",
107
- "unicorn/prefer-number-properties": "error",
108
- "unicorn/prefer-object-from-entries": "error",
109
- "unicorn/prefer-object-has-own": "off",
110
- "unicorn/prefer-optional-catch-binding": "error",
111
- "unicorn/prefer-prototype-methods": "error",
112
- "unicorn/prefer-query-selector": "error",
113
- "unicorn/prefer-reflect-apply": "error",
114
- "unicorn/prefer-regexp-test": "error",
115
- "unicorn/prefer-set-has": "error",
116
- "unicorn/prefer-spread": "error",
117
- "unicorn/prefer-string-replace-all": "off",
118
- "unicorn/prefer-string-slice": "error",
119
- "unicorn/prefer-string-starts-ends-with": "error",
120
- "unicorn/prefer-string-trim-start-end": "error",
121
- "unicorn/prefer-switch": "error",
122
- "unicorn/prefer-ternary": "error",
123
- "unicorn/prefer-top-level-await": "off",
124
- "unicorn/prefer-type-error": "error",
125
- "unicorn/prevent-abbreviations": "error",
126
- "unicorn/require-array-join-separator": "error",
127
- "unicorn/require-number-to-fixed-digits-argument": "error",
128
- "unicorn/require-post-message-target-origin": "error",
129
- "unicorn/string-content": "off",
130
- "unicorn/template-indent": "warn",
131
- "unicorn/throw-new-error": "error"
132
- },
133
- "overrides": [
134
- {
135
- "files": [
136
- "*.ts",
137
- "*.tsx"
138
- ],
139
- "rules": {
140
- "unicorn/require-post-message-target-origin": "off"
141
- }
142
- }
143
- ]
38
+ "unicorn/…": "error"
39
+ }
144
40
  }
145
41
  }
146
42
  ```
147
- <!-- USAGE_EXAMPLE_END -->
148
43
 
149
44
  ## Rules
150
45
 
151
46
  Each rule has emojis denoting:
152
47
 
153
- * ✅ if it belongs to the `recommended` configuration
154
- * 🔧 if some problems reported by the rule are automatically fixable by the `--fix` [command line](https://eslint.org/docs/user-guide/command-line-interface#fixing-problems) option
155
- * 💡 if some problems reported by the rule are manually fixable by editor [suggestions](https://eslint.org/docs/developer-guide/working-with-rules#providing-suggestions)
156
-
157
- <!-- Do not manually modify this table. Run: `npm run generate-rules-table` -->
158
- <!-- RULES_TABLE_START -->
48
+ - ✅ if it belongs to the `recommended` configuration
49
+ - 🔧 if some problems reported by the rule are automatically fixable by the `--fix` [command line](https://eslint.org/docs/user-guide/command-line-interface#fixing-problems) option
50
+ - 💡 if some problems reported by the rule are manually fixable by editor [suggestions](https://eslint.org/docs/developer-guide/working-with-rules#providing-suggestions)
159
51
 
52
+ <!-- Do not manually modify RULES_TABLE part. Run: `npm run generate-rules-table` -->
53
+ <!-- RULES_TABLE -->
160
54
  | Name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | Description | ✅ | 🔧 | 💡 |
161
55
  | :-- | :-- | :-- | :-- | :-- |
162
56
  | [better-regex](docs/rules/better-regex.md) | Improve regexes by making them shorter, consistent, and safer. | ✅ | 🔧 | |
@@ -179,6 +73,7 @@ Each rule has emojis denoting:
179
73
  | [no-array-method-this-argument](docs/rules/no-array-method-this-argument.md) | Disallow using the `this` argument in array methods. | ✅ | 🔧 | 💡 |
180
74
  | [no-array-push-push](docs/rules/no-array-push-push.md) | Enforce combining multiple `Array#push()` into one call. | ✅ | 🔧 | 💡 |
181
75
  | [no-array-reduce](docs/rules/no-array-reduce.md) | Disallow `Array#reduce()` and `Array#reduceRight()`. | ✅ | | |
76
+ | [no-await-expression-member](docs/rules/no-await-expression-member.md) | Forbid member access from await expression. | ✅ | 🔧 | |
182
77
  | [no-console-spaces](docs/rules/no-console-spaces.md) | Do not use leading/trailing space between `console.log` parameters. | ✅ | 🔧 | |
183
78
  | [no-document-cookie](docs/rules/no-document-cookie.md) | Do not use `document.cookie` directly. | ✅ | | |
184
79
  | [no-empty-file](docs/rules/no-empty-file.md) | Disallow empty files. | ✅ | | |
@@ -195,12 +90,14 @@ Each rule has emojis denoting:
195
90
  | [no-object-as-default-parameter](docs/rules/no-object-as-default-parameter.md) | Disallow the use of objects as default parameters. | ✅ | | |
196
91
  | [no-process-exit](docs/rules/no-process-exit.md) | Disallow `process.exit()`. | ✅ | | |
197
92
  | [no-static-only-class](docs/rules/no-static-only-class.md) | Forbid classes that only have static members. | ✅ | 🔧 | |
93
+ | [no-thenable](docs/rules/no-thenable.md) | Disallow `then` property. | ✅ | | |
198
94
  | [no-this-assignment](docs/rules/no-this-assignment.md) | Disallow assigning `this` to a variable. | ✅ | | |
199
95
  | [no-unreadable-array-destructuring](docs/rules/no-unreadable-array-destructuring.md) | Disallow unreadable array destructuring. | ✅ | 🔧 | |
200
96
  | [no-unsafe-regex](docs/rules/no-unsafe-regex.md) | Disallow unsafe regular expressions. | | | |
201
97
  | [no-unused-properties](docs/rules/no-unused-properties.md) | Disallow unused object properties. | | | |
202
98
  | [no-useless-fallback-in-spread](docs/rules/no-useless-fallback-in-spread.md) | Forbid useless fallback when spreading in object literals. | ✅ | 🔧 | |
203
99
  | [no-useless-length-check](docs/rules/no-useless-length-check.md) | Disallow useless array length check. | ✅ | 🔧 | |
100
+ | [no-useless-promise-resolve-reject](docs/rules/no-useless-promise-resolve-reject.md) | Disallow returning/yielding `Promise.resolve/reject()` in async functions or promise callbacks | ✅ | 🔧 | |
204
101
  | [no-useless-spread](docs/rules/no-useless-spread.md) | Disallow unnecessary spread. | ✅ | 🔧 | |
205
102
  | [no-useless-undefined](docs/rules/no-useless-undefined.md) | Disallow useless `undefined`. | ✅ | 🔧 | |
206
103
  | [no-zero-fractions](docs/rules/no-zero-fractions.md) | Disallow number literals with zero fractions or dangling dots. | ✅ | 🔧 | |
@@ -213,14 +110,16 @@ Each rule has emojis denoting:
213
110
  | [prefer-array-index-of](docs/rules/prefer-array-index-of.md) | Prefer `Array#indexOf()` over `Array#findIndex()` when looking for the index of an item. | ✅ | 🔧 | 💡 |
214
111
  | [prefer-array-some](docs/rules/prefer-array-some.md) | Prefer `.some(…)` over `.filter(…).length` check and `.find(…)`. | ✅ | 🔧 | 💡 |
215
112
  | [prefer-at](docs/rules/prefer-at.md) | Prefer `.at()` method for index access and `String#charAt()`. | | 🔧 | 💡 |
113
+ | [prefer-code-point](docs/rules/prefer-code-point.md) | Prefer `String#codePointAt(…)` over `String#charCodeAt(…)` and `String.fromCodePoint(…)` over `String.fromCharCode(…)`. | ✅ | | 💡 |
216
114
  | [prefer-date-now](docs/rules/prefer-date-now.md) | Prefer `Date.now()` to get the number of milliseconds since the Unix Epoch. | ✅ | 🔧 | |
217
115
  | [prefer-default-parameters](docs/rules/prefer-default-parameters.md) | Prefer default parameters over reassignment. | ✅ | 🔧 | 💡 |
218
116
  | [prefer-dom-node-append](docs/rules/prefer-dom-node-append.md) | Prefer `Node#append()` over `Node#appendChild()`. | ✅ | 🔧 | |
219
- | [prefer-dom-node-dataset](docs/rules/prefer-dom-node-dataset.md) | Prefer using `.dataset` on DOM elements over `.setAttribute(…)`. | ✅ | 🔧 | |
117
+ | [prefer-dom-node-dataset](docs/rules/prefer-dom-node-dataset.md) | Prefer using `.dataset` on DOM elements over calling attribute methods. | ✅ | 🔧 | |
220
118
  | [prefer-dom-node-remove](docs/rules/prefer-dom-node-remove.md) | Prefer `childNode.remove()` over `parentNode.removeChild(childNode)`. | ✅ | 🔧 | 💡 |
221
119
  | [prefer-dom-node-text-content](docs/rules/prefer-dom-node-text-content.md) | Prefer `.textContent` over `.innerText`. | ✅ | | 💡 |
222
- | [prefer-export-from](docs/rules/prefer-export-from.md) | Prefer `export…from` when re-exporting. | ✅ | 🔧 | |
120
+ | [prefer-export-from](docs/rules/prefer-export-from.md) | Prefer `export…from` when re-exporting. | ✅ | 🔧 | 💡 |
223
121
  | [prefer-includes](docs/rules/prefer-includes.md) | Prefer `.includes()` over `.indexOf()` and `Array#some()` when checking for existence or non-existence. | ✅ | 🔧 | 💡 |
122
+ | [prefer-json-parse-buffer](docs/rules/prefer-json-parse-buffer.md) | Prefer reading a JSON file as a buffer. | ✅ | 🔧 | |
224
123
  | [prefer-keyboard-event-key](docs/rules/prefer-keyboard-event-key.md) | Prefer `KeyboardEvent#key` over `KeyboardEvent#keyCode`. | ✅ | 🔧 | |
225
124
  | [prefer-math-trunc](docs/rules/prefer-math-trunc.md) | Enforce the use of `Math.trunc` instead of bitwise operators. | ✅ | 🔧 | 💡 |
226
125
  | [prefer-modern-dom-apis](docs/rules/prefer-modern-dom-apis.md) | Prefer `.before()` over `.insertBefore()`, `.replaceWith()` over `.replaceChild()`, prefer one of `.before()`, `.after()`, `.append()` or `.prepend()` over `insertAdjacentText()` and `insertAdjacentElement()`. | ✅ | 🔧 | |
@@ -229,7 +128,6 @@ Each rule has emojis denoting:
229
128
  | [prefer-node-protocol](docs/rules/prefer-node-protocol.md) | Prefer using the `node:` protocol when importing Node.js builtin modules. | ✅ | 🔧 | |
230
129
  | [prefer-number-properties](docs/rules/prefer-number-properties.md) | Prefer `Number` static properties over global ones. | ✅ | 🔧 | 💡 |
231
130
  | [prefer-object-from-entries](docs/rules/prefer-object-from-entries.md) | Prefer using `Object.fromEntries(…)` to transform a list of key-value pairs into an object. | ✅ | 🔧 | |
232
- | [prefer-object-has-own](docs/rules/prefer-object-has-own.md) | Prefer `Object.hasOwn(…)` over `Object.prototype.hasOwnProperty.call(…)`. | | 🔧 | |
233
131
  | [prefer-optional-catch-binding](docs/rules/prefer-optional-catch-binding.md) | Prefer omitting the `catch` binding parameter. | ✅ | 🔧 | |
234
132
  | [prefer-prototype-methods](docs/rules/prefer-prototype-methods.md) | Prefer borrowing methods from the prototype instead of the instance. | ✅ | 🔧 | |
235
133
  | [prefer-query-selector](docs/rules/prefer-query-selector.md) | Prefer `.querySelector()` over `.getElementById()`, `.querySelectorAll()` over `.getElementsByClassName()` and `.getElementsByTagName()`. | ✅ | 🔧 | |
@@ -246,24 +144,29 @@ Each rule has emojis denoting:
246
144
  | [prefer-top-level-await](docs/rules/prefer-top-level-await.md) | Prefer top-level await over top-level promises and async function calls. | | | 💡 |
247
145
  | [prefer-type-error](docs/rules/prefer-type-error.md) | Enforce throwing `TypeError` in type checking conditions. | ✅ | 🔧 | |
248
146
  | [prevent-abbreviations](docs/rules/prevent-abbreviations.md) | Prevent abbreviations. | ✅ | 🔧 | |
147
+ | [relative-url-style](docs/rules/relative-url-style.md) | Enforce consistent relative URL style. | ✅ | 🔧 | |
249
148
  | [require-array-join-separator](docs/rules/require-array-join-separator.md) | Enforce using the separator argument with `Array#join()`. | ✅ | 🔧 | |
250
149
  | [require-number-to-fixed-digits-argument](docs/rules/require-number-to-fixed-digits-argument.md) | Enforce using the digits argument with `Number#toFixed()`. | ✅ | 🔧 | |
251
- | [require-post-message-target-origin](docs/rules/require-post-message-target-origin.md) | Enforce using the `targetOrigin` argument with `window.postMessage()`. || | 💡 |
150
+ | [require-post-message-target-origin](docs/rules/require-post-message-target-origin.md) | Enforce using the `targetOrigin` argument with `window.postMessage()`. | | | 💡 |
252
151
  | [string-content](docs/rules/string-content.md) | Enforce better string content. | | 🔧 | 💡 |
253
- | [template-indent](docs/rules/template-indent.md) | Fix whitespace-insensitive template indentation. | | 🔧 | |
152
+ | [template-indent](docs/rules/template-indent.md) | Fix whitespace-insensitive template indentation. || 🔧 | |
153
+ | [text-encoding-identifier-case](docs/rules/text-encoding-identifier-case.md) | Enforce consistent case for text encoding identifiers. | ✅ | | 💡 |
254
154
  | [throw-new-error](docs/rules/throw-new-error.md) | Require `new` when throwing an error. | ✅ | 🔧 | |
155
+ <!-- /RULES_TABLE -->
255
156
 
256
- <!-- RULES_TABLE_END -->
257
-
258
- ## Deprecated Rules
157
+ ### Deprecated Rules
259
158
 
260
159
  See [docs/deprecated-rules.md](docs/deprecated-rules.md)
261
160
 
262
- ## Recommended config
161
+ ## Preset configs
263
162
 
264
- This plugin exports a [`recommended` config](configs/recommended.js) that enforces good practices.
163
+ See the [ESLint docs](https://eslint.org/docs/user-guide/configuring/configuration-files#extending-configuration-files) for more information about extending config files.
265
164
 
266
- Enable it in your `package.json` with the `extends` option:
165
+ **Note**: Preset configs will also enable the correct [parser options](https://eslint.org/docs/user-guide/configuring/language-options#specifying-parser-options) and [environment](https://eslint.org/docs/user-guide/configuring/language-options#specifying-environments).
166
+
167
+ ### Recommended config
168
+
169
+ This plugin exports a [`recommended` config](configs/recommended.js) that enforces good practices.
267
170
 
268
171
  ```json
269
172
  {
@@ -274,16 +177,10 @@ Enable it in your `package.json` with the `extends` option:
274
177
  }
275
178
  ```
276
179
 
277
- See the [ESLint docs](https://eslint.org/docs/user-guide/configuring/configuration-files#extending-configuration-files) for more information about extending config files.
278
-
279
- **Note**: This config will also enable the correct [parser options](https://eslint.org/docs/user-guide/configuring/language-options#specifying-parser-options) and [environment](https://eslint.org/docs/user-guide/configuring/language-options#specifying-environments).
280
-
281
- ## All config
180
+ ### All config
282
181
 
283
182
  This plugin exports an [`all` config](configs/all.js) that makes use of all rules (except for deprecated ones).
284
183
 
285
- Enable it in your `package.json` with the `extends` option:
286
-
287
184
  ```json
288
185
  {
289
186
  "name": "my-awesome-project",
@@ -293,16 +190,15 @@ Enable it in your `package.json` with the `extends` option:
293
190
  }
294
191
  ```
295
192
 
296
- See the [ESLint docs](https://eslint.org/docs/user-guide/configuring/configuration-files#extending-configuration-files) for more information about extending config files.
297
-
298
193
  ## Maintainers
299
194
 
300
195
  - [Sindre Sorhus](https://github.com/sindresorhus)
301
- - [Adam Babcock](https://github.com/MrHen)
302
- - [futpib](https://github.com/futpib)
303
196
  - [Fisker Cheung](https://github.com/fisker)
197
+ - [Bryan Mishkin](https://github.com/bmish)
198
+ - [futpib](https://github.com/futpib)
304
199
 
305
- ###### Former
200
+ ### Former
306
201
 
307
202
  - [Jeroen Engels](https://github.com/jfmengels)
308
203
  - [Sam Verschueren](https://github.com/SamVerschueren)
204
+ - [Adam Babcock](https://github.com/MrHen)
@@ -14,6 +14,7 @@ const newRegExp = [
14
14
  '[arguments.0.type="Literal"]',
15
15
  ].join('');
16
16
 
17
+ /** @param {import('eslint').Rule.RuleContext} context */
17
18
  const create = context => {
18
19
  const {sortCharacterClasses} = context.options[0] || {};
19
20
 
@@ -101,6 +102,7 @@ const create = context => {
101
102
  const schema = [
102
103
  {
103
104
  type: 'object',
105
+ additionalProperties: false,
104
106
  properties: {
105
107
  sortCharacterClasses: {
106
108
  type: 'boolean',
@@ -110,6 +112,7 @@ const schema = [
110
112
  },
111
113
  ];
112
114
 
115
+ /** @type {import('eslint').Rule.RuleModule} */
113
116
  module.exports = {
114
117
  create,
115
118
  meta: {
@@ -32,6 +32,7 @@ const selector = matches([
32
32
  ].join(''),
33
33
  ]);
34
34
 
35
+ /** @param {import('eslint').Rule.RuleContext} context */
35
36
  const create = context => {
36
37
  const options = {
37
38
  name: 'error',
@@ -64,7 +65,7 @@ const create = context => {
64
65
 
65
66
  // This was reported https://github.com/sindresorhus/eslint-plugin-unicorn/issues/1075#issuecomment-768072967
66
67
  // But can't reproduce, just ignore this case
67
- /* istanbul ignore next */
68
+ /* c8 ignore next 3 */
68
69
  if (!variable) {
69
70
  return;
70
71
  }
@@ -100,6 +101,7 @@ const create = context => {
100
101
  const schema = [
101
102
  {
102
103
  type: 'object',
104
+ additionalProperties: false,
103
105
  properties: {
104
106
  name: {
105
107
  type: 'string',
@@ -112,6 +114,7 @@ const schema = [
112
114
  },
113
115
  ];
114
116
 
117
+ /** @type {import('eslint').Rule.RuleModule} */
115
118
  module.exports = {
116
119
  create,
117
120
  meta: {