eslint 9.22.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 +47 -45
- 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 +2 -2
- 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 +1128 -1057
- 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 -198
- 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/index.d.ts +2010 -1559
- package/lib/types/rules.d.ts +5253 -5140
- 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 +11 -17
@@ -28,9 +28,12 @@ const { normalizeSeverityToNumber } = require("../shared/severity");
|
|
28
28
|
//-----------------------------------------------------------------------------
|
29
29
|
|
30
30
|
const ruleSeverities = new Map([
|
31
|
-
|
32
|
-
|
33
|
-
|
31
|
+
[0, 0],
|
32
|
+
["off", 0],
|
33
|
+
[1, 1],
|
34
|
+
["warn", 1],
|
35
|
+
[2, 2],
|
36
|
+
["error", 2],
|
34
37
|
]);
|
35
38
|
|
36
39
|
/**
|
@@ -39,7 +42,7 @@ const ruleSeverities = new Map([
|
|
39
42
|
* @returns {boolean} `true` if the value is a non-null object.
|
40
43
|
*/
|
41
44
|
function isNonNullObject(value) {
|
42
|
-
|
45
|
+
return typeof value === "object" && value !== null;
|
43
46
|
}
|
44
47
|
|
45
48
|
/**
|
@@ -48,7 +51,7 @@ function isNonNullObject(value) {
|
|
48
51
|
* @returns {boolean} `true` if the value is a non-null non-array object.
|
49
52
|
*/
|
50
53
|
function isNonArrayObject(value) {
|
51
|
-
|
54
|
+
return isNonNullObject(value) && !Array.isArray(value);
|
52
55
|
}
|
53
56
|
|
54
57
|
/**
|
@@ -57,7 +60,7 @@ function isNonArrayObject(value) {
|
|
57
60
|
* @returns {boolean} `true` if the value is undefined.
|
58
61
|
*/
|
59
62
|
function isUndefined(value) {
|
60
|
-
|
63
|
+
return typeof value === "undefined";
|
61
64
|
}
|
62
65
|
|
63
66
|
/**
|
@@ -68,57 +71,56 @@ function isUndefined(value) {
|
|
68
71
|
* @returns {Object} An object with properties from both first and second.
|
69
72
|
*/
|
70
73
|
function deepMerge(first, second, mergeMap = new Map()) {
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
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
|
-
|
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;
|
122
124
|
}
|
123
125
|
|
124
126
|
/**
|
@@ -128,13 +130,12 @@ function deepMerge(first, second, mergeMap = new Map()) {
|
|
128
130
|
* @returns {Array} An array of rule options.
|
129
131
|
*/
|
130
132
|
function normalizeRuleOptions(ruleOptions) {
|
133
|
+
const finalOptions = Array.isArray(ruleOptions)
|
134
|
+
? ruleOptions.slice(0)
|
135
|
+
: [ruleOptions];
|
131
136
|
|
132
|
-
|
133
|
-
|
134
|
-
: [ruleOptions];
|
135
|
-
|
136
|
-
finalOptions[0] = ruleSeverities.get(finalOptions[0]);
|
137
|
-
return structuredClone(finalOptions);
|
137
|
+
finalOptions[0] = ruleSeverities.get(finalOptions[0]);
|
138
|
+
return structuredClone(finalOptions);
|
138
139
|
}
|
139
140
|
|
140
141
|
/**
|
@@ -143,15 +144,13 @@ function normalizeRuleOptions(ruleOptions) {
|
|
143
144
|
* @returns {boolean} `true` if the object has any methods.
|
144
145
|
*/
|
145
146
|
function hasMethod(object) {
|
147
|
+
for (const key of Object.keys(object)) {
|
148
|
+
if (typeof object[key] === "function") {
|
149
|
+
return true;
|
150
|
+
}
|
151
|
+
}
|
146
152
|
|
147
|
-
|
148
|
-
|
149
|
-
if (typeof object[key] === "function") {
|
150
|
-
return true;
|
151
|
-
}
|
152
|
-
}
|
153
|
-
|
154
|
-
return false;
|
153
|
+
return false;
|
155
154
|
}
|
156
155
|
|
157
156
|
//-----------------------------------------------------------------------------
|
@@ -162,16 +161,17 @@ function hasMethod(object) {
|
|
162
161
|
* The error type when a rule's options are configured with an invalid type.
|
163
162
|
*/
|
164
163
|
class InvalidRuleOptionsError extends Error {
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
164
|
+
/**
|
165
|
+
* @param {string} ruleId Rule name being configured.
|
166
|
+
* @param {any} value The invalid value.
|
167
|
+
*/
|
168
|
+
constructor(ruleId, value) {
|
169
|
+
super(
|
170
|
+
`Key "${ruleId}": Expected severity of "off", 0, "warn", 1, "error", or 2.`,
|
171
|
+
);
|
172
|
+
this.messageTemplate = "invalid-rule-options";
|
173
|
+
this.messageData = { ruleId, value };
|
174
|
+
}
|
175
175
|
}
|
176
176
|
|
177
177
|
/**
|
@@ -182,25 +182,30 @@ class InvalidRuleOptionsError extends Error {
|
|
182
182
|
* @throws {InvalidRuleOptionsError} If the value isn't a valid rule options.
|
183
183
|
*/
|
184
184
|
function assertIsRuleOptions(ruleId, value) {
|
185
|
-
|
186
|
-
|
187
|
-
|
185
|
+
if (
|
186
|
+
typeof value !== "string" &&
|
187
|
+
typeof value !== "number" &&
|
188
|
+
!Array.isArray(value)
|
189
|
+
) {
|
190
|
+
throw new InvalidRuleOptionsError(ruleId, value);
|
191
|
+
}
|
188
192
|
}
|
189
193
|
|
190
194
|
/**
|
191
195
|
* The error type when a rule's severity is invalid.
|
192
196
|
*/
|
193
197
|
class InvalidRuleSeverityError extends Error {
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
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
|
+
}
|
204
209
|
}
|
205
210
|
|
206
211
|
/**
|
@@ -211,11 +216,11 @@ class InvalidRuleSeverityError extends Error {
|
|
211
216
|
* @throws {InvalidRuleSeverityError} If the value isn't a valid rule severity.
|
212
217
|
*/
|
213
218
|
function assertIsRuleSeverity(ruleId, value) {
|
214
|
-
|
219
|
+
const severity = ruleSeverities.get(value);
|
215
220
|
|
216
|
-
|
217
|
-
|
218
|
-
|
221
|
+
if (typeof severity === "undefined") {
|
222
|
+
throw new InvalidRuleSeverityError(ruleId, value);
|
223
|
+
}
|
219
224
|
}
|
220
225
|
|
221
226
|
/**
|
@@ -225,9 +230,11 @@ function assertIsRuleSeverity(ruleId, value) {
|
|
225
230
|
* @throws {TypeError} If the string isn't in the correct format.
|
226
231
|
*/
|
227
232
|
function assertIsPluginMemberName(value) {
|
228
|
-
|
229
|
-
|
230
|
-
|
233
|
+
if (!/[@a-z0-9-_$]+(?:\/(?:[a-z0-9-_$]+))+$/iu.test(value)) {
|
234
|
+
throw new TypeError(
|
235
|
+
`Expected string in the form "pluginName/objectName" but found "${value}".`,
|
236
|
+
);
|
237
|
+
}
|
231
238
|
}
|
232
239
|
|
233
240
|
/**
|
@@ -237,294 +244,293 @@ function assertIsPluginMemberName(value) {
|
|
237
244
|
* @throws {TypeError} If the value isn't an object.
|
238
245
|
*/
|
239
246
|
function assertIsObject(value) {
|
240
|
-
|
241
|
-
|
242
|
-
|
247
|
+
if (!isNonNullObject(value)) {
|
248
|
+
throw new TypeError("Expected an object.");
|
249
|
+
}
|
243
250
|
}
|
244
251
|
|
245
252
|
/**
|
246
253
|
* The error type when there's an eslintrc-style options in a flat config.
|
247
254
|
*/
|
248
255
|
class IncompatibleKeyError extends Error {
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
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
|
+
}
|
258
266
|
}
|
259
267
|
|
260
268
|
/**
|
261
269
|
* The error type when there's an eslintrc-style plugins array found.
|
262
270
|
*/
|
263
271
|
class IncompatiblePluginsError extends Error {
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
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
|
+
}
|
274
283
|
}
|
275
284
|
|
276
|
-
|
277
285
|
//-----------------------------------------------------------------------------
|
278
286
|
// Low-Level Schemas
|
279
287
|
//-----------------------------------------------------------------------------
|
280
288
|
|
281
289
|
/** @type {ObjectPropertySchema} */
|
282
290
|
const booleanSchema = {
|
283
|
-
|
284
|
-
|
291
|
+
merge: "replace",
|
292
|
+
validate: "boolean",
|
285
293
|
};
|
286
294
|
|
287
295
|
const ALLOWED_SEVERITIES = new Set(["error", "warn", "off", 2, 1, 0]);
|
288
296
|
|
289
297
|
/** @type {ObjectPropertySchema} */
|
290
298
|
const disableDirectiveSeveritySchema = {
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
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
|
+
},
|
305
315
|
};
|
306
316
|
|
307
317
|
/** @type {ObjectPropertySchema} */
|
308
318
|
const unusedInlineConfigsSeveritySchema = {
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
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
|
+
},
|
319
331
|
};
|
320
332
|
|
321
333
|
/** @type {ObjectPropertySchema} */
|
322
334
|
const deepObjectAssignSchema = {
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
335
|
+
merge(first = {}, second = {}) {
|
336
|
+
return deepMerge(first, second);
|
337
|
+
},
|
338
|
+
validate: "object",
|
327
339
|
};
|
328
340
|
|
329
|
-
|
330
341
|
//-----------------------------------------------------------------------------
|
331
342
|
// High-Level Schemas
|
332
343
|
//-----------------------------------------------------------------------------
|
333
344
|
|
334
345
|
/** @type {ObjectPropertySchema} */
|
335
346
|
const languageOptionsSchema = {
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
return result;
|
363
|
-
},
|
364
|
-
validate: "object"
|
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",
|
365
373
|
};
|
366
374
|
|
367
375
|
/** @type {ObjectPropertySchema} */
|
368
376
|
const languageSchema = {
|
369
|
-
|
370
|
-
|
377
|
+
merge: "replace",
|
378
|
+
validate: assertIsPluginMemberName,
|
371
379
|
};
|
372
380
|
|
373
381
|
/** @type {ObjectPropertySchema} */
|
374
382
|
const pluginsSchema = {
|
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
|
-
|
400
|
-
|
401
|
-
|
402
|
-
|
403
|
-
|
404
|
-
|
405
|
-
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
}
|
419
|
-
}
|
420
|
-
}
|
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
|
+
},
|
421
426
|
};
|
422
427
|
|
423
428
|
/** @type {ObjectPropertySchema} */
|
424
429
|
const processorSchema = {
|
425
|
-
|
426
|
-
|
427
|
-
|
428
|
-
|
429
|
-
|
430
|
-
|
431
|
-
|
432
|
-
|
433
|
-
|
434
|
-
|
435
|
-
|
436
|
-
|
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
|
+
},
|
437
447
|
};
|
438
448
|
|
439
449
|
/** @type {ObjectPropertySchema} */
|
440
450
|
const rulesSchema = {
|
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
|
-
|
504
|
-
|
505
|
-
|
506
|
-
|
507
|
-
|
508
|
-
|
509
|
-
|
510
|
-
|
511
|
-
|
512
|
-
|
513
|
-
|
514
|
-
|
515
|
-
|
516
|
-
|
517
|
-
|
518
|
-
|
519
|
-
|
520
|
-
|
521
|
-
|
522
|
-
|
523
|
-
|
524
|
-
assertIsRuleSeverity(ruleId, ruleOptions);
|
525
|
-
}
|
526
|
-
}
|
527
|
-
}
|
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
|
+
},
|
528
534
|
};
|
529
535
|
|
530
536
|
/**
|
@@ -534,25 +540,25 @@ const rulesSchema = {
|
|
534
540
|
* @returns {ObjectPropertySchema} The schema.
|
535
541
|
*/
|
536
542
|
function createEslintrcErrorSchema(key) {
|
537
|
-
|
538
|
-
|
539
|
-
|
540
|
-
|
541
|
-
|
542
|
-
|
543
|
+
return {
|
544
|
+
merge: "replace",
|
545
|
+
validate() {
|
546
|
+
throw new IncompatibleKeyError(key);
|
547
|
+
},
|
548
|
+
};
|
543
549
|
}
|
544
550
|
|
545
551
|
const eslintrcKeys = [
|
546
|
-
|
547
|
-
|
548
|
-
|
549
|
-
|
550
|
-
|
551
|
-
|
552
|
-
|
553
|
-
|
554
|
-
|
555
|
-
|
552
|
+
"env",
|
553
|
+
"extends",
|
554
|
+
"globals",
|
555
|
+
"ignorePatterns",
|
556
|
+
"noInlineConfig",
|
557
|
+
"overrides",
|
558
|
+
"parser",
|
559
|
+
"parserOptions",
|
560
|
+
"reportUnusedDisableDirectives",
|
561
|
+
"root",
|
556
562
|
];
|
557
563
|
|
558
564
|
//-----------------------------------------------------------------------------
|
@@ -560,24 +566,25 @@ const eslintrcKeys = [
|
|
560
566
|
//-----------------------------------------------------------------------------
|
561
567
|
|
562
568
|
const flatConfigSchema = {
|
563
|
-
|
564
|
-
|
565
|
-
|
566
|
-
|
567
|
-
|
568
|
-
|
569
|
-
|
570
|
-
|
571
|
-
|
572
|
-
|
573
|
-
|
574
|
-
|
575
|
-
|
576
|
-
|
577
|
-
|
578
|
-
|
579
|
-
|
580
|
-
|
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,
|
581
588
|
};
|
582
589
|
|
583
590
|
//-----------------------------------------------------------------------------
|
@@ -585,7 +592,7 @@ const flatConfigSchema = {
|
|
585
592
|
//-----------------------------------------------------------------------------
|
586
593
|
|
587
594
|
module.exports = {
|
588
|
-
|
589
|
-
|
590
|
-
|
595
|
+
flatConfigSchema,
|
596
|
+
hasMethod,
|
597
|
+
assertIsRuleSeverity,
|
591
598
|
};
|