@nodetool-ai/pack-manager 0.0.0-stage → 0.8.9-beta.1
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 +4 -2
- package/dist/.nodetool-build-stamp +1 -0
- package/dist/child-exit.d.ts +3 -0
- package/dist/child-exit.d.ts.map +1 -0
- package/dist/child-exit.js +17 -0
- package/dist/child-exit.js.map +1 -0
- package/dist/cli-feature.d.ts +30 -0
- package/dist/cli-feature.d.ts.map +1 -0
- package/dist/cli-feature.js +89 -0
- package/dist/cli-feature.js.map +1 -0
- package/dist/command-errors.d.ts +8 -0
- package/dist/command-errors.d.ts.map +1 -0
- package/dist/command-errors.js +49 -0
- package/dist/command-errors.js.map +1 -0
- package/dist/commands/authorized-pack-install.d.ts +7 -0
- package/dist/commands/authorized-pack-install.d.ts.map +1 -0
- package/dist/commands/authorized-pack-install.js +20 -0
- package/dist/commands/authorized-pack-install.js.map +1 -0
- package/dist/commands/output.d.ts +32 -0
- package/dist/commands/output.d.ts.map +1 -0
- package/dist/commands/output.js +150 -0
- package/dist/commands/output.js.map +1 -0
- package/dist/commands/pack-install-authorization.d.ts +40 -0
- package/dist/commands/pack-install-authorization.d.ts.map +1 -0
- package/dist/commands/pack-install-authorization.js +132 -0
- package/dist/commands/pack-install-authorization.js.map +1 -0
- package/dist/commands/pack-management.d.ts +26 -0
- package/dist/commands/pack-management.d.ts.map +1 -0
- package/dist/commands/pack-management.js +74 -0
- package/dist/commands/pack-management.js.map +1 -0
- package/dist/commands/packs.d.ts +5 -0
- package/dist/commands/packs.d.ts.map +1 -0
- package/dist/commands/packs.js +12 -0
- package/dist/commands/packs.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/install-lock.d.ts +12 -0
- package/dist/install-lock.d.ts.map +1 -0
- package/dist/install-lock.js +139 -0
- package/dist/install-lock.js.map +1 -0
- package/dist/npm-runner.d.ts +23 -0
- package/dist/npm-runner.d.ts.map +1 -0
- package/dist/npm-runner.js +160 -0
- package/dist/npm-runner.js.map +1 -0
- package/dist/packs/command-service.d.ts +16 -0
- package/dist/packs/command-service.d.ts.map +1 -0
- package/dist/packs/command-service.js +184 -0
- package/dist/packs/command-service.js.map +1 -0
- package/dist/packs/doctor-lock.d.ts +8 -0
- package/dist/packs/doctor-lock.d.ts.map +1 -0
- package/dist/packs/doctor-lock.js +50 -0
- package/dist/packs/doctor-lock.js.map +1 -0
- package/dist/packs/doctor.d.ts +25 -0
- package/dist/packs/doctor.d.ts.map +1 -0
- package/dist/packs/doctor.js +12 -0
- package/dist/packs/doctor.js.map +1 -0
- package/dist/packs/global-bootstrap.d.ts +11 -0
- package/dist/packs/global-bootstrap.d.ts.map +1 -0
- package/dist/packs/global-bootstrap.js +72 -0
- package/dist/packs/global-bootstrap.js.map +1 -0
- package/dist/packs/host.d.ts +12 -0
- package/dist/packs/host.d.ts.map +1 -0
- package/dist/packs/host.js +69 -0
- package/dist/packs/host.js.map +1 -0
- package/dist/packs/install-manifests.d.ts +2 -0
- package/dist/packs/install-manifests.d.ts.map +1 -0
- package/dist/packs/install-manifests.js +30 -0
- package/dist/packs/install-manifests.js.map +1 -0
- package/dist/packs/install-process.d.ts +4 -0
- package/dist/packs/install-process.d.ts.map +1 -0
- package/dist/packs/install-process.js +11 -0
- package/dist/packs/install-process.js.map +1 -0
- package/dist/packs/install-selection.d.ts +39 -0
- package/dist/packs/install-selection.d.ts.map +1 -0
- package/dist/packs/install-selection.js +67 -0
- package/dist/packs/install-selection.js.map +1 -0
- package/dist/packs/install-state.d.ts +25 -0
- package/dist/packs/install-state.d.ts.map +1 -0
- package/dist/packs/install-state.js +45 -0
- package/dist/packs/install-state.js.map +1 -0
- package/dist/packs/install-tree.d.ts +35 -0
- package/dist/packs/install-tree.d.ts.map +1 -0
- package/dist/packs/install-tree.js +253 -0
- package/dist/packs/install-tree.js.map +1 -0
- package/dist/packs/install-verification.d.ts +12 -0
- package/dist/packs/install-verification.d.ts.map +1 -0
- package/dist/packs/install-verification.js +75 -0
- package/dist/packs/install-verification.js.map +1 -0
- package/dist/packs/installed.d.ts +36 -0
- package/dist/packs/installed.d.ts.map +1 -0
- package/dist/packs/installed.js +87 -0
- package/dist/packs/installed.js.map +1 -0
- package/dist/packs/installer-load-check.d.ts +5 -0
- package/dist/packs/installer-load-check.d.ts.map +1 -0
- package/dist/packs/installer-load-check.js +98 -0
- package/dist/packs/installer-load-check.js.map +1 -0
- package/dist/packs/installer.d.ts +16 -0
- package/dist/packs/installer.d.ts.map +1 -0
- package/dist/packs/installer.js +149 -0
- package/dist/packs/installer.js.map +1 -0
- package/dist/packs/management.d.ts +51 -0
- package/dist/packs/management.d.ts.map +1 -0
- package/dist/packs/management.js +78 -0
- package/dist/packs/management.js.map +1 -0
- package/dist/packs/mode.d.ts +48 -0
- package/dist/packs/mode.d.ts.map +1 -0
- package/dist/packs/mode.js +251 -0
- package/dist/packs/mode.js.map +1 -0
- package/dist/packs/owned-replay-plan.d.ts +5 -0
- package/dist/packs/owned-replay-plan.d.ts.map +1 -0
- package/dist/packs/owned-replay-plan.js +65 -0
- package/dist/packs/owned-replay-plan.js.map +1 -0
- package/dist/packs/removal-selection.d.ts +12 -0
- package/dist/packs/removal-selection.d.ts.map +1 -0
- package/dist/packs/removal-selection.js +186 -0
- package/dist/packs/removal-selection.js.map +1 -0
- package/dist/packs/removal.d.ts +12 -0
- package/dist/packs/removal.d.ts.map +1 -0
- package/dist/packs/removal.js +144 -0
- package/dist/packs/removal.js.map +1 -0
- package/dist/packs/repair.d.ts +2 -0
- package/dist/packs/repair.d.ts.map +1 -0
- package/dist/packs/repair.js +2 -0
- package/dist/packs/repair.js.map +1 -0
- package/package.json +51 -4
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { RUNTIME_NPM_PACKAGES, isRuntimeNpmPackageId } from "@nodetool-ai/protocol/runtime-npm-packages";
|
|
2
|
+
import { prepareInstallSelection } from "../packs/install-selection.js";
|
|
3
|
+
import { assertPackInstallProcessAllowed } from "../packs/install-process.js";
|
|
4
|
+
import { preparePackRemoval } from "../packs/removal-selection.js";
|
|
5
|
+
import { confirm } from "./output.js";
|
|
6
|
+
const AUTHORIZATION = Symbol("CLI install authorization");
|
|
7
|
+
const issued = new WeakMap();
|
|
8
|
+
const runCommands = new Set(["run", "debug", "node-run", "workflows-run"]);
|
|
9
|
+
export function installPromptMessage(selection) {
|
|
10
|
+
const lines = ["Install these NodeTool packages?"];
|
|
11
|
+
for (const pack of selection.packs) {
|
|
12
|
+
lines.push(`Pack ${pack.id}: ${pack.npm.name}@${pack.npm.version}, estimated ${pack.installBytes.toLocaleString("en-US")} bytes`);
|
|
13
|
+
}
|
|
14
|
+
for (const id of selection.runtimeLibraries) {
|
|
15
|
+
const versions = isRuntimeNpmPackageId(id) ? RUNTIME_NPM_PACKAGES[id].npmPackages.join(", ") : "unknown version";
|
|
16
|
+
const pins = isRuntimeNpmPackageId(id) ? RUNTIME_NPM_PACKAGES[id].packageNames.map((name) => selection.catalog.installPins?.find((pin) => (pin.installName ?? pin.name) === name)) : [];
|
|
17
|
+
const bytes = pins.length && pins.every((pin) => pin?.installBytes !== undefined)
|
|
18
|
+
? pins.reduce((sum, pin) => sum + pin.installBytes, 0) : undefined;
|
|
19
|
+
lines.push(`Runtime ${id}: ${versions}, ${bytes === undefined ? "separate size estimate unavailable" : `estimated ${bytes.toLocaleString("en-US")} bytes`}`);
|
|
20
|
+
}
|
|
21
|
+
if (selection.bootstrap?.length) {
|
|
22
|
+
lines.push("This initial global install has no integrity record. These exact release packages will be reinstalled with scripts disabled to verify integrity:");
|
|
23
|
+
for (const pin of selection.bootstrap) {
|
|
24
|
+
lines.push(`${pin.name}@${pin.version} (${pin.installPath})`);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
lines.push("Estimates can overlap through shared dependencies and exclude files generated by rebuilds. They are not final disk usage.");
|
|
28
|
+
lines.push(selection.scripts.length ? `Install scripts: ${selection.scripts.map((pin) => `${pin.name}@${pin.version}`).join(", ")}` : "Install scripts: none");
|
|
29
|
+
if (selection.mode === "local") {
|
|
30
|
+
lines.push("Updates local package.json and package-lock.json.");
|
|
31
|
+
}
|
|
32
|
+
return lines.join("\n");
|
|
33
|
+
}
|
|
34
|
+
/** Only this CLI command module constructs live authorizations. JSON cannot reproduce one. */
|
|
35
|
+
export async function authorizePackInstallCommand(options) {
|
|
36
|
+
assertPackInstallProcessAllowed();
|
|
37
|
+
let source;
|
|
38
|
+
if (options.command === "packs-add" || options.command === "packs-restore" || options.command === "packs-remove" || options.command === "packs-repair") {
|
|
39
|
+
source = "explicit";
|
|
40
|
+
}
|
|
41
|
+
else if (!runCommands.has(options.command)) {
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
else if (options.installMissing) {
|
|
45
|
+
source = "flag";
|
|
46
|
+
}
|
|
47
|
+
else if (process.env["NODETOOL_AUTO_INSTALL"] === "1") {
|
|
48
|
+
source = "environment";
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
if (!process.stdin.isTTY || !process.stderr.isTTY || process.env["CI"] !== undefined) {
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
source = "prompt";
|
|
55
|
+
}
|
|
56
|
+
const operation = options.command === "packs-remove" ? "remove" : options.command === "packs-repair" ? "repair" : "install";
|
|
57
|
+
const selection = operation === "remove" ? (await preparePackRemoval(options.request)).authorization :
|
|
58
|
+
await prepareInstallSelection(options.request, operation === "repair" ? { allowDirty: true, restoreDesired: true } : {});
|
|
59
|
+
if (source === "prompt" || options.confirm) {
|
|
60
|
+
if (!process.stdin.isTTY || !process.stderr.isTTY || process.env["CI"] !== undefined) {
|
|
61
|
+
throw new Error("Use --yes to confirm a node pack install in a non-interactive terminal");
|
|
62
|
+
}
|
|
63
|
+
const prompt = options.prompt ?? ((input) => confirm(input.message, { default: input.default }));
|
|
64
|
+
if (!await prompt({ message: installPromptMessage(selection), default: false })) {
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
const value = Object.freeze({ [AUTHORIZATION]: true });
|
|
69
|
+
issued.set(value, { requestedPacks: new Set(options.request.packs), requestedLibraries: new Set(options.request.runtimeLibraries ?? []), operation, source, root: selection.root, coreVersion: selection.coreVersion, mode: selection.mode,
|
|
70
|
+
packs: new Set(selection.packs.map((pack) => pack.id)), libraries: new Set(selection.runtimeLibraries),
|
|
71
|
+
scripts: new Set(selection.scripts.map((pin) => JSON.stringify({ name: pin.name, version: pin.version, integrity: pin.integrity }))),
|
|
72
|
+
bootstrap: new Set((selection.bootstrap ?? []).map(pin => JSON.stringify(pin))),
|
|
73
|
+
mutationPaths: new Set(selection.mutationPaths ?? []) });
|
|
74
|
+
return value;
|
|
75
|
+
}
|
|
76
|
+
export function assertLiveInstallAuthorization(value) {
|
|
77
|
+
assertPackInstallProcessAllowed();
|
|
78
|
+
if (!issued.has(value)) {
|
|
79
|
+
throw new Error("Installing node packs requires a live CLI command authorization");
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
export class StaleInstallAuthorizationError extends Error {
|
|
83
|
+
constructor() { super("Installed packs changed while this command waited. A fresh CLI authorization is required."); this.name = "StaleInstallAuthorizationError"; }
|
|
84
|
+
}
|
|
85
|
+
export function assertInstallAuthorizationScope(value, selection, operation = "install", request) {
|
|
86
|
+
assertLiveInstallAuthorization(value);
|
|
87
|
+
const scope = issued.get(value);
|
|
88
|
+
if (scope.operation !== operation) {
|
|
89
|
+
throw new Error(`Install authorization cannot authorize ${operation}`);
|
|
90
|
+
}
|
|
91
|
+
if (scope.root !== selection.root || scope.coreVersion !== selection.coreVersion || scope.mode !== selection.mode) {
|
|
92
|
+
throw new Error("Install authorization does not match the install root, mode, or core version");
|
|
93
|
+
}
|
|
94
|
+
if ((selection.bootstrap ?? []).some(pin => !scope.bootstrap.has(JSON.stringify(pin)))) {
|
|
95
|
+
throw new Error("Global integrity bootstrap is outside the install authorization");
|
|
96
|
+
}
|
|
97
|
+
// A concurrent command can expand npm replay. The old token stays invalid.
|
|
98
|
+
// Only unchanged direct requests may ask the command layer for a new grant.
|
|
99
|
+
const extraPacks = selection.packs.filter(pack => !scope.packs.has(pack.id));
|
|
100
|
+
const extraLibraries = selection.runtimeLibraries.filter(id => !scope.libraries.has(id));
|
|
101
|
+
const extraScripts = selection.scripts.filter(pin => !scope.scripts.has(JSON.stringify({ name: pin.name, version: pin.version, integrity: pin.integrity })));
|
|
102
|
+
if (operation === "install" && request &&
|
|
103
|
+
new Set(request.packs).size === scope.requestedPacks.size && request.packs.every(id => scope.requestedPacks.has(id)) &&
|
|
104
|
+
new Set(request.runtimeLibraries ?? []).size === scope.requestedLibraries.size && (request.runtimeLibraries ?? []).every(id => scope.requestedLibraries.has(id)) &&
|
|
105
|
+
(extraPacks.length > 0 || extraLibraries.length > 0) &&
|
|
106
|
+
extraPacks.every(pack => selection.installedIds.includes(pack.id)) &&
|
|
107
|
+
extraLibraries.every(id => selection.replayLibraries.includes(id)) &&
|
|
108
|
+
extraScripts.every(pin => extraPacks.some(pack => pack.scriptAllowlist.some(script => script.name === pin.name && script.version === pin.version && script.integrity === pin.integrity)))) {
|
|
109
|
+
throw new StaleInstallAuthorizationError();
|
|
110
|
+
}
|
|
111
|
+
for (const pack of selection.packs) {
|
|
112
|
+
if (!scope.packs.has(pack.id)) {
|
|
113
|
+
throw new Error(`Pack ${pack.id} is outside the install authorization`);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
for (const id of selection.runtimeLibraries) {
|
|
117
|
+
if (!scope.libraries.has(id)) {
|
|
118
|
+
throw new Error(`Runtime library ${id} is outside the install authorization`);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
for (const pin of selection.scripts) {
|
|
122
|
+
if (!scope.scripts.has(JSON.stringify({ name: pin.name, version: pin.version, integrity: pin.integrity }))) {
|
|
123
|
+
throw new Error(`Install script ${pin.name}@${pin.version} is outside the install authorization`);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
for (const path of selection.mutationPaths ?? []) {
|
|
127
|
+
if (!scope.mutationPaths.has(path)) {
|
|
128
|
+
throw new Error(`Removal path ${path} is outside the install authorization`);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=pack-install-authorization.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pack-install-authorization.js","sourceRoot":"","sources":["../../src/commands/pack-install-authorization.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { Command } from "commander";
|
|
2
|
+
import type { PackListRow } from "../packs/management.js";
|
|
3
|
+
export interface PackAddOptions {
|
|
4
|
+
readonly yes?: boolean;
|
|
5
|
+
readonly restore?: boolean;
|
|
6
|
+
readonly for?: string;
|
|
7
|
+
}
|
|
8
|
+
export interface PackDoctorOptions {
|
|
9
|
+
readonly installed?: boolean;
|
|
10
|
+
readonly json?: boolean;
|
|
11
|
+
readonly repair?: boolean;
|
|
12
|
+
readonly pack?: string[];
|
|
13
|
+
}
|
|
14
|
+
export interface PackCommandServices {
|
|
15
|
+
list(): Promise<readonly PackListRow[]>;
|
|
16
|
+
add(ids: readonly string[], options: PackAddOptions): Promise<void>;
|
|
17
|
+
remove(ids: readonly string[]): Promise<void>;
|
|
18
|
+
doctor(options: PackDoctorOptions): Promise<{
|
|
19
|
+
readonly healthy: boolean;
|
|
20
|
+
readonly [key: string]: unknown;
|
|
21
|
+
}>;
|
|
22
|
+
why(target: string): Promise<Record<string, unknown>>;
|
|
23
|
+
}
|
|
24
|
+
/** Register the command shape without reading the installed tree or constructing an installer. */
|
|
25
|
+
export declare function registerPackManagementCommands(packs: Command, loadServices: () => Promise<PackCommandServices>): void;
|
|
26
|
+
//# sourceMappingURL=pack-management.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pack-management.d.ts","sourceRoot":"","sources":["../../src/commands/pack-management.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGzC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAE1D,MAAM,WAAW,cAAc;IAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE;AAC7G,MAAM,WAAW,iBAAiB;IAAG,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE;AACjJ,MAAM,WAAW,mBAAmB;IAClC,IAAI,IAAI,OAAO,CAAC,SAAS,WAAW,EAAE,CAAC,CAAC;IACxC,GAAG,CAAC,GAAG,EAAE,SAAS,MAAM,EAAE,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpE,MAAM,CAAC,GAAG,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,MAAM,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC;QAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;QAAC,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC,CAAC;IAC5G,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACvD;AAED,kGAAkG;AAClG,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC,mBAAmB,CAAC,GAAG,IAAI,CA4CrH"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { printCommandError } from "../command-errors.js";
|
|
2
|
+
import { printTable } from "./output.js";
|
|
3
|
+
/** Register the command shape without reading the installed tree or constructing an installer. */
|
|
4
|
+
export function registerPackManagementCommands(packs, loadServices) {
|
|
5
|
+
packs.command("list").description("List available and installed node packs and runtime libraries")
|
|
6
|
+
.option("--json", "Print the installed catalog report as JSON")
|
|
7
|
+
.action(async (options) => {
|
|
8
|
+
try {
|
|
9
|
+
const rows = await (await loadServices()).list();
|
|
10
|
+
if (options.json) {
|
|
11
|
+
console.log(JSON.stringify(rows, null, 2));
|
|
12
|
+
}
|
|
13
|
+
else {
|
|
14
|
+
printTable(rows.map(row => ({ id: row.id, kind: row.kind, installed: row.installed, version: row.version,
|
|
15
|
+
bytes: row.installBytes, nodes: row.nodeCount, required_by: row.requiredBy.join(", ") })));
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
catch (error) {
|
|
19
|
+
process.exitCode = printCommandError(error, options.json);
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
packs.command("add [ids...]").alias("install").description("Install node packs or runtime libraries and their requirements")
|
|
23
|
+
.option("--yes", "Confirm the install without prompting")
|
|
24
|
+
.option("--restore", "Restore the desired set recorded for this install root")
|
|
25
|
+
.option("--for <workflow|file>", "Install every pack needed by a saved workflow or an explicitly named local workflow file")
|
|
26
|
+
.action(async (ids, options) => {
|
|
27
|
+
try {
|
|
28
|
+
const selections = Number(ids.length > 0) + Number(Boolean(options.restore)) + Number(Boolean(options.for));
|
|
29
|
+
if (selections !== 1) {
|
|
30
|
+
throw new Error("Choose pack ids, --restore, or --for <workflow|file>");
|
|
31
|
+
}
|
|
32
|
+
await (await loadServices()).add(ids, options);
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
process.exitCode = printCommandError(error);
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
packs.command("remove <ids...>").alias("uninstall").description("Remove node packs while retaining requirements of installed packs")
|
|
39
|
+
.action(async (ids) => {
|
|
40
|
+
try {
|
|
41
|
+
await (await loadServices()).remove(ids);
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
process.exitCode = printCommandError(error);
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
packs.command("doctor").description("Check the install mode, versions, integrity, shared copies and registration")
|
|
48
|
+
.option("--json", "Print the diagnostic report as JSON")
|
|
49
|
+
.option("--installed", "Register installed packs in a fresh child process")
|
|
50
|
+
.option("--pack <ids...>", "Limit registration checks to these pack ids")
|
|
51
|
+
.option("--repair", "Verify and repair a dirty pack installation")
|
|
52
|
+
.action(async (options) => {
|
|
53
|
+
try {
|
|
54
|
+
const report = await (await loadServices()).doctor(options);
|
|
55
|
+
console.log(JSON.stringify(report, null, 2));
|
|
56
|
+
if (!report.healthy) {
|
|
57
|
+
process.exitCode = 1;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
process.exitCode = printCommandError(error, options.json);
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
packs.command("why <node_type|id>").description("Explain a node owner, pack requirements or runtime library")
|
|
65
|
+
.action(async (target) => {
|
|
66
|
+
try {
|
|
67
|
+
console.log(JSON.stringify(await (await loadServices()).why(target), null, 2));
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
process.exitCode = printCommandError(error);
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=pack-management.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pack-management.js","sourceRoot":"","sources":["../../src/commands/pack-management.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { Command } from "commander";
|
|
2
|
+
import { type PackCommandServices } from "./pack-management.js";
|
|
3
|
+
/** Register management without importing any execution or compiler feature. */
|
|
4
|
+
export declare function registerPackCommands(program: Command, entryUrl?: string, loadServices?: () => Promise<PackCommandServices>): void;
|
|
5
|
+
//# sourceMappingURL=packs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"packs.d.ts","sourceRoot":"","sources":["../../src/commands/packs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAkC,KAAK,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAIhG,+EAA+E;AAC/E,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,YAAY,GAAE,MAAM,OAAO,CAAC,mBAAmB,CAA6B,GAAG,IAAI,CAI5J"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { registerPackManagementCommands } from "./pack-management.js";
|
|
2
|
+
import { configureCliPackHost } from "../packs/host.js";
|
|
3
|
+
import { createPackCommandServices } from "../packs/command-service.js";
|
|
4
|
+
/** Register management without importing any execution or compiler feature. */
|
|
5
|
+
export function registerPackCommands(program, entryUrl, loadServices = createPackCommandServices) {
|
|
6
|
+
if (entryUrl) {
|
|
7
|
+
configureCliPackHost(entryUrl);
|
|
8
|
+
}
|
|
9
|
+
const packs = program.command("packs").description("Manage explicitly installed packs and CLI features");
|
|
10
|
+
registerPackManagementCommands(packs, loadServices);
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=packs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"packs.js","sourceRoot":"","sources":["../../src/commands/packs.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,8BAA8B,EAA4B,MAAM,sBAAsB,CAAC;AAChG,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AAExE,+EAA+E;AAC/E,MAAM,UAAU,oBAAoB,CAAC,OAAgB,EAAE,QAAiB,EAAE,YAAY,GAAuC,yBAAyB;IACpJ,IAAI,QAAQ,EAAE,CAAC;QAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IAAC,CAAC;IACjD,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,oDAAoD,CAAC,CAAC;IACzG,8BAA8B,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;AACtD,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export * from "@nodetool-ai/pack-core";
|
|
2
|
+
export { configureCliPackHost, loadCliPackSnapshot, loaderContextForSnapshot } from "./packs/host.js";
|
|
3
|
+
export { registerPackCommands } from "./commands/packs.js";
|
|
4
|
+
export { loadInstalledCommandFeature, initializeInstalledExecutionHost } from "./cli-feature.js";
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC;AACvC,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AACtG,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,2BAA2B,EAAE,gCAAgC,EAAE,MAAM,kBAAkB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export * from "@nodetool-ai/pack-core";
|
|
2
|
+
export { configureCliPackHost, loadCliPackSnapshot, loaderContextForSnapshot } from "./packs/host.js";
|
|
3
|
+
export { registerPackCommands } from "./commands/packs.js";
|
|
4
|
+
export { loadInstalledCommandFeature, initializeInstalledExecutionHost } from "./cli-feature.js";
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC;AACvC,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AACtG,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,2BAA2B,EAAE,gCAAgC,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface InstallLockOptions {
|
|
2
|
+
readonly signal?: AbortSignal;
|
|
3
|
+
readonly onWait?: (path: string) => void;
|
|
4
|
+
readonly timeoutMs?: number;
|
|
5
|
+
readonly heartbeatMs?: number;
|
|
6
|
+
readonly staleMs?: number;
|
|
7
|
+
readonly pollMs?: number;
|
|
8
|
+
}
|
|
9
|
+
/** Both installers place their lock inside the real install target. */
|
|
10
|
+
export declare function acquireInstallLock(target: string, filename: string, options?: InstallLockOptions): Promise<() => Promise<void>>;
|
|
11
|
+
export declare function withInstallLock<T>(target: string, filename: string, action: () => Promise<T>, options?: InstallLockOptions): Promise<T>;
|
|
12
|
+
//# sourceMappingURL=install-lock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-lock.d.ts","sourceRoot":"","sources":["../src/install-lock.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAiCD,uEAAuE;AACvE,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,CAuF9B;AAED,wBAAsB,eAAe,CAAC,CAAC,EACrC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACxB,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,CAAC,CAAC,CAOZ"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { hostname } from "node:os";
|
|
3
|
+
import { dirname, join } from "node:path";
|
|
4
|
+
import { mkdir, open, readFile, realpath, rmdir, stat, unlink } from "node:fs/promises";
|
|
5
|
+
import { setTimeout as delay } from "node:timers/promises";
|
|
6
|
+
function hasCode(error, code) {
|
|
7
|
+
return error instanceof Error && "code" in error && error.code === code;
|
|
8
|
+
}
|
|
9
|
+
/** Serialize lock creation, stale recovery, and release across processes. */
|
|
10
|
+
async function mutateLock(path, action, options) {
|
|
11
|
+
const guard = `${path}.guard`;
|
|
12
|
+
const start = Date.now();
|
|
13
|
+
while (true) {
|
|
14
|
+
options.signal?.throwIfAborted();
|
|
15
|
+
try {
|
|
16
|
+
await mkdir(guard);
|
|
17
|
+
break;
|
|
18
|
+
}
|
|
19
|
+
catch (error) {
|
|
20
|
+
if (!hasCode(error, "EEXIST")) {
|
|
21
|
+
throw error;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
if (Date.now() - start >= (options.timeoutMs ?? 600_000)) {
|
|
25
|
+
// Never steal this guard: deletion races can admit concurrent installers.
|
|
26
|
+
throw new Error(`Timed out waiting for the install lock guard at ${guard}. If its owner stopped, remove this directory before retrying.`);
|
|
27
|
+
}
|
|
28
|
+
await delay(options.pollMs ?? 250, undefined, { signal: options.signal });
|
|
29
|
+
}
|
|
30
|
+
try {
|
|
31
|
+
return await action();
|
|
32
|
+
}
|
|
33
|
+
finally {
|
|
34
|
+
await rmdir(guard);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/** Both installers place their lock inside the real install target. */
|
|
38
|
+
export async function acquireInstallLock(target, filename, options = {}) {
|
|
39
|
+
if (!filename || filename === "." || filename === ".." || dirname(filename) !== ".") {
|
|
40
|
+
throw new Error("An install lock filename must stay inside its target");
|
|
41
|
+
}
|
|
42
|
+
await mkdir(target, { recursive: true });
|
|
43
|
+
const path = join(await realpath(target), filename);
|
|
44
|
+
const token = randomUUID();
|
|
45
|
+
const contents = JSON.stringify({ pid: process.pid, hostname: hostname(), token, startedAt: new Date().toISOString() });
|
|
46
|
+
const start = Date.now();
|
|
47
|
+
let nextNotice = start;
|
|
48
|
+
while (true) {
|
|
49
|
+
options.signal?.throwIfAborted();
|
|
50
|
+
const handle = await mutateLock(path, async () => {
|
|
51
|
+
try {
|
|
52
|
+
const info = await stat(path);
|
|
53
|
+
if (Date.now() - info.mtimeMs > (options.staleMs ?? 60_000)) {
|
|
54
|
+
await unlink(path);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
if (!hasCode(error, "ENOENT")) {
|
|
59
|
+
throw error;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
let file;
|
|
63
|
+
try {
|
|
64
|
+
file = await open(path, "wx");
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
if (hasCode(error, "EEXIST")) {
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
throw error;
|
|
71
|
+
}
|
|
72
|
+
try {
|
|
73
|
+
await file.writeFile(contents);
|
|
74
|
+
return file;
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
await file.close();
|
|
78
|
+
await unlink(path);
|
|
79
|
+
throw error;
|
|
80
|
+
}
|
|
81
|
+
}, options);
|
|
82
|
+
if (handle) {
|
|
83
|
+
let heartbeat = Promise.resolve();
|
|
84
|
+
let heartbeatError;
|
|
85
|
+
const timer = setInterval(() => {
|
|
86
|
+
heartbeat = heartbeat.then(async () => {
|
|
87
|
+
const now = new Date();
|
|
88
|
+
await handle.utimes(now, now);
|
|
89
|
+
}).catch((error) => { heartbeatError = error; });
|
|
90
|
+
}, options.heartbeatMs ?? 5_000);
|
|
91
|
+
timer.unref();
|
|
92
|
+
let released = false;
|
|
93
|
+
return async () => {
|
|
94
|
+
if (released) {
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
released = true;
|
|
98
|
+
clearInterval(timer);
|
|
99
|
+
await heartbeat;
|
|
100
|
+
await handle.close();
|
|
101
|
+
// Cancellation must not stop cleanup of the owner's lock.
|
|
102
|
+
const { signal: _signal, ...releaseOptions } = options;
|
|
103
|
+
await mutateLock(path, async () => {
|
|
104
|
+
try {
|
|
105
|
+
if (await readFile(path, "utf8") === contents) {
|
|
106
|
+
await unlink(path);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
if (!hasCode(error, "ENOENT")) {
|
|
111
|
+
throw error;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}, releaseOptions);
|
|
115
|
+
if (heartbeatError) {
|
|
116
|
+
throw heartbeatError;
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
if (Date.now() - start >= (options.timeoutMs ?? 600_000)) {
|
|
121
|
+
throw new Error(`Timed out waiting for the install lock at ${path}`);
|
|
122
|
+
}
|
|
123
|
+
if (Date.now() >= nextNotice) {
|
|
124
|
+
options.onWait?.(path);
|
|
125
|
+
nextNotice = Date.now() + 10_000;
|
|
126
|
+
}
|
|
127
|
+
await delay(options.pollMs ?? 250, undefined, { signal: options.signal });
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
export async function withInstallLock(target, filename, action, options = {}) {
|
|
131
|
+
const release = await acquireInstallLock(target, filename, options);
|
|
132
|
+
try {
|
|
133
|
+
return await action();
|
|
134
|
+
}
|
|
135
|
+
finally {
|
|
136
|
+
await release();
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=install-lock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-lock.js","sourceRoot":"","sources":["../src/install-lock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACxF,OAAO,EAAE,UAAU,IAAI,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAW3D,SAAS,OAAO,CAAC,KAAc,EAAE,IAAY;IAC3C,OAAO,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC;AAC1E,CAAC;AAED,6EAA6E;AAC7E,KAAK,UAAU,UAAU,CAAI,IAAY,EAAE,MAAwB,EAAE,OAA2B;IAC9F,MAAM,KAAK,GAAG,GAAG,IAAI,QAAQ,CAAC;IAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACzB,OAAO,IAAI,EAAE,CAAC;QACZ,OAAO,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC;QACjC,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC;YACnB,MAAM;QACR,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,CAAC;gBAC9B,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;QACD,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,EAAE,CAAC;YACzD,0EAA0E;YAC1E,MAAM,IAAI,KAAK,CAAC,mDAAmD,KAAK,gEAAgE,CAAC,CAAC;QAC5I,CAAC;QACD,MAAM,KAAK,CAAC,OAAO,CAAC,MAAM,IAAI,GAAG,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5E,CAAC;IACD,IAAI,CAAC;QACH,OAAO,MAAM,MAAM,EAAE,CAAC;IACxB,CAAC;YAAS,CAAC;QACT,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;AACH,CAAC;AAED,uEAAuE;AACvE,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,MAAc,EACd,QAAgB,EAChB,OAAO,GAAuB,EAAE;IAEhC,IAAI,CAAC,QAAQ,IAAI,QAAQ,KAAK,GAAG,IAAI,QAAQ,KAAK,IAAI,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,GAAG,EAAE,CAAC;QACpF,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;IAC1E,CAAC;IACD,MAAM,KAAK,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,CAAC;IACpD,MAAM,KAAK,GAAG,UAAU,EAAE,CAAC;IAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IACxH,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACzB,IAAI,UAAU,GAAG,KAAK,CAAC;IACvB,OAAO,IAAI,EAAE,CAAC;QACZ,OAAO,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC;QACjC,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE;YAC/C,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC9B,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,GAAG,CAAC,OAAO,CAAC,OAAO,IAAI,MAAM,CAAC,EAAE,CAAC;oBAC5D,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;gBACrB,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,CAAC;oBAC9B,MAAM,KAAK,CAAC;gBACd,CAAC;YACH,CAAC;YACD,IAAI,IAAI,CAAC;YACT,IAAI,CAAC;gBACH,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAChC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,CAAC;oBAC7B,OAAO,IAAI,CAAC;gBACd,CAAC;gBACD,MAAM,KAAK,CAAC;YACd,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;gBAC/B,OAAO,IAAI,CAAC;YACd,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;gBACnB,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;gBACnB,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC,EAAE,OAAO,CAAC,CAAC;QACZ,IAAI,MAAM,EAAE,CAAC;YACX,IAAI,SAAS,GAAkB,OAAO,CAAC,OAAO,EAAE,CAAC;YACjD,IAAI,cAAuB,CAAC;YAC5B,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;gBAC7B,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;oBACpC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;oBACvB,MAAM,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;gBAChC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE,GAAG,cAAc,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5D,CAAC,EAAE,OAAO,CAAC,WAAW,IAAI,KAAK,CAAC,CAAC;YACjC,KAAK,CAAC,KAAK,EAAE,CAAC;YACd,IAAI,QAAQ,GAAG,KAAK,CAAC;YACrB,OAAO,KAAK,IAAI,EAAE;gBAChB,IAAI,QAAQ,EAAE,CAAC;oBACb,OAAO;gBACT,CAAC;gBACD,QAAQ,GAAG,IAAI,CAAC;gBAChB,aAAa,CAAC,KAAK,CAAC,CAAC;gBACrB,MAAM,SAAS,CAAC;gBAChB,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;gBACrB,0DAA0D;gBAC1D,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,cAAc,EAAE,GAAG,OAAO,CAAC;gBACvD,MAAM,UAAU,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE;oBAChC,IAAI,CAAC;wBACH,IAAI,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,QAAQ,EAAE,CAAC;4BAC9C,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;wBACrB,CAAC;oBACH,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,CAAC;4BAC9B,MAAM,KAAK,CAAC;wBACd,CAAC;oBACH,CAAC;gBACH,CAAC,EAAE,cAAc,CAAC,CAAC;gBACnB,IAAI,cAAc,EAAE,CAAC;oBACnB,MAAM,cAAc,CAAC;gBACvB,CAAC;YACH,CAAC,CAAC;QACJ,CAAC;QACD,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,EAAE,CAAC;YACzD,MAAM,IAAI,KAAK,CAAC,6CAA6C,IAAI,EAAE,CAAC,CAAC;QACvE,CAAC;QACD,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,UAAU,EAAE,CAAC;YAC7B,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC;YACvB,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC;QACnC,CAAC;QACD,MAAM,KAAK,CAAC,OAAO,CAAC,MAAM,IAAI,GAAG,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5E,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAAc,EACd,QAAgB,EAChB,MAAwB,EACxB,OAAO,GAAuB,EAAE;IAEhC,MAAM,OAAO,GAAG,MAAM,kBAAkB,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IACpE,IAAI,CAAC;QACH,OAAO,MAAM,MAAM,EAAE,CAAC;IACxB,CAAC;YAAS,CAAC;QACT,MAAM,OAAO,EAAE,CAAC;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export type NpmInstallMode = "global" | "local";
|
|
2
|
+
/** Override npm configuration that could change the verified install shape. */
|
|
3
|
+
export declare function npmInstallFlags(mode: NpmInstallMode, scriptPolicy?: "ignore" | "user"): string[];
|
|
4
|
+
export declare function assertInstallerModuleIdentity(execArgv?: readonly string[], nodeOptions?: string): void;
|
|
5
|
+
/** Returns a warning for untested future npm releases. */
|
|
6
|
+
export declare function checkNpmVersion(version: string): string | null;
|
|
7
|
+
export declare function findNpmCli(executable?: string, platform?: NodeJS.Platform, path?: string): string | null;
|
|
8
|
+
export declare function runNpm(root: string, args: readonly string[], options: {
|
|
9
|
+
readonly mode: NpmInstallMode;
|
|
10
|
+
readonly scriptPolicy?: "ignore" | "user";
|
|
11
|
+
readonly signal?: AbortSignal;
|
|
12
|
+
readonly onWarning?: (warning: string) => void;
|
|
13
|
+
}): Promise<void>;
|
|
14
|
+
/** Installer commands retain forced policy while returning machine-readable output. */
|
|
15
|
+
export declare function runInstallerNpm(root: string, args: readonly string[], options: {
|
|
16
|
+
readonly mode: NpmInstallMode;
|
|
17
|
+
readonly dryRun?: boolean;
|
|
18
|
+
readonly rebuild?: boolean;
|
|
19
|
+
readonly signal?: AbortSignal;
|
|
20
|
+
readonly onWarning?: (warning: string) => void;
|
|
21
|
+
}): Promise<string>;
|
|
22
|
+
export declare function installerNpmVersion(root: string, signal?: AbortSignal, onWarning?: (warning: string) => void): Promise<string>;
|
|
23
|
+
//# sourceMappingURL=npm-runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"npm-runner.d.ts","sourceRoot":"","sources":["../src/npm-runner.ts"],"names":[],"mappings":"AAsDA,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEhD,+EAA+E;AAC/E,wBAAgB,eAAe,CAC7B,IAAI,EAAE,cAAc,EACpB,YAAY,GAAE,QAAQ,GAAG,MAAiB,GACzC,MAAM,EAAE,CASV;AAED,wBAAgB,6BAA6B,CAC3C,QAAQ,GAAE,SAAS,MAAM,EAAqB,EAC9C,WAAW,GAAE,MAA0C,GACtD,IAAI,CAKN;AAED,0DAA0D;AAC1D,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQ9D;AAED,wBAAgB,UAAU,CACxB,UAAU,GAAE,MAAyB,EACrC,QAAQ,GAAE,MAAM,CAAC,QAA2B,EAC5C,IAAI,GAAE,MAAkC,GACvC,MAAM,GAAG,IAAI,CAef;AAoCD,wBAAsB,MAAM,CAC1B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,EAAE;IAAE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;CAAE,GACnK,OAAO,CAAC,IAAI,CAAC,CAQf;AAED,uFAAuF;AACvF,wBAAsB,eAAe,CACnC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,EACrC,OAAO,EAAE;IAAE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;CAAE,GAC/K,OAAO,CAAC,MAAM,CAAC,CASjB;AAED,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,EAAE,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAMpI"}
|