@cplieger/deadset-ts 8.0.0-dev.2 → 8.0.0-dev.21
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 +35 -9
- package/dist/src/amd.js +81 -0
- package/dist/src/analysis.js +274 -496
- 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/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 +2 -2
- 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 +1370 -0
- package/dist/src/contract/report.generated.js +866 -0
- package/dist/src/dependencies.js +165 -122
- 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/exemptions/argument-places.js +131 -0
- package/dist/src/exemptions/calls.js +338 -0
- package/dist/src/exemptions/classes.js +13 -0
- package/dist/src/{decorator.js → exemptions/decorator.js} +19 -30
- package/dist/src/exemptions/detectors.js +48 -0
- package/dist/src/{enum-group.js → exemptions/enum-group.js} +9 -16
- package/dist/src/{erased-stores.js → exemptions/erased-stores.js} +7 -11
- package/dist/src/{framework-lifecycle.js → exemptions/framework-lifecycle.js} +76 -54
- package/dist/src/exemptions/generated-file.js +241 -0
- package/dist/src/{injection-container.js → exemptions/injection-container.js} +20 -26
- package/dist/src/exemptions/installed-globals.js +173 -0
- package/dist/src/{interface-satisfaction.js → exemptions/interface-satisfaction.js} +52 -121
- package/dist/src/exemptions/lifecycle.js +150 -0
- package/dist/src/{reflective-lookup.js → exemptions/reflective-lookup.js} +3 -3
- package/dist/src/exemptions/serialization-contract.js +1276 -0
- package/dist/src/exemptions/sites.js +182 -0
- package/dist/src/{template-field.js → exemptions/template-field.js} +13 -23
- package/dist/src/{value-reach.js → exemptions/value-reach.js} +14 -7
- 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/fs/document.js +52 -0
- package/dist/src/fs/manifest.js +67 -0
- package/dist/src/fs/tree.js +88 -0
- 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/values.js +124 -0
- package/dist/src/index.js +2 -2
- package/dist/src/indexed-access.js +523 -478
- 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 +95 -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/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/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 +30 -6
- 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 +40 -11
- package/src/amd.ts +130 -0
- package/src/analysis.ts +426 -733
- package/src/augmentations.ts +93 -4
- package/src/automatic-types.ts +12 -30
- package/src/bindings.ts +460 -0
- 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 +2 -2
- 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 +1453 -0
- package/src/contract/report.generated.ts +1241 -0
- package/src/dependencies.ts +223 -128
- 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/exemptions/argument-places.ts +198 -0
- package/src/exemptions/calls.ts +483 -0
- package/src/exemptions/classes.ts +49 -0
- package/src/exemptions/decorator.ts +56 -0
- package/src/exemptions/detectors.ts +75 -0
- package/src/{enum-group.ts → exemptions/enum-group.ts} +10 -19
- package/src/{erased-stores.ts → exemptions/erased-stores.ts} +7 -14
- package/src/{framework-lifecycle.ts → exemptions/framework-lifecycle.ts} +85 -66
- package/src/exemptions/generated-file.ts +318 -0
- package/src/{injection-container.ts → exemptions/injection-container.ts} +29 -34
- package/src/exemptions/installed-globals.ts +255 -0
- package/src/{interface-satisfaction.ts → exemptions/interface-satisfaction.ts} +69 -160
- package/src/exemptions/lifecycle.ts +286 -0
- package/src/{reflective-lookup.ts → exemptions/reflective-lookup.ts} +5 -5
- package/src/exemptions/serialization-contract.ts +1729 -0
- package/src/exemptions/sites.ts +293 -0
- package/src/{template-field.ts → exemptions/template-field.ts} +22 -32
- package/src/{value-reach.ts → exemptions/value-reach.ts} +16 -8
- 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/fs/document.ts +70 -0
- package/src/fs/manifest.ts +96 -0
- package/src/fs/tree.ts +110 -0
- 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/values.ts +170 -0
- package/src/index.ts +2 -2
- package/src/indexed-access.ts +570 -527
- 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 +201 -10
- 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} +26 -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/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/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 +36 -6
- 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/calls.js +0 -155
- 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/exempt-classes.js +0 -75
- package/dist/src/exempt.js +0 -209
- package/dist/src/generated-file.js +0 -95
- 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/serialization-contract.js +0 -611
- 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/value-flow.js +0 -74
- package/dist/src/version.js +0 -7
- package/dist/src/workflow-steps.js +0 -185
- package/src/base-url.ts +0 -24
- package/src/calls.ts +0 -225
- package/src/decorator.ts +0 -78
- package/src/discover.ts +0 -653
- package/src/entry-points.ts +0 -687
- package/src/exempt-classes.ts +0 -123
- package/src/exempt.ts +0 -323
- package/src/generated-file.ts +0 -111
- 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/serialization-contract.ts +0 -849
- package/src/setup-failure.ts +0 -39
- package/src/sweep.ts +0 -347
- package/src/test-joins.ts +0 -120
- package/src/value-flow.ts +0 -104
- package/src/version.ts +0 -7
- package/src/workflow-steps.ts +0 -216
|
@@ -1,13 +1,16 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import { referenceKey } from "../matrix.js";
|
|
1
|
+
import { EXIT_CLEAN, EXIT_USAGE } from "../contract/contract.generated.js";
|
|
2
|
+
import { productionMode, runAnalysis } from "../analysis.js";
|
|
3
|
+
import { listing } from "../liveness/components.js";
|
|
4
|
+
import { swept as judged } from "../liveness/graph.js";
|
|
6
5
|
import { partialNotes } from "../partial.js";
|
|
7
6
|
import { resolvePath } from "../paths.js";
|
|
8
7
|
import { positionKey } from "../position.js";
|
|
8
|
+
import { madeByTestCode } from "../tests/file-class.js";
|
|
9
9
|
import { resolve } from "../resolve.js";
|
|
10
|
-
import {
|
|
10
|
+
import {} from "./verb.js";
|
|
11
|
+
import { UsageError } from "../usage.js";
|
|
12
|
+
import { bytewise } from "../text/compare.js";
|
|
13
|
+
import { diagnose } from "../product.js";
|
|
11
14
|
/**
|
|
12
15
|
* The three spellings of an explanation request, each naming the symbol to explain. They are
|
|
13
16
|
* one request, because exactly one state holds for a symbol and the answer is that state.
|
|
@@ -33,10 +36,10 @@ function namedSymbol(option) {
|
|
|
33
36
|
});
|
|
34
37
|
const [only, ...more] = named;
|
|
35
38
|
if (only === undefined) {
|
|
36
|
-
throw new
|
|
39
|
+
throw new UsageError("explain explains the symbol --why, --why-live or --why-not names, and none was named");
|
|
37
40
|
}
|
|
38
41
|
if (more.length > 0) {
|
|
39
|
-
throw new
|
|
42
|
+
throw new UsageError(`explain explains one symbol, and ${named.map((one) => `--${one.name}`).join(", ")} each name one`);
|
|
40
43
|
}
|
|
41
44
|
return only.value;
|
|
42
45
|
}
|
|
@@ -73,153 +76,97 @@ function subjectOf(symbols, named) {
|
|
|
73
76
|
const partial = symbols
|
|
74
77
|
.filter((symbol) => symbol.ref.toLowerCase().includes(folded) || symbol.name.toLowerCase().includes(folded))
|
|
75
78
|
.map(described)
|
|
76
|
-
.sort(
|
|
79
|
+
.sort(bytewise);
|
|
77
80
|
return { candidates: partial.slice(0, MAX_PARTIAL_MATCHES) };
|
|
78
81
|
}
|
|
79
|
-
/**
|
|
80
|
-
function
|
|
81
|
-
const
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
}
|
|
90
|
-
return held;
|
|
91
|
-
}
|
|
92
|
-
/** Every root of the run once per reason, in the order the projects name them. */
|
|
93
|
-
function rootsOf(configured) {
|
|
94
|
-
const seen = new Set();
|
|
95
|
-
return configured
|
|
96
|
-
.flatMap((one) => one.roots)
|
|
97
|
-
.filter((root) => {
|
|
98
|
-
const key = [root.id, root.kind, root.source].join("\u0000");
|
|
99
|
-
if (seen.has(key)) {
|
|
100
|
-
return false;
|
|
101
|
-
}
|
|
102
|
-
seen.add(key);
|
|
103
|
-
return true;
|
|
104
|
-
});
|
|
105
|
-
}
|
|
106
|
-
/**
|
|
107
|
-
* The shortest path from a root or a loaded consumer to one declaration, walked breadth first
|
|
108
|
-
* from every root at once in the order the run names them, a consumer's reference being the
|
|
109
|
-
* first hop of a path of its own, and following the references the sweep follows: a
|
|
110
|
-
* reference that reads a module reaches what the module exports, and an evaluation or a root
|
|
111
|
-
* reaches the module alone. Under `production` no reference a test file made is followed,
|
|
112
|
-
* which is the set the report's sweep counts.
|
|
113
|
-
*/
|
|
114
|
-
function shortestPath(analysis, to, production) {
|
|
115
|
-
const graph = analysis.swept.matrix.union;
|
|
116
|
-
const out = new Map();
|
|
117
|
-
const consumed = [];
|
|
118
|
-
for (const reference of referencesOf(analysis.configured)) {
|
|
119
|
-
if (production && reference.test) {
|
|
120
|
-
continue;
|
|
121
|
-
}
|
|
122
|
-
const { consumer } = reference;
|
|
123
|
-
if (consumer !== undefined) {
|
|
124
|
-
consumed.push({ ...reference, consumer });
|
|
125
|
-
continue;
|
|
126
|
-
}
|
|
127
|
-
const held = out.get(reference.from);
|
|
128
|
-
if (held === undefined) {
|
|
129
|
-
out.set(reference.from, [reference]);
|
|
130
|
-
}
|
|
131
|
-
else {
|
|
132
|
-
held.push(reference);
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
const steps = [];
|
|
136
|
-
const seen = new Set();
|
|
137
|
-
const expanded = new Set();
|
|
138
|
-
const enter = (step) => {
|
|
139
|
-
if (!seen.has(step.at)) {
|
|
140
|
-
seen.add(step.at);
|
|
141
|
-
steps.push(step);
|
|
142
|
-
}
|
|
143
|
-
};
|
|
144
|
-
const follow = (reference, previous, origin) => {
|
|
145
|
-
enter({ at: reference.to, hop: { k: "reference", reference }, previous, origin });
|
|
146
|
-
const target = graph.at(reference.to);
|
|
147
|
-
if (reference.use === "evaluation" || target === OUTSIDE || expanded.has(reference.to)) {
|
|
148
|
-
return;
|
|
149
|
-
}
|
|
150
|
-
expanded.add(reference.to);
|
|
151
|
-
for (const exported of graph.exportsOf[target] ?? []) {
|
|
152
|
-
const id = graph.symbols[exported]?.id;
|
|
153
|
-
if (id !== undefined) {
|
|
154
|
-
enter({ at: id, hop: { k: "export", reference, to: id }, previous, origin });
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
};
|
|
158
|
-
for (const root of rootsOf(analysis.configured)) {
|
|
159
|
-
enter({ at: root.id, hop: undefined, previous: -1, origin: { k: "root", root } });
|
|
160
|
-
}
|
|
161
|
-
// A consumer's reference is one hop long, so it joins the walk where the roots' first
|
|
162
|
-
// hops do.
|
|
163
|
-
const firstHops = steps.length;
|
|
164
|
-
for (let head = 0;; head += 1) {
|
|
165
|
-
if (head === firstHops) {
|
|
166
|
-
for (const reference of consumed) {
|
|
167
|
-
follow(reference, -1, { k: "consumer", consumer: reference.consumer });
|
|
82
|
+
/** Where a path starts, as a line names it. */
|
|
83
|
+
function originText(origin, graph) {
|
|
84
|
+
const id = (at) => graph.symbols[at]?.id ?? "";
|
|
85
|
+
switch (origin.k) {
|
|
86
|
+
case "root":
|
|
87
|
+
return `root ${origin.rooted.kind} ${id(origin.rooted.at)}`;
|
|
88
|
+
case "consumed": {
|
|
89
|
+
const reference = graph.references[origin.edge.reference];
|
|
90
|
+
if (reference?.consumer !== undefined) {
|
|
91
|
+
return `consumer ${reference.consumer}`;
|
|
168
92
|
}
|
|
93
|
+
return reference?.unheld === true
|
|
94
|
+
? `test file no project holds ${reference.from.replace(/#$/u, "")}`
|
|
95
|
+
: `declaration no configuration judges ${reference?.from ?? ""}`;
|
|
169
96
|
}
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
for (let at = step; at?.hop !== undefined; at = steps[at.previous]) {
|
|
177
|
-
path.unshift(at.hop);
|
|
178
|
-
}
|
|
179
|
-
return { origin: step.origin, path };
|
|
180
|
-
}
|
|
181
|
-
for (const reference of out.get(step.at) ?? []) {
|
|
182
|
-
follow(reference, head, step.origin);
|
|
183
|
-
}
|
|
97
|
+
case "exemption":
|
|
98
|
+
return `exemption ${origin.record.class} ${positionKey(origin.record.site)}`;
|
|
99
|
+
case "mark":
|
|
100
|
+
return `suppression of ${id(origin.at)}`;
|
|
101
|
+
case "unanswered":
|
|
102
|
+
return `unanswered question about ${id(origin.at)}`;
|
|
184
103
|
}
|
|
185
|
-
return undefined;
|
|
186
104
|
}
|
|
187
105
|
/** What made a reference: a declaration of the target, or a loaded consumer. */
|
|
188
106
|
function madeBy(reference) {
|
|
189
107
|
return reference.consumer === undefined ? reference.from : `consumer ${reference.consumer}`;
|
|
190
108
|
}
|
|
191
|
-
|
|
192
|
-
|
|
109
|
+
/**
|
|
110
|
+
* One reference of an answer, marked where test code made it, a test-support file's included,
|
|
111
|
+
* and naming the configurations that make it where they are not every one of the run.
|
|
112
|
+
*/
|
|
113
|
+
function referenceLine(reference, tail, support, configurations) {
|
|
114
|
+
const partial = configurations.making.length < configurations.run.length;
|
|
115
|
+
return ` reference: ${positionKey(reference.position)}\t${reference.use}\t${tail}${madeByTestCode(reference, support) ? "\tfrom a test file" : ""}${partial ? `\tmade in ${configurations.making.join(" ")}` : ""}\n`;
|
|
193
116
|
}
|
|
194
117
|
/** Why a declaration no finding names and no exemption held back is live, or how it fell. */
|
|
195
118
|
function liveness(analysis, subject, cascade) {
|
|
196
|
-
const { sweep } = analysis.swept;
|
|
119
|
+
const { matrix, sweep } = analysis.swept;
|
|
120
|
+
const graph = matrix.union;
|
|
197
121
|
const candidate = sweep.candidates.find((one) => one.id === subject.id);
|
|
198
122
|
if (candidate === undefined && !judged(subject.kind)) {
|
|
199
123
|
return `answer: unjudged\n unjudged: neither liveness relation judges a ${subject.kind}\n`;
|
|
200
124
|
}
|
|
201
125
|
let text = `answer: ${candidate === undefined ? "live" : "dead"}\n`;
|
|
202
126
|
text += ` live under: ${listed(sweep.liveUnder.get(subject.id) ?? [])}\n`;
|
|
203
|
-
|
|
204
|
-
|
|
127
|
+
const at = graph.at(subject.id);
|
|
128
|
+
const seen = new Set();
|
|
129
|
+
for (const root of graph.rooted.filter((one) => one.at === at)) {
|
|
130
|
+
const key = `${root.kind}\u0000${root.source}`;
|
|
131
|
+
if (!seen.has(key)) {
|
|
132
|
+
seen.add(key);
|
|
133
|
+
text += ` root: ${root.kind}${root.source === "" ? "" : `\tnamed by ${root.source}`}\n`;
|
|
134
|
+
}
|
|
205
135
|
}
|
|
206
|
-
const
|
|
207
|
-
|
|
208
|
-
const
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
136
|
+
const support = new Set(analysis.configured.flatMap((one) => one.supportFiles ?? []));
|
|
137
|
+
const line = (edge, tail) => {
|
|
138
|
+
const reference = graph.references[edge.reference];
|
|
139
|
+
return reference === undefined
|
|
140
|
+
? ""
|
|
141
|
+
: referenceLine(reference, tail(reference), support, {
|
|
142
|
+
making: graph.configurations[edge.reference] ?? [],
|
|
143
|
+
run: matrix.configurations,
|
|
144
|
+
});
|
|
145
|
+
};
|
|
146
|
+
const found = sweep.path(subject.id);
|
|
147
|
+
if (found !== undefined && found.hops.length > 0) {
|
|
148
|
+
text += ` reached from: ${originText(found.origin, graph)}\n`;
|
|
149
|
+
for (const hop of found.hops) {
|
|
150
|
+
text += line(hop.edge, (reference) => `${madeBy(reference)} -> ${reference.to}`);
|
|
212
151
|
if (hop.k === "export") {
|
|
213
|
-
|
|
152
|
+
const reference = graph.references[hop.edge.reference];
|
|
153
|
+
text += ` export: ${reference?.to ?? ""} -> ${graph.symbols[hop.to]?.id ?? ""}\n`;
|
|
214
154
|
}
|
|
215
155
|
}
|
|
216
156
|
}
|
|
217
157
|
else if (found === undefined) {
|
|
218
|
-
const references =
|
|
219
|
-
text +=
|
|
158
|
+
const references = graph.references.flatMap((one, place) => one.to === subject.id ? [place] : []);
|
|
159
|
+
text +=
|
|
160
|
+
" unreachable: no path of references reaches it from a root, a loaded consumer or a test file no project holds\n";
|
|
220
161
|
text += ` references: ${String(references.length)}\n`;
|
|
221
|
-
for (const
|
|
222
|
-
|
|
162
|
+
for (const place of references) {
|
|
163
|
+
const reference = graph.references[place];
|
|
164
|
+
if (reference !== undefined) {
|
|
165
|
+
text += referenceLine(reference, `from ${madeBy(reference)}`, support, {
|
|
166
|
+
making: graph.configurations[place] ?? [],
|
|
167
|
+
run: matrix.configurations,
|
|
168
|
+
});
|
|
169
|
+
}
|
|
223
170
|
}
|
|
224
171
|
}
|
|
225
172
|
if (candidate !== undefined) {
|
|
@@ -276,7 +223,7 @@ function explanation(analysis, subject, cascade) {
|
|
|
276
223
|
text += `position: ${subject.id}\n`;
|
|
277
224
|
text += `configurations: ${listed(analysis.swept.matrix.heldIn[at] ?? [])}\n`;
|
|
278
225
|
const found = analysis.result.findings.find((one) => positionKey(one.position) === subject.id);
|
|
279
|
-
const retained = analysis.swept.retained.filter((one) => one.id === subject.id);
|
|
226
|
+
const retained = analysis.swept.sweep.retained.filter((one) => one.id === subject.id);
|
|
280
227
|
if (found !== undefined) {
|
|
281
228
|
text += reported(found);
|
|
282
229
|
}
|
|
@@ -286,7 +233,7 @@ function explanation(analysis, subject, cascade) {
|
|
|
286
233
|
text += ` class: ${one.class}\t${positionKey(one.site)}\t${one.detail}\n`;
|
|
287
234
|
}
|
|
288
235
|
}
|
|
289
|
-
else if (analysis.swept.
|
|
236
|
+
else if (analysis.swept.sweep.held.includes(subject.id)) {
|
|
290
237
|
text +=
|
|
291
238
|
"answer: held\n held by: a question the checker did not answer, which could have kept it live, so no finding names it\n";
|
|
292
239
|
}
|
|
@@ -298,18 +245,17 @@ function explanation(analysis, subject, cascade) {
|
|
|
298
245
|
/**
|
|
299
246
|
* Explains one symbol from the analysis the report is built from: why a reported symbol is
|
|
300
247
|
* reported, which exemption classes held a retained one back, that an unanswered question held
|
|
301
|
-
* a held one, and for any other declaration the relations that hold it live and the
|
|
302
|
-
*
|
|
303
|
-
* request naming no one declaration exits with the usage code and names what partially
|
|
248
|
+
* a held one, and for any other declaration the relations that hold it live and the path the
|
|
249
|
+
* sweep's strongest tier reaching it follows, or the references it has where no path reaches
|
|
250
|
+
* it. A request naming no one declaration exits with the usage code and names what partially
|
|
304
251
|
* matches it. Where the analysis was partial, the error stream says so.
|
|
305
252
|
*/
|
|
306
253
|
export const explainVerb = ({ out, err, host, inputs, scope, openClient, option }) => {
|
|
307
254
|
const named = namedSymbol(option);
|
|
308
255
|
const { config, provenance } = resolve(inputs());
|
|
309
256
|
const scoped = scope();
|
|
310
|
-
const
|
|
311
|
-
|
|
312
|
-
});
|
|
257
|
+
const mode = productionMode(config);
|
|
258
|
+
const analysis = runAnalysis(openClient(config), host, scoped, config, provenance, mode);
|
|
313
259
|
const { subject, candidates } = subjectOf(analysis.swept.matrix.union.symbols, named);
|
|
314
260
|
const notes = partialNotes({
|
|
315
261
|
notBuilt: analysis.run.notBuilt,
|
|
@@ -317,7 +263,7 @@ export const explainVerb = ({ out, err, host, inputs, scope, openClient, option
|
|
|
317
263
|
targetRoot: resolvePath(host.workingDirectory(), scoped.target.path),
|
|
318
264
|
});
|
|
319
265
|
if (subject === undefined) {
|
|
320
|
-
err
|
|
266
|
+
diagnose(err, `${JSON.stringify(named)} names no one symbol of the target`);
|
|
321
267
|
for (const candidate of candidates) {
|
|
322
268
|
err.write(` ${candidate}\n`);
|
|
323
269
|
}
|
|
@@ -329,7 +275,7 @@ export const explainVerb = ({ out, err, host, inputs, scope, openClient, option
|
|
|
329
275
|
out.write(explanation(analysis, subject, config.reporters.cascade));
|
|
330
276
|
}
|
|
331
277
|
for (const note of notes) {
|
|
332
|
-
err
|
|
278
|
+
diagnose(err, note);
|
|
333
279
|
}
|
|
334
280
|
return subject === undefined ? EXIT_USAGE : EXIT_CLEAN;
|
|
335
281
|
};
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
import { EXIT_CLEAN } from "../contract/contract.generated.js";
|
|
1
2
|
import { printConfig } from "../print.js";
|
|
2
3
|
import { resolve } from "../resolve.js";
|
|
3
|
-
import {
|
|
4
|
+
import {} from "./verb.js";
|
|
4
5
|
/** Writes the resolved configuration with the source of every setting. */
|
|
5
6
|
export const printConfigVerb = ({ out, inputs }) => {
|
|
6
7
|
const { config, provenance } = resolve(inputs());
|
|
@@ -1,8 +1,10 @@
|
|
|
1
|
+
import { EXIT_CLEAN } from "../contract/contract.generated.js";
|
|
1
2
|
import { runProjects } from "../analysis.js";
|
|
2
3
|
import { partialNotes } from "../partial.js";
|
|
3
4
|
import { resolvePath } from "../paths.js";
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
5
|
+
import { resolvePartial } from "../resolve.js";
|
|
6
|
+
import {} from "./verb.js";
|
|
7
|
+
import { diagnose } from "../product.js";
|
|
6
8
|
/**
|
|
7
9
|
* Writes the name of every project one run analyzes, one per line: the identifier the
|
|
8
10
|
* build matrix declares for it, or, where discovery derived the project, its
|
|
@@ -11,7 +13,7 @@ import { EXIT_CLEAN } from "./verb.js";
|
|
|
11
13
|
* instead, and one that fails the analysis fails this command the same way.
|
|
12
14
|
*/
|
|
13
15
|
export const printProjectsVerb = ({ out, err, host, inputs, scope, openClient }) => {
|
|
14
|
-
const config =
|
|
16
|
+
const config = resolvePartial(inputs());
|
|
15
17
|
const scoped = scope();
|
|
16
18
|
const answer = runProjects(openClient(config), host, scoped, config);
|
|
17
19
|
for (const id of answer.configurations) {
|
|
@@ -22,7 +24,7 @@ export const printProjectsVerb = ({ out, err, host, inputs, scope, openClient })
|
|
|
22
24
|
unanswered: answer.unanswered,
|
|
23
25
|
targetRoot: resolvePath(host.workingDirectory(), scoped.target.path),
|
|
24
26
|
})) {
|
|
25
|
-
err
|
|
27
|
+
diagnose(err, note);
|
|
26
28
|
}
|
|
27
29
|
return EXIT_CLEAN;
|
|
28
30
|
};
|
|
@@ -1,9 +1,33 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { EXIT_CLEAN } from "../contract/contract.generated.js";
|
|
2
|
+
import { productionMode, runSweep } from "../analysis.js";
|
|
3
3
|
import { partialNotes } from "../partial.js";
|
|
4
|
+
import { positionKey } from "../position.js";
|
|
4
5
|
import { resolvePath } from "../paths.js";
|
|
5
6
|
import { resolve } from "../resolve.js";
|
|
6
|
-
import {
|
|
7
|
+
import {} from "./verb.js";
|
|
8
|
+
import { diagnose } from "../product.js";
|
|
9
|
+
/**
|
|
10
|
+
* One line per held-back declaration, in site order: its reference and position, then
|
|
11
|
+
* each record's class, site and detail, all separated by tabs.
|
|
12
|
+
*/
|
|
13
|
+
function retainedLines(symbols, retained) {
|
|
14
|
+
const held = new Map();
|
|
15
|
+
for (const record of retained) {
|
|
16
|
+
held.set(record.id, [...(held.get(record.id) ?? []), record]);
|
|
17
|
+
}
|
|
18
|
+
return symbols.flatMap((symbol) => {
|
|
19
|
+
const records = held.get(symbol.id);
|
|
20
|
+
if (records === undefined) {
|
|
21
|
+
return [];
|
|
22
|
+
}
|
|
23
|
+
const fields = records.flatMap((record) => [
|
|
24
|
+
record.class,
|
|
25
|
+
positionKey(record.site),
|
|
26
|
+
record.detail,
|
|
27
|
+
]);
|
|
28
|
+
return [[symbol.ref, positionKey(symbol.position), ...fields].join("\t")];
|
|
29
|
+
});
|
|
30
|
+
}
|
|
7
31
|
/**
|
|
8
32
|
* Writes every declaration an exemption held back in the production sweep a report is
|
|
9
33
|
* built from, one per line, and nothing where no exemption held one back. One fact
|
|
@@ -16,9 +40,9 @@ export const printRetainedVerb = ({ out, err, host, inputs, scope, openClient })
|
|
|
16
40
|
const scoped = scope();
|
|
17
41
|
const swept = runSweep(openClient(config), host, scoped, config, {
|
|
18
42
|
marked: [],
|
|
19
|
-
mode:
|
|
43
|
+
mode: productionMode(config),
|
|
20
44
|
});
|
|
21
|
-
for (const line of retainedLines(swept.matrix.union.symbols, swept.retained)) {
|
|
45
|
+
for (const line of retainedLines(swept.matrix.union.symbols, swept.sweep.retained)) {
|
|
22
46
|
out.write(`${line}\n`);
|
|
23
47
|
}
|
|
24
48
|
for (const note of partialNotes({
|
|
@@ -26,7 +50,7 @@ export const printRetainedVerb = ({ out, err, host, inputs, scope, openClient })
|
|
|
26
50
|
unanswered: swept.unanswered,
|
|
27
51
|
targetRoot: resolvePath(host.workingDirectory(), scoped.target.path),
|
|
28
52
|
})) {
|
|
29
|
-
err
|
|
53
|
+
diagnose(err, note);
|
|
30
54
|
}
|
|
31
55
|
return EXIT_CLEAN;
|
|
32
56
|
};
|
|
@@ -1,8 +1,10 @@
|
|
|
1
|
+
import { EXIT_CLEAN, EXIT_FINDINGS } from "../contract/contract.generated.js";
|
|
1
2
|
import { runRoots } from "../analysis.js";
|
|
2
3
|
import { partialNotes } from "../partial.js";
|
|
3
4
|
import { resolvePath } from "../paths.js";
|
|
4
5
|
import { resolve } from "../resolve.js";
|
|
5
|
-
import {
|
|
6
|
+
import {} from "./verb.js";
|
|
7
|
+
import { diagnose } from "../product.js";
|
|
6
8
|
/**
|
|
7
9
|
* One root as a line: the declaration's reference, why it is a root, and the string
|
|
8
10
|
* that named it, separated by tabs. A run of several configurations adds the ones
|
|
@@ -39,7 +41,7 @@ export const printRootsVerb = ({ out, err, host, inputs, scope, openClient }) =>
|
|
|
39
41
|
unanswered: answer.unanswered,
|
|
40
42
|
targetRoot: resolvePath(host.workingDirectory(), scoped.target.path),
|
|
41
43
|
})) {
|
|
42
|
-
err
|
|
44
|
+
diagnose(err, note);
|
|
43
45
|
}
|
|
44
46
|
return answer.findings.length > 0 ? EXIT_FINDINGS : EXIT_CLEAN;
|
|
45
47
|
};
|
package/dist/src/verbs/verb.js
CHANGED
|
@@ -1,7 +1,18 @@
|
|
|
1
|
-
import { CONTRACT_VERSION } from "../
|
|
2
|
-
import {
|
|
1
|
+
import { CONTRACT_VERSION, EXIT_CLEAN } from "../contract/contract.generated.js";
|
|
2
|
+
import { productFault } from "../failure.js";
|
|
3
|
+
import {} from "./verb.js";
|
|
4
|
+
import { message, PRODUCT } from "../product.js";
|
|
5
|
+
/** The version the host reports for this analyzer; one it cannot read is a fault of the analyzer. */
|
|
6
|
+
export function ownVersion(host) {
|
|
7
|
+
try {
|
|
8
|
+
return host.analyzerVersion();
|
|
9
|
+
}
|
|
10
|
+
catch (error) {
|
|
11
|
+
throw productFault(`cannot read its own version: ${message(error)}`);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
3
14
|
/** Writes the version the host reports and the Contract version this analyzer implements. */
|
|
4
15
|
export const versionVerb = ({ out, host }) => {
|
|
5
|
-
out.write(
|
|
16
|
+
out.write(`${PRODUCT} ${ownVersion(host)}\ncontract ${CONTRACT_VERSION}\n`);
|
|
6
17
|
return EXIT_CLEAN;
|
|
7
18
|
};
|
package/jsr.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cplieger/deadset-ts",
|
|
3
|
-
"version": "8.0.0-dev.
|
|
3
|
+
"version": "8.0.0-dev.21",
|
|
4
4
|
"license": "GPL-3.0-or-later",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": "./src/index.ts"
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
"include": [
|
|
10
10
|
"LICENSE",
|
|
11
11
|
"NOTICE",
|
|
12
|
+
"THIRD_PARTY_NOTICES.md",
|
|
12
13
|
"README.md",
|
|
13
14
|
"bin/**",
|
|
14
15
|
"src/**",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cplieger/deadset-ts",
|
|
3
|
-
"version": "8.0.0-dev.
|
|
3
|
+
"version": "8.0.0-dev.21",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"description": "Deterministic dead-code analysis for TypeScript, class and type members included",
|
|
@@ -19,6 +19,8 @@
|
|
|
19
19
|
},
|
|
20
20
|
"scripts": {
|
|
21
21
|
"build": "tsc -p tsconfig.build.json",
|
|
22
|
+
"gen": "node scripts/gen-contract.ts",
|
|
23
|
+
"vendor": "node scripts/vendor-unbash.ts",
|
|
22
24
|
"prepack": "npm run build",
|
|
23
25
|
"typecheck": "tsc -p tsconfig.json",
|
|
24
26
|
"typecheck:tests": "tsc -p tsconfig.test.json",
|
|
@@ -29,24 +31,27 @@
|
|
|
29
31
|
"lint:prettier": "prettier --check .",
|
|
30
32
|
"lint:fix": "eslint . --fix && prettier --write ."
|
|
31
33
|
},
|
|
34
|
+
"cplieger": {
|
|
35
|
+
"vitestShards": 2
|
|
36
|
+
},
|
|
32
37
|
"dependencies": {
|
|
33
|
-
"@typescript/native": "npm:typescript@7.1.0-dev.
|
|
38
|
+
"@typescript/native": "npm:typescript@7.1.0-dev.20261103.1"
|
|
34
39
|
},
|
|
35
40
|
"overrides": {
|
|
36
41
|
"qs": "^6.15.2"
|
|
37
42
|
},
|
|
38
43
|
"devDependencies": {
|
|
39
44
|
"@eslint/js": "10.0.1",
|
|
40
|
-
"@stryker-mutator/core": "10.
|
|
41
|
-
"@stryker-mutator/typescript-checker": "10.
|
|
42
|
-
"@stryker-mutator/vitest-runner": "10.
|
|
45
|
+
"@stryker-mutator/core": "10.1.1",
|
|
46
|
+
"@stryker-mutator/typescript-checker": "10.1.1",
|
|
47
|
+
"@stryker-mutator/vitest-runner": "10.1.1",
|
|
43
48
|
"@types/node": "24.19.2",
|
|
44
|
-
"eslint": "10.
|
|
49
|
+
"eslint": "10.14.0",
|
|
45
50
|
"fast-check": "4.10.2",
|
|
46
51
|
"prettier": "3.9.10",
|
|
47
52
|
"typescript": "npm:@typescript/typescript6@6.0.2",
|
|
48
|
-
"typescript-eslint": "8.
|
|
49
|
-
"vitest": "5.0
|
|
53
|
+
"typescript-eslint": "8.72.1",
|
|
54
|
+
"vitest": "5.1.0"
|
|
50
55
|
},
|
|
51
56
|
"publishConfig": {
|
|
52
57
|
"access": "public"
|
|
@@ -71,6 +76,7 @@
|
|
|
71
76
|
"files": [
|
|
72
77
|
"LICENSE",
|
|
73
78
|
"NOTICE",
|
|
79
|
+
"THIRD_PARTY_NOTICES.md",
|
|
74
80
|
"dist/",
|
|
75
81
|
"src/",
|
|
76
82
|
"!src/**/*.test.ts",
|
package/src/alias-chain.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Where an import or export chain leads in one project: from one symbol to each
|
|
3
3
|
* declaration of the target it is, and along the chain of aliases it heads to each
|
|
4
|
-
* declaration every link of that chain is.
|
|
4
|
+
* declaration every link of that chain is, and what a name resolves to through them.
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
import {
|
|
@@ -12,10 +12,11 @@ import {
|
|
|
12
12
|
isImportSpecifier,
|
|
13
13
|
isNamespaceExport,
|
|
14
14
|
isNamespaceImport,
|
|
15
|
+
type Node,
|
|
15
16
|
} from "@typescript/native/ast";
|
|
16
17
|
import { SymbolFlags, type Symbol as TSSymbol } from "@typescript/native/sync";
|
|
17
|
-
import {
|
|
18
|
-
import { UNANSWERED, type Answer } from "./query.ts";
|
|
18
|
+
import { isParameterProperty, nodeKey, type Inventory } from "./inventory.ts";
|
|
19
|
+
import { must, UNANSWERED, type Answer } from "./query.ts";
|
|
19
20
|
import type { ProjectView } from "./session.ts";
|
|
20
21
|
|
|
21
22
|
/** One declaration a chain reaches, and whether a step along an alias reached it. */
|
|
@@ -49,8 +50,6 @@ export interface AliasChains {
|
|
|
49
50
|
* link is declared.
|
|
50
51
|
*/
|
|
51
52
|
nextDeclared(symbol: TSSymbol): readonly ChainTarget[];
|
|
52
|
-
/** How many steps the compiler was asked for: one per alias, whatever the chains it heads. */
|
|
53
|
-
readonly steps: number;
|
|
54
53
|
}
|
|
55
54
|
|
|
56
55
|
/**
|
|
@@ -65,7 +64,6 @@ export function aliasChains<Brand>(project: ProjectView<Brand>, held: Inventory)
|
|
|
65
64
|
const ownFiles = project.ownPaths();
|
|
66
65
|
const steps = new Map<number, Answer<TSSymbol | undefined>>();
|
|
67
66
|
const chains = new Map<number, readonly ChainTarget[]>();
|
|
68
|
-
let asked = 0;
|
|
69
67
|
|
|
70
68
|
const declarationsOf = (symbol: TSSymbol): string[] => {
|
|
71
69
|
const ids: string[] = [];
|
|
@@ -102,7 +100,6 @@ export function aliasChains<Brand>(project: ProjectView<Brand>, held: Inventory)
|
|
|
102
100
|
return steps.get(symbol.id);
|
|
103
101
|
}
|
|
104
102
|
const next = project.aliasStepOf(symbol);
|
|
105
|
-
asked += 1;
|
|
106
103
|
steps.set(symbol.id, next);
|
|
107
104
|
return next;
|
|
108
105
|
};
|
|
@@ -132,7 +129,7 @@ export function aliasChains<Brand>(project: ProjectView<Brand>, held: Inventory)
|
|
|
132
129
|
names.add(node.expression.text);
|
|
133
130
|
}
|
|
134
131
|
}
|
|
135
|
-
const byName =
|
|
132
|
+
const byName = held.byName;
|
|
136
133
|
const ids = [...names].flatMap((name) => byName.get(name) ?? []);
|
|
137
134
|
return [...new Set([...ids, ...(module ? files : [])])].map((id) => ({
|
|
138
135
|
id,
|
|
@@ -197,8 +194,40 @@ export function aliasChains<Brand>(project: ProjectView<Brand>, held: Inventory)
|
|
|
197
194
|
declarationsOf,
|
|
198
195
|
chainOf,
|
|
199
196
|
nextDeclared,
|
|
200
|
-
get steps() {
|
|
201
|
-
return asked;
|
|
202
|
-
},
|
|
203
197
|
};
|
|
204
198
|
}
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* What each of a batch of nodes resolves to, every alias followed to the declaration
|
|
202
|
+
* it stands for. A node the checker resolves to nothing, and an alias that resolves
|
|
203
|
+
* to nothing, are absent from the answer. Each alias is followed once. A question the
|
|
204
|
+
* checker does not answer stops the pass, as {@link must} stops.
|
|
205
|
+
*/
|
|
206
|
+
export function resolvedTargets<Brand>(
|
|
207
|
+
project: ProjectView<Brand>,
|
|
208
|
+
nodes: readonly Node[],
|
|
209
|
+
): ReadonlyMap<Node, TSSymbol> {
|
|
210
|
+
const followed = new Map<number, TSSymbol | undefined>();
|
|
211
|
+
const targets = new Map<Node, TSSymbol>();
|
|
212
|
+
project
|
|
213
|
+
.symbolsAt(nodes.map((node) => project.handle(node)))
|
|
214
|
+
.map(must)
|
|
215
|
+
.forEach((symbol, index) => {
|
|
216
|
+
const node = nodes[index];
|
|
217
|
+
if (symbol === undefined || node === undefined) {
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
let target: TSSymbol | undefined = symbol;
|
|
221
|
+
if ((symbol.flags & SymbolFlags.Alias) !== 0) {
|
|
222
|
+
if (!followed.has(symbol.id)) {
|
|
223
|
+
const aliased = must(project.queries.aliased(symbol));
|
|
224
|
+
followed.set(symbol.id, aliased.declarations.length === 0 ? undefined : aliased);
|
|
225
|
+
}
|
|
226
|
+
target = followed.get(symbol.id);
|
|
227
|
+
}
|
|
228
|
+
if (target !== undefined) {
|
|
229
|
+
targets.set(node, target);
|
|
230
|
+
}
|
|
231
|
+
});
|
|
232
|
+
return targets;
|
|
233
|
+
}
|