@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.
Files changed (42) hide show
  1. package/README.md +215 -0
  2. package/README_cn.md +215 -0
  3. package/dist/cli.d.ts +4 -0
  4. package/dist/cli.js +37 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/commands/node-runtime-commands.d.ts +2 -0
  7. package/dist/commands/node-runtime-commands.js +88 -0
  8. package/dist/commands/node-runtime-commands.js.map +1 -0
  9. package/dist/commands/npm-sync-commands.d.ts +2 -0
  10. package/dist/commands/npm-sync-commands.js +92 -0
  11. package/dist/commands/npm-sync-commands.js.map +1 -0
  12. package/dist/index.d.ts +10 -0
  13. package/dist/index.js +13 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/runtime/node-download.d.ts +13 -0
  16. package/dist/runtime/node-download.js +78 -0
  17. package/dist/runtime/node-download.js.map +1 -0
  18. package/dist/runtime/node-extract.d.ts +6 -0
  19. package/dist/runtime/node-extract.js +155 -0
  20. package/dist/runtime/node-extract.js.map +1 -0
  21. package/dist/runtime/node-installer.d.ts +18 -0
  22. package/dist/runtime/node-installer.js +46 -0
  23. package/dist/runtime/node-installer.js.map +1 -0
  24. package/dist/runtime/node-platform.d.ts +14 -0
  25. package/dist/runtime/node-platform.js +41 -0
  26. package/dist/runtime/node-platform.js.map +1 -0
  27. package/dist/runtime/node-release.d.ts +28 -0
  28. package/dist/runtime/node-release.js +146 -0
  29. package/dist/runtime/node-release.js.map +1 -0
  30. package/dist/runtime/node-verify.d.ts +20 -0
  31. package/dist/runtime/node-verify.js +66 -0
  32. package/dist/runtime/node-verify.js.map +1 -0
  33. package/dist/runtime/npm-global.d.ts +20 -0
  34. package/dist/runtime/npm-global.js +53 -0
  35. package/dist/runtime/npm-global.js.map +1 -0
  36. package/dist/runtime/npm-sync.d.ts +94 -0
  37. package/dist/runtime/npm-sync.js +290 -0
  38. package/dist/runtime/npm-sync.js.map +1 -0
  39. package/dist/version.d.ts +7 -0
  40. package/dist/version.js +9 -0
  41. package/dist/version.js.map +1 -0
  42. package/package.json +71 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"npm-sync-commands.js","sourceRoot":"","sources":["../../src/commands/npm-sync-commands.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export { getPackageMetadata, packageName, packageVersion, type PackageMetadata } from "./version.js";
2
+ export interface HagiscriptRuntimeInfo {
3
+ packageName: string;
4
+ version: string;
5
+ status: "foundation";
6
+ }
7
+ export declare function createRuntimeInfo(): HagiscriptRuntimeInfo;
8
+ export { installNodeRuntime, type InstallNodeRuntimeResult } from "./runtime/node-installer.js";
9
+ export { verifyNodeRuntime, type NodeRuntimeVerificationResult } from "./runtime/node-verify.js";
10
+ export { createNpmSyncPlan, loadNpmSyncManifest, normalizeGlobalInventory, syncNpmGlobals, validateNpmSyncManifest, type InstalledGlobalPackages, type NpmSyncActionKind, type NpmSyncActionResult, type NpmSyncManifest, type NpmSyncManifestEntry, type NpmSyncPlannedAction, type NpmSyncRuntimeMetadata, type NpmSyncSummary } from "./runtime/npm-sync.js";
package/dist/index.js ADDED
@@ -0,0 +1,13 @@
1
+ import { packageName, packageVersion } from "./version.js";
2
+ export { getPackageMetadata, packageName, packageVersion } from "./version.js";
3
+ export function createRuntimeInfo() {
4
+ return {
5
+ packageName,
6
+ version: packageVersion,
7
+ status: "foundation"
8
+ };
9
+ }
10
+ export { installNodeRuntime } from "./runtime/node-installer.js";
11
+ export { verifyNodeRuntime } from "./runtime/node-verify.js";
12
+ export { createNpmSyncPlan, loadNpmSyncManifest, normalizeGlobalInventory, syncNpmGlobals, validateNpmSyncManifest } from "./runtime/npm-sync.js";
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE3D,OAAO,EACL,kBAAkB,EAClB,WAAW,EACX,cAAc,EAEf,MAAM,cAAc,CAAC;AAQtB,MAAM,UAAU,iBAAiB;IAC/B,OAAO;QACL,WAAW;QACX,OAAO,EAAE,cAAc;QACvB,MAAM,EAAE,YAAY;KACrB,CAAC;AACJ,CAAC;AAED,OAAO,EACL,kBAAkB,EAEnB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,iBAAiB,EAElB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,wBAAwB,EACxB,cAAc,EACd,uBAAuB,EASxB,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,13 @@
1
+ export interface DownloadProgress {
2
+ receivedBytes: number;
3
+ totalBytes?: number;
4
+ }
5
+ export interface DownloadOptions {
6
+ fetchImpl?: typeof fetch;
7
+ timeoutMs?: number;
8
+ onProgress?: (progress: DownloadProgress) => void;
9
+ }
10
+ export declare class NodeRuntimeNetworkError extends Error {
11
+ constructor(message: string, options?: ErrorOptions);
12
+ }
13
+ export declare function downloadNodeArchive(url: string, destinationPath: string, options?: DownloadOptions): Promise<void>;
@@ -0,0 +1,78 @@
1
+ import { createWriteStream } from "node:fs";
2
+ import { mkdir } from "node:fs/promises";
3
+ import { dirname } from "node:path";
4
+ export class NodeRuntimeNetworkError extends Error {
5
+ constructor(message, options) {
6
+ super(message, options);
7
+ this.name = "NodeRuntimeNetworkError";
8
+ }
9
+ }
10
+ export async function downloadNodeArchive(url, destinationPath, options = {}) {
11
+ const fetchImpl = options.fetchImpl ?? fetch;
12
+ const timeoutMs = options.timeoutMs ?? 120_000;
13
+ const abortController = new AbortController();
14
+ const timeout = setTimeout(() => abortController.abort(), timeoutMs);
15
+ try {
16
+ const response = await fetchImpl(url, { signal: abortController.signal });
17
+ if (!response.ok) {
18
+ throw new NodeRuntimeNetworkError(`Failed to download Node.js archive: HTTP ${response.status}`);
19
+ }
20
+ if (!response.body) {
21
+ throw new NodeRuntimeNetworkError("Failed to download Node.js archive: response body was empty.");
22
+ }
23
+ await mkdir(dirname(destinationPath), { recursive: true });
24
+ const totalBytes = parseContentLength(response.headers.get("content-length"));
25
+ let receivedBytes = 0;
26
+ await writeResponseBody(response.body, destinationPath, (chunkLength) => {
27
+ receivedBytes += chunkLength;
28
+ options.onProgress?.({ receivedBytes, totalBytes });
29
+ });
30
+ }
31
+ catch (error) {
32
+ if (error instanceof NodeRuntimeNetworkError) {
33
+ throw error;
34
+ }
35
+ const reason = error instanceof Error ? error.message : String(error);
36
+ throw new NodeRuntimeNetworkError(`Failed to download Node.js archive: ${reason}`, error instanceof Error ? { cause: error } : undefined);
37
+ }
38
+ finally {
39
+ clearTimeout(timeout);
40
+ }
41
+ }
42
+ async function writeResponseBody(body, destinationPath, onChunk) {
43
+ const reader = body.getReader();
44
+ const file = createWriteStream(destinationPath);
45
+ try {
46
+ while (true) {
47
+ const { done, value } = await reader.read();
48
+ if (done) {
49
+ break;
50
+ }
51
+ onChunk(value.byteLength);
52
+ if (!file.write(value)) {
53
+ await new Promise((resolve) => file.once("drain", resolve));
54
+ }
55
+ }
56
+ await new Promise((resolve, reject) => {
57
+ file.end((error) => {
58
+ if (error) {
59
+ reject(error);
60
+ return;
61
+ }
62
+ resolve();
63
+ });
64
+ });
65
+ }
66
+ finally {
67
+ reader.releaseLock();
68
+ file.close();
69
+ }
70
+ }
71
+ function parseContentLength(value) {
72
+ if (!value) {
73
+ return undefined;
74
+ }
75
+ const parsed = Number(value);
76
+ return Number.isFinite(parsed) && parsed >= 0 ? parsed : undefined;
77
+ }
78
+ //# sourceMappingURL=node-download.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-download.js","sourceRoot":"","sources":["../../src/runtime/node-download.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAapC,MAAM,OAAO,uBAAwB,SAAQ,KAAK;IAChD,YAAY,OAAe,EAAE,OAAsB;QACjD,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC;IACxC,CAAC;CACF;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,GAAW,EACX,eAAuB,EACvB,UAA2B,EAAE;IAE7B,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,KAAK,CAAC;IAC7C,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC;IAC/C,MAAM,eAAe,GAAG,IAAI,eAAe,EAAE,CAAC;IAC9C,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,KAAK,EAAE,EAAE,SAAS,CAAC,CAAC;IAErE,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,eAAe,CAAC,MAAM,EAAE,CAAC,CAAC;QAC1E,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,uBAAuB,CAC/B,4CAA4C,QAAQ,CAAC,MAAM,EAAE,CAC9D,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnB,MAAM,IAAI,uBAAuB,CAC/B,8DAA8D,CAC/D,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3D,MAAM,UAAU,GAAG,kBAAkB,CACnC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CACvC,CAAC;QACF,IAAI,aAAa,GAAG,CAAC,CAAC;QAEtB,MAAM,iBAAiB,CAAC,QAAQ,CAAC,IAAI,EAAE,eAAe,EAAE,CAAC,WAAW,EAAE,EAAE;YACtE,aAAa,IAAI,WAAW,CAAC;YAC7B,OAAO,CAAC,UAAU,EAAE,CAAC,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,uBAAuB,EAAE,CAAC;YAC7C,MAAM,KAAK,CAAC;QACd,CAAC;QAED,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACtE,MAAM,IAAI,uBAAuB,CAC/B,uCAAuC,MAAM,EAAE,EAC/C,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CACtD,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,OAAO,CAAC,CAAC;IACxB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC9B,IAAgC,EAChC,eAAuB,EACvB,OAAsC;IAEtC,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;IAChC,MAAM,IAAI,GAAG,iBAAiB,CAAC,eAAe,CAAC,CAAC;IAEhD,IAAI,CAAC;QACH,OAAO,IAAI,EAAE,CAAC;YACZ,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YAC5C,IAAI,IAAI,EAAE,CAAC;gBACT,MAAM;YACR,CAAC;YAED,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YAC1B,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;gBACvB,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;YACpE,CAAC;QACH,CAAC;QAED,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC1C,IAAI,CAAC,GAAG,CAAC,CAAC,KAAoB,EAAE,EAAE;gBAChC,IAAI,KAAK,EAAE,CAAC;oBACV,MAAM,CAAC,KAAK,CAAC,CAAC;oBACd,OAAO;gBACT,CAAC;gBAED,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,WAAW,EAAE,CAAC;QACrB,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAoB;IAC9C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7B,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;AACrE,CAAC"}
@@ -0,0 +1,6 @@
1
+ export declare class NodeRuntimeExtractionError extends Error {
2
+ constructor(message: string, options?: ErrorOptions);
3
+ }
4
+ export declare function extractNodeArchive(archivePath: string, stagingDirectory: string, archiveExtension: "zip" | "tar.xz"): Promise<string>;
5
+ export declare function moveExtractedRootToTarget(extractedRoot: string, targetDirectory: string): Promise<void>;
6
+ export declare function assertTargetIsEmptyOrMissing(targetDirectory: string): Promise<void>;
@@ -0,0 +1,155 @@
1
+ import { createWriteStream } from "node:fs";
2
+ import { mkdir, readdir, readFile, rename, rm, stat, writeFile } from "node:fs/promises";
3
+ import { basename, dirname, join, relative, sep } from "node:path";
4
+ import { spawn } from "node:child_process";
5
+ import { createGunzip, gunzipSync } from "node:zlib";
6
+ import { pipeline } from "node:stream/promises";
7
+ import { createReadStream } from "node:fs";
8
+ export class NodeRuntimeExtractionError extends Error {
9
+ constructor(message, options) {
10
+ super(message, options);
11
+ this.name = "NodeRuntimeExtractionError";
12
+ }
13
+ }
14
+ export async function extractNodeArchive(archivePath, stagingDirectory, archiveExtension) {
15
+ await mkdir(stagingDirectory, { recursive: true });
16
+ if (archiveExtension === "zip") {
17
+ await extractZip(archivePath, stagingDirectory);
18
+ }
19
+ else {
20
+ await extractTar(archivePath, stagingDirectory);
21
+ }
22
+ return findExtractedRoot(stagingDirectory);
23
+ }
24
+ export async function moveExtractedRootToTarget(extractedRoot, targetDirectory) {
25
+ await assertTargetIsEmptyOrMissing(targetDirectory);
26
+ await mkdir(dirname(targetDirectory), { recursive: true });
27
+ await rm(targetDirectory, { recursive: true, force: true });
28
+ await rename(extractedRoot, targetDirectory);
29
+ }
30
+ export async function assertTargetIsEmptyOrMissing(targetDirectory) {
31
+ try {
32
+ const entries = await readdir(targetDirectory);
33
+ if (entries.length > 0) {
34
+ throw new NodeRuntimeExtractionError(`Target directory is not empty: ${targetDirectory}`);
35
+ }
36
+ }
37
+ catch (error) {
38
+ if (error.code === "ENOENT") {
39
+ return;
40
+ }
41
+ if (error instanceof NodeRuntimeExtractionError) {
42
+ throw error;
43
+ }
44
+ const stats = await stat(targetDirectory).catch(() => undefined);
45
+ if (stats && !stats.isDirectory()) {
46
+ throw new NodeRuntimeExtractionError(`Target path exists but is not a directory: ${targetDirectory}`);
47
+ }
48
+ throw error;
49
+ }
50
+ }
51
+ async function extractZip(archivePath, destination) {
52
+ const extractors = ["unzip", "bsdtar"];
53
+ let lastError;
54
+ for (const extractor of extractors) {
55
+ try {
56
+ const args = extractor === "unzip"
57
+ ? ["-q", archivePath, "-d", destination]
58
+ : ["-xf", archivePath, "-C", destination];
59
+ await runExtractor(extractor, args);
60
+ return;
61
+ }
62
+ catch (error) {
63
+ lastError = error instanceof Error ? error : new Error(String(error));
64
+ }
65
+ }
66
+ throw new NodeRuntimeExtractionError("Failed to extract zip archive. Install unzip or bsdtar, or provide a valid Node.js archive.", lastError ? { cause: lastError } : undefined);
67
+ }
68
+ async function extractTar(archivePath, destination) {
69
+ try {
70
+ await runExtractor("tar", ["-xJf", archivePath, "-C", destination]);
71
+ }
72
+ catch (error) {
73
+ const directError = error instanceof Error ? error : new Error(String(error));
74
+ try {
75
+ await extractTarWithNode(archivePath, destination);
76
+ }
77
+ catch (fallbackError) {
78
+ throw new NodeRuntimeExtractionError(`Failed to extract tar archive: ${directError.message}`, fallbackError instanceof Error ? { cause: fallbackError } : undefined);
79
+ }
80
+ }
81
+ }
82
+ async function runExtractor(command, args) {
83
+ await new Promise((resolve, reject) => {
84
+ const child = spawn(command, args, { stdio: ["ignore", "ignore", "pipe"] });
85
+ const stderr = [];
86
+ child.stderr.on("data", (chunk) => stderr.push(chunk));
87
+ child.on("error", reject);
88
+ child.on("close", (code) => {
89
+ if (code === 0) {
90
+ resolve();
91
+ return;
92
+ }
93
+ reject(new Error(`${command} exited with code ${code ?? "unknown"}: ${Buffer.concat(stderr).toString("utf8").trim()}`));
94
+ });
95
+ });
96
+ }
97
+ async function findExtractedRoot(stagingDirectory) {
98
+ const entries = await readdir(stagingDirectory, { withFileTypes: true });
99
+ const directories = entries.filter((entry) => entry.isDirectory());
100
+ if (directories.length !== 1) {
101
+ throw new NodeRuntimeExtractionError(`Expected exactly one extracted Node.js root in staging directory, found ${directories.length}.`);
102
+ }
103
+ return join(stagingDirectory, directories[0].name);
104
+ }
105
+ async function extractTarWithNode(archivePath, destination) {
106
+ const tarPath = archivePath.endsWith(".gz")
107
+ ? `${archivePath}.tar`
108
+ : `${archivePath}.decompressed.tar`;
109
+ try {
110
+ if (archivePath.endsWith(".gz")) {
111
+ await pipeline(createReadStream(archivePath), createGunzip(), createWriteStream(tarPath));
112
+ }
113
+ else {
114
+ await writeFile(tarPath, gunzipSync(await readFile(archivePath)));
115
+ }
116
+ await extractTarBuffer(await readFile(tarPath), destination);
117
+ }
118
+ finally {
119
+ await rm(tarPath, { force: true }).catch(() => undefined);
120
+ }
121
+ }
122
+ async function extractTarBuffer(buffer, destination) {
123
+ let offset = 0;
124
+ while (offset + 512 <= buffer.length) {
125
+ const header = buffer.subarray(offset, offset + 512);
126
+ if (header.every((byte) => byte === 0)) {
127
+ break;
128
+ }
129
+ const name = header.toString("utf8", 0, 100).replace(/\0.*$/, "");
130
+ const sizeText = header
131
+ .toString("utf8", 124, 136)
132
+ .replace(/\0.*$/, "")
133
+ .trim();
134
+ const typeFlag = header.toString("utf8", 156, 157);
135
+ const size = parseInt(sizeText || "0", 8);
136
+ const outputPath = safeJoin(destination, name);
137
+ if (typeFlag === "5") {
138
+ await mkdir(outputPath, { recursive: true });
139
+ }
140
+ else if (typeFlag === "0" || typeFlag === "") {
141
+ await mkdir(dirname(outputPath), { recursive: true });
142
+ await writeFile(outputPath, buffer.subarray(offset + 512, offset + 512 + size));
143
+ }
144
+ offset += 512 + Math.ceil(size / 512) * 512;
145
+ }
146
+ }
147
+ function safeJoin(root, entryName) {
148
+ const normalized = join(root, entryName);
149
+ const rel = relative(root, normalized);
150
+ if (rel.startsWith("..") || rel.includes(`..${sep}`)) {
151
+ throw new NodeRuntimeExtractionError(`Archive entry escapes extraction directory: ${basename(entryName)}`);
152
+ }
153
+ return normalized;
154
+ }
155
+ //# sourceMappingURL=node-extract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-extract.js","sourceRoot":"","sources":["../../src/runtime/node-extract.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { type DownloadProgress } from "./node-download.js";
2
+ export interface InstallNodeRuntimeOptions {
3
+ targetDirectory: string;
4
+ versionSelector?: string;
5
+ fetchImpl?: typeof fetch;
6
+ downloadTimeoutMs?: number;
7
+ verifyTimeoutMs?: number;
8
+ onProgress?: (progress: DownloadProgress) => void;
9
+ }
10
+ export interface InstallNodeRuntimeResult {
11
+ version: string;
12
+ npmVersion: string;
13
+ targetDirectory: string;
14
+ nodePath: string;
15
+ npmPath: string;
16
+ archiveUrl: string;
17
+ }
18
+ export declare function installNodeRuntime(options: InstallNodeRuntimeOptions): Promise<InstallNodeRuntimeResult>;
@@ -0,0 +1,46 @@
1
+ import { mkdtemp, rm } from "node:fs/promises";
2
+ import { dirname, join, resolve } from "node:path";
3
+ import { assertTargetIsEmptyOrMissing, extractNodeArchive, moveExtractedRootToTarget } from "./node-extract.js";
4
+ import { downloadNodeArchive } from "./node-download.js";
5
+ import { fetchNodeReleaseMetadata, selectNodeArchive } from "./node-release.js";
6
+ import { mapNodePlatform } from "./node-platform.js";
7
+ import { getRuntimeExecutablePaths, verifyNodeRuntime } from "./node-verify.js";
8
+ export async function installNodeRuntime(options) {
9
+ const targetDirectory = resolve(options.targetDirectory);
10
+ await assertTargetIsEmptyOrMissing(targetDirectory);
11
+ const releases = await fetchNodeReleaseMetadata(options.fetchImpl);
12
+ const archive = selectNodeArchive(releases, options.versionSelector, mapNodePlatform());
13
+ const stagingRoot = await mkdtemp(join(dirname(targetDirectory), ".hagiscript-node-"));
14
+ const archivePath = join(stagingRoot, archive.fileName);
15
+ try {
16
+ await downloadNodeArchive(archive.url, archivePath, {
17
+ fetchImpl: options.fetchImpl,
18
+ timeoutMs: options.downloadTimeoutMs,
19
+ onProgress: options.onProgress
20
+ });
21
+ const extractedRoot = await extractNodeArchive(archivePath, join(stagingRoot, "extract"), archive.platform.archiveExtension);
22
+ const verification = await verifyNodeRuntime(extractedRoot, {
23
+ timeoutMs: options.verifyTimeoutMs
24
+ });
25
+ assertValidVerification(verification);
26
+ await moveExtractedRootToTarget(extractedRoot, targetDirectory);
27
+ const finalPaths = getRuntimeExecutablePaths(targetDirectory);
28
+ return {
29
+ version: verification.nodeVersion ?? archive.version,
30
+ npmVersion: verification.npmVersion ?? "unknown",
31
+ targetDirectory,
32
+ nodePath: finalPaths.nodePath,
33
+ npmPath: finalPaths.npmPath,
34
+ archiveUrl: archive.url
35
+ };
36
+ }
37
+ finally {
38
+ await rm(stagingRoot, { recursive: true, force: true }).catch(() => undefined);
39
+ }
40
+ }
41
+ function assertValidVerification(verification) {
42
+ if (!verification.valid) {
43
+ throw new Error(`Installed Node.js runtime failed verification: ${verification.failureReason ?? "unknown failure"}`);
44
+ }
45
+ }
46
+ //# sourceMappingURL=node-installer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-installer.js","sourceRoot":"","sources":["../../src/runtime/node-installer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EACL,4BAA4B,EAC5B,kBAAkB,EAClB,yBAAyB,EAC1B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,mBAAmB,EAAyB,MAAM,oBAAoB,CAAC;AAChF,OAAO,EAAE,wBAAwB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAChF,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EACL,yBAAyB,EACzB,iBAAiB,EAElB,MAAM,kBAAkB,CAAC;AAoB1B,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,OAAkC;IAElC,MAAM,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IACzD,MAAM,4BAA4B,CAAC,eAAe,CAAC,CAAC;IAEpD,MAAM,QAAQ,GAAG,MAAM,wBAAwB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACnE,MAAM,OAAO,GAAG,iBAAiB,CAC/B,QAAQ,EACR,OAAO,CAAC,eAAe,EACvB,eAAe,EAAE,CAClB,CAAC;IACF,MAAM,WAAW,GAAG,MAAM,OAAO,CAC/B,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,mBAAmB,CAAC,CACpD,CAAC;IACF,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IAExD,IAAI,CAAC;QACH,MAAM,mBAAmB,CAAC,OAAO,CAAC,GAAG,EAAE,WAAW,EAAE;YAClD,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,SAAS,EAAE,OAAO,CAAC,iBAAiB;YACpC,UAAU,EAAE,OAAO,CAAC,UAAU;SAC/B,CAAC,CAAC;QAEH,MAAM,aAAa,GAAG,MAAM,kBAAkB,CAC5C,WAAW,EACX,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,EAC5B,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAClC,CAAC;QACF,MAAM,YAAY,GAAG,MAAM,iBAAiB,CAAC,aAAa,EAAE;YAC1D,SAAS,EAAE,OAAO,CAAC,eAAe;SACnC,CAAC,CAAC;QACH,uBAAuB,CAAC,YAAY,CAAC,CAAC;QAEtC,MAAM,yBAAyB,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC;QAChE,MAAM,UAAU,GAAG,yBAAyB,CAAC,eAAe,CAAC,CAAC;QAC9D,OAAO;YACL,OAAO,EAAE,YAAY,CAAC,WAAW,IAAI,OAAO,CAAC,OAAO;YACpD,UAAU,EAAE,YAAY,CAAC,UAAU,IAAI,SAAS;YAChD,eAAe;YACf,QAAQ,EAAE,UAAU,CAAC,QAAQ;YAC7B,OAAO,EAAE,UAAU,CAAC,OAAO;YAC3B,UAAU,EAAE,OAAO,CAAC,GAAG;SACxB,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,MAAM,EAAE,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAC3D,GAAG,EAAE,CAAC,SAAS,CAChB,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,uBAAuB,CAC9B,YAA2C;IAO3C,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CACb,kDAAkD,YAAY,CAAC,aAAa,IAAI,iBAAiB,EAAE,CACpG,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,14 @@
1
+ export type NodeOperatingSystem = "win" | "linux" | "darwin";
2
+ export type NodeArchitecture = "x64" | "arm64";
3
+ export interface NodePlatformTarget {
4
+ os: NodeOperatingSystem;
5
+ arch: NodeArchitecture;
6
+ nodeFileKey: `${NodeOperatingSystem}-${NodeArchitecture}`;
7
+ archiveExtension: "zip" | "tar.xz";
8
+ executableName: "node.exe" | "node";
9
+ npmExecutableName: "npm.cmd" | "npm";
10
+ }
11
+ export declare class UnsupportedNodePlatformError extends Error {
12
+ constructor(message: string);
13
+ }
14
+ export declare function mapNodePlatform(platform?: NodeJS.Platform, arch?: NodeJS.Architecture): NodePlatformTarget;
@@ -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":"AAAA,OAAO,EAAE,eAAe,EAA2B,MAAM,oBAAoB,CAAC;AAE9E,MAAM,CAAC,MAAM,kBAAkB,GAAG,EAAE,CAAC;AACrC,MAAM,CAAC,MAAM,2BAA2B,GAAG,yBAAyB,CAAC;AAiBrE,MAAM,OAAO,wBAAyB,SAAQ,KAAK;IACjD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAC;IACzC,CAAC;CACF;AAED,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,wBAAwB,CAAC,QAAiB;IACxD,MAAM,OAAO,GAAG,QAAQ,EAAE,IAAI,EAAE,CAAC;IACjC,OAAO,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QAClC,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE;QACvB,CAAC,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,QAAiB;IACvD,MAAM,UAAU,GAAG,wBAAwB,CAAC,QAAQ,CAAC,CAAC;IACtD,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QACtD,OAAO;IACT,CAAC;IAED,IAAI,wBAAwB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9C,OAAO;IACT,CAAC;IAED,MAAM,IAAI,wBAAwB,CAChC,qCAAqC,QAAQ,IAAI,EAAE,uDAAuD,CAC3G,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,YAA0B,KAAK,EAC/B,OAAO,GAAG,2BAA2B;IAErC,6BAA6B,CAAC,OAAO,CAAC,CAAC;IACvC,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,GAAG,OAAO,aAAa,EAAE;QACxD,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE;KACxC,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CACb,kDAAkD,QAAQ,CAAC,MAAM,EAAE,CACpE,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAY,CAAC;IAChD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IACzE,CAAC;IAED,OAAO,IAAI,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,QAA+B,EAC/B,QAAiB;IAEjB,uBAAuB,CAAC,QAAQ,CAAC,CAAC;IAClC,MAAM,UAAU,GAAG,wBAAwB,CAAC,QAAQ,CAAC,CAAC;IACtD,MAAM,MAAM,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;IAE5D,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACnD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,wBAAwB,CAChC,gDAAgD,QAAQ,IAAI,kBAAkB,EAAE,CACjF,CAAC;IACJ,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,QAA+B,EAC/B,QAAiB,EACjB,QAAQ,GAAG,eAAe,EAAE,EAC5B,OAAO,GAAG,2BAA2B;IAErC,6BAA6B,CAAC,OAAO,CAAC,CAAC;IACvC,MAAM,OAAO,GAAG,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAEvD,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QAClD,MAAM,IAAI,KAAK,CACb,WAAW,OAAO,CAAC,OAAO,oCAAoC,QAAQ,CAAC,WAAW,GAAG,CACtF,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,QAAQ,OAAO,CAAC,OAAO,IAAI,QAAQ,CAAC,WAAW,IAAI,QAAQ,CAAC,gBAAgB,EAAE,CAAC;IAChG,MAAM,GAAG,GAAG,GAAG,OAAO,IAAI,OAAO,CAAC,OAAO,IAAI,QAAQ,EAAE,CAAC;IACxD,4BAA4B,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAE3C,OAAO;QACL,OAAO;QACP,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,QAAQ;QACR,QAAQ;QACR,GAAG;KACJ,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,OAAe;IAC3D,IAAI,MAAW,CAAC;IAChB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,4BAA4B,CACpC,8CAA8C,OAAO,EAAE,CACxD,CAAC;IACJ,CAAC;IAED,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;QACrE,MAAM,IAAI,4BAA4B,CACpC,6EAA6E,OAAO,EAAE,CACvF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,4BAA4B,CAAC,GAAW,EAAE,OAAe;IAChE,6BAA6B,CAAC,OAAO,CAAC,CAAC;IACvC,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;IAEvC,IACE,SAAS,CAAC,QAAQ,KAAK,QAAQ;QAC/B,SAAS,CAAC,QAAQ,KAAK,aAAa,CAAC,QAAQ;QAC7C,CAAC,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,EACzC,CAAC;QACD,MAAM,IAAI,4BAA4B,CACpC,+CAA+C,GAAG,EAAE,CACrD,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAc;IAC1C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAChD,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACtE,CAAC;IAED,MAAM,MAAM,GAAG,KAAgC,CAAC;IAChD,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QACvE,MAAM,IAAI,KAAK,CACb,4DAA4D,CAC7D,CAAC;IACJ,CAAC;IAED,OAAO;QACL,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,GAAG,EACD,OAAO,MAAM,CAAC,GAAG,KAAK,QAAQ,IAAI,OAAO,MAAM,CAAC,GAAG,KAAK,SAAS;YAC/D,CAAC,CAAC,MAAM,CAAC,GAAG;YACZ,CAAC,CAAC,SAAS;QACf,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CACxB,CAAC,IAAI,EAAkB,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,CACnD;QACD,GAAG,EAAE,OAAO,MAAM,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS;KAC7D,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CACpB,QAA+B,EAC/B,QAAgB;IAEhB,IAAI,QAAQ,KAAK,KAAK,EAAE,CAAC;QACvB,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1D,CAAC;IAED,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QACpD,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC;IACrB,CAAC;IAED,IAAI,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;QACjD,OAAO,QAAQ,CAAC,IAAI,CAClB,CAAC,OAAO,EAAE,EAAE,CAAC,eAAe,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,KAAK,CACxD,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,QAAQ,EAAE,CAAC;IACnE,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,KAAK,KAAK,CAAC,CAAC;AAC/D,CAAC;AAED,SAAS,wBAAwB,CAC/B,IAAyB,EACzB,KAA0B;IAE1B,MAAM,SAAS,GAAG,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAClD,MAAM,UAAU,GAAG,iBAAiB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAEpD,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QAC1C,IAAI,SAAS,CAAC,KAAK,CAAC,KAAK,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3C,OAAO,UAAU,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IAED,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,eAAe,CAAC,OAAe;IACtC,OAAO,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;AACvC,CAAC;AAED,SAAS,iBAAiB,CAAC,OAAe;IACxC,MAAM,KAAK,GAAG,yBAAyB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACtD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACnB,CAAC;IAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAChE,CAAC"}