@hagicode/hagiscript 0.1.6 → 0.1.7
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 +68 -0
- package/README_cn.md +55 -0
- package/bin/runtime +16 -0
- package/dist/cli.js +4 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/pm2-commands.d.ts +2 -0
- package/dist/commands/pm2-commands.js +54 -0
- package/dist/commands/pm2-commands.js.map +1 -0
- package/dist/commands/runtime-commands.d.ts +2 -0
- package/dist/commands/runtime-commands.js +136 -0
- package/dist/commands/runtime-commands.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/runtime/command-launch.js +1 -0
- package/dist/runtime/command-launch.js.map +1 -1
- package/dist/runtime/pm2-manager.d.ts +54 -0
- package/dist/runtime/pm2-manager.js +260 -0
- package/dist/runtime/pm2-manager.js.map +1 -0
- package/dist/runtime/runtime-executor.d.ts +45 -0
- package/dist/runtime/runtime-executor.js +135 -0
- package/dist/runtime/runtime-executor.js.map +1 -0
- package/dist/runtime/runtime-manager.d.ts +79 -0
- package/dist/runtime/runtime-manager.js +651 -0
- package/dist/runtime/runtime-manager.js.map +1 -0
- package/dist/runtime/runtime-manifest.d.ts +77 -0
- package/dist/runtime/runtime-manifest.js +277 -0
- package/dist/runtime/runtime-manifest.js.map +1 -0
- package/dist/runtime/runtime-paths.d.ts +31 -0
- package/dist/runtime/runtime-paths.js +77 -0
- package/dist/runtime/runtime-paths.js.map +1 -0
- package/dist/runtime/runtime-state.d.ts +45 -0
- package/dist/runtime/runtime-state.js +82 -0
- package/dist/runtime/runtime-state.js.map +1 -0
- package/package.json +8 -3
- package/runtime/lib/runtime-script-lib.mjs +142 -0
- package/runtime/manifest.yaml +136 -0
- package/runtime/scripts/configure-code-server.mjs +14 -0
- package/runtime/scripts/configure-omniroute.mjs +16 -0
- package/runtime/scripts/install-code-server.mjs +35 -0
- package/runtime/scripts/install-dotnet.mjs +24 -0
- package/runtime/scripts/install-node.mjs +4 -0
- package/runtime/scripts/install-npm-packages.mjs +4 -0
- package/runtime/scripts/install-omniroute.mjs +37 -0
- package/runtime/scripts/remove-npm-packages.mjs +4 -0
- package/runtime/scripts/update-npm-packages.mjs +4 -0
- package/runtime/scripts/verify-dotnet.mjs +10 -0
- package/runtime/scripts/verify-node.mjs +4 -0
- package/runtime/templates/code-server-config.yaml +5 -0
- package/runtime/templates/omniroute-config.yaml +4 -0
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
import { access } from "node:fs/promises";
|
|
2
|
+
import { basename, extname, join } from "node:path";
|
|
3
|
+
import process from "node:process";
|
|
4
|
+
import { runCommand } from "./command-launch.js";
|
|
5
|
+
import { buildManagedRuntimeEnvironment, } from "./runtime-executor.js";
|
|
6
|
+
import { getRuntimeExecutablePaths } from "./node-verify.js";
|
|
7
|
+
import { loadRuntimeManifest } from "./runtime-manifest.js";
|
|
8
|
+
import { getComponentConfigDirectory, getComponentManagedRoot, getComponentPm2Home, getComponentRuntimeDataHome, resolveManagedPath, resolveRuntimePaths } from "./runtime-paths.js";
|
|
9
|
+
export const supportedPm2Services = ["omniroute", "code-server"];
|
|
10
|
+
export class ManagedPm2Error extends Error {
|
|
11
|
+
constructor(message, options) {
|
|
12
|
+
super(message, options);
|
|
13
|
+
this.name = "ManagedPm2Error";
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export async function runManagedPm2Command(options) {
|
|
17
|
+
const manifest = await loadRuntimeManifest({ manifestPath: options.manifestPath });
|
|
18
|
+
const paths = resolveRuntimePaths(manifest, { runtimeRoot: options.runtimeRoot });
|
|
19
|
+
const definition = await resolveManagedPm2ServiceDefinition(manifest, paths, options.service);
|
|
20
|
+
const runner = options.runner ?? runCommand;
|
|
21
|
+
switch (options.action) {
|
|
22
|
+
case "start":
|
|
23
|
+
await runPm2(definition, buildPm2StartArgs(definition), runner);
|
|
24
|
+
return readManagedPm2Status(definition, "start", runner);
|
|
25
|
+
case "stop":
|
|
26
|
+
await runPm2(definition, ["stop", definition.appName], runner);
|
|
27
|
+
return readManagedPm2Status(definition, "stop", runner);
|
|
28
|
+
case "status":
|
|
29
|
+
return readManagedPm2Status(definition, "status", runner);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export async function resolveManagedPm2ServiceDefinition(manifest, paths, service) {
|
|
33
|
+
assertSupportedPm2Service(service);
|
|
34
|
+
const component = manifest.componentMap.get(service);
|
|
35
|
+
if (!component) {
|
|
36
|
+
throw new ManagedPm2Error(`Runtime manifest does not define the ${service} service.`);
|
|
37
|
+
}
|
|
38
|
+
const componentRoot = getComponentManagedRoot(paths, component.name);
|
|
39
|
+
const runtimeDataHome = getComponentRuntimeDataHome(paths, component.name, component.runtimeDataDir);
|
|
40
|
+
const componentConfigDir = getComponentConfigDirectory(paths, component.name, component.runtimeDataDir);
|
|
41
|
+
const pm2Home = getComponentPm2Home(paths, component.name, component.runtimeDataDir, component.pm2?.pm2Home);
|
|
42
|
+
const script = resolveManagedPath(component.pm2?.script ?? defaultPm2Script(component.name), componentRoot);
|
|
43
|
+
const cwd = resolveManagedPath(component.pm2?.cwd ?? ".", componentRoot);
|
|
44
|
+
const nodePath = getRuntimeExecutablePaths(paths.nodeRuntime).nodePath;
|
|
45
|
+
const pm2Entrypoint = getManagedPm2Entrypoint(paths.npmPrefix);
|
|
46
|
+
await Promise.all([
|
|
47
|
+
validateManagedPath(script, `Managed launcher for ${service} is missing`),
|
|
48
|
+
validateManagedPath(cwd, `Managed working directory for ${service} is missing`),
|
|
49
|
+
validateManagedPath(pm2Entrypoint, "Managed PM2 binary is missing. Install the runtime npm-packages component first."),
|
|
50
|
+
validateManagedPath(nodePath, "Managed Node runtime is missing. Install the runtime node component first.")
|
|
51
|
+
]);
|
|
52
|
+
return {
|
|
53
|
+
service,
|
|
54
|
+
component,
|
|
55
|
+
manifestDir: manifest.manifestDir,
|
|
56
|
+
paths,
|
|
57
|
+
appName: component.pm2?.appName ?? `hagicode-${component.name}`,
|
|
58
|
+
cwd,
|
|
59
|
+
script,
|
|
60
|
+
args: component.pm2?.args ?? [],
|
|
61
|
+
env: component.pm2?.env ?? {},
|
|
62
|
+
runtimeHome: paths.runtimeHome,
|
|
63
|
+
runtimeDataHome,
|
|
64
|
+
componentRoot,
|
|
65
|
+
componentConfigDir,
|
|
66
|
+
pm2Home,
|
|
67
|
+
pm2Binary: pm2Entrypoint,
|
|
68
|
+
nodePath
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
export function renderManagedPm2StatusText(result) {
|
|
72
|
+
return [
|
|
73
|
+
`Service: ${result.service}`,
|
|
74
|
+
`Action: ${result.action}`,
|
|
75
|
+
`App: ${result.appName}`,
|
|
76
|
+
`Status: ${result.status}`,
|
|
77
|
+
`Runtime home: ${result.runtimeHome}`,
|
|
78
|
+
`Runtime data home: ${result.runtimeDataHome}`,
|
|
79
|
+
`PM2 home: ${result.pm2Home}`,
|
|
80
|
+
`Script: ${result.script}`,
|
|
81
|
+
`Working directory: ${result.cwd}`,
|
|
82
|
+
`PM2 binary: ${result.pm2Binary}`,
|
|
83
|
+
`PID: ${result.pid ?? "n/a"}`
|
|
84
|
+
].join("\n");
|
|
85
|
+
}
|
|
86
|
+
function assertSupportedPm2Service(service) {
|
|
87
|
+
if (supportedPm2Services.includes(service)) {
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
throw new ManagedPm2Error(`Unsupported managed PM2 service "${service}". Supported services: ${supportedPm2Services.join(", ")}.`);
|
|
91
|
+
}
|
|
92
|
+
async function readManagedPm2Status(definition, action, runner) {
|
|
93
|
+
const result = await runPm2(definition, ["jlist"], runner);
|
|
94
|
+
const statusEntry = parsePm2Status(result, definition.appName);
|
|
95
|
+
return {
|
|
96
|
+
service: definition.service,
|
|
97
|
+
action,
|
|
98
|
+
appName: definition.appName,
|
|
99
|
+
cwd: definition.cwd,
|
|
100
|
+
script: definition.script,
|
|
101
|
+
runtimeHome: definition.runtimeHome,
|
|
102
|
+
runtimeDataHome: definition.runtimeDataHome,
|
|
103
|
+
pm2Home: definition.pm2Home,
|
|
104
|
+
pm2Binary: definition.pm2Binary,
|
|
105
|
+
exists: statusEntry !== null,
|
|
106
|
+
status: statusEntry?.status ?? "missing",
|
|
107
|
+
pid: statusEntry?.pid ?? null,
|
|
108
|
+
stdout: result.stdout,
|
|
109
|
+
stderr: result.stderr
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
async function runPm2(definition, args, runner) {
|
|
113
|
+
const env = buildManagedRuntimeEnvironment({
|
|
114
|
+
component: definition.component,
|
|
115
|
+
manifest: { manifestDir: definition.manifestDir },
|
|
116
|
+
paths: definition.paths,
|
|
117
|
+
componentRoot: definition.componentRoot,
|
|
118
|
+
componentConfigDir: definition.componentConfigDir,
|
|
119
|
+
componentDataHome: definition.runtimeDataHome,
|
|
120
|
+
pm2Home: definition.pm2Home,
|
|
121
|
+
scriptBasename: basename(definition.script)
|
|
122
|
+
}, { ...process.env, ...definition.env });
|
|
123
|
+
return runner(definition.nodePath, [definition.pm2Binary, ...args], {
|
|
124
|
+
cwd: definition.cwd,
|
|
125
|
+
env,
|
|
126
|
+
maxBuffer: 10 * 1024 * 1024
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
function parsePm2Status(result, appName) {
|
|
130
|
+
const parsed = parsePm2ProcessList(result);
|
|
131
|
+
if (!Array.isArray(parsed)) {
|
|
132
|
+
throw new ManagedPm2Error(`Managed PM2 status returned an unexpected payload for ${appName}.`);
|
|
133
|
+
}
|
|
134
|
+
const entry = parsed.find((value) => isPm2ProcessRecord(value) && value.name === appName);
|
|
135
|
+
if (!entry || !isPm2ProcessRecord(entry)) {
|
|
136
|
+
return null;
|
|
137
|
+
}
|
|
138
|
+
return {
|
|
139
|
+
status: normalizePm2Status(entry.pm2_env?.status),
|
|
140
|
+
pid: typeof entry.pid === "number" ? entry.pid : null
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
function parsePm2ProcessList(result) {
|
|
144
|
+
const directCandidates = [result.stdout.trim(), `${result.stdout}\n${result.stderr}`.trim()].filter(Boolean);
|
|
145
|
+
for (const candidate of directCandidates) {
|
|
146
|
+
const direct = tryParseJson(candidate);
|
|
147
|
+
if (Array.isArray(direct)) {
|
|
148
|
+
return direct;
|
|
149
|
+
}
|
|
150
|
+
const extracted = extractPm2JsonArray(candidate);
|
|
151
|
+
if (Array.isArray(extracted)) {
|
|
152
|
+
return extracted;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
throw new ManagedPm2Error(`Managed PM2 status returned invalid JSON: ${summarizePm2Output(result)}`);
|
|
156
|
+
}
|
|
157
|
+
function extractPm2JsonArray(output) {
|
|
158
|
+
for (let index = 0; index < output.length; index += 1) {
|
|
159
|
+
if (output[index] !== "[") {
|
|
160
|
+
continue;
|
|
161
|
+
}
|
|
162
|
+
const nextNonWhitespace = output.slice(index + 1).match(/\S/u)?.[0];
|
|
163
|
+
if (nextNonWhitespace !== "{" && nextNonWhitespace !== "]") {
|
|
164
|
+
continue;
|
|
165
|
+
}
|
|
166
|
+
const parsed = tryParseJson(output.slice(index));
|
|
167
|
+
if (Array.isArray(parsed)) {
|
|
168
|
+
return parsed;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
return null;
|
|
172
|
+
}
|
|
173
|
+
function tryParseJson(value) {
|
|
174
|
+
try {
|
|
175
|
+
return JSON.parse(value);
|
|
176
|
+
}
|
|
177
|
+
catch {
|
|
178
|
+
return null;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
function summarizePm2Output(result) {
|
|
182
|
+
return [result.stdout.trim(), result.stderr.trim()]
|
|
183
|
+
.filter(Boolean)
|
|
184
|
+
.join(" | ")
|
|
185
|
+
.slice(0, 400);
|
|
186
|
+
}
|
|
187
|
+
function normalizePm2Status(value) {
|
|
188
|
+
switch (value) {
|
|
189
|
+
case "online":
|
|
190
|
+
return "online";
|
|
191
|
+
case "stopped":
|
|
192
|
+
return "stopped";
|
|
193
|
+
case "errored":
|
|
194
|
+
return "errored";
|
|
195
|
+
default:
|
|
196
|
+
return "unknown";
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
function isPm2ProcessRecord(value) {
|
|
200
|
+
return typeof value === "object" && value !== null;
|
|
201
|
+
}
|
|
202
|
+
function defaultPm2Script(componentName) {
|
|
203
|
+
switch (componentName) {
|
|
204
|
+
case "omniroute":
|
|
205
|
+
return "current/omniroute-launcher.mjs";
|
|
206
|
+
case "code-server":
|
|
207
|
+
return "current/code-server-launcher.mjs";
|
|
208
|
+
default:
|
|
209
|
+
throw new ManagedPm2Error(`Unsupported PM2 component ${componentName}.`);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
function toPm2Args(args) {
|
|
213
|
+
return args.length > 0 ? ["--", ...args] : [];
|
|
214
|
+
}
|
|
215
|
+
function buildPm2StartArgs(definition) {
|
|
216
|
+
if (isNodeLauncherScript(definition.script)) {
|
|
217
|
+
return [
|
|
218
|
+
"start",
|
|
219
|
+
"node",
|
|
220
|
+
"--name",
|
|
221
|
+
definition.appName,
|
|
222
|
+
"--cwd",
|
|
223
|
+
definition.cwd,
|
|
224
|
+
"--interpreter",
|
|
225
|
+
"none",
|
|
226
|
+
"--update-env",
|
|
227
|
+
"--",
|
|
228
|
+
definition.script,
|
|
229
|
+
...definition.args
|
|
230
|
+
];
|
|
231
|
+
}
|
|
232
|
+
return [
|
|
233
|
+
"start",
|
|
234
|
+
definition.script,
|
|
235
|
+
"--name",
|
|
236
|
+
definition.appName,
|
|
237
|
+
"--cwd",
|
|
238
|
+
definition.cwd,
|
|
239
|
+
"--update-env",
|
|
240
|
+
...toPm2Args(definition.args)
|
|
241
|
+
];
|
|
242
|
+
}
|
|
243
|
+
function isNodeLauncherScript(scriptPath) {
|
|
244
|
+
const extension = extname(scriptPath).toLowerCase();
|
|
245
|
+
return extension === ".js" || extension === ".mjs" || extension === ".cjs";
|
|
246
|
+
}
|
|
247
|
+
function getManagedPm2Entrypoint(npmPrefix) {
|
|
248
|
+
return process.platform === "win32"
|
|
249
|
+
? join(npmPrefix, "node_modules", "pm2", "bin", "pm2")
|
|
250
|
+
: join(npmPrefix, "lib", "node_modules", "pm2", "bin", "pm2");
|
|
251
|
+
}
|
|
252
|
+
async function validateManagedPath(pathValue, message) {
|
|
253
|
+
try {
|
|
254
|
+
await access(pathValue);
|
|
255
|
+
}
|
|
256
|
+
catch (error) {
|
|
257
|
+
throw new ManagedPm2Error(message, error instanceof Error ? { cause: error } : undefined);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
//# sourceMappingURL=pm2-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pm2-manager.js","sourceRoot":"","sources":["../../src/runtime/pm2-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AACzC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AACnD,OAAO,OAAO,MAAM,cAAc,CAAA;AAElC,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAChD,OAAO,EACL,8BAA8B,GAC/B,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAA;AAC5D,OAAO,EACL,mBAAmB,EAGpB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EACL,2BAA2B,EAC3B,uBAAuB,EACvB,mBAAmB,EACnB,2BAA2B,EAC3B,kBAAkB,EAClB,mBAAmB,EAEpB,MAAM,oBAAoB,CAAA;AAE3B,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,WAAW,EAAE,aAAa,CAAU,CAAA;AAkDzE,MAAM,OAAO,eAAgB,SAAQ,KAAK;IACxC,YAAY,OAAe,EAAE,OAAsB;QACjD,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;QACvB,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAA;IAC/B,CAAC;CACF;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,OAAiC;IAEjC,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAC,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC,CAAA;IAClF,MAAM,KAAK,GAAG,mBAAmB,CAAC,QAAQ,EAAE,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,CAAA;IACjF,MAAM,UAAU,GAAG,MAAM,kCAAkC,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;IAC7F,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,UAAU,CAAA;IAE3C,QAAQ,OAAO,CAAC,MAAM,EAAE,CAAC;QACvB,KAAK,OAAO;YACV,MAAM,MAAM,CAAC,UAAU,EAAE,iBAAiB,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,CAAA;YAC/D,OAAO,oBAAoB,CAAC,UAAU,EAAE,OAAO,EAAE,MAAM,CAAC,CAAA;QAC1D,KAAK,MAAM;YACT,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,CAAA;YAC9D,OAAO,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;QACzD,KAAK,QAAQ;YACX,OAAO,oBAAoB,CAAC,UAAU,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAA;IAC7D,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kCAAkC,CACtD,QAA+B,EAC/B,KAA2B,EAC3B,OAA8B;IAE9B,yBAAyB,CAAC,OAAO,CAAC,CAAA;IAElC,MAAM,SAAS,GAAG,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;IACpD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,eAAe,CAAC,wCAAwC,OAAO,WAAW,CAAC,CAAA;IACvF,CAAC;IAED,MAAM,aAAa,GAAG,uBAAuB,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,CAAC,CAAA;IACpE,MAAM,eAAe,GAAG,2BAA2B,CACjD,KAAK,EACL,SAAS,CAAC,IAAI,EACd,SAAS,CAAC,cAAc,CACzB,CAAA;IACD,MAAM,kBAAkB,GAAG,2BAA2B,CACpD,KAAK,EACL,SAAS,CAAC,IAAI,EACd,SAAS,CAAC,cAAc,CACzB,CAAA;IACD,MAAM,OAAO,GAAG,mBAAmB,CACjC,KAAK,EACL,SAAS,CAAC,IAAI,EACd,SAAS,CAAC,cAAc,EACxB,SAAS,CAAC,GAAG,EAAE,OAAO,CACvB,CAAA;IACD,MAAM,MAAM,GAAG,kBAAkB,CAC/B,SAAS,CAAC,GAAG,EAAE,MAAM,IAAI,gBAAgB,CAAC,SAAS,CAAC,IAAI,CAAC,EACzD,aAAa,CACd,CAAA;IACD,MAAM,GAAG,GAAG,kBAAkB,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,IAAI,GAAG,EAAE,aAAa,CAAC,CAAA;IACxE,MAAM,QAAQ,GAAG,yBAAyB,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAA;IACtE,MAAM,aAAa,GAAG,uBAAuB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;IAE9D,MAAM,OAAO,CAAC,GAAG,CAAC;QAChB,mBAAmB,CAAC,MAAM,EAAE,wBAAwB,OAAO,aAAa,CAAC;QACzE,mBAAmB,CAAC,GAAG,EAAE,iCAAiC,OAAO,aAAa,CAAC;QAC/E,mBAAmB,CAAC,aAAa,EAAE,kFAAkF,CAAC;QACtH,mBAAmB,CAAC,QAAQ,EAAE,4EAA4E,CAAC;KAC5G,CAAC,CAAA;IAEF,OAAO;QACL,OAAO;QACP,SAAS;QACT,WAAW,EAAE,QAAQ,CAAC,WAAW;QACjC,KAAK;QACL,OAAO,EAAE,SAAS,CAAC,GAAG,EAAE,OAAO,IAAI,YAAY,SAAS,CAAC,IAAI,EAAE;QAC/D,GAAG;QACH,MAAM;QACN,IAAI,EAAE,SAAS,CAAC,GAAG,EAAE,IAAI,IAAI,EAAE;QAC/B,GAAG,EAAE,SAAS,CAAC,GAAG,EAAE,GAAG,IAAI,EAAE;QAC7B,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,eAAe;QACf,aAAa;QACb,kBAAkB;QAClB,OAAO;QACP,SAAS,EAAE,aAAa;QACxB,QAAQ;KACT,CAAA;AACH,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,MAA+B;IACxE,OAAO;QACL,YAAY,MAAM,CAAC,OAAO,EAAE;QAC5B,WAAW,MAAM,CAAC,MAAM,EAAE;QAC1B,QAAQ,MAAM,CAAC,OAAO,EAAE;QACxB,WAAW,MAAM,CAAC,MAAM,EAAE;QAC1B,iBAAiB,MAAM,CAAC,WAAW,EAAE;QACrC,sBAAsB,MAAM,CAAC,eAAe,EAAE;QAC9C,aAAa,MAAM,CAAC,OAAO,EAAE;QAC7B,WAAW,MAAM,CAAC,MAAM,EAAE;QAC1B,sBAAsB,MAAM,CAAC,GAAG,EAAE;QAClC,eAAe,MAAM,CAAC,SAAS,EAAE;QACjC,QAAQ,MAAM,CAAC,GAAG,IAAI,KAAK,EAAE;KAC9B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACd,CAAC;AAED,SAAS,yBAAyB,CAAC,OAAe;IAChD,IAAK,oBAA0C,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAClE,OAAM;IACR,CAAC;IAED,MAAM,IAAI,eAAe,CACvB,oCAAoC,OAAO,0BAA0B,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CACxG,CAAA;AACH,CAAC;AAED,KAAK,UAAU,oBAAoB,CACjC,UAA+C,EAC/C,MAAwB,EACxB,MAAqB;IAErB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,CAAA;IAC1D,MAAM,WAAW,GAAG,cAAc,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,CAAC,CAAA;IAE9D,OAAO;QACL,OAAO,EAAE,UAAU,CAAC,OAAO;QAC3B,MAAM;QACN,OAAO,EAAE,UAAU,CAAC,OAAO;QAC3B,GAAG,EAAE,UAAU,CAAC,GAAG;QACnB,MAAM,EAAE,UAAU,CAAC,MAAM;QACzB,WAAW,EAAE,UAAU,CAAC,WAAW;QACnC,eAAe,EAAE,UAAU,CAAC,eAAe;QAC3C,OAAO,EAAE,UAAU,CAAC,OAAO;QAC3B,SAAS,EAAE,UAAU,CAAC,SAAS;QAC/B,MAAM,EAAE,WAAW,KAAK,IAAI;QAC5B,MAAM,EAAE,WAAW,EAAE,MAAM,IAAI,SAAS;QACxC,GAAG,EAAE,WAAW,EAAE,GAAG,IAAI,IAAI;QAC7B,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,MAAM,EAAE,MAAM,CAAC,MAAM;KACtB,CAAA;AACH,CAAC;AAED,KAAK,UAAU,MAAM,CACnB,UAA+C,EAC/C,IAAc,EACd,MAAqB;IAErB,MAAM,GAAG,GAAG,8BAA8B,CACxC;QACE,SAAS,EAAE,UAAU,CAAC,SAAS;QAC/B,QAAQ,EAAE,EAAE,WAAW,EAAE,UAAU,CAAC,WAAW,EAAE;QACjD,KAAK,EAAE,UAAU,CAAC,KAAK;QACvB,aAAa,EAAE,UAAU,CAAC,aAAa;QACvC,kBAAkB,EAAE,UAAU,CAAC,kBAAkB;QACjD,iBAAiB,EAAE,UAAU,CAAC,eAAe;QAC7C,OAAO,EAAE,UAAU,CAAC,OAAO;QAC3B,cAAc,EAAE,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC;KAC5C,EACD,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CACtC,CAAA;IAED,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,UAAU,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,EAAE;QAClE,GAAG,EAAE,UAAU,CAAC,GAAG;QACnB,GAAG;QACH,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI;KAC5B,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,cAAc,CACrB,MAAqB,EACrB,OAAe;IAKf,MAAM,MAAM,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAA;IAE1C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,eAAe,CAAC,yDAAyD,OAAO,GAAG,CAAC,CAAA;IAChG,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAClC,kBAAkB,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,CACpD,CAAA;IAED,IAAI,CAAC,KAAK,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC;QACzC,OAAO,IAAI,CAAA;IACb,CAAC;IAED,OAAO;QACL,MAAM,EAAE,kBAAkB,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC;QACjD,GAAG,EAAE,OAAO,KAAK,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI;KACtD,CAAA;AACH,CAAC;AAED,SAAS,mBAAmB,CAAC,MAAqB;IAChD,MAAM,gBAAgB,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,GAAG,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CACjG,OAAO,CACR,CAAA;IAED,KAAK,MAAM,SAAS,IAAI,gBAAgB,EAAE,CAAC;QACzC,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,CAAC,CAAA;QACtC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1B,OAAO,MAAM,CAAA;QACf,CAAC;QAED,MAAM,SAAS,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAA;QAChD,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7B,OAAO,SAAS,CAAA;QAClB,CAAC;IACH,CAAC;IAED,MAAM,IAAI,eAAe,CACvB,6CAA6C,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAC1E,CAAA;AACH,CAAC;AAED,SAAS,mBAAmB,CAAC,MAAc;IACzC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACtD,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC;YAC1B,SAAQ;QACV,CAAC;QAED,MAAM,iBAAiB,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QACnE,IAAI,iBAAiB,KAAK,GAAG,IAAI,iBAAiB,KAAK,GAAG,EAAE,CAAC;YAC3D,SAAQ;QACV,CAAC;QAED,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAA;QAChD,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1B,OAAO,MAAM,CAAA;QACf,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC;AAED,SAAS,YAAY,CAAC,KAAa;IACjC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,MAAqB;IAC/C,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;SAChD,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,KAAK,CAAC;SACX,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;AAClB,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAc;IACxC,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,QAAQ;YACX,OAAO,QAAQ,CAAA;QACjB,KAAK,SAAS;YACZ,OAAO,SAAS,CAAA;QAClB,KAAK,SAAS;YACZ,OAAO,SAAS,CAAA;QAClB;YACE,OAAO,SAAS,CAAA;IACpB,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB,CACzB,KAAc;IAQd,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAA;AACpD,CAAC;AAED,SAAS,gBAAgB,CAAC,aAAqB;IAC7C,QAAQ,aAAa,EAAE,CAAC;QACtB,KAAK,WAAW;YACd,OAAO,gCAAgC,CAAA;QACzC,KAAK,aAAa;YAChB,OAAO,kCAAkC,CAAA;QAC3C;YACE,MAAM,IAAI,eAAe,CAAC,6BAA6B,aAAa,GAAG,CAAC,CAAA;IAC5E,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,IAAuB;IACxC,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;AAC/C,CAAC;AAED,SAAS,iBAAiB,CAAC,UAA+C;IACxE,IAAI,oBAAoB,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5C,OAAO;YACL,OAAO;YACP,MAAM;YACN,QAAQ;YACR,UAAU,CAAC,OAAO;YAClB,OAAO;YACP,UAAU,CAAC,GAAG;YACd,eAAe;YACf,MAAM;YACN,cAAc;YACd,IAAI;YACJ,UAAU,CAAC,MAAM;YACjB,GAAG,UAAU,CAAC,IAAI;SACnB,CAAA;IACH,CAAC;IAED,OAAO;QACL,OAAO;QACP,UAAU,CAAC,MAAM;QACjB,QAAQ;QACR,UAAU,CAAC,OAAO;QAClB,OAAO;QACP,UAAU,CAAC,GAAG;QACd,cAAc;QACd,GAAG,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC;KAC9B,CAAA;AACH,CAAC;AAED,SAAS,oBAAoB,CAAC,UAAkB;IAC9C,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,CAAA;IACnD,OAAO,SAAS,KAAK,KAAK,IAAI,SAAS,KAAK,MAAM,IAAI,SAAS,KAAK,MAAM,CAAA;AAC5E,CAAC;AAED,SAAS,uBAAuB,CAAC,SAAiB;IAChD,OAAO,OAAO,CAAC,QAAQ,KAAK,OAAO;QACjC,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;QACtD,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;AACjE,CAAC;AAED,KAAK,UAAU,mBAAmB,CAAC,SAAiB,EAAE,OAAe;IACnE,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,SAAS,CAAC,CAAA;IACzB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,eAAe,CAAC,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;IAC3F,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { CommandRunner } from "./command-launch.js";
|
|
2
|
+
import type { LoadedRuntimeManifest, RuntimeComponentDefinition, RuntimeLifecyclePhase } from "./runtime-manifest.js";
|
|
3
|
+
import type { ResolvedRuntimePaths } from "./runtime-paths.js";
|
|
4
|
+
export interface RuntimeScriptExecutionContext {
|
|
5
|
+
component: RuntimeComponentDefinition;
|
|
6
|
+
phase: RuntimeLifecyclePhase;
|
|
7
|
+
manifest: LoadedRuntimeManifest;
|
|
8
|
+
paths: ResolvedRuntimePaths;
|
|
9
|
+
componentRoot: string;
|
|
10
|
+
componentConfigDir: string;
|
|
11
|
+
logFilePath?: string;
|
|
12
|
+
purge?: boolean;
|
|
13
|
+
verbose?: boolean;
|
|
14
|
+
runner?: CommandRunner;
|
|
15
|
+
}
|
|
16
|
+
export interface ManagedRuntimeEnvironmentContext {
|
|
17
|
+
component: Pick<RuntimeComponentDefinition, "name" | "type" | "version" | "runtimeDataDir">;
|
|
18
|
+
manifest: Pick<LoadedRuntimeManifest, "manifestDir">;
|
|
19
|
+
paths: ResolvedRuntimePaths;
|
|
20
|
+
componentRoot: string;
|
|
21
|
+
componentConfigDir: string;
|
|
22
|
+
componentDataHome?: string;
|
|
23
|
+
componentLogsDir?: string;
|
|
24
|
+
pm2Home?: string;
|
|
25
|
+
phase?: string;
|
|
26
|
+
purge?: boolean;
|
|
27
|
+
verbose?: boolean;
|
|
28
|
+
scriptBasename?: string;
|
|
29
|
+
}
|
|
30
|
+
export interface RuntimeScriptExecutionResult {
|
|
31
|
+
command: string;
|
|
32
|
+
args: string[];
|
|
33
|
+
stdout: string;
|
|
34
|
+
stderr: string;
|
|
35
|
+
}
|
|
36
|
+
export declare function executeRuntimeScript(scriptPath: string, context: RuntimeScriptExecutionContext): Promise<RuntimeScriptExecutionResult>;
|
|
37
|
+
export declare function writeRuntimeLog(logFilePath: string, content: string): Promise<void>;
|
|
38
|
+
export declare function getRuntimeScriptLaunch(scriptPath: string): {
|
|
39
|
+
command: string;
|
|
40
|
+
args: string[];
|
|
41
|
+
};
|
|
42
|
+
export declare function buildManagedRuntimeEnvironment(context: ManagedRuntimeEnvironmentContext, baseEnv?: NodeJS.ProcessEnv): NodeJS.ProcessEnv;
|
|
43
|
+
export declare function prependPathEntries(env: NodeJS.ProcessEnv, pathEntries: readonly string[]): NodeJS.ProcessEnv;
|
|
44
|
+
export declare function getManagedRuntimePathEntries(paths: ResolvedRuntimePaths): string[];
|
|
45
|
+
export declare function getManagedNpmBinDirectory(npmPrefix: string): string;
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { appendFile, mkdir } from "node:fs/promises";
|
|
2
|
+
import { basename, dirname, extname } from "node:path";
|
|
3
|
+
import process from "node:process";
|
|
4
|
+
import { runCommand } from "./command-launch.js";
|
|
5
|
+
import { getRuntimeExecutablePaths } from "./node-verify.js";
|
|
6
|
+
import { getComponentLogsDirectory, getComponentPm2Home, getComponentRuntimeDataHome } from "./runtime-paths.js";
|
|
7
|
+
export async function executeRuntimeScript(scriptPath, context) {
|
|
8
|
+
const runner = context.runner ?? runCommand;
|
|
9
|
+
const { command, args } = getRuntimeScriptLaunch(scriptPath);
|
|
10
|
+
const result = await runner(command, args, {
|
|
11
|
+
cwd: context.manifest.manifestDir,
|
|
12
|
+
env: buildRuntimeScriptEnvironment(context),
|
|
13
|
+
maxBuffer: 10 * 1024 * 1024
|
|
14
|
+
});
|
|
15
|
+
if (context.logFilePath) {
|
|
16
|
+
await writeRuntimeLog(context.logFilePath, [
|
|
17
|
+
`# ${context.phase}:${context.component.name}`,
|
|
18
|
+
`$ ${command} ${args.join(" ")}`,
|
|
19
|
+
result.stdout ? `stdout:\n${result.stdout}` : "",
|
|
20
|
+
result.stderr ? `stderr:\n${result.stderr}` : ""
|
|
21
|
+
]
|
|
22
|
+
.filter(Boolean)
|
|
23
|
+
.join("\n"));
|
|
24
|
+
}
|
|
25
|
+
return {
|
|
26
|
+
command,
|
|
27
|
+
args,
|
|
28
|
+
stdout: result.stdout,
|
|
29
|
+
stderr: result.stderr
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
export async function writeRuntimeLog(logFilePath, content) {
|
|
33
|
+
await mkdir(dirname(logFilePath), { recursive: true });
|
|
34
|
+
await appendFile(logFilePath, `${content}\n`, "utf8");
|
|
35
|
+
}
|
|
36
|
+
export function getRuntimeScriptLaunch(scriptPath) {
|
|
37
|
+
const extension = extname(scriptPath).toLowerCase();
|
|
38
|
+
if (extension === ".mjs" || extension === ".js" || extension === ".cjs") {
|
|
39
|
+
return {
|
|
40
|
+
command: process.execPath,
|
|
41
|
+
args: [scriptPath]
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
return {
|
|
45
|
+
command: scriptPath,
|
|
46
|
+
args: []
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
function buildRuntimeScriptEnvironment(context) {
|
|
50
|
+
return buildManagedRuntimeEnvironment({
|
|
51
|
+
component: context.component,
|
|
52
|
+
manifest: context.manifest,
|
|
53
|
+
paths: context.paths,
|
|
54
|
+
componentRoot: context.componentRoot,
|
|
55
|
+
componentConfigDir: context.componentConfigDir,
|
|
56
|
+
componentDataHome: getComponentRuntimeDataHome(context.paths, context.component.name, context.component.runtimeDataDir),
|
|
57
|
+
componentLogsDir: getComponentLogsDirectory(context.paths, context.component.name, context.component.runtimeDataDir),
|
|
58
|
+
pm2Home: getComponentPm2Home(context.paths, context.component.name, context.component.runtimeDataDir, context.component.pm2?.pm2Home),
|
|
59
|
+
phase: context.phase,
|
|
60
|
+
purge: context.purge,
|
|
61
|
+
verbose: context.verbose,
|
|
62
|
+
scriptBasename: basename(scriptPathForEnv(context.component, context.phase))
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
export function buildManagedRuntimeEnvironment(context, baseEnv = process.env) {
|
|
66
|
+
const componentDataHome = context.componentDataHome ??
|
|
67
|
+
getComponentRuntimeDataHome(context.paths, context.component.name, context.component.runtimeDataDir);
|
|
68
|
+
const componentLogsDir = context.componentLogsDir ??
|
|
69
|
+
getComponentLogsDirectory(context.paths, context.component.name, context.component.runtimeDataDir);
|
|
70
|
+
const pm2Home = context.pm2Home ??
|
|
71
|
+
getComponentPm2Home(context.paths, context.component.name, context.component.runtimeDataDir, undefined);
|
|
72
|
+
return prependPathEntries({
|
|
73
|
+
...baseEnv,
|
|
74
|
+
HAGICODE_RUNTIME_HOME: context.paths.runtimeHome,
|
|
75
|
+
HAGICODE_RUNTIME_DATA_HOME: componentDataHome,
|
|
76
|
+
PM2_HOME: pm2Home,
|
|
77
|
+
HAGISCRIPT_RUNTIME_ROOT: context.paths.root,
|
|
78
|
+
HAGISCRIPT_RUNTIME_BIN_DIR: context.paths.bin,
|
|
79
|
+
HAGISCRIPT_RUNTIME_CONFIG_DIR: context.paths.config,
|
|
80
|
+
HAGISCRIPT_RUNTIME_LOGS_DIR: context.paths.logs,
|
|
81
|
+
HAGISCRIPT_RUNTIME_DATA_DIR: context.paths.data,
|
|
82
|
+
HAGISCRIPT_RUNTIME_STATE_PATH: context.paths.stateFile,
|
|
83
|
+
HAGISCRIPT_RUNTIME_TEMPLATE_DIR: `${context.manifest.manifestDir}/templates`,
|
|
84
|
+
HAGISCRIPT_RUNTIME_COMPONENT_NAME: context.component.name,
|
|
85
|
+
HAGISCRIPT_RUNTIME_COMPONENT_TYPE: context.component.type,
|
|
86
|
+
HAGISCRIPT_RUNTIME_COMPONENT_VERSION: context.component.version ?? "",
|
|
87
|
+
HAGISCRIPT_RUNTIME_COMPONENT_ROOT: context.componentRoot,
|
|
88
|
+
HAGISCRIPT_RUNTIME_COMPONENT_CONFIG_DIR: context.componentConfigDir,
|
|
89
|
+
HAGISCRIPT_RUNTIME_COMPONENT_DATA_DIR: componentDataHome,
|
|
90
|
+
HAGISCRIPT_RUNTIME_COMPONENT_LOGS_DIR: componentLogsDir,
|
|
91
|
+
HAGISCRIPT_RUNTIME_COMPONENT_PM2_HOME: pm2Home,
|
|
92
|
+
...(context.phase ? { HAGISCRIPT_RUNTIME_PHASE: context.phase } : {}),
|
|
93
|
+
...(context.purge !== undefined
|
|
94
|
+
? { HAGISCRIPT_RUNTIME_PURGE: context.purge ? "1" : "0" }
|
|
95
|
+
: {}),
|
|
96
|
+
...(context.verbose !== undefined
|
|
97
|
+
? { HAGISCRIPT_RUNTIME_VERBOSE: context.verbose ? "1" : "0" }
|
|
98
|
+
: {}),
|
|
99
|
+
...(context.scriptBasename
|
|
100
|
+
? { HAGISCRIPT_RUNTIME_SCRIPT_BASENAME: context.scriptBasename }
|
|
101
|
+
: {})
|
|
102
|
+
}, getManagedRuntimePathEntries(context.paths));
|
|
103
|
+
}
|
|
104
|
+
export function prependPathEntries(env, pathEntries) {
|
|
105
|
+
const pathKey = process.platform === "win32" ? "Path" : "PATH";
|
|
106
|
+
const currentPath = env[pathKey] ?? env.PATH ?? "";
|
|
107
|
+
return {
|
|
108
|
+
...env,
|
|
109
|
+
[pathKey]: [...pathEntries, currentPath]
|
|
110
|
+
.filter(Boolean)
|
|
111
|
+
.join(process.platform === "win32" ? ";" : ":")
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
export function getManagedRuntimePathEntries(paths) {
|
|
115
|
+
const nodeExecutables = getRuntimeExecutablePaths(paths.nodeRuntime);
|
|
116
|
+
return [
|
|
117
|
+
dirname(nodeExecutables.nodePath),
|
|
118
|
+
getManagedNpmBinDirectory(paths.npmPrefix),
|
|
119
|
+
paths.bin
|
|
120
|
+
];
|
|
121
|
+
}
|
|
122
|
+
export function getManagedNpmBinDirectory(npmPrefix) {
|
|
123
|
+
return process.platform === "win32" ? npmPrefix : `${npmPrefix}/bin`;
|
|
124
|
+
}
|
|
125
|
+
function scriptPathForEnv(component, phase) {
|
|
126
|
+
switch (phase) {
|
|
127
|
+
case "install":
|
|
128
|
+
return component.scripts.install;
|
|
129
|
+
case "remove":
|
|
130
|
+
return component.scripts.remove ?? component.scripts.install;
|
|
131
|
+
case "update":
|
|
132
|
+
return component.scripts.update ?? component.scripts.install;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=runtime-executor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-executor.js","sourceRoot":"","sources":["../../src/runtime/runtime-executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { type LoadedRuntimeManifest, type RuntimeLifecyclePhase } from "./runtime-manifest.js";
|
|
2
|
+
import { type ResolvedRuntimePaths } from "./runtime-paths.js";
|
|
3
|
+
import { type RuntimeComponentStatus, type RuntimeState } from "./runtime-state.js";
|
|
4
|
+
export interface RuntimeLifecycleOptions {
|
|
5
|
+
manifestPath?: string;
|
|
6
|
+
runtimeRoot?: string;
|
|
7
|
+
components?: readonly string[];
|
|
8
|
+
dryRun?: boolean;
|
|
9
|
+
force?: boolean;
|
|
10
|
+
purge?: boolean;
|
|
11
|
+
checkOnly?: boolean;
|
|
12
|
+
verbose?: boolean;
|
|
13
|
+
logger?: (message: string) => void;
|
|
14
|
+
now?: () => Date;
|
|
15
|
+
}
|
|
16
|
+
export interface RuntimePlannedAction {
|
|
17
|
+
componentName: string;
|
|
18
|
+
phase: RuntimeLifecyclePhase;
|
|
19
|
+
strategy: "builtin" | "script" | "fallback-install" | "fallback-cleanup";
|
|
20
|
+
scriptPath?: string;
|
|
21
|
+
reason?: string;
|
|
22
|
+
}
|
|
23
|
+
export interface RuntimeLifecycleResult {
|
|
24
|
+
manifest: LoadedRuntimeManifest;
|
|
25
|
+
paths: ResolvedRuntimePaths;
|
|
26
|
+
state: RuntimeState;
|
|
27
|
+
plan: RuntimePlannedAction[];
|
|
28
|
+
skipped: {
|
|
29
|
+
componentName: string;
|
|
30
|
+
reason: string;
|
|
31
|
+
}[];
|
|
32
|
+
changedComponents: string[];
|
|
33
|
+
logFilePath?: string;
|
|
34
|
+
}
|
|
35
|
+
export interface RuntimeStateReport {
|
|
36
|
+
runtime: {
|
|
37
|
+
name: string;
|
|
38
|
+
version: string;
|
|
39
|
+
manifestPath: string;
|
|
40
|
+
};
|
|
41
|
+
managedRoot: string;
|
|
42
|
+
managedPaths: ResolvedRuntimePaths;
|
|
43
|
+
layout: {
|
|
44
|
+
separated: boolean;
|
|
45
|
+
runtimeHome: string;
|
|
46
|
+
runtimeDataRoot: string;
|
|
47
|
+
programRoots: string[];
|
|
48
|
+
externalDataRoots: string[];
|
|
49
|
+
};
|
|
50
|
+
ready: boolean;
|
|
51
|
+
components: Array<{
|
|
52
|
+
name: string;
|
|
53
|
+
type: string;
|
|
54
|
+
status: RuntimeComponentStatus;
|
|
55
|
+
version: string | null;
|
|
56
|
+
runtimeDataHome: string | null;
|
|
57
|
+
pm2Home: string | null;
|
|
58
|
+
programPaths: string[];
|
|
59
|
+
externalDataPaths: string[];
|
|
60
|
+
managedPaths: string[];
|
|
61
|
+
}>;
|
|
62
|
+
lastOperation: RuntimeState["lastOperation"];
|
|
63
|
+
}
|
|
64
|
+
export declare class RuntimeLifecycleError extends Error {
|
|
65
|
+
constructor(message: string, options?: ErrorOptions);
|
|
66
|
+
}
|
|
67
|
+
export declare function installRuntime(options?: RuntimeLifecycleOptions): Promise<RuntimeLifecycleResult>;
|
|
68
|
+
export declare function removeRuntime(options?: RuntimeLifecycleOptions): Promise<RuntimeLifecycleResult>;
|
|
69
|
+
export declare function updateRuntime(options?: RuntimeLifecycleOptions): Promise<RuntimeLifecycleResult>;
|
|
70
|
+
export declare function runRuntimeLifecycle(phase: RuntimeLifecyclePhase, options?: RuntimeLifecycleOptions): Promise<RuntimeLifecycleResult>;
|
|
71
|
+
export declare function queryRuntimeState(options: Pick<RuntimeLifecycleOptions, "manifestPath" | "runtimeRoot">): Promise<RuntimeStateReport>;
|
|
72
|
+
export declare function renderRuntimeStateText(report: RuntimeStateReport): string;
|
|
73
|
+
export declare function planRuntimeLifecycle(phase: RuntimeLifecyclePhase, manifest: LoadedRuntimeManifest, state: RuntimeState, options?: RuntimeLifecycleOptions): {
|
|
74
|
+
plan: RuntimePlannedAction[];
|
|
75
|
+
skipped: {
|
|
76
|
+
componentName: string;
|
|
77
|
+
reason: string;
|
|
78
|
+
}[];
|
|
79
|
+
};
|