eslint-plugin-unicorn 59.0.1 → 61.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 (154) hide show
  1. package/index.d.ts +1 -0
  2. package/index.js +13 -2
  3. package/package.json +38 -39
  4. package/readme.md +141 -132
  5. package/rules/ast/call-or-new-expression.js +1 -0
  6. package/rules/ast/index.js +1 -1
  7. package/rules/ast/is-member-expression.js +1 -0
  8. package/rules/ast/is-negative-one.js +2 -2
  9. package/rules/ast/literal.js +1 -1
  10. package/rules/catch-error-name.js +2 -4
  11. package/rules/consistent-date-clone.js +1 -1
  12. package/rules/consistent-destructuring.js +0 -1
  13. package/rules/consistent-existence-index-check.js +3 -3
  14. package/rules/custom-error-definition.js +1 -1
  15. package/rules/error-message.js +17 -13
  16. package/rules/escape-case.js +1 -1
  17. package/rules/expiring-todo-comments.js +2 -1
  18. package/rules/explicit-length-check.js +2 -2
  19. package/rules/filename-case.js +3 -28
  20. package/rules/fix/index.js +5 -1
  21. package/rules/fix/remove-method-call.js +1 -1
  22. package/rules/fix/remove-object-property.js +21 -0
  23. package/rules/fix/replace-member-expression-property.js +9 -0
  24. package/rules/fix/replace-node-or-token-and-spaces-before.js +1 -0
  25. package/rules/import-style.js +7 -5
  26. package/rules/index.js +138 -266
  27. package/rules/new-for-builtins.js +1 -1
  28. package/rules/no-abusive-eslint-disable.js +1 -1
  29. package/rules/no-accessor-recursion.js +1 -1
  30. package/rules/no-anonymous-default-export.js +3 -3
  31. package/rules/no-array-callback-reference.js +0 -1
  32. package/rules/no-array-for-each.js +1 -1
  33. package/rules/no-array-method-this-argument.js +1 -2
  34. package/rules/no-array-reduce.js +0 -1
  35. package/rules/no-array-reverse.js +6 -0
  36. package/rules/no-array-sort.js +6 -0
  37. package/rules/no-await-in-promise-methods.js +1 -1
  38. package/rules/no-console-spaces.js +1 -1
  39. package/rules/no-document-cookie.js +1 -1
  40. package/rules/no-empty-file.js +1 -1
  41. package/rules/no-hex-escape.js +1 -1
  42. package/rules/no-instanceof-builtins.js +17 -25
  43. package/rules/no-invalid-fetch-options.js +1 -1
  44. package/rules/no-invalid-remove-event-listener.js +1 -2
  45. package/rules/no-lonely-if.js +1 -1
  46. package/rules/no-magic-array-flat-depth.js +3 -3
  47. package/rules/no-named-default.js +1 -1
  48. package/rules/no-negated-condition.js +1 -1
  49. package/rules/no-negation-in-equality-check.js +1 -1
  50. package/rules/no-nested-ternary.js +2 -2
  51. package/rules/no-new-array.js +1 -1
  52. package/rules/no-new-buffer.js +1 -1
  53. package/rules/no-null.js +0 -1
  54. package/rules/no-object-as-default-parameter.js +1 -1
  55. package/rules/no-process-exit.js +1 -1
  56. package/rules/no-single-promise-in-promise-methods.js +1 -1
  57. package/rules/no-static-only-class.js +1 -1
  58. package/rules/no-thenable.js +1 -1
  59. package/rules/no-this-assignment.js +1 -1
  60. package/rules/no-typeof-undefined.js +3 -3
  61. package/rules/no-unnecessary-array-flat-depth.js +1 -2
  62. package/rules/no-unnecessary-array-splice-count.js +1 -1
  63. package/rules/no-unnecessary-await.js +6 -2
  64. package/rules/no-unnecessary-polyfills.js +2 -2
  65. package/rules/no-unnecessary-slice-end.js +1 -1
  66. package/rules/no-unreadable-array-destructuring.js +1 -1
  67. package/rules/no-unreadable-iife.js +1 -1
  68. package/rules/no-useless-error-capture-stack-trace.js +146 -0
  69. package/rules/no-useless-fallback-in-spread.js +1 -1
  70. package/rules/no-useless-length-check.js +1 -1
  71. package/rules/no-useless-promise-resolve-reject.js +1 -1
  72. package/rules/no-useless-spread.js +1 -1
  73. package/rules/no-useless-switch-case.js +1 -1
  74. package/rules/no-useless-undefined.js +1 -1
  75. package/rules/no-zero-fractions.js +3 -3
  76. package/rules/number-literal-case.js +3 -3
  77. package/rules/numeric-separators-style.js +1 -1
  78. package/rules/prefer-add-event-listener.js +1 -1
  79. package/rules/prefer-array-find.js +12 -6
  80. package/rules/prefer-array-flat-map.js +1 -2
  81. package/rules/prefer-array-flat.js +10 -7
  82. package/rules/prefer-array-index-of.js +1 -1
  83. package/rules/prefer-array-some.js +1 -1
  84. package/rules/prefer-at.js +26 -29
  85. package/rules/prefer-bigint-literals.js +129 -0
  86. package/rules/prefer-blob-reading-methods.js +1 -1
  87. package/rules/prefer-class-fields.js +158 -0
  88. package/rules/prefer-classlist-toggle.js +223 -0
  89. package/rules/prefer-code-point.js +1 -2
  90. package/rules/prefer-date-now.js +1 -1
  91. package/rules/prefer-default-parameters.js +1 -2
  92. package/rules/prefer-dom-node-append.js +1 -1
  93. package/rules/prefer-dom-node-dataset.js +8 -3
  94. package/rules/prefer-dom-node-remove.js +1 -1
  95. package/rules/prefer-dom-node-text-content.js +1 -1
  96. package/rules/prefer-event-target.js +1 -1
  97. package/rules/prefer-global-this.js +1 -1
  98. package/rules/prefer-includes.js +7 -4
  99. package/rules/prefer-keyboard-event-key.js +3 -3
  100. package/rules/prefer-logical-operator-over-ternary.js +1 -1
  101. package/rules/prefer-math-min-max.js +2 -1
  102. package/rules/prefer-math-trunc.js +1 -1
  103. package/rules/prefer-modern-dom-apis.js +4 -2
  104. package/rules/prefer-modern-math-apis.js +1 -1
  105. package/rules/prefer-module.js +11 -13
  106. package/rules/prefer-native-coercion-functions.js +1 -1
  107. package/rules/prefer-negative-index.js +1 -1
  108. package/rules/prefer-node-protocol.js +1 -1
  109. package/rules/prefer-number-properties.js +1 -1
  110. package/rules/prefer-object-from-entries.js +1 -1
  111. package/rules/prefer-optional-catch-binding.js +1 -1
  112. package/rules/prefer-prototype-methods.js +1 -1
  113. package/rules/prefer-reflect-apply.js +1 -1
  114. package/rules/prefer-regexp-test.js +1 -1
  115. package/rules/prefer-set-has.js +9 -16
  116. package/rules/prefer-set-size.js +1 -1
  117. package/rules/prefer-single-call.js +1 -1
  118. package/rules/prefer-string-raw.js +5 -19
  119. package/rules/prefer-string-replace-all.js +38 -6
  120. package/rules/prefer-string-slice.js +5 -5
  121. package/rules/prefer-string-starts-ends-with.js +1 -1
  122. package/rules/prefer-string-trim-start-end.js +1 -1
  123. package/rules/prefer-structured-clone.js +1 -1
  124. package/rules/prefer-switch.js +2 -2
  125. package/rules/prefer-ternary.js +2 -1
  126. package/rules/prefer-top-level-await.js +1 -1
  127. package/rules/prefer-type-error.js +22 -6
  128. package/rules/prevent-abbreviations.js +8 -4
  129. package/rules/relative-url-style.js +1 -1
  130. package/rules/require-array-join-separator.js +1 -1
  131. package/rules/require-module-attributes.js +120 -0
  132. package/rules/require-module-specifiers.js +158 -0
  133. package/rules/require-number-to-fixed-digits-argument.js +1 -2
  134. package/rules/require-post-message-target-origin.js +0 -1
  135. package/rules/shared/builtin-errors.js +1 -1
  136. package/rules/shared/negative-index.js +2 -2
  137. package/rules/shared/no-array-mutate-rule.js +140 -0
  138. package/rules/shared/simple-array-search-rule.js +0 -1
  139. package/rules/template-indent.js +1 -1
  140. package/rules/text-encoding-identifier-case.js +8 -9
  141. package/rules/throw-new-error.js +1 -1
  142. package/rules/utils/get-token-store.js +24 -0
  143. package/rules/utils/global-reference-tracker.js +1 -1
  144. package/rules/utils/index.js +5 -1
  145. package/rules/utils/is-number.js +3 -2
  146. package/rules/utils/is-unresolved-variable.js +14 -0
  147. package/rules/utils/needs-semicolon.js +1 -0
  148. package/rules/utils/numeric.js +4 -4
  149. package/rules/utils/rule.js +20 -18
  150. package/rules/utils/should-add-parentheses-to-unary-expression.js +24 -0
  151. package/rules/utils/string-cases.js +2 -0
  152. package/rules/fix/remove-member-expression-property.js +0 -7
  153. package/rules/utils/is-shadowed.js +0 -31
  154. package/rules/utils/lodash.js +0 -1567
package/index.d.ts CHANGED
@@ -3,6 +3,7 @@ import type {ESLint, Linter} from 'eslint';
3
3
  declare const eslintPluginUnicorn: ESLint.Plugin & {
4
4
  configs: {
5
5
  recommended: Linter.FlatConfig;
6
+ unopinionated: Linter.FlatConfig;
6
7
  all: Linter.FlatConfig;
7
8
 
8
9
  /** @deprecated Use `all` instead. The `flat/` prefix is no longer needed. */
package/index.js CHANGED
@@ -1,8 +1,11 @@
1
1
  import createDeprecatedRules from './rules/utils/create-deprecated-rules.js';
2
2
  import flatConfigBase from './configs/flat-config-base.js';
3
- import rules from './rules/index.js';
3
+ import * as rawRules from './rules/index.js';
4
+ import {createRules} from './rules/utils/rule.js';
4
5
  import packageJson from './package.json' with {type: 'json'};
5
6
 
7
+ const rules = createRules(rawRules);
8
+
6
9
  const deprecatedRules = createDeprecatedRules({
7
10
  // {ruleId: {message: string, replacedBy: string[]}}
8
11
  'no-instanceof-array': {
@@ -33,6 +36,13 @@ const recommendedRules = Object.fromEntries(
33
36
  ]),
34
37
  );
35
38
 
39
+ const unopinionatedRules = Object.fromEntries(
40
+ Object.entries(rules).map(([id, rule]) => [
41
+ `unicorn/${id}`,
42
+ rule.meta.docs.recommended === 'unopinionated' ? 'error' : 'off',
43
+ ]),
44
+ );
45
+
36
46
  const allRules = Object.fromEntries(
37
47
  Object.keys(rules).map(id => [
38
48
  `unicorn/${id}`,
@@ -58,13 +68,14 @@ const unicorn = {
58
68
  version: packageJson.version,
59
69
  },
60
70
  rules: {
61
- ...rules,
71
+ ...createRules(rules),
62
72
  ...deprecatedRules,
63
73
  },
64
74
  };
65
75
 
66
76
  const configs = {
67
77
  recommended: createConfig(recommendedRules, 'unicorn/recommended'),
78
+ unopinionated: createConfig(unopinionatedRules, 'unicorn/unopinionated'),
68
79
  all: createConfig(allRules, 'unicorn/all'),
69
80
 
70
81
  // TODO: Remove this at some point. Kept for now to avoid breaking users.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "eslint-plugin-unicorn",
3
- "version": "59.0.1",
3
+ "version": "61.0.0",
4
4
  "description": "More than 100 powerful ESLint rules",
5
5
  "license": "MIT",
6
6
  "repository": "sindresorhus/eslint-plugin-unicorn",
@@ -17,19 +17,18 @@
17
17
  },
18
18
  "sideEffects": false,
19
19
  "engines": {
20
- "node": "^18.20.0 || ^20.10.0 || >=21.0.0"
20
+ "node": "^20.10.0 || >=21.0.0"
21
21
  },
22
22
  "scripts": {
23
- "bundle-lodash": "echo export {defaultsDeep, camelCase, kebabCase, snakeCase, upperFirst, lowerFirst} from 'lodash-es'; | npx esbuild --bundle --outfile=rules/utils/lodash.js --format=esm",
24
23
  "create-rule": "node ./scripts/create-rule.js && npm run create-rules-index-file && npm run fix:eslint-docs",
25
24
  "create-rules-index-file": "node ./scripts/create-rules-index-file.js",
26
- "fix": "run-p --continue-on-error fix:*",
27
- "fix:eslint-docs": "eslint-doc-generator workaround-for-eslint-doc-generator",
25
+ "fix": "run-p --continue-on-error \"fix:*\"",
26
+ "fix:eslint-docs": "eslint-doc-generator",
28
27
  "fix:js": "npm run lint:js -- --fix",
29
28
  "fix:markdown": "npm run lint:markdown -- --fix",
30
29
  "fix:snapshots": "ava --update-snapshots",
31
30
  "integration": "node ./test/integration/test.js",
32
- "lint": "run-p --continue-on-error lint:*",
31
+ "lint": "run-p --continue-on-error \"lint:*\"",
33
32
  "lint:eslint-docs": "npm run fix:eslint-docs -- --check",
34
33
  "lint:js": "eslint",
35
34
  "lint:markdown": "markdownlint \"**/*.md\"",
@@ -37,7 +36,7 @@
37
36
  "rename-rule": "node ./scripts/rename-rule.js && npm run create-rules-index-file && npm run fix:eslint-docs",
38
37
  "run-rules-on-codebase": "eslint --config=./eslint.dogfooding.config.js",
39
38
  "smoke": "eslint-remote-tester --config ./test/smoke/eslint-remote-tester.config.js",
40
- "test": "npm-run-all --continue-on-error lint test:*",
39
+ "test": "npm-run-all --continue-on-error lint \"test:*\"",
41
40
  "test:js": "c8 ava"
42
41
  },
43
42
  "files": [
@@ -57,60 +56,60 @@
57
56
  "xo"
58
57
  ],
59
58
  "dependencies": {
60
- "@babel/helper-validator-identifier": "^7.25.9",
61
- "@eslint-community/eslint-utils": "^4.5.1",
62
- "@eslint/plugin-kit": "^0.2.7",
63
- "ci-info": "^4.2.0",
59
+ "@babel/helper-validator-identifier": "^7.27.1",
60
+ "@eslint-community/eslint-utils": "^4.7.0",
61
+ "@eslint/plugin-kit": "^0.3.3",
62
+ "change-case": "^5.4.4",
63
+ "ci-info": "^4.3.0",
64
64
  "clean-regexp": "^1.0.0",
65
- "core-js-compat": "^3.41.0",
65
+ "core-js-compat": "^3.44.0",
66
66
  "esquery": "^1.6.0",
67
67
  "find-up-simple": "^1.0.1",
68
- "globals": "^16.0.0",
68
+ "globals": "^16.3.0",
69
69
  "indent-string": "^5.0.0",
70
70
  "is-builtin-module": "^5.0.0",
71
71
  "jsesc": "^3.1.0",
72
72
  "pluralize": "^8.0.0",
73
73
  "regexp-tree": "^0.1.27",
74
74
  "regjsparser": "^0.12.0",
75
- "semver": "^7.7.1",
75
+ "semver": "^7.7.2",
76
76
  "strip-indent": "^4.0.0"
77
77
  },
78
78
  "devDependencies": {
79
- "@babel/code-frame": "^7.26.2",
80
- "@babel/core": "^7.26.10",
81
- "@babel/eslint-parser": "^7.26.10",
82
- "@eslint/eslintrc": "^3.3.0",
79
+ "@babel/code-frame": "^7.27.1",
80
+ "@babel/core": "^7.28.0",
81
+ "@babel/eslint-parser": "^7.28.0",
82
+ "@eslint/eslintrc": "^3.3.1",
83
83
  "@lubien/fixture-beta-package": "^1.0.0-beta.1",
84
- "@typescript-eslint/parser": "^8.26.1",
85
- "ava": "^6.2.0",
84
+ "@typescript-eslint/parser": "^8.37.0",
85
+ "ava": "^6.4.1",
86
86
  "c8": "^10.1.3",
87
87
  "enquirer": "^2.4.1",
88
- "eslint": "^9.22.0",
88
+ "eslint": "^9.29.0",
89
89
  "eslint-ava-rule-tester": "^5.0.1",
90
- "eslint-config-xo": "^0.46.0",
91
- "eslint-doc-generator": "^2.1.2",
92
- "eslint-plugin-eslint-plugin": "^6.4.0",
93
- "eslint-plugin-jsdoc": "^50.6.8",
94
- "eslint-remote-tester": "^4.0.1",
95
- "eslint-remote-tester-repositories": "^2.0.1",
96
- "espree": "^10.3.0",
97
- "listr2": "^8.2.5",
90
+ "eslint-config-xo": "^0.47.0",
91
+ "eslint-doc-generator": "^2.2.2",
92
+ "eslint-plugin-eslint-plugin": "^6.5.0",
93
+ "eslint-plugin-jsdoc": "^51.4.1",
94
+ "eslint-remote-tester": "^4.0.2",
95
+ "eslint-remote-tester-repositories": "^2.0.2",
96
+ "espree": "^10.4.0",
97
+ "listr2": "^9.0.1",
98
98
  "lodash-es": "^4.17.21",
99
- "markdownlint-cli": "^0.44.0",
100
- "memoize": "^10.1.0",
101
- "nano-spawn": "^0.2.0",
102
- "node-style-text": "^0.0.7",
103
- "npm-package-json-lint": "^8.0.0",
104
- "npm-run-all2": "^7.0.2",
99
+ "markdownlint-cli": "^0.45.0",
100
+ "nano-spawn": "^1.0.2",
101
+ "node-style-text": "^1.0.0",
102
+ "npm-package-json-lint": "^9.0.0",
103
+ "npm-run-all2": "^8.0.4",
105
104
  "open-editor": "^5.1.0",
106
105
  "outdent": "^0.8.0",
107
106
  "pretty-ms": "^9.2.0",
108
- "typescript": "^5.8.2",
109
- "vue-eslint-parser": "^10.1.1",
110
- "yaml": "^2.7.0"
107
+ "typescript": "^5.8.3",
108
+ "vue-eslint-parser": "^10.2.0",
109
+ "yaml": "^2.8.0"
111
110
  },
112
111
  "peerDependencies": {
113
- "eslint": ">=9.22.0"
112
+ "eslint": ">=9.29.0"
114
113
  },
115
114
  "ava": {
116
115
  "files": [