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,332 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Prefer destructuring from arrays and objects
|
|
3
|
+
* @author Alex LaFroscia
|
|
4
|
+
*/
|
|
5
|
+
"use strict";
|
|
6
|
+
|
|
7
|
+
//------------------------------------------------------------------------------
|
|
8
|
+
// Requirements
|
|
9
|
+
//------------------------------------------------------------------------------
|
|
10
|
+
|
|
11
|
+
const astUtils = require("./utils/ast-utils");
|
|
12
|
+
|
|
13
|
+
//------------------------------------------------------------------------------
|
|
14
|
+
// Helpers
|
|
15
|
+
//------------------------------------------------------------------------------
|
|
16
|
+
|
|
17
|
+
const PRECEDENCE_OF_ASSIGNMENT_EXPR = astUtils.getPrecedence({
|
|
18
|
+
type: "AssignmentExpression",
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
//------------------------------------------------------------------------------
|
|
22
|
+
// Rule Definition
|
|
23
|
+
//------------------------------------------------------------------------------
|
|
24
|
+
|
|
25
|
+
/** @type {import('../types').Rule.RuleModule} */
|
|
26
|
+
module.exports = {
|
|
27
|
+
meta: {
|
|
28
|
+
type: "suggestion",
|
|
29
|
+
|
|
30
|
+
docs: {
|
|
31
|
+
description: "Require destructuring from arrays and/or objects",
|
|
32
|
+
recommended: false,
|
|
33
|
+
frozen: true,
|
|
34
|
+
url: "https://eslint.org/docs/latest/rules/prefer-destructuring",
|
|
35
|
+
},
|
|
36
|
+
|
|
37
|
+
fixable: "code",
|
|
38
|
+
|
|
39
|
+
schema: [
|
|
40
|
+
{
|
|
41
|
+
/*
|
|
42
|
+
* old support {array: Boolean, object: Boolean}
|
|
43
|
+
* new support {VariableDeclarator: {}, AssignmentExpression: {}}
|
|
44
|
+
*/
|
|
45
|
+
oneOf: [
|
|
46
|
+
{
|
|
47
|
+
type: "object",
|
|
48
|
+
properties: {
|
|
49
|
+
VariableDeclarator: {
|
|
50
|
+
type: "object",
|
|
51
|
+
properties: {
|
|
52
|
+
array: {
|
|
53
|
+
type: "boolean",
|
|
54
|
+
},
|
|
55
|
+
object: {
|
|
56
|
+
type: "boolean",
|
|
57
|
+
},
|
|
58
|
+
},
|
|
59
|
+
additionalProperties: false,
|
|
60
|
+
},
|
|
61
|
+
AssignmentExpression: {
|
|
62
|
+
type: "object",
|
|
63
|
+
properties: {
|
|
64
|
+
array: {
|
|
65
|
+
type: "boolean",
|
|
66
|
+
},
|
|
67
|
+
object: {
|
|
68
|
+
type: "boolean",
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
additionalProperties: false,
|
|
72
|
+
},
|
|
73
|
+
},
|
|
74
|
+
additionalProperties: false,
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
type: "object",
|
|
78
|
+
properties: {
|
|
79
|
+
array: {
|
|
80
|
+
type: "boolean",
|
|
81
|
+
},
|
|
82
|
+
object: {
|
|
83
|
+
type: "boolean",
|
|
84
|
+
},
|
|
85
|
+
},
|
|
86
|
+
additionalProperties: false,
|
|
87
|
+
},
|
|
88
|
+
],
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
type: "object",
|
|
92
|
+
properties: {
|
|
93
|
+
enforceForRenamedProperties: {
|
|
94
|
+
type: "boolean",
|
|
95
|
+
},
|
|
96
|
+
},
|
|
97
|
+
additionalProperties: false,
|
|
98
|
+
},
|
|
99
|
+
],
|
|
100
|
+
|
|
101
|
+
messages: {
|
|
102
|
+
preferDestructuring: "Use {{type}} destructuring.",
|
|
103
|
+
},
|
|
104
|
+
},
|
|
105
|
+
create(context) {
|
|
106
|
+
const enabledTypes = context.options[0];
|
|
107
|
+
const enforceForRenamedProperties =
|
|
108
|
+
context.options[1] &&
|
|
109
|
+
context.options[1].enforceForRenamedProperties;
|
|
110
|
+
let normalizedOptions = {
|
|
111
|
+
VariableDeclarator: { array: true, object: true },
|
|
112
|
+
AssignmentExpression: { array: true, object: true },
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
if (enabledTypes) {
|
|
116
|
+
normalizedOptions =
|
|
117
|
+
typeof enabledTypes.array !== "undefined" ||
|
|
118
|
+
typeof enabledTypes.object !== "undefined"
|
|
119
|
+
? {
|
|
120
|
+
VariableDeclarator: enabledTypes,
|
|
121
|
+
AssignmentExpression: enabledTypes,
|
|
122
|
+
}
|
|
123
|
+
: enabledTypes;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
//--------------------------------------------------------------------------
|
|
127
|
+
// Helpers
|
|
128
|
+
//--------------------------------------------------------------------------
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Checks if destructuring type should be checked.
|
|
132
|
+
* @param {string} nodeType "AssignmentExpression" or "VariableDeclarator"
|
|
133
|
+
* @param {string} destructuringType "array" or "object"
|
|
134
|
+
* @returns {boolean} `true` if the destructuring type should be checked for the given node
|
|
135
|
+
*/
|
|
136
|
+
function shouldCheck(nodeType, destructuringType) {
|
|
137
|
+
return (
|
|
138
|
+
normalizedOptions &&
|
|
139
|
+
normalizedOptions[nodeType] &&
|
|
140
|
+
normalizedOptions[nodeType][destructuringType]
|
|
141
|
+
);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Determines if the given node is accessing an array index
|
|
146
|
+
*
|
|
147
|
+
* This is used to differentiate array index access from object property
|
|
148
|
+
* access.
|
|
149
|
+
* @param {ASTNode} node the node to evaluate
|
|
150
|
+
* @returns {boolean} whether or not the node is an integer
|
|
151
|
+
*/
|
|
152
|
+
function isArrayIndexAccess(node) {
|
|
153
|
+
return Number.isInteger(node.property.value);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* Report that the given node should use destructuring
|
|
158
|
+
* @param {ASTNode} reportNode the node to report
|
|
159
|
+
* @param {string} type the type of destructuring that should have been done
|
|
160
|
+
* @param {Function|null} fix the fix function or null to pass to context.report
|
|
161
|
+
* @returns {void}
|
|
162
|
+
*/
|
|
163
|
+
function report(reportNode, type, fix) {
|
|
164
|
+
context.report({
|
|
165
|
+
node: reportNode,
|
|
166
|
+
messageId: "preferDestructuring",
|
|
167
|
+
data: { type },
|
|
168
|
+
fix,
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* Determines if a node should be fixed into object destructuring
|
|
174
|
+
*
|
|
175
|
+
* The fixer only fixes the simplest case of object destructuring,
|
|
176
|
+
* like: `let x = a.x`;
|
|
177
|
+
*
|
|
178
|
+
* Assignment expression is not fixed.
|
|
179
|
+
* Array destructuring is not fixed.
|
|
180
|
+
* Renamed property is not fixed.
|
|
181
|
+
* @param {ASTNode} node the node to evaluate
|
|
182
|
+
* @returns {boolean} whether or not the node should be fixed
|
|
183
|
+
*/
|
|
184
|
+
function shouldFix(node) {
|
|
185
|
+
return (
|
|
186
|
+
node.type === "VariableDeclarator" &&
|
|
187
|
+
node.id.type === "Identifier" &&
|
|
188
|
+
node.init.type === "MemberExpression" &&
|
|
189
|
+
!node.init.computed &&
|
|
190
|
+
node.init.property.type === "Identifier" &&
|
|
191
|
+
node.id.name === node.init.property.name
|
|
192
|
+
);
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* Fix a node into object destructuring.
|
|
197
|
+
* This function only handles the simplest case of object destructuring,
|
|
198
|
+
* see {@link shouldFix}.
|
|
199
|
+
* @param {SourceCodeFixer} fixer the fixer object
|
|
200
|
+
* @param {ASTNode} node the node to be fixed.
|
|
201
|
+
* @returns {Object} a fix for the node
|
|
202
|
+
*/
|
|
203
|
+
function fixIntoObjectDestructuring(fixer, node) {
|
|
204
|
+
const rightNode = node.init;
|
|
205
|
+
const sourceCode = context.sourceCode;
|
|
206
|
+
|
|
207
|
+
// Don't fix if that would remove any comments. Only comments inside `rightNode.object` can be preserved.
|
|
208
|
+
if (
|
|
209
|
+
sourceCode.getCommentsInside(node).length >
|
|
210
|
+
sourceCode.getCommentsInside(rightNode.object).length
|
|
211
|
+
) {
|
|
212
|
+
return null;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
let objectText = sourceCode.getText(rightNode.object);
|
|
216
|
+
|
|
217
|
+
if (
|
|
218
|
+
astUtils.getPrecedence(rightNode.object) <
|
|
219
|
+
PRECEDENCE_OF_ASSIGNMENT_EXPR
|
|
220
|
+
) {
|
|
221
|
+
objectText = `(${objectText})`;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
return fixer.replaceText(
|
|
225
|
+
node,
|
|
226
|
+
`{${rightNode.property.name}} = ${objectText}`,
|
|
227
|
+
);
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* Check that the `prefer-destructuring` rules are followed based on the
|
|
232
|
+
* given left- and right-hand side of the assignment.
|
|
233
|
+
*
|
|
234
|
+
* Pulled out into a separate method so that VariableDeclarators and
|
|
235
|
+
* AssignmentExpressions can share the same verification logic.
|
|
236
|
+
* @param {ASTNode} leftNode the left-hand side of the assignment
|
|
237
|
+
* @param {ASTNode} rightNode the right-hand side of the assignment
|
|
238
|
+
* @param {ASTNode} reportNode the node to report the error on
|
|
239
|
+
* @returns {void}
|
|
240
|
+
*/
|
|
241
|
+
function performCheck(leftNode, rightNode, reportNode) {
|
|
242
|
+
if (
|
|
243
|
+
rightNode.type !== "MemberExpression" ||
|
|
244
|
+
rightNode.object.type === "Super" ||
|
|
245
|
+
rightNode.property.type === "PrivateIdentifier"
|
|
246
|
+
) {
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
if (isArrayIndexAccess(rightNode)) {
|
|
251
|
+
if (shouldCheck(reportNode.type, "array")) {
|
|
252
|
+
report(reportNode, "array", null);
|
|
253
|
+
}
|
|
254
|
+
return;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
const fix = shouldFix(reportNode)
|
|
258
|
+
? fixer => fixIntoObjectDestructuring(fixer, reportNode)
|
|
259
|
+
: null;
|
|
260
|
+
|
|
261
|
+
if (
|
|
262
|
+
shouldCheck(reportNode.type, "object") &&
|
|
263
|
+
enforceForRenamedProperties
|
|
264
|
+
) {
|
|
265
|
+
report(reportNode, "object", fix);
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
if (shouldCheck(reportNode.type, "object")) {
|
|
270
|
+
const property = rightNode.property;
|
|
271
|
+
|
|
272
|
+
if (
|
|
273
|
+
(property.type === "Literal" &&
|
|
274
|
+
leftNode.name === property.value) ||
|
|
275
|
+
(property.type === "Identifier" &&
|
|
276
|
+
leftNode.name === property.name &&
|
|
277
|
+
!rightNode.computed)
|
|
278
|
+
) {
|
|
279
|
+
report(reportNode, "object", fix);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
/**
|
|
285
|
+
* Check if a given variable declarator is coming from an property access
|
|
286
|
+
* that should be using destructuring instead
|
|
287
|
+
* @param {ASTNode} node the variable declarator to check
|
|
288
|
+
* @returns {void}
|
|
289
|
+
*/
|
|
290
|
+
function checkVariableDeclarator(node) {
|
|
291
|
+
// Skip if variable is declared without assignment
|
|
292
|
+
if (!node.init) {
|
|
293
|
+
return;
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
// Variable declarations using explicit resource management cannot use destructuring (parse error)
|
|
297
|
+
if (
|
|
298
|
+
node.parent.kind === "using" ||
|
|
299
|
+
node.parent.kind === "await using"
|
|
300
|
+
) {
|
|
301
|
+
return;
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
// We only care about member expressions past this point
|
|
305
|
+
if (node.init.type !== "MemberExpression") {
|
|
306
|
+
return;
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
performCheck(node.id, node.init, node);
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
/**
|
|
313
|
+
* Run the `prefer-destructuring` check on an AssignmentExpression
|
|
314
|
+
* @param {ASTNode} node the AssignmentExpression node
|
|
315
|
+
* @returns {void}
|
|
316
|
+
*/
|
|
317
|
+
function checkAssignmentExpression(node) {
|
|
318
|
+
if (node.operator === "=") {
|
|
319
|
+
performCheck(node.left, node.right, node);
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
//--------------------------------------------------------------------------
|
|
324
|
+
// Public
|
|
325
|
+
//--------------------------------------------------------------------------
|
|
326
|
+
|
|
327
|
+
return {
|
|
328
|
+
VariableDeclarator: checkVariableDeclarator,
|
|
329
|
+
AssignmentExpression: checkAssignmentExpression,
|
|
330
|
+
};
|
|
331
|
+
},
|
|
332
|
+
};
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Rule to disallow Math.pow in favor of the ** operator
|
|
3
|
+
* @author Milos Djermanovic
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
"use strict";
|
|
7
|
+
|
|
8
|
+
//------------------------------------------------------------------------------
|
|
9
|
+
// Requirements
|
|
10
|
+
//------------------------------------------------------------------------------
|
|
11
|
+
|
|
12
|
+
const astUtils = require("./utils/ast-utils");
|
|
13
|
+
const { CALL, ReferenceTracker } = require("@eslint-community/eslint-utils");
|
|
14
|
+
|
|
15
|
+
//------------------------------------------------------------------------------
|
|
16
|
+
// Helpers
|
|
17
|
+
//------------------------------------------------------------------------------
|
|
18
|
+
|
|
19
|
+
const PRECEDENCE_OF_EXPONENTIATION_EXPR = astUtils.getPrecedence({
|
|
20
|
+
type: "BinaryExpression",
|
|
21
|
+
operator: "**",
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Determines whether the given node needs parens if used as the base in an exponentiation binary expression.
|
|
26
|
+
* @param {ASTNode} base The node to check.
|
|
27
|
+
* @returns {boolean} `true` if the node needs to be parenthesised.
|
|
28
|
+
*/
|
|
29
|
+
function doesBaseNeedParens(base) {
|
|
30
|
+
return (
|
|
31
|
+
// '**' is right-associative, parens are needed when Math.pow(a ** b, c) is converted to (a ** b) ** c
|
|
32
|
+
astUtils.getPrecedence(base) <= PRECEDENCE_OF_EXPONENTIATION_EXPR ||
|
|
33
|
+
// An unary operator cannot be used immediately before an exponentiation expression
|
|
34
|
+
base.type === "AwaitExpression" ||
|
|
35
|
+
base.type === "UnaryExpression"
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Determines whether the given node needs parens if used as the exponent in an exponentiation binary expression.
|
|
41
|
+
* @param {ASTNode} exponent The node to check.
|
|
42
|
+
* @returns {boolean} `true` if the node needs to be parenthesised.
|
|
43
|
+
*/
|
|
44
|
+
function doesExponentNeedParens(exponent) {
|
|
45
|
+
// '**' is right-associative, there is no need for parens when Math.pow(a, b ** c) is converted to a ** b ** c
|
|
46
|
+
return astUtils.getPrecedence(exponent) < PRECEDENCE_OF_EXPONENTIATION_EXPR;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Determines whether an exponentiation binary expression at the place of the given node would need parens.
|
|
51
|
+
* @param {ASTNode} node A node that would be replaced by an exponentiation binary expression.
|
|
52
|
+
* @param {SourceCode} sourceCode A SourceCode object.
|
|
53
|
+
* @returns {boolean} `true` if the expression needs to be parenthesised.
|
|
54
|
+
*/
|
|
55
|
+
function doesExponentiationExpressionNeedParens(node, sourceCode) {
|
|
56
|
+
const parent =
|
|
57
|
+
node.parent.type === "ChainExpression"
|
|
58
|
+
? node.parent.parent
|
|
59
|
+
: node.parent;
|
|
60
|
+
|
|
61
|
+
const parentPrecedence = astUtils.getPrecedence(parent);
|
|
62
|
+
const needsParens =
|
|
63
|
+
parent.type === "ClassDeclaration" ||
|
|
64
|
+
(parent.type.endsWith("Expression") &&
|
|
65
|
+
(parentPrecedence === -1 ||
|
|
66
|
+
parentPrecedence >= PRECEDENCE_OF_EXPONENTIATION_EXPR) &&
|
|
67
|
+
!(
|
|
68
|
+
parent.type === "BinaryExpression" &&
|
|
69
|
+
parent.operator === "**" &&
|
|
70
|
+
parent.right === node
|
|
71
|
+
) &&
|
|
72
|
+
!(
|
|
73
|
+
(parent.type === "CallExpression" ||
|
|
74
|
+
parent.type === "NewExpression") &&
|
|
75
|
+
parent.arguments.includes(node)
|
|
76
|
+
) &&
|
|
77
|
+
!(
|
|
78
|
+
parent.type === "MemberExpression" &&
|
|
79
|
+
parent.computed &&
|
|
80
|
+
parent.property === node
|
|
81
|
+
) &&
|
|
82
|
+
!(parent.type === "ArrayExpression"));
|
|
83
|
+
|
|
84
|
+
return needsParens && !astUtils.isParenthesised(sourceCode, node);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Optionally parenthesizes given text.
|
|
89
|
+
* @param {string} text The text to parenthesize.
|
|
90
|
+
* @param {boolean} shouldParenthesize If `true`, the text will be parenthesised.
|
|
91
|
+
* @returns {string} parenthesised or unchanged text.
|
|
92
|
+
*/
|
|
93
|
+
function parenthesizeIfShould(text, shouldParenthesize) {
|
|
94
|
+
return shouldParenthesize ? `(${text})` : text;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
//------------------------------------------------------------------------------
|
|
98
|
+
// Rule Definition
|
|
99
|
+
//------------------------------------------------------------------------------
|
|
100
|
+
|
|
101
|
+
/** @type {import('../types').Rule.RuleModule} */
|
|
102
|
+
module.exports = {
|
|
103
|
+
meta: {
|
|
104
|
+
type: "suggestion",
|
|
105
|
+
|
|
106
|
+
docs: {
|
|
107
|
+
description:
|
|
108
|
+
"Disallow the use of `Math.pow` in favor of the `**` operator",
|
|
109
|
+
recommended: false,
|
|
110
|
+
frozen: true,
|
|
111
|
+
url: "https://eslint.org/docs/latest/rules/prefer-exponentiation-operator",
|
|
112
|
+
},
|
|
113
|
+
|
|
114
|
+
schema: [],
|
|
115
|
+
fixable: "code",
|
|
116
|
+
|
|
117
|
+
messages: {
|
|
118
|
+
useExponentiation: "Use the '**' operator instead of 'Math.pow'.",
|
|
119
|
+
},
|
|
120
|
+
},
|
|
121
|
+
|
|
122
|
+
create(context) {
|
|
123
|
+
const sourceCode = context.sourceCode;
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Reports the given node.
|
|
127
|
+
* @param {ASTNode} node 'Math.pow()' node to report.
|
|
128
|
+
* @returns {void}
|
|
129
|
+
*/
|
|
130
|
+
function report(node) {
|
|
131
|
+
context.report({
|
|
132
|
+
node,
|
|
133
|
+
messageId: "useExponentiation",
|
|
134
|
+
fix(fixer) {
|
|
135
|
+
if (
|
|
136
|
+
node.arguments.length !== 2 ||
|
|
137
|
+
node.arguments.some(
|
|
138
|
+
arg => arg.type === "SpreadElement",
|
|
139
|
+
) ||
|
|
140
|
+
sourceCode.getCommentsInside(node).length > 0
|
|
141
|
+
) {
|
|
142
|
+
return null;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
const base = node.arguments[0],
|
|
146
|
+
exponent = node.arguments[1],
|
|
147
|
+
baseText = sourceCode.getText(base),
|
|
148
|
+
exponentText = sourceCode.getText(exponent),
|
|
149
|
+
shouldParenthesizeBase = doesBaseNeedParens(base),
|
|
150
|
+
shouldParenthesizeExponent =
|
|
151
|
+
doesExponentNeedParens(exponent),
|
|
152
|
+
shouldParenthesizeAll =
|
|
153
|
+
doesExponentiationExpressionNeedParens(
|
|
154
|
+
node,
|
|
155
|
+
sourceCode,
|
|
156
|
+
);
|
|
157
|
+
|
|
158
|
+
let prefix = "",
|
|
159
|
+
suffix = "";
|
|
160
|
+
|
|
161
|
+
if (!shouldParenthesizeAll) {
|
|
162
|
+
if (!shouldParenthesizeBase) {
|
|
163
|
+
const firstReplacementToken =
|
|
164
|
+
sourceCode.getFirstToken(base),
|
|
165
|
+
tokenBefore = sourceCode.getTokenBefore(node);
|
|
166
|
+
|
|
167
|
+
if (
|
|
168
|
+
tokenBefore &&
|
|
169
|
+
tokenBefore.range[1] === node.range[0] &&
|
|
170
|
+
!astUtils.canTokensBeAdjacent(
|
|
171
|
+
tokenBefore,
|
|
172
|
+
firstReplacementToken,
|
|
173
|
+
)
|
|
174
|
+
) {
|
|
175
|
+
prefix = " "; // a+Math.pow(++b, c) -> a+ ++b**c
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
if (!shouldParenthesizeExponent) {
|
|
179
|
+
const lastReplacementToken =
|
|
180
|
+
sourceCode.getLastToken(exponent),
|
|
181
|
+
tokenAfter = sourceCode.getTokenAfter(node);
|
|
182
|
+
|
|
183
|
+
if (
|
|
184
|
+
tokenAfter &&
|
|
185
|
+
node.range[1] === tokenAfter.range[0] &&
|
|
186
|
+
!astUtils.canTokensBeAdjacent(
|
|
187
|
+
lastReplacementToken,
|
|
188
|
+
tokenAfter,
|
|
189
|
+
)
|
|
190
|
+
) {
|
|
191
|
+
suffix = " "; // Math.pow(a, b)in c -> a**b in c
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
const baseReplacement = parenthesizeIfShould(
|
|
197
|
+
baseText,
|
|
198
|
+
shouldParenthesizeBase,
|
|
199
|
+
),
|
|
200
|
+
exponentReplacement = parenthesizeIfShould(
|
|
201
|
+
exponentText,
|
|
202
|
+
shouldParenthesizeExponent,
|
|
203
|
+
),
|
|
204
|
+
replacement = parenthesizeIfShould(
|
|
205
|
+
`${baseReplacement}**${exponentReplacement}`,
|
|
206
|
+
shouldParenthesizeAll,
|
|
207
|
+
);
|
|
208
|
+
|
|
209
|
+
return fixer.replaceText(
|
|
210
|
+
node,
|
|
211
|
+
`${prefix}${replacement}${suffix}`,
|
|
212
|
+
);
|
|
213
|
+
},
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
return {
|
|
218
|
+
Program(node) {
|
|
219
|
+
const scope = sourceCode.getScope(node);
|
|
220
|
+
const tracker = new ReferenceTracker(scope);
|
|
221
|
+
const trackMap = {
|
|
222
|
+
Math: {
|
|
223
|
+
pow: { [CALL]: true },
|
|
224
|
+
},
|
|
225
|
+
};
|
|
226
|
+
|
|
227
|
+
for (const { node: refNode } of tracker.iterateGlobalReferences(
|
|
228
|
+
trackMap,
|
|
229
|
+
)) {
|
|
230
|
+
report(refNode);
|
|
231
|
+
}
|
|
232
|
+
},
|
|
233
|
+
};
|
|
234
|
+
},
|
|
235
|
+
};
|