@cplieger/deadset-ts 8.0.0-dev.2 → 8.0.0-dev.20
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 +3 -1
- package/THIRD_PARTY_NOTICES.md +27 -0
- package/dist/bin/mapper-connection.js +2 -1
- package/dist/bin/node-host.js +24 -5
- package/dist/src/alias-chain.js +2 -7
- package/dist/src/amd.js +81 -0
- package/dist/src/analysis.js +269 -432
- package/dist/src/augmentations.js +64 -3
- package/dist/src/automatic-types.js +10 -29
- package/dist/src/bindings.js +382 -0
- package/dist/src/calls.js +279 -43
- package/dist/src/commands/held.js +499 -0
- package/dist/src/commands/read.js +161 -0
- package/dist/src/commands/shell.js +169 -0
- package/dist/src/commands/tools.js +1847 -0
- package/dist/src/component-files.js +3 -2
- package/dist/src/component-layer.js +4 -2
- package/dist/src/config.js +6 -82
- package/dist/src/conformance-record.js +1 -1
- package/dist/src/consumers.js +10 -38
- package/dist/src/contextual-uses.js +57 -26
- package/dist/src/contract/config.generated.js +561 -0
- package/dist/src/contract/contract.generated.js +1369 -0
- package/dist/src/contract/report.generated.js +866 -0
- package/dist/src/dependencies.js +164 -121
- package/dist/src/destructuring.js +1 -19
- package/dist/src/edges.js +38 -122
- package/dist/src/element-access.js +181 -168
- package/dist/src/entries/build-scripts.js +222 -0
- package/dist/src/{configuration-files.js → entries/configuration-files.js} +52 -256
- package/dist/src/{convention-rows.js → entries/convention-rows.js} +170 -30
- package/dist/src/entries/conventions.js +740 -0
- package/dist/src/{html-entries.js → entries/html-entries.js} +12 -42
- package/dist/src/{mdx-entries.js → entries/mdx-entries.js} +5 -28
- package/dist/src/entries/run-directories.js +77 -0
- package/dist/src/entries/sources.js +144 -0
- package/dist/src/entries/static-module.js +670 -0
- package/dist/src/entries/test-runners.js +650 -0
- package/dist/src/entries/workflow-steps.js +345 -0
- package/dist/src/enum-group.js +3 -10
- package/dist/src/erased-stores.js +4 -6
- package/dist/src/exempt-classes.js +1 -63
- package/dist/src/exempt.js +21 -66
- package/dist/src/exposure.js +400 -0
- package/dist/src/extensions.js +37 -0
- package/dist/src/facts.js +38 -0
- package/dist/src/failure.js +36 -0
- package/dist/src/file-facts.js +3 -26
- package/dist/src/findings/completion.js +109 -56
- package/dist/src/findings/dependencies-and-module-machinery.js +4 -5
- package/dist/src/findings/emitters.js +27 -41
- package/dist/src/{implementations.js → findings/implementations.js} +3 -3
- package/dist/src/{in-operands.js → findings/in-operands.js} +3 -2
- package/dist/src/findings/interfaces.js +4 -5
- package/dist/src/findings/intra-function.js +16 -13
- package/dist/src/findings/non-code-artifacts.js +17 -12
- package/dist/src/findings/reads-and-writes.js +86 -27
- package/dist/src/findings/self-check.js +44 -30
- package/dist/src/findings/unused-declarations.js +29 -45
- package/dist/src/findings/visibility-narrowing.js +23 -31
- package/dist/src/findings-pass.js +13 -21
- package/dist/src/framework-lifecycle.js +46 -19
- package/dist/src/fs/document.js +52 -0
- package/dist/src/fs/manifest.js +67 -0
- package/dist/src/fs/tree.js +88 -0
- package/dist/src/generated-file.js +174 -28
- package/dist/src/git-ignore.js +39 -26
- package/dist/src/import-bindings.js +73 -28
- package/dist/src/index/sites.js +557 -0
- package/dist/src/index.js +2 -2
- package/dist/src/indexed-access.js +523 -478
- package/dist/src/injection-container.js +2 -2
- package/dist/src/interface-satisfaction.js +1 -1
- package/dist/src/intra-function-parts.js +63 -43
- package/dist/src/inventory/commonjs.js +507 -0
- package/dist/src/inventory/enumerate.js +167 -0
- package/dist/src/inventory/syntax.js +236 -0
- package/dist/src/inventory.js +323 -724
- package/dist/src/javascript-file.js +48 -0
- package/dist/src/json-document.js +198 -67
- package/dist/src/keyof-comparisons.js +126 -107
- package/dist/src/kinds.js +3 -366
- package/dist/src/{components.js → liveness/components.js} +2 -3
- package/dist/src/{graph.js → liveness/graph.js} +52 -28
- package/dist/src/liveness/matrix.js +99 -0
- package/dist/src/liveness/sweep.js +558 -0
- package/dist/src/load/classify.js +289 -0
- package/dist/src/load/diagnostics.js +87 -0
- package/dist/src/load/discover.js +285 -0
- package/dist/src/{emit-map.js → load/emit-map.js} +1 -1
- package/dist/src/load/expected-module.js +136 -0
- package/dist/src/load/load.js +27 -0
- package/dist/src/load/module-lookup.js +37 -0
- package/dist/src/load/package-scope.js +56 -0
- package/dist/src/load/plan.js +313 -0
- package/dist/src/load/specifiers.js +113 -0
- package/dist/src/load/synthesize.js +152 -0
- package/dist/src/load/test-globals.js +207 -0
- package/dist/src/load/test-joins.js +82 -0
- package/dist/src/{workspace-manifests.js → load/workspace-manifests.js} +4 -4
- package/dist/src/{workspace-programs.js → load/workspace-programs.js} +89 -66
- package/dist/src/{workspace-resolution.js → load/workspace-resolution.js} +24 -66
- package/dist/src/{workspace-run.js → load/workspace-run.js} +7 -7
- package/dist/src/{workspace.js → load/workspace.js} +62 -124
- package/dist/src/module-declarations.js +70 -85
- package/dist/src/overrides.js +134 -112
- package/dist/src/partial.js +2 -1
- package/dist/src/paths.js +82 -16
- package/dist/src/platform-calls.js +78 -0
- package/dist/src/platform-symbols.js +134 -0
- package/dist/src/position.js +43 -1
- package/dist/src/print.js +11 -79
- package/dist/src/product.js +13 -0
- package/dist/src/query.js +47 -0
- package/dist/src/ref.js +12 -20
- package/dist/src/references/read-rule.js +1 -0
- package/dist/src/references/read-rules.js +48 -0
- package/dist/src/references/sink.js +237 -0
- package/dist/src/references/sources.js +450 -0
- package/dist/src/references.js +117 -1074
- package/dist/src/report-schema.js +51 -0
- package/dist/src/report.js +57 -41
- package/dist/src/reporters/annotations.js +15 -8
- package/dist/src/reporters/sarif.js +16 -10
- package/dist/src/reporters/template.js +4 -19
- package/dist/src/resolve.js +246 -730
- package/dist/src/{configured-declarations.js → roots/configured-declarations.js} +22 -24
- package/dist/src/{entry-point-gaps.js → roots/entry-point-gaps.js} +6 -15
- package/dist/src/roots/manifest.js +216 -0
- package/dist/src/roots/published-reach.js +412 -0
- package/dist/src/roots/root-set.js +487 -0
- package/dist/src/roots/unseen-loads.js +236 -0
- package/dist/src/run.js +66 -77
- package/dist/src/schema.js +320 -343
- package/dist/src/scope.js +38 -115
- package/dist/src/serialization-contract.js +601 -22
- package/dist/src/session.js +37 -29
- package/dist/src/source-files.js +6 -10
- package/dist/src/stores.js +4 -2
- package/dist/src/suppress-file.js +25 -28
- package/dist/src/suppress-inline.js +36 -83
- package/dist/src/suppress.js +50 -71
- package/dist/src/symbol-keys.js +92 -88
- package/dist/src/template-field.js +9 -19
- package/dist/src/tests/file-class.js +76 -0
- package/dist/src/{outside-tests.js → tests/outside.js} +7 -7
- package/dist/src/{test-support.js → tests/support.js} +5 -12
- package/dist/src/text/compare.js +26 -0
- package/dist/src/text/glob.js +194 -0
- package/dist/src/text/named-files.js +298 -0
- package/dist/src/text/yaml.js +684 -0
- package/dist/src/type-errors.js +11 -232
- package/dist/src/type-parameter-reads.js +178 -139
- package/dist/src/unimplemented-callees.js +262 -242
- package/dist/src/unwrap.js +23 -0
- package/dist/src/usage.js +10 -0
- package/dist/src/vendor/unbash/ansi-c.js +132 -0
- package/dist/src/vendor/unbash/arithmetic-parts.js +37 -0
- package/dist/src/vendor/unbash/arithmetic.js +591 -0
- package/dist/src/vendor/unbash/assignment.js +131 -0
- package/dist/src/vendor/unbash/chars.js +48 -0
- package/dist/src/vendor/unbash/command.js +41 -0
- package/dist/src/vendor/unbash/expansion.js +80 -0
- package/dist/src/vendor/unbash/glob.js +268 -0
- package/dist/src/vendor/unbash/heredoc.js +27 -0
- package/dist/src/vendor/unbash/internal-types.js +1 -0
- package/dist/src/vendor/unbash/lexer.js +4274 -0
- package/dist/src/vendor/unbash/limits.js +3 -0
- package/dist/src/vendor/unbash/parser.js +1366 -0
- package/dist/src/vendor/unbash/parts.js +57 -0
- package/dist/src/vendor/unbash/substitution-context.js +8 -0
- package/dist/src/vendor/unbash/traversal.js +212 -0
- package/dist/src/vendor/unbash/types.js +1 -0
- package/dist/src/vendor/unbash/word-value.js +61 -0
- package/dist/src/vendor/unbash/word.js +40 -0
- package/dist/src/verbs/analyze.js +194 -127
- package/dist/src/verbs/describe.js +13 -18
- package/dist/src/verbs/explain.js +85 -139
- package/dist/src/verbs/print-config.js +2 -1
- package/dist/src/verbs/print-projects.js +6 -4
- package/dist/src/verbs/print-retained.js +7 -5
- package/dist/src/verbs/print-roots.js +4 -2
- package/dist/src/verbs/verb.js +1 -5
- package/dist/src/verbs/version.js +14 -3
- package/jsr.json +2 -1
- package/package.json +14 -8
- package/src/alias-chain.ts +2 -9
- package/src/amd.ts +130 -0
- package/src/analysis.ts +424 -650
- package/src/augmentations.ts +93 -4
- package/src/automatic-types.ts +12 -30
- package/src/bindings.ts +460 -0
- package/src/calls.ts +338 -46
- package/src/commands/held.ts +632 -0
- package/src/commands/read.ts +242 -0
- package/src/commands/shell.ts +228 -0
- package/src/commands/tools.ts +2382 -0
- package/src/component-files.ts +4 -2
- package/src/component-layer.ts +4 -2
- package/src/config.ts +31 -302
- package/src/conformance-record.ts +1 -1
- package/src/consumers.ts +16 -66
- package/src/contextual-uses.ts +66 -34
- package/src/contract/config.generated.ts +821 -0
- package/src/contract/contract.generated.ts +1452 -0
- package/src/contract/report.generated.ts +1241 -0
- package/src/dependencies.ts +222 -127
- package/src/destructuring.ts +1 -31
- package/src/edges.ts +41 -140
- package/src/element-access.ts +190 -187
- package/src/entries/build-scripts.ts +292 -0
- package/src/{configuration-files.ts → entries/configuration-files.ts} +68 -278
- package/src/{convention-rows.ts → entries/convention-rows.ts} +227 -31
- package/src/{conventions.ts → entries/conventions.ts} +367 -583
- package/src/{html-entries.ts → entries/html-entries.ts} +22 -48
- package/src/{mdx-entries.ts → entries/mdx-entries.ts} +7 -30
- package/src/entries/run-directories.ts +108 -0
- package/src/entries/sources.ts +266 -0
- package/src/entries/static-module.ts +858 -0
- package/src/entries/test-runners.ts +835 -0
- package/src/entries/workflow-steps.ts +432 -0
- package/src/enum-group.ts +2 -11
- package/src/erased-stores.ts +3 -7
- package/src/exempt-classes.ts +1 -75
- package/src/exempt.ts +70 -98
- package/src/exposure.ts +492 -0
- package/src/extensions.ts +45 -0
- package/src/facts.ts +46 -0
- package/src/failure.ts +63 -0
- package/src/file-facts.ts +15 -25
- package/src/finding.ts +10 -10
- package/src/findings/boundary.ts +11 -0
- package/src/findings/completion.ts +133 -64
- package/src/findings/dependencies-and-module-machinery.ts +4 -7
- package/src/findings/emitter.ts +9 -10
- package/src/findings/emitters.ts +38 -52
- package/src/{implementations.ts → findings/implementations.ts} +4 -4
- package/src/{in-operands.ts → findings/in-operands.ts} +4 -3
- package/src/findings/interfaces.ts +7 -9
- package/src/findings/intra-function.ts +16 -14
- package/src/findings/non-code-artifacts.ts +24 -15
- package/src/findings/reads-and-writes.ts +118 -41
- package/src/findings/self-check.ts +51 -38
- package/src/findings/unused-declarations.ts +31 -49
- package/src/findings/visibility-narrowing.ts +36 -40
- package/src/findings-pass.ts +15 -31
- package/src/framework-lifecycle.ts +47 -19
- package/src/fs/document.ts +70 -0
- package/src/fs/manifest.ts +96 -0
- package/src/fs/tree.ts +110 -0
- package/src/generated-file.ts +242 -35
- package/src/git-ignore.ts +50 -26
- package/src/host.ts +12 -5
- package/src/import-bindings.ts +98 -29
- package/src/index/sites.ts +781 -0
- package/src/index.ts +2 -2
- package/src/indexed-access.ts +570 -527
- package/src/injection-container.ts +2 -2
- package/src/interface-satisfaction.ts +2 -2
- package/src/intra-function-parts.ts +73 -44
- package/src/inventory/commonjs.ts +696 -0
- package/src/inventory/enumerate.ts +203 -0
- package/src/inventory/syntax.ts +311 -0
- package/src/inventory.ts +442 -895
- package/src/javascript-file.ts +54 -0
- package/src/json-document.ts +241 -76
- package/src/keyof-comparisons.ts +133 -122
- package/src/kinds.ts +5 -413
- package/src/{components.ts → liveness/components.ts} +4 -6
- package/src/{graph.ts → liveness/graph.ts} +100 -35
- package/src/liveness/matrix.ts +162 -0
- package/src/liveness/sweep.ts +855 -0
- package/src/load/classify.ts +433 -0
- package/src/load/diagnostics.ts +154 -0
- package/src/load/discover.ts +471 -0
- package/src/{emit-map.ts → load/emit-map.ts} +1 -1
- package/src/load/expected-module.ts +194 -0
- package/src/load/load.ts +73 -0
- package/src/load/module-lookup.ts +50 -0
- package/src/load/package-scope.ts +74 -0
- package/src/load/plan.ts +513 -0
- package/src/load/specifiers.ts +171 -0
- package/src/load/synthesize.ts +230 -0
- package/src/load/test-globals.ts +251 -0
- package/src/load/test-joins.ts +98 -0
- package/src/{workspace-manifests.ts → load/workspace-manifests.ts} +5 -5
- package/src/{workspace-programs.ts → load/workspace-programs.ts} +128 -85
- package/src/{workspace-resolution.ts → load/workspace-resolution.ts} +41 -77
- package/src/{workspace-run.ts → load/workspace-run.ts} +18 -16
- package/src/{workspace.ts → load/workspace.ts} +90 -134
- package/src/module-declarations.ts +74 -98
- package/src/overrides.ts +162 -134
- package/src/partial.ts +3 -2
- package/src/paths.ts +92 -16
- package/src/platform-calls.ts +119 -0
- package/src/platform-symbols.ts +189 -0
- package/src/position.ts +44 -1
- package/src/print.ts +12 -92
- package/src/product.ts +18 -0
- package/src/query.ts +92 -0
- package/src/ref.ts +12 -20
- package/src/references/read-rule.ts +60 -0
- package/src/references/read-rules.ts +55 -0
- package/src/references/sink.ts +314 -0
- package/src/references/sources.ts +632 -0
- package/src/references.ts +187 -1450
- package/src/report-schema.ts +68 -0
- package/src/report.ts +103 -226
- package/src/reporters/annotations.ts +22 -11
- package/src/reporters/json.ts +1 -1
- package/src/reporters/reporter.ts +2 -4
- package/src/reporters/reporters.ts +1 -1
- package/src/reporters/sarif.ts +29 -16
- package/src/reporters/template.ts +4 -20
- package/src/reporters/text.ts +3 -3
- package/src/resolve.ts +284 -1115
- package/src/{configured-declarations.ts → roots/configured-declarations.ts} +27 -29
- package/src/{entry-point-gaps.ts → roots/entry-point-gaps.ts} +7 -16
- package/src/roots/manifest.ts +303 -0
- package/src/roots/published-reach.ts +486 -0
- package/src/{roots.ts → roots/root-set.ts} +286 -469
- package/src/roots/unseen-loads.ts +345 -0
- package/src/run.ts +75 -91
- package/src/schema.ts +391 -388
- package/src/scope.ts +46 -138
- package/src/serialization-contract.ts +769 -23
- package/src/session.ts +87 -55
- package/src/source-files.ts +6 -11
- package/src/stores.ts +15 -3
- package/src/suppress-file.ts +24 -33
- package/src/suppress-inline.ts +55 -91
- package/src/suppress.ts +78 -79
- package/src/symbol-keys.ts +104 -107
- package/src/template-field.ts +15 -25
- package/src/tests/file-class.ts +135 -0
- package/src/{outside-tests.ts → tests/outside.ts} +16 -10
- package/src/{test-support.ts → tests/support.ts} +15 -21
- package/src/text/compare.ts +27 -0
- package/src/text/glob.ts +210 -0
- package/src/text/named-files.ts +388 -0
- package/src/text/yaml.ts +747 -0
- package/src/type-errors.ts +18 -288
- package/src/type-parameter-reads.ts +187 -158
- package/src/unimplemented-callees.ts +297 -280
- package/src/unwrap.ts +34 -0
- package/src/usage.ts +10 -0
- package/src/vendor/unbash/LICENSE +15 -0
- package/src/vendor/unbash/VENDORED.md +16 -0
- package/src/vendor/unbash/ansi-c.ts +132 -0
- package/src/vendor/unbash/arithmetic-parts.ts +53 -0
- package/src/vendor/unbash/arithmetic.ts +641 -0
- package/src/vendor/unbash/assignment.ts +163 -0
- package/src/vendor/unbash/chars.ts +48 -0
- package/src/vendor/unbash/command.ts +47 -0
- package/src/vendor/unbash/expansion.ts +144 -0
- package/src/vendor/unbash/glob.ts +284 -0
- package/src/vendor/unbash/heredoc.ts +34 -0
- package/src/vendor/unbash/internal-types.ts +94 -0
- package/src/vendor/unbash/lexer.ts +4352 -0
- package/src/vendor/unbash/limits.ts +3 -0
- package/src/vendor/unbash/parser.ts +1612 -0
- package/src/vendor/unbash/parts.ts +96 -0
- package/src/vendor/unbash/substitution-context.ts +20 -0
- package/src/vendor/unbash/traversal.ts +182 -0
- package/src/vendor/unbash/types.ts +660 -0
- package/src/vendor/unbash/word-value.ts +64 -0
- package/src/vendor/unbash/word.ts +50 -0
- package/src/verbs/analyze.ts +255 -164
- package/src/verbs/describe.ts +19 -17
- package/src/verbs/explain.ts +93 -169
- package/src/verbs/print-config.ts +2 -1
- package/src/verbs/print-projects.ts +6 -4
- package/src/verbs/print-retained.ts +7 -5
- package/src/verbs/print-roots.ts +4 -2
- package/src/verbs/verb.ts +2 -8
- package/src/verbs/version.ts +15 -3
- package/dist/src/base-url.js +0 -18
- package/dist/src/conventions.js +0 -937
- package/dist/src/discover.js +0 -468
- package/dist/src/entry-points.js +0 -529
- package/dist/src/glob.js +0 -65
- package/dist/src/manifest.js +0 -165
- package/dist/src/matrix.js +0 -246
- package/dist/src/pnpm-workspace.js +0 -120
- package/dist/src/roots.js +0 -672
- package/dist/src/setup-failure.js +0 -23
- package/dist/src/sweep.js +0 -224
- package/dist/src/test-joins.js +0 -101
- package/dist/src/version.js +0 -7
- package/dist/src/workflow-steps.js +0 -185
- package/src/base-url.ts +0 -24
- package/src/discover.ts +0 -653
- package/src/entry-points.ts +0 -687
- package/src/glob.ts +0 -67
- package/src/manifest.ts +0 -234
- package/src/matrix.ts +0 -423
- package/src/pnpm-workspace.ts +0 -135
- package/src/setup-failure.ts +0 -39
- package/src/sweep.ts +0 -347
- package/src/test-joins.ts +0 -120
- package/src/version.ts +0 -7
- package/src/workflow-steps.ts +0 -216
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The loads by a computed path: those whose files the analysis resolves, and those it
|
|
3
|
+
* cannot, whose files are roots the analysis does not see, so the configuration's roots
|
|
4
|
+
* are never complete.
|
|
5
|
+
*/
|
|
6
|
+
import { isBinaryExpression, isCallExpression, isIdentifier, isMetaProperty, isNoSubstitutionTemplateLiteral, isPropertyAccessExpression, isStringLiteral, isTemplateExpression, SyntaxKind, } from "@typescript/native/ast";
|
|
7
|
+
import { amdLoadOf, amdUnresolved } from "../amd.js";
|
|
8
|
+
import { membersNamed, textsOf, writtenValue } from "../entries/static-module.js";
|
|
9
|
+
import { writtenName } from "../platform-calls.js";
|
|
10
|
+
import { cannotStartPackageName, dirnamePath, hasURLScheme, isAbsolutePath, relativePath, resolvePath, startsRelativePath, } from "../paths.js";
|
|
11
|
+
import { unwrapped } from "../unwrap.js";
|
|
12
|
+
import { globExpression } from "../text/glob.js";
|
|
13
|
+
/** The literal text a computed path starts with: a template's head, or a concatenation's first literal. */
|
|
14
|
+
function leadingLiteral(node) {
|
|
15
|
+
const at = unwrapped(node);
|
|
16
|
+
if (isTemplateExpression(at)) {
|
|
17
|
+
return at.head.text;
|
|
18
|
+
}
|
|
19
|
+
if (isBinaryExpression(at) && at.operatorToken.kind === SyntaxKind.PlusToken) {
|
|
20
|
+
const left = unwrapped(at.left);
|
|
21
|
+
return isStringLiteral(left) || isNoSubstitutionTemplateLiteral(left)
|
|
22
|
+
? left.text
|
|
23
|
+
: leadingLiteral(at.left);
|
|
24
|
+
}
|
|
25
|
+
return undefined;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* The directory below `dir` a computed load's leading literal names, every file of which
|
|
29
|
+
* the load reaches, or none where it names a package, `dir` itself or a directory holding
|
|
30
|
+
* it, each of which would name every sibling.
|
|
31
|
+
*/
|
|
32
|
+
function computedLoadDirectory(dir, prefix) {
|
|
33
|
+
if (!startsRelativePath(prefix) || !prefix.endsWith("/")) {
|
|
34
|
+
return undefined;
|
|
35
|
+
}
|
|
36
|
+
const target = resolvePath(dir, prefix);
|
|
37
|
+
return target === dir || relativePath(target, dir) !== undefined ? undefined : target;
|
|
38
|
+
}
|
|
39
|
+
/** Whether one node is a call that may load a module by a computed path. */
|
|
40
|
+
export function isLoadCall(node) {
|
|
41
|
+
if (!isCallExpression(node)) {
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
return (node.expression.kind === SyntaxKind.ImportKeyword ||
|
|
45
|
+
writtenName(node.expression) !== undefined ||
|
|
46
|
+
isMetaGlob(node));
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* The files one `import.meta.glob` call loads, as Vite's `toAbsoluteGlob` reads its globs
|
|
50
|
+
* (https://vite.dev/guide/features.html#glob-import): `/` against the project root, `./`
|
|
51
|
+
* and `../` against a literal `base` (read against the root where it starts with `/`) or the
|
|
52
|
+
* calling file's directory, `**` as written, and `!` removing what it matches. Undefined
|
|
53
|
+
* where Vite reads a glob through an alias, the root is unknown, or a glob or base is computed.
|
|
54
|
+
*/
|
|
55
|
+
function globbed(file, first, options, others, rootOf) {
|
|
56
|
+
const patterns = textsOf(writtenValue(first), true);
|
|
57
|
+
const bases = globOption(options, "base");
|
|
58
|
+
const [written, ...more] = bases ?? [];
|
|
59
|
+
const base = written === undefined ? undefined : textsOf(written, false);
|
|
60
|
+
if (patterns === undefined ||
|
|
61
|
+
bases === undefined ||
|
|
62
|
+
more.length > 0 ||
|
|
63
|
+
(written !== undefined && base === undefined)) {
|
|
64
|
+
return undefined;
|
|
65
|
+
}
|
|
66
|
+
const dir = dirnamePath(file.fileName);
|
|
67
|
+
const root = () => rootOf(file.fileName);
|
|
68
|
+
const against = (at) => {
|
|
69
|
+
if (!isAbsolutePath(at)) {
|
|
70
|
+
return resolvePath(dir, at);
|
|
71
|
+
}
|
|
72
|
+
const top = root();
|
|
73
|
+
return top === undefined ? undefined : resolvePath(top, `.${at}`);
|
|
74
|
+
};
|
|
75
|
+
const from = base?.[0] === undefined ? dir : against(base[0]);
|
|
76
|
+
const keep = [];
|
|
77
|
+
const drop = [];
|
|
78
|
+
for (const written of patterns) {
|
|
79
|
+
const negated = written.startsWith("!");
|
|
80
|
+
const pattern = negated ? written.slice(1) : written;
|
|
81
|
+
let path;
|
|
82
|
+
if (isAbsolutePath(pattern)) {
|
|
83
|
+
path = against(pattern);
|
|
84
|
+
}
|
|
85
|
+
else if (startsRelativePath(pattern)) {
|
|
86
|
+
path = from === undefined ? undefined : resolvePath(from, pattern);
|
|
87
|
+
}
|
|
88
|
+
else if (pattern.startsWith("**")) {
|
|
89
|
+
path = pattern;
|
|
90
|
+
}
|
|
91
|
+
if (path === undefined) {
|
|
92
|
+
return undefined;
|
|
93
|
+
}
|
|
94
|
+
(negated ? drop : keep).push(globExpression(path));
|
|
95
|
+
}
|
|
96
|
+
return others.filter((candidate) => keep.some((glob) => glob.test(candidate.file.fileName)) &&
|
|
97
|
+
!drop.some((glob) => glob.test(candidate.file.fileName)));
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* The computed loads among one file's load calls, each loading the `candidates` but the
|
|
101
|
+
* file itself: an `import()` or `require()` whose path starts with a relative literal naming
|
|
102
|
+
* a directory below the file's loads every candidate below it, as a bundler's context module
|
|
103
|
+
* reads it, and an `import.meta.glob` every candidate its globs match ({@link globbed}). A
|
|
104
|
+
* call of a computed path that names no such directory and no package is an unresolved load,
|
|
105
|
+
* and so is an AMD call one of whose dependencies names no path ({@link amdUnresolved}).
|
|
106
|
+
*/
|
|
107
|
+
export function computedLoadsOf(file, calls, candidates, rootOf) {
|
|
108
|
+
const dir = dirnamePath(file.fileName);
|
|
109
|
+
const others = candidates.filter((candidate) => candidate.file !== file);
|
|
110
|
+
return calls.flatMap(({ call, from }) => {
|
|
111
|
+
const [first, options] = call.arguments;
|
|
112
|
+
if (first === undefined) {
|
|
113
|
+
return [];
|
|
114
|
+
}
|
|
115
|
+
if (isMetaGlob(call)) {
|
|
116
|
+
const files = globbed(file, first, options, others, rootOf);
|
|
117
|
+
const asset = readsAsAsset(options);
|
|
118
|
+
return [
|
|
119
|
+
{
|
|
120
|
+
call,
|
|
121
|
+
from,
|
|
122
|
+
require: undefined,
|
|
123
|
+
amd: false,
|
|
124
|
+
files: files ?? [],
|
|
125
|
+
resolved: files !== undefined,
|
|
126
|
+
asset,
|
|
127
|
+
eager: isEager(options),
|
|
128
|
+
},
|
|
129
|
+
];
|
|
130
|
+
}
|
|
131
|
+
const amd = amdLoadOf(call);
|
|
132
|
+
if (amd !== undefined) {
|
|
133
|
+
return amdUnresolved(amd)
|
|
134
|
+
? [
|
|
135
|
+
{
|
|
136
|
+
call,
|
|
137
|
+
from,
|
|
138
|
+
require: amd.callee,
|
|
139
|
+
amd: true,
|
|
140
|
+
files: [],
|
|
141
|
+
resolved: false,
|
|
142
|
+
asset: false,
|
|
143
|
+
eager: false,
|
|
144
|
+
},
|
|
145
|
+
]
|
|
146
|
+
: [];
|
|
147
|
+
}
|
|
148
|
+
const argument = unwrapped(first);
|
|
149
|
+
const require = call.expression.kind === SyntaxKind.ImportKeyword ? undefined : writtenName(call.expression);
|
|
150
|
+
if (!mayNamePath(argument)) {
|
|
151
|
+
return [];
|
|
152
|
+
}
|
|
153
|
+
const prefix = leadingLiteral(argument);
|
|
154
|
+
if (namesPackage(prefix)) {
|
|
155
|
+
return [];
|
|
156
|
+
}
|
|
157
|
+
const target = prefix === undefined ? undefined : computedLoadDirectory(dir, prefix);
|
|
158
|
+
const files = target === undefined
|
|
159
|
+
? []
|
|
160
|
+
: others.filter((candidate) => relativePath(target, candidate.file.fileName) !== undefined);
|
|
161
|
+
return [
|
|
162
|
+
{
|
|
163
|
+
call,
|
|
164
|
+
from,
|
|
165
|
+
require,
|
|
166
|
+
amd: false,
|
|
167
|
+
files,
|
|
168
|
+
resolved: target !== undefined,
|
|
169
|
+
asset: false,
|
|
170
|
+
eager: false,
|
|
171
|
+
},
|
|
172
|
+
];
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Whether a computed argument may be a module path: anything but a string, which names its
|
|
177
|
+
* module, and a value no path is, a number, a boolean, `null`, an object, an array, a
|
|
178
|
+
* function or a class.
|
|
179
|
+
*/
|
|
180
|
+
function mayNamePath(argument) {
|
|
181
|
+
return !NO_PATH.has(argument.kind);
|
|
182
|
+
}
|
|
183
|
+
const NO_PATH = new Set([
|
|
184
|
+
SyntaxKind.StringLiteral,
|
|
185
|
+
SyntaxKind.NoSubstitutionTemplateLiteral,
|
|
186
|
+
SyntaxKind.NumericLiteral,
|
|
187
|
+
SyntaxKind.BigIntLiteral,
|
|
188
|
+
SyntaxKind.TrueKeyword,
|
|
189
|
+
SyntaxKind.FalseKeyword,
|
|
190
|
+
SyntaxKind.NullKeyword,
|
|
191
|
+
SyntaxKind.ObjectLiteralExpression,
|
|
192
|
+
SyntaxKind.ArrayLiteralExpression,
|
|
193
|
+
SyntaxKind.ArrowFunction,
|
|
194
|
+
SyntaxKind.FunctionExpression,
|
|
195
|
+
SyntaxKind.ClassExpression,
|
|
196
|
+
SyntaxKind.RegularExpressionLiteral,
|
|
197
|
+
]);
|
|
198
|
+
/** Whether one call is `import.meta.glob(...)`. */
|
|
199
|
+
function isMetaGlob(node) {
|
|
200
|
+
if (!isPropertyAccessExpression(node.expression)) {
|
|
201
|
+
return false;
|
|
202
|
+
}
|
|
203
|
+
const { expression, name } = node.expression;
|
|
204
|
+
return (isIdentifier(name) &&
|
|
205
|
+
name.text === "glob" &&
|
|
206
|
+
isMetaProperty(expression) &&
|
|
207
|
+
expression.keywordToken === SyntaxKind.ImportKeyword);
|
|
208
|
+
}
|
|
209
|
+
/** The values the options of an `import.meta.glob` write for one key, undefined where a spread may hide one. */
|
|
210
|
+
function globOption(options, key) {
|
|
211
|
+
return options === undefined ? [] : membersNamed(writtenValue(options), key);
|
|
212
|
+
}
|
|
213
|
+
/** Whether the options of an `import.meta.glob` set `eager` to `true`. */
|
|
214
|
+
function isEager(options) {
|
|
215
|
+
return (globOption(options, "eager")?.some((value) => value.kind === "boolean" && value.value) === true);
|
|
216
|
+
}
|
|
217
|
+
/** The query parameters that make Vite load a file as its text or its URL, each written bare. */
|
|
218
|
+
const ASSET_QUERY = /(?:^\?|&)(?:raw|url|inline)(?:&|$)/u;
|
|
219
|
+
/**
|
|
220
|
+
* Whether the options of an `import.meta.glob` read each file as text or as a URL: a
|
|
221
|
+
* `query` string holding a bare `raw`, `url` or `inline`, or an `as` of `raw` or `url`,
|
|
222
|
+
* which Vite reads as that query (https://vite.dev/guide/features.html#glob-import). Any
|
|
223
|
+
* other query is read as loading the module, which keeps more than it may.
|
|
224
|
+
*/
|
|
225
|
+
function readsAsAsset(options) {
|
|
226
|
+
const texts = (key) => (globOption(options, key) ?? []).flatMap((value) => value.kind === "text" ? [value.text] : []);
|
|
227
|
+
return (texts("as").some((text) => text === "raw" || text === "url") ||
|
|
228
|
+
texts("query").some((text) => ASSET_QUERY.test(text.startsWith("?") ? text : `?${text}`)));
|
|
229
|
+
}
|
|
230
|
+
/** Whether a computed path's leading literal names a package, whose files are none of the target's. */
|
|
231
|
+
function namesPackage(prefix) {
|
|
232
|
+
return (prefix !== undefined &&
|
|
233
|
+
prefix !== "" &&
|
|
234
|
+
!cannotStartPackageName(prefix) &&
|
|
235
|
+
!hasURLScheme(prefix));
|
|
236
|
+
}
|
package/dist/src/run.js
CHANGED
|
@@ -1,8 +1,12 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { CONFIG_MAX_BYTES, SETTINGS } from "./contract/config.generated.js";
|
|
2
|
+
import { EXIT_FAILURE, EXIT_USAGE } from "./contract/contract.generated.js";
|
|
3
|
+
import { REPOSITORY_DOCUMENT } from "./config.js";
|
|
4
|
+
import { readTargetDocument } from "./fs/document.js";
|
|
3
5
|
import { joinPath, resolvePath } from "./paths.js";
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
+
import { renderDiagnostic } from "./load/diagnostics.js";
|
|
7
|
+
import { FailureExit, failureLines, productFault } from "./failure.js";
|
|
8
|
+
import { readScope, scopeForDir } from "./scope.js";
|
|
9
|
+
import { UsageError } from "./usage.js";
|
|
6
10
|
import { openEngine } from "./session.js";
|
|
7
11
|
import { printConfigVerb } from "./verbs/print-config.js";
|
|
8
12
|
import { printProjectsVerb } from "./verbs/print-projects.js";
|
|
@@ -11,8 +15,9 @@ import { printRootsVerb } from "./verbs/print-roots.js";
|
|
|
11
15
|
import { ANALYZE_OPTIONS, analyzeVerb } from "./verbs/analyze.js";
|
|
12
16
|
import { describeVerb } from "./verbs/describe.js";
|
|
13
17
|
import { EXPLAIN_OPTIONS, explainVerb } from "./verbs/explain.js";
|
|
14
|
-
import {
|
|
18
|
+
import {} from "./verbs/verb.js";
|
|
15
19
|
import { versionVerb } from "./verbs/version.js";
|
|
20
|
+
import { diagnose, message, PRODUCT } from "./product.js";
|
|
16
21
|
/** Every verb this command answers, in the order the usage text lists them. */
|
|
17
22
|
const VERBS = [
|
|
18
23
|
{ name: "analyze", run: analyzeVerb, options: ANALYZE_OPTIONS },
|
|
@@ -24,7 +29,7 @@ const VERBS = [
|
|
|
24
29
|
{ name: "describe", run: describeVerb },
|
|
25
30
|
{ name: "version", run: versionVerb },
|
|
26
31
|
];
|
|
27
|
-
const USAGE = `usage:
|
|
32
|
+
const USAGE = `usage: ${PRODUCT} <verb> [options]\nverbs: ${VERBS.map((verb) => verb.name).join(", ")}\n`;
|
|
28
33
|
/**
|
|
29
34
|
* The tokens whose presence in an option's name makes that option a request to
|
|
30
35
|
* edit a source file. The set is closed, and a token is matched in any position of
|
|
@@ -32,29 +37,12 @@ const USAGE = `usage: deadset-ts <verb> [options]\nverbs: ${VERBS.map((verb) =>
|
|
|
32
37
|
*/
|
|
33
38
|
const SOURCE_EDIT_TOKENS = ["fix", "edit", "delete", "rewrite"];
|
|
34
39
|
/**
|
|
35
|
-
* Maps an option name to the setting of the Contract's configuration schema it supplies
|
|
36
|
-
*
|
|
37
|
-
* the spelling the setting's provenance names. The name is this command's vocabulary and
|
|
38
|
-
* is never derived from the path: a setting reaches the command line only by an entry,
|
|
39
|
-
* and a path names a key the schema declares.
|
|
40
|
+
* Maps an option name to the setting of the Contract's configuration schema it supplies:
|
|
41
|
+
* the options contract/settings.json names for a setting this analyzer reads.
|
|
40
42
|
*/
|
|
41
|
-
export const SETTING_OPTIONS = new Map([
|
|
42
|
-
["min-confidence", "analysis.min_confidence"],
|
|
43
|
-
["sort", "reporters.sort"],
|
|
44
|
-
["cascade", "reporters.cascade"],
|
|
45
|
-
["max-findings", "reporters.max_findings"],
|
|
46
|
-
["fail-on", "reporters.fail_on"],
|
|
47
|
-
]);
|
|
43
|
+
export const SETTING_OPTIONS = new Map(SETTINGS.flatMap((row) => (row.option === undefined ? [] : [[row.option, row.key]])));
|
|
48
44
|
/** The options that take a value and are not settings. */
|
|
49
45
|
const PLAIN_OPTIONS = new Set(["target", "config", "central", "scope"]);
|
|
50
|
-
/**
|
|
51
|
-
* The setting options whose value is an integer rather than a string. A value
|
|
52
|
-
* written other than as digits is passed on as the string it is, so resolution
|
|
53
|
-
* refuses it by its type rather than reading `1e2` as 100.
|
|
54
|
-
*/
|
|
55
|
-
const INTEGER_OPTIONS = new Set(["max-findings"]);
|
|
56
|
-
/** An integer as an option writes it: an optional minus sign and digits alone. */
|
|
57
|
-
const INTEGER_TEXT = /^-?[0-9]+$/u;
|
|
58
46
|
/** No option beyond the ones every verb takes. */
|
|
59
47
|
const NO_OPTIONS = { plain: [], repeatable: [] };
|
|
60
48
|
/**
|
|
@@ -81,7 +69,7 @@ function readOptions(args, own) {
|
|
|
81
69
|
const repeated = new Map();
|
|
82
70
|
for (const arg of args) {
|
|
83
71
|
if (!arg.startsWith("-")) {
|
|
84
|
-
throw new
|
|
72
|
+
throw new UsageError(`unexpected argument ${JSON.stringify(arg)}`);
|
|
85
73
|
}
|
|
86
74
|
const [spelled, ...rest] = arg.split("=");
|
|
87
75
|
const name = (spelled ?? "").replace(/^-+/u, "");
|
|
@@ -89,10 +77,10 @@ function readOptions(args, own) {
|
|
|
89
77
|
!SETTING_OPTIONS.has(name) &&
|
|
90
78
|
!own.plain.includes(name) &&
|
|
91
79
|
!own.repeatable.includes(name)) {
|
|
92
|
-
throw new
|
|
80
|
+
throw new UsageError(`unknown option ${JSON.stringify(spelled ?? arg)}`);
|
|
93
81
|
}
|
|
94
82
|
if (rest.length === 0) {
|
|
95
|
-
throw new
|
|
83
|
+
throw new UsageError(`option ${JSON.stringify(spelled ?? arg)} takes a value`);
|
|
96
84
|
}
|
|
97
85
|
const value = rest.join("=");
|
|
98
86
|
named.set(name, value);
|
|
@@ -100,45 +88,49 @@ function readOptions(args, own) {
|
|
|
100
88
|
}
|
|
101
89
|
return { named, repeated };
|
|
102
90
|
}
|
|
103
|
-
|
|
91
|
+
/** The document an option names. */
|
|
92
|
+
function documentAt(host, label) {
|
|
104
93
|
try {
|
|
105
|
-
|
|
94
|
+
const path = resolvePath(host.workingDirectory(), label);
|
|
95
|
+
// A file past the bound reads as one byte more than it, which resolution refuses.
|
|
96
|
+
return { text: host.readFile(path, CONFIG_MAX_BYTES + 1), label };
|
|
106
97
|
}
|
|
107
98
|
catch (error) {
|
|
108
|
-
|
|
109
|
-
return undefined;
|
|
110
|
-
}
|
|
111
|
-
throw new ConfigError("malformed", "", `${path}: ${error instanceof Error ? error.message : String(error)}`);
|
|
99
|
+
throw new UsageError(`${label}: ${message(error)}`);
|
|
112
100
|
}
|
|
113
101
|
}
|
|
114
102
|
/**
|
|
115
|
-
* The configuration
|
|
116
|
-
*
|
|
117
|
-
|
|
103
|
+
* The repository configuration at the target root, none where it is absent. One that
|
|
104
|
+
* cannot be read is a configuration document that cannot be, refused with the usage code.
|
|
105
|
+
*/
|
|
106
|
+
function repositoryAt(host, target) {
|
|
107
|
+
const label = joinPath(target, REPOSITORY_DOCUMENT);
|
|
108
|
+
const root = resolvePath(host.workingDirectory(), target);
|
|
109
|
+
const text = readTargetDocument(host, root, REPOSITORY_DOCUMENT, label, (named, reason) => new UsageError(`${named}: ${reason}`));
|
|
110
|
+
return text === undefined ? undefined : { text, label };
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* The configuration sources one invocation carries: the repository configuration at
|
|
114
|
+
* the target root or the path an option named, the central configuration, and the
|
|
115
|
+
* text each setting option was given.
|
|
118
116
|
*/
|
|
119
117
|
function inputsOf(host, options) {
|
|
120
|
-
const target = options.named.get("target") ?? ".";
|
|
121
118
|
const named = options.named.get("config");
|
|
122
|
-
const
|
|
123
|
-
const repository =
|
|
119
|
+
const target = options.named.get("target") ?? ".";
|
|
120
|
+
const repository = named === undefined ? repositoryAt(host, target) : documentAt(host, named);
|
|
124
121
|
const centralLabel = options.named.get("central");
|
|
125
|
-
const central = centralLabel === undefined ? undefined :
|
|
126
|
-
const
|
|
127
|
-
const
|
|
128
|
-
for (const [name, path] of SETTING_OPTIONS) {
|
|
122
|
+
const central = centralLabel === undefined ? undefined : documentAt(host, centralLabel);
|
|
123
|
+
const flags = new Map();
|
|
124
|
+
for (const [name, key] of SETTING_OPTIONS) {
|
|
129
125
|
const value = options.named.get(name);
|
|
130
|
-
if (value
|
|
131
|
-
|
|
126
|
+
if (value !== undefined) {
|
|
127
|
+
flags.set(key, value);
|
|
132
128
|
}
|
|
133
|
-
flat[path] = INTEGER_OPTIONS.has(name) && INTEGER_TEXT.test(value) ? Number(value) : value;
|
|
134
|
-
flagLabels.set(path, `--${name}`);
|
|
135
129
|
}
|
|
136
|
-
const flags = Object.keys(flat).length === 0 ? undefined : JSON.stringify(flat);
|
|
137
130
|
return {
|
|
138
|
-
|
|
139
|
-
...(repository === undefined ? {} : { repository
|
|
140
|
-
...(central === undefined
|
|
141
|
-
flagLabels,
|
|
131
|
+
flags,
|
|
132
|
+
...(repository === undefined ? {} : { repository }),
|
|
133
|
+
...(central === undefined ? {} : { central }),
|
|
142
134
|
};
|
|
143
135
|
}
|
|
144
136
|
/** The scope one invocation analyzes: the document an option named, or the target. */
|
|
@@ -154,14 +146,12 @@ function scopeOf(host, options) {
|
|
|
154
146
|
* the exit code: 0 for a completed verb, 1 for a finding that fails the run, 2 for a
|
|
155
147
|
* usage error, a requested source edit or a refused configuration, 3 for a failure that
|
|
156
148
|
* produced no answer. It writes nothing outside `out` and `err` and never exits the
|
|
157
|
-
* process.
|
|
158
|
-
* `openClient` opens the compiler client; a caller that watches what a run reads
|
|
159
|
-
* supplies its own of either.
|
|
149
|
+
* process. A caller that watches what a run reads supplies its own `host` or `openClient`.
|
|
160
150
|
*/
|
|
161
151
|
export function run(args, out, err, host, openClient = openEngine) {
|
|
162
152
|
const editing = sourceEditOption(args);
|
|
163
153
|
if (editing !== undefined) {
|
|
164
|
-
err
|
|
154
|
+
diagnose(err, `${editing} is not supported: ${PRODUCT} reports and never edits a source file`);
|
|
165
155
|
err.write(USAGE);
|
|
166
156
|
return EXIT_USAGE;
|
|
167
157
|
}
|
|
@@ -171,7 +161,7 @@ export function run(args, out, err, host, openClient = openEngine) {
|
|
|
171
161
|
return invoke(verb.run, verb.options ?? NO_OPTIONS, args.slice(1), { out, err, host }, openClient);
|
|
172
162
|
}
|
|
173
163
|
if (name !== undefined) {
|
|
174
|
-
err
|
|
164
|
+
diagnose(err, `unknown verb ${JSON.stringify(name)}`);
|
|
175
165
|
}
|
|
176
166
|
err.write(USAGE);
|
|
177
167
|
return EXIT_USAGE;
|
|
@@ -196,7 +186,7 @@ function invoke(verb, own, args, streams, openClient) {
|
|
|
196
186
|
openClient: (config) => {
|
|
197
187
|
opened = openClient({
|
|
198
188
|
collectTiming: false,
|
|
199
|
-
components: { extensions: config.ts.
|
|
189
|
+
components: { extensions: config.ts.component_extensions, host: streams.host },
|
|
200
190
|
});
|
|
201
191
|
return opened;
|
|
202
192
|
},
|
|
@@ -207,29 +197,28 @@ function invoke(verb, own, args, streams, openClient) {
|
|
|
207
197
|
return refuse(error, streams.err);
|
|
208
198
|
}
|
|
209
199
|
}
|
|
210
|
-
/**
|
|
200
|
+
/**
|
|
201
|
+
* Turns one refusal into the exit code the Contract's table gives it. An error no class names
|
|
202
|
+
* is a fault of this analyzer, printed with its stack for the maintainers it asks the user to
|
|
203
|
+
* report it to.
|
|
204
|
+
*/
|
|
211
205
|
function refuse(error, err) {
|
|
212
|
-
if (error instanceof
|
|
213
|
-
err
|
|
206
|
+
if (error instanceof UsageError) {
|
|
207
|
+
diagnose(err, error.message);
|
|
214
208
|
err.write(USAGE);
|
|
215
209
|
return EXIT_USAGE;
|
|
216
210
|
}
|
|
217
|
-
if (error instanceof
|
|
218
|
-
|
|
219
|
-
err.write(`${
|
|
211
|
+
if (!(error instanceof FailureExit)) {
|
|
212
|
+
if (error instanceof Error && error.stack !== undefined) {
|
|
213
|
+
err.write(`${error.stack}\n`);
|
|
220
214
|
}
|
|
221
|
-
|
|
222
|
-
return EXIT_FAILURE;
|
|
215
|
+
return refuse(productFault(`meets an error none of its classes names: ${message(error)}`), err);
|
|
223
216
|
}
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
err.write(`${setupLine(failure)}\n`);
|
|
227
|
-
}
|
|
228
|
-
return EXIT_FAILURE;
|
|
217
|
+
for (const diagnostic of error.diagnostics) {
|
|
218
|
+
err.write(`${renderDiagnostic(diagnostic)}\n`);
|
|
229
219
|
}
|
|
230
|
-
|
|
231
|
-
err.write(
|
|
232
|
-
return EXIT_FAILURE;
|
|
220
|
+
for (const line of failureLines(error.failures)) {
|
|
221
|
+
err.write(`${line}\n`);
|
|
233
222
|
}
|
|
234
|
-
|
|
223
|
+
return EXIT_FAILURE;
|
|
235
224
|
}
|