eslint 8.57.1 → 9.39.1
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/README.md +165 -115
- package/bin/eslint.js +112 -89
- package/conf/default-cli-options.js +22 -22
- package/conf/ecma-version.js +16 -0
- package/conf/globals.js +109 -94
- package/conf/replacements.json +24 -20
- package/conf/rule-type-list.json +89 -26
- package/lib/api.js +16 -20
- package/lib/cli-engine/cli-engine.js +841 -810
- package/lib/cli-engine/file-enumerator.js +384 -390
- package/lib/cli-engine/formatters/formatters-meta.json +17 -45
- package/lib/cli-engine/formatters/html.js +110 -102
- package/lib/cli-engine/formatters/json-with-metadata.js +5 -5
- package/lib/cli-engine/formatters/json.js +2 -2
- package/lib/cli-engine/formatters/stylish.js +97 -76
- package/lib/cli-engine/hash.js +1 -1
- package/lib/cli-engine/index.js +1 -1
- package/lib/cli-engine/lint-result-cache.js +165 -148
- package/lib/cli-engine/load-rules.js +17 -17
- package/lib/cli.js +481 -399
- package/lib/config/config-loader.js +816 -0
- package/lib/config/config.js +674 -0
- package/lib/config/default-config.js +57 -46
- package/lib/config/flat-config-array.js +170 -333
- package/lib/config/flat-config-schema.js +389 -389
- package/lib/config-api.js +12 -0
- package/lib/eslint/eslint-helpers.js +1196 -663
- package/lib/eslint/eslint.js +1262 -607
- package/lib/eslint/index.js +3 -3
- package/lib/eslint/legacy-eslint.js +786 -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 +1364 -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/{source-code → languages/js/source-code}/token-store/cursor.js +36 -36
- package/lib/languages/js/source-code/token-store/cursors.js +120 -0
- package/lib/{source-code → languages/js/source-code}/token-store/decorative-cursor.js +17 -18
- package/lib/{source-code → languages/js/source-code}/token-store/filter-cursor.js +19 -20
- 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 +721 -0
- package/lib/{source-code → languages/js/source-code}/token-store/limit-cursor.js +17 -18
- package/lib/languages/js/source-code/token-store/padded-token-cursor.js +45 -0
- package/lib/{source-code → languages/js/source-code}/token-store/skip-cursor.js +19 -20
- package/lib/languages/js/source-code/token-store/utils.js +110 -0
- package/lib/languages/js/validate-language-options.js +196 -0
- package/lib/linter/apply-disable-directives.js +490 -371
- package/lib/linter/code-path-analysis/code-path-analyzer.js +650 -674
- package/lib/linter/code-path-analysis/code-path-segment.js +215 -216
- package/lib/linter/code-path-analysis/code-path-state.js +2118 -2096
- package/lib/linter/code-path-analysis/code-path.js +307 -317
- package/lib/linter/code-path-analysis/debug-helpers.js +183 -163
- package/lib/linter/code-path-analysis/fork-context.js +297 -272
- package/lib/linter/code-path-analysis/id-generator.js +22 -23
- package/lib/linter/esquery.js +332 -0
- package/lib/linter/file-context.js +144 -0
- package/lib/linter/file-report.js +608 -0
- package/lib/linter/index.js +3 -5
- package/lib/linter/interpolate.js +38 -16
- package/lib/linter/linter.js +2328 -1785
- package/lib/linter/rule-fixer.js +136 -107
- package/lib/linter/rules.js +37 -46
- package/lib/linter/source-code-fixer.js +96 -94
- package/lib/linter/source-code-traverser.js +333 -0
- package/lib/linter/source-code-visitor.js +81 -0
- package/lib/linter/timing.js +145 -97
- package/lib/linter/vfile.js +115 -0
- package/lib/options.js +464 -326
- package/lib/rule-tester/index.js +3 -1
- package/lib/rule-tester/rule-tester.js +1371 -998
- package/lib/rules/accessor-pairs.js +333 -259
- package/lib/rules/array-bracket-newline.js +250 -220
- package/lib/rules/array-bracket-spacing.js +286 -229
- package/lib/rules/array-callback-return.js +401 -354
- package/lib/rules/array-element-newline.js +358 -295
- package/lib/rules/arrow-body-style.js +400 -278
- package/lib/rules/arrow-parens.js +206 -155
- package/lib/rules/arrow-spacing.js +169 -145
- package/lib/rules/block-scoped-var.js +125 -123
- package/lib/rules/block-spacing.js +186 -158
- package/lib/rules/brace-style.js +262 -181
- package/lib/rules/callback-return.js +203 -174
- package/lib/rules/camelcase.js +403 -380
- package/lib/rules/capitalized-comments.js +253 -228
- package/lib/rules/class-methods-use-this.js +231 -168
- package/lib/rules/comma-dangle.js +379 -328
- package/lib/rules/comma-spacing.js +193 -177
- package/lib/rules/comma-style.js +375 -298
- package/lib/rules/complexity.js +180 -144
- package/lib/rules/computed-property-spacing.js +236 -193
- package/lib/rules/consistent-return.js +181 -170
- package/lib/rules/consistent-this.js +167 -141
- package/lib/rules/constructor-super.js +418 -411
- package/lib/rules/curly.js +407 -468
- package/lib/rules/default-case-last.js +39 -32
- package/lib/rules/default-case.js +89 -83
- package/lib/rules/default-param-last.js +69 -53
- package/lib/rules/dot-location.js +122 -92
- package/lib/rules/dot-notation.js +193 -153
- package/lib/rules/eol-last.js +122 -102
- package/lib/rules/eqeqeq.js +191 -155
- package/lib/rules/for-direction.js +150 -122
- package/lib/rules/func-call-spacing.js +261 -213
- package/lib/rules/func-name-matching.js +294 -209
- package/lib/rules/func-names.js +165 -164
- package/lib/rules/func-style.js +209 -86
- package/lib/rules/function-call-argument-newline.js +152 -111
- package/lib/rules/function-paren-newline.js +349 -273
- package/lib/rules/generator-star-spacing.js +229 -192
- package/lib/rules/getter-return.js +208 -170
- package/lib/rules/global-require.js +85 -58
- package/lib/rules/grouped-accessor-pairs.js +201 -148
- package/lib/rules/guard-for-in.js +72 -63
- package/lib/rules/handle-callback-err.js +108 -87
- package/lib/rules/id-blacklist.js +182 -187
- package/lib/rules/id-denylist.js +174 -179
- package/lib/rules/id-length.js +197 -157
- package/lib/rules/id-match.js +350 -286
- package/lib/rules/implicit-arrow-linebreak.js +102 -61
- package/lib/rules/indent-legacy.js +1345 -1102
- package/lib/rules/indent.js +2272 -1741
- package/lib/rules/index.js +320 -294
- package/lib/rules/init-declarations.js +139 -106
- package/lib/rules/jsx-quotes.js +94 -64
- package/lib/rules/key-spacing.js +750 -615
- package/lib/rules/keyword-spacing.js +648 -587
- package/lib/rules/line-comment-position.js +143 -108
- package/lib/rules/linebreak-style.js +115 -88
- package/lib/rules/lines-around-comment.js +540 -430
- package/lib/rules/lines-around-directive.js +233 -185
- package/lib/rules/lines-between-class-members.js +305 -216
- package/lib/rules/logical-assignment-operators.js +582 -398
- package/lib/rules/max-classes-per-file.js +69 -68
- package/lib/rules/max-depth.js +146 -143
- package/lib/rules/max-len.js +473 -416
- package/lib/rules/max-lines-per-function.js +201 -176
- package/lib/rules/max-lines.js +158 -162
- package/lib/rules/max-nested-callbacks.js +102 -104
- package/lib/rules/max-params.js +102 -75
- package/lib/rules/max-statements-per-line.js +205 -180
- package/lib/rules/max-statements.js +168 -164
- package/lib/rules/multiline-comment-style.js +638 -460
- package/lib/rules/multiline-ternary.js +241 -158
- package/lib/rules/new-cap.js +233 -232
- package/lib/rules/new-parens.js +88 -61
- package/lib/rules/newline-after-var.js +287 -233
- package/lib/rules/newline-before-return.js +229 -204
- package/lib/rules/newline-per-chained-call.js +142 -109
- package/lib/rules/no-alert.js +90 -79
- package/lib/rules/no-array-constructor.js +175 -113
- package/lib/rules/no-async-promise-executor.js +30 -24
- package/lib/rules/no-await-in-loop.js +79 -70
- package/lib/rules/no-bitwise.js +113 -87
- package/lib/rules/no-buffer-constructor.js +61 -37
- package/lib/rules/no-caller.js +39 -33
- package/lib/rules/no-case-declarations.js +61 -45
- package/lib/rules/no-catch-shadow.js +76 -62
- package/lib/rules/no-class-assign.js +51 -48
- package/lib/rules/no-compare-neg-zero.js +62 -48
- package/lib/rules/no-cond-assign.js +148 -132
- package/lib/rules/no-confusing-arrow.js +98 -63
- package/lib/rules/no-console.js +202 -188
- package/lib/rules/no-const-assign.js +58 -41
- package/lib/rules/no-constant-binary-expression.js +501 -407
- package/lib/rules/no-constant-condition.js +158 -131
- package/lib/rules/no-constructor-return.js +49 -49
- package/lib/rules/no-continue.js +25 -26
- package/lib/rules/no-control-regex.js +125 -121
- package/lib/rules/no-debugger.js +28 -30
- package/lib/rules/no-delete-var.js +29 -29
- package/lib/rules/no-div-regex.js +47 -40
- package/lib/rules/no-dupe-args.js +79 -69
- package/lib/rules/no-dupe-class-members.js +102 -89
- package/lib/rules/no-dupe-else-if.js +100 -77
- package/lib/rules/no-dupe-keys.js +133 -110
- package/lib/rules/no-duplicate-case.js +50 -43
- package/lib/rules/no-duplicate-imports.js +266 -188
- package/lib/rules/no-else-return.js +430 -385
- package/lib/rules/no-empty-character-class.js +57 -50
- package/lib/rules/no-empty-function.js +197 -128
- package/lib/rules/no-empty-pattern.js +63 -56
- package/lib/rules/no-empty-static-block.js +61 -35
- package/lib/rules/no-empty.js +135 -85
- package/lib/rules/no-eq-null.js +37 -32
- package/lib/rules/no-eval.js +258 -249
- package/lib/rules/no-ex-assign.js +42 -39
- package/lib/rules/no-extend-native.js +161 -160
- package/lib/rules/no-extra-bind.js +201 -190
- package/lib/rules/no-extra-boolean-cast.js +398 -295
- package/lib/rules/no-extra-label.js +150 -130
- package/lib/rules/no-extra-parens.js +1654 -1307
- package/lib/rules/no-extra-semi.js +146 -126
- package/lib/rules/no-fallthrough.js +200 -136
- package/lib/rules/no-floating-decimal.js +74 -48
- package/lib/rules/no-func-assign.js +54 -55
- package/lib/rules/no-global-assign.js +78 -72
- package/lib/rules/no-implicit-coercion.js +350 -262
- package/lib/rules/no-implicit-globals.js +174 -133
- package/lib/rules/no-implied-eval.js +150 -112
- package/lib/rules/no-import-assign.js +145 -159
- package/lib/rules/no-inline-comments.js +101 -96
- package/lib/rules/no-inner-declarations.js +115 -78
- package/lib/rules/no-invalid-regexp.js +223 -174
- package/lib/rules/no-invalid-this.js +145 -117
- package/lib/rules/no-irregular-whitespace.js +266 -250
- package/lib/rules/no-iterator.js +29 -33
- package/lib/rules/no-label-var.js +59 -61
- package/lib/rules/no-labels.js +138 -131
- package/lib/rules/no-lone-blocks.js +127 -123
- package/lib/rules/no-lonely-if.js +105 -67
- package/lib/rules/no-loop-func.js +245 -184
- package/lib/rules/no-loss-of-precision.js +236 -201
- package/lib/rules/no-magic-numbers.js +339 -217
- package/lib/rules/no-misleading-character-class.js +548 -253
- package/lib/rules/no-mixed-operators.js +188 -164
- package/lib/rules/no-mixed-requires.js +253 -224
- package/lib/rules/no-mixed-spaces-and-tabs.js +135 -103
- package/lib/rules/no-multi-assign.js +46 -47
- package/lib/rules/no-multi-spaces.js +163 -125
- package/lib/rules/no-multi-str.js +42 -40
- package/lib/rules/no-multiple-empty-lines.js +196 -140
- package/lib/rules/no-native-reassign.js +90 -74
- package/lib/rules/no-negated-condition.js +79 -74
- package/lib/rules/no-negated-in-lhs.js +45 -32
- package/lib/rules/no-nested-ternary.js +33 -31
- package/lib/rules/no-new-func.js +71 -62
- package/lib/rules/no-new-native-nonconstructor.js +43 -39
- package/lib/rules/no-new-object.js +48 -39
- package/lib/rules/no-new-require.js +48 -31
- package/lib/rules/no-new-symbol.js +61 -43
- package/lib/rules/no-new-wrappers.js +43 -41
- package/lib/rules/no-new.js +28 -29
- package/lib/rules/no-nonoctal-decimal-escape.js +149 -121
- package/lib/rules/no-obj-calls.js +66 -53
- package/lib/rules/no-object-constructor.js +104 -97
- package/lib/rules/no-octal-escape.js +40 -43
- package/lib/rules/no-octal.js +29 -32
- package/lib/rules/no-param-reassign.js +236 -218
- package/lib/rules/no-path-concat.js +66 -51
- package/lib/rules/no-plusplus.js +60 -63
- package/lib/rules/no-process-env.js +49 -32
- package/lib/rules/no-process-exit.js +48 -28
- package/lib/rules/no-promise-executor-return.js +205 -204
- package/lib/rules/no-proto.js +26 -29
- package/lib/rules/no-prototype-builtins.js +146 -124
- package/lib/rules/no-redeclare.js +154 -155
- package/lib/rules/no-regex-spaces.js +183 -161
- package/lib/rules/no-restricted-exports.js +208 -174
- package/lib/rules/no-restricted-globals.js +254 -112
- package/lib/rules/no-restricted-imports.js +824 -384
- package/lib/rules/no-restricted-modules.js +222 -186
- package/lib/rules/no-restricted-properties.js +218 -153
- package/lib/rules/no-restricted-syntax.js +56 -52
- package/lib/rules/no-return-assign.js +56 -49
- package/lib/rules/no-return-await.js +147 -120
- package/lib/rules/no-script-url.js +53 -46
- package/lib/rules/no-self-assign.js +148 -145
- package/lib/rules/no-self-compare.js +63 -46
- package/lib/rules/no-sequences.js +135 -115
- package/lib/rules/no-setter-return.js +176 -178
- package/lib/rules/no-shadow-restricted-names.js +84 -36
- package/lib/rules/no-shadow.js +598 -310
- package/lib/rules/no-spaced-func.js +82 -60
- package/lib/rules/no-sparse-arrays.js +46 -28
- package/lib/rules/no-sync.js +61 -44
- package/lib/rules/no-tabs.js +83 -54
- package/lib/rules/no-template-curly-in-string.js +33 -32
- package/lib/rules/no-ternary.js +25 -28
- package/lib/rules/no-this-before-super.js +332 -298
- package/lib/rules/no-throw-literal.js +31 -36
- package/lib/rules/no-trailing-spaces.js +208 -174
- package/lib/rules/no-unassigned-vars.js +80 -0
- package/lib/rules/no-undef-init.js +86 -60
- package/lib/rules/no-undef.js +52 -47
- package/lib/rules/no-undefined.js +73 -74
- package/lib/rules/no-underscore-dangle.js +370 -322
- package/lib/rules/no-unexpected-multiline.js +112 -102
- package/lib/rules/no-unmodified-loop-condition.js +254 -254
- package/lib/rules/no-unneeded-ternary.js +212 -146
- package/lib/rules/no-unreachable-loop.js +145 -140
- package/lib/rules/no-unreachable.js +255 -248
- package/lib/rules/no-unsafe-finally.js +93 -85
- package/lib/rules/no-unsafe-negation.js +105 -81
- package/lib/rules/no-unsafe-optional-chaining.js +193 -177
- package/lib/rules/no-unused-expressions.js +199 -158
- package/lib/rules/no-unused-labels.js +139 -124
- package/lib/rules/no-unused-private-class-members.js +206 -182
- package/lib/rules/no-unused-vars.js +1708 -687
- package/lib/rules/no-use-before-define.js +327 -229
- package/lib/rules/no-useless-assignment.js +654 -0
- package/lib/rules/no-useless-backreference.js +212 -143
- package/lib/rules/no-useless-call.js +58 -53
- package/lib/rules/no-useless-catch.js +40 -40
- package/lib/rules/no-useless-computed-key.js +144 -108
- package/lib/rules/no-useless-concat.js +65 -59
- package/lib/rules/no-useless-constructor.js +160 -97
- package/lib/rules/no-useless-escape.js +364 -291
- package/lib/rules/no-useless-rename.js +183 -153
- package/lib/rules/no-useless-return.js +344 -307
- package/lib/rules/no-var.js +245 -212
- package/lib/rules/no-void.js +51 -46
- package/lib/rules/no-warning-comments.js +191 -183
- package/lib/rules/no-whitespace-before-property.js +131 -97
- package/lib/rules/no-with.js +24 -26
- package/lib/rules/nonblock-statement-body-position.js +149 -112
- package/lib/rules/object-curly-newline.js +306 -247
- package/lib/rules/object-curly-spacing.js +360 -296
- package/lib/rules/object-property-newline.js +137 -88
- package/lib/rules/object-shorthand.js +632 -500
- package/lib/rules/one-var-declaration-per-line.js +104 -82
- package/lib/rules/one-var.js +686 -536
- package/lib/rules/operator-assignment.js +219 -158
- package/lib/rules/operator-linebreak.js +295 -233
- package/lib/rules/padded-blocks.js +346 -290
- package/lib/rules/padding-line-between-statements.js +443 -421
- package/lib/rules/prefer-arrow-callback.js +371 -315
- package/lib/rules/prefer-const.js +418 -373
- package/lib/rules/prefer-destructuring.js +309 -278
- package/lib/rules/prefer-exponentiation-operator.js +176 -132
- package/lib/rules/prefer-named-capture-group.js +160 -141
- package/lib/rules/prefer-numeric-literals.js +121 -112
- package/lib/rules/prefer-object-has-own.js +116 -82
- package/lib/rules/prefer-object-spread.js +214 -193
- package/lib/rules/prefer-promise-reject-errors.js +140 -118
- package/lib/rules/prefer-reflect.js +126 -103
- package/lib/rules/prefer-regex-literals.js +561 -463
- package/lib/rules/prefer-rest-params.js +79 -80
- package/lib/rules/prefer-spread.js +47 -43
- package/lib/rules/prefer-template.js +266 -194
- package/lib/rules/preserve-caught-error.js +535 -0
- package/lib/rules/quote-props.js +373 -289
- package/lib/rules/quotes.js +374 -308
- package/lib/rules/radix.js +152 -134
- package/lib/rules/require-atomic-updates.js +316 -282
- package/lib/rules/require-await.js +153 -82
- package/lib/rules/require-unicode-regexp.js +296 -108
- package/lib/rules/require-yield.js +53 -54
- package/lib/rules/rest-spread-spacing.js +128 -98
- package/lib/rules/semi-spacing.js +281 -232
- package/lib/rules/semi-style.js +176 -116
- package/lib/rules/semi.js +456 -418
- package/lib/rules/sort-imports.js +307 -229
- package/lib/rules/sort-keys.js +219 -181
- package/lib/rules/sort-vars.js +127 -91
- package/lib/rules/space-before-blocks.js +199 -171
- package/lib/rules/space-before-function-paren.js +186 -148
- package/lib/rules/space-in-parens.js +359 -270
- package/lib/rules/space-infix-ops.js +237 -183
- package/lib/rules/space-unary-ops.js +356 -280
- package/lib/rules/spaced-comment.js +363 -301
- package/lib/rules/strict.js +266 -229
- package/lib/rules/switch-colon-spacing.js +130 -104
- package/lib/rules/symbol-description.js +45 -48
- package/lib/rules/template-curly-spacing.js +148 -124
- package/lib/rules/template-tag-spacing.js +98 -70
- package/lib/rules/unicode-bom.js +54 -54
- package/lib/rules/use-isnan.js +237 -110
- package/lib/rules/utils/ast-utils.js +2139 -1688
- package/lib/rules/utils/char-source.js +247 -0
- package/lib/rules/utils/fix-tracker.js +99 -88
- package/lib/rules/utils/keywords.js +59 -59
- package/lib/rules/utils/lazy-loading-rule-map.js +81 -78
- package/lib/rules/utils/regular-expressions.js +35 -19
- package/lib/rules/utils/unicode/index.js +9 -4
- package/lib/rules/utils/unicode/is-combining-character.js +1 -1
- package/lib/rules/utils/unicode/is-emoji-modifier.js +1 -1
- package/lib/rules/utils/unicode/is-regional-indicator-symbol.js +1 -1
- package/lib/rules/utils/unicode/is-surrogate-pair.js +1 -1
- package/lib/rules/valid-typeof.js +153 -109
- package/lib/rules/vars-on-top.js +152 -144
- package/lib/rules/wrap-iife.js +204 -173
- package/lib/rules/wrap-regex.js +77 -47
- package/lib/rules/yield-star-spacing.js +145 -116
- package/lib/rules/yoda.js +283 -274
- package/lib/services/parser-service.js +65 -0
- package/lib/services/processor-service.js +101 -0
- package/lib/services/suppressions-service.js +302 -0
- package/lib/services/warning-service.js +98 -0
- package/lib/shared/ajv.js +14 -14
- package/lib/shared/assert.js +21 -0
- package/lib/shared/ast-utils.js +7 -6
- package/lib/shared/deep-merge-arrays.js +62 -0
- package/lib/shared/directives.js +3 -2
- package/lib/shared/flags.js +108 -0
- package/lib/shared/logging.js +24 -16
- package/lib/shared/naming.js +109 -0
- package/lib/shared/option-utils.js +63 -0
- package/lib/shared/relative-module-resolver.js +18 -40
- package/lib/shared/runtime-info.js +138 -128
- package/lib/shared/serialization.js +78 -0
- package/lib/shared/severity.js +22 -22
- package/lib/shared/stats.js +30 -0
- package/lib/shared/string-utils.js +19 -21
- package/lib/shared/text-table.js +68 -0
- package/lib/shared/translate-cli-options.js +281 -0
- package/lib/shared/traverser.js +153 -146
- package/lib/types/config-api.d.ts +12 -0
- package/lib/types/index.d.ts +1473 -0
- package/lib/types/rules.d.ts +5589 -0
- package/lib/types/universal.d.ts +6 -0
- package/lib/types/use-at-your-own-risk.d.ts +87 -0
- package/lib/universal.js +10 -0
- package/lib/unsupported-api.js +8 -9
- package/messages/all-files-ignored.js +3 -3
- 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 +35 -16
- package/messages/eslintrc-plugins.js +8 -5
- package/messages/extend-config-missing.js +3 -3
- package/messages/failed-to-read-json.js +3 -3
- package/messages/file-not-found.js +3 -3
- package/messages/invalid-rule-options.js +2 -2
- package/messages/invalid-rule-severity.js +2 -2
- package/messages/no-config-found.js +4 -4
- package/messages/plugin-conflict.js +9 -9
- package/messages/plugin-invalid.js +4 -4
- package/messages/plugin-missing.js +4 -4
- package/messages/print-config-with-directory-path.js +2 -2
- package/messages/shared.js +6 -1
- package/messages/whitespace-found.js +3 -3
- package/package.json +105 -60
- package/conf/config-schema.js +0 -93
- package/lib/cli-engine/formatters/checkstyle.js +0 -60
- package/lib/cli-engine/formatters/compact.js +0 -60
- package/lib/cli-engine/formatters/jslint-xml.js +0 -41
- package/lib/cli-engine/formatters/junit.js +0 -82
- package/lib/cli-engine/formatters/tap.js +0 -95
- package/lib/cli-engine/formatters/unix.js +0 -58
- package/lib/cli-engine/formatters/visualstudio.js +0 -63
- package/lib/cli-engine/xml-escape.js +0 -34
- package/lib/config/flat-config-helpers.js +0 -111
- package/lib/config/rule-validator.js +0 -158
- package/lib/eslint/flat-eslint.js +0 -1159
- package/lib/linter/config-comment-parser.js +0 -185
- package/lib/linter/node-event-generator.js +0 -354
- package/lib/linter/report-translator.js +0 -369
- package/lib/linter/safe-emitter.js +0 -52
- package/lib/rule-tester/flat-rule-tester.js +0 -1131
- package/lib/rules/require-jsdoc.js +0 -122
- package/lib/rules/utils/patterns/letters.js +0 -36
- package/lib/rules/valid-jsdoc.js +0 -516
- package/lib/shared/config-validator.js +0 -347
- package/lib/shared/deprecation-warnings.js +0 -58
- package/lib/shared/types.js +0 -216
- package/lib/source-code/index.js +0 -5
- package/lib/source-code/source-code.js +0 -1055
- package/lib/source-code/token-store/backward-token-comment-cursor.js +0 -57
- package/lib/source-code/token-store/backward-token-cursor.js +0 -58
- package/lib/source-code/token-store/cursors.js +0 -90
- package/lib/source-code/token-store/forward-token-comment-cursor.js +0 -57
- package/lib/source-code/token-store/forward-token-cursor.js +0 -63
- package/lib/source-code/token-store/index.js +0 -627
- package/lib/source-code/token-store/padded-token-cursor.js +0 -38
- package/lib/source-code/token-store/utils.js +0 -107
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Worker thread for multithread linting.
|
|
3
|
+
* @author Francesco Trotta
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
"use strict";
|
|
7
|
+
|
|
8
|
+
const hrtimeBigint = process.hrtime.bigint;
|
|
9
|
+
|
|
10
|
+
const startTime = hrtimeBigint();
|
|
11
|
+
|
|
12
|
+
// eslint-disable-next-line n/no-unsupported-features/node-builtins -- enable V8's code cache if supported
|
|
13
|
+
require("node:module").enableCompileCache?.();
|
|
14
|
+
|
|
15
|
+
//------------------------------------------------------------------------------
|
|
16
|
+
// Requirements
|
|
17
|
+
//------------------------------------------------------------------------------
|
|
18
|
+
|
|
19
|
+
const { parentPort, threadId, workerData } = require("node:worker_threads");
|
|
20
|
+
const {
|
|
21
|
+
createConfigLoader,
|
|
22
|
+
createDebug,
|
|
23
|
+
createDefaultConfigs,
|
|
24
|
+
createLinter,
|
|
25
|
+
createLintResultCache,
|
|
26
|
+
getCacheFile,
|
|
27
|
+
lintFile,
|
|
28
|
+
loadOptionsFromModule,
|
|
29
|
+
processOptions,
|
|
30
|
+
} = require("./eslint-helpers");
|
|
31
|
+
const { WarningService } = require("../services/warning-service");
|
|
32
|
+
const timing = require("../linter/timing");
|
|
33
|
+
|
|
34
|
+
const depsLoadedTime = hrtimeBigint();
|
|
35
|
+
|
|
36
|
+
//------------------------------------------------------------------------------
|
|
37
|
+
// Typedefs
|
|
38
|
+
//------------------------------------------------------------------------------
|
|
39
|
+
|
|
40
|
+
/** @typedef {import("../types").ESLint.LintResult} LintResult */
|
|
41
|
+
/** @typedef {import("../types").ESLint.Options} ESLintOptions */
|
|
42
|
+
/** @typedef {LintResult & { index?: number; }} IndexedLintResult */
|
|
43
|
+
/** @typedef {IndexedLintResult[] & { netLintingDuration: bigint; timings?: Record<string, number>; }} WorkerLintResults */
|
|
44
|
+
/**
|
|
45
|
+
* @typedef {Object} WorkerData - Data passed to the worker thread.
|
|
46
|
+
* @property {ESLintOptions | string} eslintOptionsOrURL - The unprocessed ESLint options or the URL of the options module.
|
|
47
|
+
* @property {Uint32Array<SharedArrayBuffer>} filePathIndexArray - Shared counter used to track the next file to lint.
|
|
48
|
+
* @property {string[]} filePaths - File paths to lint.
|
|
49
|
+
*/
|
|
50
|
+
|
|
51
|
+
//------------------------------------------------------------------------------
|
|
52
|
+
// Helpers
|
|
53
|
+
//------------------------------------------------------------------------------
|
|
54
|
+
|
|
55
|
+
const debug = createDebug(`eslint:worker:thread-${threadId}`);
|
|
56
|
+
|
|
57
|
+
//------------------------------------------------------------------------------
|
|
58
|
+
// Main
|
|
59
|
+
//------------------------------------------------------------------------------
|
|
60
|
+
|
|
61
|
+
/*
|
|
62
|
+
* Prevent timing module from printing profiling output from worker threads.
|
|
63
|
+
* The main thread is responsible for displaying any aggregated timings.
|
|
64
|
+
*/
|
|
65
|
+
timing.disableDisplay();
|
|
66
|
+
|
|
67
|
+
debug("Dependencies loaded in %t", depsLoadedTime - startTime);
|
|
68
|
+
|
|
69
|
+
(async () => {
|
|
70
|
+
/** @type {WorkerData} */
|
|
71
|
+
const { eslintOptionsOrURL, filePathIndexArray, filePaths } = workerData;
|
|
72
|
+
const eslintOptions =
|
|
73
|
+
typeof eslintOptionsOrURL === "object"
|
|
74
|
+
? eslintOptionsOrURL
|
|
75
|
+
: await loadOptionsFromModule(eslintOptionsOrURL);
|
|
76
|
+
const processedESLintOptions = processOptions(eslintOptions);
|
|
77
|
+
|
|
78
|
+
const warningService = new WarningService();
|
|
79
|
+
|
|
80
|
+
// These warnings are always emitted by the controlling thread.
|
|
81
|
+
warningService.emitEmptyConfigWarning =
|
|
82
|
+
warningService.emitInactiveFlagWarning = () => {};
|
|
83
|
+
|
|
84
|
+
const linter = createLinter(processedESLintOptions, warningService);
|
|
85
|
+
|
|
86
|
+
const cacheFilePath = getCacheFile(
|
|
87
|
+
processedESLintOptions.cacheLocation,
|
|
88
|
+
processedESLintOptions.cwd,
|
|
89
|
+
);
|
|
90
|
+
|
|
91
|
+
const lintResultCache = createLintResultCache(
|
|
92
|
+
processedESLintOptions,
|
|
93
|
+
cacheFilePath,
|
|
94
|
+
);
|
|
95
|
+
const defaultConfigs = createDefaultConfigs(eslintOptions.plugins);
|
|
96
|
+
|
|
97
|
+
const configLoader = createConfigLoader(
|
|
98
|
+
processedESLintOptions,
|
|
99
|
+
defaultConfigs,
|
|
100
|
+
linter,
|
|
101
|
+
warningService,
|
|
102
|
+
);
|
|
103
|
+
|
|
104
|
+
/** @type {WorkerLintResults} */
|
|
105
|
+
const indexedResults = [];
|
|
106
|
+
let loadConfigTotalDuration = 0n;
|
|
107
|
+
const readFileCounter = { duration: 0n };
|
|
108
|
+
|
|
109
|
+
const lintingStartTime = hrtimeBigint();
|
|
110
|
+
debug(
|
|
111
|
+
"Linting started %t after dependencies loaded",
|
|
112
|
+
lintingStartTime - depsLoadedTime,
|
|
113
|
+
);
|
|
114
|
+
|
|
115
|
+
for (;;) {
|
|
116
|
+
const fileLintingStartTime = hrtimeBigint();
|
|
117
|
+
|
|
118
|
+
// It seems hard to produce an arithmetic overflow under realistic conditions here.
|
|
119
|
+
const index = Atomics.add(filePathIndexArray, 0, 1);
|
|
120
|
+
|
|
121
|
+
const filePath = filePaths[index];
|
|
122
|
+
if (!filePath) {
|
|
123
|
+
break;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
const loadConfigEnterTime = hrtimeBigint();
|
|
127
|
+
const configs = await configLoader.loadConfigArrayForFile(filePath);
|
|
128
|
+
const loadConfigExitTime = hrtimeBigint();
|
|
129
|
+
const loadConfigDuration = loadConfigExitTime - loadConfigEnterTime;
|
|
130
|
+
debug(
|
|
131
|
+
'Config array for file "%s" loaded in %t',
|
|
132
|
+
filePath,
|
|
133
|
+
loadConfigDuration,
|
|
134
|
+
);
|
|
135
|
+
loadConfigTotalDuration += loadConfigDuration;
|
|
136
|
+
|
|
137
|
+
/** @type {IndexedLintResult} */
|
|
138
|
+
const result = await lintFile(
|
|
139
|
+
filePath,
|
|
140
|
+
configs,
|
|
141
|
+
processedESLintOptions,
|
|
142
|
+
linter,
|
|
143
|
+
lintResultCache,
|
|
144
|
+
readFileCounter,
|
|
145
|
+
);
|
|
146
|
+
if (result) {
|
|
147
|
+
result.index = index;
|
|
148
|
+
indexedResults.push(result);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
const fileLintingEndTime = hrtimeBigint();
|
|
152
|
+
debug(
|
|
153
|
+
'File "%s" processed in %t',
|
|
154
|
+
filePath,
|
|
155
|
+
fileLintingEndTime - fileLintingStartTime,
|
|
156
|
+
);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
const lintingDuration = hrtimeBigint() - lintingStartTime;
|
|
160
|
+
|
|
161
|
+
/*
|
|
162
|
+
* The net linting duration is the total linting time minus the time spent loading configs and reading files.
|
|
163
|
+
* It captures the processing time dedicated to computation-intensive tasks that are highly parallelizable and not repeated across threads.
|
|
164
|
+
*/
|
|
165
|
+
indexedResults.netLintingDuration =
|
|
166
|
+
lintingDuration - loadConfigTotalDuration - readFileCounter.duration;
|
|
167
|
+
|
|
168
|
+
if (timing.enabled) {
|
|
169
|
+
indexedResults.timings = timing.getData();
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
parentPort.postMessage(indexedResults);
|
|
173
|
+
})();
|
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview JavaScript Language Object
|
|
3
|
+
* @author Nicholas C. Zakas
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
"use strict";
|
|
7
|
+
|
|
8
|
+
//-----------------------------------------------------------------------------
|
|
9
|
+
// Requirements
|
|
10
|
+
//-----------------------------------------------------------------------------
|
|
11
|
+
|
|
12
|
+
const { SourceCode } = require("./source-code");
|
|
13
|
+
const createDebug = require("debug");
|
|
14
|
+
const astUtils = require("../../shared/ast-utils");
|
|
15
|
+
const espree = require("espree");
|
|
16
|
+
const eslintScope = require("eslint-scope");
|
|
17
|
+
const evk = require("eslint-visitor-keys");
|
|
18
|
+
const { validateLanguageOptions } = require("./validate-language-options");
|
|
19
|
+
const { LATEST_ECMA_VERSION } = require("../../../conf/ecma-version");
|
|
20
|
+
|
|
21
|
+
//-----------------------------------------------------------------------------
|
|
22
|
+
// Type Definitions
|
|
23
|
+
//-----------------------------------------------------------------------------
|
|
24
|
+
|
|
25
|
+
/** @typedef {import("@eslint/core").File} File */
|
|
26
|
+
/** @typedef {import("@eslint/core").Language} Language */
|
|
27
|
+
/** @typedef {import("@eslint/core").OkParseResult} OkParseResult */
|
|
28
|
+
/** @typedef {import("../../types").Linter.LanguageOptions} JSLanguageOptions */
|
|
29
|
+
|
|
30
|
+
//-----------------------------------------------------------------------------
|
|
31
|
+
// Helpers
|
|
32
|
+
//-----------------------------------------------------------------------------
|
|
33
|
+
|
|
34
|
+
const debug = createDebug("eslint:languages:js");
|
|
35
|
+
const DEFAULT_ECMA_VERSION = 5;
|
|
36
|
+
const parserSymbol = Symbol.for("eslint.RuleTester.parser");
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Analyze scope of the given AST.
|
|
40
|
+
* @param {ASTNode} ast The `Program` node to analyze.
|
|
41
|
+
* @param {JSLanguageOptions} languageOptions The parser options.
|
|
42
|
+
* @param {Record<string, string[]>} visitorKeys The visitor keys.
|
|
43
|
+
* @returns {ScopeManager} The analysis result.
|
|
44
|
+
*/
|
|
45
|
+
function analyzeScope(ast, languageOptions, visitorKeys) {
|
|
46
|
+
const parserOptions = languageOptions.parserOptions;
|
|
47
|
+
const ecmaFeatures = parserOptions.ecmaFeatures || {};
|
|
48
|
+
const ecmaVersion = languageOptions.ecmaVersion || DEFAULT_ECMA_VERSION;
|
|
49
|
+
|
|
50
|
+
return eslintScope.analyze(ast, {
|
|
51
|
+
ignoreEval: true,
|
|
52
|
+
nodejsScope: ecmaFeatures.globalReturn,
|
|
53
|
+
impliedStrict: ecmaFeatures.impliedStrict,
|
|
54
|
+
ecmaVersion: typeof ecmaVersion === "number" ? ecmaVersion : 6,
|
|
55
|
+
sourceType: languageOptions.sourceType || "script",
|
|
56
|
+
childVisitorKeys: visitorKeys || evk.KEYS,
|
|
57
|
+
fallback: evk.getKeys,
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Determines if a given object is Espree.
|
|
63
|
+
* @param {Object} parser The parser to check.
|
|
64
|
+
* @returns {boolean} True if the parser is Espree or false if not.
|
|
65
|
+
*/
|
|
66
|
+
function isEspree(parser) {
|
|
67
|
+
return !!(parser === espree || parser[parserSymbol] === espree);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Normalize ECMAScript version from the initial config into languageOptions (year)
|
|
72
|
+
* format.
|
|
73
|
+
* @param {any} [ecmaVersion] ECMAScript version from the initial config
|
|
74
|
+
* @returns {number} normalized ECMAScript version
|
|
75
|
+
*/
|
|
76
|
+
function normalizeEcmaVersionForLanguageOptions(ecmaVersion) {
|
|
77
|
+
switch (ecmaVersion) {
|
|
78
|
+
case 3:
|
|
79
|
+
return 3;
|
|
80
|
+
|
|
81
|
+
// void 0 = no ecmaVersion specified so use the default
|
|
82
|
+
case 5:
|
|
83
|
+
case void 0:
|
|
84
|
+
return 5;
|
|
85
|
+
|
|
86
|
+
default:
|
|
87
|
+
if (typeof ecmaVersion === "number") {
|
|
88
|
+
return ecmaVersion >= 2015 ? ecmaVersion : ecmaVersion + 2009;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/*
|
|
93
|
+
* We default to the latest supported ecmaVersion for everything else.
|
|
94
|
+
* Remember, this is for languageOptions.ecmaVersion, which sets the version
|
|
95
|
+
* that is used for a number of processes inside of ESLint. It's normally
|
|
96
|
+
* safe to assume people want the latest unless otherwise specified.
|
|
97
|
+
*/
|
|
98
|
+
return LATEST_ECMA_VERSION;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
//-----------------------------------------------------------------------------
|
|
102
|
+
// Exports
|
|
103
|
+
//-----------------------------------------------------------------------------
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* @type {Language}
|
|
107
|
+
*/
|
|
108
|
+
module.exports = {
|
|
109
|
+
fileType: "text",
|
|
110
|
+
lineStart: 1,
|
|
111
|
+
columnStart: 0,
|
|
112
|
+
nodeTypeKey: "type",
|
|
113
|
+
visitorKeys: evk.KEYS,
|
|
114
|
+
|
|
115
|
+
defaultLanguageOptions: {
|
|
116
|
+
sourceType: "module",
|
|
117
|
+
ecmaVersion: "latest",
|
|
118
|
+
parser: espree,
|
|
119
|
+
parserOptions: {},
|
|
120
|
+
},
|
|
121
|
+
|
|
122
|
+
validateLanguageOptions,
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Normalizes the language options.
|
|
126
|
+
* @param {Object} languageOptions The language options to normalize.
|
|
127
|
+
* @returns {Object} The normalized language options.
|
|
128
|
+
*/
|
|
129
|
+
normalizeLanguageOptions(languageOptions) {
|
|
130
|
+
languageOptions.ecmaVersion = normalizeEcmaVersionForLanguageOptions(
|
|
131
|
+
languageOptions.ecmaVersion,
|
|
132
|
+
);
|
|
133
|
+
|
|
134
|
+
// Espree expects this information to be passed in
|
|
135
|
+
if (isEspree(languageOptions.parser)) {
|
|
136
|
+
const parserOptions = languageOptions.parserOptions;
|
|
137
|
+
|
|
138
|
+
if (languageOptions.sourceType) {
|
|
139
|
+
parserOptions.sourceType = languageOptions.sourceType;
|
|
140
|
+
|
|
141
|
+
if (
|
|
142
|
+
parserOptions.sourceType === "module" &&
|
|
143
|
+
parserOptions.ecmaFeatures &&
|
|
144
|
+
parserOptions.ecmaFeatures.globalReturn
|
|
145
|
+
) {
|
|
146
|
+
parserOptions.ecmaFeatures.globalReturn = false;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
return languageOptions;
|
|
152
|
+
},
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Determines if a given node matches a given selector class.
|
|
156
|
+
* @param {string} className The class name to check.
|
|
157
|
+
* @param {ASTNode} node The node to check.
|
|
158
|
+
* @param {Array<ASTNode>} ancestry The ancestry of the node.
|
|
159
|
+
* @returns {boolean} True if there's a match, false if not.
|
|
160
|
+
* @throws {Error} When an unknown class name is passed.
|
|
161
|
+
*/
|
|
162
|
+
matchesSelectorClass(className, node, ancestry) {
|
|
163
|
+
/*
|
|
164
|
+
* Copyright (c) 2013, Joel Feenstra
|
|
165
|
+
* All rights reserved.
|
|
166
|
+
*
|
|
167
|
+
* Redistribution and use in source and binary forms, with or without
|
|
168
|
+
* modification, are permitted provided that the following conditions are met:
|
|
169
|
+
* * Redistributions of source code must retain the above copyright
|
|
170
|
+
* notice, this list of conditions and the following disclaimer.
|
|
171
|
+
* * Redistributions in binary form must reproduce the above copyright
|
|
172
|
+
* notice, this list of conditions and the following disclaimer in the
|
|
173
|
+
* documentation and/or other materials provided with the distribution.
|
|
174
|
+
* * Neither the name of the ESQuery nor the names of its contributors may
|
|
175
|
+
* be used to endorse or promote products derived from this software without
|
|
176
|
+
* specific prior written permission.
|
|
177
|
+
*
|
|
178
|
+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
|
179
|
+
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
180
|
+
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
181
|
+
* DISCLAIMED. IN NO EVENT SHALL JOEL FEENSTRA BE LIABLE FOR ANY
|
|
182
|
+
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
183
|
+
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
184
|
+
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
|
185
|
+
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
186
|
+
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
187
|
+
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
188
|
+
*/
|
|
189
|
+
|
|
190
|
+
switch (className.toLowerCase()) {
|
|
191
|
+
case "statement":
|
|
192
|
+
if (node.type.slice(-9) === "Statement") {
|
|
193
|
+
return true;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
// fallthrough: interface Declaration <: Statement { }
|
|
197
|
+
|
|
198
|
+
case "declaration":
|
|
199
|
+
return node.type.slice(-11) === "Declaration";
|
|
200
|
+
|
|
201
|
+
case "pattern":
|
|
202
|
+
if (node.type.slice(-7) === "Pattern") {
|
|
203
|
+
return true;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
// fallthrough: interface Expression <: Node, Pattern { }
|
|
207
|
+
|
|
208
|
+
case "expression":
|
|
209
|
+
return (
|
|
210
|
+
node.type.slice(-10) === "Expression" ||
|
|
211
|
+
node.type.slice(-7) === "Literal" ||
|
|
212
|
+
(node.type === "Identifier" &&
|
|
213
|
+
(ancestry.length === 0 ||
|
|
214
|
+
ancestry[0].type !== "MetaProperty")) ||
|
|
215
|
+
node.type === "MetaProperty"
|
|
216
|
+
);
|
|
217
|
+
|
|
218
|
+
case "function":
|
|
219
|
+
return (
|
|
220
|
+
node.type === "FunctionDeclaration" ||
|
|
221
|
+
node.type === "FunctionExpression" ||
|
|
222
|
+
node.type === "ArrowFunctionExpression"
|
|
223
|
+
);
|
|
224
|
+
|
|
225
|
+
default:
|
|
226
|
+
throw new Error(`Unknown class name: ${className}`);
|
|
227
|
+
}
|
|
228
|
+
},
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* Parses the given file into an AST.
|
|
232
|
+
* @param {File} file The virtual file to parse.
|
|
233
|
+
* @param {Object} options Additional options passed from ESLint.
|
|
234
|
+
* @param {JSLanguageOptions} options.languageOptions The language options.
|
|
235
|
+
* @returns {Object} The result of parsing.
|
|
236
|
+
*/
|
|
237
|
+
parse(file, { languageOptions }) {
|
|
238
|
+
// Note: BOM already removed
|
|
239
|
+
const { body: text, path: filePath } = file;
|
|
240
|
+
const textToParse = text.replace(
|
|
241
|
+
astUtils.shebangPattern,
|
|
242
|
+
(match, captured) => `//${captured}`,
|
|
243
|
+
);
|
|
244
|
+
const { ecmaVersion, sourceType, parser } = languageOptions;
|
|
245
|
+
const parserOptions = Object.assign(
|
|
246
|
+
{ ecmaVersion, sourceType },
|
|
247
|
+
languageOptions.parserOptions,
|
|
248
|
+
{
|
|
249
|
+
loc: true,
|
|
250
|
+
range: true,
|
|
251
|
+
raw: true,
|
|
252
|
+
tokens: true,
|
|
253
|
+
comment: true,
|
|
254
|
+
eslintVisitorKeys: true,
|
|
255
|
+
eslintScopeManager: true,
|
|
256
|
+
filePath,
|
|
257
|
+
},
|
|
258
|
+
);
|
|
259
|
+
|
|
260
|
+
/*
|
|
261
|
+
* Check for parsing errors first. If there's a parsing error, nothing
|
|
262
|
+
* else can happen. However, a parsing error does not throw an error
|
|
263
|
+
* from this method - it's just considered a fatal error message, a
|
|
264
|
+
* problem that ESLint identified just like any other.
|
|
265
|
+
*/
|
|
266
|
+
try {
|
|
267
|
+
debug("Parsing:", filePath);
|
|
268
|
+
const parseResult =
|
|
269
|
+
typeof parser.parseForESLint === "function"
|
|
270
|
+
? parser.parseForESLint(textToParse, parserOptions)
|
|
271
|
+
: { ast: parser.parse(textToParse, parserOptions) };
|
|
272
|
+
|
|
273
|
+
debug("Parsing successful:", filePath);
|
|
274
|
+
|
|
275
|
+
const {
|
|
276
|
+
ast,
|
|
277
|
+
services: parserServices = {},
|
|
278
|
+
visitorKeys = evk.KEYS,
|
|
279
|
+
scopeManager,
|
|
280
|
+
} = parseResult;
|
|
281
|
+
|
|
282
|
+
return {
|
|
283
|
+
ok: true,
|
|
284
|
+
ast,
|
|
285
|
+
parserServices,
|
|
286
|
+
visitorKeys,
|
|
287
|
+
scopeManager,
|
|
288
|
+
};
|
|
289
|
+
} catch (ex) {
|
|
290
|
+
// If the message includes a leading line number, strip it:
|
|
291
|
+
const message = ex.message.replace(/^line \d+:/iu, "").trim();
|
|
292
|
+
|
|
293
|
+
debug("%s\n%s", message, ex.stack);
|
|
294
|
+
|
|
295
|
+
return {
|
|
296
|
+
ok: false,
|
|
297
|
+
errors: [
|
|
298
|
+
{
|
|
299
|
+
message,
|
|
300
|
+
line: ex.lineNumber,
|
|
301
|
+
column: ex.column,
|
|
302
|
+
},
|
|
303
|
+
],
|
|
304
|
+
};
|
|
305
|
+
}
|
|
306
|
+
},
|
|
307
|
+
|
|
308
|
+
/**
|
|
309
|
+
* Creates a new `SourceCode` object from the given information.
|
|
310
|
+
* @param {File} file The virtual file to create a `SourceCode` object from.
|
|
311
|
+
* @param {OkParseResult} parseResult The result returned from `parse()`.
|
|
312
|
+
* @param {Object} options Additional options passed from ESLint.
|
|
313
|
+
* @param {JSLanguageOptions} options.languageOptions The language options.
|
|
314
|
+
* @returns {SourceCode} The new `SourceCode` object.
|
|
315
|
+
*/
|
|
316
|
+
createSourceCode(file, parseResult, { languageOptions }) {
|
|
317
|
+
const { body: text, path: filePath, bom: hasBOM } = file;
|
|
318
|
+
const { ast, parserServices, visitorKeys } = parseResult;
|
|
319
|
+
|
|
320
|
+
debug("Scope analysis:", filePath);
|
|
321
|
+
const scopeManager =
|
|
322
|
+
parseResult.scopeManager ||
|
|
323
|
+
analyzeScope(ast, languageOptions, visitorKeys);
|
|
324
|
+
|
|
325
|
+
debug("Scope analysis successful:", filePath);
|
|
326
|
+
|
|
327
|
+
return new SourceCode({
|
|
328
|
+
text,
|
|
329
|
+
ast,
|
|
330
|
+
hasBOM,
|
|
331
|
+
parserServices,
|
|
332
|
+
scopeManager,
|
|
333
|
+
visitorKeys,
|
|
334
|
+
});
|
|
335
|
+
},
|
|
336
|
+
};
|