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,581 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Enforces empty lines around comments.
|
|
3
|
+
* @author Jamund Ferguson
|
|
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
|
+
* Return an array with any line numbers that are empty.
|
|
20
|
+
* @param {Array} lines An array of each line of the file.
|
|
21
|
+
* @returns {Array} An array of line numbers.
|
|
22
|
+
*/
|
|
23
|
+
function getEmptyLineNums(lines) {
|
|
24
|
+
const emptyLines = lines
|
|
25
|
+
.map((line, i) => ({
|
|
26
|
+
code: line.trim(),
|
|
27
|
+
num: i + 1,
|
|
28
|
+
}))
|
|
29
|
+
.filter(line => !line.code)
|
|
30
|
+
.map(line => line.num);
|
|
31
|
+
|
|
32
|
+
return emptyLines;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Return an array with any line numbers that contain comments.
|
|
37
|
+
* @param {Array} comments An array of comment tokens.
|
|
38
|
+
* @returns {Array} An array of line numbers.
|
|
39
|
+
*/
|
|
40
|
+
function getCommentLineNums(comments) {
|
|
41
|
+
const lines = [];
|
|
42
|
+
|
|
43
|
+
comments.forEach(token => {
|
|
44
|
+
const start = token.loc.start.line;
|
|
45
|
+
const end = token.loc.end.line;
|
|
46
|
+
|
|
47
|
+
lines.push(start, end);
|
|
48
|
+
});
|
|
49
|
+
return lines;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
//------------------------------------------------------------------------------
|
|
53
|
+
// Rule Definition
|
|
54
|
+
//------------------------------------------------------------------------------
|
|
55
|
+
|
|
56
|
+
/** @type {import('../types').Rule.RuleModule} */
|
|
57
|
+
module.exports = {
|
|
58
|
+
meta: {
|
|
59
|
+
deprecated: {
|
|
60
|
+
message: "Formatting rules are being moved out of ESLint core.",
|
|
61
|
+
url: "https://eslint.org/blog/2023/10/deprecating-formatting-rules/",
|
|
62
|
+
deprecatedSince: "8.53.0",
|
|
63
|
+
availableUntil: "11.0.0",
|
|
64
|
+
replacedBy: [
|
|
65
|
+
{
|
|
66
|
+
message:
|
|
67
|
+
"ESLint Stylistic now maintains deprecated stylistic core rules.",
|
|
68
|
+
url: "https://eslint.style/guide/migration",
|
|
69
|
+
plugin: {
|
|
70
|
+
name: "@stylistic/eslint-plugin",
|
|
71
|
+
url: "https://eslint.style",
|
|
72
|
+
},
|
|
73
|
+
rule: {
|
|
74
|
+
name: "lines-around-comment",
|
|
75
|
+
url: "https://eslint.style/rules/lines-around-comment",
|
|
76
|
+
},
|
|
77
|
+
},
|
|
78
|
+
],
|
|
79
|
+
},
|
|
80
|
+
type: "layout",
|
|
81
|
+
|
|
82
|
+
docs: {
|
|
83
|
+
description: "Require empty lines around comments",
|
|
84
|
+
recommended: false,
|
|
85
|
+
url: "https://eslint.org/docs/latest/rules/lines-around-comment",
|
|
86
|
+
},
|
|
87
|
+
|
|
88
|
+
fixable: "whitespace",
|
|
89
|
+
|
|
90
|
+
schema: [
|
|
91
|
+
{
|
|
92
|
+
type: "object",
|
|
93
|
+
properties: {
|
|
94
|
+
beforeBlockComment: {
|
|
95
|
+
type: "boolean",
|
|
96
|
+
default: true,
|
|
97
|
+
},
|
|
98
|
+
afterBlockComment: {
|
|
99
|
+
type: "boolean",
|
|
100
|
+
default: false,
|
|
101
|
+
},
|
|
102
|
+
beforeLineComment: {
|
|
103
|
+
type: "boolean",
|
|
104
|
+
default: false,
|
|
105
|
+
},
|
|
106
|
+
afterLineComment: {
|
|
107
|
+
type: "boolean",
|
|
108
|
+
default: false,
|
|
109
|
+
},
|
|
110
|
+
allowBlockStart: {
|
|
111
|
+
type: "boolean",
|
|
112
|
+
default: false,
|
|
113
|
+
},
|
|
114
|
+
allowBlockEnd: {
|
|
115
|
+
type: "boolean",
|
|
116
|
+
default: false,
|
|
117
|
+
},
|
|
118
|
+
allowClassStart: {
|
|
119
|
+
type: "boolean",
|
|
120
|
+
},
|
|
121
|
+
allowClassEnd: {
|
|
122
|
+
type: "boolean",
|
|
123
|
+
},
|
|
124
|
+
allowObjectStart: {
|
|
125
|
+
type: "boolean",
|
|
126
|
+
},
|
|
127
|
+
allowObjectEnd: {
|
|
128
|
+
type: "boolean",
|
|
129
|
+
},
|
|
130
|
+
allowArrayStart: {
|
|
131
|
+
type: "boolean",
|
|
132
|
+
},
|
|
133
|
+
allowArrayEnd: {
|
|
134
|
+
type: "boolean",
|
|
135
|
+
},
|
|
136
|
+
ignorePattern: {
|
|
137
|
+
type: "string",
|
|
138
|
+
},
|
|
139
|
+
applyDefaultIgnorePatterns: {
|
|
140
|
+
type: "boolean",
|
|
141
|
+
},
|
|
142
|
+
afterHashbangComment: {
|
|
143
|
+
type: "boolean",
|
|
144
|
+
default: false,
|
|
145
|
+
},
|
|
146
|
+
},
|
|
147
|
+
additionalProperties: false,
|
|
148
|
+
},
|
|
149
|
+
],
|
|
150
|
+
messages: {
|
|
151
|
+
after: "Expected line after comment.",
|
|
152
|
+
before: "Expected line before comment.",
|
|
153
|
+
},
|
|
154
|
+
},
|
|
155
|
+
|
|
156
|
+
create(context) {
|
|
157
|
+
const options = Object.assign({}, context.options[0]);
|
|
158
|
+
const ignorePattern = options.ignorePattern;
|
|
159
|
+
const defaultIgnoreRegExp = astUtils.COMMENTS_IGNORE_PATTERN;
|
|
160
|
+
const customIgnoreRegExp = new RegExp(ignorePattern, "u");
|
|
161
|
+
const applyDefaultIgnorePatterns =
|
|
162
|
+
options.applyDefaultIgnorePatterns !== false;
|
|
163
|
+
|
|
164
|
+
options.beforeBlockComment =
|
|
165
|
+
typeof options.beforeBlockComment !== "undefined"
|
|
166
|
+
? options.beforeBlockComment
|
|
167
|
+
: true;
|
|
168
|
+
|
|
169
|
+
const sourceCode = context.sourceCode;
|
|
170
|
+
|
|
171
|
+
const lines = sourceCode.lines,
|
|
172
|
+
numLines = lines.length + 1,
|
|
173
|
+
comments = sourceCode.getAllComments(),
|
|
174
|
+
commentLines = getCommentLineNums(comments),
|
|
175
|
+
emptyLines = getEmptyLineNums(lines),
|
|
176
|
+
commentAndEmptyLines = new Set(commentLines.concat(emptyLines));
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Returns whether or not comments are on lines starting with or ending with code
|
|
180
|
+
* @param {token} token The comment token to check.
|
|
181
|
+
* @returns {boolean} True if the comment is not alone.
|
|
182
|
+
*/
|
|
183
|
+
function codeAroundComment(token) {
|
|
184
|
+
let currentToken = token;
|
|
185
|
+
|
|
186
|
+
do {
|
|
187
|
+
currentToken = sourceCode.getTokenBefore(currentToken, {
|
|
188
|
+
includeComments: true,
|
|
189
|
+
});
|
|
190
|
+
} while (currentToken && astUtils.isCommentToken(currentToken));
|
|
191
|
+
|
|
192
|
+
if (
|
|
193
|
+
currentToken &&
|
|
194
|
+
astUtils.isTokenOnSameLine(currentToken, token)
|
|
195
|
+
) {
|
|
196
|
+
return true;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
currentToken = token;
|
|
200
|
+
do {
|
|
201
|
+
currentToken = sourceCode.getTokenAfter(currentToken, {
|
|
202
|
+
includeComments: true,
|
|
203
|
+
});
|
|
204
|
+
} while (currentToken && astUtils.isCommentToken(currentToken));
|
|
205
|
+
|
|
206
|
+
if (
|
|
207
|
+
currentToken &&
|
|
208
|
+
astUtils.isTokenOnSameLine(token, currentToken)
|
|
209
|
+
) {
|
|
210
|
+
return true;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
return false;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
/**
|
|
217
|
+
* Returns whether or not comments are inside a node type or not.
|
|
218
|
+
* @param {ASTNode} parent The Comment parent node.
|
|
219
|
+
* @param {string} nodeType The parent type to check against.
|
|
220
|
+
* @returns {boolean} True if the comment is inside nodeType.
|
|
221
|
+
*/
|
|
222
|
+
function isParentNodeType(parent, nodeType) {
|
|
223
|
+
return (
|
|
224
|
+
parent.type === nodeType ||
|
|
225
|
+
(parent.body && parent.body.type === nodeType) ||
|
|
226
|
+
(parent.consequent && parent.consequent.type === nodeType)
|
|
227
|
+
);
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* Returns the parent node that contains the given token.
|
|
232
|
+
* @param {token} token The token to check.
|
|
233
|
+
* @returns {ASTNode|null} The parent node that contains the given token.
|
|
234
|
+
*/
|
|
235
|
+
function getParentNodeOfToken(token) {
|
|
236
|
+
const node = sourceCode.getNodeByRangeIndex(token.range[0]);
|
|
237
|
+
|
|
238
|
+
/*
|
|
239
|
+
* For the purpose of this rule, the comment token is in a `StaticBlock` node only
|
|
240
|
+
* if it's inside the braces of that `StaticBlock` node.
|
|
241
|
+
*
|
|
242
|
+
* Example where this function returns `null`:
|
|
243
|
+
*
|
|
244
|
+
* static
|
|
245
|
+
* // comment
|
|
246
|
+
* {
|
|
247
|
+
* }
|
|
248
|
+
*
|
|
249
|
+
* Example where this function returns `StaticBlock` node:
|
|
250
|
+
*
|
|
251
|
+
* static
|
|
252
|
+
* {
|
|
253
|
+
* // comment
|
|
254
|
+
* }
|
|
255
|
+
*
|
|
256
|
+
*/
|
|
257
|
+
if (node && node.type === "StaticBlock") {
|
|
258
|
+
const openingBrace = sourceCode.getFirstToken(node, {
|
|
259
|
+
skip: 1,
|
|
260
|
+
}); // skip the `static` token
|
|
261
|
+
|
|
262
|
+
return token.range[0] >= openingBrace.range[0] ? node : null;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
return node;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
/**
|
|
269
|
+
* Returns whether or not comments are at the parent start or not.
|
|
270
|
+
* @param {token} token The Comment token.
|
|
271
|
+
* @param {string} nodeType The parent type to check against.
|
|
272
|
+
* @returns {boolean} True if the comment is at parent start.
|
|
273
|
+
*/
|
|
274
|
+
function isCommentAtParentStart(token, nodeType) {
|
|
275
|
+
const parent = getParentNodeOfToken(token);
|
|
276
|
+
|
|
277
|
+
if (parent && isParentNodeType(parent, nodeType)) {
|
|
278
|
+
let parentStartNodeOrToken = parent;
|
|
279
|
+
|
|
280
|
+
if (parent.type === "StaticBlock") {
|
|
281
|
+
parentStartNodeOrToken = sourceCode.getFirstToken(parent, {
|
|
282
|
+
skip: 1,
|
|
283
|
+
}); // opening brace of the static block
|
|
284
|
+
} else if (parent.type === "SwitchStatement") {
|
|
285
|
+
parentStartNodeOrToken = sourceCode.getTokenAfter(
|
|
286
|
+
parent.discriminant,
|
|
287
|
+
{
|
|
288
|
+
filter: astUtils.isOpeningBraceToken,
|
|
289
|
+
},
|
|
290
|
+
); // opening brace of the switch statement
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
return (
|
|
294
|
+
token.loc.start.line -
|
|
295
|
+
parentStartNodeOrToken.loc.start.line ===
|
|
296
|
+
1
|
|
297
|
+
);
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
return false;
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
/**
|
|
304
|
+
* Returns whether or not comments are at the parent end or not.
|
|
305
|
+
* @param {token} token The Comment token.
|
|
306
|
+
* @param {string} nodeType The parent type to check against.
|
|
307
|
+
* @returns {boolean} True if the comment is at parent end.
|
|
308
|
+
*/
|
|
309
|
+
function isCommentAtParentEnd(token, nodeType) {
|
|
310
|
+
const parent = getParentNodeOfToken(token);
|
|
311
|
+
|
|
312
|
+
return (
|
|
313
|
+
!!parent &&
|
|
314
|
+
isParentNodeType(parent, nodeType) &&
|
|
315
|
+
parent.loc.end.line - token.loc.end.line === 1
|
|
316
|
+
);
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
/**
|
|
320
|
+
* Returns whether or not comments are at the block start or not.
|
|
321
|
+
* @param {token} token The Comment token.
|
|
322
|
+
* @returns {boolean} True if the comment is at block start.
|
|
323
|
+
*/
|
|
324
|
+
function isCommentAtBlockStart(token) {
|
|
325
|
+
return (
|
|
326
|
+
isCommentAtParentStart(token, "ClassBody") ||
|
|
327
|
+
isCommentAtParentStart(token, "BlockStatement") ||
|
|
328
|
+
isCommentAtParentStart(token, "StaticBlock") ||
|
|
329
|
+
isCommentAtParentStart(token, "SwitchCase") ||
|
|
330
|
+
isCommentAtParentStart(token, "SwitchStatement")
|
|
331
|
+
);
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
/**
|
|
335
|
+
* Returns whether or not comments are at the block end or not.
|
|
336
|
+
* @param {token} token The Comment token.
|
|
337
|
+
* @returns {boolean} True if the comment is at block end.
|
|
338
|
+
*/
|
|
339
|
+
function isCommentAtBlockEnd(token) {
|
|
340
|
+
return (
|
|
341
|
+
isCommentAtParentEnd(token, "ClassBody") ||
|
|
342
|
+
isCommentAtParentEnd(token, "BlockStatement") ||
|
|
343
|
+
isCommentAtParentEnd(token, "StaticBlock") ||
|
|
344
|
+
isCommentAtParentEnd(token, "SwitchCase") ||
|
|
345
|
+
isCommentAtParentEnd(token, "SwitchStatement")
|
|
346
|
+
);
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
/**
|
|
350
|
+
* Returns whether or not comments are at the class start or not.
|
|
351
|
+
* @param {token} token The Comment token.
|
|
352
|
+
* @returns {boolean} True if the comment is at class start.
|
|
353
|
+
*/
|
|
354
|
+
function isCommentAtClassStart(token) {
|
|
355
|
+
return isCommentAtParentStart(token, "ClassBody");
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
/**
|
|
359
|
+
* Returns whether or not comments are at the class end or not.
|
|
360
|
+
* @param {token} token The Comment token.
|
|
361
|
+
* @returns {boolean} True if the comment is at class end.
|
|
362
|
+
*/
|
|
363
|
+
function isCommentAtClassEnd(token) {
|
|
364
|
+
return isCommentAtParentEnd(token, "ClassBody");
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
/**
|
|
368
|
+
* Returns whether or not comments are at the object start or not.
|
|
369
|
+
* @param {token} token The Comment token.
|
|
370
|
+
* @returns {boolean} True if the comment is at object start.
|
|
371
|
+
*/
|
|
372
|
+
function isCommentAtObjectStart(token) {
|
|
373
|
+
return (
|
|
374
|
+
isCommentAtParentStart(token, "ObjectExpression") ||
|
|
375
|
+
isCommentAtParentStart(token, "ObjectPattern")
|
|
376
|
+
);
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
/**
|
|
380
|
+
* Returns whether or not comments are at the object end or not.
|
|
381
|
+
* @param {token} token The Comment token.
|
|
382
|
+
* @returns {boolean} True if the comment is at object end.
|
|
383
|
+
*/
|
|
384
|
+
function isCommentAtObjectEnd(token) {
|
|
385
|
+
return (
|
|
386
|
+
isCommentAtParentEnd(token, "ObjectExpression") ||
|
|
387
|
+
isCommentAtParentEnd(token, "ObjectPattern")
|
|
388
|
+
);
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
/**
|
|
392
|
+
* Returns whether or not comments are at the array start or not.
|
|
393
|
+
* @param {token} token The Comment token.
|
|
394
|
+
* @returns {boolean} True if the comment is at array start.
|
|
395
|
+
*/
|
|
396
|
+
function isCommentAtArrayStart(token) {
|
|
397
|
+
return (
|
|
398
|
+
isCommentAtParentStart(token, "ArrayExpression") ||
|
|
399
|
+
isCommentAtParentStart(token, "ArrayPattern")
|
|
400
|
+
);
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
/**
|
|
404
|
+
* Returns whether or not comments are at the array end or not.
|
|
405
|
+
* @param {token} token The Comment token.
|
|
406
|
+
* @returns {boolean} True if the comment is at array end.
|
|
407
|
+
*/
|
|
408
|
+
function isCommentAtArrayEnd(token) {
|
|
409
|
+
return (
|
|
410
|
+
isCommentAtParentEnd(token, "ArrayExpression") ||
|
|
411
|
+
isCommentAtParentEnd(token, "ArrayPattern")
|
|
412
|
+
);
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
/**
|
|
416
|
+
* Checks if a comment token has lines around it (ignores inline comments)
|
|
417
|
+
* @param {token} token The Comment token.
|
|
418
|
+
* @param {Object} opts Options to determine the newline.
|
|
419
|
+
* @param {boolean} opts.after Should have a newline after this line.
|
|
420
|
+
* @param {boolean} opts.before Should have a newline before this line.
|
|
421
|
+
* @returns {void}
|
|
422
|
+
*/
|
|
423
|
+
function checkForEmptyLine(token, opts) {
|
|
424
|
+
if (
|
|
425
|
+
applyDefaultIgnorePatterns &&
|
|
426
|
+
defaultIgnoreRegExp.test(token.value)
|
|
427
|
+
) {
|
|
428
|
+
return;
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
if (ignorePattern && customIgnoreRegExp.test(token.value)) {
|
|
432
|
+
return;
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
let after = opts.after,
|
|
436
|
+
before = opts.before;
|
|
437
|
+
|
|
438
|
+
const prevLineNum = token.loc.start.line - 1,
|
|
439
|
+
nextLineNum = token.loc.end.line + 1,
|
|
440
|
+
commentIsNotAlone = codeAroundComment(token);
|
|
441
|
+
|
|
442
|
+
const blockStartAllowed =
|
|
443
|
+
options.allowBlockStart &&
|
|
444
|
+
isCommentAtBlockStart(token) &&
|
|
445
|
+
!(
|
|
446
|
+
options.allowClassStart === false &&
|
|
447
|
+
isCommentAtClassStart(token)
|
|
448
|
+
),
|
|
449
|
+
blockEndAllowed =
|
|
450
|
+
options.allowBlockEnd &&
|
|
451
|
+
isCommentAtBlockEnd(token) &&
|
|
452
|
+
!(
|
|
453
|
+
options.allowClassEnd === false &&
|
|
454
|
+
isCommentAtClassEnd(token)
|
|
455
|
+
),
|
|
456
|
+
classStartAllowed =
|
|
457
|
+
options.allowClassStart && isCommentAtClassStart(token),
|
|
458
|
+
classEndAllowed =
|
|
459
|
+
options.allowClassEnd && isCommentAtClassEnd(token),
|
|
460
|
+
objectStartAllowed =
|
|
461
|
+
options.allowObjectStart && isCommentAtObjectStart(token),
|
|
462
|
+
objectEndAllowed =
|
|
463
|
+
options.allowObjectEnd && isCommentAtObjectEnd(token),
|
|
464
|
+
arrayStartAllowed =
|
|
465
|
+
options.allowArrayStart && isCommentAtArrayStart(token),
|
|
466
|
+
arrayEndAllowed =
|
|
467
|
+
options.allowArrayEnd && isCommentAtArrayEnd(token);
|
|
468
|
+
|
|
469
|
+
const exceptionStartAllowed =
|
|
470
|
+
blockStartAllowed ||
|
|
471
|
+
classStartAllowed ||
|
|
472
|
+
objectStartAllowed ||
|
|
473
|
+
arrayStartAllowed;
|
|
474
|
+
const exceptionEndAllowed =
|
|
475
|
+
blockEndAllowed ||
|
|
476
|
+
classEndAllowed ||
|
|
477
|
+
objectEndAllowed ||
|
|
478
|
+
arrayEndAllowed;
|
|
479
|
+
|
|
480
|
+
// ignore top of the file and bottom of the file
|
|
481
|
+
if (prevLineNum < 1) {
|
|
482
|
+
before = false;
|
|
483
|
+
}
|
|
484
|
+
if (nextLineNum >= numLines) {
|
|
485
|
+
after = false;
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
// we ignore all inline comments
|
|
489
|
+
if (commentIsNotAlone) {
|
|
490
|
+
return;
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
const previousTokenOrComment = sourceCode.getTokenBefore(token, {
|
|
494
|
+
includeComments: true,
|
|
495
|
+
});
|
|
496
|
+
const nextTokenOrComment = sourceCode.getTokenAfter(token, {
|
|
497
|
+
includeComments: true,
|
|
498
|
+
});
|
|
499
|
+
|
|
500
|
+
// check for newline before
|
|
501
|
+
if (
|
|
502
|
+
!exceptionStartAllowed &&
|
|
503
|
+
before &&
|
|
504
|
+
!commentAndEmptyLines.has(prevLineNum) &&
|
|
505
|
+
!(
|
|
506
|
+
astUtils.isCommentToken(previousTokenOrComment) &&
|
|
507
|
+
astUtils.isTokenOnSameLine(previousTokenOrComment, token)
|
|
508
|
+
)
|
|
509
|
+
) {
|
|
510
|
+
const lineStart = token.range[0] - token.loc.start.column;
|
|
511
|
+
const range = [lineStart, lineStart];
|
|
512
|
+
|
|
513
|
+
context.report({
|
|
514
|
+
node: token,
|
|
515
|
+
messageId: "before",
|
|
516
|
+
fix(fixer) {
|
|
517
|
+
return fixer.insertTextBeforeRange(range, "\n");
|
|
518
|
+
},
|
|
519
|
+
});
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
// check for newline after
|
|
523
|
+
if (
|
|
524
|
+
!exceptionEndAllowed &&
|
|
525
|
+
after &&
|
|
526
|
+
!commentAndEmptyLines.has(nextLineNum) &&
|
|
527
|
+
!(
|
|
528
|
+
astUtils.isCommentToken(nextTokenOrComment) &&
|
|
529
|
+
astUtils.isTokenOnSameLine(token, nextTokenOrComment)
|
|
530
|
+
)
|
|
531
|
+
) {
|
|
532
|
+
context.report({
|
|
533
|
+
node: token,
|
|
534
|
+
messageId: "after",
|
|
535
|
+
fix(fixer) {
|
|
536
|
+
return fixer.insertTextAfter(token, "\n");
|
|
537
|
+
},
|
|
538
|
+
});
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
//--------------------------------------------------------------------------
|
|
543
|
+
// Public
|
|
544
|
+
//--------------------------------------------------------------------------
|
|
545
|
+
|
|
546
|
+
return {
|
|
547
|
+
Program() {
|
|
548
|
+
comments.forEach(token => {
|
|
549
|
+
if (token.type === "Line") {
|
|
550
|
+
if (
|
|
551
|
+
options.beforeLineComment ||
|
|
552
|
+
options.afterLineComment
|
|
553
|
+
) {
|
|
554
|
+
checkForEmptyLine(token, {
|
|
555
|
+
after: options.afterLineComment,
|
|
556
|
+
before: options.beforeLineComment,
|
|
557
|
+
});
|
|
558
|
+
}
|
|
559
|
+
} else if (token.type === "Block") {
|
|
560
|
+
if (
|
|
561
|
+
options.beforeBlockComment ||
|
|
562
|
+
options.afterBlockComment
|
|
563
|
+
) {
|
|
564
|
+
checkForEmptyLine(token, {
|
|
565
|
+
after: options.afterBlockComment,
|
|
566
|
+
before: options.beforeBlockComment,
|
|
567
|
+
});
|
|
568
|
+
}
|
|
569
|
+
} else if (token.type === "Shebang") {
|
|
570
|
+
if (options.afterHashbangComment) {
|
|
571
|
+
checkForEmptyLine(token, {
|
|
572
|
+
after: options.afterHashbangComment,
|
|
573
|
+
before: false,
|
|
574
|
+
});
|
|
575
|
+
}
|
|
576
|
+
}
|
|
577
|
+
});
|
|
578
|
+
},
|
|
579
|
+
};
|
|
580
|
+
},
|
|
581
|
+
};
|