bahlint 28.58.6934

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 (420) hide show
  1. package/LICENSE +19 -0
  2. package/README.md +370 -0
  3. package/bin/eslint.js +195 -0
  4. package/conf/ecma-version.js +16 -0
  5. package/conf/globals.js +169 -0
  6. package/conf/replacements.json +26 -0
  7. package/conf/rule-type-list.json +91 -0
  8. package/lib/api.js +39 -0
  9. package/lib/cli-engine/formatters/formatters-meta.json +22 -0
  10. package/lib/cli-engine/formatters/gasoline.js +168 -0
  11. package/lib/cli-engine/formatters/html.js +359 -0
  12. package/lib/cli-engine/formatters/json-with-metadata.js +16 -0
  13. package/lib/cli-engine/formatters/json.js +13 -0
  14. package/lib/cli-engine/formatters/stylish.js +153 -0
  15. package/lib/cli-engine/hash.js +35 -0
  16. package/lib/cli-engine/lint-result-cache.js +220 -0
  17. package/lib/cli.js +607 -0
  18. package/lib/config/config-loader.js +683 -0
  19. package/lib/config/config.js +674 -0
  20. package/lib/config/default-config.js +78 -0
  21. package/lib/config/flat-config-array.js +217 -0
  22. package/lib/config/flat-config-schema.js +598 -0
  23. package/lib/config-api.js +12 -0
  24. package/lib/eslint/eslint-helpers.js +1462 -0
  25. package/lib/eslint/eslint.js +1364 -0
  26. package/lib/eslint/index.js +7 -0
  27. package/lib/eslint/worker.js +173 -0
  28. package/lib/languages/js/index.js +336 -0
  29. package/lib/languages/js/source-code/index.js +7 -0
  30. package/lib/languages/js/source-code/source-code.js +1178 -0
  31. package/lib/languages/js/source-code/token-store/backward-token-comment-cursor.js +61 -0
  32. package/lib/languages/js/source-code/token-store/backward-token-cursor.js +57 -0
  33. package/lib/languages/js/source-code/token-store/cursor.js +76 -0
  34. package/lib/languages/js/source-code/token-store/cursors.js +120 -0
  35. package/lib/languages/js/source-code/token-store/decorative-cursor.js +38 -0
  36. package/lib/languages/js/source-code/token-store/filter-cursor.js +42 -0
  37. package/lib/languages/js/source-code/token-store/forward-token-comment-cursor.js +65 -0
  38. package/lib/languages/js/source-code/token-store/forward-token-cursor.js +62 -0
  39. package/lib/languages/js/source-code/token-store/index.js +695 -0
  40. package/lib/languages/js/source-code/token-store/limit-cursor.js +39 -0
  41. package/lib/languages/js/source-code/token-store/padded-token-cursor.js +45 -0
  42. package/lib/languages/js/source-code/token-store/skip-cursor.js +41 -0
  43. package/lib/languages/js/source-code/token-store/utils.js +131 -0
  44. package/lib/languages/js/validate-language-options.js +196 -0
  45. package/lib/linter/apply-disable-directives.js +583 -0
  46. package/lib/linter/code-path-analysis/code-path-analyzer.js +828 -0
  47. package/lib/linter/code-path-analysis/code-path-segment.js +262 -0
  48. package/lib/linter/code-path-analysis/code-path-state.js +2370 -0
  49. package/lib/linter/code-path-analysis/code-path.js +332 -0
  50. package/lib/linter/code-path-analysis/debug-helpers.js +223 -0
  51. package/lib/linter/code-path-analysis/fork-context.js +374 -0
  52. package/lib/linter/code-path-analysis/id-generator.js +44 -0
  53. package/lib/linter/esquery.js +332 -0
  54. package/lib/linter/file-context.js +88 -0
  55. package/lib/linter/file-report.js +604 -0
  56. package/lib/linter/index.js +11 -0
  57. package/lib/linter/interpolate.js +50 -0
  58. package/lib/linter/linter.js +1614 -0
  59. package/lib/linter/rule-fixer.js +199 -0
  60. package/lib/linter/source-code-fixer.js +154 -0
  61. package/lib/linter/source-code-traverser.js +333 -0
  62. package/lib/linter/source-code-visitor.js +81 -0
  63. package/lib/linter/timing.js +209 -0
  64. package/lib/linter/vfile.js +115 -0
  65. package/lib/options.js +416 -0
  66. package/lib/rule-tester/index.js +7 -0
  67. package/lib/rule-tester/rule-tester.js +1817 -0
  68. package/lib/rules/accessor-pairs.js +420 -0
  69. package/lib/rules/array-bracket-newline.js +291 -0
  70. package/lib/rules/array-bracket-spacing.js +301 -0
  71. package/lib/rules/array-callback-return.js +493 -0
  72. package/lib/rules/array-element-newline.js +374 -0
  73. package/lib/rules/arrow-body-style.js +418 -0
  74. package/lib/rules/arrow-parens.js +237 -0
  75. package/lib/rules/arrow-spacing.js +188 -0
  76. package/lib/rules/block-scoped-var.js +137 -0
  77. package/lib/rules/block-spacing.js +202 -0
  78. package/lib/rules/brace-style.js +278 -0
  79. package/lib/rules/callback-return.js +216 -0
  80. package/lib/rules/camelcase.js +422 -0
  81. package/lib/rules/capitalized-comments.js +325 -0
  82. package/lib/rules/class-methods-use-this.js +250 -0
  83. package/lib/rules/comma-dangle.js +424 -0
  84. package/lib/rules/comma-spacing.js +205 -0
  85. package/lib/rules/comma-style.js +391 -0
  86. package/lib/rules/complexity.js +201 -0
  87. package/lib/rules/computed-property-spacing.js +251 -0
  88. package/lib/rules/consistent-return.js +221 -0
  89. package/lib/rules/consistent-this.js +179 -0
  90. package/lib/rules/constructor-super.js +453 -0
  91. package/lib/rules/curly.js +425 -0
  92. package/lib/rules/default-case-last.js +51 -0
  93. package/lib/rules/default-case.js +103 -0
  94. package/lib/rules/default-param-last.js +78 -0
  95. package/lib/rules/dot-location.js +138 -0
  96. package/lib/rules/dot-notation.js +216 -0
  97. package/lib/rules/eol-last.js +135 -0
  98. package/lib/rules/eqeqeq.js +210 -0
  99. package/lib/rules/for-direction.js +168 -0
  100. package/lib/rules/func-call-spacing.js +281 -0
  101. package/lib/rules/func-name-matching.js +338 -0
  102. package/lib/rules/func-names.js +194 -0
  103. package/lib/rules/func-style.js +221 -0
  104. package/lib/rules/function-call-argument-newline.js +166 -0
  105. package/lib/rules/function-paren-newline.js +368 -0
  106. package/lib/rules/generator-star-spacing.js +246 -0
  107. package/lib/rules/getter-return.js +242 -0
  108. package/lib/rules/global-require.js +117 -0
  109. package/lib/rules/grouped-accessor-pairs.js +268 -0
  110. package/lib/rules/guard-for-in.js +85 -0
  111. package/lib/rules/handle-callback-err.js +122 -0
  112. package/lib/rules/id-blacklist.js +241 -0
  113. package/lib/rules/id-denylist.js +223 -0
  114. package/lib/rules/id-length.js +217 -0
  115. package/lib/rules/id-match.js +363 -0
  116. package/lib/rules/implicit-arrow-linebreak.js +125 -0
  117. package/lib/rules/indent-legacy.js +1369 -0
  118. package/lib/rules/indent.js +2334 -0
  119. package/lib/rules/index.js +332 -0
  120. package/lib/rules/init-declarations.js +172 -0
  121. package/lib/rules/jsx-quotes.js +128 -0
  122. package/lib/rules/key-spacing.js +822 -0
  123. package/lib/rules/keyword-spacing.js +701 -0
  124. package/lib/rules/line-comment-position.js +157 -0
  125. package/lib/rules/linebreak-style.js +135 -0
  126. package/lib/rules/lines-around-comment.js +581 -0
  127. package/lib/rules/lines-around-directive.js +249 -0
  128. package/lib/rules/lines-between-class-members.js +358 -0
  129. package/lib/rules/logical-assignment-operators.js +688 -0
  130. package/lib/rules/max-classes-per-file.js +90 -0
  131. package/lib/rules/max-depth.js +159 -0
  132. package/lib/rules/max-len.js +497 -0
  133. package/lib/rules/max-lines-per-function.js +238 -0
  134. package/lib/rules/max-lines.js +189 -0
  135. package/lib/rules/max-nested-callbacks.js +115 -0
  136. package/lib/rules/max-params.js +148 -0
  137. package/lib/rules/max-statements-per-line.js +224 -0
  138. package/lib/rules/max-statements.js +188 -0
  139. package/lib/rules/multiline-comment-style.js +652 -0
  140. package/lib/rules/multiline-ternary.js +257 -0
  141. package/lib/rules/new-cap.js +277 -0
  142. package/lib/rules/new-parens.js +120 -0
  143. package/lib/rules/newline-after-var.js +307 -0
  144. package/lib/rules/newline-before-return.js +242 -0
  145. package/lib/rules/newline-per-chained-call.js +159 -0
  146. package/lib/rules/no-alert.js +149 -0
  147. package/lib/rules/no-array-constructor.js +195 -0
  148. package/lib/rules/no-async-promise-executor.js +45 -0
  149. package/lib/rules/no-await-in-loop.js +115 -0
  150. package/lib/rules/no-bitwise.js +145 -0
  151. package/lib/rules/no-buffer-constructor.js +74 -0
  152. package/lib/rules/no-caller.js +52 -0
  153. package/lib/rules/no-case-declarations.js +80 -0
  154. package/lib/rules/no-catch-shadow.js +96 -0
  155. package/lib/rules/no-class-assign.js +66 -0
  156. package/lib/rules/no-compare-neg-zero.js +74 -0
  157. package/lib/rules/no-cond-assign.js +175 -0
  158. package/lib/rules/no-confusing-arrow.js +127 -0
  159. package/lib/rules/no-console.js +221 -0
  160. package/lib/rules/no-const-assign.js +73 -0
  161. package/lib/rules/no-constant-binary-expression.js +603 -0
  162. package/lib/rules/no-constant-condition.js +177 -0
  163. package/lib/rules/no-constructor-return.js +62 -0
  164. package/lib/rules/no-continue.js +38 -0
  165. package/lib/rules/no-control-regex.js +142 -0
  166. package/lib/rules/no-debugger.js +41 -0
  167. package/lib/rules/no-delete-var.js +42 -0
  168. package/lib/rules/no-div-regex.js +60 -0
  169. package/lib/rules/no-dupe-args.js +92 -0
  170. package/lib/rules/no-dupe-class-members.js +117 -0
  171. package/lib/rules/no-dupe-else-if.js +145 -0
  172. package/lib/rules/no-dupe-keys.js +165 -0
  173. package/lib/rules/no-duplicate-case.js +78 -0
  174. package/lib/rules/no-duplicate-imports.js +368 -0
  175. package/lib/rules/no-else-return.js +450 -0
  176. package/lib/rules/no-empty-character-class.js +83 -0
  177. package/lib/rules/no-empty-function.js +236 -0
  178. package/lib/rules/no-empty-pattern.js +85 -0
  179. package/lib/rules/no-empty-static-block.js +73 -0
  180. package/lib/rules/no-empty.js +153 -0
  181. package/lib/rules/no-eq-null.js +51 -0
  182. package/lib/rules/no-eval.js +295 -0
  183. package/lib/rules/no-ex-assign.js +57 -0
  184. package/lib/rules/no-extend-native.js +180 -0
  185. package/lib/rules/no-extra-bind.js +224 -0
  186. package/lib/rules/no-extra-boolean-cast.js +420 -0
  187. package/lib/rules/no-extra-label.js +169 -0
  188. package/lib/rules/no-extra-parens.js +1669 -0
  189. package/lib/rules/no-extra-semi.js +167 -0
  190. package/lib/rules/no-fallthrough.js +260 -0
  191. package/lib/rules/no-floating-decimal.js +99 -0
  192. package/lib/rules/no-func-assign.js +77 -0
  193. package/lib/rules/no-global-assign.js +101 -0
  194. package/lib/rules/no-implicit-coercion.js +468 -0
  195. package/lib/rules/no-implicit-globals.js +187 -0
  196. package/lib/rules/no-implied-eval.js +170 -0
  197. package/lib/rules/no-import-assign.js +227 -0
  198. package/lib/rules/no-inline-comments.js +115 -0
  199. package/lib/rules/no-inner-declarations.js +147 -0
  200. package/lib/rules/no-invalid-regexp.js +244 -0
  201. package/lib/rules/no-invalid-this.js +178 -0
  202. package/lib/rules/no-irregular-whitespace.js +292 -0
  203. package/lib/rules/no-iterator.js +48 -0
  204. package/lib/rules/no-label-var.js +78 -0
  205. package/lib/rules/no-labels.js +156 -0
  206. package/lib/rules/no-lone-blocks.js +140 -0
  207. package/lib/rules/no-lonely-if.js +126 -0
  208. package/lib/rules/no-loop-func.js +267 -0
  209. package/lib/rules/no-loss-of-precision.js +249 -0
  210. package/lib/rules/no-magic-numbers.js +365 -0
  211. package/lib/rules/no-misleading-character-class.js +595 -0
  212. package/lib/rules/no-mixed-operators.js +253 -0
  213. package/lib/rules/no-mixed-requires.js +267 -0
  214. package/lib/rules/no-mixed-spaces-and-tabs.js +148 -0
  215. package/lib/rules/no-multi-assign.js +66 -0
  216. package/lib/rules/no-multi-spaces.js +179 -0
  217. package/lib/rules/no-multi-str.js +67 -0
  218. package/lib/rules/no-multiple-empty-lines.js +210 -0
  219. package/lib/rules/no-native-reassign.js +114 -0
  220. package/lib/rules/no-negated-condition.js +100 -0
  221. package/lib/rules/no-negated-in-lhs.js +59 -0
  222. package/lib/rules/no-nested-ternary.js +46 -0
  223. package/lib/rules/no-new-func.js +96 -0
  224. package/lib/rules/no-new-native-nonconstructor.js +70 -0
  225. package/lib/rules/no-new-object.js +76 -0
  226. package/lib/rules/no-new-require.js +67 -0
  227. package/lib/rules/no-new-symbol.js +74 -0
  228. package/lib/rules/no-new-wrappers.js +62 -0
  229. package/lib/rules/no-new.js +42 -0
  230. package/lib/rules/no-nonoctal-decimal-escape.js +176 -0
  231. package/lib/rules/no-obj-calls.js +99 -0
  232. package/lib/rules/no-object-constructor.js +124 -0
  233. package/lib/rules/no-octal-escape.js +53 -0
  234. package/lib/rules/no-octal.js +42 -0
  235. package/lib/rules/no-param-reassign.js +248 -0
  236. package/lib/rules/no-path-concat.js +79 -0
  237. package/lib/rules/no-plusplus.js +102 -0
  238. package/lib/rules/no-process-env.js +68 -0
  239. package/lib/rules/no-process-exit.js +67 -0
  240. package/lib/rules/no-promise-executor-return.js +264 -0
  241. package/lib/rules/no-proto.js +45 -0
  242. package/lib/rules/no-prototype-builtins.js +181 -0
  243. package/lib/rules/no-redeclare.js +173 -0
  244. package/lib/rules/no-regex-spaces.js +219 -0
  245. package/lib/rules/no-restricted-exports.js +227 -0
  246. package/lib/rules/no-restricted-globals.js +266 -0
  247. package/lib/rules/no-restricted-imports.js +892 -0
  248. package/lib/rules/no-restricted-modules.js +249 -0
  249. package/lib/rules/no-restricted-properties.js +233 -0
  250. package/lib/rules/no-restricted-syntax.js +74 -0
  251. package/lib/rules/no-return-assign.js +87 -0
  252. package/lib/rules/no-return-await.js +162 -0
  253. package/lib/rules/no-script-url.js +68 -0
  254. package/lib/rules/no-self-assign.js +186 -0
  255. package/lib/rules/no-self-compare.js +77 -0
  256. package/lib/rules/no-sequences.js +158 -0
  257. package/lib/rules/no-setter-return.js +224 -0
  258. package/lib/rules/no-shadow-restricted-names.js +113 -0
  259. package/lib/rules/no-shadow.js +624 -0
  260. package/lib/rules/no-spaced-func.js +105 -0
  261. package/lib/rules/no-sparse-arrays.js +68 -0
  262. package/lib/rules/no-sync.js +81 -0
  263. package/lib/rules/no-tabs.js +110 -0
  264. package/lib/rules/no-template-curly-in-string.js +45 -0
  265. package/lib/rules/no-ternary.js +38 -0
  266. package/lib/rules/no-this-before-super.js +365 -0
  267. package/lib/rules/no-throw-literal.js +46 -0
  268. package/lib/rules/no-trailing-spaces.js +227 -0
  269. package/lib/rules/no-unassigned-vars.js +80 -0
  270. package/lib/rules/no-undef-init.js +101 -0
  271. package/lib/rules/no-undef.js +84 -0
  272. package/lib/rules/no-undefined.js +85 -0
  273. package/lib/rules/no-underscore-dangle.js +383 -0
  274. package/lib/rules/no-unexpected-multiline.js +130 -0
  275. package/lib/rules/no-unmodified-loop-condition.js +360 -0
  276. package/lib/rules/no-unneeded-ternary.js +232 -0
  277. package/lib/rules/no-unreachable-loop.js +190 -0
  278. package/lib/rules/no-unreachable.js +300 -0
  279. package/lib/rules/no-unsafe-finally.js +119 -0
  280. package/lib/rules/no-unsafe-negation.js +152 -0
  281. package/lib/rules/no-unsafe-optional-chaining.js +221 -0
  282. package/lib/rules/no-unused-expressions.js +227 -0
  283. package/lib/rules/no-unused-labels.js +158 -0
  284. package/lib/rules/no-unused-private-class-members.js +219 -0
  285. package/lib/rules/no-unused-vars.js +1739 -0
  286. package/lib/rules/no-use-before-define.js +446 -0
  287. package/lib/rules/no-useless-assignment.js +657 -0
  288. package/lib/rules/no-useless-backreference.js +263 -0
  289. package/lib/rules/no-useless-call.js +95 -0
  290. package/lib/rules/no-useless-catch.js +57 -0
  291. package/lib/rules/no-useless-computed-key.js +204 -0
  292. package/lib/rules/no-useless-concat.js +121 -0
  293. package/lib/rules/no-useless-constructor.js +262 -0
  294. package/lib/rules/no-useless-escape.js +406 -0
  295. package/lib/rules/no-useless-rename.js +202 -0
  296. package/lib/rules/no-useless-return.js +401 -0
  297. package/lib/rules/no-var.js +367 -0
  298. package/lib/rules/no-void.js +69 -0
  299. package/lib/rules/no-warning-comments.js +209 -0
  300. package/lib/rules/no-whitespace-before-property.js +150 -0
  301. package/lib/rules/no-with.js +37 -0
  302. package/lib/rules/nonblock-statement-body-position.js +164 -0
  303. package/lib/rules/object-curly-newline.js +383 -0
  304. package/lib/rules/object-curly-spacing.js +369 -0
  305. package/lib/rules/object-property-newline.js +151 -0
  306. package/lib/rules/object-shorthand.js +652 -0
  307. package/lib/rules/one-var-declaration-per-line.js +117 -0
  308. package/lib/rules/one-var.js +717 -0
  309. package/lib/rules/operator-assignment.js +270 -0
  310. package/lib/rules/operator-linebreak.js +315 -0
  311. package/lib/rules/padded-blocks.js +366 -0
  312. package/lib/rules/padding-line-between-statements.js +612 -0
  313. package/lib/rules/prefer-arrow-callback.js +437 -0
  314. package/lib/rules/prefer-const.js +546 -0
  315. package/lib/rules/prefer-destructuring.js +332 -0
  316. package/lib/rules/prefer-exponentiation-operator.js +235 -0
  317. package/lib/rules/prefer-named-capture-group.js +197 -0
  318. package/lib/rules/prefer-numeric-literals.js +157 -0
  319. package/lib/rules/prefer-object-has-own.js +148 -0
  320. package/lib/rules/prefer-object-spread.js +319 -0
  321. package/lib/rules/prefer-promise-reject-errors.js +154 -0
  322. package/lib/rules/prefer-reflect.js +150 -0
  323. package/lib/rules/prefer-regex-literals.js +605 -0
  324. package/lib/rules/prefer-rest-params.js +117 -0
  325. package/lib/rules/prefer-spread.js +91 -0
  326. package/lib/rules/prefer-template.js +347 -0
  327. package/lib/rules/preserve-caught-error.js +535 -0
  328. package/lib/rules/quote-props.js +394 -0
  329. package/lib/rules/quotes.js +416 -0
  330. package/lib/rules/radix.js +193 -0
  331. package/lib/rules/require-atomic-updates.js +365 -0
  332. package/lib/rules/require-await.js +184 -0
  333. package/lib/rules/require-unicode-regexp.js +317 -0
  334. package/lib/rules/require-yield.js +86 -0
  335. package/lib/rules/rest-spread-spacing.js +150 -0
  336. package/lib/rules/semi-spacing.js +297 -0
  337. package/lib/rules/semi-style.js +218 -0
  338. package/lib/rules/semi.js +476 -0
  339. package/lib/rules/sort-imports.js +319 -0
  340. package/lib/rules/sort-keys.js +268 -0
  341. package/lib/rules/sort-vars.js +140 -0
  342. package/lib/rules/space-before-blocks.js +232 -0
  343. package/lib/rules/space-before-function-paren.js +202 -0
  344. package/lib/rules/space-in-parens.js +374 -0
  345. package/lib/rules/space-infix-ops.js +249 -0
  346. package/lib/rules/space-unary-ops.js +400 -0
  347. package/lib/rules/spaced-comment.js +447 -0
  348. package/lib/rules/strict.js +314 -0
  349. package/lib/rules/switch-colon-spacing.js +158 -0
  350. package/lib/rules/symbol-description.js +70 -0
  351. package/lib/rules/template-curly-spacing.js +168 -0
  352. package/lib/rules/template-tag-spacing.js +121 -0
  353. package/lib/rules/unicode-bom.js +73 -0
  354. package/lib/rules/use-isnan.js +268 -0
  355. package/lib/rules/utils/ast-utils.js +2828 -0
  356. package/lib/rules/utils/char-source.js +247 -0
  357. package/lib/rules/utils/fix-tracker.js +125 -0
  358. package/lib/rules/utils/keywords.js +67 -0
  359. package/lib/rules/utils/lazy-loading-rule-map.js +118 -0
  360. package/lib/rules/utils/regular-expressions.js +58 -0
  361. package/lib/rules/utils/unicode/index.js +16 -0
  362. package/lib/rules/utils/unicode/is-combining-character.js +13 -0
  363. package/lib/rules/utils/unicode/is-emoji-modifier.js +13 -0
  364. package/lib/rules/utils/unicode/is-regional-indicator-symbol.js +13 -0
  365. package/lib/rules/utils/unicode/is-surrogate-pair.js +14 -0
  366. package/lib/rules/valid-typeof.js +171 -0
  367. package/lib/rules/vars-on-top.js +165 -0
  368. package/lib/rules/wrap-iife.js +238 -0
  369. package/lib/rules/wrap-regex.js +91 -0
  370. package/lib/rules/yield-star-spacing.js +158 -0
  371. package/lib/rules/yoda.js +362 -0
  372. package/lib/services/parser-service.js +64 -0
  373. package/lib/services/processor-service.js +100 -0
  374. package/lib/services/suppressions-service.js +302 -0
  375. package/lib/services/warning-service.js +87 -0
  376. package/lib/shared/ajv.js +34 -0
  377. package/lib/shared/assert.js +21 -0
  378. package/lib/shared/ast-utils.js +30 -0
  379. package/lib/shared/deep-merge-arrays.js +62 -0
  380. package/lib/shared/directives.js +16 -0
  381. package/lib/shared/flags.js +89 -0
  382. package/lib/shared/logging.js +38 -0
  383. package/lib/shared/naming.js +109 -0
  384. package/lib/shared/option-utils.js +63 -0
  385. package/lib/shared/relative-module-resolver.js +28 -0
  386. package/lib/shared/runtime-info.js +177 -0
  387. package/lib/shared/serialization.js +78 -0
  388. package/lib/shared/severity.js +49 -0
  389. package/lib/shared/stats.js +30 -0
  390. package/lib/shared/string-utils.js +58 -0
  391. package/lib/shared/text-table.js +68 -0
  392. package/lib/shared/translate-cli-options.js +223 -0
  393. package/lib/shared/traverser.js +202 -0
  394. package/lib/types/config-api.d.ts +12 -0
  395. package/lib/types/index.d.ts +1482 -0
  396. package/lib/types/rules.d.ts +5603 -0
  397. package/lib/types/universal.d.ts +6 -0
  398. package/lib/types/use-at-your-own-risk.d.ts +34 -0
  399. package/lib/universal.js +10 -0
  400. package/lib/unsupported-api.js +26 -0
  401. package/messages/all-files-ignored.js +16 -0
  402. package/messages/all-matched-files-ignored.js +21 -0
  403. package/messages/config-file-missing.js +16 -0
  404. package/messages/config-plugin-missing.js +14 -0
  405. package/messages/config-serialize-function.js +30 -0
  406. package/messages/eslintrc-incompat.js +117 -0
  407. package/messages/eslintrc-plugins.js +27 -0
  408. package/messages/extend-config-missing.js +13 -0
  409. package/messages/failed-to-read-json.js +11 -0
  410. package/messages/file-not-found.js +10 -0
  411. package/messages/invalid-rule-options.js +17 -0
  412. package/messages/invalid-rule-severity.js +13 -0
  413. package/messages/no-config-found.js +15 -0
  414. package/messages/plugin-conflict.js +22 -0
  415. package/messages/plugin-invalid.js +16 -0
  416. package/messages/plugin-missing.js +19 -0
  417. package/messages/print-config-with-directory-path.js +8 -0
  418. package/messages/shared.js +23 -0
  419. package/messages/whitespace-found.js +11 -0
  420. package/package.json +220 -0
@@ -0,0 +1,595 @@
1
+ /**
2
+ * @author Toru Nagashima <https://github.com/mysticatea>
3
+ */
4
+ "use strict";
5
+
6
+ const {
7
+ CALL,
8
+ CONSTRUCT,
9
+ ReferenceTracker,
10
+ getStaticValue,
11
+ getStringIfConstant,
12
+ } = require("@eslint-community/eslint-utils");
13
+ const { RegExpParser, visitRegExpAST } = require("@eslint-community/regexpp");
14
+ const {
15
+ isCombiningCharacter,
16
+ isEmojiModifier,
17
+ isRegionalIndicatorSymbol,
18
+ isSurrogatePair,
19
+ } = require("./utils/unicode");
20
+ const astUtils = require("./utils/ast-utils.js");
21
+ const { isValidWithUnicodeFlag } = require("./utils/regular-expressions");
22
+ const {
23
+ parseStringLiteral,
24
+ parseTemplateToken,
25
+ } = require("./utils/char-source");
26
+
27
+ //------------------------------------------------------------------------------
28
+ // Helpers
29
+ //------------------------------------------------------------------------------
30
+
31
+ /**
32
+ * @typedef {import('@eslint-community/regexpp').AST.Character} Character
33
+ * @typedef {import('@eslint-community/regexpp').AST.CharacterClassElement} CharacterClassElement
34
+ */
35
+
36
+ /**
37
+ * Iterate character sequences of a given nodes.
38
+ *
39
+ * CharacterClassRange syntax can steal a part of character sequence,
40
+ * so this function reverts CharacterClassRange syntax and restore the sequence.
41
+ * @param {CharacterClassElement[]} nodes The node list to iterate character sequences.
42
+ * @returns {IterableIterator<Character[]>} The list of character sequences.
43
+ */
44
+ function* iterateCharacterSequence(nodes) {
45
+ /** @type {Character[]} */
46
+ let seq = [];
47
+
48
+ for (const node of nodes) {
49
+ switch (node.type) {
50
+ case "Character":
51
+ seq.push(node);
52
+ break;
53
+
54
+ case "CharacterClassRange":
55
+ seq.push(node.min);
56
+ yield seq;
57
+ seq = [node.max];
58
+ break;
59
+
60
+ case "CharacterSet":
61
+ case "CharacterClass": // [[]] nesting character class
62
+ case "ClassStringDisjunction": // \q{...}
63
+ case "ExpressionCharacterClass": // [A--B]
64
+ if (seq.length > 0) {
65
+ yield seq;
66
+ seq = [];
67
+ }
68
+ break;
69
+
70
+ // no default
71
+ }
72
+ }
73
+
74
+ if (seq.length > 0) {
75
+ yield seq;
76
+ }
77
+ }
78
+
79
+ /**
80
+ * Checks whether the given character node is a Unicode code point escape or not.
81
+ * @param {Character} char the character node to check.
82
+ * @returns {boolean} `true` if the character node is a Unicode code point escape.
83
+ */
84
+ function isUnicodeCodePointEscape(char) {
85
+ return /^\\u\{[\da-f]+\}$/iu.test(char.raw);
86
+ }
87
+
88
+ /**
89
+ * Each function returns matched characters if it detects that kind of problem.
90
+ * @type {Record<string, (chars: Character[]) => IterableIterator<Character[]>>}
91
+ */
92
+ const findCharacterSequences = {
93
+ *surrogatePairWithoutUFlag(chars) {
94
+ for (const [index, char] of chars.entries()) {
95
+ const previous = chars[index - 1];
96
+
97
+ if (
98
+ previous &&
99
+ char &&
100
+ isSurrogatePair(previous.value, char.value) &&
101
+ !isUnicodeCodePointEscape(previous) &&
102
+ !isUnicodeCodePointEscape(char)
103
+ ) {
104
+ yield [previous, char];
105
+ }
106
+ }
107
+ },
108
+
109
+ *surrogatePair(chars) {
110
+ for (const [index, char] of chars.entries()) {
111
+ const previous = chars[index - 1];
112
+
113
+ if (
114
+ previous &&
115
+ char &&
116
+ isSurrogatePair(previous.value, char.value) &&
117
+ (isUnicodeCodePointEscape(previous) ||
118
+ isUnicodeCodePointEscape(char))
119
+ ) {
120
+ yield [previous, char];
121
+ }
122
+ }
123
+ },
124
+
125
+ *combiningClass(chars, unfilteredChars) {
126
+ /*
127
+ * When `allowEscape` is `true`, a combined character should only be allowed if the combining mark appears as an escape sequence.
128
+ * This means that the base character should be considered even if it's escaped.
129
+ */
130
+ for (const [index, char] of chars.entries()) {
131
+ const previous = unfilteredChars[index - 1];
132
+
133
+ if (
134
+ previous &&
135
+ char &&
136
+ isCombiningCharacter(char.value) &&
137
+ !isCombiningCharacter(previous.value)
138
+ ) {
139
+ yield [previous, char];
140
+ }
141
+ }
142
+ },
143
+
144
+ *emojiModifier(chars) {
145
+ for (const [index, char] of chars.entries()) {
146
+ const previous = chars[index - 1];
147
+
148
+ if (
149
+ previous &&
150
+ char &&
151
+ isEmojiModifier(char.value) &&
152
+ !isEmojiModifier(previous.value)
153
+ ) {
154
+ yield [previous, char];
155
+ }
156
+ }
157
+ },
158
+
159
+ *regionalIndicatorSymbol(chars) {
160
+ for (const [index, char] of chars.entries()) {
161
+ const previous = chars[index - 1];
162
+
163
+ if (
164
+ previous &&
165
+ char &&
166
+ isRegionalIndicatorSymbol(char.value) &&
167
+ isRegionalIndicatorSymbol(previous.value)
168
+ ) {
169
+ yield [previous, char];
170
+ }
171
+ }
172
+ },
173
+
174
+ *zwj(chars) {
175
+ let sequence = null;
176
+
177
+ for (const [index, char] of chars.entries()) {
178
+ const previous = chars[index - 1];
179
+ const next = chars[index + 1];
180
+
181
+ if (
182
+ previous &&
183
+ char &&
184
+ next &&
185
+ char.value === 0x200d &&
186
+ previous.value !== 0x200d &&
187
+ next.value !== 0x200d
188
+ ) {
189
+ if (sequence) {
190
+ if (sequence.at(-1) === previous) {
191
+ sequence.push(char, next); // append to the sequence
192
+ } else {
193
+ yield sequence;
194
+ sequence = chars.slice(index - 1, index + 2);
195
+ }
196
+ } else {
197
+ sequence = chars.slice(index - 1, index + 2);
198
+ }
199
+ }
200
+ }
201
+
202
+ if (sequence) {
203
+ yield sequence;
204
+ }
205
+ },
206
+ };
207
+
208
+ const kinds = Object.keys(findCharacterSequences);
209
+
210
+ /**
211
+ * Gets the value of the given node if it's a static value other than a regular expression object,
212
+ * or the node's `regex` property.
213
+ * The purpose of this method is to provide a replacement for `getStaticValue` in environments where certain regular expressions cannot be evaluated.
214
+ * A known example is Node.js 18 which does not support the `v` flag.
215
+ * Calling `getStaticValue` on a regular expression node with the `v` flag on Node.js 18 always returns `null`.
216
+ * A limitation of this method is that it can only detect a regular expression if the specified node is itself a regular expression literal node.
217
+ * @param {ASTNode | undefined} node The node to be inspected.
218
+ * @param {Scope} initialScope Scope to start finding variables. This function tries to resolve identifier references which are in the given scope.
219
+ * @returns {{ value: any } | { regex: { pattern: string, flags: string } } | null} The static value of the node, or `null`.
220
+ */
221
+ function getStaticValueOrRegex(node, initialScope) {
222
+ if (!node) {
223
+ return null;
224
+ }
225
+ if (node.type === "Literal" && node.regex) {
226
+ return { regex: node.regex };
227
+ }
228
+
229
+ const staticValue = getStaticValue(node, initialScope);
230
+
231
+ if (staticValue?.value instanceof RegExp) {
232
+ return null;
233
+ }
234
+ return staticValue;
235
+ }
236
+
237
+ /**
238
+ * Checks whether a specified regexpp character is represented as an acceptable escape sequence.
239
+ * This function requires the source text of the character to be known.
240
+ * @param {Character} char Character to check.
241
+ * @param {string} charSource Source text of the character to check.
242
+ * @returns {boolean} Whether the specified regexpp character is represented as an acceptable escape sequence.
243
+ */
244
+ function checkForAcceptableEscape(char, charSource) {
245
+ if (!charSource.startsWith("\\")) {
246
+ return false;
247
+ }
248
+ const match = /(?<=^\\+).$/su.exec(charSource);
249
+
250
+ return match?.[0] !== String.fromCodePoint(char.value);
251
+ }
252
+
253
+ /**
254
+ * Checks whether a specified regexpp character is represented as an acceptable escape sequence.
255
+ * This function works with characters that are produced by a string or template literal.
256
+ * It requires the source text and the CodeUnit list of the literal to be known.
257
+ * @param {Character} char Character to check.
258
+ * @param {string} nodeSource Source text of the string or template literal that produces the character.
259
+ * @param {CodeUnit[]} codeUnits List of CodeUnit objects of the literal that produces the character.
260
+ * @returns {boolean} Whether the specified regexpp character is represented as an acceptable escape sequence.
261
+ */
262
+ function checkForAcceptableEscapeInString(char, nodeSource, codeUnits) {
263
+ const firstIndex = char.start;
264
+ const lastIndex = char.end - 1;
265
+ const start = codeUnits[firstIndex].start;
266
+ const end = codeUnits[lastIndex].end;
267
+ const charSource = nodeSource.slice(start, end);
268
+
269
+ return checkForAcceptableEscape(char, charSource);
270
+ }
271
+
272
+ //------------------------------------------------------------------------------
273
+ // Rule Definition
274
+ //------------------------------------------------------------------------------
275
+
276
+ /** @type {import('../types').Rule.RuleModule} */
277
+ module.exports = {
278
+ meta: {
279
+ type: "problem",
280
+
281
+ defaultOptions: [
282
+ {
283
+ allowEscape: false,
284
+ },
285
+ ],
286
+
287
+ docs: {
288
+ description:
289
+ "Disallow characters which are made with multiple code points in character class syntax",
290
+ recommended: true,
291
+ url: "https://eslint.org/docs/latest/rules/no-misleading-character-class",
292
+ },
293
+
294
+ hasSuggestions: true,
295
+
296
+ schema: [
297
+ {
298
+ type: "object",
299
+ properties: {
300
+ allowEscape: {
301
+ type: "boolean",
302
+ },
303
+ },
304
+ additionalProperties: false,
305
+ },
306
+ ],
307
+
308
+ messages: {
309
+ surrogatePairWithoutUFlag:
310
+ "Unexpected surrogate pair in character class. Use 'u' flag.",
311
+ surrogatePair: "Unexpected surrogate pair in character class.",
312
+ combiningClass: "Unexpected combined character in character class.",
313
+ emojiModifier: "Unexpected modified Emoji in character class.",
314
+ regionalIndicatorSymbol:
315
+ "Unexpected national flag in character class.",
316
+ zwj: "Unexpected joined character sequence in character class.",
317
+ suggestUnicodeFlag: "Add unicode 'u' flag to regex.",
318
+ },
319
+ },
320
+ create(context) {
321
+ const [{ allowEscape }] = context.options;
322
+ const sourceCode = context.sourceCode;
323
+ const parser = new RegExpParser();
324
+ const checkedPatternNodes = new Set();
325
+
326
+ /**
327
+ * Verify a given regular expression.
328
+ * @param {Node} node The node to report.
329
+ * @param {string} pattern The regular expression pattern to verify.
330
+ * @param {string} flags The flags of the regular expression.
331
+ * @param {Function} unicodeFixer Fixer for missing "u" flag.
332
+ * @returns {void}
333
+ */
334
+ function verify(node, pattern, flags, unicodeFixer) {
335
+ let patternNode;
336
+
337
+ try {
338
+ patternNode = parser.parsePattern(pattern, 0, pattern.length, {
339
+ unicode: flags.includes("u"),
340
+ unicodeSets: flags.includes("v"),
341
+ });
342
+ } catch {
343
+ // Ignore regular expressions with syntax errors
344
+ return;
345
+ }
346
+
347
+ let codeUnits = null;
348
+
349
+ /**
350
+ * Checks whether a specified regexpp character is represented as an acceptable escape sequence.
351
+ * For the purposes of this rule, an escape sequence is considered acceptable if it consists of one or more backslashes followed by the character being escaped.
352
+ * @param {Character} char Character to check.
353
+ * @returns {boolean} Whether the specified regexpp character is represented as an acceptable escape sequence.
354
+ */
355
+ function isAcceptableEscapeSequence(char) {
356
+ if (node.type === "Literal" && node.regex) {
357
+ return checkForAcceptableEscape(char, char.raw);
358
+ }
359
+ if (node.type === "Literal" && typeof node.value === "string") {
360
+ const nodeSource = node.raw;
361
+
362
+ codeUnits ??= parseStringLiteral(nodeSource);
363
+
364
+ return checkForAcceptableEscapeInString(
365
+ char,
366
+ nodeSource,
367
+ codeUnits,
368
+ );
369
+ }
370
+ if (astUtils.isStaticTemplateLiteral(node)) {
371
+ const nodeSource = sourceCode.getText(node);
372
+
373
+ codeUnits ??= parseTemplateToken(nodeSource);
374
+
375
+ return checkForAcceptableEscapeInString(
376
+ char,
377
+ nodeSource,
378
+ codeUnits,
379
+ );
380
+ }
381
+ return false;
382
+ }
383
+
384
+ const foundKindMatches = new Map();
385
+
386
+ visitRegExpAST(patternNode, {
387
+ onCharacterClassEnter(ccNode) {
388
+ for (const unfilteredChars of iterateCharacterSequence(
389
+ ccNode.elements,
390
+ )) {
391
+ let chars;
392
+
393
+ if (allowEscape) {
394
+ // Replace escape sequences with null to avoid having them flagged.
395
+ chars = unfilteredChars.map(char =>
396
+ isAcceptableEscapeSequence(char) ? null : char,
397
+ );
398
+ } else {
399
+ chars = unfilteredChars;
400
+ }
401
+ for (const kind of kinds) {
402
+ const matches = findCharacterSequences[kind](
403
+ chars,
404
+ unfilteredChars,
405
+ );
406
+
407
+ if (foundKindMatches.has(kind)) {
408
+ foundKindMatches.get(kind).push(...matches);
409
+ } else {
410
+ foundKindMatches.set(kind, [...matches]);
411
+ }
412
+ }
413
+ }
414
+ },
415
+ });
416
+
417
+ /**
418
+ * Finds the report loc(s) for a range of matches.
419
+ * Only literals and expression-less templates generate granular errors.
420
+ * @param {Character[][]} matches Lists of individual characters being reported on.
421
+ * @returns {Location[]} locs for context.report.
422
+ * @see https://github.com/eslint/eslint/pull/17515
423
+ */
424
+ function getNodeReportLocations(matches) {
425
+ if (
426
+ !astUtils.isStaticTemplateLiteral(node) &&
427
+ node.type !== "Literal"
428
+ ) {
429
+ return matches.length ? [node.loc] : [];
430
+ }
431
+ return matches.map(chars => {
432
+ const firstIndex = chars[0].start;
433
+ const lastIndex = chars.at(-1).end - 1;
434
+ let start;
435
+ let end;
436
+
437
+ if (node.type === "TemplateLiteral") {
438
+ const source = sourceCode.getText(node);
439
+ const offset = node.range[0];
440
+
441
+ codeUnits ??= parseTemplateToken(source);
442
+ start = offset + codeUnits[firstIndex].start;
443
+ end = offset + codeUnits[lastIndex].end;
444
+ } else if (typeof node.value === "string") {
445
+ // String Literal
446
+ const source = node.raw;
447
+ const offset = node.range[0];
448
+
449
+ codeUnits ??= parseStringLiteral(source);
450
+ start = offset + codeUnits[firstIndex].start;
451
+ end = offset + codeUnits[lastIndex].end;
452
+ } else {
453
+ // RegExp Literal
454
+ const offset = node.range[0] + 1; // Add 1 to skip the leading slash.
455
+
456
+ start = offset + firstIndex;
457
+ end = offset + lastIndex + 1;
458
+ }
459
+
460
+ return {
461
+ start: sourceCode.getLocFromIndex(start),
462
+ end: sourceCode.getLocFromIndex(end),
463
+ };
464
+ });
465
+ }
466
+
467
+ for (const [kind, matches] of foundKindMatches) {
468
+ let suggest;
469
+
470
+ if (kind === "surrogatePairWithoutUFlag") {
471
+ suggest = [
472
+ {
473
+ messageId: "suggestUnicodeFlag",
474
+ fix: unicodeFixer,
475
+ },
476
+ ];
477
+ }
478
+
479
+ const locs = getNodeReportLocations(matches);
480
+
481
+ for (const loc of locs) {
482
+ context.report({
483
+ node,
484
+ loc,
485
+ messageId: kind,
486
+ suggest,
487
+ });
488
+ }
489
+ }
490
+ }
491
+
492
+ return {
493
+ "Literal[regex]"(node) {
494
+ if (checkedPatternNodes.has(node)) {
495
+ return;
496
+ }
497
+ verify(node, node.regex.pattern, node.regex.flags, fixer => {
498
+ if (
499
+ !isValidWithUnicodeFlag(
500
+ context.languageOptions.ecmaVersion,
501
+ node.regex.pattern,
502
+ )
503
+ ) {
504
+ return null;
505
+ }
506
+
507
+ return fixer.insertTextAfter(node, "u");
508
+ });
509
+ },
510
+ Program(node) {
511
+ const scope = sourceCode.getScope(node);
512
+ const tracker = new ReferenceTracker(scope);
513
+
514
+ /*
515
+ * Iterate calls of RegExp.
516
+ * E.g., `new RegExp()`, `RegExp()`, `new window.RegExp()`,
517
+ * `const {RegExp: a} = window; new a()`, etc...
518
+ */
519
+ for (const { node: refNode } of tracker.iterateGlobalReferences(
520
+ {
521
+ RegExp: { [CALL]: true, [CONSTRUCT]: true },
522
+ },
523
+ )) {
524
+ let pattern, flags;
525
+ const [patternNode, flagsNode] = refNode.arguments;
526
+ const evaluatedPattern = getStaticValueOrRegex(
527
+ patternNode,
528
+ scope,
529
+ );
530
+
531
+ if (!evaluatedPattern) {
532
+ continue;
533
+ }
534
+ if (flagsNode) {
535
+ if (evaluatedPattern.regex) {
536
+ pattern = evaluatedPattern.regex.pattern;
537
+ checkedPatternNodes.add(patternNode);
538
+ } else {
539
+ pattern = String(evaluatedPattern.value);
540
+ }
541
+ flags = getStringIfConstant(flagsNode, scope);
542
+ } else {
543
+ if (evaluatedPattern.regex) {
544
+ continue;
545
+ }
546
+ pattern = String(evaluatedPattern.value);
547
+ flags = "";
548
+ }
549
+
550
+ if (typeof flags === "string") {
551
+ verify(patternNode, pattern, flags, fixer => {
552
+ if (
553
+ !isValidWithUnicodeFlag(
554
+ context.languageOptions.ecmaVersion,
555
+ pattern,
556
+ )
557
+ ) {
558
+ return null;
559
+ }
560
+
561
+ if (refNode.arguments.length === 1) {
562
+ const penultimateToken =
563
+ sourceCode.getLastToken(refNode, {
564
+ skip: 1,
565
+ }); // skip closing parenthesis
566
+
567
+ return fixer.insertTextAfter(
568
+ penultimateToken,
569
+ astUtils.isCommaToken(penultimateToken)
570
+ ? ' "u",'
571
+ : ', "u"',
572
+ );
573
+ }
574
+
575
+ if (
576
+ (flagsNode.type === "Literal" &&
577
+ typeof flagsNode.value === "string") ||
578
+ flagsNode.type === "TemplateLiteral"
579
+ ) {
580
+ const range = [
581
+ flagsNode.range[0],
582
+ flagsNode.range[1] - 1,
583
+ ];
584
+
585
+ return fixer.insertTextAfterRange(range, "u");
586
+ }
587
+
588
+ return null;
589
+ });
590
+ }
591
+ }
592
+ },
593
+ };
594
+ },
595
+ };