eslint-plugin-unicorn 63.0.0 → 65.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 (146) hide show
  1. package/index.js +26 -18
  2. package/package.json +32 -30
  3. package/readme.md +183 -147
  4. package/rules/ast/call-or-new-expression.js +3 -5
  5. package/rules/ast/literal.js +1 -6
  6. package/rules/better-dom-traversing.js +291 -0
  7. package/rules/catch-error-name.js +3 -3
  8. package/rules/consistent-compound-words.js +452 -0
  9. package/rules/consistent-destructuring.js +234 -22
  10. package/rules/consistent-function-scoping.js +35 -11
  11. package/rules/consistent-json-file-read.js +245 -0
  12. package/rules/consistent-template-literal-escape.js +52 -0
  13. package/rules/custom-error-definition.js +176 -71
  14. package/rules/dom-node-dataset.js +431 -0
  15. package/rules/escape-case.js +2 -1
  16. package/rules/expiring-todo-comments.js +56 -102
  17. package/rules/explicit-length-check.js +145 -33
  18. package/rules/filename-case.js +97 -13
  19. package/rules/fix/append-argument.js +1 -1
  20. package/rules/fix/remove-expression-statement.js +1 -0
  21. package/rules/import-style.js +30 -10
  22. package/rules/index.js +37 -3
  23. package/rules/isolated-functions.js +11 -5
  24. package/rules/no-accessor-recursion.js +1 -2
  25. package/rules/no-anonymous-default-export.js +9 -11
  26. package/rules/no-array-callback-reference.js +148 -22
  27. package/rules/no-array-fill-with-reference-type.js +127 -0
  28. package/rules/no-array-for-each.js +18 -3
  29. package/rules/no-array-from-fill.js +76 -0
  30. package/rules/no-array-method-this-argument.js +1 -1
  31. package/rules/no-array-reduce.js +509 -2
  32. package/rules/no-blob-to-file.js +299 -0
  33. package/rules/no-canvas-to-image.js +152 -0
  34. package/rules/no-confusing-array-splice.js +164 -0
  35. package/rules/no-duplicate-set-values.js +57 -0
  36. package/rules/no-empty-file.js +31 -2
  37. package/rules/no-exports-in-scripts.js +34 -0
  38. package/rules/no-for-loop.js +1 -5
  39. package/rules/no-hex-escape.js +1 -1
  40. package/rules/no-incorrect-query-selector.js +347 -0
  41. package/rules/no-instanceof-builtins.js +4 -6
  42. package/rules/no-invalid-fetch-options.js +1 -1
  43. package/rules/no-invalid-file-input-accept.js +475 -0
  44. package/rules/no-keyword-prefix.js +23 -5
  45. package/rules/no-late-current-target-access.js +166 -0
  46. package/rules/no-lonely-if.js +152 -52
  47. package/rules/no-manually-wrapped-comments.js +151 -0
  48. package/rules/no-null.js +16 -5
  49. package/rules/no-process-exit.js +1 -1
  50. package/rules/no-this-outside-of-class.js +75 -0
  51. package/rules/no-typeof-undefined.js +7 -4
  52. package/rules/no-unnecessary-nested-ternary.js +132 -0
  53. package/rules/no-unnecessary-polyfills.js +253 -24
  54. package/rules/no-unreadable-iife.js +33 -3
  55. package/rules/no-unused-array-method-return.js +301 -0
  56. package/rules/no-unused-properties.js +13 -19
  57. package/rules/no-useless-iterator-to-array.js +249 -0
  58. package/rules/no-useless-length-check.js +5 -11
  59. package/rules/no-useless-promise-resolve-reject.js +5 -5
  60. package/rules/no-useless-spread.js +53 -4
  61. package/rules/no-useless-undefined.js +62 -46
  62. package/rules/numeric-separators-style.js +17 -6
  63. package/rules/prefer-add-event-listener.js +1 -0
  64. package/rules/prefer-array-find.js +1 -0
  65. package/rules/prefer-array-flat.js +76 -8
  66. package/rules/prefer-array-last-methods.js +93 -0
  67. package/rules/prefer-array-some.js +74 -8
  68. package/rules/prefer-at.js +118 -57
  69. package/rules/prefer-class-fields.js +2 -4
  70. package/rules/prefer-default-parameters.js +1 -2
  71. package/rules/prefer-dom-node-append.js +2 -2
  72. package/rules/prefer-dom-node-remove.js +24 -18
  73. package/rules/prefer-export-from.js +8 -7
  74. package/rules/prefer-get-or-insert-computed.js +159 -0
  75. package/rules/prefer-global-this.js +33 -29
  76. package/rules/prefer-https.js +83 -0
  77. package/rules/prefer-includes-over-repeated-comparisons.js +199 -0
  78. package/rules/prefer-iterator-concat.js +174 -0
  79. package/rules/prefer-iterator-to-array-at-end.js +123 -0
  80. package/rules/prefer-keyboard-event-key.js +202 -76
  81. package/rules/prefer-logical-operator-over-ternary.js +1 -1
  82. package/rules/prefer-math-abs.js +397 -0
  83. package/rules/prefer-math-min-max.js +54 -26
  84. package/rules/prefer-module.js +5 -7
  85. package/rules/prefer-native-coercion-functions.js +8 -1
  86. package/rules/prefer-node-protocol.js +7 -4
  87. package/rules/prefer-number-properties.js +2 -0
  88. package/rules/prefer-object-from-entries.js +12 -7
  89. package/rules/prefer-prototype-methods.js +1 -3
  90. package/rules/prefer-query-selector.js +119 -7
  91. package/rules/prefer-queue-microtask.js +204 -0
  92. package/rules/prefer-regexp-test.js +166 -20
  93. package/rules/prefer-set-has.js +474 -47
  94. package/rules/prefer-simple-condition-first.js +282 -0
  95. package/rules/prefer-single-call.js +129 -38
  96. package/rules/prefer-split-limit.js +107 -0
  97. package/rules/prefer-spread.js +150 -19
  98. package/rules/prefer-string-match-all.js +352 -0
  99. package/rules/prefer-string-pad-start-end.js +380 -0
  100. package/rules/prefer-string-raw.js +90 -19
  101. package/rules/prefer-string-repeat.js +173 -0
  102. package/rules/prefer-string-replace-all.js +180 -12
  103. package/rules/prefer-string-slice.js +55 -4
  104. package/rules/prefer-string-starts-ends-with.js +2 -2
  105. package/rules/prefer-structured-clone.js +1 -0
  106. package/rules/prefer-switch.js +2 -0
  107. package/rules/prefer-ternary.js +3 -2
  108. package/rules/prefer-top-level-await.js +168 -6
  109. package/rules/prevent-abbreviations.js +144 -158
  110. package/rules/relative-url-style.js +1 -0
  111. package/rules/require-css-escape.js +141 -0
  112. package/rules/require-module-attributes.js +16 -18
  113. package/rules/require-module-specifiers.js +62 -0
  114. package/rules/require-passive-events.js +292 -0
  115. package/rules/rule/to-eslint-rule.js +1 -1
  116. package/rules/rule/to-eslint-rules.js +4 -6
  117. package/rules/shared/abbreviations.js +1 -0
  118. package/rules/shared/dom-events.js +7 -7
  119. package/rules/shared/identifier-checks.js +205 -0
  120. package/rules/shared/package-json.js +1 -1
  121. package/rules/string-content.js +35 -5
  122. package/rules/switch-case-braces.js +2 -3
  123. package/rules/switch-case-break-position.js +138 -0
  124. package/rules/template-indent.js +59 -3
  125. package/rules/text-encoding-identifier-case.js +23 -5
  126. package/rules/throw-new-error.js +4 -0
  127. package/rules/try-complexity.js +184 -0
  128. package/rules/utils/assert-token.js +3 -5
  129. package/rules/utils/boolean.js +37 -28
  130. package/rules/utils/create-deprecated-rules.js +25 -27
  131. package/rules/utils/get-call-expression-arguments-text.js +3 -5
  132. package/rules/utils/get-duplicate-array-elements.js +77 -0
  133. package/rules/utils/index.js +4 -1
  134. package/rules/utils/is-node-contains-lexical-this.js +65 -0
  135. package/rules/utils/is-number.js +2 -2
  136. package/rules/utils/is-same-reference.js +25 -17
  137. package/rules/utils/should-add-parentheses-to-await-expression-argument.js +9 -9
  138. package/rules/utils/should-add-parentheses-to-call-expression-callee.js +12 -10
  139. package/rules/utils/should-add-parentheses-to-conditional-expression-child.js +9 -5
  140. package/rules/utils/should-add-parentheses-to-expression-statement-expression.js +1 -1
  141. package/rules/utils/should-add-parentheses-to-logical-expression-child.js +12 -8
  142. package/rules/utils/should-add-parentheses-to-member-expression-object.js +1 -1
  143. package/rules/utils/should-add-parentheses-to-unary-expression.js +10 -10
  144. package/rules/better-regex.js +0 -145
  145. package/rules/prefer-dom-node-dataset.js +0 -135
  146. package/rules/prefer-json-parse-buffer.js +0 -161
package/index.js CHANGED
@@ -7,6 +7,10 @@ import packageJson from './package.json' with {type: 'json'};
7
7
  const rules = toEslintRules(rawRules);
8
8
 
9
9
  const deprecatedRules = createDeprecatedRules({
10
+ 'better-regex': {
11
+ message: 'Removed. Prefer `eslint-plugin-regexp`',
12
+ replacedBy: [],
13
+ },
10
14
  'no-instanceof-array': {
11
15
  message: 'Replaced by `unicorn/no-instanceof-builtins` which covers more cases.',
12
16
  replacedBy: ['unicorn/no-instanceof-builtins'],
@@ -19,6 +23,14 @@ const deprecatedRules = createDeprecatedRules({
19
23
  message: 'Replaced by `unicorn/prefer-single-call` which covers more cases.',
20
24
  replacedBy: ['unicorn/prefer-single-call'],
21
25
  },
26
+ 'prefer-json-parse-buffer': {
27
+ message: 'Renamed to `unicorn/consistent-json-file-read`.',
28
+ replacedBy: ['unicorn/consistent-json-file-read'],
29
+ },
30
+ 'prefer-dom-node-dataset': {
31
+ message: 'Renamed to `unicorn/dom-node-dataset`.',
32
+ replacedBy: ['unicorn/dom-node-dataset'],
33
+ },
22
34
  });
23
35
 
24
36
  const externalRules = {
@@ -28,26 +40,22 @@ const externalRules = {
28
40
  'no-nested-ternary': 'off',
29
41
  };
30
42
 
31
- const recommendedRules = Object.fromEntries(
32
- Object.entries(rules).map(([id, rule]) => [
33
- `unicorn/${id}`,
34
- rule.meta.docs.recommended ? 'error' : 'off',
35
- ]),
36
- );
43
+ const recommendedRules = Object.fromEntries(Object.entries(rules).map(([id, rule]) => [
44
+ `unicorn/${id}`,
45
+ rule.meta.docs.recommended ? 'error' : 'off',
46
+ ]));
47
+
48
+ const unopinionatedRules = Object.fromEntries(Object.entries(rules).map(([id, rule]) => [
49
+ `unicorn/${id}`,
50
+ rule.meta.docs.recommended === 'unopinionated' ? 'error' : 'off',
51
+ ]));
37
52
 
38
- const unopinionatedRules = Object.fromEntries(
39
- Object.entries(rules).map(([id, rule]) => [
40
- `unicorn/${id}`,
41
- rule.meta.docs.recommended === 'unopinionated' ? 'error' : 'off',
42
- ]),
43
- );
53
+ // TODO: Enable `prefer-iterator-concat` in the recommended and unopinionated configs when targeting Node.js 26.
44
54
 
45
- const allRules = Object.fromEntries(
46
- Object.keys(rules).map(id => [
47
- `unicorn/${id}`,
48
- 'error',
49
- ]),
50
- );
55
+ const allRules = Object.fromEntries(Object.keys(rules).map(id => [
56
+ `unicorn/${id}`,
57
+ 'error',
58
+ ]));
51
59
 
52
60
  const createConfig = (rules, flatConfigName) => ({
53
61
  ...flatConfigBase,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "eslint-plugin-unicorn",
3
- "version": "63.0.0",
3
+ "version": "65.0.0",
4
4
  "description": "More than 100 powerful ESLint rules",
5
5
  "license": "MIT",
6
6
  "repository": "sindresorhus/eslint-plugin-unicorn",
@@ -57,56 +57,58 @@
57
57
  ],
58
58
  "dependencies": {
59
59
  "@babel/helper-validator-identifier": "^7.28.5",
60
- "@eslint-community/eslint-utils": "^4.9.0",
60
+ "@eslint-community/eslint-utils": "^4.9.1",
61
61
  "change-case": "^5.4.4",
62
- "ci-info": "^4.3.1",
63
- "clean-regexp": "^1.0.0",
64
- "core-js-compat": "^3.46.0",
62
+ "ci-info": "^4.4.0",
63
+ "core-js-compat": "^3.49.0",
64
+ "detect-indent": "^7.0.2",
65
65
  "find-up-simple": "^1.0.1",
66
- "globals": "^16.4.0",
66
+ "globals": "^17.4.0",
67
67
  "indent-string": "^5.0.0",
68
68
  "is-builtin-module": "^5.0.0",
69
69
  "jsesc": "^3.1.0",
70
70
  "pluralize": "^8.0.0",
71
- "regexp-tree": "^0.1.27",
72
71
  "regjsparser": "^0.13.0",
73
- "semver": "^7.7.3",
72
+ "semver": "^7.7.4",
74
73
  "strip-indent": "^4.1.1"
75
74
  },
76
75
  "devDependencies": {
77
- "@babel/code-frame": "^7.27.1",
78
- "@babel/core": "^7.28.5",
79
- "@babel/eslint-parser": "^7.28.5",
80
- "@eslint/eslintrc": "^3.3.1",
76
+ "@babel/code-frame": "^7.28.3",
77
+ "@eslint/css": "^0.14.1",
78
+ "@eslint/eslintrc": "^3.3.5",
79
+ "@eslint/json": "^1.2.0",
80
+ "@eslint/markdown": "^8.0.2",
81
+ "@html-eslint/eslint-plugin": "^0.61.0",
82
+ "@html-eslint/parser": "^0.61.0",
81
83
  "@lubien/fixture-beta-package": "^1.0.0-beta.1",
82
- "@typescript-eslint/parser": "^8.53.1",
83
- "@typescript-eslint/types": "^8.53.1",
84
- "ava": "^6.4.1",
85
- "c8": "^10.1.3",
84
+ "@typescript-eslint/parser": "^8.57.2",
85
+ "@typescript-eslint/types": "^8.57.2",
86
+ "ava": "^7.0.0",
87
+ "c8": "^11.0.0",
86
88
  "enquirer": "^2.4.1",
87
- "eslint": "^10.0.0",
89
+ "eslint": "^10.1.0",
88
90
  "eslint-ava-rule-tester": "^5.0.1",
89
- "eslint-config-xo": "^0.49.0",
90
- "eslint-doc-generator": "^2.3.0",
91
- "eslint-plugin-eslint-plugin": "^7.1.0",
92
- "eslint-plugin-jsdoc": "^61.1.6",
93
- "eslint-plugin-unicorn": "^61.0.2",
94
- "eslint-remote-tester": "^4.0.3",
91
+ "eslint-config-xo": "^0.51.0",
92
+ "eslint-doc-generator": "^3.3.2",
93
+ "eslint-plugin-eslint-plugin": "^7.3.2",
94
+ "eslint-plugin-jsdoc": "^62.8.1",
95
+ "eslint-plugin-unicorn": "^63.0.0",
96
+ "eslint-remote-tester": "^4.0.4",
95
97
  "eslint-remote-tester-repositories": "^2.0.2",
96
- "eslint-scope": "^9.0.0",
97
- "espree": "^10.4.0",
98
- "listr2": "^9.0.5",
99
- "markdownlint-cli": "^0.45.0",
98
+ "eslint-scope": "^9.1.2",
99
+ "espree": "^11.2.0",
100
+ "listr2": "^10.2.1",
101
+ "markdownlint-cli": "^0.48.0",
100
102
  "nano-spawn": "^2.0.0",
101
103
  "node-style-text": "^2.1.2",
102
- "npm-package-json-lint": "^9.0.0",
104
+ "npm-package-json-lint": "^9.1.0",
103
105
  "npm-run-all2": "^8.0.4",
104
106
  "open-editor": "^6.0.0",
105
107
  "outdent": "^0.8.0",
106
108
  "pretty-ms": "^9.3.0",
107
109
  "typescript": "^5.9.3",
108
- "vue-eslint-parser": "^10.2.0",
109
- "yaml": "^2.8.1"
110
+ "vue-eslint-parser": "^10.4.0",
111
+ "yaml": "^2.8.3"
110
112
  },
111
113
  "peerDependencies": {
112
114
  "eslint": ">=9.38.0"