eslint 9.21.0 → 9.23.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +52 -48
- package/bin/eslint.js +92 -90
- package/conf/default-cli-options.js +22 -22
- package/conf/ecma-version.js +1 -1
- package/conf/globals.js +97 -98
- package/conf/replacements.json +24 -20
- package/conf/rule-type-list.json +88 -92
- package/lib/api.js +12 -12
- package/lib/cli-engine/cli-engine.js +828 -808
- package/lib/cli-engine/file-enumerator.js +381 -387
- package/lib/cli-engine/formatters/formatters-meta.json +16 -16
- package/lib/cli-engine/formatters/html.js +107 -99
- package/lib/cli-engine/formatters/json-with-metadata.js +5 -5
- package/lib/cli-engine/formatters/json.js +2 -2
- package/lib/cli-engine/formatters/stylish.js +96 -75
- package/lib/cli-engine/hash.js +1 -1
- package/lib/cli-engine/index.js +1 -1
- package/lib/cli-engine/lint-result-cache.js +144 -145
- package/lib/cli-engine/load-rules.js +16 -16
- package/lib/cli.js +541 -457
- package/lib/config/config-loader.js +648 -618
- package/lib/config/config.js +247 -221
- package/lib/config/default-config.js +54 -45
- package/lib/config/flat-config-array.js +167 -172
- package/lib/config/flat-config-helpers.js +65 -68
- package/lib/config/flat-config-schema.js +375 -368
- package/lib/config/rule-validator.js +139 -144
- package/lib/config-api.js +12 -0
- package/lib/eslint/eslint-helpers.js +709 -679
- package/lib/eslint/eslint.js +944 -886
- package/lib/eslint/index.js +2 -2
- package/lib/eslint/legacy-eslint.js +576 -532
- package/lib/languages/js/index.js +263 -264
- package/lib/languages/js/source-code/index.js +1 -1
- package/lib/languages/js/source-code/source-code.js +1129 -1054
- package/lib/languages/js/source-code/token-store/backward-token-comment-cursor.js +39 -35
- package/lib/languages/js/source-code/token-store/backward-token-cursor.js +35 -36
- package/lib/languages/js/source-code/token-store/cursor.js +36 -36
- package/lib/languages/js/source-code/token-store/cursors.js +80 -52
- package/lib/languages/js/source-code/token-store/decorative-cursor.js +17 -18
- package/lib/languages/js/source-code/token-store/filter-cursor.js +19 -20
- package/lib/languages/js/source-code/token-store/forward-token-comment-cursor.js +40 -32
- package/lib/languages/js/source-code/token-store/forward-token-cursor.js +40 -41
- package/lib/languages/js/source-code/token-store/index.js +592 -498
- package/lib/languages/js/source-code/token-store/limit-cursor.js +17 -18
- package/lib/languages/js/source-code/token-store/padded-token-cursor.js +23 -16
- package/lib/languages/js/source-code/token-store/skip-cursor.js +19 -20
- package/lib/languages/js/source-code/token-store/utils.js +63 -60
- package/lib/languages/js/validate-language-options.js +104 -89
- package/lib/linter/apply-disable-directives.js +467 -383
- package/lib/linter/code-path-analysis/code-path-analyzer.js +650 -672
- package/lib/linter/code-path-analysis/code-path-segment.js +215 -216
- package/lib/linter/code-path-analysis/code-path-state.js +2118 -2096
- package/lib/linter/code-path-analysis/code-path.js +307 -319
- package/lib/linter/code-path-analysis/debug-helpers.js +183 -163
- package/lib/linter/code-path-analysis/fork-context.js +296 -271
- package/lib/linter/code-path-analysis/id-generator.js +22 -23
- package/lib/linter/file-context.js +119 -120
- package/lib/linter/index.js +3 -3
- package/lib/linter/interpolate.js +16 -16
- package/lib/linter/linter.js +2402 -2044
- package/lib/linter/node-event-generator.js +284 -225
- package/lib/linter/report-translator.js +256 -219
- package/lib/linter/rule-fixer.js +122 -124
- package/lib/linter/rules.js +35 -35
- package/lib/linter/safe-emitter.js +18 -18
- package/lib/linter/source-code-fixer.js +94 -92
- package/lib/linter/timing.js +104 -101
- package/lib/linter/vfile.js +70 -73
- package/lib/options.js +375 -361
- package/lib/rule-tester/index.js +1 -1
- package/lib/rule-tester/rule-tester.js +1307 -1045
- package/lib/rules/accessor-pairs.js +297 -262
- package/lib/rules/array-bracket-newline.js +249 -237
- package/lib/rules/array-bracket-spacing.js +262 -223
- package/lib/rules/array-callback-return.js +401 -355
- package/lib/rules/array-element-newline.js +357 -312
- package/lib/rules/arrow-body-style.js +399 -280
- package/lib/rules/arrow-parens.js +205 -172
- package/lib/rules/arrow-spacing.js +168 -162
- package/lib/rules/block-scoped-var.js +124 -122
- package/lib/rules/block-spacing.js +185 -175
- package/lib/rules/brace-style.js +261 -198
- package/lib/rules/callback-return.js +202 -189
- package/lib/rules/camelcase.js +402 -391
- package/lib/rules/capitalized-comments.js +252 -231
- package/lib/rules/class-methods-use-this.js +179 -171
- package/lib/rules/comma-dangle.js +378 -345
- package/lib/rules/comma-spacing.js +192 -194
- package/lib/rules/comma-style.js +374 -315
- package/lib/rules/complexity.js +172 -168
- package/lib/rules/computed-property-spacing.js +235 -210
- package/lib/rules/consistent-return.js +180 -169
- package/lib/rules/consistent-this.js +166 -146
- package/lib/rules/constructor-super.js +411 -403
- package/lib/rules/curly.js +406 -331
- package/lib/rules/default-case-last.js +37 -30
- package/lib/rules/default-case.js +88 -84
- package/lib/rules/default-param-last.js +68 -53
- package/lib/rules/dot-location.js +121 -109
- package/lib/rules/dot-notation.js +191 -155
- package/lib/rules/eol-last.js +121 -119
- package/lib/rules/eqeqeq.js +167 -154
- package/lib/rules/for-direction.js +145 -120
- package/lib/rules/func-call-spacing.js +260 -230
- package/lib/rules/func-name-matching.js +292 -208
- package/lib/rules/func-names.js +164 -163
- package/lib/rules/func-style.js +158 -126
- package/lib/rules/function-call-argument-newline.js +151 -128
- package/lib/rules/function-paren-newline.js +348 -290
- package/lib/rules/generator-star-spacing.js +228 -209
- package/lib/rules/getter-return.js +207 -171
- package/lib/rules/global-require.js +84 -73
- package/lib/rules/grouped-accessor-pairs.js +169 -149
- package/lib/rules/guard-for-in.js +71 -62
- package/lib/rules/handle-callback-err.js +107 -102
- package/lib/rules/id-blacklist.js +181 -198
- package/lib/rules/id-denylist.js +167 -186
- package/lib/rules/id-length.js +196 -170
- package/lib/rules/id-match.js +343 -288
- package/lib/rules/implicit-arrow-linebreak.js +101 -78
- package/lib/rules/indent-legacy.js +1343 -1117
- package/lib/rules/indent.js +2271 -1758
- package/lib/rules/index.js +317 -292
- package/lib/rules/init-declarations.js +115 -106
- package/lib/rules/jsx-quotes.js +93 -81
- package/lib/rules/key-spacing.js +749 -632
- package/lib/rules/keyword-spacing.js +647 -604
- package/lib/rules/line-comment-position.js +141 -127
- package/lib/rules/linebreak-style.js +106 -105
- package/lib/rules/lines-around-comment.js +539 -447
- package/lib/rules/lines-around-directive.js +232 -202
- package/lib/rules/lines-between-class-members.js +304 -233
- package/lib/rules/logical-assignment-operators.js +581 -398
- package/lib/rules/max-classes-per-file.js +68 -67
- package/lib/rules/max-depth.js +145 -142
- package/lib/rules/max-len.js +472 -433
- package/lib/rules/max-lines-per-function.js +200 -175
- package/lib/rules/max-lines.js +157 -161
- package/lib/rules/max-nested-callbacks.js +101 -103
- package/lib/rules/max-params.js +77 -75
- package/lib/rules/max-statements-per-line.js +204 -197
- package/lib/rules/max-statements.js +167 -163
- package/lib/rules/multiline-comment-style.js +636 -478
- package/lib/rules/multiline-ternary.js +240 -175
- package/lib/rules/new-cap.js +232 -212
- package/lib/rules/new-parens.js +87 -78
- package/lib/rules/newline-after-var.js +286 -249
- package/lib/rules/newline-before-return.js +228 -221
- package/lib/rules/newline-per-chained-call.js +141 -126
- package/lib/rules/no-alert.js +89 -78
- package/lib/rules/no-array-constructor.js +121 -112
- package/lib/rules/no-async-promise-executor.js +29 -23
- package/lib/rules/no-await-in-loop.js +68 -70
- package/lib/rules/no-bitwise.js +123 -99
- package/lib/rules/no-buffer-constructor.js +54 -46
- package/lib/rules/no-caller.js +38 -32
- package/lib/rules/no-case-declarations.js +60 -56
- package/lib/rules/no-catch-shadow.js +75 -72
- package/lib/rules/no-class-assign.js +50 -47
- package/lib/rules/no-compare-neg-zero.js +61 -47
- package/lib/rules/no-cond-assign.js +147 -131
- package/lib/rules/no-confusing-arrow.js +97 -80
- package/lib/rules/no-console.js +201 -190
- package/lib/rules/no-const-assign.js +46 -40
- package/lib/rules/no-constant-binary-expression.js +499 -404
- package/lib/rules/no-constant-condition.js +157 -142
- package/lib/rules/no-constructor-return.js +48 -48
- package/lib/rules/no-continue.js +24 -26
- package/lib/rules/no-control-regex.js +124 -120
- package/lib/rules/no-debugger.js +27 -29
- package/lib/rules/no-delete-var.js +28 -28
- package/lib/rules/no-div-regex.js +46 -40
- package/lib/rules/no-dupe-args.js +67 -68
- package/lib/rules/no-dupe-class-members.js +92 -88
- package/lib/rules/no-dupe-else-if.js +99 -76
- package/lib/rules/no-dupe-keys.js +132 -109
- package/lib/rules/no-duplicate-case.js +49 -42
- package/lib/rules/no-duplicate-imports.js +178 -175
- package/lib/rules/no-else-return.js +429 -384
- package/lib/rules/no-empty-character-class.js +56 -49
- package/lib/rules/no-empty-function.js +126 -127
- package/lib/rules/no-empty-pattern.js +62 -57
- package/lib/rules/no-empty-static-block.js +36 -34
- package/lib/rules/no-empty.js +97 -85
- package/lib/rules/no-eq-null.js +36 -31
- package/lib/rules/no-eval.js +255 -249
- package/lib/rules/no-ex-assign.js +41 -38
- package/lib/rules/no-extend-native.js +160 -158
- package/lib/rules/no-extra-bind.js +200 -189
- package/lib/rules/no-extra-boolean-cast.js +397 -347
- package/lib/rules/no-extra-label.js +149 -130
- package/lib/rules/no-extra-parens.js +1653 -1324
- package/lib/rules/no-extra-semi.js +145 -143
- package/lib/rules/no-fallthrough.js +198 -156
- package/lib/rules/no-floating-decimal.js +73 -65
- package/lib/rules/no-func-assign.js +53 -54
- package/lib/rules/no-global-assign.js +77 -72
- package/lib/rules/no-implicit-coercion.js +348 -292
- package/lib/rules/no-implicit-globals.js +157 -134
- package/lib/rules/no-implied-eval.js +139 -111
- package/lib/rules/no-import-assign.js +144 -158
- package/lib/rules/no-inline-comments.js +100 -94
- package/lib/rules/no-inner-declarations.js +114 -100
- package/lib/rules/no-invalid-regexp.js +221 -189
- package/lib/rules/no-invalid-this.js +122 -116
- package/lib/rules/no-irregular-whitespace.js +265 -251
- package/lib/rules/no-iterator.js +28 -32
- package/lib/rules/no-label-var.js +58 -61
- package/lib/rules/no-labels.js +137 -132
- package/lib/rules/no-lone-blocks.js +126 -122
- package/lib/rules/no-lonely-if.js +107 -76
- package/lib/rules/no-loop-func.js +233 -212
- package/lib/rules/no-loss-of-precision.js +215 -200
- package/lib/rules/no-magic-numbers.js +245 -217
- package/lib/rules/no-misleading-character-class.js +498 -445
- package/lib/rules/no-mixed-operators.js +187 -181
- package/lib/rules/no-mixed-requires.js +252 -239
- package/lib/rules/no-mixed-spaces-and-tabs.js +133 -120
- package/lib/rules/no-multi-assign.js +45 -43
- package/lib/rules/no-multi-spaces.js +162 -142
- package/lib/rules/no-multi-str.js +41 -40
- package/lib/rules/no-multiple-empty-lines.js +195 -157
- package/lib/rules/no-native-reassign.js +89 -84
- package/lib/rules/no-negated-condition.js +78 -74
- package/lib/rules/no-negated-in-lhs.js +44 -42
- package/lib/rules/no-nested-ternary.js +32 -31
- package/lib/rules/no-new-func.js +70 -61
- package/lib/rules/no-new-native-nonconstructor.js +42 -38
- package/lib/rules/no-new-object.js +47 -47
- package/lib/rules/no-new-require.js +47 -46
- package/lib/rules/no-new-symbol.js +51 -49
- package/lib/rules/no-new-wrappers.js +42 -40
- package/lib/rules/no-new.js +27 -28
- package/lib/rules/no-nonoctal-decimal-escape.js +140 -120
- package/lib/rules/no-obj-calls.js +65 -52
- package/lib/rules/no-object-constructor.js +103 -96
- package/lib/rules/no-octal-escape.js +39 -42
- package/lib/rules/no-octal.js +31 -31
- package/lib/rules/no-param-reassign.js +234 -216
- package/lib/rules/no-path-concat.js +65 -66
- package/lib/rules/no-plusplus.js +59 -60
- package/lib/rules/no-process-env.js +48 -47
- package/lib/rules/no-process-exit.js +53 -49
- package/lib/rules/no-promise-executor-return.js +213 -181
- package/lib/rules/no-proto.js +25 -28
- package/lib/rules/no-prototype-builtins.js +145 -123
- package/lib/rules/no-redeclare.js +153 -151
- package/lib/rules/no-regex-spaces.js +182 -160
- package/lib/rules/no-restricted-exports.js +207 -184
- package/lib/rules/no-restricted-globals.js +110 -111
- package/lib/rules/no-restricted-imports.js +656 -536
- package/lib/rules/no-restricted-modules.js +221 -201
- package/lib/rules/no-restricted-properties.js +180 -152
- package/lib/rules/no-restricted-syntax.js +55 -51
- package/lib/rules/no-return-assign.js +54 -49
- package/lib/rules/no-return-await.js +147 -123
- package/lib/rules/no-script-url.js +51 -44
- package/lib/rules/no-self-assign.js +147 -145
- package/lib/rules/no-self-compare.js +62 -45
- package/lib/rules/no-sequences.js +134 -115
- package/lib/rules/no-setter-return.js +184 -151
- package/lib/rules/no-shadow-restricted-names.js +60 -45
- package/lib/rules/no-shadow.js +341 -315
- package/lib/rules/no-spaced-func.js +81 -76
- package/lib/rules/no-sparse-arrays.js +53 -58
- package/lib/rules/no-sync.js +60 -59
- package/lib/rules/no-tabs.js +82 -71
- package/lib/rules/no-template-curly-in-string.js +32 -31
- package/lib/rules/no-ternary.js +24 -28
- package/lib/rules/no-this-before-super.js +320 -318
- package/lib/rules/no-throw-literal.js +30 -35
- package/lib/rules/no-trailing-spaces.js +198 -190
- package/lib/rules/no-undef-init.js +75 -60
- package/lib/rules/no-undef.js +50 -47
- package/lib/rules/no-undefined.js +72 -74
- package/lib/rules/no-underscore-dangle.js +369 -326
- package/lib/rules/no-unexpected-multiline.js +111 -101
- package/lib/rules/no-unmodified-loop-condition.js +253 -253
- package/lib/rules/no-unneeded-ternary.js +211 -146
- package/lib/rules/no-unreachable-loop.js +144 -141
- package/lib/rules/no-unreachable.js +254 -247
- package/lib/rules/no-unsafe-finally.js +92 -84
- package/lib/rules/no-unsafe-negation.js +104 -82
- package/lib/rules/no-unsafe-optional-chaining.js +191 -177
- package/lib/rules/no-unused-expressions.js +177 -161
- package/lib/rules/no-unused-labels.js +138 -123
- package/lib/rules/no-unused-private-class-members.js +205 -181
- package/lib/rules/no-unused-vars.js +1668 -1448
- package/lib/rules/no-use-before-define.js +228 -230
- package/lib/rules/no-useless-assignment.js +589 -510
- package/lib/rules/no-useless-backreference.js +211 -192
- package/lib/rules/no-useless-call.js +57 -52
- package/lib/rules/no-useless-catch.js +39 -39
- package/lib/rules/no-useless-computed-key.js +143 -114
- package/lib/rules/no-useless-concat.js +64 -59
- package/lib/rules/no-useless-constructor.js +157 -110
- package/lib/rules/no-useless-escape.js +341 -290
- package/lib/rules/no-useless-rename.js +182 -155
- package/lib/rules/no-useless-return.js +343 -311
- package/lib/rules/no-var.js +232 -211
- package/lib/rules/no-void.js +49 -47
- package/lib/rules/no-warning-comments.js +190 -185
- package/lib/rules/no-whitespace-before-property.js +130 -114
- package/lib/rules/no-with.js +23 -25
- package/lib/rules/nonblock-statement-body-position.js +148 -129
- package/lib/rules/object-curly-newline.js +305 -264
- package/lib/rules/object-curly-spacing.js +359 -313
- package/lib/rules/object-property-newline.js +136 -105
- package/lib/rules/object-shorthand.js +606 -501
- package/lib/rules/one-var-declaration-per-line.js +103 -99
- package/lib/rules/one-var.js +652 -536
- package/lib/rules/operator-assignment.js +218 -160
- package/lib/rules/operator-linebreak.js +294 -250
- package/lib/rules/padded-blocks.js +345 -307
- package/lib/rules/padding-line-between-statements.js +442 -438
- package/lib/rules/prefer-arrow-callback.js +361 -312
- package/lib/rules/prefer-const.js +417 -376
- package/lib/rules/prefer-destructuring.js +300 -278
- package/lib/rules/prefer-exponentiation-operator.js +175 -132
- package/lib/rules/prefer-named-capture-group.js +152 -139
- package/lib/rules/prefer-numeric-literals.js +120 -112
- package/lib/rules/prefer-object-has-own.js +115 -81
- package/lib/rules/prefer-object-spread.js +212 -192
- package/lib/rules/prefer-promise-reject-errors.js +139 -121
- package/lib/rules/prefer-reflect.js +126 -106
- package/lib/rules/prefer-regex-literals.js +577 -465
- package/lib/rules/prefer-rest-params.js +78 -79
- package/lib/rules/prefer-spread.js +46 -43
- package/lib/rules/prefer-template.js +265 -194
- package/lib/rules/quote-props.js +372 -306
- package/lib/rules/quotes.js +373 -325
- package/lib/rules/radix.js +151 -135
- package/lib/rules/require-atomic-updates.js +315 -284
- package/lib/rules/require-await.js +143 -115
- package/lib/rules/require-unicode-regexp.js +281 -176
- package/lib/rules/require-yield.js +52 -53
- package/lib/rules/rest-spread-spacing.js +127 -115
- package/lib/rules/semi-spacing.js +280 -249
- package/lib/rules/semi-style.js +175 -133
- package/lib/rules/semi.js +455 -435
- package/lib/rules/sort-imports.js +305 -232
- package/lib/rules/sort-keys.js +218 -187
- package/lib/rules/sort-vars.js +126 -92
- package/lib/rules/space-before-blocks.js +198 -188
- package/lib/rules/space-before-function-paren.js +185 -165
- package/lib/rules/space-in-parens.js +358 -287
- package/lib/rules/space-infix-ops.js +236 -200
- package/lib/rules/space-unary-ops.js +355 -297
- package/lib/rules/spaced-comment.js +362 -318
- package/lib/rules/strict.js +264 -229
- package/lib/rules/switch-colon-spacing.js +129 -121
- package/lib/rules/symbol-description.js +44 -47
- package/lib/rules/template-curly-spacing.js +147 -141
- package/lib/rules/template-tag-spacing.js +97 -87
- package/lib/rules/unicode-bom.js +53 -55
- package/lib/rules/use-isnan.js +236 -205
- package/lib/rules/utils/ast-utils.js +2039 -1860
- package/lib/rules/utils/char-source.js +162 -155
- package/lib/rules/utils/fix-tracker.js +83 -80
- package/lib/rules/utils/keywords.js +59 -59
- package/lib/rules/utils/lazy-loading-rule-map.js +79 -76
- package/lib/rules/utils/regular-expressions.js +32 -24
- package/lib/rules/utils/unicode/index.js +4 -4
- package/lib/rules/utils/unicode/is-combining-character.js +1 -1
- package/lib/rules/utils/unicode/is-emoji-modifier.js +1 -1
- package/lib/rules/utils/unicode/is-regional-indicator-symbol.js +1 -1
- package/lib/rules/utils/unicode/is-surrogate-pair.js +1 -1
- package/lib/rules/valid-typeof.js +152 -110
- package/lib/rules/vars-on-top.js +151 -144
- package/lib/rules/wrap-iife.js +203 -190
- package/lib/rules/wrap-regex.js +69 -57
- package/lib/rules/yield-star-spacing.js +144 -133
- package/lib/rules/yoda.js +282 -271
- package/lib/services/parser-service.js +35 -35
- package/lib/services/processor-service.js +66 -73
- package/lib/shared/ajv.js +14 -14
- package/lib/shared/assert.js +3 -4
- package/lib/shared/ast-utils.js +7 -6
- package/lib/shared/deep-merge-arrays.js +24 -22
- package/lib/shared/directives.js +3 -2
- package/lib/shared/flags.js +46 -17
- package/lib/shared/logging.js +24 -25
- package/lib/shared/option-utils.js +43 -36
- package/lib/shared/runtime-info.js +136 -127
- package/lib/shared/serialization.js +27 -27
- package/lib/shared/severity.js +22 -22
- package/lib/shared/stats.js +5 -5
- package/lib/shared/string-utils.js +16 -16
- package/lib/shared/text-table.js +28 -27
- package/lib/shared/traverser.js +153 -146
- package/lib/types/config-api.d.ts +8 -0
- package/lib/types/index.d.ts +2010 -1559
- package/lib/types/rules.d.ts +5312 -0
- package/lib/types/use-at-your-own-risk.d.ts +32 -30
- package/lib/unsupported-api.js +5 -5
- package/messages/all-files-ignored.js +3 -3
- package/messages/all-matched-files-ignored.js +3 -3
- package/messages/config-file-missing.js +2 -2
- package/messages/config-plugin-missing.js +3 -3
- package/messages/config-serialize-function.js +9 -7
- package/messages/eslintrc-incompat.js +13 -15
- package/messages/eslintrc-plugins.js +3 -4
- package/messages/extend-config-missing.js +3 -3
- package/messages/failed-to-read-json.js +3 -3
- package/messages/file-not-found.js +3 -3
- package/messages/invalid-rule-options.js +2 -2
- package/messages/invalid-rule-severity.js +2 -2
- package/messages/no-config-found.js +3 -3
- package/messages/plugin-conflict.js +8 -8
- package/messages/plugin-invalid.js +3 -3
- package/messages/plugin-missing.js +3 -3
- package/messages/print-config-with-directory-path.js +2 -2
- package/messages/shared.js +6 -1
- package/messages/whitespace-found.js +3 -3
- package/package.json +22 -20
- package/lib/types/rules/best-practices.d.ts +0 -1143
- package/lib/types/rules/deprecated.d.ts +0 -252
- package/lib/types/rules/ecmascript-6.d.ts +0 -647
- package/lib/types/rules/index.d.ts +0 -50
- package/lib/types/rules/node-commonjs.d.ts +0 -171
- package/lib/types/rules/possible-errors.d.ts +0 -685
- package/lib/types/rules/strict-mode.d.ts +0 -38
- package/lib/types/rules/stylistic-issues.d.ts +0 -2043
- package/lib/types/rules/variables.d.ts +0 -234
package/lib/rules/no-var.js
CHANGED
@@ -21,7 +21,7 @@ const astUtils = require("./utils/ast-utils");
|
|
21
21
|
* @returns {boolean} `true` if the variable is a global variable.
|
22
22
|
*/
|
23
23
|
function isGlobal(variable) {
|
24
|
-
|
24
|
+
return Boolean(variable.scope) && variable.scope.type === "global";
|
25
25
|
}
|
26
26
|
|
27
27
|
/**
|
@@ -32,12 +32,12 @@ function isGlobal(variable) {
|
|
32
32
|
* scope.
|
33
33
|
*/
|
34
34
|
function getEnclosingFunctionScope(scope) {
|
35
|
-
|
35
|
+
let currentScope = scope;
|
36
36
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
37
|
+
while (currentScope.type !== "function" && currentScope.type !== "global") {
|
38
|
+
currentScope = currentScope.upper;
|
39
|
+
}
|
40
|
+
return currentScope;
|
41
41
|
}
|
42
42
|
|
43
43
|
/**
|
@@ -47,10 +47,13 @@ function getEnclosingFunctionScope(scope) {
|
|
47
47
|
* @returns {boolean} `true` if the variable is used from a closure.
|
48
48
|
*/
|
49
49
|
function isReferencedInClosure(variable) {
|
50
|
-
|
50
|
+
const enclosingFunctionScope = getEnclosingFunctionScope(variable.scope);
|
51
51
|
|
52
|
-
|
53
|
-
|
52
|
+
return variable.references.some(
|
53
|
+
reference =>
|
54
|
+
getEnclosingFunctionScope(reference.from) !==
|
55
|
+
enclosingFunctionScope,
|
56
|
+
);
|
54
57
|
}
|
55
58
|
|
56
59
|
/**
|
@@ -60,8 +63,11 @@ function isReferencedInClosure(variable) {
|
|
60
63
|
* iteration.
|
61
64
|
*/
|
62
65
|
function isLoopAssignee(node) {
|
63
|
-
|
64
|
-
|
66
|
+
return (
|
67
|
+
(node.parent.type === "ForOfStatement" ||
|
68
|
+
node.parent.type === "ForInStatement") &&
|
69
|
+
node === node.parent.left
|
70
|
+
);
|
65
71
|
}
|
66
72
|
|
67
73
|
/**
|
@@ -70,10 +76,11 @@ function isLoopAssignee(node) {
|
|
70
76
|
* @returns {boolean} `true` if the declaration has an initializer.
|
71
77
|
*/
|
72
78
|
function isDeclarationInitialized(node) {
|
73
|
-
|
79
|
+
return node.declarations.every(declarator => declarator.init !== null);
|
74
80
|
}
|
75
81
|
|
76
|
-
const SCOPE_NODE_TYPE =
|
82
|
+
const SCOPE_NODE_TYPE =
|
83
|
+
/^(?:Program|BlockStatement|SwitchStatement|ForStatement|ForInStatement|ForOfStatement)$/u;
|
77
84
|
|
78
85
|
/**
|
79
86
|
* Gets the scope node which directly contains a given node.
|
@@ -84,14 +91,18 @@ const SCOPE_NODE_TYPE = /^(?:Program|BlockStatement|SwitchStatement|ForStatement
|
|
84
91
|
* `ForOfStatement`.
|
85
92
|
*/
|
86
93
|
function getScopeNode(node) {
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
94
|
+
for (
|
95
|
+
let currentNode = node;
|
96
|
+
currentNode;
|
97
|
+
currentNode = currentNode.parent
|
98
|
+
) {
|
99
|
+
if (SCOPE_NODE_TYPE.test(currentNode.type)) {
|
100
|
+
return currentNode;
|
101
|
+
}
|
102
|
+
}
|
103
|
+
|
104
|
+
/* c8 ignore next */
|
105
|
+
return null;
|
95
106
|
}
|
96
107
|
|
97
108
|
/**
|
@@ -100,7 +111,7 @@ function getScopeNode(node) {
|
|
100
111
|
* @returns {boolean} `true` if the variable is redeclared.
|
101
112
|
*/
|
102
113
|
function isRedeclared(variable) {
|
103
|
-
|
114
|
+
return variable.defs.length >= 2;
|
104
115
|
}
|
105
116
|
|
106
117
|
/**
|
@@ -110,23 +121,22 @@ function isRedeclared(variable) {
|
|
110
121
|
* variable is used from outside of the specified scope.
|
111
122
|
*/
|
112
123
|
function isUsedFromOutsideOf(scopeNode) {
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
};
|
124
|
+
/**
|
125
|
+
* Checks whether a given reference is inside of the specified scope or not.
|
126
|
+
* @param {eslint-scope.Reference} reference A reference to check.
|
127
|
+
* @returns {boolean} `true` if the reference is inside of the specified
|
128
|
+
* scope.
|
129
|
+
*/
|
130
|
+
function isOutsideOfScope(reference) {
|
131
|
+
const scope = scopeNode.range;
|
132
|
+
const id = reference.identifier.range;
|
133
|
+
|
134
|
+
return id[0] < scope[0] || id[1] > scope[1];
|
135
|
+
}
|
136
|
+
|
137
|
+
return function (variable) {
|
138
|
+
return variable.references.some(isOutsideOfScope);
|
139
|
+
};
|
130
140
|
}
|
131
141
|
|
132
142
|
/**
|
@@ -142,27 +152,33 @@ function isUsedFromOutsideOf(scopeNode) {
|
|
142
152
|
* @private
|
143
153
|
*/
|
144
154
|
function hasReferenceInTDZ(node) {
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
155
|
+
const initStart = node.range[0];
|
156
|
+
const initEnd = node.range[1];
|
157
|
+
|
158
|
+
return variable => {
|
159
|
+
const id = variable.defs[0].name;
|
160
|
+
const idStart = id.range[0];
|
161
|
+
const defaultValue =
|
162
|
+
id.parent.type === "AssignmentPattern" ? id.parent.right : null;
|
163
|
+
const defaultStart = defaultValue && defaultValue.range[0];
|
164
|
+
const defaultEnd = defaultValue && defaultValue.range[1];
|
165
|
+
|
166
|
+
return variable.references.some(reference => {
|
167
|
+
const start = reference.identifier.range[0];
|
168
|
+
const end = reference.identifier.range[1];
|
169
|
+
|
170
|
+
return (
|
171
|
+
!reference.init &&
|
172
|
+
(start < idStart ||
|
173
|
+
(defaultValue !== null &&
|
174
|
+
start >= defaultStart &&
|
175
|
+
end <= defaultEnd) ||
|
176
|
+
(!astUtils.isFunction(node) &&
|
177
|
+
start >= initStart &&
|
178
|
+
end <= initEnd))
|
179
|
+
);
|
180
|
+
});
|
181
|
+
};
|
166
182
|
}
|
167
183
|
|
168
184
|
/**
|
@@ -172,7 +188,7 @@ function hasReferenceInTDZ(node) {
|
|
172
188
|
* @returns {boolean} `true` if the variable has a disallowed name.
|
173
189
|
*/
|
174
190
|
function hasNameDisallowedForLetDeclarations(variable) {
|
175
|
-
|
191
|
+
return variable.name === "let";
|
176
192
|
}
|
177
193
|
|
178
194
|
//------------------------------------------------------------------------------
|
@@ -181,154 +197,159 @@ function hasNameDisallowedForLetDeclarations(variable) {
|
|
181
197
|
|
182
198
|
/** @type {import('../shared/types').Rule} */
|
183
199
|
module.exports = {
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
200
|
+
meta: {
|
201
|
+
type: "suggestion",
|
202
|
+
|
203
|
+
docs: {
|
204
|
+
description: "Require `let` or `const` instead of `var`",
|
205
|
+
recommended: false,
|
206
|
+
url: "https://eslint.org/docs/latest/rules/no-var",
|
207
|
+
},
|
208
|
+
|
209
|
+
schema: [],
|
210
|
+
fixable: "code",
|
211
|
+
|
212
|
+
messages: {
|
213
|
+
unexpectedVar: "Unexpected var, use let or const instead.",
|
214
|
+
},
|
215
|
+
},
|
216
|
+
|
217
|
+
create(context) {
|
218
|
+
const sourceCode = context.sourceCode;
|
219
|
+
|
220
|
+
/**
|
221
|
+
* Checks whether the variables which are defined by the given declarator node have their references in TDZ.
|
222
|
+
* @param {ASTNode} declarator The VariableDeclarator node to check.
|
223
|
+
* @returns {boolean} `true` if one of the variables which are defined by the given declarator node have their references in TDZ.
|
224
|
+
*/
|
225
|
+
function hasSelfReferenceInTDZ(declarator) {
|
226
|
+
if (!declarator.init) {
|
227
|
+
return false;
|
228
|
+
}
|
229
|
+
const variables = sourceCode.getDeclaredVariables(declarator);
|
230
|
+
|
231
|
+
return variables.some(hasReferenceInTDZ(declarator.init));
|
232
|
+
}
|
233
|
+
|
234
|
+
/**
|
235
|
+
* Checks whether it can fix a given variable declaration or not.
|
236
|
+
* It cannot fix if the following cases:
|
237
|
+
*
|
238
|
+
* - A variable is a global variable.
|
239
|
+
* - A variable is declared on a SwitchCase node.
|
240
|
+
* - A variable is redeclared.
|
241
|
+
* - A variable is used from outside the scope.
|
242
|
+
* - A variable is used from a closure within a loop.
|
243
|
+
* - A variable might be used before it is assigned within a loop.
|
244
|
+
* - A variable might be used in TDZ.
|
245
|
+
* - A variable is declared in statement position (e.g. a single-line `IfStatement`)
|
246
|
+
* - A variable has name that is disallowed for `let` declarations.
|
247
|
+
*
|
248
|
+
* ## A variable is declared on a SwitchCase node.
|
249
|
+
*
|
250
|
+
* If this rule modifies 'var' declarations on a SwitchCase node, it
|
251
|
+
* would generate the warnings of 'no-case-declarations' rule. And the
|
252
|
+
* 'eslint:recommended' preset includes 'no-case-declarations' rule, so
|
253
|
+
* this rule doesn't modify those declarations.
|
254
|
+
*
|
255
|
+
* ## A variable is redeclared.
|
256
|
+
*
|
257
|
+
* The language spec disallows redeclarations of `let` declarations.
|
258
|
+
* Those variables would cause syntax errors.
|
259
|
+
*
|
260
|
+
* ## A variable is used from outside the scope.
|
261
|
+
*
|
262
|
+
* The language spec disallows accesses from outside of the scope for
|
263
|
+
* `let` declarations. Those variables would cause reference errors.
|
264
|
+
*
|
265
|
+
* ## A variable is used from a closure within a loop.
|
266
|
+
*
|
267
|
+
* A `var` declaration within a loop shares the same variable instance
|
268
|
+
* across all loop iterations, while a `let` declaration creates a new
|
269
|
+
* instance for each iteration. This means if a variable in a loop is
|
270
|
+
* referenced by any closure, changing it from `var` to `let` would
|
271
|
+
* change the behavior in a way that is generally unsafe.
|
272
|
+
*
|
273
|
+
* ## A variable might be used before it is assigned within a loop.
|
274
|
+
*
|
275
|
+
* Within a loop, a `let` declaration without an initializer will be
|
276
|
+
* initialized to null, while a `var` declaration will retain its value
|
277
|
+
* from the previous iteration, so it is only safe to change `var` to
|
278
|
+
* `let` if we can statically determine that the variable is always
|
279
|
+
* assigned a value before its first access in the loop body. To keep
|
280
|
+
* the implementation simple, we only convert `var` to `let` within
|
281
|
+
* loops when the variable is a loop assignee or the declaration has an
|
282
|
+
* initializer.
|
283
|
+
* @param {ASTNode} node A variable declaration node to check.
|
284
|
+
* @returns {boolean} `true` if it can fix the node.
|
285
|
+
*/
|
286
|
+
function canFix(node) {
|
287
|
+
const variables = sourceCode.getDeclaredVariables(node);
|
288
|
+
const scopeNode = getScopeNode(node);
|
289
|
+
|
290
|
+
if (
|
291
|
+
node.parent.type === "SwitchCase" ||
|
292
|
+
node.declarations.some(hasSelfReferenceInTDZ) ||
|
293
|
+
variables.some(isGlobal) ||
|
294
|
+
variables.some(isRedeclared) ||
|
295
|
+
variables.some(isUsedFromOutsideOf(scopeNode)) ||
|
296
|
+
variables.some(hasNameDisallowedForLetDeclarations)
|
297
|
+
) {
|
298
|
+
return false;
|
299
|
+
}
|
300
|
+
|
301
|
+
if (astUtils.isInLoop(node)) {
|
302
|
+
if (variables.some(isReferencedInClosure)) {
|
303
|
+
return false;
|
304
|
+
}
|
305
|
+
if (!isLoopAssignee(node) && !isDeclarationInitialized(node)) {
|
306
|
+
return false;
|
307
|
+
}
|
308
|
+
}
|
309
|
+
|
310
|
+
if (
|
311
|
+
!isLoopAssignee(node) &&
|
312
|
+
!(
|
313
|
+
node.parent.type === "ForStatement" &&
|
314
|
+
node.parent.init === node
|
315
|
+
) &&
|
316
|
+
!astUtils.STATEMENT_LIST_PARENTS.has(node.parent.type)
|
317
|
+
) {
|
318
|
+
// If the declaration is not in a block, e.g. `if (foo) var bar = 1;`, then it can't be fixed.
|
319
|
+
return false;
|
320
|
+
}
|
321
|
+
|
322
|
+
return true;
|
323
|
+
}
|
324
|
+
|
325
|
+
/**
|
326
|
+
* Reports a given variable declaration node.
|
327
|
+
* @param {ASTNode} node A variable declaration node to report.
|
328
|
+
* @returns {void}
|
329
|
+
*/
|
330
|
+
function report(node) {
|
331
|
+
context.report({
|
332
|
+
node,
|
333
|
+
messageId: "unexpectedVar",
|
334
|
+
|
335
|
+
fix(fixer) {
|
336
|
+
const varToken = sourceCode.getFirstToken(node, {
|
337
|
+
filter: t => t.value === "var",
|
338
|
+
});
|
339
|
+
|
340
|
+
return canFix(node)
|
341
|
+
? fixer.replaceText(varToken, "let")
|
342
|
+
: null;
|
343
|
+
},
|
344
|
+
});
|
345
|
+
}
|
346
|
+
|
347
|
+
return {
|
348
|
+
"VariableDeclaration:exit"(node) {
|
349
|
+
if (node.kind === "var") {
|
350
|
+
report(node);
|
351
|
+
}
|
352
|
+
},
|
353
|
+
};
|
354
|
+
},
|
334
355
|
};
|
package/lib/rules/no-void.js
CHANGED
@@ -10,58 +10,60 @@
|
|
10
10
|
|
11
11
|
/** @type {import('../shared/types').Rule} */
|
12
12
|
module.exports = {
|
13
|
-
|
14
|
-
|
13
|
+
meta: {
|
14
|
+
type: "suggestion",
|
15
15
|
|
16
|
-
|
17
|
-
|
18
|
-
|
16
|
+
defaultOptions: [
|
17
|
+
{
|
18
|
+
allowAsStatement: false,
|
19
|
+
},
|
20
|
+
],
|
19
21
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
22
|
+
docs: {
|
23
|
+
description: "Disallow `void` operators",
|
24
|
+
recommended: false,
|
25
|
+
frozen: true,
|
26
|
+
url: "https://eslint.org/docs/latest/rules/no-void",
|
27
|
+
},
|
26
28
|
|
27
|
-
|
28
|
-
|
29
|
-
|
29
|
+
messages: {
|
30
|
+
noVoid: "Expected 'undefined' and instead saw 'void'.",
|
31
|
+
},
|
30
32
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
33
|
+
schema: [
|
34
|
+
{
|
35
|
+
type: "object",
|
36
|
+
properties: {
|
37
|
+
allowAsStatement: {
|
38
|
+
type: "boolean",
|
39
|
+
},
|
40
|
+
},
|
41
|
+
additionalProperties: false,
|
42
|
+
},
|
43
|
+
],
|
44
|
+
},
|
43
45
|
|
44
|
-
|
45
|
-
|
46
|
+
create(context) {
|
47
|
+
const [{ allowAsStatement }] = context.options;
|
46
48
|
|
47
|
-
|
48
|
-
|
49
|
-
|
49
|
+
//--------------------------------------------------------------------------
|
50
|
+
// Public
|
51
|
+
//--------------------------------------------------------------------------
|
50
52
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
53
|
+
return {
|
54
|
+
'UnaryExpression[operator="void"]'(node) {
|
55
|
+
if (
|
56
|
+
allowAsStatement &&
|
57
|
+
node.parent &&
|
58
|
+
node.parent.type === "ExpressionStatement"
|
59
|
+
) {
|
60
|
+
return;
|
61
|
+
}
|
62
|
+
context.report({
|
63
|
+
node,
|
64
|
+
messageId: "noVoid",
|
65
|
+
});
|
66
|
+
},
|
67
|
+
};
|
68
|
+
},
|
67
69
|
};
|