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,652 @@
1
+ /**
2
+ * @fileoverview Rule to enforce concise object methods and properties.
3
+ * @author Jamund Ferguson
4
+ */
5
+
6
+ "use strict";
7
+
8
+ const OPTIONS = {
9
+ always: "always",
10
+ never: "never",
11
+ methods: "methods",
12
+ properties: "properties",
13
+ consistent: "consistent",
14
+ consistentAsNeeded: "consistent-as-needed",
15
+ };
16
+
17
+ //------------------------------------------------------------------------------
18
+ // Requirements
19
+ //------------------------------------------------------------------------------
20
+ const astUtils = require("./utils/ast-utils");
21
+
22
+ //--------------------------------------------------------------------------
23
+ // Helpers
24
+ //--------------------------------------------------------------------------
25
+ const CTOR_PREFIX_REGEX = /[^_$0-9]/u;
26
+ const JSDOC_COMMENT_REGEX = /^\s*\*/u;
27
+
28
+ /**
29
+ * Determines if the first character of the name is a capital letter.
30
+ * @param {string} name The name of the node to evaluate.
31
+ * @returns {boolean} True if the first character of the property name is a capital letter, false if not.
32
+ * @private
33
+ */
34
+ function isConstructor(name) {
35
+ const match = CTOR_PREFIX_REGEX.exec(name);
36
+
37
+ // Not a constructor if name has no characters apart from '_', '$' and digits e.g. '_', '$$', '_8'
38
+ if (!match) {
39
+ return false;
40
+ }
41
+
42
+ const firstChar = name.charAt(match.index);
43
+
44
+ return firstChar === firstChar.toUpperCase();
45
+ }
46
+
47
+ /**
48
+ * Determines if the property can have a shorthand form.
49
+ * @param {ASTNode} property Property AST node
50
+ * @returns {boolean} True if the property can have a shorthand form
51
+ * @private
52
+ */
53
+ function canHaveShorthand(property) {
54
+ return (
55
+ property.kind !== "set" &&
56
+ property.kind !== "get" &&
57
+ property.type !== "SpreadElement" &&
58
+ property.type !== "SpreadProperty" &&
59
+ property.type !== "ExperimentalSpreadProperty"
60
+ );
61
+ }
62
+
63
+ /**
64
+ * Checks whether a node is a string literal.
65
+ * @param {ASTNode} node Any AST node.
66
+ * @returns {boolean} `true` if it is a string literal.
67
+ */
68
+ function isStringLiteral(node) {
69
+ return node.type === "Literal" && typeof node.value === "string";
70
+ }
71
+
72
+ /**
73
+ * Determines if the property is a shorthand or not.
74
+ * @param {ASTNode} property Property AST node
75
+ * @returns {boolean} True if the property is considered shorthand, false if not.
76
+ * @private
77
+ */
78
+ function isShorthand(property) {
79
+ // property.method is true when `{a(){}}`.
80
+ return property.shorthand || property.method;
81
+ }
82
+
83
+ /**
84
+ * Determines if the property's key and method or value are named equally.
85
+ * @param {ASTNode} property Property AST node
86
+ * @returns {boolean} True if the key and value are named equally, false if not.
87
+ * @private
88
+ */
89
+ function isRedundant(property) {
90
+ const value = property.value;
91
+
92
+ if (value.type === "FunctionExpression") {
93
+ return !value.id; // Only anonymous should be shorthand method.
94
+ }
95
+ if (value.type === "Identifier") {
96
+ return astUtils.getStaticPropertyName(property) === value.name;
97
+ }
98
+
99
+ return false;
100
+ }
101
+
102
+ //------------------------------------------------------------------------------
103
+ // Rule Definition
104
+ //------------------------------------------------------------------------------
105
+ /** @type {import('../types').Rule.RuleModule} */
106
+ module.exports = {
107
+ meta: {
108
+ type: "suggestion",
109
+
110
+ docs: {
111
+ description:
112
+ "Require or disallow method and property shorthand syntax for object literals",
113
+ recommended: false,
114
+ frozen: true,
115
+ url: "https://eslint.org/docs/latest/rules/object-shorthand",
116
+ },
117
+
118
+ fixable: "code",
119
+
120
+ schema: {
121
+ anyOf: [
122
+ {
123
+ type: "array",
124
+ items: [
125
+ {
126
+ enum: [
127
+ "always",
128
+ "methods",
129
+ "properties",
130
+ "never",
131
+ "consistent",
132
+ "consistent-as-needed",
133
+ ],
134
+ },
135
+ ],
136
+ minItems: 0,
137
+ maxItems: 1,
138
+ },
139
+ {
140
+ type: "array",
141
+ items: [
142
+ {
143
+ enum: ["always", "methods", "properties"],
144
+ },
145
+ {
146
+ type: "object",
147
+ properties: {
148
+ avoidQuotes: {
149
+ type: "boolean",
150
+ },
151
+ },
152
+ additionalProperties: false,
153
+ },
154
+ ],
155
+ minItems: 0,
156
+ maxItems: 2,
157
+ },
158
+ {
159
+ type: "array",
160
+ items: [
161
+ {
162
+ enum: ["always", "methods"],
163
+ },
164
+ {
165
+ type: "object",
166
+ properties: {
167
+ ignoreConstructors: {
168
+ type: "boolean",
169
+ },
170
+ methodsIgnorePattern: {
171
+ type: "string",
172
+ },
173
+ avoidQuotes: {
174
+ type: "boolean",
175
+ },
176
+ avoidExplicitReturnArrows: {
177
+ type: "boolean",
178
+ },
179
+ },
180
+ additionalProperties: false,
181
+ },
182
+ ],
183
+ minItems: 0,
184
+ maxItems: 2,
185
+ },
186
+ ],
187
+ },
188
+
189
+ messages: {
190
+ expectedAllPropertiesShorthanded:
191
+ "Expected shorthand for all properties.",
192
+ expectedLiteralMethodLongform:
193
+ "Expected longform method syntax for string literal keys.",
194
+ expectedPropertyShorthand: "Expected property shorthand.",
195
+ expectedPropertyLongform: "Expected longform property syntax.",
196
+ expectedMethodShorthand: "Expected method shorthand.",
197
+ expectedMethodLongform: "Expected longform method syntax.",
198
+ unexpectedMix:
199
+ "Unexpected mix of shorthand and non-shorthand properties.",
200
+ },
201
+ },
202
+
203
+ create(context) {
204
+ const APPLY = context.options[0] || OPTIONS.always;
205
+ const APPLY_TO_METHODS =
206
+ APPLY === OPTIONS.methods || APPLY === OPTIONS.always;
207
+ const APPLY_TO_PROPS =
208
+ APPLY === OPTIONS.properties || APPLY === OPTIONS.always;
209
+ const APPLY_NEVER = APPLY === OPTIONS.never;
210
+ const APPLY_CONSISTENT = APPLY === OPTIONS.consistent;
211
+ const APPLY_CONSISTENT_AS_NEEDED = APPLY === OPTIONS.consistentAsNeeded;
212
+
213
+ const PARAMS = context.options[1] || {};
214
+ const IGNORE_CONSTRUCTORS = PARAMS.ignoreConstructors;
215
+ const METHODS_IGNORE_PATTERN = PARAMS.methodsIgnorePattern
216
+ ? new RegExp(PARAMS.methodsIgnorePattern, "u")
217
+ : null;
218
+ const AVOID_QUOTES = PARAMS.avoidQuotes;
219
+ const AVOID_EXPLICIT_RETURN_ARROWS = !!PARAMS.avoidExplicitReturnArrows;
220
+ const sourceCode = context.sourceCode;
221
+
222
+ /**
223
+ * Ensures that an object's properties are consistently shorthand, or not shorthand at all.
224
+ * @param {ASTNode} node Property AST node
225
+ * @param {boolean} checkRedundancy Whether to check longform redundancy
226
+ * @returns {void}
227
+ */
228
+ function checkConsistency(node, checkRedundancy) {
229
+ // We are excluding getters/setters and spread properties as they are considered neither longform nor shorthand.
230
+ const properties = node.properties.filter(canHaveShorthand);
231
+
232
+ // Do we still have properties left after filtering the getters and setters?
233
+ if (properties.length > 0) {
234
+ const shorthandProperties = properties.filter(isShorthand);
235
+
236
+ /*
237
+ * If we do not have an equal number of longform properties as
238
+ * shorthand properties, we are using the annotations inconsistently
239
+ */
240
+ if (shorthandProperties.length !== properties.length) {
241
+ // We have at least 1 shorthand property
242
+ if (shorthandProperties.length > 0) {
243
+ context.report({ node, messageId: "unexpectedMix" });
244
+ } else if (checkRedundancy) {
245
+ /*
246
+ * If all properties of the object contain a method or value with a name matching it's key,
247
+ * all the keys are redundant.
248
+ */
249
+ const canAlwaysUseShorthand =
250
+ properties.every(isRedundant);
251
+
252
+ if (canAlwaysUseShorthand) {
253
+ context.report({
254
+ node,
255
+ messageId: "expectedAllPropertiesShorthanded",
256
+ });
257
+ }
258
+ }
259
+ }
260
+ }
261
+ }
262
+
263
+ /**
264
+ * Fixes a FunctionExpression node by making it into a shorthand property.
265
+ * @param {SourceCodeFixer} fixer The fixer object
266
+ * @param {ASTNode} node A `Property` node that has a `FunctionExpression` or `ArrowFunctionExpression` as its value
267
+ * @returns {Object} A fix for this node
268
+ */
269
+ function makeFunctionShorthand(fixer, node) {
270
+ const firstKeyToken = node.computed
271
+ ? sourceCode.getFirstToken(node, astUtils.isOpeningBracketToken)
272
+ : sourceCode.getFirstToken(node.key);
273
+ const lastKeyToken = node.computed
274
+ ? sourceCode.getFirstTokenBetween(
275
+ node.key,
276
+ node.value,
277
+ astUtils.isClosingBracketToken,
278
+ )
279
+ : sourceCode.getLastToken(node.key);
280
+ const keyText = sourceCode.text.slice(
281
+ firstKeyToken.range[0],
282
+ lastKeyToken.range[1],
283
+ );
284
+ let keyPrefix = "";
285
+
286
+ // key: /* */ () => {}
287
+ if (sourceCode.commentsExistBetween(lastKeyToken, node.value)) {
288
+ return null;
289
+ }
290
+
291
+ if (node.value.async) {
292
+ keyPrefix += "async ";
293
+ }
294
+ if (node.value.generator) {
295
+ keyPrefix += "*";
296
+ }
297
+
298
+ const fixRange = [firstKeyToken.range[0], node.range[1]];
299
+ const methodPrefix = keyPrefix + keyText;
300
+
301
+ if (node.value.type === "FunctionExpression") {
302
+ const functionToken = sourceCode
303
+ .getTokens(node.value)
304
+ .find(
305
+ token =>
306
+ token.type === "Keyword" &&
307
+ token.value === "function",
308
+ );
309
+ const tokenBeforeParams = node.value.generator
310
+ ? sourceCode.getTokenAfter(functionToken)
311
+ : functionToken;
312
+
313
+ return fixer.replaceTextRange(
314
+ fixRange,
315
+ methodPrefix +
316
+ sourceCode.text.slice(
317
+ tokenBeforeParams.range[1],
318
+ node.value.range[1],
319
+ ),
320
+ );
321
+ }
322
+
323
+ const arrowToken = sourceCode.getTokenBefore(
324
+ node.value.body,
325
+ astUtils.isArrowToken,
326
+ );
327
+ const fnBody = sourceCode.text.slice(
328
+ arrowToken.range[1],
329
+ node.value.range[1],
330
+ );
331
+
332
+ // First token should not be `async`
333
+ const firstValueToken = sourceCode.getFirstToken(node.value, {
334
+ skip: node.value.async ? 1 : 0,
335
+ });
336
+
337
+ const sliceStart = firstValueToken.range[0];
338
+ const sliceEnd = sourceCode.getTokenBefore(arrowToken).range[1];
339
+ const shouldAddParens =
340
+ node.value.params.length === 1 &&
341
+ node.value.params[0].range[0] === sliceStart;
342
+
343
+ const oldParamText = sourceCode.text.slice(sliceStart, sliceEnd);
344
+ const newParamText = shouldAddParens
345
+ ? `(${oldParamText})`
346
+ : oldParamText;
347
+
348
+ return fixer.replaceTextRange(
349
+ fixRange,
350
+ methodPrefix + newParamText + fnBody,
351
+ );
352
+ }
353
+
354
+ /**
355
+ * Fixes a FunctionExpression node by making it into a longform property.
356
+ * @param {SourceCodeFixer} fixer The fixer object
357
+ * @param {ASTNode} node A `Property` node that has a `FunctionExpression` as its value
358
+ * @returns {Object} A fix for this node
359
+ */
360
+ function makeFunctionLongform(fixer, node) {
361
+ const firstKeyToken = node.computed
362
+ ? sourceCode.getTokens(node).find(token => token.value === "[")
363
+ : sourceCode.getFirstToken(node.key);
364
+ const lastKeyToken = node.computed
365
+ ? sourceCode
366
+ .getTokensBetween(node.key, node.value)
367
+ .find(token => token.value === "]")
368
+ : sourceCode.getLastToken(node.key);
369
+ const keyText = sourceCode.text.slice(
370
+ firstKeyToken.range[0],
371
+ lastKeyToken.range[1],
372
+ );
373
+ let functionHeader = "function";
374
+
375
+ if (node.value.async) {
376
+ functionHeader = `async ${functionHeader}`;
377
+ }
378
+ if (node.value.generator) {
379
+ functionHeader = `${functionHeader}*`;
380
+ }
381
+
382
+ return fixer.replaceTextRange(
383
+ [node.range[0], lastKeyToken.range[1]],
384
+ `${keyText}: ${functionHeader}`,
385
+ );
386
+ }
387
+
388
+ /*
389
+ * To determine whether a given arrow function has a lexical identifier (`this`, `arguments`, `super`, or `new.target`),
390
+ * create a stack of functions that define these identifiers (i.e. all functions except arrow functions) as the AST is
391
+ * traversed. Whenever a new function is encountered, create a new entry on the stack (corresponding to a different lexical
392
+ * scope of `this`), and whenever a function is exited, pop that entry off the stack. When an arrow function is entered,
393
+ * keep a reference to it on the current stack entry, and remove that reference when the arrow function is exited.
394
+ * When a lexical identifier is encountered, mark all the arrow functions on the current stack entry by adding them
395
+ * to an `arrowsWithLexicalIdentifiers` set. Any arrow function in that set will not be reported by this rule,
396
+ * because converting it into a method would change the value of one of the lexical identifiers.
397
+ */
398
+ const lexicalScopeStack = [];
399
+ const arrowsWithLexicalIdentifiers = new WeakSet();
400
+ const argumentsIdentifiers = new WeakSet();
401
+
402
+ /**
403
+ * Enters a function. This creates a new lexical identifier scope, so a new Set of arrow functions is pushed onto the stack.
404
+ * Also, this marks all `arguments` identifiers so that they can be detected later.
405
+ * @param {ASTNode} node The node representing the function.
406
+ * @returns {void}
407
+ */
408
+ function enterFunction(node) {
409
+ lexicalScopeStack.unshift(new Set());
410
+ sourceCode
411
+ .getScope(node)
412
+ .variables.filter(variable => variable.name === "arguments")
413
+ .forEach(variable => {
414
+ variable.references
415
+ .map(ref => ref.identifier)
416
+ .forEach(identifier =>
417
+ argumentsIdentifiers.add(identifier),
418
+ );
419
+ });
420
+ }
421
+
422
+ /**
423
+ * Exits a function. This pops the current set of arrow functions off the lexical scope stack.
424
+ * @returns {void}
425
+ */
426
+ function exitFunction() {
427
+ lexicalScopeStack.shift();
428
+ }
429
+
430
+ /**
431
+ * Marks the current function as having a lexical keyword. This implies that all arrow functions
432
+ * in the current lexical scope contain a reference to this lexical keyword.
433
+ * @returns {void}
434
+ */
435
+ function reportLexicalIdentifier() {
436
+ lexicalScopeStack[0].forEach(arrowFunction =>
437
+ arrowsWithLexicalIdentifiers.add(arrowFunction),
438
+ );
439
+ }
440
+
441
+ //--------------------------------------------------------------------------
442
+ // Public
443
+ //--------------------------------------------------------------------------
444
+
445
+ return {
446
+ Program: enterFunction,
447
+ FunctionDeclaration: enterFunction,
448
+ FunctionExpression: enterFunction,
449
+ "Program:exit": exitFunction,
450
+ "FunctionDeclaration:exit": exitFunction,
451
+ "FunctionExpression:exit": exitFunction,
452
+
453
+ ArrowFunctionExpression(node) {
454
+ lexicalScopeStack[0].add(node);
455
+ },
456
+ "ArrowFunctionExpression:exit"(node) {
457
+ lexicalScopeStack[0].delete(node);
458
+ },
459
+
460
+ ThisExpression: reportLexicalIdentifier,
461
+ Super: reportLexicalIdentifier,
462
+ MetaProperty(node) {
463
+ if (
464
+ node.meta.name === "new" &&
465
+ node.property.name === "target"
466
+ ) {
467
+ reportLexicalIdentifier();
468
+ }
469
+ },
470
+ Identifier(node) {
471
+ if (argumentsIdentifiers.has(node)) {
472
+ reportLexicalIdentifier();
473
+ }
474
+ },
475
+
476
+ ObjectExpression(node) {
477
+ if (APPLY_CONSISTENT) {
478
+ checkConsistency(node, false);
479
+ } else if (APPLY_CONSISTENT_AS_NEEDED) {
480
+ checkConsistency(node, true);
481
+ }
482
+ },
483
+
484
+ "Property:exit"(node) {
485
+ const isConciseProperty = node.method || node.shorthand;
486
+
487
+ // Ignore destructuring assignment
488
+ if (node.parent.type === "ObjectPattern") {
489
+ return;
490
+ }
491
+
492
+ // getters and setters are ignored
493
+ if (node.kind === "get" || node.kind === "set") {
494
+ return;
495
+ }
496
+
497
+ // only computed methods can fail the following checks
498
+ if (
499
+ node.computed &&
500
+ node.value.type !== "FunctionExpression" &&
501
+ node.value.type !== "ArrowFunctionExpression"
502
+ ) {
503
+ return;
504
+ }
505
+
506
+ //--------------------------------------------------------------
507
+ // Checks for property/method shorthand.
508
+ if (isConciseProperty) {
509
+ if (
510
+ node.method &&
511
+ (APPLY_NEVER ||
512
+ (AVOID_QUOTES && isStringLiteral(node.key)))
513
+ ) {
514
+ const messageId = APPLY_NEVER
515
+ ? "expectedMethodLongform"
516
+ : "expectedLiteralMethodLongform";
517
+
518
+ // { x() {} } should be written as { x: function() {} }
519
+ context.report({
520
+ node,
521
+ messageId,
522
+ fix: fixer => makeFunctionLongform(fixer, node),
523
+ });
524
+ } else if (APPLY_NEVER) {
525
+ // { x } should be written as { x: x }
526
+ context.report({
527
+ node,
528
+ messageId: "expectedPropertyLongform",
529
+ fix: fixer =>
530
+ fixer.insertTextAfter(
531
+ node.key,
532
+ `: ${node.key.name}`,
533
+ ),
534
+ });
535
+ }
536
+ } else if (
537
+ APPLY_TO_METHODS &&
538
+ !node.value.id &&
539
+ (node.value.type === "FunctionExpression" ||
540
+ node.value.type === "ArrowFunctionExpression")
541
+ ) {
542
+ if (
543
+ IGNORE_CONSTRUCTORS &&
544
+ node.key.type === "Identifier" &&
545
+ isConstructor(node.key.name)
546
+ ) {
547
+ return;
548
+ }
549
+
550
+ if (METHODS_IGNORE_PATTERN) {
551
+ const propertyName =
552
+ astUtils.getStaticPropertyName(node);
553
+
554
+ if (
555
+ propertyName !== null &&
556
+ METHODS_IGNORE_PATTERN.test(propertyName)
557
+ ) {
558
+ return;
559
+ }
560
+ }
561
+
562
+ if (AVOID_QUOTES && isStringLiteral(node.key)) {
563
+ return;
564
+ }
565
+
566
+ // {[x]: function(){}} should be written as {[x]() {}}
567
+ if (
568
+ node.value.type === "FunctionExpression" ||
569
+ (node.value.type === "ArrowFunctionExpression" &&
570
+ node.value.body.type === "BlockStatement" &&
571
+ AVOID_EXPLICIT_RETURN_ARROWS &&
572
+ !arrowsWithLexicalIdentifiers.has(node.value))
573
+ ) {
574
+ context.report({
575
+ node,
576
+ messageId: "expectedMethodShorthand",
577
+ fix: fixer => makeFunctionShorthand(fixer, node),
578
+ });
579
+ }
580
+ } else if (
581
+ node.value.type === "Identifier" &&
582
+ node.key.name === node.value.name &&
583
+ APPLY_TO_PROPS
584
+ ) {
585
+ // Skip if there are JSDoc comments inside the property (e.g., JSDoc type annotations)
586
+ const comments = sourceCode.getCommentsInside(node);
587
+ if (
588
+ comments.some(
589
+ comment =>
590
+ comment.type === "Block" &&
591
+ JSDOC_COMMENT_REGEX.test(comment.value) &&
592
+ comment.value.includes("@type"),
593
+ )
594
+ ) {
595
+ return;
596
+ }
597
+
598
+ // {x: x} should be written as {x}
599
+ context.report({
600
+ node,
601
+ messageId: "expectedPropertyShorthand",
602
+ fix(fixer) {
603
+ // x: /* */ x
604
+ // x: (/* */ x)
605
+ if (sourceCode.getCommentsInside(node).length > 0) {
606
+ return null;
607
+ }
608
+
609
+ return fixer.replaceText(node, node.value.name);
610
+ },
611
+ });
612
+ } else if (
613
+ node.value.type === "Identifier" &&
614
+ node.key.type === "Literal" &&
615
+ node.key.value === node.value.name &&
616
+ APPLY_TO_PROPS
617
+ ) {
618
+ if (AVOID_QUOTES) {
619
+ return;
620
+ }
621
+
622
+ const comments = sourceCode.getCommentsInside(node);
623
+ if (
624
+ comments.some(
625
+ comment =>
626
+ comment.type === "Block" &&
627
+ comment.value.startsWith("*") &&
628
+ comment.value.includes("@type"),
629
+ )
630
+ ) {
631
+ return;
632
+ }
633
+
634
+ // {"x": x} should be written as {x}
635
+ context.report({
636
+ node,
637
+ messageId: "expectedPropertyShorthand",
638
+ fix(fixer) {
639
+ // "x": /* */ x
640
+ // "x": (/* */ x)
641
+ if (sourceCode.getCommentsInside(node).length > 0) {
642
+ return null;
643
+ }
644
+
645
+ return fixer.replaceText(node, node.value.name);
646
+ },
647
+ });
648
+ }
649
+ },
650
+ };
651
+ },
652
+ };