eslint-plugin-etc-misc 1.1.1 → 1.1.2

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 (52) hide show
  1. package/README.md +3 -0
  2. package/dist/configs/all-strict.d.ts +1 -0
  3. package/dist/configs/all-strict.d.ts.map +1 -1
  4. package/dist/configs/all-strict.js +1 -0
  5. package/dist/configs/all-strict.js.map +1 -1
  6. package/dist/configs/all.d.ts +1 -0
  7. package/dist/configs/all.d.ts.map +1 -1
  8. package/dist/configs/all.js +1 -0
  9. package/dist/configs/all.js.map +1 -1
  10. package/dist/configs/minimal.d.ts +3 -0
  11. package/dist/configs/minimal.d.ts.map +1 -1
  12. package/dist/configs/minimal.js +3 -0
  13. package/dist/configs/minimal.js.map +1 -1
  14. package/dist/configs/recommended.d.ts +3 -0
  15. package/dist/configs/recommended.d.ts.map +1 -1
  16. package/dist/configs/recommended.js +3 -0
  17. package/dist/configs/recommended.js.map +1 -1
  18. package/dist/configs/strict-type-checked.d.ts +1 -0
  19. package/dist/configs/strict-type-checked.d.ts.map +1 -1
  20. package/dist/configs/strict-type-checked.js +1 -0
  21. package/dist/configs/strict-type-checked.js.map +1 -1
  22. package/dist/configs/strict.d.ts +1 -0
  23. package/dist/configs/strict.d.ts.map +1 -1
  24. package/dist/configs/strict.js +1 -0
  25. package/dist/configs/strict.js.map +1 -1
  26. package/dist/configs.d.ts +8 -7
  27. package/dist/configs.d.ts.map +1 -1
  28. package/dist/configs.js +1 -0
  29. package/dist/configs.js.map +1 -1
  30. package/dist/plugin.cjs +967 -404
  31. package/dist/plugin.cjs.map +4 -4
  32. package/dist/rules/no-function-declare-after-return.d.ts +19 -0
  33. package/dist/rules/no-function-declare-after-return.d.ts.map +1 -0
  34. package/dist/rules/no-function-declare-after-return.js +119 -0
  35. package/dist/rules/no-function-declare-after-return.js.map +1 -0
  36. package/dist/rules/no-use-extend-native.d.ts +9 -0
  37. package/dist/rules/no-use-extend-native.d.ts.map +1 -0
  38. package/dist/rules/no-use-extend-native.js +296 -0
  39. package/dist/rules/no-use-extend-native.js.map +1 -0
  40. package/dist/rules/no-vulnerable.d.ts +15 -0
  41. package/dist/rules/no-vulnerable.d.ts.map +1 -0
  42. package/dist/rules/no-vulnerable.js +182 -0
  43. package/dist/rules/no-vulnerable.js.map +1 -0
  44. package/dist/rules.d.ts.map +1 -1
  45. package/dist/rules.js +8 -0
  46. package/dist/rules.js.map +1 -1
  47. package/docs/docusaurus/package.json +5 -5
  48. package/docs/docusaurus/src/pages/index.module.css +2 -1
  49. package/docs/rules/no-function-declare-after-return.md +143 -0
  50. package/docs/rules/no-use-extend-native.md +89 -0
  51. package/docs/rules/no-vulnerable.md +110 -0
  52. package/package.json +26 -45
@@ -0,0 +1,110 @@
1
+ # no-vulnerable
2
+
3
+ Disallow regular expressions that are potentially vulnerable to ReDoS (Regular Expression Denial of Service).
4
+
5
+ ## Rule details
6
+
7
+ This rule analyzes regular expression literals and statically-resolvable `RegExp(...)` constructor calls using [`recheck`](https://www.npmjs.com/package/recheck).
8
+
9
+ Catastrophic backtracking can make an application spend excessive CPU time on crafted inputs. In server contexts, that can become an availability issue.
10
+
11
+ This rule reports patterns that `recheck` identifies as vulnerable with polynomial or exponential complexity.
12
+
13
+ ## What this rule checks
14
+
15
+ This rule checks:
16
+
17
+ - `/(...)/flags` literals.
18
+ - `RegExp("...")` and `new RegExp("...", "flags")` when both arguments are statically-known strings.
19
+
20
+ This rule intentionally skips dynamic patterns/flags it cannot resolve safely at lint time.
21
+
22
+ ## ❌ Incorrect
23
+
24
+ ```ts
25
+ const unsafe = /(a+)+$/;
26
+ ```
27
+
28
+ ```ts
29
+ const unsafe = RegExp("(a+)+$");
30
+ ```
31
+
32
+ ```ts
33
+ const unsafe = new RegExp("(a+)+$", "u");
34
+ ```
35
+
36
+ ## ✅ Correct
37
+
38
+ ```ts
39
+ const safe = /^a+$/;
40
+ ```
41
+
42
+ ```ts
43
+ const source = getPatternFromConfig();
44
+ const maybeUnsafe = RegExp(source); // Dynamic value: intentionally not analyzed.
45
+ ```
46
+
47
+ ## Options
48
+
49
+ ```ts
50
+ type Options = [
51
+ {
52
+ ignoreErrors?: boolean;
53
+ permittableComplexities?: Array<"polynomial" | "exponential">;
54
+ timeout?: number | null;
55
+ }?,
56
+ ];
57
+ ```
58
+
59
+ ### Default options
60
+
61
+ ```ts
62
+ {
63
+ ignoreErrors: true,
64
+ permittableComplexities: [],
65
+ }
66
+ ```
67
+
68
+ ### `ignoreErrors`
69
+
70
+ When `true` (default), analysis failures from `recheck` are ignored.
71
+ When `false`, analysis failures are reported.
72
+
73
+ ### `permittableComplexities`
74
+
75
+ Allows selected vulnerable complexity classes to pass.
76
+
77
+ For example, to allow polynomial but still report exponential:
78
+
79
+ ```ts
80
+ {
81
+ permittableComplexities: ["polynomial"],
82
+ }
83
+ ```
84
+
85
+ ## When not to use it
86
+
87
+ - If your codebase never handles untrusted input with regexes.
88
+ - If lint-time regex analysis cost is unacceptable for your workflow.
89
+ - If you prefer running ReDoS scanning as a separate CI security step rather than as an ESLint rule.
90
+
91
+ ## Further reading
92
+
93
+ - [OWASP: Regular expression Denial of Service (ReDoS)](https://owasp.org/www-community/attacks/Regular_expression_Denial_of_Service_-_ReDoS)
94
+ - [`recheck` package](https://www.npmjs.com/package/recheck)
95
+ - [MDN: Regular expressions](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_expressions)
96
+
97
+ ## ESLint flat config example
98
+
99
+ ```ts
100
+ import etcMisc from "eslint-plugin-etc-misc";
101
+
102
+ export default [
103
+ {
104
+ plugins: { "etc-misc": etcMisc },
105
+ rules: {
106
+ "etc-misc/no-vulnerable": "error",
107
+ },
108
+ },
109
+ ];
110
+ ```
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://www.schemastore.org/package.json",
3
3
  "name": "eslint-plugin-etc-misc",
4
- "version": "1.1.1",
4
+ "version": "1.1.2",
5
5
  "private": false,
6
6
  "description": "ESLint Plugin combining eslint-plugin-etc and eslint-plugin-misc!",
7
7
  "keywords": [
@@ -61,7 +61,7 @@
61
61
  "build": "tsc -b tsconfig.build.json --force && npm run build:types:cjs && npm run build:cjs",
62
62
  "build:cjs": "esbuild dist/plugin.js --bundle --format=cjs --platform=node --packages=external --sourcemap --outfile=dist/plugin.cjs --footer:js=\"module.exports = module.exports.default;\"",
63
63
  "build:clean": "node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\"",
64
- "build:eslint-inspector": "npx -y @eslint/config-inspector@1.4.2 build --outDir \"docs/docusaurus/static/eslint-inspector\" --base \"/eslint-plugin-etc-misc/eslint-inspector/\"",
64
+ "build:eslint-inspector": "npx -y @eslint/config-inspector@latest build --outDir \"docs/docusaurus/static/eslint-inspector\" --base \"/eslint-plugin-etc-misc/eslint-inspector/\"",
65
65
  "build:eslint-inspector:local": "npx @eslint/config-inspector",
66
66
  "build:types:cjs": "node -e \"require('node:fs').copyFileSync('dist/plugin.d.ts','dist/plugin.d.cts')\"",
67
67
  "changelog:generate": "git-cliff --config cliff.toml --output CHANGELOG.md",
@@ -190,17 +190,18 @@
190
190
  "dependencies": {
191
191
  "@eslint-community/eslint-plugin-eslint-comments": "^4.7.1",
192
192
  "@eslint-community/eslint-utils": "^4.9.1",
193
- "@typescript-eslint/eslint-plugin": "^8.59.1",
194
- "@typescript-eslint/parser": "^8.59.1",
195
- "@typescript-eslint/type-utils": "^8.59.1",
196
- "@typescript-eslint/utils": "^8.59.1",
193
+ "@typescript-eslint/eslint-plugin": "^8.59.2",
194
+ "@typescript-eslint/parser": "^8.59.2",
195
+ "@typescript-eslint/type-utils": "^8.59.2",
196
+ "@typescript-eslint/utils": "^8.59.2",
197
197
  "debug": "^4.4.3",
198
198
  "eslint-plugin-no-secrets": "^2.3.3",
199
199
  "eslint-plugin-unicorn": "^64.0.0",
200
- "eslint-plugin-write-good-comments-2": "^1.2.0",
200
+ "eslint-plugin-write-good-comments-2": "^1.2.1",
201
201
  "eslint-visitor-keys": "^5.0.1",
202
202
  "minimatch": "^10.2.5",
203
- "semver": "^7.7.4",
203
+ "recheck": "^4.5.0",
204
+ "semver": "^7.8.0",
204
205
  "tinyglobby": "^0.2.16",
205
206
  "ts-extras": "^1.0.0",
206
207
  "tslib": "^2.8.1",
@@ -213,8 +214,8 @@
213
214
  "@codecov/vite-plugin": "^2.0.1",
214
215
  "@csstools/stylelint-formatter-github": "^2.0.0",
215
216
  "@double-great/remark-lint-alt-text": "^1.1.1",
216
- "@eslint/compat": "^2.0.5",
217
- "@eslint/config-inspector": "^2.0.0",
217
+ "@eslint/compat": "^2.1.0",
218
+ "@eslint/config-inspector": "^2.0.1",
218
219
  "@microsoft/tsdoc-config": "^0.18.1",
219
220
  "@stryker-ignorer/console-all": "^0.3.2",
220
221
  "@stryker-mutator/core": "^9.6.1",
@@ -222,22 +223,15 @@
222
223
  "@stryker-mutator/vitest-runner": "^9.6.1",
223
224
  "@types/htmlhint": "^1.1.5",
224
225
  "@types/madge": "^5.0.3",
225
- "@types/node": "^25.6.0",
226
- "@types/postcss-clamp": "^4.1.3",
227
- "@types/postcss-flexbugs-fixes": "^5.0.3",
228
- "@types/postcss-html": "^1.5.3",
229
- "@types/postcss-import": "^14.0.3",
230
- "@types/postcss-inline-svg": "^5.0.4",
231
- "@types/postcss-normalize": "^9.0.4",
232
- "@types/postcss-reporter": "^7.0.5",
226
+ "@types/node": "^25.6.2",
233
227
  "@types/sloc": "^0.2.3",
234
- "@typescript-eslint/rule-tester": "^8.59.1",
228
+ "@typescript-eslint/rule-tester": "^8.59.2",
235
229
  "@vitest/coverage-v8": "^4.1.5",
236
230
  "@vitest/ui": "^4.1.5",
237
231
  "actionlint": "^2.0.6",
238
232
  "all-contributors-cli": "^6.26.1",
239
233
  "cognitive-complexity-ts": "^0.8.1",
240
- "commitlint": "^20.5.3",
234
+ "commitlint": "^21.0.0",
241
235
  "cross-env": "^10.1.0",
242
236
  "depcheck": "^1.4.7",
243
237
  "detect-secrets": "^1.0.6",
@@ -249,48 +243,35 @@
249
243
  "git-cliff": "^2.13.1",
250
244
  "gitleaks-secret-scanner": "^2.1.1",
251
245
  "htmlhint": "^1.9.2",
252
- "jscpd": "^4.0.9",
253
- "knip": "^6.11.0",
246
+ "jscpd": "^4.1.0",
247
+ "knip": "^6.12.2",
254
248
  "leasot": "^14.4.0",
255
249
  "madge": "^8.0.0",
256
250
  "markdown-link-check": "^3.14.2",
257
- "npm-check-updates": "^22.1.0",
251
+ "npm-check-updates": "^22.1.1",
258
252
  "npm-package-json-lint": "^10.4.0",
259
253
  "picocolors": "^1.1.1",
260
- "postcss": "^8.5.13",
261
- "postcss-assets": "^6.0.0",
262
- "postcss-clamp": "^4.1.0",
263
- "postcss-combine-duplicated-selectors": "^10.0.3",
264
- "postcss-flexbugs-fixes": "^5.0.2",
265
- "postcss-import": "^16.1.1",
266
- "postcss-inline-svg": "^6.0.0",
267
- "postcss-logical": "^9.0.0",
268
- "postcss-normalize": "^13.0.1",
269
- "postcss-reporter": "^7.1.0",
270
- "postcss-round-subpixels": "^2.0.0",
271
- "postcss-sort-media-queries": "^6.5.0",
272
- "postcss-viewport-height-correction": "^1.1.1",
273
254
  "prettier": "^3.8.3",
274
- "prettier-config-nick2bad4u": "^1.0.9",
275
- "publint": "^0.3.18",
255
+ "prettier-config-nick2bad4u": "^1.0.10",
256
+ "publint": "^0.3.20",
276
257
  "rehype-katex": "^7.0.1",
277
258
  "remark": "^15.0.1",
278
259
  "remark-cli": "^12.0.1",
279
260
  "remark-config-nick2bad4u": "^1.0.1",
280
261
  "rimraf": "^6.1.3",
281
- "secretlint": "^12.3.1",
282
- "secretlint-config-nick2bad4u": "^1.0.3",
262
+ "secretlint": "^13.0.0",
263
+ "secretlint-config-nick2bad4u": "^1.0.4",
283
264
  "sloc": "^0.3.2",
284
265
  "sort-package-json": "^3.6.1",
285
- "stylelint": "^17.10.0",
286
- "stylelint-config-nick2bad4u": "^1.0.5",
266
+ "stylelint": "^17.11.0",
267
+ "stylelint-config-nick2bad4u": "^1.0.10",
287
268
  "ts-unused-exports": "^11.0.1",
288
269
  "typedoc": "^0.28.19",
289
270
  "typescript": "^6.0.3",
290
- "typescript-eslint": "^8.59.1",
271
+ "typescript-eslint": "^8.59.2",
291
272
  "typesync": "^0.14.3",
292
273
  "vfile": "^6.0.3",
293
- "vite": "^8.0.10",
274
+ "vite": "^8.0.11",
294
275
  "vite-tsconfig-paths": "^6.1.1",
295
276
  "vitest": "^4.1.5",
296
277
  "yamllint-js": "^0.2.4"
@@ -299,7 +280,7 @@
299
280
  "eslint": "^9.0.0 || ^10.3.0",
300
281
  "typescript": ">=5.0.0"
301
282
  },
302
- "packageManager": "npm@11.13.0",
283
+ "packageManager": "npm@11.14.1",
303
284
  "engines": {
304
285
  "node": ">=20.19.0"
305
286
  },