bahlint 28.58.6934-dev-001
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 +354 -0
- package/bin/bahlint.js +267 -0
- package/bin/eslint.js +194 -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 +18 -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 +521 -0
- package/lib/config/config-loader.js +668 -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 +1989 -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,253 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Rule to disallow mixed binary operators.
|
|
3
|
+
* @author Toru Nagashima
|
|
4
|
+
* @deprecated in ESLint v8.53.0
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
"use strict";
|
|
8
|
+
|
|
9
|
+
//------------------------------------------------------------------------------
|
|
10
|
+
// Requirements
|
|
11
|
+
//------------------------------------------------------------------------------
|
|
12
|
+
|
|
13
|
+
const astUtils = require("./utils/ast-utils.js");
|
|
14
|
+
|
|
15
|
+
//------------------------------------------------------------------------------
|
|
16
|
+
// Helpers
|
|
17
|
+
//------------------------------------------------------------------------------
|
|
18
|
+
|
|
19
|
+
const ARITHMETIC_OPERATORS = ["+", "-", "*", "/", "%", "**"];
|
|
20
|
+
const BITWISE_OPERATORS = ["&", "|", "^", "~", "<<", ">>", ">>>"];
|
|
21
|
+
const COMPARISON_OPERATORS = ["==", "!=", "===", "!==", ">", ">=", "<", "<="];
|
|
22
|
+
const LOGICAL_OPERATORS = ["&&", "||"];
|
|
23
|
+
const RELATIONAL_OPERATORS = ["in", "instanceof"];
|
|
24
|
+
const TERNARY_OPERATOR = ["?:"];
|
|
25
|
+
const COALESCE_OPERATOR = ["??"];
|
|
26
|
+
const ALL_OPERATORS = [].concat(
|
|
27
|
+
ARITHMETIC_OPERATORS,
|
|
28
|
+
BITWISE_OPERATORS,
|
|
29
|
+
COMPARISON_OPERATORS,
|
|
30
|
+
LOGICAL_OPERATORS,
|
|
31
|
+
RELATIONAL_OPERATORS,
|
|
32
|
+
TERNARY_OPERATOR,
|
|
33
|
+
COALESCE_OPERATOR,
|
|
34
|
+
);
|
|
35
|
+
const DEFAULT_GROUPS = [
|
|
36
|
+
ARITHMETIC_OPERATORS,
|
|
37
|
+
BITWISE_OPERATORS,
|
|
38
|
+
COMPARISON_OPERATORS,
|
|
39
|
+
LOGICAL_OPERATORS,
|
|
40
|
+
RELATIONAL_OPERATORS,
|
|
41
|
+
];
|
|
42
|
+
const TARGET_NODE_TYPE = /^(?:Binary|Logical|Conditional)Expression$/u;
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Normalizes options.
|
|
46
|
+
* @param {Object|undefined} options A options object to normalize.
|
|
47
|
+
* @returns {Object} Normalized option object.
|
|
48
|
+
*/
|
|
49
|
+
function normalizeOptions(options = {}) {
|
|
50
|
+
const hasGroups = options.groups && options.groups.length > 0;
|
|
51
|
+
const groups = hasGroups ? options.groups : DEFAULT_GROUPS;
|
|
52
|
+
const allowSamePrecedence = options.allowSamePrecedence !== false;
|
|
53
|
+
|
|
54
|
+
return {
|
|
55
|
+
groups,
|
|
56
|
+
allowSamePrecedence,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Checks whether any group which includes both given operator exists or not.
|
|
62
|
+
* @param {Array<string[]>} groups A list of groups to check.
|
|
63
|
+
* @param {string} left An operator.
|
|
64
|
+
* @param {string} right Another operator.
|
|
65
|
+
* @returns {boolean} `true` if such group existed.
|
|
66
|
+
*/
|
|
67
|
+
function includesBothInAGroup(groups, left, right) {
|
|
68
|
+
return groups.some(group => group.includes(left) && group.includes(right));
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Checks whether the given node is a conditional expression and returns the test node else the left node.
|
|
73
|
+
* @param {ASTNode} node A node which can be a BinaryExpression or a LogicalExpression node.
|
|
74
|
+
* This parent node can be BinaryExpression, LogicalExpression
|
|
75
|
+
* , or a ConditionalExpression node
|
|
76
|
+
* @returns {ASTNode} node the appropriate node(left or test).
|
|
77
|
+
*/
|
|
78
|
+
function getChildNode(node) {
|
|
79
|
+
return node.type === "ConditionalExpression" ? node.test : node.left;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
//------------------------------------------------------------------------------
|
|
83
|
+
// Rule Definition
|
|
84
|
+
//------------------------------------------------------------------------------
|
|
85
|
+
|
|
86
|
+
/** @type {import('../types').Rule.RuleModule} */
|
|
87
|
+
module.exports = {
|
|
88
|
+
meta: {
|
|
89
|
+
deprecated: {
|
|
90
|
+
message: "Formatting rules are being moved out of ESLint core.",
|
|
91
|
+
url: "https://eslint.org/blog/2023/10/deprecating-formatting-rules/",
|
|
92
|
+
deprecatedSince: "8.53.0",
|
|
93
|
+
availableUntil: "11.0.0",
|
|
94
|
+
replacedBy: [
|
|
95
|
+
{
|
|
96
|
+
message:
|
|
97
|
+
"ESLint Stylistic now maintains deprecated stylistic core rules.",
|
|
98
|
+
url: "https://eslint.style/guide/migration",
|
|
99
|
+
plugin: {
|
|
100
|
+
name: "@stylistic/eslint-plugin",
|
|
101
|
+
url: "https://eslint.style",
|
|
102
|
+
},
|
|
103
|
+
rule: {
|
|
104
|
+
name: "no-mixed-operators",
|
|
105
|
+
url: "https://eslint.style/rules/no-mixed-operators",
|
|
106
|
+
},
|
|
107
|
+
},
|
|
108
|
+
],
|
|
109
|
+
},
|
|
110
|
+
type: "suggestion",
|
|
111
|
+
|
|
112
|
+
docs: {
|
|
113
|
+
description: "Disallow mixed binary operators",
|
|
114
|
+
recommended: false,
|
|
115
|
+
url: "https://eslint.org/docs/latest/rules/no-mixed-operators",
|
|
116
|
+
},
|
|
117
|
+
|
|
118
|
+
schema: [
|
|
119
|
+
{
|
|
120
|
+
type: "object",
|
|
121
|
+
properties: {
|
|
122
|
+
groups: {
|
|
123
|
+
type: "array",
|
|
124
|
+
items: {
|
|
125
|
+
type: "array",
|
|
126
|
+
items: { enum: ALL_OPERATORS },
|
|
127
|
+
minItems: 2,
|
|
128
|
+
uniqueItems: true,
|
|
129
|
+
},
|
|
130
|
+
uniqueItems: true,
|
|
131
|
+
},
|
|
132
|
+
allowSamePrecedence: {
|
|
133
|
+
type: "boolean",
|
|
134
|
+
default: true,
|
|
135
|
+
},
|
|
136
|
+
},
|
|
137
|
+
additionalProperties: false,
|
|
138
|
+
},
|
|
139
|
+
],
|
|
140
|
+
|
|
141
|
+
messages: {
|
|
142
|
+
unexpectedMixedOperator:
|
|
143
|
+
"Unexpected mix of '{{leftOperator}}' and '{{rightOperator}}'. Use parentheses to clarify the intended order of operations.",
|
|
144
|
+
},
|
|
145
|
+
},
|
|
146
|
+
|
|
147
|
+
create(context) {
|
|
148
|
+
const sourceCode = context.sourceCode;
|
|
149
|
+
const options = normalizeOptions(context.options[0]);
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Checks whether a given node should be ignored by options or not.
|
|
153
|
+
* @param {ASTNode} node A node to check. This is a BinaryExpression
|
|
154
|
+
* node or a LogicalExpression node. This parent node is one of
|
|
155
|
+
* them, too.
|
|
156
|
+
* @returns {boolean} `true` if the node should be ignored.
|
|
157
|
+
*/
|
|
158
|
+
function shouldIgnore(node) {
|
|
159
|
+
const a = node;
|
|
160
|
+
const b = node.parent;
|
|
161
|
+
|
|
162
|
+
return (
|
|
163
|
+
!includesBothInAGroup(
|
|
164
|
+
options.groups,
|
|
165
|
+
a.operator,
|
|
166
|
+
b.type === "ConditionalExpression" ? "?:" : b.operator,
|
|
167
|
+
) ||
|
|
168
|
+
(options.allowSamePrecedence &&
|
|
169
|
+
astUtils.getPrecedence(a) === astUtils.getPrecedence(b))
|
|
170
|
+
);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* Checks whether the operator of a given node is mixed with parent
|
|
175
|
+
* node's operator or not.
|
|
176
|
+
* @param {ASTNode} node A node to check. This is a BinaryExpression
|
|
177
|
+
* node or a LogicalExpression node. This parent node is one of
|
|
178
|
+
* them, too.
|
|
179
|
+
* @returns {boolean} `true` if the node was mixed.
|
|
180
|
+
*/
|
|
181
|
+
function isMixedWithParent(node) {
|
|
182
|
+
return (
|
|
183
|
+
node.operator !== node.parent.operator &&
|
|
184
|
+
!astUtils.isParenthesised(sourceCode, node)
|
|
185
|
+
);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* Gets the operator token of a given node.
|
|
190
|
+
* @param {ASTNode} node A node to check. This is a BinaryExpression
|
|
191
|
+
* node or a LogicalExpression node.
|
|
192
|
+
* @returns {Token} The operator token of the node.
|
|
193
|
+
*/
|
|
194
|
+
function getOperatorToken(node) {
|
|
195
|
+
return sourceCode.getTokenAfter(
|
|
196
|
+
getChildNode(node),
|
|
197
|
+
astUtils.isNotClosingParenToken,
|
|
198
|
+
);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/**
|
|
202
|
+
* Reports both the operator of a given node and the operator of the
|
|
203
|
+
* parent node.
|
|
204
|
+
* @param {ASTNode} node A node to check. This is a BinaryExpression
|
|
205
|
+
* node or a LogicalExpression node. This parent node is one of
|
|
206
|
+
* them, too.
|
|
207
|
+
* @returns {void}
|
|
208
|
+
*/
|
|
209
|
+
function reportBothOperators(node) {
|
|
210
|
+
const parent = node.parent;
|
|
211
|
+
const left = getChildNode(parent) === node ? node : parent;
|
|
212
|
+
const right = getChildNode(parent) !== node ? node : parent;
|
|
213
|
+
const data = {
|
|
214
|
+
leftOperator: left.operator || "?:",
|
|
215
|
+
rightOperator: right.operator || "?:",
|
|
216
|
+
};
|
|
217
|
+
|
|
218
|
+
context.report({
|
|
219
|
+
node: left,
|
|
220
|
+
loc: getOperatorToken(left).loc,
|
|
221
|
+
messageId: "unexpectedMixedOperator",
|
|
222
|
+
data,
|
|
223
|
+
});
|
|
224
|
+
context.report({
|
|
225
|
+
node: right,
|
|
226
|
+
loc: getOperatorToken(right).loc,
|
|
227
|
+
messageId: "unexpectedMixedOperator",
|
|
228
|
+
data,
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/**
|
|
233
|
+
* Checks between the operator of this node and the operator of the
|
|
234
|
+
* parent node.
|
|
235
|
+
* @param {ASTNode} node A node to check.
|
|
236
|
+
* @returns {void}
|
|
237
|
+
*/
|
|
238
|
+
function check(node) {
|
|
239
|
+
if (
|
|
240
|
+
TARGET_NODE_TYPE.test(node.parent.type) &&
|
|
241
|
+
isMixedWithParent(node) &&
|
|
242
|
+
!shouldIgnore(node)
|
|
243
|
+
) {
|
|
244
|
+
reportBothOperators(node);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
return {
|
|
249
|
+
BinaryExpression: check,
|
|
250
|
+
LogicalExpression: check,
|
|
251
|
+
};
|
|
252
|
+
},
|
|
253
|
+
};
|
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Rule to enforce grouped require statements for Node.JS
|
|
3
|
+
* @author Raphael Pigulla
|
|
4
|
+
* @deprecated in ESLint v7.0.0
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
"use strict";
|
|
8
|
+
|
|
9
|
+
//------------------------------------------------------------------------------
|
|
10
|
+
// Rule Definition
|
|
11
|
+
//------------------------------------------------------------------------------
|
|
12
|
+
|
|
13
|
+
/** @type {import('../types').Rule.RuleModule} */
|
|
14
|
+
module.exports = {
|
|
15
|
+
meta: {
|
|
16
|
+
deprecated: {
|
|
17
|
+
message: "Node.js rules were moved out of ESLint core.",
|
|
18
|
+
url: "https://eslint.org/docs/latest/use/migrating-to-7.0.0#deprecate-node-rules",
|
|
19
|
+
deprecatedSince: "7.0.0",
|
|
20
|
+
availableUntil: "11.0.0",
|
|
21
|
+
replacedBy: [
|
|
22
|
+
{
|
|
23
|
+
message:
|
|
24
|
+
"eslint-plugin-n now maintains deprecated Node.js-related rules.",
|
|
25
|
+
plugin: {
|
|
26
|
+
name: "eslint-plugin-n",
|
|
27
|
+
url: "https://github.com/eslint-community/eslint-plugin-n",
|
|
28
|
+
},
|
|
29
|
+
rule: {
|
|
30
|
+
name: "no-mixed-requires",
|
|
31
|
+
url: "https://github.com/eslint-community/eslint-plugin-n/tree/master/docs/rules/no-mixed-requires.md",
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
],
|
|
35
|
+
},
|
|
36
|
+
|
|
37
|
+
type: "suggestion",
|
|
38
|
+
|
|
39
|
+
docs: {
|
|
40
|
+
description:
|
|
41
|
+
"Disallow `require` calls to be mixed with regular variable declarations",
|
|
42
|
+
recommended: false,
|
|
43
|
+
url: "https://eslint.org/docs/latest/rules/no-mixed-requires",
|
|
44
|
+
},
|
|
45
|
+
|
|
46
|
+
schema: [
|
|
47
|
+
{
|
|
48
|
+
oneOf: [
|
|
49
|
+
{
|
|
50
|
+
type: "boolean",
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
type: "object",
|
|
54
|
+
properties: {
|
|
55
|
+
grouping: {
|
|
56
|
+
type: "boolean",
|
|
57
|
+
},
|
|
58
|
+
allowCall: {
|
|
59
|
+
type: "boolean",
|
|
60
|
+
},
|
|
61
|
+
},
|
|
62
|
+
additionalProperties: false,
|
|
63
|
+
},
|
|
64
|
+
],
|
|
65
|
+
},
|
|
66
|
+
],
|
|
67
|
+
|
|
68
|
+
messages: {
|
|
69
|
+
noMixRequire: "Do not mix 'require' and other declarations.",
|
|
70
|
+
noMixCoreModuleFileComputed:
|
|
71
|
+
"Do not mix core, module, file and computed requires.",
|
|
72
|
+
},
|
|
73
|
+
},
|
|
74
|
+
|
|
75
|
+
create(context) {
|
|
76
|
+
const options = context.options[0];
|
|
77
|
+
let grouping = false,
|
|
78
|
+
allowCall = false;
|
|
79
|
+
|
|
80
|
+
if (typeof options === "object") {
|
|
81
|
+
grouping = options.grouping;
|
|
82
|
+
allowCall = options.allowCall;
|
|
83
|
+
} else {
|
|
84
|
+
grouping = !!options;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Returns the list of built-in modules.
|
|
89
|
+
* @returns {string[]} An array of built-in Node.js modules.
|
|
90
|
+
*/
|
|
91
|
+
function getBuiltinModules() {
|
|
92
|
+
/*
|
|
93
|
+
* This list is generated using:
|
|
94
|
+
* `require("repl")._builtinLibs.concat('repl').sort()`
|
|
95
|
+
* This particular list is as per nodejs v0.12.2 and iojs v0.7.1
|
|
96
|
+
*/
|
|
97
|
+
return [
|
|
98
|
+
"assert",
|
|
99
|
+
"buffer",
|
|
100
|
+
"child_process",
|
|
101
|
+
"cluster",
|
|
102
|
+
"crypto",
|
|
103
|
+
"dgram",
|
|
104
|
+
"dns",
|
|
105
|
+
"domain",
|
|
106
|
+
"events",
|
|
107
|
+
"fs",
|
|
108
|
+
"http",
|
|
109
|
+
"https",
|
|
110
|
+
"net",
|
|
111
|
+
"os",
|
|
112
|
+
"path",
|
|
113
|
+
"punycode",
|
|
114
|
+
"querystring",
|
|
115
|
+
"readline",
|
|
116
|
+
"repl",
|
|
117
|
+
"smalloc",
|
|
118
|
+
"stream",
|
|
119
|
+
"string_decoder",
|
|
120
|
+
"tls",
|
|
121
|
+
"tty",
|
|
122
|
+
"url",
|
|
123
|
+
"util",
|
|
124
|
+
"v8",
|
|
125
|
+
"vm",
|
|
126
|
+
"zlib",
|
|
127
|
+
];
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
const BUILTIN_MODULES = getBuiltinModules();
|
|
131
|
+
|
|
132
|
+
const DECL_REQUIRE = "require",
|
|
133
|
+
DECL_UNINITIALIZED = "uninitialized",
|
|
134
|
+
DECL_OTHER = "other";
|
|
135
|
+
|
|
136
|
+
const REQ_CORE = "core",
|
|
137
|
+
REQ_FILE = "file",
|
|
138
|
+
REQ_MODULE = "module",
|
|
139
|
+
REQ_COMPUTED = "computed";
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Determines the type of a declaration statement.
|
|
143
|
+
* @param {ASTNode} initExpression The init node of the VariableDeclarator.
|
|
144
|
+
* @returns {string} The type of declaration represented by the expression.
|
|
145
|
+
*/
|
|
146
|
+
function getDeclarationType(initExpression) {
|
|
147
|
+
if (!initExpression) {
|
|
148
|
+
// "var x;"
|
|
149
|
+
return DECL_UNINITIALIZED;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
if (
|
|
153
|
+
initExpression.type === "CallExpression" &&
|
|
154
|
+
initExpression.callee.type === "Identifier" &&
|
|
155
|
+
initExpression.callee.name === "require"
|
|
156
|
+
) {
|
|
157
|
+
// "var x = require('util');"
|
|
158
|
+
return DECL_REQUIRE;
|
|
159
|
+
}
|
|
160
|
+
if (
|
|
161
|
+
allowCall &&
|
|
162
|
+
initExpression.type === "CallExpression" &&
|
|
163
|
+
initExpression.callee.type === "CallExpression"
|
|
164
|
+
) {
|
|
165
|
+
// "var x = require('diagnose')('sub-module');"
|
|
166
|
+
return getDeclarationType(initExpression.callee);
|
|
167
|
+
}
|
|
168
|
+
if (initExpression.type === "MemberExpression") {
|
|
169
|
+
// "var x = require('glob').Glob;"
|
|
170
|
+
return getDeclarationType(initExpression.object);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
// "var x = 42;"
|
|
174
|
+
return DECL_OTHER;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* Determines the type of module that is loaded via require.
|
|
179
|
+
* @param {ASTNode} initExpression The init node of the VariableDeclarator.
|
|
180
|
+
* @returns {string} The module type.
|
|
181
|
+
*/
|
|
182
|
+
function inferModuleType(initExpression) {
|
|
183
|
+
if (initExpression.type === "MemberExpression") {
|
|
184
|
+
// "var x = require('glob').Glob;"
|
|
185
|
+
return inferModuleType(initExpression.object);
|
|
186
|
+
}
|
|
187
|
+
if (initExpression.arguments.length === 0) {
|
|
188
|
+
// "var x = require();"
|
|
189
|
+
return REQ_COMPUTED;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
const arg = initExpression.arguments[0];
|
|
193
|
+
|
|
194
|
+
if (arg.type !== "Literal" || typeof arg.value !== "string") {
|
|
195
|
+
// "var x = require(42);"
|
|
196
|
+
return REQ_COMPUTED;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
if (BUILTIN_MODULES.includes(arg.value)) {
|
|
200
|
+
// "var fs = require('fs');"
|
|
201
|
+
return REQ_CORE;
|
|
202
|
+
}
|
|
203
|
+
if (/^\.{0,2}\//u.test(arg.value)) {
|
|
204
|
+
// "var utils = require('./utils');"
|
|
205
|
+
return REQ_FILE;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
// "var async = require('async');"
|
|
209
|
+
return REQ_MODULE;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* Check if the list of variable declarations is mixed, i.e. whether it
|
|
214
|
+
* contains both require and other declarations.
|
|
215
|
+
* @param {ASTNode} declarations The list of VariableDeclarators.
|
|
216
|
+
* @returns {boolean} True if the declarations are mixed, false if not.
|
|
217
|
+
*/
|
|
218
|
+
function isMixed(declarations) {
|
|
219
|
+
const contains = {};
|
|
220
|
+
|
|
221
|
+
declarations.forEach(declaration => {
|
|
222
|
+
const type = getDeclarationType(declaration.init);
|
|
223
|
+
|
|
224
|
+
contains[type] = true;
|
|
225
|
+
});
|
|
226
|
+
|
|
227
|
+
return !!(
|
|
228
|
+
contains[DECL_REQUIRE] &&
|
|
229
|
+
(contains[DECL_UNINITIALIZED] || contains[DECL_OTHER])
|
|
230
|
+
);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
/**
|
|
234
|
+
* Check if all require declarations in the given list are of the same
|
|
235
|
+
* type.
|
|
236
|
+
* @param {ASTNode} declarations The list of VariableDeclarators.
|
|
237
|
+
* @returns {boolean} True if the declarations are grouped, false if not.
|
|
238
|
+
*/
|
|
239
|
+
function isGrouped(declarations) {
|
|
240
|
+
const found = {};
|
|
241
|
+
|
|
242
|
+
declarations.forEach(declaration => {
|
|
243
|
+
if (getDeclarationType(declaration.init) === DECL_REQUIRE) {
|
|
244
|
+
found[inferModuleType(declaration.init)] = true;
|
|
245
|
+
}
|
|
246
|
+
});
|
|
247
|
+
|
|
248
|
+
return Object.keys(found).length <= 1;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
return {
|
|
252
|
+
VariableDeclaration(node) {
|
|
253
|
+
if (isMixed(node.declarations)) {
|
|
254
|
+
context.report({
|
|
255
|
+
node,
|
|
256
|
+
messageId: "noMixRequire",
|
|
257
|
+
});
|
|
258
|
+
} else if (grouping && !isGrouped(node.declarations)) {
|
|
259
|
+
context.report({
|
|
260
|
+
node,
|
|
261
|
+
messageId: "noMixCoreModuleFileComputed",
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
},
|
|
265
|
+
};
|
|
266
|
+
},
|
|
267
|
+
};
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Disallow mixed spaces and tabs for indentation
|
|
3
|
+
* @author Jary Niebur
|
|
4
|
+
* @deprecated in ESLint v8.53.0
|
|
5
|
+
*/
|
|
6
|
+
"use strict";
|
|
7
|
+
|
|
8
|
+
//------------------------------------------------------------------------------
|
|
9
|
+
// Rule Definition
|
|
10
|
+
//------------------------------------------------------------------------------
|
|
11
|
+
|
|
12
|
+
/** @type {import('../types').Rule.RuleModule} */
|
|
13
|
+
module.exports = {
|
|
14
|
+
meta: {
|
|
15
|
+
deprecated: {
|
|
16
|
+
message: "Formatting rules are being moved out of ESLint core.",
|
|
17
|
+
url: "https://eslint.org/blog/2023/10/deprecating-formatting-rules/",
|
|
18
|
+
deprecatedSince: "8.53.0",
|
|
19
|
+
availableUntil: "11.0.0",
|
|
20
|
+
replacedBy: [
|
|
21
|
+
{
|
|
22
|
+
message:
|
|
23
|
+
"ESLint Stylistic now maintains deprecated stylistic core rules.",
|
|
24
|
+
url: "https://eslint.style/guide/migration",
|
|
25
|
+
plugin: {
|
|
26
|
+
name: "@stylistic/eslint-plugin",
|
|
27
|
+
url: "https://eslint.style",
|
|
28
|
+
},
|
|
29
|
+
rule: {
|
|
30
|
+
name: "no-mixed-spaces-and-tabs",
|
|
31
|
+
url: "https://eslint.style/rules/no-mixed-spaces-and-tabs",
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
],
|
|
35
|
+
},
|
|
36
|
+
type: "layout",
|
|
37
|
+
|
|
38
|
+
docs: {
|
|
39
|
+
description: "Disallow mixed spaces and tabs for indentation",
|
|
40
|
+
recommended: false,
|
|
41
|
+
url: "https://eslint.org/docs/latest/rules/no-mixed-spaces-and-tabs",
|
|
42
|
+
},
|
|
43
|
+
|
|
44
|
+
schema: [
|
|
45
|
+
{
|
|
46
|
+
enum: ["smart-tabs", true, false],
|
|
47
|
+
},
|
|
48
|
+
],
|
|
49
|
+
|
|
50
|
+
messages: {
|
|
51
|
+
mixedSpacesAndTabs: "Mixed spaces and tabs.",
|
|
52
|
+
},
|
|
53
|
+
},
|
|
54
|
+
|
|
55
|
+
create(context) {
|
|
56
|
+
const sourceCode = context.sourceCode;
|
|
57
|
+
|
|
58
|
+
let smartTabs;
|
|
59
|
+
|
|
60
|
+
switch (context.options[0]) {
|
|
61
|
+
case true: // Support old syntax, maybe add deprecation warning here
|
|
62
|
+
case "smart-tabs":
|
|
63
|
+
smartTabs = true;
|
|
64
|
+
break;
|
|
65
|
+
default:
|
|
66
|
+
smartTabs = false;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
//--------------------------------------------------------------------------
|
|
70
|
+
// Public
|
|
71
|
+
//--------------------------------------------------------------------------
|
|
72
|
+
|
|
73
|
+
return {
|
|
74
|
+
"Program:exit"(node) {
|
|
75
|
+
const lines = sourceCode.lines,
|
|
76
|
+
comments = sourceCode.getAllComments(),
|
|
77
|
+
ignoredCommentLines = new Set();
|
|
78
|
+
|
|
79
|
+
// Add all lines except the first ones.
|
|
80
|
+
comments.forEach(comment => {
|
|
81
|
+
for (
|
|
82
|
+
let i = comment.loc.start.line + 1;
|
|
83
|
+
i <= comment.loc.end.line;
|
|
84
|
+
i++
|
|
85
|
+
) {
|
|
86
|
+
ignoredCommentLines.add(i);
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
/*
|
|
91
|
+
* At least one space followed by a tab
|
|
92
|
+
* or the reverse before non-tab/-space
|
|
93
|
+
* characters begin.
|
|
94
|
+
*/
|
|
95
|
+
let regex = /^(?=( +|\t+))\1(?:\t| )/u;
|
|
96
|
+
|
|
97
|
+
if (smartTabs) {
|
|
98
|
+
/*
|
|
99
|
+
* At least one space followed by a tab
|
|
100
|
+
* before non-tab/-space characters begin.
|
|
101
|
+
*/
|
|
102
|
+
// eslint-disable-next-line regexp/no-empty-lookarounds-assertion -- False positive
|
|
103
|
+
regex = /^(?=(\t*))\1(?=( +))\2\t/u;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
lines.forEach((line, i) => {
|
|
107
|
+
const match = regex.exec(line);
|
|
108
|
+
|
|
109
|
+
if (match) {
|
|
110
|
+
const lineNumber = i + 1;
|
|
111
|
+
const loc = {
|
|
112
|
+
start: {
|
|
113
|
+
line: lineNumber,
|
|
114
|
+
column: match[0].length - 2,
|
|
115
|
+
},
|
|
116
|
+
end: {
|
|
117
|
+
line: lineNumber,
|
|
118
|
+
column: match[0].length,
|
|
119
|
+
},
|
|
120
|
+
};
|
|
121
|
+
|
|
122
|
+
if (!ignoredCommentLines.has(lineNumber)) {
|
|
123
|
+
const containingNode =
|
|
124
|
+
sourceCode.getNodeByRangeIndex(
|
|
125
|
+
sourceCode.getIndexFromLoc(loc.start),
|
|
126
|
+
);
|
|
127
|
+
|
|
128
|
+
if (
|
|
129
|
+
!(
|
|
130
|
+
containingNode &&
|
|
131
|
+
["Literal", "TemplateElement"].includes(
|
|
132
|
+
containingNode.type,
|
|
133
|
+
)
|
|
134
|
+
)
|
|
135
|
+
) {
|
|
136
|
+
context.report({
|
|
137
|
+
node,
|
|
138
|
+
loc,
|
|
139
|
+
messageId: "mixedSpacesAndTabs",
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
},
|
|
146
|
+
};
|
|
147
|
+
},
|
|
148
|
+
};
|