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
|
@@ -1,185 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview Config Comment Parser
|
|
3
|
-
* @author Nicholas C. Zakas
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
/* eslint class-methods-use-this: off -- Methods desired on instance */
|
|
7
|
-
"use strict";
|
|
8
|
-
|
|
9
|
-
//------------------------------------------------------------------------------
|
|
10
|
-
// Requirements
|
|
11
|
-
//------------------------------------------------------------------------------
|
|
12
|
-
|
|
13
|
-
const levn = require("levn"),
|
|
14
|
-
{
|
|
15
|
-
Legacy: {
|
|
16
|
-
ConfigOps
|
|
17
|
-
}
|
|
18
|
-
} = require("@eslint/eslintrc/universal"),
|
|
19
|
-
{
|
|
20
|
-
directivesPattern
|
|
21
|
-
} = require("../shared/directives");
|
|
22
|
-
|
|
23
|
-
const debug = require("debug")("eslint:config-comment-parser");
|
|
24
|
-
|
|
25
|
-
//------------------------------------------------------------------------------
|
|
26
|
-
// Typedefs
|
|
27
|
-
//------------------------------------------------------------------------------
|
|
28
|
-
|
|
29
|
-
/** @typedef {import("../shared/types").LintMessage} LintMessage */
|
|
30
|
-
|
|
31
|
-
//------------------------------------------------------------------------------
|
|
32
|
-
// Public Interface
|
|
33
|
-
//------------------------------------------------------------------------------
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* Object to parse ESLint configuration comments inside JavaScript files.
|
|
37
|
-
* @name ConfigCommentParser
|
|
38
|
-
*/
|
|
39
|
-
module.exports = class ConfigCommentParser {
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* Parses a list of "name:string_value" or/and "name" options divided by comma or
|
|
43
|
-
* whitespace. Used for "global" and "exported" comments.
|
|
44
|
-
* @param {string} string The string to parse.
|
|
45
|
-
* @param {Comment} comment The comment node which has the string.
|
|
46
|
-
* @returns {Object} Result map object of names and string values, or null values if no value was provided
|
|
47
|
-
*/
|
|
48
|
-
parseStringConfig(string, comment) {
|
|
49
|
-
debug("Parsing String config");
|
|
50
|
-
|
|
51
|
-
const items = {};
|
|
52
|
-
|
|
53
|
-
// Collapse whitespace around `:` and `,` to make parsing easier
|
|
54
|
-
const trimmedString = string.replace(/\s*([:,])\s*/gu, "$1");
|
|
55
|
-
|
|
56
|
-
trimmedString.split(/\s|,+/u).forEach(name => {
|
|
57
|
-
if (!name) {
|
|
58
|
-
return;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
// value defaults to null (if not provided), e.g: "foo" => ["foo", null]
|
|
62
|
-
const [key, value = null] = name.split(":");
|
|
63
|
-
|
|
64
|
-
items[key] = { value, comment };
|
|
65
|
-
});
|
|
66
|
-
return items;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
/**
|
|
70
|
-
* Parses a JSON-like config.
|
|
71
|
-
* @param {string} string The string to parse.
|
|
72
|
-
* @param {Object} location Start line and column of comments for potential error message.
|
|
73
|
-
* @returns {({success: true, config: Object}|{success: false, error: LintMessage})} Result map object
|
|
74
|
-
*/
|
|
75
|
-
parseJsonConfig(string, location) {
|
|
76
|
-
debug("Parsing JSON config");
|
|
77
|
-
|
|
78
|
-
let items = {};
|
|
79
|
-
|
|
80
|
-
// Parses a JSON-like comment by the same way as parsing CLI option.
|
|
81
|
-
try {
|
|
82
|
-
items = levn.parse("Object", string) || {};
|
|
83
|
-
|
|
84
|
-
// Some tests say that it should ignore invalid comments such as `/*eslint no-alert:abc*/`.
|
|
85
|
-
// Also, commaless notations have invalid severity:
|
|
86
|
-
// "no-alert: 2 no-console: 2" --> {"no-alert": "2 no-console: 2"}
|
|
87
|
-
// Should ignore that case as well.
|
|
88
|
-
if (ConfigOps.isEverySeverityValid(items)) {
|
|
89
|
-
return {
|
|
90
|
-
success: true,
|
|
91
|
-
config: items
|
|
92
|
-
};
|
|
93
|
-
}
|
|
94
|
-
} catch {
|
|
95
|
-
|
|
96
|
-
debug("Levn parsing failed; falling back to manual parsing.");
|
|
97
|
-
|
|
98
|
-
// ignore to parse the string by a fallback.
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
/*
|
|
102
|
-
* Optionator cannot parse commaless notations.
|
|
103
|
-
* But we are supporting that. So this is a fallback for that.
|
|
104
|
-
*/
|
|
105
|
-
items = {};
|
|
106
|
-
const normalizedString = string.replace(/([-a-zA-Z0-9/]+):/gu, "\"$1\":").replace(/(\]|[0-9])\s+(?=")/u, "$1,");
|
|
107
|
-
|
|
108
|
-
try {
|
|
109
|
-
items = JSON.parse(`{${normalizedString}}`);
|
|
110
|
-
} catch (ex) {
|
|
111
|
-
debug("Manual parsing failed.");
|
|
112
|
-
|
|
113
|
-
return {
|
|
114
|
-
success: false,
|
|
115
|
-
error: {
|
|
116
|
-
ruleId: null,
|
|
117
|
-
fatal: true,
|
|
118
|
-
severity: 2,
|
|
119
|
-
message: `Failed to parse JSON from '${normalizedString}': ${ex.message}`,
|
|
120
|
-
line: location.start.line,
|
|
121
|
-
column: location.start.column + 1,
|
|
122
|
-
nodeType: null
|
|
123
|
-
}
|
|
124
|
-
};
|
|
125
|
-
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
return {
|
|
129
|
-
success: true,
|
|
130
|
-
config: items
|
|
131
|
-
};
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
/**
|
|
135
|
-
* Parses a config of values separated by comma.
|
|
136
|
-
* @param {string} string The string to parse.
|
|
137
|
-
* @returns {Object} Result map of values and true values
|
|
138
|
-
*/
|
|
139
|
-
parseListConfig(string) {
|
|
140
|
-
debug("Parsing list config");
|
|
141
|
-
|
|
142
|
-
const items = {};
|
|
143
|
-
|
|
144
|
-
string.split(",").forEach(name => {
|
|
145
|
-
const trimmedName = name.trim().replace(/^(?<quote>['"]?)(?<ruleId>.*)\k<quote>$/us, "$<ruleId>");
|
|
146
|
-
|
|
147
|
-
if (trimmedName) {
|
|
148
|
-
items[trimmedName] = true;
|
|
149
|
-
}
|
|
150
|
-
});
|
|
151
|
-
return items;
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
/**
|
|
155
|
-
* Extract the directive and the justification from a given directive comment and trim them.
|
|
156
|
-
* @param {string} value The comment text to extract.
|
|
157
|
-
* @returns {{directivePart: string, justificationPart: string}} The extracted directive and justification.
|
|
158
|
-
*/
|
|
159
|
-
extractDirectiveComment(value) {
|
|
160
|
-
const match = /\s-{2,}\s/u.exec(value);
|
|
161
|
-
|
|
162
|
-
if (!match) {
|
|
163
|
-
return { directivePart: value.trim(), justificationPart: "" };
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
const directive = value.slice(0, match.index).trim();
|
|
167
|
-
const justification = value.slice(match.index + match[0].length).trim();
|
|
168
|
-
|
|
169
|
-
return { directivePart: directive, justificationPart: justification };
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
/**
|
|
173
|
-
* Parses a directive comment into directive text and value.
|
|
174
|
-
* @param {Comment} comment The comment node with the directive to be parsed.
|
|
175
|
-
* @returns {{directiveText: string, directiveValue: string}} The directive text and value.
|
|
176
|
-
*/
|
|
177
|
-
parseDirective(comment) {
|
|
178
|
-
const { directivePart } = this.extractDirectiveComment(comment.value);
|
|
179
|
-
const match = directivesPattern.exec(directivePart);
|
|
180
|
-
const directiveText = match[1];
|
|
181
|
-
const directiveValue = directivePart.slice(match.index + directiveText.length);
|
|
182
|
-
|
|
183
|
-
return { directiveText, directiveValue };
|
|
184
|
-
}
|
|
185
|
-
};
|
|
@@ -1,354 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview The event generator for AST nodes.
|
|
3
|
-
* @author Toru Nagashima
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
"use strict";
|
|
7
|
-
|
|
8
|
-
//------------------------------------------------------------------------------
|
|
9
|
-
// Requirements
|
|
10
|
-
//------------------------------------------------------------------------------
|
|
11
|
-
|
|
12
|
-
const esquery = require("esquery");
|
|
13
|
-
|
|
14
|
-
//------------------------------------------------------------------------------
|
|
15
|
-
// Typedefs
|
|
16
|
-
//------------------------------------------------------------------------------
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* An object describing an AST selector
|
|
20
|
-
* @typedef {Object} ASTSelector
|
|
21
|
-
* @property {string} rawSelector The string that was parsed into this selector
|
|
22
|
-
* @property {boolean} isExit `true` if this should be emitted when exiting the node rather than when entering
|
|
23
|
-
* @property {Object} parsedSelector An object (from esquery) describing the matching behavior of the selector
|
|
24
|
-
* @property {string[]|null} listenerTypes A list of node types that could possibly cause the selector to match,
|
|
25
|
-
* or `null` if all node types could cause a match
|
|
26
|
-
* @property {number} attributeCount The total number of classes, pseudo-classes, and attribute queries in this selector
|
|
27
|
-
* @property {number} identifierCount The total number of identifier queries in this selector
|
|
28
|
-
*/
|
|
29
|
-
|
|
30
|
-
//------------------------------------------------------------------------------
|
|
31
|
-
// Helpers
|
|
32
|
-
//------------------------------------------------------------------------------
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
* Computes the union of one or more arrays
|
|
36
|
-
* @param {...any[]} arrays One or more arrays to union
|
|
37
|
-
* @returns {any[]} The union of the input arrays
|
|
38
|
-
*/
|
|
39
|
-
function union(...arrays) {
|
|
40
|
-
return [...new Set(arrays.flat())];
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
* Computes the intersection of one or more arrays
|
|
45
|
-
* @param {...any[]} arrays One or more arrays to intersect
|
|
46
|
-
* @returns {any[]} The intersection of the input arrays
|
|
47
|
-
*/
|
|
48
|
-
function intersection(...arrays) {
|
|
49
|
-
if (arrays.length === 0) {
|
|
50
|
-
return [];
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
let result = [...new Set(arrays[0])];
|
|
54
|
-
|
|
55
|
-
for (const array of arrays.slice(1)) {
|
|
56
|
-
result = result.filter(x => array.includes(x));
|
|
57
|
-
}
|
|
58
|
-
return result;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
/**
|
|
62
|
-
* Gets the possible types of a selector
|
|
63
|
-
* @param {Object} parsedSelector An object (from esquery) describing the matching behavior of the selector
|
|
64
|
-
* @returns {string[]|null} The node types that could possibly trigger this selector, or `null` if all node types could trigger it
|
|
65
|
-
*/
|
|
66
|
-
function getPossibleTypes(parsedSelector) {
|
|
67
|
-
switch (parsedSelector.type) {
|
|
68
|
-
case "identifier":
|
|
69
|
-
return [parsedSelector.value];
|
|
70
|
-
|
|
71
|
-
case "matches": {
|
|
72
|
-
const typesForComponents = parsedSelector.selectors.map(getPossibleTypes);
|
|
73
|
-
|
|
74
|
-
if (typesForComponents.every(Boolean)) {
|
|
75
|
-
return union(...typesForComponents);
|
|
76
|
-
}
|
|
77
|
-
return null;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
case "compound": {
|
|
81
|
-
const typesForComponents = parsedSelector.selectors.map(getPossibleTypes).filter(typesForComponent => typesForComponent);
|
|
82
|
-
|
|
83
|
-
// If all of the components could match any type, then the compound could also match any type.
|
|
84
|
-
if (!typesForComponents.length) {
|
|
85
|
-
return null;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
/*
|
|
89
|
-
* If at least one of the components could only match a particular type, the compound could only match
|
|
90
|
-
* the intersection of those types.
|
|
91
|
-
*/
|
|
92
|
-
return intersection(...typesForComponents);
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
case "child":
|
|
96
|
-
case "descendant":
|
|
97
|
-
case "sibling":
|
|
98
|
-
case "adjacent":
|
|
99
|
-
return getPossibleTypes(parsedSelector.right);
|
|
100
|
-
|
|
101
|
-
case "class":
|
|
102
|
-
if (parsedSelector.name === "function") {
|
|
103
|
-
return ["FunctionDeclaration", "FunctionExpression", "ArrowFunctionExpression"];
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
return null;
|
|
107
|
-
|
|
108
|
-
default:
|
|
109
|
-
return null;
|
|
110
|
-
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
/**
|
|
115
|
-
* Counts the number of class, pseudo-class, and attribute queries in this selector
|
|
116
|
-
* @param {Object} parsedSelector An object (from esquery) describing the selector's matching behavior
|
|
117
|
-
* @returns {number} The number of class, pseudo-class, and attribute queries in this selector
|
|
118
|
-
*/
|
|
119
|
-
function countClassAttributes(parsedSelector) {
|
|
120
|
-
switch (parsedSelector.type) {
|
|
121
|
-
case "child":
|
|
122
|
-
case "descendant":
|
|
123
|
-
case "sibling":
|
|
124
|
-
case "adjacent":
|
|
125
|
-
return countClassAttributes(parsedSelector.left) + countClassAttributes(parsedSelector.right);
|
|
126
|
-
|
|
127
|
-
case "compound":
|
|
128
|
-
case "not":
|
|
129
|
-
case "matches":
|
|
130
|
-
return parsedSelector.selectors.reduce((sum, childSelector) => sum + countClassAttributes(childSelector), 0);
|
|
131
|
-
|
|
132
|
-
case "attribute":
|
|
133
|
-
case "field":
|
|
134
|
-
case "nth-child":
|
|
135
|
-
case "nth-last-child":
|
|
136
|
-
return 1;
|
|
137
|
-
|
|
138
|
-
default:
|
|
139
|
-
return 0;
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
/**
|
|
144
|
-
* Counts the number of identifier queries in this selector
|
|
145
|
-
* @param {Object} parsedSelector An object (from esquery) describing the selector's matching behavior
|
|
146
|
-
* @returns {number} The number of identifier queries
|
|
147
|
-
*/
|
|
148
|
-
function countIdentifiers(parsedSelector) {
|
|
149
|
-
switch (parsedSelector.type) {
|
|
150
|
-
case "child":
|
|
151
|
-
case "descendant":
|
|
152
|
-
case "sibling":
|
|
153
|
-
case "adjacent":
|
|
154
|
-
return countIdentifiers(parsedSelector.left) + countIdentifiers(parsedSelector.right);
|
|
155
|
-
|
|
156
|
-
case "compound":
|
|
157
|
-
case "not":
|
|
158
|
-
case "matches":
|
|
159
|
-
return parsedSelector.selectors.reduce((sum, childSelector) => sum + countIdentifiers(childSelector), 0);
|
|
160
|
-
|
|
161
|
-
case "identifier":
|
|
162
|
-
return 1;
|
|
163
|
-
|
|
164
|
-
default:
|
|
165
|
-
return 0;
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
/**
|
|
170
|
-
* Compares the specificity of two selector objects, with CSS-like rules.
|
|
171
|
-
* @param {ASTSelector} selectorA An AST selector descriptor
|
|
172
|
-
* @param {ASTSelector} selectorB Another AST selector descriptor
|
|
173
|
-
* @returns {number}
|
|
174
|
-
* a value less than 0 if selectorA is less specific than selectorB
|
|
175
|
-
* a value greater than 0 if selectorA is more specific than selectorB
|
|
176
|
-
* a value less than 0 if selectorA and selectorB have the same specificity, and selectorA <= selectorB alphabetically
|
|
177
|
-
* a value greater than 0 if selectorA and selectorB have the same specificity, and selectorA > selectorB alphabetically
|
|
178
|
-
*/
|
|
179
|
-
function compareSpecificity(selectorA, selectorB) {
|
|
180
|
-
return selectorA.attributeCount - selectorB.attributeCount ||
|
|
181
|
-
selectorA.identifierCount - selectorB.identifierCount ||
|
|
182
|
-
(selectorA.rawSelector <= selectorB.rawSelector ? -1 : 1);
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
/**
|
|
186
|
-
* Parses a raw selector string, and throws a useful error if parsing fails.
|
|
187
|
-
* @param {string} rawSelector A raw AST selector
|
|
188
|
-
* @returns {Object} An object (from esquery) describing the matching behavior of this selector
|
|
189
|
-
* @throws {Error} An error if the selector is invalid
|
|
190
|
-
*/
|
|
191
|
-
function tryParseSelector(rawSelector) {
|
|
192
|
-
try {
|
|
193
|
-
return esquery.parse(rawSelector.replace(/:exit$/u, ""));
|
|
194
|
-
} catch (err) {
|
|
195
|
-
if (err.location && err.location.start && typeof err.location.start.offset === "number") {
|
|
196
|
-
throw new SyntaxError(`Syntax error in selector "${rawSelector}" at position ${err.location.start.offset}: ${err.message}`);
|
|
197
|
-
}
|
|
198
|
-
throw err;
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
const selectorCache = new Map();
|
|
203
|
-
|
|
204
|
-
/**
|
|
205
|
-
* Parses a raw selector string, and returns the parsed selector along with specificity and type information.
|
|
206
|
-
* @param {string} rawSelector A raw AST selector
|
|
207
|
-
* @returns {ASTSelector} A selector descriptor
|
|
208
|
-
*/
|
|
209
|
-
function parseSelector(rawSelector) {
|
|
210
|
-
if (selectorCache.has(rawSelector)) {
|
|
211
|
-
return selectorCache.get(rawSelector);
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
const parsedSelector = tryParseSelector(rawSelector);
|
|
215
|
-
|
|
216
|
-
const result = {
|
|
217
|
-
rawSelector,
|
|
218
|
-
isExit: rawSelector.endsWith(":exit"),
|
|
219
|
-
parsedSelector,
|
|
220
|
-
listenerTypes: getPossibleTypes(parsedSelector),
|
|
221
|
-
attributeCount: countClassAttributes(parsedSelector),
|
|
222
|
-
identifierCount: countIdentifiers(parsedSelector)
|
|
223
|
-
};
|
|
224
|
-
|
|
225
|
-
selectorCache.set(rawSelector, result);
|
|
226
|
-
return result;
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
//------------------------------------------------------------------------------
|
|
230
|
-
// Public Interface
|
|
231
|
-
//------------------------------------------------------------------------------
|
|
232
|
-
|
|
233
|
-
/**
|
|
234
|
-
* The event generator for AST nodes.
|
|
235
|
-
* This implements below interface.
|
|
236
|
-
*
|
|
237
|
-
* ```ts
|
|
238
|
-
* interface EventGenerator {
|
|
239
|
-
* emitter: SafeEmitter;
|
|
240
|
-
* enterNode(node: ASTNode): void;
|
|
241
|
-
* leaveNode(node: ASTNode): void;
|
|
242
|
-
* }
|
|
243
|
-
* ```
|
|
244
|
-
*/
|
|
245
|
-
class NodeEventGenerator {
|
|
246
|
-
|
|
247
|
-
/**
|
|
248
|
-
* @param {SafeEmitter} emitter
|
|
249
|
-
* An SafeEmitter which is the destination of events. This emitter must already
|
|
250
|
-
* have registered listeners for all of the events that it needs to listen for.
|
|
251
|
-
* (See lib/linter/safe-emitter.js for more details on `SafeEmitter`.)
|
|
252
|
-
* @param {ESQueryOptions} esqueryOptions `esquery` options for traversing custom nodes.
|
|
253
|
-
* @returns {NodeEventGenerator} new instance
|
|
254
|
-
*/
|
|
255
|
-
constructor(emitter, esqueryOptions) {
|
|
256
|
-
this.emitter = emitter;
|
|
257
|
-
this.esqueryOptions = esqueryOptions;
|
|
258
|
-
this.currentAncestry = [];
|
|
259
|
-
this.enterSelectorsByNodeType = new Map();
|
|
260
|
-
this.exitSelectorsByNodeType = new Map();
|
|
261
|
-
this.anyTypeEnterSelectors = [];
|
|
262
|
-
this.anyTypeExitSelectors = [];
|
|
263
|
-
|
|
264
|
-
emitter.eventNames().forEach(rawSelector => {
|
|
265
|
-
const selector = parseSelector(rawSelector);
|
|
266
|
-
|
|
267
|
-
if (selector.listenerTypes) {
|
|
268
|
-
const typeMap = selector.isExit ? this.exitSelectorsByNodeType : this.enterSelectorsByNodeType;
|
|
269
|
-
|
|
270
|
-
selector.listenerTypes.forEach(nodeType => {
|
|
271
|
-
if (!typeMap.has(nodeType)) {
|
|
272
|
-
typeMap.set(nodeType, []);
|
|
273
|
-
}
|
|
274
|
-
typeMap.get(nodeType).push(selector);
|
|
275
|
-
});
|
|
276
|
-
return;
|
|
277
|
-
}
|
|
278
|
-
const selectors = selector.isExit ? this.anyTypeExitSelectors : this.anyTypeEnterSelectors;
|
|
279
|
-
|
|
280
|
-
selectors.push(selector);
|
|
281
|
-
});
|
|
282
|
-
|
|
283
|
-
this.anyTypeEnterSelectors.sort(compareSpecificity);
|
|
284
|
-
this.anyTypeExitSelectors.sort(compareSpecificity);
|
|
285
|
-
this.enterSelectorsByNodeType.forEach(selectorList => selectorList.sort(compareSpecificity));
|
|
286
|
-
this.exitSelectorsByNodeType.forEach(selectorList => selectorList.sort(compareSpecificity));
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
/**
|
|
290
|
-
* Checks a selector against a node, and emits it if it matches
|
|
291
|
-
* @param {ASTNode} node The node to check
|
|
292
|
-
* @param {ASTSelector} selector An AST selector descriptor
|
|
293
|
-
* @returns {void}
|
|
294
|
-
*/
|
|
295
|
-
applySelector(node, selector) {
|
|
296
|
-
if (esquery.matches(node, selector.parsedSelector, this.currentAncestry, this.esqueryOptions)) {
|
|
297
|
-
this.emitter.emit(selector.rawSelector, node);
|
|
298
|
-
}
|
|
299
|
-
}
|
|
300
|
-
|
|
301
|
-
/**
|
|
302
|
-
* Applies all appropriate selectors to a node, in specificity order
|
|
303
|
-
* @param {ASTNode} node The node to check
|
|
304
|
-
* @param {boolean} isExit `false` if the node is currently being entered, `true` if it's currently being exited
|
|
305
|
-
* @returns {void}
|
|
306
|
-
*/
|
|
307
|
-
applySelectors(node, isExit) {
|
|
308
|
-
const selectorsByNodeType = (isExit ? this.exitSelectorsByNodeType : this.enterSelectorsByNodeType).get(node.type) || [];
|
|
309
|
-
const anyTypeSelectors = isExit ? this.anyTypeExitSelectors : this.anyTypeEnterSelectors;
|
|
310
|
-
|
|
311
|
-
/*
|
|
312
|
-
* selectorsByNodeType and anyTypeSelectors were already sorted by specificity in the constructor.
|
|
313
|
-
* Iterate through each of them, applying selectors in the right order.
|
|
314
|
-
*/
|
|
315
|
-
let selectorsByTypeIndex = 0;
|
|
316
|
-
let anyTypeSelectorsIndex = 0;
|
|
317
|
-
|
|
318
|
-
while (selectorsByTypeIndex < selectorsByNodeType.length || anyTypeSelectorsIndex < anyTypeSelectors.length) {
|
|
319
|
-
if (
|
|
320
|
-
selectorsByTypeIndex >= selectorsByNodeType.length ||
|
|
321
|
-
anyTypeSelectorsIndex < anyTypeSelectors.length &&
|
|
322
|
-
compareSpecificity(anyTypeSelectors[anyTypeSelectorsIndex], selectorsByNodeType[selectorsByTypeIndex]) < 0
|
|
323
|
-
) {
|
|
324
|
-
this.applySelector(node, anyTypeSelectors[anyTypeSelectorsIndex++]);
|
|
325
|
-
} else {
|
|
326
|
-
this.applySelector(node, selectorsByNodeType[selectorsByTypeIndex++]);
|
|
327
|
-
}
|
|
328
|
-
}
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
/**
|
|
332
|
-
* Emits an event of entering AST node.
|
|
333
|
-
* @param {ASTNode} node A node which was entered.
|
|
334
|
-
* @returns {void}
|
|
335
|
-
*/
|
|
336
|
-
enterNode(node) {
|
|
337
|
-
if (node.parent) {
|
|
338
|
-
this.currentAncestry.unshift(node.parent);
|
|
339
|
-
}
|
|
340
|
-
this.applySelectors(node, false);
|
|
341
|
-
}
|
|
342
|
-
|
|
343
|
-
/**
|
|
344
|
-
* Emits an event of leaving AST node.
|
|
345
|
-
* @param {ASTNode} node A node which was left.
|
|
346
|
-
* @returns {void}
|
|
347
|
-
*/
|
|
348
|
-
leaveNode(node) {
|
|
349
|
-
this.applySelectors(node, true);
|
|
350
|
-
this.currentAncestry.shift();
|
|
351
|
-
}
|
|
352
|
-
}
|
|
353
|
-
|
|
354
|
-
module.exports = NodeEventGenerator;
|