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,416 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview A rule to choose between single and double quote marks
|
|
3
|
+
* @author Matt DuVall <http://www.mattduvall.com/>, Brandon Payton
|
|
4
|
+
* @deprecated in ESLint v8.53.0
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
"use strict";
|
|
8
|
+
|
|
9
|
+
//------------------------------------------------------------------------------
|
|
10
|
+
// Requirements
|
|
11
|
+
//------------------------------------------------------------------------------
|
|
12
|
+
|
|
13
|
+
const astUtils = require("./utils/ast-utils");
|
|
14
|
+
|
|
15
|
+
//------------------------------------------------------------------------------
|
|
16
|
+
// Constants
|
|
17
|
+
//------------------------------------------------------------------------------
|
|
18
|
+
|
|
19
|
+
const QUOTE_SETTINGS = {
|
|
20
|
+
double: {
|
|
21
|
+
quote: '"',
|
|
22
|
+
alternateQuote: "'",
|
|
23
|
+
description: "doublequote",
|
|
24
|
+
},
|
|
25
|
+
single: {
|
|
26
|
+
quote: "'",
|
|
27
|
+
alternateQuote: '"',
|
|
28
|
+
description: "singlequote",
|
|
29
|
+
},
|
|
30
|
+
backtick: {
|
|
31
|
+
quote: "`",
|
|
32
|
+
alternateQuote: '"',
|
|
33
|
+
description: "backtick",
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
// An unescaped newline is a newline preceded by an even number of backslashes.
|
|
38
|
+
const UNESCAPED_LINEBREAK_PATTERN = new RegExp(
|
|
39
|
+
String.raw`(^|[^\\])(\\\\)*[${Array.from(astUtils.LINEBREAKS).join("")}]`,
|
|
40
|
+
"u",
|
|
41
|
+
);
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Switches quoting of javascript string between ' " and `
|
|
45
|
+
* escaping and unescaping as necessary.
|
|
46
|
+
* Only escaping of the minimal set of characters is changed.
|
|
47
|
+
* Note: escaping of newlines when switching from backtick to other quotes is not handled.
|
|
48
|
+
* @param {string} str A string to convert.
|
|
49
|
+
* @returns {string} The string with changed quotes.
|
|
50
|
+
* @private
|
|
51
|
+
*/
|
|
52
|
+
QUOTE_SETTINGS.double.convert =
|
|
53
|
+
QUOTE_SETTINGS.single.convert =
|
|
54
|
+
QUOTE_SETTINGS.backtick.convert =
|
|
55
|
+
function (str) {
|
|
56
|
+
const newQuote = this.quote;
|
|
57
|
+
const oldQuote = str[0];
|
|
58
|
+
|
|
59
|
+
if (newQuote === oldQuote) {
|
|
60
|
+
return str;
|
|
61
|
+
}
|
|
62
|
+
return (
|
|
63
|
+
newQuote +
|
|
64
|
+
str
|
|
65
|
+
.slice(1, -1)
|
|
66
|
+
.replace(
|
|
67
|
+
/\\(\$\{|\r\n?|\n|.)|["'`]|\$\{|(\r\n?|\n)/gu,
|
|
68
|
+
(match, escaped, newline) => {
|
|
69
|
+
if (
|
|
70
|
+
escaped === oldQuote ||
|
|
71
|
+
(oldQuote === "`" && escaped === "${")
|
|
72
|
+
) {
|
|
73
|
+
return escaped; // unescape
|
|
74
|
+
}
|
|
75
|
+
if (
|
|
76
|
+
match === newQuote ||
|
|
77
|
+
(newQuote === "`" && match === "${")
|
|
78
|
+
) {
|
|
79
|
+
return `\\${match}`; // escape
|
|
80
|
+
}
|
|
81
|
+
if (newline && oldQuote === "`") {
|
|
82
|
+
return "\\n"; // escape newlines
|
|
83
|
+
}
|
|
84
|
+
return match;
|
|
85
|
+
},
|
|
86
|
+
) +
|
|
87
|
+
newQuote
|
|
88
|
+
);
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
const AVOID_ESCAPE = "avoid-escape";
|
|
92
|
+
|
|
93
|
+
//------------------------------------------------------------------------------
|
|
94
|
+
// Rule Definition
|
|
95
|
+
//------------------------------------------------------------------------------
|
|
96
|
+
|
|
97
|
+
/** @type {import('../types').Rule.RuleModule} */
|
|
98
|
+
module.exports = {
|
|
99
|
+
meta: {
|
|
100
|
+
deprecated: {
|
|
101
|
+
message: "Formatting rules are being moved out of ESLint core.",
|
|
102
|
+
url: "https://eslint.org/blog/2023/10/deprecating-formatting-rules/",
|
|
103
|
+
deprecatedSince: "8.53.0",
|
|
104
|
+
availableUntil: "11.0.0",
|
|
105
|
+
replacedBy: [
|
|
106
|
+
{
|
|
107
|
+
message:
|
|
108
|
+
"ESLint Stylistic now maintains deprecated stylistic core rules.",
|
|
109
|
+
url: "https://eslint.style/guide/migration",
|
|
110
|
+
plugin: {
|
|
111
|
+
name: "@stylistic/eslint-plugin",
|
|
112
|
+
url: "https://eslint.style",
|
|
113
|
+
},
|
|
114
|
+
rule: {
|
|
115
|
+
name: "quotes",
|
|
116
|
+
url: "https://eslint.style/rules/quotes",
|
|
117
|
+
},
|
|
118
|
+
},
|
|
119
|
+
],
|
|
120
|
+
},
|
|
121
|
+
type: "layout",
|
|
122
|
+
|
|
123
|
+
docs: {
|
|
124
|
+
description:
|
|
125
|
+
"Enforce the consistent use of either backticks, double, or single quotes",
|
|
126
|
+
recommended: false,
|
|
127
|
+
url: "https://eslint.org/docs/latest/rules/quotes",
|
|
128
|
+
},
|
|
129
|
+
|
|
130
|
+
fixable: "code",
|
|
131
|
+
|
|
132
|
+
schema: [
|
|
133
|
+
{
|
|
134
|
+
enum: ["single", "double", "backtick"],
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
anyOf: [
|
|
138
|
+
{
|
|
139
|
+
enum: ["avoid-escape"],
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
type: "object",
|
|
143
|
+
properties: {
|
|
144
|
+
avoidEscape: {
|
|
145
|
+
type: "boolean",
|
|
146
|
+
},
|
|
147
|
+
allowTemplateLiterals: {
|
|
148
|
+
type: "boolean",
|
|
149
|
+
},
|
|
150
|
+
},
|
|
151
|
+
additionalProperties: false,
|
|
152
|
+
},
|
|
153
|
+
],
|
|
154
|
+
},
|
|
155
|
+
],
|
|
156
|
+
|
|
157
|
+
messages: {
|
|
158
|
+
wrongQuotes: "Strings must use {{description}}.",
|
|
159
|
+
},
|
|
160
|
+
},
|
|
161
|
+
|
|
162
|
+
create(context) {
|
|
163
|
+
const quoteOption = context.options[0],
|
|
164
|
+
settings = QUOTE_SETTINGS[quoteOption || "double"],
|
|
165
|
+
options = context.options[1],
|
|
166
|
+
allowTemplateLiterals =
|
|
167
|
+
options && options.allowTemplateLiterals === true,
|
|
168
|
+
sourceCode = context.sourceCode;
|
|
169
|
+
let avoidEscape = options && options.avoidEscape === true;
|
|
170
|
+
|
|
171
|
+
// deprecated
|
|
172
|
+
if (options === AVOID_ESCAPE) {
|
|
173
|
+
avoidEscape = true;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* Determines if a given node is part of JSX syntax.
|
|
178
|
+
*
|
|
179
|
+
* This function returns `true` in the following cases:
|
|
180
|
+
*
|
|
181
|
+
* - `<div className="foo"></div>` ... If the literal is an attribute value, the parent of the literal is `JSXAttribute`.
|
|
182
|
+
* - `<div>foo</div>` ... If the literal is a text content, the parent of the literal is `JSXElement`.
|
|
183
|
+
* - `<>foo</>` ... If the literal is a text content, the parent of the literal is `JSXFragment`.
|
|
184
|
+
*
|
|
185
|
+
* In particular, this function returns `false` in the following cases:
|
|
186
|
+
*
|
|
187
|
+
* - `<div className={"foo"}></div>`
|
|
188
|
+
* - `<div>{"foo"}</div>`
|
|
189
|
+
*
|
|
190
|
+
* In both cases, inside of the braces is handled as normal JavaScript.
|
|
191
|
+
* The braces are `JSXExpressionContainer` nodes.
|
|
192
|
+
* @param {ASTNode} node The Literal node to check.
|
|
193
|
+
* @returns {boolean} True if the node is a part of JSX, false if not.
|
|
194
|
+
* @private
|
|
195
|
+
*/
|
|
196
|
+
function isJSXLiteral(node) {
|
|
197
|
+
return (
|
|
198
|
+
node.parent.type === "JSXAttribute" ||
|
|
199
|
+
node.parent.type === "JSXElement" ||
|
|
200
|
+
node.parent.type === "JSXFragment"
|
|
201
|
+
);
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* Checks whether or not a given node is a directive.
|
|
206
|
+
* The directive is a `ExpressionStatement` which has only a string literal not surrounded by
|
|
207
|
+
* parentheses.
|
|
208
|
+
* @param {ASTNode} node A node to check.
|
|
209
|
+
* @returns {boolean} Whether or not the node is a directive.
|
|
210
|
+
* @private
|
|
211
|
+
*/
|
|
212
|
+
function isDirective(node) {
|
|
213
|
+
return (
|
|
214
|
+
node.type === "ExpressionStatement" &&
|
|
215
|
+
node.expression.type === "Literal" &&
|
|
216
|
+
typeof node.expression.value === "string" &&
|
|
217
|
+
!astUtils.isParenthesised(sourceCode, node.expression)
|
|
218
|
+
);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/**
|
|
222
|
+
* Checks whether a specified node is either part of, or immediately follows a (possibly empty) directive prologue.
|
|
223
|
+
* @see {@link http://www.ecma-international.org/ecma-262/6.0/#sec-directive-prologues-and-the-use-strict-directive}
|
|
224
|
+
* @param {ASTNode} node A node to check.
|
|
225
|
+
* @returns {boolean} Whether a specified node is either part of, or immediately follows a (possibly empty) directive prologue.
|
|
226
|
+
* @private
|
|
227
|
+
*/
|
|
228
|
+
function isExpressionInOrJustAfterDirectivePrologue(node) {
|
|
229
|
+
if (!astUtils.isTopLevelExpressionStatement(node.parent)) {
|
|
230
|
+
return false;
|
|
231
|
+
}
|
|
232
|
+
const block = node.parent.parent;
|
|
233
|
+
|
|
234
|
+
// Check the node is at a prologue.
|
|
235
|
+
for (let i = 0; i < block.body.length; ++i) {
|
|
236
|
+
const statement = block.body[i];
|
|
237
|
+
|
|
238
|
+
if (statement === node.parent) {
|
|
239
|
+
return true;
|
|
240
|
+
}
|
|
241
|
+
if (!isDirective(statement)) {
|
|
242
|
+
break;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
return false;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
/**
|
|
250
|
+
* Checks whether or not a given node is allowed as non backtick.
|
|
251
|
+
* @param {ASTNode} node A node to check.
|
|
252
|
+
* @returns {boolean} Whether or not the node is allowed as non backtick.
|
|
253
|
+
* @private
|
|
254
|
+
*/
|
|
255
|
+
function isAllowedAsNonBacktick(node) {
|
|
256
|
+
const parent = node.parent;
|
|
257
|
+
|
|
258
|
+
switch (parent.type) {
|
|
259
|
+
// Directive Prologues.
|
|
260
|
+
case "ExpressionStatement":
|
|
261
|
+
return (
|
|
262
|
+
!astUtils.isParenthesised(sourceCode, node) &&
|
|
263
|
+
isExpressionInOrJustAfterDirectivePrologue(node)
|
|
264
|
+
);
|
|
265
|
+
|
|
266
|
+
// LiteralPropertyName.
|
|
267
|
+
case "Property":
|
|
268
|
+
case "PropertyDefinition":
|
|
269
|
+
case "MethodDefinition":
|
|
270
|
+
return parent.key === node && !parent.computed;
|
|
271
|
+
|
|
272
|
+
// ModuleSpecifier.
|
|
273
|
+
case "ImportDeclaration":
|
|
274
|
+
case "ExportNamedDeclaration":
|
|
275
|
+
return parent.source === node;
|
|
276
|
+
|
|
277
|
+
// ModuleExportName or ModuleSpecifier.
|
|
278
|
+
case "ExportAllDeclaration":
|
|
279
|
+
return parent.exported === node || parent.source === node;
|
|
280
|
+
|
|
281
|
+
// ModuleExportName.
|
|
282
|
+
case "ImportSpecifier":
|
|
283
|
+
return parent.imported === node;
|
|
284
|
+
|
|
285
|
+
// ModuleExportName.
|
|
286
|
+
case "ExportSpecifier":
|
|
287
|
+
return parent.local === node || parent.exported === node;
|
|
288
|
+
|
|
289
|
+
// Others don't allow.
|
|
290
|
+
default:
|
|
291
|
+
return false;
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
/**
|
|
296
|
+
* Checks whether or not a given TemplateLiteral node is actually using any of the special features provided by template literal strings.
|
|
297
|
+
* @param {ASTNode} node A TemplateLiteral node to check.
|
|
298
|
+
* @returns {boolean} Whether or not the TemplateLiteral node is using any of the special features provided by template literal strings.
|
|
299
|
+
* @private
|
|
300
|
+
*/
|
|
301
|
+
function isUsingFeatureOfTemplateLiteral(node) {
|
|
302
|
+
const hasTag =
|
|
303
|
+
node.parent.type === "TaggedTemplateExpression" &&
|
|
304
|
+
node === node.parent.quasi;
|
|
305
|
+
|
|
306
|
+
if (hasTag) {
|
|
307
|
+
return true;
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
const hasStringInterpolation = node.expressions.length > 0;
|
|
311
|
+
|
|
312
|
+
if (hasStringInterpolation) {
|
|
313
|
+
return true;
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
const isMultilineString =
|
|
317
|
+
node.quasis.length >= 1 &&
|
|
318
|
+
UNESCAPED_LINEBREAK_PATTERN.test(node.quasis[0].value.raw);
|
|
319
|
+
|
|
320
|
+
if (isMultilineString) {
|
|
321
|
+
return true;
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
return false;
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
return {
|
|
328
|
+
Literal(node) {
|
|
329
|
+
const val = node.value,
|
|
330
|
+
rawVal = node.raw;
|
|
331
|
+
|
|
332
|
+
if (settings && typeof val === "string") {
|
|
333
|
+
let isValid =
|
|
334
|
+
(quoteOption === "backtick" &&
|
|
335
|
+
isAllowedAsNonBacktick(node)) ||
|
|
336
|
+
isJSXLiteral(node) ||
|
|
337
|
+
astUtils.isSurroundedBy(rawVal, settings.quote);
|
|
338
|
+
|
|
339
|
+
if (!isValid && avoidEscape) {
|
|
340
|
+
isValid =
|
|
341
|
+
astUtils.isSurroundedBy(
|
|
342
|
+
rawVal,
|
|
343
|
+
settings.alternateQuote,
|
|
344
|
+
) && rawVal.includes(settings.quote);
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
if (!isValid) {
|
|
348
|
+
context.report({
|
|
349
|
+
node,
|
|
350
|
+
messageId: "wrongQuotes",
|
|
351
|
+
data: {
|
|
352
|
+
description: settings.description,
|
|
353
|
+
},
|
|
354
|
+
fix(fixer) {
|
|
355
|
+
if (
|
|
356
|
+
quoteOption === "backtick" &&
|
|
357
|
+
astUtils.hasOctalOrNonOctalDecimalEscapeSequence(
|
|
358
|
+
rawVal,
|
|
359
|
+
)
|
|
360
|
+
) {
|
|
361
|
+
/*
|
|
362
|
+
* An octal or non-octal decimal escape sequence in a template literal would
|
|
363
|
+
* produce syntax error, even in non-strict mode.
|
|
364
|
+
*/
|
|
365
|
+
return null;
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
return fixer.replaceText(
|
|
369
|
+
node,
|
|
370
|
+
settings.convert(node.raw),
|
|
371
|
+
);
|
|
372
|
+
},
|
|
373
|
+
});
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
},
|
|
377
|
+
|
|
378
|
+
TemplateLiteral(node) {
|
|
379
|
+
// Don't throw an error if backticks are expected or a template literal feature is in use.
|
|
380
|
+
if (
|
|
381
|
+
allowTemplateLiterals ||
|
|
382
|
+
quoteOption === "backtick" ||
|
|
383
|
+
isUsingFeatureOfTemplateLiteral(node)
|
|
384
|
+
) {
|
|
385
|
+
return;
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
context.report({
|
|
389
|
+
node,
|
|
390
|
+
messageId: "wrongQuotes",
|
|
391
|
+
data: {
|
|
392
|
+
description: settings.description,
|
|
393
|
+
},
|
|
394
|
+
fix(fixer) {
|
|
395
|
+
if (
|
|
396
|
+
astUtils.isTopLevelExpressionStatement(
|
|
397
|
+
node.parent,
|
|
398
|
+
) &&
|
|
399
|
+
!astUtils.isParenthesised(sourceCode, node)
|
|
400
|
+
) {
|
|
401
|
+
/*
|
|
402
|
+
* TemplateLiterals aren't actually directives, but fixing them might turn
|
|
403
|
+
* them into directives and change the behavior of the code.
|
|
404
|
+
*/
|
|
405
|
+
return null;
|
|
406
|
+
}
|
|
407
|
+
return fixer.replaceText(
|
|
408
|
+
node,
|
|
409
|
+
settings.convert(sourceCode.getText(node)),
|
|
410
|
+
);
|
|
411
|
+
},
|
|
412
|
+
});
|
|
413
|
+
},
|
|
414
|
+
};
|
|
415
|
+
},
|
|
416
|
+
};
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Rule to flag use of parseInt without a radix argument
|
|
3
|
+
* @author James Allardice
|
|
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 validRadixValues = new Set(
|
|
19
|
+
Array.from({ length: 37 - 2 }, (_, index) => index + 2),
|
|
20
|
+
);
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Checks whether a given variable is shadowed or not.
|
|
24
|
+
* @param {eslint-scope.Variable} variable A variable to check.
|
|
25
|
+
* @returns {boolean} `true` if the variable is shadowed.
|
|
26
|
+
*/
|
|
27
|
+
function isShadowed(variable) {
|
|
28
|
+
return variable.defs.length >= 1;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Checks whether a given node is a MemberExpression of `parseInt` method or not.
|
|
33
|
+
* @param {ASTNode} node A node to check.
|
|
34
|
+
* @returns {boolean} `true` if the node is a MemberExpression of `parseInt`
|
|
35
|
+
* method.
|
|
36
|
+
*/
|
|
37
|
+
function isParseIntMethod(node) {
|
|
38
|
+
return (
|
|
39
|
+
node.type === "MemberExpression" &&
|
|
40
|
+
!node.computed &&
|
|
41
|
+
node.property.type === "Identifier" &&
|
|
42
|
+
node.property.name === "parseInt"
|
|
43
|
+
);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Checks whether a given node is a valid value of radix or not.
|
|
48
|
+
*
|
|
49
|
+
* The following values are invalid.
|
|
50
|
+
*
|
|
51
|
+
* - A literal except integers between 2 and 36.
|
|
52
|
+
* - undefined.
|
|
53
|
+
* @param {ASTNode} radix A node of radix to check.
|
|
54
|
+
* @returns {boolean} `true` if the node is valid.
|
|
55
|
+
*/
|
|
56
|
+
function isValidRadix(radix) {
|
|
57
|
+
return !(
|
|
58
|
+
(radix.type === "Literal" && !validRadixValues.has(radix.value)) ||
|
|
59
|
+
(radix.type === "Identifier" && radix.name === "undefined")
|
|
60
|
+
);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
//------------------------------------------------------------------------------
|
|
64
|
+
// Rule Definition
|
|
65
|
+
//------------------------------------------------------------------------------
|
|
66
|
+
|
|
67
|
+
/** @type {import('../types').Rule.RuleModule} */
|
|
68
|
+
module.exports = {
|
|
69
|
+
meta: {
|
|
70
|
+
type: "suggestion",
|
|
71
|
+
|
|
72
|
+
docs: {
|
|
73
|
+
description:
|
|
74
|
+
"Enforce the use of the radix argument when using `parseInt()`",
|
|
75
|
+
recommended: false,
|
|
76
|
+
url: "https://eslint.org/docs/latest/rules/radix",
|
|
77
|
+
},
|
|
78
|
+
|
|
79
|
+
hasSuggestions: true,
|
|
80
|
+
|
|
81
|
+
schema: [
|
|
82
|
+
// deprecated
|
|
83
|
+
{
|
|
84
|
+
enum: ["always", "as-needed"],
|
|
85
|
+
},
|
|
86
|
+
],
|
|
87
|
+
|
|
88
|
+
messages: {
|
|
89
|
+
missingParameters: "Missing parameters.",
|
|
90
|
+
missingRadix: "Missing radix parameter.",
|
|
91
|
+
invalidRadix:
|
|
92
|
+
"Invalid radix parameter, must be an integer between 2 and 36.",
|
|
93
|
+
addRadixParameter10:
|
|
94
|
+
"Add radix parameter `10` for parsing decimal numbers.",
|
|
95
|
+
},
|
|
96
|
+
},
|
|
97
|
+
|
|
98
|
+
create(context) {
|
|
99
|
+
const sourceCode = context.sourceCode;
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Checks the arguments of a given CallExpression node and reports it if it
|
|
103
|
+
* offends this rule.
|
|
104
|
+
* @param {ASTNode} node A CallExpression node to check.
|
|
105
|
+
* @returns {void}
|
|
106
|
+
*/
|
|
107
|
+
function checkArguments(node) {
|
|
108
|
+
const args = node.arguments;
|
|
109
|
+
|
|
110
|
+
switch (args.length) {
|
|
111
|
+
case 0:
|
|
112
|
+
context.report({
|
|
113
|
+
node,
|
|
114
|
+
messageId: "missingParameters",
|
|
115
|
+
});
|
|
116
|
+
break;
|
|
117
|
+
|
|
118
|
+
case 1:
|
|
119
|
+
context.report({
|
|
120
|
+
node,
|
|
121
|
+
messageId: "missingRadix",
|
|
122
|
+
suggest: [
|
|
123
|
+
{
|
|
124
|
+
messageId: "addRadixParameter10",
|
|
125
|
+
fix(fixer) {
|
|
126
|
+
const tokens = sourceCode.getTokens(node);
|
|
127
|
+
const lastToken = tokens.at(-1); // Parenthesis.
|
|
128
|
+
const secondToLastToken = tokens.at(-2); // May or may not be a comma.
|
|
129
|
+
const hasTrailingComma =
|
|
130
|
+
secondToLastToken.type ===
|
|
131
|
+
"Punctuator" &&
|
|
132
|
+
secondToLastToken.value === ",";
|
|
133
|
+
|
|
134
|
+
return fixer.insertTextBefore(
|
|
135
|
+
lastToken,
|
|
136
|
+
hasTrailingComma ? " 10," : ", 10",
|
|
137
|
+
);
|
|
138
|
+
},
|
|
139
|
+
},
|
|
140
|
+
],
|
|
141
|
+
});
|
|
142
|
+
break;
|
|
143
|
+
|
|
144
|
+
default:
|
|
145
|
+
if (!isValidRadix(args[1])) {
|
|
146
|
+
context.report({
|
|
147
|
+
node,
|
|
148
|
+
messageId: "invalidRadix",
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
break;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
return {
|
|
156
|
+
"Program:exit"(node) {
|
|
157
|
+
const scope = sourceCode.getScope(node);
|
|
158
|
+
let variable;
|
|
159
|
+
|
|
160
|
+
// Check `parseInt()`
|
|
161
|
+
variable = astUtils.getVariableByName(scope, "parseInt");
|
|
162
|
+
if (variable && !isShadowed(variable)) {
|
|
163
|
+
variable.references.forEach(reference => {
|
|
164
|
+
const idNode = reference.identifier;
|
|
165
|
+
|
|
166
|
+
if (astUtils.isCallee(idNode)) {
|
|
167
|
+
checkArguments(idNode.parent);
|
|
168
|
+
}
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// Check `Number.parseInt()`
|
|
173
|
+
variable = astUtils.getVariableByName(scope, "Number");
|
|
174
|
+
if (variable && !isShadowed(variable)) {
|
|
175
|
+
variable.references.forEach(reference => {
|
|
176
|
+
const parentNode = reference.identifier.parent;
|
|
177
|
+
const maybeCallee =
|
|
178
|
+
parentNode.parent.type === "ChainExpression"
|
|
179
|
+
? parentNode.parent
|
|
180
|
+
: parentNode;
|
|
181
|
+
|
|
182
|
+
if (
|
|
183
|
+
isParseIntMethod(parentNode) &&
|
|
184
|
+
astUtils.isCallee(maybeCallee)
|
|
185
|
+
) {
|
|
186
|
+
checkArguments(maybeCallee.parent);
|
|
187
|
+
}
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
},
|
|
191
|
+
};
|
|
192
|
+
},
|
|
193
|
+
};
|