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,374 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Disallows or enforces spaces inside of parentheses.
|
|
3
|
+
* @author Jonathan Rajavuori
|
|
4
|
+
* @deprecated in ESLint v8.53.0
|
|
5
|
+
*/
|
|
6
|
+
"use strict";
|
|
7
|
+
|
|
8
|
+
const astUtils = require("./utils/ast-utils");
|
|
9
|
+
|
|
10
|
+
//------------------------------------------------------------------------------
|
|
11
|
+
// Rule Definition
|
|
12
|
+
//------------------------------------------------------------------------------
|
|
13
|
+
|
|
14
|
+
/** @type {import('../types').Rule.RuleModule} */
|
|
15
|
+
module.exports = {
|
|
16
|
+
meta: {
|
|
17
|
+
deprecated: {
|
|
18
|
+
message: "Formatting rules are being moved out of ESLint core.",
|
|
19
|
+
url: "https://eslint.org/blog/2023/10/deprecating-formatting-rules/",
|
|
20
|
+
deprecatedSince: "8.53.0",
|
|
21
|
+
availableUntil: "11.0.0",
|
|
22
|
+
replacedBy: [
|
|
23
|
+
{
|
|
24
|
+
message:
|
|
25
|
+
"ESLint Stylistic now maintains deprecated stylistic core rules.",
|
|
26
|
+
url: "https://eslint.style/guide/migration",
|
|
27
|
+
plugin: {
|
|
28
|
+
name: "@stylistic/eslint-plugin",
|
|
29
|
+
url: "https://eslint.style",
|
|
30
|
+
},
|
|
31
|
+
rule: {
|
|
32
|
+
name: "space-in-parens",
|
|
33
|
+
url: "https://eslint.style/rules/space-in-parens",
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
],
|
|
37
|
+
},
|
|
38
|
+
type: "layout",
|
|
39
|
+
|
|
40
|
+
docs: {
|
|
41
|
+
description: "Enforce consistent spacing inside parentheses",
|
|
42
|
+
recommended: false,
|
|
43
|
+
url: "https://eslint.org/docs/latest/rules/space-in-parens",
|
|
44
|
+
},
|
|
45
|
+
|
|
46
|
+
fixable: "whitespace",
|
|
47
|
+
|
|
48
|
+
schema: [
|
|
49
|
+
{
|
|
50
|
+
enum: ["always", "never"],
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
type: "object",
|
|
54
|
+
properties: {
|
|
55
|
+
exceptions: {
|
|
56
|
+
type: "array",
|
|
57
|
+
items: {
|
|
58
|
+
enum: ["{}", "[]", "()", "empty"],
|
|
59
|
+
},
|
|
60
|
+
uniqueItems: true,
|
|
61
|
+
},
|
|
62
|
+
},
|
|
63
|
+
additionalProperties: false,
|
|
64
|
+
},
|
|
65
|
+
],
|
|
66
|
+
|
|
67
|
+
messages: {
|
|
68
|
+
missingOpeningSpace: "There must be a space after this paren.",
|
|
69
|
+
missingClosingSpace: "There must be a space before this paren.",
|
|
70
|
+
rejectedOpeningSpace: "There should be no space after this paren.",
|
|
71
|
+
rejectedClosingSpace: "There should be no space before this paren.",
|
|
72
|
+
},
|
|
73
|
+
},
|
|
74
|
+
|
|
75
|
+
create(context) {
|
|
76
|
+
const ALWAYS = context.options[0] === "always",
|
|
77
|
+
exceptionsArrayOptions =
|
|
78
|
+
(context.options[1] && context.options[1].exceptions) || [],
|
|
79
|
+
options = {};
|
|
80
|
+
|
|
81
|
+
let exceptions;
|
|
82
|
+
|
|
83
|
+
if (exceptionsArrayOptions.length) {
|
|
84
|
+
options.braceException = exceptionsArrayOptions.includes("{}");
|
|
85
|
+
options.bracketException = exceptionsArrayOptions.includes("[]");
|
|
86
|
+
options.parenException = exceptionsArrayOptions.includes("()");
|
|
87
|
+
options.empty = exceptionsArrayOptions.includes("empty");
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Produces an object with the opener and closer exception values
|
|
92
|
+
* @returns {Object} `openers` and `closers` exception values
|
|
93
|
+
* @private
|
|
94
|
+
*/
|
|
95
|
+
function getExceptions() {
|
|
96
|
+
const openers = [],
|
|
97
|
+
closers = [];
|
|
98
|
+
|
|
99
|
+
if (options.braceException) {
|
|
100
|
+
openers.push("{");
|
|
101
|
+
closers.push("}");
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
if (options.bracketException) {
|
|
105
|
+
openers.push("[");
|
|
106
|
+
closers.push("]");
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
if (options.parenException) {
|
|
110
|
+
openers.push("(");
|
|
111
|
+
closers.push(")");
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
if (options.empty) {
|
|
115
|
+
openers.push(")");
|
|
116
|
+
closers.push("(");
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
return {
|
|
120
|
+
openers,
|
|
121
|
+
closers,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
//--------------------------------------------------------------------------
|
|
126
|
+
// Helpers
|
|
127
|
+
//--------------------------------------------------------------------------
|
|
128
|
+
const sourceCode = context.sourceCode;
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Determines if a token is one of the exceptions for the opener paren
|
|
132
|
+
* @param {Object} token The token to check
|
|
133
|
+
* @returns {boolean} True if the token is one of the exceptions for the opener paren
|
|
134
|
+
*/
|
|
135
|
+
function isOpenerException(token) {
|
|
136
|
+
return exceptions.openers.includes(token.value);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Determines if a token is one of the exceptions for the closer paren
|
|
141
|
+
* @param {Object} token The token to check
|
|
142
|
+
* @returns {boolean} True if the token is one of the exceptions for the closer paren
|
|
143
|
+
*/
|
|
144
|
+
function isCloserException(token) {
|
|
145
|
+
return exceptions.closers.includes(token.value);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* Determines if an opening paren is immediately followed by a required space
|
|
150
|
+
* @param {Object} openingParenToken The paren token
|
|
151
|
+
* @param {Object} tokenAfterOpeningParen The token after it
|
|
152
|
+
* @returns {boolean} True if the opening paren is missing a required space
|
|
153
|
+
*/
|
|
154
|
+
function openerMissingSpace(openingParenToken, tokenAfterOpeningParen) {
|
|
155
|
+
if (
|
|
156
|
+
sourceCode.isSpaceBetween(
|
|
157
|
+
openingParenToken,
|
|
158
|
+
tokenAfterOpeningParen,
|
|
159
|
+
)
|
|
160
|
+
) {
|
|
161
|
+
return false;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
if (
|
|
165
|
+
!options.empty &&
|
|
166
|
+
astUtils.isClosingParenToken(tokenAfterOpeningParen)
|
|
167
|
+
) {
|
|
168
|
+
return false;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
if (ALWAYS) {
|
|
172
|
+
return !isOpenerException(tokenAfterOpeningParen);
|
|
173
|
+
}
|
|
174
|
+
return isOpenerException(tokenAfterOpeningParen);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* Determines if an opening paren is immediately followed by a disallowed space
|
|
179
|
+
* @param {Object} openingParenToken The paren token
|
|
180
|
+
* @param {Object} tokenAfterOpeningParen The token after it
|
|
181
|
+
* @returns {boolean} True if the opening paren has a disallowed space
|
|
182
|
+
*/
|
|
183
|
+
function openerRejectsSpace(openingParenToken, tokenAfterOpeningParen) {
|
|
184
|
+
if (
|
|
185
|
+
!astUtils.isTokenOnSameLine(
|
|
186
|
+
openingParenToken,
|
|
187
|
+
tokenAfterOpeningParen,
|
|
188
|
+
)
|
|
189
|
+
) {
|
|
190
|
+
return false;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
if (tokenAfterOpeningParen.type === "Line") {
|
|
194
|
+
return false;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
if (
|
|
198
|
+
!sourceCode.isSpaceBetween(
|
|
199
|
+
openingParenToken,
|
|
200
|
+
tokenAfterOpeningParen,
|
|
201
|
+
)
|
|
202
|
+
) {
|
|
203
|
+
return false;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
if (ALWAYS) {
|
|
207
|
+
return isOpenerException(tokenAfterOpeningParen);
|
|
208
|
+
}
|
|
209
|
+
return !isOpenerException(tokenAfterOpeningParen);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* Determines if a closing paren is immediately preceded by a required space
|
|
214
|
+
* @param {Object} tokenBeforeClosingParen The token before the paren
|
|
215
|
+
* @param {Object} closingParenToken The paren token
|
|
216
|
+
* @returns {boolean} True if the closing paren is missing a required space
|
|
217
|
+
*/
|
|
218
|
+
function closerMissingSpace(
|
|
219
|
+
tokenBeforeClosingParen,
|
|
220
|
+
closingParenToken,
|
|
221
|
+
) {
|
|
222
|
+
if (
|
|
223
|
+
sourceCode.isSpaceBetween(
|
|
224
|
+
tokenBeforeClosingParen,
|
|
225
|
+
closingParenToken,
|
|
226
|
+
)
|
|
227
|
+
) {
|
|
228
|
+
return false;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
if (
|
|
232
|
+
!options.empty &&
|
|
233
|
+
astUtils.isOpeningParenToken(tokenBeforeClosingParen)
|
|
234
|
+
) {
|
|
235
|
+
return false;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
if (ALWAYS) {
|
|
239
|
+
return !isCloserException(tokenBeforeClosingParen);
|
|
240
|
+
}
|
|
241
|
+
return isCloserException(tokenBeforeClosingParen);
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
/**
|
|
245
|
+
* Determines if a closer paren is immediately preceded by a disallowed space
|
|
246
|
+
* @param {Object} tokenBeforeClosingParen The token before the paren
|
|
247
|
+
* @param {Object} closingParenToken The paren token
|
|
248
|
+
* @returns {boolean} True if the closing paren has a disallowed space
|
|
249
|
+
*/
|
|
250
|
+
function closerRejectsSpace(
|
|
251
|
+
tokenBeforeClosingParen,
|
|
252
|
+
closingParenToken,
|
|
253
|
+
) {
|
|
254
|
+
if (
|
|
255
|
+
!astUtils.isTokenOnSameLine(
|
|
256
|
+
tokenBeforeClosingParen,
|
|
257
|
+
closingParenToken,
|
|
258
|
+
)
|
|
259
|
+
) {
|
|
260
|
+
return false;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
if (
|
|
264
|
+
!sourceCode.isSpaceBetween(
|
|
265
|
+
tokenBeforeClosingParen,
|
|
266
|
+
closingParenToken,
|
|
267
|
+
)
|
|
268
|
+
) {
|
|
269
|
+
return false;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
if (ALWAYS) {
|
|
273
|
+
return isCloserException(tokenBeforeClosingParen);
|
|
274
|
+
}
|
|
275
|
+
return !isCloserException(tokenBeforeClosingParen);
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
//--------------------------------------------------------------------------
|
|
279
|
+
// Public
|
|
280
|
+
//--------------------------------------------------------------------------
|
|
281
|
+
|
|
282
|
+
return {
|
|
283
|
+
Program: function checkParenSpaces(node) {
|
|
284
|
+
exceptions = getExceptions();
|
|
285
|
+
const tokens = sourceCode.tokensAndComments;
|
|
286
|
+
|
|
287
|
+
tokens.forEach((token, i) => {
|
|
288
|
+
const prevToken = tokens[i - 1];
|
|
289
|
+
const nextToken = tokens[i + 1];
|
|
290
|
+
|
|
291
|
+
// if token is not an opening or closing paren token, do nothing
|
|
292
|
+
if (
|
|
293
|
+
!astUtils.isOpeningParenToken(token) &&
|
|
294
|
+
!astUtils.isClosingParenToken(token)
|
|
295
|
+
) {
|
|
296
|
+
return;
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
// if token is an opening paren and is not followed by a required space
|
|
300
|
+
if (
|
|
301
|
+
token.value === "(" &&
|
|
302
|
+
openerMissingSpace(token, nextToken)
|
|
303
|
+
) {
|
|
304
|
+
context.report({
|
|
305
|
+
node,
|
|
306
|
+
loc: token.loc,
|
|
307
|
+
messageId: "missingOpeningSpace",
|
|
308
|
+
fix(fixer) {
|
|
309
|
+
return fixer.insertTextAfter(token, " ");
|
|
310
|
+
},
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
// if token is an opening paren and is followed by a disallowed space
|
|
315
|
+
if (
|
|
316
|
+
token.value === "(" &&
|
|
317
|
+
openerRejectsSpace(token, nextToken)
|
|
318
|
+
) {
|
|
319
|
+
context.report({
|
|
320
|
+
node,
|
|
321
|
+
loc: {
|
|
322
|
+
start: token.loc.end,
|
|
323
|
+
end: nextToken.loc.start,
|
|
324
|
+
},
|
|
325
|
+
messageId: "rejectedOpeningSpace",
|
|
326
|
+
fix(fixer) {
|
|
327
|
+
return fixer.removeRange([
|
|
328
|
+
token.range[1],
|
|
329
|
+
nextToken.range[0],
|
|
330
|
+
]);
|
|
331
|
+
},
|
|
332
|
+
});
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
// if token is a closing paren and is not preceded by a required space
|
|
336
|
+
if (
|
|
337
|
+
token.value === ")" &&
|
|
338
|
+
closerMissingSpace(prevToken, token)
|
|
339
|
+
) {
|
|
340
|
+
context.report({
|
|
341
|
+
node,
|
|
342
|
+
loc: token.loc,
|
|
343
|
+
messageId: "missingClosingSpace",
|
|
344
|
+
fix(fixer) {
|
|
345
|
+
return fixer.insertTextBefore(token, " ");
|
|
346
|
+
},
|
|
347
|
+
});
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
// if token is a closing paren and is preceded by a disallowed space
|
|
351
|
+
if (
|
|
352
|
+
token.value === ")" &&
|
|
353
|
+
closerRejectsSpace(prevToken, token)
|
|
354
|
+
) {
|
|
355
|
+
context.report({
|
|
356
|
+
node,
|
|
357
|
+
loc: {
|
|
358
|
+
start: prevToken.loc.end,
|
|
359
|
+
end: token.loc.start,
|
|
360
|
+
},
|
|
361
|
+
messageId: "rejectedClosingSpace",
|
|
362
|
+
fix(fixer) {
|
|
363
|
+
return fixer.removeRange([
|
|
364
|
+
prevToken.range[1],
|
|
365
|
+
token.range[0],
|
|
366
|
+
]);
|
|
367
|
+
},
|
|
368
|
+
});
|
|
369
|
+
}
|
|
370
|
+
});
|
|
371
|
+
},
|
|
372
|
+
};
|
|
373
|
+
},
|
|
374
|
+
};
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Require spaces around infix operators
|
|
3
|
+
* @author Michael Ficarra
|
|
4
|
+
* @deprecated in ESLint v8.53.0
|
|
5
|
+
*/
|
|
6
|
+
"use strict";
|
|
7
|
+
|
|
8
|
+
const { isEqToken } = require("./utils/ast-utils");
|
|
9
|
+
|
|
10
|
+
//------------------------------------------------------------------------------
|
|
11
|
+
// Rule Definition
|
|
12
|
+
//------------------------------------------------------------------------------
|
|
13
|
+
|
|
14
|
+
/** @type {import('../types').Rule.RuleModule} */
|
|
15
|
+
module.exports = {
|
|
16
|
+
meta: {
|
|
17
|
+
deprecated: {
|
|
18
|
+
message: "Formatting rules are being moved out of ESLint core.",
|
|
19
|
+
url: "https://eslint.org/blog/2023/10/deprecating-formatting-rules/",
|
|
20
|
+
deprecatedSince: "8.53.0",
|
|
21
|
+
availableUntil: "11.0.0",
|
|
22
|
+
replacedBy: [
|
|
23
|
+
{
|
|
24
|
+
message:
|
|
25
|
+
"ESLint Stylistic now maintains deprecated stylistic core rules.",
|
|
26
|
+
url: "https://eslint.style/guide/migration",
|
|
27
|
+
plugin: {
|
|
28
|
+
name: "@stylistic/eslint-plugin",
|
|
29
|
+
url: "https://eslint.style",
|
|
30
|
+
},
|
|
31
|
+
rule: {
|
|
32
|
+
name: "space-infix-ops",
|
|
33
|
+
url: "https://eslint.style/rules/space-infix-ops",
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
],
|
|
37
|
+
},
|
|
38
|
+
type: "layout",
|
|
39
|
+
|
|
40
|
+
docs: {
|
|
41
|
+
description: "Require spacing around infix operators",
|
|
42
|
+
recommended: false,
|
|
43
|
+
url: "https://eslint.org/docs/latest/rules/space-infix-ops",
|
|
44
|
+
},
|
|
45
|
+
|
|
46
|
+
fixable: "whitespace",
|
|
47
|
+
|
|
48
|
+
schema: [
|
|
49
|
+
{
|
|
50
|
+
type: "object",
|
|
51
|
+
properties: {
|
|
52
|
+
int32Hint: {
|
|
53
|
+
type: "boolean",
|
|
54
|
+
default: false,
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
additionalProperties: false,
|
|
58
|
+
},
|
|
59
|
+
],
|
|
60
|
+
|
|
61
|
+
messages: {
|
|
62
|
+
missingSpace: "Operator '{{operator}}' must be spaced.",
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
|
|
66
|
+
create(context) {
|
|
67
|
+
const int32Hint = context.options[0]
|
|
68
|
+
? context.options[0].int32Hint === true
|
|
69
|
+
: false;
|
|
70
|
+
const sourceCode = context.sourceCode;
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Returns the first token which violates the rule
|
|
74
|
+
* @param {ASTNode} left The left node of the main node
|
|
75
|
+
* @param {ASTNode} right The right node of the main node
|
|
76
|
+
* @param {string} op The operator of the main node
|
|
77
|
+
* @returns {Object} The violator token or null
|
|
78
|
+
* @private
|
|
79
|
+
*/
|
|
80
|
+
function getFirstNonSpacedToken(left, right, op) {
|
|
81
|
+
const operator = sourceCode.getFirstTokenBetween(
|
|
82
|
+
left,
|
|
83
|
+
right,
|
|
84
|
+
token => token.value === op,
|
|
85
|
+
);
|
|
86
|
+
const prev = sourceCode.getTokenBefore(operator);
|
|
87
|
+
const next = sourceCode.getTokenAfter(operator);
|
|
88
|
+
|
|
89
|
+
if (
|
|
90
|
+
!sourceCode.isSpaceBetween(prev, operator) ||
|
|
91
|
+
!sourceCode.isSpaceBetween(operator, next)
|
|
92
|
+
) {
|
|
93
|
+
return operator;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Reports an AST node as a rule violation
|
|
101
|
+
* @param {ASTNode} mainNode The node to report
|
|
102
|
+
* @param {Object} culpritToken The token which has a problem
|
|
103
|
+
* @returns {void}
|
|
104
|
+
* @private
|
|
105
|
+
*/
|
|
106
|
+
function report(mainNode, culpritToken) {
|
|
107
|
+
context.report({
|
|
108
|
+
node: mainNode,
|
|
109
|
+
loc: culpritToken.loc,
|
|
110
|
+
messageId: "missingSpace",
|
|
111
|
+
data: {
|
|
112
|
+
operator: culpritToken.value,
|
|
113
|
+
},
|
|
114
|
+
fix(fixer) {
|
|
115
|
+
const previousToken =
|
|
116
|
+
sourceCode.getTokenBefore(culpritToken);
|
|
117
|
+
const afterToken = sourceCode.getTokenAfter(culpritToken);
|
|
118
|
+
let fixString = "";
|
|
119
|
+
|
|
120
|
+
if (culpritToken.range[0] - previousToken.range[1] === 0) {
|
|
121
|
+
fixString = " ";
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
fixString += culpritToken.value;
|
|
125
|
+
|
|
126
|
+
if (afterToken.range[0] - culpritToken.range[1] === 0) {
|
|
127
|
+
fixString += " ";
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
return fixer.replaceText(culpritToken, fixString);
|
|
131
|
+
},
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Check if the node is binary then report
|
|
137
|
+
* @param {ASTNode} node node to evaluate
|
|
138
|
+
* @returns {void}
|
|
139
|
+
* @private
|
|
140
|
+
*/
|
|
141
|
+
function checkBinary(node) {
|
|
142
|
+
const leftNode = node.left.typeAnnotation
|
|
143
|
+
? node.left.typeAnnotation
|
|
144
|
+
: node.left;
|
|
145
|
+
const rightNode = node.right;
|
|
146
|
+
|
|
147
|
+
// search for = in AssignmentPattern nodes
|
|
148
|
+
const operator = node.operator || "=";
|
|
149
|
+
|
|
150
|
+
const nonSpacedNode = getFirstNonSpacedToken(
|
|
151
|
+
leftNode,
|
|
152
|
+
rightNode,
|
|
153
|
+
operator,
|
|
154
|
+
);
|
|
155
|
+
|
|
156
|
+
if (nonSpacedNode) {
|
|
157
|
+
if (!(int32Hint && sourceCode.getText(node).endsWith("|0"))) {
|
|
158
|
+
report(node, nonSpacedNode);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* Check if the node is conditional
|
|
165
|
+
* @param {ASTNode} node node to evaluate
|
|
166
|
+
* @returns {void}
|
|
167
|
+
* @private
|
|
168
|
+
*/
|
|
169
|
+
function checkConditional(node) {
|
|
170
|
+
const nonSpacedConsequentNode = getFirstNonSpacedToken(
|
|
171
|
+
node.test,
|
|
172
|
+
node.consequent,
|
|
173
|
+
"?",
|
|
174
|
+
);
|
|
175
|
+
const nonSpacedAlternateNode = getFirstNonSpacedToken(
|
|
176
|
+
node.consequent,
|
|
177
|
+
node.alternate,
|
|
178
|
+
":",
|
|
179
|
+
);
|
|
180
|
+
|
|
181
|
+
if (nonSpacedConsequentNode) {
|
|
182
|
+
report(node, nonSpacedConsequentNode);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
if (nonSpacedAlternateNode) {
|
|
186
|
+
report(node, nonSpacedAlternateNode);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* Check if the node is a variable
|
|
192
|
+
* @param {ASTNode} node node to evaluate
|
|
193
|
+
* @returns {void}
|
|
194
|
+
* @private
|
|
195
|
+
*/
|
|
196
|
+
function checkVar(node) {
|
|
197
|
+
const leftNode = node.id.typeAnnotation
|
|
198
|
+
? node.id.typeAnnotation
|
|
199
|
+
: node.id;
|
|
200
|
+
const rightNode = node.init;
|
|
201
|
+
|
|
202
|
+
if (rightNode) {
|
|
203
|
+
const nonSpacedNode = getFirstNonSpacedToken(
|
|
204
|
+
leftNode,
|
|
205
|
+
rightNode,
|
|
206
|
+
"=",
|
|
207
|
+
);
|
|
208
|
+
|
|
209
|
+
if (nonSpacedNode) {
|
|
210
|
+
report(node, nonSpacedNode);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
return {
|
|
216
|
+
AssignmentExpression: checkBinary,
|
|
217
|
+
AssignmentPattern: checkBinary,
|
|
218
|
+
BinaryExpression: checkBinary,
|
|
219
|
+
LogicalExpression: checkBinary,
|
|
220
|
+
ConditionalExpression: checkConditional,
|
|
221
|
+
VariableDeclarator: checkVar,
|
|
222
|
+
|
|
223
|
+
PropertyDefinition(node) {
|
|
224
|
+
if (!node.value) {
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
/*
|
|
229
|
+
* Because of computed properties and type annotations, some
|
|
230
|
+
* tokens may exist between `node.key` and `=`.
|
|
231
|
+
* Therefore, find the `=` from the right.
|
|
232
|
+
*/
|
|
233
|
+
const operatorToken = sourceCode.getTokenBefore(
|
|
234
|
+
node.value,
|
|
235
|
+
isEqToken,
|
|
236
|
+
);
|
|
237
|
+
const leftToken = sourceCode.getTokenBefore(operatorToken);
|
|
238
|
+
const rightToken = sourceCode.getTokenAfter(operatorToken);
|
|
239
|
+
|
|
240
|
+
if (
|
|
241
|
+
!sourceCode.isSpaceBetween(leftToken, operatorToken) ||
|
|
242
|
+
!sourceCode.isSpaceBetween(operatorToken, rightToken)
|
|
243
|
+
) {
|
|
244
|
+
report(node, operatorToken);
|
|
245
|
+
}
|
|
246
|
+
},
|
|
247
|
+
};
|
|
248
|
+
},
|
|
249
|
+
};
|