@launchfile/macos-dev 0.1.3
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/CLAUDE.md +37 -0
- package/dist/__tests__/dry-run.test.d.ts +2 -0
- package/dist/__tests__/dry-run.test.d.ts.map +1 -0
- package/dist/__tests__/dry-run.test.js +129 -0
- package/dist/__tests__/dry-run.test.js.map +1 -0
- package/dist/__tests__/env-writer.test.d.ts +2 -0
- package/dist/__tests__/env-writer.test.d.ts.map +1 -0
- package/dist/__tests__/env-writer.test.js +127 -0
- package/dist/__tests__/env-writer.test.js.map +1 -0
- package/dist/__tests__/lockfile-detect.test.d.ts +2 -0
- package/dist/__tests__/lockfile-detect.test.d.ts.map +1 -0
- package/dist/__tests__/lockfile-detect.test.js +75 -0
- package/dist/__tests__/lockfile-detect.test.js.map +1 -0
- package/dist/__tests__/port-allocator.test.d.ts +2 -0
- package/dist/__tests__/port-allocator.test.d.ts.map +1 -0
- package/dist/__tests__/port-allocator.test.js +53 -0
- package/dist/__tests__/port-allocator.test.js.map +1 -0
- package/dist/__tests__/secret-generator.test.d.ts +2 -0
- package/dist/__tests__/secret-generator.test.d.ts.map +1 -0
- package/dist/__tests__/secret-generator.test.js +26 -0
- package/dist/__tests__/secret-generator.test.js.map +1 -0
- package/dist/__tests__/state.test.d.ts +2 -0
- package/dist/__tests__/state.test.d.ts.map +1 -0
- package/dist/__tests__/state.test.js +30 -0
- package/dist/__tests__/state.test.js.map +1 -0
- package/dist/cli.d.ts +12 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +69 -0
- package/dist/cli.js.map +1 -0
- package/dist/env-writer.d.ts +46 -0
- package/dist/env-writer.d.ts.map +1 -0
- package/dist/env-writer.js +175 -0
- package/dist/env-writer.js.map +1 -0
- package/dist/health.d.ts +12 -0
- package/dist/health.d.ts.map +1 -0
- package/dist/health.js +72 -0
- package/dist/health.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/lockfile-detect.d.ts +14 -0
- package/dist/lockfile-detect.d.ts.map +1 -0
- package/dist/lockfile-detect.js +40 -0
- package/dist/lockfile-detect.js.map +1 -0
- package/dist/port-allocator.d.ts +21 -0
- package/dist/port-allocator.d.ts.map +1 -0
- package/dist/port-allocator.js +78 -0
- package/dist/port-allocator.js.map +1 -0
- package/dist/prereqs.d.ts +10 -0
- package/dist/prereqs.d.ts.map +1 -0
- package/dist/prereqs.js +22 -0
- package/dist/prereqs.js.map +1 -0
- package/dist/process-manager.d.ts +43 -0
- package/dist/process-manager.d.ts.map +1 -0
- package/dist/process-manager.js +188 -0
- package/dist/process-manager.js.map +1 -0
- package/dist/provider.d.ts +26 -0
- package/dist/provider.d.ts.map +1 -0
- package/dist/provider.js +342 -0
- package/dist/provider.js.map +1 -0
- package/dist/resources/index.d.ts +10 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +23 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/resources/mysql.d.ts +16 -0
- package/dist/resources/mysql.d.ts.map +1 -0
- package/dist/resources/mysql.js +64 -0
- package/dist/resources/mysql.js.map +1 -0
- package/dist/resources/postgres.d.ts +22 -0
- package/dist/resources/postgres.d.ts.map +1 -0
- package/dist/resources/postgres.js +98 -0
- package/dist/resources/postgres.js.map +1 -0
- package/dist/resources/redis.d.ts +16 -0
- package/dist/resources/redis.d.ts.map +1 -0
- package/dist/resources/redis.js +42 -0
- package/dist/resources/redis.js.map +1 -0
- package/dist/resources/sqlite.d.ts +16 -0
- package/dist/resources/sqlite.d.ts.map +1 -0
- package/dist/resources/sqlite.js +38 -0
- package/dist/resources/sqlite.js.map +1 -0
- package/dist/resources/types.d.ts +40 -0
- package/dist/resources/types.d.ts.map +1 -0
- package/dist/resources/types.js +8 -0
- package/dist/resources/types.js.map +1 -0
- package/dist/runtimes/bun.d.ts +11 -0
- package/dist/runtimes/bun.d.ts.map +1 -0
- package/dist/runtimes/bun.js +20 -0
- package/dist/runtimes/bun.js.map +1 -0
- package/dist/runtimes/index.d.ts +8 -0
- package/dist/runtimes/index.d.ts.map +1 -0
- package/dist/runtimes/index.js +18 -0
- package/dist/runtimes/index.js.map +1 -0
- package/dist/runtimes/node.d.ts +11 -0
- package/dist/runtimes/node.d.ts.map +1 -0
- package/dist/runtimes/node.js +70 -0
- package/dist/runtimes/node.js.map +1 -0
- package/dist/runtimes/python.d.ts +11 -0
- package/dist/runtimes/python.d.ts.map +1 -0
- package/dist/runtimes/python.js +38 -0
- package/dist/runtimes/python.js.map +1 -0
- package/dist/runtimes/ruby.d.ts +11 -0
- package/dist/runtimes/ruby.d.ts.map +1 -0
- package/dist/runtimes/ruby.js +51 -0
- package/dist/runtimes/ruby.js.map +1 -0
- package/dist/runtimes/types.d.ts +13 -0
- package/dist/runtimes/types.d.ts.map +1 -0
- package/dist/runtimes/types.js +5 -0
- package/dist/runtimes/types.js.map +1 -0
- package/dist/secret-generator.d.ts +11 -0
- package/dist/secret-generator.d.ts.map +1 -0
- package/dist/secret-generator.js +26 -0
- package/dist/secret-generator.js.map +1 -0
- package/dist/shell.d.ts +25 -0
- package/dist/shell.d.ts.map +1 -0
- package/dist/shell.js +46 -0
- package/dist/shell.js.map +1 -0
- package/dist/state.d.ts +35 -0
- package/dist/state.d.ts.map +1 -0
- package/dist/state.js +62 -0
- package/dist/state.js.map +1 -0
- package/dist/storage.d.ts +16 -0
- package/dist/storage.d.ts.map +1 -0
- package/dist/storage.js +48 -0
- package/dist/storage.js.map +1 -0
- package/package.json +41 -0
- package/src/__tests__/dry-run.test.ts +157 -0
- package/src/__tests__/env-writer.test.ts +156 -0
- package/src/__tests__/lockfile-detect.test.ts +74 -0
- package/src/__tests__/port-allocator.test.ts +59 -0
- package/src/__tests__/secret-generator.test.ts +31 -0
- package/src/__tests__/state.test.ts +33 -0
- package/src/cli.ts +78 -0
- package/src/env-writer.ts +231 -0
- package/src/health.ts +80 -0
- package/src/index.ts +9 -0
- package/src/lockfile-detect.ts +48 -0
- package/src/port-allocator.ts +97 -0
- package/src/prereqs.ts +32 -0
- package/src/process-manager.ts +242 -0
- package/src/provider.ts +415 -0
- package/src/resources/index.ts +29 -0
- package/src/resources/mysql.ts +98 -0
- package/src/resources/postgres.ts +133 -0
- package/src/resources/redis.ts +58 -0
- package/src/resources/sqlite.ts +52 -0
- package/src/resources/types.ts +47 -0
- package/src/runtimes/bun.ts +25 -0
- package/src/runtimes/index.ts +24 -0
- package/src/runtimes/node.ts +71 -0
- package/src/runtimes/python.ts +42 -0
- package/src/runtimes/ruby.ts +55 -0
- package/src/runtimes/types.ts +16 -0
- package/src/secret-generator.ts +32 -0
- package/src/shell.ts +70 -0
- package/src/state.ts +92 -0
- package/src/storage.ts +67 -0
- package/tsconfig.json +18 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prereqs.js","sourceRoot":"","sources":["../src/prereqs.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAQrC,MAAM,CAAC,KAAK,UAAU,YAAY;IACjC,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,uBAAuB;IACvB,IAAI,CAAC,CAAC,MAAM,OAAO,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC;QACpC,OAAO,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;IACzD,CAAC;IAED,gCAAgC;IAChC,IAAI,CAAC,CAAC,MAAM,OAAO,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC;QACnC,OAAO,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;IACrD,CAAC;IAED,OAAO;QACN,EAAE,EAAE,OAAO,CAAC,MAAM,KAAK,CAAC;QACxB,OAAO;QACP,QAAQ;KACR,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lightweight process manager for multi-component Launchfile apps.
|
|
3
|
+
*
|
|
4
|
+
* Handles topological startup ordering, log multiplexing,
|
|
5
|
+
* health check waits, and graceful shutdown.
|
|
6
|
+
*/
|
|
7
|
+
import type { NormalizedHealth, NormalizedDependsOnEntry } from "@launchfile/sdk";
|
|
8
|
+
export declare class ProcessManager {
|
|
9
|
+
private processes;
|
|
10
|
+
private logDir;
|
|
11
|
+
constructor(projectDir: string);
|
|
12
|
+
register(name: string, config: {
|
|
13
|
+
command: string;
|
|
14
|
+
env: Record<string, string>;
|
|
15
|
+
cwd: string;
|
|
16
|
+
dependsOn?: NormalizedDependsOnEntry[];
|
|
17
|
+
health?: NormalizedHealth;
|
|
18
|
+
port?: number;
|
|
19
|
+
}): void;
|
|
20
|
+
/**
|
|
21
|
+
* Start all registered processes respecting dependency order.
|
|
22
|
+
*/
|
|
23
|
+
startAll(): Promise<void>;
|
|
24
|
+
private startOne;
|
|
25
|
+
/**
|
|
26
|
+
* Graceful shutdown in reverse dependency order.
|
|
27
|
+
*/
|
|
28
|
+
stopAll(): Promise<void>;
|
|
29
|
+
private stopOne;
|
|
30
|
+
/**
|
|
31
|
+
* Topological sort based on depends_on.
|
|
32
|
+
* Returns batches of component names that can start concurrently.
|
|
33
|
+
*/
|
|
34
|
+
private topologicalSort;
|
|
35
|
+
/** Get status summary for all processes */
|
|
36
|
+
getStatus(): Array<{
|
|
37
|
+
name: string;
|
|
38
|
+
status: string;
|
|
39
|
+
pid?: number;
|
|
40
|
+
port?: number;
|
|
41
|
+
}>;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=process-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-manager.d.ts","sourceRoot":"","sources":["../src/process-manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AA0BlF,qBAAa,cAAc;IAC1B,OAAO,CAAC,SAAS,CAAqC;IACtD,OAAO,CAAC,MAAM,CAAS;gBAEX,UAAU,EAAE,MAAM;IAM9B,QAAQ,CACP,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE;QACP,OAAO,EAAE,MAAM,CAAC;QAChB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC5B,GAAG,EAAE,MAAM,CAAC;QACZ,SAAS,CAAC,EAAE,wBAAwB,EAAE,CAAC;QACvC,MAAM,CAAC,EAAE,gBAAgB,CAAC;QAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;KACd,GACC,IAAI;IAaP;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;YAWjB,QAAQ;IAkEtB;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAc9B,OAAO,CAAC,OAAO;IAqBf;;;OAGG;IACH,OAAO,CAAC,eAAe;IAyCvB,2CAA2C;IAC3C,SAAS,IAAI,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAQjF"}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lightweight process manager for multi-component Launchfile apps.
|
|
3
|
+
*
|
|
4
|
+
* Handles topological startup ordering, log multiplexing,
|
|
5
|
+
* health check waits, and graceful shutdown.
|
|
6
|
+
*/
|
|
7
|
+
import { spawn } from "node:child_process";
|
|
8
|
+
import { createWriteStream, mkdirSync } from "node:fs";
|
|
9
|
+
import { join } from "node:path";
|
|
10
|
+
import { waitForHealthy } from "./health.js";
|
|
11
|
+
// ANSI colors for log prefixing
|
|
12
|
+
const COLORS = [
|
|
13
|
+
"\x1b[36m", // cyan
|
|
14
|
+
"\x1b[33m", // yellow
|
|
15
|
+
"\x1b[32m", // green
|
|
16
|
+
"\x1b[35m", // magenta
|
|
17
|
+
"\x1b[34m", // blue
|
|
18
|
+
"\x1b[31m", // red
|
|
19
|
+
];
|
|
20
|
+
const RESET = "\x1b[0m";
|
|
21
|
+
export class ProcessManager {
|
|
22
|
+
processes = new Map();
|
|
23
|
+
logDir;
|
|
24
|
+
constructor(projectDir) {
|
|
25
|
+
this.logDir = join(projectDir, ".launchfile", "logs");
|
|
26
|
+
// Security: restrict permissions — logs may contain sensitive output
|
|
27
|
+
mkdirSync(this.logDir, { recursive: true, mode: 0o700 });
|
|
28
|
+
}
|
|
29
|
+
register(name, config) {
|
|
30
|
+
this.processes.set(name, {
|
|
31
|
+
name,
|
|
32
|
+
command: config.command,
|
|
33
|
+
env: config.env,
|
|
34
|
+
cwd: config.cwd,
|
|
35
|
+
dependsOn: config.dependsOn ?? [],
|
|
36
|
+
health: config.health,
|
|
37
|
+
port: config.port,
|
|
38
|
+
status: "pending",
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Start all registered processes respecting dependency order.
|
|
43
|
+
*/
|
|
44
|
+
async startAll() {
|
|
45
|
+
const batches = this.topologicalSort();
|
|
46
|
+
for (const batch of batches) {
|
|
47
|
+
// Start all processes in this batch concurrently
|
|
48
|
+
await Promise.all(batch.map((name) => this.startOne(name)));
|
|
49
|
+
}
|
|
50
|
+
console.log("\n All components started.");
|
|
51
|
+
}
|
|
52
|
+
async startOne(name) {
|
|
53
|
+
const proc = this.processes.get(name);
|
|
54
|
+
if (!proc)
|
|
55
|
+
throw new Error(`Unknown component: ${name}`);
|
|
56
|
+
// Wait for dependencies
|
|
57
|
+
for (const dep of proc.dependsOn) {
|
|
58
|
+
const depProc = this.processes.get(dep.component);
|
|
59
|
+
if (!depProc)
|
|
60
|
+
continue;
|
|
61
|
+
if (dep.condition === "healthy") {
|
|
62
|
+
console.log(` [${name}] Waiting for ${dep.component} to be healthy...`);
|
|
63
|
+
if (depProc.health && depProc.port) {
|
|
64
|
+
await waitForHealthy(dep.component, depProc.health, depProc.port);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
// For "started" condition, the process is already spawned by the time we get here
|
|
68
|
+
}
|
|
69
|
+
proc.status = "starting";
|
|
70
|
+
console.log(` [${name}] Starting: ${proc.command}`);
|
|
71
|
+
const logFile = createWriteStream(join(this.logDir, `${name}.log`), { flags: "a" });
|
|
72
|
+
const colorIdx = [...this.processes.keys()].indexOf(name) % COLORS.length;
|
|
73
|
+
const color = COLORS[colorIdx];
|
|
74
|
+
const maxNameLen = Math.max(...[...this.processes.keys()].map((n) => n.length));
|
|
75
|
+
const paddedName = name.padEnd(maxNameLen);
|
|
76
|
+
proc.process = spawn("sh", ["-c", proc.command], {
|
|
77
|
+
env: { ...process.env, ...proc.env },
|
|
78
|
+
cwd: proc.cwd,
|
|
79
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
80
|
+
});
|
|
81
|
+
// Pipe stdout with prefix
|
|
82
|
+
proc.process.stdout?.on("data", (data) => {
|
|
83
|
+
const lines = data.toString().split("\n");
|
|
84
|
+
for (const line of lines) {
|
|
85
|
+
if (line) {
|
|
86
|
+
process.stdout.write(`${color}[${paddedName}]${RESET} ${line}\n`);
|
|
87
|
+
logFile.write(`${new Date().toISOString()} ${line}\n`);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
// Pipe stderr with prefix
|
|
92
|
+
proc.process.stderr?.on("data", (data) => {
|
|
93
|
+
const lines = data.toString().split("\n");
|
|
94
|
+
for (const line of lines) {
|
|
95
|
+
if (line) {
|
|
96
|
+
process.stderr.write(`${color}[${paddedName}]${RESET} \x1b[2m${line}${RESET}\n`);
|
|
97
|
+
logFile.write(`${new Date().toISOString()} ERR ${line}\n`);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
proc.process.on("exit", (code) => {
|
|
102
|
+
proc.status = code === 0 ? "stopped" : "failed";
|
|
103
|
+
console.log(`${color}[${paddedName}]${RESET} Process exited with code ${code}`);
|
|
104
|
+
logFile.end();
|
|
105
|
+
});
|
|
106
|
+
proc.status = "running";
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Graceful shutdown in reverse dependency order.
|
|
110
|
+
*/
|
|
111
|
+
async stopAll() {
|
|
112
|
+
const batches = this.topologicalSort().reverse();
|
|
113
|
+
for (const batch of batches) {
|
|
114
|
+
await Promise.all(batch.map((name) => {
|
|
115
|
+
const proc = this.processes.get(name);
|
|
116
|
+
if (!proc?.process || proc.status === "stopped")
|
|
117
|
+
return Promise.resolve();
|
|
118
|
+
return this.stopOne(proc);
|
|
119
|
+
}));
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
stopOne(proc) {
|
|
123
|
+
return new Promise((resolve) => {
|
|
124
|
+
if (!proc.process) {
|
|
125
|
+
resolve();
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
const timeout = setTimeout(() => {
|
|
129
|
+
proc.process?.kill("SIGKILL");
|
|
130
|
+
}, 10_000);
|
|
131
|
+
proc.process.once("exit", () => {
|
|
132
|
+
clearTimeout(timeout);
|
|
133
|
+
proc.status = "stopped";
|
|
134
|
+
resolve();
|
|
135
|
+
});
|
|
136
|
+
proc.process.kill("SIGTERM");
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Topological sort based on depends_on.
|
|
141
|
+
* Returns batches of component names that can start concurrently.
|
|
142
|
+
*/
|
|
143
|
+
topologicalSort() {
|
|
144
|
+
const names = [...this.processes.keys()];
|
|
145
|
+
const inDegree = new Map();
|
|
146
|
+
const dependents = new Map();
|
|
147
|
+
for (const name of names) {
|
|
148
|
+
inDegree.set(name, 0);
|
|
149
|
+
dependents.set(name, []);
|
|
150
|
+
}
|
|
151
|
+
for (const [name, proc] of this.processes) {
|
|
152
|
+
for (const dep of proc.dependsOn) {
|
|
153
|
+
if (this.processes.has(dep.component)) {
|
|
154
|
+
inDegree.set(name, (inDegree.get(name) ?? 0) + 1);
|
|
155
|
+
dependents.get(dep.component).push(name);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
const batches = [];
|
|
160
|
+
let remaining = new Set(names);
|
|
161
|
+
while (remaining.size > 0) {
|
|
162
|
+
const batch = [...remaining].filter((n) => (inDegree.get(n) ?? 0) === 0);
|
|
163
|
+
if (batch.length === 0) {
|
|
164
|
+
// Circular dependency — just add remaining
|
|
165
|
+
batches.push([...remaining]);
|
|
166
|
+
break;
|
|
167
|
+
}
|
|
168
|
+
batches.push(batch);
|
|
169
|
+
for (const name of batch) {
|
|
170
|
+
remaining.delete(name);
|
|
171
|
+
for (const dependent of dependents.get(name) ?? []) {
|
|
172
|
+
inDegree.set(dependent, (inDegree.get(dependent) ?? 0) - 1);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
return batches;
|
|
177
|
+
}
|
|
178
|
+
/** Get status summary for all processes */
|
|
179
|
+
getStatus() {
|
|
180
|
+
return [...this.processes.entries()].map(([name, proc]) => ({
|
|
181
|
+
name,
|
|
182
|
+
status: proc.status,
|
|
183
|
+
pid: proc.process?.pid,
|
|
184
|
+
port: proc.port,
|
|
185
|
+
}));
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=process-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-manager.js","sourceRoot":"","sources":["../src/process-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Main provider orchestration — the `launch up` sequence.
|
|
3
|
+
*
|
|
4
|
+
* Reads a Launchfile, provisions resources, resolves env vars,
|
|
5
|
+
* installs runtimes, and starts all components.
|
|
6
|
+
*/
|
|
7
|
+
export interface LaunchUpOpts {
|
|
8
|
+
withOptional?: boolean;
|
|
9
|
+
noBuild?: boolean;
|
|
10
|
+
detach?: boolean;
|
|
11
|
+
dryRun?: boolean;
|
|
12
|
+
projectDir?: string;
|
|
13
|
+
}
|
|
14
|
+
export declare function launchUp(opts?: LaunchUpOpts): Promise<void>;
|
|
15
|
+
export declare function launchDown(opts?: {
|
|
16
|
+
destroy?: boolean;
|
|
17
|
+
projectDir?: string;
|
|
18
|
+
}): Promise<void>;
|
|
19
|
+
export declare function launchStatus(opts?: {
|
|
20
|
+
projectDir?: string;
|
|
21
|
+
}): Promise<void>;
|
|
22
|
+
export declare function launchEnv(opts?: {
|
|
23
|
+
component?: string;
|
|
24
|
+
projectDir?: string;
|
|
25
|
+
}): Promise<void>;
|
|
26
|
+
//# sourceMappingURL=provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAsBH,MAAM,WAAW,YAAY;IAC5B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,QAAQ,CAAC,IAAI,GAAE,YAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CA4PrE;AA6BD,wBAAsB,UAAU,CAAC,IAAI,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAyBrG;AAED,wBAAsB,YAAY,CAAC,IAAI,GAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CA2BpF;AAED,wBAAsB,SAAS,CAAC,IAAI,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CA0CrG"}
|
package/dist/provider.js
ADDED
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Main provider orchestration — the `launch up` sequence.
|
|
3
|
+
*
|
|
4
|
+
* Reads a Launchfile, provisions resources, resolves env vars,
|
|
5
|
+
* installs runtimes, and starts all components.
|
|
6
|
+
*/
|
|
7
|
+
import { readFile } from "node:fs/promises";
|
|
8
|
+
import { join } from "node:path";
|
|
9
|
+
import { readLaunch } from "@launchfile/sdk";
|
|
10
|
+
import { checkPrereqs } from "./prereqs.js";
|
|
11
|
+
import { loadState, initState, saveState, ensureDirs } from "./state.js";
|
|
12
|
+
import { buildResolverContext, resolveComponentEnv, generateSecrets, resolveGenerators, writeEnvFile, } from "./env-writer.js";
|
|
13
|
+
import { getProvisioner } from "./resources/index.js";
|
|
14
|
+
import { allocatePorts } from "./port-allocator.js";
|
|
15
|
+
import { getRuntimeInstaller } from "./runtimes/index.js";
|
|
16
|
+
import { detectPackageManager } from "./lockfile-detect.js";
|
|
17
|
+
import { provisionStorage } from "./storage.js";
|
|
18
|
+
import { ProcessManager } from "./process-manager.js";
|
|
19
|
+
import { shell } from "./shell.js";
|
|
20
|
+
export async function launchUp(opts = {}) {
|
|
21
|
+
const projectDir = opts.projectDir ?? process.cwd();
|
|
22
|
+
// 1. Check prerequisites
|
|
23
|
+
console.log("Checking prerequisites...");
|
|
24
|
+
const prereqs = await checkPrereqs();
|
|
25
|
+
if (!prereqs.ok) {
|
|
26
|
+
console.error("Missing prerequisites:");
|
|
27
|
+
for (const m of prereqs.missing)
|
|
28
|
+
console.error(` - ${m}`);
|
|
29
|
+
process.exit(1);
|
|
30
|
+
}
|
|
31
|
+
// 2. Read and parse Launchfile
|
|
32
|
+
console.log("Reading Launchfile...");
|
|
33
|
+
const launchfilePath = join(projectDir, "Launchfile");
|
|
34
|
+
let launchfileContent;
|
|
35
|
+
try {
|
|
36
|
+
launchfileContent = await readFile(launchfilePath, "utf8");
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
console.error(`No Launchfile found at ${launchfilePath}`);
|
|
40
|
+
process.exit(1);
|
|
41
|
+
}
|
|
42
|
+
const launch = readLaunch(launchfileContent);
|
|
43
|
+
console.log(` App: ${launch.name}`);
|
|
44
|
+
const componentNames = Object.keys(launch.components);
|
|
45
|
+
console.log(` Components: ${componentNames.join(", ")}`);
|
|
46
|
+
// 3. Load or init state
|
|
47
|
+
let state = await loadState(projectDir);
|
|
48
|
+
if (!state) {
|
|
49
|
+
state = initState(launch.name, launchfileContent);
|
|
50
|
+
}
|
|
51
|
+
// 4. Ensure directories
|
|
52
|
+
await ensureDirs(projectDir);
|
|
53
|
+
// 5. Generate secrets
|
|
54
|
+
console.log("Generating secrets...");
|
|
55
|
+
state.secrets = await generateSecrets(launch.secrets, state.secrets);
|
|
56
|
+
// 6. Provision required resources
|
|
57
|
+
console.log("Provisioning resources...");
|
|
58
|
+
const resourceMap = {};
|
|
59
|
+
for (const [_compName, component] of Object.entries(launch.components)) {
|
|
60
|
+
for (const req of component.requires ?? []) {
|
|
61
|
+
const resourceName = req.name ?? req.type;
|
|
62
|
+
if (resourceMap[resourceName])
|
|
63
|
+
continue; // Already provisioned
|
|
64
|
+
const provisioner = getProvisioner(req.type);
|
|
65
|
+
if (!provisioner) {
|
|
66
|
+
console.warn(` No provisioner for resource type: ${req.type} (skipping)`);
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
if (opts.dryRun) {
|
|
70
|
+
console.log(` [dry-run] Would provision ${req.type} as "${resourceName}"`);
|
|
71
|
+
resourceMap[resourceName] = { url: "", host: "localhost", port: 0 }; // placeholder for dedup
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
console.log(` Provisioning ${req.type} (${resourceName})...`);
|
|
75
|
+
const existing = state.resources[resourceName];
|
|
76
|
+
const result = await provisioner.provision(req, { appName: launch.name, projectDir }, existing);
|
|
77
|
+
resourceMap[resourceName] = result.properties;
|
|
78
|
+
state.resources[resourceName] = result.state;
|
|
79
|
+
}
|
|
80
|
+
// Optional supports resources
|
|
81
|
+
if (opts.withOptional) {
|
|
82
|
+
for (const sup of component.supports ?? []) {
|
|
83
|
+
const resourceName = sup.name ?? sup.type;
|
|
84
|
+
if (resourceMap[resourceName])
|
|
85
|
+
continue;
|
|
86
|
+
const provisioner = getProvisioner(sup.type);
|
|
87
|
+
if (!provisioner) {
|
|
88
|
+
console.log(` Optional resource ${sup.type} not supported (skipping)`);
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
if (opts.dryRun) {
|
|
92
|
+
console.log(` [dry-run] Would provision optional ${sup.type} as "${resourceName}"`);
|
|
93
|
+
resourceMap[resourceName] = { url: "", host: "localhost", port: 0 };
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
try {
|
|
97
|
+
console.log(` Provisioning optional ${sup.type} (${resourceName})...`);
|
|
98
|
+
const existing = state.resources[resourceName];
|
|
99
|
+
const result = await provisioner.provision(sup, { appName: launch.name, projectDir }, existing);
|
|
100
|
+
resourceMap[resourceName] = result.properties;
|
|
101
|
+
state.resources[resourceName] = result.state;
|
|
102
|
+
}
|
|
103
|
+
catch (err) {
|
|
104
|
+
console.log(` Optional resource ${sup.type} failed to provision (skipping): ${err}`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// 7. Allocate ports
|
|
110
|
+
console.log("Allocating ports...");
|
|
111
|
+
const componentPorts = await allocatePorts(launch.components, launch.name, state.ports);
|
|
112
|
+
state.ports = componentPorts;
|
|
113
|
+
// 8. Build resolver context
|
|
114
|
+
const context = buildResolverContext(resourceMap, componentPorts, state.secrets);
|
|
115
|
+
// 9. Install runtimes
|
|
116
|
+
for (const [name, component] of Object.entries(launch.components)) {
|
|
117
|
+
if (!component.runtime) {
|
|
118
|
+
if (!component.image) {
|
|
119
|
+
console.warn(` [${name}] No runtime declared — cannot run natively`);
|
|
120
|
+
}
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
const installer = getRuntimeInstaller(component.runtime);
|
|
124
|
+
if (!installer) {
|
|
125
|
+
console.warn(` [${name}] No installer for runtime: ${component.runtime}`);
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
if (opts.dryRun) {
|
|
129
|
+
console.log(` [dry-run] Would install runtime: ${component.runtime}`);
|
|
130
|
+
continue;
|
|
131
|
+
}
|
|
132
|
+
const version = await installer.detectVersion(projectDir);
|
|
133
|
+
if (version) {
|
|
134
|
+
console.log(` [${name}] Runtime ${component.runtime} ${version}`);
|
|
135
|
+
await installer.install(version);
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
console.log(` [${name}] Runtime ${component.runtime} (using system default)`);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
// 10. Detect package manager
|
|
142
|
+
const pm = await detectPackageManager(projectDir);
|
|
143
|
+
if (pm) {
|
|
144
|
+
console.log(` Package manager: ${pm.name} (${pm.lockfile})`);
|
|
145
|
+
}
|
|
146
|
+
// 11. Create storage directories
|
|
147
|
+
for (const [name, component] of Object.entries(launch.components)) {
|
|
148
|
+
await provisionStorage(component.storage, name, projectDir);
|
|
149
|
+
}
|
|
150
|
+
// 12. Resolve env vars and write .env files
|
|
151
|
+
console.log("Resolving environment variables...");
|
|
152
|
+
const allEnvs = {};
|
|
153
|
+
const isSingleComponent = componentNames.length === 1 && componentNames[0] === "default";
|
|
154
|
+
for (const [name, component] of Object.entries(launch.components)) {
|
|
155
|
+
const env = resolveComponentEnv(component, context, resourceMap);
|
|
156
|
+
await resolveGenerators(component, env);
|
|
157
|
+
const port = componentPorts[name];
|
|
158
|
+
if (port && !env.PORT) {
|
|
159
|
+
env.PORT = String(port);
|
|
160
|
+
}
|
|
161
|
+
allEnvs[name] = env;
|
|
162
|
+
if (opts.dryRun) {
|
|
163
|
+
console.log(` [dry-run] Env for ${name}: ${Object.keys(env).join(", ")}`);
|
|
164
|
+
continue;
|
|
165
|
+
}
|
|
166
|
+
if (isSingleComponent) {
|
|
167
|
+
await writeEnvFile(join(projectDir, ".env.local"), env);
|
|
168
|
+
console.log(` Wrote .env.local (${Object.keys(env).length} vars)`);
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
const { mkdir } = await import("node:fs/promises");
|
|
172
|
+
await mkdir(join(projectDir, ".launchfile", "env"), { recursive: true });
|
|
173
|
+
await writeEnvFile(join(projectDir, ".launchfile", "env", `${name}.env`), env);
|
|
174
|
+
console.log(` Wrote .launchfile/env/${name}.env (${Object.keys(env).length} vars)`);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
// 13. Save state before build (in case build fails, we still have resource state)
|
|
178
|
+
await saveState(projectDir, state);
|
|
179
|
+
if (opts.dryRun) {
|
|
180
|
+
console.log("\n[dry-run] Would now run build, release, and start commands.");
|
|
181
|
+
printSummary(launch, componentPorts, resourceMap);
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
// 14. Run build commands
|
|
185
|
+
if (!opts.noBuild) {
|
|
186
|
+
for (const [name, component] of Object.entries(launch.components)) {
|
|
187
|
+
const buildCmd = component.commands?.build?.command;
|
|
188
|
+
const cmd = buildCmd ?? pm?.installCommand;
|
|
189
|
+
if (cmd) {
|
|
190
|
+
console.log(`\n [${name}] Building: ${cmd}`);
|
|
191
|
+
await shell(cmd, {
|
|
192
|
+
cwd: projectDir,
|
|
193
|
+
env: allEnvs[name],
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
// 15. Run release commands (migrations)
|
|
199
|
+
for (const [name, component] of Object.entries(launch.components)) {
|
|
200
|
+
const releaseCmd = component.commands?.release?.command;
|
|
201
|
+
if (releaseCmd) {
|
|
202
|
+
console.log(`\n [${name}] Release: ${releaseCmd}`);
|
|
203
|
+
await shell(releaseCmd, {
|
|
204
|
+
cwd: projectDir,
|
|
205
|
+
env: allEnvs[name],
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
// 16. Start all components
|
|
210
|
+
console.log("\nStarting components...");
|
|
211
|
+
const pm2 = new ProcessManager(projectDir);
|
|
212
|
+
for (const [name, component] of Object.entries(launch.components)) {
|
|
213
|
+
const startCmd = component.commands?.start?.command;
|
|
214
|
+
if (!startCmd) {
|
|
215
|
+
console.warn(` [${name}] No start command — skipping`);
|
|
216
|
+
continue;
|
|
217
|
+
}
|
|
218
|
+
pm2.register(name, {
|
|
219
|
+
command: startCmd,
|
|
220
|
+
env: { ...process.env, ...allEnvs[name] },
|
|
221
|
+
cwd: projectDir,
|
|
222
|
+
dependsOn: component.depends_on,
|
|
223
|
+
health: component.health,
|
|
224
|
+
port: componentPorts[name],
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
// Handle Ctrl+C gracefully
|
|
228
|
+
process.on("SIGINT", async () => {
|
|
229
|
+
console.log("\n\nShutting down...");
|
|
230
|
+
await pm2.stopAll();
|
|
231
|
+
await saveState(projectDir, state);
|
|
232
|
+
process.exit(0);
|
|
233
|
+
});
|
|
234
|
+
await pm2.startAll();
|
|
235
|
+
// 17. Print summary
|
|
236
|
+
printSummary(launch, componentPorts, resourceMap);
|
|
237
|
+
// Save final state
|
|
238
|
+
await saveState(projectDir, state);
|
|
239
|
+
}
|
|
240
|
+
function printSummary(launch, ports, resources) {
|
|
241
|
+
console.log("\n" + "=".repeat(60));
|
|
242
|
+
console.log(` ${launch.name} is running`);
|
|
243
|
+
console.log("=".repeat(60));
|
|
244
|
+
for (const [name, port] of Object.entries(ports)) {
|
|
245
|
+
const component = launch.components[name];
|
|
246
|
+
const exposed = component?.provides?.some((p) => p.exposed);
|
|
247
|
+
const label = exposed ? "(public)" : "(internal)";
|
|
248
|
+
console.log(` ${name}: http://localhost:${port} ${label}`);
|
|
249
|
+
}
|
|
250
|
+
if (Object.keys(resources).length > 0) {
|
|
251
|
+
console.log("\n Resources:");
|
|
252
|
+
for (const [name, props] of Object.entries(resources)) {
|
|
253
|
+
console.log(` ${name}: ${props.url}`);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
console.log("\n Press Ctrl+C to stop all processes.");
|
|
257
|
+
console.log("=".repeat(60));
|
|
258
|
+
}
|
|
259
|
+
export async function launchDown(opts = {}) {
|
|
260
|
+
const projectDir = opts.projectDir ?? process.cwd();
|
|
261
|
+
const state = await loadState(projectDir);
|
|
262
|
+
if (!state) {
|
|
263
|
+
console.log("No active launch state found.");
|
|
264
|
+
return;
|
|
265
|
+
}
|
|
266
|
+
if (opts.destroy) {
|
|
267
|
+
console.log("Destroying resources...");
|
|
268
|
+
for (const [name, resourceState] of Object.entries(state.resources)) {
|
|
269
|
+
const provisioner = getProvisioner(resourceState.type);
|
|
270
|
+
if (provisioner) {
|
|
271
|
+
console.log(` Destroying ${resourceState.type} (${name})...`);
|
|
272
|
+
await provisioner.destroy(resourceState);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
// Clean up state
|
|
276
|
+
const { rm } = await import("node:fs/promises");
|
|
277
|
+
await rm(join(projectDir, ".launchfile"), { recursive: true, force: true });
|
|
278
|
+
console.log(" Cleaned up .launchfile/");
|
|
279
|
+
}
|
|
280
|
+
else {
|
|
281
|
+
console.log("Stopped. Resources are still running (use --destroy to remove them).");
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
export async function launchStatus(opts = {}) {
|
|
285
|
+
const projectDir = opts.projectDir ?? process.cwd();
|
|
286
|
+
const state = await loadState(projectDir);
|
|
287
|
+
if (!state) {
|
|
288
|
+
console.log("No active launch state found.");
|
|
289
|
+
return;
|
|
290
|
+
}
|
|
291
|
+
console.log(`App: ${state.appName}`);
|
|
292
|
+
console.log(`Created: ${state.createdAt}`);
|
|
293
|
+
console.log(`Updated: ${state.updatedAt}`);
|
|
294
|
+
if (Object.keys(state.ports).length > 0) {
|
|
295
|
+
console.log("\nComponents:");
|
|
296
|
+
for (const [name, port] of Object.entries(state.ports)) {
|
|
297
|
+
console.log(` ${name}: http://localhost:${port}`);
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
if (Object.keys(state.resources).length > 0) {
|
|
301
|
+
console.log("\nResources:");
|
|
302
|
+
for (const [name, res] of Object.entries(state.resources)) {
|
|
303
|
+
const provisioner = getProvisioner(res.type);
|
|
304
|
+
const running = provisioner ? await provisioner.isRunning() : false;
|
|
305
|
+
console.log(` ${name} (${res.type}): ${running ? "running" : "stopped"} on port ${res.port}`);
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
export async function launchEnv(opts = {}) {
|
|
310
|
+
const projectDir = opts.projectDir ?? process.cwd();
|
|
311
|
+
const launchfileContent = await readFile(join(projectDir, "Launchfile"), "utf8");
|
|
312
|
+
const launch = readLaunch(launchfileContent);
|
|
313
|
+
const state = await loadState(projectDir);
|
|
314
|
+
if (!state) {
|
|
315
|
+
console.log("No active launch state. Run `launch up` first.");
|
|
316
|
+
return;
|
|
317
|
+
}
|
|
318
|
+
// Rebuild resource map from state
|
|
319
|
+
const resourceMap = {};
|
|
320
|
+
for (const [name, res] of Object.entries(state.resources)) {
|
|
321
|
+
const provisioner = getProvisioner(res.type);
|
|
322
|
+
if (provisioner) {
|
|
323
|
+
const result = await provisioner.provision({ type: res.type, name: res.name }, { appName: state.appName, projectDir }, res);
|
|
324
|
+
resourceMap[name] = result.properties;
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
const context = buildResolverContext(resourceMap, state.ports, state.secrets);
|
|
328
|
+
for (const [name, component] of Object.entries(launch.components)) {
|
|
329
|
+
if (opts.component && name !== opts.component)
|
|
330
|
+
continue;
|
|
331
|
+
const env = resolveComponentEnv(component, context, resourceMap);
|
|
332
|
+
await resolveGenerators(component, env);
|
|
333
|
+
const port = state.ports[name];
|
|
334
|
+
if (port && !env.PORT)
|
|
335
|
+
env.PORT = String(port);
|
|
336
|
+
console.log(`\n# ${name}`);
|
|
337
|
+
for (const [key, value] of Object.entries(env).sort(([a], [b]) => a.localeCompare(b))) {
|
|
338
|
+
console.log(`${key}=${value}`);
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
//# sourceMappingURL=provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resource provisioner registry.
|
|
3
|
+
*
|
|
4
|
+
* Maps resource type names to their provisioner implementations.
|
|
5
|
+
*/
|
|
6
|
+
import type { ResourceProvisioner } from "./types.js";
|
|
7
|
+
export declare function getProvisioner(type: string): ResourceProvisioner | undefined;
|
|
8
|
+
export declare function supportedResourceTypes(): string[];
|
|
9
|
+
export type { ResourceProvisioner, ResourceProperties, ProvisionOpts } from "./types.js";
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|