@hagicode/hagiscript 0.1.0
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 +215 -0
- package/README_cn.md +215 -0
- package/dist/cli.d.ts +4 -0
- package/dist/cli.js +37 -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 +92 -0
- package/dist/commands/npm-sync-commands.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.js +13 -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 +18 -0
- package/dist/runtime/node-installer.js +46 -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 +94 -0
- package/dist/runtime/npm-sync.js +290 -0
- package/dist/runtime/npm-sync.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 +71 -0
|
@@ -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,94 @@
|
|
|
1
|
+
import { NpmCommandError, type NpmGlobalCommandOptions } from "./npm-global.js";
|
|
2
|
+
import { verifyNodeRuntime } from "./node-verify.js";
|
|
3
|
+
export interface NpmSyncManifestEntry {
|
|
4
|
+
version: string;
|
|
5
|
+
target?: string;
|
|
6
|
+
}
|
|
7
|
+
export interface NpmSyncManifest {
|
|
8
|
+
packages: Record<string, NpmSyncManifestEntry>;
|
|
9
|
+
}
|
|
10
|
+
export type InstalledGlobalPackages = Record<string, string>;
|
|
11
|
+
export type NpmSyncActionKind = "noop" | "install" | "upgrade" | "downgrade" | "sync";
|
|
12
|
+
export interface NpmSyncPlannedAction {
|
|
13
|
+
packageName: string;
|
|
14
|
+
requiredRange: string;
|
|
15
|
+
targetSelector: string;
|
|
16
|
+
selectedInstallSelector: string;
|
|
17
|
+
installedVersion?: string;
|
|
18
|
+
action: NpmSyncActionKind;
|
|
19
|
+
}
|
|
20
|
+
export interface NpmSyncActionResult extends NpmSyncPlannedAction {
|
|
21
|
+
changed: boolean;
|
|
22
|
+
command?: string;
|
|
23
|
+
args?: string[];
|
|
24
|
+
stdout?: string;
|
|
25
|
+
stderr?: string;
|
|
26
|
+
}
|
|
27
|
+
export interface NpmSyncRuntimeMetadata {
|
|
28
|
+
targetDirectory: string;
|
|
29
|
+
nodePath: string;
|
|
30
|
+
npmPath: string;
|
|
31
|
+
nodeVersion: string;
|
|
32
|
+
npmVersion: string;
|
|
33
|
+
}
|
|
34
|
+
export interface NpmSyncSummary {
|
|
35
|
+
runtime: NpmSyncRuntimeMetadata;
|
|
36
|
+
manifestPath: string;
|
|
37
|
+
packageCount: number;
|
|
38
|
+
noopCount: number;
|
|
39
|
+
changedCount: number;
|
|
40
|
+
actions: NpmSyncActionResult[];
|
|
41
|
+
}
|
|
42
|
+
export interface NpmSyncOptions {
|
|
43
|
+
runtimePath: string;
|
|
44
|
+
manifestPath: string;
|
|
45
|
+
npmOptions?: NpmGlobalCommandOptions;
|
|
46
|
+
verifyRuntime?: typeof verifyNodeRuntime;
|
|
47
|
+
onLog?: (event: NpmSyncLogEvent) => void;
|
|
48
|
+
}
|
|
49
|
+
export type NpmSyncLogEvent = {
|
|
50
|
+
type: "manifest-loaded";
|
|
51
|
+
manifestPath: string;
|
|
52
|
+
packageCount: number;
|
|
53
|
+
} | {
|
|
54
|
+
type: "runtime-valid";
|
|
55
|
+
runtime: NpmSyncRuntimeMetadata;
|
|
56
|
+
} | {
|
|
57
|
+
type: "inventory";
|
|
58
|
+
packages: InstalledGlobalPackages;
|
|
59
|
+
} | {
|
|
60
|
+
type: "planned-action";
|
|
61
|
+
action: NpmSyncPlannedAction;
|
|
62
|
+
} | {
|
|
63
|
+
type: "skip";
|
|
64
|
+
action: NpmSyncPlannedAction;
|
|
65
|
+
} | {
|
|
66
|
+
type: "install-start";
|
|
67
|
+
action: NpmSyncPlannedAction;
|
|
68
|
+
} | {
|
|
69
|
+
type: "install-complete";
|
|
70
|
+
action: NpmSyncActionResult;
|
|
71
|
+
} | {
|
|
72
|
+
type: "summary";
|
|
73
|
+
summary: NpmSyncSummary;
|
|
74
|
+
};
|
|
75
|
+
export declare class NpmSyncError extends Error {
|
|
76
|
+
constructor(message: string);
|
|
77
|
+
}
|
|
78
|
+
export declare class NpmManifestValidationError extends NpmSyncError {
|
|
79
|
+
readonly errors: string[];
|
|
80
|
+
constructor(errors: string[]);
|
|
81
|
+
}
|
|
82
|
+
export declare class NpmSyncCommandError extends NpmSyncError {
|
|
83
|
+
readonly packageName?: string;
|
|
84
|
+
readonly command: string;
|
|
85
|
+
readonly args: string[];
|
|
86
|
+
readonly stdout: string;
|
|
87
|
+
readonly stderr: string;
|
|
88
|
+
constructor(message: string, error: NpmCommandError, packageName?: string);
|
|
89
|
+
}
|
|
90
|
+
export declare function loadNpmSyncManifest(manifestPath: string): Promise<NpmSyncManifest>;
|
|
91
|
+
export declare function validateNpmSyncManifest(value: unknown): NpmSyncManifest;
|
|
92
|
+
export declare function normalizeGlobalInventory(stdout: string): InstalledGlobalPackages;
|
|
93
|
+
export declare function createNpmSyncPlan(manifest: NpmSyncManifest, installed: InstalledGlobalPackages): NpmSyncPlannedAction[];
|
|
94
|
+
export declare function syncNpmGlobals(options: NpmSyncOptions): Promise<NpmSyncSummary>;
|
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { basename } from "node:path";
|
|
3
|
+
import semver from "semver";
|
|
4
|
+
import { installGlobalPackage, listGlobalPackages, NpmCommandError } from "./npm-global.js";
|
|
5
|
+
import { verifyNodeRuntime } from "./node-verify.js";
|
|
6
|
+
export class NpmSyncError extends Error {
|
|
7
|
+
constructor(message) {
|
|
8
|
+
super(message);
|
|
9
|
+
this.name = "NpmSyncError";
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
export class NpmManifestValidationError extends NpmSyncError {
|
|
13
|
+
errors;
|
|
14
|
+
constructor(errors) {
|
|
15
|
+
super(`Manifest validation failed: ${errors.join("; ")}`);
|
|
16
|
+
this.name = "NpmManifestValidationError";
|
|
17
|
+
this.errors = errors;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export class NpmSyncCommandError extends NpmSyncError {
|
|
21
|
+
packageName;
|
|
22
|
+
command;
|
|
23
|
+
args;
|
|
24
|
+
stdout;
|
|
25
|
+
stderr;
|
|
26
|
+
constructor(message, error, packageName) {
|
|
27
|
+
super(message);
|
|
28
|
+
this.name = "NpmSyncCommandError";
|
|
29
|
+
this.packageName = packageName;
|
|
30
|
+
this.command = error.context.command;
|
|
31
|
+
this.args = error.context.args;
|
|
32
|
+
this.stdout = error.context.stdout;
|
|
33
|
+
this.stderr = error.context.stderr;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
export async function loadNpmSyncManifest(manifestPath) {
|
|
37
|
+
let parsed;
|
|
38
|
+
try {
|
|
39
|
+
parsed = JSON.parse(await readFile(manifestPath, "utf8"));
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
43
|
+
throw new NpmSyncError(`Failed to read manifest ${manifestPath}: ${message}`);
|
|
44
|
+
}
|
|
45
|
+
return validateNpmSyncManifest(parsed);
|
|
46
|
+
}
|
|
47
|
+
export function validateNpmSyncManifest(value) {
|
|
48
|
+
const errors = [];
|
|
49
|
+
if (!isRecord(value)) {
|
|
50
|
+
throw new NpmManifestValidationError(["manifest must be a JSON object"]);
|
|
51
|
+
}
|
|
52
|
+
if (!isRecord(value.packages) || Array.isArray(value.packages)) {
|
|
53
|
+
throw new NpmManifestValidationError([
|
|
54
|
+
"manifest must contain a top-level packages object"
|
|
55
|
+
]);
|
|
56
|
+
}
|
|
57
|
+
const packages = {};
|
|
58
|
+
for (const [packageName, entry] of Object.entries(value.packages)) {
|
|
59
|
+
if (!isValidPackageName(packageName)) {
|
|
60
|
+
errors.push(`invalid package name: ${packageName}`);
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
if (!isRecord(entry) || Array.isArray(entry)) {
|
|
64
|
+
errors.push(`${packageName} must be an object with a version range`);
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
const version = entry.version;
|
|
68
|
+
if (typeof version !== "string" || version.trim().length === 0) {
|
|
69
|
+
errors.push(`${packageName}.version must be a non-empty semver range`);
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
const normalizedRange = version.trim();
|
|
73
|
+
if (!semver.validRange(normalizedRange)) {
|
|
74
|
+
errors.push(`${packageName}.version is not a valid semver range: ${version}`);
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
const target = entry.target;
|
|
78
|
+
if (target !== undefined) {
|
|
79
|
+
if (typeof target !== "string" || target.trim().length === 0) {
|
|
80
|
+
errors.push(`${packageName}.target must be a non-empty npm selector`);
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
packages[packageName] = {
|
|
84
|
+
version: normalizedRange,
|
|
85
|
+
target: target.trim()
|
|
86
|
+
};
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
packages[packageName] = { version: normalizedRange };
|
|
90
|
+
}
|
|
91
|
+
if (errors.length > 0) {
|
|
92
|
+
throw new NpmManifestValidationError(errors);
|
|
93
|
+
}
|
|
94
|
+
return { packages };
|
|
95
|
+
}
|
|
96
|
+
export function normalizeGlobalInventory(stdout) {
|
|
97
|
+
let parsed;
|
|
98
|
+
try {
|
|
99
|
+
parsed = JSON.parse(stdout);
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
103
|
+
throw new NpmSyncError(`Failed to parse npm inventory JSON: ${message}`);
|
|
104
|
+
}
|
|
105
|
+
if (!isRecord(parsed) || !isRecord(parsed.dependencies)) {
|
|
106
|
+
return {};
|
|
107
|
+
}
|
|
108
|
+
const installed = {};
|
|
109
|
+
for (const [packageName, dependency] of Object.entries(parsed.dependencies)) {
|
|
110
|
+
if (!isRecord(dependency) || typeof dependency.version !== "string") {
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
installed[packageName] = dependency.version;
|
|
114
|
+
}
|
|
115
|
+
return installed;
|
|
116
|
+
}
|
|
117
|
+
export function createNpmSyncPlan(manifest, installed) {
|
|
118
|
+
return Object.entries(manifest.packages)
|
|
119
|
+
.sort(([left], [right]) => left.localeCompare(right))
|
|
120
|
+
.map(([packageName, entry]) => {
|
|
121
|
+
const installedVersion = installed[packageName];
|
|
122
|
+
const targetSelector = entry.target ?? entry.version;
|
|
123
|
+
const selectedInstallSelector = `${packageName}@${targetSelector}`;
|
|
124
|
+
if (!installedVersion) {
|
|
125
|
+
return {
|
|
126
|
+
packageName,
|
|
127
|
+
requiredRange: entry.version,
|
|
128
|
+
targetSelector,
|
|
129
|
+
selectedInstallSelector,
|
|
130
|
+
action: "install"
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
if (semver.satisfies(installedVersion, entry.version, {
|
|
134
|
+
includePrerelease: true
|
|
135
|
+
})) {
|
|
136
|
+
return {
|
|
137
|
+
packageName,
|
|
138
|
+
requiredRange: entry.version,
|
|
139
|
+
targetSelector,
|
|
140
|
+
selectedInstallSelector,
|
|
141
|
+
installedVersion,
|
|
142
|
+
action: "noop"
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
return {
|
|
146
|
+
packageName,
|
|
147
|
+
requiredRange: entry.version,
|
|
148
|
+
targetSelector,
|
|
149
|
+
selectedInstallSelector,
|
|
150
|
+
installedVersion,
|
|
151
|
+
action: classifyOutOfRangeVersion(installedVersion, entry.version)
|
|
152
|
+
};
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
export async function syncNpmGlobals(options) {
|
|
156
|
+
const manifest = await loadNpmSyncManifest(options.manifestPath);
|
|
157
|
+
options.onLog?.({
|
|
158
|
+
type: "manifest-loaded",
|
|
159
|
+
manifestPath: options.manifestPath,
|
|
160
|
+
packageCount: Object.keys(manifest.packages).length
|
|
161
|
+
});
|
|
162
|
+
const verifyRuntime = options.verifyRuntime ?? verifyNodeRuntime;
|
|
163
|
+
const runtimeResult = await verifyRuntime(options.runtimePath);
|
|
164
|
+
if (!runtimeResult.valid ||
|
|
165
|
+
!runtimeResult.nodePath ||
|
|
166
|
+
!runtimeResult.npmPath) {
|
|
167
|
+
throw new NpmSyncError(`Invalid Node.js runtime ${options.runtimePath}: ${runtimeResult.failureReason ?? "node/npm validation failed"}`);
|
|
168
|
+
}
|
|
169
|
+
const runtime = {
|
|
170
|
+
targetDirectory: runtimeResult.targetDirectory,
|
|
171
|
+
nodePath: runtimeResult.nodePath,
|
|
172
|
+
npmPath: runtimeResult.npmPath,
|
|
173
|
+
nodeVersion: runtimeResult.nodeVersion ?? "unknown",
|
|
174
|
+
npmVersion: runtimeResult.npmVersion ?? "unknown"
|
|
175
|
+
};
|
|
176
|
+
options.onLog?.({ type: "runtime-valid", runtime });
|
|
177
|
+
const npmOptions = {
|
|
178
|
+
...options.npmOptions,
|
|
179
|
+
env: createRuntimeNpmEnv(runtime.targetDirectory, options.npmOptions?.env)
|
|
180
|
+
};
|
|
181
|
+
let inventoryResult;
|
|
182
|
+
try {
|
|
183
|
+
inventoryResult = await listGlobalPackages(runtime.npmPath, npmOptions);
|
|
184
|
+
}
|
|
185
|
+
catch (error) {
|
|
186
|
+
if (error instanceof NpmCommandError) {
|
|
187
|
+
throw new NpmSyncCommandError("Failed to list npm global packages", error);
|
|
188
|
+
}
|
|
189
|
+
throw error;
|
|
190
|
+
}
|
|
191
|
+
const installed = normalizeGlobalInventory(inventoryResult.stdout);
|
|
192
|
+
options.onLog?.({ type: "inventory", packages: installed });
|
|
193
|
+
const plan = createNpmSyncPlan(manifest, installed);
|
|
194
|
+
const actions = [];
|
|
195
|
+
for (const action of plan) {
|
|
196
|
+
options.onLog?.({ type: "planned-action", action });
|
|
197
|
+
if (action.action === "noop") {
|
|
198
|
+
const result = { ...action, changed: false };
|
|
199
|
+
actions.push(result);
|
|
200
|
+
options.onLog?.({ type: "skip", action });
|
|
201
|
+
continue;
|
|
202
|
+
}
|
|
203
|
+
options.onLog?.({ type: "install-start", action });
|
|
204
|
+
try {
|
|
205
|
+
const installResult = await installGlobalPackage(runtime.npmPath, action.selectedInstallSelector, npmOptions);
|
|
206
|
+
const result = {
|
|
207
|
+
...action,
|
|
208
|
+
changed: true,
|
|
209
|
+
command: installResult.command,
|
|
210
|
+
args: installResult.args,
|
|
211
|
+
stdout: installResult.stdout,
|
|
212
|
+
stderr: installResult.stderr
|
|
213
|
+
};
|
|
214
|
+
actions.push(result);
|
|
215
|
+
options.onLog?.({ type: "install-complete", action: result });
|
|
216
|
+
}
|
|
217
|
+
catch (error) {
|
|
218
|
+
if (error instanceof NpmCommandError) {
|
|
219
|
+
throw new NpmSyncCommandError(`Failed to sync package ${action.packageName}`, error, action.packageName);
|
|
220
|
+
}
|
|
221
|
+
throw error;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
const summary = {
|
|
225
|
+
runtime,
|
|
226
|
+
manifestPath: options.manifestPath,
|
|
227
|
+
packageCount: plan.length,
|
|
228
|
+
noopCount: actions.filter((action) => !action.changed).length,
|
|
229
|
+
changedCount: actions.filter((action) => action.changed).length,
|
|
230
|
+
actions
|
|
231
|
+
};
|
|
232
|
+
options.onLog?.({ type: "summary", summary });
|
|
233
|
+
return summary;
|
|
234
|
+
}
|
|
235
|
+
function createRuntimeNpmEnv(runtimePath, baseEnv = process.env) {
|
|
236
|
+
const env = { ...baseEnv };
|
|
237
|
+
delete env.PREFIX;
|
|
238
|
+
delete env.npm_config_prefix;
|
|
239
|
+
delete env.NPM_CONFIG_GLOBALCONFIG;
|
|
240
|
+
delete env.npm_config_globalconfig;
|
|
241
|
+
delete env.NPM_CONFIG_USERCONFIG;
|
|
242
|
+
delete env.npm_config_userconfig;
|
|
243
|
+
return {
|
|
244
|
+
...env,
|
|
245
|
+
NPM_CONFIG_PREFIX: runtimePath,
|
|
246
|
+
npm_config_fund: "false",
|
|
247
|
+
npm_config_audit: "false"
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
function classifyOutOfRangeVersion(installedVersion, range) {
|
|
251
|
+
const minimum = semver.minVersion(range);
|
|
252
|
+
if (minimum && semver.lt(installedVersion, minimum)) {
|
|
253
|
+
return "upgrade";
|
|
254
|
+
}
|
|
255
|
+
if (isAboveAllowedRange(installedVersion, range)) {
|
|
256
|
+
return "downgrade";
|
|
257
|
+
}
|
|
258
|
+
return "sync";
|
|
259
|
+
}
|
|
260
|
+
function isAboveAllowedRange(version, range) {
|
|
261
|
+
const parsed = new semver.Range(range, { includePrerelease: true });
|
|
262
|
+
return parsed.set.every((comparators) => comparators.some((comparator) => (comparator.operator === "<" || comparator.operator === "<=") &&
|
|
263
|
+
semver.gt(version, comparator.semver.version)));
|
|
264
|
+
}
|
|
265
|
+
function isValidPackageName(packageName) {
|
|
266
|
+
if (packageName.trim() !== packageName || packageName.length === 0) {
|
|
267
|
+
return false;
|
|
268
|
+
}
|
|
269
|
+
if (packageName.includes("\\") || packageName.includes("/../")) {
|
|
270
|
+
return false;
|
|
271
|
+
}
|
|
272
|
+
if (packageName.startsWith("@")) {
|
|
273
|
+
const parts = packageName.split("/");
|
|
274
|
+
return (parts.length === 2 &&
|
|
275
|
+
parts[0].startsWith("@") &&
|
|
276
|
+
isValidPackageNamePart(parts[0].slice(1)) &&
|
|
277
|
+
isValidPackageNamePart(parts[1]));
|
|
278
|
+
}
|
|
279
|
+
return !packageName.includes("/") && isValidPackageNamePart(packageName);
|
|
280
|
+
}
|
|
281
|
+
function isValidPackageNamePart(value) {
|
|
282
|
+
return (value.length > 0 &&
|
|
283
|
+
value === basename(value) &&
|
|
284
|
+
!value.startsWith(".") &&
|
|
285
|
+
!/[\s@]/u.test(value));
|
|
286
|
+
}
|
|
287
|
+
function isRecord(value) {
|
|
288
|
+
return typeof value === "object" && value !== null;
|
|
289
|
+
}
|
|
290
|
+
//# sourceMappingURL=npm-sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"npm-sync.js","sourceRoot":"","sources":["../../src/runtime/npm-sync.ts"],"names":[],"mappings":"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"}
|
package/dist/version.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAG,sBAAsB,CAAC;AAClD,MAAM,CAAC,MAAM,cAAc,GAAG,OAAO,CAAC;AAOtC,MAAM,UAAU,kBAAkB;IAChC,OAAO;QACL,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,cAAc;KACxB,CAAC;AACJ,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@hagicode/hagiscript",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Scoped npm package foundation for Hagiscript language tooling.",
|
|
5
|
+
"homepage": "https://github.com/HagiCode-org/hagiscript#readme",
|
|
6
|
+
"bugs": {
|
|
7
|
+
"url": "https://github.com/HagiCode-org/hagiscript/issues"
|
|
8
|
+
},
|
|
9
|
+
"repository": {
|
|
10
|
+
"type": "git",
|
|
11
|
+
"url": "git+https://github.com/HagiCode-org/hagiscript.git"
|
|
12
|
+
},
|
|
13
|
+
"type": "module",
|
|
14
|
+
"exports": {
|
|
15
|
+
".": {
|
|
16
|
+
"types": "./dist/index.d.ts",
|
|
17
|
+
"default": "./dist/index.js"
|
|
18
|
+
},
|
|
19
|
+
"./package.json": "./package.json"
|
|
20
|
+
},
|
|
21
|
+
"bin": {
|
|
22
|
+
"hagiscript": "dist/cli.js"
|
|
23
|
+
},
|
|
24
|
+
"files": [
|
|
25
|
+
"dist",
|
|
26
|
+
"README.md",
|
|
27
|
+
"README_cn.md"
|
|
28
|
+
],
|
|
29
|
+
"scripts": {
|
|
30
|
+
"build": "tsc -p tsconfig.json",
|
|
31
|
+
"clean": "rm -rf dist .vitest-temp .tmp coverage",
|
|
32
|
+
"dev": "tsx src/cli.ts",
|
|
33
|
+
"format": "prettier --write .",
|
|
34
|
+
"format:check": "prettier --check .",
|
|
35
|
+
"lint": "eslint .",
|
|
36
|
+
"integration:installed-runtime": "node scripts/integration-installed-runtime.mjs",
|
|
37
|
+
"pack:check": "node scripts/verify-package.mjs",
|
|
38
|
+
"publish:prepare-dev-version": "node scripts/prepare-dev-version.mjs",
|
|
39
|
+
"publish:verify-release": "node scripts/verify-release-version.mjs",
|
|
40
|
+
"test": "vitest run",
|
|
41
|
+
"test:watch": "vitest"
|
|
42
|
+
},
|
|
43
|
+
"keywords": [
|
|
44
|
+
"hagiscript",
|
|
45
|
+
"scripting",
|
|
46
|
+
"language",
|
|
47
|
+
"cli"
|
|
48
|
+
],
|
|
49
|
+
"engines": {
|
|
50
|
+
"node": ">=20"
|
|
51
|
+
},
|
|
52
|
+
"publishConfig": {
|
|
53
|
+
"access": "public",
|
|
54
|
+
"registry": "https://registry.npmjs.org/"
|
|
55
|
+
},
|
|
56
|
+
"dependencies": {
|
|
57
|
+
"commander": "^14.0.1",
|
|
58
|
+
"semver": "^7.7.4"
|
|
59
|
+
},
|
|
60
|
+
"devDependencies": {
|
|
61
|
+
"@eslint/js": "^9.38.0",
|
|
62
|
+
"@types/node": "^24.5.2",
|
|
63
|
+
"@types/semver": "^7.7.1",
|
|
64
|
+
"eslint": "^9.38.0",
|
|
65
|
+
"prettier": "^3.6.2",
|
|
66
|
+
"tsx": "^4.20.6",
|
|
67
|
+
"typescript": "^5.9.3",
|
|
68
|
+
"typescript-eslint": "^8.46.2",
|
|
69
|
+
"vitest": "^3.2.4"
|
|
70
|
+
}
|
|
71
|
+
}
|