eslint 9.21.0 → 9.23.0
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.
- package/README.md +52 -48
- package/bin/eslint.js +92 -90
- package/conf/default-cli-options.js +22 -22
- package/conf/ecma-version.js +1 -1
- package/conf/globals.js +97 -98
- package/conf/replacements.json +24 -20
- package/conf/rule-type-list.json +88 -92
- package/lib/api.js +12 -12
- package/lib/cli-engine/cli-engine.js +828 -808
- package/lib/cli-engine/file-enumerator.js +381 -387
- package/lib/cli-engine/formatters/formatters-meta.json +16 -16
- package/lib/cli-engine/formatters/html.js +107 -99
- package/lib/cli-engine/formatters/json-with-metadata.js +5 -5
- package/lib/cli-engine/formatters/json.js +2 -2
- package/lib/cli-engine/formatters/stylish.js +96 -75
- package/lib/cli-engine/hash.js +1 -1
- package/lib/cli-engine/index.js +1 -1
- package/lib/cli-engine/lint-result-cache.js +144 -145
- package/lib/cli-engine/load-rules.js +16 -16
- package/lib/cli.js +541 -457
- package/lib/config/config-loader.js +648 -618
- package/lib/config/config.js +247 -221
- package/lib/config/default-config.js +54 -45
- package/lib/config/flat-config-array.js +167 -172
- package/lib/config/flat-config-helpers.js +65 -68
- package/lib/config/flat-config-schema.js +375 -368
- package/lib/config/rule-validator.js +139 -144
- package/lib/config-api.js +12 -0
- package/lib/eslint/eslint-helpers.js +709 -679
- package/lib/eslint/eslint.js +944 -886
- package/lib/eslint/index.js +2 -2
- package/lib/eslint/legacy-eslint.js +576 -532
- package/lib/languages/js/index.js +263 -264
- package/lib/languages/js/source-code/index.js +1 -1
- package/lib/languages/js/source-code/source-code.js +1129 -1054
- package/lib/languages/js/source-code/token-store/backward-token-comment-cursor.js +39 -35
- package/lib/languages/js/source-code/token-store/backward-token-cursor.js +35 -36
- package/lib/languages/js/source-code/token-store/cursor.js +36 -36
- package/lib/languages/js/source-code/token-store/cursors.js +80 -52
- package/lib/languages/js/source-code/token-store/decorative-cursor.js +17 -18
- package/lib/languages/js/source-code/token-store/filter-cursor.js +19 -20
- package/lib/languages/js/source-code/token-store/forward-token-comment-cursor.js +40 -32
- package/lib/languages/js/source-code/token-store/forward-token-cursor.js +40 -41
- package/lib/languages/js/source-code/token-store/index.js +592 -498
- package/lib/languages/js/source-code/token-store/limit-cursor.js +17 -18
- package/lib/languages/js/source-code/token-store/padded-token-cursor.js +23 -16
- package/lib/languages/js/source-code/token-store/skip-cursor.js +19 -20
- package/lib/languages/js/source-code/token-store/utils.js +63 -60
- package/lib/languages/js/validate-language-options.js +104 -89
- package/lib/linter/apply-disable-directives.js +467 -383
- package/lib/linter/code-path-analysis/code-path-analyzer.js +650 -672
- package/lib/linter/code-path-analysis/code-path-segment.js +215 -216
- package/lib/linter/code-path-analysis/code-path-state.js +2118 -2096
- package/lib/linter/code-path-analysis/code-path.js +307 -319
- package/lib/linter/code-path-analysis/debug-helpers.js +183 -163
- package/lib/linter/code-path-analysis/fork-context.js +296 -271
- package/lib/linter/code-path-analysis/id-generator.js +22 -23
- package/lib/linter/file-context.js +119 -120
- package/lib/linter/index.js +3 -3
- package/lib/linter/interpolate.js +16 -16
- package/lib/linter/linter.js +2402 -2044
- package/lib/linter/node-event-generator.js +284 -225
- package/lib/linter/report-translator.js +256 -219
- package/lib/linter/rule-fixer.js +122 -124
- package/lib/linter/rules.js +35 -35
- package/lib/linter/safe-emitter.js +18 -18
- package/lib/linter/source-code-fixer.js +94 -92
- package/lib/linter/timing.js +104 -101
- package/lib/linter/vfile.js +70 -73
- package/lib/options.js +375 -361
- package/lib/rule-tester/index.js +1 -1
- package/lib/rule-tester/rule-tester.js +1307 -1045
- package/lib/rules/accessor-pairs.js +297 -262
- package/lib/rules/array-bracket-newline.js +249 -237
- package/lib/rules/array-bracket-spacing.js +262 -223
- package/lib/rules/array-callback-return.js +401 -355
- package/lib/rules/array-element-newline.js +357 -312
- package/lib/rules/arrow-body-style.js +399 -280
- package/lib/rules/arrow-parens.js +205 -172
- package/lib/rules/arrow-spacing.js +168 -162
- package/lib/rules/block-scoped-var.js +124 -122
- package/lib/rules/block-spacing.js +185 -175
- package/lib/rules/brace-style.js +261 -198
- package/lib/rules/callback-return.js +202 -189
- package/lib/rules/camelcase.js +402 -391
- package/lib/rules/capitalized-comments.js +252 -231
- package/lib/rules/class-methods-use-this.js +179 -171
- package/lib/rules/comma-dangle.js +378 -345
- package/lib/rules/comma-spacing.js +192 -194
- package/lib/rules/comma-style.js +374 -315
- package/lib/rules/complexity.js +172 -168
- package/lib/rules/computed-property-spacing.js +235 -210
- package/lib/rules/consistent-return.js +180 -169
- package/lib/rules/consistent-this.js +166 -146
- package/lib/rules/constructor-super.js +411 -403
- package/lib/rules/curly.js +406 -331
- package/lib/rules/default-case-last.js +37 -30
- package/lib/rules/default-case.js +88 -84
- package/lib/rules/default-param-last.js +68 -53
- package/lib/rules/dot-location.js +121 -109
- package/lib/rules/dot-notation.js +191 -155
- package/lib/rules/eol-last.js +121 -119
- package/lib/rules/eqeqeq.js +167 -154
- package/lib/rules/for-direction.js +145 -120
- package/lib/rules/func-call-spacing.js +260 -230
- package/lib/rules/func-name-matching.js +292 -208
- package/lib/rules/func-names.js +164 -163
- package/lib/rules/func-style.js +158 -126
- package/lib/rules/function-call-argument-newline.js +151 -128
- package/lib/rules/function-paren-newline.js +348 -290
- package/lib/rules/generator-star-spacing.js +228 -209
- package/lib/rules/getter-return.js +207 -171
- package/lib/rules/global-require.js +84 -73
- package/lib/rules/grouped-accessor-pairs.js +169 -149
- package/lib/rules/guard-for-in.js +71 -62
- package/lib/rules/handle-callback-err.js +107 -102
- package/lib/rules/id-blacklist.js +181 -198
- package/lib/rules/id-denylist.js +167 -186
- package/lib/rules/id-length.js +196 -170
- package/lib/rules/id-match.js +343 -288
- package/lib/rules/implicit-arrow-linebreak.js +101 -78
- package/lib/rules/indent-legacy.js +1343 -1117
- package/lib/rules/indent.js +2271 -1758
- package/lib/rules/index.js +317 -292
- package/lib/rules/init-declarations.js +115 -106
- package/lib/rules/jsx-quotes.js +93 -81
- package/lib/rules/key-spacing.js +749 -632
- package/lib/rules/keyword-spacing.js +647 -604
- package/lib/rules/line-comment-position.js +141 -127
- package/lib/rules/linebreak-style.js +106 -105
- package/lib/rules/lines-around-comment.js +539 -447
- package/lib/rules/lines-around-directive.js +232 -202
- package/lib/rules/lines-between-class-members.js +304 -233
- package/lib/rules/logical-assignment-operators.js +581 -398
- package/lib/rules/max-classes-per-file.js +68 -67
- package/lib/rules/max-depth.js +145 -142
- package/lib/rules/max-len.js +472 -433
- package/lib/rules/max-lines-per-function.js +200 -175
- package/lib/rules/max-lines.js +157 -161
- package/lib/rules/max-nested-callbacks.js +101 -103
- package/lib/rules/max-params.js +77 -75
- package/lib/rules/max-statements-per-line.js +204 -197
- package/lib/rules/max-statements.js +167 -163
- package/lib/rules/multiline-comment-style.js +636 -478
- package/lib/rules/multiline-ternary.js +240 -175
- package/lib/rules/new-cap.js +232 -212
- package/lib/rules/new-parens.js +87 -78
- package/lib/rules/newline-after-var.js +286 -249
- package/lib/rules/newline-before-return.js +228 -221
- package/lib/rules/newline-per-chained-call.js +141 -126
- package/lib/rules/no-alert.js +89 -78
- package/lib/rules/no-array-constructor.js +121 -112
- package/lib/rules/no-async-promise-executor.js +29 -23
- package/lib/rules/no-await-in-loop.js +68 -70
- package/lib/rules/no-bitwise.js +123 -99
- package/lib/rules/no-buffer-constructor.js +54 -46
- package/lib/rules/no-caller.js +38 -32
- package/lib/rules/no-case-declarations.js +60 -56
- package/lib/rules/no-catch-shadow.js +75 -72
- package/lib/rules/no-class-assign.js +50 -47
- package/lib/rules/no-compare-neg-zero.js +61 -47
- package/lib/rules/no-cond-assign.js +147 -131
- package/lib/rules/no-confusing-arrow.js +97 -80
- package/lib/rules/no-console.js +201 -190
- package/lib/rules/no-const-assign.js +46 -40
- package/lib/rules/no-constant-binary-expression.js +499 -404
- package/lib/rules/no-constant-condition.js +157 -142
- package/lib/rules/no-constructor-return.js +48 -48
- package/lib/rules/no-continue.js +24 -26
- package/lib/rules/no-control-regex.js +124 -120
- package/lib/rules/no-debugger.js +27 -29
- package/lib/rules/no-delete-var.js +28 -28
- package/lib/rules/no-div-regex.js +46 -40
- package/lib/rules/no-dupe-args.js +67 -68
- package/lib/rules/no-dupe-class-members.js +92 -88
- package/lib/rules/no-dupe-else-if.js +99 -76
- package/lib/rules/no-dupe-keys.js +132 -109
- package/lib/rules/no-duplicate-case.js +49 -42
- package/lib/rules/no-duplicate-imports.js +178 -175
- package/lib/rules/no-else-return.js +429 -384
- package/lib/rules/no-empty-character-class.js +56 -49
- package/lib/rules/no-empty-function.js +126 -127
- package/lib/rules/no-empty-pattern.js +62 -57
- package/lib/rules/no-empty-static-block.js +36 -34
- package/lib/rules/no-empty.js +97 -85
- package/lib/rules/no-eq-null.js +36 -31
- package/lib/rules/no-eval.js +255 -249
- package/lib/rules/no-ex-assign.js +41 -38
- package/lib/rules/no-extend-native.js +160 -158
- package/lib/rules/no-extra-bind.js +200 -189
- package/lib/rules/no-extra-boolean-cast.js +397 -347
- package/lib/rules/no-extra-label.js +149 -130
- package/lib/rules/no-extra-parens.js +1653 -1324
- package/lib/rules/no-extra-semi.js +145 -143
- package/lib/rules/no-fallthrough.js +198 -156
- package/lib/rules/no-floating-decimal.js +73 -65
- package/lib/rules/no-func-assign.js +53 -54
- package/lib/rules/no-global-assign.js +77 -72
- package/lib/rules/no-implicit-coercion.js +348 -292
- package/lib/rules/no-implicit-globals.js +157 -134
- package/lib/rules/no-implied-eval.js +139 -111
- package/lib/rules/no-import-assign.js +144 -158
- package/lib/rules/no-inline-comments.js +100 -94
- package/lib/rules/no-inner-declarations.js +114 -100
- package/lib/rules/no-invalid-regexp.js +221 -189
- package/lib/rules/no-invalid-this.js +122 -116
- package/lib/rules/no-irregular-whitespace.js +265 -251
- package/lib/rules/no-iterator.js +28 -32
- package/lib/rules/no-label-var.js +58 -61
- package/lib/rules/no-labels.js +137 -132
- package/lib/rules/no-lone-blocks.js +126 -122
- package/lib/rules/no-lonely-if.js +107 -76
- package/lib/rules/no-loop-func.js +233 -212
- package/lib/rules/no-loss-of-precision.js +215 -200
- package/lib/rules/no-magic-numbers.js +245 -217
- package/lib/rules/no-misleading-character-class.js +498 -445
- package/lib/rules/no-mixed-operators.js +187 -181
- package/lib/rules/no-mixed-requires.js +252 -239
- package/lib/rules/no-mixed-spaces-and-tabs.js +133 -120
- package/lib/rules/no-multi-assign.js +45 -43
- package/lib/rules/no-multi-spaces.js +162 -142
- package/lib/rules/no-multi-str.js +41 -40
- package/lib/rules/no-multiple-empty-lines.js +195 -157
- package/lib/rules/no-native-reassign.js +89 -84
- package/lib/rules/no-negated-condition.js +78 -74
- package/lib/rules/no-negated-in-lhs.js +44 -42
- package/lib/rules/no-nested-ternary.js +32 -31
- package/lib/rules/no-new-func.js +70 -61
- package/lib/rules/no-new-native-nonconstructor.js +42 -38
- package/lib/rules/no-new-object.js +47 -47
- package/lib/rules/no-new-require.js +47 -46
- package/lib/rules/no-new-symbol.js +51 -49
- package/lib/rules/no-new-wrappers.js +42 -40
- package/lib/rules/no-new.js +27 -28
- package/lib/rules/no-nonoctal-decimal-escape.js +140 -120
- package/lib/rules/no-obj-calls.js +65 -52
- package/lib/rules/no-object-constructor.js +103 -96
- package/lib/rules/no-octal-escape.js +39 -42
- package/lib/rules/no-octal.js +31 -31
- package/lib/rules/no-param-reassign.js +234 -216
- package/lib/rules/no-path-concat.js +65 -66
- package/lib/rules/no-plusplus.js +59 -60
- package/lib/rules/no-process-env.js +48 -47
- package/lib/rules/no-process-exit.js +53 -49
- package/lib/rules/no-promise-executor-return.js +213 -181
- package/lib/rules/no-proto.js +25 -28
- package/lib/rules/no-prototype-builtins.js +145 -123
- package/lib/rules/no-redeclare.js +153 -151
- package/lib/rules/no-regex-spaces.js +182 -160
- package/lib/rules/no-restricted-exports.js +207 -184
- package/lib/rules/no-restricted-globals.js +110 -111
- package/lib/rules/no-restricted-imports.js +656 -536
- package/lib/rules/no-restricted-modules.js +221 -201
- package/lib/rules/no-restricted-properties.js +180 -152
- package/lib/rules/no-restricted-syntax.js +55 -51
- package/lib/rules/no-return-assign.js +54 -49
- package/lib/rules/no-return-await.js +147 -123
- package/lib/rules/no-script-url.js +51 -44
- package/lib/rules/no-self-assign.js +147 -145
- package/lib/rules/no-self-compare.js +62 -45
- package/lib/rules/no-sequences.js +134 -115
- package/lib/rules/no-setter-return.js +184 -151
- package/lib/rules/no-shadow-restricted-names.js +60 -45
- package/lib/rules/no-shadow.js +341 -315
- package/lib/rules/no-spaced-func.js +81 -76
- package/lib/rules/no-sparse-arrays.js +53 -58
- package/lib/rules/no-sync.js +60 -59
- package/lib/rules/no-tabs.js +82 -71
- package/lib/rules/no-template-curly-in-string.js +32 -31
- package/lib/rules/no-ternary.js +24 -28
- package/lib/rules/no-this-before-super.js +320 -318
- package/lib/rules/no-throw-literal.js +30 -35
- package/lib/rules/no-trailing-spaces.js +198 -190
- package/lib/rules/no-undef-init.js +75 -60
- package/lib/rules/no-undef.js +50 -47
- package/lib/rules/no-undefined.js +72 -74
- package/lib/rules/no-underscore-dangle.js +369 -326
- package/lib/rules/no-unexpected-multiline.js +111 -101
- package/lib/rules/no-unmodified-loop-condition.js +253 -253
- package/lib/rules/no-unneeded-ternary.js +211 -146
- package/lib/rules/no-unreachable-loop.js +144 -141
- package/lib/rules/no-unreachable.js +254 -247
- package/lib/rules/no-unsafe-finally.js +92 -84
- package/lib/rules/no-unsafe-negation.js +104 -82
- package/lib/rules/no-unsafe-optional-chaining.js +191 -177
- package/lib/rules/no-unused-expressions.js +177 -161
- package/lib/rules/no-unused-labels.js +138 -123
- package/lib/rules/no-unused-private-class-members.js +205 -181
- package/lib/rules/no-unused-vars.js +1668 -1448
- package/lib/rules/no-use-before-define.js +228 -230
- package/lib/rules/no-useless-assignment.js +589 -510
- package/lib/rules/no-useless-backreference.js +211 -192
- package/lib/rules/no-useless-call.js +57 -52
- package/lib/rules/no-useless-catch.js +39 -39
- package/lib/rules/no-useless-computed-key.js +143 -114
- package/lib/rules/no-useless-concat.js +64 -59
- package/lib/rules/no-useless-constructor.js +157 -110
- package/lib/rules/no-useless-escape.js +341 -290
- package/lib/rules/no-useless-rename.js +182 -155
- package/lib/rules/no-useless-return.js +343 -311
- package/lib/rules/no-var.js +232 -211
- package/lib/rules/no-void.js +49 -47
- package/lib/rules/no-warning-comments.js +190 -185
- package/lib/rules/no-whitespace-before-property.js +130 -114
- package/lib/rules/no-with.js +23 -25
- package/lib/rules/nonblock-statement-body-position.js +148 -129
- package/lib/rules/object-curly-newline.js +305 -264
- package/lib/rules/object-curly-spacing.js +359 -313
- package/lib/rules/object-property-newline.js +136 -105
- package/lib/rules/object-shorthand.js +606 -501
- package/lib/rules/one-var-declaration-per-line.js +103 -99
- package/lib/rules/one-var.js +652 -536
- package/lib/rules/operator-assignment.js +218 -160
- package/lib/rules/operator-linebreak.js +294 -250
- package/lib/rules/padded-blocks.js +345 -307
- package/lib/rules/padding-line-between-statements.js +442 -438
- package/lib/rules/prefer-arrow-callback.js +361 -312
- package/lib/rules/prefer-const.js +417 -376
- package/lib/rules/prefer-destructuring.js +300 -278
- package/lib/rules/prefer-exponentiation-operator.js +175 -132
- package/lib/rules/prefer-named-capture-group.js +152 -139
- package/lib/rules/prefer-numeric-literals.js +120 -112
- package/lib/rules/prefer-object-has-own.js +115 -81
- package/lib/rules/prefer-object-spread.js +212 -192
- package/lib/rules/prefer-promise-reject-errors.js +139 -121
- package/lib/rules/prefer-reflect.js +126 -106
- package/lib/rules/prefer-regex-literals.js +577 -465
- package/lib/rules/prefer-rest-params.js +78 -79
- package/lib/rules/prefer-spread.js +46 -43
- package/lib/rules/prefer-template.js +265 -194
- package/lib/rules/quote-props.js +372 -306
- package/lib/rules/quotes.js +373 -325
- package/lib/rules/radix.js +151 -135
- package/lib/rules/require-atomic-updates.js +315 -284
- package/lib/rules/require-await.js +143 -115
- package/lib/rules/require-unicode-regexp.js +281 -176
- package/lib/rules/require-yield.js +52 -53
- package/lib/rules/rest-spread-spacing.js +127 -115
- package/lib/rules/semi-spacing.js +280 -249
- package/lib/rules/semi-style.js +175 -133
- package/lib/rules/semi.js +455 -435
- package/lib/rules/sort-imports.js +305 -232
- package/lib/rules/sort-keys.js +218 -187
- package/lib/rules/sort-vars.js +126 -92
- package/lib/rules/space-before-blocks.js +198 -188
- package/lib/rules/space-before-function-paren.js +185 -165
- package/lib/rules/space-in-parens.js +358 -287
- package/lib/rules/space-infix-ops.js +236 -200
- package/lib/rules/space-unary-ops.js +355 -297
- package/lib/rules/spaced-comment.js +362 -318
- package/lib/rules/strict.js +264 -229
- package/lib/rules/switch-colon-spacing.js +129 -121
- package/lib/rules/symbol-description.js +44 -47
- package/lib/rules/template-curly-spacing.js +147 -141
- package/lib/rules/template-tag-spacing.js +97 -87
- package/lib/rules/unicode-bom.js +53 -55
- package/lib/rules/use-isnan.js +236 -205
- package/lib/rules/utils/ast-utils.js +2039 -1860
- package/lib/rules/utils/char-source.js +162 -155
- package/lib/rules/utils/fix-tracker.js +83 -80
- package/lib/rules/utils/keywords.js +59 -59
- package/lib/rules/utils/lazy-loading-rule-map.js +79 -76
- package/lib/rules/utils/regular-expressions.js +32 -24
- package/lib/rules/utils/unicode/index.js +4 -4
- package/lib/rules/utils/unicode/is-combining-character.js +1 -1
- package/lib/rules/utils/unicode/is-emoji-modifier.js +1 -1
- package/lib/rules/utils/unicode/is-regional-indicator-symbol.js +1 -1
- package/lib/rules/utils/unicode/is-surrogate-pair.js +1 -1
- package/lib/rules/valid-typeof.js +152 -110
- package/lib/rules/vars-on-top.js +151 -144
- package/lib/rules/wrap-iife.js +203 -190
- package/lib/rules/wrap-regex.js +69 -57
- package/lib/rules/yield-star-spacing.js +144 -133
- package/lib/rules/yoda.js +282 -271
- package/lib/services/parser-service.js +35 -35
- package/lib/services/processor-service.js +66 -73
- package/lib/shared/ajv.js +14 -14
- package/lib/shared/assert.js +3 -4
- package/lib/shared/ast-utils.js +7 -6
- package/lib/shared/deep-merge-arrays.js +24 -22
- package/lib/shared/directives.js +3 -2
- package/lib/shared/flags.js +46 -17
- package/lib/shared/logging.js +24 -25
- package/lib/shared/option-utils.js +43 -36
- package/lib/shared/runtime-info.js +136 -127
- package/lib/shared/serialization.js +27 -27
- package/lib/shared/severity.js +22 -22
- package/lib/shared/stats.js +5 -5
- package/lib/shared/string-utils.js +16 -16
- package/lib/shared/text-table.js +28 -27
- package/lib/shared/traverser.js +153 -146
- package/lib/types/config-api.d.ts +8 -0
- package/lib/types/index.d.ts +2010 -1559
- package/lib/types/rules.d.ts +5312 -0
- package/lib/types/use-at-your-own-risk.d.ts +32 -30
- package/lib/unsupported-api.js +5 -5
- package/messages/all-files-ignored.js +3 -3
- package/messages/all-matched-files-ignored.js +3 -3
- package/messages/config-file-missing.js +2 -2
- package/messages/config-plugin-missing.js +3 -3
- package/messages/config-serialize-function.js +9 -7
- package/messages/eslintrc-incompat.js +13 -15
- package/messages/eslintrc-plugins.js +3 -4
- package/messages/extend-config-missing.js +3 -3
- package/messages/failed-to-read-json.js +3 -3
- package/messages/file-not-found.js +3 -3
- package/messages/invalid-rule-options.js +2 -2
- package/messages/invalid-rule-severity.js +2 -2
- package/messages/no-config-found.js +3 -3
- package/messages/plugin-conflict.js +8 -8
- package/messages/plugin-invalid.js +3 -3
- package/messages/plugin-missing.js +3 -3
- package/messages/print-config-with-directory-path.js +2 -2
- package/messages/shared.js +6 -1
- package/messages/whitespace-found.js +3 -3
- package/package.json +22 -20
- package/lib/types/rules/best-practices.d.ts +0 -1143
- package/lib/types/rules/deprecated.d.ts +0 -252
- package/lib/types/rules/ecmascript-6.d.ts +0 -647
- package/lib/types/rules/index.d.ts +0 -50
- package/lib/types/rules/node-commonjs.d.ts +0 -171
- package/lib/types/rules/possible-errors.d.ts +0 -685
- package/lib/types/rules/strict-mode.d.ts +0 -38
- package/lib/types/rules/stylistic-issues.d.ts +0 -2043
- package/lib/types/rules/variables.d.ts +0 -234
@@ -13,14 +13,15 @@
|
|
13
13
|
const path = require("node:path");
|
14
14
|
const fs = require("node:fs");
|
15
15
|
const { promisify } = require("node:util");
|
16
|
-
const {
|
16
|
+
const {
|
17
|
+
CLIEngine,
|
18
|
+
getCLIEngineInternalSlots,
|
19
|
+
} = require("../cli-engine/cli-engine");
|
17
20
|
const BuiltinRules = require("../rules");
|
18
21
|
const {
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
}
|
23
|
-
}
|
22
|
+
Legacy: {
|
23
|
+
ConfigOps: { getRuleSeverity },
|
24
|
+
},
|
24
25
|
} = require("@eslint/eslintrc");
|
25
26
|
const { version } = require("../../package.json");
|
26
27
|
|
@@ -103,7 +104,7 @@ const privateMembersMap = new WeakMap();
|
|
103
104
|
* @returns {boolean} `true` if `value` is a non-empty string.
|
104
105
|
*/
|
105
106
|
function isNonEmptyString(value) {
|
106
|
-
|
107
|
+
return typeof value === "string" && value.trim() !== "";
|
107
108
|
}
|
108
109
|
|
109
110
|
/**
|
@@ -112,7 +113,9 @@ function isNonEmptyString(value) {
|
|
112
113
|
* @returns {boolean} `true` if `value` is an array of non-empty strings.
|
113
114
|
*/
|
114
115
|
function isArrayOfNonEmptyString(value) {
|
115
|
-
|
116
|
+
return (
|
117
|
+
Array.isArray(value) && value.length && value.every(isNonEmptyString)
|
118
|
+
);
|
116
119
|
}
|
117
120
|
|
118
121
|
/**
|
@@ -122,7 +125,7 @@ function isArrayOfNonEmptyString(value) {
|
|
122
125
|
* strings.
|
123
126
|
*/
|
124
127
|
function isEmptyArrayOrArrayOfNonEmptyString(value) {
|
125
|
-
|
128
|
+
return Array.isArray(value) && value.every(isNonEmptyString);
|
126
129
|
}
|
127
130
|
|
128
131
|
/**
|
@@ -131,7 +134,12 @@ function isEmptyArrayOrArrayOfNonEmptyString(value) {
|
|
131
134
|
* @returns {boolean} `true` if `value` is valid fix type.
|
132
135
|
*/
|
133
136
|
function isFixType(value) {
|
134
|
-
|
137
|
+
return (
|
138
|
+
value === "directive" ||
|
139
|
+
value === "problem" ||
|
140
|
+
value === "suggestion" ||
|
141
|
+
value === "layout"
|
142
|
+
);
|
135
143
|
}
|
136
144
|
|
137
145
|
/**
|
@@ -140,18 +148,18 @@ function isFixType(value) {
|
|
140
148
|
* @returns {boolean} `true` if `value` is an array of fix types.
|
141
149
|
*/
|
142
150
|
function isFixTypeArray(value) {
|
143
|
-
|
151
|
+
return Array.isArray(value) && value.every(isFixType);
|
144
152
|
}
|
145
153
|
|
146
154
|
/**
|
147
155
|
* The error for invalid options.
|
148
156
|
*/
|
149
157
|
class ESLintInvalidOptionsError extends Error {
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
158
|
+
constructor(messages) {
|
159
|
+
super(`Invalid Options:\n- ${messages.join("\n- ")}`);
|
160
|
+
this.code = "ESLINT_INVALID_OPTIONS";
|
161
|
+
Error.captureStackTrace(this, ESLintInvalidOptionsError);
|
162
|
+
}
|
155
163
|
}
|
156
164
|
|
157
165
|
/**
|
@@ -161,182 +169,208 @@ class ESLintInvalidOptionsError extends Error {
|
|
161
169
|
* @returns {LegacyESLintOptions} The normalized options.
|
162
170
|
*/
|
163
171
|
function processOptions({
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
172
|
+
allowInlineConfig = true, // ← we cannot use `overrideConfig.noInlineConfig` instead because `allowInlineConfig` has side-effect that suppress warnings that show inline configs are ignored.
|
173
|
+
baseConfig = null,
|
174
|
+
cache = false,
|
175
|
+
cacheLocation = ".eslintcache",
|
176
|
+
cacheStrategy = "metadata",
|
177
|
+
cwd = process.cwd(),
|
178
|
+
errorOnUnmatchedPattern = true,
|
179
|
+
extensions = null, // ← should be null by default because if it's an array then it suppresses RFC20 feature.
|
180
|
+
fix = false,
|
181
|
+
fixTypes = null, // ← should be null by default because if it's an array then it suppresses rules that don't have the `meta.type` property.
|
182
|
+
flags /* eslint-disable-line no-unused-vars -- leaving for compatibility with ESLint#hasFlag */,
|
183
|
+
globInputPaths = true,
|
184
|
+
ignore = true,
|
185
|
+
ignorePath = null, // ← should be null by default because if it's a string then it may throw ENOENT.
|
186
|
+
overrideConfig = null,
|
187
|
+
overrideConfigFile = null,
|
188
|
+
plugins = {},
|
189
|
+
reportUnusedDisableDirectives = null, // ← should be null by default because if it's a string then it overrides the 'reportUnusedDisableDirectives' setting in config files. And we cannot use `overrideConfig.reportUnusedDisableDirectives` instead because we cannot configure the `error` severity with that.
|
190
|
+
resolvePluginsRelativeTo = null, // ← should be null by default because if it's a string then it suppresses RFC47 feature.
|
191
|
+
rulePaths = [],
|
192
|
+
useEslintrc = true,
|
193
|
+
passOnNoPatterns = false,
|
194
|
+
...unknownOptions
|
187
195
|
}) {
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
196
|
+
const errors = [];
|
197
|
+
const unknownOptionKeys = Object.keys(unknownOptions);
|
198
|
+
|
199
|
+
if (unknownOptionKeys.length >= 1) {
|
200
|
+
errors.push(`Unknown options: ${unknownOptionKeys.join(", ")}`);
|
201
|
+
if (unknownOptionKeys.includes("cacheFile")) {
|
202
|
+
errors.push(
|
203
|
+
"'cacheFile' has been removed. Please use the 'cacheLocation' option instead.",
|
204
|
+
);
|
205
|
+
}
|
206
|
+
if (unknownOptionKeys.includes("configFile")) {
|
207
|
+
errors.push(
|
208
|
+
"'configFile' has been removed. Please use the 'overrideConfigFile' option instead.",
|
209
|
+
);
|
210
|
+
}
|
211
|
+
if (unknownOptionKeys.includes("envs")) {
|
212
|
+
errors.push(
|
213
|
+
"'envs' has been removed. Please use the 'overrideConfig.env' option instead.",
|
214
|
+
);
|
215
|
+
}
|
216
|
+
if (unknownOptionKeys.includes("globals")) {
|
217
|
+
errors.push(
|
218
|
+
"'globals' has been removed. Please use the 'overrideConfig.globals' option instead.",
|
219
|
+
);
|
220
|
+
}
|
221
|
+
if (unknownOptionKeys.includes("ignorePattern")) {
|
222
|
+
errors.push(
|
223
|
+
"'ignorePattern' has been removed. Please use the 'overrideConfig.ignorePatterns' option instead.",
|
224
|
+
);
|
225
|
+
}
|
226
|
+
if (unknownOptionKeys.includes("parser")) {
|
227
|
+
errors.push(
|
228
|
+
"'parser' has been removed. Please use the 'overrideConfig.parser' option instead.",
|
229
|
+
);
|
230
|
+
}
|
231
|
+
if (unknownOptionKeys.includes("parserOptions")) {
|
232
|
+
errors.push(
|
233
|
+
"'parserOptions' has been removed. Please use the 'overrideConfig.parserOptions' option instead.",
|
234
|
+
);
|
235
|
+
}
|
236
|
+
if (unknownOptionKeys.includes("rules")) {
|
237
|
+
errors.push(
|
238
|
+
"'rules' has been removed. Please use the 'overrideConfig.rules' option instead.",
|
239
|
+
);
|
240
|
+
}
|
241
|
+
}
|
242
|
+
if (typeof allowInlineConfig !== "boolean") {
|
243
|
+
errors.push("'allowInlineConfig' must be a boolean.");
|
244
|
+
}
|
245
|
+
if (typeof baseConfig !== "object") {
|
246
|
+
errors.push("'baseConfig' must be an object or null.");
|
247
|
+
}
|
248
|
+
if (typeof cache !== "boolean") {
|
249
|
+
errors.push("'cache' must be a boolean.");
|
250
|
+
}
|
251
|
+
if (!isNonEmptyString(cacheLocation)) {
|
252
|
+
errors.push("'cacheLocation' must be a non-empty string.");
|
253
|
+
}
|
254
|
+
if (cacheStrategy !== "metadata" && cacheStrategy !== "content") {
|
255
|
+
errors.push('\'cacheStrategy\' must be any of "metadata", "content".');
|
256
|
+
}
|
257
|
+
if (!isNonEmptyString(cwd) || !path.isAbsolute(cwd)) {
|
258
|
+
errors.push("'cwd' must be an absolute path.");
|
259
|
+
}
|
260
|
+
if (typeof errorOnUnmatchedPattern !== "boolean") {
|
261
|
+
errors.push("'errorOnUnmatchedPattern' must be a boolean.");
|
262
|
+
}
|
263
|
+
if (
|
264
|
+
!isEmptyArrayOrArrayOfNonEmptyString(extensions) &&
|
265
|
+
extensions !== null
|
266
|
+
) {
|
267
|
+
errors.push(
|
268
|
+
"'extensions' must be an array of non-empty strings or null.",
|
269
|
+
);
|
270
|
+
}
|
271
|
+
if (typeof fix !== "boolean" && typeof fix !== "function") {
|
272
|
+
errors.push("'fix' must be a boolean or a function.");
|
273
|
+
}
|
274
|
+
if (fixTypes !== null && !isFixTypeArray(fixTypes)) {
|
275
|
+
errors.push(
|
276
|
+
'\'fixTypes\' must be an array of any of "directive", "problem", "suggestion", and "layout".',
|
277
|
+
);
|
278
|
+
}
|
279
|
+
if (typeof globInputPaths !== "boolean") {
|
280
|
+
errors.push("'globInputPaths' must be a boolean.");
|
281
|
+
}
|
282
|
+
if (typeof ignore !== "boolean") {
|
283
|
+
errors.push("'ignore' must be a boolean.");
|
284
|
+
}
|
285
|
+
if (!isNonEmptyString(ignorePath) && ignorePath !== null) {
|
286
|
+
errors.push("'ignorePath' must be a non-empty string or null.");
|
287
|
+
}
|
288
|
+
if (typeof overrideConfig !== "object") {
|
289
|
+
errors.push("'overrideConfig' must be an object or null.");
|
290
|
+
}
|
291
|
+
if (!isNonEmptyString(overrideConfigFile) && overrideConfigFile !== null) {
|
292
|
+
errors.push("'overrideConfigFile' must be a non-empty string or null.");
|
293
|
+
}
|
294
|
+
if (typeof plugins !== "object") {
|
295
|
+
errors.push("'plugins' must be an object or null.");
|
296
|
+
} else if (plugins !== null && Object.keys(plugins).includes("")) {
|
297
|
+
errors.push("'plugins' must not include an empty string.");
|
298
|
+
}
|
299
|
+
if (Array.isArray(plugins)) {
|
300
|
+
errors.push(
|
301
|
+
"'plugins' doesn't add plugins to configuration to load. Please use the 'overrideConfig.plugins' option instead.",
|
302
|
+
);
|
303
|
+
}
|
304
|
+
if (
|
305
|
+
reportUnusedDisableDirectives !== "error" &&
|
306
|
+
reportUnusedDisableDirectives !== "warn" &&
|
307
|
+
reportUnusedDisableDirectives !== "off" &&
|
308
|
+
reportUnusedDisableDirectives !== null
|
309
|
+
) {
|
310
|
+
errors.push(
|
311
|
+
'\'reportUnusedDisableDirectives\' must be any of "error", "warn", "off", and null.',
|
312
|
+
);
|
313
|
+
}
|
314
|
+
if (
|
315
|
+
!isNonEmptyString(resolvePluginsRelativeTo) &&
|
316
|
+
resolvePluginsRelativeTo !== null
|
317
|
+
) {
|
318
|
+
errors.push(
|
319
|
+
"'resolvePluginsRelativeTo' must be a non-empty string or null.",
|
320
|
+
);
|
321
|
+
}
|
322
|
+
if (!isEmptyArrayOrArrayOfNonEmptyString(rulePaths)) {
|
323
|
+
errors.push("'rulePaths' must be an array of non-empty strings.");
|
324
|
+
}
|
325
|
+
if (typeof useEslintrc !== "boolean") {
|
326
|
+
errors.push("'useEslintrc' must be a boolean.");
|
327
|
+
}
|
328
|
+
if (typeof passOnNoPatterns !== "boolean") {
|
329
|
+
errors.push("'passOnNoPatterns' must be a boolean.");
|
330
|
+
}
|
331
|
+
|
332
|
+
if (errors.length > 0) {
|
333
|
+
throw new ESLintInvalidOptionsError(errors);
|
334
|
+
}
|
335
|
+
|
336
|
+
return {
|
337
|
+
allowInlineConfig,
|
338
|
+
baseConfig,
|
339
|
+
cache,
|
340
|
+
cacheLocation,
|
341
|
+
cacheStrategy,
|
342
|
+
configFile: overrideConfigFile,
|
343
|
+
cwd: path.normalize(cwd),
|
344
|
+
errorOnUnmatchedPattern,
|
345
|
+
extensions,
|
346
|
+
fix,
|
347
|
+
fixTypes,
|
348
|
+
flags: [], // LegacyESLint does not support flags, so just ignore them.
|
349
|
+
globInputPaths,
|
350
|
+
ignore,
|
351
|
+
ignorePath,
|
352
|
+
reportUnusedDisableDirectives,
|
353
|
+
resolvePluginsRelativeTo,
|
354
|
+
rulePaths,
|
355
|
+
useEslintrc,
|
356
|
+
passOnNoPatterns,
|
357
|
+
};
|
324
358
|
}
|
325
359
|
|
326
360
|
/**
|
327
361
|
* Check if a value has one or more properties and that value is not undefined.
|
328
362
|
* @param {any} obj The value to check.
|
329
|
-
* @returns {boolean} `true` if `obj` has one or more properties that
|
363
|
+
* @returns {boolean} `true` if `obj` has one or more properties that value is not undefined.
|
330
364
|
*/
|
331
365
|
function hasDefinedProperty(obj) {
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
366
|
+
if (typeof obj === "object" && obj !== null) {
|
367
|
+
for (const key in obj) {
|
368
|
+
if (typeof obj[key] !== "undefined") {
|
369
|
+
return true;
|
370
|
+
}
|
371
|
+
}
|
372
|
+
}
|
373
|
+
return false;
|
340
374
|
}
|
341
375
|
|
342
376
|
/**
|
@@ -345,10 +379,10 @@ function hasDefinedProperty(obj) {
|
|
345
379
|
* @returns {Object} metadata for all enabled rules.
|
346
380
|
*/
|
347
381
|
function createRulesMeta(rules) {
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
382
|
+
return Array.from(rules).reduce((retVal, [id, rule]) => {
|
383
|
+
retVal[id] = rule.meta;
|
384
|
+
return retVal;
|
385
|
+
}, {});
|
352
386
|
}
|
353
387
|
|
354
388
|
/** @type {WeakMap<ExtractedConfig, DeprecatedRuleInfo[]>} */
|
@@ -361,37 +395,37 @@ const usedDeprecatedRulesCache = new WeakMap();
|
|
361
395
|
* @returns {DeprecatedRuleInfo[]} The used deprecated rule list.
|
362
396
|
*/
|
363
397
|
function getOrFindUsedDeprecatedRules(cliEngine, maybeFilePath) {
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
|
392
|
-
|
393
|
-
|
394
|
-
|
398
|
+
const {
|
399
|
+
configArrayFactory,
|
400
|
+
options: { cwd },
|
401
|
+
} = getCLIEngineInternalSlots(cliEngine);
|
402
|
+
const filePath = path.isAbsolute(maybeFilePath)
|
403
|
+
? maybeFilePath
|
404
|
+
: path.join(cwd, "__placeholder__.js");
|
405
|
+
const configArray = configArrayFactory.getConfigArrayForFile(filePath);
|
406
|
+
const config = configArray.extractConfig(filePath);
|
407
|
+
|
408
|
+
// Most files use the same config, so cache it.
|
409
|
+
if (!usedDeprecatedRulesCache.has(config)) {
|
410
|
+
const pluginRules = configArray.pluginRules;
|
411
|
+
const retv = [];
|
412
|
+
|
413
|
+
for (const [ruleId, ruleConf] of Object.entries(config.rules)) {
|
414
|
+
if (getRuleSeverity(ruleConf) === 0) {
|
415
|
+
continue;
|
416
|
+
}
|
417
|
+
const rule = pluginRules.get(ruleId) || BuiltinRules.get(ruleId);
|
418
|
+
const meta = rule && rule.meta;
|
419
|
+
|
420
|
+
if (meta && meta.deprecated) {
|
421
|
+
retv.push({ ruleId, replacedBy: meta.replacedBy || [] });
|
422
|
+
}
|
423
|
+
}
|
424
|
+
|
425
|
+
usedDeprecatedRulesCache.set(config, Object.freeze(retv));
|
426
|
+
}
|
427
|
+
|
428
|
+
return usedDeprecatedRulesCache.get(config);
|
395
429
|
}
|
396
430
|
|
397
431
|
/**
|
@@ -402,19 +436,19 @@ function getOrFindUsedDeprecatedRules(cliEngine, maybeFilePath) {
|
|
402
436
|
* @returns {LintResult[]} The processed linting results.
|
403
437
|
*/
|
404
438
|
function processCLIEngineLintReport(cliEngine, { results }) {
|
405
|
-
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
|
439
|
+
const descriptor = {
|
440
|
+
configurable: true,
|
441
|
+
enumerable: true,
|
442
|
+
get() {
|
443
|
+
return getOrFindUsedDeprecatedRules(cliEngine, this.filePath);
|
444
|
+
},
|
445
|
+
};
|
446
|
+
|
447
|
+
for (const result of results) {
|
448
|
+
Object.defineProperty(result, "usedDeprecatedRules", descriptor);
|
449
|
+
}
|
450
|
+
|
451
|
+
return results;
|
418
452
|
}
|
419
453
|
|
420
454
|
/**
|
@@ -424,304 +458,314 @@ function processCLIEngineLintReport(cliEngine, { results }) {
|
|
424
458
|
* @returns {number} An integer representing the order in which the two results should occur.
|
425
459
|
*/
|
426
460
|
function compareResultsByFilePath(a, b) {
|
427
|
-
|
428
|
-
|
429
|
-
|
461
|
+
if (a.filePath < b.filePath) {
|
462
|
+
return -1;
|
463
|
+
}
|
430
464
|
|
431
|
-
|
432
|
-
|
433
|
-
|
465
|
+
if (a.filePath > b.filePath) {
|
466
|
+
return 1;
|
467
|
+
}
|
434
468
|
|
435
|
-
|
469
|
+
return 0;
|
436
470
|
}
|
437
471
|
|
438
472
|
/**
|
439
473
|
* Main API.
|
440
474
|
*/
|
441
475
|
class LegacyESLint {
|
442
|
-
|
443
|
-
|
444
|
-
|
445
|
-
|
446
|
-
|
447
|
-
|
448
|
-
|
449
|
-
|
450
|
-
|
451
|
-
|
452
|
-
|
453
|
-
|
454
|
-
|
455
|
-
|
456
|
-
|
457
|
-
|
458
|
-
|
459
|
-
|
460
|
-
|
461
|
-
|
462
|
-
|
463
|
-
|
464
|
-
|
465
|
-
|
466
|
-
|
467
|
-
|
468
|
-
|
469
|
-
|
470
|
-
|
471
|
-
|
472
|
-
|
473
|
-
|
474
|
-
|
475
|
-
|
476
|
-
|
477
|
-
|
478
|
-
|
479
|
-
|
480
|
-
|
481
|
-
|
482
|
-
|
483
|
-
|
484
|
-
|
485
|
-
|
486
|
-
|
487
|
-
|
488
|
-
|
489
|
-
|
490
|
-
|
491
|
-
|
492
|
-
|
493
|
-
|
494
|
-
|
495
|
-
|
496
|
-
|
497
|
-
|
498
|
-
|
499
|
-
|
500
|
-
|
501
|
-
|
502
|
-
|
503
|
-
|
504
|
-
|
505
|
-
|
506
|
-
|
507
|
-
|
508
|
-
|
509
|
-
|
510
|
-
|
511
|
-
|
512
|
-
|
513
|
-
|
514
|
-
|
515
|
-
|
516
|
-
|
517
|
-
|
518
|
-
|
519
|
-
|
520
|
-
|
521
|
-
|
522
|
-
|
523
|
-
|
524
|
-
|
525
|
-
|
526
|
-
|
527
|
-
|
528
|
-
|
529
|
-
|
530
|
-
|
531
|
-
|
532
|
-
|
533
|
-
|
534
|
-
|
535
|
-
|
536
|
-
|
537
|
-
|
538
|
-
|
539
|
-
|
540
|
-
|
541
|
-
|
542
|
-
|
543
|
-
|
544
|
-
|
545
|
-
|
546
|
-
|
547
|
-
|
548
|
-
|
549
|
-
|
550
|
-
|
551
|
-
|
552
|
-
|
553
|
-
|
554
|
-
|
555
|
-
|
556
|
-
|
557
|
-
|
558
|
-
|
559
|
-
|
560
|
-
|
561
|
-
|
562
|
-
|
563
|
-
|
564
|
-
|
565
|
-
|
566
|
-
|
567
|
-
|
568
|
-
|
569
|
-
|
570
|
-
|
571
|
-
|
572
|
-
|
573
|
-
|
574
|
-
|
575
|
-
|
576
|
-
|
577
|
-
|
578
|
-
|
579
|
-
|
580
|
-
|
581
|
-
|
582
|
-
|
583
|
-
|
584
|
-
|
585
|
-
|
586
|
-
|
587
|
-
|
588
|
-
|
589
|
-
|
590
|
-
|
591
|
-
|
592
|
-
|
593
|
-
|
594
|
-
|
595
|
-
|
596
|
-
|
597
|
-
|
598
|
-
|
599
|
-
|
600
|
-
|
601
|
-
|
602
|
-
|
603
|
-
|
604
|
-
|
605
|
-
|
606
|
-
|
607
|
-
|
608
|
-
|
609
|
-
|
610
|
-
|
611
|
-
|
612
|
-
|
613
|
-
|
614
|
-
|
615
|
-
|
616
|
-
|
617
|
-
|
618
|
-
|
619
|
-
|
620
|
-
|
621
|
-
|
622
|
-
|
623
|
-
|
624
|
-
|
625
|
-
|
626
|
-
|
627
|
-
|
628
|
-
|
629
|
-
|
630
|
-
|
631
|
-
|
632
|
-
|
633
|
-
|
634
|
-
|
635
|
-
|
636
|
-
|
637
|
-
|
638
|
-
|
639
|
-
|
640
|
-
|
641
|
-
|
642
|
-
|
643
|
-
|
644
|
-
|
645
|
-
|
646
|
-
|
647
|
-
|
648
|
-
|
649
|
-
|
650
|
-
|
651
|
-
|
652
|
-
|
653
|
-
|
654
|
-
|
655
|
-
|
656
|
-
|
657
|
-
|
658
|
-
|
659
|
-
|
660
|
-
|
661
|
-
|
662
|
-
|
663
|
-
|
664
|
-
|
665
|
-
|
666
|
-
|
667
|
-
|
668
|
-
|
669
|
-
|
670
|
-
|
671
|
-
|
672
|
-
|
673
|
-
|
674
|
-
|
675
|
-
|
676
|
-
|
677
|
-
|
678
|
-
|
679
|
-
|
680
|
-
|
681
|
-
|
682
|
-
|
683
|
-
|
684
|
-
|
685
|
-
|
686
|
-
|
687
|
-
|
688
|
-
|
689
|
-
|
690
|
-
|
691
|
-
|
692
|
-
|
693
|
-
|
694
|
-
|
695
|
-
|
696
|
-
|
697
|
-
|
698
|
-
|
699
|
-
|
700
|
-
|
701
|
-
|
702
|
-
|
703
|
-
|
704
|
-
|
705
|
-
|
706
|
-
|
707
|
-
|
708
|
-
|
709
|
-
|
710
|
-
|
711
|
-
|
712
|
-
|
713
|
-
|
714
|
-
|
715
|
-
|
716
|
-
|
717
|
-
|
718
|
-
|
719
|
-
|
720
|
-
|
721
|
-
|
722
|
-
|
723
|
-
|
724
|
-
|
476
|
+
/**
|
477
|
+
* The type of configuration used by this class.
|
478
|
+
* @type {string}
|
479
|
+
*/
|
480
|
+
static configType = "eslintrc";
|
481
|
+
|
482
|
+
/**
|
483
|
+
* Creates a new instance of the main ESLint API.
|
484
|
+
* @param {LegacyESLintOptions} options The options for this instance.
|
485
|
+
*/
|
486
|
+
constructor(options = {}) {
|
487
|
+
const processedOptions = processOptions(options);
|
488
|
+
const cliEngine = new CLIEngine(processedOptions, {
|
489
|
+
preloadedPlugins: options.plugins,
|
490
|
+
});
|
491
|
+
const { configArrayFactory, lastConfigArrays } =
|
492
|
+
getCLIEngineInternalSlots(cliEngine);
|
493
|
+
let updated = false;
|
494
|
+
|
495
|
+
/*
|
496
|
+
* Address `overrideConfig` to set override config.
|
497
|
+
* Operate the `configArrayFactory` internal slot directly because this
|
498
|
+
* functionality doesn't exist as the public API of CLIEngine.
|
499
|
+
*/
|
500
|
+
if (hasDefinedProperty(options.overrideConfig)) {
|
501
|
+
configArrayFactory.setOverrideConfig(options.overrideConfig);
|
502
|
+
updated = true;
|
503
|
+
}
|
504
|
+
|
505
|
+
// Update caches.
|
506
|
+
if (updated) {
|
507
|
+
configArrayFactory.clearCache();
|
508
|
+
lastConfigArrays[0] = configArrayFactory.getConfigArrayForFile();
|
509
|
+
}
|
510
|
+
|
511
|
+
// Initialize private properties.
|
512
|
+
privateMembersMap.set(this, {
|
513
|
+
cliEngine,
|
514
|
+
options: processedOptions,
|
515
|
+
});
|
516
|
+
}
|
517
|
+
|
518
|
+
/**
|
519
|
+
* The version text.
|
520
|
+
* @type {string}
|
521
|
+
*/
|
522
|
+
static get version() {
|
523
|
+
return version;
|
524
|
+
}
|
525
|
+
|
526
|
+
/**
|
527
|
+
* Outputs fixes from the given results to files.
|
528
|
+
* @param {LintResult[]} results The lint results.
|
529
|
+
* @returns {Promise<void>} Returns a promise that is used to track side effects.
|
530
|
+
*/
|
531
|
+
static async outputFixes(results) {
|
532
|
+
if (!Array.isArray(results)) {
|
533
|
+
throw new Error("'results' must be an array");
|
534
|
+
}
|
535
|
+
|
536
|
+
await Promise.all(
|
537
|
+
results
|
538
|
+
.filter(result => {
|
539
|
+
if (typeof result !== "object" || result === null) {
|
540
|
+
throw new Error("'results' must include only objects");
|
541
|
+
}
|
542
|
+
return (
|
543
|
+
typeof result.output === "string" &&
|
544
|
+
path.isAbsolute(result.filePath)
|
545
|
+
);
|
546
|
+
})
|
547
|
+
.map(r => writeFile(r.filePath, r.output)),
|
548
|
+
);
|
549
|
+
}
|
550
|
+
|
551
|
+
/**
|
552
|
+
* Returns results that only contains errors.
|
553
|
+
* @param {LintResult[]} results The results to filter.
|
554
|
+
* @returns {LintResult[]} The filtered results.
|
555
|
+
*/
|
556
|
+
static getErrorResults(results) {
|
557
|
+
return CLIEngine.getErrorResults(results);
|
558
|
+
}
|
559
|
+
|
560
|
+
/**
|
561
|
+
* Returns meta objects for each rule represented in the lint results.
|
562
|
+
* @param {LintResult[]} results The results to fetch rules meta for.
|
563
|
+
* @returns {Object} A mapping of ruleIds to rule meta objects.
|
564
|
+
*/
|
565
|
+
getRulesMetaForResults(results) {
|
566
|
+
const resultRuleIds = new Set();
|
567
|
+
|
568
|
+
// first gather all ruleIds from all results
|
569
|
+
|
570
|
+
for (const result of results) {
|
571
|
+
for (const { ruleId } of result.messages) {
|
572
|
+
resultRuleIds.add(ruleId);
|
573
|
+
}
|
574
|
+
for (const { ruleId } of result.suppressedMessages) {
|
575
|
+
resultRuleIds.add(ruleId);
|
576
|
+
}
|
577
|
+
}
|
578
|
+
|
579
|
+
// create a map of all rules in the results
|
580
|
+
|
581
|
+
const { cliEngine } = privateMembersMap.get(this);
|
582
|
+
const rules = cliEngine.getRules();
|
583
|
+
const resultRules = new Map();
|
584
|
+
|
585
|
+
for (const [ruleId, rule] of rules) {
|
586
|
+
if (resultRuleIds.has(ruleId)) {
|
587
|
+
resultRules.set(ruleId, rule);
|
588
|
+
}
|
589
|
+
}
|
590
|
+
|
591
|
+
return createRulesMeta(resultRules);
|
592
|
+
}
|
593
|
+
|
594
|
+
/* eslint-disable no-unused-vars, class-methods-use-this -- leaving for compatibility with ESLint#hasFlag */
|
595
|
+
/**
|
596
|
+
* Indicates if the given feature flag is enabled for this instance. For this
|
597
|
+
* class, this always returns `false` because it does not support feature flags.
|
598
|
+
* @param {string} flag The feature flag to check.
|
599
|
+
* @returns {boolean} Always false.
|
600
|
+
*/
|
601
|
+
hasFlag(flag) {
|
602
|
+
return false;
|
603
|
+
}
|
604
|
+
/* eslint-enable no-unused-vars, class-methods-use-this -- reenable rules for the rest of the file */
|
605
|
+
|
606
|
+
/**
|
607
|
+
* Executes the current configuration on an array of file and directory names.
|
608
|
+
* @param {string[]} patterns An array of file and directory names.
|
609
|
+
* @returns {Promise<LintResult[]>} The results of linting the file patterns given.
|
610
|
+
*/
|
611
|
+
async lintFiles(patterns) {
|
612
|
+
const { cliEngine, options } = privateMembersMap.get(this);
|
613
|
+
|
614
|
+
if (
|
615
|
+
options.passOnNoPatterns &&
|
616
|
+
(patterns === "" ||
|
617
|
+
(Array.isArray(patterns) && patterns.length === 0))
|
618
|
+
) {
|
619
|
+
return [];
|
620
|
+
}
|
621
|
+
|
622
|
+
if (!isNonEmptyString(patterns) && !isArrayOfNonEmptyString(patterns)) {
|
623
|
+
throw new Error(
|
624
|
+
"'patterns' must be a non-empty string or an array of non-empty strings",
|
625
|
+
);
|
626
|
+
}
|
627
|
+
|
628
|
+
return processCLIEngineLintReport(
|
629
|
+
cliEngine,
|
630
|
+
cliEngine.executeOnFiles(patterns),
|
631
|
+
);
|
632
|
+
}
|
633
|
+
|
634
|
+
/**
|
635
|
+
* Executes the current configuration on text.
|
636
|
+
* @param {string} code A string of JavaScript code to lint.
|
637
|
+
* @param {Object} [options] The options.
|
638
|
+
* @param {string} [options.filePath] The path to the file of the source code.
|
639
|
+
* @param {boolean} [options.warnIgnored] When set to true, warn if given filePath is an ignored path.
|
640
|
+
* @returns {Promise<LintResult[]>} The results of linting the string of code given.
|
641
|
+
*/
|
642
|
+
async lintText(code, options = {}) {
|
643
|
+
if (typeof code !== "string") {
|
644
|
+
throw new Error("'code' must be a string");
|
645
|
+
}
|
646
|
+
if (typeof options !== "object") {
|
647
|
+
throw new Error("'options' must be an object, null, or undefined");
|
648
|
+
}
|
649
|
+
const {
|
650
|
+
filePath,
|
651
|
+
warnIgnored = false,
|
652
|
+
...unknownOptions
|
653
|
+
} = options || {};
|
654
|
+
|
655
|
+
const unknownOptionKeys = Object.keys(unknownOptions);
|
656
|
+
|
657
|
+
if (unknownOptionKeys.length > 0) {
|
658
|
+
throw new Error(
|
659
|
+
`'options' must not include the unknown option(s): ${unknownOptionKeys.join(", ")}`,
|
660
|
+
);
|
661
|
+
}
|
662
|
+
|
663
|
+
if (filePath !== void 0 && !isNonEmptyString(filePath)) {
|
664
|
+
throw new Error(
|
665
|
+
"'options.filePath' must be a non-empty string or undefined",
|
666
|
+
);
|
667
|
+
}
|
668
|
+
if (typeof warnIgnored !== "boolean") {
|
669
|
+
throw new Error(
|
670
|
+
"'options.warnIgnored' must be a boolean or undefined",
|
671
|
+
);
|
672
|
+
}
|
673
|
+
|
674
|
+
const { cliEngine } = privateMembersMap.get(this);
|
675
|
+
|
676
|
+
return processCLIEngineLintReport(
|
677
|
+
cliEngine,
|
678
|
+
cliEngine.executeOnText(code, filePath, warnIgnored),
|
679
|
+
);
|
680
|
+
}
|
681
|
+
|
682
|
+
/**
|
683
|
+
* Returns the formatter representing the given formatter name.
|
684
|
+
* @param {string} [name] The name of the formatter to load.
|
685
|
+
* The following values are allowed:
|
686
|
+
* - `undefined` ... Load `stylish` builtin formatter.
|
687
|
+
* - A builtin formatter name ... Load the builtin formatter.
|
688
|
+
* - A third-party formatter name:
|
689
|
+
* - `foo` → `eslint-formatter-foo`
|
690
|
+
* - `@foo` → `@foo/eslint-formatter`
|
691
|
+
* - `@foo/bar` → `@foo/eslint-formatter-bar`
|
692
|
+
* - A file path ... Load the file.
|
693
|
+
* @returns {Promise<LoadedFormatter>} A promise resolving to the formatter object.
|
694
|
+
* This promise will be rejected if the given formatter was not found or not
|
695
|
+
* a function.
|
696
|
+
*/
|
697
|
+
async loadFormatter(name = "stylish") {
|
698
|
+
if (typeof name !== "string") {
|
699
|
+
throw new Error("'name' must be a string");
|
700
|
+
}
|
701
|
+
|
702
|
+
const { cliEngine, options } = privateMembersMap.get(this);
|
703
|
+
const formatter = cliEngine.getFormatter(name);
|
704
|
+
|
705
|
+
if (typeof formatter !== "function") {
|
706
|
+
throw new Error(
|
707
|
+
`Formatter must be a function, but got a ${typeof formatter}.`,
|
708
|
+
);
|
709
|
+
}
|
710
|
+
|
711
|
+
return {
|
712
|
+
/**
|
713
|
+
* The main formatter method.
|
714
|
+
* @param {LintResult[]} results The lint results to format.
|
715
|
+
* @param {ResultsMeta} resultsMeta Warning count and max threshold.
|
716
|
+
* @returns {string | Promise<string>} The formatted lint results.
|
717
|
+
*/
|
718
|
+
format(results, resultsMeta) {
|
719
|
+
let rulesMeta = null;
|
720
|
+
|
721
|
+
results.sort(compareResultsByFilePath);
|
722
|
+
|
723
|
+
return formatter(results, {
|
724
|
+
...resultsMeta,
|
725
|
+
get cwd() {
|
726
|
+
return options.cwd;
|
727
|
+
},
|
728
|
+
get rulesMeta() {
|
729
|
+
if (!rulesMeta) {
|
730
|
+
rulesMeta = createRulesMeta(cliEngine.getRules());
|
731
|
+
}
|
732
|
+
|
733
|
+
return rulesMeta;
|
734
|
+
},
|
735
|
+
});
|
736
|
+
},
|
737
|
+
};
|
738
|
+
}
|
739
|
+
|
740
|
+
/**
|
741
|
+
* Returns a configuration object for the given file based on the CLI options.
|
742
|
+
* This is the same logic used by the ESLint CLI executable to determine
|
743
|
+
* configuration for each file it processes.
|
744
|
+
* @param {string} filePath The path of the file to retrieve a config object for.
|
745
|
+
* @returns {Promise<ConfigData>} A configuration object for the file.
|
746
|
+
*/
|
747
|
+
async calculateConfigForFile(filePath) {
|
748
|
+
if (!isNonEmptyString(filePath)) {
|
749
|
+
throw new Error("'filePath' must be a non-empty string");
|
750
|
+
}
|
751
|
+
const { cliEngine } = privateMembersMap.get(this);
|
752
|
+
|
753
|
+
return cliEngine.getConfigForFile(filePath);
|
754
|
+
}
|
755
|
+
|
756
|
+
/**
|
757
|
+
* Checks if a given path is ignored by ESLint.
|
758
|
+
* @param {string} filePath The path of the file to check.
|
759
|
+
* @returns {Promise<boolean>} Whether or not the given path is ignored.
|
760
|
+
*/
|
761
|
+
async isPathIgnored(filePath) {
|
762
|
+
if (!isNonEmptyString(filePath)) {
|
763
|
+
throw new Error("'filePath' must be a non-empty string");
|
764
|
+
}
|
765
|
+
const { cliEngine } = privateMembersMap.get(this);
|
766
|
+
|
767
|
+
return cliEngine.isPathIgnored(filePath);
|
768
|
+
}
|
725
769
|
}
|
726
770
|
|
727
771
|
//------------------------------------------------------------------------------
|
@@ -729,14 +773,14 @@ class LegacyESLint {
|
|
729
773
|
//------------------------------------------------------------------------------
|
730
774
|
|
731
775
|
module.exports = {
|
732
|
-
|
733
|
-
|
734
|
-
|
735
|
-
|
736
|
-
|
737
|
-
|
738
|
-
|
739
|
-
|
740
|
-
|
741
|
-
|
776
|
+
LegacyESLint,
|
777
|
+
|
778
|
+
/**
|
779
|
+
* Get the private class members of a given ESLint instance for tests.
|
780
|
+
* @param {ESLint} instance The ESLint instance to get.
|
781
|
+
* @returns {ESLintPrivateMembers} The instance's private class members.
|
782
|
+
*/
|
783
|
+
getESLintPrivateMembers(instance) {
|
784
|
+
return privateMembersMap.get(instance);
|
785
|
+
},
|
742
786
|
};
|