@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
package/dist/src/exempt.js
DELETED
|
@@ -1,209 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The exemption framework: the classes of reason for which a declaration the reference
|
|
3
|
-
* graph alone would report is live all the same. A class is policy over what one
|
|
4
|
-
* project's checker answers, and its detector names the declarations it holds back;
|
|
5
|
-
* this module runs the detectors, decides which of their records stand, and answers
|
|
6
|
-
* which records held something back. It names no class's detector: the composition
|
|
7
|
-
* hands it the table of the classes it has.
|
|
8
|
-
*/
|
|
9
|
-
import { ConfigError } from "./config.js";
|
|
10
|
-
import { EXEMPTION_CLASSES, isExemptionClass, TS_EXEMPTION_CLASSES, typescriptVisibilityOf, } from "./exempt-classes.js";
|
|
11
|
-
import { byPosition, positionKey } from "./position.js";
|
|
12
|
-
import { Unanswerable } from "./query.js";
|
|
13
|
-
import { sweep } from "./sweep.js";
|
|
14
|
-
/**
|
|
15
|
-
* The classes `exemptions.disabled` switches off. A name is refused unless the
|
|
16
|
-
* vocabulary holds it; a class that runs on another language only is admitted and
|
|
17
|
-
* switches nothing off here, so one configuration serves every analyzer.
|
|
18
|
-
*/
|
|
19
|
-
export function disabledClasses(config) {
|
|
20
|
-
const disabled = new Set();
|
|
21
|
-
for (const name of config.exemptionsDisabled) {
|
|
22
|
-
if (!isExemptionClass(name)) {
|
|
23
|
-
const known = EXEMPTION_CLASSES.map((row) => row.class).join(", ");
|
|
24
|
-
throw new ConfigError("malformed", "exemptions.disabled", `exemptions.disabled: ${JSON.stringify(name)} is not an exemption class: the classes are ${known}`);
|
|
25
|
-
}
|
|
26
|
-
disabled.add(name);
|
|
27
|
-
}
|
|
28
|
-
return disabled;
|
|
29
|
-
}
|
|
30
|
-
/**
|
|
31
|
-
* Whether a class whose row states `allowed` may retain a member of one visibility. A
|
|
32
|
-
* declaration the inventory does not hold has no visibility to refuse it by.
|
|
33
|
-
*/
|
|
34
|
-
function retainable(allowed, visibility) {
|
|
35
|
-
if (visibility === "private") {
|
|
36
|
-
return allowed.private;
|
|
37
|
-
}
|
|
38
|
-
if (visibility === "private-name") {
|
|
39
|
-
return allowed.privateName;
|
|
40
|
-
}
|
|
41
|
-
return true;
|
|
42
|
-
}
|
|
43
|
-
/**
|
|
44
|
-
* The kinds of declaration each class can hold back, which a detector that stops holds
|
|
45
|
-
* back whole. A class with no row here holds back every declaration but a file.
|
|
46
|
-
*/
|
|
47
|
-
const RETAINABLE = new Map([
|
|
48
|
-
["interface-satisfaction", new Set(["method", "class-member"])],
|
|
49
|
-
["enum-group", new Set(["enum-member"])],
|
|
50
|
-
["injection-container", new Set(["method", "class-member"])],
|
|
51
|
-
["framework-lifecycle", new Set(["method", "class-member"])],
|
|
52
|
-
[
|
|
53
|
-
"serialization-contract",
|
|
54
|
-
new Set(["method", "class-member", "interface-method", "type-member"]),
|
|
55
|
-
],
|
|
56
|
-
]);
|
|
57
|
-
/** The detail of a record a detector that could not finish holds. */
|
|
58
|
-
const UNANSWERED_DETAIL = "kept live by a question the checker did not answer";
|
|
59
|
-
/** Whether one record is held by a detector that could not finish. */
|
|
60
|
-
export function isUnansweredRecord(record) {
|
|
61
|
-
return record.detail === UNANSWERED_DETAIL;
|
|
62
|
-
}
|
|
63
|
-
/**
|
|
64
|
-
* What one detector holds back over one project. A detector that stops because the
|
|
65
|
-
* checker left a question it needs unanswered holds back every declaration of the
|
|
66
|
-
* project its class could hold back, each recorded at its own position, so the gap
|
|
67
|
-
* never yields a finding.
|
|
68
|
-
*/
|
|
69
|
-
function detected(exemptionClass, detect, input) {
|
|
70
|
-
try {
|
|
71
|
-
return detect(input);
|
|
72
|
-
}
|
|
73
|
-
catch (error) {
|
|
74
|
-
if (!(error instanceof Unanswerable)) {
|
|
75
|
-
throw error;
|
|
76
|
-
}
|
|
77
|
-
const kinds = RETAINABLE.get(exemptionClass);
|
|
78
|
-
return input.held.symbols
|
|
79
|
-
.filter((symbol) => (kinds === undefined ? symbol.kind !== "file" : kinds.has(symbol.kind)))
|
|
80
|
-
.map((symbol) => ({ id: symbol.id, detail: UNANSWERED_DETAIL, site: symbol.position }));
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
/**
|
|
84
|
-
* Every record one project's detectors found, one per piece of evidence, before the
|
|
85
|
-
* mode decides which of them hold: what {@link heldRecords} reads. Classes run in the
|
|
86
|
-
* vocabulary's order and a switched-off class runs not at all; evidence on a private
|
|
87
|
-
* member the class's row says it cannot retain is dropped, whatever the detector found.
|
|
88
|
-
*/
|
|
89
|
-
export function evidenceRecords(input, detectors, disabled) {
|
|
90
|
-
const visibility = new Map(input.held.symbols.map((symbol) => [symbol.id, symbol.visibility]));
|
|
91
|
-
const found = [];
|
|
92
|
-
for (const exemptionClass of TS_EXEMPTION_CLASSES) {
|
|
93
|
-
const detect = detectors.get(exemptionClass);
|
|
94
|
-
if (detect === undefined || disabled.has(exemptionClass)) {
|
|
95
|
-
continue;
|
|
96
|
-
}
|
|
97
|
-
const allowed = typescriptVisibilityOf(exemptionClass);
|
|
98
|
-
for (const evidence of detected(exemptionClass, detect, input)) {
|
|
99
|
-
if (!retainable(allowed, visibility.get(evidence.id))) {
|
|
100
|
-
continue;
|
|
101
|
-
}
|
|
102
|
-
found.push({
|
|
103
|
-
id: evidence.id,
|
|
104
|
-
class: exemptionClass,
|
|
105
|
-
detail: evidence.detail,
|
|
106
|
-
site: evidence.site,
|
|
107
|
-
...(evidence.whileLive === undefined ? {} : { whileLive: evidence.whileLive }),
|
|
108
|
-
...(evidence.implementing === undefined ? {} : { implementing: evidence.implementing }),
|
|
109
|
-
});
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
return found;
|
|
113
|
-
}
|
|
114
|
-
/** The records that hold under one mode, beside the evidence a production mode found in a test file. */
|
|
115
|
-
export function heldRecords(records, holding) {
|
|
116
|
-
const found = [];
|
|
117
|
-
const inTestFiles = [];
|
|
118
|
-
for (const record of records) {
|
|
119
|
-
if (holding.mode.production && holding.testFiles.has(record.site.path)) {
|
|
120
|
-
inTestFiles.push(record);
|
|
121
|
-
}
|
|
122
|
-
else {
|
|
123
|
-
found.push(record);
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
return { records: exemptionsOf(found), inTestFiles };
|
|
127
|
-
}
|
|
128
|
-
/** Two strings ordered bytewise. */
|
|
129
|
-
function compare(a, b) {
|
|
130
|
-
if (a === b) {
|
|
131
|
-
return 0;
|
|
132
|
-
}
|
|
133
|
-
return a < b ? -1 : 1;
|
|
134
|
-
}
|
|
135
|
-
/**
|
|
136
|
-
* Records as a run holds them: ordered by site, then class, then declaration, and one
|
|
137
|
-
* per declaration, class, detail and file it holds while live, the one at the first
|
|
138
|
-
* site. A fact found at many sites, or by several projects, is one record.
|
|
139
|
-
*/
|
|
140
|
-
export function exemptionsOf(found) {
|
|
141
|
-
const ordered = [...found].sort((a, b) => byPosition(a.site, b.site) || compare(a.class, b.class) || compare(a.id, b.id));
|
|
142
|
-
const seen = new Set();
|
|
143
|
-
return ordered.filter((record) => {
|
|
144
|
-
const fact = [record.id, record.class, record.detail, record.whileLive ?? ""].join("\u0000");
|
|
145
|
-
if (seen.has(fact)) {
|
|
146
|
-
return false;
|
|
147
|
-
}
|
|
148
|
-
seen.add(fact);
|
|
149
|
-
return true;
|
|
150
|
-
});
|
|
151
|
-
}
|
|
152
|
-
/**
|
|
153
|
-
* The records that hold while the component files at `live` are live: every record that
|
|
154
|
-
* holds whatever is live, and each one a live file's markup holds, as a record of the run.
|
|
155
|
-
*/
|
|
156
|
-
export function holdingWhile(records, live) {
|
|
157
|
-
return exemptionsOf(records.flatMap(({ whileLive, ...record }) => whileLive === undefined || live.has(whileLive) ? [record] : []));
|
|
158
|
-
}
|
|
159
|
-
/** The records per declaration, each declaration's in the order given. */
|
|
160
|
-
function byDeclaration(records) {
|
|
161
|
-
const grouped = new Map();
|
|
162
|
-
for (const record of records) {
|
|
163
|
-
const held = grouped.get(record.id);
|
|
164
|
-
if (held === undefined) {
|
|
165
|
-
grouped.set(record.id, [record]);
|
|
166
|
-
}
|
|
167
|
-
else {
|
|
168
|
-
held.push(record);
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
return grouped;
|
|
172
|
-
}
|
|
173
|
-
/**
|
|
174
|
-
* The records that held back a declaration: one some configuration's graph, swept
|
|
175
|
-
* again with no exemption and its marks, judges a candidate, whatever another
|
|
176
|
-
* configuration answers, or one in `writeOnly`, which the run would report as written
|
|
177
|
-
* and never read without the record's read. A declaration a relation or a mark holds
|
|
178
|
-
* live in every configuration is held back by no record. The order is the
|
|
179
|
-
* declarations' site order, and for one declaration the input's.
|
|
180
|
-
*/
|
|
181
|
-
export function retainedIn(matrix, input, writeOnly = new Set()) {
|
|
182
|
-
const exempt = input.exempt ?? [];
|
|
183
|
-
if (exempt.length === 0) {
|
|
184
|
-
return [];
|
|
185
|
-
}
|
|
186
|
-
const bare = { marked: input.marked, mode: input.mode };
|
|
187
|
-
const dead = new Set(matrix.graphs.flatMap((graph) => sweep(graph, bare).candidates.map((candidate) => candidate.id)));
|
|
188
|
-
const held = byDeclaration(exempt.filter((record) => dead.has(record.id) || writeOnly.has(record.id)));
|
|
189
|
-
return matrix.union.symbols.flatMap((symbol) => held.get(symbol.id) ?? []);
|
|
190
|
-
}
|
|
191
|
-
/**
|
|
192
|
-
* One line per held-back declaration, in site order: its reference, then each record's
|
|
193
|
-
* class, site and detail, all separated by tabs.
|
|
194
|
-
*/
|
|
195
|
-
export function retainedLines(symbols, retained) {
|
|
196
|
-
const held = byDeclaration(retained);
|
|
197
|
-
return symbols.flatMap((symbol) => {
|
|
198
|
-
const records = held.get(symbol.id);
|
|
199
|
-
if (records === undefined) {
|
|
200
|
-
return [];
|
|
201
|
-
}
|
|
202
|
-
const fields = records.flatMap((record) => [
|
|
203
|
-
record.class,
|
|
204
|
-
positionKey(record.site),
|
|
205
|
-
record.detail,
|
|
206
|
-
]);
|
|
207
|
-
return [[symbol.ref, ...fields].join("\t")];
|
|
208
|
-
});
|
|
209
|
-
}
|
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The generated-file class on TypeScript: every declaration in a file that marks itself
|
|
3
|
-
* generated, or below a directory an applied convention row names as generated, is
|
|
4
|
-
* retained, because a generator owns the file and a deletion there is undone at the next
|
|
5
|
-
* generation.
|
|
6
|
-
*/
|
|
7
|
-
/** The generated-code header, matched against each line of a leading comment. */
|
|
8
|
-
const HEADER_LINE = /^\/\/ Code generated .* DO NOT EDIT\.$/u;
|
|
9
|
-
/** The documentation tag `@generated` as a word of a comment. */
|
|
10
|
-
const GENERATED_TAG = /(?<![\w@$])@generated(?![\w$-])/u;
|
|
11
|
-
/** A first comment naming the tool that wrote the file. */
|
|
12
|
-
const GENERATED_BY = /^\/\/ Generated by \S/u;
|
|
13
|
-
/** The word a generator's notice holds, beside one of {@link KEEP_OUT}. */
|
|
14
|
-
const GENERATED_WORD = /\bgenerated\b/iu;
|
|
15
|
-
/** The phrases a generator's notice asks a reader not to edit the file by. */
|
|
16
|
-
const KEEP_OUT = /\b(?:do not edit|will be overwritten|should not make any changes)\b/iu;
|
|
17
|
-
/** The comments before a text's first token, a leading hashbang line skipped. */
|
|
18
|
-
function leadingComments(text) {
|
|
19
|
-
const comments = [];
|
|
20
|
-
let at = text.startsWith("\uFEFF") ? 1 : 0;
|
|
21
|
-
if (text.startsWith("#!", at)) {
|
|
22
|
-
const end = text.indexOf("\n", at);
|
|
23
|
-
at = end === -1 ? text.length : end + 1;
|
|
24
|
-
}
|
|
25
|
-
for (;;) {
|
|
26
|
-
while (at < text.length && /\s/u.test(text.charAt(at))) {
|
|
27
|
-
at++;
|
|
28
|
-
}
|
|
29
|
-
if (text.startsWith("//", at)) {
|
|
30
|
-
const end = text.slice(at).search(/[\r\n\u2028\u2029]/u);
|
|
31
|
-
const stop = end === -1 ? text.length : at + end;
|
|
32
|
-
comments.push(text.slice(at, stop));
|
|
33
|
-
at = stop;
|
|
34
|
-
}
|
|
35
|
-
else if (text.startsWith("/*", at)) {
|
|
36
|
-
const end = text.indexOf("*/", at + 2);
|
|
37
|
-
if (end === -1) {
|
|
38
|
-
return comments;
|
|
39
|
-
}
|
|
40
|
-
comments.push(text.slice(at, end + 2));
|
|
41
|
-
at = end + 2;
|
|
42
|
-
}
|
|
43
|
-
else {
|
|
44
|
-
return comments;
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
/** The detail a file's leading comments mark it generated by, or undefined where they mark nothing. */
|
|
49
|
-
export function generatedByComment(text) {
|
|
50
|
-
const comments = leadingComments(text);
|
|
51
|
-
if (comments.some((one) => one.split(/\r?\n/u).some((line) => HEADER_LINE.test(line)))) {
|
|
52
|
-
return "generated by the header line its leading comments hold";
|
|
53
|
-
}
|
|
54
|
-
if (comments.some((one) => GENERATED_TAG.test(one))) {
|
|
55
|
-
return "generated by the @generated tag its leading comments hold";
|
|
56
|
-
}
|
|
57
|
-
const notice = comments.join("\n");
|
|
58
|
-
if (GENERATED_BY.test(comments[0] ?? "") ||
|
|
59
|
-
(GENERATED_WORD.test(notice) && KEEP_OUT.test(notice))) {
|
|
60
|
-
return "generated by the notice its leading comments hold";
|
|
61
|
-
}
|
|
62
|
-
return undefined;
|
|
63
|
-
}
|
|
64
|
-
/**
|
|
65
|
-
* Every own file of one project that is generated, by its path below the target root,
|
|
66
|
-
* with the detail a retention in it names: its leading comments' mark, else the row
|
|
67
|
-
* naming its directory as generated.
|
|
68
|
-
*/
|
|
69
|
-
export function generatedFilesOf(files, byRow) {
|
|
70
|
-
const found = new Map();
|
|
71
|
-
for (const [path, file] of files.byPath) {
|
|
72
|
-
const row = byRow.get(path);
|
|
73
|
-
const detail = generatedByComment(file.text) ??
|
|
74
|
-
(row === undefined
|
|
75
|
-
? undefined
|
|
76
|
-
: `generated below a directory the convention row ${row} names`);
|
|
77
|
-
if (detail !== undefined) {
|
|
78
|
-
found.set(path, detail);
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
return found;
|
|
82
|
-
}
|
|
83
|
-
/** The generated-file detector, recording each file's first line. */
|
|
84
|
-
export function generatedFile(input) {
|
|
85
|
-
const generated = input.generated;
|
|
86
|
-
if (generated === undefined || generated.size === 0) {
|
|
87
|
-
return [];
|
|
88
|
-
}
|
|
89
|
-
return input.held.symbols.flatMap((symbol) => {
|
|
90
|
-
const detail = generated.get(symbol.position.path);
|
|
91
|
-
return symbol.kind === "file" || detail === undefined
|
|
92
|
-
? []
|
|
93
|
-
: [{ id: symbol.id, detail, site: { path: symbol.position.path, line: 1, column: 1 } }];
|
|
94
|
-
});
|
|
95
|
-
}
|
package/dist/src/glob.js
DELETED
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Glob patterns over the paths of the target's own files, as the configuration
|
|
3
|
-
* writes them. Both `ts.test_files` and `ts.entry_files` name files this way, and
|
|
4
|
-
* one grammar answers for both.
|
|
5
|
-
*
|
|
6
|
-
* A configured root is not written in this grammar. It names a symbol reference
|
|
7
|
-
* rather than a path, `*` there spans the solidus and a brace list means nothing,
|
|
8
|
-
* so that rule is written where it is read.
|
|
9
|
-
*/
|
|
10
|
-
/**
|
|
11
|
-
* One literal run of a pattern, with every character the expression syntax claims
|
|
12
|
-
* escaped.
|
|
13
|
-
*
|
|
14
|
-
* The set is the syntax characters and the solidus, and it is closed: an escape of any
|
|
15
|
-
* other character is refused outright by the expression syntax under the unicode flag,
|
|
16
|
-
* so escaping a hyphen, which needs none outside a character class, would refuse every
|
|
17
|
-
* pattern that names a hyphenated path.
|
|
18
|
-
*/
|
|
19
|
-
function quoted(text) {
|
|
20
|
-
return text.replaceAll(/[.*+?^${}()|[\]\\/]/gu, (character) => `\\${character}`);
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* The expression one glob pattern denotes. `**` spans path separators while `*` and `?`
|
|
24
|
-
* do not, a brace list is an alternation of its members, and every other character
|
|
25
|
-
* stands for itself.
|
|
26
|
-
*/
|
|
27
|
-
export function globExpression(pattern) {
|
|
28
|
-
let source = "^";
|
|
29
|
-
let at = 0;
|
|
30
|
-
while (at < pattern.length) {
|
|
31
|
-
const rest = pattern.slice(at);
|
|
32
|
-
if (rest.startsWith("**/")) {
|
|
33
|
-
source += "(?:[^/]*/)*";
|
|
34
|
-
at += 3;
|
|
35
|
-
continue;
|
|
36
|
-
}
|
|
37
|
-
if (rest.startsWith("**")) {
|
|
38
|
-
source += ".*";
|
|
39
|
-
at += 2;
|
|
40
|
-
continue;
|
|
41
|
-
}
|
|
42
|
-
const character = pattern[at] ?? "";
|
|
43
|
-
at += 1;
|
|
44
|
-
if (character === "*") {
|
|
45
|
-
source += "[^/]*";
|
|
46
|
-
continue;
|
|
47
|
-
}
|
|
48
|
-
if (character === "?") {
|
|
49
|
-
source += "[^/]";
|
|
50
|
-
continue;
|
|
51
|
-
}
|
|
52
|
-
if (character === "{") {
|
|
53
|
-
const close = pattern.indexOf("}", at);
|
|
54
|
-
if (close < 0) {
|
|
55
|
-
source += "\\{";
|
|
56
|
-
continue;
|
|
57
|
-
}
|
|
58
|
-
source += `(?:${pattern.slice(at, close).split(",").map(quoted).join("|")})`;
|
|
59
|
-
at = close + 1;
|
|
60
|
-
continue;
|
|
61
|
-
}
|
|
62
|
-
source += quoted(character);
|
|
63
|
-
}
|
|
64
|
-
return new RegExp(`${source}$`, "u");
|
|
65
|
-
}
|
package/dist/src/manifest.js
DELETED
|
@@ -1,165 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The entry points a package manifest names, which are roots because something
|
|
3
|
-
* outside the analyzed program reaches them: a consumer importing the package, or a
|
|
4
|
-
* shell running its command or one of its scripts. {@link readManifest} reads one
|
|
5
|
-
* directory's manifest, {@link packageEntries} those of the packages below the target root.
|
|
6
|
-
*/
|
|
7
|
-
import { isAbsolutePath, joinPath, relativePath, resolvePath } from "./paths.js";
|
|
8
|
-
/** The manifest's own name. */
|
|
9
|
-
const MANIFEST = "package.json";
|
|
10
|
-
/** The three members that name an entry point beside `exports` and `bin`. */
|
|
11
|
-
const LEGACY_MEMBERS = ["main", "module", "types"];
|
|
12
|
-
function isRecord(value) {
|
|
13
|
-
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
14
|
-
}
|
|
15
|
-
/**
|
|
16
|
-
* Whether one member's value names a file of this package rather than another
|
|
17
|
-
* package or a URL. A target written with no leading dot is a path too, which is
|
|
18
|
-
* how the members that preceded `exports` are written.
|
|
19
|
-
*/
|
|
20
|
-
function isTarget(value, requireDot) {
|
|
21
|
-
if (value === "" || isAbsolutePath(value) || value.includes("://")) {
|
|
22
|
-
return false;
|
|
23
|
-
}
|
|
24
|
-
return !requireDot || value.startsWith("./");
|
|
25
|
-
}
|
|
26
|
-
/** Where a script's command line splits into tokens: white space and the shell's operators. */
|
|
27
|
-
const SCRIPT_SEPARATORS = /\s+|&&|\|\||;|\|/u;
|
|
28
|
-
/** A token written inside one pair of quotes. */
|
|
29
|
-
const QUOTED = /^(["'])(.*)\1$/su;
|
|
30
|
-
/**
|
|
31
|
-
* Every token one script's command line holds, each with one pair of enclosing quotes
|
|
32
|
-
* removed. A token holding a wildcard is a pattern rather than a path, and names no
|
|
33
|
-
* entry point.
|
|
34
|
-
*/
|
|
35
|
-
export function scriptTokens(command) {
|
|
36
|
-
return command
|
|
37
|
-
.split(SCRIPT_SEPARATORS)
|
|
38
|
-
.map((token) => token.replace(QUOTED, "$2"))
|
|
39
|
-
.filter((token) => token !== "" && !token.includes("*"));
|
|
40
|
-
}
|
|
41
|
-
/** One member's spelling below another: `exports` then `exports["."]`. */
|
|
42
|
-
function below(member, key) {
|
|
43
|
-
return `${member}[${JSON.stringify(key)}]`;
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
* Every target one `exports` value carries, at the member each is written under.
|
|
47
|
-
*
|
|
48
|
-
* The value nests strings, subpath or condition objects and alternative arrays to
|
|
49
|
-
* any depth; a `null` blocks a subpath. Every level is walked, because each
|
|
50
|
-
* condition names its own entry file, and a key's meaning is never read.
|
|
51
|
-
*/
|
|
52
|
-
function exportTargets(value, member, found) {
|
|
53
|
-
if (typeof value === "string") {
|
|
54
|
-
if (isTarget(value, true)) {
|
|
55
|
-
found.push({ member, path: value, role: "import", published: true });
|
|
56
|
-
}
|
|
57
|
-
return;
|
|
58
|
-
}
|
|
59
|
-
if (Array.isArray(value)) {
|
|
60
|
-
value.forEach((alternative, index) => {
|
|
61
|
-
exportTargets(alternative, below(member, String(index)), found);
|
|
62
|
-
});
|
|
63
|
-
return;
|
|
64
|
-
}
|
|
65
|
-
if (!isRecord(value)) {
|
|
66
|
-
return;
|
|
67
|
-
}
|
|
68
|
-
for (const [key, held] of Object.entries(value)) {
|
|
69
|
-
exportTargets(held, below(member, key), found);
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
/** The manifest at the target root, decoded, or undefined where there is none to read. */
|
|
73
|
-
function manifestOf(host, targetRoot) {
|
|
74
|
-
let text;
|
|
75
|
-
try {
|
|
76
|
-
text = host.readFile(joinPath(targetRoot, MANIFEST));
|
|
77
|
-
}
|
|
78
|
-
catch {
|
|
79
|
-
return undefined;
|
|
80
|
-
}
|
|
81
|
-
let value;
|
|
82
|
-
try {
|
|
83
|
-
value = JSON.parse(text);
|
|
84
|
-
}
|
|
85
|
-
catch {
|
|
86
|
-
// A manifest this program cannot read names no entry point, which is the same
|
|
87
|
-
// answer as an absent one. What a manifest's contents say is not refused here:
|
|
88
|
-
// the package manager owns that refusal, and an analysis of a tree it rejects
|
|
89
|
-
// is not the run's subject.
|
|
90
|
-
return undefined;
|
|
91
|
-
}
|
|
92
|
-
return isRecord(value) ? value : undefined;
|
|
93
|
-
}
|
|
94
|
-
/**
|
|
95
|
-
* What the manifest in `targetRoot` declares about where its package is entered.
|
|
96
|
-
*
|
|
97
|
-
* A target is taken as written. It is not resolved to a source file here, because
|
|
98
|
-
* which file a target names is a fact about the compiler configuration that emits
|
|
99
|
-
* it and there is one such configuration per project, while there is one manifest.
|
|
100
|
-
*/
|
|
101
|
-
export function readManifest(host, targetRoot) {
|
|
102
|
-
const manifest = manifestOf(host, targetRoot);
|
|
103
|
-
if (manifest === undefined) {
|
|
104
|
-
return { entries: [], declaresExports: false };
|
|
105
|
-
}
|
|
106
|
-
const found = [];
|
|
107
|
-
for (const member of LEGACY_MEMBERS) {
|
|
108
|
-
const value = manifest[member];
|
|
109
|
-
if (typeof value === "string" && isTarget(value, false)) {
|
|
110
|
-
found.push({ member, path: value, role: "import", published: true });
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
const bin = manifest["bin"];
|
|
114
|
-
if (typeof bin === "string" && isTarget(bin, false)) {
|
|
115
|
-
found.push({ member: "bin", path: bin, role: "run", published: false });
|
|
116
|
-
}
|
|
117
|
-
else if (isRecord(bin)) {
|
|
118
|
-
for (const [command, value] of Object.entries(bin)) {
|
|
119
|
-
if (typeof value === "string" && isTarget(value, false)) {
|
|
120
|
-
found.push({ member: below("bin", command), path: value, role: "run", published: false });
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
exportTargets(manifest["exports"], "exports", found);
|
|
125
|
-
const scripts = manifest["scripts"];
|
|
126
|
-
if (isRecord(scripts)) {
|
|
127
|
-
for (const [name, command] of Object.entries(scripts)) {
|
|
128
|
-
if (typeof command !== "string") {
|
|
129
|
-
continue;
|
|
130
|
-
}
|
|
131
|
-
for (const token of new Set(scriptTokens(command))) {
|
|
132
|
-
found.push({
|
|
133
|
-
member: below("scripts", name),
|
|
134
|
-
path: token,
|
|
135
|
-
role: "script",
|
|
136
|
-
published: false,
|
|
137
|
-
});
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
return {
|
|
142
|
-
entries: found.map((entry) => ({
|
|
143
|
-
...entry,
|
|
144
|
-
path: resolvePath(targetRoot, entry.path),
|
|
145
|
-
dir: targetRoot,
|
|
146
|
-
})),
|
|
147
|
-
declaresExports: manifest["exports"] !== undefined,
|
|
148
|
-
};
|
|
149
|
-
}
|
|
150
|
-
/**
|
|
151
|
-
* The entry points the manifests of the nested packages in `dirs` name. Each entry is
|
|
152
|
-
* spelled under its manifest's path below the target root, and is published by its own
|
|
153
|
-
* manifest's rule, as the target's own entries are.
|
|
154
|
-
*/
|
|
155
|
-
export function packageEntries(host, targetRoot, dirs) {
|
|
156
|
-
return dirs.flatMap((dir) => {
|
|
157
|
-
const manifest = readManifest(host, dir);
|
|
158
|
-
const where = `${relativePath(targetRoot, dir) ?? dir}/${MANIFEST}`;
|
|
159
|
-
return manifest.entries.map((entry) => ({
|
|
160
|
-
...entry,
|
|
161
|
-
member: `${where} ${entry.member}`,
|
|
162
|
-
published: entry.published && (!manifest.declaresExports || entry.member.startsWith("exports")),
|
|
163
|
-
}));
|
|
164
|
-
});
|
|
165
|
-
}
|