bahlint 28.58.6934
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/LICENSE +19 -0
- package/README.md +370 -0
- package/bin/eslint.js +195 -0
- package/conf/ecma-version.js +16 -0
- package/conf/globals.js +169 -0
- package/conf/replacements.json +26 -0
- package/conf/rule-type-list.json +91 -0
- package/lib/api.js +39 -0
- package/lib/cli-engine/formatters/formatters-meta.json +22 -0
- package/lib/cli-engine/formatters/gasoline.js +168 -0
- package/lib/cli-engine/formatters/html.js +359 -0
- package/lib/cli-engine/formatters/json-with-metadata.js +16 -0
- package/lib/cli-engine/formatters/json.js +13 -0
- package/lib/cli-engine/formatters/stylish.js +153 -0
- package/lib/cli-engine/hash.js +35 -0
- package/lib/cli-engine/lint-result-cache.js +220 -0
- package/lib/cli.js +607 -0
- package/lib/config/config-loader.js +683 -0
- package/lib/config/config.js +674 -0
- package/lib/config/default-config.js +78 -0
- package/lib/config/flat-config-array.js +217 -0
- package/lib/config/flat-config-schema.js +598 -0
- package/lib/config-api.js +12 -0
- package/lib/eslint/eslint-helpers.js +1462 -0
- package/lib/eslint/eslint.js +1364 -0
- package/lib/eslint/index.js +7 -0
- package/lib/eslint/worker.js +173 -0
- package/lib/languages/js/index.js +336 -0
- package/lib/languages/js/source-code/index.js +7 -0
- package/lib/languages/js/source-code/source-code.js +1178 -0
- package/lib/languages/js/source-code/token-store/backward-token-comment-cursor.js +61 -0
- package/lib/languages/js/source-code/token-store/backward-token-cursor.js +57 -0
- package/lib/languages/js/source-code/token-store/cursor.js +76 -0
- package/lib/languages/js/source-code/token-store/cursors.js +120 -0
- package/lib/languages/js/source-code/token-store/decorative-cursor.js +38 -0
- package/lib/languages/js/source-code/token-store/filter-cursor.js +42 -0
- package/lib/languages/js/source-code/token-store/forward-token-comment-cursor.js +65 -0
- package/lib/languages/js/source-code/token-store/forward-token-cursor.js +62 -0
- package/lib/languages/js/source-code/token-store/index.js +695 -0
- package/lib/languages/js/source-code/token-store/limit-cursor.js +39 -0
- package/lib/languages/js/source-code/token-store/padded-token-cursor.js +45 -0
- package/lib/languages/js/source-code/token-store/skip-cursor.js +41 -0
- package/lib/languages/js/source-code/token-store/utils.js +131 -0
- package/lib/languages/js/validate-language-options.js +196 -0
- package/lib/linter/apply-disable-directives.js +583 -0
- package/lib/linter/code-path-analysis/code-path-analyzer.js +828 -0
- package/lib/linter/code-path-analysis/code-path-segment.js +262 -0
- package/lib/linter/code-path-analysis/code-path-state.js +2370 -0
- package/lib/linter/code-path-analysis/code-path.js +332 -0
- package/lib/linter/code-path-analysis/debug-helpers.js +223 -0
- package/lib/linter/code-path-analysis/fork-context.js +374 -0
- package/lib/linter/code-path-analysis/id-generator.js +44 -0
- package/lib/linter/esquery.js +332 -0
- package/lib/linter/file-context.js +88 -0
- package/lib/linter/file-report.js +604 -0
- package/lib/linter/index.js +11 -0
- package/lib/linter/interpolate.js +50 -0
- package/lib/linter/linter.js +1614 -0
- package/lib/linter/rule-fixer.js +199 -0
- package/lib/linter/source-code-fixer.js +154 -0
- package/lib/linter/source-code-traverser.js +333 -0
- package/lib/linter/source-code-visitor.js +81 -0
- package/lib/linter/timing.js +209 -0
- package/lib/linter/vfile.js +115 -0
- package/lib/options.js +416 -0
- package/lib/rule-tester/index.js +7 -0
- package/lib/rule-tester/rule-tester.js +1817 -0
- package/lib/rules/accessor-pairs.js +420 -0
- package/lib/rules/array-bracket-newline.js +291 -0
- package/lib/rules/array-bracket-spacing.js +301 -0
- package/lib/rules/array-callback-return.js +493 -0
- package/lib/rules/array-element-newline.js +374 -0
- package/lib/rules/arrow-body-style.js +418 -0
- package/lib/rules/arrow-parens.js +237 -0
- package/lib/rules/arrow-spacing.js +188 -0
- package/lib/rules/block-scoped-var.js +137 -0
- package/lib/rules/block-spacing.js +202 -0
- package/lib/rules/brace-style.js +278 -0
- package/lib/rules/callback-return.js +216 -0
- package/lib/rules/camelcase.js +422 -0
- package/lib/rules/capitalized-comments.js +325 -0
- package/lib/rules/class-methods-use-this.js +250 -0
- package/lib/rules/comma-dangle.js +424 -0
- package/lib/rules/comma-spacing.js +205 -0
- package/lib/rules/comma-style.js +391 -0
- package/lib/rules/complexity.js +201 -0
- package/lib/rules/computed-property-spacing.js +251 -0
- package/lib/rules/consistent-return.js +221 -0
- package/lib/rules/consistent-this.js +179 -0
- package/lib/rules/constructor-super.js +453 -0
- package/lib/rules/curly.js +425 -0
- package/lib/rules/default-case-last.js +51 -0
- package/lib/rules/default-case.js +103 -0
- package/lib/rules/default-param-last.js +78 -0
- package/lib/rules/dot-location.js +138 -0
- package/lib/rules/dot-notation.js +216 -0
- package/lib/rules/eol-last.js +135 -0
- package/lib/rules/eqeqeq.js +210 -0
- package/lib/rules/for-direction.js +168 -0
- package/lib/rules/func-call-spacing.js +281 -0
- package/lib/rules/func-name-matching.js +338 -0
- package/lib/rules/func-names.js +194 -0
- package/lib/rules/func-style.js +221 -0
- package/lib/rules/function-call-argument-newline.js +166 -0
- package/lib/rules/function-paren-newline.js +368 -0
- package/lib/rules/generator-star-spacing.js +246 -0
- package/lib/rules/getter-return.js +242 -0
- package/lib/rules/global-require.js +117 -0
- package/lib/rules/grouped-accessor-pairs.js +268 -0
- package/lib/rules/guard-for-in.js +85 -0
- package/lib/rules/handle-callback-err.js +122 -0
- package/lib/rules/id-blacklist.js +241 -0
- package/lib/rules/id-denylist.js +223 -0
- package/lib/rules/id-length.js +217 -0
- package/lib/rules/id-match.js +363 -0
- package/lib/rules/implicit-arrow-linebreak.js +125 -0
- package/lib/rules/indent-legacy.js +1369 -0
- package/lib/rules/indent.js +2334 -0
- package/lib/rules/index.js +332 -0
- package/lib/rules/init-declarations.js +172 -0
- package/lib/rules/jsx-quotes.js +128 -0
- package/lib/rules/key-spacing.js +822 -0
- package/lib/rules/keyword-spacing.js +701 -0
- package/lib/rules/line-comment-position.js +157 -0
- package/lib/rules/linebreak-style.js +135 -0
- package/lib/rules/lines-around-comment.js +581 -0
- package/lib/rules/lines-around-directive.js +249 -0
- package/lib/rules/lines-between-class-members.js +358 -0
- package/lib/rules/logical-assignment-operators.js +688 -0
- package/lib/rules/max-classes-per-file.js +90 -0
- package/lib/rules/max-depth.js +159 -0
- package/lib/rules/max-len.js +497 -0
- package/lib/rules/max-lines-per-function.js +238 -0
- package/lib/rules/max-lines.js +189 -0
- package/lib/rules/max-nested-callbacks.js +115 -0
- package/lib/rules/max-params.js +148 -0
- package/lib/rules/max-statements-per-line.js +224 -0
- package/lib/rules/max-statements.js +188 -0
- package/lib/rules/multiline-comment-style.js +652 -0
- package/lib/rules/multiline-ternary.js +257 -0
- package/lib/rules/new-cap.js +277 -0
- package/lib/rules/new-parens.js +120 -0
- package/lib/rules/newline-after-var.js +307 -0
- package/lib/rules/newline-before-return.js +242 -0
- package/lib/rules/newline-per-chained-call.js +159 -0
- package/lib/rules/no-alert.js +149 -0
- package/lib/rules/no-array-constructor.js +195 -0
- package/lib/rules/no-async-promise-executor.js +45 -0
- package/lib/rules/no-await-in-loop.js +115 -0
- package/lib/rules/no-bitwise.js +145 -0
- package/lib/rules/no-buffer-constructor.js +74 -0
- package/lib/rules/no-caller.js +52 -0
- package/lib/rules/no-case-declarations.js +80 -0
- package/lib/rules/no-catch-shadow.js +96 -0
- package/lib/rules/no-class-assign.js +66 -0
- package/lib/rules/no-compare-neg-zero.js +74 -0
- package/lib/rules/no-cond-assign.js +175 -0
- package/lib/rules/no-confusing-arrow.js +127 -0
- package/lib/rules/no-console.js +221 -0
- package/lib/rules/no-const-assign.js +73 -0
- package/lib/rules/no-constant-binary-expression.js +603 -0
- package/lib/rules/no-constant-condition.js +177 -0
- package/lib/rules/no-constructor-return.js +62 -0
- package/lib/rules/no-continue.js +38 -0
- package/lib/rules/no-control-regex.js +142 -0
- package/lib/rules/no-debugger.js +41 -0
- package/lib/rules/no-delete-var.js +42 -0
- package/lib/rules/no-div-regex.js +60 -0
- package/lib/rules/no-dupe-args.js +92 -0
- package/lib/rules/no-dupe-class-members.js +117 -0
- package/lib/rules/no-dupe-else-if.js +145 -0
- package/lib/rules/no-dupe-keys.js +165 -0
- package/lib/rules/no-duplicate-case.js +78 -0
- package/lib/rules/no-duplicate-imports.js +368 -0
- package/lib/rules/no-else-return.js +450 -0
- package/lib/rules/no-empty-character-class.js +83 -0
- package/lib/rules/no-empty-function.js +236 -0
- package/lib/rules/no-empty-pattern.js +85 -0
- package/lib/rules/no-empty-static-block.js +73 -0
- package/lib/rules/no-empty.js +153 -0
- package/lib/rules/no-eq-null.js +51 -0
- package/lib/rules/no-eval.js +295 -0
- package/lib/rules/no-ex-assign.js +57 -0
- package/lib/rules/no-extend-native.js +180 -0
- package/lib/rules/no-extra-bind.js +224 -0
- package/lib/rules/no-extra-boolean-cast.js +420 -0
- package/lib/rules/no-extra-label.js +169 -0
- package/lib/rules/no-extra-parens.js +1669 -0
- package/lib/rules/no-extra-semi.js +167 -0
- package/lib/rules/no-fallthrough.js +260 -0
- package/lib/rules/no-floating-decimal.js +99 -0
- package/lib/rules/no-func-assign.js +77 -0
- package/lib/rules/no-global-assign.js +101 -0
- package/lib/rules/no-implicit-coercion.js +468 -0
- package/lib/rules/no-implicit-globals.js +187 -0
- package/lib/rules/no-implied-eval.js +170 -0
- package/lib/rules/no-import-assign.js +227 -0
- package/lib/rules/no-inline-comments.js +115 -0
- package/lib/rules/no-inner-declarations.js +147 -0
- package/lib/rules/no-invalid-regexp.js +244 -0
- package/lib/rules/no-invalid-this.js +178 -0
- package/lib/rules/no-irregular-whitespace.js +292 -0
- package/lib/rules/no-iterator.js +48 -0
- package/lib/rules/no-label-var.js +78 -0
- package/lib/rules/no-labels.js +156 -0
- package/lib/rules/no-lone-blocks.js +140 -0
- package/lib/rules/no-lonely-if.js +126 -0
- package/lib/rules/no-loop-func.js +267 -0
- package/lib/rules/no-loss-of-precision.js +249 -0
- package/lib/rules/no-magic-numbers.js +365 -0
- package/lib/rules/no-misleading-character-class.js +595 -0
- package/lib/rules/no-mixed-operators.js +253 -0
- package/lib/rules/no-mixed-requires.js +267 -0
- package/lib/rules/no-mixed-spaces-and-tabs.js +148 -0
- package/lib/rules/no-multi-assign.js +66 -0
- package/lib/rules/no-multi-spaces.js +179 -0
- package/lib/rules/no-multi-str.js +67 -0
- package/lib/rules/no-multiple-empty-lines.js +210 -0
- package/lib/rules/no-native-reassign.js +114 -0
- package/lib/rules/no-negated-condition.js +100 -0
- package/lib/rules/no-negated-in-lhs.js +59 -0
- package/lib/rules/no-nested-ternary.js +46 -0
- package/lib/rules/no-new-func.js +96 -0
- package/lib/rules/no-new-native-nonconstructor.js +70 -0
- package/lib/rules/no-new-object.js +76 -0
- package/lib/rules/no-new-require.js +67 -0
- package/lib/rules/no-new-symbol.js +74 -0
- package/lib/rules/no-new-wrappers.js +62 -0
- package/lib/rules/no-new.js +42 -0
- package/lib/rules/no-nonoctal-decimal-escape.js +176 -0
- package/lib/rules/no-obj-calls.js +99 -0
- package/lib/rules/no-object-constructor.js +124 -0
- package/lib/rules/no-octal-escape.js +53 -0
- package/lib/rules/no-octal.js +42 -0
- package/lib/rules/no-param-reassign.js +248 -0
- package/lib/rules/no-path-concat.js +79 -0
- package/lib/rules/no-plusplus.js +102 -0
- package/lib/rules/no-process-env.js +68 -0
- package/lib/rules/no-process-exit.js +67 -0
- package/lib/rules/no-promise-executor-return.js +264 -0
- package/lib/rules/no-proto.js +45 -0
- package/lib/rules/no-prototype-builtins.js +181 -0
- package/lib/rules/no-redeclare.js +173 -0
- package/lib/rules/no-regex-spaces.js +219 -0
- package/lib/rules/no-restricted-exports.js +227 -0
- package/lib/rules/no-restricted-globals.js +266 -0
- package/lib/rules/no-restricted-imports.js +892 -0
- package/lib/rules/no-restricted-modules.js +249 -0
- package/lib/rules/no-restricted-properties.js +233 -0
- package/lib/rules/no-restricted-syntax.js +74 -0
- package/lib/rules/no-return-assign.js +87 -0
- package/lib/rules/no-return-await.js +162 -0
- package/lib/rules/no-script-url.js +68 -0
- package/lib/rules/no-self-assign.js +186 -0
- package/lib/rules/no-self-compare.js +77 -0
- package/lib/rules/no-sequences.js +158 -0
- package/lib/rules/no-setter-return.js +224 -0
- package/lib/rules/no-shadow-restricted-names.js +113 -0
- package/lib/rules/no-shadow.js +624 -0
- package/lib/rules/no-spaced-func.js +105 -0
- package/lib/rules/no-sparse-arrays.js +68 -0
- package/lib/rules/no-sync.js +81 -0
- package/lib/rules/no-tabs.js +110 -0
- package/lib/rules/no-template-curly-in-string.js +45 -0
- package/lib/rules/no-ternary.js +38 -0
- package/lib/rules/no-this-before-super.js +365 -0
- package/lib/rules/no-throw-literal.js +46 -0
- package/lib/rules/no-trailing-spaces.js +227 -0
- package/lib/rules/no-unassigned-vars.js +80 -0
- package/lib/rules/no-undef-init.js +101 -0
- package/lib/rules/no-undef.js +84 -0
- package/lib/rules/no-undefined.js +85 -0
- package/lib/rules/no-underscore-dangle.js +383 -0
- package/lib/rules/no-unexpected-multiline.js +130 -0
- package/lib/rules/no-unmodified-loop-condition.js +360 -0
- package/lib/rules/no-unneeded-ternary.js +232 -0
- package/lib/rules/no-unreachable-loop.js +190 -0
- package/lib/rules/no-unreachable.js +300 -0
- package/lib/rules/no-unsafe-finally.js +119 -0
- package/lib/rules/no-unsafe-negation.js +152 -0
- package/lib/rules/no-unsafe-optional-chaining.js +221 -0
- package/lib/rules/no-unused-expressions.js +227 -0
- package/lib/rules/no-unused-labels.js +158 -0
- package/lib/rules/no-unused-private-class-members.js +219 -0
- package/lib/rules/no-unused-vars.js +1739 -0
- package/lib/rules/no-use-before-define.js +446 -0
- package/lib/rules/no-useless-assignment.js +657 -0
- package/lib/rules/no-useless-backreference.js +263 -0
- package/lib/rules/no-useless-call.js +95 -0
- package/lib/rules/no-useless-catch.js +57 -0
- package/lib/rules/no-useless-computed-key.js +204 -0
- package/lib/rules/no-useless-concat.js +121 -0
- package/lib/rules/no-useless-constructor.js +262 -0
- package/lib/rules/no-useless-escape.js +406 -0
- package/lib/rules/no-useless-rename.js +202 -0
- package/lib/rules/no-useless-return.js +401 -0
- package/lib/rules/no-var.js +367 -0
- package/lib/rules/no-void.js +69 -0
- package/lib/rules/no-warning-comments.js +209 -0
- package/lib/rules/no-whitespace-before-property.js +150 -0
- package/lib/rules/no-with.js +37 -0
- package/lib/rules/nonblock-statement-body-position.js +164 -0
- package/lib/rules/object-curly-newline.js +383 -0
- package/lib/rules/object-curly-spacing.js +369 -0
- package/lib/rules/object-property-newline.js +151 -0
- package/lib/rules/object-shorthand.js +652 -0
- package/lib/rules/one-var-declaration-per-line.js +117 -0
- package/lib/rules/one-var.js +717 -0
- package/lib/rules/operator-assignment.js +270 -0
- package/lib/rules/operator-linebreak.js +315 -0
- package/lib/rules/padded-blocks.js +366 -0
- package/lib/rules/padding-line-between-statements.js +612 -0
- package/lib/rules/prefer-arrow-callback.js +437 -0
- package/lib/rules/prefer-const.js +546 -0
- package/lib/rules/prefer-destructuring.js +332 -0
- package/lib/rules/prefer-exponentiation-operator.js +235 -0
- package/lib/rules/prefer-named-capture-group.js +197 -0
- package/lib/rules/prefer-numeric-literals.js +157 -0
- package/lib/rules/prefer-object-has-own.js +148 -0
- package/lib/rules/prefer-object-spread.js +319 -0
- package/lib/rules/prefer-promise-reject-errors.js +154 -0
- package/lib/rules/prefer-reflect.js +150 -0
- package/lib/rules/prefer-regex-literals.js +605 -0
- package/lib/rules/prefer-rest-params.js +117 -0
- package/lib/rules/prefer-spread.js +91 -0
- package/lib/rules/prefer-template.js +347 -0
- package/lib/rules/preserve-caught-error.js +535 -0
- package/lib/rules/quote-props.js +394 -0
- package/lib/rules/quotes.js +416 -0
- package/lib/rules/radix.js +193 -0
- package/lib/rules/require-atomic-updates.js +365 -0
- package/lib/rules/require-await.js +184 -0
- package/lib/rules/require-unicode-regexp.js +317 -0
- package/lib/rules/require-yield.js +86 -0
- package/lib/rules/rest-spread-spacing.js +150 -0
- package/lib/rules/semi-spacing.js +297 -0
- package/lib/rules/semi-style.js +218 -0
- package/lib/rules/semi.js +476 -0
- package/lib/rules/sort-imports.js +319 -0
- package/lib/rules/sort-keys.js +268 -0
- package/lib/rules/sort-vars.js +140 -0
- package/lib/rules/space-before-blocks.js +232 -0
- package/lib/rules/space-before-function-paren.js +202 -0
- package/lib/rules/space-in-parens.js +374 -0
- package/lib/rules/space-infix-ops.js +249 -0
- package/lib/rules/space-unary-ops.js +400 -0
- package/lib/rules/spaced-comment.js +447 -0
- package/lib/rules/strict.js +314 -0
- package/lib/rules/switch-colon-spacing.js +158 -0
- package/lib/rules/symbol-description.js +70 -0
- package/lib/rules/template-curly-spacing.js +168 -0
- package/lib/rules/template-tag-spacing.js +121 -0
- package/lib/rules/unicode-bom.js +73 -0
- package/lib/rules/use-isnan.js +268 -0
- package/lib/rules/utils/ast-utils.js +2828 -0
- package/lib/rules/utils/char-source.js +247 -0
- package/lib/rules/utils/fix-tracker.js +125 -0
- package/lib/rules/utils/keywords.js +67 -0
- package/lib/rules/utils/lazy-loading-rule-map.js +118 -0
- package/lib/rules/utils/regular-expressions.js +58 -0
- package/lib/rules/utils/unicode/index.js +16 -0
- package/lib/rules/utils/unicode/is-combining-character.js +13 -0
- package/lib/rules/utils/unicode/is-emoji-modifier.js +13 -0
- package/lib/rules/utils/unicode/is-regional-indicator-symbol.js +13 -0
- package/lib/rules/utils/unicode/is-surrogate-pair.js +14 -0
- package/lib/rules/valid-typeof.js +171 -0
- package/lib/rules/vars-on-top.js +165 -0
- package/lib/rules/wrap-iife.js +238 -0
- package/lib/rules/wrap-regex.js +91 -0
- package/lib/rules/yield-star-spacing.js +158 -0
- package/lib/rules/yoda.js +362 -0
- package/lib/services/parser-service.js +64 -0
- package/lib/services/processor-service.js +100 -0
- package/lib/services/suppressions-service.js +302 -0
- package/lib/services/warning-service.js +87 -0
- package/lib/shared/ajv.js +34 -0
- package/lib/shared/assert.js +21 -0
- package/lib/shared/ast-utils.js +30 -0
- package/lib/shared/deep-merge-arrays.js +62 -0
- package/lib/shared/directives.js +16 -0
- package/lib/shared/flags.js +89 -0
- package/lib/shared/logging.js +38 -0
- package/lib/shared/naming.js +109 -0
- package/lib/shared/option-utils.js +63 -0
- package/lib/shared/relative-module-resolver.js +28 -0
- package/lib/shared/runtime-info.js +177 -0
- package/lib/shared/serialization.js +78 -0
- package/lib/shared/severity.js +49 -0
- package/lib/shared/stats.js +30 -0
- package/lib/shared/string-utils.js +58 -0
- package/lib/shared/text-table.js +68 -0
- package/lib/shared/translate-cli-options.js +223 -0
- package/lib/shared/traverser.js +202 -0
- package/lib/types/config-api.d.ts +12 -0
- package/lib/types/index.d.ts +1482 -0
- package/lib/types/rules.d.ts +5603 -0
- package/lib/types/universal.d.ts +6 -0
- package/lib/types/use-at-your-own-risk.d.ts +34 -0
- package/lib/universal.js +10 -0
- package/lib/unsupported-api.js +26 -0
- package/messages/all-files-ignored.js +16 -0
- package/messages/all-matched-files-ignored.js +21 -0
- package/messages/config-file-missing.js +16 -0
- package/messages/config-plugin-missing.js +14 -0
- package/messages/config-serialize-function.js +30 -0
- package/messages/eslintrc-incompat.js +117 -0
- package/messages/eslintrc-plugins.js +27 -0
- package/messages/extend-config-missing.js +13 -0
- package/messages/failed-to-read-json.js +11 -0
- package/messages/file-not-found.js +10 -0
- package/messages/invalid-rule-options.js +17 -0
- package/messages/invalid-rule-severity.js +13 -0
- package/messages/no-config-found.js +15 -0
- package/messages/plugin-conflict.js +22 -0
- package/messages/plugin-invalid.js +16 -0
- package/messages/plugin-missing.js +19 -0
- package/messages/print-config-with-directory-path.js +8 -0
- package/messages/shared.js +23 -0
- package/messages/whitespace-found.js +11 -0
- package/package.json +220 -0
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Rule to disallow returning values from Promise executor functions
|
|
3
|
+
* @author Milos Djermanovic
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
"use strict";
|
|
7
|
+
|
|
8
|
+
//------------------------------------------------------------------------------
|
|
9
|
+
// Requirements
|
|
10
|
+
//------------------------------------------------------------------------------
|
|
11
|
+
|
|
12
|
+
const astUtils = require("./utils/ast-utils");
|
|
13
|
+
|
|
14
|
+
//------------------------------------------------------------------------------
|
|
15
|
+
// Helpers
|
|
16
|
+
//------------------------------------------------------------------------------
|
|
17
|
+
|
|
18
|
+
const functionTypesToCheck = new Set([
|
|
19
|
+
"ArrowFunctionExpression",
|
|
20
|
+
"FunctionExpression",
|
|
21
|
+
]);
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Determines whether the given function node is used as a Promise executor.
|
|
25
|
+
* @param {ASTNode} node The node to check.
|
|
26
|
+
* @param {SourceCode} sourceCode Source code to which the node belongs.
|
|
27
|
+
* @returns {boolean} `true` if the node is a Promise executor.
|
|
28
|
+
*/
|
|
29
|
+
function isPromiseExecutor(node, sourceCode) {
|
|
30
|
+
const parent = node.parent;
|
|
31
|
+
|
|
32
|
+
return (
|
|
33
|
+
parent.type === "NewExpression" &&
|
|
34
|
+
parent.arguments[0] === node &&
|
|
35
|
+
parent.callee.type === "Identifier" &&
|
|
36
|
+
parent.callee.name === "Promise" &&
|
|
37
|
+
sourceCode.isGlobalReference(parent.callee)
|
|
38
|
+
);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Checks if the given node is a void expression.
|
|
43
|
+
* @param {ASTNode} node The node to check.
|
|
44
|
+
* @returns {boolean} - `true` if the node is a void expression
|
|
45
|
+
*/
|
|
46
|
+
function expressionIsVoid(node) {
|
|
47
|
+
return node.type === "UnaryExpression" && node.operator === "void";
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Fixes the linting error by prepending "void " to the given node
|
|
52
|
+
* @param {Object} sourceCode context given by context.sourceCode
|
|
53
|
+
* @param {ASTNode} node The node to fix.
|
|
54
|
+
* @param {Object} fixer The fixer object provided by ESLint.
|
|
55
|
+
* @returns {Array<Object>} - An array of fix objects to apply to the node.
|
|
56
|
+
*/
|
|
57
|
+
function voidPrependFixer(sourceCode, node, fixer) {
|
|
58
|
+
const requiresParens =
|
|
59
|
+
// prepending `void ` will fail if the node has a lower precedence than void
|
|
60
|
+
astUtils.getPrecedence(node) <
|
|
61
|
+
astUtils.getPrecedence({
|
|
62
|
+
type: "UnaryExpression",
|
|
63
|
+
operator: "void",
|
|
64
|
+
}) &&
|
|
65
|
+
// check if there are parentheses around the node to avoid redundant parentheses
|
|
66
|
+
!astUtils.isParenthesised(sourceCode, node);
|
|
67
|
+
|
|
68
|
+
// avoid parentheses issues
|
|
69
|
+
const returnOrArrowToken = sourceCode.getTokenBefore(
|
|
70
|
+
node,
|
|
71
|
+
node.parent.type === "ArrowFunctionExpression"
|
|
72
|
+
? astUtils.isArrowToken
|
|
73
|
+
: // isReturnToken
|
|
74
|
+
token => token.type === "Keyword" && token.value === "return",
|
|
75
|
+
);
|
|
76
|
+
|
|
77
|
+
const firstToken = sourceCode.getTokenAfter(returnOrArrowToken);
|
|
78
|
+
|
|
79
|
+
const prependSpace =
|
|
80
|
+
// is return token, as => allows void to be adjacent
|
|
81
|
+
returnOrArrowToken.value === "return" &&
|
|
82
|
+
// If two tokens (return and "(") are adjacent
|
|
83
|
+
returnOrArrowToken.range[1] === firstToken.range[0];
|
|
84
|
+
|
|
85
|
+
return [
|
|
86
|
+
fixer.insertTextBefore(
|
|
87
|
+
firstToken,
|
|
88
|
+
`${prependSpace ? " " : ""}void ${requiresParens ? "(" : ""}`,
|
|
89
|
+
),
|
|
90
|
+
fixer.insertTextAfter(node, requiresParens ? ")" : ""),
|
|
91
|
+
];
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Fixes the linting error by `wrapping {}` around the given node's body.
|
|
96
|
+
* @param {Object} sourceCode context given by context.sourceCode
|
|
97
|
+
* @param {ASTNode} node The node to fix.
|
|
98
|
+
* @param {Object} fixer The fixer object provided by ESLint.
|
|
99
|
+
* @returns {Array<Object>} - An array of fix objects to apply to the node.
|
|
100
|
+
*/
|
|
101
|
+
function curlyWrapFixer(sourceCode, node, fixer) {
|
|
102
|
+
// https://github.com/eslint/eslint/pull/17282#issuecomment-1592795923
|
|
103
|
+
const arrowToken = sourceCode.getTokenBefore(
|
|
104
|
+
node.body,
|
|
105
|
+
astUtils.isArrowToken,
|
|
106
|
+
);
|
|
107
|
+
const firstToken = sourceCode.getTokenAfter(arrowToken);
|
|
108
|
+
const lastToken = sourceCode.getLastToken(node);
|
|
109
|
+
|
|
110
|
+
return [
|
|
111
|
+
fixer.insertTextBefore(firstToken, "{"),
|
|
112
|
+
fixer.insertTextAfter(lastToken, "}"),
|
|
113
|
+
];
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
//------------------------------------------------------------------------------
|
|
117
|
+
// Rule Definition
|
|
118
|
+
//------------------------------------------------------------------------------
|
|
119
|
+
|
|
120
|
+
/** @type {import('../types').Rule.RuleModule} */
|
|
121
|
+
module.exports = {
|
|
122
|
+
meta: {
|
|
123
|
+
type: "problem",
|
|
124
|
+
|
|
125
|
+
defaultOptions: [
|
|
126
|
+
{
|
|
127
|
+
allowVoid: false,
|
|
128
|
+
},
|
|
129
|
+
],
|
|
130
|
+
|
|
131
|
+
docs: {
|
|
132
|
+
description:
|
|
133
|
+
"Disallow returning values from Promise executor functions",
|
|
134
|
+
recommended: false,
|
|
135
|
+
url: "https://eslint.org/docs/latest/rules/no-promise-executor-return",
|
|
136
|
+
},
|
|
137
|
+
|
|
138
|
+
hasSuggestions: true,
|
|
139
|
+
|
|
140
|
+
schema: [
|
|
141
|
+
{
|
|
142
|
+
type: "object",
|
|
143
|
+
properties: {
|
|
144
|
+
allowVoid: {
|
|
145
|
+
type: "boolean",
|
|
146
|
+
},
|
|
147
|
+
},
|
|
148
|
+
additionalProperties: false,
|
|
149
|
+
},
|
|
150
|
+
],
|
|
151
|
+
|
|
152
|
+
messages: {
|
|
153
|
+
returnsValue:
|
|
154
|
+
"Return values from promise executor functions cannot be read.",
|
|
155
|
+
|
|
156
|
+
// arrow and function suggestions
|
|
157
|
+
prependVoid: "Prepend `void` to the expression.",
|
|
158
|
+
|
|
159
|
+
// only arrow suggestions
|
|
160
|
+
wrapBraces: "Wrap the expression in `{}`.",
|
|
161
|
+
},
|
|
162
|
+
},
|
|
163
|
+
|
|
164
|
+
create(context) {
|
|
165
|
+
let funcInfo = null;
|
|
166
|
+
const sourceCode = context.sourceCode;
|
|
167
|
+
const [{ allowVoid }] = context.options;
|
|
168
|
+
|
|
169
|
+
return {
|
|
170
|
+
onCodePathStart(_, node) {
|
|
171
|
+
funcInfo = {
|
|
172
|
+
upper: funcInfo,
|
|
173
|
+
shouldCheck:
|
|
174
|
+
functionTypesToCheck.has(node.type) &&
|
|
175
|
+
isPromiseExecutor(node, sourceCode),
|
|
176
|
+
};
|
|
177
|
+
|
|
178
|
+
if (
|
|
179
|
+
// Is a Promise executor
|
|
180
|
+
funcInfo.shouldCheck &&
|
|
181
|
+
node.type === "ArrowFunctionExpression" &&
|
|
182
|
+
node.expression &&
|
|
183
|
+
// Except void
|
|
184
|
+
!(allowVoid && expressionIsVoid(node.body))
|
|
185
|
+
) {
|
|
186
|
+
const suggest = [];
|
|
187
|
+
|
|
188
|
+
// prevent useless refactors
|
|
189
|
+
if (allowVoid) {
|
|
190
|
+
suggest.push({
|
|
191
|
+
messageId: "prependVoid",
|
|
192
|
+
fix(fixer) {
|
|
193
|
+
return voidPrependFixer(
|
|
194
|
+
sourceCode,
|
|
195
|
+
node.body,
|
|
196
|
+
fixer,
|
|
197
|
+
);
|
|
198
|
+
},
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
// Do not suggest wrapping an unnamed FunctionExpression in braces as that would be invalid syntax.
|
|
203
|
+
if (
|
|
204
|
+
!(
|
|
205
|
+
node.body.type === "FunctionExpression" &&
|
|
206
|
+
!node.body.id
|
|
207
|
+
)
|
|
208
|
+
) {
|
|
209
|
+
suggest.push({
|
|
210
|
+
messageId: "wrapBraces",
|
|
211
|
+
fix(fixer) {
|
|
212
|
+
return curlyWrapFixer(sourceCode, node, fixer);
|
|
213
|
+
},
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
context.report({
|
|
218
|
+
node: node.body,
|
|
219
|
+
messageId: "returnsValue",
|
|
220
|
+
suggest,
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
},
|
|
224
|
+
|
|
225
|
+
onCodePathEnd() {
|
|
226
|
+
funcInfo = funcInfo.upper;
|
|
227
|
+
},
|
|
228
|
+
|
|
229
|
+
ReturnStatement(node) {
|
|
230
|
+
if (!(funcInfo.shouldCheck && node.argument)) {
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
// node is `return <expression>`
|
|
235
|
+
if (!allowVoid) {
|
|
236
|
+
context.report({ node, messageId: "returnsValue" });
|
|
237
|
+
return;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
if (expressionIsVoid(node.argument)) {
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
// allowVoid && !expressionIsVoid
|
|
245
|
+
context.report({
|
|
246
|
+
node,
|
|
247
|
+
messageId: "returnsValue",
|
|
248
|
+
suggest: [
|
|
249
|
+
{
|
|
250
|
+
messageId: "prependVoid",
|
|
251
|
+
fix(fixer) {
|
|
252
|
+
return voidPrependFixer(
|
|
253
|
+
sourceCode,
|
|
254
|
+
node.argument,
|
|
255
|
+
fixer,
|
|
256
|
+
);
|
|
257
|
+
},
|
|
258
|
+
},
|
|
259
|
+
],
|
|
260
|
+
});
|
|
261
|
+
},
|
|
262
|
+
};
|
|
263
|
+
},
|
|
264
|
+
};
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Rule to flag usage of __proto__ property
|
|
3
|
+
* @author Ilya Volodin
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
"use strict";
|
|
7
|
+
|
|
8
|
+
//------------------------------------------------------------------------------
|
|
9
|
+
// Requirements
|
|
10
|
+
//------------------------------------------------------------------------------
|
|
11
|
+
|
|
12
|
+
const { getStaticPropertyName } = require("./utils/ast-utils");
|
|
13
|
+
|
|
14
|
+
//------------------------------------------------------------------------------
|
|
15
|
+
// Rule Definition
|
|
16
|
+
//------------------------------------------------------------------------------
|
|
17
|
+
|
|
18
|
+
/** @type {import('../types').Rule.RuleModule} */
|
|
19
|
+
module.exports = {
|
|
20
|
+
meta: {
|
|
21
|
+
type: "suggestion",
|
|
22
|
+
|
|
23
|
+
docs: {
|
|
24
|
+
description: "Disallow the use of the `__proto__` property",
|
|
25
|
+
recommended: false,
|
|
26
|
+
url: "https://eslint.org/docs/latest/rules/no-proto",
|
|
27
|
+
},
|
|
28
|
+
|
|
29
|
+
schema: [],
|
|
30
|
+
|
|
31
|
+
messages: {
|
|
32
|
+
unexpectedProto: "The '__proto__' property is deprecated.",
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
|
|
36
|
+
create(context) {
|
|
37
|
+
return {
|
|
38
|
+
MemberExpression(node) {
|
|
39
|
+
if (getStaticPropertyName(node) === "__proto__") {
|
|
40
|
+
context.report({ node, messageId: "unexpectedProto" });
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
},
|
|
45
|
+
};
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Rule to disallow use of Object.prototype builtins on objects
|
|
3
|
+
* @author Andrew Levine
|
|
4
|
+
*/
|
|
5
|
+
"use strict";
|
|
6
|
+
|
|
7
|
+
//------------------------------------------------------------------------------
|
|
8
|
+
// Requirements
|
|
9
|
+
//------------------------------------------------------------------------------
|
|
10
|
+
|
|
11
|
+
const astUtils = require("./utils/ast-utils");
|
|
12
|
+
|
|
13
|
+
//------------------------------------------------------------------------------
|
|
14
|
+
// Helpers
|
|
15
|
+
//------------------------------------------------------------------------------
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Returns true if the node or any of the objects
|
|
19
|
+
* to the left of it in the member/call chain is optional.
|
|
20
|
+
*
|
|
21
|
+
* e.g. `a?.b`, `a?.b.c`, `a?.()`, `a()?.()`
|
|
22
|
+
* @param {ASTNode} node The expression to check
|
|
23
|
+
* @returns {boolean} `true` if there is a short-circuiting optional `?.`
|
|
24
|
+
* in the same option chain to the left of this call or member expression,
|
|
25
|
+
* or the node itself is an optional call or member `?.`.
|
|
26
|
+
*/
|
|
27
|
+
function isAfterOptional(node) {
|
|
28
|
+
let leftNode;
|
|
29
|
+
|
|
30
|
+
if (node.type === "MemberExpression") {
|
|
31
|
+
leftNode = node.object;
|
|
32
|
+
} else if (node.type === "CallExpression") {
|
|
33
|
+
leftNode = node.callee;
|
|
34
|
+
} else {
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
if (node.optional) {
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
return isAfterOptional(leftNode);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
//------------------------------------------------------------------------------
|
|
44
|
+
// Rule Definition
|
|
45
|
+
//------------------------------------------------------------------------------
|
|
46
|
+
|
|
47
|
+
/** @type {import('../types').Rule.RuleModule} */
|
|
48
|
+
module.exports = {
|
|
49
|
+
meta: {
|
|
50
|
+
type: "problem",
|
|
51
|
+
|
|
52
|
+
docs: {
|
|
53
|
+
description:
|
|
54
|
+
"Disallow calling some `Object.prototype` methods directly on objects",
|
|
55
|
+
recommended: true,
|
|
56
|
+
url: "https://eslint.org/docs/latest/rules/no-prototype-builtins",
|
|
57
|
+
},
|
|
58
|
+
|
|
59
|
+
hasSuggestions: true,
|
|
60
|
+
|
|
61
|
+
schema: [],
|
|
62
|
+
|
|
63
|
+
messages: {
|
|
64
|
+
prototypeBuildIn:
|
|
65
|
+
"Do not access Object.prototype method '{{prop}}' from target object.",
|
|
66
|
+
callObjectPrototype: "Call Object.prototype.{{prop}} explicitly.",
|
|
67
|
+
},
|
|
68
|
+
},
|
|
69
|
+
|
|
70
|
+
create(context) {
|
|
71
|
+
const DISALLOWED_PROPS = new Set([
|
|
72
|
+
"hasOwnProperty",
|
|
73
|
+
"isPrototypeOf",
|
|
74
|
+
"propertyIsEnumerable",
|
|
75
|
+
]);
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Reports if a disallowed property is used in a CallExpression
|
|
79
|
+
* @param {ASTNode} node The CallExpression node.
|
|
80
|
+
* @returns {void}
|
|
81
|
+
*/
|
|
82
|
+
function disallowBuiltIns(node) {
|
|
83
|
+
const callee = astUtils.skipChainExpression(node.callee);
|
|
84
|
+
|
|
85
|
+
if (callee.type !== "MemberExpression") {
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
const propName = astUtils.getStaticPropertyName(callee);
|
|
90
|
+
|
|
91
|
+
if (propName !== null && DISALLOWED_PROPS.has(propName)) {
|
|
92
|
+
context.report({
|
|
93
|
+
messageId: "prototypeBuildIn",
|
|
94
|
+
loc: callee.property.loc,
|
|
95
|
+
data: { prop: propName },
|
|
96
|
+
node,
|
|
97
|
+
suggest: [
|
|
98
|
+
{
|
|
99
|
+
messageId: "callObjectPrototype",
|
|
100
|
+
data: { prop: propName },
|
|
101
|
+
fix(fixer) {
|
|
102
|
+
const sourceCode = context.sourceCode;
|
|
103
|
+
|
|
104
|
+
/*
|
|
105
|
+
* A call after an optional chain (e.g. a?.b.hasOwnProperty(c))
|
|
106
|
+
* must be fixed manually because the call can be short-circuited
|
|
107
|
+
*/
|
|
108
|
+
if (isAfterOptional(node)) {
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/*
|
|
113
|
+
* A call on a ChainExpression (e.g. (a?.hasOwnProperty)(c)) will trigger
|
|
114
|
+
* no-unsafe-optional-chaining which should be fixed before this suggestion
|
|
115
|
+
*/
|
|
116
|
+
if (node.callee.type === "ChainExpression") {
|
|
117
|
+
return null;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
const objectVariable =
|
|
121
|
+
astUtils.getVariableByName(
|
|
122
|
+
sourceCode.getScope(node),
|
|
123
|
+
"Object",
|
|
124
|
+
);
|
|
125
|
+
|
|
126
|
+
/*
|
|
127
|
+
* We can't use Object if the global Object was shadowed,
|
|
128
|
+
* or Object does not exist in the global scope for some reason
|
|
129
|
+
*/
|
|
130
|
+
if (
|
|
131
|
+
!objectVariable ||
|
|
132
|
+
objectVariable.scope.type !== "global" ||
|
|
133
|
+
objectVariable.defs.length > 0
|
|
134
|
+
) {
|
|
135
|
+
return null;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
let objectText = sourceCode.getText(
|
|
139
|
+
callee.object,
|
|
140
|
+
);
|
|
141
|
+
|
|
142
|
+
if (
|
|
143
|
+
astUtils.getPrecedence(callee.object) <=
|
|
144
|
+
astUtils.getPrecedence({
|
|
145
|
+
type: "SequenceExpression",
|
|
146
|
+
})
|
|
147
|
+
) {
|
|
148
|
+
objectText = `(${objectText})`;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
const openParenToken = sourceCode.getTokenAfter(
|
|
152
|
+
node.callee,
|
|
153
|
+
astUtils.isOpeningParenToken,
|
|
154
|
+
);
|
|
155
|
+
const isEmptyParameters =
|
|
156
|
+
node.arguments.length === 0;
|
|
157
|
+
const delim = isEmptyParameters ? "" : ", ";
|
|
158
|
+
const fixes = [
|
|
159
|
+
fixer.replaceText(
|
|
160
|
+
callee,
|
|
161
|
+
`Object.prototype.${propName}.call`,
|
|
162
|
+
),
|
|
163
|
+
fixer.insertTextAfter(
|
|
164
|
+
openParenToken,
|
|
165
|
+
objectText + delim,
|
|
166
|
+
),
|
|
167
|
+
];
|
|
168
|
+
|
|
169
|
+
return fixes;
|
|
170
|
+
},
|
|
171
|
+
},
|
|
172
|
+
],
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
return {
|
|
178
|
+
CallExpression: disallowBuiltIns,
|
|
179
|
+
};
|
|
180
|
+
},
|
|
181
|
+
};
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Rule to flag when the same variable is declared more then once.
|
|
3
|
+
* @author Ilya Volodin
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
"use strict";
|
|
7
|
+
|
|
8
|
+
//------------------------------------------------------------------------------
|
|
9
|
+
// Requirements
|
|
10
|
+
//------------------------------------------------------------------------------
|
|
11
|
+
|
|
12
|
+
const astUtils = require("./utils/ast-utils");
|
|
13
|
+
|
|
14
|
+
//------------------------------------------------------------------------------
|
|
15
|
+
// Rule Definition
|
|
16
|
+
//------------------------------------------------------------------------------
|
|
17
|
+
|
|
18
|
+
/** @type {import('../types').Rule.RuleModule} */
|
|
19
|
+
module.exports = {
|
|
20
|
+
meta: {
|
|
21
|
+
type: "suggestion",
|
|
22
|
+
|
|
23
|
+
defaultOptions: [{ builtinGlobals: true }],
|
|
24
|
+
|
|
25
|
+
docs: {
|
|
26
|
+
description: "Disallow variable redeclaration",
|
|
27
|
+
recommended: true,
|
|
28
|
+
url: "https://eslint.org/docs/latest/rules/no-redeclare",
|
|
29
|
+
},
|
|
30
|
+
|
|
31
|
+
messages: {
|
|
32
|
+
redeclared: "'{{id}}' is already defined.",
|
|
33
|
+
redeclaredAsBuiltin:
|
|
34
|
+
"'{{id}}' is already defined as a built-in global variable.",
|
|
35
|
+
redeclaredBySyntax:
|
|
36
|
+
"'{{id}}' is already defined by a variable declaration.",
|
|
37
|
+
},
|
|
38
|
+
|
|
39
|
+
schema: [
|
|
40
|
+
{
|
|
41
|
+
type: "object",
|
|
42
|
+
properties: {
|
|
43
|
+
builtinGlobals: { type: "boolean" },
|
|
44
|
+
},
|
|
45
|
+
additionalProperties: false,
|
|
46
|
+
},
|
|
47
|
+
],
|
|
48
|
+
},
|
|
49
|
+
|
|
50
|
+
create(context) {
|
|
51
|
+
const [{ builtinGlobals }] = context.options;
|
|
52
|
+
const sourceCode = context.sourceCode;
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Iterate declarations of a given variable.
|
|
56
|
+
* @param {escope.variable} variable The variable object to iterate declarations.
|
|
57
|
+
* @returns {IterableIterator<{type:string,node:ASTNode,loc:SourceLocation}>} The declarations.
|
|
58
|
+
*/
|
|
59
|
+
function* iterateDeclarations(variable) {
|
|
60
|
+
if (
|
|
61
|
+
builtinGlobals &&
|
|
62
|
+
(variable.eslintImplicitGlobalSetting === "readonly" ||
|
|
63
|
+
variable.eslintImplicitGlobalSetting === "writable")
|
|
64
|
+
) {
|
|
65
|
+
yield { type: "builtin" };
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
for (const id of variable.identifiers) {
|
|
69
|
+
yield { type: "syntax", node: id, loc: id.loc };
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
if (variable.eslintExplicitGlobalComments) {
|
|
73
|
+
for (const comment of variable.eslintExplicitGlobalComments) {
|
|
74
|
+
yield {
|
|
75
|
+
type: "comment",
|
|
76
|
+
node: comment,
|
|
77
|
+
loc: astUtils.getNameLocationInGlobalDirectiveComment(
|
|
78
|
+
sourceCode,
|
|
79
|
+
comment,
|
|
80
|
+
variable.name,
|
|
81
|
+
),
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Find variables in a given scope and flag redeclared ones.
|
|
89
|
+
* @param {Scope} scope An eslint-scope scope object.
|
|
90
|
+
* @returns {void}
|
|
91
|
+
* @private
|
|
92
|
+
*/
|
|
93
|
+
function findVariablesInScope(scope) {
|
|
94
|
+
for (const variable of scope.variables) {
|
|
95
|
+
const [declaration, ...extraDeclarations] =
|
|
96
|
+
iterateDeclarations(variable);
|
|
97
|
+
|
|
98
|
+
if (extraDeclarations.length === 0) {
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/*
|
|
103
|
+
* If the type of a declaration is different from the type of
|
|
104
|
+
* the first declaration, it shows the location of the first
|
|
105
|
+
* declaration.
|
|
106
|
+
*/
|
|
107
|
+
const detailMessageId =
|
|
108
|
+
declaration.type === "builtin"
|
|
109
|
+
? "redeclaredAsBuiltin"
|
|
110
|
+
: "redeclaredBySyntax";
|
|
111
|
+
const data = { id: variable.name };
|
|
112
|
+
|
|
113
|
+
// Report extra declarations.
|
|
114
|
+
for (const { type, node, loc } of extraDeclarations) {
|
|
115
|
+
const messageId =
|
|
116
|
+
type === declaration.type
|
|
117
|
+
? "redeclared"
|
|
118
|
+
: detailMessageId;
|
|
119
|
+
|
|
120
|
+
context.report({ node, loc, messageId, data });
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Find variables in the current scope.
|
|
127
|
+
* @param {ASTNode} node The node of the current scope.
|
|
128
|
+
* @returns {void}
|
|
129
|
+
* @private
|
|
130
|
+
*/
|
|
131
|
+
function checkForBlock(node) {
|
|
132
|
+
const scope = sourceCode.getScope(node);
|
|
133
|
+
|
|
134
|
+
/*
|
|
135
|
+
* In ES5, some node type such as `BlockStatement` doesn't have that scope.
|
|
136
|
+
* `scope.block` is a different node in such a case.
|
|
137
|
+
*/
|
|
138
|
+
if (scope.block === node) {
|
|
139
|
+
findVariablesInScope(scope);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
return {
|
|
144
|
+
Program(node) {
|
|
145
|
+
const scope = sourceCode.getScope(node);
|
|
146
|
+
|
|
147
|
+
findVariablesInScope(scope);
|
|
148
|
+
|
|
149
|
+
// Node.js or ES modules has a special scope.
|
|
150
|
+
if (
|
|
151
|
+
scope.type === "global" &&
|
|
152
|
+
scope.childScopes[0] &&
|
|
153
|
+
// The special scope's block is the Program node.
|
|
154
|
+
scope.block === scope.childScopes[0].block
|
|
155
|
+
) {
|
|
156
|
+
findVariablesInScope(scope.childScopes[0]);
|
|
157
|
+
}
|
|
158
|
+
},
|
|
159
|
+
|
|
160
|
+
FunctionDeclaration: checkForBlock,
|
|
161
|
+
FunctionExpression: checkForBlock,
|
|
162
|
+
ArrowFunctionExpression: checkForBlock,
|
|
163
|
+
|
|
164
|
+
StaticBlock: checkForBlock,
|
|
165
|
+
|
|
166
|
+
BlockStatement: checkForBlock,
|
|
167
|
+
ForStatement: checkForBlock,
|
|
168
|
+
ForInStatement: checkForBlock,
|
|
169
|
+
ForOfStatement: checkForBlock,
|
|
170
|
+
SwitchStatement: checkForBlock,
|
|
171
|
+
};
|
|
172
|
+
},
|
|
173
|
+
};
|