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,418 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Rule to require braces in arrow function body.
|
|
3
|
+
* @author Alberto Rodríguez
|
|
4
|
+
*/
|
|
5
|
+
"use strict";
|
|
6
|
+
|
|
7
|
+
//------------------------------------------------------------------------------
|
|
8
|
+
// Requirements
|
|
9
|
+
//------------------------------------------------------------------------------
|
|
10
|
+
|
|
11
|
+
const astUtils = require("./utils/ast-utils");
|
|
12
|
+
|
|
13
|
+
//------------------------------------------------------------------------------
|
|
14
|
+
// Rule Definition
|
|
15
|
+
//------------------------------------------------------------------------------
|
|
16
|
+
|
|
17
|
+
/** @type {import('../types').Rule.RuleModule} */
|
|
18
|
+
module.exports = {
|
|
19
|
+
meta: {
|
|
20
|
+
type: "suggestion",
|
|
21
|
+
|
|
22
|
+
defaultOptions: ["as-needed"],
|
|
23
|
+
|
|
24
|
+
docs: {
|
|
25
|
+
description: "Require braces around arrow function bodies",
|
|
26
|
+
recommended: false,
|
|
27
|
+
frozen: true,
|
|
28
|
+
url: "https://eslint.org/docs/latest/rules/arrow-body-style",
|
|
29
|
+
},
|
|
30
|
+
|
|
31
|
+
schema: {
|
|
32
|
+
anyOf: [
|
|
33
|
+
{
|
|
34
|
+
type: "array",
|
|
35
|
+
items: [
|
|
36
|
+
{
|
|
37
|
+
enum: ["always", "never"],
|
|
38
|
+
},
|
|
39
|
+
],
|
|
40
|
+
minItems: 0,
|
|
41
|
+
maxItems: 1,
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
type: "array",
|
|
45
|
+
items: [
|
|
46
|
+
{
|
|
47
|
+
enum: ["as-needed"],
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
type: "object",
|
|
51
|
+
properties: {
|
|
52
|
+
requireReturnForObjectLiteral: {
|
|
53
|
+
type: "boolean",
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
additionalProperties: false,
|
|
57
|
+
},
|
|
58
|
+
],
|
|
59
|
+
minItems: 0,
|
|
60
|
+
maxItems: 2,
|
|
61
|
+
},
|
|
62
|
+
],
|
|
63
|
+
},
|
|
64
|
+
|
|
65
|
+
fixable: "code",
|
|
66
|
+
|
|
67
|
+
messages: {
|
|
68
|
+
unexpectedOtherBlock:
|
|
69
|
+
"Unexpected block statement surrounding arrow body.",
|
|
70
|
+
unexpectedEmptyBlock:
|
|
71
|
+
"Unexpected block statement surrounding arrow body; put a value of `undefined` immediately after the `=>`.",
|
|
72
|
+
unexpectedObjectBlock:
|
|
73
|
+
"Unexpected block statement surrounding arrow body; parenthesize the returned value and move it immediately after the `=>`.",
|
|
74
|
+
unexpectedSingleBlock:
|
|
75
|
+
"Unexpected block statement surrounding arrow body; move the returned value immediately after the `=>`.",
|
|
76
|
+
expectedBlock: "Expected block statement surrounding arrow body.",
|
|
77
|
+
},
|
|
78
|
+
},
|
|
79
|
+
|
|
80
|
+
create(context) {
|
|
81
|
+
const options = context.options;
|
|
82
|
+
const always = options[0] === "always";
|
|
83
|
+
const asNeeded = options[0] === "as-needed";
|
|
84
|
+
const never = options[0] === "never";
|
|
85
|
+
const requireReturnForObjectLiteral =
|
|
86
|
+
options[1] && options[1].requireReturnForObjectLiteral;
|
|
87
|
+
const sourceCode = context.sourceCode;
|
|
88
|
+
let funcInfo = null;
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Checks whether the given node has ASI problem or not.
|
|
92
|
+
* @param {Token} token The token to check.
|
|
93
|
+
* @returns {boolean} `true` if it changes semantics if `;` or `}` followed by the token are removed.
|
|
94
|
+
*/
|
|
95
|
+
function hasASIProblem(token) {
|
|
96
|
+
return (
|
|
97
|
+
token &&
|
|
98
|
+
token.type === "Punctuator" &&
|
|
99
|
+
/^[([/`+-]/u.test(token.value)
|
|
100
|
+
);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Gets the closing parenthesis by the given node.
|
|
105
|
+
* @param {ASTNode} node first node after an opening parenthesis.
|
|
106
|
+
* @returns {Token} The found closing parenthesis token.
|
|
107
|
+
*/
|
|
108
|
+
function findClosingParen(node) {
|
|
109
|
+
let nodeToCheck = node;
|
|
110
|
+
|
|
111
|
+
while (!astUtils.isParenthesised(sourceCode, nodeToCheck)) {
|
|
112
|
+
nodeToCheck = nodeToCheck.parent;
|
|
113
|
+
}
|
|
114
|
+
return sourceCode.getTokenAfter(nodeToCheck);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Check whether the node is inside of a for loop's init
|
|
119
|
+
* @param {ASTNode} node node is inside for loop
|
|
120
|
+
* @returns {boolean} `true` if the node is inside of a for loop, else `false`
|
|
121
|
+
*/
|
|
122
|
+
function isInsideForLoopInitializer(node) {
|
|
123
|
+
if (node && node.parent) {
|
|
124
|
+
if (
|
|
125
|
+
node.parent.type === "ForStatement" &&
|
|
126
|
+
node.parent.init === node
|
|
127
|
+
) {
|
|
128
|
+
return true;
|
|
129
|
+
}
|
|
130
|
+
return isInsideForLoopInitializer(node.parent);
|
|
131
|
+
}
|
|
132
|
+
return false;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Determines whether a arrow function body needs braces
|
|
137
|
+
* @param {ASTNode} node The arrow function node.
|
|
138
|
+
* @returns {void}
|
|
139
|
+
*/
|
|
140
|
+
function validate(node) {
|
|
141
|
+
const arrowBody = node.body;
|
|
142
|
+
|
|
143
|
+
if (arrowBody.type === "BlockStatement") {
|
|
144
|
+
const blockBody = arrowBody.body;
|
|
145
|
+
|
|
146
|
+
if (blockBody.length !== 1 && !never) {
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
if (
|
|
151
|
+
asNeeded &&
|
|
152
|
+
requireReturnForObjectLiteral &&
|
|
153
|
+
blockBody[0].type === "ReturnStatement" &&
|
|
154
|
+
blockBody[0].argument &&
|
|
155
|
+
blockBody[0].argument.type === "ObjectExpression"
|
|
156
|
+
) {
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
if (
|
|
161
|
+
never ||
|
|
162
|
+
(asNeeded && blockBody[0].type === "ReturnStatement")
|
|
163
|
+
) {
|
|
164
|
+
let messageId;
|
|
165
|
+
|
|
166
|
+
if (blockBody.length === 0) {
|
|
167
|
+
messageId = "unexpectedEmptyBlock";
|
|
168
|
+
} else if (
|
|
169
|
+
blockBody.length > 1 ||
|
|
170
|
+
blockBody[0].type !== "ReturnStatement"
|
|
171
|
+
) {
|
|
172
|
+
messageId = "unexpectedOtherBlock";
|
|
173
|
+
} else if (blockBody[0].argument === null) {
|
|
174
|
+
messageId = "unexpectedSingleBlock";
|
|
175
|
+
} else if (
|
|
176
|
+
astUtils.isOpeningBraceToken(
|
|
177
|
+
sourceCode.getFirstToken(blockBody[0], { skip: 1 }),
|
|
178
|
+
)
|
|
179
|
+
) {
|
|
180
|
+
messageId = "unexpectedObjectBlock";
|
|
181
|
+
} else {
|
|
182
|
+
messageId = "unexpectedSingleBlock";
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
context.report({
|
|
186
|
+
node,
|
|
187
|
+
loc: arrowBody.loc,
|
|
188
|
+
messageId,
|
|
189
|
+
fix(fixer) {
|
|
190
|
+
const fixes = [];
|
|
191
|
+
|
|
192
|
+
if (
|
|
193
|
+
blockBody.length !== 1 ||
|
|
194
|
+
blockBody[0].type !== "ReturnStatement" ||
|
|
195
|
+
!blockBody[0].argument ||
|
|
196
|
+
hasASIProblem(
|
|
197
|
+
sourceCode.getTokenAfter(arrowBody),
|
|
198
|
+
)
|
|
199
|
+
) {
|
|
200
|
+
return fixes;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
const openingBrace =
|
|
204
|
+
sourceCode.getFirstToken(arrowBody);
|
|
205
|
+
const closingBrace =
|
|
206
|
+
sourceCode.getLastToken(arrowBody);
|
|
207
|
+
const firstValueToken = sourceCode.getFirstToken(
|
|
208
|
+
blockBody[0],
|
|
209
|
+
1,
|
|
210
|
+
);
|
|
211
|
+
const lastValueToken = sourceCode.getLastToken(
|
|
212
|
+
blockBody[0],
|
|
213
|
+
);
|
|
214
|
+
const commentsExist =
|
|
215
|
+
sourceCode.commentsExistBetween(
|
|
216
|
+
openingBrace,
|
|
217
|
+
firstValueToken,
|
|
218
|
+
) ||
|
|
219
|
+
sourceCode.commentsExistBetween(
|
|
220
|
+
lastValueToken,
|
|
221
|
+
closingBrace,
|
|
222
|
+
);
|
|
223
|
+
|
|
224
|
+
/*
|
|
225
|
+
* Remove tokens around the return value.
|
|
226
|
+
* If comments don't exist, remove extra spaces as well.
|
|
227
|
+
*/
|
|
228
|
+
if (commentsExist) {
|
|
229
|
+
fixes.push(
|
|
230
|
+
fixer.remove(openingBrace),
|
|
231
|
+
fixer.remove(closingBrace),
|
|
232
|
+
fixer.remove(
|
|
233
|
+
sourceCode.getTokenAfter(openingBrace),
|
|
234
|
+
), // return keyword
|
|
235
|
+
);
|
|
236
|
+
} else {
|
|
237
|
+
fixes.push(
|
|
238
|
+
fixer.removeRange([
|
|
239
|
+
openingBrace.range[0],
|
|
240
|
+
firstValueToken.range[0],
|
|
241
|
+
]),
|
|
242
|
+
fixer.removeRange([
|
|
243
|
+
lastValueToken.range[1],
|
|
244
|
+
closingBrace.range[1],
|
|
245
|
+
]),
|
|
246
|
+
);
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
/*
|
|
250
|
+
* If the first token of the return value is `{` or the return value is a sequence expression,
|
|
251
|
+
* enclose the return value by parentheses to avoid syntax error.
|
|
252
|
+
*/
|
|
253
|
+
if (
|
|
254
|
+
astUtils.isOpeningBraceToken(firstValueToken) ||
|
|
255
|
+
blockBody[0].argument.type ===
|
|
256
|
+
"SequenceExpression" ||
|
|
257
|
+
(funcInfo.hasInOperator &&
|
|
258
|
+
isInsideForLoopInitializer(node))
|
|
259
|
+
) {
|
|
260
|
+
if (
|
|
261
|
+
!astUtils.isParenthesised(
|
|
262
|
+
sourceCode,
|
|
263
|
+
blockBody[0].argument,
|
|
264
|
+
)
|
|
265
|
+
) {
|
|
266
|
+
fixes.push(
|
|
267
|
+
fixer.insertTextBefore(
|
|
268
|
+
firstValueToken,
|
|
269
|
+
"(",
|
|
270
|
+
),
|
|
271
|
+
fixer.insertTextAfter(
|
|
272
|
+
lastValueToken,
|
|
273
|
+
")",
|
|
274
|
+
),
|
|
275
|
+
);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
/*
|
|
280
|
+
* If the last token of the return statement is semicolon, remove it.
|
|
281
|
+
* Non-block arrow body is an expression, not a statement.
|
|
282
|
+
*/
|
|
283
|
+
if (astUtils.isSemicolonToken(lastValueToken)) {
|
|
284
|
+
fixes.push(fixer.remove(lastValueToken));
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
return fixes;
|
|
288
|
+
},
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
} else {
|
|
292
|
+
if (
|
|
293
|
+
always ||
|
|
294
|
+
(asNeeded &&
|
|
295
|
+
requireReturnForObjectLiteral &&
|
|
296
|
+
arrowBody.type === "ObjectExpression")
|
|
297
|
+
) {
|
|
298
|
+
context.report({
|
|
299
|
+
node,
|
|
300
|
+
loc: arrowBody.loc,
|
|
301
|
+
messageId: "expectedBlock",
|
|
302
|
+
fix(fixer) {
|
|
303
|
+
const fixes = [];
|
|
304
|
+
const arrowToken = sourceCode.getTokenBefore(
|
|
305
|
+
arrowBody,
|
|
306
|
+
astUtils.isArrowToken,
|
|
307
|
+
);
|
|
308
|
+
const [
|
|
309
|
+
firstTokenAfterArrow,
|
|
310
|
+
secondTokenAfterArrow,
|
|
311
|
+
] = sourceCode.getTokensAfter(arrowToken, {
|
|
312
|
+
count: 2,
|
|
313
|
+
});
|
|
314
|
+
const lastToken = sourceCode.getLastToken(node);
|
|
315
|
+
|
|
316
|
+
let parenthesisedObjectLiteral = null;
|
|
317
|
+
|
|
318
|
+
if (
|
|
319
|
+
astUtils.isOpeningParenToken(
|
|
320
|
+
firstTokenAfterArrow,
|
|
321
|
+
) &&
|
|
322
|
+
astUtils.isOpeningBraceToken(
|
|
323
|
+
secondTokenAfterArrow,
|
|
324
|
+
)
|
|
325
|
+
) {
|
|
326
|
+
const braceNode =
|
|
327
|
+
sourceCode.getNodeByRangeIndex(
|
|
328
|
+
secondTokenAfterArrow.range[0],
|
|
329
|
+
);
|
|
330
|
+
|
|
331
|
+
if (braceNode.type === "ObjectExpression") {
|
|
332
|
+
parenthesisedObjectLiteral = braceNode;
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
// If the value is object literal, remove parentheses which were forced by syntax.
|
|
337
|
+
if (parenthesisedObjectLiteral) {
|
|
338
|
+
const openingParenToken = firstTokenAfterArrow;
|
|
339
|
+
const openingBraceToken = secondTokenAfterArrow;
|
|
340
|
+
|
|
341
|
+
if (
|
|
342
|
+
astUtils.isTokenOnSameLine(
|
|
343
|
+
openingParenToken,
|
|
344
|
+
openingBraceToken,
|
|
345
|
+
)
|
|
346
|
+
) {
|
|
347
|
+
fixes.push(
|
|
348
|
+
fixer.replaceText(
|
|
349
|
+
openingParenToken,
|
|
350
|
+
"{return ",
|
|
351
|
+
),
|
|
352
|
+
);
|
|
353
|
+
} else {
|
|
354
|
+
// Avoid ASI
|
|
355
|
+
fixes.push(
|
|
356
|
+
fixer.replaceText(
|
|
357
|
+
openingParenToken,
|
|
358
|
+
"{",
|
|
359
|
+
),
|
|
360
|
+
fixer.insertTextBefore(
|
|
361
|
+
openingBraceToken,
|
|
362
|
+
"return ",
|
|
363
|
+
),
|
|
364
|
+
);
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
// Closing paren for the object doesn't have to be lastToken, e.g.: () => ({}).foo()
|
|
368
|
+
fixes.push(
|
|
369
|
+
fixer.remove(
|
|
370
|
+
findClosingParen(
|
|
371
|
+
parenthesisedObjectLiteral,
|
|
372
|
+
),
|
|
373
|
+
),
|
|
374
|
+
);
|
|
375
|
+
fixes.push(
|
|
376
|
+
fixer.insertTextAfter(lastToken, "}"),
|
|
377
|
+
);
|
|
378
|
+
} else {
|
|
379
|
+
fixes.push(
|
|
380
|
+
fixer.insertTextBefore(
|
|
381
|
+
firstTokenAfterArrow,
|
|
382
|
+
"{return ",
|
|
383
|
+
),
|
|
384
|
+
);
|
|
385
|
+
fixes.push(
|
|
386
|
+
fixer.insertTextAfter(lastToken, "}"),
|
|
387
|
+
);
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
return fixes;
|
|
391
|
+
},
|
|
392
|
+
});
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
return {
|
|
398
|
+
"BinaryExpression[operator='in']"() {
|
|
399
|
+
let info = funcInfo;
|
|
400
|
+
|
|
401
|
+
while (info) {
|
|
402
|
+
info.hasInOperator = true;
|
|
403
|
+
info = info.upper;
|
|
404
|
+
}
|
|
405
|
+
},
|
|
406
|
+
ArrowFunctionExpression() {
|
|
407
|
+
funcInfo = {
|
|
408
|
+
upper: funcInfo,
|
|
409
|
+
hasInOperator: false,
|
|
410
|
+
};
|
|
411
|
+
},
|
|
412
|
+
"ArrowFunctionExpression:exit"(node) {
|
|
413
|
+
validate(node);
|
|
414
|
+
funcInfo = funcInfo.upper;
|
|
415
|
+
},
|
|
416
|
+
};
|
|
417
|
+
},
|
|
418
|
+
};
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Rule to require parens in arrow function arguments.
|
|
3
|
+
* @author Jxck
|
|
4
|
+
* @deprecated in ESLint v8.53.0
|
|
5
|
+
*/
|
|
6
|
+
"use strict";
|
|
7
|
+
|
|
8
|
+
//------------------------------------------------------------------------------
|
|
9
|
+
// Requirements
|
|
10
|
+
//------------------------------------------------------------------------------
|
|
11
|
+
|
|
12
|
+
const astUtils = require("./utils/ast-utils");
|
|
13
|
+
|
|
14
|
+
//------------------------------------------------------------------------------
|
|
15
|
+
// Helpers
|
|
16
|
+
//------------------------------------------------------------------------------
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Determines if the given arrow function has block body.
|
|
20
|
+
* @param {ASTNode} node `ArrowFunctionExpression` node.
|
|
21
|
+
* @returns {boolean} `true` if the function has block body.
|
|
22
|
+
*/
|
|
23
|
+
function hasBlockBody(node) {
|
|
24
|
+
return node.body.type === "BlockStatement";
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
//------------------------------------------------------------------------------
|
|
28
|
+
// Rule Definition
|
|
29
|
+
//------------------------------------------------------------------------------
|
|
30
|
+
|
|
31
|
+
/** @type {import('../types').Rule.RuleModule} */
|
|
32
|
+
module.exports = {
|
|
33
|
+
meta: {
|
|
34
|
+
deprecated: {
|
|
35
|
+
message: "Formatting rules are being moved out of ESLint core.",
|
|
36
|
+
url: "https://eslint.org/blog/2023/10/deprecating-formatting-rules/",
|
|
37
|
+
deprecatedSince: "8.53.0",
|
|
38
|
+
availableUntil: "11.0.0",
|
|
39
|
+
replacedBy: [
|
|
40
|
+
{
|
|
41
|
+
message:
|
|
42
|
+
"ESLint Stylistic now maintains deprecated stylistic core rules.",
|
|
43
|
+
url: "https://eslint.style/guide/migration",
|
|
44
|
+
plugin: {
|
|
45
|
+
name: "@stylistic/eslint-plugin",
|
|
46
|
+
url: "https://eslint.style",
|
|
47
|
+
},
|
|
48
|
+
rule: {
|
|
49
|
+
name: "arrow-parens",
|
|
50
|
+
url: "https://eslint.style/rules/arrow-parens",
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
],
|
|
54
|
+
},
|
|
55
|
+
type: "layout",
|
|
56
|
+
|
|
57
|
+
docs: {
|
|
58
|
+
description: "Require parentheses around arrow function arguments",
|
|
59
|
+
recommended: false,
|
|
60
|
+
url: "https://eslint.org/docs/latest/rules/arrow-parens",
|
|
61
|
+
},
|
|
62
|
+
|
|
63
|
+
fixable: "code",
|
|
64
|
+
|
|
65
|
+
schema: [
|
|
66
|
+
{
|
|
67
|
+
enum: ["always", "as-needed"],
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
type: "object",
|
|
71
|
+
properties: {
|
|
72
|
+
requireForBlockBody: {
|
|
73
|
+
type: "boolean",
|
|
74
|
+
default: false,
|
|
75
|
+
},
|
|
76
|
+
},
|
|
77
|
+
additionalProperties: false,
|
|
78
|
+
},
|
|
79
|
+
],
|
|
80
|
+
|
|
81
|
+
messages: {
|
|
82
|
+
unexpectedParens:
|
|
83
|
+
"Unexpected parentheses around single function argument.",
|
|
84
|
+
expectedParens:
|
|
85
|
+
"Expected parentheses around arrow function argument.",
|
|
86
|
+
|
|
87
|
+
unexpectedParensInline:
|
|
88
|
+
"Unexpected parentheses around single function argument having a body with no curly braces.",
|
|
89
|
+
expectedParensBlock:
|
|
90
|
+
"Expected parentheses around arrow function argument having a body with curly braces.",
|
|
91
|
+
},
|
|
92
|
+
},
|
|
93
|
+
|
|
94
|
+
create(context) {
|
|
95
|
+
const asNeeded = context.options[0] === "as-needed";
|
|
96
|
+
const requireForBlockBody =
|
|
97
|
+
asNeeded &&
|
|
98
|
+
context.options[1] &&
|
|
99
|
+
context.options[1].requireForBlockBody === true;
|
|
100
|
+
|
|
101
|
+
const sourceCode = context.sourceCode;
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Finds opening paren of parameters for the given arrow function, if it exists.
|
|
105
|
+
* It is assumed that the given arrow function has exactly one parameter.
|
|
106
|
+
* @param {ASTNode} node `ArrowFunctionExpression` node.
|
|
107
|
+
* @returns {Token|null} the opening paren, or `null` if the given arrow function doesn't have parens of parameters.
|
|
108
|
+
*/
|
|
109
|
+
function findOpeningParenOfParams(node) {
|
|
110
|
+
const tokenBeforeParams = sourceCode.getTokenBefore(node.params[0]);
|
|
111
|
+
|
|
112
|
+
if (
|
|
113
|
+
tokenBeforeParams &&
|
|
114
|
+
astUtils.isOpeningParenToken(tokenBeforeParams) &&
|
|
115
|
+
node.range[0] <= tokenBeforeParams.range[0]
|
|
116
|
+
) {
|
|
117
|
+
return tokenBeforeParams;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
return null;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Finds closing paren of parameters for the given arrow function.
|
|
125
|
+
* It is assumed that the given arrow function has parens of parameters and that it has exactly one parameter.
|
|
126
|
+
* @param {ASTNode} node `ArrowFunctionExpression` node.
|
|
127
|
+
* @returns {Token} the closing paren of parameters.
|
|
128
|
+
*/
|
|
129
|
+
function getClosingParenOfParams(node) {
|
|
130
|
+
return sourceCode.getTokenAfter(
|
|
131
|
+
node.params[0],
|
|
132
|
+
astUtils.isClosingParenToken,
|
|
133
|
+
);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Determines whether the given arrow function has comments inside parens of parameters.
|
|
138
|
+
* It is assumed that the given arrow function has parens of parameters.
|
|
139
|
+
* @param {ASTNode} node `ArrowFunctionExpression` node.
|
|
140
|
+
* @param {Token} openingParen Opening paren of parameters.
|
|
141
|
+
* @returns {boolean} `true` if the function has at least one comment inside of parens of parameters.
|
|
142
|
+
*/
|
|
143
|
+
function hasCommentsInParensOfParams(node, openingParen) {
|
|
144
|
+
return sourceCode.commentsExistBetween(
|
|
145
|
+
openingParen,
|
|
146
|
+
getClosingParenOfParams(node),
|
|
147
|
+
);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Determines whether the given arrow function has unexpected tokens before opening paren of parameters,
|
|
152
|
+
* in which case it will be assumed that the existing parens of parameters are necessary.
|
|
153
|
+
* Only tokens within the range of the arrow function (tokens that are part of the arrow function) are taken into account.
|
|
154
|
+
* Example: <T>(a) => b
|
|
155
|
+
* @param {ASTNode} node `ArrowFunctionExpression` node.
|
|
156
|
+
* @param {Token} openingParen Opening paren of parameters.
|
|
157
|
+
* @returns {boolean} `true` if the function has at least one unexpected token.
|
|
158
|
+
*/
|
|
159
|
+
function hasUnexpectedTokensBeforeOpeningParen(node, openingParen) {
|
|
160
|
+
const expectedCount = node.async ? 1 : 0;
|
|
161
|
+
|
|
162
|
+
return (
|
|
163
|
+
sourceCode.getFirstToken(node, { skip: expectedCount }) !==
|
|
164
|
+
openingParen
|
|
165
|
+
);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
return {
|
|
169
|
+
"ArrowFunctionExpression[params.length=1]"(node) {
|
|
170
|
+
const shouldHaveParens =
|
|
171
|
+
!asNeeded || (requireForBlockBody && hasBlockBody(node));
|
|
172
|
+
const openingParen = findOpeningParenOfParams(node);
|
|
173
|
+
const hasParens = openingParen !== null;
|
|
174
|
+
const [param] = node.params;
|
|
175
|
+
|
|
176
|
+
if (shouldHaveParens && !hasParens) {
|
|
177
|
+
context.report({
|
|
178
|
+
node,
|
|
179
|
+
messageId: requireForBlockBody
|
|
180
|
+
? "expectedParensBlock"
|
|
181
|
+
: "expectedParens",
|
|
182
|
+
loc: param.loc,
|
|
183
|
+
*fix(fixer) {
|
|
184
|
+
yield fixer.insertTextBefore(param, "(");
|
|
185
|
+
yield fixer.insertTextAfter(param, ")");
|
|
186
|
+
},
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
if (
|
|
191
|
+
!shouldHaveParens &&
|
|
192
|
+
hasParens &&
|
|
193
|
+
param.type === "Identifier" &&
|
|
194
|
+
!param.typeAnnotation &&
|
|
195
|
+
!node.returnType &&
|
|
196
|
+
!hasCommentsInParensOfParams(node, openingParen) &&
|
|
197
|
+
!hasUnexpectedTokensBeforeOpeningParen(node, openingParen)
|
|
198
|
+
) {
|
|
199
|
+
context.report({
|
|
200
|
+
node,
|
|
201
|
+
messageId: requireForBlockBody
|
|
202
|
+
? "unexpectedParensInline"
|
|
203
|
+
: "unexpectedParens",
|
|
204
|
+
loc: param.loc,
|
|
205
|
+
*fix(fixer) {
|
|
206
|
+
const tokenBeforeOpeningParen =
|
|
207
|
+
sourceCode.getTokenBefore(openingParen);
|
|
208
|
+
const closingParen = getClosingParenOfParams(node);
|
|
209
|
+
|
|
210
|
+
if (
|
|
211
|
+
tokenBeforeOpeningParen &&
|
|
212
|
+
tokenBeforeOpeningParen.range[1] ===
|
|
213
|
+
openingParen.range[0] &&
|
|
214
|
+
!astUtils.canTokensBeAdjacent(
|
|
215
|
+
tokenBeforeOpeningParen,
|
|
216
|
+
sourceCode.getFirstToken(param),
|
|
217
|
+
)
|
|
218
|
+
) {
|
|
219
|
+
yield fixer.insertTextBefore(openingParen, " ");
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
// remove parens, whitespace inside parens, and possible trailing comma
|
|
223
|
+
yield fixer.removeRange([
|
|
224
|
+
openingParen.range[0],
|
|
225
|
+
param.range[0],
|
|
226
|
+
]);
|
|
227
|
+
yield fixer.removeRange([
|
|
228
|
+
param.range[1],
|
|
229
|
+
closingParen.range[1],
|
|
230
|
+
]);
|
|
231
|
+
},
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
},
|
|
235
|
+
};
|
|
236
|
+
},
|
|
237
|
+
};
|