bahlint 28.58.6934-dev-001

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 +354 -0
  3. package/bin/bahlint.js +267 -0
  4. package/bin/eslint.js +194 -0
  5. package/conf/ecma-version.js +16 -0
  6. package/conf/globals.js +169 -0
  7. package/conf/replacements.json +26 -0
  8. package/conf/rule-type-list.json +91 -0
  9. package/lib/api.js +39 -0
  10. package/lib/cli-engine/formatters/formatters-meta.json +18 -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 +521 -0
  18. package/lib/config/config-loader.js +668 -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 +1989 -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,598 @@
1
+ /**
2
+ * @fileoverview Flat config schema
3
+ * @author Nicholas C. Zakas
4
+ */
5
+
6
+ "use strict";
7
+
8
+ //-----------------------------------------------------------------------------
9
+ // Requirements
10
+ //-----------------------------------------------------------------------------
11
+
12
+ const { normalizeSeverityToNumber } = require("../shared/severity");
13
+
14
+ //-----------------------------------------------------------------------------
15
+ // Type Definitions
16
+ //-----------------------------------------------------------------------------
17
+
18
+ /**
19
+ * @typedef ObjectPropertySchema
20
+ * @property {Function|string} merge The function or name of the function to call
21
+ * to merge multiple objects with this property.
22
+ * @property {Function|string} validate The function or name of the function to call
23
+ * to validate the value of this property.
24
+ */
25
+
26
+ //-----------------------------------------------------------------------------
27
+ // Helpers
28
+ //-----------------------------------------------------------------------------
29
+
30
+ const ruleSeverities = new Map([
31
+ [0, 0],
32
+ ["off", 0],
33
+ [1, 1],
34
+ ["warn", 1],
35
+ [2, 2],
36
+ ["error", 2],
37
+ ]);
38
+
39
+ /**
40
+ * Check if a value is a non-null object.
41
+ * @param {any} value The value to check.
42
+ * @returns {boolean} `true` if the value is a non-null object.
43
+ */
44
+ function isNonNullObject(value) {
45
+ return typeof value === "object" && value !== null;
46
+ }
47
+
48
+ /**
49
+ * Check if a value is a non-null non-array object.
50
+ * @param {any} value The value to check.
51
+ * @returns {boolean} `true` if the value is a non-null non-array object.
52
+ */
53
+ function isNonArrayObject(value) {
54
+ return isNonNullObject(value) && !Array.isArray(value);
55
+ }
56
+
57
+ /**
58
+ * Check if a value is undefined.
59
+ * @param {any} value The value to check.
60
+ * @returns {boolean} `true` if the value is undefined.
61
+ */
62
+ function isUndefined(value) {
63
+ return typeof value === "undefined";
64
+ }
65
+
66
+ /**
67
+ * Deeply merges two non-array objects.
68
+ * @param {Object} first The base object.
69
+ * @param {Object} second The overrides object.
70
+ * @param {Map<string, Map<string, Object>>} [mergeMap] Maps the combination of first and second arguments to a merged result.
71
+ * @returns {Object} An object with properties from both first and second.
72
+ */
73
+ function deepMerge(first, second, mergeMap = new Map()) {
74
+ let secondMergeMap = mergeMap.get(first);
75
+
76
+ if (secondMergeMap) {
77
+ const result = secondMergeMap.get(second);
78
+
79
+ if (result) {
80
+ // If this combination of first and second arguments has been already visited, return the previously created result.
81
+ return result;
82
+ }
83
+ } else {
84
+ secondMergeMap = new Map();
85
+ mergeMap.set(first, secondMergeMap);
86
+ }
87
+
88
+ /*
89
+ * First create a result object where properties from the second object
90
+ * overwrite properties from the first. This sets up a baseline to use
91
+ * later rather than needing to inspect and change every property
92
+ * individually.
93
+ */
94
+ const result = {
95
+ ...first,
96
+ ...second,
97
+ };
98
+
99
+ delete result.__proto__;
100
+
101
+ // Store the pending result for this combination of first and second arguments.
102
+ secondMergeMap.set(second, result);
103
+
104
+ for (const key of Object.keys(second)) {
105
+ // avoid hairy edge case
106
+ if (
107
+ key === "__proto__" ||
108
+ !Object.prototype.propertyIsEnumerable.call(first, key)
109
+ ) {
110
+ continue;
111
+ }
112
+
113
+ const firstValue = first[key];
114
+ const secondValue = second[key];
115
+
116
+ if (isNonArrayObject(firstValue) && isNonArrayObject(secondValue)) {
117
+ result[key] = deepMerge(firstValue, secondValue, mergeMap);
118
+ } else if (isUndefined(secondValue)) {
119
+ result[key] = firstValue;
120
+ }
121
+ }
122
+
123
+ return result;
124
+ }
125
+
126
+ /**
127
+ * Normalizes the rule options config for a given rule by ensuring that
128
+ * it is an array and that the first item is 0, 1, or 2.
129
+ * @param {Array|string|number} ruleOptions The rule options config.
130
+ * @returns {Array} An array of rule options.
131
+ */
132
+ function normalizeRuleOptions(ruleOptions) {
133
+ const finalOptions = Array.isArray(ruleOptions)
134
+ ? ruleOptions.slice(0)
135
+ : [ruleOptions];
136
+
137
+ finalOptions[0] = ruleSeverities.get(finalOptions[0]);
138
+ return structuredClone(finalOptions);
139
+ }
140
+
141
+ /**
142
+ * Determines if an object has any methods.
143
+ * @param {Object} object The object to check.
144
+ * @returns {boolean} `true` if the object has any methods.
145
+ */
146
+ function hasMethod(object) {
147
+ for (const key of Object.keys(object)) {
148
+ if (typeof object[key] === "function") {
149
+ return true;
150
+ }
151
+ }
152
+
153
+ return false;
154
+ }
155
+
156
+ //-----------------------------------------------------------------------------
157
+ // Assertions
158
+ //-----------------------------------------------------------------------------
159
+
160
+ /**
161
+ * The error type when a rule's options are configured with an invalid type.
162
+ */
163
+ class InvalidRuleOptionsError extends Error {
164
+ /**
165
+ * @param {string} ruleId Rule name being configured.
166
+ * @param {any} value The invalid value.
167
+ */
168
+ constructor(ruleId, value) {
169
+ super(
170
+ `Key "${ruleId}": Expected severity of "off", 0, "warn", 1, "error", or 2.`,
171
+ );
172
+ this.messageTemplate = "invalid-rule-options";
173
+ this.messageData = { ruleId, value };
174
+ }
175
+ }
176
+
177
+ /**
178
+ * Validates that a value is a valid rule options entry.
179
+ * @param {string} ruleId Rule name being configured.
180
+ * @param {any} value The value to check.
181
+ * @returns {void}
182
+ * @throws {InvalidRuleOptionsError} If the value isn't a valid rule options.
183
+ */
184
+ function assertIsRuleOptions(ruleId, value) {
185
+ if (
186
+ typeof value !== "string" &&
187
+ typeof value !== "number" &&
188
+ !Array.isArray(value)
189
+ ) {
190
+ throw new InvalidRuleOptionsError(ruleId, value);
191
+ }
192
+ }
193
+
194
+ /**
195
+ * The error type when a rule's severity is invalid.
196
+ */
197
+ class InvalidRuleSeverityError extends Error {
198
+ /**
199
+ * @param {string} ruleId Rule name being configured.
200
+ * @param {any} value The invalid value.
201
+ */
202
+ constructor(ruleId, value) {
203
+ super(
204
+ `Key "${ruleId}": Expected severity of "off", 0, "warn", 1, "error", or 2.`,
205
+ );
206
+ this.messageTemplate = "invalid-rule-severity";
207
+ this.messageData = { ruleId, value };
208
+ }
209
+ }
210
+
211
+ /**
212
+ * Validates that a value is valid rule severity.
213
+ * @param {string} ruleId Rule name being configured.
214
+ * @param {any} value The value to check.
215
+ * @returns {void}
216
+ * @throws {InvalidRuleSeverityError} If the value isn't a valid rule severity.
217
+ */
218
+ function assertIsRuleSeverity(ruleId, value) {
219
+ const severity = ruleSeverities.get(value);
220
+
221
+ if (typeof severity === "undefined") {
222
+ throw new InvalidRuleSeverityError(ruleId, value);
223
+ }
224
+ }
225
+
226
+ /**
227
+ * Validates that a given string is the form pluginName/objectName.
228
+ * @param {string} value The string to check.
229
+ * @returns {void}
230
+ * @throws {TypeError} If the string isn't in the correct format.
231
+ */
232
+ function assertIsPluginMemberName(value) {
233
+ if (!/[\w\-@$]+(?:\/[\w\-$]+)+$/iu.test(value)) {
234
+ throw new TypeError(
235
+ `Expected string in the form "pluginName/objectName" but found "${value}".`,
236
+ );
237
+ }
238
+ }
239
+
240
+ /**
241
+ * Validates that a value is an object.
242
+ * @param {any} value The value to check.
243
+ * @returns {void}
244
+ * @throws {TypeError} If the value isn't an object.
245
+ */
246
+ function assertIsObject(value) {
247
+ if (!isNonNullObject(value)) {
248
+ throw new TypeError("Expected an object.");
249
+ }
250
+ }
251
+
252
+ /**
253
+ * The error type when there's an eslintrc-style options in a flat config.
254
+ */
255
+ class IncompatibleKeyError extends Error {
256
+ /**
257
+ * @param {string} key The invalid key.
258
+ */
259
+ constructor(key) {
260
+ super(
261
+ "This appears to be in eslintrc format rather than flat config format.",
262
+ );
263
+ this.messageTemplate = "eslintrc-incompat";
264
+ this.messageData = { key };
265
+ }
266
+ }
267
+
268
+ /**
269
+ * The error type when there's an eslintrc-style plugins array found.
270
+ */
271
+ class IncompatiblePluginsError extends Error {
272
+ /**
273
+ * Creates a new instance.
274
+ * @param {Array<string>} plugins The plugins array.
275
+ */
276
+ constructor(plugins) {
277
+ super(
278
+ "This appears to be in eslintrc format (array of strings) rather than flat config format (object).",
279
+ );
280
+ this.messageTemplate = "eslintrc-plugins";
281
+ this.messageData = { plugins };
282
+ }
283
+ }
284
+
285
+ //-----------------------------------------------------------------------------
286
+ // Low-Level Schemas
287
+ //-----------------------------------------------------------------------------
288
+
289
+ /** @type {ObjectPropertySchema} */
290
+ const booleanSchema = {
291
+ merge: "replace",
292
+ validate: "boolean",
293
+ };
294
+
295
+ const ALLOWED_SEVERITIES = new Set(["error", "warn", "off", 2, 1, 0]);
296
+
297
+ /** @type {ObjectPropertySchema} */
298
+ const disableDirectiveSeveritySchema = {
299
+ merge(first, second) {
300
+ const value = second === void 0 ? first : second;
301
+
302
+ if (typeof value === "boolean") {
303
+ return value ? "warn" : "off";
304
+ }
305
+
306
+ return normalizeSeverityToNumber(value);
307
+ },
308
+ validate(value) {
309
+ if (!(ALLOWED_SEVERITIES.has(value) || typeof value === "boolean")) {
310
+ throw new TypeError(
311
+ 'Expected one of: "error", "warn", "off", 0, 1, 2, or a boolean.',
312
+ );
313
+ }
314
+ },
315
+ };
316
+
317
+ /** @type {ObjectPropertySchema} */
318
+ const unusedInlineConfigsSeveritySchema = {
319
+ merge(first, second) {
320
+ const value = second === void 0 ? first : second;
321
+
322
+ return normalizeSeverityToNumber(value);
323
+ },
324
+ validate(value) {
325
+ if (!ALLOWED_SEVERITIES.has(value)) {
326
+ throw new TypeError(
327
+ 'Expected one of: "error", "warn", "off", 0, 1, or 2.',
328
+ );
329
+ }
330
+ },
331
+ };
332
+
333
+ /** @type {ObjectPropertySchema} */
334
+ const deepObjectAssignSchema = {
335
+ merge(first = {}, second = {}) {
336
+ return deepMerge(first, second);
337
+ },
338
+ validate: "object",
339
+ };
340
+
341
+ //-----------------------------------------------------------------------------
342
+ // High-Level Schemas
343
+ //-----------------------------------------------------------------------------
344
+
345
+ /** @type {ObjectPropertySchema} */
346
+ const languageOptionsSchema = {
347
+ merge(first = {}, second = {}) {
348
+ const result = deepMerge(first, second);
349
+
350
+ for (const [key, value] of Object.entries(result)) {
351
+ /*
352
+ * Special case: Because the `parser` property is an object, it should
353
+ * not be deep merged. Instead, it should be replaced if it exists in
354
+ * the second object. To make this more generic, we just check for
355
+ * objects with methods and replace them if they exist in the second
356
+ * object.
357
+ */
358
+ if (isNonArrayObject(value)) {
359
+ if (hasMethod(value)) {
360
+ result[key] = second[key] ?? first[key];
361
+ continue;
362
+ }
363
+
364
+ // for other objects, make sure we aren't reusing the same object
365
+ result[key] = { ...result[key] };
366
+ continue;
367
+ }
368
+ }
369
+
370
+ return result;
371
+ },
372
+ validate: "object",
373
+ };
374
+
375
+ /** @type {ObjectPropertySchema} */
376
+ const languageSchema = {
377
+ merge: "replace",
378
+ validate: assertIsPluginMemberName,
379
+ };
380
+
381
+ /** @type {ObjectPropertySchema} */
382
+ const pluginsSchema = {
383
+ merge(first = {}, second = {}) {
384
+ const keys = new Set([...Object.keys(first), ...Object.keys(second)]);
385
+ const result = {};
386
+
387
+ // manually validate that plugins are not redefined
388
+ for (const key of keys) {
389
+ // avoid hairy edge case
390
+ if (key === "__proto__") {
391
+ continue;
392
+ }
393
+
394
+ if (key in first && key in second && first[key] !== second[key]) {
395
+ throw new TypeError(`Cannot redefine plugin "${key}".`);
396
+ }
397
+
398
+ result[key] = second[key] || first[key];
399
+ }
400
+
401
+ return result;
402
+ },
403
+ validate(value) {
404
+ // first check the value to be sure it's an object
405
+ if (value === null || typeof value !== "object") {
406
+ throw new TypeError("Expected an object.");
407
+ }
408
+
409
+ // make sure it's not an array, which would mean eslintrc-style is used
410
+ if (Array.isArray(value)) {
411
+ throw new IncompatiblePluginsError(value);
412
+ }
413
+
414
+ // second check the keys to make sure they are objects
415
+ for (const key of Object.keys(value)) {
416
+ // avoid hairy edge case
417
+ if (key === "__proto__") {
418
+ continue;
419
+ }
420
+
421
+ if (value[key] === null || typeof value[key] !== "object") {
422
+ throw new TypeError(`Key "${key}": Expected an object.`);
423
+ }
424
+ }
425
+ },
426
+ };
427
+
428
+ /** @type {ObjectPropertySchema} */
429
+ const processorSchema = {
430
+ merge: "replace",
431
+ validate(value) {
432
+ if (typeof value === "string") {
433
+ assertIsPluginMemberName(value);
434
+ } else if (value && typeof value === "object") {
435
+ if (
436
+ typeof value.preprocess !== "function" ||
437
+ typeof value.postprocess !== "function"
438
+ ) {
439
+ throw new TypeError(
440
+ "Object must have a preprocess() and a postprocess() method.",
441
+ );
442
+ }
443
+ } else {
444
+ throw new TypeError("Expected an object or a string.");
445
+ }
446
+ },
447
+ };
448
+
449
+ /** @type {ObjectPropertySchema} */
450
+ const rulesSchema = {
451
+ merge(first = {}, second = {}) {
452
+ const result = {
453
+ ...first,
454
+ ...second,
455
+ };
456
+
457
+ for (const ruleId of Object.keys(result)) {
458
+ try {
459
+ // avoid hairy edge case
460
+ if (ruleId === "__proto__") {
461
+
462
+ delete result.__proto__;
463
+ continue;
464
+ }
465
+
466
+ result[ruleId] = normalizeRuleOptions(result[ruleId]);
467
+
468
+ /*
469
+ * If either rule config is missing, then the correct
470
+ * config is already present and we just need to normalize
471
+ * the severity.
472
+ */
473
+ if (!(ruleId in first) || !(ruleId in second)) {
474
+ continue;
475
+ }
476
+
477
+ const firstRuleOptions = normalizeRuleOptions(first[ruleId]);
478
+ const secondRuleOptions = normalizeRuleOptions(second[ruleId]);
479
+
480
+ /*
481
+ * If the second rule config only has a severity (length of 1),
482
+ * then use that severity and keep the rest of the options from
483
+ * the first rule config.
484
+ */
485
+ if (secondRuleOptions.length === 1) {
486
+ result[ruleId] = [
487
+ secondRuleOptions[0],
488
+ ...firstRuleOptions.slice(1),
489
+ ];
490
+ continue;
491
+ }
492
+
493
+ /*
494
+ * In any other situation, then the second rule config takes
495
+ * precedence. That means the value at `result[ruleId]` is
496
+ * already correct and no further work is necessary.
497
+ */
498
+ } catch (ex) {
499
+ throw new Error(`Key "${ruleId}": ${ex.message}`, {
500
+ cause: ex,
501
+ });
502
+ }
503
+ }
504
+
505
+ return result;
506
+ },
507
+
508
+ validate(value) {
509
+ assertIsObject(value);
510
+
511
+ /*
512
+ * We are not checking the rule schema here because there is no
513
+ * guarantee that the rule definition is present at this point. Instead
514
+ * we wait and check the rule schema during the finalization step
515
+ * of calculating a config.
516
+ */
517
+ for (const ruleId of Object.keys(value)) {
518
+ // avoid hairy edge case
519
+ if (ruleId === "__proto__") {
520
+ continue;
521
+ }
522
+
523
+ const ruleOptions = value[ruleId];
524
+
525
+ assertIsRuleOptions(ruleId, ruleOptions);
526
+
527
+ if (Array.isArray(ruleOptions)) {
528
+ assertIsRuleSeverity(ruleId, ruleOptions[0]);
529
+ } else {
530
+ assertIsRuleSeverity(ruleId, ruleOptions);
531
+ }
532
+ }
533
+ },
534
+ };
535
+
536
+ /**
537
+ * Creates a schema that always throws an error. Useful for warning
538
+ * about eslintrc-style keys.
539
+ * @param {string} key The eslintrc key to create a schema for.
540
+ * @returns {ObjectPropertySchema} The schema.
541
+ */
542
+ function createEslintrcErrorSchema(key) {
543
+ return {
544
+ merge: "replace",
545
+ validate() {
546
+ throw new IncompatibleKeyError(key);
547
+ },
548
+ };
549
+ }
550
+
551
+ const eslintrcKeys = [
552
+ "env",
553
+ "extends",
554
+ "globals",
555
+ "ignorePatterns",
556
+ "noInlineConfig",
557
+ "overrides",
558
+ "parser",
559
+ "parserOptions",
560
+ "reportUnusedDisableDirectives",
561
+ "root",
562
+ ];
563
+
564
+ //-----------------------------------------------------------------------------
565
+ // Full schema
566
+ //-----------------------------------------------------------------------------
567
+
568
+ const flatConfigSchema = {
569
+ // eslintrc-style keys that should always error
570
+ ...Object.fromEntries(
571
+ eslintrcKeys.map(key => [key, createEslintrcErrorSchema(key)]),
572
+ ),
573
+
574
+ // flat config keys
575
+ settings: deepObjectAssignSchema,
576
+ linterOptions: {
577
+ schema: {
578
+ noInlineConfig: booleanSchema,
579
+ reportUnusedDisableDirectives: disableDirectiveSeveritySchema,
580
+ reportUnusedInlineConfigs: unusedInlineConfigsSeveritySchema,
581
+ },
582
+ },
583
+ language: languageSchema,
584
+ languageOptions: languageOptionsSchema,
585
+ processor: processorSchema,
586
+ plugins: pluginsSchema,
587
+ rules: rulesSchema,
588
+ };
589
+
590
+ //-----------------------------------------------------------------------------
591
+ // Exports
592
+ //-----------------------------------------------------------------------------
593
+
594
+ module.exports = {
595
+ flatConfigSchema,
596
+ hasMethod,
597
+ assertIsRuleSeverity,
598
+ };
@@ -0,0 +1,12 @@
1
+ /**
2
+ * @fileoverview exports for config helpers
3
+ * @author Nicholas C. Zakas
4
+ */
5
+
6
+ "use strict";
7
+ const { defineConfig, globalIgnores } = require("@eslint/config-helpers");
8
+
9
+ module.exports = {
10
+ defineConfig,
11
+ globalIgnores,
12
+ };