eslint 9.22.0 → 9.24.0
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 +48 -46
- package/bin/eslint.js +92 -90
- package/conf/default-cli-options.js +22 -22
- package/conf/ecma-version.js +1 -1
- package/conf/globals.js +97 -98
- package/conf/replacements.json +24 -20
- package/conf/rule-type-list.json +88 -92
- package/lib/api.js +12 -12
- package/lib/cli-engine/cli-engine.js +830 -810
- package/lib/cli-engine/file-enumerator.js +381 -387
- package/lib/cli-engine/formatters/formatters-meta.json +16 -16
- package/lib/cli-engine/formatters/html.js +107 -99
- 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 +96 -75
- package/lib/cli-engine/hash.js +1 -1
- package/lib/cli-engine/index.js +1 -1
- package/lib/cli-engine/lint-result-cache.js +144 -145
- package/lib/cli-engine/load-rules.js +16 -16
- package/lib/cli.js +638 -457
- package/lib/config/config-loader.js +726 -622
- package/lib/config/config.js +247 -221
- package/lib/config/default-config.js +54 -45
- package/lib/config/flat-config-array.js +167 -172
- package/lib/config/flat-config-helpers.js +72 -72
- package/lib/config/flat-config-schema.js +375 -368
- package/lib/config/rule-validator.js +139 -144
- package/lib/config-api.js +2 -2
- package/lib/eslint/eslint-helpers.js +756 -681
- package/lib/eslint/eslint.js +934 -912
- package/lib/eslint/index.js +2 -2
- package/lib/eslint/legacy-eslint.js +577 -533
- package/lib/languages/js/index.js +263 -264
- package/lib/languages/js/source-code/index.js +1 -1
- package/lib/languages/js/source-code/source-code.js +1128 -1057
- package/lib/languages/js/source-code/token-store/backward-token-comment-cursor.js +39 -35
- package/lib/languages/js/source-code/token-store/backward-token-cursor.js +35 -36
- package/lib/languages/js/source-code/token-store/cursor.js +36 -36
- package/lib/languages/js/source-code/token-store/cursors.js +80 -52
- package/lib/languages/js/source-code/token-store/decorative-cursor.js +17 -18
- package/lib/languages/js/source-code/token-store/filter-cursor.js +19 -20
- package/lib/languages/js/source-code/token-store/forward-token-comment-cursor.js +40 -32
- package/lib/languages/js/source-code/token-store/forward-token-cursor.js +40 -41
- package/lib/languages/js/source-code/token-store/index.js +592 -498
- package/lib/languages/js/source-code/token-store/limit-cursor.js +17 -18
- package/lib/languages/js/source-code/token-store/padded-token-cursor.js +23 -16
- package/lib/languages/js/source-code/token-store/skip-cursor.js +19 -20
- package/lib/languages/js/source-code/token-store/utils.js +63 -60
- package/lib/languages/js/validate-language-options.js +104 -89
- package/lib/linter/apply-disable-directives.js +467 -383
- package/lib/linter/code-path-analysis/code-path-analyzer.js +650 -672
- 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 -319
- package/lib/linter/code-path-analysis/debug-helpers.js +183 -163
- package/lib/linter/code-path-analysis/fork-context.js +296 -271
- package/lib/linter/code-path-analysis/id-generator.js +22 -23
- package/lib/linter/file-context.js +119 -120
- package/lib/linter/index.js +3 -3
- package/lib/linter/interpolate.js +16 -16
- package/lib/linter/linter.js +2403 -2045
- package/lib/linter/node-event-generator.js +284 -225
- package/lib/linter/report-translator.js +256 -219
- package/lib/linter/rule-fixer.js +122 -124
- package/lib/linter/rules.js +36 -36
- package/lib/linter/safe-emitter.js +18 -18
- package/lib/linter/source-code-fixer.js +94 -92
- package/lib/linter/timing.js +104 -101
- package/lib/linter/vfile.js +70 -73
- package/lib/options.js +404 -361
- package/lib/rule-tester/index.js +1 -1
- package/lib/rule-tester/rule-tester.js +1308 -1046
- package/lib/rules/accessor-pairs.js +298 -263
- package/lib/rules/array-bracket-newline.js +250 -238
- package/lib/rules/array-bracket-spacing.js +263 -224
- package/lib/rules/array-callback-return.js +402 -356
- package/lib/rules/array-element-newline.js +358 -313
- package/lib/rules/arrow-body-style.js +400 -281
- package/lib/rules/arrow-parens.js +206 -173
- package/lib/rules/arrow-spacing.js +169 -163
- package/lib/rules/block-scoped-var.js +125 -123
- package/lib/rules/block-spacing.js +186 -176
- package/lib/rules/brace-style.js +262 -199
- package/lib/rules/callback-return.js +203 -190
- package/lib/rules/camelcase.js +403 -392
- package/lib/rules/capitalized-comments.js +253 -232
- package/lib/rules/class-methods-use-this.js +224 -172
- package/lib/rules/comma-dangle.js +379 -346
- package/lib/rules/comma-spacing.js +193 -195
- package/lib/rules/comma-style.js +375 -316
- package/lib/rules/complexity.js +173 -169
- package/lib/rules/computed-property-spacing.js +236 -211
- package/lib/rules/consistent-return.js +181 -170
- package/lib/rules/consistent-this.js +167 -147
- package/lib/rules/constructor-super.js +412 -404
- package/lib/rules/curly.js +407 -332
- package/lib/rules/default-case-last.js +38 -31
- package/lib/rules/default-case.js +89 -85
- package/lib/rules/default-param-last.js +69 -54
- package/lib/rules/dot-location.js +122 -110
- package/lib/rules/dot-notation.js +192 -156
- package/lib/rules/eol-last.js +122 -120
- package/lib/rules/eqeqeq.js +168 -155
- package/lib/rules/for-direction.js +146 -121
- package/lib/rules/func-call-spacing.js +261 -231
- package/lib/rules/func-name-matching.js +293 -209
- package/lib/rules/func-names.js +165 -164
- package/lib/rules/func-style.js +159 -127
- package/lib/rules/function-call-argument-newline.js +152 -129
- package/lib/rules/function-paren-newline.js +349 -291
- package/lib/rules/generator-star-spacing.js +229 -210
- package/lib/rules/getter-return.js +208 -172
- package/lib/rules/global-require.js +85 -74
- package/lib/rules/grouped-accessor-pairs.js +170 -150
- package/lib/rules/guard-for-in.js +72 -63
- package/lib/rules/handle-callback-err.js +108 -103
- package/lib/rules/id-blacklist.js +182 -199
- package/lib/rules/id-denylist.js +168 -187
- package/lib/rules/id-length.js +197 -171
- package/lib/rules/id-match.js +344 -289
- package/lib/rules/implicit-arrow-linebreak.js +102 -79
- package/lib/rules/indent-legacy.js +1344 -1118
- package/lib/rules/indent.js +2272 -1759
- package/lib/rules/index.js +317 -292
- package/lib/rules/init-declarations.js +137 -107
- package/lib/rules/jsx-quotes.js +94 -82
- package/lib/rules/key-spacing.js +750 -633
- package/lib/rules/keyword-spacing.js +648 -605
- package/lib/rules/line-comment-position.js +142 -128
- package/lib/rules/linebreak-style.js +107 -106
- package/lib/rules/lines-around-comment.js +540 -448
- package/lib/rules/lines-around-directive.js +233 -203
- package/lib/rules/lines-between-class-members.js +305 -234
- package/lib/rules/logical-assignment-operators.js +582 -399
- 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 -434
- 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 +78 -76
- package/lib/rules/max-statements-per-line.js +205 -198
- package/lib/rules/max-statements.js +168 -164
- package/lib/rules/multiline-comment-style.js +637 -479
- package/lib/rules/multiline-ternary.js +241 -176
- package/lib/rules/new-cap.js +233 -213
- package/lib/rules/new-parens.js +88 -79
- package/lib/rules/newline-after-var.js +287 -250
- package/lib/rules/newline-before-return.js +229 -222
- package/lib/rules/newline-per-chained-call.js +142 -127
- package/lib/rules/no-alert.js +90 -79
- package/lib/rules/no-array-constructor.js +125 -113
- package/lib/rules/no-async-promise-executor.js +30 -24
- package/lib/rules/no-await-in-loop.js +69 -71
- package/lib/rules/no-bitwise.js +124 -100
- package/lib/rules/no-buffer-constructor.js +55 -47
- package/lib/rules/no-caller.js +39 -33
- package/lib/rules/no-case-declarations.js +61 -57
- package/lib/rules/no-catch-shadow.js +76 -73
- 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 -81
- package/lib/rules/no-console.js +202 -199
- package/lib/rules/no-const-assign.js +47 -41
- package/lib/rules/no-constant-binary-expression.js +500 -405
- package/lib/rules/no-constant-condition.js +158 -143
- package/lib/rules/no-constructor-return.js +49 -49
- package/lib/rules/no-continue.js +25 -27
- 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 -41
- package/lib/rules/no-dupe-args.js +68 -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 +179 -176
- 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 +127 -128
- package/lib/rules/no-empty-pattern.js +63 -58
- package/lib/rules/no-empty-static-block.js +37 -35
- package/lib/rules/no-empty.js +98 -86
- package/lib/rules/no-eq-null.js +37 -32
- package/lib/rules/no-eval.js +256 -250
- package/lib/rules/no-ex-assign.js +42 -39
- package/lib/rules/no-extend-native.js +161 -159
- package/lib/rules/no-extra-bind.js +201 -190
- package/lib/rules/no-extra-boolean-cast.js +398 -348
- package/lib/rules/no-extra-label.js +150 -131
- package/lib/rules/no-extra-parens.js +1654 -1325
- package/lib/rules/no-extra-semi.js +146 -144
- package/lib/rules/no-fallthrough.js +199 -157
- package/lib/rules/no-floating-decimal.js +74 -66
- package/lib/rules/no-func-assign.js +54 -55
- package/lib/rules/no-global-assign.js +78 -73
- package/lib/rules/no-implicit-coercion.js +349 -293
- package/lib/rules/no-implicit-globals.js +158 -135
- package/lib/rules/no-implied-eval.js +140 -112
- package/lib/rules/no-import-assign.js +145 -159
- package/lib/rules/no-inline-comments.js +101 -95
- package/lib/rules/no-inner-declarations.js +115 -101
- package/lib/rules/no-invalid-regexp.js +222 -190
- package/lib/rules/no-invalid-this.js +123 -117
- package/lib/rules/no-irregular-whitespace.js +266 -252
- package/lib/rules/no-iterator.js +29 -33
- package/lib/rules/no-label-var.js +59 -62
- package/lib/rules/no-labels.js +138 -133
- package/lib/rules/no-lone-blocks.js +127 -123
- package/lib/rules/no-lonely-if.js +108 -77
- package/lib/rules/no-loop-func.js +238 -213
- package/lib/rules/no-loss-of-precision.js +218 -201
- package/lib/rules/no-magic-numbers.js +246 -218
- package/lib/rules/no-misleading-character-class.js +499 -446
- package/lib/rules/no-mixed-operators.js +188 -182
- package/lib/rules/no-mixed-requires.js +253 -240
- package/lib/rules/no-mixed-spaces-and-tabs.js +134 -121
- package/lib/rules/no-multi-assign.js +46 -44
- package/lib/rules/no-multi-spaces.js +163 -143
- package/lib/rules/no-multi-str.js +42 -41
- package/lib/rules/no-multiple-empty-lines.js +196 -158
- package/lib/rules/no-native-reassign.js +90 -85
- package/lib/rules/no-negated-condition.js +79 -75
- package/lib/rules/no-negated-in-lhs.js +45 -43
- package/lib/rules/no-nested-ternary.js +33 -32
- 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 -48
- package/lib/rules/no-new-require.js +48 -47
- package/lib/rules/no-new-symbol.js +52 -50
- 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 +141 -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 +32 -32
- package/lib/rules/no-param-reassign.js +235 -217
- package/lib/rules/no-path-concat.js +66 -67
- package/lib/rules/no-plusplus.js +60 -61
- package/lib/rules/no-process-env.js +49 -48
- package/lib/rules/no-process-exit.js +54 -50
- package/lib/rules/no-promise-executor-return.js +214 -182
- package/lib/rules/no-proto.js +26 -29
- package/lib/rules/no-prototype-builtins.js +146 -124
- package/lib/rules/no-redeclare.js +154 -152
- package/lib/rules/no-regex-spaces.js +183 -161
- package/lib/rules/no-restricted-exports.js +208 -185
- package/lib/rules/no-restricted-globals.js +111 -112
- package/lib/rules/no-restricted-imports.js +657 -537
- package/lib/rules/no-restricted-modules.js +222 -202
- package/lib/rules/no-restricted-properties.js +181 -153
- package/lib/rules/no-restricted-syntax.js +56 -52
- package/lib/rules/no-return-assign.js +55 -50
- package/lib/rules/no-return-await.js +148 -124
- package/lib/rules/no-script-url.js +52 -45
- package/lib/rules/no-self-assign.js +148 -146
- package/lib/rules/no-self-compare.js +63 -46
- package/lib/rules/no-sequences.js +135 -116
- package/lib/rules/no-setter-return.js +185 -152
- package/lib/rules/no-shadow-restricted-names.js +61 -46
- package/lib/rules/no-shadow.js +342 -316
- package/lib/rules/no-spaced-func.js +82 -77
- package/lib/rules/no-sparse-arrays.js +54 -59
- package/lib/rules/no-sync.js +61 -60
- package/lib/rules/no-tabs.js +83 -72
- package/lib/rules/no-template-curly-in-string.js +33 -32
- package/lib/rules/no-ternary.js +25 -29
- package/lib/rules/no-this-before-super.js +321 -319
- package/lib/rules/no-throw-literal.js +31 -36
- package/lib/rules/no-trailing-spaces.js +199 -191
- package/lib/rules/no-undef-init.js +76 -61
- package/lib/rules/no-undef.js +51 -48
- package/lib/rules/no-undefined.js +73 -75
- package/lib/rules/no-underscore-dangle.js +370 -327
- 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 -147
- package/lib/rules/no-unreachable-loop.js +145 -142
- 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 -83
- package/lib/rules/no-unsafe-optional-chaining.js +192 -178
- package/lib/rules/no-unused-expressions.js +178 -162
- 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 +1669 -1449
- package/lib/rules/no-use-before-define.js +229 -231
- package/lib/rules/no-useless-assignment.js +590 -511
- package/lib/rules/no-useless-backreference.js +212 -193
- 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 -115
- package/lib/rules/no-useless-concat.js +65 -60
- package/lib/rules/no-useless-constructor.js +158 -111
- package/lib/rules/no-useless-escape.js +342 -291
- package/lib/rules/no-useless-rename.js +183 -156
- package/lib/rules/no-useless-return.js +344 -312
- package/lib/rules/no-var.js +233 -212
- package/lib/rules/no-void.js +50 -48
- package/lib/rules/no-warning-comments.js +191 -186
- package/lib/rules/no-whitespace-before-property.js +131 -115
- package/lib/rules/no-with.js +24 -26
- package/lib/rules/nonblock-statement-body-position.js +149 -130
- package/lib/rules/object-curly-newline.js +306 -265
- package/lib/rules/object-curly-spacing.js +360 -314
- package/lib/rules/object-property-newline.js +137 -106
- package/lib/rules/object-shorthand.js +607 -502
- package/lib/rules/one-var-declaration-per-line.js +104 -100
- package/lib/rules/one-var.js +653 -537
- package/lib/rules/operator-assignment.js +219 -161
- package/lib/rules/operator-linebreak.js +295 -251
- package/lib/rules/padded-blocks.js +346 -308
- package/lib/rules/padding-line-between-statements.js +443 -439
- package/lib/rules/prefer-arrow-callback.js +362 -313
- package/lib/rules/prefer-const.js +418 -377
- package/lib/rules/prefer-destructuring.js +301 -279
- package/lib/rules/prefer-exponentiation-operator.js +176 -133
- package/lib/rules/prefer-named-capture-group.js +153 -140
- package/lib/rules/prefer-numeric-literals.js +121 -113
- package/lib/rules/prefer-object-has-own.js +116 -82
- package/lib/rules/prefer-object-spread.js +213 -193
- package/lib/rules/prefer-promise-reject-errors.js +140 -122
- package/lib/rules/prefer-reflect.js +127 -107
- package/lib/rules/prefer-regex-literals.js +578 -466
- package/lib/rules/prefer-rest-params.js +79 -80
- package/lib/rules/prefer-spread.js +47 -44
- package/lib/rules/prefer-template.js +266 -195
- package/lib/rules/quote-props.js +373 -307
- package/lib/rules/quotes.js +374 -326
- package/lib/rules/radix.js +152 -136
- package/lib/rules/require-atomic-updates.js +316 -285
- package/lib/rules/require-await.js +144 -116
- package/lib/rules/require-unicode-regexp.js +282 -177
- package/lib/rules/require-yield.js +53 -54
- package/lib/rules/rest-spread-spacing.js +128 -116
- package/lib/rules/semi-spacing.js +281 -250
- package/lib/rules/semi-style.js +176 -134
- package/lib/rules/semi.js +456 -436
- package/lib/rules/sort-imports.js +306 -233
- package/lib/rules/sort-keys.js +219 -188
- package/lib/rules/sort-vars.js +127 -93
- package/lib/rules/space-before-blocks.js +199 -189
- package/lib/rules/space-before-function-paren.js +186 -166
- package/lib/rules/space-in-parens.js +359 -288
- package/lib/rules/space-infix-ops.js +237 -201
- package/lib/rules/space-unary-ops.js +356 -298
- package/lib/rules/spaced-comment.js +363 -319
- package/lib/rules/strict.js +265 -230
- package/lib/rules/switch-colon-spacing.js +130 -122
- package/lib/rules/symbol-description.js +45 -48
- package/lib/rules/template-curly-spacing.js +148 -142
- package/lib/rules/template-tag-spacing.js +98 -88
- package/lib/rules/unicode-bom.js +54 -56
- package/lib/rules/use-isnan.js +237 -206
- package/lib/rules/utils/ast-utils.js +2039 -1860
- package/lib/rules/utils/char-source.js +162 -155
- package/lib/rules/utils/fix-tracker.js +83 -80
- package/lib/rules/utils/keywords.js +59 -59
- package/lib/rules/utils/lazy-loading-rule-map.js +79 -76
- package/lib/rules/utils/regular-expressions.js +32 -24
- package/lib/rules/utils/unicode/index.js +4 -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 -111
- package/lib/rules/vars-on-top.js +152 -145
- package/lib/rules/wrap-iife.js +204 -191
- package/lib/rules/wrap-regex.js +70 -58
- package/lib/rules/yield-star-spacing.js +145 -134
- package/lib/rules/yoda.js +283 -272
- package/lib/services/parser-service.js +35 -35
- package/lib/services/processor-service.js +66 -73
- package/lib/services/suppressions-service.js +289 -0
- package/lib/shared/ajv.js +14 -14
- package/lib/shared/assert.js +3 -4
- package/lib/shared/ast-utils.js +7 -6
- package/lib/shared/deep-merge-arrays.js +24 -22
- package/lib/shared/directives.js +3 -2
- package/lib/shared/flags.js +50 -17
- package/lib/shared/logging.js +24 -25
- package/lib/shared/option-utils.js +43 -36
- package/lib/shared/runtime-info.js +136 -127
- package/lib/shared/serialization.js +27 -27
- package/lib/shared/severity.js +22 -22
- package/lib/shared/stats.js +5 -5
- package/lib/shared/string-utils.js +16 -16
- package/lib/shared/text-table.js +28 -27
- package/lib/shared/traverser.js +153 -146
- package/lib/shared/types.js +4 -27
- package/lib/types/index.d.ts +2010 -1559
- package/lib/types/rules.d.ts +5253 -5140
- package/lib/types/use-at-your-own-risk.d.ts +32 -30
- package/lib/unsupported-api.js +5 -5
- package/messages/all-files-ignored.js +3 -3
- package/messages/all-matched-files-ignored.js +3 -3
- package/messages/config-file-missing.js +2 -2
- package/messages/config-plugin-missing.js +3 -3
- package/messages/config-serialize-function.js +9 -7
- package/messages/eslintrc-incompat.js +13 -15
- package/messages/eslintrc-plugins.js +3 -4
- 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 +3 -3
- package/messages/plugin-conflict.js +8 -8
- package/messages/plugin-invalid.js +3 -3
- package/messages/plugin-missing.js +3 -3
- 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 +14 -20
@@ -22,44 +22,44 @@
|
|
22
22
|
* The parser for ESLint.
|
23
23
|
*/
|
24
24
|
class ParserService {
|
25
|
+
/**
|
26
|
+
* Parses the given file synchronously.
|
27
|
+
* @param {VFile} file The file to parse.
|
28
|
+
* @param {{language:Language,languageOptions:LanguageOptions}} config The configuration to use.
|
29
|
+
* @returns {Object} An object with the parsed source code or errors.
|
30
|
+
* @throws {Error} If the parser returns a promise.
|
31
|
+
*/
|
32
|
+
parseSync(file, config) {
|
33
|
+
const { language, languageOptions } = config;
|
34
|
+
const result = language.parse(file, { languageOptions });
|
25
35
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
* @param {{language:Language,languageOptions:LanguageOptions}} config The configuration to use.
|
30
|
-
* @returns {Object} An object with the parsed source code or errors.
|
31
|
-
* @throws {Error} If the parser returns a promise.
|
32
|
-
*/
|
33
|
-
parseSync(file, config) {
|
36
|
+
if (typeof result.then === "function") {
|
37
|
+
throw new Error("Unsupported: Language parser returned a promise.");
|
38
|
+
}
|
34
39
|
|
35
|
-
|
36
|
-
|
40
|
+
if (result.ok) {
|
41
|
+
return {
|
42
|
+
ok: true,
|
43
|
+
sourceCode: language.createSourceCode(file, result, {
|
44
|
+
languageOptions,
|
45
|
+
}),
|
46
|
+
};
|
47
|
+
}
|
37
48
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
errors: result.errors.map(error => ({
|
53
|
-
ruleId: null,
|
54
|
-
nodeType: null,
|
55
|
-
fatal: true,
|
56
|
-
severity: 2,
|
57
|
-
message: `Parsing error: ${error.message}`,
|
58
|
-
line: error.line,
|
59
|
-
column: error.column
|
60
|
-
}))
|
61
|
-
};
|
62
|
-
}
|
49
|
+
// if we made it to here there was an error
|
50
|
+
return {
|
51
|
+
ok: false,
|
52
|
+
errors: result.errors.map(error => ({
|
53
|
+
ruleId: null,
|
54
|
+
nodeType: null,
|
55
|
+
fatal: true,
|
56
|
+
severity: 2,
|
57
|
+
message: `Parsing error: ${error.message}`,
|
58
|
+
line: error.line,
|
59
|
+
column: error.column,
|
60
|
+
})),
|
61
|
+
};
|
62
|
+
}
|
63
63
|
}
|
64
64
|
|
65
65
|
module.exports = { ParserService };
|
@@ -31,79 +31,72 @@ const { VFile } = require("../linter/vfile.js");
|
|
31
31
|
* The service that applies processors to files.
|
32
32
|
*/
|
33
33
|
class ProcessorService {
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
postprocessSync(file, messages, config) {
|
101
|
-
|
102
|
-
const { processor } = config;
|
103
|
-
|
104
|
-
return processor.postprocess(messages, file.path);
|
105
|
-
}
|
106
|
-
|
34
|
+
/**
|
35
|
+
* Preprocesses the given file synchronously.
|
36
|
+
* @param {VFile} file The file to preprocess.
|
37
|
+
* @param {{processor:Processor}} config The configuration to use.
|
38
|
+
* @returns {{ok:boolean, files?: Array<VFile>, errors?: Array<LintMessage>}} An array of preprocessed files or errors.
|
39
|
+
* @throws {Error} If the preprocessor returns a promise.
|
40
|
+
*/
|
41
|
+
preprocessSync(file, config) {
|
42
|
+
const { processor } = config;
|
43
|
+
let blocks;
|
44
|
+
|
45
|
+
try {
|
46
|
+
blocks = processor.preprocess(file.rawBody, file.path);
|
47
|
+
} catch (ex) {
|
48
|
+
// If the message includes a leading line number, strip it:
|
49
|
+
const message = `Preprocessing error: ${ex.message.replace(/^line \d+:/iu, "").trim()}`;
|
50
|
+
|
51
|
+
return {
|
52
|
+
ok: false,
|
53
|
+
errors: [
|
54
|
+
{
|
55
|
+
ruleId: null,
|
56
|
+
fatal: true,
|
57
|
+
severity: 2,
|
58
|
+
message,
|
59
|
+
line: ex.lineNumber,
|
60
|
+
column: ex.column,
|
61
|
+
nodeType: null,
|
62
|
+
},
|
63
|
+
],
|
64
|
+
};
|
65
|
+
}
|
66
|
+
|
67
|
+
if (typeof blocks.then === "function") {
|
68
|
+
throw new Error("Unsupported: Preprocessor returned a promise.");
|
69
|
+
}
|
70
|
+
|
71
|
+
return {
|
72
|
+
ok: true,
|
73
|
+
files: blocks.map((block, i) => {
|
74
|
+
// Legacy behavior: return the block as a string
|
75
|
+
if (typeof block === "string") {
|
76
|
+
return block;
|
77
|
+
}
|
78
|
+
|
79
|
+
const filePath = path.join(file.path, `${i}_${block.filename}`);
|
80
|
+
|
81
|
+
return new VFile(filePath, block.text, {
|
82
|
+
physicalPath: file.physicalPath,
|
83
|
+
});
|
84
|
+
}),
|
85
|
+
};
|
86
|
+
}
|
87
|
+
|
88
|
+
/**
|
89
|
+
* Postprocesses the given messages synchronously.
|
90
|
+
* @param {VFile} file The file to postprocess.
|
91
|
+
* @param {LintMessage[][]} messages The messages to postprocess.
|
92
|
+
* @param {{processor:Processor}} config The configuration to use.
|
93
|
+
* @returns {LintMessage[]} The postprocessed messages.
|
94
|
+
*/
|
95
|
+
postprocessSync(file, messages, config) {
|
96
|
+
const { processor } = config;
|
97
|
+
|
98
|
+
return processor.postprocess(messages, file.path);
|
99
|
+
}
|
107
100
|
}
|
108
101
|
|
109
102
|
module.exports = { ProcessorService };
|
@@ -0,0 +1,289 @@
|
|
1
|
+
/**
|
2
|
+
* @fileoverview Manages the suppressed violations.
|
3
|
+
* @author Iacovos Constantinou
|
4
|
+
*/
|
5
|
+
|
6
|
+
"use strict";
|
7
|
+
|
8
|
+
//-----------------------------------------------------------------------------
|
9
|
+
// Requirements
|
10
|
+
//-----------------------------------------------------------------------------
|
11
|
+
|
12
|
+
const fs = require("node:fs");
|
13
|
+
const path = require("node:path");
|
14
|
+
const { calculateStatsPerFile } = require("../eslint/eslint-helpers");
|
15
|
+
|
16
|
+
//------------------------------------------------------------------------------
|
17
|
+
// Typedefs
|
18
|
+
//------------------------------------------------------------------------------
|
19
|
+
|
20
|
+
// For VSCode IntelliSense
|
21
|
+
/** @typedef {import("../shared/types").LintResult} LintResult */
|
22
|
+
/** @typedef {import("../shared/types").SuppressedViolations} SuppressedViolations */
|
23
|
+
|
24
|
+
//-----------------------------------------------------------------------------
|
25
|
+
// Exports
|
26
|
+
//-----------------------------------------------------------------------------
|
27
|
+
|
28
|
+
/**
|
29
|
+
* Manages the suppressed violations.
|
30
|
+
*/
|
31
|
+
class SuppressionsService {
|
32
|
+
filePath = "";
|
33
|
+
cwd = "";
|
34
|
+
|
35
|
+
/**
|
36
|
+
* Creates a new instance of SuppressionsService.
|
37
|
+
* @param {Object} options The options.
|
38
|
+
* @param {string} [options.filePath] The location of the suppressions file.
|
39
|
+
* @param {string} [options.cwd] The current working directory.
|
40
|
+
*/
|
41
|
+
constructor({ filePath, cwd }) {
|
42
|
+
this.filePath = filePath;
|
43
|
+
this.cwd = cwd;
|
44
|
+
}
|
45
|
+
|
46
|
+
/**
|
47
|
+
* Updates the suppressions file based on the current violations and the provided rules.
|
48
|
+
* If no rules are provided, all violations are suppressed.
|
49
|
+
* @param {LintResult[]|undefined} results The lint results.
|
50
|
+
* @param {string[]|undefined} rules The rules to suppress.
|
51
|
+
* @returns {Promise<void>}
|
52
|
+
*/
|
53
|
+
async suppress(results, rules) {
|
54
|
+
const suppressions = await this.load();
|
55
|
+
|
56
|
+
for (const result of results) {
|
57
|
+
const relativeFilePath = this.getRelativeFilePath(result.filePath);
|
58
|
+
const violationsByRule = SuppressionsService.countViolationsByRule(
|
59
|
+
result.messages,
|
60
|
+
);
|
61
|
+
|
62
|
+
for (const ruleId in violationsByRule) {
|
63
|
+
if (rules && !rules.includes(ruleId)) {
|
64
|
+
continue;
|
65
|
+
}
|
66
|
+
|
67
|
+
suppressions[relativeFilePath] ??= {};
|
68
|
+
suppressions[relativeFilePath][ruleId] =
|
69
|
+
violationsByRule[ruleId];
|
70
|
+
}
|
71
|
+
}
|
72
|
+
|
73
|
+
return this.save(suppressions);
|
74
|
+
}
|
75
|
+
|
76
|
+
/**
|
77
|
+
* Removes old, unused suppressions for violations that do not occur anymore.
|
78
|
+
* @param {LintResult[]} results The lint results.
|
79
|
+
* @returns {Promise<void>} No return value.
|
80
|
+
*/
|
81
|
+
async prune(results) {
|
82
|
+
const suppressions = await this.load();
|
83
|
+
const { unused } = this.applySuppressions(results, suppressions);
|
84
|
+
|
85
|
+
for (const file in unused) {
|
86
|
+
if (!suppressions[file]) {
|
87
|
+
continue;
|
88
|
+
}
|
89
|
+
|
90
|
+
for (const rule in unused[file]) {
|
91
|
+
if (!suppressions[file][rule]) {
|
92
|
+
continue;
|
93
|
+
}
|
94
|
+
|
95
|
+
const suppressionsCount = suppressions[file][rule].count;
|
96
|
+
const violationsCount = unused[file][rule].count;
|
97
|
+
|
98
|
+
if (suppressionsCount === violationsCount) {
|
99
|
+
// Remove unused rules
|
100
|
+
delete suppressions[file][rule];
|
101
|
+
} else {
|
102
|
+
// Update the count to match the new number of violations
|
103
|
+
suppressions[file][rule].count -= violationsCount;
|
104
|
+
}
|
105
|
+
}
|
106
|
+
|
107
|
+
// Cleanup files with no rules
|
108
|
+
if (Object.keys(suppressions[file]).length === 0) {
|
109
|
+
delete suppressions[file];
|
110
|
+
}
|
111
|
+
}
|
112
|
+
|
113
|
+
return this.save(suppressions);
|
114
|
+
}
|
115
|
+
|
116
|
+
/**
|
117
|
+
* Checks the provided suppressions against the lint results.
|
118
|
+
*
|
119
|
+
* For each file, counts the number of violations per rule.
|
120
|
+
* For each rule in each file, compares the number of violations against the counter from the suppressions file.
|
121
|
+
* If the number of violations is less or equal to the counter, messages are moved to `LintResult#suppressedMessages` and ignored.
|
122
|
+
* Otherwise, all violations are reported as usual.
|
123
|
+
* @param {LintResult[]} results The lint results.
|
124
|
+
* @param {SuppressedViolations} suppressions The suppressions.
|
125
|
+
* @returns {{
|
126
|
+
* results: LintResult[],
|
127
|
+
* unused: SuppressedViolations
|
128
|
+
* }} The updated results and the unused suppressions.
|
129
|
+
*/
|
130
|
+
applySuppressions(results, suppressions) {
|
131
|
+
/**
|
132
|
+
* We copy the results to avoid modifying the original objects
|
133
|
+
* We remove only result messages that are matched and hence suppressed
|
134
|
+
* We leave the rest untouched to minimize the risk of losing parts of the original data
|
135
|
+
*/
|
136
|
+
const filtered = structuredClone(results);
|
137
|
+
const unused = {};
|
138
|
+
|
139
|
+
for (const result of filtered) {
|
140
|
+
const relativeFilePath = this.getRelativeFilePath(result.filePath);
|
141
|
+
|
142
|
+
if (!suppressions[relativeFilePath]) {
|
143
|
+
continue;
|
144
|
+
}
|
145
|
+
|
146
|
+
const violationsByRule = SuppressionsService.countViolationsByRule(
|
147
|
+
result.messages,
|
148
|
+
);
|
149
|
+
let wasSuppressed = false;
|
150
|
+
|
151
|
+
for (const ruleId in violationsByRule) {
|
152
|
+
if (!suppressions[relativeFilePath][ruleId]) {
|
153
|
+
continue;
|
154
|
+
}
|
155
|
+
|
156
|
+
const suppressionsCount =
|
157
|
+
suppressions[relativeFilePath][ruleId].count;
|
158
|
+
const violationsCount = violationsByRule[ruleId].count;
|
159
|
+
|
160
|
+
// Suppress messages if the number of violations is less or equal to the suppressions count
|
161
|
+
if (violationsCount <= suppressionsCount) {
|
162
|
+
SuppressionsService.suppressMessagesByRule(result, ruleId);
|
163
|
+
wasSuppressed = true;
|
164
|
+
}
|
165
|
+
|
166
|
+
// Update the count to match the new number of violations, otherwise remove the rule entirely
|
167
|
+
if (violationsCount < suppressionsCount) {
|
168
|
+
unused[relativeFilePath] ??= {};
|
169
|
+
unused[relativeFilePath][ruleId] ??= {};
|
170
|
+
unused[relativeFilePath][ruleId].count =
|
171
|
+
suppressionsCount - violationsCount;
|
172
|
+
}
|
173
|
+
}
|
174
|
+
|
175
|
+
// Mark as unused all the suppressions that were not matched against a rule
|
176
|
+
for (const ruleId in suppressions[relativeFilePath]) {
|
177
|
+
if (violationsByRule[ruleId]) {
|
178
|
+
continue;
|
179
|
+
}
|
180
|
+
|
181
|
+
unused[relativeFilePath] ??= {};
|
182
|
+
unused[relativeFilePath][ruleId] =
|
183
|
+
suppressions[relativeFilePath][ruleId];
|
184
|
+
}
|
185
|
+
|
186
|
+
// Recalculate stats if messages were suppressed
|
187
|
+
if (wasSuppressed) {
|
188
|
+
Object.assign(result, calculateStatsPerFile(result.messages));
|
189
|
+
}
|
190
|
+
}
|
191
|
+
|
192
|
+
return {
|
193
|
+
results: filtered,
|
194
|
+
unused,
|
195
|
+
};
|
196
|
+
}
|
197
|
+
|
198
|
+
/**
|
199
|
+
* Loads the suppressions file.
|
200
|
+
* @throws {Error} If the suppressions file cannot be parsed.
|
201
|
+
* @returns {Promise<SuppressedViolations>} The suppressions.
|
202
|
+
*/
|
203
|
+
async load() {
|
204
|
+
try {
|
205
|
+
const data = await fs.promises.readFile(this.filePath, "utf8");
|
206
|
+
|
207
|
+
return JSON.parse(data);
|
208
|
+
} catch (err) {
|
209
|
+
if (err.code === "ENOENT") {
|
210
|
+
return {};
|
211
|
+
}
|
212
|
+
throw new Error(
|
213
|
+
`Failed to parse suppressions file at ${this.filePath}`,
|
214
|
+
);
|
215
|
+
}
|
216
|
+
}
|
217
|
+
|
218
|
+
/**
|
219
|
+
* Updates the suppressions file.
|
220
|
+
* @param {SuppressedViolations} suppressions The suppressions to save.
|
221
|
+
* @returns {Promise<void>}
|
222
|
+
* @private
|
223
|
+
*/
|
224
|
+
save(suppressions) {
|
225
|
+
return fs.promises.writeFile(
|
226
|
+
this.filePath,
|
227
|
+
JSON.stringify(suppressions, null, 2),
|
228
|
+
);
|
229
|
+
}
|
230
|
+
|
231
|
+
/**
|
232
|
+
* Counts the violations by rule, ignoring warnings.
|
233
|
+
* @param {LintMessage[]} messages The messages to count.
|
234
|
+
* @returns {Record<string, number>} The number of violations by rule.
|
235
|
+
*/
|
236
|
+
static countViolationsByRule(messages) {
|
237
|
+
return messages.reduce((totals, message) => {
|
238
|
+
if (message.severity === 2 && message.ruleId) {
|
239
|
+
totals[message.ruleId] ??= { count: 0 };
|
240
|
+
totals[message.ruleId].count++;
|
241
|
+
}
|
242
|
+
return totals;
|
243
|
+
}, {});
|
244
|
+
}
|
245
|
+
|
246
|
+
/**
|
247
|
+
* Returns the relative path of a file to the current working directory.
|
248
|
+
* Always in POSIX format for consistency and interoperability.
|
249
|
+
* @param {string} filePath The file path.
|
250
|
+
* @returns {string} The relative file path.
|
251
|
+
*/
|
252
|
+
getRelativeFilePath(filePath) {
|
253
|
+
return path
|
254
|
+
.relative(this.cwd, filePath)
|
255
|
+
.split(path.sep)
|
256
|
+
.join(path.posix.sep);
|
257
|
+
}
|
258
|
+
|
259
|
+
/**
|
260
|
+
* Moves the messages matching the rule to `LintResult#suppressedMessages` and updates the stats.
|
261
|
+
* @param {LintResult} result The result to update.
|
262
|
+
* @param {string} ruleId The rule to suppress.
|
263
|
+
* @returns {void}
|
264
|
+
*/
|
265
|
+
static suppressMessagesByRule(result, ruleId) {
|
266
|
+
const suppressedMessages = result.messages.filter(
|
267
|
+
message => message.ruleId === ruleId,
|
268
|
+
);
|
269
|
+
|
270
|
+
result.suppressedMessages = result.suppressedMessages.concat(
|
271
|
+
suppressedMessages.map(message => {
|
272
|
+
message.suppressions = [
|
273
|
+
{
|
274
|
+
kind: "file",
|
275
|
+
justification: "",
|
276
|
+
},
|
277
|
+
];
|
278
|
+
|
279
|
+
return message;
|
280
|
+
}),
|
281
|
+
);
|
282
|
+
|
283
|
+
result.messages = result.messages.filter(
|
284
|
+
message => message.ruleId !== ruleId,
|
285
|
+
);
|
286
|
+
}
|
287
|
+
}
|
288
|
+
|
289
|
+
module.exports = { SuppressionsService };
|
package/lib/shared/ajv.js
CHANGED
@@ -9,26 +9,26 @@
|
|
9
9
|
//------------------------------------------------------------------------------
|
10
10
|
|
11
11
|
const Ajv = require("ajv"),
|
12
|
-
|
12
|
+
metaSchema = require("ajv/lib/refs/json-schema-draft-04.json");
|
13
13
|
|
14
14
|
//------------------------------------------------------------------------------
|
15
15
|
// Public Interface
|
16
16
|
//------------------------------------------------------------------------------
|
17
17
|
|
18
18
|
module.exports = (additionalOptions = {}) => {
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
19
|
+
const ajv = new Ajv({
|
20
|
+
meta: false,
|
21
|
+
useDefaults: true,
|
22
|
+
validateSchema: false,
|
23
|
+
missingRefs: "ignore",
|
24
|
+
verbose: true,
|
25
|
+
schemaId: "auto",
|
26
|
+
...additionalOptions,
|
27
|
+
});
|
28
28
|
|
29
|
-
|
30
|
-
|
31
|
-
|
29
|
+
ajv.addMetaSchema(metaSchema);
|
30
|
+
// eslint-disable-next-line no-underscore-dangle -- Ajv's API
|
31
|
+
ajv._opts.defaultMeta = metaSchema.id;
|
32
32
|
|
33
|
-
|
33
|
+
return ajv;
|
34
34
|
};
|
package/lib/shared/assert.js
CHANGED
@@ -13,10 +13,9 @@
|
|
13
13
|
* @throws {Error} When the condition is not truthy.
|
14
14
|
*/
|
15
15
|
function ok(value, message = "Assertion failed.") {
|
16
|
-
|
17
|
-
|
18
|
-
|
16
|
+
if (!value) {
|
17
|
+
throw new Error(message);
|
18
|
+
}
|
19
19
|
}
|
20
20
|
|
21
|
-
|
22
21
|
module.exports = ok;
|
package/lib/shared/ast-utils.js
CHANGED
@@ -8,7 +8,8 @@
|
|
8
8
|
*/
|
9
9
|
"use strict";
|
10
10
|
|
11
|
-
const breakableTypePattern =
|
11
|
+
const breakableTypePattern =
|
12
|
+
/^(?:(?:Do)?While|For(?:In|Of)?|Switch)Statement$/u;
|
12
13
|
const lineBreakPattern = /\r\n|[\r\n\u2028\u2029]/u;
|
13
14
|
const shebangPattern = /^#!([^\r\n]+)/u;
|
14
15
|
|
@@ -18,12 +19,12 @@ const shebangPattern = /^#!([^\r\n]+)/u;
|
|
18
19
|
* @returns {RegExp} A global regular expression that matches line terminators
|
19
20
|
*/
|
20
21
|
function createGlobalLinebreakMatcher() {
|
21
|
-
|
22
|
+
return new RegExp(lineBreakPattern.source, "gu");
|
22
23
|
}
|
23
24
|
|
24
25
|
module.exports = {
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
26
|
+
breakableTypePattern,
|
27
|
+
lineBreakPattern,
|
28
|
+
createGlobalLinebreakMatcher,
|
29
|
+
shebangPattern,
|
29
30
|
};
|
@@ -11,7 +11,7 @@
|
|
11
11
|
* @returns {boolean} Whether value is an object
|
12
12
|
*/
|
13
13
|
function isObjectNotArray(value) {
|
14
|
-
|
14
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
15
15
|
}
|
16
16
|
|
17
17
|
/**
|
@@ -21,23 +21,23 @@ function isObjectNotArray(value) {
|
|
21
21
|
* @returns {T | U | (T & U)} Merged equivalent of second on top of first.
|
22
22
|
*/
|
23
23
|
function deepMergeObjects(first, second) {
|
24
|
-
|
25
|
-
|
26
|
-
|
24
|
+
if (second === void 0) {
|
25
|
+
return first;
|
26
|
+
}
|
27
27
|
|
28
|
-
|
29
|
-
|
30
|
-
|
28
|
+
if (!isObjectNotArray(first) || !isObjectNotArray(second)) {
|
29
|
+
return second;
|
30
|
+
}
|
31
31
|
|
32
|
-
|
32
|
+
const result = { ...first, ...second };
|
33
33
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
34
|
+
for (const key of Object.keys(second)) {
|
35
|
+
if (Object.prototype.propertyIsEnumerable.call(first, key)) {
|
36
|
+
result[key] = deepMergeObjects(first[key], second[key]);
|
37
|
+
}
|
38
|
+
}
|
39
39
|
|
40
|
-
|
40
|
+
return result;
|
41
41
|
}
|
42
42
|
|
43
43
|
/**
|
@@ -47,14 +47,16 @@ function deepMergeObjects(first, second) {
|
|
47
47
|
* @returns {(T | U | (T & U))[]} Merged equivalent of second on top of first.
|
48
48
|
*/
|
49
49
|
function deepMergeArrays(first, second) {
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
50
|
+
if (!first || !second) {
|
51
|
+
return second || first || [];
|
52
|
+
}
|
53
|
+
|
54
|
+
return [
|
55
|
+
...first.map((value, i) =>
|
56
|
+
deepMergeObjects(value, i < second.length ? second[i] : void 0),
|
57
|
+
),
|
58
|
+
...second.slice(first.length),
|
59
|
+
];
|
58
60
|
}
|
59
61
|
|
60
62
|
module.exports = { deepMergeArrays };
|
package/lib/shared/directives.js
CHANGED
@@ -8,8 +8,9 @@
|
|
8
8
|
*/
|
9
9
|
"use strict";
|
10
10
|
|
11
|
-
const directivesPattern =
|
11
|
+
const directivesPattern =
|
12
|
+
/^(eslint(?:-env|-enable|-disable(?:(?:-next)?-line)?)?|exported|globals?)(?:\s|$)/u;
|
12
13
|
|
13
14
|
module.exports = {
|
14
|
-
|
15
|
+
directivesPattern,
|
15
16
|
};
|