@syedar/seedar-cli 1.1.2 → 1.2.0-test.2
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 +26 -3
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +20 -522
- package/dist/cli.js.map +1 -1
- package/dist/commands/doctor.d.ts +2 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +18 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/help.d.ts +2 -0
- package/dist/commands/help.d.ts.map +1 -0
- package/dist/commands/help.js +17 -0
- package/dist/commands/help.js.map +1 -0
- package/dist/commands/install.d.ts +3 -0
- package/dist/commands/install.d.ts.map +1 -0
- package/dist/commands/install.js +35 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/lifecycle.d.ts +4 -0
- package/dist/commands/lifecycle.d.ts.map +1 -0
- package/dist/commands/lifecycle.js +63 -0
- package/dist/commands/lifecycle.js.map +1 -0
- package/dist/commands/logs.d.ts +3 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +20 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/status.d.ts +4 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +230 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/uninstall.d.ts +5 -0
- package/dist/commands/uninstall.d.ts.map +1 -0
- package/dist/commands/uninstall.js +163 -0
- package/dist/commands/uninstall.js.map +1 -0
- package/dist/docker/compose.d.ts +6 -0
- package/dist/docker/compose.d.ts.map +1 -0
- package/dist/docker/compose.js +55 -0
- package/dist/docker/compose.js.map +1 -0
- package/dist/docker/health.d.ts +3 -0
- package/dist/docker/health.d.ts.map +1 -0
- package/dist/docker/health.js +38 -0
- package/dist/docker/health.js.map +1 -0
- package/dist/docker/ports.d.ts +3 -0
- package/dist/docker/ports.d.ts.map +1 -0
- package/dist/docker/ports.js +27 -0
- package/dist/docker/ports.js.map +1 -0
- package/dist/docker/prerequisites.d.ts +2 -0
- package/dist/docker/prerequisites.d.ts.map +1 -0
- package/dist/docker/prerequisites.js +12 -0
- package/dist/docker/prerequisites.js.map +1 -0
- package/dist/{process.d.ts → docker/process.d.ts} +2 -1
- package/dist/docker/process.d.ts.map +1 -0
- package/dist/{process.js → docker/process.js} +11 -0
- package/dist/docker/process.js.map +1 -0
- package/dist/index.js +0 -0
- package/dist/install/config.d.ts +7 -0
- package/dist/install/config.d.ts.map +1 -0
- package/dist/install/config.js +81 -0
- package/dist/install/config.js.map +1 -0
- package/dist/install/flow.d.ts +9 -0
- package/dist/install/flow.d.ts.map +1 -0
- package/dist/install/flow.js +103 -0
- package/dist/install/flow.js.map +1 -0
- package/dist/install/output.d.ts +7 -0
- package/dist/install/output.d.ts.map +1 -0
- package/dist/install/output.js +22 -0
- package/dist/install/output.js.map +1 -0
- package/dist/install/ports.d.ts +8 -0
- package/dist/install/ports.d.ts.map +1 -0
- package/dist/install/ports.js +38 -0
- package/dist/install/ports.js.map +1 -0
- package/dist/install/prompts.d.ts +4 -0
- package/dist/install/prompts.d.ts.map +1 -0
- package/dist/install/prompts.js +155 -0
- package/dist/install/prompts.js.map +1 -0
- package/dist/runtime/guards.d.ts +3 -0
- package/dist/runtime/guards.d.ts.map +1 -0
- package/dist/runtime/guards.js +7 -0
- package/dist/runtime/guards.js.map +1 -0
- package/dist/{runtime.d.ts → runtime/index.d.ts} +2 -2
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/{runtime.js → runtime/index.js} +2 -2
- package/dist/runtime/index.js.map +1 -0
- package/dist/shared/args.d.ts +8 -0
- package/dist/shared/args.d.ts.map +1 -0
- package/dist/shared/args.js +40 -0
- package/dist/shared/args.js.map +1 -0
- package/dist/shared/constants.d.ts.map +1 -0
- package/dist/shared/constants.js.map +1 -0
- package/dist/shared/logging.d.ts +3 -0
- package/dist/shared/logging.d.ts.map +1 -0
- package/dist/shared/logging.js +8 -0
- package/dist/shared/logging.js.map +1 -0
- package/dist/shared/package.d.ts +2 -0
- package/dist/shared/package.d.ts.map +1 -0
- package/dist/shared/package.js +2 -0
- package/dist/shared/package.js.map +1 -0
- package/dist/shared/time.d.ts +2 -0
- package/dist/shared/time.d.ts.map +1 -0
- package/dist/shared/time.js +4 -0
- package/dist/shared/time.js.map +1 -0
- package/dist/{types.d.ts → shared/types.d.ts} +6 -0
- package/dist/shared/types.d.ts.map +1 -0
- package/dist/shared/types.js.map +1 -0
- package/dist/shared/ui.d.ts +7 -0
- package/dist/shared/ui.d.ts.map +1 -0
- package/dist/shared/ui.js +25 -0
- package/dist/shared/ui.js.map +1 -0
- package/package.json +11 -6
- package/dist/constants.d.ts.map +0 -1
- package/dist/constants.js.map +0 -1
- package/dist/process.d.ts.map +0 -1
- package/dist/process.js.map +0 -1
- package/dist/prompts.d.ts +0 -4
- package/dist/prompts.d.ts.map +0 -1
- package/dist/prompts.js +0 -115
- package/dist/prompts.js.map +0 -1
- package/dist/runtime.d.ts.map +0 -1
- package/dist/runtime.js.map +0 -1
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js.map +0 -1
- /package/dist/{constants.d.ts → shared/constants.d.ts} +0 -0
- /package/dist/{constants.js → shared/constants.js} +0 -0
- /package/dist/{types.js → shared/types.js} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../src/commands/uninstall.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { RuntimeLayout } from "../shared/types.js";
|
|
2
|
+
export declare function runComposeCommandWithCapturedOutput(layout: RuntimeLayout, args: string[], fallbackMessage: string): Promise<void>;
|
|
3
|
+
export declare function cleanupComposeServices(layout: RuntimeLayout, services: string[]): Promise<void>;
|
|
4
|
+
export declare function parseComposePsOutput(layout: RuntimeLayout): Promise<Record<string, unknown>[]>;
|
|
5
|
+
export declare function getPublishersFromServices(services: Record<string, unknown>[]): Set<string>;
|
|
6
|
+
//# sourceMappingURL=compose.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compose.d.ts","sourceRoot":"","sources":["../../src/docker/compose.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGxD,wBAAsB,mCAAmC,CACvD,MAAM,EAAE,aAAa,EACrB,IAAI,EAAE,MAAM,EAAE,EACd,eAAe,EAAE,MAAM,GACtB,OAAO,CAAC,IAAI,CAAC,CAWf;AAED,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,aAAa,EACrB,QAAQ,EAAE,MAAM,EAAE,GACjB,OAAO,CAAC,IAAI,CAAC,CAMf;AAED,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,CAiBpG;AAED,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAClC,GAAG,CAAC,MAAM,CAAC,CAsBb"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { runDockerCompose } from "./process.js";
|
|
2
|
+
export async function runComposeCommandWithCapturedOutput(layout, args, fallbackMessage) {
|
|
3
|
+
const result = await runDockerCompose(layout, args);
|
|
4
|
+
const stdout = result.stdout.trim();
|
|
5
|
+
const stderr = result.stderr.trim();
|
|
6
|
+
if (stdout) {
|
|
7
|
+
console.log(stdout);
|
|
8
|
+
}
|
|
9
|
+
if (result.code !== 0) {
|
|
10
|
+
const detail = [stdout, stderr].filter(Boolean).join("\n");
|
|
11
|
+
throw new Error(detail || fallbackMessage);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export async function cleanupComposeServices(layout, services) {
|
|
15
|
+
if (services.length === 0) {
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
await runDockerCompose(layout, ["rm", "-sf", ...services]);
|
|
19
|
+
}
|
|
20
|
+
export async function parseComposePsOutput(layout) {
|
|
21
|
+
const result = await runDockerCompose(layout, ["ps", "--all", "--format", "json"]);
|
|
22
|
+
const raw = result.stdout.trim();
|
|
23
|
+
if (!raw) {
|
|
24
|
+
return [];
|
|
25
|
+
}
|
|
26
|
+
try {
|
|
27
|
+
const parsed = JSON.parse(raw);
|
|
28
|
+
return Array.isArray(parsed) ? parsed : [];
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return raw
|
|
32
|
+
.split(/\r?\n/)
|
|
33
|
+
.filter(Boolean)
|
|
34
|
+
.map((line) => JSON.parse(line));
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
export function getPublishersFromServices(services) {
|
|
38
|
+
const ports = new Set();
|
|
39
|
+
for (const service of services) {
|
|
40
|
+
const publishers = service.Publishers;
|
|
41
|
+
if (!Array.isArray(publishers)) {
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
for (const publisher of publishers) {
|
|
45
|
+
if (publisher &&
|
|
46
|
+
typeof publisher === "object" &&
|
|
47
|
+
"PublishedPort" in publisher &&
|
|
48
|
+
typeof publisher.PublishedPort === "number") {
|
|
49
|
+
ports.add(String(publisher.PublishedPort));
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return ports;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=compose.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compose.js","sourceRoot":"","sources":["../../src/docker/compose.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,MAAM,CAAC,KAAK,UAAU,mCAAmC,CACvD,MAAqB,EACrB,IAAc,EACd,eAAuB;IAEvB,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IACpC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IACpC,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACtB,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACtB,MAAM,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3D,MAAM,IAAI,KAAK,CAAC,MAAM,IAAI,eAAe,CAAC,CAAC;IAC7C,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,MAAqB,EACrB,QAAkB;IAElB,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO;IACT,CAAC;IAED,MAAM,gBAAgB,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC;AAC7D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,MAAqB;IAC9D,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;IACnF,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IAEjC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAY,CAAC;QAC1C,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAE,MAAoC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG;aACP,KAAK,CAAC,OAAO,CAAC;aACd,MAAM,CAAC,OAAO,CAAC;aACf,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAA4B,CAAC,CAAC;IAChE,CAAC;AACH,CAAC;AAED,MAAM,UAAU,yBAAyB,CACvC,QAAmC;IAEnC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAEhC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;QACtC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;YAC/B,SAAS;QACX,CAAC;QAED,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,IACE,SAAS;gBACT,OAAO,SAAS,KAAK,QAAQ;gBAC7B,eAAe,IAAI,SAAS;gBAC5B,OAAO,SAAS,CAAC,aAAa,KAAK,QAAQ,EAC3C,CAAC;gBACD,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../src/docker/health.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAaxD,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE,MAAM,EACf,SAAS,SAAU,GAClB,OAAO,CAAC,IAAI,CAAC,CAkCf"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { createSpinner } from "../shared/ui.js";
|
|
2
|
+
import { wait } from "../shared/time.js";
|
|
3
|
+
import { runCommand, runDockerCompose } from "./process.js";
|
|
4
|
+
async function getServiceContainerId(layout, service) {
|
|
5
|
+
const result = await runDockerCompose(layout, ["ps", "-q", service]);
|
|
6
|
+
const id = result.stdout.trim();
|
|
7
|
+
return id || null;
|
|
8
|
+
}
|
|
9
|
+
export async function waitForServiceHealthy(layout, service, timeoutMs = 120_000) {
|
|
10
|
+
const startedAt = Date.now();
|
|
11
|
+
const spinner = createSpinner(`等待 ${service} 健康检查`).start();
|
|
12
|
+
while (Date.now() - startedAt < timeoutMs) {
|
|
13
|
+
const containerId = await getServiceContainerId(layout, service);
|
|
14
|
+
if (!containerId) {
|
|
15
|
+
spinner.text = `等待 ${service} 容器启动`;
|
|
16
|
+
await wait(2_000);
|
|
17
|
+
continue;
|
|
18
|
+
}
|
|
19
|
+
const inspectResult = await runCommand("docker", [
|
|
20
|
+
"inspect",
|
|
21
|
+
"--format",
|
|
22
|
+
"{{if .State.Health}}{{.State.Health.Status}}{{else}}{{.State.Status}}{{end}}",
|
|
23
|
+
containerId,
|
|
24
|
+
]);
|
|
25
|
+
const state = inspectResult.stdout.trim();
|
|
26
|
+
if (state === "healthy" || state === "running") {
|
|
27
|
+
spinner.succeed(`${service} 已就绪`);
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
if (state === "unhealthy" || state === "exited") {
|
|
31
|
+
throw new Error(`${service} 服务状态异常: ${state}`);
|
|
32
|
+
}
|
|
33
|
+
spinner.text = `等待 ${service} 健康检查,当前状态: ${state || "unknown"}`;
|
|
34
|
+
await wait(3_000);
|
|
35
|
+
}
|
|
36
|
+
throw new Error(`等待 ${service} 服务健康检查超时`);
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=health.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health.js","sourceRoot":"","sources":["../../src/docker/health.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAE5D,KAAK,UAAU,qBAAqB,CAClC,MAAqB,EACrB,OAAe;IAEf,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IACrE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IAChC,OAAO,EAAE,IAAI,IAAI,CAAC;AACpB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,MAAqB,EACrB,OAAe,EACf,SAAS,GAAG,OAAO;IAEnB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,OAAO,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC;IAE5D,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,GAAG,SAAS,EAAE,CAAC;QAC1C,MAAM,WAAW,GAAG,MAAM,qBAAqB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACjE,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO,CAAC,IAAI,GAAG,MAAM,OAAO,OAAO,CAAC;YACpC,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC;YAClB,SAAS;QACX,CAAC;QAED,MAAM,aAAa,GAAG,MAAM,UAAU,CAAC,QAAQ,EAAE;YAC/C,SAAS;YACT,UAAU;YACV,8EAA8E;YAC9E,WAAW;SACZ,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAC1C,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YAC/C,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,MAAM,CAAC,CAAC;YAClC,OAAO;QACT,CAAC;QAED,IAAI,KAAK,KAAK,WAAW,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;YAChD,MAAM,IAAI,KAAK,CAAC,GAAG,OAAO,YAAY,KAAK,EAAE,CAAC,CAAC;QACjD,CAAC;QAED,OAAO,CAAC,IAAI,GAAG,MAAM,OAAO,eAAe,KAAK,IAAI,SAAS,EAAE,CAAC;QAChE,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC;IACpB,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,MAAM,OAAO,WAAW,CAAC,CAAC;AAC5C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ports.d.ts","sourceRoot":"","sources":["../../src/docker/ports.ts"],"names":[],"mappings":"AAEA,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CASpE;AAED,wBAAsB,gBAAgB,CACpC,aAAa,EAAE,MAAM,EACrB,aAAa,GAAE,QAAQ,CAAC,MAAM,CAAM,GACnC,OAAO,CAAC,MAAM,CAAC,CAgBjB"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import net from "node:net";
|
|
2
|
+
export async function isPortAvailable(port) {
|
|
3
|
+
return await new Promise((resolve) => {
|
|
4
|
+
const server = net.createServer();
|
|
5
|
+
server.unref();
|
|
6
|
+
server.on("error", () => resolve(false));
|
|
7
|
+
server.listen(port, "0.0.0.0", () => {
|
|
8
|
+
server.close(() => resolve(true));
|
|
9
|
+
});
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
export async function getAvailablePort(preferredPort, excludedPorts = []) {
|
|
13
|
+
const excluded = new Set(excludedPorts);
|
|
14
|
+
const startPort = Number.isInteger(preferredPort)
|
|
15
|
+
? Math.min(65535, Math.max(1, preferredPort))
|
|
16
|
+
: 1;
|
|
17
|
+
for (let currentPort = startPort; currentPort <= 65535; currentPort += 1) {
|
|
18
|
+
if (excluded.has(currentPort)) {
|
|
19
|
+
continue;
|
|
20
|
+
}
|
|
21
|
+
if (await isPortAvailable(currentPort)) {
|
|
22
|
+
return currentPort;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
throw new Error(`从端口 ${startPort} 开始未找到可用端口`);
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=ports.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ports.js","sourceRoot":"","sources":["../../src/docker/ports.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,UAAU,CAAC;AAE3B,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAY;IAChD,OAAO,MAAM,IAAI,OAAO,CAAU,CAAC,OAAO,EAAE,EAAE;QAC5C,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC;QAClC,MAAM,CAAC,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE;YAClC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,aAAqB,EACrB,gBAAkC,EAAE;IAEpC,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,CAAC;IACxC,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC,aAAa,CAAC;QAC/C,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC,CAAC;IAEN,KAAK,IAAI,WAAW,GAAG,SAAS,EAAE,WAAW,IAAI,KAAK,EAAE,WAAW,IAAI,CAAC,EAAE,CAAC;QACzE,IAAI,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;YAC9B,SAAS;QACX,CAAC;QACD,IAAI,MAAM,eAAe,CAAC,WAAW,CAAC,EAAE,CAAC;YACvC,OAAO,WAAW,CAAC;QACrB,CAAC;IACH,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,OAAO,SAAS,YAAY,CAAC,CAAC;AAChD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prerequisites.d.ts","sourceRoot":"","sources":["../../src/docker/prerequisites.ts"],"names":[],"mappings":"AAGA,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CASzD"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { MIN_NODE_MAJOR } from "../shared/constants.js";
|
|
2
|
+
import { runCommandOrThrow } from "./process.js";
|
|
3
|
+
export async function ensurePrerequisites() {
|
|
4
|
+
const major = Number(process.versions.node.split(".")[0]);
|
|
5
|
+
if (major < MIN_NODE_MAJOR) {
|
|
6
|
+
throw new Error(`Node.js 版本过低,当前 ${process.version},需要 >= ${MIN_NODE_MAJOR}`);
|
|
7
|
+
}
|
|
8
|
+
await runCommandOrThrow("docker", ["--version"]);
|
|
9
|
+
await runCommandOrThrow("docker", ["compose", "version"]);
|
|
10
|
+
await runCommandOrThrow("docker", ["info"]);
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=prerequisites.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prerequisites.js","sourceRoot":"","sources":["../../src/docker/prerequisites.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEjD,MAAM,CAAC,KAAK,UAAU,mBAAmB;IACvC,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1D,IAAI,KAAK,GAAG,cAAc,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,mBAAmB,OAAO,CAAC,OAAO,UAAU,cAAc,EAAE,CAAC,CAAC;IAChF,CAAC;IAED,MAAM,iBAAiB,CAAC,QAAQ,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;IACjD,MAAM,iBAAiB,CAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;IAC1D,MAAM,iBAAiB,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;AAC9C,CAAC"}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import type { RunResult, RuntimeLayout } from "
|
|
1
|
+
import type { RunResult, RuntimeLayout } from "../shared/types.js";
|
|
2
2
|
interface RunCommandOptions {
|
|
3
3
|
cwd?: string;
|
|
4
4
|
env?: NodeJS.ProcessEnv;
|
|
5
5
|
stdio?: "inherit" | "pipe";
|
|
6
6
|
shell?: boolean;
|
|
7
7
|
}
|
|
8
|
+
export declare function spawnDetached(command: string, args: string[], options?: Omit<RunCommandOptions, "stdio">): void;
|
|
8
9
|
export declare function runCommand(command: string, args: string[], options?: RunCommandOptions): Promise<RunResult>;
|
|
9
10
|
export declare function runCommandOrThrow(command: string, args: string[], options?: RunCommandOptions): Promise<RunResult>;
|
|
10
11
|
export declare function runDockerCompose(layout: RuntimeLayout, args: string[], options?: RunCommandOptions): Promise<RunResult>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process.d.ts","sourceRoot":"","sources":["../../src/docker/process.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnE,UAAU,iBAAiB;IACzB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,KAAK,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,GAAE,IAAI,CAAC,iBAAiB,EAAE,OAAO,CAAM,GAC7C,IAAI,CAUN;AAED,wBAAsB,UAAU,CAC9B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,SAAS,CAAC,CAiCpB;AAED,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,SAAS,CAAC,CAUpB;AAED,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,aAAa,EACrB,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,SAAS,CAAC,CASpB;AAED,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,aAAa,EACrB,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,SAAS,CAAC,CAUpB"}
|
|
@@ -1,4 +1,15 @@
|
|
|
1
1
|
import { spawn } from "node:child_process";
|
|
2
|
+
export function spawnDetached(command, args, options = {}) {
|
|
3
|
+
const child = spawn(command, args, {
|
|
4
|
+
cwd: options.cwd,
|
|
5
|
+
env: options.env ?? process.env,
|
|
6
|
+
stdio: "ignore",
|
|
7
|
+
shell: options.shell ?? false,
|
|
8
|
+
detached: true,
|
|
9
|
+
windowsHide: true,
|
|
10
|
+
});
|
|
11
|
+
child.unref();
|
|
12
|
+
}
|
|
2
13
|
export async function runCommand(command, args, options = {}) {
|
|
3
14
|
return await new Promise((resolve, reject) => {
|
|
4
15
|
const child = spawn(command, args, {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process.js","sourceRoot":"","sources":["../../src/docker/process.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAW3C,MAAM,UAAU,aAAa,CAC3B,OAAe,EACf,IAAc,EACd,UAA4C,EAAE;IAE9C,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE;QACjC,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,GAAG,EAAE,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG;QAC/B,KAAK,EAAE,QAAQ;QACf,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,KAAK;QAC7B,QAAQ,EAAE,IAAI;QACd,WAAW,EAAE,IAAI;KAClB,CAAC,CAAC;IACH,KAAK,CAAC,KAAK,EAAE,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,OAAe,EACf,IAAc,EACd,UAA6B,EAAE;IAE/B,OAAO,MAAM,IAAI,OAAO,CAAY,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACtD,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE;YACjC,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,GAAG,EAAE,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG;YAC/B,KAAK,EAAE,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM;YACvD,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,KAAK;SAC9B,CAAC,CAAC;QAEH,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,GAAG,EAAE,CAAC;QAEhB,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACjB,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAsB,EAAE,EAAE;gBACjD,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YAC7B,CAAC,CAAC,CAAC;QACL,CAAC;QAED,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACjB,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAsB,EAAE,EAAE;gBACjD,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YAC7B,CAAC,CAAC,CAAC;QACL,CAAC;QAED,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC1B,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACzB,OAAO,CAAC;gBACN,IAAI,EAAE,IAAI,IAAI,CAAC;gBACf,MAAM;gBACN,MAAM;aACP,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,OAAe,EACf,IAAc,EACd,UAA6B,EAAE;IAE/B,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IACxD,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACtB,MAAM,MAAM,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;aACxD,MAAM,CAAC,OAAO,CAAC;aACf,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,MAAM,IAAI,GAAG,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACjE,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,MAAqB,EACrB,IAAc,EACd,UAA6B,EAAE;IAE/B,OAAO,MAAM,UAAU,CACrB,QAAQ,EACR,CAAC,SAAS,EAAE,YAAY,EAAE,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,EAC5E;QACE,GAAG,EAAE,MAAM,CAAC,UAAU;QACtB,GAAG,OAAO;KACX,CACF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,MAAqB,EACrB,IAAc,EACd,UAA6B,EAAE;IAE/B,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IAC7D,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACtB,MAAM,MAAM,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;aACxD,MAAM,CAAC,OAAO,CAAC;aACf,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,MAAM,IAAI,kBAAkB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACrE,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
package/dist/index.js
CHANGED
|
File without changes
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { CliFlags, EnvConfig, InstallConfigField, InstallConfigIssue, RuntimeLayout } from "../shared/types.js";
|
|
2
|
+
export declare function collectIssueFields(issues: InstallConfigIssue[]): InstallConfigField[];
|
|
3
|
+
export declare function formatConfigIssues(issues: InstallConfigIssue[]): string;
|
|
4
|
+
export declare function collectInstallConfigIssues(env: EnvConfig): Promise<InstallConfigIssue[]>;
|
|
5
|
+
export declare function runInstallConfigCheck(layout: RuntimeLayout, env: EnvConfig, label: string): Promise<InstallConfigIssue[]>;
|
|
6
|
+
export declare function prepareInstallConfig(layout: RuntimeLayout, env: EnvConfig, flags: CliFlags): Promise<EnvConfig>;
|
|
7
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/install/config.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAMrH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,kBAAkB,EAAE,GAAG,kBAAkB,EAAE,CAErF;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,kBAAkB,EAAE,GAAG,MAAM,CAEvE;AAED,wBAAsB,0BAA0B,CAAC,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAwC9F;AAED,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,aAAa,EACrB,GAAG,EAAE,SAAS,EACd,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAc/B;AAED,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,aAAa,EACrB,GAAG,EAAE,SAAS,EACd,KAAK,EAAE,QAAQ,GACd,OAAO,CAAC,SAAS,CAAC,CAuBpB"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { collectProblemInstallConfig } from "./prompts.js";
|
|
2
|
+
import { printInstallDetail, printInstallStage, printInstallSuccess, printInstallWarn } from "./output.js";
|
|
3
|
+
import { PORT_ENV_KEYS, getPortLabel } from "./ports.js";
|
|
4
|
+
import { writeRuntimeFiles } from "../runtime/index.js";
|
|
5
|
+
function isBlank(value) {
|
|
6
|
+
return value.trim().length === 0;
|
|
7
|
+
}
|
|
8
|
+
export function collectIssueFields(issues) {
|
|
9
|
+
return [...new Set(issues.map((issue) => issue.field))];
|
|
10
|
+
}
|
|
11
|
+
export function formatConfigIssues(issues) {
|
|
12
|
+
return issues.map((issue) => `- ${issue.field}: ${issue.message}`).join("\n");
|
|
13
|
+
}
|
|
14
|
+
export async function collectInstallConfigIssues(env) {
|
|
15
|
+
const issues = [];
|
|
16
|
+
if (isBlank(env.SEEDAR_VERSION)) {
|
|
17
|
+
issues.push({ field: "SEEDAR_VERSION", message: "不能为空" });
|
|
18
|
+
}
|
|
19
|
+
if (isBlank(env.DB_HOST)) {
|
|
20
|
+
issues.push({ field: "DB_HOST", message: "不能为空" });
|
|
21
|
+
}
|
|
22
|
+
const dbPort = Number(env.DB_PORT);
|
|
23
|
+
if (!Number.isInteger(dbPort) || dbPort < 1 || dbPort > 65535) {
|
|
24
|
+
issues.push({ field: "DB_PORT", message: "必须是 1-65535 之间的端口" });
|
|
25
|
+
}
|
|
26
|
+
const textChecks = [
|
|
27
|
+
["DB_DATABASE", env.DB_DATABASE],
|
|
28
|
+
["DB_USERNAME", env.DB_USERNAME],
|
|
29
|
+
["DB_PASSWORD", env.DB_PASSWORD],
|
|
30
|
+
["MYSQL_ROOT_PASSWORD", env.MYSQL_ROOT_PASSWORD],
|
|
31
|
+
["AES_SECRET", env.AES_SECRET],
|
|
32
|
+
];
|
|
33
|
+
for (const [field, value] of textChecks) {
|
|
34
|
+
if (isBlank(value)) {
|
|
35
|
+
issues.push({ field, message: "不能为空" });
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
for (const key of PORT_ENV_KEYS) {
|
|
39
|
+
const port = Number(env[key]);
|
|
40
|
+
if (!Number.isInteger(port) || port < 1 || port > 65535) {
|
|
41
|
+
issues.push({
|
|
42
|
+
field: key,
|
|
43
|
+
message: `${getPortLabel(key)} 必须是 1-65535 之间的端口`,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return issues;
|
|
48
|
+
}
|
|
49
|
+
export async function runInstallConfigCheck(layout, env, label) {
|
|
50
|
+
printInstallStage(label);
|
|
51
|
+
printInstallDetail("开始检查配置项");
|
|
52
|
+
await writeRuntimeFiles(layout, env);
|
|
53
|
+
printInstallDetail("端口冲突将在启动阶段自动避让并持续重试");
|
|
54
|
+
const issues = await collectInstallConfigIssues(env);
|
|
55
|
+
if (issues.length > 0) {
|
|
56
|
+
printInstallWarn("配置检查未通过:");
|
|
57
|
+
console.warn(formatConfigIssues(issues));
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
printInstallSuccess("配置检查通过");
|
|
61
|
+
}
|
|
62
|
+
return issues;
|
|
63
|
+
}
|
|
64
|
+
export async function prepareInstallConfig(layout, env, flags) {
|
|
65
|
+
let issues = await runInstallConfigCheck(layout, env, "检查配置");
|
|
66
|
+
if (issues.length === 0) {
|
|
67
|
+
return env;
|
|
68
|
+
}
|
|
69
|
+
const canReprompt = process.stdin.isTTY && !flags.yes;
|
|
70
|
+
if (!canReprompt) {
|
|
71
|
+
throw new Error(`配置检查未通过,请修改 ${layout.envPath} 后重新执行安装。\n${formatConfigIssues(issues)}`);
|
|
72
|
+
}
|
|
73
|
+
printInstallStage("补充有问题的配置项");
|
|
74
|
+
env = await collectProblemInstallConfig(env, collectIssueFields(issues), flags);
|
|
75
|
+
issues = await runInstallConfigCheck(layout, env, "重新检查配置");
|
|
76
|
+
if (issues.length === 0) {
|
|
77
|
+
return env;
|
|
78
|
+
}
|
|
79
|
+
throw new Error(`配置检查两次仍未通过,请直接修改 ${layout.envPath} 后重新执行安装。\n${formatConfigIssues(issues)}`);
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/install/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { EnvConfig, RuntimeLayout } from "../shared/types.js";
|
|
2
|
+
export declare function runInstallFlow(layout: RuntimeLayout, env: EnvConfig): Promise<void>;
|
|
3
|
+
export declare function pullInstallImages(layout: RuntimeLayout): Promise<void>;
|
|
4
|
+
export declare function startMysqlWithRetry(layout: RuntimeLayout, env: EnvConfig): Promise<void>;
|
|
5
|
+
export declare function startServerAndWebWithRetry(layout: RuntimeLayout, env: EnvConfig): Promise<void>;
|
|
6
|
+
export declare function runInstallFlowWithValidatedConfig(layout: RuntimeLayout, env: EnvConfig): Promise<void>;
|
|
7
|
+
export declare function startRuntimeServices(layout: RuntimeLayout, env: EnvConfig): Promise<void>;
|
|
8
|
+
export declare function stopRuntimeServices(layout: RuntimeLayout): Promise<void>;
|
|
9
|
+
//# sourceMappingURL=flow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flow.d.ts","sourceRoot":"","sources":["../../src/install/flow.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAQnE,wBAAsB,cAAc,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CASzF;AAED,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAI5E;AAED,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAmC9F;AAED,wBAAsB,0BAA0B,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAoCrG;AAED,wBAAsB,iCAAiC,CACrD,MAAM,EAAE,aAAa,EACrB,GAAG,EAAE,SAAS,GACb,OAAO,CAAC,IAAI,CAAC,CAYf;AAED,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAK/F;AAED,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAW9E"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { writeCliLog } from "../shared/logging.js";
|
|
2
|
+
import { waitForServiceHealthy } from "../docker/health.js";
|
|
3
|
+
import { cleanupComposeServices, runComposeCommandWithCapturedOutput } from "../docker/compose.js";
|
|
4
|
+
import { runDockerCompose, runDockerComposeOrThrow } from "../docker/process.js";
|
|
5
|
+
import { writeRuntimeFiles } from "../runtime/index.js";
|
|
6
|
+
import { autoShiftConflictPort, findPortKeyByPort, getPortLabel, parseComposePortConflict } from "./ports.js";
|
|
7
|
+
import { printInstallDetail, printInstallStage, printInstallSuccess } from "./output.js";
|
|
8
|
+
export async function runInstallFlow(layout, env) {
|
|
9
|
+
await startMysqlWithRetry(layout, env);
|
|
10
|
+
printInstallStage("执行数据库迁移");
|
|
11
|
+
await runDockerComposeOrThrow(layout, ["run", "--rm", "migrate"], {
|
|
12
|
+
stdio: "inherit",
|
|
13
|
+
});
|
|
14
|
+
await startServerAndWebWithRetry(layout, env);
|
|
15
|
+
}
|
|
16
|
+
export async function pullInstallImages(layout) {
|
|
17
|
+
await runDockerComposeOrThrow(layout, ["pull", "mysql", "server", "web"], {
|
|
18
|
+
stdio: "inherit",
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
export async function startMysqlWithRetry(layout, env) {
|
|
22
|
+
while (true) {
|
|
23
|
+
printInstallStage("启动 MySQL");
|
|
24
|
+
try {
|
|
25
|
+
await runComposeCommandWithCapturedOutput(layout, ["up", "-d", "mysql"], "docker compose up -d mysql 执行失败");
|
|
26
|
+
printInstallSuccess(`MySQL 容器已启动,等待健康检查,端口 ${env.MYSQL_PORT}`);
|
|
27
|
+
await waitForServiceHealthy(layout, "mysql");
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
const composeConflictPort = parseComposePortConflict(error);
|
|
32
|
+
if (!composeConflictPort) {
|
|
33
|
+
throw error;
|
|
34
|
+
}
|
|
35
|
+
const conflictKey = findPortKeyByPort(env, composeConflictPort, ["MYSQL_PORT"]);
|
|
36
|
+
if (!conflictKey) {
|
|
37
|
+
throw error;
|
|
38
|
+
}
|
|
39
|
+
await cleanupComposeServices(layout, ["mysql"]);
|
|
40
|
+
const shiftedTo = await autoShiftConflictPort(env, conflictKey, composeConflictPort);
|
|
41
|
+
await writeRuntimeFiles(layout, env);
|
|
42
|
+
printInstallDetail(`${getPortLabel(conflictKey)} ${composeConflictPort} 已冲突,自动避让到 ${shiftedTo},继续重试`);
|
|
43
|
+
await writeCliLog(layout, `mysql startup port shifted ${conflictKey}: ${composeConflictPort} -> ${shiftedTo}`);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
export async function startServerAndWebWithRetry(layout, env) {
|
|
48
|
+
while (true) {
|
|
49
|
+
printInstallStage("启动 Server 和 Web");
|
|
50
|
+
try {
|
|
51
|
+
await runComposeCommandWithCapturedOutput(layout, ["up", "-d", "server", "web"], "docker compose up -d server web 执行失败");
|
|
52
|
+
printInstallSuccess(`Server 端口 ${env.SERVER_PORT},Web 端口 ${env.WEB_PORT}`);
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
const composeConflictPort = parseComposePortConflict(error);
|
|
57
|
+
if (!composeConflictPort) {
|
|
58
|
+
throw error;
|
|
59
|
+
}
|
|
60
|
+
const conflictKey = findPortKeyByPort(env, composeConflictPort, ["SERVER_PORT", "WEB_PORT"]) ??
|
|
61
|
+
findPortKeyByPort(env, composeConflictPort);
|
|
62
|
+
if (!conflictKey) {
|
|
63
|
+
throw error;
|
|
64
|
+
}
|
|
65
|
+
await cleanupComposeServices(layout, ["server", "web"]);
|
|
66
|
+
const shiftedTo = await autoShiftConflictPort(env, conflictKey, composeConflictPort);
|
|
67
|
+
await writeRuntimeFiles(layout, env);
|
|
68
|
+
printInstallDetail(`${getPortLabel(conflictKey)} ${composeConflictPort} 已冲突,自动避让到 ${shiftedTo},继续重试`);
|
|
69
|
+
await writeCliLog(layout, `server/web startup port shifted ${conflictKey}: ${composeConflictPort} -> ${shiftedTo}`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
export async function runInstallFlowWithValidatedConfig(layout, env) {
|
|
74
|
+
await writeCliLog(layout, `start install target=${env.SEEDAR_VERSION}`);
|
|
75
|
+
printInstallStage("拉取镜像前确认");
|
|
76
|
+
printInstallDetail(`目标版本:${env.SEEDAR_VERSION}`);
|
|
77
|
+
printInstallDetail(`安装目录:${layout.installRoot}`);
|
|
78
|
+
printInstallStage("拉取镜像");
|
|
79
|
+
printInstallDetail("开始拉取 mysql、server、web 镜像");
|
|
80
|
+
await pullInstallImages(layout);
|
|
81
|
+
printInstallSuccess("镜像拉取完成");
|
|
82
|
+
await runInstallFlow(layout, env);
|
|
83
|
+
await writeCliLog(layout, `install completed version=${env.SEEDAR_VERSION}`);
|
|
84
|
+
}
|
|
85
|
+
export async function startRuntimeServices(layout, env) {
|
|
86
|
+
printInstallStage("启动服务");
|
|
87
|
+
printInstallDetail(`目标版本:${env.SEEDAR_VERSION}`);
|
|
88
|
+
await runInstallFlow(layout, env);
|
|
89
|
+
printInstallSuccess("服务已启动");
|
|
90
|
+
}
|
|
91
|
+
export async function stopRuntimeServices(layout) {
|
|
92
|
+
printInstallStage("停止服务");
|
|
93
|
+
const result = await runDockerCompose(layout, ["stop", "mysql", "server", "web"]);
|
|
94
|
+
const detail = [result.stdout.trim(), result.stderr.trim()].filter(Boolean).join("\n");
|
|
95
|
+
if (detail) {
|
|
96
|
+
console.log(detail);
|
|
97
|
+
}
|
|
98
|
+
if (result.code !== 0) {
|
|
99
|
+
throw new Error(detail || "停止服务失败");
|
|
100
|
+
}
|
|
101
|
+
printInstallSuccess("mysql、server、web 已停止");
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=flow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flow.js","sourceRoot":"","sources":["../../src/install/flow.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { EnvConfig, RuntimeLayout } from "../shared/types.js";
|
|
2
|
+
export declare function printInstallSummary(layout: RuntimeLayout, env: EnvConfig): void;
|
|
3
|
+
export declare function printInstallStage(title: string): void;
|
|
4
|
+
export declare function printInstallDetail(message: string): void;
|
|
5
|
+
export declare function printInstallSuccess(message: string): void;
|
|
6
|
+
export declare function printInstallWarn(message: string): void;
|
|
7
|
+
//# sourceMappingURL=output.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/install/output.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGnE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,EAAE,SAAS,GAAG,IAAI,CAO/E;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAErD;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAExD;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEzD;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEtD"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { renderInfo, renderStage, renderSuccess, renderWarn } from "../shared/ui.js";
|
|
2
|
+
export function printInstallSummary(layout, env) {
|
|
3
|
+
console.log("Seedar 安装完成。");
|
|
4
|
+
console.log(`安装目录: ${layout.installRoot}`);
|
|
5
|
+
console.log(`Web: http://localhost:${env.WEB_PORT}`);
|
|
6
|
+
console.log(`Server: http://localhost:${env.SERVER_PORT}`);
|
|
7
|
+
console.log(`MySQL: localhost:${env.MYSQL_PORT}`);
|
|
8
|
+
console.log(`版本: ${env.SEEDAR_VERSION}`);
|
|
9
|
+
}
|
|
10
|
+
export function printInstallStage(title) {
|
|
11
|
+
console.log(renderStage(title));
|
|
12
|
+
}
|
|
13
|
+
export function printInstallDetail(message) {
|
|
14
|
+
console.log(renderInfo(message));
|
|
15
|
+
}
|
|
16
|
+
export function printInstallSuccess(message) {
|
|
17
|
+
console.log(renderSuccess(message));
|
|
18
|
+
}
|
|
19
|
+
export function printInstallWarn(message) {
|
|
20
|
+
console.log(renderWarn(message));
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/install/output.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAErF,MAAM,UAAU,mBAAmB,CAAC,MAAqB,EAAE,GAAc;IACvE,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAC5B,OAAO,CAAC,GAAG,CAAC,SAAS,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;IAC3C,OAAO,CAAC,GAAG,CAAC,yBAAyB,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,4BAA4B,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;IAC3D,OAAO,CAAC,GAAG,CAAC,oBAAoB,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;IAClD,OAAO,CAAC,GAAG,CAAC,OAAO,GAAG,CAAC,cAAc,EAAE,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAa;IAC7C,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAAe;IAChD,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,OAAe;IACjD,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAC9C,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { EnvConfig } from "../shared/types.js";
|
|
2
|
+
export type PortEnvKey = "MYSQL_PORT" | "SERVER_PORT" | "WEB_PORT";
|
|
3
|
+
export declare const PORT_ENV_KEYS: PortEnvKey[];
|
|
4
|
+
export declare function parseComposePortConflict(error: unknown): number | null;
|
|
5
|
+
export declare function findPortKeyByPort(env: EnvConfig, port: number, candidateKeys?: readonly PortEnvKey[]): PortEnvKey | null;
|
|
6
|
+
export declare function autoShiftConflictPort(env: EnvConfig, key: PortEnvKey, fromPort: number): Promise<number>;
|
|
7
|
+
export declare function getPortLabel(key: PortEnvKey): string;
|
|
8
|
+
//# sourceMappingURL=ports.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ports.d.ts","sourceRoot":"","sources":["../../src/install/ports.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpD,MAAM,MAAM,UAAU,GAAG,YAAY,GAAG,aAAa,GAAG,UAAU,CAAC;AAEnE,eAAO,MAAM,aAAa,EAAE,UAAU,EAA8C,CAAC;AAIrF,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAStE;AAED,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,SAAS,EACd,IAAI,EAAE,MAAM,EACZ,aAAa,GAAE,SAAS,UAAU,EAAkB,GACnD,UAAU,GAAG,IAAI,CAQnB;AAED,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,SAAS,EACd,GAAG,EAAE,UAAU,EACf,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC,CASjB;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,UAAU,GAAG,MAAM,CASpD"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { getAvailablePort } from "../docker/ports.js";
|
|
2
|
+
export const PORT_ENV_KEYS = ["MYSQL_PORT", "SERVER_PORT", "WEB_PORT"];
|
|
3
|
+
const COMPOSE_PORT_CONFLICT_REGEX = /Bind for (?:\[[^\]]+\]|[0-9.]+):(\d+) failed: port is already allocated/i;
|
|
4
|
+
export function parseComposePortConflict(error) {
|
|
5
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
6
|
+
const matched = COMPOSE_PORT_CONFLICT_REGEX.exec(message);
|
|
7
|
+
if (!matched) {
|
|
8
|
+
return null;
|
|
9
|
+
}
|
|
10
|
+
const port = Number(matched[1]);
|
|
11
|
+
return Number.isInteger(port) ? port : null;
|
|
12
|
+
}
|
|
13
|
+
export function findPortKeyByPort(env, port, candidateKeys = PORT_ENV_KEYS) {
|
|
14
|
+
const targetPort = String(port);
|
|
15
|
+
for (const key of candidateKeys) {
|
|
16
|
+
if (env[key] === targetPort) {
|
|
17
|
+
return key;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
export async function autoShiftConflictPort(env, key, fromPort) {
|
|
23
|
+
const occupiedByConfig = new Set(PORT_ENV_KEYS.filter((candidateKey) => candidateKey !== key).map((candidateKey) => Number(env[candidateKey])));
|
|
24
|
+
const nextPort = await getAvailablePort(fromPort + 1, occupiedByConfig);
|
|
25
|
+
env[key] = String(nextPort);
|
|
26
|
+
return nextPort;
|
|
27
|
+
}
|
|
28
|
+
export function getPortLabel(key) {
|
|
29
|
+
switch (key) {
|
|
30
|
+
case "MYSQL_PORT":
|
|
31
|
+
return "MySQL 端口";
|
|
32
|
+
case "SERVER_PORT":
|
|
33
|
+
return "Server 端口";
|
|
34
|
+
case "WEB_PORT":
|
|
35
|
+
return "Web 端口";
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=ports.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ports.js","sourceRoot":"","sources":["../../src/install/ports.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAKtD,MAAM,CAAC,MAAM,aAAa,GAAiB,CAAC,YAAY,EAAE,aAAa,EAAE,UAAU,CAAC,CAAC;AAErF,MAAM,2BAA2B,GAAG,0EAA0E,CAAC;AAE/G,MAAM,UAAU,wBAAwB,CAAC,KAAc;IACrD,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,MAAM,OAAO,GAAG,2BAA2B,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC1D,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAChC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,GAAc,EACd,IAAY,EACZ,gBAAuC,aAAa;IAEpD,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAChC,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;QAChC,IAAI,GAAG,CAAC,GAAG,CAAC,KAAK,UAAU,EAAE,CAAC;YAC5B,OAAO,GAAG,CAAC;QACb,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,GAAc,EACd,GAAe,EACf,QAAgB;IAEhB,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAC9B,aAAa,CAAC,MAAM,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,YAAY,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,EAAE,CAChF,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAC1B,CACF,CAAC;IACF,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,QAAQ,GAAG,CAAC,EAAE,gBAAgB,CAAC,CAAC;IACxE,GAAG,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC5B,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,GAAe;IAC1C,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,YAAY;YACf,OAAO,UAAU,CAAC;QACpB,KAAK,aAAa;YAChB,OAAO,WAAW,CAAC;QACrB,KAAK,UAAU;YACb,OAAO,QAAQ,CAAC;IACpB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { CliFlags, EnvConfig, InstallConfigField, RuntimeLayout } from "../shared/types.js";
|
|
2
|
+
export declare function collectInstallConfig(layout: RuntimeLayout, versionArg: string | undefined, flags: CliFlags): Promise<EnvConfig>;
|
|
3
|
+
export declare function collectProblemInstallConfig(env: EnvConfig, fields: InstallConfigField[], flags: CliFlags): Promise<EnvConfig>;
|
|
4
|
+
//# sourceMappingURL=prompts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../src/install/prompts.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAuHjG,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,aAAa,EACrB,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,KAAK,EAAE,QAAQ,GACd,OAAO,CAAC,SAAS,CAAC,CAgDpB;AAED,wBAAsB,2BAA2B,CAC/C,GAAG,EAAE,SAAS,EACd,MAAM,EAAE,kBAAkB,EAAE,EAC5B,KAAK,EAAE,QAAQ,GACd,OAAO,CAAC,SAAS,CAAC,CAYpB"}
|