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,244 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Validate strings passed to the RegExp constructor
|
|
3
|
+
* @author Michael Ficarra
|
|
4
|
+
*/
|
|
5
|
+
"use strict";
|
|
6
|
+
|
|
7
|
+
//------------------------------------------------------------------------------
|
|
8
|
+
// Requirements
|
|
9
|
+
//------------------------------------------------------------------------------
|
|
10
|
+
|
|
11
|
+
const RegExpValidator = require("@eslint-community/regexpp").RegExpValidator;
|
|
12
|
+
const validator = new RegExpValidator();
|
|
13
|
+
const validFlags = "dgimsuvy";
|
|
14
|
+
const undefined1 = void 0;
|
|
15
|
+
|
|
16
|
+
//------------------------------------------------------------------------------
|
|
17
|
+
// Rule Definition
|
|
18
|
+
//------------------------------------------------------------------------------
|
|
19
|
+
|
|
20
|
+
/** @type {import('../types').Rule.RuleModule} */
|
|
21
|
+
module.exports = {
|
|
22
|
+
meta: {
|
|
23
|
+
type: "problem",
|
|
24
|
+
|
|
25
|
+
defaultOptions: [{}],
|
|
26
|
+
|
|
27
|
+
docs: {
|
|
28
|
+
description:
|
|
29
|
+
"Disallow invalid regular expression strings in `RegExp` constructors",
|
|
30
|
+
recommended: true,
|
|
31
|
+
url: "https://eslint.org/docs/latest/rules/no-invalid-regexp",
|
|
32
|
+
},
|
|
33
|
+
|
|
34
|
+
schema: [
|
|
35
|
+
{
|
|
36
|
+
type: "object",
|
|
37
|
+
properties: {
|
|
38
|
+
allowConstructorFlags: {
|
|
39
|
+
type: "array",
|
|
40
|
+
items: {
|
|
41
|
+
type: "string",
|
|
42
|
+
},
|
|
43
|
+
uniqueItems: true,
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
additionalProperties: false,
|
|
47
|
+
},
|
|
48
|
+
],
|
|
49
|
+
|
|
50
|
+
messages: {
|
|
51
|
+
regexMessage: "{{message}}.",
|
|
52
|
+
},
|
|
53
|
+
},
|
|
54
|
+
|
|
55
|
+
create(context) {
|
|
56
|
+
const [{ allowConstructorFlags }] = context.options;
|
|
57
|
+
let allowedFlags = [];
|
|
58
|
+
|
|
59
|
+
if (allowConstructorFlags) {
|
|
60
|
+
const temp = allowConstructorFlags
|
|
61
|
+
.join("")
|
|
62
|
+
.replace(new RegExp(`[${validFlags}]`, "gu"), "");
|
|
63
|
+
|
|
64
|
+
if (temp) {
|
|
65
|
+
allowedFlags = [...new Set(temp)];
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Reports error with the provided message.
|
|
71
|
+
* @param {ASTNode} node The node holding the invalid RegExp
|
|
72
|
+
* @param {string} message The message to report.
|
|
73
|
+
* @returns {void}
|
|
74
|
+
*/
|
|
75
|
+
function report(node, message) {
|
|
76
|
+
context.report({
|
|
77
|
+
node,
|
|
78
|
+
messageId: "regexMessage",
|
|
79
|
+
data: { message },
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Check if node is a string
|
|
85
|
+
* @param {ASTNode} node node to evaluate
|
|
86
|
+
* @returns {boolean} True if its a string
|
|
87
|
+
* @private
|
|
88
|
+
*/
|
|
89
|
+
function isString(node) {
|
|
90
|
+
return (
|
|
91
|
+
node &&
|
|
92
|
+
node.type === "Literal" &&
|
|
93
|
+
typeof node.value === "string"
|
|
94
|
+
);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Gets flags of a regular expression created by the given `RegExp()` or `new RegExp()` call
|
|
99
|
+
* Examples:
|
|
100
|
+
* new RegExp(".") // => ""
|
|
101
|
+
* new RegExp(".", "gu") // => "gu"
|
|
102
|
+
* new RegExp(".", flags) // => null
|
|
103
|
+
* @param {ASTNode} node `CallExpression` or `NewExpression` node
|
|
104
|
+
* @returns {string|null} flags if they can be determined, `null` otherwise
|
|
105
|
+
* @private
|
|
106
|
+
*/
|
|
107
|
+
function getFlags(node) {
|
|
108
|
+
if (node.arguments.length < 2) {
|
|
109
|
+
return "";
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
if (isString(node.arguments[1])) {
|
|
113
|
+
return node.arguments[1].value;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
return null;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Check syntax error in a given pattern.
|
|
121
|
+
* @param {string} pattern The RegExp pattern to validate.
|
|
122
|
+
* @param {Object} flags The RegExp flags to validate.
|
|
123
|
+
* @param {boolean} [flags.unicode] The Unicode flag.
|
|
124
|
+
* @param {boolean} [flags.unicodeSets] The UnicodeSets flag.
|
|
125
|
+
* @returns {string|null} The syntax error.
|
|
126
|
+
*/
|
|
127
|
+
function validateRegExpPattern(pattern, flags) {
|
|
128
|
+
try {
|
|
129
|
+
validator.validatePattern(
|
|
130
|
+
pattern,
|
|
131
|
+
undefined1,
|
|
132
|
+
undefined1,
|
|
133
|
+
flags,
|
|
134
|
+
);
|
|
135
|
+
return null;
|
|
136
|
+
} catch (err) {
|
|
137
|
+
return err.message;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Check syntax error in a given flags.
|
|
143
|
+
* @param {string|null} flags The RegExp flags to validate.
|
|
144
|
+
* @param {string|null} flagsToCheck The RegExp invalid flags.
|
|
145
|
+
* @param {string} allFlags all valid and allowed flags.
|
|
146
|
+
* @returns {string|null} The syntax error.
|
|
147
|
+
*/
|
|
148
|
+
function validateRegExpFlags(flags, flagsToCheck, allFlags) {
|
|
149
|
+
const duplicateFlags = [];
|
|
150
|
+
|
|
151
|
+
if (typeof flagsToCheck === "string") {
|
|
152
|
+
for (const flag of flagsToCheck) {
|
|
153
|
+
if (allFlags.includes(flag)) {
|
|
154
|
+
duplicateFlags.push(flag);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/*
|
|
160
|
+
* `regexpp` checks the combination of `u` and `v` flags when parsing `Pattern` according to `ecma262`,
|
|
161
|
+
* but this rule may check only the flag when the pattern is unidentifiable, so check it here.
|
|
162
|
+
* https://tc39.es/ecma262/multipage/text-processing.html#sec-parsepattern
|
|
163
|
+
*/
|
|
164
|
+
if (flags && flags.includes("u") && flags.includes("v")) {
|
|
165
|
+
return "Regex 'u' and 'v' flags cannot be used together";
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
if (duplicateFlags.length > 0) {
|
|
169
|
+
return `Duplicate flags ('${duplicateFlags.join("")}') supplied to RegExp constructor`;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
if (!flagsToCheck) {
|
|
173
|
+
return null;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
return `Invalid flags supplied to RegExp constructor '${flagsToCheck}'`;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
return {
|
|
180
|
+
"CallExpression, NewExpression"(node) {
|
|
181
|
+
if (
|
|
182
|
+
node.callee.type !== "Identifier" ||
|
|
183
|
+
node.callee.name !== "RegExp"
|
|
184
|
+
) {
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
const flags = getFlags(node);
|
|
189
|
+
let flagsToCheck = flags;
|
|
190
|
+
const allFlags =
|
|
191
|
+
allowedFlags.length > 0
|
|
192
|
+
? validFlags.split("").concat(allowedFlags)
|
|
193
|
+
: validFlags.split("");
|
|
194
|
+
|
|
195
|
+
if (flags) {
|
|
196
|
+
allFlags.forEach(flag => {
|
|
197
|
+
flagsToCheck = flagsToCheck.replace(flag, "");
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
let message = validateRegExpFlags(
|
|
202
|
+
flags,
|
|
203
|
+
flagsToCheck,
|
|
204
|
+
allFlags,
|
|
205
|
+
);
|
|
206
|
+
|
|
207
|
+
if (message) {
|
|
208
|
+
report(node, message);
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
if (!isString(node.arguments[0])) {
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
const pattern = node.arguments[0].value;
|
|
217
|
+
|
|
218
|
+
message =
|
|
219
|
+
// If flags are unknown, report the regex only if its pattern is invalid both with and without the "u" flag
|
|
220
|
+
flags === null
|
|
221
|
+
? validateRegExpPattern(pattern, {
|
|
222
|
+
unicode: true,
|
|
223
|
+
unicodeSets: false,
|
|
224
|
+
}) &&
|
|
225
|
+
validateRegExpPattern(pattern, {
|
|
226
|
+
unicode: false,
|
|
227
|
+
unicodeSets: true,
|
|
228
|
+
}) &&
|
|
229
|
+
validateRegExpPattern(pattern, {
|
|
230
|
+
unicode: false,
|
|
231
|
+
unicodeSets: false,
|
|
232
|
+
})
|
|
233
|
+
: validateRegExpPattern(pattern, {
|
|
234
|
+
unicode: flags.includes("u"),
|
|
235
|
+
unicodeSets: flags.includes("v"),
|
|
236
|
+
});
|
|
237
|
+
|
|
238
|
+
if (message) {
|
|
239
|
+
report(node, message);
|
|
240
|
+
}
|
|
241
|
+
},
|
|
242
|
+
};
|
|
243
|
+
},
|
|
244
|
+
};
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview A rule to disallow `this` keywords in contexts where the value of `this` is `undefined`.
|
|
3
|
+
* @author Toru Nagashima
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
"use strict";
|
|
7
|
+
|
|
8
|
+
//------------------------------------------------------------------------------
|
|
9
|
+
// Requirements
|
|
10
|
+
//------------------------------------------------------------------------------
|
|
11
|
+
|
|
12
|
+
const astUtils = require("./utils/ast-utils");
|
|
13
|
+
|
|
14
|
+
//------------------------------------------------------------------------------
|
|
15
|
+
// Helpers
|
|
16
|
+
//------------------------------------------------------------------------------
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Determines if the given code path is a code path with lexical `this` binding.
|
|
20
|
+
* That is, if `this` within the code path refers to `this` of surrounding code path.
|
|
21
|
+
* @param {CodePath} codePath Code path.
|
|
22
|
+
* @param {ASTNode} node Node that started the code path.
|
|
23
|
+
* @returns {boolean} `true` if it is a code path with lexical `this` binding.
|
|
24
|
+
*/
|
|
25
|
+
function isCodePathWithLexicalThis(codePath, node) {
|
|
26
|
+
return (
|
|
27
|
+
codePath.origin === "function" &&
|
|
28
|
+
node.type === "ArrowFunctionExpression"
|
|
29
|
+
);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
//------------------------------------------------------------------------------
|
|
33
|
+
// Rule Definition
|
|
34
|
+
//------------------------------------------------------------------------------
|
|
35
|
+
|
|
36
|
+
/** @type {import('../types').Rule.RuleModule} */
|
|
37
|
+
module.exports = {
|
|
38
|
+
meta: {
|
|
39
|
+
dialects: ["javascript", "typescript"],
|
|
40
|
+
language: "javascript",
|
|
41
|
+
type: "suggestion",
|
|
42
|
+
|
|
43
|
+
defaultOptions: [{ capIsConstructor: true }],
|
|
44
|
+
|
|
45
|
+
docs: {
|
|
46
|
+
description:
|
|
47
|
+
"Disallow use of `this` in contexts where the value of `this` is `undefined`",
|
|
48
|
+
recommended: false,
|
|
49
|
+
url: "https://eslint.org/docs/latest/rules/no-invalid-this",
|
|
50
|
+
},
|
|
51
|
+
|
|
52
|
+
schema: [
|
|
53
|
+
{
|
|
54
|
+
type: "object",
|
|
55
|
+
properties: {
|
|
56
|
+
capIsConstructor: {
|
|
57
|
+
type: "boolean",
|
|
58
|
+
},
|
|
59
|
+
},
|
|
60
|
+
additionalProperties: false,
|
|
61
|
+
},
|
|
62
|
+
],
|
|
63
|
+
|
|
64
|
+
messages: {
|
|
65
|
+
unexpectedThis: "Unexpected 'this'.",
|
|
66
|
+
},
|
|
67
|
+
},
|
|
68
|
+
|
|
69
|
+
create(context) {
|
|
70
|
+
const [{ capIsConstructor }] = context.options;
|
|
71
|
+
const stack = [],
|
|
72
|
+
sourceCode = context.sourceCode;
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Gets the current checking context.
|
|
76
|
+
*
|
|
77
|
+
* The return value has a flag that whether or not `this` keyword is valid.
|
|
78
|
+
* The flag is initialized when got at the first time.
|
|
79
|
+
* @returns {{valid: boolean}}
|
|
80
|
+
* an object which has a flag that whether or not `this` keyword is valid.
|
|
81
|
+
*/
|
|
82
|
+
stack.getCurrent = function () {
|
|
83
|
+
const current = this.at(-1);
|
|
84
|
+
|
|
85
|
+
if (!current.init) {
|
|
86
|
+
current.init = true;
|
|
87
|
+
current.valid = !astUtils.isDefaultThisBinding(
|
|
88
|
+
current.node,
|
|
89
|
+
sourceCode,
|
|
90
|
+
{ capIsConstructor },
|
|
91
|
+
);
|
|
92
|
+
}
|
|
93
|
+
return current;
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
return {
|
|
97
|
+
onCodePathStart(codePath, node) {
|
|
98
|
+
if (isCodePathWithLexicalThis(codePath, node)) {
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
if (codePath.origin === "program") {
|
|
103
|
+
const scope = sourceCode.getScope(node);
|
|
104
|
+
const features =
|
|
105
|
+
context.languageOptions.parserOptions.ecmaFeatures ||
|
|
106
|
+
{};
|
|
107
|
+
|
|
108
|
+
// `this` at the top level of scripts always refers to the global object
|
|
109
|
+
stack.push({
|
|
110
|
+
init: true,
|
|
111
|
+
node,
|
|
112
|
+
valid: !(
|
|
113
|
+
node.sourceType === "module" ||
|
|
114
|
+
(features.globalReturn &&
|
|
115
|
+
scope.childScopes[0].isStrict)
|
|
116
|
+
),
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/*
|
|
123
|
+
* `init: false` means that `valid` isn't determined yet.
|
|
124
|
+
* Most functions don't use `this`, and the calculation for `valid`
|
|
125
|
+
* is relatively costly, so we'll calculate it lazily when the first
|
|
126
|
+
* `this` within the function is traversed. A special case are non-strict
|
|
127
|
+
* functions, because `this` refers to the global object and therefore is
|
|
128
|
+
* always valid, so we can set `init: true` right away.
|
|
129
|
+
*/
|
|
130
|
+
stack.push({
|
|
131
|
+
init: !sourceCode.getScope(node).isStrict,
|
|
132
|
+
node,
|
|
133
|
+
valid: true,
|
|
134
|
+
});
|
|
135
|
+
},
|
|
136
|
+
|
|
137
|
+
onCodePathEnd(codePath, node) {
|
|
138
|
+
if (isCodePathWithLexicalThis(codePath, node)) {
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
stack.pop();
|
|
143
|
+
},
|
|
144
|
+
|
|
145
|
+
"AccessorProperty > *.value"(node) {
|
|
146
|
+
stack.push({
|
|
147
|
+
init: true,
|
|
148
|
+
node,
|
|
149
|
+
valid: true,
|
|
150
|
+
});
|
|
151
|
+
},
|
|
152
|
+
|
|
153
|
+
"AccessorProperty:exit"() {
|
|
154
|
+
stack.pop();
|
|
155
|
+
},
|
|
156
|
+
|
|
157
|
+
// Reports if `this` of the current context is invalid.
|
|
158
|
+
ThisExpression(node) {
|
|
159
|
+
// Special case: skip `this` if it's the value of an AccessorProperty
|
|
160
|
+
if (
|
|
161
|
+
node.parent.type === "AccessorProperty" &&
|
|
162
|
+
node.parent.value === node
|
|
163
|
+
) {
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
const current = stack.getCurrent();
|
|
168
|
+
|
|
169
|
+
if (current && !current.valid) {
|
|
170
|
+
context.report({
|
|
171
|
+
node,
|
|
172
|
+
messageId: "unexpectedThis",
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
},
|
|
176
|
+
};
|
|
177
|
+
},
|
|
178
|
+
};
|
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Rule to disallow whitespace that is not a tab or space, whitespace inside strings and comments are allowed
|
|
3
|
+
* @author Jonathan Kingston
|
|
4
|
+
* @author Christophe Porteneuve
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
"use strict";
|
|
8
|
+
|
|
9
|
+
//------------------------------------------------------------------------------
|
|
10
|
+
// Requirements
|
|
11
|
+
//------------------------------------------------------------------------------
|
|
12
|
+
|
|
13
|
+
const astUtils = require("./utils/ast-utils");
|
|
14
|
+
|
|
15
|
+
//------------------------------------------------------------------------------
|
|
16
|
+
// Constants
|
|
17
|
+
//------------------------------------------------------------------------------
|
|
18
|
+
|
|
19
|
+
const ALL_IRREGULARS =
|
|
20
|
+
/[\f\v\u0085\ufeff\u00a0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u200b\u202f\u205f\u3000\u2028\u2029]/u;
|
|
21
|
+
const IRREGULAR_WHITESPACE =
|
|
22
|
+
/[\f\v\u0085\ufeff\u00a0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u200b\u202f\u205f\u3000]+/gu;
|
|
23
|
+
const IRREGULAR_LINE_TERMINATORS = /[\u2028\u2029]/gu;
|
|
24
|
+
const LINE_BREAK = astUtils.createGlobalLinebreakMatcher();
|
|
25
|
+
|
|
26
|
+
//------------------------------------------------------------------------------
|
|
27
|
+
// Rule Definition
|
|
28
|
+
//------------------------------------------------------------------------------
|
|
29
|
+
|
|
30
|
+
/** @type {import('../types').Rule.RuleModule} */
|
|
31
|
+
module.exports = {
|
|
32
|
+
meta: {
|
|
33
|
+
type: "problem",
|
|
34
|
+
|
|
35
|
+
defaultOptions: [
|
|
36
|
+
{
|
|
37
|
+
skipComments: false,
|
|
38
|
+
skipJSXText: false,
|
|
39
|
+
skipRegExps: false,
|
|
40
|
+
skipStrings: true,
|
|
41
|
+
skipTemplates: false,
|
|
42
|
+
},
|
|
43
|
+
],
|
|
44
|
+
|
|
45
|
+
docs: {
|
|
46
|
+
description: "Disallow irregular whitespace",
|
|
47
|
+
recommended: true,
|
|
48
|
+
url: "https://eslint.org/docs/latest/rules/no-irregular-whitespace",
|
|
49
|
+
},
|
|
50
|
+
|
|
51
|
+
schema: [
|
|
52
|
+
{
|
|
53
|
+
type: "object",
|
|
54
|
+
properties: {
|
|
55
|
+
skipComments: {
|
|
56
|
+
type: "boolean",
|
|
57
|
+
},
|
|
58
|
+
skipStrings: {
|
|
59
|
+
type: "boolean",
|
|
60
|
+
},
|
|
61
|
+
skipTemplates: {
|
|
62
|
+
type: "boolean",
|
|
63
|
+
},
|
|
64
|
+
skipRegExps: {
|
|
65
|
+
type: "boolean",
|
|
66
|
+
},
|
|
67
|
+
skipJSXText: {
|
|
68
|
+
type: "boolean",
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
additionalProperties: false,
|
|
72
|
+
},
|
|
73
|
+
],
|
|
74
|
+
|
|
75
|
+
messages: {
|
|
76
|
+
noIrregularWhitespace: "Irregular whitespace not allowed.",
|
|
77
|
+
},
|
|
78
|
+
},
|
|
79
|
+
|
|
80
|
+
create(context) {
|
|
81
|
+
const [
|
|
82
|
+
{
|
|
83
|
+
skipComments,
|
|
84
|
+
skipStrings,
|
|
85
|
+
skipRegExps,
|
|
86
|
+
skipTemplates,
|
|
87
|
+
skipJSXText,
|
|
88
|
+
},
|
|
89
|
+
] = context.options;
|
|
90
|
+
|
|
91
|
+
const sourceCode = context.sourceCode;
|
|
92
|
+
const commentNodes = sourceCode.getAllComments();
|
|
93
|
+
|
|
94
|
+
// Module store of errors that we have found
|
|
95
|
+
let errors = [];
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Removes errors that occur inside the given node
|
|
99
|
+
* @param {ASTNode} node to check for matching errors.
|
|
100
|
+
* @returns {void}
|
|
101
|
+
* @private
|
|
102
|
+
*/
|
|
103
|
+
function removeWhitespaceError(node) {
|
|
104
|
+
const locStart = node.loc.start;
|
|
105
|
+
const locEnd = node.loc.end;
|
|
106
|
+
|
|
107
|
+
errors = errors.filter(
|
|
108
|
+
({ loc: { start: errorLocStart } }) =>
|
|
109
|
+
errorLocStart.line < locStart.line ||
|
|
110
|
+
(errorLocStart.line === locStart.line &&
|
|
111
|
+
errorLocStart.column < locStart.column) ||
|
|
112
|
+
(errorLocStart.line === locEnd.line &&
|
|
113
|
+
errorLocStart.column >= locEnd.column) ||
|
|
114
|
+
errorLocStart.line > locEnd.line,
|
|
115
|
+
);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Checks literal nodes for errors that we are choosing to ignore and calls the relevant methods to remove the errors
|
|
120
|
+
* @param {ASTNode} node to check for matching errors.
|
|
121
|
+
* @returns {void}
|
|
122
|
+
* @private
|
|
123
|
+
*/
|
|
124
|
+
function removeInvalidNodeErrorsInLiteral(node) {
|
|
125
|
+
const shouldCheckStrings =
|
|
126
|
+
skipStrings && typeof node.value === "string";
|
|
127
|
+
const shouldCheckRegExps = skipRegExps && Boolean(node.regex);
|
|
128
|
+
|
|
129
|
+
if (shouldCheckStrings || shouldCheckRegExps) {
|
|
130
|
+
// If we have irregular characters remove them from the errors list
|
|
131
|
+
if (ALL_IRREGULARS.test(node.raw)) {
|
|
132
|
+
removeWhitespaceError(node);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Checks template string literal nodes for errors that we are choosing to ignore and calls the relevant methods to remove the errors
|
|
139
|
+
* @param {ASTNode} node to check for matching errors.
|
|
140
|
+
* @returns {void}
|
|
141
|
+
* @private
|
|
142
|
+
*/
|
|
143
|
+
function removeInvalidNodeErrorsInTemplateLiteral(node) {
|
|
144
|
+
if (typeof node.value.raw === "string") {
|
|
145
|
+
if (ALL_IRREGULARS.test(node.value.raw)) {
|
|
146
|
+
removeWhitespaceError(node);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Checks comment nodes for errors that we are choosing to ignore and calls the relevant methods to remove the errors
|
|
153
|
+
* @param {ASTNode} node to check for matching errors.
|
|
154
|
+
* @returns {void}
|
|
155
|
+
* @private
|
|
156
|
+
*/
|
|
157
|
+
function removeInvalidNodeErrorsInComment(node) {
|
|
158
|
+
if (ALL_IRREGULARS.test(node.value)) {
|
|
159
|
+
removeWhitespaceError(node);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* Checks JSX nodes for errors that we are choosing to ignore and calls the relevant methods to remove the errors
|
|
165
|
+
* @param {ASTNode} node to check for matching errors.
|
|
166
|
+
* @returns {void}
|
|
167
|
+
* @private
|
|
168
|
+
*/
|
|
169
|
+
function removeInvalidNodeErrorsInJSXText(node) {
|
|
170
|
+
if (ALL_IRREGULARS.test(node.raw)) {
|
|
171
|
+
removeWhitespaceError(node);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* Checks the program source for irregular whitespace
|
|
177
|
+
* @param {ASTNode} node The program node
|
|
178
|
+
* @returns {void}
|
|
179
|
+
* @private
|
|
180
|
+
*/
|
|
181
|
+
function checkForIrregularWhitespace(node) {
|
|
182
|
+
const sourceLines = sourceCode.lines;
|
|
183
|
+
|
|
184
|
+
sourceLines.forEach((sourceLine, lineIndex) => {
|
|
185
|
+
const lineNumber = lineIndex + 1;
|
|
186
|
+
let match;
|
|
187
|
+
|
|
188
|
+
while (
|
|
189
|
+
(match = IRREGULAR_WHITESPACE.exec(sourceLine)) !== null
|
|
190
|
+
) {
|
|
191
|
+
errors.push({
|
|
192
|
+
node,
|
|
193
|
+
messageId: "noIrregularWhitespace",
|
|
194
|
+
loc: {
|
|
195
|
+
start: {
|
|
196
|
+
line: lineNumber,
|
|
197
|
+
column: match.index,
|
|
198
|
+
},
|
|
199
|
+
end: {
|
|
200
|
+
line: lineNumber,
|
|
201
|
+
column: match.index + match[0].length,
|
|
202
|
+
},
|
|
203
|
+
},
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* Checks the program source for irregular line terminators
|
|
211
|
+
* @param {ASTNode} node The program node
|
|
212
|
+
* @returns {void}
|
|
213
|
+
* @private
|
|
214
|
+
*/
|
|
215
|
+
function checkForIrregularLineTerminators(node) {
|
|
216
|
+
const source = sourceCode.getText(),
|
|
217
|
+
sourceLines = sourceCode.lines,
|
|
218
|
+
linebreaks = source.match(LINE_BREAK);
|
|
219
|
+
let lastLineIndex = -1,
|
|
220
|
+
match;
|
|
221
|
+
|
|
222
|
+
while ((match = IRREGULAR_LINE_TERMINATORS.exec(source)) !== null) {
|
|
223
|
+
const lineIndex =
|
|
224
|
+
linebreaks.indexOf(match[0], lastLineIndex + 1) || 0;
|
|
225
|
+
|
|
226
|
+
errors.push({
|
|
227
|
+
node,
|
|
228
|
+
messageId: "noIrregularWhitespace",
|
|
229
|
+
loc: {
|
|
230
|
+
start: {
|
|
231
|
+
line: lineIndex + 1,
|
|
232
|
+
column: sourceLines[lineIndex].length,
|
|
233
|
+
},
|
|
234
|
+
end: {
|
|
235
|
+
line: lineIndex + 2,
|
|
236
|
+
column: 0,
|
|
237
|
+
},
|
|
238
|
+
},
|
|
239
|
+
});
|
|
240
|
+
|
|
241
|
+
lastLineIndex = lineIndex;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
/**
|
|
246
|
+
* A no-op function to act as placeholder for comment accumulation when the `skipComments` option is `false`.
|
|
247
|
+
* @returns {void}
|
|
248
|
+
* @private
|
|
249
|
+
*/
|
|
250
|
+
function noop() {}
|
|
251
|
+
|
|
252
|
+
const nodes = {};
|
|
253
|
+
|
|
254
|
+
if (ALL_IRREGULARS.test(sourceCode.getText())) {
|
|
255
|
+
nodes.Program = function (node) {
|
|
256
|
+
/*
|
|
257
|
+
* As we can easily fire warnings for all white space issues with
|
|
258
|
+
* all the source its simpler to fire them here.
|
|
259
|
+
* This means we can check all the application code without having
|
|
260
|
+
* to worry about issues caused in the parser tokens.
|
|
261
|
+
* When writing this code also evaluating per node was missing out
|
|
262
|
+
* connecting tokens in some cases.
|
|
263
|
+
* We can later filter the errors when they are found to be not an
|
|
264
|
+
* issue in nodes we don't care about.
|
|
265
|
+
*/
|
|
266
|
+
checkForIrregularWhitespace(node);
|
|
267
|
+
checkForIrregularLineTerminators(node);
|
|
268
|
+
};
|
|
269
|
+
|
|
270
|
+
nodes.Literal = removeInvalidNodeErrorsInLiteral;
|
|
271
|
+
nodes.TemplateElement = skipTemplates
|
|
272
|
+
? removeInvalidNodeErrorsInTemplateLiteral
|
|
273
|
+
: noop;
|
|
274
|
+
nodes.JSXText = skipJSXText
|
|
275
|
+
? removeInvalidNodeErrorsInJSXText
|
|
276
|
+
: noop;
|
|
277
|
+
nodes["Program:exit"] = function () {
|
|
278
|
+
if (skipComments) {
|
|
279
|
+
// First strip errors occurring in comment nodes.
|
|
280
|
+
commentNodes.forEach(removeInvalidNodeErrorsInComment);
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
// If we have any errors remaining report on them
|
|
284
|
+
errors.forEach(error => context.report(error));
|
|
285
|
+
};
|
|
286
|
+
} else {
|
|
287
|
+
nodes.Program = noop;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
return nodes;
|
|
291
|
+
},
|
|
292
|
+
};
|