eslint 8.57.1 → 9.39.1
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 +165 -115
- package/bin/eslint.js +112 -89
- package/conf/default-cli-options.js +22 -22
- package/conf/ecma-version.js +16 -0
- package/conf/globals.js +109 -94
- package/conf/replacements.json +24 -20
- package/conf/rule-type-list.json +89 -26
- package/lib/api.js +16 -20
- package/lib/cli-engine/cli-engine.js +841 -810
- package/lib/cli-engine/file-enumerator.js +384 -390
- package/lib/cli-engine/formatters/formatters-meta.json +17 -45
- package/lib/cli-engine/formatters/html.js +110 -102
- 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 +97 -76
- package/lib/cli-engine/hash.js +1 -1
- package/lib/cli-engine/index.js +1 -1
- package/lib/cli-engine/lint-result-cache.js +165 -148
- package/lib/cli-engine/load-rules.js +17 -17
- package/lib/cli.js +481 -399
- package/lib/config/config-loader.js +816 -0
- package/lib/config/config.js +674 -0
- package/lib/config/default-config.js +57 -46
- package/lib/config/flat-config-array.js +170 -333
- package/lib/config/flat-config-schema.js +389 -389
- package/lib/config-api.js +12 -0
- package/lib/eslint/eslint-helpers.js +1196 -663
- package/lib/eslint/eslint.js +1262 -607
- package/lib/eslint/index.js +3 -3
- package/lib/eslint/legacy-eslint.js +786 -0
- package/lib/eslint/worker.js +173 -0
- package/lib/languages/js/index.js +336 -0
- package/lib/languages/js/source-code/index.js +7 -0
- package/lib/languages/js/source-code/source-code.js +1364 -0
- package/lib/languages/js/source-code/token-store/backward-token-comment-cursor.js +61 -0
- package/lib/languages/js/source-code/token-store/backward-token-cursor.js +57 -0
- package/lib/{source-code → languages/js/source-code}/token-store/cursor.js +36 -36
- package/lib/languages/js/source-code/token-store/cursors.js +120 -0
- package/lib/{source-code → languages/js/source-code}/token-store/decorative-cursor.js +17 -18
- package/lib/{source-code → languages/js/source-code}/token-store/filter-cursor.js +19 -20
- package/lib/languages/js/source-code/token-store/forward-token-comment-cursor.js +65 -0
- package/lib/languages/js/source-code/token-store/forward-token-cursor.js +62 -0
- package/lib/languages/js/source-code/token-store/index.js +721 -0
- package/lib/{source-code → languages/js/source-code}/token-store/limit-cursor.js +17 -18
- package/lib/languages/js/source-code/token-store/padded-token-cursor.js +45 -0
- package/lib/{source-code → languages/js/source-code}/token-store/skip-cursor.js +19 -20
- package/lib/languages/js/source-code/token-store/utils.js +110 -0
- package/lib/languages/js/validate-language-options.js +196 -0
- package/lib/linter/apply-disable-directives.js +490 -371
- package/lib/linter/code-path-analysis/code-path-analyzer.js +650 -674
- 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 -317
- package/lib/linter/code-path-analysis/debug-helpers.js +183 -163
- package/lib/linter/code-path-analysis/fork-context.js +297 -272
- package/lib/linter/code-path-analysis/id-generator.js +22 -23
- package/lib/linter/esquery.js +332 -0
- package/lib/linter/file-context.js +144 -0
- package/lib/linter/file-report.js +608 -0
- package/lib/linter/index.js +3 -5
- package/lib/linter/interpolate.js +38 -16
- package/lib/linter/linter.js +2328 -1785
- package/lib/linter/rule-fixer.js +136 -107
- package/lib/linter/rules.js +37 -46
- package/lib/linter/source-code-fixer.js +96 -94
- package/lib/linter/source-code-traverser.js +333 -0
- package/lib/linter/source-code-visitor.js +81 -0
- package/lib/linter/timing.js +145 -97
- package/lib/linter/vfile.js +115 -0
- package/lib/options.js +464 -326
- package/lib/rule-tester/index.js +3 -1
- package/lib/rule-tester/rule-tester.js +1371 -998
- package/lib/rules/accessor-pairs.js +333 -259
- package/lib/rules/array-bracket-newline.js +250 -220
- package/lib/rules/array-bracket-spacing.js +286 -229
- package/lib/rules/array-callback-return.js +401 -354
- package/lib/rules/array-element-newline.js +358 -295
- package/lib/rules/arrow-body-style.js +400 -278
- package/lib/rules/arrow-parens.js +206 -155
- package/lib/rules/arrow-spacing.js +169 -145
- package/lib/rules/block-scoped-var.js +125 -123
- package/lib/rules/block-spacing.js +186 -158
- package/lib/rules/brace-style.js +262 -181
- package/lib/rules/callback-return.js +203 -174
- package/lib/rules/camelcase.js +403 -380
- package/lib/rules/capitalized-comments.js +253 -228
- package/lib/rules/class-methods-use-this.js +231 -168
- package/lib/rules/comma-dangle.js +379 -328
- package/lib/rules/comma-spacing.js +193 -177
- package/lib/rules/comma-style.js +375 -298
- package/lib/rules/complexity.js +180 -144
- package/lib/rules/computed-property-spacing.js +236 -193
- package/lib/rules/consistent-return.js +181 -170
- package/lib/rules/consistent-this.js +167 -141
- package/lib/rules/constructor-super.js +418 -411
- package/lib/rules/curly.js +407 -468
- package/lib/rules/default-case-last.js +39 -32
- package/lib/rules/default-case.js +89 -83
- package/lib/rules/default-param-last.js +69 -53
- package/lib/rules/dot-location.js +122 -92
- package/lib/rules/dot-notation.js +193 -153
- package/lib/rules/eol-last.js +122 -102
- package/lib/rules/eqeqeq.js +191 -155
- package/lib/rules/for-direction.js +150 -122
- package/lib/rules/func-call-spacing.js +261 -213
- package/lib/rules/func-name-matching.js +294 -209
- package/lib/rules/func-names.js +165 -164
- package/lib/rules/func-style.js +209 -86
- package/lib/rules/function-call-argument-newline.js +152 -111
- package/lib/rules/function-paren-newline.js +349 -273
- package/lib/rules/generator-star-spacing.js +229 -192
- package/lib/rules/getter-return.js +208 -170
- package/lib/rules/global-require.js +85 -58
- package/lib/rules/grouped-accessor-pairs.js +201 -148
- package/lib/rules/guard-for-in.js +72 -63
- package/lib/rules/handle-callback-err.js +108 -87
- package/lib/rules/id-blacklist.js +182 -187
- package/lib/rules/id-denylist.js +174 -179
- package/lib/rules/id-length.js +197 -157
- package/lib/rules/id-match.js +350 -286
- package/lib/rules/implicit-arrow-linebreak.js +102 -61
- package/lib/rules/indent-legacy.js +1345 -1102
- package/lib/rules/indent.js +2272 -1741
- package/lib/rules/index.js +320 -294
- package/lib/rules/init-declarations.js +139 -106
- package/lib/rules/jsx-quotes.js +94 -64
- package/lib/rules/key-spacing.js +750 -615
- package/lib/rules/keyword-spacing.js +648 -587
- package/lib/rules/line-comment-position.js +143 -108
- package/lib/rules/linebreak-style.js +115 -88
- package/lib/rules/lines-around-comment.js +540 -430
- package/lib/rules/lines-around-directive.js +233 -185
- package/lib/rules/lines-between-class-members.js +305 -216
- package/lib/rules/logical-assignment-operators.js +582 -398
- package/lib/rules/max-classes-per-file.js +69 -68
- package/lib/rules/max-depth.js +146 -143
- package/lib/rules/max-len.js +473 -416
- package/lib/rules/max-lines-per-function.js +201 -176
- package/lib/rules/max-lines.js +158 -162
- package/lib/rules/max-nested-callbacks.js +102 -104
- package/lib/rules/max-params.js +102 -75
- package/lib/rules/max-statements-per-line.js +205 -180
- package/lib/rules/max-statements.js +168 -164
- package/lib/rules/multiline-comment-style.js +638 -460
- package/lib/rules/multiline-ternary.js +241 -158
- package/lib/rules/new-cap.js +233 -232
- package/lib/rules/new-parens.js +88 -61
- package/lib/rules/newline-after-var.js +287 -233
- package/lib/rules/newline-before-return.js +229 -204
- package/lib/rules/newline-per-chained-call.js +142 -109
- package/lib/rules/no-alert.js +90 -79
- package/lib/rules/no-array-constructor.js +175 -113
- package/lib/rules/no-async-promise-executor.js +30 -24
- package/lib/rules/no-await-in-loop.js +79 -70
- package/lib/rules/no-bitwise.js +113 -87
- package/lib/rules/no-buffer-constructor.js +61 -37
- package/lib/rules/no-caller.js +39 -33
- package/lib/rules/no-case-declarations.js +61 -45
- package/lib/rules/no-catch-shadow.js +76 -62
- package/lib/rules/no-class-assign.js +51 -48
- package/lib/rules/no-compare-neg-zero.js +62 -48
- package/lib/rules/no-cond-assign.js +148 -132
- package/lib/rules/no-confusing-arrow.js +98 -63
- package/lib/rules/no-console.js +202 -188
- package/lib/rules/no-const-assign.js +58 -41
- package/lib/rules/no-constant-binary-expression.js +501 -407
- package/lib/rules/no-constant-condition.js +158 -131
- package/lib/rules/no-constructor-return.js +49 -49
- package/lib/rules/no-continue.js +25 -26
- package/lib/rules/no-control-regex.js +125 -121
- package/lib/rules/no-debugger.js +28 -30
- package/lib/rules/no-delete-var.js +29 -29
- package/lib/rules/no-div-regex.js +47 -40
- package/lib/rules/no-dupe-args.js +79 -69
- package/lib/rules/no-dupe-class-members.js +102 -89
- package/lib/rules/no-dupe-else-if.js +100 -77
- package/lib/rules/no-dupe-keys.js +133 -110
- package/lib/rules/no-duplicate-case.js +50 -43
- package/lib/rules/no-duplicate-imports.js +266 -188
- package/lib/rules/no-else-return.js +430 -385
- package/lib/rules/no-empty-character-class.js +57 -50
- package/lib/rules/no-empty-function.js +197 -128
- package/lib/rules/no-empty-pattern.js +63 -56
- package/lib/rules/no-empty-static-block.js +61 -35
- package/lib/rules/no-empty.js +135 -85
- package/lib/rules/no-eq-null.js +37 -32
- package/lib/rules/no-eval.js +258 -249
- package/lib/rules/no-ex-assign.js +42 -39
- package/lib/rules/no-extend-native.js +161 -160
- package/lib/rules/no-extra-bind.js +201 -190
- package/lib/rules/no-extra-boolean-cast.js +398 -295
- package/lib/rules/no-extra-label.js +150 -130
- package/lib/rules/no-extra-parens.js +1654 -1307
- package/lib/rules/no-extra-semi.js +146 -126
- package/lib/rules/no-fallthrough.js +200 -136
- package/lib/rules/no-floating-decimal.js +74 -48
- package/lib/rules/no-func-assign.js +54 -55
- package/lib/rules/no-global-assign.js +78 -72
- package/lib/rules/no-implicit-coercion.js +350 -262
- package/lib/rules/no-implicit-globals.js +174 -133
- package/lib/rules/no-implied-eval.js +150 -112
- package/lib/rules/no-import-assign.js +145 -159
- package/lib/rules/no-inline-comments.js +101 -96
- package/lib/rules/no-inner-declarations.js +115 -78
- package/lib/rules/no-invalid-regexp.js +223 -174
- package/lib/rules/no-invalid-this.js +145 -117
- package/lib/rules/no-irregular-whitespace.js +266 -250
- package/lib/rules/no-iterator.js +29 -33
- package/lib/rules/no-label-var.js +59 -61
- package/lib/rules/no-labels.js +138 -131
- package/lib/rules/no-lone-blocks.js +127 -123
- package/lib/rules/no-lonely-if.js +105 -67
- package/lib/rules/no-loop-func.js +245 -184
- package/lib/rules/no-loss-of-precision.js +236 -201
- package/lib/rules/no-magic-numbers.js +339 -217
- package/lib/rules/no-misleading-character-class.js +548 -253
- package/lib/rules/no-mixed-operators.js +188 -164
- package/lib/rules/no-mixed-requires.js +253 -224
- package/lib/rules/no-mixed-spaces-and-tabs.js +135 -103
- package/lib/rules/no-multi-assign.js +46 -47
- package/lib/rules/no-multi-spaces.js +163 -125
- package/lib/rules/no-multi-str.js +42 -40
- package/lib/rules/no-multiple-empty-lines.js +196 -140
- package/lib/rules/no-native-reassign.js +90 -74
- package/lib/rules/no-negated-condition.js +79 -74
- package/lib/rules/no-negated-in-lhs.js +45 -32
- package/lib/rules/no-nested-ternary.js +33 -31
- package/lib/rules/no-new-func.js +71 -62
- package/lib/rules/no-new-native-nonconstructor.js +43 -39
- package/lib/rules/no-new-object.js +48 -39
- package/lib/rules/no-new-require.js +48 -31
- package/lib/rules/no-new-symbol.js +61 -43
- package/lib/rules/no-new-wrappers.js +43 -41
- package/lib/rules/no-new.js +28 -29
- package/lib/rules/no-nonoctal-decimal-escape.js +149 -121
- package/lib/rules/no-obj-calls.js +66 -53
- package/lib/rules/no-object-constructor.js +104 -97
- package/lib/rules/no-octal-escape.js +40 -43
- package/lib/rules/no-octal.js +29 -32
- package/lib/rules/no-param-reassign.js +236 -218
- package/lib/rules/no-path-concat.js +66 -51
- package/lib/rules/no-plusplus.js +60 -63
- package/lib/rules/no-process-env.js +49 -32
- package/lib/rules/no-process-exit.js +48 -28
- package/lib/rules/no-promise-executor-return.js +205 -204
- package/lib/rules/no-proto.js +26 -29
- package/lib/rules/no-prototype-builtins.js +146 -124
- package/lib/rules/no-redeclare.js +154 -155
- package/lib/rules/no-regex-spaces.js +183 -161
- package/lib/rules/no-restricted-exports.js +208 -174
- package/lib/rules/no-restricted-globals.js +254 -112
- package/lib/rules/no-restricted-imports.js +824 -384
- package/lib/rules/no-restricted-modules.js +222 -186
- package/lib/rules/no-restricted-properties.js +218 -153
- package/lib/rules/no-restricted-syntax.js +56 -52
- package/lib/rules/no-return-assign.js +56 -49
- package/lib/rules/no-return-await.js +147 -120
- package/lib/rules/no-script-url.js +53 -46
- package/lib/rules/no-self-assign.js +148 -145
- package/lib/rules/no-self-compare.js +63 -46
- package/lib/rules/no-sequences.js +135 -115
- package/lib/rules/no-setter-return.js +176 -178
- package/lib/rules/no-shadow-restricted-names.js +84 -36
- package/lib/rules/no-shadow.js +598 -310
- package/lib/rules/no-spaced-func.js +82 -60
- package/lib/rules/no-sparse-arrays.js +46 -28
- package/lib/rules/no-sync.js +61 -44
- package/lib/rules/no-tabs.js +83 -54
- package/lib/rules/no-template-curly-in-string.js +33 -32
- package/lib/rules/no-ternary.js +25 -28
- package/lib/rules/no-this-before-super.js +332 -298
- package/lib/rules/no-throw-literal.js +31 -36
- package/lib/rules/no-trailing-spaces.js +208 -174
- package/lib/rules/no-unassigned-vars.js +80 -0
- package/lib/rules/no-undef-init.js +86 -60
- package/lib/rules/no-undef.js +52 -47
- package/lib/rules/no-undefined.js +73 -74
- package/lib/rules/no-underscore-dangle.js +370 -322
- package/lib/rules/no-unexpected-multiline.js +112 -102
- package/lib/rules/no-unmodified-loop-condition.js +254 -254
- package/lib/rules/no-unneeded-ternary.js +212 -146
- package/lib/rules/no-unreachable-loop.js +145 -140
- package/lib/rules/no-unreachable.js +255 -248
- package/lib/rules/no-unsafe-finally.js +93 -85
- package/lib/rules/no-unsafe-negation.js +105 -81
- package/lib/rules/no-unsafe-optional-chaining.js +193 -177
- package/lib/rules/no-unused-expressions.js +199 -158
- package/lib/rules/no-unused-labels.js +139 -124
- package/lib/rules/no-unused-private-class-members.js +206 -182
- package/lib/rules/no-unused-vars.js +1708 -687
- package/lib/rules/no-use-before-define.js +327 -229
- package/lib/rules/no-useless-assignment.js +654 -0
- package/lib/rules/no-useless-backreference.js +212 -143
- package/lib/rules/no-useless-call.js +58 -53
- package/lib/rules/no-useless-catch.js +40 -40
- package/lib/rules/no-useless-computed-key.js +144 -108
- package/lib/rules/no-useless-concat.js +65 -59
- package/lib/rules/no-useless-constructor.js +160 -97
- package/lib/rules/no-useless-escape.js +364 -291
- package/lib/rules/no-useless-rename.js +183 -153
- package/lib/rules/no-useless-return.js +344 -307
- package/lib/rules/no-var.js +245 -212
- package/lib/rules/no-void.js +51 -46
- package/lib/rules/no-warning-comments.js +191 -183
- package/lib/rules/no-whitespace-before-property.js +131 -97
- package/lib/rules/no-with.js +24 -26
- package/lib/rules/nonblock-statement-body-position.js +149 -112
- package/lib/rules/object-curly-newline.js +306 -247
- package/lib/rules/object-curly-spacing.js +360 -296
- package/lib/rules/object-property-newline.js +137 -88
- package/lib/rules/object-shorthand.js +632 -500
- package/lib/rules/one-var-declaration-per-line.js +104 -82
- package/lib/rules/one-var.js +686 -536
- package/lib/rules/operator-assignment.js +219 -158
- package/lib/rules/operator-linebreak.js +295 -233
- package/lib/rules/padded-blocks.js +346 -290
- package/lib/rules/padding-line-between-statements.js +443 -421
- package/lib/rules/prefer-arrow-callback.js +371 -315
- package/lib/rules/prefer-const.js +418 -373
- package/lib/rules/prefer-destructuring.js +309 -278
- package/lib/rules/prefer-exponentiation-operator.js +176 -132
- package/lib/rules/prefer-named-capture-group.js +160 -141
- package/lib/rules/prefer-numeric-literals.js +121 -112
- package/lib/rules/prefer-object-has-own.js +116 -82
- package/lib/rules/prefer-object-spread.js +214 -193
- package/lib/rules/prefer-promise-reject-errors.js +140 -118
- package/lib/rules/prefer-reflect.js +126 -103
- package/lib/rules/prefer-regex-literals.js +561 -463
- package/lib/rules/prefer-rest-params.js +79 -80
- package/lib/rules/prefer-spread.js +47 -43
- package/lib/rules/prefer-template.js +266 -194
- package/lib/rules/preserve-caught-error.js +535 -0
- package/lib/rules/quote-props.js +373 -289
- package/lib/rules/quotes.js +374 -308
- package/lib/rules/radix.js +152 -134
- package/lib/rules/require-atomic-updates.js +316 -282
- package/lib/rules/require-await.js +153 -82
- package/lib/rules/require-unicode-regexp.js +296 -108
- package/lib/rules/require-yield.js +53 -54
- package/lib/rules/rest-spread-spacing.js +128 -98
- package/lib/rules/semi-spacing.js +281 -232
- package/lib/rules/semi-style.js +176 -116
- package/lib/rules/semi.js +456 -418
- package/lib/rules/sort-imports.js +307 -229
- package/lib/rules/sort-keys.js +219 -181
- package/lib/rules/sort-vars.js +127 -91
- package/lib/rules/space-before-blocks.js +199 -171
- package/lib/rules/space-before-function-paren.js +186 -148
- package/lib/rules/space-in-parens.js +359 -270
- package/lib/rules/space-infix-ops.js +237 -183
- package/lib/rules/space-unary-ops.js +356 -280
- package/lib/rules/spaced-comment.js +363 -301
- package/lib/rules/strict.js +266 -229
- package/lib/rules/switch-colon-spacing.js +130 -104
- package/lib/rules/symbol-description.js +45 -48
- package/lib/rules/template-curly-spacing.js +148 -124
- package/lib/rules/template-tag-spacing.js +98 -70
- package/lib/rules/unicode-bom.js +54 -54
- package/lib/rules/use-isnan.js +237 -110
- package/lib/rules/utils/ast-utils.js +2139 -1688
- package/lib/rules/utils/char-source.js +247 -0
- package/lib/rules/utils/fix-tracker.js +99 -88
- package/lib/rules/utils/keywords.js +59 -59
- package/lib/rules/utils/lazy-loading-rule-map.js +81 -78
- package/lib/rules/utils/regular-expressions.js +35 -19
- package/lib/rules/utils/unicode/index.js +9 -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 +153 -109
- package/lib/rules/vars-on-top.js +152 -144
- package/lib/rules/wrap-iife.js +204 -173
- package/lib/rules/wrap-regex.js +77 -47
- package/lib/rules/yield-star-spacing.js +145 -116
- package/lib/rules/yoda.js +283 -274
- package/lib/services/parser-service.js +65 -0
- package/lib/services/processor-service.js +101 -0
- package/lib/services/suppressions-service.js +302 -0
- package/lib/services/warning-service.js +98 -0
- package/lib/shared/ajv.js +14 -14
- package/lib/shared/assert.js +21 -0
- package/lib/shared/ast-utils.js +7 -6
- package/lib/shared/deep-merge-arrays.js +62 -0
- package/lib/shared/directives.js +3 -2
- package/lib/shared/flags.js +108 -0
- package/lib/shared/logging.js +24 -16
- package/lib/shared/naming.js +109 -0
- package/lib/shared/option-utils.js +63 -0
- package/lib/shared/relative-module-resolver.js +18 -40
- package/lib/shared/runtime-info.js +138 -128
- package/lib/shared/serialization.js +78 -0
- package/lib/shared/severity.js +22 -22
- package/lib/shared/stats.js +30 -0
- package/lib/shared/string-utils.js +19 -21
- package/lib/shared/text-table.js +68 -0
- package/lib/shared/translate-cli-options.js +281 -0
- package/lib/shared/traverser.js +153 -146
- package/lib/types/config-api.d.ts +12 -0
- package/lib/types/index.d.ts +1473 -0
- package/lib/types/rules.d.ts +5589 -0
- package/lib/types/universal.d.ts +6 -0
- package/lib/types/use-at-your-own-risk.d.ts +87 -0
- package/lib/universal.js +10 -0
- package/lib/unsupported-api.js +8 -9
- package/messages/all-files-ignored.js +3 -3
- package/messages/all-matched-files-ignored.js +21 -0
- package/messages/config-file-missing.js +16 -0
- package/messages/config-plugin-missing.js +14 -0
- package/messages/config-serialize-function.js +30 -0
- package/messages/eslintrc-incompat.js +35 -16
- package/messages/eslintrc-plugins.js +8 -5
- 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 +4 -4
- package/messages/plugin-conflict.js +9 -9
- package/messages/plugin-invalid.js +4 -4
- package/messages/plugin-missing.js +4 -4
- 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 +105 -60
- package/conf/config-schema.js +0 -93
- package/lib/cli-engine/formatters/checkstyle.js +0 -60
- package/lib/cli-engine/formatters/compact.js +0 -60
- package/lib/cli-engine/formatters/jslint-xml.js +0 -41
- package/lib/cli-engine/formatters/junit.js +0 -82
- package/lib/cli-engine/formatters/tap.js +0 -95
- package/lib/cli-engine/formatters/unix.js +0 -58
- package/lib/cli-engine/formatters/visualstudio.js +0 -63
- package/lib/cli-engine/xml-escape.js +0 -34
- package/lib/config/flat-config-helpers.js +0 -111
- package/lib/config/rule-validator.js +0 -158
- package/lib/eslint/flat-eslint.js +0 -1159
- package/lib/linter/config-comment-parser.js +0 -185
- package/lib/linter/node-event-generator.js +0 -354
- package/lib/linter/report-translator.js +0 -369
- package/lib/linter/safe-emitter.js +0 -52
- package/lib/rule-tester/flat-rule-tester.js +0 -1131
- package/lib/rules/require-jsdoc.js +0 -122
- package/lib/rules/utils/patterns/letters.js +0 -36
- package/lib/rules/valid-jsdoc.js +0 -516
- package/lib/shared/config-validator.js +0 -347
- package/lib/shared/deprecation-warnings.js +0 -58
- package/lib/shared/types.js +0 -216
- package/lib/source-code/index.js +0 -5
- package/lib/source-code/source-code.js +0 -1055
- package/lib/source-code/token-store/backward-token-comment-cursor.js +0 -57
- package/lib/source-code/token-store/backward-token-cursor.js +0 -58
- package/lib/source-code/token-store/cursors.js +0 -90
- package/lib/source-code/token-store/forward-token-comment-cursor.js +0 -57
- package/lib/source-code/token-store/forward-token-cursor.js +0 -63
- package/lib/source-code/token-store/index.js +0 -627
- package/lib/source-code/token-store/padded-token-cursor.js +0 -38
- package/lib/source-code/token-store/utils.js +0 -107
|
@@ -9,11 +9,6 @@
|
|
|
9
9
|
// Requirements
|
|
10
10
|
//-----------------------------------------------------------------------------
|
|
11
11
|
|
|
12
|
-
/*
|
|
13
|
-
* Note: This can be removed in ESLint v9 because structuredClone is available globally
|
|
14
|
-
* starting in Node.js v17.
|
|
15
|
-
*/
|
|
16
|
-
const structuredClone = require("@ungap/structured-clone").default;
|
|
17
12
|
const { normalizeSeverityToNumber } = require("../shared/severity");
|
|
18
13
|
|
|
19
14
|
//-----------------------------------------------------------------------------
|
|
@@ -33,15 +28,12 @@ const { normalizeSeverityToNumber } = require("../shared/severity");
|
|
|
33
28
|
//-----------------------------------------------------------------------------
|
|
34
29
|
|
|
35
30
|
const ruleSeverities = new Map([
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
]
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
true, "true", "writable", "writeable",
|
|
43
|
-
false, "false", "readonly", "readable", null,
|
|
44
|
-
"off"
|
|
31
|
+
[0, 0],
|
|
32
|
+
["off", 0],
|
|
33
|
+
[1, 1],
|
|
34
|
+
["warn", 1],
|
|
35
|
+
[2, 2],
|
|
36
|
+
["error", 2],
|
|
45
37
|
]);
|
|
46
38
|
|
|
47
39
|
/**
|
|
@@ -50,7 +42,7 @@ const globalVariablesValues = new Set([
|
|
|
50
42
|
* @returns {boolean} `true` if the value is a non-null object.
|
|
51
43
|
*/
|
|
52
44
|
function isNonNullObject(value) {
|
|
53
|
-
|
|
45
|
+
return typeof value === "object" && value !== null;
|
|
54
46
|
}
|
|
55
47
|
|
|
56
48
|
/**
|
|
@@ -59,7 +51,7 @@ function isNonNullObject(value) {
|
|
|
59
51
|
* @returns {boolean} `true` if the value is a non-null non-array object.
|
|
60
52
|
*/
|
|
61
53
|
function isNonArrayObject(value) {
|
|
62
|
-
|
|
54
|
+
return isNonNullObject(value) && !Array.isArray(value);
|
|
63
55
|
}
|
|
64
56
|
|
|
65
57
|
/**
|
|
@@ -68,7 +60,7 @@ function isNonArrayObject(value) {
|
|
|
68
60
|
* @returns {boolean} `true` if the value is undefined.
|
|
69
61
|
*/
|
|
70
62
|
function isUndefined(value) {
|
|
71
|
-
|
|
63
|
+
return typeof value === "undefined";
|
|
72
64
|
}
|
|
73
65
|
|
|
74
66
|
/**
|
|
@@ -79,57 +71,56 @@ function isUndefined(value) {
|
|
|
79
71
|
* @returns {Object} An object with properties from both first and second.
|
|
80
72
|
*/
|
|
81
73
|
function deepMerge(first, second, mergeMap = new Map()) {
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
74
|
+
let secondMergeMap = mergeMap.get(first);
|
|
75
|
+
|
|
76
|
+
if (secondMergeMap) {
|
|
77
|
+
const result = secondMergeMap.get(second);
|
|
78
|
+
|
|
79
|
+
if (result) {
|
|
80
|
+
// If this combination of first and second arguments has been already visited, return the previously created result.
|
|
81
|
+
return result;
|
|
82
|
+
}
|
|
83
|
+
} else {
|
|
84
|
+
secondMergeMap = new Map();
|
|
85
|
+
mergeMap.set(first, secondMergeMap);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/*
|
|
89
|
+
* First create a result object where properties from the second object
|
|
90
|
+
* overwrite properties from the first. This sets up a baseline to use
|
|
91
|
+
* later rather than needing to inspect and change every property
|
|
92
|
+
* individually.
|
|
93
|
+
*/
|
|
94
|
+
const result = {
|
|
95
|
+
...first,
|
|
96
|
+
...second,
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
delete result.__proto__; // eslint-disable-line no-proto -- don't merge own property "__proto__"
|
|
100
|
+
|
|
101
|
+
// Store the pending result for this combination of first and second arguments.
|
|
102
|
+
secondMergeMap.set(second, result);
|
|
103
|
+
|
|
104
|
+
for (const key of Object.keys(second)) {
|
|
105
|
+
// avoid hairy edge case
|
|
106
|
+
if (
|
|
107
|
+
key === "__proto__" ||
|
|
108
|
+
!Object.prototype.propertyIsEnumerable.call(first, key)
|
|
109
|
+
) {
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
const firstValue = first[key];
|
|
114
|
+
const secondValue = second[key];
|
|
115
|
+
|
|
116
|
+
if (isNonArrayObject(firstValue) && isNonArrayObject(secondValue)) {
|
|
117
|
+
result[key] = deepMerge(firstValue, secondValue, mergeMap);
|
|
118
|
+
} else if (isUndefined(secondValue)) {
|
|
119
|
+
result[key] = firstValue;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
return result;
|
|
133
124
|
}
|
|
134
125
|
|
|
135
126
|
/**
|
|
@@ -139,13 +130,27 @@ function deepMerge(first, second, mergeMap = new Map()) {
|
|
|
139
130
|
* @returns {Array} An array of rule options.
|
|
140
131
|
*/
|
|
141
132
|
function normalizeRuleOptions(ruleOptions) {
|
|
133
|
+
const finalOptions = Array.isArray(ruleOptions)
|
|
134
|
+
? ruleOptions.slice(0)
|
|
135
|
+
: [ruleOptions];
|
|
142
136
|
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
137
|
+
finalOptions[0] = ruleSeverities.get(finalOptions[0]);
|
|
138
|
+
return structuredClone(finalOptions);
|
|
139
|
+
}
|
|
146
140
|
|
|
147
|
-
|
|
148
|
-
|
|
141
|
+
/**
|
|
142
|
+
* Determines if an object has any methods.
|
|
143
|
+
* @param {Object} object The object to check.
|
|
144
|
+
* @returns {boolean} `true` if the object has any methods.
|
|
145
|
+
*/
|
|
146
|
+
function hasMethod(object) {
|
|
147
|
+
for (const key of Object.keys(object)) {
|
|
148
|
+
if (typeof object[key] === "function") {
|
|
149
|
+
return true;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
return false;
|
|
149
154
|
}
|
|
150
155
|
|
|
151
156
|
//-----------------------------------------------------------------------------
|
|
@@ -156,16 +161,17 @@ function normalizeRuleOptions(ruleOptions) {
|
|
|
156
161
|
* The error type when a rule's options are configured with an invalid type.
|
|
157
162
|
*/
|
|
158
163
|
class InvalidRuleOptionsError extends Error {
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
164
|
+
/**
|
|
165
|
+
* @param {string} ruleId Rule name being configured.
|
|
166
|
+
* @param {any} value The invalid value.
|
|
167
|
+
*/
|
|
168
|
+
constructor(ruleId, value) {
|
|
169
|
+
super(
|
|
170
|
+
`Key "${ruleId}": Expected severity of "off", 0, "warn", 1, "error", or 2.`,
|
|
171
|
+
);
|
|
172
|
+
this.messageTemplate = "invalid-rule-options";
|
|
173
|
+
this.messageData = { ruleId, value };
|
|
174
|
+
}
|
|
169
175
|
}
|
|
170
176
|
|
|
171
177
|
/**
|
|
@@ -176,25 +182,30 @@ class InvalidRuleOptionsError extends Error {
|
|
|
176
182
|
* @throws {InvalidRuleOptionsError} If the value isn't a valid rule options.
|
|
177
183
|
*/
|
|
178
184
|
function assertIsRuleOptions(ruleId, value) {
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
185
|
+
if (
|
|
186
|
+
typeof value !== "string" &&
|
|
187
|
+
typeof value !== "number" &&
|
|
188
|
+
!Array.isArray(value)
|
|
189
|
+
) {
|
|
190
|
+
throw new InvalidRuleOptionsError(ruleId, value);
|
|
191
|
+
}
|
|
182
192
|
}
|
|
183
193
|
|
|
184
194
|
/**
|
|
185
195
|
* The error type when a rule's severity is invalid.
|
|
186
196
|
*/
|
|
187
197
|
class InvalidRuleSeverityError extends Error {
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
+
/**
|
|
199
|
+
* @param {string} ruleId Rule name being configured.
|
|
200
|
+
* @param {any} value The invalid value.
|
|
201
|
+
*/
|
|
202
|
+
constructor(ruleId, value) {
|
|
203
|
+
super(
|
|
204
|
+
`Key "${ruleId}": Expected severity of "off", 0, "warn", 1, "error", or 2.`,
|
|
205
|
+
);
|
|
206
|
+
this.messageTemplate = "invalid-rule-severity";
|
|
207
|
+
this.messageData = { ruleId, value };
|
|
208
|
+
}
|
|
198
209
|
}
|
|
199
210
|
|
|
200
211
|
/**
|
|
@@ -205,11 +216,11 @@ class InvalidRuleSeverityError extends Error {
|
|
|
205
216
|
* @throws {InvalidRuleSeverityError} If the value isn't a valid rule severity.
|
|
206
217
|
*/
|
|
207
218
|
function assertIsRuleSeverity(ruleId, value) {
|
|
208
|
-
|
|
219
|
+
const severity = ruleSeverities.get(value);
|
|
209
220
|
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
221
|
+
if (typeof severity === "undefined") {
|
|
222
|
+
throw new InvalidRuleSeverityError(ruleId, value);
|
|
223
|
+
}
|
|
213
224
|
}
|
|
214
225
|
|
|
215
226
|
/**
|
|
@@ -219,9 +230,11 @@ function assertIsRuleSeverity(ruleId, value) {
|
|
|
219
230
|
* @throws {TypeError} If the string isn't in the correct format.
|
|
220
231
|
*/
|
|
221
232
|
function assertIsPluginMemberName(value) {
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
233
|
+
if (!/[\w\-@$]+(?:\/[\w\-$]+)+$/iu.test(value)) {
|
|
234
|
+
throw new TypeError(
|
|
235
|
+
`Expected string in the form "pluginName/objectName" but found "${value}".`,
|
|
236
|
+
);
|
|
237
|
+
}
|
|
225
238
|
}
|
|
226
239
|
|
|
227
240
|
/**
|
|
@@ -231,79 +244,98 @@ function assertIsPluginMemberName(value) {
|
|
|
231
244
|
* @throws {TypeError} If the value isn't an object.
|
|
232
245
|
*/
|
|
233
246
|
function assertIsObject(value) {
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
247
|
+
if (!isNonNullObject(value)) {
|
|
248
|
+
throw new TypeError("Expected an object.");
|
|
249
|
+
}
|
|
237
250
|
}
|
|
238
251
|
|
|
239
252
|
/**
|
|
240
253
|
* The error type when there's an eslintrc-style options in a flat config.
|
|
241
254
|
*/
|
|
242
255
|
class IncompatibleKeyError extends Error {
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
256
|
+
/**
|
|
257
|
+
* @param {string} key The invalid key.
|
|
258
|
+
*/
|
|
259
|
+
constructor(key) {
|
|
260
|
+
super(
|
|
261
|
+
"This appears to be in eslintrc format rather than flat config format.",
|
|
262
|
+
);
|
|
263
|
+
this.messageTemplate = "eslintrc-incompat";
|
|
264
|
+
this.messageData = { key };
|
|
265
|
+
}
|
|
252
266
|
}
|
|
253
267
|
|
|
254
268
|
/**
|
|
255
269
|
* The error type when there's an eslintrc-style plugins array found.
|
|
256
270
|
*/
|
|
257
271
|
class IncompatiblePluginsError extends Error {
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
272
|
+
/**
|
|
273
|
+
* Creates a new instance.
|
|
274
|
+
* @param {Array<string>} plugins The plugins array.
|
|
275
|
+
*/
|
|
276
|
+
constructor(plugins) {
|
|
277
|
+
super(
|
|
278
|
+
"This appears to be in eslintrc format (array of strings) rather than flat config format (object).",
|
|
279
|
+
);
|
|
280
|
+
this.messageTemplate = "eslintrc-plugins";
|
|
281
|
+
this.messageData = { plugins };
|
|
282
|
+
}
|
|
268
283
|
}
|
|
269
284
|
|
|
270
|
-
|
|
271
285
|
//-----------------------------------------------------------------------------
|
|
272
286
|
// Low-Level Schemas
|
|
273
287
|
//-----------------------------------------------------------------------------
|
|
274
288
|
|
|
275
289
|
/** @type {ObjectPropertySchema} */
|
|
276
290
|
const booleanSchema = {
|
|
277
|
-
|
|
278
|
-
|
|
291
|
+
merge: "replace",
|
|
292
|
+
validate: "boolean",
|
|
279
293
|
};
|
|
280
294
|
|
|
281
295
|
const ALLOWED_SEVERITIES = new Set(["error", "warn", "off", 2, 1, 0]);
|
|
282
296
|
|
|
283
297
|
/** @type {ObjectPropertySchema} */
|
|
284
298
|
const disableDirectiveSeveritySchema = {
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
+
merge(first, second) {
|
|
300
|
+
const value = second === void 0 ? first : second;
|
|
301
|
+
|
|
302
|
+
if (typeof value === "boolean") {
|
|
303
|
+
return value ? "warn" : "off";
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
return normalizeSeverityToNumber(value);
|
|
307
|
+
},
|
|
308
|
+
validate(value) {
|
|
309
|
+
if (!(ALLOWED_SEVERITIES.has(value) || typeof value === "boolean")) {
|
|
310
|
+
throw new TypeError(
|
|
311
|
+
'Expected one of: "error", "warn", "off", 0, 1, 2, or a boolean.',
|
|
312
|
+
);
|
|
313
|
+
}
|
|
314
|
+
},
|
|
315
|
+
};
|
|
316
|
+
|
|
317
|
+
/** @type {ObjectPropertySchema} */
|
|
318
|
+
const unusedInlineConfigsSeveritySchema = {
|
|
319
|
+
merge(first, second) {
|
|
320
|
+
const value = second === void 0 ? first : second;
|
|
321
|
+
|
|
322
|
+
return normalizeSeverityToNumber(value);
|
|
323
|
+
},
|
|
324
|
+
validate(value) {
|
|
325
|
+
if (!ALLOWED_SEVERITIES.has(value)) {
|
|
326
|
+
throw new TypeError(
|
|
327
|
+
'Expected one of: "error", "warn", "off", 0, 1, or 2.',
|
|
328
|
+
);
|
|
329
|
+
}
|
|
330
|
+
},
|
|
299
331
|
};
|
|
300
332
|
|
|
301
333
|
/** @type {ObjectPropertySchema} */
|
|
302
334
|
const deepObjectAssignSchema = {
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
335
|
+
merge(first = {}, second = {}) {
|
|
336
|
+
return deepMerge(first, second);
|
|
337
|
+
},
|
|
338
|
+
validate: "object",
|
|
307
339
|
};
|
|
308
340
|
|
|
309
341
|
//-----------------------------------------------------------------------------
|
|
@@ -311,221 +343,194 @@ const deepObjectAssignSchema = {
|
|
|
311
343
|
//-----------------------------------------------------------------------------
|
|
312
344
|
|
|
313
345
|
/** @type {ObjectPropertySchema} */
|
|
314
|
-
const
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
346
|
+
const languageOptionsSchema = {
|
|
347
|
+
merge(first = {}, second = {}) {
|
|
348
|
+
const result = deepMerge(first, second);
|
|
349
|
+
|
|
350
|
+
for (const [key, value] of Object.entries(result)) {
|
|
351
|
+
/*
|
|
352
|
+
* Special case: Because the `parser` property is an object, it should
|
|
353
|
+
* not be deep merged. Instead, it should be replaced if it exists in
|
|
354
|
+
* the second object. To make this more generic, we just check for
|
|
355
|
+
* objects with methods and replace them if they exist in the second
|
|
356
|
+
* object.
|
|
357
|
+
*/
|
|
358
|
+
if (isNonArrayObject(value)) {
|
|
359
|
+
if (hasMethod(value)) {
|
|
360
|
+
result[key] = second[key] ?? first[key];
|
|
361
|
+
continue;
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
// for other objects, make sure we aren't reusing the same object
|
|
365
|
+
result[key] = { ...result[key] };
|
|
366
|
+
continue;
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
return result;
|
|
371
|
+
},
|
|
372
|
+
validate: "object",
|
|
336
373
|
};
|
|
337
374
|
|
|
338
375
|
/** @type {ObjectPropertySchema} */
|
|
339
|
-
const
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
if (!value || typeof value !== "object" ||
|
|
344
|
-
(typeof value.parse !== "function" && typeof value.parseForESLint !== "function")
|
|
345
|
-
) {
|
|
346
|
-
throw new TypeError("Expected object with parse() or parseForESLint() method.");
|
|
347
|
-
}
|
|
348
|
-
|
|
349
|
-
}
|
|
376
|
+
const languageSchema = {
|
|
377
|
+
merge: "replace",
|
|
378
|
+
validate: assertIsPluginMemberName,
|
|
350
379
|
};
|
|
351
380
|
|
|
352
381
|
/** @type {ObjectPropertySchema} */
|
|
353
382
|
const pluginsSchema = {
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
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
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
}
|
|
398
|
-
}
|
|
399
|
-
}
|
|
383
|
+
merge(first = {}, second = {}) {
|
|
384
|
+
const keys = new Set([...Object.keys(first), ...Object.keys(second)]);
|
|
385
|
+
const result = {};
|
|
386
|
+
|
|
387
|
+
// manually validate that plugins are not redefined
|
|
388
|
+
for (const key of keys) {
|
|
389
|
+
// avoid hairy edge case
|
|
390
|
+
if (key === "__proto__") {
|
|
391
|
+
continue;
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
if (key in first && key in second && first[key] !== second[key]) {
|
|
395
|
+
throw new TypeError(`Cannot redefine plugin "${key}".`);
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
result[key] = second[key] || first[key];
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
return result;
|
|
402
|
+
},
|
|
403
|
+
validate(value) {
|
|
404
|
+
// first check the value to be sure it's an object
|
|
405
|
+
if (value === null || typeof value !== "object") {
|
|
406
|
+
throw new TypeError("Expected an object.");
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
// make sure it's not an array, which would mean eslintrc-style is used
|
|
410
|
+
if (Array.isArray(value)) {
|
|
411
|
+
throw new IncompatiblePluginsError(value);
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
// second check the keys to make sure they are objects
|
|
415
|
+
for (const key of Object.keys(value)) {
|
|
416
|
+
// avoid hairy edge case
|
|
417
|
+
if (key === "__proto__") {
|
|
418
|
+
continue;
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
if (value[key] === null || typeof value[key] !== "object") {
|
|
422
|
+
throw new TypeError(`Key "${key}": Expected an object.`);
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
},
|
|
400
426
|
};
|
|
401
427
|
|
|
402
428
|
/** @type {ObjectPropertySchema} */
|
|
403
429
|
const processorSchema = {
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
430
|
+
merge: "replace",
|
|
431
|
+
validate(value) {
|
|
432
|
+
if (typeof value === "string") {
|
|
433
|
+
assertIsPluginMemberName(value);
|
|
434
|
+
} else if (value && typeof value === "object") {
|
|
435
|
+
if (
|
|
436
|
+
typeof value.preprocess !== "function" ||
|
|
437
|
+
typeof value.postprocess !== "function"
|
|
438
|
+
) {
|
|
439
|
+
throw new TypeError(
|
|
440
|
+
"Object must have a preprocess() and a postprocess() method.",
|
|
441
|
+
);
|
|
442
|
+
}
|
|
443
|
+
} else {
|
|
444
|
+
throw new TypeError("Expected an object or a string.");
|
|
445
|
+
}
|
|
446
|
+
},
|
|
416
447
|
};
|
|
417
448
|
|
|
418
449
|
/** @type {ObjectPropertySchema} */
|
|
419
450
|
const rulesSchema = {
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
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
|
-
assertIsRuleSeverity(ruleId, ruleOptions);
|
|
504
|
-
}
|
|
505
|
-
}
|
|
506
|
-
}
|
|
507
|
-
};
|
|
508
|
-
|
|
509
|
-
/** @type {ObjectPropertySchema} */
|
|
510
|
-
const ecmaVersionSchema = {
|
|
511
|
-
merge: "replace",
|
|
512
|
-
validate(value) {
|
|
513
|
-
if (typeof value === "number" || value === "latest") {
|
|
514
|
-
return;
|
|
515
|
-
}
|
|
516
|
-
|
|
517
|
-
throw new TypeError("Expected a number or \"latest\".");
|
|
518
|
-
}
|
|
519
|
-
};
|
|
520
|
-
|
|
521
|
-
/** @type {ObjectPropertySchema} */
|
|
522
|
-
const sourceTypeSchema = {
|
|
523
|
-
merge: "replace",
|
|
524
|
-
validate(value) {
|
|
525
|
-
if (typeof value !== "string" || !/^(?:script|module|commonjs)$/u.test(value)) {
|
|
526
|
-
throw new TypeError("Expected \"script\", \"module\", or \"commonjs\".");
|
|
527
|
-
}
|
|
528
|
-
}
|
|
451
|
+
merge(first = {}, second = {}) {
|
|
452
|
+
const result = {
|
|
453
|
+
...first,
|
|
454
|
+
...second,
|
|
455
|
+
};
|
|
456
|
+
|
|
457
|
+
for (const ruleId of Object.keys(result)) {
|
|
458
|
+
try {
|
|
459
|
+
// avoid hairy edge case
|
|
460
|
+
if (ruleId === "__proto__") {
|
|
461
|
+
/* eslint-disable-next-line no-proto -- Though deprecated, may still be present */
|
|
462
|
+
delete result.__proto__;
|
|
463
|
+
continue;
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
result[ruleId] = normalizeRuleOptions(result[ruleId]);
|
|
467
|
+
|
|
468
|
+
/*
|
|
469
|
+
* If either rule config is missing, then the correct
|
|
470
|
+
* config is already present and we just need to normalize
|
|
471
|
+
* the severity.
|
|
472
|
+
*/
|
|
473
|
+
if (!(ruleId in first) || !(ruleId in second)) {
|
|
474
|
+
continue;
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
const firstRuleOptions = normalizeRuleOptions(first[ruleId]);
|
|
478
|
+
const secondRuleOptions = normalizeRuleOptions(second[ruleId]);
|
|
479
|
+
|
|
480
|
+
/*
|
|
481
|
+
* If the second rule config only has a severity (length of 1),
|
|
482
|
+
* then use that severity and keep the rest of the options from
|
|
483
|
+
* the first rule config.
|
|
484
|
+
*/
|
|
485
|
+
if (secondRuleOptions.length === 1) {
|
|
486
|
+
result[ruleId] = [
|
|
487
|
+
secondRuleOptions[0],
|
|
488
|
+
...firstRuleOptions.slice(1),
|
|
489
|
+
];
|
|
490
|
+
continue;
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
/*
|
|
494
|
+
* In any other situation, then the second rule config takes
|
|
495
|
+
* precedence. That means the value at `result[ruleId]` is
|
|
496
|
+
* already correct and no further work is necessary.
|
|
497
|
+
*/
|
|
498
|
+
} catch (ex) {
|
|
499
|
+
throw new Error(`Key "${ruleId}": ${ex.message}`, {
|
|
500
|
+
cause: ex,
|
|
501
|
+
});
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
return result;
|
|
506
|
+
},
|
|
507
|
+
|
|
508
|
+
validate(value) {
|
|
509
|
+
assertIsObject(value);
|
|
510
|
+
|
|
511
|
+
/*
|
|
512
|
+
* We are not checking the rule schema here because there is no
|
|
513
|
+
* guarantee that the rule definition is present at this point. Instead
|
|
514
|
+
* we wait and check the rule schema during the finalization step
|
|
515
|
+
* of calculating a config.
|
|
516
|
+
*/
|
|
517
|
+
for (const ruleId of Object.keys(value)) {
|
|
518
|
+
// avoid hairy edge case
|
|
519
|
+
if (ruleId === "__proto__") {
|
|
520
|
+
continue;
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
const ruleOptions = value[ruleId];
|
|
524
|
+
|
|
525
|
+
assertIsRuleOptions(ruleId, ruleOptions);
|
|
526
|
+
|
|
527
|
+
if (Array.isArray(ruleOptions)) {
|
|
528
|
+
assertIsRuleSeverity(ruleId, ruleOptions[0]);
|
|
529
|
+
} else {
|
|
530
|
+
assertIsRuleSeverity(ruleId, ruleOptions);
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
},
|
|
529
534
|
};
|
|
530
535
|
|
|
531
536
|
/**
|
|
@@ -535,25 +540,25 @@ const sourceTypeSchema = {
|
|
|
535
540
|
* @returns {ObjectPropertySchema} The schema.
|
|
536
541
|
*/
|
|
537
542
|
function createEslintrcErrorSchema(key) {
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
543
|
+
return {
|
|
544
|
+
merge: "replace",
|
|
545
|
+
validate() {
|
|
546
|
+
throw new IncompatibleKeyError(key);
|
|
547
|
+
},
|
|
548
|
+
};
|
|
544
549
|
}
|
|
545
550
|
|
|
546
551
|
const eslintrcKeys = [
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
552
|
+
"env",
|
|
553
|
+
"extends",
|
|
554
|
+
"globals",
|
|
555
|
+
"ignorePatterns",
|
|
556
|
+
"noInlineConfig",
|
|
557
|
+
"overrides",
|
|
558
|
+
"parser",
|
|
559
|
+
"parserOptions",
|
|
560
|
+
"reportUnusedDisableDirectives",
|
|
561
|
+
"root",
|
|
557
562
|
];
|
|
558
563
|
|
|
559
564
|
//-----------------------------------------------------------------------------
|
|
@@ -561,30 +566,25 @@ const eslintrcKeys = [
|
|
|
561
566
|
//-----------------------------------------------------------------------------
|
|
562
567
|
|
|
563
568
|
const flatConfigSchema = {
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
}
|
|
584
|
-
},
|
|
585
|
-
processor: processorSchema,
|
|
586
|
-
plugins: pluginsSchema,
|
|
587
|
-
rules: rulesSchema
|
|
569
|
+
// eslintrc-style keys that should always error
|
|
570
|
+
...Object.fromEntries(
|
|
571
|
+
eslintrcKeys.map(key => [key, createEslintrcErrorSchema(key)]),
|
|
572
|
+
),
|
|
573
|
+
|
|
574
|
+
// flat config keys
|
|
575
|
+
settings: deepObjectAssignSchema,
|
|
576
|
+
linterOptions: {
|
|
577
|
+
schema: {
|
|
578
|
+
noInlineConfig: booleanSchema,
|
|
579
|
+
reportUnusedDisableDirectives: disableDirectiveSeveritySchema,
|
|
580
|
+
reportUnusedInlineConfigs: unusedInlineConfigsSeveritySchema,
|
|
581
|
+
},
|
|
582
|
+
},
|
|
583
|
+
language: languageSchema,
|
|
584
|
+
languageOptions: languageOptionsSchema,
|
|
585
|
+
processor: processorSchema,
|
|
586
|
+
plugins: pluginsSchema,
|
|
587
|
+
rules: rulesSchema,
|
|
588
588
|
};
|
|
589
589
|
|
|
590
590
|
//-----------------------------------------------------------------------------
|
|
@@ -592,7 +592,7 @@ const flatConfigSchema = {
|
|
|
592
592
|
//-----------------------------------------------------------------------------
|
|
593
593
|
|
|
594
594
|
module.exports = {
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
595
|
+
flatConfigSchema,
|
|
596
|
+
hasMethod,
|
|
597
|
+
assertIsRuleSeverity,
|
|
598
598
|
};
|