zyrk 0.5.1 → 0.5.3
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 +12 -1
- package/VERSION +1 -1
- package/dist/cli/main.d.ts +1 -0
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/main.js +9 -0
- package/dist/cli/parse.d.ts.map +1 -1
- package/dist/cli/parse.js +2 -0
- package/dist/cli/progress.d.ts +10 -0
- package/dist/cli/progress.d.ts.map +1 -0
- package/dist/cli/progress.js +52 -0
- package/dist/install/import-npm-workspace.d.ts +1 -0
- package/dist/install/import-npm-workspace.d.ts.map +1 -1
- package/dist/install/import-npm-workspace.js +33 -11
- package/dist/install/import-npm.d.ts +3 -1
- package/dist/install/import-npm.d.ts.map +1 -1
- package/dist/install/import-npm.js +11 -7
- package/dist/install/run.d.ts +6 -0
- package/dist/install/run.d.ts.map +1 -1
- package/dist/install/run.js +33 -3
- package/dist/install/workspace-graph.d.ts +7 -1
- package/dist/install/workspace-graph.d.ts.map +1 -1
- package/dist/install/workspace-graph.js +49 -6
- package/dist/install/workspace-install.d.ts.map +1 -1
- package/dist/install/workspace-install.js +21 -4
- package/dist/install/workspace-mutation.d.ts.map +1 -1
- package/dist/install/workspace-mutation.js +4 -1
- package/dist/install/workspace-overrides.d.ts +11 -0
- package/dist/install/workspace-overrides.d.ts.map +1 -0
- package/dist/install/workspace-overrides.js +67 -0
- package/dist/install/workspaces.d.ts.map +1 -1
- package/dist/install/workspaces.js +4 -1
- package/dist/lockfile/fingerprints.d.ts.map +1 -1
- package/dist/lockfile/fingerprints.js +13 -1
- package/dist/resolve/overrides.d.ts +19 -0
- package/dist/resolve/overrides.d.ts.map +1 -0
- package/dist/resolve/overrides.js +142 -0
- package/dist/resolve/resolver.d.ts +2 -0
- package/dist/resolve/resolver.d.ts.map +1 -1
- package/dist/resolve/resolver.js +60 -16
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -119,7 +119,7 @@ scheme, host, port, and path; redirects cannot expand that scope. Use
|
|
|
119
119
|
Scoped registries route metadata, exact sources, imports and tool commands by
|
|
120
120
|
the real package name, including aliases. Advisory requests are partitioned by
|
|
121
121
|
registry; private names never fall back to a public endpoint. Disabled TLS
|
|
122
|
-
verification is rejected before lookup. Git sources
|
|
122
|
+
verification is rejected before lookup. Git sources and non-workspace local sources remain unsupported;
|
|
123
123
|
they fail explicitly. Optional dependencies incompatible with the selected platform
|
|
124
124
|
are omitted; missing packages, integrity failures, and other optional failures
|
|
125
125
|
remain errors. Platform selection is recorded in the lock. macOS, Windows, and
|
|
@@ -356,3 +356,14 @@ Keep existing data until an explicit migration is supported.
|
|
|
356
356
|
|
|
357
357
|
[MIT](LICENSE). If you want to support development,
|
|
358
358
|
[sponsor the maintainer](https://github.com/sponsors/kingjethro999).
|
|
359
|
+
|
|
360
|
+
Root `package.json` dependency overrides support exact specifications, nested and
|
|
361
|
+
version-qualified selectors, self rules (`.`), and `$direct` references. Direct
|
|
362
|
+
dependency overrides must match the declared specification. Workspace member
|
|
363
|
+
overrides are ignored, matching npm root-only policy. Override rule order is
|
|
364
|
+
recorded in the manifest fingerprint; frozen installs reject policy drift.
|
|
365
|
+
|
|
366
|
+
`zyrk help` and `zyrk --help` both show help successfully. Installs report
|
|
367
|
+
preparation, resolution, verified source counts, realization, approved builds,
|
|
368
|
+
and project linking on stderr. Interactive terminals show an activity spinner;
|
|
369
|
+
redirected output contains plain phase messages. `--json` disables progress.
|
package/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
v0.5.
|
|
1
|
+
v0.5.3
|
package/dist/cli/main.d.ts
CHANGED
package/dist/cli/main.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"AA2BA,OAAO,EAAe,SAAS,EAAe,MAAM,cAAc,CAAC;AACnE,OAAO,EAAE,SAAS,EAAE,CAAC;AACrB,OAAO,EAAoB,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAExE,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAM3C,OAAO,EAAqC,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAEhF,eAAO,MAAM,uBAAuB,IAAI,CAAC;AA2DzC,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAwBhD;AAED,MAAM,MAAM,SAAS,GAAG;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AA6EF;;;GAGG;AACH,wBAAgB,QAAQ,CACtB,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC,UAAU,CAAA;CAAE,GACnD,SAAS,CAgDX;AAmBD,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,EAAE,KAAK,CAAC;IACb,QAAQ,EAAE,cAAc,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACxB,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IACvB,MAAM,EAAE;QAAE,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC;IAC1C,MAAM,EAAE;QAAE,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IAC3D,WAAW,CAAC,EAAE,MAAM,MAAM,CAAC;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,OAAO,CAAC,eAAe,CAAC,CAAC;CACxC,CAAC;AAEF,gFAAgF;AAChF,wBAAsB,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CA4ZpE"}
|
package/dist/cli/main.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { createInstallProgress } from "./progress.js";
|
|
1
2
|
import { runMaintenanceCommand } from "../commands/maintenance.js";
|
|
2
3
|
import { runDeployCommand } from "../commands/deploy.js";
|
|
3
4
|
import { runPatchCommand } from "../commands/patch.js";
|
|
@@ -379,6 +380,7 @@ export async function runCli(options) {
|
|
|
379
380
|
(parsed.command === "install" || parsed.command === "i")) {
|
|
380
381
|
if (isGlobalInstallRequest(parsed.command, parsed.commandArgs, options.env))
|
|
381
382
|
return emit(fail(globalInstallError(parsed.command), parsed));
|
|
383
|
+
const progress = createInstallProgress(options.stderr, parsed.json);
|
|
382
384
|
try {
|
|
383
385
|
if (parsed.commandArgs.includes("--help") ||
|
|
384
386
|
parsed.commandArgs.includes("-h")) {
|
|
@@ -413,6 +415,7 @@ export async function runCli(options) {
|
|
|
413
415
|
else
|
|
414
416
|
specs.push(token);
|
|
415
417
|
}
|
|
418
|
+
progress.update({ phase: "planning" });
|
|
416
419
|
const cwd = options.cwd ?? process.cwd();
|
|
417
420
|
const tools = options.tools
|
|
418
421
|
? await options.tools()
|
|
@@ -429,12 +432,14 @@ export async function runCli(options) {
|
|
|
429
432
|
}),
|
|
430
433
|
};
|
|
431
434
|
const result = await installProject({
|
|
435
|
+
onProgress: progress.update,
|
|
432
436
|
...flags,
|
|
433
437
|
env: options.env,
|
|
434
438
|
specs,
|
|
435
439
|
projectDir: cwd,
|
|
436
440
|
...tools,
|
|
437
441
|
});
|
|
442
|
+
progress.close();
|
|
438
443
|
if (parsed.json)
|
|
439
444
|
return emit({
|
|
440
445
|
exitCode: 0,
|
|
@@ -451,8 +456,12 @@ export async function runCli(options) {
|
|
|
451
456
|
});
|
|
452
457
|
}
|
|
453
458
|
catch (error) {
|
|
459
|
+
progress.close();
|
|
454
460
|
return emit(fail(toZyrkError(error, "zyrk install failed."), parsed));
|
|
455
461
|
}
|
|
462
|
+
finally {
|
|
463
|
+
progress.close();
|
|
464
|
+
}
|
|
456
465
|
}
|
|
457
466
|
if (!parsed.help &&
|
|
458
467
|
!parsed.version &&
|
package/dist/cli/parse.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../../src/cli/parse.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,+DAA+D;IAC/D,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,6EAA6E;IAC7E,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,wEAAwE;IACxE,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B;;;;OAIG;IACH,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,IAAI,EAAE,OAAO,CAAC;CACf,CAAC;AAEF,wBAAgB,SAAS,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,UAAU,
|
|
1
|
+
{"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../../src/cli/parse.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,+DAA+D;IAC/D,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,6EAA6E;IAC7E,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,wEAAwE;IACxE,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B;;;;OAIG;IACH,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,IAAI,EAAE,OAAO,CAAC;CACf,CAAC;AAEF,wBAAgB,SAAS,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,UAAU,CAmD7D;AAKD;;;;;;;;;;GAUG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,SAAS,MAAM,EAAE,EAC9B,GAAG,EAAE,MAAM,CAAC,UAAU,GACrB,OAAO,CAOT"}
|
package/dist/cli/parse.js
CHANGED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { InstallProgress } from "../install/run.ts";
|
|
2
|
+
/** Presentation only: never writes to stdout or exposes package URLs or paths. */
|
|
3
|
+
export declare function createInstallProgress(stream: {
|
|
4
|
+
write(chunk: string): unknown;
|
|
5
|
+
isTTY?: boolean;
|
|
6
|
+
}, quiet: boolean): {
|
|
7
|
+
update(event: InstallProgress): void;
|
|
8
|
+
close(): void;
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=progress.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"progress.d.ts","sourceRoot":"","sources":["../../src/cli/progress.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAWzD,kFAAkF;AAClF,wBAAgB,qBAAqB,CACnC,MAAM,EAAE;IAAE,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,EAC1D,KAAK,EAAE,OAAO,GACb;IAAE,MAAM,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAAC;IAAC,KAAK,IAAI,IAAI,CAAA;CAAE,CAuCzD"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
const labels = {
|
|
2
|
+
planning: "Preparing installation",
|
|
3
|
+
resolving: "Resolving dependencies",
|
|
4
|
+
fetching: "Verifying package sources",
|
|
5
|
+
realizing: "Preparing shared realizations",
|
|
6
|
+
building: "Preparing approved private builds",
|
|
7
|
+
linking: "Linking project dependencies",
|
|
8
|
+
};
|
|
9
|
+
/** Presentation only: never writes to stdout or exposes package URLs or paths. */
|
|
10
|
+
export function createInstallProgress(stream, quiet) {
|
|
11
|
+
let timer;
|
|
12
|
+
let current = "", last = "", frame = 0, closed = false;
|
|
13
|
+
const write = (text) => {
|
|
14
|
+
try {
|
|
15
|
+
stream.write(text);
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
/* A display failure cannot alter installation. */
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
const render = () => write(`\r\u001b[2K${["|", "/", "-", "\\"][frame++ % 4]} ${current}`);
|
|
22
|
+
return {
|
|
23
|
+
update(event) {
|
|
24
|
+
if (quiet || closed)
|
|
25
|
+
return;
|
|
26
|
+
current =
|
|
27
|
+
labels[event.phase] +
|
|
28
|
+
(event.total === undefined
|
|
29
|
+
? ""
|
|
30
|
+
: ` (${event.completed ?? 0}/${event.total})`);
|
|
31
|
+
if (stream.isTTY) {
|
|
32
|
+
render();
|
|
33
|
+
if (!timer) {
|
|
34
|
+
timer = setInterval(render, 100);
|
|
35
|
+
timer.unref();
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
else if (current !== last)
|
|
39
|
+
write(`zyrk: ${current}\n`);
|
|
40
|
+
last = current;
|
|
41
|
+
},
|
|
42
|
+
close() {
|
|
43
|
+
if (closed)
|
|
44
|
+
return;
|
|
45
|
+
closed = true;
|
|
46
|
+
if (timer)
|
|
47
|
+
clearInterval(timer);
|
|
48
|
+
if (!quiet && stream.isTTY && current)
|
|
49
|
+
write("\r\u001b[2K");
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { NpmLockDoc } from "../lockfile/types.ts";
|
|
2
2
|
import type { WorkspaceProject } from "./workspaces.ts";
|
|
3
3
|
import type { WorkspaceGraph } from "./workspace-graph.ts";
|
|
4
|
+
/** Import stays pure while live-node scope refinement converges. */
|
|
4
5
|
export declare function importNpmWorkspaceLock(doc: NpmLockDoc, project: WorkspaceProject, origin: string | ((name: string) => string)): WorkspaceGraph;
|
|
5
6
|
//# sourceMappingURL=import-npm-workspace.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"import-npm-workspace.d.ts","sourceRoot":"","sources":["../../src/install/import-npm-workspace.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"import-npm-workspace.d.ts","sourceRoot":"","sources":["../../src/install/import-npm-workspace.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAQvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,KAAK,EACV,cAAc,EAGf,MAAM,sBAAsB,CAAC;AA0V9B,oEAAoE;AACpE,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,UAAU,EACf,OAAO,EAAE,gBAAgB,EACzB,MAAM,EAAE,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC,GAC1C,cAAc,CAWhB"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/** Translate npm's physical virtual tree without selecting new registry versions. */
|
|
2
2
|
import * as path from "node:path";
|
|
3
|
+
import { workspaceOverrides, refineWorkspaceOverride, WorkspaceOverrideRestart, } from "./workspace-overrides.js";
|
|
3
4
|
import { satisfies } from "semver";
|
|
4
5
|
import { validateLockDoc } from "../lockfile/read.js";
|
|
5
6
|
import { sha512Hex } from "../util/hash.js";
|
|
@@ -8,7 +9,7 @@ import { importNpmLock } from "./import-npm.js";
|
|
|
8
9
|
import { lockMismatch, cleanUrl } from "./lock.js";
|
|
9
10
|
import { ZyrkError } from "../errors.js";
|
|
10
11
|
import { assertWorkspacePlatform } from "./workspace-graph.js";
|
|
11
|
-
|
|
12
|
+
function importNpmWorkspaceLockPass(doc, project, origin, overrideState) {
|
|
12
13
|
if (!doc ||
|
|
13
14
|
typeof doc !== "object" ||
|
|
14
15
|
Array.isArray(doc) ||
|
|
@@ -65,6 +66,8 @@ export function importNpmWorkspaceLock(doc, project, origin) {
|
|
|
65
66
|
(typeof origin === "string" && !cleanUrl(origin)))
|
|
66
67
|
throw lockMismatch("workspace adoption needs an unannotated npm v2/v3 lock");
|
|
67
68
|
const packages = doc.packages;
|
|
69
|
+
const overrides = overrideState.policy;
|
|
70
|
+
const contexts = new Map(overrideState.contexts);
|
|
68
71
|
const graph = { nodes: [], importers: {}, omissions: [] };
|
|
69
72
|
const locations = new Map();
|
|
70
73
|
const local = new Map(project.importers.map((i) => [i.id === "." ? "" : i.id, i]));
|
|
@@ -131,7 +134,10 @@ export function importNpmWorkspaceLock(doc, project, origin) {
|
|
|
131
134
|
}
|
|
132
135
|
};
|
|
133
136
|
const populated = new Set();
|
|
134
|
-
const load = (location, name, spec, from) => {
|
|
137
|
+
const load = (location, name, spec, from, parentContext) => {
|
|
138
|
+
const selectedOverride = overrides.select(parentContext, name, spec);
|
|
139
|
+
spec = selectedOverride.spec;
|
|
140
|
+
const contextKey = `${location}\0${selectedOverride.context.id}`;
|
|
135
141
|
const entry = packages[location];
|
|
136
142
|
if (entry.link === true) {
|
|
137
143
|
const target = locations.get(entry.resolved);
|
|
@@ -143,6 +149,7 @@ export function importNpmWorkspaceLock(doc, project, origin) {
|
|
|
143
149
|
(!["*", "^", "~"].includes(range) &&
|
|
144
150
|
!satisfies(target.version, range)))
|
|
145
151
|
throw lockMismatch("npm workspace link disagrees with requirement");
|
|
152
|
+
refineWorkspaceOverride(overrideState.contexts, target.key, selectedOverride.context);
|
|
146
153
|
return target;
|
|
147
154
|
}
|
|
148
155
|
// Reuse the strict single-selection adapter's archive, alias, source and
|
|
@@ -155,12 +162,12 @@ export function importNpmWorkspaceLock(doc, project, origin) {
|
|
|
155
162
|
lockfileVersion: 3,
|
|
156
163
|
packages: { "": {}, [`node_modules/${name}`]: shallow },
|
|
157
164
|
}, { [name]: spec }, origin).nodes[0];
|
|
158
|
-
let node = locations.get(
|
|
165
|
+
let node = locations.get(contextKey);
|
|
159
166
|
if (!node) {
|
|
160
167
|
const { peerBindings: _bindings, ...source } = selected;
|
|
161
168
|
node = {
|
|
162
169
|
...source,
|
|
163
|
-
key: `${selected.name}@${selected.version}#${sha512Hex(location).slice(0, 16)}`,
|
|
170
|
+
key: `${selected.name}@${selected.version}#${sha512Hex(selectedOverride.context.id ? contextKey : location).slice(0, 16)}`,
|
|
164
171
|
kind: "registry",
|
|
165
172
|
edges: [],
|
|
166
173
|
peers: {},
|
|
@@ -168,25 +175,26 @@ export function importNpmWorkspaceLock(doc, project, origin) {
|
|
|
168
175
|
};
|
|
169
176
|
assertWorkspacePlatform({ nodes: [node], importers: {}, omissions: [] });
|
|
170
177
|
graph.nodes.push(node);
|
|
171
|
-
locations.set(
|
|
178
|
+
locations.set(contextKey, node);
|
|
179
|
+
contexts.set(node.key, selectedOverride.context);
|
|
172
180
|
}
|
|
173
181
|
try {
|
|
174
182
|
populate(location, node);
|
|
175
183
|
}
|
|
176
184
|
catch (cause) {
|
|
177
|
-
populated.delete(
|
|
178
|
-
locations.delete(
|
|
185
|
+
populated.delete(node.key);
|
|
186
|
+
locations.delete(contextKey);
|
|
179
187
|
graph.nodes = graph.nodes.filter((n) => n !== node);
|
|
180
188
|
throw cause;
|
|
181
189
|
}
|
|
182
190
|
return node;
|
|
183
191
|
};
|
|
184
192
|
const populate = (location, node) => {
|
|
185
|
-
if (populated.has(
|
|
193
|
+
if (populated.has(node.key))
|
|
186
194
|
return;
|
|
187
195
|
if (populated.size >= 10000)
|
|
188
196
|
throw lockMismatch("npm import resource limit exceeded");
|
|
189
|
-
populated.add(
|
|
197
|
+
populated.add(node.key);
|
|
190
198
|
const entry = packages[location];
|
|
191
199
|
const requirements = new Map();
|
|
192
200
|
for (const [field, kind] of [
|
|
@@ -227,7 +235,7 @@ export function importNpmWorkspaceLock(doc, project, origin) {
|
|
|
227
235
|
}
|
|
228
236
|
let target;
|
|
229
237
|
try {
|
|
230
|
-
target = load(targetLocation, name, requirement.spec, location);
|
|
238
|
+
target = load(targetLocation, name, requirement.spec, location, contexts.get(node.key));
|
|
231
239
|
}
|
|
232
240
|
catch (cause) {
|
|
233
241
|
if (requirement.kind === "optional" &&
|
|
@@ -259,7 +267,7 @@ export function importNpmWorkspaceLock(doc, project, origin) {
|
|
|
259
267
|
node.peers[name] = null;
|
|
260
268
|
continue;
|
|
261
269
|
}
|
|
262
|
-
const target = load(targetLocation, name, spec, location);
|
|
270
|
+
const target = load(targetLocation, name, spec, location, contexts.get(node.key));
|
|
263
271
|
node.peers[name] = target.key;
|
|
264
272
|
if (!node.edges.some((edge) => edge.name === name))
|
|
265
273
|
node.edges.push({ name, target: target.key, kind: "peer", spec });
|
|
@@ -281,3 +289,17 @@ export function importNpmWorkspaceLock(doc, project, origin) {
|
|
|
281
289
|
graph.nodes.sort((a, b) => a.key.localeCompare(b.key));
|
|
282
290
|
return graph;
|
|
283
291
|
}
|
|
292
|
+
/** Import stays pure while live-node scope refinement converges. */
|
|
293
|
+
export function importNpmWorkspaceLock(doc, project, origin) {
|
|
294
|
+
const state = workspaceOverrides(project), expires = Date.now() + 30000;
|
|
295
|
+
for (let round = 0; round < 128 && Date.now() < expires; round++) {
|
|
296
|
+
try {
|
|
297
|
+
return importNpmWorkspaceLockPass(doc, project, origin, state);
|
|
298
|
+
}
|
|
299
|
+
catch (cause) {
|
|
300
|
+
if (!(cause instanceof WorkspaceOverrideRestart))
|
|
301
|
+
throw cause;
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
throw lockMismatch("npm workspace override import resource limit exceeded");
|
|
305
|
+
}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
+
/** Adopt npm v2/v3 exact selections without asking the registry to pick versions. */
|
|
2
|
+
import { type OverridePolicy } from "../resolve/overrides.ts";
|
|
1
3
|
import type { NpmLockDoc } from "../lockfile/types.ts";
|
|
2
4
|
import type { FinalizedGraph } from "../resolve/resolver.ts";
|
|
3
|
-
export declare function importNpmLock(doc: NpmLockDoc, requirements: Record<string, string>, origin: string | ((name: string) => string)): FinalizedGraph;
|
|
5
|
+
export declare function importNpmLock(doc: NpmLockDoc, requirements: Record<string, string>, origin: string | ((name: string) => string), overrides?: OverridePolicy): FinalizedGraph;
|
|
4
6
|
//# sourceMappingURL=import-npm.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"import-npm.d.ts","sourceRoot":"","sources":["../../src/install/import-npm.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"import-npm.d.ts","sourceRoot":"","sources":["../../src/install/import-npm.ts"],"names":[],"mappings":"AAAA,qFAAqF;AACrF,OAAO,EAEL,KAAK,cAAc,EAEpB,MAAM,yBAAyB,CAAC;AAIjC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,EACV,cAAc,EAEf,MAAM,wBAAwB,CAAC;AAKhC,wBAAgB,aAAa,CAC3B,GAAG,EAAE,UAAU,EACf,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACpC,MAAM,EAAE,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC,EAC3C,SAAS,GAAE,cAAwC,GAClD,cAAc,CAqLhB"}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
/** Adopt npm v2/v3 exact selections without asking the registry to pick versions. */
|
|
2
|
+
import { createRootOverrides, } from "../resolve/overrides.js";
|
|
2
3
|
import { validateLockDoc } from "../lockfile/read.js";
|
|
3
4
|
import { canonicalStrongSri } from "../util/integrity.js";
|
|
4
5
|
import { valid, satisfies } from "semver";
|
|
5
6
|
import { parseRequirement } from "../resolve/spec.js";
|
|
6
7
|
import { sourceIdOf, sha512Hex } from "../util/hash.js";
|
|
7
8
|
import { cleanUrl, lockMismatch, packageName } from "./lock.js";
|
|
8
|
-
export function importNpmLock(doc, requirements, origin) {
|
|
9
|
+
export function importNpmLock(doc, requirements, origin, overrides = createRootOverrides({})) {
|
|
9
10
|
validateLockDoc(doc, "package-lock.json");
|
|
10
11
|
const packages = doc.packages;
|
|
11
12
|
if (!packages || !packages[""])
|
|
@@ -26,8 +27,11 @@ export function importNpmLock(doc, requirements, origin) {
|
|
|
26
27
|
: "";
|
|
27
28
|
}
|
|
28
29
|
};
|
|
29
|
-
const load = (location, edgeName, spec) => {
|
|
30
|
-
const
|
|
30
|
+
const load = (location, edgeName, spec, parentContext) => {
|
|
31
|
+
const selected = overrides.select(parentContext, edgeName, spec);
|
|
32
|
+
spec = selected.spec;
|
|
33
|
+
const contextKey = `${location}\0${selected.context.id}`;
|
|
34
|
+
const existing = locations.get(contextKey);
|
|
31
35
|
const entry = packages[location];
|
|
32
36
|
if (!entry || entry.link === true || entry.inBundle === true)
|
|
33
37
|
throw lockMismatch("npm lock contains an unsupported linked or bundled selection");
|
|
@@ -53,7 +57,7 @@ export function importNpmLock(doc, requirements, origin) {
|
|
|
53
57
|
if (existing)
|
|
54
58
|
return existing;
|
|
55
59
|
const node = {
|
|
56
|
-
key: `${name}@${entry.version}#${sha512Hex(location).slice(0, 16)}`,
|
|
60
|
+
key: `${name}@${entry.version}#${sha512Hex(selected.context.id ? contextKey : location).slice(0, 16)}`,
|
|
57
61
|
name,
|
|
58
62
|
version: entry.version,
|
|
59
63
|
origin: selectedOrigin,
|
|
@@ -96,7 +100,7 @@ export function importNpmLock(doc, requirements, origin) {
|
|
|
96
100
|
node.platform[field] = value;
|
|
97
101
|
}
|
|
98
102
|
}
|
|
99
|
-
locations.set(
|
|
103
|
+
locations.set(contextKey, node);
|
|
100
104
|
const dependencies = Object.create(null);
|
|
101
105
|
for (const [group, kind] of [
|
|
102
106
|
["dependencies", "prod"],
|
|
@@ -128,7 +132,7 @@ export function importNpmLock(doc, requirements, origin) {
|
|
|
128
132
|
}
|
|
129
133
|
throw lockMismatch("npm lock is missing a required dependency");
|
|
130
134
|
}
|
|
131
|
-
const target = load(targetLocation, dep, requirement.spec);
|
|
135
|
+
const target = load(targetLocation, dep, requirement.spec, selected.context);
|
|
132
136
|
node.edges.push({
|
|
133
137
|
name: dep,
|
|
134
138
|
target: target.key,
|
|
@@ -148,7 +152,7 @@ export function importNpmLock(doc, requirements, origin) {
|
|
|
148
152
|
const location = find("", name);
|
|
149
153
|
if (!location)
|
|
150
154
|
throw lockMismatch("npm lock is missing a direct selection");
|
|
151
|
-
return { name, target: load(location, name, spec).key };
|
|
155
|
+
return { name, target: load(location, name, spec, overrides.root).key };
|
|
152
156
|
});
|
|
153
157
|
return {
|
|
154
158
|
nodes: [...locations.values()].sort((a, b) => a.key.localeCompare(b.key)),
|
package/dist/install/run.d.ts
CHANGED
|
@@ -1,7 +1,13 @@
|
|
|
1
1
|
import { type BuildCandidate } from "./private.ts";
|
|
2
2
|
import { RegistryClient } from "../fetch/registry.ts";
|
|
3
3
|
import { Store } from "../store/layout.ts";
|
|
4
|
+
export type InstallProgress = {
|
|
5
|
+
phase: "planning" | "resolving" | "fetching" | "realizing" | "building" | "linking";
|
|
6
|
+
completed?: number;
|
|
7
|
+
total?: number;
|
|
8
|
+
};
|
|
4
9
|
export type InstallOptions = {
|
|
10
|
+
onProgress?: (event: InstallProgress) => void;
|
|
5
11
|
projectDir: string;
|
|
6
12
|
store: Store;
|
|
7
13
|
registry: RegistryClient;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/install/run.ts"],"names":[],"mappings":"AAIA,OAAO,EAOL,KAAK,cAAc,EACpB,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/install/run.ts"],"names":[],"mappings":"AAIA,OAAO,EAOL,KAAK,cAAc,EACpB,MAAM,cAAc,CAAC;AAYtB,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGtD,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAgC3C,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,EACD,UAAU,GACV,WAAW,GACX,UAAU,GACV,WAAW,GACX,UAAU,GACV,SAAS,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AACF,MAAM,MAAM,cAAc,GAAG;IAC3B,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAC;IAC9C,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,KAAK,CAAC;IACb,QAAQ,EAAE,cAAc,CAAC;IACzB,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE;QACT,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;QAC3B,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;QAC3B,MAAM,CAAC,EAAE,OAAO,CAAC;KAClB,CAAC;IACF,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE;QACZ,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;CACH,CAAC;AACF,MAAM,MAAM,aAAa,GAAG;IAC1B,SAAS,EACL,OAAO,GACP,uBAAuB,GACvB,eAAe,GACf,SAAS,GACT,cAAc,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,MAAM,CAAC,EAAE,cAAc,EAAE,CAAC;CAC3B,CAAC;AA4GF,wBAAsB,cAAc,CAClC,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,aAAa,CAAC,CA8zBxB"}
|
package/dist/install/run.js
CHANGED
|
@@ -6,6 +6,7 @@ import { candidates, candidateDigest, approveCandidate, assertApproved, material
|
|
|
6
6
|
import { loadProjectPatches, applyProjectPatches } from "../commands/patch.js";
|
|
7
7
|
import { registerGeneration } from "./metadata.js";
|
|
8
8
|
import { randomId } from "../util/ids.js";
|
|
9
|
+
import { createRootOverrides } from "../resolve/overrides.js";
|
|
9
10
|
import { importNpmLock } from "./import-npm.js";
|
|
10
11
|
/** Native project install: resolve -> verify -> realize -> journaled publication. */
|
|
11
12
|
import { readFile, realpath, lstat, mkdir, rm } from "node:fs/promises";
|
|
@@ -65,10 +66,9 @@ async function readManifest(project) {
|
|
|
65
66
|
throw error("ZYRK_MANIFEST_INVALID", `Project ${group} must contain valid package names and string specifiers.`);
|
|
66
67
|
}
|
|
67
68
|
if (doc.workspaces !== undefined ||
|
|
68
|
-
doc.overrides !== undefined ||
|
|
69
69
|
doc.bundledDependencies !== undefined ||
|
|
70
70
|
doc.bundleDependencies !== undefined)
|
|
71
|
-
throw error("ZYRK_NOT_IMPLEMENTED", "Project workspaces
|
|
71
|
+
throw error("ZYRK_NOT_IMPLEMENTED", "Project workspaces and bundled dependencies are not supported by install yet.");
|
|
72
72
|
if (doc.zyrk !== undefined &&
|
|
73
73
|
(!object(doc.zyrk) ||
|
|
74
74
|
Object.keys(doc.zyrk).some((key) => !["scripts", "audit", "patches", "mutablePackages"].includes(key)) ||
|
|
@@ -93,11 +93,19 @@ function scriptPolicy(manifest) {
|
|
|
93
93
|
return object(manifest.zyrk) ? manifest.zyrk.scripts : undefined;
|
|
94
94
|
}
|
|
95
95
|
export async function installProject(options) {
|
|
96
|
+
options.onProgress?.({ phase: "planning" });
|
|
96
97
|
if (await findWorkspaceRoot(options.projectDir)) {
|
|
97
98
|
const { installWorkspaceProject } = await import("./workspace-install.js");
|
|
98
99
|
return installWorkspaceProject(options);
|
|
99
100
|
}
|
|
100
101
|
const project = await realpath(options.projectDir);
|
|
102
|
+
const preliminaryManifest = (await readManifest(project)).doc;
|
|
103
|
+
const preliminaryOverrides = createRootOverrides(preliminaryManifest);
|
|
104
|
+
if (options.importNpm) {
|
|
105
|
+
const preliminaryLock = (await readLockfile(path.join(project, "package-lock.json")))?.doc;
|
|
106
|
+
if (preliminaryLock && !preliminaryLock.zyrk)
|
|
107
|
+
importNpmLock(preliminaryLock, requirements(preliminaryManifest), (name) => options.registry.originFor(name), preliminaryOverrides);
|
|
108
|
+
}
|
|
101
109
|
// A local control-directory link would redirect locks and recovery writes.
|
|
102
110
|
const local = path.join(project, PROJECT_STATE_DIR);
|
|
103
111
|
try {
|
|
@@ -189,6 +197,7 @@ export async function installProject(options) {
|
|
|
189
197
|
if (other !== group && manifest[other])
|
|
190
198
|
delete manifest[other][parsed.name];
|
|
191
199
|
}
|
|
200
|
+
const overrides = createRootOverrides(manifest);
|
|
192
201
|
const allDeps = requirements(manifest);
|
|
193
202
|
for (const [name, spec] of Object.entries(allDeps))
|
|
194
203
|
parseRequirement(name, spec);
|
|
@@ -215,7 +224,7 @@ export async function installProject(options) {
|
|
|
215
224
|
if (existing && !existing.zyrk) {
|
|
216
225
|
if (options.frozen || options.offline || specs.length)
|
|
217
226
|
throw lockMismatch("npm-only lockfile requires a non-frozen adoption install before adding packages");
|
|
218
|
-
resolved = importNpmLock(existing, allDeps, (name) => options.registry.originFor(name));
|
|
227
|
+
resolved = importNpmLock(existing, allDeps, (name) => options.registry.originFor(name), overrides);
|
|
219
228
|
}
|
|
220
229
|
if (existing?.zyrk &&
|
|
221
230
|
specs.length === 0 &&
|
|
@@ -240,7 +249,9 @@ export async function installProject(options) {
|
|
|
240
249
|
throw error("ZYRK_OFFLINE_MISSING", "Offline installation requires an existing compatible zyrk lockfile.");
|
|
241
250
|
const prior = existing?.zyrk ? lockedGraph(existing) : undefined;
|
|
242
251
|
const fresh = new Set(specs.map((spec) => npa(spec).name));
|
|
252
|
+
options.onProgress?.({ phase: "resolving" });
|
|
243
253
|
resolved = await resolveRequirements({
|
|
254
|
+
overrides,
|
|
244
255
|
provider: {
|
|
245
256
|
origin: options.registry.origin,
|
|
246
257
|
originFor: (name) => options.registry.originFor(name),
|
|
@@ -451,10 +462,21 @@ export async function installProject(options) {
|
|
|
451
462
|
})
|
|
452
463
|
: undefined;
|
|
453
464
|
const unique = new Map(activeNodes.map((n) => [n.sourceId, n]));
|
|
465
|
+
let completedSources = 0;
|
|
466
|
+
options.onProgress?.({
|
|
467
|
+
phase: "fetching",
|
|
468
|
+
completed: 0,
|
|
469
|
+
total: unique.size,
|
|
470
|
+
});
|
|
454
471
|
for (const node of unique.values()) {
|
|
455
472
|
operation.operation.checkpoint();
|
|
456
473
|
if (await pathExists(sourceManifestPath(options.store, node.sourceId))) {
|
|
457
474
|
await readSourceManifest(options.store, node.sourceId);
|
|
475
|
+
options.onProgress?.({
|
|
476
|
+
phase: "fetching",
|
|
477
|
+
completed: ++completedSources,
|
|
478
|
+
total: unique.size,
|
|
479
|
+
});
|
|
458
480
|
continue;
|
|
459
481
|
}
|
|
460
482
|
if (options.offline)
|
|
@@ -488,6 +510,11 @@ export async function installProject(options) {
|
|
|
488
510
|
if (source.sourceId !== node.sourceId)
|
|
489
511
|
throw lockMismatch("download identity disagrees with the locked source");
|
|
490
512
|
await rm(tarball, { force: true });
|
|
513
|
+
options.onProgress?.({
|
|
514
|
+
phase: "fetching",
|
|
515
|
+
completed: ++completedSources,
|
|
516
|
+
total: unique.size,
|
|
517
|
+
});
|
|
491
518
|
}
|
|
492
519
|
for (const node of unique.values())
|
|
493
520
|
assertSupportedSourcePayload(node, await readSourceManifest(options.store, node.sourceId));
|
|
@@ -500,6 +527,7 @@ export async function installProject(options) {
|
|
|
500
527
|
warnings,
|
|
501
528
|
};
|
|
502
529
|
const graph = createGraphDoc(activeNodes.map((n) => ({ ...n, deps: n.edges })));
|
|
530
|
+
options.onProgress?.({ phase: "realizing" });
|
|
503
531
|
const sharedRealized = await realizeGraph({
|
|
504
532
|
store: options.store,
|
|
505
533
|
graph,
|
|
@@ -572,6 +600,7 @@ export async function installProject(options) {
|
|
|
572
600
|
});
|
|
573
601
|
privateGraph = true;
|
|
574
602
|
}
|
|
603
|
+
options.onProgress?.({ phase: "building" });
|
|
575
604
|
await buildPrivate({
|
|
576
605
|
project,
|
|
577
606
|
generationId,
|
|
@@ -658,6 +687,7 @@ export async function installProject(options) {
|
|
|
658
687
|
roots: selectedRoots.map((r) => r.target),
|
|
659
688
|
readiness,
|
|
660
689
|
});
|
|
690
|
+
options.onProgress?.({ phase: "linking" });
|
|
661
691
|
const published = await installProjection(project, entries, {
|
|
662
692
|
generationId,
|
|
663
693
|
lockHeld: true,
|
|
@@ -46,17 +46,23 @@ export type WorkspaceGraph = {
|
|
|
46
46
|
reason: "platform";
|
|
47
47
|
}>;
|
|
48
48
|
};
|
|
49
|
-
|
|
49
|
+
declare function resolveWorkspaceGraphPass(project: WorkspaceProject, provider: MetadataProvider, options?: {
|
|
50
50
|
previous?: WorkspaceGraph;
|
|
51
51
|
fresh?: ReadonlySet<string>;
|
|
52
52
|
platform?: RuntimePlatform;
|
|
53
53
|
maxNodes?: number;
|
|
54
54
|
maxDepth?: number;
|
|
55
55
|
deadlineMs?: number;
|
|
56
|
+
}, overrideState?: {
|
|
57
|
+
policy: import("../resolve/overrides.ts").OverridePolicy;
|
|
58
|
+
contexts: Map<string, import("../resolve/overrides.ts").OverrideContext>;
|
|
56
59
|
}): Promise<WorkspaceGraph>;
|
|
60
|
+
/** Retry pure planning when a registry edge narrows a live importer's scope. */
|
|
61
|
+
export declare function resolveWorkspaceGraph(project: WorkspaceProject, provider: MetadataProvider, options?: Parameters<typeof resolveWorkspaceGraphPass>[2]): Promise<WorkspaceGraph>;
|
|
57
62
|
export declare function workspaceRegistryOccurrences(graph: WorkspaceGraph): ResolvedOccurrence[];
|
|
58
63
|
/** Rooted semantic context including live source identity; occurrence keys never split equal peers. */
|
|
59
64
|
export declare function workspaceContextId(graph: WorkspaceGraph, rootKey: string, projectId: string): string;
|
|
60
65
|
/** Recheck locked platform/runtime requirements as strictly as fresh resolution. */
|
|
61
66
|
export declare function assertWorkspacePlatform(graph: WorkspaceGraph): void;
|
|
67
|
+
export {};
|
|
62
68
|
//# sourceMappingURL=workspace-graph.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace-graph.d.ts","sourceRoot":"","sources":["../../src/install/workspace-graph.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,EAChB,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"workspace-graph.d.ts","sourceRoot":"","sources":["../../src/install/workspace-graph.ts"],"names":[],"mappings":"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"}
|