@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
package/src/verbs/describe.ts
CHANGED
|
@@ -1,20 +1,29 @@
|
|
|
1
|
+
import {
|
|
2
|
+
CONTRACT_VERSION,
|
|
3
|
+
EXIT_CLEAN,
|
|
4
|
+
EXIT_USAGE,
|
|
5
|
+
FACTS_VERSION,
|
|
6
|
+
SCHEMA_VERSIONS,
|
|
7
|
+
} from "../contract/contract.generated.ts";
|
|
1
8
|
import { CONFORMANCE, type Conformance } from "../conformance.ts";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
9
|
+
import { type Verb } from "./verb.ts";
|
|
10
|
+
import { diagnose, LANGUAGE, PRODUCT } from "../product.ts";
|
|
11
|
+
import { ownVersion } from "./version.ts";
|
|
5
12
|
|
|
6
13
|
/**
|
|
7
14
|
* The document `describe` writes: the analyzer, the Contract version it implements, the
|
|
8
|
-
* report schema versions it reads, the languages it claims,
|
|
9
|
-
* the conformance corpus, a member the document omits where
|
|
15
|
+
* report schema versions it reads, the languages it claims, the facts version it writes,
|
|
16
|
+
* and its recorded result over the conformance corpus, a member the document omits where
|
|
17
|
+
* no run is recorded.
|
|
10
18
|
*/
|
|
11
19
|
export function describeDocument(version: string, recorded: Conformance | undefined): string {
|
|
12
20
|
const document = {
|
|
13
|
-
name:
|
|
21
|
+
name: PRODUCT,
|
|
14
22
|
version,
|
|
15
23
|
contract_version: CONTRACT_VERSION,
|
|
16
|
-
schema_versions_accepted:
|
|
24
|
+
schema_versions_accepted: SCHEMA_VERSIONS,
|
|
17
25
|
languages: [LANGUAGE],
|
|
26
|
+
facts_version_written: FACTS_VERSION,
|
|
18
27
|
...(recorded === undefined
|
|
19
28
|
? {}
|
|
20
29
|
: {
|
|
@@ -28,19 +37,12 @@ export function describeDocument(version: string, recorded: Conformance | undefi
|
|
|
28
37
|
return `${JSON.stringify(document, null, 2)}\n`;
|
|
29
38
|
}
|
|
30
39
|
|
|
31
|
-
/** Writes this analyzer's description to the output stream
|
|
40
|
+
/** Writes this analyzer's description to the output stream. */
|
|
32
41
|
export const describeVerb: Verb = ({ out, err, host, args }) => {
|
|
33
42
|
if (args.length > 0) {
|
|
34
|
-
err
|
|
43
|
+
diagnose(err, `describe takes no argument, got ${JSON.stringify(args[0])}`);
|
|
35
44
|
return EXIT_USAGE;
|
|
36
45
|
}
|
|
37
|
-
|
|
38
|
-
try {
|
|
39
|
-
version = host.analyzerVersion();
|
|
40
|
-
} catch (error: unknown) {
|
|
41
|
-
err.write(`deadset-ts: describe: ${error instanceof Error ? error.message : String(error)}\n`);
|
|
42
|
-
return EXIT_FAILURE;
|
|
43
|
-
}
|
|
44
|
-
out.write(describeDocument(version, CONFORMANCE));
|
|
46
|
+
out.write(describeDocument(ownVersion(host), CONFORMANCE));
|
|
45
47
|
return EXIT_CLEAN;
|
|
46
48
|
};
|
package/src/verbs/explain.ts
CHANGED
|
@@ -1,18 +1,21 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { EXIT_CLEAN, EXIT_USAGE } from "../contract/contract.generated.ts";
|
|
2
|
+
import { productionMode, runAnalysis, type RunAnalysis } from "../analysis.ts";
|
|
3
|
+
import { listing } from "../liveness/components.ts";
|
|
3
4
|
import type { Cascade } from "../config.ts";
|
|
4
|
-
import { ConfigError } from "../config.ts";
|
|
5
5
|
import type { CompletedFinding } from "../finding.ts";
|
|
6
|
-
import {
|
|
6
|
+
import { swept as judged, type Edge, type Graph } from "../liveness/graph.ts";
|
|
7
|
+
import type { Origin } from "../liveness/sweep.ts";
|
|
7
8
|
import type { InventorySymbol } from "../inventory.ts";
|
|
8
|
-
import { referenceKey, type Configured } from "../matrix.ts";
|
|
9
9
|
import { partialNotes } from "../partial.ts";
|
|
10
10
|
import { resolvePath } from "../paths.ts";
|
|
11
11
|
import { positionKey } from "../position.ts";
|
|
12
12
|
import type { Reference } from "../references.ts";
|
|
13
|
+
import { madeByTestCode } from "../tests/file-class.ts";
|
|
13
14
|
import { resolve } from "../resolve.ts";
|
|
14
|
-
import type
|
|
15
|
-
import {
|
|
15
|
+
import { type Verb, type VerbOptions } from "./verb.ts";
|
|
16
|
+
import { UsageError } from "../usage.ts";
|
|
17
|
+
import { bytewise } from "../text/compare.ts";
|
|
18
|
+
import { diagnose } from "../product.ts";
|
|
16
19
|
|
|
17
20
|
/**
|
|
18
21
|
* The three spellings of an explanation request, each naming the symbol to explain. They are
|
|
@@ -44,16 +47,12 @@ function namedSymbol(option: (name: string) => string | undefined): string {
|
|
|
44
47
|
});
|
|
45
48
|
const [only, ...more] = named;
|
|
46
49
|
if (only === undefined) {
|
|
47
|
-
throw new
|
|
48
|
-
"malformed",
|
|
49
|
-
"",
|
|
50
|
+
throw new UsageError(
|
|
50
51
|
"explain explains the symbol --why, --why-live or --why-not names, and none was named",
|
|
51
52
|
);
|
|
52
53
|
}
|
|
53
54
|
if (more.length > 0) {
|
|
54
|
-
throw new
|
|
55
|
-
"malformed",
|
|
56
|
-
"",
|
|
55
|
+
throw new UsageError(
|
|
57
56
|
`explain explains one symbol, and ${named.map((one) => `--${one.name}`).join(", ")} each name one`,
|
|
58
57
|
);
|
|
59
58
|
}
|
|
@@ -101,141 +100,32 @@ function subjectOf(
|
|
|
101
100
|
symbol.ref.toLowerCase().includes(folded) || symbol.name.toLowerCase().includes(folded),
|
|
102
101
|
)
|
|
103
102
|
.map(described)
|
|
104
|
-
.sort(
|
|
103
|
+
.sort(bytewise);
|
|
105
104
|
return { candidates: partial.slice(0, MAX_PARTIAL_MATCHES) };
|
|
106
105
|
}
|
|
107
106
|
|
|
108
|
-
/**
|
|
109
|
-
function
|
|
110
|
-
const
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
}
|
|
119
|
-
return held;
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
/** Every root of the run once per reason, in the order the projects name them. */
|
|
123
|
-
function rootsOf(configured: readonly Configured[]): readonly Root[] {
|
|
124
|
-
const seen = new Set<string>();
|
|
125
|
-
return configured
|
|
126
|
-
.flatMap((one) => one.roots)
|
|
127
|
-
.filter((root) => {
|
|
128
|
-
const key = [root.id, root.kind, root.source].join("\u0000");
|
|
129
|
-
if (seen.has(key)) {
|
|
130
|
-
return false;
|
|
131
|
-
}
|
|
132
|
-
seen.add(key);
|
|
133
|
-
return true;
|
|
134
|
-
});
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
/**
|
|
138
|
-
* One step of a path: a reference, or a reference that reads a module and so reaches a
|
|
139
|
-
* declaration the module exports.
|
|
140
|
-
*/
|
|
141
|
-
type Hop =
|
|
142
|
-
| { readonly k: "reference"; readonly reference: Reference }
|
|
143
|
-
| { readonly k: "export"; readonly reference: Reference; readonly to: string };
|
|
144
|
-
|
|
145
|
-
/** Where a path starts: a root of the run, or a reference a loaded consumer makes. */
|
|
146
|
-
type Origin =
|
|
147
|
-
| { readonly k: "root"; readonly root: Root }
|
|
148
|
-
| { readonly k: "consumer"; readonly consumer: string };
|
|
149
|
-
|
|
150
|
-
/**
|
|
151
|
-
* The shortest path from a root or a loaded consumer to one declaration, walked breadth first
|
|
152
|
-
* from every root at once in the order the run names them, a consumer's reference being the
|
|
153
|
-
* first hop of a path of its own, and following the references the sweep follows: a
|
|
154
|
-
* reference that reads a module reaches what the module exports, and an evaluation or a root
|
|
155
|
-
* reaches the module alone. Under `production` no reference a test file made is followed,
|
|
156
|
-
* which is the set the report's sweep counts.
|
|
157
|
-
*/
|
|
158
|
-
function shortestPath(
|
|
159
|
-
analysis: RunAnalysis,
|
|
160
|
-
to: string,
|
|
161
|
-
production: boolean,
|
|
162
|
-
): { readonly origin: Origin; readonly path: readonly Hop[] } | undefined {
|
|
163
|
-
const graph = analysis.swept.matrix.union;
|
|
164
|
-
const out = new Map<string, Reference[]>();
|
|
165
|
-
const consumed: (Reference & { readonly consumer: string })[] = [];
|
|
166
|
-
for (const reference of referencesOf(analysis.configured)) {
|
|
167
|
-
if (production && reference.test) {
|
|
168
|
-
continue;
|
|
169
|
-
}
|
|
170
|
-
const { consumer } = reference;
|
|
171
|
-
if (consumer !== undefined) {
|
|
172
|
-
consumed.push({ ...reference, consumer });
|
|
173
|
-
continue;
|
|
174
|
-
}
|
|
175
|
-
const held = out.get(reference.from);
|
|
176
|
-
if (held === undefined) {
|
|
177
|
-
out.set(reference.from, [reference]);
|
|
178
|
-
} else {
|
|
179
|
-
held.push(reference);
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
interface Step {
|
|
183
|
-
readonly at: string;
|
|
184
|
-
readonly hop: Hop | undefined;
|
|
185
|
-
readonly previous: number;
|
|
186
|
-
readonly origin: Origin;
|
|
187
|
-
}
|
|
188
|
-
const steps: Step[] = [];
|
|
189
|
-
const seen = new Set<string>();
|
|
190
|
-
const expanded = new Set<string>();
|
|
191
|
-
const enter = (step: Step): void => {
|
|
192
|
-
if (!seen.has(step.at)) {
|
|
193
|
-
seen.add(step.at);
|
|
194
|
-
steps.push(step);
|
|
195
|
-
}
|
|
196
|
-
};
|
|
197
|
-
const follow = (reference: Reference, previous: number, origin: Origin): void => {
|
|
198
|
-
enter({ at: reference.to, hop: { k: "reference", reference }, previous, origin });
|
|
199
|
-
const target = graph.at(reference.to);
|
|
200
|
-
if (reference.use === "evaluation" || target === OUTSIDE || expanded.has(reference.to)) {
|
|
201
|
-
return;
|
|
202
|
-
}
|
|
203
|
-
expanded.add(reference.to);
|
|
204
|
-
for (const exported of graph.exportsOf[target] ?? []) {
|
|
205
|
-
const id = graph.symbols[exported]?.id;
|
|
206
|
-
if (id !== undefined) {
|
|
207
|
-
enter({ at: id, hop: { k: "export", reference, to: id }, previous, origin });
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
};
|
|
211
|
-
for (const root of rootsOf(analysis.configured)) {
|
|
212
|
-
enter({ at: root.id, hop: undefined, previous: -1, origin: { k: "root", root } });
|
|
213
|
-
}
|
|
214
|
-
// A consumer's reference is one hop long, so it joins the walk where the roots' first
|
|
215
|
-
// hops do.
|
|
216
|
-
const firstHops = steps.length;
|
|
217
|
-
for (let head = 0; ; head += 1) {
|
|
218
|
-
if (head === firstHops) {
|
|
219
|
-
for (const reference of consumed) {
|
|
220
|
-
follow(reference, -1, { k: "consumer", consumer: reference.consumer });
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
const step = steps[head];
|
|
224
|
-
if (step === undefined) {
|
|
225
|
-
break;
|
|
226
|
-
}
|
|
227
|
-
if (step.at === to) {
|
|
228
|
-
const path: Hop[] = [];
|
|
229
|
-
for (let at: Step | undefined = step; at?.hop !== undefined; at = steps[at.previous]) {
|
|
230
|
-
path.unshift(at.hop);
|
|
107
|
+
/** Where a path starts, as a line names it. */
|
|
108
|
+
function originText(origin: Origin, graph: Graph): string {
|
|
109
|
+
const id = (at: number): string => graph.symbols[at]?.id ?? "";
|
|
110
|
+
switch (origin.k) {
|
|
111
|
+
case "root":
|
|
112
|
+
return `root ${origin.rooted.kind} ${id(origin.rooted.at)}`;
|
|
113
|
+
case "consumed": {
|
|
114
|
+
const reference = graph.references[origin.edge.reference];
|
|
115
|
+
if (reference?.consumer !== undefined) {
|
|
116
|
+
return `consumer ${reference.consumer}`;
|
|
231
117
|
}
|
|
232
|
-
return
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
follow(reference, head, step.origin);
|
|
118
|
+
return reference?.unheld === true
|
|
119
|
+
? `test file no project holds ${reference.from.replace(/#$/u, "")}`
|
|
120
|
+
: `declaration no configuration judges ${reference?.from ?? ""}`;
|
|
236
121
|
}
|
|
122
|
+
case "exemption":
|
|
123
|
+
return `exemption ${origin.record.class} ${positionKey(origin.record.site)}`;
|
|
124
|
+
case "mark":
|
|
125
|
+
return `suppression of ${id(origin.at)}`;
|
|
126
|
+
case "unanswered":
|
|
127
|
+
return `unanswered question about ${id(origin.at)}`;
|
|
237
128
|
}
|
|
238
|
-
return undefined;
|
|
239
129
|
}
|
|
240
130
|
|
|
241
131
|
/** What made a reference: a declaration of the target, or a loaded consumer. */
|
|
@@ -243,39 +133,74 @@ function madeBy(reference: Reference): string {
|
|
|
243
133
|
return reference.consumer === undefined ? reference.from : `consumer ${reference.consumer}`;
|
|
244
134
|
}
|
|
245
135
|
|
|
246
|
-
|
|
247
|
-
|
|
136
|
+
/**
|
|
137
|
+
* One reference of an answer, marked where test code made it, a test-support file's included,
|
|
138
|
+
* and naming the configurations that make it where they are not every one of the run.
|
|
139
|
+
*/
|
|
140
|
+
function referenceLine(
|
|
141
|
+
reference: Reference,
|
|
142
|
+
tail: string,
|
|
143
|
+
support: ReadonlySet<string>,
|
|
144
|
+
configurations: { readonly making: readonly string[]; readonly run: readonly string[] },
|
|
145
|
+
): string {
|
|
146
|
+
const partial = configurations.making.length < configurations.run.length;
|
|
147
|
+
return ` reference: ${positionKey(reference.position)}\t${reference.use}\t${tail}${madeByTestCode(reference, support) ? "\tfrom a test file" : ""}${partial ? `\tmade in ${configurations.making.join(" ")}` : ""}\n`;
|
|
248
148
|
}
|
|
249
149
|
|
|
250
150
|
/** Why a declaration no finding names and no exemption held back is live, or how it fell. */
|
|
251
151
|
function liveness(analysis: RunAnalysis, subject: InventorySymbol, cascade: Cascade): string {
|
|
252
|
-
const { sweep } = analysis.swept;
|
|
152
|
+
const { matrix, sweep } = analysis.swept;
|
|
153
|
+
const graph = matrix.union;
|
|
253
154
|
const candidate = sweep.candidates.find((one) => one.id === subject.id);
|
|
254
155
|
if (candidate === undefined && !judged(subject.kind)) {
|
|
255
156
|
return `answer: unjudged\n unjudged: neither liveness relation judges a ${subject.kind}\n`;
|
|
256
157
|
}
|
|
257
158
|
let text = `answer: ${candidate === undefined ? "live" : "dead"}\n`;
|
|
258
159
|
text += ` live under: ${listed(sweep.liveUnder.get(subject.id) ?? [])}\n`;
|
|
259
|
-
|
|
260
|
-
|
|
160
|
+
const at = graph.at(subject.id);
|
|
161
|
+
const seen = new Set<string>();
|
|
162
|
+
for (const root of graph.rooted.filter((one) => one.at === at)) {
|
|
163
|
+
const key = `${root.kind}\u0000${root.source}`;
|
|
164
|
+
if (!seen.has(key)) {
|
|
165
|
+
seen.add(key);
|
|
166
|
+
text += ` root: ${root.kind}${root.source === "" ? "" : `\tnamed by ${root.source}`}\n`;
|
|
167
|
+
}
|
|
261
168
|
}
|
|
262
|
-
const
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
169
|
+
const support = new Set(analysis.configured.flatMap((one) => one.supportFiles ?? []));
|
|
170
|
+
const line = (edge: Edge, tail: (reference: Reference) => string): string => {
|
|
171
|
+
const reference = graph.references[edge.reference];
|
|
172
|
+
return reference === undefined
|
|
173
|
+
? ""
|
|
174
|
+
: referenceLine(reference, tail(reference), support, {
|
|
175
|
+
making: graph.configurations[edge.reference] ?? [],
|
|
176
|
+
run: matrix.configurations,
|
|
177
|
+
});
|
|
178
|
+
};
|
|
179
|
+
const found = sweep.path(subject.id);
|
|
180
|
+
if (found !== undefined && found.hops.length > 0) {
|
|
181
|
+
text += ` reached from: ${originText(found.origin, graph)}\n`;
|
|
182
|
+
for (const hop of found.hops) {
|
|
183
|
+
text += line(hop.edge, (reference) => `${madeBy(reference)} -> ${reference.to}`);
|
|
269
184
|
if (hop.k === "export") {
|
|
270
|
-
|
|
185
|
+
const reference = graph.references[hop.edge.reference];
|
|
186
|
+
text += ` export: ${reference?.to ?? ""} -> ${graph.symbols[hop.to]?.id ?? ""}\n`;
|
|
271
187
|
}
|
|
272
188
|
}
|
|
273
189
|
} else if (found === undefined) {
|
|
274
|
-
const references =
|
|
275
|
-
|
|
190
|
+
const references = graph.references.flatMap((one, place) =>
|
|
191
|
+
one.to === subject.id ? [place] : [],
|
|
192
|
+
);
|
|
193
|
+
text +=
|
|
194
|
+
" unreachable: no path of references reaches it from a root, a loaded consumer or a test file no project holds\n";
|
|
276
195
|
text += ` references: ${String(references.length)}\n`;
|
|
277
|
-
for (const
|
|
278
|
-
|
|
196
|
+
for (const place of references) {
|
|
197
|
+
const reference = graph.references[place];
|
|
198
|
+
if (reference !== undefined) {
|
|
199
|
+
text += referenceLine(reference, `from ${madeBy(reference)}`, support, {
|
|
200
|
+
making: graph.configurations[place] ?? [],
|
|
201
|
+
run: matrix.configurations,
|
|
202
|
+
});
|
|
203
|
+
}
|
|
279
204
|
}
|
|
280
205
|
}
|
|
281
206
|
if (candidate !== undefined) {
|
|
@@ -341,7 +266,7 @@ function explanation(analysis: RunAnalysis, subject: InventorySymbol, cascade: C
|
|
|
341
266
|
text += `position: ${subject.id}\n`;
|
|
342
267
|
text += `configurations: ${listed(analysis.swept.matrix.heldIn[at] ?? [])}\n`;
|
|
343
268
|
const found = analysis.result.findings.find((one) => positionKey(one.position) === subject.id);
|
|
344
|
-
const retained = analysis.swept.retained.filter((one) => one.id === subject.id);
|
|
269
|
+
const retained = analysis.swept.sweep.retained.filter((one) => one.id === subject.id);
|
|
345
270
|
if (found !== undefined) {
|
|
346
271
|
text += reported(found);
|
|
347
272
|
} else if (retained.length > 0) {
|
|
@@ -349,7 +274,7 @@ function explanation(analysis: RunAnalysis, subject: InventorySymbol, cascade: C
|
|
|
349
274
|
for (const one of retained) {
|
|
350
275
|
text += ` class: ${one.class}\t${positionKey(one.site)}\t${one.detail}\n`;
|
|
351
276
|
}
|
|
352
|
-
} else if (analysis.swept.
|
|
277
|
+
} else if (analysis.swept.sweep.held.includes(subject.id)) {
|
|
353
278
|
text +=
|
|
354
279
|
"answer: held\n held by: a question the checker did not answer, which could have kept it live, so no finding names it\n";
|
|
355
280
|
} else {
|
|
@@ -361,18 +286,17 @@ function explanation(analysis: RunAnalysis, subject: InventorySymbol, cascade: C
|
|
|
361
286
|
/**
|
|
362
287
|
* Explains one symbol from the analysis the report is built from: why a reported symbol is
|
|
363
288
|
* reported, which exemption classes held a retained one back, that an unanswered question held
|
|
364
|
-
* a held one, and for any other declaration the relations that hold it live and the
|
|
365
|
-
*
|
|
366
|
-
* request naming no one declaration exits with the usage code and names what partially
|
|
289
|
+
* a held one, and for any other declaration the relations that hold it live and the path the
|
|
290
|
+
* sweep's strongest tier reaching it follows, or the references it has where no path reaches
|
|
291
|
+
* it. A request naming no one declaration exits with the usage code and names what partially
|
|
367
292
|
* matches it. Where the analysis was partial, the error stream says so.
|
|
368
293
|
*/
|
|
369
294
|
export const explainVerb: Verb = ({ out, err, host, inputs, scope, openClient, option }) => {
|
|
370
295
|
const named = namedSymbol(option);
|
|
371
296
|
const { config, provenance } = resolve(inputs());
|
|
372
297
|
const scoped = scope();
|
|
373
|
-
const
|
|
374
|
-
|
|
375
|
-
});
|
|
298
|
+
const mode = productionMode(config);
|
|
299
|
+
const analysis = runAnalysis(openClient(config), host, scoped, config, provenance, mode);
|
|
376
300
|
const { subject, candidates } = subjectOf(analysis.swept.matrix.union.symbols, named);
|
|
377
301
|
const notes = partialNotes({
|
|
378
302
|
notBuilt: analysis.run.notBuilt,
|
|
@@ -380,7 +304,7 @@ export const explainVerb: Verb = ({ out, err, host, inputs, scope, openClient, o
|
|
|
380
304
|
targetRoot: resolvePath(host.workingDirectory(), scoped.target.path),
|
|
381
305
|
});
|
|
382
306
|
if (subject === undefined) {
|
|
383
|
-
err
|
|
307
|
+
diagnose(err, `${JSON.stringify(named)} names no one symbol of the target`);
|
|
384
308
|
for (const candidate of candidates) {
|
|
385
309
|
err.write(` ${candidate}\n`);
|
|
386
310
|
}
|
|
@@ -391,7 +315,7 @@ export const explainVerb: Verb = ({ out, err, host, inputs, scope, openClient, o
|
|
|
391
315
|
out.write(explanation(analysis, subject, config.reporters.cascade));
|
|
392
316
|
}
|
|
393
317
|
for (const note of notes) {
|
|
394
|
-
err
|
|
318
|
+
diagnose(err, note);
|
|
395
319
|
}
|
|
396
320
|
return subject === undefined ? EXIT_USAGE : EXIT_CLEAN;
|
|
397
321
|
};
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
import { EXIT_CLEAN } from "../contract/contract.generated.ts";
|
|
1
2
|
import { printConfig } from "../print.ts";
|
|
2
3
|
import { resolve } from "../resolve.ts";
|
|
3
|
-
import {
|
|
4
|
+
import { type Verb } from "./verb.ts";
|
|
4
5
|
|
|
5
6
|
/** Writes the resolved configuration with the source of every setting. */
|
|
6
7
|
export const printConfigVerb: Verb = ({ out, inputs }) => {
|
|
@@ -1,8 +1,10 @@
|
|
|
1
|
+
import { EXIT_CLEAN } from "../contract/contract.generated.ts";
|
|
1
2
|
import { runProjects } from "../analysis.ts";
|
|
2
3
|
import { partialNotes } from "../partial.ts";
|
|
3
4
|
import { resolvePath } from "../paths.ts";
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
5
|
+
import { resolvePartial } from "../resolve.ts";
|
|
6
|
+
import { type Verb } from "./verb.ts";
|
|
7
|
+
import { diagnose } from "../product.ts";
|
|
6
8
|
|
|
7
9
|
/**
|
|
8
10
|
* Writes the name of every project one run analyzes, one per line: the identifier the
|
|
@@ -12,7 +14,7 @@ import { EXIT_CLEAN, type Verb } from "./verb.ts";
|
|
|
12
14
|
* instead, and one that fails the analysis fails this command the same way.
|
|
13
15
|
*/
|
|
14
16
|
export const printProjectsVerb: Verb = ({ out, err, host, inputs, scope, openClient }) => {
|
|
15
|
-
const config =
|
|
17
|
+
const config = resolvePartial(inputs());
|
|
16
18
|
const scoped = scope();
|
|
17
19
|
const answer = runProjects(openClient(config), host, scoped, config);
|
|
18
20
|
for (const id of answer.configurations) {
|
|
@@ -23,7 +25,7 @@ export const printProjectsVerb: Verb = ({ out, err, host, inputs, scope, openCli
|
|
|
23
25
|
unanswered: answer.unanswered,
|
|
24
26
|
targetRoot: resolvePath(host.workingDirectory(), scoped.target.path),
|
|
25
27
|
})) {
|
|
26
|
-
err
|
|
28
|
+
diagnose(err, note);
|
|
27
29
|
}
|
|
28
30
|
return EXIT_CLEAN;
|
|
29
31
|
};
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { EXIT_CLEAN } from "../contract/contract.generated.ts";
|
|
2
|
+
import { productionMode, runSweep } from "../analysis.ts";
|
|
2
3
|
import { retainedLines } from "../exempt.ts";
|
|
3
4
|
import { partialNotes } from "../partial.ts";
|
|
4
5
|
import { resolvePath } from "../paths.ts";
|
|
5
6
|
import { resolve } from "../resolve.ts";
|
|
6
|
-
import {
|
|
7
|
+
import { type Verb } from "./verb.ts";
|
|
8
|
+
import { diagnose } from "../product.ts";
|
|
7
9
|
|
|
8
10
|
/**
|
|
9
11
|
* Writes every declaration an exemption held back in the production sweep a report is
|
|
@@ -17,9 +19,9 @@ export const printRetainedVerb: Verb = ({ out, err, host, inputs, scope, openCli
|
|
|
17
19
|
const scoped = scope();
|
|
18
20
|
const swept = runSweep(openClient(config), host, scoped, config, {
|
|
19
21
|
marked: [],
|
|
20
|
-
mode:
|
|
22
|
+
mode: productionMode(config),
|
|
21
23
|
});
|
|
22
|
-
for (const line of retainedLines(swept.matrix.union.symbols, swept.retained)) {
|
|
24
|
+
for (const line of retainedLines(swept.matrix.union.symbols, swept.sweep.retained)) {
|
|
23
25
|
out.write(`${line}\n`);
|
|
24
26
|
}
|
|
25
27
|
for (const note of partialNotes({
|
|
@@ -27,7 +29,7 @@ export const printRetainedVerb: Verb = ({ out, err, host, inputs, scope, openCli
|
|
|
27
29
|
unanswered: swept.unanswered,
|
|
28
30
|
targetRoot: resolvePath(host.workingDirectory(), scoped.target.path),
|
|
29
31
|
})) {
|
|
30
|
-
err
|
|
32
|
+
diagnose(err, note);
|
|
31
33
|
}
|
|
32
34
|
return EXIT_CLEAN;
|
|
33
35
|
};
|
package/src/verbs/print-roots.ts
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
|
+
import { EXIT_CLEAN, EXIT_FINDINGS } from "../contract/contract.generated.ts";
|
|
1
2
|
import { runRoots, type RunRoot } from "../analysis.ts";
|
|
2
3
|
import { partialNotes } from "../partial.ts";
|
|
3
4
|
import { resolvePath } from "../paths.ts";
|
|
4
5
|
import { resolve } from "../resolve.ts";
|
|
5
|
-
import {
|
|
6
|
+
import { type Verb } from "./verb.ts";
|
|
7
|
+
import { diagnose } from "../product.ts";
|
|
6
8
|
|
|
7
9
|
/**
|
|
8
10
|
* One root as a line: the declaration's reference, why it is a root, and the string
|
|
@@ -41,7 +43,7 @@ export const printRootsVerb: Verb = ({ out, err, host, inputs, scope, openClient
|
|
|
41
43
|
unanswered: answer.unanswered,
|
|
42
44
|
targetRoot: resolvePath(host.workingDirectory(), scoped.target.path),
|
|
43
45
|
})) {
|
|
44
|
-
err
|
|
46
|
+
diagnose(err, note);
|
|
45
47
|
}
|
|
46
48
|
return answer.findings.length > 0 ? EXIT_FINDINGS : EXIT_CLEAN;
|
|
47
49
|
};
|
package/src/verbs/verb.ts
CHANGED
|
@@ -1,15 +1,9 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { Inputs, PartialConfig } from "../config.ts";
|
|
2
2
|
import type { Host } from "../host.ts";
|
|
3
3
|
import type { Writer } from "../run.ts";
|
|
4
4
|
import type { Scope } from "../scope.ts";
|
|
5
5
|
import type { Engine } from "../session.ts";
|
|
6
6
|
|
|
7
|
-
/** The exit codes the Contract's exit-code table names. */
|
|
8
|
-
export const EXIT_CLEAN = 0;
|
|
9
|
-
export const EXIT_FINDINGS = 1;
|
|
10
|
-
export const EXIT_USAGE = 2;
|
|
11
|
-
export const EXIT_FAILURE = 3;
|
|
12
|
-
|
|
13
7
|
/**
|
|
14
8
|
* What one verb is handed: the streams it writes, the platform it reads, and the
|
|
15
9
|
* options that follow its name, read only when the verb asks for what they name, so
|
|
@@ -27,7 +21,7 @@ interface Invocation {
|
|
|
27
21
|
* Opens the compiler client for a run under `config`. A client the verb opened is
|
|
28
22
|
* closed if the verb throws.
|
|
29
23
|
*/
|
|
30
|
-
readonly openClient: (config:
|
|
24
|
+
readonly openClient: (config: PartialConfig) => Engine;
|
|
31
25
|
/** The arguments after the verb's name, as written. */
|
|
32
26
|
readonly args: readonly string[];
|
|
33
27
|
/** The last value one of the verb's own options was given, undefined where none was. */
|
package/src/verbs/version.ts
CHANGED
|
@@ -1,8 +1,20 @@
|
|
|
1
|
-
import { CONTRACT_VERSION } from "../
|
|
2
|
-
import {
|
|
1
|
+
import { CONTRACT_VERSION, EXIT_CLEAN } from "../contract/contract.generated.ts";
|
|
2
|
+
import { productFault } from "../failure.ts";
|
|
3
|
+
import type { Host } from "../host.ts";
|
|
4
|
+
import { type Verb } from "./verb.ts";
|
|
5
|
+
import { message, PRODUCT } from "../product.ts";
|
|
6
|
+
|
|
7
|
+
/** The version the host reports for this analyzer; one it cannot read is a fault of the analyzer. */
|
|
8
|
+
export function ownVersion(host: Host): string {
|
|
9
|
+
try {
|
|
10
|
+
return host.analyzerVersion();
|
|
11
|
+
} catch (error: unknown) {
|
|
12
|
+
throw productFault(`cannot read its own version: ${message(error)}`);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
3
15
|
|
|
4
16
|
/** Writes the version the host reports and the Contract version this analyzer implements. */
|
|
5
17
|
export const versionVerb: Verb = ({ out, host }) => {
|
|
6
|
-
out.write(
|
|
18
|
+
out.write(`${PRODUCT} ${ownVersion(host)}\ncontract ${CONTRACT_VERSION}\n`);
|
|
7
19
|
return EXIT_CLEAN;
|
|
8
20
|
};
|
package/dist/src/base-url.js
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { resolvePath } from "./paths.js";
|
|
2
|
-
/**
|
|
3
|
-
* The `paths` one configuration's resolved options map under the compilers before version
|
|
4
|
-
* 7, each target absolute: a target is read against the effective `baseUrl`, and a specifier
|
|
5
|
-
* no other pattern maps is looked up below it. Undefined where no `baseUrl` is set, so the
|
|
6
|
-
* options' own `paths` stand. Version 7 reads no `baseUrl`:
|
|
7
|
-
* https://github.com/microsoft/TypeScript/issues/62207
|
|
8
|
-
*/
|
|
9
|
-
export function baseUrlPaths(options) {
|
|
10
|
-
const baseUrl = Reflect.get(options, "baseUrl");
|
|
11
|
-
if (typeof baseUrl !== "string") {
|
|
12
|
-
return undefined;
|
|
13
|
-
}
|
|
14
|
-
return Object.fromEntries(Object.entries({ "*": ["*"], ...options.paths }).map(([key, targets]) => [
|
|
15
|
-
key,
|
|
16
|
-
targets.map((target) => resolvePath(baseUrl, target)),
|
|
17
|
-
]));
|
|
18
|
-
}
|