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,302 @@
1
+ /**
2
+ * @fileoverview Manages the suppressed violations.
3
+ * @author Iacovos Constantinou
4
+ */
5
+
6
+ "use strict";
7
+
8
+ //-----------------------------------------------------------------------------
9
+ // Requirements
10
+ //-----------------------------------------------------------------------------
11
+
12
+ const fs = require("node:fs");
13
+ const path = require("node:path");
14
+ const { calculateStatsPerFile } = require("../eslint/eslint-helpers");
15
+ const stringify = require("json-stable-stringify-without-jsonify");
16
+
17
+ //------------------------------------------------------------------------------
18
+ // Typedefs
19
+ //------------------------------------------------------------------------------
20
+
21
+ // For VSCode IntelliSense
22
+ /** @typedef {import("../types").Linter.LintMessage} LintMessage */
23
+ /** @typedef {import("../types").ESLint.LintResult} LintResult */
24
+ /** @typedef {Record<string, Record<string, { count: number; }>>} SuppressedViolations */
25
+
26
+ //-----------------------------------------------------------------------------
27
+ // Exports
28
+ //-----------------------------------------------------------------------------
29
+
30
+ /**
31
+ * Manages the suppressed violations.
32
+ */
33
+ class SuppressionsService {
34
+ filePath = "";
35
+ cwd = "";
36
+
37
+ /**
38
+ * Creates a new instance of SuppressionsService.
39
+ * @param {Object} options The options.
40
+ * @param {string} [options.filePath] The location of the suppressions file.
41
+ * @param {string} [options.cwd] The current working directory.
42
+ */
43
+ constructor({ filePath, cwd }) {
44
+ this.filePath = filePath;
45
+ this.cwd = cwd;
46
+ }
47
+
48
+ /**
49
+ * Updates the suppressions file based on the current violations and the provided rules.
50
+ * If no rules are provided, all violations are suppressed.
51
+ * @param {LintResult[]|undefined} results The lint results.
52
+ * @param {string[]|undefined} rules The rules to suppress.
53
+ * @returns {Promise<void>}
54
+ */
55
+ async suppress(results, rules) {
56
+ const suppressions = await this.load();
57
+
58
+ for (const result of results) {
59
+ const relativeFilePath = this.getRelativeFilePath(result.filePath);
60
+ const violationsByRule = SuppressionsService.countViolationsByRule(
61
+ result.messages,
62
+ );
63
+
64
+ for (const ruleId in violationsByRule) {
65
+ if (rules && !rules.includes(ruleId)) {
66
+ continue;
67
+ }
68
+
69
+ suppressions[relativeFilePath] ??= {};
70
+ suppressions[relativeFilePath][ruleId] =
71
+ violationsByRule[ruleId];
72
+ }
73
+ }
74
+
75
+ return this.save(suppressions);
76
+ }
77
+
78
+ /**
79
+ * Removes old, unused suppressions for violations that do not occur anymore.
80
+ * @param {LintResult[]} results The lint results.
81
+ * @returns {Promise<void>} No return value.
82
+ */
83
+ async prune(results) {
84
+ const suppressions = await this.load();
85
+ const { unused } = this.applySuppressions(results, suppressions);
86
+
87
+ for (const file in unused) {
88
+ if (!suppressions[file]) {
89
+ continue;
90
+ }
91
+
92
+ for (const rule in unused[file]) {
93
+ if (!suppressions[file][rule]) {
94
+ continue;
95
+ }
96
+
97
+ const suppressionsCount = suppressions[file][rule].count;
98
+ const violationsCount = unused[file][rule].count;
99
+
100
+ if (suppressionsCount === violationsCount) {
101
+ // Remove unused rules
102
+ delete suppressions[file][rule];
103
+ } else {
104
+ // Update the count to match the new number of violations
105
+ suppressions[file][rule].count -= violationsCount;
106
+ }
107
+ }
108
+
109
+ // Cleanup files with no rules
110
+ if (Object.keys(suppressions[file]).length === 0) {
111
+ delete suppressions[file];
112
+ }
113
+ }
114
+
115
+ for (const file of Object.keys(suppressions)) {
116
+ const absolutePath = path.resolve(this.cwd, file);
117
+
118
+ if (!fs.existsSync(absolutePath)) {
119
+ delete suppressions[file];
120
+ }
121
+ }
122
+
123
+ return this.save(suppressions);
124
+ }
125
+
126
+ /**
127
+ * Checks the provided suppressions against the lint results.
128
+ *
129
+ * For each file, counts the number of violations per rule.
130
+ * For each rule in each file, compares the number of violations against the counter from the suppressions file.
131
+ * If the number of violations is less or equal to the counter, messages are moved to `LintResult#suppressedMessages` and ignored.
132
+ * Otherwise, all violations are reported as usual.
133
+ * @param {LintResult[]} results The lint results.
134
+ * @param {SuppressedViolations} suppressions The suppressions.
135
+ * @returns {{
136
+ * results: LintResult[],
137
+ * unused: SuppressedViolations
138
+ * }} The updated results and the unused suppressions.
139
+ */
140
+ applySuppressions(results, suppressions) {
141
+ /**
142
+ * We copy the results to avoid modifying the original objects
143
+ * We remove only result messages that are matched and hence suppressed
144
+ * We leave the rest untouched to minimize the risk of losing parts of the original data
145
+ */
146
+ const filtered = structuredClone(results);
147
+ const unused = {};
148
+
149
+ for (const result of filtered) {
150
+ const relativeFilePath = this.getRelativeFilePath(result.filePath);
151
+
152
+ if (!suppressions[relativeFilePath]) {
153
+ continue;
154
+ }
155
+
156
+ const violationsByRule = SuppressionsService.countViolationsByRule(
157
+ result.messages,
158
+ );
159
+ let wasSuppressed = false;
160
+
161
+ for (const ruleId in violationsByRule) {
162
+ if (!suppressions[relativeFilePath][ruleId]) {
163
+ continue;
164
+ }
165
+
166
+ const suppressionsCount =
167
+ suppressions[relativeFilePath][ruleId].count;
168
+ const violationsCount = violationsByRule[ruleId].count;
169
+
170
+ // Suppress messages if the number of violations is less or equal to the suppressions count
171
+ if (violationsCount <= suppressionsCount) {
172
+ SuppressionsService.suppressMessagesByRule(result, ruleId);
173
+ wasSuppressed = true;
174
+ }
175
+
176
+ // Update the count to match the new number of violations, otherwise remove the rule entirely
177
+ if (violationsCount < suppressionsCount) {
178
+ unused[relativeFilePath] ??= {};
179
+ unused[relativeFilePath][ruleId] ??= {};
180
+ unused[relativeFilePath][ruleId].count =
181
+ suppressionsCount - violationsCount;
182
+ }
183
+ }
184
+
185
+ // Mark as unused all the suppressions that were not matched against a rule
186
+ for (const ruleId in suppressions[relativeFilePath]) {
187
+ if (violationsByRule[ruleId]) {
188
+ continue;
189
+ }
190
+
191
+ unused[relativeFilePath] ??= {};
192
+ unused[relativeFilePath][ruleId] =
193
+ suppressions[relativeFilePath][ruleId];
194
+ }
195
+
196
+ // Recalculate stats if messages were suppressed
197
+ if (wasSuppressed) {
198
+ Object.assign(result, calculateStatsPerFile(result.messages));
199
+ }
200
+ }
201
+
202
+ return {
203
+ results: filtered,
204
+ unused,
205
+ };
206
+ }
207
+
208
+ /**
209
+ * Loads the suppressions file.
210
+ * @throws {Error} If the suppressions file cannot be parsed.
211
+ * @returns {Promise<SuppressedViolations>} The suppressions.
212
+ */
213
+ async load() {
214
+ try {
215
+ const data = await fs.promises.readFile(this.filePath, "utf8");
216
+
217
+ return JSON.parse(data);
218
+ } catch (err) {
219
+ if (err.code === "ENOENT") {
220
+ return {};
221
+ }
222
+ throw new Error(
223
+ `Failed to parse suppressions file at ${this.filePath}`,
224
+ {
225
+ cause: err,
226
+ },
227
+ );
228
+ }
229
+ }
230
+
231
+ /**
232
+ * Updates the suppressions file.
233
+ * @param {SuppressedViolations} suppressions The suppressions to save.
234
+ * @returns {Promise<void>}
235
+ * @private
236
+ */
237
+ save(suppressions) {
238
+ return fs.promises.writeFile(
239
+ this.filePath,
240
+ stringify(suppressions, { space: 2 }),
241
+ );
242
+ }
243
+
244
+ /**
245
+ * Counts the violations by rule, ignoring warnings.
246
+ * @param {LintMessage[]} messages The messages to count.
247
+ * @returns {Record<string, number>} The number of violations by rule.
248
+ */
249
+ static countViolationsByRule(messages) {
250
+ return messages.reduce((totals, message) => {
251
+ if (message.severity === 2 && message.ruleId) {
252
+ totals[message.ruleId] ??= { count: 0 };
253
+ totals[message.ruleId].count++;
254
+ }
255
+ return totals;
256
+ }, {});
257
+ }
258
+
259
+ /**
260
+ * Returns the relative path of a file to the current working directory.
261
+ * Always in POSIX format for consistency and interoperability.
262
+ * @param {string} filePath The file path.
263
+ * @returns {string} The relative file path.
264
+ */
265
+ getRelativeFilePath(filePath) {
266
+ return path
267
+ .relative(this.cwd, filePath)
268
+ .split(path.sep)
269
+ .join(path.posix.sep);
270
+ }
271
+
272
+ /**
273
+ * Moves the messages matching the rule to `LintResult#suppressedMessages` and updates the stats.
274
+ * @param {LintResult} result The result to update.
275
+ * @param {string} ruleId The rule to suppress.
276
+ * @returns {void}
277
+ */
278
+ static suppressMessagesByRule(result, ruleId) {
279
+ const suppressedMessages = result.messages.filter(
280
+ message => message.ruleId === ruleId,
281
+ );
282
+
283
+ result.suppressedMessages = result.suppressedMessages.concat(
284
+ suppressedMessages.map(message => {
285
+ message.suppressions = [
286
+ {
287
+ kind: "file",
288
+ justification: "",
289
+ },
290
+ ];
291
+
292
+ return message;
293
+ }),
294
+ );
295
+
296
+ result.messages = result.messages.filter(
297
+ message => message.ruleId !== ruleId,
298
+ );
299
+ }
300
+ }
301
+
302
+ module.exports = { SuppressionsService };
@@ -0,0 +1,87 @@
1
+ /**
2
+ * @fileoverview Emits warnings for ESLint.
3
+ * @author Francesco Trotta
4
+ */
5
+
6
+ "use strict";
7
+
8
+ //-----------------------------------------------------------------------------
9
+ // Exports
10
+ //-----------------------------------------------------------------------------
11
+
12
+ /**
13
+ * A service that emits warnings for ESLint.
14
+ */
15
+ class WarningService {
16
+ /**
17
+ * Creates a new instance of the service.
18
+ * @param {{ emitWarning?: ((warning: string, type: string) => void) | undefined }} [options] A function called internally to emit warnings using API provided by the runtime.
19
+ */
20
+ constructor({
21
+ emitWarning = globalThis.process?.emitWarning ?? (() => {}),
22
+ } = {}) {
23
+ this.emitWarning = emitWarning;
24
+ }
25
+
26
+ /**
27
+ * Emits a warning when circular fixes are detected while fixing a file.
28
+ * This method is used by the Linter and is safe to call outside Node.js.
29
+ * @param {string} filename The name of the file being fixed.
30
+ * @returns {void}
31
+ */
32
+ emitCircularFixesWarning(filename) {
33
+ this.emitWarning(
34
+ `Circular fixes detected while fixing ${filename}. It is likely that you have conflicting rules in your configuration.`,
35
+ "ESLintCircularFixesWarning",
36
+ );
37
+ }
38
+
39
+ /**
40
+ * Emits a warning when an empty config file has been loaded.
41
+ * @param {string} configFilePath The path to the config file.
42
+ * @returns {void}
43
+ */
44
+ emitEmptyConfigWarning(configFilePath) {
45
+ this.emitWarning(
46
+ `Running ESLint with an empty config (from ${configFilePath}). Please double-check that this is what you want. If you want to run ESLint with an empty config, export [{}] to remove this warning.`,
47
+ "ESLintEmptyConfigWarning",
48
+ );
49
+ }
50
+
51
+ /**
52
+ * Emits a warning when an ".eslintignore" file is found.
53
+ * @returns {void}
54
+ */
55
+ emitESLintIgnoreWarning() {
56
+ this.emitWarning(
57
+ 'The ".eslintignore" file is no longer supported. Switch to using the "ignores" property in "eslint.config.js": https://eslint.org/docs/latest/use/configure/migration-guide#ignoring-files',
58
+ "ESLintIgnoreWarning",
59
+ );
60
+ }
61
+
62
+ /**
63
+ * Emits a warning when an inactive flag is used.
64
+ * This method is used by the Linter and is safe to call outside Node.js.
65
+ * @param {string} flag The name of the flag.
66
+ * @param {string} message The warning message.
67
+ * @returns {void}
68
+ */
69
+ emitInactiveFlagWarning(flag, message) {
70
+ this.emitWarning(message, `ESLintInactiveFlag_${flag}`);
71
+ }
72
+
73
+ /**
74
+ * Emits a warning when a suboptimal concurrency setting is detected.
75
+ * Currently, this is only used to warn when the net linting ratio is low.
76
+ * @param {string} notice A notice about how to improve performance.
77
+ * @returns {void}
78
+ */
79
+ emitPoorConcurrencyWarning(notice) {
80
+ this.emitWarning(
81
+ `You may ${notice} to improve performance.`,
82
+ "ESLintPoorConcurrencyWarning",
83
+ );
84
+ }
85
+ }
86
+
87
+ module.exports = { WarningService };
@@ -0,0 +1,34 @@
1
+ /**
2
+ * @fileoverview The instance of Ajv validator.
3
+ * @author Evgeny Poberezkin
4
+ */
5
+ "use strict";
6
+
7
+ //------------------------------------------------------------------------------
8
+ // Requirements
9
+ //------------------------------------------------------------------------------
10
+
11
+ const Ajv = require("ajv"),
12
+ metaSchema = require("ajv/lib/refs/json-schema-draft-04.json");
13
+
14
+ //------------------------------------------------------------------------------
15
+ // Public Interface
16
+ //------------------------------------------------------------------------------
17
+
18
+ module.exports = (additionalOptions = {}) => {
19
+ const ajv = new Ajv({
20
+ meta: false,
21
+ useDefaults: true,
22
+ validateSchema: false,
23
+ missingRefs: "ignore",
24
+ verbose: true,
25
+ schemaId: "auto",
26
+ ...additionalOptions,
27
+ });
28
+
29
+ ajv.addMetaSchema(metaSchema);
30
+ // eslint-disable-next-line no-underscore-dangle -- Ajv's API
31
+ ajv._opts.defaultMeta = metaSchema.id;
32
+
33
+ return ajv;
34
+ };
@@ -0,0 +1,21 @@
1
+ /**
2
+ * @fileoverview Assertion utilities equivalent to the Node.js node:asserts module.
3
+ * @author Josh Goldberg
4
+ */
5
+
6
+ "use strict";
7
+
8
+ /**
9
+ * Throws an error if the input is not truthy.
10
+ * @param {unknown} value The input that is checked for being truthy.
11
+ * @param {string} message Message to throw if the input is not truthy.
12
+ * @returns {void}
13
+ * @throws {Error} When the condition is not truthy.
14
+ */
15
+ function ok(value, message = "Assertion failed.") {
16
+ if (!value) {
17
+ throw new Error(message);
18
+ }
19
+ }
20
+
21
+ module.exports = ok;
@@ -0,0 +1,30 @@
1
+ /**
2
+ * @fileoverview Common utils for AST.
3
+ *
4
+ * This file contains only shared items for core and rules.
5
+ * If you make a utility for rules, please see `../rules/utils/ast-utils.js`.
6
+ *
7
+ * @author Toru Nagashima <https://github.com/mysticatea>
8
+ */
9
+ "use strict";
10
+
11
+ const breakableTypePattern =
12
+ /^(?:(?:Do)?While|For(?:In|Of)?|Switch)Statement$/u;
13
+ const lineBreakPattern = /\r\n|[\r\n\u2028\u2029]/u;
14
+ const shebangPattern = /^#!([^\r\n]+)/u;
15
+
16
+ /**
17
+ * Creates a version of the `lineBreakPattern` regex with the global flag.
18
+ * Global regexes are mutable, so this needs to be a function instead of a constant.
19
+ * @returns {RegExp} A global regular expression that matches line terminators
20
+ */
21
+ function createGlobalLinebreakMatcher() {
22
+ return new RegExp(lineBreakPattern.source, "gu");
23
+ }
24
+
25
+ module.exports = {
26
+ breakableTypePattern,
27
+ lineBreakPattern,
28
+ createGlobalLinebreakMatcher,
29
+ shebangPattern,
30
+ };
@@ -0,0 +1,62 @@
1
+ /**
2
+ * @fileoverview Applies default rule options
3
+ * @author JoshuaKGoldberg
4
+ */
5
+
6
+ "use strict";
7
+
8
+ /**
9
+ * Check if the variable contains an object strictly rejecting arrays
10
+ * @param {unknown} value an object
11
+ * @returns {boolean} Whether value is an object
12
+ */
13
+ function isObjectNotArray(value) {
14
+ return typeof value === "object" && value !== null && !Array.isArray(value);
15
+ }
16
+
17
+ /**
18
+ * Deeply merges second on top of first, creating a new {} object if needed.
19
+ * @param {T} first Base, default value.
20
+ * @param {U} second User-specified value.
21
+ * @returns {T | U | (T & U)} Merged equivalent of second on top of first.
22
+ */
23
+ function deepMergeObjects(first, second) {
24
+ if (second === void 0) {
25
+ return first;
26
+ }
27
+
28
+ if (!isObjectNotArray(first) || !isObjectNotArray(second)) {
29
+ return second;
30
+ }
31
+
32
+ const result = { ...first, ...second };
33
+
34
+ for (const key of Object.keys(second)) {
35
+ if (Object.prototype.propertyIsEnumerable.call(first, key)) {
36
+ result[key] = deepMergeObjects(first[key], second[key]);
37
+ }
38
+ }
39
+
40
+ return result;
41
+ }
42
+
43
+ /**
44
+ * Deeply merges second on top of first, creating a new [] array if needed.
45
+ * @param {T[]} first Base, default values.
46
+ * @param {U[]} second User-specified values.
47
+ * @returns {(T | U | (T & U))[]} Merged equivalent of second on top of first.
48
+ */
49
+ function deepMergeArrays(first, second) {
50
+ if (!first || !second) {
51
+ return second || first || [];
52
+ }
53
+
54
+ return [
55
+ ...first.map((value, i) =>
56
+ deepMergeObjects(value, i < second.length ? second[i] : void 0),
57
+ ),
58
+ ...second.slice(first.length),
59
+ ];
60
+ }
61
+
62
+ module.exports = { deepMergeArrays };
@@ -0,0 +1,16 @@
1
+ /**
2
+ * @fileoverview Common utils for directives.
3
+ *
4
+ * This file contains only shared items for directives.
5
+ * If you make a utility for rules, please see `../rules/utils/ast-utils.js`.
6
+ *
7
+ * @author gfyoung <https://github.com/gfyoung>
8
+ */
9
+ "use strict";
10
+
11
+ const directivesPattern =
12
+ /^(eslint(?:-env|-enable|-disable(?:(?:-next)?-line)?)?|exported|globals?)(?:\s|$)/u;
13
+
14
+ module.exports = {
15
+ directivesPattern,
16
+ };
@@ -0,0 +1,89 @@
1
+ /**
2
+ * @fileoverview Shared flags for ESLint.
3
+ */
4
+
5
+ "use strict";
6
+
7
+ //------------------------------------------------------------------------------
8
+ // Typedefs
9
+ //------------------------------------------------------------------------------
10
+
11
+ /**
12
+ * @typedef {Object} InactiveFlagData
13
+ * @property {string} description Flag description
14
+ * @property {string | null} [replacedBy] Can be either:
15
+ * - An active flag (string) that enables the same feature.
16
+ * - `null` if the feature is now enabled by default.
17
+ * - Omitted if the feature has been abandoned.
18
+ */
19
+
20
+ //-----------------------------------------------------------------------------
21
+ // Exports
22
+ //-----------------------------------------------------------------------------
23
+
24
+ /**
25
+ * The set of flags that change ESLint behavior with a description.
26
+ * @type {Map<string, string>}
27
+ */
28
+ const activeFlags = new Map([
29
+ ["test_only", "Used only for testing."],
30
+ ["test_only_2", "Used only for testing."],
31
+ [
32
+ "unstable_native_nodejs_ts_config",
33
+ "Use native Node.js to load TypeScript configuration.",
34
+ ],
35
+ ]);
36
+
37
+ /**
38
+ * The set of flags that used to be active.
39
+ * @type {Map<string, InactiveFlagData>}
40
+ */
41
+ const inactiveFlags = new Map([
42
+ [
43
+ "test_only_replaced",
44
+ {
45
+ description:
46
+ "Used only for testing flags that have been replaced by other flags.",
47
+ replacedBy: "test_only",
48
+ },
49
+ ],
50
+ [
51
+ "test_only_enabled_by_default",
52
+ {
53
+ description:
54
+ "Used only for testing flags whose features have been enabled by default.",
55
+ replacedBy: null,
56
+ },
57
+ ],
58
+ [
59
+ "test_only_abandoned",
60
+ {
61
+ description:
62
+ "Used only for testing flags whose features have been abandoned.",
63
+ },
64
+ ],
65
+ ]);
66
+
67
+ /**
68
+ * Creates a message that describes the reason the flag is inactive.
69
+ * @param {InactiveFlagData} inactiveFlagData Data for the inactive flag.
70
+ * @returns {string} Message describing the reason the flag is inactive.
71
+ */
72
+ function getInactivityReasonMessage({ replacedBy }) {
73
+ if (typeof replacedBy === "undefined") {
74
+ return "This feature has been abandoned.";
75
+ }
76
+
77
+ if (typeof replacedBy === "string") {
78
+ return `This flag has been renamed '${replacedBy}' to reflect its stabilization. Please use '${replacedBy}' instead.`;
79
+ }
80
+
81
+ // null
82
+ return "This feature is now enabled by default.";
83
+ }
84
+
85
+ module.exports = {
86
+ activeFlags,
87
+ inactiveFlags,
88
+ getInactivityReasonMessage,
89
+ };
@@ -0,0 +1,38 @@
1
+ /**
2
+ * @fileoverview Handle logging for ESLint
3
+ * @author Gyandeep Singh
4
+ */
5
+
6
+ "use strict";
7
+
8
+ /* eslint no-console: "off" -- Logging util */
9
+
10
+ /* c8 ignore next */
11
+ module.exports = {
12
+ /**
13
+ * Cover for console.info
14
+ * @param {...any} args The elements to log.
15
+ * @returns {void}
16
+ */
17
+ info(...args) {
18
+ console.log(...args);
19
+ },
20
+
21
+ /**
22
+ * Cover for console.warn
23
+ * @param {...any} args The elements to log.
24
+ * @returns {void}
25
+ */
26
+ warn(...args) {
27
+ console.warn(...args);
28
+ },
29
+
30
+ /**
31
+ * Cover for console.error
32
+ * @param {...any} args The elements to log.
33
+ * @returns {void}
34
+ */
35
+ error(...args) {
36
+ console.error(...args);
37
+ },
38
+ };