eslint 9.22.0 → 9.24.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 +48 -46
- 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 +830 -810
- 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 +638 -457
- package/lib/config/config-loader.js +726 -622
- 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 +72 -72
- 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 +756 -681
- package/lib/eslint/eslint.js +934 -912
- package/lib/eslint/index.js +2 -2
- package/lib/eslint/legacy-eslint.js +577 -533
- 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 +2403 -2045
- 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 +36 -36
- 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 +404 -361
- package/lib/rule-tester/index.js +1 -1
- package/lib/rule-tester/rule-tester.js +1308 -1046
- package/lib/rules/accessor-pairs.js +298 -263
- package/lib/rules/array-bracket-newline.js +250 -238
- package/lib/rules/array-bracket-spacing.js +263 -224
- package/lib/rules/array-callback-return.js +402 -356
- package/lib/rules/array-element-newline.js +358 -313
- package/lib/rules/arrow-body-style.js +400 -281
- package/lib/rules/arrow-parens.js +206 -173
- package/lib/rules/arrow-spacing.js +169 -163
- package/lib/rules/block-scoped-var.js +125 -123
- package/lib/rules/block-spacing.js +186 -176
- package/lib/rules/brace-style.js +262 -199
- package/lib/rules/callback-return.js +203 -190
- package/lib/rules/camelcase.js +403 -392
- package/lib/rules/capitalized-comments.js +253 -232
- package/lib/rules/class-methods-use-this.js +224 -172
- package/lib/rules/comma-dangle.js +379 -346
- package/lib/rules/comma-spacing.js +193 -195
- package/lib/rules/comma-style.js +375 -316
- package/lib/rules/complexity.js +173 -169
- package/lib/rules/computed-property-spacing.js +236 -211
- package/lib/rules/consistent-return.js +181 -170
- package/lib/rules/consistent-this.js +167 -147
- package/lib/rules/constructor-super.js +412 -404
- package/lib/rules/curly.js +407 -332
- package/lib/rules/default-case-last.js +38 -31
- package/lib/rules/default-case.js +89 -85
- package/lib/rules/default-param-last.js +69 -54
- package/lib/rules/dot-location.js +122 -110
- package/lib/rules/dot-notation.js +192 -156
- package/lib/rules/eol-last.js +122 -120
- package/lib/rules/eqeqeq.js +168 -155
- package/lib/rules/for-direction.js +146 -121
- package/lib/rules/func-call-spacing.js +261 -231
- package/lib/rules/func-name-matching.js +293 -209
- package/lib/rules/func-names.js +165 -164
- package/lib/rules/func-style.js +159 -127
- package/lib/rules/function-call-argument-newline.js +152 -129
- package/lib/rules/function-paren-newline.js +349 -291
- package/lib/rules/generator-star-spacing.js +229 -210
- package/lib/rules/getter-return.js +208 -172
- package/lib/rules/global-require.js +85 -74
- package/lib/rules/grouped-accessor-pairs.js +170 -150
- package/lib/rules/guard-for-in.js +72 -63
- package/lib/rules/handle-callback-err.js +108 -103
- package/lib/rules/id-blacklist.js +182 -199
- package/lib/rules/id-denylist.js +168 -187
- package/lib/rules/id-length.js +197 -171
- package/lib/rules/id-match.js +344 -289
- package/lib/rules/implicit-arrow-linebreak.js +102 -79
- package/lib/rules/indent-legacy.js +1344 -1118
- package/lib/rules/indent.js +2272 -1759
- package/lib/rules/index.js +317 -292
- package/lib/rules/init-declarations.js +137 -107
- package/lib/rules/jsx-quotes.js +94 -82
- package/lib/rules/key-spacing.js +750 -633
- package/lib/rules/keyword-spacing.js +648 -605
- package/lib/rules/line-comment-position.js +142 -128
- package/lib/rules/linebreak-style.js +107 -106
- package/lib/rules/lines-around-comment.js +540 -448
- package/lib/rules/lines-around-directive.js +233 -203
- package/lib/rules/lines-between-class-members.js +305 -234
- package/lib/rules/logical-assignment-operators.js +582 -399
- 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 -434
- 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 +78 -76
- package/lib/rules/max-statements-per-line.js +205 -198
- package/lib/rules/max-statements.js +168 -164
- package/lib/rules/multiline-comment-style.js +637 -479
- package/lib/rules/multiline-ternary.js +241 -176
- package/lib/rules/new-cap.js +233 -213
- package/lib/rules/new-parens.js +88 -79
- package/lib/rules/newline-after-var.js +287 -250
- package/lib/rules/newline-before-return.js +229 -222
- package/lib/rules/newline-per-chained-call.js +142 -127
- package/lib/rules/no-alert.js +90 -79
- package/lib/rules/no-array-constructor.js +125 -113
- package/lib/rules/no-async-promise-executor.js +30 -24
- package/lib/rules/no-await-in-loop.js +69 -71
- package/lib/rules/no-bitwise.js +124 -100
- package/lib/rules/no-buffer-constructor.js +55 -47
- package/lib/rules/no-caller.js +39 -33
- package/lib/rules/no-case-declarations.js +61 -57
- package/lib/rules/no-catch-shadow.js +76 -73
- 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 -81
- package/lib/rules/no-console.js +202 -199
- package/lib/rules/no-const-assign.js +47 -41
- package/lib/rules/no-constant-binary-expression.js +500 -405
- package/lib/rules/no-constant-condition.js +158 -143
- package/lib/rules/no-constructor-return.js +49 -49
- package/lib/rules/no-continue.js +25 -27
- 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 -41
- package/lib/rules/no-dupe-args.js +68 -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 +179 -176
- 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 +127 -128
- package/lib/rules/no-empty-pattern.js +63 -58
- package/lib/rules/no-empty-static-block.js +37 -35
- package/lib/rules/no-empty.js +98 -86
- package/lib/rules/no-eq-null.js +37 -32
- package/lib/rules/no-eval.js +256 -250
- package/lib/rules/no-ex-assign.js +42 -39
- package/lib/rules/no-extend-native.js +161 -159
- package/lib/rules/no-extra-bind.js +201 -190
- package/lib/rules/no-extra-boolean-cast.js +398 -348
- package/lib/rules/no-extra-label.js +150 -131
- package/lib/rules/no-extra-parens.js +1654 -1325
- package/lib/rules/no-extra-semi.js +146 -144
- package/lib/rules/no-fallthrough.js +199 -157
- package/lib/rules/no-floating-decimal.js +74 -66
- package/lib/rules/no-func-assign.js +54 -55
- package/lib/rules/no-global-assign.js +78 -73
- package/lib/rules/no-implicit-coercion.js +349 -293
- package/lib/rules/no-implicit-globals.js +158 -135
- package/lib/rules/no-implied-eval.js +140 -112
- package/lib/rules/no-import-assign.js +145 -159
- package/lib/rules/no-inline-comments.js +101 -95
- package/lib/rules/no-inner-declarations.js +115 -101
- package/lib/rules/no-invalid-regexp.js +222 -190
- package/lib/rules/no-invalid-this.js +123 -117
- package/lib/rules/no-irregular-whitespace.js +266 -252
- package/lib/rules/no-iterator.js +29 -33
- package/lib/rules/no-label-var.js +59 -62
- package/lib/rules/no-labels.js +138 -133
- package/lib/rules/no-lone-blocks.js +127 -123
- package/lib/rules/no-lonely-if.js +108 -77
- package/lib/rules/no-loop-func.js +238 -213
- package/lib/rules/no-loss-of-precision.js +218 -201
- package/lib/rules/no-magic-numbers.js +246 -218
- package/lib/rules/no-misleading-character-class.js +499 -446
- package/lib/rules/no-mixed-operators.js +188 -182
- package/lib/rules/no-mixed-requires.js +253 -240
- package/lib/rules/no-mixed-spaces-and-tabs.js +134 -121
- package/lib/rules/no-multi-assign.js +46 -44
- package/lib/rules/no-multi-spaces.js +163 -143
- package/lib/rules/no-multi-str.js +42 -41
- package/lib/rules/no-multiple-empty-lines.js +196 -158
- package/lib/rules/no-native-reassign.js +90 -85
- package/lib/rules/no-negated-condition.js +79 -75
- package/lib/rules/no-negated-in-lhs.js +45 -43
- package/lib/rules/no-nested-ternary.js +33 -32
- 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 -48
- package/lib/rules/no-new-require.js +48 -47
- package/lib/rules/no-new-symbol.js +52 -50
- 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 +141 -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 +32 -32
- package/lib/rules/no-param-reassign.js +235 -217
- package/lib/rules/no-path-concat.js +66 -67
- package/lib/rules/no-plusplus.js +60 -61
- package/lib/rules/no-process-env.js +49 -48
- package/lib/rules/no-process-exit.js +54 -50
- package/lib/rules/no-promise-executor-return.js +214 -182
- package/lib/rules/no-proto.js +26 -29
- package/lib/rules/no-prototype-builtins.js +146 -124
- package/lib/rules/no-redeclare.js +154 -152
- package/lib/rules/no-regex-spaces.js +183 -161
- package/lib/rules/no-restricted-exports.js +208 -185
- package/lib/rules/no-restricted-globals.js +111 -112
- package/lib/rules/no-restricted-imports.js +657 -537
- package/lib/rules/no-restricted-modules.js +222 -202
- package/lib/rules/no-restricted-properties.js +181 -153
- package/lib/rules/no-restricted-syntax.js +56 -52
- package/lib/rules/no-return-assign.js +55 -50
- package/lib/rules/no-return-await.js +148 -124
- package/lib/rules/no-script-url.js +52 -45
- package/lib/rules/no-self-assign.js +148 -146
- package/lib/rules/no-self-compare.js +63 -46
- package/lib/rules/no-sequences.js +135 -116
- package/lib/rules/no-setter-return.js +185 -152
- package/lib/rules/no-shadow-restricted-names.js +61 -46
- package/lib/rules/no-shadow.js +342 -316
- package/lib/rules/no-spaced-func.js +82 -77
- package/lib/rules/no-sparse-arrays.js +54 -59
- package/lib/rules/no-sync.js +61 -60
- package/lib/rules/no-tabs.js +83 -72
- package/lib/rules/no-template-curly-in-string.js +33 -32
- package/lib/rules/no-ternary.js +25 -29
- package/lib/rules/no-this-before-super.js +321 -319
- package/lib/rules/no-throw-literal.js +31 -36
- package/lib/rules/no-trailing-spaces.js +199 -191
- package/lib/rules/no-undef-init.js +76 -61
- package/lib/rules/no-undef.js +51 -48
- package/lib/rules/no-undefined.js +73 -75
- package/lib/rules/no-underscore-dangle.js +370 -327
- 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 -147
- package/lib/rules/no-unreachable-loop.js +145 -142
- 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 -83
- package/lib/rules/no-unsafe-optional-chaining.js +192 -178
- package/lib/rules/no-unused-expressions.js +178 -162
- 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 +1669 -1449
- package/lib/rules/no-use-before-define.js +229 -231
- package/lib/rules/no-useless-assignment.js +590 -511
- package/lib/rules/no-useless-backreference.js +212 -193
- 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 -115
- package/lib/rules/no-useless-concat.js +65 -60
- package/lib/rules/no-useless-constructor.js +158 -111
- package/lib/rules/no-useless-escape.js +342 -291
- package/lib/rules/no-useless-rename.js +183 -156
- package/lib/rules/no-useless-return.js +344 -312
- package/lib/rules/no-var.js +233 -212
- package/lib/rules/no-void.js +50 -48
- package/lib/rules/no-warning-comments.js +191 -186
- package/lib/rules/no-whitespace-before-property.js +131 -115
- package/lib/rules/no-with.js +24 -26
- package/lib/rules/nonblock-statement-body-position.js +149 -130
- package/lib/rules/object-curly-newline.js +306 -265
- package/lib/rules/object-curly-spacing.js +360 -314
- package/lib/rules/object-property-newline.js +137 -106
- package/lib/rules/object-shorthand.js +607 -502
- package/lib/rules/one-var-declaration-per-line.js +104 -100
- package/lib/rules/one-var.js +653 -537
- package/lib/rules/operator-assignment.js +219 -161
- package/lib/rules/operator-linebreak.js +295 -251
- package/lib/rules/padded-blocks.js +346 -308
- package/lib/rules/padding-line-between-statements.js +443 -439
- package/lib/rules/prefer-arrow-callback.js +362 -313
- package/lib/rules/prefer-const.js +418 -377
- package/lib/rules/prefer-destructuring.js +301 -279
- package/lib/rules/prefer-exponentiation-operator.js +176 -133
- package/lib/rules/prefer-named-capture-group.js +153 -140
- package/lib/rules/prefer-numeric-literals.js +121 -113
- package/lib/rules/prefer-object-has-own.js +116 -82
- package/lib/rules/prefer-object-spread.js +213 -193
- package/lib/rules/prefer-promise-reject-errors.js +140 -122
- package/lib/rules/prefer-reflect.js +127 -107
- package/lib/rules/prefer-regex-literals.js +578 -466
- package/lib/rules/prefer-rest-params.js +79 -80
- package/lib/rules/prefer-spread.js +47 -44
- package/lib/rules/prefer-template.js +266 -195
- package/lib/rules/quote-props.js +373 -307
- package/lib/rules/quotes.js +374 -326
- package/lib/rules/radix.js +152 -136
- package/lib/rules/require-atomic-updates.js +316 -285
- package/lib/rules/require-await.js +144 -116
- package/lib/rules/require-unicode-regexp.js +282 -177
- package/lib/rules/require-yield.js +53 -54
- package/lib/rules/rest-spread-spacing.js +128 -116
- package/lib/rules/semi-spacing.js +281 -250
- package/lib/rules/semi-style.js +176 -134
- package/lib/rules/semi.js +456 -436
- package/lib/rules/sort-imports.js +306 -233
- package/lib/rules/sort-keys.js +219 -188
- package/lib/rules/sort-vars.js +127 -93
- package/lib/rules/space-before-blocks.js +199 -189
- package/lib/rules/space-before-function-paren.js +186 -166
- package/lib/rules/space-in-parens.js +359 -288
- package/lib/rules/space-infix-ops.js +237 -201
- package/lib/rules/space-unary-ops.js +356 -298
- package/lib/rules/spaced-comment.js +363 -319
- package/lib/rules/strict.js +265 -230
- package/lib/rules/switch-colon-spacing.js +130 -122
- package/lib/rules/symbol-description.js +45 -48
- package/lib/rules/template-curly-spacing.js +148 -142
- package/lib/rules/template-tag-spacing.js +98 -88
- package/lib/rules/unicode-bom.js +54 -56
- package/lib/rules/use-isnan.js +237 -206
- 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 +153 -111
- package/lib/rules/vars-on-top.js +152 -145
- package/lib/rules/wrap-iife.js +204 -191
- package/lib/rules/wrap-regex.js +70 -58
- package/lib/rules/yield-star-spacing.js +145 -134
- package/lib/rules/yoda.js +283 -272
- package/lib/services/parser-service.js +35 -35
- package/lib/services/processor-service.js +66 -73
- package/lib/services/suppressions-service.js +289 -0
- 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 +50 -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/shared/types.js +4 -27
- 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 +14 -20
@@ -35,39 +35,36 @@ const { interpolate } = require("./interpolate");
|
|
35
35
|
// Module Definition
|
36
36
|
//------------------------------------------------------------------------------
|
37
37
|
|
38
|
-
|
39
38
|
/**
|
40
39
|
* Translates a multi-argument context.report() call into a single object argument call
|
41
40
|
* @param {...*} args A list of arguments passed to `context.report`
|
42
41
|
* @returns {MessageDescriptor} A normalized object containing report information
|
43
42
|
*/
|
44
43
|
function normalizeMultiArgReportCall(...args) {
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
fix: args[4]
|
70
|
-
};
|
44
|
+
// If there is one argument, it is considered to be a new-style call already.
|
45
|
+
if (args.length === 1) {
|
46
|
+
// Shallow clone the object to avoid surprises if reusing the descriptor
|
47
|
+
return Object.assign({}, args[0]);
|
48
|
+
}
|
49
|
+
|
50
|
+
// If the second argument is a string, the arguments are interpreted as [node, message, data, fix].
|
51
|
+
if (typeof args[1] === "string") {
|
52
|
+
return {
|
53
|
+
node: args[0],
|
54
|
+
message: args[1],
|
55
|
+
data: args[2],
|
56
|
+
fix: args[3],
|
57
|
+
};
|
58
|
+
}
|
59
|
+
|
60
|
+
// Otherwise, the arguments are interpreted as [node, loc, message, data, fix].
|
61
|
+
return {
|
62
|
+
node: args[0],
|
63
|
+
loc: args[1],
|
64
|
+
message: args[2],
|
65
|
+
data: args[3],
|
66
|
+
fix: args[4],
|
67
|
+
};
|
71
68
|
}
|
72
69
|
|
73
70
|
/**
|
@@ -77,11 +74,14 @@ function normalizeMultiArgReportCall(...args) {
|
|
77
74
|
* @throws AssertionError if neither a node nor a loc was provided, or if the node is not an object
|
78
75
|
*/
|
79
76
|
function assertValidNodeInfo(descriptor) {
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
77
|
+
if (descriptor.node) {
|
78
|
+
assert(typeof descriptor.node === "object", "Node must be an object");
|
79
|
+
} else {
|
80
|
+
assert(
|
81
|
+
descriptor.loc,
|
82
|
+
"Node must be provided when reporting error if location is not provided",
|
83
|
+
);
|
84
|
+
}
|
85
85
|
}
|
86
86
|
|
87
87
|
/**
|
@@ -91,10 +91,10 @@ function assertValidNodeInfo(descriptor) {
|
|
91
91
|
* from the `node` of the original descriptor, or infers the `start` from the `loc` of the original descriptor.
|
92
92
|
*/
|
93
93
|
function normalizeReportLoc(descriptor) {
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
94
|
+
if (descriptor.loc.start) {
|
95
|
+
return descriptor.loc;
|
96
|
+
}
|
97
|
+
return { start: descriptor.loc, end: null };
|
98
98
|
}
|
99
99
|
|
100
100
|
/**
|
@@ -103,14 +103,14 @@ function normalizeReportLoc(descriptor) {
|
|
103
103
|
* @returns {Fix|null} Deep cloned fix object or `null` if `null` or `undefined` was passed in.
|
104
104
|
*/
|
105
105
|
function cloneFix(fix) {
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
106
|
+
if (!fix) {
|
107
|
+
return null;
|
108
|
+
}
|
109
|
+
|
110
|
+
return {
|
111
|
+
range: [fix.range[0], fix.range[1]],
|
112
|
+
text: fix.text,
|
113
|
+
};
|
114
114
|
}
|
115
115
|
|
116
116
|
/**
|
@@ -119,9 +119,14 @@ function cloneFix(fix) {
|
|
119
119
|
* @returns {void}
|
120
120
|
*/
|
121
121
|
function assertValidFix(fix) {
|
122
|
-
|
123
|
-
|
124
|
-
|
122
|
+
if (fix) {
|
123
|
+
assert(
|
124
|
+
fix.range &&
|
125
|
+
typeof fix.range[0] === "number" &&
|
126
|
+
typeof fix.range[1] === "number",
|
127
|
+
`Fix has invalid range: ${JSON.stringify(fix, null, 2)}`,
|
128
|
+
);
|
129
|
+
}
|
125
130
|
}
|
126
131
|
|
127
132
|
/**
|
@@ -132,7 +137,7 @@ function assertValidFix(fix) {
|
|
132
137
|
* @private
|
133
138
|
*/
|
134
139
|
function compareFixesByRange(a, b) {
|
135
|
-
|
140
|
+
return a.range[0] - b.range[0] || a.range[1] - b.range[1];
|
136
141
|
}
|
137
142
|
|
138
143
|
/**
|
@@ -142,37 +147,43 @@ function compareFixesByRange(a, b) {
|
|
142
147
|
* @returns {{text: string, range: number[]}} The merged fixes
|
143
148
|
*/
|
144
149
|
function mergeFixes(fixes, sourceCode) {
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
150
|
+
for (const fix of fixes) {
|
151
|
+
assertValidFix(fix);
|
152
|
+
}
|
153
|
+
|
154
|
+
if (fixes.length === 0) {
|
155
|
+
return null;
|
156
|
+
}
|
157
|
+
if (fixes.length === 1) {
|
158
|
+
return cloneFix(fixes[0]);
|
159
|
+
}
|
160
|
+
|
161
|
+
fixes.sort(compareFixesByRange);
|
162
|
+
|
163
|
+
const originalText = sourceCode.text;
|
164
|
+
const start = fixes[0].range[0];
|
165
|
+
const end = fixes.at(-1).range[1];
|
166
|
+
let text = "";
|
167
|
+
let lastPos = Number.MIN_SAFE_INTEGER;
|
168
|
+
|
169
|
+
for (const fix of fixes) {
|
170
|
+
assert(
|
171
|
+
fix.range[0] >= lastPos,
|
172
|
+
"Fix objects must not be overlapped in a report.",
|
173
|
+
);
|
174
|
+
|
175
|
+
if (fix.range[0] >= 0) {
|
176
|
+
text += originalText.slice(
|
177
|
+
Math.max(0, start, lastPos),
|
178
|
+
fix.range[0],
|
179
|
+
);
|
180
|
+
}
|
181
|
+
text += fix.text;
|
182
|
+
lastPos = fix.range[1];
|
183
|
+
}
|
184
|
+
text += originalText.slice(Math.max(0, start, lastPos), end);
|
185
|
+
|
186
|
+
return { range: [start, end], text };
|
176
187
|
}
|
177
188
|
|
178
189
|
/**
|
@@ -183,22 +194,22 @@ function mergeFixes(fixes, sourceCode) {
|
|
183
194
|
* @returns {({text: string, range: number[]}|null)} The fix for the descriptor
|
184
195
|
*/
|
185
196
|
function normalizeFixes(descriptor, sourceCode) {
|
186
|
-
|
187
|
-
|
188
|
-
|
197
|
+
if (typeof descriptor.fix !== "function") {
|
198
|
+
return null;
|
199
|
+
}
|
189
200
|
|
190
|
-
|
201
|
+
const ruleFixer = new RuleFixer({ sourceCode });
|
191
202
|
|
192
|
-
|
193
|
-
|
203
|
+
// @type {null | Fix | Fix[] | IterableIterator<Fix>}
|
204
|
+
const fix = descriptor.fix(ruleFixer);
|
194
205
|
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
206
|
+
// Merge to one.
|
207
|
+
if (fix && Symbol.iterator in fix) {
|
208
|
+
return mergeFixes(Array.from(fix), sourceCode);
|
209
|
+
}
|
199
210
|
|
200
|
-
|
201
|
-
|
211
|
+
assertValidFix(fix);
|
212
|
+
return cloneFix(fix);
|
202
213
|
}
|
203
214
|
|
204
215
|
/**
|
@@ -209,23 +220,26 @@ function normalizeFixes(descriptor, sourceCode) {
|
|
209
220
|
* @returns {Array<SuggestionResult>} The suggestions for the descriptor
|
210
221
|
*/
|
211
222
|
function mapSuggestions(descriptor, sourceCode, messages) {
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
223
|
+
if (!descriptor.suggest || !Array.isArray(descriptor.suggest)) {
|
224
|
+
return [];
|
225
|
+
}
|
226
|
+
|
227
|
+
return (
|
228
|
+
descriptor.suggest
|
229
|
+
.map(suggestInfo => {
|
230
|
+
const computedDesc =
|
231
|
+
suggestInfo.desc || messages[suggestInfo.messageId];
|
232
|
+
|
233
|
+
return {
|
234
|
+
...suggestInfo,
|
235
|
+
desc: interpolate(computedDesc, suggestInfo.data),
|
236
|
+
fix: normalizeFixes(suggestInfo, sourceCode),
|
237
|
+
};
|
238
|
+
})
|
239
|
+
|
240
|
+
// Remove suggestions that didn't provide a fix
|
241
|
+
.filter(({ fix }) => fix)
|
242
|
+
);
|
229
243
|
}
|
230
244
|
|
231
245
|
/**
|
@@ -243,43 +257,43 @@ function mapSuggestions(descriptor, sourceCode, messages) {
|
|
243
257
|
* @returns {LintMessage} Information about the report
|
244
258
|
*/
|
245
259
|
function createProblem(options) {
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
260
|
+
const { language } = options;
|
261
|
+
|
262
|
+
// calculate offsets based on the language in use
|
263
|
+
const columnOffset = language.columnStart === 1 ? 0 : 1;
|
264
|
+
const lineOffset = language.lineStart === 1 ? 0 : 1;
|
265
|
+
|
266
|
+
const problem = {
|
267
|
+
ruleId: options.ruleId,
|
268
|
+
severity: options.severity,
|
269
|
+
message: options.message,
|
270
|
+
line: options.loc.start.line + lineOffset,
|
271
|
+
column: options.loc.start.column + columnOffset,
|
272
|
+
nodeType: (options.node && options.node.type) || null,
|
273
|
+
};
|
274
|
+
|
275
|
+
/*
|
276
|
+
* If this isn’t in the conditional, some of the tests fail
|
277
|
+
* because `messageId` is present in the problem object
|
278
|
+
*/
|
279
|
+
if (options.messageId) {
|
280
|
+
problem.messageId = options.messageId;
|
281
|
+
}
|
282
|
+
|
283
|
+
if (options.loc.end) {
|
284
|
+
problem.endLine = options.loc.end.line + lineOffset;
|
285
|
+
problem.endColumn = options.loc.end.column + columnOffset;
|
286
|
+
}
|
287
|
+
|
288
|
+
if (options.fix) {
|
289
|
+
problem.fix = options.fix;
|
290
|
+
}
|
291
|
+
|
292
|
+
if (options.suggestions && options.suggestions.length > 0) {
|
293
|
+
problem.suggestions = options.suggestions;
|
294
|
+
}
|
295
|
+
|
296
|
+
return problem;
|
283
297
|
}
|
284
298
|
|
285
299
|
/**
|
@@ -289,31 +303,41 @@ function createProblem(options) {
|
|
289
303
|
* @returns {void}
|
290
304
|
*/
|
291
305
|
function validateSuggestions(suggest, messages) {
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
306
|
+
if (suggest && Array.isArray(suggest)) {
|
307
|
+
suggest.forEach(suggestion => {
|
308
|
+
if (suggestion.messageId) {
|
309
|
+
const { messageId } = suggestion;
|
310
|
+
|
311
|
+
if (!messages) {
|
312
|
+
throw new TypeError(
|
313
|
+
`context.report() called with a suggest option with a messageId '${messageId}', but no messages were present in the rule metadata.`,
|
314
|
+
);
|
315
|
+
}
|
316
|
+
|
317
|
+
if (!messages[messageId]) {
|
318
|
+
throw new TypeError(
|
319
|
+
`context.report() called with a suggest option with a messageId '${messageId}' which is not present in the 'messages' config: ${JSON.stringify(messages, null, 2)}`,
|
320
|
+
);
|
321
|
+
}
|
322
|
+
|
323
|
+
if (suggestion.desc) {
|
324
|
+
throw new TypeError(
|
325
|
+
"context.report() called with a suggest option that defines both a 'messageId' and an 'desc'. Please only pass one.",
|
326
|
+
);
|
327
|
+
}
|
328
|
+
} else if (!suggestion.desc) {
|
329
|
+
throw new TypeError(
|
330
|
+
"context.report() called with a suggest option that doesn't have either a `desc` or `messageId`",
|
331
|
+
);
|
332
|
+
}
|
333
|
+
|
334
|
+
if (typeof suggestion.fix !== "function") {
|
335
|
+
throw new TypeError(
|
336
|
+
`context.report() called with a suggest option without a fix function. See: ${suggestion}`,
|
337
|
+
);
|
338
|
+
}
|
339
|
+
});
|
340
|
+
}
|
317
341
|
}
|
318
342
|
|
319
343
|
/**
|
@@ -324,53 +348,66 @@ function validateSuggestions(suggest, messages) {
|
|
324
348
|
*/
|
325
349
|
|
326
350
|
module.exports = function createReportTranslator(metadata) {
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
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
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
351
|
+
/*
|
352
|
+
* `createReportTranslator` gets called once per enabled rule per file. It needs to be very performant.
|
353
|
+
* The report translator itself (i.e. the function that `createReportTranslator` returns) gets
|
354
|
+
* called every time a rule reports a problem, which happens much less frequently (usually, the vast
|
355
|
+
* majority of rules don't report any problems for a given file).
|
356
|
+
*/
|
357
|
+
return (...args) => {
|
358
|
+
const descriptor = normalizeMultiArgReportCall(...args);
|
359
|
+
const messages = metadata.messageIds;
|
360
|
+
const { sourceCode } = metadata;
|
361
|
+
|
362
|
+
assertValidNodeInfo(descriptor);
|
363
|
+
|
364
|
+
let computedMessage;
|
365
|
+
|
366
|
+
if (descriptor.messageId) {
|
367
|
+
if (!messages) {
|
368
|
+
throw new TypeError(
|
369
|
+
"context.report() called with a messageId, but no messages were present in the rule metadata.",
|
370
|
+
);
|
371
|
+
}
|
372
|
+
const id = descriptor.messageId;
|
373
|
+
|
374
|
+
if (descriptor.message) {
|
375
|
+
throw new TypeError(
|
376
|
+
"context.report() called with a message and a messageId. Please only pass one.",
|
377
|
+
);
|
378
|
+
}
|
379
|
+
if (!messages || !Object.hasOwn(messages, id)) {
|
380
|
+
throw new TypeError(
|
381
|
+
`context.report() called with a messageId of '${id}' which is not present in the 'messages' config: ${JSON.stringify(messages, null, 2)}`,
|
382
|
+
);
|
383
|
+
}
|
384
|
+
computedMessage = messages[id];
|
385
|
+
} else if (descriptor.message) {
|
386
|
+
computedMessage = descriptor.message;
|
387
|
+
} else {
|
388
|
+
throw new TypeError(
|
389
|
+
"Missing `message` property in report() call; add a message that describes the linting problem.",
|
390
|
+
);
|
391
|
+
}
|
392
|
+
|
393
|
+
validateSuggestions(descriptor.suggest, messages);
|
394
|
+
|
395
|
+
return createProblem({
|
396
|
+
ruleId: metadata.ruleId,
|
397
|
+
severity: metadata.severity,
|
398
|
+
node: descriptor.node,
|
399
|
+
message: interpolate(computedMessage, descriptor.data),
|
400
|
+
messageId: descriptor.messageId,
|
401
|
+
loc: descriptor.loc
|
402
|
+
? normalizeReportLoc(descriptor)
|
403
|
+
: sourceCode.getLoc(descriptor.node),
|
404
|
+
fix: metadata.disableFixes
|
405
|
+
? null
|
406
|
+
: normalizeFixes(descriptor, sourceCode),
|
407
|
+
suggestions: metadata.disableFixes
|
408
|
+
? []
|
409
|
+
: mapSuggestions(descriptor, sourceCode, messages),
|
410
|
+
language: metadata.language,
|
411
|
+
});
|
412
|
+
};
|
376
413
|
};
|