@hagicode/hagiscript 0.1.0-dev.9.1.ba06982
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 +251 -0
- package/README_cn.md +251 -0
- package/dist/cli.d.ts +5 -0
- package/dist/cli.js +50 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/node-runtime-commands.d.ts +2 -0
- package/dist/commands/node-runtime-commands.js +88 -0
- package/dist/commands/node-runtime-commands.js.map +1 -0
- package/dist/commands/npm-sync-commands.d.ts +2 -0
- package/dist/commands/npm-sync-commands.js +155 -0
- package/dist/commands/npm-sync-commands.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/runtime/node-download.d.ts +13 -0
- package/dist/runtime/node-download.js +78 -0
- package/dist/runtime/node-download.js.map +1 -0
- package/dist/runtime/node-extract.d.ts +6 -0
- package/dist/runtime/node-extract.js +155 -0
- package/dist/runtime/node-extract.js.map +1 -0
- package/dist/runtime/node-installer.d.ts +39 -0
- package/dist/runtime/node-installer.js +85 -0
- package/dist/runtime/node-installer.js.map +1 -0
- package/dist/runtime/node-platform.d.ts +14 -0
- package/dist/runtime/node-platform.js +41 -0
- package/dist/runtime/node-platform.js.map +1 -0
- package/dist/runtime/node-release.d.ts +28 -0
- package/dist/runtime/node-release.js +146 -0
- package/dist/runtime/node-release.js.map +1 -0
- package/dist/runtime/node-verify.d.ts +20 -0
- package/dist/runtime/node-verify.js +66 -0
- package/dist/runtime/node-verify.js.map +1 -0
- package/dist/runtime/npm-global.d.ts +20 -0
- package/dist/runtime/npm-global.js +53 -0
- package/dist/runtime/npm-global.js.map +1 -0
- package/dist/runtime/npm-sync.d.ts +114 -0
- package/dist/runtime/npm-sync.js +398 -0
- package/dist/runtime/npm-sync.js.map +1 -0
- package/dist/runtime/tool-sync-catalog.config.json +59 -0
- package/dist/runtime/tool-sync-catalog.d.ts +48 -0
- package/dist/runtime/tool-sync-catalog.js +189 -0
- package/dist/runtime/tool-sync-catalog.js.map +1 -0
- package/dist/version.d.ts +7 -0
- package/dist/version.js +9 -0
- package/dist/version.js.map +1 -0
- package/package.json +73 -0
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export class UnsupportedNodePlatformError extends Error {
|
|
2
|
+
constructor(message) {
|
|
3
|
+
super(message);
|
|
4
|
+
this.name = "UnsupportedNodePlatformError";
|
|
5
|
+
}
|
|
6
|
+
}
|
|
7
|
+
export function mapNodePlatform(platform = process.platform, arch = process.arch) {
|
|
8
|
+
const os = mapOperatingSystem(platform);
|
|
9
|
+
const nodeArch = mapArchitecture(arch);
|
|
10
|
+
return {
|
|
11
|
+
os,
|
|
12
|
+
arch: nodeArch,
|
|
13
|
+
nodeFileKey: `${os}-${nodeArch}`,
|
|
14
|
+
archiveExtension: os === "win" ? "zip" : "tar.xz",
|
|
15
|
+
executableName: os === "win" ? "node.exe" : "node",
|
|
16
|
+
npmExecutableName: os === "win" ? "npm.cmd" : "npm"
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
function mapOperatingSystem(platform) {
|
|
20
|
+
switch (platform) {
|
|
21
|
+
case "win32":
|
|
22
|
+
return "win";
|
|
23
|
+
case "linux":
|
|
24
|
+
return "linux";
|
|
25
|
+
case "darwin":
|
|
26
|
+
return "darwin";
|
|
27
|
+
default:
|
|
28
|
+
throw new UnsupportedNodePlatformError(`Unsupported operating system for Node.js runtime archives: ${platform}`);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
function mapArchitecture(arch) {
|
|
32
|
+
switch (arch) {
|
|
33
|
+
case "x64":
|
|
34
|
+
return "x64";
|
|
35
|
+
case "arm64":
|
|
36
|
+
return "arm64";
|
|
37
|
+
default:
|
|
38
|
+
throw new UnsupportedNodePlatformError(`Unsupported CPU architecture for Node.js runtime archives: ${arch}`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=node-platform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-platform.js","sourceRoot":"","sources":["../../src/runtime/node-platform.ts"],"names":[],"mappings":"AAYA,MAAM,OAAO,4BAA6B,SAAQ,KAAK;IACrD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,8BAA8B,CAAC;IAC7C,CAAC;CACF;AAED,MAAM,UAAU,eAAe,CAC7B,QAAQ,GAAG,OAAO,CAAC,QAAQ,EAC3B,IAAI,GAAG,OAAO,CAAC,IAAI;IAEnB,MAAM,EAAE,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IACxC,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IAEvC,OAAO;QACL,EAAE;QACF,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,GAAG,EAAE,IAAI,QAAQ,EAAE;QAChC,gBAAgB,EAAE,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ;QACjD,cAAc,EAAE,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM;QAClD,iBAAiB,EAAE,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK;KACpD,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CAAC,QAAgB;IAC1C,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,OAAO;YACV,OAAO,KAAK,CAAC;QACf,KAAK,OAAO;YACV,OAAO,OAAO,CAAC;QACjB,KAAK,QAAQ;YACX,OAAO,QAAQ,CAAC;QAClB;YACE,MAAM,IAAI,4BAA4B,CACpC,8DAA8D,QAAQ,EAAE,CACzE,CAAC;IACN,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,IAAY;IACnC,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,KAAK;YACR,OAAO,KAAK,CAAC;QACf,KAAK,OAAO;YACV,OAAO,OAAO,CAAC;QACjB;YACE,MAAM,IAAI,4BAA4B,CACpC,8DAA8D,IAAI,EAAE,CACrE,CAAC;IACN,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { type NodePlatformTarget } from "./node-platform.js";
|
|
2
|
+
export declare const DEFAULT_NODE_MAJOR = 22;
|
|
3
|
+
export declare const OFFICIAL_NODE_DIST_BASE_URL = "https://nodejs.org/dist";
|
|
4
|
+
export interface NodeReleaseMetadata {
|
|
5
|
+
version: string;
|
|
6
|
+
lts?: string | boolean;
|
|
7
|
+
files: string[];
|
|
8
|
+
npm?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface SelectedNodeArchive {
|
|
11
|
+
release: NodeReleaseMetadata;
|
|
12
|
+
version: string;
|
|
13
|
+
platform: NodePlatformTarget;
|
|
14
|
+
fileName: string;
|
|
15
|
+
url: string;
|
|
16
|
+
}
|
|
17
|
+
export declare class NodeVersionSelectorError extends Error {
|
|
18
|
+
constructor(message: string);
|
|
19
|
+
}
|
|
20
|
+
export declare class NodeRuntimeSourcePolicyError extends Error {
|
|
21
|
+
constructor(message: string);
|
|
22
|
+
}
|
|
23
|
+
export declare function normalizeVersionSelector(selector?: string): string;
|
|
24
|
+
export declare function validateVersionSelector(selector?: string): void;
|
|
25
|
+
export declare function fetchNodeReleaseMetadata(fetchImpl?: typeof fetch, baseUrl?: string): Promise<NodeReleaseMetadata[]>;
|
|
26
|
+
export declare function resolveNodeRelease(releases: NodeReleaseMetadata[], selector?: string): NodeReleaseMetadata;
|
|
27
|
+
export declare function selectNodeArchive(releases: NodeReleaseMetadata[], selector?: string, platform?: NodePlatformTarget, baseUrl?: string): SelectedNodeArchive;
|
|
28
|
+
export declare function assertOfficialNodeDistBaseUrl(baseUrl: string): void;
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { mapNodePlatform } from "./node-platform.js";
|
|
2
|
+
export const DEFAULT_NODE_MAJOR = 22;
|
|
3
|
+
export const OFFICIAL_NODE_DIST_BASE_URL = "https://nodejs.org/dist";
|
|
4
|
+
export class NodeVersionSelectorError extends Error {
|
|
5
|
+
constructor(message) {
|
|
6
|
+
super(message);
|
|
7
|
+
this.name = "NodeVersionSelectorError";
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
export class NodeRuntimeSourcePolicyError extends Error {
|
|
11
|
+
constructor(message) {
|
|
12
|
+
super(message);
|
|
13
|
+
this.name = "NodeRuntimeSourcePolicyError";
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export function normalizeVersionSelector(selector) {
|
|
17
|
+
const trimmed = selector?.trim();
|
|
18
|
+
return trimmed && trimmed.length > 0
|
|
19
|
+
? trimmed.toLowerCase()
|
|
20
|
+
: String(DEFAULT_NODE_MAJOR);
|
|
21
|
+
}
|
|
22
|
+
export function validateVersionSelector(selector) {
|
|
23
|
+
const normalized = normalizeVersionSelector(selector);
|
|
24
|
+
if (["lts", "latest", "current"].includes(normalized)) {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
if (/^v?\d+(?:\.\d+\.\d+)?$/.test(normalized)) {
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
throw new NodeVersionSelectorError(`Invalid Node.js version selector: ${selector ?? ""}. Use lts, latest, current, 22, 22.11.0, or v22.11.0.`);
|
|
31
|
+
}
|
|
32
|
+
export async function fetchNodeReleaseMetadata(fetchImpl = fetch, baseUrl = OFFICIAL_NODE_DIST_BASE_URL) {
|
|
33
|
+
assertOfficialNodeDistBaseUrl(baseUrl);
|
|
34
|
+
const response = await fetchImpl(`${baseUrl}/index.json`, {
|
|
35
|
+
headers: { accept: "application/json" }
|
|
36
|
+
});
|
|
37
|
+
if (!response.ok) {
|
|
38
|
+
throw new Error(`Failed to fetch Node.js release metadata: HTTP ${response.status}`);
|
|
39
|
+
}
|
|
40
|
+
const data = (await response.json());
|
|
41
|
+
if (!Array.isArray(data)) {
|
|
42
|
+
throw new Error("Node.js release metadata response was not an array.");
|
|
43
|
+
}
|
|
44
|
+
return data.map(parseReleaseMetadata);
|
|
45
|
+
}
|
|
46
|
+
export function resolveNodeRelease(releases, selector) {
|
|
47
|
+
validateVersionSelector(selector);
|
|
48
|
+
const normalized = normalizeVersionSelector(selector);
|
|
49
|
+
const sorted = [...releases].sort(compareReleaseDescending);
|
|
50
|
+
const selected = selectRelease(sorted, normalized);
|
|
51
|
+
if (!selected) {
|
|
52
|
+
throw new NodeVersionSelectorError(`No Node.js release matched version selector: ${selector ?? DEFAULT_NODE_MAJOR}`);
|
|
53
|
+
}
|
|
54
|
+
return selected;
|
|
55
|
+
}
|
|
56
|
+
export function selectNodeArchive(releases, selector, platform = mapNodePlatform(), baseUrl = OFFICIAL_NODE_DIST_BASE_URL) {
|
|
57
|
+
assertOfficialNodeDistBaseUrl(baseUrl);
|
|
58
|
+
const release = resolveNodeRelease(releases, selector);
|
|
59
|
+
if (!release.files.includes(platform.nodeFileKey)) {
|
|
60
|
+
throw new Error(`Node.js ${release.version} does not publish an archive for ${platform.nodeFileKey}.`);
|
|
61
|
+
}
|
|
62
|
+
const fileName = `node-${release.version}-${platform.nodeFileKey}.${platform.archiveExtension}`;
|
|
63
|
+
const url = `${baseUrl}/${release.version}/${fileName}`;
|
|
64
|
+
assertOfficialNodeArchiveUrl(url, baseUrl);
|
|
65
|
+
return {
|
|
66
|
+
release,
|
|
67
|
+
version: release.version,
|
|
68
|
+
platform,
|
|
69
|
+
fileName,
|
|
70
|
+
url
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
export function assertOfficialNodeDistBaseUrl(baseUrl) {
|
|
74
|
+
let parsed;
|
|
75
|
+
try {
|
|
76
|
+
parsed = new URL(baseUrl);
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
throw new NodeRuntimeSourcePolicyError(`Node.js runtime source is not a valid URL: ${baseUrl}`);
|
|
80
|
+
}
|
|
81
|
+
if (parsed.protocol !== "https:" || parsed.hostname !== "nodejs.org") {
|
|
82
|
+
throw new NodeRuntimeSourcePolicyError(`Node.js runtime source is not governed by the official distribution host: ${baseUrl}`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
function assertOfficialNodeArchiveUrl(url, baseUrl) {
|
|
86
|
+
assertOfficialNodeDistBaseUrl(baseUrl);
|
|
87
|
+
const parsedUrl = new URL(url);
|
|
88
|
+
const parsedBaseUrl = new URL(baseUrl);
|
|
89
|
+
if (parsedUrl.protocol !== "https:" ||
|
|
90
|
+
parsedUrl.hostname !== parsedBaseUrl.hostname ||
|
|
91
|
+
!parsedUrl.pathname.startsWith("/dist/v")) {
|
|
92
|
+
throw new NodeRuntimeSourcePolicyError(`Node.js archive URL violates source policy: ${url}`);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
function parseReleaseMetadata(value) {
|
|
96
|
+
if (typeof value !== "object" || value === null) {
|
|
97
|
+
throw new Error("Node.js release metadata item was not an object.");
|
|
98
|
+
}
|
|
99
|
+
const record = value;
|
|
100
|
+
if (typeof record.version !== "string" || !Array.isArray(record.files)) {
|
|
101
|
+
throw new Error("Node.js release metadata item is missing version or files.");
|
|
102
|
+
}
|
|
103
|
+
return {
|
|
104
|
+
version: record.version,
|
|
105
|
+
lts: typeof record.lts === "string" || typeof record.lts === "boolean"
|
|
106
|
+
? record.lts
|
|
107
|
+
: undefined,
|
|
108
|
+
files: record.files.filter((file) => typeof file === "string"),
|
|
109
|
+
npm: typeof record.npm === "string" ? record.npm : undefined
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
function selectRelease(releases, selector) {
|
|
113
|
+
if (selector === "lts") {
|
|
114
|
+
return releases.find((release) => Boolean(release.lts));
|
|
115
|
+
}
|
|
116
|
+
if (selector === "latest" || selector === "current") {
|
|
117
|
+
return releases[0];
|
|
118
|
+
}
|
|
119
|
+
if (/^v?\d+$/.test(selector)) {
|
|
120
|
+
const major = Number(selector.replace(/^v/, ""));
|
|
121
|
+
return releases.find((release) => getMajorVersion(release.version) === major);
|
|
122
|
+
}
|
|
123
|
+
const exact = selector.startsWith("v") ? selector : `v${selector}`;
|
|
124
|
+
return releases.find((release) => release.version === exact);
|
|
125
|
+
}
|
|
126
|
+
function compareReleaseDescending(left, right) {
|
|
127
|
+
const leftParts = parseVersionParts(left.version);
|
|
128
|
+
const rightParts = parseVersionParts(right.version);
|
|
129
|
+
for (let index = 0; index < 3; index += 1) {
|
|
130
|
+
if (leftParts[index] !== rightParts[index]) {
|
|
131
|
+
return rightParts[index] - leftParts[index];
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return 0;
|
|
135
|
+
}
|
|
136
|
+
function getMajorVersion(version) {
|
|
137
|
+
return parseVersionParts(version)[0];
|
|
138
|
+
}
|
|
139
|
+
function parseVersionParts(version) {
|
|
140
|
+
const match = /^v?(\d+)\.(\d+)\.(\d+)$/.exec(version);
|
|
141
|
+
if (!match) {
|
|
142
|
+
return [0, 0, 0];
|
|
143
|
+
}
|
|
144
|
+
return [Number(match[1]), Number(match[2]), Number(match[3])];
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=node-release.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-release.js","sourceRoot":"","sources":["../../src/runtime/node-release.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export interface RuntimeExecutablePaths {
|
|
2
|
+
nodePath: string;
|
|
3
|
+
npmPath: string;
|
|
4
|
+
}
|
|
5
|
+
export interface NodeRuntimeVerificationResult {
|
|
6
|
+
valid: boolean;
|
|
7
|
+
targetDirectory: string;
|
|
8
|
+
nodeVersion?: string;
|
|
9
|
+
npmVersion?: string;
|
|
10
|
+
nodePath?: string;
|
|
11
|
+
npmPath?: string;
|
|
12
|
+
failureReason?: string;
|
|
13
|
+
}
|
|
14
|
+
export interface VerifyNodeRuntimeOptions {
|
|
15
|
+
platform?: NodeJS.Platform;
|
|
16
|
+
timeoutMs?: number;
|
|
17
|
+
runCommand?: (command: string, args: string[], timeoutMs: number) => Promise<string>;
|
|
18
|
+
}
|
|
19
|
+
export declare function verifyNodeRuntime(targetDirectory: string, options?: VerifyNodeRuntimeOptions): Promise<NodeRuntimeVerificationResult>;
|
|
20
|
+
export declare function getRuntimeExecutablePaths(targetDirectory: string, platform?: NodeJS.Platform): RuntimeExecutablePaths;
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { access } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { constants } from "node:fs";
|
|
4
|
+
import { execFile } from "node:child_process";
|
|
5
|
+
import { promisify } from "node:util";
|
|
6
|
+
const execFileAsync = promisify(execFile);
|
|
7
|
+
export async function verifyNodeRuntime(targetDirectory, options = {}) {
|
|
8
|
+
const timeoutMs = options.timeoutMs ?? 15_000;
|
|
9
|
+
const runCommand = options.runCommand ?? runVersionCommand;
|
|
10
|
+
const paths = getRuntimeExecutablePaths(targetDirectory, options.platform);
|
|
11
|
+
try {
|
|
12
|
+
await access(paths.nodePath, constants.X_OK);
|
|
13
|
+
await access(paths.npmPath, constants.X_OK);
|
|
14
|
+
const [nodeVersion, npmVersion] = await Promise.all([
|
|
15
|
+
runCommand(paths.nodePath, ["--version"], timeoutMs),
|
|
16
|
+
runCommand(paths.npmPath, ["--version"], timeoutMs)
|
|
17
|
+
]);
|
|
18
|
+
return {
|
|
19
|
+
valid: true,
|
|
20
|
+
targetDirectory,
|
|
21
|
+
nodeVersion: nodeVersion.trim(),
|
|
22
|
+
npmVersion: npmVersion.trim(),
|
|
23
|
+
nodePath: paths.nodePath,
|
|
24
|
+
npmPath: paths.npmPath
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
return {
|
|
29
|
+
valid: false,
|
|
30
|
+
targetDirectory,
|
|
31
|
+
nodePath: paths.nodePath,
|
|
32
|
+
npmPath: paths.npmPath,
|
|
33
|
+
failureReason: error instanceof Error ? error.message : String(error)
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
export function getRuntimeExecutablePaths(targetDirectory, platform = process.platform) {
|
|
38
|
+
if (platform === "win32") {
|
|
39
|
+
return {
|
|
40
|
+
nodePath: join(targetDirectory, "node.exe"),
|
|
41
|
+
npmPath: join(targetDirectory, "npm.cmd")
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
return {
|
|
45
|
+
nodePath: join(targetDirectory, "bin", "node"),
|
|
46
|
+
npmPath: join(targetDirectory, "bin", "npm")
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
async function runVersionCommand(command, args, timeoutMs) {
|
|
50
|
+
try {
|
|
51
|
+
const { stdout } = await execFileAsync(command, args, {
|
|
52
|
+
timeout: timeoutMs,
|
|
53
|
+
windowsHide: true,
|
|
54
|
+
maxBuffer: 1024 * 1024
|
|
55
|
+
});
|
|
56
|
+
return stdout;
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
const execError = error;
|
|
60
|
+
const stderr = typeof execError.stderr === "string" ? execError.stderr.trim() : "";
|
|
61
|
+
throw new Error(stderr.length > 0
|
|
62
|
+
? stderr
|
|
63
|
+
: `Command failed: ${command} ${args.join(" ")}`);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=node-verify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-verify.js","sourceRoot":"","sources":["../../src/runtime/node-verify.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export interface NpmCommandResult {
|
|
2
|
+
command: string;
|
|
3
|
+
args: string[];
|
|
4
|
+
stdout: string;
|
|
5
|
+
stderr: string;
|
|
6
|
+
}
|
|
7
|
+
export interface NpmCommandFailureContext extends NpmCommandResult {
|
|
8
|
+
exitCode?: string | number | null;
|
|
9
|
+
}
|
|
10
|
+
export declare class NpmCommandError extends Error {
|
|
11
|
+
readonly context: NpmCommandFailureContext;
|
|
12
|
+
constructor(message: string, context: NpmCommandFailureContext);
|
|
13
|
+
}
|
|
14
|
+
export interface NpmGlobalCommandOptions {
|
|
15
|
+
timeoutMs?: number;
|
|
16
|
+
env?: NodeJS.ProcessEnv;
|
|
17
|
+
runCommand?: (command: string, args: string[], timeoutMs: number) => Promise<NpmCommandResult>;
|
|
18
|
+
}
|
|
19
|
+
export declare function listGlobalPackages(npmPath: string, options?: NpmGlobalCommandOptions): Promise<NpmCommandResult>;
|
|
20
|
+
export declare function installGlobalPackage(npmPath: string, selector: string, options?: NpmGlobalCommandOptions): Promise<NpmCommandResult>;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
import { promisify } from "node:util";
|
|
3
|
+
const execFileAsync = promisify(execFile);
|
|
4
|
+
export class NpmCommandError extends Error {
|
|
5
|
+
context;
|
|
6
|
+
constructor(message, context) {
|
|
7
|
+
super(message);
|
|
8
|
+
this.name = "NpmCommandError";
|
|
9
|
+
this.context = context;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
export async function listGlobalPackages(npmPath, options = {}) {
|
|
13
|
+
return runNpmCommand(npmPath, ["list", "-g", "--depth=0", "--json"], options);
|
|
14
|
+
}
|
|
15
|
+
export async function installGlobalPackage(npmPath, selector, options = {}) {
|
|
16
|
+
return runNpmCommand(npmPath, ["install", "-g", selector], options);
|
|
17
|
+
}
|
|
18
|
+
async function runNpmCommand(npmPath, args, options) {
|
|
19
|
+
const timeoutMs = options.timeoutMs ?? 120_000;
|
|
20
|
+
const runner = options.runCommand
|
|
21
|
+
? options.runCommand
|
|
22
|
+
: (command, commandArgs, commandTimeoutMs) => execNpmCommand(command, commandArgs, commandTimeoutMs, options.env);
|
|
23
|
+
return runner(npmPath, args, timeoutMs);
|
|
24
|
+
}
|
|
25
|
+
async function execNpmCommand(command, args, timeoutMs, env) {
|
|
26
|
+
try {
|
|
27
|
+
const { stdout, stderr } = await execFileAsync(command, args, {
|
|
28
|
+
timeout: timeoutMs,
|
|
29
|
+
windowsHide: true,
|
|
30
|
+
env,
|
|
31
|
+
maxBuffer: 10 * 1024 * 1024
|
|
32
|
+
});
|
|
33
|
+
return {
|
|
34
|
+
command,
|
|
35
|
+
args,
|
|
36
|
+
stdout,
|
|
37
|
+
stderr
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
const execError = error;
|
|
42
|
+
const stdout = typeof execError.stdout === "string" ? execError.stdout : "";
|
|
43
|
+
const stderr = typeof execError.stderr === "string" ? execError.stderr : "";
|
|
44
|
+
throw new NpmCommandError(`npm command failed: ${command} ${args.join(" ")}`, {
|
|
45
|
+
command,
|
|
46
|
+
args,
|
|
47
|
+
stdout,
|
|
48
|
+
stderr,
|
|
49
|
+
exitCode: execError.code
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=npm-global.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"npm-global.js","sourceRoot":"","sources":["../../src/runtime/npm-global.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAA0B,MAAM,oBAAoB,CAAC;AACtE,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAa1C,MAAM,OAAO,eAAgB,SAAQ,KAAK;IAC/B,OAAO,CAA2B;IAE3C,YAAY,OAAe,EAAE,OAAiC;QAC5D,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;QAC9B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;CACF;AAYD,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,OAAe,EACf,UAAmC,EAAE;IAErC,OAAO,aAAa,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC;AAChF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,OAAe,EACf,QAAgB,EAChB,UAAmC,EAAE;IAErC,OAAO,aAAa,CAAC,OAAO,EAAE,CAAC,SAAS,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC;AACtE,CAAC;AAED,KAAK,UAAU,aAAa,CAC1B,OAAe,EACf,IAAc,EACd,OAAgC;IAEhC,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC;IAC/C,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU;QAC/B,CAAC,CAAC,OAAO,CAAC,UAAU;QACpB,CAAC,CAAC,CAAC,OAAe,EAAE,WAAqB,EAAE,gBAAwB,EAAE,EAAE,CACnE,cAAc,CAAC,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IAE1E,OAAO,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;AAC1C,CAAC;AAED,KAAK,UAAU,cAAc,CAC3B,OAAe,EACf,IAAc,EACd,SAAiB,EACjB,GAAuB;IAEvB,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,OAAO,EAAE,IAAI,EAAE;YAC5D,OAAO,EAAE,SAAS;YAClB,WAAW,EAAE,IAAI;YACjB,GAAG;YACH,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI;SAC5B,CAAC,CAAC;QAEH,OAAO;YACL,OAAO;YACP,IAAI;YACJ,MAAM;YACN,MAAM;SACP,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,SAAS,GAAG,KAA0B,CAAC;QAC7C,MAAM,MAAM,GAAG,OAAO,SAAS,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5E,MAAM,MAAM,GAAG,OAAO,SAAS,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QAE5E,MAAM,IAAI,eAAe,CACvB,uBAAuB,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAClD;YACE,OAAO;YACP,IAAI;YACJ,MAAM;YACN,MAAM;YACN,QAAQ,EAAE,SAAS,CAAC,IAAI;SACzB,CACF,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { NpmCommandError, type NpmGlobalCommandOptions } from "./npm-global.js";
|
|
2
|
+
import { verifyNodeRuntime } from "./node-verify.js";
|
|
3
|
+
import { type CustomAgentCliToolInput, type ToolSyncGroupId, type ToolSyncRequirement } from "./tool-sync-catalog.js";
|
|
4
|
+
export interface NpmSyncManifestEntry {
|
|
5
|
+
version: string;
|
|
6
|
+
target?: string;
|
|
7
|
+
toolId?: string;
|
|
8
|
+
toolDisplayName?: string;
|
|
9
|
+
toolGroup?: ToolSyncGroupId;
|
|
10
|
+
toolRequirement?: ToolSyncRequirement;
|
|
11
|
+
}
|
|
12
|
+
export interface NpmSyncManifest {
|
|
13
|
+
packages: Record<string, NpmSyncManifestEntry>;
|
|
14
|
+
syncMode: "packages" | "tools";
|
|
15
|
+
}
|
|
16
|
+
export interface NpmSyncToolManifestSelection {
|
|
17
|
+
optionalAgentCliSyncEnabled?: boolean;
|
|
18
|
+
selectedOptionalAgentCliIds?: string[];
|
|
19
|
+
customAgentClis?: CustomAgentCliToolInput[];
|
|
20
|
+
}
|
|
21
|
+
export interface NpmSyncToolManifest {
|
|
22
|
+
tools: NpmSyncToolManifestSelection;
|
|
23
|
+
}
|
|
24
|
+
export type InstalledGlobalPackages = Record<string, string>;
|
|
25
|
+
export type NpmSyncActionKind = "noop" | "install" | "upgrade" | "downgrade" | "sync";
|
|
26
|
+
export interface NpmSyncPlannedAction {
|
|
27
|
+
packageName: string;
|
|
28
|
+
requiredRange: string;
|
|
29
|
+
targetSelector: string;
|
|
30
|
+
selectedInstallSelector: string;
|
|
31
|
+
installedVersion?: string;
|
|
32
|
+
action: NpmSyncActionKind;
|
|
33
|
+
toolId?: string;
|
|
34
|
+
toolDisplayName?: string;
|
|
35
|
+
toolGroup?: ToolSyncGroupId;
|
|
36
|
+
toolRequirement?: ToolSyncRequirement;
|
|
37
|
+
}
|
|
38
|
+
export interface NpmSyncActionResult extends NpmSyncPlannedAction {
|
|
39
|
+
changed: boolean;
|
|
40
|
+
command?: string;
|
|
41
|
+
args?: string[];
|
|
42
|
+
stdout?: string;
|
|
43
|
+
stderr?: string;
|
|
44
|
+
}
|
|
45
|
+
export interface NpmSyncRuntimeMetadata {
|
|
46
|
+
targetDirectory: string;
|
|
47
|
+
nodePath: string;
|
|
48
|
+
npmPath: string;
|
|
49
|
+
nodeVersion: string;
|
|
50
|
+
npmVersion: string;
|
|
51
|
+
}
|
|
52
|
+
export interface NpmSyncSummary {
|
|
53
|
+
runtime: NpmSyncRuntimeMetadata;
|
|
54
|
+
manifestPath: string;
|
|
55
|
+
packageCount: number;
|
|
56
|
+
syncMode: NpmSyncManifest["syncMode"];
|
|
57
|
+
noopCount: number;
|
|
58
|
+
changedCount: number;
|
|
59
|
+
actions: NpmSyncActionResult[];
|
|
60
|
+
}
|
|
61
|
+
export interface NpmSyncOptions {
|
|
62
|
+
runtimePath: string;
|
|
63
|
+
manifestPath: string;
|
|
64
|
+
npmOptions?: NpmGlobalCommandOptions;
|
|
65
|
+
verifyRuntime?: typeof verifyNodeRuntime;
|
|
66
|
+
onLog?: (event: NpmSyncLogEvent) => void;
|
|
67
|
+
}
|
|
68
|
+
export type NpmSyncLogEvent = {
|
|
69
|
+
type: "manifest-loaded";
|
|
70
|
+
manifestPath: string;
|
|
71
|
+
packageCount: number;
|
|
72
|
+
syncMode: NpmSyncManifest["syncMode"];
|
|
73
|
+
} | {
|
|
74
|
+
type: "runtime-valid";
|
|
75
|
+
runtime: NpmSyncRuntimeMetadata;
|
|
76
|
+
} | {
|
|
77
|
+
type: "inventory";
|
|
78
|
+
packages: InstalledGlobalPackages;
|
|
79
|
+
} | {
|
|
80
|
+
type: "planned-action";
|
|
81
|
+
action: NpmSyncPlannedAction;
|
|
82
|
+
} | {
|
|
83
|
+
type: "skip";
|
|
84
|
+
action: NpmSyncPlannedAction;
|
|
85
|
+
} | {
|
|
86
|
+
type: "install-start";
|
|
87
|
+
action: NpmSyncPlannedAction;
|
|
88
|
+
} | {
|
|
89
|
+
type: "install-complete";
|
|
90
|
+
action: NpmSyncActionResult;
|
|
91
|
+
} | {
|
|
92
|
+
type: "summary";
|
|
93
|
+
summary: NpmSyncSummary;
|
|
94
|
+
};
|
|
95
|
+
export declare class NpmSyncError extends Error {
|
|
96
|
+
constructor(message: string);
|
|
97
|
+
}
|
|
98
|
+
export declare class NpmManifestValidationError extends NpmSyncError {
|
|
99
|
+
readonly errors: string[];
|
|
100
|
+
constructor(errors: string[]);
|
|
101
|
+
}
|
|
102
|
+
export declare class NpmSyncCommandError extends NpmSyncError {
|
|
103
|
+
readonly packageName?: string;
|
|
104
|
+
readonly command: string;
|
|
105
|
+
readonly args: string[];
|
|
106
|
+
readonly stdout: string;
|
|
107
|
+
readonly stderr: string;
|
|
108
|
+
constructor(message: string, error: NpmCommandError, packageName?: string);
|
|
109
|
+
}
|
|
110
|
+
export declare function loadNpmSyncManifest(manifestPath: string): Promise<NpmSyncManifest>;
|
|
111
|
+
export declare function validateNpmSyncManifest(value: unknown): NpmSyncManifest;
|
|
112
|
+
export declare function normalizeGlobalInventory(stdout: string): InstalledGlobalPackages;
|
|
113
|
+
export declare function createNpmSyncPlan(manifest: NpmSyncManifest, installed: InstalledGlobalPackages): NpmSyncPlannedAction[];
|
|
114
|
+
export declare function syncNpmGlobals(options: NpmSyncOptions): Promise<NpmSyncSummary>;
|