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
|
@@ -9,9 +9,9 @@
|
|
|
9
9
|
// Requirements
|
|
10
10
|
//------------------------------------------------------------------------------
|
|
11
11
|
|
|
12
|
-
const path = require("path");
|
|
12
|
+
const path = require("node:path");
|
|
13
13
|
const spawn = require("cross-spawn");
|
|
14
|
-
const os = require("os");
|
|
14
|
+
const os = require("node:os");
|
|
15
15
|
const log = require("../shared/logging");
|
|
16
16
|
const packageJson = require("../../package.json");
|
|
17
17
|
|
|
@@ -24,129 +24,138 @@ const packageJson = require("../../package.json");
|
|
|
24
24
|
* @returns {string} A string that contains execution environment information.
|
|
25
25
|
*/
|
|
26
26
|
function environment() {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
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
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
27
|
+
const cache = new Map();
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Checks if a path is a child of a directory.
|
|
31
|
+
* @param {string} parentPath The parent path to check.
|
|
32
|
+
* @param {string} childPath The path to check.
|
|
33
|
+
* @returns {boolean} Whether or not the given path is a child of a directory.
|
|
34
|
+
*/
|
|
35
|
+
function isChildOfDirectory(parentPath, childPath) {
|
|
36
|
+
return !path.relative(parentPath, childPath).startsWith("..");
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Synchronously executes a shell command and formats the result.
|
|
41
|
+
* @param {string} cmd The command to execute.
|
|
42
|
+
* @param {Array} args The arguments to be executed with the command.
|
|
43
|
+
* @throws {Error} As may be collected by `cross-spawn.sync`.
|
|
44
|
+
* @returns {string} The version returned by the command.
|
|
45
|
+
*/
|
|
46
|
+
function execCommand(cmd, args) {
|
|
47
|
+
const key = [cmd, ...args].join(" ");
|
|
48
|
+
|
|
49
|
+
if (cache.has(key)) {
|
|
50
|
+
return cache.get(key);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const process = spawn.sync(cmd, args, { encoding: "utf8" });
|
|
54
|
+
|
|
55
|
+
if (process.error) {
|
|
56
|
+
throw process.error;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
const result = process.stdout.trim();
|
|
60
|
+
|
|
61
|
+
cache.set(key, result);
|
|
62
|
+
return result;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Normalizes a version number.
|
|
67
|
+
* @param {string} versionStr The string to normalize.
|
|
68
|
+
* @returns {string} The normalized version number.
|
|
69
|
+
*/
|
|
70
|
+
function normalizeVersionStr(versionStr) {
|
|
71
|
+
return versionStr.startsWith("v") ? versionStr : `v${versionStr}`;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Gets bin version.
|
|
76
|
+
* @param {string} bin The bin to check.
|
|
77
|
+
* @throws {Error} As may be collected by `cross-spawn.sync`.
|
|
78
|
+
* @returns {string} The normalized version returned by the command.
|
|
79
|
+
*/
|
|
80
|
+
function getBinVersion(bin) {
|
|
81
|
+
const binArgs = ["--version"];
|
|
82
|
+
|
|
83
|
+
try {
|
|
84
|
+
return normalizeVersionStr(execCommand(bin, binArgs));
|
|
85
|
+
} catch (e) {
|
|
86
|
+
log.error(
|
|
87
|
+
`Error finding ${bin} version running the command \`${bin} ${binArgs.join(" ")}\``,
|
|
88
|
+
);
|
|
89
|
+
throw e;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Gets installed npm package version.
|
|
95
|
+
* @param {string} pkg The package to check.
|
|
96
|
+
* @param {boolean} global Whether to check globally or not.
|
|
97
|
+
* @throws {Error} As may be collected by `cross-spawn.sync`.
|
|
98
|
+
* @returns {string} The normalized version returned by the command.
|
|
99
|
+
*/
|
|
100
|
+
function getNpmPackageVersion(pkg, { global = false } = {}) {
|
|
101
|
+
const npmBinArgs = ["bin", "-g"];
|
|
102
|
+
const npmLsArgs = ["ls", "--depth=0", "--json", pkg];
|
|
103
|
+
|
|
104
|
+
if (global) {
|
|
105
|
+
npmLsArgs.push("-g");
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
try {
|
|
109
|
+
const parsedStdout = JSON.parse(execCommand("npm", npmLsArgs));
|
|
110
|
+
|
|
111
|
+
/*
|
|
112
|
+
* Checking globally returns an empty JSON object, while local checks
|
|
113
|
+
* include the name and version of the local project.
|
|
114
|
+
*/
|
|
115
|
+
if (
|
|
116
|
+
Object.keys(parsedStdout).length === 0 ||
|
|
117
|
+
!(parsedStdout.dependencies && parsedStdout.dependencies.eslint)
|
|
118
|
+
) {
|
|
119
|
+
return "Not found";
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
const [, processBinPath] = process.argv;
|
|
123
|
+
let npmBinPath;
|
|
124
|
+
|
|
125
|
+
try {
|
|
126
|
+
npmBinPath = execCommand("npm", npmBinArgs);
|
|
127
|
+
} catch (e) {
|
|
128
|
+
log.error(
|
|
129
|
+
`Error finding npm binary path when running command \`npm ${npmBinArgs.join(" ")}\``,
|
|
130
|
+
);
|
|
131
|
+
throw e;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
const isGlobal = isChildOfDirectory(npmBinPath, processBinPath);
|
|
135
|
+
let pkgVersion = parsedStdout.dependencies.eslint.version;
|
|
136
|
+
|
|
137
|
+
if ((global && isGlobal) || (!global && !isGlobal)) {
|
|
138
|
+
pkgVersion += " (Currently used)";
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
return normalizeVersionStr(pkgVersion);
|
|
142
|
+
} catch (e) {
|
|
143
|
+
log.error(
|
|
144
|
+
`Error finding ${pkg} version running the command \`npm ${npmLsArgs.join(" ")}\``,
|
|
145
|
+
);
|
|
146
|
+
throw e;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
return [
|
|
151
|
+
"Environment Info:",
|
|
152
|
+
"",
|
|
153
|
+
`Node version: ${process.version}`,
|
|
154
|
+
`npm version: ${getBinVersion("npm")}`,
|
|
155
|
+
`Local ESLint version: ${getNpmPackageVersion("eslint", { global: false })}`,
|
|
156
|
+
`Global ESLint version: ${getNpmPackageVersion("eslint", { global: true })}`,
|
|
157
|
+
`Operating System: ${os.platform()} ${os.release()}`,
|
|
158
|
+
].join("\n");
|
|
150
159
|
}
|
|
151
160
|
|
|
152
161
|
/**
|
|
@@ -154,7 +163,7 @@ function environment() {
|
|
|
154
163
|
* @returns {string} The version from the currently executing ESLint's package.json.
|
|
155
164
|
*/
|
|
156
165
|
function version() {
|
|
157
|
-
|
|
166
|
+
return `v${packageJson.version}`;
|
|
158
167
|
}
|
|
159
168
|
|
|
160
169
|
//------------------------------------------------------------------------------
|
|
@@ -162,6 +171,7 @@ function version() {
|
|
|
162
171
|
//------------------------------------------------------------------------------
|
|
163
172
|
|
|
164
173
|
module.exports = {
|
|
165
|
-
|
|
166
|
-
|
|
174
|
+
__esModule: true, // Indicate intent for imports, remove ambiguity for Knip (see: https://github.com/eslint/eslint/pull/18005#discussion_r1484422616)
|
|
175
|
+
environment,
|
|
176
|
+
version,
|
|
167
177
|
};
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Serialization utils.
|
|
3
|
+
* @author Bryan Mishkin
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
"use strict";
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Check if a value is a primitive or plain object created by the Object constructor.
|
|
10
|
+
* @param {any} val the value to check
|
|
11
|
+
* @returns {boolean} true if so
|
|
12
|
+
* @private
|
|
13
|
+
*/
|
|
14
|
+
function isSerializablePrimitiveOrPlainObject(val) {
|
|
15
|
+
return (
|
|
16
|
+
val === null ||
|
|
17
|
+
typeof val === "string" ||
|
|
18
|
+
typeof val === "boolean" ||
|
|
19
|
+
typeof val === "number" ||
|
|
20
|
+
(typeof val === "object" && val.constructor === Object) ||
|
|
21
|
+
Array.isArray(val)
|
|
22
|
+
);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Check if a value is serializable.
|
|
27
|
+
* Functions or objects like RegExp cannot be serialized by JSON.stringify().
|
|
28
|
+
* Inspired by: https://stackoverflow.com/questions/30579940/reliable-way-to-check-if-objects-is-serializable-in-javascript
|
|
29
|
+
* @param {any} val The value
|
|
30
|
+
* @param {Set<Object>} seenObjects Objects already seen in this path from the root object.
|
|
31
|
+
* @returns {boolean} `true` if the value is serializable
|
|
32
|
+
*/
|
|
33
|
+
function isSerializable(val, seenObjects = new Set()) {
|
|
34
|
+
if (!isSerializablePrimitiveOrPlainObject(val)) {
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
if (typeof val === "object" && val !== null) {
|
|
38
|
+
if (seenObjects.has(val)) {
|
|
39
|
+
/*
|
|
40
|
+
* Since this is a depth-first traversal, encountering
|
|
41
|
+
* the same object again means there is a circular reference.
|
|
42
|
+
* Objects with circular references are not serializable.
|
|
43
|
+
*/
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
for (const property in val) {
|
|
47
|
+
if (Object.hasOwn(val, property)) {
|
|
48
|
+
if (!isSerializablePrimitiveOrPlainObject(val[property])) {
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
if (
|
|
52
|
+
typeof val[property] === "object" &&
|
|
53
|
+
val[property] !== null
|
|
54
|
+
) {
|
|
55
|
+
if (
|
|
56
|
+
/*
|
|
57
|
+
* We're creating a new Set of seen objects because we want to
|
|
58
|
+
* ensure that `val` doesn't appear again in this path, but it can appear
|
|
59
|
+
* in other paths. This allows for reusing objects in the graph, as long as
|
|
60
|
+
* there are no cycles.
|
|
61
|
+
*/
|
|
62
|
+
!isSerializable(
|
|
63
|
+
val[property],
|
|
64
|
+
new Set([...seenObjects, val]),
|
|
65
|
+
)
|
|
66
|
+
) {
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return true;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
module.exports = {
|
|
77
|
+
isSerializable,
|
|
78
|
+
};
|
package/lib/shared/severity.js
CHANGED
|
@@ -12,16 +12,16 @@
|
|
|
12
12
|
* @returns {string} severity string
|
|
13
13
|
*/
|
|
14
14
|
function normalizeSeverityToString(severity) {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
15
|
+
if ([2, "2", "error"].includes(severity)) {
|
|
16
|
+
return "error";
|
|
17
|
+
}
|
|
18
|
+
if ([1, "1", "warn"].includes(severity)) {
|
|
19
|
+
return "warn";
|
|
20
|
+
}
|
|
21
|
+
if ([0, "0", "off"].includes(severity)) {
|
|
22
|
+
return "off";
|
|
23
|
+
}
|
|
24
|
+
throw new Error(`Invalid severity value: ${severity}`);
|
|
25
25
|
}
|
|
26
26
|
|
|
27
27
|
/**
|
|
@@ -31,19 +31,19 @@ function normalizeSeverityToString(severity) {
|
|
|
31
31
|
* @returns {number} severity number
|
|
32
32
|
*/
|
|
33
33
|
function normalizeSeverityToNumber(severity) {
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
34
|
+
if ([2, "2", "error"].includes(severity)) {
|
|
35
|
+
return 2;
|
|
36
|
+
}
|
|
37
|
+
if ([1, "1", "warn"].includes(severity)) {
|
|
38
|
+
return 1;
|
|
39
|
+
}
|
|
40
|
+
if ([0, "0", "off"].includes(severity)) {
|
|
41
|
+
return 0;
|
|
42
|
+
}
|
|
43
|
+
throw new Error(`Invalid severity value: ${severity}`);
|
|
44
44
|
}
|
|
45
45
|
|
|
46
46
|
module.exports = {
|
|
47
|
-
|
|
48
|
-
|
|
47
|
+
normalizeSeverityToString,
|
|
48
|
+
normalizeSeverityToNumber,
|
|
49
49
|
};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Provides helper functions to start/stop the time measurements
|
|
3
|
+
* that are provided by the ESLint 'stats' option.
|
|
4
|
+
* @author Mara Kiefer <http://github.com/mnkiefer>
|
|
5
|
+
*/
|
|
6
|
+
"use strict";
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Start time measurement
|
|
10
|
+
* @returns {[number, number]} t variable for tracking time
|
|
11
|
+
*/
|
|
12
|
+
function startTime() {
|
|
13
|
+
return process.hrtime();
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* End time measurement
|
|
18
|
+
* @param {[number, number]} t Variable for tracking time
|
|
19
|
+
* @returns {number} The measured time in milliseconds
|
|
20
|
+
*/
|
|
21
|
+
function endTime(t) {
|
|
22
|
+
const time = process.hrtime(t);
|
|
23
|
+
|
|
24
|
+
return time[0] * 1e3 + time[1] / 1e6;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
module.exports = {
|
|
28
|
+
startTime,
|
|
29
|
+
endTime,
|
|
30
|
+
};
|
|
@@ -5,12 +5,6 @@
|
|
|
5
5
|
|
|
6
6
|
"use strict";
|
|
7
7
|
|
|
8
|
-
//------------------------------------------------------------------------------
|
|
9
|
-
// Requirements
|
|
10
|
-
//------------------------------------------------------------------------------
|
|
11
|
-
|
|
12
|
-
const Graphemer = require("graphemer").default;
|
|
13
|
-
|
|
14
8
|
//------------------------------------------------------------------------------
|
|
15
9
|
// Helpers
|
|
16
10
|
//------------------------------------------------------------------------------
|
|
@@ -18,8 +12,8 @@ const Graphemer = require("graphemer").default;
|
|
|
18
12
|
// eslint-disable-next-line no-control-regex -- intentionally including control characters
|
|
19
13
|
const ASCII_REGEX = /^[\u0000-\u007f]*$/u;
|
|
20
14
|
|
|
21
|
-
/** @type {
|
|
22
|
-
let
|
|
15
|
+
/** @type {Intl.Segmenter | undefined} */
|
|
16
|
+
let segmenter;
|
|
23
17
|
|
|
24
18
|
//------------------------------------------------------------------------------
|
|
25
19
|
// Public Interface
|
|
@@ -31,10 +25,10 @@ let splitter;
|
|
|
31
25
|
* @returns {string} The converted string
|
|
32
26
|
*/
|
|
33
27
|
function upperCaseFirst(string) {
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
28
|
+
if (string.length <= 1) {
|
|
29
|
+
return string.toUpperCase();
|
|
30
|
+
}
|
|
31
|
+
return string[0].toUpperCase() + string.slice(1);
|
|
38
32
|
}
|
|
39
33
|
|
|
40
34
|
/**
|
|
@@ -43,18 +37,22 @@ function upperCaseFirst(string) {
|
|
|
43
37
|
* @returns {number} The number of graphemes in `value`.
|
|
44
38
|
*/
|
|
45
39
|
function getGraphemeCount(value) {
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
40
|
+
if (ASCII_REGEX.test(value)) {
|
|
41
|
+
return value.length;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
segmenter ??= new Intl.Segmenter("en-US"); // en-US locale should be supported everywhere
|
|
45
|
+
let graphemeCount = 0;
|
|
49
46
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
47
|
+
// eslint-disable-next-line no-unused-vars -- for-of needs a variable
|
|
48
|
+
for (const unused of segmenter.segment(value)) {
|
|
49
|
+
graphemeCount++;
|
|
50
|
+
}
|
|
53
51
|
|
|
54
|
-
|
|
52
|
+
return graphemeCount;
|
|
55
53
|
}
|
|
56
54
|
|
|
57
55
|
module.exports = {
|
|
58
|
-
|
|
59
|
-
|
|
56
|
+
upperCaseFirst,
|
|
57
|
+
getGraphemeCount,
|
|
60
58
|
};
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Optimized version of the `text-table` npm module to improve performance by replacing inefficient regex-based
|
|
3
|
+
* whitespace trimming with a modern built-in method.
|
|
4
|
+
*
|
|
5
|
+
* This modification addresses a performance issue reported in https://github.com/eslint/eslint/issues/18709
|
|
6
|
+
*
|
|
7
|
+
* The `text-table` module is published under the MIT License. For the original source, refer to:
|
|
8
|
+
* https://www.npmjs.com/package/text-table.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
/*
|
|
12
|
+
*
|
|
13
|
+
* This software is released under the MIT license:
|
|
14
|
+
*
|
|
15
|
+
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
16
|
+
* this software and associated documentation files (the "Software"), to deal in
|
|
17
|
+
* the Software without restriction, including without limitation the rights to
|
|
18
|
+
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
|
19
|
+
* the Software, and to permit persons to whom the Software is furnished to do so,
|
|
20
|
+
* subject to the following conditions:
|
|
21
|
+
*
|
|
22
|
+
* The above copyright notice and this permission notice shall be included in all
|
|
23
|
+
* copies or substantial portions of the Software.
|
|
24
|
+
*
|
|
25
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
26
|
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
|
27
|
+
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
|
28
|
+
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
|
29
|
+
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
30
|
+
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
31
|
+
*/
|
|
32
|
+
|
|
33
|
+
"use strict";
|
|
34
|
+
|
|
35
|
+
module.exports = function (rows_, opts) {
|
|
36
|
+
const hsep = " ";
|
|
37
|
+
const align = opts.align;
|
|
38
|
+
const stringLength = opts.stringLength;
|
|
39
|
+
|
|
40
|
+
const sizes = rows_.reduce((acc, row) => {
|
|
41
|
+
row.forEach((c, ix) => {
|
|
42
|
+
const n = stringLength(c);
|
|
43
|
+
|
|
44
|
+
if (!acc[ix] || n > acc[ix]) {
|
|
45
|
+
acc[ix] = n;
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
return acc;
|
|
49
|
+
}, []);
|
|
50
|
+
|
|
51
|
+
return rows_
|
|
52
|
+
.map(row =>
|
|
53
|
+
row
|
|
54
|
+
.map((c, ix) => {
|
|
55
|
+
const n = sizes[ix] - stringLength(c) || 0;
|
|
56
|
+
const s = Array(Math.max(n + 1, 1)).join(" ");
|
|
57
|
+
|
|
58
|
+
if (align[ix] === "r") {
|
|
59
|
+
return s + c;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
return c + s;
|
|
63
|
+
})
|
|
64
|
+
.join(hsep)
|
|
65
|
+
.trimEnd(),
|
|
66
|
+
)
|
|
67
|
+
.join("\n");
|
|
68
|
+
};
|