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
package/lib/linter/rule-fixer.js
CHANGED
@@ -24,10 +24,10 @@
|
|
24
24
|
* @private
|
25
25
|
*/
|
26
26
|
function insertTextAt(index, text) {
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
27
|
+
return {
|
28
|
+
range: [index, index],
|
29
|
+
text,
|
30
|
+
};
|
31
31
|
}
|
32
32
|
|
33
33
|
//------------------------------------------------------------------------------
|
@@ -38,126 +38,124 @@ function insertTextAt(index, text) {
|
|
38
38
|
* Creates code fixing commands for rules.
|
39
39
|
*/
|
40
40
|
class RuleFixer {
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
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
|
-
|
70
|
-
|
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
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
}
|
41
|
+
/**
|
42
|
+
* The source code object representing the text to be fixed.
|
43
|
+
* @type {SourceCode}
|
44
|
+
*/
|
45
|
+
#sourceCode;
|
46
|
+
|
47
|
+
/**
|
48
|
+
* Creates a new instance.
|
49
|
+
* @param {Object} options The options for the fixer.
|
50
|
+
* @param {SourceCode} options.sourceCode The source code object representing the text to be fixed.
|
51
|
+
*/
|
52
|
+
constructor({ sourceCode }) {
|
53
|
+
this.#sourceCode = sourceCode;
|
54
|
+
}
|
55
|
+
|
56
|
+
/**
|
57
|
+
* Creates a fix command that inserts text after the given node or token.
|
58
|
+
* The fix is not applied until applyFixes() is called.
|
59
|
+
* @param {ASTNode|Token} nodeOrToken The node or token to insert after.
|
60
|
+
* @param {string} text The text to insert.
|
61
|
+
* @returns {Object} The fix command.
|
62
|
+
*/
|
63
|
+
insertTextAfter(nodeOrToken, text) {
|
64
|
+
const range = this.#sourceCode.getRange(nodeOrToken);
|
65
|
+
|
66
|
+
return this.insertTextAfterRange(range, text);
|
67
|
+
}
|
68
|
+
|
69
|
+
/**
|
70
|
+
* Creates a fix command that inserts text after the specified range in the source text.
|
71
|
+
* The fix is not applied until applyFixes() is called.
|
72
|
+
* @param {int[]} range The range to replace, first item is start of range, second
|
73
|
+
* is end of range.
|
74
|
+
* @param {string} text The text to insert.
|
75
|
+
* @returns {Object} The fix command.
|
76
|
+
*/
|
77
|
+
insertTextAfterRange(range, text) {
|
78
|
+
return insertTextAt(range[1], text);
|
79
|
+
}
|
80
|
+
|
81
|
+
/**
|
82
|
+
* Creates a fix command that inserts text before the given node or token.
|
83
|
+
* The fix is not applied until applyFixes() is called.
|
84
|
+
* @param {ASTNode|Token} nodeOrToken The node or token to insert before.
|
85
|
+
* @param {string} text The text to insert.
|
86
|
+
* @returns {Object} The fix command.
|
87
|
+
*/
|
88
|
+
insertTextBefore(nodeOrToken, text) {
|
89
|
+
const range = this.#sourceCode.getRange(nodeOrToken);
|
90
|
+
|
91
|
+
return this.insertTextBeforeRange(range, text);
|
92
|
+
}
|
93
|
+
|
94
|
+
/**
|
95
|
+
* Creates a fix command that inserts text before the specified range in the source text.
|
96
|
+
* The fix is not applied until applyFixes() is called.
|
97
|
+
* @param {int[]} range The range to replace, first item is start of range, second
|
98
|
+
* is end of range.
|
99
|
+
* @param {string} text The text to insert.
|
100
|
+
* @returns {Object} The fix command.
|
101
|
+
*/
|
102
|
+
insertTextBeforeRange(range, text) {
|
103
|
+
return insertTextAt(range[0], text);
|
104
|
+
}
|
105
|
+
|
106
|
+
/**
|
107
|
+
* Creates a fix command that replaces text at the node or token.
|
108
|
+
* The fix is not applied until applyFixes() is called.
|
109
|
+
* @param {ASTNode|Token} nodeOrToken The node or token to remove.
|
110
|
+
* @param {string} text The text to insert.
|
111
|
+
* @returns {Object} The fix command.
|
112
|
+
*/
|
113
|
+
replaceText(nodeOrToken, text) {
|
114
|
+
const range = this.#sourceCode.getRange(nodeOrToken);
|
115
|
+
|
116
|
+
return this.replaceTextRange(range, text);
|
117
|
+
}
|
118
|
+
|
119
|
+
/**
|
120
|
+
* Creates a fix command that replaces text at the specified range in the source text.
|
121
|
+
* The fix is not applied until applyFixes() is called.
|
122
|
+
* @param {int[]} range The range to replace, first item is start of range, second
|
123
|
+
* is end of range.
|
124
|
+
* @param {string} text The text to insert.
|
125
|
+
* @returns {Object} The fix command.
|
126
|
+
*/
|
127
|
+
replaceTextRange(range, text) {
|
128
|
+
return {
|
129
|
+
range,
|
130
|
+
text,
|
131
|
+
};
|
132
|
+
}
|
133
|
+
|
134
|
+
/**
|
135
|
+
* Creates a fix command that removes the node or token from the source.
|
136
|
+
* The fix is not applied until applyFixes() is called.
|
137
|
+
* @param {ASTNode|Token} nodeOrToken The node or token to remove.
|
138
|
+
* @returns {Object} The fix command.
|
139
|
+
*/
|
140
|
+
remove(nodeOrToken) {
|
141
|
+
const range = this.#sourceCode.getRange(nodeOrToken);
|
142
|
+
|
143
|
+
return this.removeRange(range);
|
144
|
+
}
|
145
|
+
|
146
|
+
/**
|
147
|
+
* Creates a fix command that removes the specified range of text from the source.
|
148
|
+
* The fix is not applied until applyFixes() is called.
|
149
|
+
* @param {int[]} range The range to remove, first item is start of range, second
|
150
|
+
* is end of range.
|
151
|
+
* @returns {Object} The fix command.
|
152
|
+
*/
|
153
|
+
removeRange(range) {
|
154
|
+
return {
|
155
|
+
range,
|
156
|
+
text: "",
|
157
|
+
};
|
158
|
+
}
|
160
159
|
}
|
161
160
|
|
162
|
-
|
163
161
|
module.exports = { RuleFixer };
|
package/lib/linter/rules.js
CHANGED
@@ -16,7 +16,7 @@ const builtInRules = require("../rules");
|
|
16
16
|
// Typedefs
|
17
17
|
//------------------------------------------------------------------------------
|
18
18
|
|
19
|
-
/** @typedef {import("../
|
19
|
+
/** @typedef {import("../types").Rule.RuleModule} Rule */
|
20
20
|
|
21
21
|
//------------------------------------------------------------------------------
|
22
22
|
// Public Interface
|
@@ -26,46 +26,46 @@ const builtInRules = require("../rules");
|
|
26
26
|
* A storage for rules.
|
27
27
|
*/
|
28
28
|
class Rules {
|
29
|
-
|
30
|
-
|
31
|
-
|
29
|
+
constructor() {
|
30
|
+
this._rules = Object.create(null);
|
31
|
+
}
|
32
32
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
33
|
+
/**
|
34
|
+
* Registers a rule module for rule id in storage.
|
35
|
+
* @param {string} ruleId Rule id (file name).
|
36
|
+
* @param {Rule} rule Rule object.
|
37
|
+
* @returns {void}
|
38
|
+
*/
|
39
|
+
define(ruleId, rule) {
|
40
|
+
this._rules[ruleId] = rule;
|
41
|
+
}
|
42
42
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
43
|
+
/**
|
44
|
+
* Access rule handler by id (file name).
|
45
|
+
* @param {string} ruleId Rule id (file name).
|
46
|
+
* @returns {Rule} Rule object.
|
47
|
+
*/
|
48
|
+
get(ruleId) {
|
49
|
+
if (typeof this._rules[ruleId] === "string") {
|
50
|
+
this.define(ruleId, require(this._rules[ruleId]));
|
51
|
+
}
|
52
|
+
if (this._rules[ruleId]) {
|
53
|
+
return this._rules[ruleId];
|
54
|
+
}
|
55
|
+
if (builtInRules.has(ruleId)) {
|
56
|
+
return builtInRules.get(ruleId);
|
57
|
+
}
|
58
58
|
|
59
|
-
|
60
|
-
|
59
|
+
return null;
|
60
|
+
}
|
61
61
|
|
62
|
-
|
63
|
-
|
62
|
+
*[Symbol.iterator]() {
|
63
|
+
yield* builtInRules;
|
64
64
|
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
65
|
+
for (const ruleId of Object.keys(this._rules)) {
|
66
|
+
yield [ruleId, this.get(ruleId)];
|
67
|
+
}
|
68
|
+
}
|
69
69
|
}
|
70
70
|
|
71
71
|
module.exports = Rules;
|
@@ -30,23 +30,23 @@
|
|
30
30
|
* @returns {SafeEmitter} An emitter
|
31
31
|
*/
|
32
32
|
module.exports = () => {
|
33
|
-
|
33
|
+
const listeners = Object.create(null);
|
34
34
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
35
|
+
return Object.freeze({
|
36
|
+
on(eventName, listener) {
|
37
|
+
if (eventName in listeners) {
|
38
|
+
listeners[eventName].push(listener);
|
39
|
+
} else {
|
40
|
+
listeners[eventName] = [listener];
|
41
|
+
}
|
42
|
+
},
|
43
|
+
emit(eventName, ...args) {
|
44
|
+
if (eventName in listeners) {
|
45
|
+
listeners[eventName].forEach(listener => listener(...args));
|
46
|
+
}
|
47
|
+
},
|
48
|
+
eventNames() {
|
49
|
+
return Object.keys(listeners);
|
50
|
+
},
|
51
|
+
});
|
52
52
|
};
|
@@ -24,7 +24,7 @@ const BOM = "\uFEFF";
|
|
24
24
|
* @private
|
25
25
|
*/
|
26
26
|
function compareMessagesByFixRange(a, b) {
|
27
|
-
|
27
|
+
return a.fix.range[0] - b.fix.range[0] || a.fix.range[1] - b.fix.range[1];
|
28
28
|
}
|
29
29
|
|
30
30
|
/**
|
@@ -35,7 +35,7 @@ function compareMessagesByFixRange(a, b) {
|
|
35
35
|
* @private
|
36
36
|
*/
|
37
37
|
function compareMessagesByLocation(a, b) {
|
38
|
-
|
38
|
+
return a.line - b.line || a.column - b.column;
|
39
39
|
}
|
40
40
|
|
41
41
|
//------------------------------------------------------------------------------
|
@@ -47,7 +47,7 @@ function compareMessagesByLocation(a, b) {
|
|
47
47
|
* @constructor
|
48
48
|
*/
|
49
49
|
function SourceCodeFixer() {
|
50
|
-
|
50
|
+
Object.freeze(this);
|
51
51
|
}
|
52
52
|
|
53
53
|
/**
|
@@ -58,95 +58,97 @@ function SourceCodeFixer() {
|
|
58
58
|
* @param {boolean|Function} [shouldFix=true] Determines whether each message should be fixed
|
59
59
|
* @returns {Object} An object containing the fixed text and any unfixed messages.
|
60
60
|
*/
|
61
|
-
SourceCodeFixer.applyFixes = function(sourceText, messages, shouldFix) {
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
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
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
61
|
+
SourceCodeFixer.applyFixes = function (sourceText, messages, shouldFix) {
|
62
|
+
debug("Applying fixes");
|
63
|
+
|
64
|
+
if (shouldFix === false) {
|
65
|
+
debug("shouldFix parameter was false, not attempting fixes");
|
66
|
+
return {
|
67
|
+
fixed: false,
|
68
|
+
messages,
|
69
|
+
output: sourceText,
|
70
|
+
};
|
71
|
+
}
|
72
|
+
|
73
|
+
// clone the array
|
74
|
+
const remainingMessages = [],
|
75
|
+
fixes = [],
|
76
|
+
bom = sourceText.startsWith(BOM) ? BOM : "",
|
77
|
+
text = bom ? sourceText.slice(1) : sourceText;
|
78
|
+
let lastPos = Number.NEGATIVE_INFINITY,
|
79
|
+
output = bom;
|
80
|
+
|
81
|
+
/**
|
82
|
+
* Try to use the 'fix' from a problem.
|
83
|
+
* @param {Message} problem The message object to apply fixes from
|
84
|
+
* @returns {boolean} Whether fix was successfully applied
|
85
|
+
*/
|
86
|
+
function attemptFix(problem) {
|
87
|
+
const fix = problem.fix;
|
88
|
+
const start = fix.range[0];
|
89
|
+
const end = fix.range[1];
|
90
|
+
|
91
|
+
// Remain it as a problem if it's overlapped or it's a negative range
|
92
|
+
if (lastPos >= start || start > end) {
|
93
|
+
remainingMessages.push(problem);
|
94
|
+
return false;
|
95
|
+
}
|
96
|
+
|
97
|
+
// Remove BOM.
|
98
|
+
if (
|
99
|
+
(start < 0 && end >= 0) ||
|
100
|
+
(start === 0 && fix.text.startsWith(BOM))
|
101
|
+
) {
|
102
|
+
output = "";
|
103
|
+
}
|
104
|
+
|
105
|
+
// Make output to this fix.
|
106
|
+
output += text.slice(Math.max(0, lastPos), Math.max(0, start));
|
107
|
+
output += fix.text;
|
108
|
+
lastPos = end;
|
109
|
+
return true;
|
110
|
+
}
|
111
|
+
|
112
|
+
messages.forEach(problem => {
|
113
|
+
if (Object.hasOwn(problem, "fix") && problem.fix) {
|
114
|
+
fixes.push(problem);
|
115
|
+
} else {
|
116
|
+
remainingMessages.push(problem);
|
117
|
+
}
|
118
|
+
});
|
119
|
+
|
120
|
+
if (fixes.length) {
|
121
|
+
debug("Found fixes to apply");
|
122
|
+
let fixesWereApplied = false;
|
123
|
+
|
124
|
+
for (const problem of fixes.sort(compareMessagesByFixRange)) {
|
125
|
+
if (typeof shouldFix !== "function" || shouldFix(problem)) {
|
126
|
+
attemptFix(problem);
|
127
|
+
|
128
|
+
/*
|
129
|
+
* The only time attemptFix will fail is if a previous fix was
|
130
|
+
* applied which conflicts with it. So we can mark this as true.
|
131
|
+
*/
|
132
|
+
fixesWereApplied = true;
|
133
|
+
} else {
|
134
|
+
remainingMessages.push(problem);
|
135
|
+
}
|
136
|
+
}
|
137
|
+
output += text.slice(Math.max(0, lastPos));
|
138
|
+
|
139
|
+
return {
|
140
|
+
fixed: fixesWereApplied,
|
141
|
+
messages: remainingMessages.sort(compareMessagesByLocation),
|
142
|
+
output,
|
143
|
+
};
|
144
|
+
}
|
145
|
+
|
146
|
+
debug("No fixes to apply");
|
147
|
+
return {
|
148
|
+
fixed: false,
|
149
|
+
messages,
|
150
|
+
output: bom + text,
|
151
|
+
};
|
150
152
|
};
|
151
153
|
|
152
154
|
module.exports = SourceCodeFixer;
|