@cplieger/deadset-ts 8.0.0-dev.2 → 8.0.0-dev.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -1
- package/THIRD_PARTY_NOTICES.md +27 -0
- package/dist/bin/mapper-connection.js +2 -1
- package/dist/bin/node-host.js +24 -5
- package/dist/src/alias-chain.js +2 -7
- package/dist/src/amd.js +81 -0
- package/dist/src/analysis.js +269 -432
- package/dist/src/augmentations.js +64 -3
- package/dist/src/automatic-types.js +10 -29
- package/dist/src/bindings.js +382 -0
- package/dist/src/calls.js +279 -43
- package/dist/src/commands/held.js +499 -0
- package/dist/src/commands/read.js +161 -0
- package/dist/src/commands/shell.js +169 -0
- package/dist/src/commands/tools.js +1847 -0
- package/dist/src/component-files.js +3 -2
- package/dist/src/component-layer.js +4 -2
- package/dist/src/config.js +6 -82
- package/dist/src/conformance-record.js +1 -1
- package/dist/src/consumers.js +10 -38
- package/dist/src/contextual-uses.js +57 -26
- package/dist/src/contract/config.generated.js +561 -0
- package/dist/src/contract/contract.generated.js +1369 -0
- package/dist/src/contract/report.generated.js +866 -0
- package/dist/src/dependencies.js +164 -121
- package/dist/src/destructuring.js +1 -19
- package/dist/src/edges.js +38 -122
- package/dist/src/element-access.js +181 -168
- package/dist/src/entries/build-scripts.js +222 -0
- package/dist/src/{configuration-files.js → entries/configuration-files.js} +52 -256
- package/dist/src/{convention-rows.js → entries/convention-rows.js} +170 -30
- package/dist/src/entries/conventions.js +740 -0
- package/dist/src/{html-entries.js → entries/html-entries.js} +12 -42
- package/dist/src/{mdx-entries.js → entries/mdx-entries.js} +5 -28
- package/dist/src/entries/run-directories.js +77 -0
- package/dist/src/entries/sources.js +144 -0
- package/dist/src/entries/static-module.js +670 -0
- package/dist/src/entries/test-runners.js +650 -0
- package/dist/src/entries/workflow-steps.js +345 -0
- package/dist/src/enum-group.js +3 -10
- package/dist/src/erased-stores.js +4 -6
- package/dist/src/exempt-classes.js +1 -63
- package/dist/src/exempt.js +21 -66
- package/dist/src/exposure.js +400 -0
- package/dist/src/extensions.js +37 -0
- package/dist/src/facts.js +38 -0
- package/dist/src/failure.js +36 -0
- package/dist/src/file-facts.js +3 -26
- package/dist/src/findings/completion.js +109 -56
- package/dist/src/findings/dependencies-and-module-machinery.js +4 -5
- package/dist/src/findings/emitters.js +27 -41
- package/dist/src/{implementations.js → findings/implementations.js} +3 -3
- package/dist/src/{in-operands.js → findings/in-operands.js} +3 -2
- package/dist/src/findings/interfaces.js +4 -5
- package/dist/src/findings/intra-function.js +16 -13
- package/dist/src/findings/non-code-artifacts.js +17 -12
- package/dist/src/findings/reads-and-writes.js +86 -27
- package/dist/src/findings/self-check.js +44 -30
- package/dist/src/findings/unused-declarations.js +29 -45
- package/dist/src/findings/visibility-narrowing.js +23 -31
- package/dist/src/findings-pass.js +13 -21
- package/dist/src/framework-lifecycle.js +46 -19
- package/dist/src/fs/document.js +52 -0
- package/dist/src/fs/manifest.js +67 -0
- package/dist/src/fs/tree.js +88 -0
- package/dist/src/generated-file.js +174 -28
- package/dist/src/git-ignore.js +39 -26
- package/dist/src/import-bindings.js +73 -28
- package/dist/src/index/sites.js +557 -0
- package/dist/src/index.js +2 -2
- package/dist/src/indexed-access.js +523 -478
- package/dist/src/injection-container.js +2 -2
- package/dist/src/interface-satisfaction.js +1 -1
- package/dist/src/intra-function-parts.js +63 -43
- package/dist/src/inventory/commonjs.js +507 -0
- package/dist/src/inventory/enumerate.js +167 -0
- package/dist/src/inventory/syntax.js +236 -0
- package/dist/src/inventory.js +323 -724
- package/dist/src/javascript-file.js +48 -0
- package/dist/src/json-document.js +198 -67
- package/dist/src/keyof-comparisons.js +126 -107
- package/dist/src/kinds.js +3 -366
- package/dist/src/{components.js → liveness/components.js} +2 -3
- package/dist/src/{graph.js → liveness/graph.js} +52 -28
- package/dist/src/liveness/matrix.js +99 -0
- package/dist/src/liveness/sweep.js +558 -0
- package/dist/src/load/classify.js +289 -0
- package/dist/src/load/diagnostics.js +87 -0
- package/dist/src/load/discover.js +285 -0
- package/dist/src/{emit-map.js → load/emit-map.js} +1 -1
- package/dist/src/load/expected-module.js +136 -0
- package/dist/src/load/load.js +27 -0
- package/dist/src/load/module-lookup.js +37 -0
- package/dist/src/load/package-scope.js +56 -0
- package/dist/src/load/plan.js +313 -0
- package/dist/src/load/specifiers.js +113 -0
- package/dist/src/load/synthesize.js +152 -0
- package/dist/src/load/test-globals.js +207 -0
- package/dist/src/load/test-joins.js +82 -0
- package/dist/src/{workspace-manifests.js → load/workspace-manifests.js} +4 -4
- package/dist/src/{workspace-programs.js → load/workspace-programs.js} +89 -66
- package/dist/src/{workspace-resolution.js → load/workspace-resolution.js} +24 -66
- package/dist/src/{workspace-run.js → load/workspace-run.js} +7 -7
- package/dist/src/{workspace.js → load/workspace.js} +62 -124
- package/dist/src/module-declarations.js +70 -85
- package/dist/src/overrides.js +134 -112
- package/dist/src/partial.js +2 -1
- package/dist/src/paths.js +82 -16
- package/dist/src/platform-calls.js +78 -0
- package/dist/src/platform-symbols.js +134 -0
- package/dist/src/position.js +43 -1
- package/dist/src/print.js +11 -79
- package/dist/src/product.js +13 -0
- package/dist/src/query.js +47 -0
- package/dist/src/ref.js +12 -20
- package/dist/src/references/read-rule.js +1 -0
- package/dist/src/references/read-rules.js +48 -0
- package/dist/src/references/sink.js +237 -0
- package/dist/src/references/sources.js +450 -0
- package/dist/src/references.js +117 -1074
- package/dist/src/report-schema.js +51 -0
- package/dist/src/report.js +57 -41
- package/dist/src/reporters/annotations.js +15 -8
- package/dist/src/reporters/sarif.js +16 -10
- package/dist/src/reporters/template.js +4 -19
- package/dist/src/resolve.js +246 -730
- package/dist/src/{configured-declarations.js → roots/configured-declarations.js} +22 -24
- package/dist/src/{entry-point-gaps.js → roots/entry-point-gaps.js} +6 -15
- package/dist/src/roots/manifest.js +216 -0
- package/dist/src/roots/published-reach.js +412 -0
- package/dist/src/roots/root-set.js +487 -0
- package/dist/src/roots/unseen-loads.js +236 -0
- package/dist/src/run.js +66 -77
- package/dist/src/schema.js +320 -343
- package/dist/src/scope.js +38 -115
- package/dist/src/serialization-contract.js +601 -22
- package/dist/src/session.js +37 -29
- package/dist/src/source-files.js +6 -10
- package/dist/src/stores.js +4 -2
- package/dist/src/suppress-file.js +25 -28
- package/dist/src/suppress-inline.js +36 -83
- package/dist/src/suppress.js +50 -71
- package/dist/src/symbol-keys.js +92 -88
- package/dist/src/template-field.js +9 -19
- package/dist/src/tests/file-class.js +76 -0
- package/dist/src/{outside-tests.js → tests/outside.js} +7 -7
- package/dist/src/{test-support.js → tests/support.js} +5 -12
- package/dist/src/text/compare.js +26 -0
- package/dist/src/text/glob.js +194 -0
- package/dist/src/text/named-files.js +298 -0
- package/dist/src/text/yaml.js +684 -0
- package/dist/src/type-errors.js +11 -232
- package/dist/src/type-parameter-reads.js +178 -139
- package/dist/src/unimplemented-callees.js +262 -242
- package/dist/src/unwrap.js +23 -0
- package/dist/src/usage.js +10 -0
- package/dist/src/vendor/unbash/ansi-c.js +132 -0
- package/dist/src/vendor/unbash/arithmetic-parts.js +37 -0
- package/dist/src/vendor/unbash/arithmetic.js +591 -0
- package/dist/src/vendor/unbash/assignment.js +131 -0
- package/dist/src/vendor/unbash/chars.js +48 -0
- package/dist/src/vendor/unbash/command.js +41 -0
- package/dist/src/vendor/unbash/expansion.js +80 -0
- package/dist/src/vendor/unbash/glob.js +268 -0
- package/dist/src/vendor/unbash/heredoc.js +27 -0
- package/dist/src/vendor/unbash/internal-types.js +1 -0
- package/dist/src/vendor/unbash/lexer.js +4274 -0
- package/dist/src/vendor/unbash/limits.js +3 -0
- package/dist/src/vendor/unbash/parser.js +1366 -0
- package/dist/src/vendor/unbash/parts.js +57 -0
- package/dist/src/vendor/unbash/substitution-context.js +8 -0
- package/dist/src/vendor/unbash/traversal.js +212 -0
- package/dist/src/vendor/unbash/types.js +1 -0
- package/dist/src/vendor/unbash/word-value.js +61 -0
- package/dist/src/vendor/unbash/word.js +40 -0
- package/dist/src/verbs/analyze.js +194 -127
- package/dist/src/verbs/describe.js +13 -18
- package/dist/src/verbs/explain.js +85 -139
- package/dist/src/verbs/print-config.js +2 -1
- package/dist/src/verbs/print-projects.js +6 -4
- package/dist/src/verbs/print-retained.js +7 -5
- package/dist/src/verbs/print-roots.js +4 -2
- package/dist/src/verbs/verb.js +1 -5
- package/dist/src/verbs/version.js +14 -3
- package/jsr.json +2 -1
- package/package.json +14 -8
- package/src/alias-chain.ts +2 -9
- package/src/amd.ts +130 -0
- package/src/analysis.ts +424 -650
- package/src/augmentations.ts +93 -4
- package/src/automatic-types.ts +12 -30
- package/src/bindings.ts +460 -0
- package/src/calls.ts +338 -46
- package/src/commands/held.ts +632 -0
- package/src/commands/read.ts +242 -0
- package/src/commands/shell.ts +228 -0
- package/src/commands/tools.ts +2382 -0
- package/src/component-files.ts +4 -2
- package/src/component-layer.ts +4 -2
- package/src/config.ts +31 -302
- package/src/conformance-record.ts +1 -1
- package/src/consumers.ts +16 -66
- package/src/contextual-uses.ts +66 -34
- package/src/contract/config.generated.ts +821 -0
- package/src/contract/contract.generated.ts +1452 -0
- package/src/contract/report.generated.ts +1241 -0
- package/src/dependencies.ts +222 -127
- package/src/destructuring.ts +1 -31
- package/src/edges.ts +41 -140
- package/src/element-access.ts +190 -187
- package/src/entries/build-scripts.ts +292 -0
- package/src/{configuration-files.ts → entries/configuration-files.ts} +68 -278
- package/src/{convention-rows.ts → entries/convention-rows.ts} +227 -31
- package/src/{conventions.ts → entries/conventions.ts} +367 -583
- package/src/{html-entries.ts → entries/html-entries.ts} +22 -48
- package/src/{mdx-entries.ts → entries/mdx-entries.ts} +7 -30
- package/src/entries/run-directories.ts +108 -0
- package/src/entries/sources.ts +266 -0
- package/src/entries/static-module.ts +858 -0
- package/src/entries/test-runners.ts +835 -0
- package/src/entries/workflow-steps.ts +432 -0
- package/src/enum-group.ts +2 -11
- package/src/erased-stores.ts +3 -7
- package/src/exempt-classes.ts +1 -75
- package/src/exempt.ts +70 -98
- package/src/exposure.ts +492 -0
- package/src/extensions.ts +45 -0
- package/src/facts.ts +46 -0
- package/src/failure.ts +63 -0
- package/src/file-facts.ts +15 -25
- package/src/finding.ts +10 -10
- package/src/findings/boundary.ts +11 -0
- package/src/findings/completion.ts +133 -64
- package/src/findings/dependencies-and-module-machinery.ts +4 -7
- package/src/findings/emitter.ts +9 -10
- package/src/findings/emitters.ts +38 -52
- package/src/{implementations.ts → findings/implementations.ts} +4 -4
- package/src/{in-operands.ts → findings/in-operands.ts} +4 -3
- package/src/findings/interfaces.ts +7 -9
- package/src/findings/intra-function.ts +16 -14
- package/src/findings/non-code-artifacts.ts +24 -15
- package/src/findings/reads-and-writes.ts +118 -41
- package/src/findings/self-check.ts +51 -38
- package/src/findings/unused-declarations.ts +31 -49
- package/src/findings/visibility-narrowing.ts +36 -40
- package/src/findings-pass.ts +15 -31
- package/src/framework-lifecycle.ts +47 -19
- package/src/fs/document.ts +70 -0
- package/src/fs/manifest.ts +96 -0
- package/src/fs/tree.ts +110 -0
- package/src/generated-file.ts +242 -35
- package/src/git-ignore.ts +50 -26
- package/src/host.ts +12 -5
- package/src/import-bindings.ts +98 -29
- package/src/index/sites.ts +781 -0
- package/src/index.ts +2 -2
- package/src/indexed-access.ts +570 -527
- package/src/injection-container.ts +2 -2
- package/src/interface-satisfaction.ts +2 -2
- package/src/intra-function-parts.ts +73 -44
- package/src/inventory/commonjs.ts +696 -0
- package/src/inventory/enumerate.ts +203 -0
- package/src/inventory/syntax.ts +311 -0
- package/src/inventory.ts +442 -895
- package/src/javascript-file.ts +54 -0
- package/src/json-document.ts +241 -76
- package/src/keyof-comparisons.ts +133 -122
- package/src/kinds.ts +5 -413
- package/src/{components.ts → liveness/components.ts} +4 -6
- package/src/{graph.ts → liveness/graph.ts} +100 -35
- package/src/liveness/matrix.ts +162 -0
- package/src/liveness/sweep.ts +855 -0
- package/src/load/classify.ts +433 -0
- package/src/load/diagnostics.ts +154 -0
- package/src/load/discover.ts +471 -0
- package/src/{emit-map.ts → load/emit-map.ts} +1 -1
- package/src/load/expected-module.ts +194 -0
- package/src/load/load.ts +73 -0
- package/src/load/module-lookup.ts +50 -0
- package/src/load/package-scope.ts +74 -0
- package/src/load/plan.ts +513 -0
- package/src/load/specifiers.ts +171 -0
- package/src/load/synthesize.ts +230 -0
- package/src/load/test-globals.ts +251 -0
- package/src/load/test-joins.ts +98 -0
- package/src/{workspace-manifests.ts → load/workspace-manifests.ts} +5 -5
- package/src/{workspace-programs.ts → load/workspace-programs.ts} +128 -85
- package/src/{workspace-resolution.ts → load/workspace-resolution.ts} +41 -77
- package/src/{workspace-run.ts → load/workspace-run.ts} +18 -16
- package/src/{workspace.ts → load/workspace.ts} +90 -134
- package/src/module-declarations.ts +74 -98
- package/src/overrides.ts +162 -134
- package/src/partial.ts +3 -2
- package/src/paths.ts +92 -16
- package/src/platform-calls.ts +119 -0
- package/src/platform-symbols.ts +189 -0
- package/src/position.ts +44 -1
- package/src/print.ts +12 -92
- package/src/product.ts +18 -0
- package/src/query.ts +92 -0
- package/src/ref.ts +12 -20
- package/src/references/read-rule.ts +60 -0
- package/src/references/read-rules.ts +55 -0
- package/src/references/sink.ts +314 -0
- package/src/references/sources.ts +632 -0
- package/src/references.ts +187 -1450
- package/src/report-schema.ts +68 -0
- package/src/report.ts +103 -226
- package/src/reporters/annotations.ts +22 -11
- package/src/reporters/json.ts +1 -1
- package/src/reporters/reporter.ts +2 -4
- package/src/reporters/reporters.ts +1 -1
- package/src/reporters/sarif.ts +29 -16
- package/src/reporters/template.ts +4 -20
- package/src/reporters/text.ts +3 -3
- package/src/resolve.ts +284 -1115
- package/src/{configured-declarations.ts → roots/configured-declarations.ts} +27 -29
- package/src/{entry-point-gaps.ts → roots/entry-point-gaps.ts} +7 -16
- package/src/roots/manifest.ts +303 -0
- package/src/roots/published-reach.ts +486 -0
- package/src/{roots.ts → roots/root-set.ts} +286 -469
- package/src/roots/unseen-loads.ts +345 -0
- package/src/run.ts +75 -91
- package/src/schema.ts +391 -388
- package/src/scope.ts +46 -138
- package/src/serialization-contract.ts +769 -23
- package/src/session.ts +87 -55
- package/src/source-files.ts +6 -11
- package/src/stores.ts +15 -3
- package/src/suppress-file.ts +24 -33
- package/src/suppress-inline.ts +55 -91
- package/src/suppress.ts +78 -79
- package/src/symbol-keys.ts +104 -107
- package/src/template-field.ts +15 -25
- package/src/tests/file-class.ts +135 -0
- package/src/{outside-tests.ts → tests/outside.ts} +16 -10
- package/src/{test-support.ts → tests/support.ts} +15 -21
- package/src/text/compare.ts +27 -0
- package/src/text/glob.ts +210 -0
- package/src/text/named-files.ts +388 -0
- package/src/text/yaml.ts +747 -0
- package/src/type-errors.ts +18 -288
- package/src/type-parameter-reads.ts +187 -158
- package/src/unimplemented-callees.ts +297 -280
- package/src/unwrap.ts +34 -0
- package/src/usage.ts +10 -0
- package/src/vendor/unbash/LICENSE +15 -0
- package/src/vendor/unbash/VENDORED.md +16 -0
- package/src/vendor/unbash/ansi-c.ts +132 -0
- package/src/vendor/unbash/arithmetic-parts.ts +53 -0
- package/src/vendor/unbash/arithmetic.ts +641 -0
- package/src/vendor/unbash/assignment.ts +163 -0
- package/src/vendor/unbash/chars.ts +48 -0
- package/src/vendor/unbash/command.ts +47 -0
- package/src/vendor/unbash/expansion.ts +144 -0
- package/src/vendor/unbash/glob.ts +284 -0
- package/src/vendor/unbash/heredoc.ts +34 -0
- package/src/vendor/unbash/internal-types.ts +94 -0
- package/src/vendor/unbash/lexer.ts +4352 -0
- package/src/vendor/unbash/limits.ts +3 -0
- package/src/vendor/unbash/parser.ts +1612 -0
- package/src/vendor/unbash/parts.ts +96 -0
- package/src/vendor/unbash/substitution-context.ts +20 -0
- package/src/vendor/unbash/traversal.ts +182 -0
- package/src/vendor/unbash/types.ts +660 -0
- package/src/vendor/unbash/word-value.ts +64 -0
- package/src/vendor/unbash/word.ts +50 -0
- package/src/verbs/analyze.ts +255 -164
- package/src/verbs/describe.ts +19 -17
- package/src/verbs/explain.ts +93 -169
- package/src/verbs/print-config.ts +2 -1
- package/src/verbs/print-projects.ts +6 -4
- package/src/verbs/print-retained.ts +7 -5
- package/src/verbs/print-roots.ts +4 -2
- package/src/verbs/verb.ts +2 -8
- package/src/verbs/version.ts +15 -3
- package/dist/src/base-url.js +0 -18
- package/dist/src/conventions.js +0 -937
- package/dist/src/discover.js +0 -468
- package/dist/src/entry-points.js +0 -529
- package/dist/src/glob.js +0 -65
- package/dist/src/manifest.js +0 -165
- package/dist/src/matrix.js +0 -246
- package/dist/src/pnpm-workspace.js +0 -120
- package/dist/src/roots.js +0 -672
- package/dist/src/setup-failure.js +0 -23
- package/dist/src/sweep.js +0 -224
- package/dist/src/test-joins.js +0 -101
- package/dist/src/version.js +0 -7
- package/dist/src/workflow-steps.js +0 -185
- package/src/base-url.ts +0 -24
- package/src/discover.ts +0 -653
- package/src/entry-points.ts +0 -687
- package/src/glob.ts +0 -67
- package/src/manifest.ts +0 -234
- package/src/matrix.ts +0 -423
- package/src/pnpm-workspace.ts +0 -135
- package/src/setup-failure.ts +0 -39
- package/src/sweep.ts +0 -347
- package/src/test-joins.ts +0 -120
- package/src/version.ts +0 -7
- package/src/workflow-steps.ts +0 -216
package/src/dependencies.ts
CHANGED
|
@@ -29,34 +29,55 @@ import {
|
|
|
29
29
|
type Node,
|
|
30
30
|
type SourceFile,
|
|
31
31
|
} from "@typescript/native/ast";
|
|
32
|
+
import { amdLoadOf, amdPlatform } from "./amd.ts";
|
|
32
33
|
import { automaticTypes, type AutomaticTypes } from "./automatic-types.ts";
|
|
33
34
|
import {
|
|
34
|
-
configurationFiles,
|
|
35
35
|
declaredIn as declaredBeside,
|
|
36
36
|
dependenciesNamed,
|
|
37
37
|
moduleStrings,
|
|
38
38
|
outsideChain,
|
|
39
|
+
type ConfigurationFiles,
|
|
39
40
|
type OutsideModule,
|
|
40
41
|
type ParseFile,
|
|
41
|
-
} from "./configuration-files.ts";
|
|
42
|
+
} from "./entries/configuration-files.ts";
|
|
42
43
|
import type { FindingPosition } from "./finding.ts";
|
|
43
44
|
import type { Host } from "./host.ts";
|
|
44
|
-
import {
|
|
45
|
-
import {
|
|
46
|
-
import {
|
|
45
|
+
import { declarationBindings } from "./import-bindings.ts";
|
|
46
|
+
import { nodeKey, type Inventory } from "./inventory.ts";
|
|
47
|
+
import { packageScope } from "./load/package-scope.ts";
|
|
48
|
+
import {
|
|
49
|
+
ancestors,
|
|
50
|
+
cannotStartPackageName,
|
|
51
|
+
dirnamePath,
|
|
52
|
+
joinPath,
|
|
53
|
+
relativePath,
|
|
54
|
+
resolvePath,
|
|
55
|
+
} from "./paths.ts";
|
|
47
56
|
import type { DependencySection, Module } from "./ref.ts";
|
|
48
57
|
import { UNANSWERED } from "./query.ts";
|
|
49
58
|
import type { Handle, ProjectView } from "./session.ts";
|
|
50
59
|
import { sourceFilesOf, type SourceFiles } from "./source-files.ts";
|
|
51
|
-
import {
|
|
60
|
+
import { manifestCommands, nodemonTexts } from "./roots/manifest.ts";
|
|
61
|
+
import { writtenName } from "./platform-calls.ts";
|
|
62
|
+
import { callsPlatform } from "./platform-symbols.ts";
|
|
63
|
+
import { parenthesesRemoved } from "./unwrap.ts";
|
|
64
|
+
import type { Workflows } from "./entries/workflow-steps.ts";
|
|
65
|
+
import {
|
|
66
|
+
pathsNamed,
|
|
67
|
+
preloadedPackages,
|
|
68
|
+
readCommands,
|
|
69
|
+
type CommandReading,
|
|
70
|
+
} from "./commands/read.ts";
|
|
71
|
+
import { heldNames } from "./text/named-files.ts";
|
|
72
|
+
import { bytewise } from "./text/compare.ts";
|
|
73
|
+
import { isRecord } from "./json-document.ts";
|
|
74
|
+
import { inInstalledPackages, INSTALLED_PACKAGES, MANIFEST, readDocument } from "./fs/manifest.ts";
|
|
52
75
|
|
|
53
|
-
const
|
|
54
|
-
const MODULES_DIR = "node_modules";
|
|
55
|
-
const MODULES_SEGMENT = `/${MODULES_DIR}/`;
|
|
76
|
+
const MODULES_SEGMENT = `/${INSTALLED_PACKAGES}/`;
|
|
56
77
|
const TYPES_SCOPE = "@types/";
|
|
57
78
|
|
|
58
|
-
/** A
|
|
59
|
-
const SCRIPT_FILE =
|
|
79
|
+
/** A path a command names that is a JavaScript file's. */
|
|
80
|
+
const SCRIPT_FILE = /\.(?:js|mjs|cjs)$/u;
|
|
60
81
|
|
|
61
82
|
/** The manifest sections a dependency is declared in, each by the selector its reference spells. */
|
|
62
83
|
const SECTIONS: readonly (readonly [string, DependencySection])[] = [
|
|
@@ -160,25 +181,6 @@ export interface Dependencies {
|
|
|
160
181
|
readonly heldBy: ReadonlyMap<string, readonly string[]>;
|
|
161
182
|
}
|
|
162
183
|
|
|
163
|
-
function isRecord(value: unknown): value is Record<string, unknown> {
|
|
164
|
-
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
/** One JSON document's decoded value, or undefined where it cannot be read or parsed. */
|
|
168
|
-
function readJSON(host: Host, path: string): { text: string; value: unknown } | undefined {
|
|
169
|
-
let text: string;
|
|
170
|
-
try {
|
|
171
|
-
text = host.readFile(path);
|
|
172
|
-
} catch {
|
|
173
|
-
return undefined;
|
|
174
|
-
}
|
|
175
|
-
try {
|
|
176
|
-
return { text, value: JSON.parse(text) };
|
|
177
|
-
} catch {
|
|
178
|
-
return undefined;
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
|
|
182
184
|
/**
|
|
183
185
|
* The package a bare module specifier names: its first segment, or its first two
|
|
184
186
|
* where it starts with a scope. A relative, absolute or scheme-prefixed specifier and
|
|
@@ -302,7 +304,7 @@ function configurationPackages(
|
|
|
302
304
|
}
|
|
303
305
|
seen.add(file);
|
|
304
306
|
for (const entry of extendsOf(host, file, parse)) {
|
|
305
|
-
if (
|
|
307
|
+
if (cannotStartPackageName(entry)) {
|
|
306
308
|
const local = resolvePath(dirnamePath(file), entry);
|
|
307
309
|
pending.push(local.endsWith(".json") ? local : `${local}.json`);
|
|
308
310
|
} else {
|
|
@@ -332,34 +334,18 @@ function importOf(specifier: Node): Node | undefined {
|
|
|
332
334
|
|
|
333
335
|
/** The local names one import declaration binds. */
|
|
334
336
|
function bindingsOf(node: Node | undefined): readonly Texted[] {
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
if (isImportEqualsDeclaration(node)) {
|
|
339
|
-
return [node.name];
|
|
340
|
-
}
|
|
341
|
-
if (!isImportDeclaration(node) || node.importClause === undefined) {
|
|
342
|
-
return [];
|
|
343
|
-
}
|
|
344
|
-
const clause = node.importClause;
|
|
345
|
-
const names: Texted[] = clause.name === undefined ? [] : [clause.name];
|
|
346
|
-
const bindings = clause.namedBindings;
|
|
347
|
-
if (bindings !== undefined) {
|
|
348
|
-
if (bindings.kind === SyntaxKind.NamespaceImport) {
|
|
349
|
-
names.push(bindings.name);
|
|
350
|
-
} else {
|
|
351
|
-
names.push(...bindings.elements.map((element) => element.name));
|
|
352
|
-
}
|
|
353
|
-
}
|
|
354
|
-
return names;
|
|
337
|
+
return node !== undefined && (isImportDeclaration(node) || isImportEqualsDeclaration(node))
|
|
338
|
+
? declarationBindings(node).map((binding) => binding.name)
|
|
339
|
+
: [];
|
|
355
340
|
}
|
|
356
341
|
|
|
357
342
|
/**
|
|
358
343
|
* Every package one project needs, and which declaration each use is written in.
|
|
359
344
|
* One local walk and one batched resolution per file: a use of an import binding is
|
|
360
345
|
* an identifier resolving to the binding's own symbol, so a local declaration that
|
|
361
|
-
* shadows the name is not one. A string of a configuration file
|
|
362
|
-
* the manifest beside the file
|
|
346
|
+
* shadows the name is not one. A string of a configuration file, as the entry sources
|
|
347
|
+
* read them in `configuration`, uses each dependency the manifest beside the file
|
|
348
|
+
* declares that it spells.
|
|
363
349
|
*/
|
|
364
350
|
export function projectNeeds<Brand>(
|
|
365
351
|
project: ProjectView<Brand>,
|
|
@@ -367,6 +353,8 @@ export function projectNeeds<Brand>(
|
|
|
367
353
|
host: Host,
|
|
368
354
|
targetRoot: string,
|
|
369
355
|
parse: ParseFile,
|
|
356
|
+
configuration: ConfigurationFiles,
|
|
357
|
+
workflows: Workflows,
|
|
370
358
|
): ProjectNeeds {
|
|
371
359
|
const programPackages = new Set<string>();
|
|
372
360
|
for (const name of project.program.getSourceFileNames()) {
|
|
@@ -420,7 +408,6 @@ export function projectNeeds<Brand>(
|
|
|
420
408
|
return names;
|
|
421
409
|
};
|
|
422
410
|
const files = sourceFilesOf(project, targetRoot);
|
|
423
|
-
const configuration = configurationFiles(host, targetRoot, files, parse);
|
|
424
411
|
for (const { file, manifestDir } of configuration.modules) {
|
|
425
412
|
const names = declaredAt(joinPath(manifestDir, MANIFEST));
|
|
426
413
|
for (const { node, text } of moduleStrings(file)) {
|
|
@@ -429,7 +416,7 @@ export function projectNeeds<Brand>(
|
|
|
429
416
|
}
|
|
430
417
|
for (const { strings, manifestDirs } of configuration.documents) {
|
|
431
418
|
for (const manifestDir of manifestDirs) {
|
|
432
|
-
const names = declaredAt(joinPath(manifestDir,
|
|
419
|
+
const names = declaredAt(joinPath(manifestDir, MANIFEST));
|
|
433
420
|
for (const text of strings) {
|
|
434
421
|
use([PROJECT_OWNER], dependenciesNamed(text, names), joinPath(manifestDir, MANIFEST));
|
|
435
422
|
}
|
|
@@ -440,11 +427,11 @@ export function projectNeeds<Brand>(
|
|
|
440
427
|
targetRoot,
|
|
441
428
|
files,
|
|
442
429
|
parse,
|
|
443
|
-
scriptRunFiles(host, targetRoot, files),
|
|
430
|
+
scriptRunFiles(host, targetRoot, files, workflows),
|
|
444
431
|
);
|
|
445
432
|
for (const { file, manifestDirs } of [...configuration.outside, ...ranFiles]) {
|
|
446
433
|
for (const manifestDir of manifestDirs) {
|
|
447
|
-
const names = declaredAt(joinPath(manifestDir,
|
|
434
|
+
const names = declaredAt(joinPath(manifestDir, MANIFEST));
|
|
448
435
|
for (const { text } of moduleStrings(file)) {
|
|
449
436
|
use([PROJECT_OWNER], dependenciesNamed(text, names), joinPath(manifestDir, MANIFEST));
|
|
450
437
|
}
|
|
@@ -454,44 +441,46 @@ export function projectNeeds<Brand>(
|
|
|
454
441
|
}
|
|
455
442
|
|
|
456
443
|
/**
|
|
457
|
-
* The JavaScript files no program holds that a
|
|
458
|
-
* project's files runs, each with the directory of that manifest, and those a
|
|
459
|
-
* step or git hook
|
|
460
|
-
* target root and in no `node_modules
|
|
444
|
+
* The JavaScript files no program holds that a command string of a manifest at or above one of
|
|
445
|
+
* the project's files runs or names, each with the directory of that manifest, and those a
|
|
446
|
+
* workflow step or git hook names, with the target root's: a path `pathsNamed` reads, below the
|
|
447
|
+
* target root and in no `node_modules`.
|
|
461
448
|
*/
|
|
462
449
|
function scriptRunFiles(
|
|
463
450
|
host: Host,
|
|
464
451
|
targetRoot: string,
|
|
465
452
|
files: SourceFiles,
|
|
453
|
+
workflows: Workflows,
|
|
466
454
|
): readonly { readonly path: string; readonly manifestDir: string }[] {
|
|
467
455
|
const root = resolvePath(host.workingDirectory(), targetRoot);
|
|
468
456
|
const dirs = new Set<string>([root]);
|
|
469
457
|
for (const name of files.byName.keys()) {
|
|
470
|
-
for (
|
|
471
|
-
if (
|
|
458
|
+
for (const dir of ancestors(dirnamePath(name), root)) {
|
|
459
|
+
if (dirs.has(dir)) {
|
|
472
460
|
break;
|
|
473
461
|
}
|
|
474
462
|
dirs.add(dir);
|
|
475
463
|
}
|
|
476
464
|
}
|
|
477
|
-
const
|
|
478
|
-
[root,
|
|
465
|
+
const named = new Map<string, readonly string[]>([
|
|
466
|
+
[root, workflows.readings.flatMap(pathsNamed).map((one) => one.path)],
|
|
479
467
|
]);
|
|
480
468
|
for (const dir of dirs) {
|
|
481
|
-
const read =
|
|
469
|
+
const read = readDocument(host, joinPath(dir, MANIFEST));
|
|
482
470
|
if (read !== undefined && isRecord(read.value)) {
|
|
483
|
-
const own =
|
|
484
|
-
|
|
471
|
+
const own = manifestReadings(host, dir, read.value)
|
|
472
|
+
.flatMap(pathsNamed)
|
|
473
|
+
.map((one) => one.path);
|
|
474
|
+
named.set(dir, [...own, ...(named.get(dir) ?? [])]);
|
|
485
475
|
}
|
|
486
476
|
}
|
|
487
477
|
const found: { path: string; manifestDir: string }[] = [];
|
|
488
|
-
for (const [manifestDir,
|
|
489
|
-
for (const
|
|
490
|
-
const
|
|
491
|
-
const below = path === undefined ? undefined : relativePath(root, path);
|
|
478
|
+
for (const [manifestDir, paths] of named) {
|
|
479
|
+
for (const path of new Set(paths)) {
|
|
480
|
+
const below = SCRIPT_FILE.test(path) ? relativePath(root, path) : undefined;
|
|
492
481
|
if (
|
|
493
|
-
|
|
494
|
-
below
|
|
482
|
+
below !== undefined &&
|
|
483
|
+
!inInstalledPackages(below) &&
|
|
495
484
|
!files.byName.has(path) &&
|
|
496
485
|
host.kindOf(path) === "file"
|
|
497
486
|
) {
|
|
@@ -502,6 +491,54 @@ function scriptRunFiles(
|
|
|
502
491
|
return found;
|
|
503
492
|
}
|
|
504
493
|
|
|
494
|
+
/** What the command strings of one manifest, its scripts and nodemon's command, run. */
|
|
495
|
+
function manifestReadings(
|
|
496
|
+
host: Host,
|
|
497
|
+
dir: string,
|
|
498
|
+
manifest: Record<string, unknown>,
|
|
499
|
+
): readonly CommandReading[] {
|
|
500
|
+
return manifestCommands(host, dir, manifest).map(({ command }) => readCommands(command, dir));
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
/** What one manifest's command strings use, held with the whole text of nodemon's configuration. */
|
|
504
|
+
function manifestUses(host: Host, dir: string, manifest: Record<string, unknown>): CommandUses {
|
|
505
|
+
const uses = usesOf(manifestReadings(host, dir, manifest));
|
|
506
|
+
const texts = nodemonTexts(host, dir, manifest).map(({ text }) => text);
|
|
507
|
+
return { ...uses, held: [uses.held, ...texts].join("\n") };
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
/** What the target root's workflow steps, git hooks and recipes use, held with their files' whole text. */
|
|
511
|
+
function workflowUses(workflows: Workflows): CommandUses {
|
|
512
|
+
const uses = usesOf(workflows.readings);
|
|
513
|
+
return { ...uses, held: [uses.held, ...workflows.texts].join("\n") };
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
/** What some command strings say about the packages they use. */
|
|
517
|
+
interface CommandUses {
|
|
518
|
+
/** Every static word of their commands, which uses a dependency whose command it is. */
|
|
519
|
+
readonly words: ReadonlySet<string>;
|
|
520
|
+
/** The package each module a read command preloads by name is in. */
|
|
521
|
+
readonly preloads: ReadonlySet<string>;
|
|
522
|
+
/** The whole text of every string, which the dependency rule reads: each package or command name in it is a use. */
|
|
523
|
+
readonly held: string;
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
function usesOf(readings: readonly CommandReading[]): CommandUses {
|
|
527
|
+
return {
|
|
528
|
+
words: new Set(
|
|
529
|
+
readings.flatMap((one) =>
|
|
530
|
+
one.commands.flatMap((command) => command.words.flatMap((word) => word ?? [])),
|
|
531
|
+
),
|
|
532
|
+
),
|
|
533
|
+
preloads: new Set(
|
|
534
|
+
readings
|
|
535
|
+
.flatMap((one) => one.runs.flatMap(preloadedPackages))
|
|
536
|
+
.flatMap((specifier) => packageOfSpecifier(specifier) ?? []),
|
|
537
|
+
),
|
|
538
|
+
held: readings.map((one) => one.held).join("\n"),
|
|
539
|
+
};
|
|
540
|
+
}
|
|
541
|
+
|
|
505
542
|
/** The declarations of the inventory a use written at one node belongs to. */
|
|
506
543
|
function ownersOf(file: SourceFile, held: Inventory, node: Node): readonly string[] {
|
|
507
544
|
const parent = node.parent as Node | undefined;
|
|
@@ -599,8 +636,17 @@ function fileNeeds<Brand>(
|
|
|
599
636
|
if (names.size > 0 || automatic.globals.size > 0) {
|
|
600
637
|
visit(file);
|
|
601
638
|
}
|
|
639
|
+
const loads = runtimeLoads(file);
|
|
640
|
+
const callees = loads.flatMap((load) => load.callees);
|
|
641
|
+
const amdCallees = new Set(loads.flatMap((load) => (load.amd ? load.callees : [])));
|
|
602
642
|
|
|
603
|
-
const asked = [
|
|
643
|
+
const asked = [
|
|
644
|
+
...specifiers,
|
|
645
|
+
...bindings.map(({ node }) => node),
|
|
646
|
+
...candidates,
|
|
647
|
+
...globals,
|
|
648
|
+
...callees,
|
|
649
|
+
];
|
|
604
650
|
const handles: Handle<Brand>[] = asked.map((node) => project.handle(node));
|
|
605
651
|
const resolved = project.symbolsAt(handles);
|
|
606
652
|
|
|
@@ -676,35 +722,96 @@ function fileNeeds<Brand>(
|
|
|
676
722
|
for (const reference of file.typeReferenceDirectives) {
|
|
677
723
|
use(ownersOf(file, held, file), typePackages(reference.fileName, programPackages));
|
|
678
724
|
}
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
725
|
+
// A callee the checker leaves unanswered may be a require, so its call holds the
|
|
726
|
+
// dependency it names by live code, as program.33 holds one.
|
|
727
|
+
const calleesAt = unresolvedAt + globals.length;
|
|
728
|
+
const decided = new Map<string, boolean>();
|
|
729
|
+
const requires = new Set<Identifier>();
|
|
730
|
+
const unansweredCallees = new Set<Identifier>();
|
|
731
|
+
callees.forEach((callee, index) => {
|
|
732
|
+
const symbol = resolved[calleesAt + index];
|
|
733
|
+
if (symbol === UNANSWERED) {
|
|
734
|
+
unansweredCallees.add(callee);
|
|
735
|
+
return;
|
|
736
|
+
}
|
|
737
|
+
// The decision reads the callee's symbol, its written name and its platform name, and nothing else.
|
|
738
|
+
const platform = amdCallees.has(callee) ? amdPlatform(callee) : "require";
|
|
739
|
+
const key =
|
|
740
|
+
symbol === undefined ? undefined : `${symbol.id}\u0000${platform}\u0000${callee.text}`;
|
|
741
|
+
const answer =
|
|
742
|
+
(key === undefined ? undefined : decided.get(key)) ??
|
|
743
|
+
callsPlatform(project, platform, callee, symbol);
|
|
744
|
+
if (key !== undefined) {
|
|
745
|
+
decided.set(key, answer);
|
|
746
|
+
}
|
|
747
|
+
if (answer) {
|
|
748
|
+
requires.add(callee);
|
|
749
|
+
}
|
|
750
|
+
});
|
|
751
|
+
for (const { specifier, named, callees: through } of loads) {
|
|
752
|
+
if (through.length === 0 || through.some((one) => requires.has(one))) {
|
|
682
753
|
use(ownersOf(file, held, specifier), [named]);
|
|
754
|
+
} else if (through.some((one) => unansweredCallees.has(one))) {
|
|
755
|
+
use([PROJECT_OWNER], [named]);
|
|
683
756
|
}
|
|
684
757
|
}
|
|
685
758
|
return resolved.slice(0, specifiers.length).includes(UNANSWERED);
|
|
686
759
|
}
|
|
687
760
|
|
|
688
761
|
/**
|
|
689
|
-
*
|
|
690
|
-
*
|
|
762
|
+
* A call of one file that may load or resolve a package at run time: the literal specifier
|
|
763
|
+
* naming it, and the names a `require` would be written with, of which one has to be a
|
|
764
|
+
* `require` for the call to need the package; none for a use where it stands.
|
|
691
765
|
*/
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
766
|
+
interface RuntimeLoad {
|
|
767
|
+
readonly specifier: Texted;
|
|
768
|
+
readonly named: string;
|
|
769
|
+
readonly callees: readonly Identifier[];
|
|
770
|
+
/** Whether the specifier is an id of an AMD call's dependency list, its callee AMD's `define` or `require`. */
|
|
771
|
+
readonly amd: boolean;
|
|
772
|
+
}
|
|
773
|
+
|
|
774
|
+
/**
|
|
775
|
+
* The calls one file may load or resolve a package with at run time, each of whose first
|
|
776
|
+
* argument is literal text naming a package: a `require()` call, which the compiler lists among
|
|
777
|
+
* a file's imports only in a JavaScript file and only through the bare name; a `.resolve` of
|
|
778
|
+
* another name, which needs it where that name is a `require`; and `import.meta.resolve` or
|
|
779
|
+
* a `.resolve` of the name `require`, whatever it names, a use where it stands; and each id of
|
|
780
|
+
* an AMD dependency list (references-ts.37), which needs it where the call is AMD's.
|
|
781
|
+
*/
|
|
782
|
+
function runtimeLoads(file: SourceFile): readonly RuntimeLoad[] {
|
|
783
|
+
const found: RuntimeLoad[] = [];
|
|
697
784
|
const visit = (node: Node): void => {
|
|
698
|
-
|
|
699
|
-
|
|
785
|
+
const amd = amdLoadOf(node);
|
|
786
|
+
if (amd !== undefined) {
|
|
787
|
+
for (const { id } of amd.ids) {
|
|
788
|
+
const named = packageOfSpecifier(id.text);
|
|
789
|
+
if (named !== undefined) {
|
|
790
|
+
found.push({ specifier: id, named, callees: [amd.callee], amd: true });
|
|
791
|
+
}
|
|
792
|
+
}
|
|
793
|
+
} else if (isCallExpression(node)) {
|
|
700
794
|
const [argument] = node.arguments;
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
callee
|
|
704
|
-
|
|
705
|
-
(
|
|
706
|
-
|
|
707
|
-
|
|
795
|
+
if (argument !== undefined && isLiteralText(argument)) {
|
|
796
|
+
const named = packageOfSpecifier(argument.text);
|
|
797
|
+
const callee = parenthesesRemoved(node.expression);
|
|
798
|
+
const receiver =
|
|
799
|
+
isPropertyAccessExpression(callee) && callee.name.text === "resolve"
|
|
800
|
+
? parenthesesRemoved(callee.expression)
|
|
801
|
+
: undefined;
|
|
802
|
+
const stands =
|
|
803
|
+
receiver !== undefined &&
|
|
804
|
+
((isMetaProperty(receiver) && receiver.name.text === "meta") ||
|
|
805
|
+
(isIdentifier(receiver) && receiver.text === "require"));
|
|
806
|
+
const callees = stands
|
|
807
|
+
? []
|
|
808
|
+
: [
|
|
809
|
+
writtenName(callee),
|
|
810
|
+
receiver === undefined ? undefined : writtenName(receiver),
|
|
811
|
+
].filter((one) => one !== undefined);
|
|
812
|
+
if (named !== undefined && (stands || callees.length > 0)) {
|
|
813
|
+
found.push({ specifier: argument, named, callees, amd: false });
|
|
814
|
+
}
|
|
708
815
|
}
|
|
709
816
|
}
|
|
710
817
|
node.forEachChild(visit);
|
|
@@ -797,8 +904,8 @@ function lineAndColumn(text: string, offset: number): { line: number; column: nu
|
|
|
797
904
|
|
|
798
905
|
/** The installed copy of one dependency, read where the package manager puts it for the target. */
|
|
799
906
|
function installedOf(host: Host, root: string, name: string): InstalledDependency | undefined {
|
|
800
|
-
for (
|
|
801
|
-
const read =
|
|
907
|
+
for (const dir of ancestors(root)) {
|
|
908
|
+
const read = readDocument(host, joinPath(dir, INSTALLED_PACKAGES, name, MANIFEST));
|
|
802
909
|
if (read !== undefined && isRecord(read.value)) {
|
|
803
910
|
const bin = read.value["bin"];
|
|
804
911
|
const peers = read.value["peerDependencies"];
|
|
@@ -815,10 +922,8 @@ function installedOf(host: Host, root: string, name: string): InstalledDependenc
|
|
|
815
922
|
: [],
|
|
816
923
|
};
|
|
817
924
|
}
|
|
818
|
-
if (dirnamePath(dir) === dir) {
|
|
819
|
-
return undefined;
|
|
820
|
-
}
|
|
821
925
|
}
|
|
926
|
+
return undefined;
|
|
822
927
|
}
|
|
823
928
|
|
|
824
929
|
/** Every dependency the manifest text at `path` declares, in the order the text writes them. */
|
|
@@ -857,20 +962,6 @@ export function declarationKey(dependency: DeclaredDependency): string {
|
|
|
857
962
|
return `${dependency.position.path}\u0000${dependency.name}`;
|
|
858
963
|
}
|
|
859
964
|
|
|
860
|
-
/** Every token of every value of one manifest's `scripts` member. */
|
|
861
|
-
function scriptTokensOf(manifest: Record<string, unknown>): ReadonlySet<string> {
|
|
862
|
-
const scripts = manifest["scripts"];
|
|
863
|
-
const found = new Set<string>();
|
|
864
|
-
if (isRecord(scripts)) {
|
|
865
|
-
for (const command of Object.values(scripts)) {
|
|
866
|
-
if (typeof command === "string") {
|
|
867
|
-
scriptTokens(command).forEach((token) => found.add(token));
|
|
868
|
-
}
|
|
869
|
-
}
|
|
870
|
-
}
|
|
871
|
-
return found;
|
|
872
|
-
}
|
|
873
|
-
|
|
874
965
|
/** Whether a path below the target root lies in the directory `dir` below it, `""` being the root. */
|
|
875
966
|
function isInside(path: string, dir: string): boolean {
|
|
876
967
|
return dir === "" || path.startsWith(`${dir}/`);
|
|
@@ -943,6 +1034,7 @@ function addNeededPeers(
|
|
|
943
1034
|
export function dependenciesOf(
|
|
944
1035
|
host: Host,
|
|
945
1036
|
targetRoot: string,
|
|
1037
|
+
workflows: Workflows,
|
|
946
1038
|
perProject: readonly ProjectNeeds[],
|
|
947
1039
|
candidates: readonly string[],
|
|
948
1040
|
members: readonly string[] = [],
|
|
@@ -965,29 +1057,38 @@ export function dependenciesOf(
|
|
|
965
1057
|
unbuilt.add(path);
|
|
966
1058
|
}
|
|
967
1059
|
}
|
|
968
|
-
const workflow =
|
|
1060
|
+
const workflow = workflowUses(workflows);
|
|
969
1061
|
const declared: DeclaredDependency[] = [];
|
|
970
1062
|
const ran = new Set<string>();
|
|
971
1063
|
const peers = new Map<string, readonly string[]>();
|
|
972
1064
|
const uninstalledHere = new Set(nested);
|
|
973
1065
|
for (const [dir, path] of manifests) {
|
|
974
|
-
const read =
|
|
1066
|
+
const read = readDocument(host, joinPath(dir, MANIFEST));
|
|
975
1067
|
if (read === undefined || !isRecord(read.value)) {
|
|
976
1068
|
continue;
|
|
977
1069
|
}
|
|
978
|
-
const
|
|
1070
|
+
const own = manifestUses(host, dir, read.value);
|
|
1071
|
+
const held = `${own.held}\n${workflow.held}`;
|
|
979
1072
|
for (const dependency of declaredIn(read.text, read.value, path, scopeOf(path))) {
|
|
980
1073
|
const found = installedOf(host, dir, dependency.name);
|
|
981
1074
|
if (found === undefined && uninstalledHere.has(dir)) {
|
|
982
1075
|
continue;
|
|
983
1076
|
}
|
|
984
1077
|
declared.push(dependency);
|
|
1078
|
+
if (
|
|
1079
|
+
own.preloads.has(dependency.name) ||
|
|
1080
|
+
workflow.preloads.has(dependency.name) ||
|
|
1081
|
+
heldNames(held, [dependency.name]).size > 0
|
|
1082
|
+
) {
|
|
1083
|
+
ran.add(declarationKey(dependency));
|
|
1084
|
+
}
|
|
985
1085
|
if (found === undefined) {
|
|
986
1086
|
continue;
|
|
987
1087
|
}
|
|
988
1088
|
peers.set(declarationKey(dependency), found.peers);
|
|
989
|
-
const runs = (command: string): boolean =>
|
|
990
|
-
|
|
1089
|
+
const runs = (command: string): boolean =>
|
|
1090
|
+
own.words.has(command) || workflow.words.has(command);
|
|
1091
|
+
if (found.commands.some(runs) || heldNames(held, found.commands).size > 0) {
|
|
991
1092
|
ran.add(declarationKey(dependency));
|
|
992
1093
|
}
|
|
993
1094
|
}
|
|
@@ -1045,10 +1146,7 @@ export function dependenciesOf(
|
|
|
1045
1146
|
const heldBy = new Map<string, readonly string[]>();
|
|
1046
1147
|
for (const [key, held] of holders) {
|
|
1047
1148
|
if (!live.has(key) && !ran.has(key)) {
|
|
1048
|
-
heldBy.set(
|
|
1049
|
-
key,
|
|
1050
|
-
[...held].sort((a, b) => (a < b ? -1 : 1)),
|
|
1051
|
-
);
|
|
1149
|
+
heldBy.set(key, [...held].sort(bytewise));
|
|
1052
1150
|
}
|
|
1053
1151
|
}
|
|
1054
1152
|
const users = new Map<string, number>();
|
|
@@ -1060,10 +1158,7 @@ export function dependenciesOf(
|
|
|
1060
1158
|
for (const id of candidates) {
|
|
1061
1159
|
const sole = [...(uses.get(id) ?? [])].filter((one) => users.get(one) === 1 && names.has(one));
|
|
1062
1160
|
if (sole.length > 0) {
|
|
1063
|
-
lastUses.set(
|
|
1064
|
-
id,
|
|
1065
|
-
sole.sort((a, b) => (a < b ? -1 : 1)),
|
|
1066
|
-
);
|
|
1161
|
+
lastUses.set(id, sole.sort(bytewise));
|
|
1067
1162
|
}
|
|
1068
1163
|
}
|
|
1069
1164
|
const owners = new Map<string, Set<string>>();
|
|
@@ -1075,7 +1170,7 @@ export function dependenciesOf(
|
|
|
1075
1170
|
}
|
|
1076
1171
|
}
|
|
1077
1172
|
const fileLastUses = new Map<string, string[]>();
|
|
1078
|
-
for (const [one, held] of [...owners].sort(([a], [b]) => (a
|
|
1173
|
+
for (const [one, held] of [...owners].sort(([a], [b]) => bytewise(a, b))) {
|
|
1079
1174
|
const paths = new Set([...held].map((owner) => owner.replace(/:\d+:\d+$/u, "")));
|
|
1080
1175
|
const [path] = paths;
|
|
1081
1176
|
if (paths.size === 1 && path !== undefined && path !== PROJECT_OWNER) {
|