@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,36 +1,36 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { CONTRACT_VERSION, EXIT_CLEAN } from "../contract/contract.generated.js";
|
|
2
|
+
import { productionMode, runAnalysis, runBaselineWrite, unansweredCounts, } from "../analysis.js";
|
|
3
|
+
import { kindOf } from "../config.js";
|
|
3
4
|
import { CONFORMANCE, DECLARED_GAPS } from "../conformance.js";
|
|
4
|
-
import { moduleIdentity } from "../consumers.js";
|
|
5
5
|
import { analyzerProvenance, verdictOf } from "../findings-pass.js";
|
|
6
|
-
import {
|
|
6
|
+
import { factsDocument } from "../facts.js";
|
|
7
|
+
import { dirnamePath, joinPath, normalizePath, relativePath, resolvePath } from "../paths.js";
|
|
8
|
+
import { moduleIdentity } from "../load/discover.js";
|
|
7
9
|
import { partialNotes } from "../partial.js";
|
|
8
|
-
import { buildReport,
|
|
10
|
+
import { buildReport, capFindings, sortFindings, } from "../report.js";
|
|
11
|
+
import { reportRefusals } from "../report-schema.js";
|
|
9
12
|
import { json } from "../reporters/json.js";
|
|
10
13
|
import { RENDERINGS } from "../reporters/reporters.js";
|
|
11
14
|
import { parseTemplate, TemplateError } from "../reporters/template.js";
|
|
12
15
|
import { resolve } from "../resolve.js";
|
|
13
16
|
import { otherSchemeRows, rowReason, writeBaseline } from "../suppress-file.js";
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
17
|
+
import {} from "./verb.js";
|
|
18
|
+
import { UsageError } from "../usage.js";
|
|
19
|
+
import { bytewise } from "../text/compare.js";
|
|
20
|
+
import { productFault, failureExit } from "../failure.js";
|
|
21
|
+
import { diagnose, message } from "../product.js";
|
|
22
|
+
import { ownVersion } from "./version.js";
|
|
16
23
|
/** The options `analyze` takes beside the ones every verb takes. */
|
|
17
24
|
export const ANALYZE_OPTIONS = {
|
|
18
|
-
plain: ["report", "baseline-write", "exit-code", "template"],
|
|
25
|
+
plain: ["report", "facts", "baseline-write", "exit-code", "template"],
|
|
19
26
|
repeatable: ["format"],
|
|
20
27
|
};
|
|
21
28
|
/** The two values `--exit-code` takes; on, the default, puts the run's verdict in the exit code. */
|
|
22
29
|
const EXIT_CODE_ON = "on";
|
|
23
30
|
const EXIT_CODE_OFF = "off";
|
|
24
|
-
/** A path of the run no report can name, which ends the run with the failure code. */
|
|
25
|
-
class ReportPathError extends Error {
|
|
26
|
-
constructor(message) {
|
|
27
|
-
super(message);
|
|
28
|
-
this.name = "ReportPathError";
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
31
|
/** The formats this analyzer renders, for a message that names them. */
|
|
32
32
|
function formatNames() {
|
|
33
|
-
return [...RENDERINGS.keys()].sort().join(", ");
|
|
33
|
+
return [...RENDERINGS.keys()].sort(bytewise).join(", ");
|
|
34
34
|
}
|
|
35
35
|
/** The renderings one invocation writes: the ones it named, else the configuration's. */
|
|
36
36
|
function formatsOf(named, configured) {
|
|
@@ -38,10 +38,10 @@ function formatsOf(named, configured) {
|
|
|
38
38
|
const seen = new Set();
|
|
39
39
|
for (const format of formats) {
|
|
40
40
|
if (!RENDERINGS.has(format)) {
|
|
41
|
-
throw new
|
|
41
|
+
throw new UsageError(`${JSON.stringify(format)} is not a format this analyzer renders: the formats are ${formatNames()}`);
|
|
42
42
|
}
|
|
43
43
|
if (seen.has(format)) {
|
|
44
|
-
throw new
|
|
44
|
+
throw new UsageError(`the format ${JSON.stringify(format)} is named twice`);
|
|
45
45
|
}
|
|
46
46
|
seen.add(format);
|
|
47
47
|
}
|
|
@@ -58,7 +58,7 @@ function runRelative(invoked, path) {
|
|
|
58
58
|
}
|
|
59
59
|
const below = relativePath(invoked, path);
|
|
60
60
|
if (below === undefined) {
|
|
61
|
-
throw
|
|
61
|
+
throw failureExit("unreportable-path", `a report names its target relative to the directory the run was invoked from, and ${invoked} does not contain ${path}: run from a directory that does`);
|
|
62
62
|
}
|
|
63
63
|
return below;
|
|
64
64
|
}
|
|
@@ -77,12 +77,76 @@ function unmappedNotes(entries, targetRoot) {
|
|
|
77
77
|
};
|
|
78
78
|
});
|
|
79
79
|
}
|
|
80
|
+
/**
|
|
81
|
+
* One note per load of a production file the run cannot resolve, each site once: a file
|
|
82
|
+
* it loads is a root the run does not see, so `ts.roots_complete` lifts no cap there.
|
|
83
|
+
*/
|
|
84
|
+
function unseenLoadNotes(loads) {
|
|
85
|
+
return [
|
|
86
|
+
...new Map(loads.map((load) => {
|
|
87
|
+
const { path, line, column } = load.position;
|
|
88
|
+
const site = `${path}:${String(line)}:${String(column)}`;
|
|
89
|
+
const note = {
|
|
90
|
+
kind: "computed-load",
|
|
91
|
+
path: dirnamePath(path),
|
|
92
|
+
message: `${site} loads a module by a computed path the analysis cannot resolve, so the configurations compiling it report what no root reaches at probable at most, whatever ts.roots_complete says`,
|
|
93
|
+
};
|
|
94
|
+
return [site, note];
|
|
95
|
+
})).values(),
|
|
96
|
+
];
|
|
97
|
+
}
|
|
98
|
+
/** One note per package whose command strings name files a configuration holds, naming every such file. */
|
|
99
|
+
function heldScriptNotes(held, targetRoot) {
|
|
100
|
+
const files = new Map();
|
|
101
|
+
const unwritten = new Set();
|
|
102
|
+
for (const one of held) {
|
|
103
|
+
files.set(one.dir, new Set([...(files.get(one.dir) ?? []), ...one.files]));
|
|
104
|
+
if (one.unwritten) {
|
|
105
|
+
unwritten.add(one.dir);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return [...files].map(([dir, paths]) => ({
|
|
109
|
+
kind: "unread-command",
|
|
110
|
+
path: relativePath(targetRoot, dir) ?? ".",
|
|
111
|
+
message: [
|
|
112
|
+
...(paths.size === 0
|
|
113
|
+
? []
|
|
114
|
+
: [
|
|
115
|
+
`commands the analysis does not read name ${[...paths].sort(bytewise).join(", ")}, so no finding is reported about ${paths.size === 1 ? "that file itself or the names it exports" : "those files themselves or the names they export"}`,
|
|
116
|
+
]),
|
|
117
|
+
...(unwritten.has(dir)
|
|
118
|
+
? [
|
|
119
|
+
"a command runs a file whose path no word of it writes, so a finding that a file of the package is never built or never imported is possible at most",
|
|
120
|
+
]
|
|
121
|
+
: []),
|
|
122
|
+
].join("; "),
|
|
123
|
+
}));
|
|
124
|
+
}
|
|
125
|
+
function unresolvedNotes(specifiers) {
|
|
126
|
+
return specifiers.map(({ specifier, position }) => ({
|
|
127
|
+
kind: "unresolved-specifier",
|
|
128
|
+
path: dirnamePath(position.path),
|
|
129
|
+
message: `${position.path}:${String(position.line)}:${String(position.column)} loads ${JSON.stringify(specifier)}, which resolves to no file, so it references nothing`,
|
|
130
|
+
}));
|
|
131
|
+
}
|
|
132
|
+
function unreadLine(input, targetRoot) {
|
|
133
|
+
switch (input.kind) {
|
|
134
|
+
case "manifest": {
|
|
135
|
+
const path = relativePath(targetRoot, input.manifest) ?? input.manifest;
|
|
136
|
+
return input.reason === undefined
|
|
137
|
+
? `${path} does not parse, so the manifest facts of the program formed for its package are unanswered: correct the manifest`
|
|
138
|
+
: `${path} cannot be read, so the manifest facts of the program formed for its package are unanswered: give the run read access to it: ${input.reason}`;
|
|
139
|
+
}
|
|
140
|
+
case "ignore-file":
|
|
141
|
+
return `${relativePath(targetRoot, input.path) ?? input.path} cannot be read, so the JavaScript files it would ignore are analyzed: ${input.reason}`;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
80
144
|
/** Each project the run dropped as a report names it, by its configuration file below the target. */
|
|
81
145
|
function notBuiltOf(dropped, targetRoot) {
|
|
82
146
|
return dropped.map((one) => {
|
|
83
147
|
const project = relativePath(targetRoot, one.configFile);
|
|
84
148
|
if (project === undefined) {
|
|
85
|
-
throw
|
|
149
|
+
throw failureExit("unreportable-path", `the project ${one.id} would be opened from ${one.configFile}, which is not below the target ${targetRoot}, so no report can name it: analyze a target that holds it`);
|
|
86
150
|
}
|
|
87
151
|
return { id: one.id, project, error: one.error };
|
|
88
152
|
});
|
|
@@ -92,11 +156,24 @@ function configurationsOf(projects, targetRoot) {
|
|
|
92
156
|
return projects.map((one) => {
|
|
93
157
|
const project = relativePath(targetRoot, one.configFile);
|
|
94
158
|
if (project === undefined) {
|
|
95
|
-
throw
|
|
159
|
+
throw failureExit("unreportable-path", `the project ${one.id} is opened from ${one.configFile}, which is not below the target ${targetRoot}, so no report can name it: analyze a target that holds it`);
|
|
96
160
|
}
|
|
97
161
|
return { id: one.id, project };
|
|
98
162
|
});
|
|
99
163
|
}
|
|
164
|
+
/**
|
|
165
|
+
* Writes one document the run was asked for. A document that cannot be produced or written
|
|
166
|
+
* ends the run with the run failure that names it and `fix`, the documents written before it
|
|
167
|
+
* kept.
|
|
168
|
+
*/
|
|
169
|
+
function writeDocument(host, path, fix, produce) {
|
|
170
|
+
try {
|
|
171
|
+
host.writeDocument(path, produce());
|
|
172
|
+
}
|
|
173
|
+
catch (error) {
|
|
174
|
+
throw failureExit("unwritten-output", `${path}: ${message(error)}: ${fix}`);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
100
177
|
/** A count with its noun, so a message reads for one record as well as for several. */
|
|
101
178
|
function counted(n, noun) {
|
|
102
179
|
return `${String(n)} ${noun}${n === 1 ? "" : "s"}`;
|
|
@@ -109,7 +186,7 @@ function counted(n, noun) {
|
|
|
109
186
|
function templateOf(host, invoked, named, formats) {
|
|
110
187
|
if (named === undefined || named === "") {
|
|
111
188
|
if (formats.includes("template")) {
|
|
112
|
-
throw new
|
|
189
|
+
throw new UsageError("the template format renders the template --template names, and none was named");
|
|
113
190
|
}
|
|
114
191
|
return undefined;
|
|
115
192
|
}
|
|
@@ -118,7 +195,7 @@ function templateOf(host, invoked, named, formats) {
|
|
|
118
195
|
source = host.readFile(resolvePath(invoked, named));
|
|
119
196
|
}
|
|
120
197
|
catch (error) {
|
|
121
|
-
throw new
|
|
198
|
+
throw new UsageError(`--template=${named}: ${message(error)}`);
|
|
122
199
|
}
|
|
123
200
|
try {
|
|
124
201
|
return parseTemplate(source);
|
|
@@ -127,7 +204,7 @@ function templateOf(host, invoked, named, formats) {
|
|
|
127
204
|
if (!(error instanceof TemplateError)) {
|
|
128
205
|
throw error;
|
|
129
206
|
}
|
|
130
|
-
throw new
|
|
207
|
+
throw new UsageError(`--template=${named}: ${error.message}`);
|
|
131
208
|
}
|
|
132
209
|
}
|
|
133
210
|
/**
|
|
@@ -141,144 +218,134 @@ function templateOf(host, invoked, named, formats) {
|
|
|
141
218
|
export const analyzeVerb = ({ err, host, inputs, scope, openClient, option, repeated }) => {
|
|
142
219
|
const reportPath = option("report");
|
|
143
220
|
if (reportPath === undefined || reportPath === "") {
|
|
144
|
-
throw new
|
|
221
|
+
throw new UsageError("analyze writes its report to the path --report names, and no path was named");
|
|
145
222
|
}
|
|
146
223
|
const exitCode = option("exit-code") ?? EXIT_CODE_ON;
|
|
147
224
|
if (exitCode !== EXIT_CODE_ON && exitCode !== EXIT_CODE_OFF) {
|
|
148
|
-
throw new
|
|
225
|
+
throw new UsageError(`--exit-code=${JSON.stringify(exitCode)}: the values are ${EXIT_CODE_ON} and ${EXIT_CODE_OFF}`);
|
|
149
226
|
}
|
|
150
227
|
const { config, provenance } = resolve(inputs());
|
|
151
|
-
const kind = config.targetKind;
|
|
152
|
-
if (kind === "") {
|
|
153
|
-
throw new ConfigError("missing-target-kind", "target.kind", "target.kind is not set");
|
|
154
|
-
}
|
|
155
228
|
const invoked = host.workingDirectory();
|
|
156
229
|
const baseline = option("baseline-write");
|
|
230
|
+
const facts = option("facts");
|
|
231
|
+
if (facts === "") {
|
|
232
|
+
throw new UsageError("--facts names the path the facts document is written to, and named none");
|
|
233
|
+
}
|
|
157
234
|
const documents = {
|
|
158
235
|
report: resolvePath(invoked, reportPath),
|
|
236
|
+
facts: facts === undefined ? undefined : resolvePath(invoked, facts),
|
|
159
237
|
formats: formatsOf(repeated("format"), config.reporters.formats),
|
|
160
238
|
baseline: baseline === undefined ? undefined : resolvePath(invoked, baseline),
|
|
161
239
|
};
|
|
162
240
|
const template = templateOf(host, invoked, option("template"), documents.formats);
|
|
163
241
|
const scoped = scope();
|
|
164
242
|
const targetRoot = scoped.target.path;
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
243
|
+
const version = ownVersion(host);
|
|
244
|
+
let recorded;
|
|
245
|
+
const root = runRelative(invoked, targetRoot);
|
|
246
|
+
const mode = productionMode(config);
|
|
247
|
+
let analysis;
|
|
248
|
+
if (documents.baseline === undefined) {
|
|
249
|
+
analysis = runAnalysis(openClient(config), host, scoped, config, provenance, mode);
|
|
250
|
+
recorded = [];
|
|
168
251
|
}
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
252
|
+
else {
|
|
253
|
+
const reason = rowReason(analyzerProvenance(version));
|
|
254
|
+
const write = runBaselineWrite(openClient(config), host, scoped, config, provenance, mode, reason);
|
|
255
|
+
analysis = write.first;
|
|
256
|
+
recorded = write.rows;
|
|
172
257
|
}
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
})),
|
|
219
|
-
unavailable: [],
|
|
220
|
-
result,
|
|
221
|
-
testFileRules: run.testFileRules,
|
|
222
|
-
typeErrorSkips: run.typeErrorSkips,
|
|
223
|
-
unanswered: unansweredCounts(analysis),
|
|
224
|
-
conventionsApplied: run.conventionsApplied,
|
|
225
|
-
notes: unmappedNotes(run.unmappedEntries, resolvePath(invoked, targetRoot)),
|
|
226
|
-
});
|
|
227
|
-
report = capFindings(sortFindings(built, config.reporters.sort), config.reporters.maxFindings);
|
|
228
|
-
verdict = verdictOf(result, config);
|
|
258
|
+
const { result, run } = analysis;
|
|
259
|
+
const warnings = run.componentWarnings;
|
|
260
|
+
const unread = run.componentsUnread.map(({ configFile, reason }) => `${relativePath(resolvePath(invoked, targetRoot), configFile) ?? configFile}: its component files are not read: ${reason}`);
|
|
261
|
+
const unfound = run.librariesUnfound.map(({ configFile, error }) => `${relativePath(resolvePath(invoked, targetRoot), configFile) ?? configFile}: ${error}: the configuration is analyzed without that library`);
|
|
262
|
+
const unreadInputs = run.unread.map((one) => unreadLine(one, resolvePath(invoked, targetRoot)));
|
|
263
|
+
const partial = partialNotes({
|
|
264
|
+
notBuilt: run.notBuilt,
|
|
265
|
+
unanswered: run.unanswered,
|
|
266
|
+
targetRoot: resolvePath(invoked, targetRoot),
|
|
267
|
+
});
|
|
268
|
+
const built = buildReport({
|
|
269
|
+
contractVersion: CONTRACT_VERSION,
|
|
270
|
+
version,
|
|
271
|
+
conformance: CONFORMANCE,
|
|
272
|
+
declaredGaps: DECLARED_GAPS,
|
|
273
|
+
target: {
|
|
274
|
+
kind: kindOf(config.target.kind),
|
|
275
|
+
root,
|
|
276
|
+
identity: moduleIdentity(host, scoped.target),
|
|
277
|
+
},
|
|
278
|
+
configurations: configurationsOf(run.projects, targetRoot),
|
|
279
|
+
notBuilt: notBuiltOf(run.notBuilt, targetRoot),
|
|
280
|
+
loaded: run.consumers.map((consumer) => ({
|
|
281
|
+
id: consumer.id,
|
|
282
|
+
path: runRelative(invoked, consumer.path),
|
|
283
|
+
})),
|
|
284
|
+
unavailable: [],
|
|
285
|
+
result,
|
|
286
|
+
testFileRules: run.testFileRules,
|
|
287
|
+
typeErrorSkips: run.typeErrorSkips,
|
|
288
|
+
unanswered: unansweredCounts(analysis),
|
|
289
|
+
conventionsApplied: run.conventionsApplied,
|
|
290
|
+
listsComponents: config.reporters.cascade === "full",
|
|
291
|
+
notes: [
|
|
292
|
+
...unmappedNotes(run.unmappedEntries, resolvePath(invoked, targetRoot)),
|
|
293
|
+
...unseenLoadNotes(run.unseenLoads),
|
|
294
|
+
...unresolvedNotes(run.unresolvedSpecifiers),
|
|
295
|
+
...heldScriptNotes(run.heldScripts, resolvePath(invoked, targetRoot)),
|
|
296
|
+
],
|
|
297
|
+
});
|
|
298
|
+
const report = capFindings(sortFindings(built, config.reporters.sort), config.reporters.max_findings);
|
|
299
|
+
const verdict = verdictOf(result, config);
|
|
300
|
+
const [refused] = reportRefusals(report);
|
|
301
|
+
if (refused !== undefined) {
|
|
302
|
+
throw productFault(`built a report that breaks the report schema at ${refused.pointer || "the document"}: ${refused.keyword}: ${refused.reason}`);
|
|
229
303
|
}
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
304
|
+
writeDocument(host, documents.report, "name a path the run can write", () => json(report));
|
|
305
|
+
const factsPath = documents.facts;
|
|
306
|
+
if (factsPath !== undefined) {
|
|
307
|
+
writeDocument(host, factsPath, "name a path the run can write", () => [
|
|
308
|
+
factsDocument(version, run.generated, run.bindings),
|
|
309
|
+
]);
|
|
236
310
|
}
|
|
237
|
-
|
|
238
|
-
host.
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
const rendering = RENDERINGS.get(format);
|
|
246
|
-
if (rendering !== undefined) {
|
|
247
|
-
host.writeDocument(documents.report + rendering.suffix, rendering.render(report, options));
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
if (documents.baseline !== undefined) {
|
|
251
|
-
const kept = host.kindOf(documents.baseline) === "file"
|
|
252
|
-
? otherSchemeRows(host.readFile(documents.baseline))
|
|
253
|
-
: [];
|
|
254
|
-
host.writeDocument(documents.baseline, writeBaseline(recorded, analyzerProvenance(version), kept));
|
|
311
|
+
const options = {
|
|
312
|
+
readSource: (path) => host.readFile(joinPath(targetRoot, path)),
|
|
313
|
+
template,
|
|
314
|
+
};
|
|
315
|
+
for (const format of documents.formats) {
|
|
316
|
+
const rendering = RENDERINGS.get(format);
|
|
317
|
+
if (rendering !== undefined) {
|
|
318
|
+
writeDocument(host, documents.report + rendering.suffix, "name a path the run can write, or correct the template that renders it", () => rendering.render(report, options));
|
|
255
319
|
}
|
|
256
320
|
}
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
321
|
+
const baselinePath = documents.baseline;
|
|
322
|
+
if (baselinePath !== undefined) {
|
|
323
|
+
writeDocument(host, baselinePath, "name a path the run can write, or repair the rows of the baseline the run would keep", () => {
|
|
324
|
+
const kept = host.kindOf(baselinePath) === "file" ? otherSchemeRows(host.readFile(baselinePath)) : [];
|
|
325
|
+
return writeBaseline(recorded, analyzerProvenance(version), kept);
|
|
326
|
+
});
|
|
260
327
|
}
|
|
261
328
|
for (const note of partial) {
|
|
262
|
-
err
|
|
329
|
+
diagnose(err, note);
|
|
263
330
|
}
|
|
264
|
-
for (const line of [...unread, ...unfound]) {
|
|
265
|
-
err
|
|
331
|
+
for (const line of [...unread, ...unfound, ...unreadInputs]) {
|
|
332
|
+
diagnose(err, line);
|
|
266
333
|
}
|
|
267
334
|
for (const warning of warnings) {
|
|
268
|
-
err
|
|
335
|
+
diagnose(err, `${warning.path}:${String(warning.line)}: a <script> start tag that begins a line is not read as a block: ${warning.reason}`);
|
|
269
336
|
}
|
|
270
337
|
for (const skip of report.type_error_skips) {
|
|
271
|
-
err
|
|
338
|
+
diagnose(err, `${skip.path}:${String(skip.line)}: ${skip.message}: the function or statement holding this type error is not evaluated`);
|
|
272
339
|
}
|
|
273
340
|
if (report.totals.pending > 0) {
|
|
274
|
-
err
|
|
341
|
+
diagnose(err, `${counted(report.totals.pending, "pending finding")}: the report names a declared cross-language edge, and no merge has resolved it`);
|
|
275
342
|
}
|
|
276
343
|
if (report.totals.stale_suppressions > 0) {
|
|
277
|
-
err
|
|
344
|
+
diagnose(err, counted(report.totals.stale_suppressions, "stale suppression"));
|
|
278
345
|
}
|
|
279
346
|
if (exitCode === EXIT_CODE_OFF) {
|
|
280
347
|
if (verdict !== EXIT_CLEAN) {
|
|
281
|
-
err
|
|
348
|
+
diagnose(err, `the exit code is configured off: the verdict of this run is ${String(verdict)}`);
|
|
282
349
|
}
|
|
283
350
|
return EXIT_CLEAN;
|
|
284
351
|
}
|
|
@@ -1,19 +1,22 @@
|
|
|
1
|
+
import { CONTRACT_VERSION, EXIT_CLEAN, EXIT_USAGE, FACTS_VERSION, SCHEMA_VERSIONS, } from "../contract/contract.generated.js";
|
|
1
2
|
import { CONFORMANCE } from "../conformance.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
3
|
+
import {} from "./verb.js";
|
|
4
|
+
import { diagnose, LANGUAGE, PRODUCT } from "../product.js";
|
|
5
|
+
import { ownVersion } from "./version.js";
|
|
5
6
|
/**
|
|
6
7
|
* The document `describe` writes: the analyzer, the Contract version it implements, the
|
|
7
|
-
* report schema versions it reads, the languages it claims,
|
|
8
|
-
* the conformance corpus, a member the document omits where
|
|
8
|
+
* report schema versions it reads, the languages it claims, the facts version it writes,
|
|
9
|
+
* and its recorded result over the conformance corpus, a member the document omits where
|
|
10
|
+
* no run is recorded.
|
|
9
11
|
*/
|
|
10
12
|
export function describeDocument(version, recorded) {
|
|
11
13
|
const document = {
|
|
12
|
-
name:
|
|
14
|
+
name: PRODUCT,
|
|
13
15
|
version,
|
|
14
16
|
contract_version: CONTRACT_VERSION,
|
|
15
|
-
schema_versions_accepted:
|
|
17
|
+
schema_versions_accepted: SCHEMA_VERSIONS,
|
|
16
18
|
languages: [LANGUAGE],
|
|
19
|
+
facts_version_written: FACTS_VERSION,
|
|
17
20
|
...(recorded === undefined
|
|
18
21
|
? {}
|
|
19
22
|
: {
|
|
@@ -26,20 +29,12 @@ export function describeDocument(version, recorded) {
|
|
|
26
29
|
};
|
|
27
30
|
return `${JSON.stringify(document, null, 2)}\n`;
|
|
28
31
|
}
|
|
29
|
-
/** Writes this analyzer's description to the output stream
|
|
32
|
+
/** Writes this analyzer's description to the output stream. */
|
|
30
33
|
export const describeVerb = ({ out, err, host, args }) => {
|
|
31
34
|
if (args.length > 0) {
|
|
32
|
-
err
|
|
35
|
+
diagnose(err, `describe takes no argument, got ${JSON.stringify(args[0])}`);
|
|
33
36
|
return EXIT_USAGE;
|
|
34
37
|
}
|
|
35
|
-
|
|
36
|
-
try {
|
|
37
|
-
version = host.analyzerVersion();
|
|
38
|
-
}
|
|
39
|
-
catch (error) {
|
|
40
|
-
err.write(`deadset-ts: describe: ${error instanceof Error ? error.message : String(error)}\n`);
|
|
41
|
-
return EXIT_FAILURE;
|
|
42
|
-
}
|
|
43
|
-
out.write(describeDocument(version, CONFORMANCE));
|
|
38
|
+
out.write(describeDocument(ownVersion(host), CONFORMANCE));
|
|
44
39
|
return EXIT_CLEAN;
|
|
45
40
|
};
|