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,217 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Rule that warns when identifier names are shorter or longer
|
|
3
|
+
* than the values provided in configuration.
|
|
4
|
+
* @author Burak Yigit Kaya aka BYK
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
"use strict";
|
|
8
|
+
|
|
9
|
+
//------------------------------------------------------------------------------
|
|
10
|
+
// Requirements
|
|
11
|
+
//------------------------------------------------------------------------------
|
|
12
|
+
|
|
13
|
+
const { getGraphemeCount } = require("../shared/string-utils");
|
|
14
|
+
const {
|
|
15
|
+
getModuleExportName,
|
|
16
|
+
isImportAttributeKey,
|
|
17
|
+
} = require("./utils/ast-utils");
|
|
18
|
+
|
|
19
|
+
//------------------------------------------------------------------------------
|
|
20
|
+
// Rule Definition
|
|
21
|
+
//------------------------------------------------------------------------------
|
|
22
|
+
|
|
23
|
+
/** @type {import('../types').Rule.RuleModule} */
|
|
24
|
+
module.exports = {
|
|
25
|
+
meta: {
|
|
26
|
+
type: "suggestion",
|
|
27
|
+
|
|
28
|
+
defaultOptions: [
|
|
29
|
+
{
|
|
30
|
+
exceptionPatterns: [],
|
|
31
|
+
exceptions: [],
|
|
32
|
+
min: 2,
|
|
33
|
+
properties: "always",
|
|
34
|
+
},
|
|
35
|
+
],
|
|
36
|
+
|
|
37
|
+
docs: {
|
|
38
|
+
description: "Enforce minimum and maximum identifier lengths",
|
|
39
|
+
recommended: false,
|
|
40
|
+
frozen: true,
|
|
41
|
+
url: "https://eslint.org/docs/latest/rules/id-length",
|
|
42
|
+
},
|
|
43
|
+
|
|
44
|
+
schema: [
|
|
45
|
+
{
|
|
46
|
+
type: "object",
|
|
47
|
+
properties: {
|
|
48
|
+
min: {
|
|
49
|
+
type: "integer",
|
|
50
|
+
},
|
|
51
|
+
max: {
|
|
52
|
+
type: "integer",
|
|
53
|
+
},
|
|
54
|
+
exceptions: {
|
|
55
|
+
type: "array",
|
|
56
|
+
uniqueItems: true,
|
|
57
|
+
items: {
|
|
58
|
+
type: "string",
|
|
59
|
+
},
|
|
60
|
+
},
|
|
61
|
+
exceptionPatterns: {
|
|
62
|
+
type: "array",
|
|
63
|
+
uniqueItems: true,
|
|
64
|
+
items: {
|
|
65
|
+
type: "string",
|
|
66
|
+
},
|
|
67
|
+
},
|
|
68
|
+
properties: {
|
|
69
|
+
enum: ["always", "never"],
|
|
70
|
+
},
|
|
71
|
+
},
|
|
72
|
+
additionalProperties: false,
|
|
73
|
+
},
|
|
74
|
+
],
|
|
75
|
+
messages: {
|
|
76
|
+
tooShort: "Identifier name '{{name}}' is too short (< {{min}}).",
|
|
77
|
+
tooShortPrivate:
|
|
78
|
+
"Identifier name '#{{name}}' is too short (< {{min}}).",
|
|
79
|
+
tooLong: "Identifier name '{{name}}' is too long (> {{max}}).",
|
|
80
|
+
tooLongPrivate:
|
|
81
|
+
"Identifier name #'{{name}}' is too long (> {{max}}).",
|
|
82
|
+
},
|
|
83
|
+
},
|
|
84
|
+
|
|
85
|
+
create(context) {
|
|
86
|
+
const [options] = context.options;
|
|
87
|
+
const { max: maxLength = Infinity, min: minLength } = options;
|
|
88
|
+
const properties = options.properties !== "never";
|
|
89
|
+
const exceptions = new Set(options.exceptions);
|
|
90
|
+
const exceptionPatterns = options.exceptionPatterns.map(
|
|
91
|
+
pattern => new RegExp(pattern, "u"),
|
|
92
|
+
);
|
|
93
|
+
const reportedNodes = new Set();
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Checks if a string matches the provided exception patterns
|
|
97
|
+
* @param {string} name The string to check.
|
|
98
|
+
* @returns {boolean} if the string is a match
|
|
99
|
+
* @private
|
|
100
|
+
*/
|
|
101
|
+
function matchesExceptionPattern(name) {
|
|
102
|
+
return exceptionPatterns.some(pattern => pattern.test(name));
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
const SUPPORTED_EXPRESSIONS = {
|
|
106
|
+
MemberExpression:
|
|
107
|
+
properties &&
|
|
108
|
+
function (parent) {
|
|
109
|
+
return (
|
|
110
|
+
!parent.computed &&
|
|
111
|
+
// regular property assignment
|
|
112
|
+
((parent.parent.left === parent &&
|
|
113
|
+
parent.parent.type === "AssignmentExpression") ||
|
|
114
|
+
// or the last identifier in an ObjectPattern destructuring
|
|
115
|
+
(parent.parent.type === "Property" &&
|
|
116
|
+
parent.parent.value === parent &&
|
|
117
|
+
parent.parent.parent.type === "ObjectPattern" &&
|
|
118
|
+
parent.parent.parent.parent.left ===
|
|
119
|
+
parent.parent.parent))
|
|
120
|
+
);
|
|
121
|
+
},
|
|
122
|
+
AssignmentPattern(parent, node) {
|
|
123
|
+
return parent.left === node;
|
|
124
|
+
},
|
|
125
|
+
VariableDeclarator(parent, node) {
|
|
126
|
+
return parent.id === node;
|
|
127
|
+
},
|
|
128
|
+
Property(parent, node) {
|
|
129
|
+
if (parent.parent.type === "ObjectPattern") {
|
|
130
|
+
const isKeyAndValueSame =
|
|
131
|
+
parent.value.name === parent.key.name;
|
|
132
|
+
|
|
133
|
+
return (
|
|
134
|
+
(!isKeyAndValueSame && parent.value === node) ||
|
|
135
|
+
(isKeyAndValueSame && parent.key === node && properties)
|
|
136
|
+
);
|
|
137
|
+
}
|
|
138
|
+
return (
|
|
139
|
+
properties &&
|
|
140
|
+
!isImportAttributeKey(node) &&
|
|
141
|
+
!parent.computed &&
|
|
142
|
+
parent.key.name === node.name
|
|
143
|
+
);
|
|
144
|
+
},
|
|
145
|
+
ImportSpecifier(parent, node) {
|
|
146
|
+
return (
|
|
147
|
+
parent.local === node &&
|
|
148
|
+
getModuleExportName(parent.imported) !==
|
|
149
|
+
getModuleExportName(parent.local)
|
|
150
|
+
);
|
|
151
|
+
},
|
|
152
|
+
ImportDefaultSpecifier: true,
|
|
153
|
+
ImportNamespaceSpecifier: true,
|
|
154
|
+
RestElement: true,
|
|
155
|
+
FunctionExpression: true,
|
|
156
|
+
ArrowFunctionExpression: true,
|
|
157
|
+
ClassDeclaration: true,
|
|
158
|
+
FunctionDeclaration: true,
|
|
159
|
+
MethodDefinition: true,
|
|
160
|
+
PropertyDefinition: true,
|
|
161
|
+
CatchClause: true,
|
|
162
|
+
ArrayPattern: true,
|
|
163
|
+
};
|
|
164
|
+
|
|
165
|
+
return {
|
|
166
|
+
[["Identifier", "PrivateIdentifier"]](node) {
|
|
167
|
+
const name = node.name;
|
|
168
|
+
const parent = node.parent;
|
|
169
|
+
|
|
170
|
+
const nameLength = getGraphemeCount(name);
|
|
171
|
+
|
|
172
|
+
const isShort = nameLength < minLength;
|
|
173
|
+
const isLong = nameLength > maxLength;
|
|
174
|
+
|
|
175
|
+
if (
|
|
176
|
+
!(isShort || isLong) ||
|
|
177
|
+
exceptions.has(name) ||
|
|
178
|
+
matchesExceptionPattern(name)
|
|
179
|
+
) {
|
|
180
|
+
return; // Nothing to report
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
const isValidExpression = SUPPORTED_EXPRESSIONS[parent.type];
|
|
184
|
+
|
|
185
|
+
/*
|
|
186
|
+
* We used the range instead of the node because it's possible
|
|
187
|
+
* for the same identifier to be represented by two different
|
|
188
|
+
* nodes, with the most clear example being shorthand properties:
|
|
189
|
+
* { foo }
|
|
190
|
+
* In this case, "foo" is represented by one node for the name
|
|
191
|
+
* and one for the value. The only way to know they are the same
|
|
192
|
+
* is to look at the range.
|
|
193
|
+
*/
|
|
194
|
+
if (
|
|
195
|
+
isValidExpression &&
|
|
196
|
+
!reportedNodes.has(node.range.toString()) &&
|
|
197
|
+
(isValidExpression === true ||
|
|
198
|
+
isValidExpression(parent, node))
|
|
199
|
+
) {
|
|
200
|
+
reportedNodes.add(node.range.toString());
|
|
201
|
+
|
|
202
|
+
let messageId = isShort ? "tooShort" : "tooLong";
|
|
203
|
+
|
|
204
|
+
if (node.type === "PrivateIdentifier") {
|
|
205
|
+
messageId += "Private";
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
context.report({
|
|
209
|
+
node,
|
|
210
|
+
messageId,
|
|
211
|
+
data: { name, min: minLength, max: maxLength },
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
},
|
|
215
|
+
};
|
|
216
|
+
},
|
|
217
|
+
};
|
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Rule to flag non-matching identifiers
|
|
3
|
+
* @author Matthieu Larcher
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
"use strict";
|
|
7
|
+
|
|
8
|
+
//------------------------------------------------------------------------------
|
|
9
|
+
// Requirements
|
|
10
|
+
//------------------------------------------------------------------------------
|
|
11
|
+
|
|
12
|
+
const astUtils = require("./utils/ast-utils");
|
|
13
|
+
|
|
14
|
+
//------------------------------------------------------------------------------
|
|
15
|
+
// Rule Definition
|
|
16
|
+
//------------------------------------------------------------------------------
|
|
17
|
+
|
|
18
|
+
/** @type {import('../types').Rule.RuleModule} */
|
|
19
|
+
module.exports = {
|
|
20
|
+
meta: {
|
|
21
|
+
type: "suggestion",
|
|
22
|
+
|
|
23
|
+
defaultOptions: [
|
|
24
|
+
"^.+$",
|
|
25
|
+
{
|
|
26
|
+
classFields: false,
|
|
27
|
+
ignoreDestructuring: false,
|
|
28
|
+
onlyDeclarations: false,
|
|
29
|
+
properties: false,
|
|
30
|
+
},
|
|
31
|
+
],
|
|
32
|
+
|
|
33
|
+
docs: {
|
|
34
|
+
description:
|
|
35
|
+
"Require identifiers to match a specified regular expression",
|
|
36
|
+
recommended: false,
|
|
37
|
+
frozen: true,
|
|
38
|
+
url: "https://eslint.org/docs/latest/rules/id-match",
|
|
39
|
+
},
|
|
40
|
+
|
|
41
|
+
schema: [
|
|
42
|
+
{
|
|
43
|
+
type: "string",
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
type: "object",
|
|
47
|
+
properties: {
|
|
48
|
+
properties: {
|
|
49
|
+
type: "boolean",
|
|
50
|
+
},
|
|
51
|
+
classFields: {
|
|
52
|
+
type: "boolean",
|
|
53
|
+
},
|
|
54
|
+
onlyDeclarations: {
|
|
55
|
+
type: "boolean",
|
|
56
|
+
},
|
|
57
|
+
ignoreDestructuring: {
|
|
58
|
+
type: "boolean",
|
|
59
|
+
},
|
|
60
|
+
},
|
|
61
|
+
additionalProperties: false,
|
|
62
|
+
},
|
|
63
|
+
],
|
|
64
|
+
messages: {
|
|
65
|
+
notMatch:
|
|
66
|
+
"Identifier '{{name}}' does not match the pattern '{{pattern}}'.",
|
|
67
|
+
notMatchPrivate:
|
|
68
|
+
"Identifier '#{{name}}' does not match the pattern '{{pattern}}'.",
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
|
|
72
|
+
create(context) {
|
|
73
|
+
//--------------------------------------------------------------------------
|
|
74
|
+
// Options
|
|
75
|
+
//--------------------------------------------------------------------------
|
|
76
|
+
const [
|
|
77
|
+
pattern,
|
|
78
|
+
{
|
|
79
|
+
classFields: checkClassFields,
|
|
80
|
+
ignoreDestructuring,
|
|
81
|
+
onlyDeclarations,
|
|
82
|
+
properties: checkProperties,
|
|
83
|
+
},
|
|
84
|
+
] = context.options;
|
|
85
|
+
const regexp = new RegExp(pattern, "u");
|
|
86
|
+
|
|
87
|
+
const sourceCode = context.sourceCode;
|
|
88
|
+
let globalScope;
|
|
89
|
+
|
|
90
|
+
//--------------------------------------------------------------------------
|
|
91
|
+
// Helpers
|
|
92
|
+
//--------------------------------------------------------------------------
|
|
93
|
+
|
|
94
|
+
// contains reported nodes to avoid reporting twice on destructuring with shorthand notation
|
|
95
|
+
const reportedNodes = new Set();
|
|
96
|
+
const ALLOWED_PARENT_TYPES = new Set([
|
|
97
|
+
"CallExpression",
|
|
98
|
+
"NewExpression",
|
|
99
|
+
]);
|
|
100
|
+
const DECLARATION_TYPES = new Set([
|
|
101
|
+
"FunctionDeclaration",
|
|
102
|
+
"VariableDeclarator",
|
|
103
|
+
]);
|
|
104
|
+
const IMPORT_TYPES = new Set([
|
|
105
|
+
"ImportSpecifier",
|
|
106
|
+
"ImportNamespaceSpecifier",
|
|
107
|
+
"ImportDefaultSpecifier",
|
|
108
|
+
]);
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Checks whether the given node represents a reference to a global variable that is not declared in the source code.
|
|
112
|
+
* These identifiers will be allowed, as it is assumed that user has no control over the names of external global variables.
|
|
113
|
+
* @param {ASTNode} node `Identifier` node to check.
|
|
114
|
+
* @returns {boolean} `true` if the node is a reference to a global variable.
|
|
115
|
+
*/
|
|
116
|
+
function isReferenceToGlobalVariable(node) {
|
|
117
|
+
const variable = globalScope.set.get(node.name);
|
|
118
|
+
|
|
119
|
+
return (
|
|
120
|
+
variable &&
|
|
121
|
+
variable.defs.length === 0 &&
|
|
122
|
+
variable.references.some(ref => ref.identifier === node)
|
|
123
|
+
);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Checks if a string matches the provided pattern
|
|
128
|
+
* @param {string} name The string to check.
|
|
129
|
+
* @returns {boolean} if the string is a match
|
|
130
|
+
* @private
|
|
131
|
+
*/
|
|
132
|
+
function isInvalid(name) {
|
|
133
|
+
return !regexp.test(name);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Checks if a parent of a node is an ObjectPattern.
|
|
138
|
+
* @param {ASTNode} node The node to check.
|
|
139
|
+
* @returns {boolean} if the node is inside an ObjectPattern
|
|
140
|
+
* @private
|
|
141
|
+
*/
|
|
142
|
+
function isInsideObjectPattern(node) {
|
|
143
|
+
let { parent } = node;
|
|
144
|
+
|
|
145
|
+
while (parent) {
|
|
146
|
+
if (parent.type === "ObjectPattern") {
|
|
147
|
+
return true;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
parent = parent.parent;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
return false;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* Verifies if we should report an error or not based on the effective
|
|
158
|
+
* parent node and the identifier name.
|
|
159
|
+
* @param {ASTNode} effectiveParent The effective parent node of the node to be reported
|
|
160
|
+
* @param {string} name The identifier name of the identifier node
|
|
161
|
+
* @returns {boolean} whether an error should be reported or not
|
|
162
|
+
*/
|
|
163
|
+
function shouldReport(effectiveParent, name) {
|
|
164
|
+
return (
|
|
165
|
+
(!onlyDeclarations ||
|
|
166
|
+
DECLARATION_TYPES.has(effectiveParent.type)) &&
|
|
167
|
+
!ALLOWED_PARENT_TYPES.has(effectiveParent.type) &&
|
|
168
|
+
isInvalid(name)
|
|
169
|
+
);
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* Reports an AST node as a rule violation.
|
|
174
|
+
* @param {ASTNode} node The node to report.
|
|
175
|
+
* @returns {void}
|
|
176
|
+
* @private
|
|
177
|
+
*/
|
|
178
|
+
function report(node) {
|
|
179
|
+
/*
|
|
180
|
+
* We used the range instead of the node because it's possible
|
|
181
|
+
* for the same identifier to be represented by two different
|
|
182
|
+
* nodes, with the most clear example being shorthand properties:
|
|
183
|
+
* { foo }
|
|
184
|
+
* In this case, "foo" is represented by one node for the name
|
|
185
|
+
* and one for the value. The only way to know they are the same
|
|
186
|
+
* is to look at the range.
|
|
187
|
+
*/
|
|
188
|
+
if (!reportedNodes.has(node.range.toString())) {
|
|
189
|
+
const messageId =
|
|
190
|
+
node.type === "PrivateIdentifier"
|
|
191
|
+
? "notMatchPrivate"
|
|
192
|
+
: "notMatch";
|
|
193
|
+
|
|
194
|
+
context.report({
|
|
195
|
+
node,
|
|
196
|
+
messageId,
|
|
197
|
+
data: {
|
|
198
|
+
name: node.name,
|
|
199
|
+
pattern,
|
|
200
|
+
},
|
|
201
|
+
});
|
|
202
|
+
reportedNodes.add(node.range.toString());
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
return {
|
|
207
|
+
Program(node) {
|
|
208
|
+
globalScope = sourceCode.getScope(node);
|
|
209
|
+
},
|
|
210
|
+
|
|
211
|
+
Identifier(node) {
|
|
212
|
+
const name = node.name,
|
|
213
|
+
parent = node.parent,
|
|
214
|
+
effectiveParent =
|
|
215
|
+
parent.type === "MemberExpression"
|
|
216
|
+
? parent.parent
|
|
217
|
+
: parent;
|
|
218
|
+
|
|
219
|
+
if (
|
|
220
|
+
isReferenceToGlobalVariable(node) ||
|
|
221
|
+
astUtils.isImportAttributeKey(node)
|
|
222
|
+
) {
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
if (parent.type === "MemberExpression") {
|
|
227
|
+
if (!checkProperties) {
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
// Always check object names
|
|
232
|
+
if (
|
|
233
|
+
parent.object.type === "Identifier" &&
|
|
234
|
+
parent.object.name === name
|
|
235
|
+
) {
|
|
236
|
+
if (isInvalid(name)) {
|
|
237
|
+
report(node);
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
// Report AssignmentExpressions left side's assigned variable id
|
|
241
|
+
} else if (
|
|
242
|
+
effectiveParent.type === "AssignmentExpression" &&
|
|
243
|
+
effectiveParent.left.type === "MemberExpression" &&
|
|
244
|
+
effectiveParent.left.property.name === node.name
|
|
245
|
+
) {
|
|
246
|
+
if (isInvalid(name)) {
|
|
247
|
+
report(node);
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
// Report AssignmentExpressions only if they are the left side of the assignment
|
|
251
|
+
} else if (
|
|
252
|
+
effectiveParent.type === "AssignmentExpression" &&
|
|
253
|
+
effectiveParent.right.type !== "MemberExpression"
|
|
254
|
+
) {
|
|
255
|
+
if (isInvalid(name)) {
|
|
256
|
+
report(node);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
// For https://github.com/eslint/eslint/issues/15123
|
|
261
|
+
} else if (
|
|
262
|
+
parent.type === "Property" &&
|
|
263
|
+
parent.parent.type === "ObjectExpression" &&
|
|
264
|
+
parent.key === node &&
|
|
265
|
+
!parent.computed
|
|
266
|
+
) {
|
|
267
|
+
if (checkProperties && isInvalid(name)) {
|
|
268
|
+
report(node);
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
/*
|
|
272
|
+
* Properties have their own rules, and
|
|
273
|
+
* AssignmentPattern nodes can be treated like Properties:
|
|
274
|
+
* e.g.: const { no_camelcased = false } = bar;
|
|
275
|
+
*/
|
|
276
|
+
} else if (
|
|
277
|
+
parent.type === "Property" ||
|
|
278
|
+
parent.type === "AssignmentPattern"
|
|
279
|
+
) {
|
|
280
|
+
if (
|
|
281
|
+
parent.parent &&
|
|
282
|
+
parent.parent.type === "ObjectPattern"
|
|
283
|
+
) {
|
|
284
|
+
if (
|
|
285
|
+
!ignoreDestructuring &&
|
|
286
|
+
parent.shorthand &&
|
|
287
|
+
parent.value.left &&
|
|
288
|
+
isInvalid(name)
|
|
289
|
+
) {
|
|
290
|
+
report(node);
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
const assignmentKeyEqualsValue =
|
|
294
|
+
parent.key.name === parent.value.name;
|
|
295
|
+
|
|
296
|
+
// prevent checking righthand side of destructured object
|
|
297
|
+
if (!assignmentKeyEqualsValue && parent.key === node) {
|
|
298
|
+
return;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
const valueIsInvalid =
|
|
302
|
+
parent.value.name && isInvalid(name);
|
|
303
|
+
|
|
304
|
+
// ignore destructuring if the option is set, unless a new identifier is created
|
|
305
|
+
if (
|
|
306
|
+
valueIsInvalid &&
|
|
307
|
+
!(assignmentKeyEqualsValue && ignoreDestructuring)
|
|
308
|
+
) {
|
|
309
|
+
report(node);
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
// never check properties or always ignore destructuring
|
|
314
|
+
if (
|
|
315
|
+
(!checkProperties && !parent.computed) ||
|
|
316
|
+
(ignoreDestructuring && isInsideObjectPattern(node))
|
|
317
|
+
) {
|
|
318
|
+
return;
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
// don't check right hand side of AssignmentExpression to prevent duplicate warnings
|
|
322
|
+
if (
|
|
323
|
+
parent.right !== node &&
|
|
324
|
+
shouldReport(effectiveParent, name)
|
|
325
|
+
) {
|
|
326
|
+
report(node);
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
// Check if it's an import specifier
|
|
330
|
+
} else if (IMPORT_TYPES.has(parent.type)) {
|
|
331
|
+
// Report only if the local imported identifier is invalid
|
|
332
|
+
if (
|
|
333
|
+
parent.local &&
|
|
334
|
+
parent.local.name === node.name &&
|
|
335
|
+
isInvalid(name)
|
|
336
|
+
) {
|
|
337
|
+
report(node);
|
|
338
|
+
}
|
|
339
|
+
} else if (parent.type === "PropertyDefinition") {
|
|
340
|
+
if (checkClassFields && isInvalid(name)) {
|
|
341
|
+
report(node);
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
// Report anything that is invalid that isn't a CallExpression
|
|
345
|
+
} else if (shouldReport(effectiveParent, name)) {
|
|
346
|
+
report(node);
|
|
347
|
+
}
|
|
348
|
+
},
|
|
349
|
+
|
|
350
|
+
PrivateIdentifier(node) {
|
|
351
|
+
const isClassField = node.parent.type === "PropertyDefinition";
|
|
352
|
+
|
|
353
|
+
if (isClassField && !checkClassFields) {
|
|
354
|
+
return;
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
if (isInvalid(node.name)) {
|
|
358
|
+
report(node);
|
|
359
|
+
}
|
|
360
|
+
},
|
|
361
|
+
};
|
|
362
|
+
},
|
|
363
|
+
};
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview enforce the location of arrow function bodies
|
|
3
|
+
* @author Sharmila Jesupaul
|
|
4
|
+
* @deprecated in ESLint v8.53.0
|
|
5
|
+
*/
|
|
6
|
+
"use strict";
|
|
7
|
+
|
|
8
|
+
const { isCommentToken, isNotOpeningParenToken } = require("./utils/ast-utils");
|
|
9
|
+
|
|
10
|
+
//------------------------------------------------------------------------------
|
|
11
|
+
// Rule Definition
|
|
12
|
+
//------------------------------------------------------------------------------
|
|
13
|
+
/** @type {import('../types').Rule.RuleModule} */
|
|
14
|
+
module.exports = {
|
|
15
|
+
meta: {
|
|
16
|
+
deprecated: {
|
|
17
|
+
message: "Formatting rules are being moved out of ESLint core.",
|
|
18
|
+
url: "https://eslint.org/blog/2023/10/deprecating-formatting-rules/",
|
|
19
|
+
deprecatedSince: "8.53.0",
|
|
20
|
+
availableUntil: "11.0.0",
|
|
21
|
+
replacedBy: [
|
|
22
|
+
{
|
|
23
|
+
message:
|
|
24
|
+
"ESLint Stylistic now maintains deprecated stylistic core rules.",
|
|
25
|
+
url: "https://eslint.style/guide/migration",
|
|
26
|
+
plugin: {
|
|
27
|
+
name: "@stylistic/eslint-plugin",
|
|
28
|
+
url: "https://eslint.style",
|
|
29
|
+
},
|
|
30
|
+
rule: {
|
|
31
|
+
name: "implicit-arrow-linebreak",
|
|
32
|
+
url: "https://eslint.style/rules/implicit-arrow-linebreak",
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
],
|
|
36
|
+
},
|
|
37
|
+
type: "layout",
|
|
38
|
+
|
|
39
|
+
docs: {
|
|
40
|
+
description: "Enforce the location of arrow function bodies",
|
|
41
|
+
recommended: false,
|
|
42
|
+
url: "https://eslint.org/docs/latest/rules/implicit-arrow-linebreak",
|
|
43
|
+
},
|
|
44
|
+
|
|
45
|
+
fixable: "whitespace",
|
|
46
|
+
|
|
47
|
+
schema: [
|
|
48
|
+
{
|
|
49
|
+
enum: ["beside", "below"],
|
|
50
|
+
},
|
|
51
|
+
],
|
|
52
|
+
messages: {
|
|
53
|
+
expected: "Expected a linebreak before this expression.",
|
|
54
|
+
unexpected: "Expected no linebreak before this expression.",
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
|
|
58
|
+
create(context) {
|
|
59
|
+
const sourceCode = context.sourceCode;
|
|
60
|
+
const option = context.options[0] || "beside";
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Validates the location of an arrow function body
|
|
64
|
+
* @param {ASTNode} node The arrow function body
|
|
65
|
+
* @returns {void}
|
|
66
|
+
*/
|
|
67
|
+
function validateExpression(node) {
|
|
68
|
+
if (node.body.type === "BlockStatement") {
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
const arrowToken = sourceCode.getTokenBefore(
|
|
73
|
+
node.body,
|
|
74
|
+
isNotOpeningParenToken,
|
|
75
|
+
);
|
|
76
|
+
const firstTokenOfBody = sourceCode.getTokenAfter(arrowToken);
|
|
77
|
+
|
|
78
|
+
if (
|
|
79
|
+
arrowToken.loc.end.line === firstTokenOfBody.loc.start.line &&
|
|
80
|
+
option === "below"
|
|
81
|
+
) {
|
|
82
|
+
context.report({
|
|
83
|
+
node: firstTokenOfBody,
|
|
84
|
+
messageId: "expected",
|
|
85
|
+
fix: fixer =>
|
|
86
|
+
fixer.insertTextBefore(firstTokenOfBody, "\n"),
|
|
87
|
+
});
|
|
88
|
+
} else if (
|
|
89
|
+
arrowToken.loc.end.line !== firstTokenOfBody.loc.start.line &&
|
|
90
|
+
option === "beside"
|
|
91
|
+
) {
|
|
92
|
+
context.report({
|
|
93
|
+
node: firstTokenOfBody,
|
|
94
|
+
messageId: "unexpected",
|
|
95
|
+
fix(fixer) {
|
|
96
|
+
if (
|
|
97
|
+
sourceCode.getFirstTokenBetween(
|
|
98
|
+
arrowToken,
|
|
99
|
+
firstTokenOfBody,
|
|
100
|
+
{
|
|
101
|
+
includeComments: true,
|
|
102
|
+
filter: isCommentToken,
|
|
103
|
+
},
|
|
104
|
+
)
|
|
105
|
+
) {
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
return fixer.replaceTextRange(
|
|
110
|
+
[arrowToken.range[1], firstTokenOfBody.range[0]],
|
|
111
|
+
" ",
|
|
112
|
+
);
|
|
113
|
+
},
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
//----------------------------------------------------------------------
|
|
119
|
+
// Public
|
|
120
|
+
//----------------------------------------------------------------------
|
|
121
|
+
return {
|
|
122
|
+
ArrowFunctionExpression: node => validateExpression(node),
|
|
123
|
+
};
|
|
124
|
+
},
|
|
125
|
+
};
|