@cplieger/deadset-ts 8.0.0-dev.2 → 8.0.0-dev.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -1
- package/THIRD_PARTY_NOTICES.md +27 -0
- package/dist/bin/mapper-connection.js +2 -1
- package/dist/bin/node-host.js +24 -5
- package/dist/src/alias-chain.js +2 -7
- package/dist/src/amd.js +81 -0
- package/dist/src/analysis.js +269 -432
- package/dist/src/augmentations.js +64 -3
- package/dist/src/automatic-types.js +10 -29
- package/dist/src/bindings.js +382 -0
- package/dist/src/calls.js +279 -43
- package/dist/src/commands/held.js +499 -0
- package/dist/src/commands/read.js +161 -0
- package/dist/src/commands/shell.js +169 -0
- package/dist/src/commands/tools.js +1847 -0
- package/dist/src/component-files.js +3 -2
- package/dist/src/component-layer.js +4 -2
- package/dist/src/config.js +6 -82
- package/dist/src/conformance-record.js +1 -1
- package/dist/src/consumers.js +10 -38
- package/dist/src/contextual-uses.js +57 -26
- package/dist/src/contract/config.generated.js +561 -0
- package/dist/src/contract/contract.generated.js +1369 -0
- package/dist/src/contract/report.generated.js +866 -0
- package/dist/src/dependencies.js +164 -121
- package/dist/src/destructuring.js +1 -19
- package/dist/src/edges.js +38 -122
- package/dist/src/element-access.js +181 -168
- package/dist/src/entries/build-scripts.js +222 -0
- package/dist/src/{configuration-files.js → entries/configuration-files.js} +52 -256
- package/dist/src/{convention-rows.js → entries/convention-rows.js} +170 -30
- package/dist/src/entries/conventions.js +740 -0
- package/dist/src/{html-entries.js → entries/html-entries.js} +12 -42
- package/dist/src/{mdx-entries.js → entries/mdx-entries.js} +5 -28
- package/dist/src/entries/run-directories.js +77 -0
- package/dist/src/entries/sources.js +144 -0
- package/dist/src/entries/static-module.js +670 -0
- package/dist/src/entries/test-runners.js +650 -0
- package/dist/src/entries/workflow-steps.js +345 -0
- package/dist/src/enum-group.js +3 -10
- package/dist/src/erased-stores.js +4 -6
- package/dist/src/exempt-classes.js +1 -63
- package/dist/src/exempt.js +21 -66
- package/dist/src/exposure.js +400 -0
- package/dist/src/extensions.js +37 -0
- package/dist/src/facts.js +38 -0
- package/dist/src/failure.js +36 -0
- package/dist/src/file-facts.js +3 -26
- package/dist/src/findings/completion.js +109 -56
- package/dist/src/findings/dependencies-and-module-machinery.js +4 -5
- package/dist/src/findings/emitters.js +27 -41
- package/dist/src/{implementations.js → findings/implementations.js} +3 -3
- package/dist/src/{in-operands.js → findings/in-operands.js} +3 -2
- package/dist/src/findings/interfaces.js +4 -5
- package/dist/src/findings/intra-function.js +16 -13
- package/dist/src/findings/non-code-artifacts.js +17 -12
- package/dist/src/findings/reads-and-writes.js +86 -27
- package/dist/src/findings/self-check.js +44 -30
- package/dist/src/findings/unused-declarations.js +29 -45
- package/dist/src/findings/visibility-narrowing.js +23 -31
- package/dist/src/findings-pass.js +13 -21
- package/dist/src/framework-lifecycle.js +46 -19
- package/dist/src/fs/document.js +52 -0
- package/dist/src/fs/manifest.js +67 -0
- package/dist/src/fs/tree.js +88 -0
- package/dist/src/generated-file.js +174 -28
- package/dist/src/git-ignore.js +39 -26
- package/dist/src/import-bindings.js +73 -28
- package/dist/src/index/sites.js +557 -0
- package/dist/src/index.js +2 -2
- package/dist/src/indexed-access.js +523 -478
- package/dist/src/injection-container.js +2 -2
- package/dist/src/interface-satisfaction.js +1 -1
- package/dist/src/intra-function-parts.js +63 -43
- package/dist/src/inventory/commonjs.js +507 -0
- package/dist/src/inventory/enumerate.js +167 -0
- package/dist/src/inventory/syntax.js +236 -0
- package/dist/src/inventory.js +323 -724
- package/dist/src/javascript-file.js +48 -0
- package/dist/src/json-document.js +198 -67
- package/dist/src/keyof-comparisons.js +126 -107
- package/dist/src/kinds.js +3 -366
- package/dist/src/{components.js → liveness/components.js} +2 -3
- package/dist/src/{graph.js → liveness/graph.js} +52 -28
- package/dist/src/liveness/matrix.js +99 -0
- package/dist/src/liveness/sweep.js +558 -0
- package/dist/src/load/classify.js +289 -0
- package/dist/src/load/diagnostics.js +87 -0
- package/dist/src/load/discover.js +285 -0
- package/dist/src/{emit-map.js → load/emit-map.js} +1 -1
- package/dist/src/load/expected-module.js +136 -0
- package/dist/src/load/load.js +27 -0
- package/dist/src/load/module-lookup.js +37 -0
- package/dist/src/load/package-scope.js +56 -0
- package/dist/src/load/plan.js +313 -0
- package/dist/src/load/specifiers.js +113 -0
- package/dist/src/load/synthesize.js +152 -0
- package/dist/src/load/test-globals.js +207 -0
- package/dist/src/load/test-joins.js +82 -0
- package/dist/src/{workspace-manifests.js → load/workspace-manifests.js} +4 -4
- package/dist/src/{workspace-programs.js → load/workspace-programs.js} +89 -66
- package/dist/src/{workspace-resolution.js → load/workspace-resolution.js} +24 -66
- package/dist/src/{workspace-run.js → load/workspace-run.js} +7 -7
- package/dist/src/{workspace.js → load/workspace.js} +62 -124
- package/dist/src/module-declarations.js +70 -85
- package/dist/src/overrides.js +134 -112
- package/dist/src/partial.js +2 -1
- package/dist/src/paths.js +82 -16
- package/dist/src/platform-calls.js +78 -0
- package/dist/src/platform-symbols.js +134 -0
- package/dist/src/position.js +43 -1
- package/dist/src/print.js +11 -79
- package/dist/src/product.js +13 -0
- package/dist/src/query.js +47 -0
- package/dist/src/ref.js +12 -20
- package/dist/src/references/read-rule.js +1 -0
- package/dist/src/references/read-rules.js +48 -0
- package/dist/src/references/sink.js +237 -0
- package/dist/src/references/sources.js +450 -0
- package/dist/src/references.js +117 -1074
- package/dist/src/report-schema.js +51 -0
- package/dist/src/report.js +57 -41
- package/dist/src/reporters/annotations.js +15 -8
- package/dist/src/reporters/sarif.js +16 -10
- package/dist/src/reporters/template.js +4 -19
- package/dist/src/resolve.js +246 -730
- package/dist/src/{configured-declarations.js → roots/configured-declarations.js} +22 -24
- package/dist/src/{entry-point-gaps.js → roots/entry-point-gaps.js} +6 -15
- package/dist/src/roots/manifest.js +216 -0
- package/dist/src/roots/published-reach.js +412 -0
- package/dist/src/roots/root-set.js +487 -0
- package/dist/src/roots/unseen-loads.js +236 -0
- package/dist/src/run.js +66 -77
- package/dist/src/schema.js +320 -343
- package/dist/src/scope.js +38 -115
- package/dist/src/serialization-contract.js +601 -22
- package/dist/src/session.js +37 -29
- package/dist/src/source-files.js +6 -10
- package/dist/src/stores.js +4 -2
- package/dist/src/suppress-file.js +25 -28
- package/dist/src/suppress-inline.js +36 -83
- package/dist/src/suppress.js +50 -71
- package/dist/src/symbol-keys.js +92 -88
- package/dist/src/template-field.js +9 -19
- package/dist/src/tests/file-class.js +76 -0
- package/dist/src/{outside-tests.js → tests/outside.js} +7 -7
- package/dist/src/{test-support.js → tests/support.js} +5 -12
- package/dist/src/text/compare.js +26 -0
- package/dist/src/text/glob.js +194 -0
- package/dist/src/text/named-files.js +298 -0
- package/dist/src/text/yaml.js +684 -0
- package/dist/src/type-errors.js +11 -232
- package/dist/src/type-parameter-reads.js +178 -139
- package/dist/src/unimplemented-callees.js +262 -242
- package/dist/src/unwrap.js +23 -0
- package/dist/src/usage.js +10 -0
- package/dist/src/vendor/unbash/ansi-c.js +132 -0
- package/dist/src/vendor/unbash/arithmetic-parts.js +37 -0
- package/dist/src/vendor/unbash/arithmetic.js +591 -0
- package/dist/src/vendor/unbash/assignment.js +131 -0
- package/dist/src/vendor/unbash/chars.js +48 -0
- package/dist/src/vendor/unbash/command.js +41 -0
- package/dist/src/vendor/unbash/expansion.js +80 -0
- package/dist/src/vendor/unbash/glob.js +268 -0
- package/dist/src/vendor/unbash/heredoc.js +27 -0
- package/dist/src/vendor/unbash/internal-types.js +1 -0
- package/dist/src/vendor/unbash/lexer.js +4274 -0
- package/dist/src/vendor/unbash/limits.js +3 -0
- package/dist/src/vendor/unbash/parser.js +1366 -0
- package/dist/src/vendor/unbash/parts.js +57 -0
- package/dist/src/vendor/unbash/substitution-context.js +8 -0
- package/dist/src/vendor/unbash/traversal.js +212 -0
- package/dist/src/vendor/unbash/types.js +1 -0
- package/dist/src/vendor/unbash/word-value.js +61 -0
- package/dist/src/vendor/unbash/word.js +40 -0
- package/dist/src/verbs/analyze.js +194 -127
- package/dist/src/verbs/describe.js +13 -18
- package/dist/src/verbs/explain.js +85 -139
- package/dist/src/verbs/print-config.js +2 -1
- package/dist/src/verbs/print-projects.js +6 -4
- package/dist/src/verbs/print-retained.js +7 -5
- package/dist/src/verbs/print-roots.js +4 -2
- package/dist/src/verbs/verb.js +1 -5
- package/dist/src/verbs/version.js +14 -3
- package/jsr.json +2 -1
- package/package.json +14 -8
- package/src/alias-chain.ts +2 -9
- package/src/amd.ts +130 -0
- package/src/analysis.ts +424 -650
- package/src/augmentations.ts +93 -4
- package/src/automatic-types.ts +12 -30
- package/src/bindings.ts +460 -0
- package/src/calls.ts +338 -46
- package/src/commands/held.ts +632 -0
- package/src/commands/read.ts +242 -0
- package/src/commands/shell.ts +228 -0
- package/src/commands/tools.ts +2382 -0
- package/src/component-files.ts +4 -2
- package/src/component-layer.ts +4 -2
- package/src/config.ts +31 -302
- package/src/conformance-record.ts +1 -1
- package/src/consumers.ts +16 -66
- package/src/contextual-uses.ts +66 -34
- package/src/contract/config.generated.ts +821 -0
- package/src/contract/contract.generated.ts +1452 -0
- package/src/contract/report.generated.ts +1241 -0
- package/src/dependencies.ts +222 -127
- package/src/destructuring.ts +1 -31
- package/src/edges.ts +41 -140
- package/src/element-access.ts +190 -187
- package/src/entries/build-scripts.ts +292 -0
- package/src/{configuration-files.ts → entries/configuration-files.ts} +68 -278
- package/src/{convention-rows.ts → entries/convention-rows.ts} +227 -31
- package/src/{conventions.ts → entries/conventions.ts} +367 -583
- package/src/{html-entries.ts → entries/html-entries.ts} +22 -48
- package/src/{mdx-entries.ts → entries/mdx-entries.ts} +7 -30
- package/src/entries/run-directories.ts +108 -0
- package/src/entries/sources.ts +266 -0
- package/src/entries/static-module.ts +858 -0
- package/src/entries/test-runners.ts +835 -0
- package/src/entries/workflow-steps.ts +432 -0
- package/src/enum-group.ts +2 -11
- package/src/erased-stores.ts +3 -7
- package/src/exempt-classes.ts +1 -75
- package/src/exempt.ts +70 -98
- package/src/exposure.ts +492 -0
- package/src/extensions.ts +45 -0
- package/src/facts.ts +46 -0
- package/src/failure.ts +63 -0
- package/src/file-facts.ts +15 -25
- package/src/finding.ts +10 -10
- package/src/findings/boundary.ts +11 -0
- package/src/findings/completion.ts +133 -64
- package/src/findings/dependencies-and-module-machinery.ts +4 -7
- package/src/findings/emitter.ts +9 -10
- package/src/findings/emitters.ts +38 -52
- package/src/{implementations.ts → findings/implementations.ts} +4 -4
- package/src/{in-operands.ts → findings/in-operands.ts} +4 -3
- package/src/findings/interfaces.ts +7 -9
- package/src/findings/intra-function.ts +16 -14
- package/src/findings/non-code-artifacts.ts +24 -15
- package/src/findings/reads-and-writes.ts +118 -41
- package/src/findings/self-check.ts +51 -38
- package/src/findings/unused-declarations.ts +31 -49
- package/src/findings/visibility-narrowing.ts +36 -40
- package/src/findings-pass.ts +15 -31
- package/src/framework-lifecycle.ts +47 -19
- package/src/fs/document.ts +70 -0
- package/src/fs/manifest.ts +96 -0
- package/src/fs/tree.ts +110 -0
- package/src/generated-file.ts +242 -35
- package/src/git-ignore.ts +50 -26
- package/src/host.ts +12 -5
- package/src/import-bindings.ts +98 -29
- package/src/index/sites.ts +781 -0
- package/src/index.ts +2 -2
- package/src/indexed-access.ts +570 -527
- package/src/injection-container.ts +2 -2
- package/src/interface-satisfaction.ts +2 -2
- package/src/intra-function-parts.ts +73 -44
- package/src/inventory/commonjs.ts +696 -0
- package/src/inventory/enumerate.ts +203 -0
- package/src/inventory/syntax.ts +311 -0
- package/src/inventory.ts +442 -895
- package/src/javascript-file.ts +54 -0
- package/src/json-document.ts +241 -76
- package/src/keyof-comparisons.ts +133 -122
- package/src/kinds.ts +5 -413
- package/src/{components.ts → liveness/components.ts} +4 -6
- package/src/{graph.ts → liveness/graph.ts} +100 -35
- package/src/liveness/matrix.ts +162 -0
- package/src/liveness/sweep.ts +855 -0
- package/src/load/classify.ts +433 -0
- package/src/load/diagnostics.ts +154 -0
- package/src/load/discover.ts +471 -0
- package/src/{emit-map.ts → load/emit-map.ts} +1 -1
- package/src/load/expected-module.ts +194 -0
- package/src/load/load.ts +73 -0
- package/src/load/module-lookup.ts +50 -0
- package/src/load/package-scope.ts +74 -0
- package/src/load/plan.ts +513 -0
- package/src/load/specifiers.ts +171 -0
- package/src/load/synthesize.ts +230 -0
- package/src/load/test-globals.ts +251 -0
- package/src/load/test-joins.ts +98 -0
- package/src/{workspace-manifests.ts → load/workspace-manifests.ts} +5 -5
- package/src/{workspace-programs.ts → load/workspace-programs.ts} +128 -85
- package/src/{workspace-resolution.ts → load/workspace-resolution.ts} +41 -77
- package/src/{workspace-run.ts → load/workspace-run.ts} +18 -16
- package/src/{workspace.ts → load/workspace.ts} +90 -134
- package/src/module-declarations.ts +74 -98
- package/src/overrides.ts +162 -134
- package/src/partial.ts +3 -2
- package/src/paths.ts +92 -16
- package/src/platform-calls.ts +119 -0
- package/src/platform-symbols.ts +189 -0
- package/src/position.ts +44 -1
- package/src/print.ts +12 -92
- package/src/product.ts +18 -0
- package/src/query.ts +92 -0
- package/src/ref.ts +12 -20
- package/src/references/read-rule.ts +60 -0
- package/src/references/read-rules.ts +55 -0
- package/src/references/sink.ts +314 -0
- package/src/references/sources.ts +632 -0
- package/src/references.ts +187 -1450
- package/src/report-schema.ts +68 -0
- package/src/report.ts +103 -226
- package/src/reporters/annotations.ts +22 -11
- package/src/reporters/json.ts +1 -1
- package/src/reporters/reporter.ts +2 -4
- package/src/reporters/reporters.ts +1 -1
- package/src/reporters/sarif.ts +29 -16
- package/src/reporters/template.ts +4 -20
- package/src/reporters/text.ts +3 -3
- package/src/resolve.ts +284 -1115
- package/src/{configured-declarations.ts → roots/configured-declarations.ts} +27 -29
- package/src/{entry-point-gaps.ts → roots/entry-point-gaps.ts} +7 -16
- package/src/roots/manifest.ts +303 -0
- package/src/roots/published-reach.ts +486 -0
- package/src/{roots.ts → roots/root-set.ts} +286 -469
- package/src/roots/unseen-loads.ts +345 -0
- package/src/run.ts +75 -91
- package/src/schema.ts +391 -388
- package/src/scope.ts +46 -138
- package/src/serialization-contract.ts +769 -23
- package/src/session.ts +87 -55
- package/src/source-files.ts +6 -11
- package/src/stores.ts +15 -3
- package/src/suppress-file.ts +24 -33
- package/src/suppress-inline.ts +55 -91
- package/src/suppress.ts +78 -79
- package/src/symbol-keys.ts +104 -107
- package/src/template-field.ts +15 -25
- package/src/tests/file-class.ts +135 -0
- package/src/{outside-tests.ts → tests/outside.ts} +16 -10
- package/src/{test-support.ts → tests/support.ts} +15 -21
- package/src/text/compare.ts +27 -0
- package/src/text/glob.ts +210 -0
- package/src/text/named-files.ts +388 -0
- package/src/text/yaml.ts +747 -0
- package/src/type-errors.ts +18 -288
- package/src/type-parameter-reads.ts +187 -158
- package/src/unimplemented-callees.ts +297 -280
- package/src/unwrap.ts +34 -0
- package/src/usage.ts +10 -0
- package/src/vendor/unbash/LICENSE +15 -0
- package/src/vendor/unbash/VENDORED.md +16 -0
- package/src/vendor/unbash/ansi-c.ts +132 -0
- package/src/vendor/unbash/arithmetic-parts.ts +53 -0
- package/src/vendor/unbash/arithmetic.ts +641 -0
- package/src/vendor/unbash/assignment.ts +163 -0
- package/src/vendor/unbash/chars.ts +48 -0
- package/src/vendor/unbash/command.ts +47 -0
- package/src/vendor/unbash/expansion.ts +144 -0
- package/src/vendor/unbash/glob.ts +284 -0
- package/src/vendor/unbash/heredoc.ts +34 -0
- package/src/vendor/unbash/internal-types.ts +94 -0
- package/src/vendor/unbash/lexer.ts +4352 -0
- package/src/vendor/unbash/limits.ts +3 -0
- package/src/vendor/unbash/parser.ts +1612 -0
- package/src/vendor/unbash/parts.ts +96 -0
- package/src/vendor/unbash/substitution-context.ts +20 -0
- package/src/vendor/unbash/traversal.ts +182 -0
- package/src/vendor/unbash/types.ts +660 -0
- package/src/vendor/unbash/word-value.ts +64 -0
- package/src/vendor/unbash/word.ts +50 -0
- package/src/verbs/analyze.ts +255 -164
- package/src/verbs/describe.ts +19 -17
- package/src/verbs/explain.ts +93 -169
- package/src/verbs/print-config.ts +2 -1
- package/src/verbs/print-projects.ts +6 -4
- package/src/verbs/print-retained.ts +7 -5
- package/src/verbs/print-roots.ts +4 -2
- package/src/verbs/verb.ts +2 -8
- package/src/verbs/version.ts +15 -3
- package/dist/src/base-url.js +0 -18
- package/dist/src/conventions.js +0 -937
- package/dist/src/discover.js +0 -468
- package/dist/src/entry-points.js +0 -529
- package/dist/src/glob.js +0 -65
- package/dist/src/manifest.js +0 -165
- package/dist/src/matrix.js +0 -246
- package/dist/src/pnpm-workspace.js +0 -120
- package/dist/src/roots.js +0 -672
- package/dist/src/setup-failure.js +0 -23
- package/dist/src/sweep.js +0 -224
- package/dist/src/test-joins.js +0 -101
- package/dist/src/version.js +0 -7
- package/dist/src/workflow-steps.js +0 -185
- package/src/base-url.ts +0 -24
- package/src/discover.ts +0 -653
- package/src/entry-points.ts +0 -687
- package/src/glob.ts +0 -67
- package/src/manifest.ts +0 -234
- package/src/matrix.ts +0 -423
- package/src/pnpm-workspace.ts +0 -135
- package/src/setup-failure.ts +0 -39
- package/src/sweep.ts +0 -347
- package/src/test-joins.ts +0 -120
- package/src/version.ts +0 -7
- package/src/workflow-steps.ts +0 -216
|
@@ -6,10 +6,10 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import { isCallExpression, isExportDeclaration, isExternalModuleReference, isImportDeclaration, isImportEqualsDeclaration, isNoSubstitutionTemplateLiteral, isStringLiteral, SyntaxKind, } from "@typescript/native/ast";
|
|
8
8
|
import { SymbolFlags } from "@typescript/native/sync";
|
|
9
|
-
import { resolvedTargets } from "
|
|
10
|
-
import { declaredComponent } from "
|
|
11
|
-
import { must, Unanswerable } from "
|
|
12
|
-
import { nameComponent } from "
|
|
9
|
+
import { resolvedTargets } from "../calls.js";
|
|
10
|
+
import { declaredComponent } from "../inventory.js";
|
|
11
|
+
import { must, Unanswerable } from "../query.js";
|
|
12
|
+
import { nameComponent } from "../ref.js";
|
|
13
13
|
/** The meanings a name of the global scope is looked up under: any of them. */
|
|
14
14
|
const ANY_MEANING = SymbolFlags.Value | SymbolFlags.Type | SymbolFlags.Namespace;
|
|
15
15
|
/** The suffix that marks a static member at the end of a path. */
|
|
@@ -140,6 +140,9 @@ function specifierOf(node) {
|
|
|
140
140
|
* import resolves. A specifier no file writes resolves to no module.
|
|
141
141
|
*/
|
|
142
142
|
function modulesNamed(project, specifiers) {
|
|
143
|
+
if (specifiers.size === 0) {
|
|
144
|
+
return new Map();
|
|
145
|
+
}
|
|
143
146
|
const written = new Map();
|
|
144
147
|
for (const file of project.ownSourceFiles()) {
|
|
145
148
|
const visit = (node) => {
|
|
@@ -179,19 +182,19 @@ export function resolveEntries(project, held, entries) {
|
|
|
179
182
|
for (const symbol of held.symbols) {
|
|
180
183
|
byRef.set(symbol.ref, [...(byRef.get(symbol.ref) ?? []), symbol.id]);
|
|
181
184
|
}
|
|
182
|
-
const modules = modulesNamed(project, new Set(entries.flatMap((entry) => (
|
|
185
|
+
const modules = modulesNamed(project, new Set(entries.flatMap((entry) => ("module" in entry ? [entry.module] : []))));
|
|
183
186
|
return entries.map((entry) => {
|
|
184
|
-
if (
|
|
187
|
+
if ("symbol" in entry) {
|
|
185
188
|
return { entry, handles: new Set(), ids: new Set(byRef.get(entry.symbol) ?? []) };
|
|
186
189
|
}
|
|
187
|
-
const { components, static: isStatic } = componentsOf(
|
|
190
|
+
const { components, static: isStatic } = componentsOf("module" in entry ? entry.name : entry.global);
|
|
188
191
|
const [first = "", ...rest] = components;
|
|
189
192
|
let start;
|
|
190
193
|
if (isStatic && rest.length === 0) {
|
|
191
194
|
// Only a member is static, and a path of one component names no member.
|
|
192
195
|
start = undefined;
|
|
193
196
|
}
|
|
194
|
-
else if (
|
|
197
|
+
else if ("module" in entry) {
|
|
195
198
|
const module = modules.get(entry.module);
|
|
196
199
|
start = module === undefined ? undefined : memberOf(project, module, first, false);
|
|
197
200
|
}
|
|
@@ -246,14 +249,10 @@ export function entriesAt(project, chains, nodes, resolved) {
|
|
|
246
249
|
* program the display name the inventory gives it.
|
|
247
250
|
*/
|
|
248
251
|
export function spelledEntry(entry, held) {
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
return held.symbols.find((symbol) => symbol.ref === entry.symbol)?.name ?? entry.symbol;
|
|
252
|
-
case "module":
|
|
253
|
-
return entry.name;
|
|
254
|
-
case "global":
|
|
255
|
-
return entry.global;
|
|
252
|
+
if ("symbol" in entry) {
|
|
253
|
+
return held.symbols.find((symbol) => symbol.ref === entry.symbol)?.name ?? entry.symbol;
|
|
256
254
|
}
|
|
255
|
+
return "module" in entry ? entry.name : entry.global;
|
|
257
256
|
}
|
|
258
257
|
/** The key under which a lifecycle contract's declarations are configured. */
|
|
259
258
|
const LIFECYCLE_KEY = "ts.lifecycle_contracts";
|
|
@@ -264,11 +263,14 @@ const LIFECYCLE_KEY = "ts.lifecycle_contracts";
|
|
|
264
263
|
*/
|
|
265
264
|
export function configuredDeclarations(config) {
|
|
266
265
|
return [
|
|
267
|
-
...config.ts.
|
|
266
|
+
...config.ts.injection_registrations.map((entry) => ({
|
|
268
267
|
key: "ts.injection_registrations",
|
|
269
268
|
entry,
|
|
270
269
|
})),
|
|
271
|
-
...config.ts.
|
|
270
|
+
...config.ts.lifecycle_contracts.flatMap((contract) => [...(contract.components ?? []), ...(contract.bases ?? [])].map((entry) => ({
|
|
271
|
+
key: LIFECYCLE_KEY,
|
|
272
|
+
entry,
|
|
273
|
+
}))),
|
|
272
274
|
...config.ts.serializers.map((entry) => ({ key: "ts.serializers", entry })),
|
|
273
275
|
];
|
|
274
276
|
}
|
|
@@ -294,12 +296,8 @@ export function declarationsNamed(project, held, configured) {
|
|
|
294
296
|
* sign and its name, and a global entry's path after a number sign.
|
|
295
297
|
*/
|
|
296
298
|
export function configuredRef(entry) {
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
return entry.symbol;
|
|
300
|
-
case "module":
|
|
301
|
-
return `${entry.module}#${entry.name}`;
|
|
302
|
-
case "global":
|
|
303
|
-
return `#${entry.global}`;
|
|
299
|
+
if ("symbol" in entry) {
|
|
300
|
+
return entry.symbol;
|
|
304
301
|
}
|
|
302
|
+
return "module" in entry ? `${entry.module}#${entry.name}` : `#${entry.global}`;
|
|
305
303
|
}
|
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Every entry-point convention this analyzer declines, each with
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* Every row carries a reason, because the list is read where the rows are shown
|
|
8
|
-
* one at a time: beside a finding, or in a report's declared gaps.
|
|
2
|
+
* Every entry-point convention this analyzer declines, each with its tool and why. A file only
|
|
3
|
+
* a declined convention enters is reported as never imported, so a project relying on one names
|
|
4
|
+
* the file in `ts.entry_files` or `roots.patterns`, and this list tells it to. Every row carries
|
|
5
|
+
* a reason, since rows are shown one at a time, beside a finding or in a report's declared gaps.
|
|
9
6
|
*/
|
|
7
|
+
import { bytewise } from "../text/compare.js";
|
|
10
8
|
/** What is declined for a tool whose own conventions are entered only through its configuration files. */
|
|
11
9
|
const EVERY_CONVENTION = "every file it loads by its own convention beyond its configuration files";
|
|
12
10
|
/** Why a tool whose own conventions are not read declines them. */
|
|
@@ -291,15 +289,8 @@ const PARTLY_ENTERED = [
|
|
|
291
289
|
reason: NOT_LITERAL,
|
|
292
290
|
},
|
|
293
291
|
];
|
|
294
|
-
/** Two strings ordered bytewise. */
|
|
295
|
-
function compare(a, b) {
|
|
296
|
-
if (a === b) {
|
|
297
|
-
return 0;
|
|
298
|
-
}
|
|
299
|
-
return a < b ? -1 : 1;
|
|
300
|
-
}
|
|
301
292
|
/** Every declined entry-point convention, ordered by tool and then by convention. */
|
|
302
293
|
export const DECLINED_CONVENTIONS = [
|
|
303
294
|
...UNREAD_TOOLS.map((tool) => ({ tool, convention: EVERY_CONVENTION, reason: UNREAD })),
|
|
304
295
|
...PARTLY_ENTERED,
|
|
305
|
-
].sort((a, b) =>
|
|
296
|
+
].sort((a, b) => bytewise(a.tool, b.tool) || bytewise(a.convention, b.convention));
|
|
@@ -0,0 +1,216 @@
|
|
|
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
|
+
import { isRecord } from "../json-document.js";
|
|
9
|
+
import { MANIFEST, manifestAt, readJSON } from "../fs/manifest.js";
|
|
10
|
+
import { pathsNamed, readCommands } from "../commands/read.js";
|
|
11
|
+
/** The three members that name an entry point beside `exports` and `bin`. */
|
|
12
|
+
const LEGACY_MEMBERS = ["main", "module", "types"];
|
|
13
|
+
/**
|
|
14
|
+
* Whether one member's value names a file of this package rather than another
|
|
15
|
+
* package or a URL. A target written with no leading dot is a path too, which is
|
|
16
|
+
* how the members that preceded `exports` are written.
|
|
17
|
+
*/
|
|
18
|
+
function isTarget(value, requireDot) {
|
|
19
|
+
if (value === "" || isAbsolutePath(value) || value.includes("://")) {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
return !requireDot || value.startsWith("./");
|
|
23
|
+
}
|
|
24
|
+
/** One member's spelling below another: `exports` then `exports["."]`. */
|
|
25
|
+
function below(member, key) {
|
|
26
|
+
return `${member}[${JSON.stringify(key)}]`;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* The whole text of nodemon's configuration, the manifest's `nodemonConfig` member and the
|
|
30
|
+
* `nodemon.json` beside it, by the member each is. The dependency rule reads it whole, and
|
|
31
|
+
* layer 3 each of its values, because nodemon runs commands from keys besides `exec`, `events`
|
|
32
|
+
* among them: https://github.com/remy/nodemon#config-files
|
|
33
|
+
*/
|
|
34
|
+
export function nodemonTexts(host, dir, manifest) {
|
|
35
|
+
const member = manifest["nodemonConfig"];
|
|
36
|
+
let file;
|
|
37
|
+
try {
|
|
38
|
+
file = host.readFile(joinPath(dir, "nodemon.json"));
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
file = undefined;
|
|
42
|
+
}
|
|
43
|
+
return [
|
|
44
|
+
...(member === undefined ? [] : [{ member: "nodemonConfig", text: JSON.stringify(member) }]),
|
|
45
|
+
...(file === undefined ? [] : [{ member: "nodemon.json", text: file }]),
|
|
46
|
+
];
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* The texts layer 3 reads of one text of nodemon's configuration: each value of it but its
|
|
50
|
+
* `exec` command, which is read as a command string of its own, those under `events` read as
|
|
51
|
+
* command strings too, and the whole text where it does not parse. Its keys are never read.
|
|
52
|
+
*/
|
|
53
|
+
function nodemonValues(text) {
|
|
54
|
+
let config;
|
|
55
|
+
try {
|
|
56
|
+
config = JSON.parse(text);
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return [{ text, shell: false }];
|
|
60
|
+
}
|
|
61
|
+
const found = [];
|
|
62
|
+
const visit = (value, shell) => {
|
|
63
|
+
if (Array.isArray(value) || isRecord(value)) {
|
|
64
|
+
for (const one of Object.values(value)) {
|
|
65
|
+
visit(one, shell);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
else if (typeof value === "string" ||
|
|
69
|
+
typeof value === "number" ||
|
|
70
|
+
typeof value === "boolean") {
|
|
71
|
+
found.push({ text: String(value), shell });
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
for (const [key, value] of Object.entries(isRecord(config) ? config : { "": config })) {
|
|
75
|
+
if (key !== "exec" || typeof value !== "string") {
|
|
76
|
+
visit(value, key === "events");
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return found;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* The command strings one manifest runs, each at the member it is written under: each of its
|
|
83
|
+
* `scripts`, and the `exec` command of nodemon's configuration, in the manifest's `nodemonConfig`
|
|
84
|
+
* or the `nodemon.json` beside it, which nodemon runs the watched script with:
|
|
85
|
+
* https://github.com/remy/nodemon#config-files
|
|
86
|
+
*/
|
|
87
|
+
export function manifestCommands(host, dir, manifest) {
|
|
88
|
+
const scripts = manifest["scripts"];
|
|
89
|
+
const nodemon = {
|
|
90
|
+
nodemonConfig: manifest["nodemonConfig"],
|
|
91
|
+
"nodemon.json": readJSON(host, joinPath(dir, "nodemon.json")),
|
|
92
|
+
};
|
|
93
|
+
const written = [
|
|
94
|
+
...Object.entries(isRecord(scripts) ? scripts : {}).map(([name, value]) => [below("scripts", name), value]),
|
|
95
|
+
...Object.entries(nodemon).map(([member, config]) => [below(member, "exec"), isRecord(config) ? config["exec"] : undefined]),
|
|
96
|
+
];
|
|
97
|
+
return written.flatMap(([member, command]) => typeof command === "string" ? [{ member, command }] : []);
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Every target one `exports` value carries, at the member each is written under. Every level of
|
|
101
|
+
* strings, subpath or condition objects and alternative arrays is walked, because each condition
|
|
102
|
+
* names its own entry file; a `null` blocks a subpath, and a key's meaning is never read.
|
|
103
|
+
*/
|
|
104
|
+
function exportTargets(value, member, found) {
|
|
105
|
+
if (typeof value === "string") {
|
|
106
|
+
if (isTarget(value, true)) {
|
|
107
|
+
found.push({ member, path: value, role: "import", published: true });
|
|
108
|
+
}
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
if (Array.isArray(value)) {
|
|
112
|
+
value.forEach((alternative, index) => {
|
|
113
|
+
exportTargets(alternative, below(member, String(index)), found);
|
|
114
|
+
});
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
if (!isRecord(value)) {
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
for (const [key, held] of Object.entries(value)) {
|
|
121
|
+
exportTargets(held, below(member, key), found);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* What the manifest in `targetRoot` declares about where its package is entered.
|
|
126
|
+
*
|
|
127
|
+
* A target is taken as written. It is not resolved to a source file here, because
|
|
128
|
+
* which file a target names is a fact about the compiler configuration that emits
|
|
129
|
+
* it and there is one such configuration per project, while there is one manifest.
|
|
130
|
+
*/
|
|
131
|
+
export function readManifest(host, targetRoot) {
|
|
132
|
+
const manifest = manifestAt(host, targetRoot);
|
|
133
|
+
if (manifest === undefined) {
|
|
134
|
+
return { entries: [], declaresExports: false };
|
|
135
|
+
}
|
|
136
|
+
const found = [];
|
|
137
|
+
for (const member of LEGACY_MEMBERS) {
|
|
138
|
+
const value = manifest[member];
|
|
139
|
+
if (typeof value === "string" && isTarget(value, false)) {
|
|
140
|
+
found.push({ member, path: value, role: "import", published: true });
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
// A `browser` string replaces `main` in a browser bundle, and an object replaces each
|
|
144
|
+
// module it maps with the file it names: https://github.com/defunctzombie/package-browser-field-spec
|
|
145
|
+
const browser = manifest["browser"];
|
|
146
|
+
if (typeof browser === "string" && isTarget(browser, false)) {
|
|
147
|
+
found.push({ member: "browser", path: browser, role: "import", published: true });
|
|
148
|
+
}
|
|
149
|
+
else if (isRecord(browser)) {
|
|
150
|
+
for (const [replaced, value] of Object.entries(browser)) {
|
|
151
|
+
if (typeof value === "string" && isTarget(value, true)) {
|
|
152
|
+
found.push({
|
|
153
|
+
member: below("browser", replaced),
|
|
154
|
+
path: value,
|
|
155
|
+
role: "import",
|
|
156
|
+
published: true,
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
const bin = manifest["bin"];
|
|
162
|
+
if (typeof bin === "string" && isTarget(bin, false)) {
|
|
163
|
+
found.push({ member: "bin", path: bin, role: "run", published: false });
|
|
164
|
+
}
|
|
165
|
+
else if (isRecord(bin)) {
|
|
166
|
+
for (const [command, value] of Object.entries(bin)) {
|
|
167
|
+
if (typeof value === "string" && isTarget(value, false)) {
|
|
168
|
+
found.push({ member: below("bin", command), path: value, role: "run", published: false });
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
exportTargets(manifest["exports"], "exports", found);
|
|
173
|
+
for (const { member, command } of manifestCommands(host, targetRoot, manifest)) {
|
|
174
|
+
// Read against ".", so each path stays relative until the entries are resolved below.
|
|
175
|
+
for (const path of new Set(pathsNamed(readCommands(command, ".")).map((one) => one.path))) {
|
|
176
|
+
found.push({ member, path, role: "script", published: false });
|
|
177
|
+
}
|
|
178
|
+
found.push({
|
|
179
|
+
member,
|
|
180
|
+
path: ".",
|
|
181
|
+
role: "script",
|
|
182
|
+
published: false,
|
|
183
|
+
held: [{ text: command, shell: true, tested: member.startsWith("scripts[") }],
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
for (const { member, text } of nodemonTexts(host, targetRoot, manifest)) {
|
|
187
|
+
const held = nodemonValues(text);
|
|
188
|
+
if (held.length > 0) {
|
|
189
|
+
found.push({ member, path: ".", role: "script", published: false, held });
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
return {
|
|
193
|
+
entries: found.map((entry) => ({
|
|
194
|
+
...entry,
|
|
195
|
+
path: resolvePath(targetRoot, entry.path),
|
|
196
|
+
dir: targetRoot,
|
|
197
|
+
})),
|
|
198
|
+
declaresExports: manifest["exports"] !== undefined,
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* The entry points the manifests of the nested packages in `dirs` name. Each entry is
|
|
203
|
+
* spelled under its manifest's path below the target root, and is published by its own
|
|
204
|
+
* manifest's rule, as the target's own entries are.
|
|
205
|
+
*/
|
|
206
|
+
export function packageEntries(host, targetRoot, dirs) {
|
|
207
|
+
return dirs.flatMap((dir) => {
|
|
208
|
+
const manifest = readManifest(host, dir);
|
|
209
|
+
const where = `${relativePath(targetRoot, dir) ?? dir}/${MANIFEST}`;
|
|
210
|
+
return manifest.entries.map((entry) => ({
|
|
211
|
+
...entry,
|
|
212
|
+
member: `${where} ${entry.member}`,
|
|
213
|
+
published: entry.published && (!manifest.declaresExports || entry.member.startsWith("exports")),
|
|
214
|
+
}));
|
|
215
|
+
});
|
|
216
|
+
}
|