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,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview disallow unnecessary concatenation of template strings
|
|
3
|
+
* @author Henry Zhu
|
|
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
|
+
* Checks whether or not a given node is a concatenation.
|
|
19
|
+
* @param {ASTNode} node A node to check.
|
|
20
|
+
* @returns {boolean} `true` if the node is a concatenation.
|
|
21
|
+
*/
|
|
22
|
+
function isConcatenation(node) {
|
|
23
|
+
return node.type === "BinaryExpression" && node.operator === "+";
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Checks if the given token is a `+` token or not.
|
|
28
|
+
* @param {Token} token The token to check.
|
|
29
|
+
* @returns {boolean} `true` if the token is a `+` token.
|
|
30
|
+
*/
|
|
31
|
+
function isConcatOperatorToken(token) {
|
|
32
|
+
return token.value === "+" && token.type === "Punctuator";
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Get's the right most node on the left side of a BinaryExpression with + operator.
|
|
37
|
+
* @param {ASTNode} node A BinaryExpression node to check.
|
|
38
|
+
* @returns {ASTNode} node
|
|
39
|
+
*/
|
|
40
|
+
function getLeft(node) {
|
|
41
|
+
let left = node.left;
|
|
42
|
+
|
|
43
|
+
while (isConcatenation(left)) {
|
|
44
|
+
left = left.right;
|
|
45
|
+
}
|
|
46
|
+
return left;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Get's the left most node on the right side of a BinaryExpression with + operator.
|
|
51
|
+
* @param {ASTNode} node A BinaryExpression node to check.
|
|
52
|
+
* @returns {ASTNode} node
|
|
53
|
+
*/
|
|
54
|
+
function getRight(node) {
|
|
55
|
+
let right = node.right;
|
|
56
|
+
|
|
57
|
+
while (isConcatenation(right)) {
|
|
58
|
+
right = right.left;
|
|
59
|
+
}
|
|
60
|
+
return right;
|
|
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
|
+
"Disallow unnecessary concatenation of literals or template literals",
|
|
75
|
+
recommended: false,
|
|
76
|
+
frozen: true,
|
|
77
|
+
url: "https://eslint.org/docs/latest/rules/no-useless-concat",
|
|
78
|
+
},
|
|
79
|
+
|
|
80
|
+
schema: [],
|
|
81
|
+
|
|
82
|
+
messages: {
|
|
83
|
+
unexpectedConcat: "Unexpected string concatenation of literals.",
|
|
84
|
+
},
|
|
85
|
+
},
|
|
86
|
+
|
|
87
|
+
create(context) {
|
|
88
|
+
const sourceCode = context.sourceCode;
|
|
89
|
+
|
|
90
|
+
return {
|
|
91
|
+
BinaryExpression(node) {
|
|
92
|
+
// check if not concatenation
|
|
93
|
+
if (node.operator !== "+") {
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// account for the `foo + "a" + "b"` case
|
|
98
|
+
const left = getLeft(node);
|
|
99
|
+
const right = getRight(node);
|
|
100
|
+
|
|
101
|
+
if (
|
|
102
|
+
astUtils.isStringLiteral(left) &&
|
|
103
|
+
astUtils.isStringLiteral(right) &&
|
|
104
|
+
astUtils.isTokenOnSameLine(left, right)
|
|
105
|
+
) {
|
|
106
|
+
const operatorToken = sourceCode.getFirstTokenBetween(
|
|
107
|
+
left,
|
|
108
|
+
right,
|
|
109
|
+
isConcatOperatorToken,
|
|
110
|
+
);
|
|
111
|
+
|
|
112
|
+
context.report({
|
|
113
|
+
node,
|
|
114
|
+
loc: operatorToken.loc,
|
|
115
|
+
messageId: "unexpectedConcat",
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
},
|
|
119
|
+
};
|
|
120
|
+
},
|
|
121
|
+
};
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Rule to flag the use of redundant constructors in classes.
|
|
3
|
+
* @author Alberto Rodríguez
|
|
4
|
+
*/
|
|
5
|
+
"use strict";
|
|
6
|
+
|
|
7
|
+
const astUtils = require("./utils/ast-utils");
|
|
8
|
+
|
|
9
|
+
//------------------------------------------------------------------------------
|
|
10
|
+
// Helpers
|
|
11
|
+
//------------------------------------------------------------------------------
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Checks whether any of a method's parameters have a decorator or are a parameter property.
|
|
15
|
+
* @param {ASTNode} node A method definition node.
|
|
16
|
+
* @returns {boolean} `true` if any parameter had a decorator or is a parameter property.
|
|
17
|
+
*/
|
|
18
|
+
function hasDecoratorsOrParameterProperty(node) {
|
|
19
|
+
return node.value.params.some(
|
|
20
|
+
param =>
|
|
21
|
+
param.decorators?.length || param.type === "TSParameterProperty",
|
|
22
|
+
);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Checks whether a node's accessibility makes it not useless.
|
|
27
|
+
* @param {ASTNode} node A method definition node.
|
|
28
|
+
* @returns {boolean} `true` if the node has a useful accessibility.
|
|
29
|
+
*/
|
|
30
|
+
function hasUsefulAccessibility(node) {
|
|
31
|
+
switch (node.accessibility) {
|
|
32
|
+
case "protected":
|
|
33
|
+
case "private":
|
|
34
|
+
return true;
|
|
35
|
+
case "public":
|
|
36
|
+
return !!node.parent.parent.superClass;
|
|
37
|
+
default:
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Checks whether a given array of statements is a single call of `super`.
|
|
44
|
+
* @param {ASTNode[]} body An array of statements to check.
|
|
45
|
+
* @returns {boolean} `true` if the body is a single call of `super`.
|
|
46
|
+
*/
|
|
47
|
+
function isSingleSuperCall(body) {
|
|
48
|
+
return (
|
|
49
|
+
body.length === 1 &&
|
|
50
|
+
body[0].type === "ExpressionStatement" &&
|
|
51
|
+
body[0].expression.type === "CallExpression" &&
|
|
52
|
+
body[0].expression.callee.type === "Super"
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Checks whether a given node is a pattern which doesn't have any side effects.
|
|
58
|
+
* Default parameters and Destructuring parameters can have side effects.
|
|
59
|
+
* @param {ASTNode} node A pattern node.
|
|
60
|
+
* @returns {boolean} `true` if the node doesn't have any side effects.
|
|
61
|
+
*/
|
|
62
|
+
function isSimple(node) {
|
|
63
|
+
return node.type === "Identifier" || node.type === "RestElement";
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Checks whether a given array of expressions is `...arguments` or not.
|
|
68
|
+
* `super(...arguments)` passes all arguments through.
|
|
69
|
+
* @param {ASTNode[]} superArgs An array of expressions to check.
|
|
70
|
+
* @returns {boolean} `true` if the superArgs is `...arguments`.
|
|
71
|
+
*/
|
|
72
|
+
function isSpreadArguments(superArgs) {
|
|
73
|
+
return (
|
|
74
|
+
superArgs.length === 1 &&
|
|
75
|
+
superArgs[0].type === "SpreadElement" &&
|
|
76
|
+
superArgs[0].argument.type === "Identifier" &&
|
|
77
|
+
superArgs[0].argument.name === "arguments"
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Checks whether given 2 nodes are identifiers which have the same name or not.
|
|
83
|
+
* @param {ASTNode} ctorParam A node to check.
|
|
84
|
+
* @param {ASTNode} superArg A node to check.
|
|
85
|
+
* @returns {boolean} `true` if the nodes are identifiers which have the same
|
|
86
|
+
* name.
|
|
87
|
+
*/
|
|
88
|
+
function isValidIdentifierPair(ctorParam, superArg) {
|
|
89
|
+
return (
|
|
90
|
+
ctorParam.type === "Identifier" &&
|
|
91
|
+
superArg.type === "Identifier" &&
|
|
92
|
+
ctorParam.name === superArg.name
|
|
93
|
+
);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Checks whether given 2 nodes are a rest/spread pair which has the same values.
|
|
98
|
+
* @param {ASTNode} ctorParam A node to check.
|
|
99
|
+
* @param {ASTNode} superArg A node to check.
|
|
100
|
+
* @returns {boolean} `true` if the nodes are a rest/spread pair which has the
|
|
101
|
+
* same values.
|
|
102
|
+
*/
|
|
103
|
+
function isValidRestSpreadPair(ctorParam, superArg) {
|
|
104
|
+
return (
|
|
105
|
+
ctorParam.type === "RestElement" &&
|
|
106
|
+
superArg.type === "SpreadElement" &&
|
|
107
|
+
isValidIdentifierPair(ctorParam.argument, superArg.argument)
|
|
108
|
+
);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Checks whether given 2 nodes have the same value or not.
|
|
113
|
+
* @param {ASTNode} ctorParam A node to check.
|
|
114
|
+
* @param {ASTNode} superArg A node to check.
|
|
115
|
+
* @returns {boolean} `true` if the nodes have the same value or not.
|
|
116
|
+
*/
|
|
117
|
+
function isValidPair(ctorParam, superArg) {
|
|
118
|
+
return (
|
|
119
|
+
isValidIdentifierPair(ctorParam, superArg) ||
|
|
120
|
+
isValidRestSpreadPair(ctorParam, superArg)
|
|
121
|
+
);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Checks whether the parameters of a constructor and the arguments of `super()`
|
|
126
|
+
* have the same values or not.
|
|
127
|
+
* @param {ASTNode} ctorParams The parameters of a constructor to check.
|
|
128
|
+
* @param {ASTNode} superArgs The arguments of `super()` to check.
|
|
129
|
+
* @returns {boolean} `true` if those have the same values.
|
|
130
|
+
*/
|
|
131
|
+
function isPassingThrough(ctorParams, superArgs) {
|
|
132
|
+
if (ctorParams.length !== superArgs.length) {
|
|
133
|
+
return false;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
for (let i = 0; i < ctorParams.length; ++i) {
|
|
137
|
+
if (!isValidPair(ctorParams[i], superArgs[i])) {
|
|
138
|
+
return false;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
return true;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Checks whether the constructor body is a redundant super call.
|
|
147
|
+
* @param {Array} body constructor body content.
|
|
148
|
+
* @param {Array} ctorParams The params to check against super call.
|
|
149
|
+
* @returns {boolean} true if the constructor body is redundant
|
|
150
|
+
*/
|
|
151
|
+
function isRedundantSuperCall(body, ctorParams) {
|
|
152
|
+
return (
|
|
153
|
+
isSingleSuperCall(body) &&
|
|
154
|
+
ctorParams.every(isSimple) &&
|
|
155
|
+
(isSpreadArguments(body[0].expression.arguments) ||
|
|
156
|
+
isPassingThrough(ctorParams, body[0].expression.arguments))
|
|
157
|
+
);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
//------------------------------------------------------------------------------
|
|
161
|
+
// Rule Definition
|
|
162
|
+
//------------------------------------------------------------------------------
|
|
163
|
+
|
|
164
|
+
/** @type {import('../types').Rule.RuleModule} */
|
|
165
|
+
module.exports = {
|
|
166
|
+
meta: {
|
|
167
|
+
dialects: ["javascript", "typescript"],
|
|
168
|
+
language: "javascript",
|
|
169
|
+
type: "suggestion",
|
|
170
|
+
|
|
171
|
+
docs: {
|
|
172
|
+
description: "Disallow unnecessary constructors",
|
|
173
|
+
recommended: false,
|
|
174
|
+
url: "https://eslint.org/docs/latest/rules/no-useless-constructor",
|
|
175
|
+
},
|
|
176
|
+
|
|
177
|
+
hasSuggestions: true,
|
|
178
|
+
|
|
179
|
+
schema: [],
|
|
180
|
+
|
|
181
|
+
messages: {
|
|
182
|
+
noUselessConstructor: "Useless constructor.",
|
|
183
|
+
removeConstructor: "Remove the constructor.",
|
|
184
|
+
},
|
|
185
|
+
},
|
|
186
|
+
|
|
187
|
+
create(context) {
|
|
188
|
+
const { sourceCode } = context;
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* Checks whether a node is a redundant constructor
|
|
192
|
+
* @param {ASTNode} node node to check
|
|
193
|
+
* @returns {void}
|
|
194
|
+
*/
|
|
195
|
+
function checkForConstructor(node) {
|
|
196
|
+
if (
|
|
197
|
+
node.kind !== "constructor" ||
|
|
198
|
+
node.value.type !== "FunctionExpression" ||
|
|
199
|
+
hasDecoratorsOrParameterProperty(node) ||
|
|
200
|
+
hasUsefulAccessibility(node)
|
|
201
|
+
) {
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/*
|
|
206
|
+
* Prevent crashing on parsers which do not require class constructor
|
|
207
|
+
* to have a body, e.g. typescript and flow
|
|
208
|
+
*/
|
|
209
|
+
if (!node.value.body) {
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
const body = node.value.body.body;
|
|
214
|
+
const ctorParams = node.value.params;
|
|
215
|
+
const superClass = node.parent.parent.superClass;
|
|
216
|
+
const parenToken = sourceCode.getFirstToken(
|
|
217
|
+
node,
|
|
218
|
+
astUtils.isOpeningParenToken,
|
|
219
|
+
);
|
|
220
|
+
const loc = {
|
|
221
|
+
start: node.loc.start,
|
|
222
|
+
end: sourceCode.getTokenBefore(parenToken).loc.end,
|
|
223
|
+
};
|
|
224
|
+
|
|
225
|
+
if (
|
|
226
|
+
superClass
|
|
227
|
+
? isRedundantSuperCall(body, ctorParams)
|
|
228
|
+
: body.length === 0
|
|
229
|
+
) {
|
|
230
|
+
context.report({
|
|
231
|
+
loc,
|
|
232
|
+
messageId: "noUselessConstructor",
|
|
233
|
+
suggest: [
|
|
234
|
+
{
|
|
235
|
+
messageId: "removeConstructor",
|
|
236
|
+
*fix(fixer) {
|
|
237
|
+
const nextToken =
|
|
238
|
+
sourceCode.getTokenAfter(node);
|
|
239
|
+
const addSemiColon =
|
|
240
|
+
nextToken.type === "Punctuator" &&
|
|
241
|
+
nextToken.value === "[" &&
|
|
242
|
+
astUtils.needsPrecedingSemicolon(
|
|
243
|
+
sourceCode,
|
|
244
|
+
node,
|
|
245
|
+
);
|
|
246
|
+
|
|
247
|
+
yield fixer.replaceText(
|
|
248
|
+
node,
|
|
249
|
+
addSemiColon ? ";" : "",
|
|
250
|
+
);
|
|
251
|
+
},
|
|
252
|
+
},
|
|
253
|
+
],
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
return {
|
|
259
|
+
MethodDefinition: checkForConstructor,
|
|
260
|
+
};
|
|
261
|
+
},
|
|
262
|
+
};
|