zeti-framework-backend 0.2.4
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/dist/chunk-7D4SUZUM.js +38 -0
- package/dist/chunk-7D4SUZUM.js.map +1 -0
- package/dist/chunk-K2E6XKVB.js +18 -0
- package/dist/chunk-K2E6XKVB.js.map +1 -0
- package/dist/chunk-KIOZSPU2.js +690 -0
- package/dist/chunk-KIOZSPU2.js.map +1 -0
- package/dist/chunk-LCNZVWVO.js +581 -0
- package/dist/chunk-LCNZVWVO.js.map +1 -0
- package/dist/chunk-TTILJJ3O.js +324 -0
- package/dist/chunk-TTILJJ3O.js.map +1 -0
- package/dist/cli/index.d.ts +1 -0
- package/dist/cli/index.js +418 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/config-VWgz0Iq_.d.ts +647 -0
- package/dist/generator-CK-ZmWQj.d.ts +197 -0
- package/dist/generator-KC24DE6M.js +8 -0
- package/dist/generator-KC24DE6M.js.map +1 -0
- package/dist/index.d.ts +333 -0
- package/dist/index.js +11675 -0
- package/dist/index.js.map +1 -0
- package/dist/scripts/index.d.ts +34 -0
- package/dist/scripts/index.js +12 -0
- package/dist/scripts/index.js.map +1 -0
- package/dist/swagger/index.d.ts +10 -0
- package/dist/swagger/index.js +14 -0
- package/dist/swagger/index.js.map +1 -0
- package/dist/tenants/index.d.ts +146 -0
- package/dist/tenants/index.js +10 -0
- package/dist/tenants/index.js.map +1 -0
- package/package.json +83 -0
|
@@ -0,0 +1,418 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
import {
|
|
3
|
+
runPrebuild
|
|
4
|
+
} from "../chunk-KIOZSPU2.js";
|
|
5
|
+
import "../chunk-7D4SUZUM.js";
|
|
6
|
+
|
|
7
|
+
// src/cli/index.ts
|
|
8
|
+
import { $ as $3 } from "bun";
|
|
9
|
+
import path2 from "path";
|
|
10
|
+
import { watch } from "fs";
|
|
11
|
+
|
|
12
|
+
// src/cli/utils/kill-ports.ts
|
|
13
|
+
import { $ } from "bun";
|
|
14
|
+
var DOCKER_MANAGED_PORTS = [
|
|
15
|
+
5432,
|
|
16
|
+
// PostgreSQL
|
|
17
|
+
3306,
|
|
18
|
+
// MySQL
|
|
19
|
+
27017,
|
|
20
|
+
// MongoDB
|
|
21
|
+
6379,
|
|
22
|
+
// Redis
|
|
23
|
+
9e3,
|
|
24
|
+
// MinIO API
|
|
25
|
+
9001,
|
|
26
|
+
// MinIO Console
|
|
27
|
+
5672,
|
|
28
|
+
// RabbitMQ
|
|
29
|
+
15672,
|
|
30
|
+
// RabbitMQ Management
|
|
31
|
+
9092,
|
|
32
|
+
// Kafka
|
|
33
|
+
2181
|
|
34
|
+
// Zookeeper
|
|
35
|
+
];
|
|
36
|
+
async function killPorts(ports) {
|
|
37
|
+
const isWindows = process.platform === "win32";
|
|
38
|
+
let killedAny = false;
|
|
39
|
+
const portsToKill = ports.filter((port) => !DOCKER_MANAGED_PORTS.includes(port));
|
|
40
|
+
const dockerPorts = ports.filter((port) => DOCKER_MANAGED_PORTS.includes(port));
|
|
41
|
+
if (dockerPorts.length > 0) {
|
|
42
|
+
console.log(` \u23ED\uFE0F Skipping Docker-managed ports: ${dockerPorts.join(", ")}`);
|
|
43
|
+
}
|
|
44
|
+
for (const port of portsToKill) {
|
|
45
|
+
try {
|
|
46
|
+
if (isWindows) {
|
|
47
|
+
const result = await $`netstat -ano | findstr :${port} | findstr LISTENING`.text().catch(() => "");
|
|
48
|
+
if (result.trim()) {
|
|
49
|
+
const lines = result.trim().split("\n");
|
|
50
|
+
const pids = /* @__PURE__ */ new Set();
|
|
51
|
+
for (const line of lines) {
|
|
52
|
+
const parts = line.trim().split(/\s+/);
|
|
53
|
+
const pid = parts[parts.length - 1];
|
|
54
|
+
if (pid && pid !== "0") {
|
|
55
|
+
pids.add(pid);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
for (const pid of pids) {
|
|
59
|
+
try {
|
|
60
|
+
await $`taskkill /PID ${pid} /F`.quiet();
|
|
61
|
+
console.log(` \u2713 Killed process ${pid} on port ${port}`);
|
|
62
|
+
killedAny = true;
|
|
63
|
+
} catch {
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
} else {
|
|
68
|
+
try {
|
|
69
|
+
const result = await $`lsof -ti :${port}`.text().catch(() => "");
|
|
70
|
+
if (result.trim()) {
|
|
71
|
+
const pids = result.trim().split("\n").filter(Boolean);
|
|
72
|
+
for (const pid of pids) {
|
|
73
|
+
try {
|
|
74
|
+
await $`kill -9 ${pid}`.quiet();
|
|
75
|
+
console.log(` \u2713 Killed process ${pid} on port ${port}`);
|
|
76
|
+
killedAny = true;
|
|
77
|
+
} catch {
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
} catch {
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
} catch {
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
if (killedAny) {
|
|
88
|
+
console.log(` \u2713 Ports cleared`);
|
|
89
|
+
} else if (portsToKill.length > 0) {
|
|
90
|
+
console.log(` \u2713 Ports available: ${portsToKill.join(", ")}`);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// src/cli/utils/docker.ts
|
|
95
|
+
import { $ as $2 } from "bun";
|
|
96
|
+
import path from "path";
|
|
97
|
+
async function isDockerRunning() {
|
|
98
|
+
try {
|
|
99
|
+
const proc = Bun.spawn(["docker", "info", "--format", "{{.ServerVersion}}"], {
|
|
100
|
+
stdout: "pipe",
|
|
101
|
+
stderr: "pipe"
|
|
102
|
+
});
|
|
103
|
+
const timeout = new Promise((resolve) => setTimeout(() => resolve(1), 5e3));
|
|
104
|
+
const exitCode = await Promise.race([proc.exited, timeout]);
|
|
105
|
+
return exitCode === 0;
|
|
106
|
+
} catch {
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
async function startDockerDesktop() {
|
|
111
|
+
const isWindows = process.platform === "win32";
|
|
112
|
+
const isMac = process.platform === "darwin";
|
|
113
|
+
if (isWindows) {
|
|
114
|
+
const paths = [
|
|
115
|
+
`${process.env.ProgramFiles}\\Docker\\Docker\\Docker Desktop.exe`,
|
|
116
|
+
`${process.env.LOCALAPPDATA}\\Docker\\Docker Desktop.exe`
|
|
117
|
+
];
|
|
118
|
+
for (const dockerPath of paths) {
|
|
119
|
+
const file = Bun.file(dockerPath);
|
|
120
|
+
if (await file.exists()) {
|
|
121
|
+
Bun.spawn([dockerPath], { stdout: "ignore", stderr: "ignore" });
|
|
122
|
+
break;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
} else if (isMac) {
|
|
126
|
+
try {
|
|
127
|
+
await $2`open -a Docker`.quiet();
|
|
128
|
+
} catch {
|
|
129
|
+
throw new Error("Could not start Docker Desktop on macOS");
|
|
130
|
+
}
|
|
131
|
+
} else {
|
|
132
|
+
try {
|
|
133
|
+
await $2`sudo systemctl start docker`.quiet();
|
|
134
|
+
} catch {
|
|
135
|
+
throw new Error("Could not start Docker daemon on Linux");
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
const maxAttempts = 30;
|
|
139
|
+
for (let i = 0; i < maxAttempts; i++) {
|
|
140
|
+
await Bun.sleep(2e3);
|
|
141
|
+
if (await isDockerRunning()) {
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
throw new Error("Docker did not start within 60 seconds");
|
|
146
|
+
}
|
|
147
|
+
async function ensureDocker() {
|
|
148
|
+
if (await isDockerRunning()) {
|
|
149
|
+
console.log(" \u2713 Docker is running");
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
console.log(" \u23F3 Checking Docker daemon...");
|
|
153
|
+
await Bun.sleep(1e3);
|
|
154
|
+
if (await isDockerRunning()) {
|
|
155
|
+
console.log(" \u2713 Docker is running");
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
console.log(" \u23F3 Starting Docker Desktop...");
|
|
159
|
+
await startDockerDesktop();
|
|
160
|
+
console.log(" \u2713 Docker started");
|
|
161
|
+
}
|
|
162
|
+
async function startDockerContainers(composePath) {
|
|
163
|
+
const fullPath = path.resolve(process.cwd(), composePath);
|
|
164
|
+
try {
|
|
165
|
+
const result = await $2`docker compose -f ${fullPath} ps --format "{{.State}}"`.text().catch(() => "");
|
|
166
|
+
const states = result.trim().split("\n").filter(Boolean);
|
|
167
|
+
const allRunning = states.length > 0 && states.every((state) => state === "running");
|
|
168
|
+
if (allRunning) {
|
|
169
|
+
console.log(" \u2713 Docker containers already running");
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
} catch {
|
|
173
|
+
}
|
|
174
|
+
console.log(" \u23F3 Starting containers...");
|
|
175
|
+
try {
|
|
176
|
+
await $2`docker compose -f ${fullPath} up -d --quiet-pull`;
|
|
177
|
+
console.log(" \u2713 Docker containers started");
|
|
178
|
+
} catch (error) {
|
|
179
|
+
throw new Error(`Failed to start Docker containers: ${error}`);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// src/cli/index.ts
|
|
184
|
+
var args = Bun.argv.slice(2);
|
|
185
|
+
var command = args[0];
|
|
186
|
+
var DEFAULT_DEV_CONFIG = {
|
|
187
|
+
port: 3333,
|
|
188
|
+
dockerCompose: "../infra/local/docker-compose.yaml",
|
|
189
|
+
ports: [3333, 5432],
|
|
190
|
+
framework: {
|
|
191
|
+
path: "../_developer/_npm",
|
|
192
|
+
watch: true
|
|
193
|
+
}
|
|
194
|
+
};
|
|
195
|
+
async function getDevConfig() {
|
|
196
|
+
const configPath = path2.join(process.cwd(), "zeti.config.ts");
|
|
197
|
+
const file = Bun.file(configPath);
|
|
198
|
+
if (!await file.exists()) {
|
|
199
|
+
console.warn("\u26A0\uFE0F zeti.config.ts not found, using defaults");
|
|
200
|
+
return DEFAULT_DEV_CONFIG;
|
|
201
|
+
}
|
|
202
|
+
try {
|
|
203
|
+
const content = await file.text();
|
|
204
|
+
const devMatch = content.match(/dev:\s*\{([^}]+(?:\{[^}]*\}[^}]*)*)\}/s);
|
|
205
|
+
if (devMatch) {
|
|
206
|
+
const devContent = devMatch[1];
|
|
207
|
+
const portMatch = devContent.match(/port:\s*(\d+)/);
|
|
208
|
+
const dockerComposeMatch = devContent.match(/dockerCompose:\s*["']([^"']+)["']/);
|
|
209
|
+
const portsMatch = devContent.match(/ports:\s*\[([^\]]+)\]/);
|
|
210
|
+
const frameworkPathMatch = devContent.match(/path:\s*["']([^"']+)["']/);
|
|
211
|
+
const frameworkWatchMatch = devContent.match(/watch:\s*(true|false)/);
|
|
212
|
+
return {
|
|
213
|
+
port: portMatch ? parseInt(portMatch[1]) : DEFAULT_DEV_CONFIG.port,
|
|
214
|
+
dockerCompose: dockerComposeMatch ? dockerComposeMatch[1] : DEFAULT_DEV_CONFIG.dockerCompose,
|
|
215
|
+
ports: portsMatch ? portsMatch[1].split(",").map((p) => parseInt(p.trim())).filter((p) => !isNaN(p)) : DEFAULT_DEV_CONFIG.ports,
|
|
216
|
+
framework: {
|
|
217
|
+
path: frameworkPathMatch ? frameworkPathMatch[1] : DEFAULT_DEV_CONFIG.framework.path,
|
|
218
|
+
watch: frameworkWatchMatch ? frameworkWatchMatch[1] === "true" : DEFAULT_DEV_CONFIG.framework.watch
|
|
219
|
+
}
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
} catch (err) {
|
|
223
|
+
}
|
|
224
|
+
return DEFAULT_DEV_CONFIG;
|
|
225
|
+
}
|
|
226
|
+
async function runPrebuild2() {
|
|
227
|
+
await runPrebuild({ force: true });
|
|
228
|
+
}
|
|
229
|
+
async function dev() {
|
|
230
|
+
const config = await getDevConfig();
|
|
231
|
+
console.log("\u{1F680} Starting Zeti development server...\n");
|
|
232
|
+
console.log("\u{1F50C} Clearing ports...");
|
|
233
|
+
await killPorts(config.ports || [3333, 5432]);
|
|
234
|
+
console.log("\u{1F433} Checking Docker...");
|
|
235
|
+
await ensureDocker();
|
|
236
|
+
if (config.dockerCompose) {
|
|
237
|
+
console.log("\u{1F4E6} Starting Docker containers...");
|
|
238
|
+
await startDockerContainers(config.dockerCompose);
|
|
239
|
+
}
|
|
240
|
+
await runPrebuild2();
|
|
241
|
+
console.log("\n\u2705 Setup complete! Starting watchers...\n");
|
|
242
|
+
const colors = {
|
|
243
|
+
watch: "\x1B[33m",
|
|
244
|
+
// yellow
|
|
245
|
+
server: "\x1B[34m",
|
|
246
|
+
// blue
|
|
247
|
+
framework: "\x1B[32m",
|
|
248
|
+
// green
|
|
249
|
+
reset: "\x1B[0m"
|
|
250
|
+
};
|
|
251
|
+
let debounceTimer = null;
|
|
252
|
+
const srcPath = path2.join(process.cwd(), "src");
|
|
253
|
+
const watcher = watch(srcPath, { recursive: true }, async (event, filename) => {
|
|
254
|
+
if (filename?.endsWith(".ts")) {
|
|
255
|
+
if (debounceTimer) clearTimeout(debounceTimer);
|
|
256
|
+
debounceTimer = setTimeout(async () => {
|
|
257
|
+
console.log(`${colors.watch}[watch]${colors.reset} File changed: ${filename}`);
|
|
258
|
+
try {
|
|
259
|
+
await runPrebuild();
|
|
260
|
+
console.log(`${colors.watch}[watch]${colors.reset} Prebuild complete`);
|
|
261
|
+
} catch (err) {
|
|
262
|
+
console.error(`${colors.watch}[watch]${colors.reset} Prebuild failed`);
|
|
263
|
+
}
|
|
264
|
+
}, 100);
|
|
265
|
+
}
|
|
266
|
+
});
|
|
267
|
+
console.log(`${colors.watch}[watch]${colors.reset} Watching src/**/*.ts for changes...`);
|
|
268
|
+
const serverProc = Bun.spawn(["bun", "--watch", "zeti.config.ts"], {
|
|
269
|
+
cwd: process.cwd(),
|
|
270
|
+
stdout: "pipe",
|
|
271
|
+
stderr: "pipe"
|
|
272
|
+
});
|
|
273
|
+
(async () => {
|
|
274
|
+
const reader = serverProc.stdout.getReader();
|
|
275
|
+
const decoder = new TextDecoder();
|
|
276
|
+
while (true) {
|
|
277
|
+
const { done, value } = await reader.read();
|
|
278
|
+
if (done) break;
|
|
279
|
+
const text = decoder.decode(value);
|
|
280
|
+
if (!text.includes("warn: File") && !text.includes("will not be watched")) {
|
|
281
|
+
text.split("\n").filter(Boolean).forEach((line) => {
|
|
282
|
+
console.log(`${colors.server}[server]${colors.reset} ${line}`);
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
})();
|
|
287
|
+
(async () => {
|
|
288
|
+
const reader = serverProc.stderr.getReader();
|
|
289
|
+
const decoder = new TextDecoder();
|
|
290
|
+
while (true) {
|
|
291
|
+
const { done, value } = await reader.read();
|
|
292
|
+
if (done) break;
|
|
293
|
+
const text = decoder.decode(value);
|
|
294
|
+
if (!text.includes("warn: File") && !text.includes("will not be watched")) {
|
|
295
|
+
text.split("\n").filter(Boolean).forEach((line) => {
|
|
296
|
+
console.error(`${colors.server}[server]${colors.reset} ${line}`);
|
|
297
|
+
});
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
})();
|
|
301
|
+
let frameworkProc = null;
|
|
302
|
+
if (config.framework?.watch && config.framework?.path) {
|
|
303
|
+
const frameworkPath = path2.resolve(process.cwd(), config.framework.path);
|
|
304
|
+
const frameworkFile = Bun.file(path2.join(frameworkPath, "package.json"));
|
|
305
|
+
if (await frameworkFile.exists()) {
|
|
306
|
+
frameworkProc = Bun.spawn(["bun", "dev"], {
|
|
307
|
+
cwd: frameworkPath,
|
|
308
|
+
stdout: "pipe",
|
|
309
|
+
stderr: "pipe"
|
|
310
|
+
});
|
|
311
|
+
const fwStdout = frameworkProc.stdout;
|
|
312
|
+
const fwStderr = frameworkProc.stderr;
|
|
313
|
+
if (fwStdout && typeof fwStdout !== "number") {
|
|
314
|
+
(async () => {
|
|
315
|
+
const reader = fwStdout.getReader();
|
|
316
|
+
const decoder = new TextDecoder();
|
|
317
|
+
while (true) {
|
|
318
|
+
const { done, value } = await reader.read();
|
|
319
|
+
if (done) break;
|
|
320
|
+
const text = decoder.decode(value);
|
|
321
|
+
text.split("\n").filter(Boolean).forEach((line) => {
|
|
322
|
+
console.log(`${colors.framework}[framework]${colors.reset} ${line}`);
|
|
323
|
+
});
|
|
324
|
+
}
|
|
325
|
+
})();
|
|
326
|
+
}
|
|
327
|
+
if (fwStderr && typeof fwStderr !== "number") {
|
|
328
|
+
(async () => {
|
|
329
|
+
const reader = fwStderr.getReader();
|
|
330
|
+
const decoder = new TextDecoder();
|
|
331
|
+
while (true) {
|
|
332
|
+
const { done, value } = await reader.read();
|
|
333
|
+
if (done) break;
|
|
334
|
+
const text = decoder.decode(value);
|
|
335
|
+
text.split("\n").filter(Boolean).forEach((line) => {
|
|
336
|
+
console.error(`${colors.framework}[framework]${colors.reset} ${line}`);
|
|
337
|
+
});
|
|
338
|
+
}
|
|
339
|
+
})();
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
process.on("SIGINT", () => {
|
|
344
|
+
console.log("\n\n\u{1F6D1} Shutting down...");
|
|
345
|
+
watcher.close();
|
|
346
|
+
serverProc.kill();
|
|
347
|
+
frameworkProc?.kill();
|
|
348
|
+
process.exit(0);
|
|
349
|
+
});
|
|
350
|
+
process.on("SIGTERM", () => {
|
|
351
|
+
watcher.close();
|
|
352
|
+
serverProc.kill();
|
|
353
|
+
frameworkProc?.kill();
|
|
354
|
+
process.exit(0);
|
|
355
|
+
});
|
|
356
|
+
await serverProc.exited;
|
|
357
|
+
}
|
|
358
|
+
async function build() {
|
|
359
|
+
console.log("\u{1F528} Building Zeti project...\n");
|
|
360
|
+
await runPrebuild2();
|
|
361
|
+
console.log("\u{1F4E6} Compiling TypeScript...");
|
|
362
|
+
await $3`tsc`;
|
|
363
|
+
console.log("\u{1F4E6} Bundling with esbuild...");
|
|
364
|
+
await $3`bun build zeti.config.ts --outfile=dist/index.js --target=bun`;
|
|
365
|
+
console.log("\n\u2705 Build complete!");
|
|
366
|
+
}
|
|
367
|
+
async function start() {
|
|
368
|
+
console.log("\u{1F680} Starting Zeti server...\n");
|
|
369
|
+
await $3`bun zeti.config.ts`;
|
|
370
|
+
}
|
|
371
|
+
async function prebuild() {
|
|
372
|
+
await runPrebuild2();
|
|
373
|
+
}
|
|
374
|
+
async function main() {
|
|
375
|
+
try {
|
|
376
|
+
switch (command) {
|
|
377
|
+
case "dev":
|
|
378
|
+
await dev();
|
|
379
|
+
break;
|
|
380
|
+
case "build":
|
|
381
|
+
await build();
|
|
382
|
+
break;
|
|
383
|
+
case "start":
|
|
384
|
+
await start();
|
|
385
|
+
break;
|
|
386
|
+
case "prebuild":
|
|
387
|
+
await prebuild();
|
|
388
|
+
break;
|
|
389
|
+
case "help":
|
|
390
|
+
case "--help":
|
|
391
|
+
case "-h":
|
|
392
|
+
console.log(`
|
|
393
|
+
Zeti Framework CLI
|
|
394
|
+
|
|
395
|
+
Usage: zeti <command>
|
|
396
|
+
|
|
397
|
+
Commands:
|
|
398
|
+
dev Start development server with hot reload
|
|
399
|
+
build Build for production
|
|
400
|
+
start Start production server
|
|
401
|
+
prebuild Generate registry and swagger schemas
|
|
402
|
+
|
|
403
|
+
Options:
|
|
404
|
+
--help Show this help message
|
|
405
|
+
`);
|
|
406
|
+
break;
|
|
407
|
+
default:
|
|
408
|
+
console.error(`Unknown command: ${command}`);
|
|
409
|
+
console.log('Run "zeti --help" for usage information.');
|
|
410
|
+
process.exit(1);
|
|
411
|
+
}
|
|
412
|
+
} catch (error) {
|
|
413
|
+
console.error("Error:", error);
|
|
414
|
+
process.exit(1);
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
main();
|
|
418
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/cli/index.ts","../../src/cli/utils/kill-ports.ts","../../src/cli/utils/docker.ts"],"sourcesContent":["#!/usr/bin/env bun\n\nimport { $ } from 'bun';\nimport path from 'path';\nimport { watch } from 'fs';\nimport { pathToFileURL } from 'url';\nimport { killPorts } from './utils/kill-ports.js';\nimport { ensureDocker, startDockerContainers } from './utils/docker.js';\nimport { runPrebuild as runPrebuildFn } from '../scripts/run-prebuild.js';\nimport type { ZetiDevConfig } from '../types/config.js';\n\nconst args = Bun.argv.slice(2);\nconst command = args[0];\n\n// Defaults caso não consiga ler o config\nconst DEFAULT_DEV_CONFIG: Required<ZetiDevConfig> = {\n port: 3333,\n dockerCompose: '../infra/local/docker-compose.yaml',\n ports: [3333, 5432],\n framework: {\n path: '../_developer/_npm',\n watch: true,\n },\n};\n\nasync function getDevConfig(): Promise<Required<ZetiDevConfig>> {\n const configPath = path.join(process.cwd(), 'zeti.config.ts');\n const file = Bun.file(configPath);\n \n if (!(await file.exists())) {\n console.warn('⚠️ zeti.config.ts not found, using defaults');\n return DEFAULT_DEV_CONFIG;\n }\n \n try {\n // Lê o arquivo e extrai a config de dev usando regex\n // Isso evita executar o arquivo (que iniciaria o servidor)\n const content = await file.text();\n \n // Procura por dev: { ... } no arquivo\n const devMatch = content.match(/dev:\\s*\\{([^}]+(?:\\{[^}]*\\}[^}]*)*)\\}/s);\n \n if (devMatch) {\n const devContent = devMatch[1];\n \n // Extrai valores individuais\n const portMatch = devContent.match(/port:\\s*(\\d+)/);\n const dockerComposeMatch = devContent.match(/dockerCompose:\\s*[\"']([^\"']+)[\"']/);\n const portsMatch = devContent.match(/ports:\\s*\\[([^\\]]+)\\]/);\n const frameworkPathMatch = devContent.match(/path:\\s*[\"']([^\"']+)[\"']/);\n const frameworkWatchMatch = devContent.match(/watch:\\s*(true|false)/);\n \n return {\n port: portMatch ? parseInt(portMatch[1]) : DEFAULT_DEV_CONFIG.port,\n dockerCompose: dockerComposeMatch ? dockerComposeMatch[1] : DEFAULT_DEV_CONFIG.dockerCompose,\n ports: portsMatch \n ? portsMatch[1].split(',').map(p => parseInt(p.trim())).filter(p => !isNaN(p))\n : DEFAULT_DEV_CONFIG.ports,\n framework: {\n path: frameworkPathMatch ? frameworkPathMatch[1] : DEFAULT_DEV_CONFIG.framework.path,\n watch: frameworkWatchMatch ? frameworkWatchMatch[1] === 'true' : DEFAULT_DEV_CONFIG.framework.watch,\n },\n };\n }\n } catch (err) {\n // Se falhar, usa defaults\n }\n \n return DEFAULT_DEV_CONFIG;\n}\n\nasync function runPrebuild() {\n await runPrebuildFn({ force: true });\n}\n\nasync function dev() {\n const config = await getDevConfig();\n \n console.log('🚀 Starting Zeti development server...\\n');\n\n // 1. Kill ports\n console.log('🔌 Clearing ports...');\n await killPorts(config.ports || [3333, 5432]);\n\n // 2. Ensure Docker is running\n console.log('🐳 Checking Docker...');\n await ensureDocker();\n\n // 3. Start Docker containers\n if (config.dockerCompose) {\n console.log('📦 Starting Docker containers...');\n await startDockerContainers(config.dockerCompose);\n }\n\n // 4. Run prebuild\n await runPrebuild();\n\n console.log('\\n✅ Setup complete! Starting watchers...\\n');\n\n // Colors for output\n const colors = {\n watch: '\\x1b[33m', // yellow\n server: '\\x1b[34m', // blue\n framework: '\\x1b[32m', // green\n reset: '\\x1b[0m',\n };\n\n // 5. Start file watcher for src/**/*.ts\n let debounceTimer: Timer | null = null;\n const srcPath = path.join(process.cwd(), 'src');\n \n const watcher = watch(srcPath, { recursive: true }, async (event, filename) => {\n if (filename?.endsWith('.ts')) {\n if (debounceTimer) clearTimeout(debounceTimer);\n debounceTimer = setTimeout(async () => {\n console.log(`${colors.watch}[watch]${colors.reset} File changed: ${filename}`);\n try {\n await runPrebuildFn();\n console.log(`${colors.watch}[watch]${colors.reset} Prebuild complete`);\n } catch (err) {\n console.error(`${colors.watch}[watch]${colors.reset} Prebuild failed`);\n }\n }, 100);\n }\n });\n\n console.log(`${colors.watch}[watch]${colors.reset} Watching src/**/*.ts for changes...`);\n\n // 6. Start server with watch\n const serverProc = Bun.spawn(['bun', '--watch', 'zeti.config.ts'], {\n cwd: process.cwd(),\n stdout: 'pipe',\n stderr: 'pipe',\n });\n\n // Handle server output\n (async () => {\n const reader = serverProc.stdout.getReader();\n const decoder = new TextDecoder();\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n const text = decoder.decode(value);\n // Filter Bun warnings\n if (!text.includes('warn: File') && !text.includes('will not be watched')) {\n text.split('\\n').filter(Boolean).forEach(line => {\n console.log(`${colors.server}[server]${colors.reset} ${line}`);\n });\n }\n }\n })();\n\n (async () => {\n const reader = serverProc.stderr.getReader();\n const decoder = new TextDecoder();\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n const text = decoder.decode(value);\n // Filter Bun warnings\n if (!text.includes('warn: File') && !text.includes('will not be watched')) {\n text.split('\\n').filter(Boolean).forEach(line => {\n console.error(`${colors.server}[server]${colors.reset} ${line}`);\n });\n }\n }\n })();\n\n // 7. Start framework watch (optional)\n let frameworkProc: Awaited<ReturnType<typeof Bun.spawn>> | null = null;\n \n if (config.framework?.watch && config.framework?.path) {\n const frameworkPath = path.resolve(process.cwd(), config.framework.path);\n const frameworkFile = Bun.file(path.join(frameworkPath, 'package.json'));\n \n if (await frameworkFile.exists()) {\n frameworkProc = Bun.spawn(['bun', 'dev'], {\n cwd: frameworkPath,\n stdout: 'pipe',\n stderr: 'pipe',\n });\n\n const fwStdout = frameworkProc.stdout;\n const fwStderr = frameworkProc.stderr;\n\n if (fwStdout && typeof fwStdout !== 'number') {\n (async () => {\n const reader = fwStdout.getReader();\n const decoder = new TextDecoder();\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n const text = decoder.decode(value);\n text.split('\\n').filter(Boolean).forEach(line => {\n console.log(`${colors.framework}[framework]${colors.reset} ${line}`);\n });\n }\n })();\n }\n\n if (fwStderr && typeof fwStderr !== 'number') {\n (async () => {\n const reader = fwStderr.getReader();\n const decoder = new TextDecoder();\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n const text = decoder.decode(value);\n text.split('\\n').filter(Boolean).forEach(line => {\n console.error(`${colors.framework}[framework]${colors.reset} ${line}`);\n });\n }\n })();\n }\n }\n }\n\n // Handle Ctrl+C\n process.on('SIGINT', () => {\n console.log('\\n\\n🛑 Shutting down...');\n watcher.close();\n serverProc.kill();\n frameworkProc?.kill();\n process.exit(0);\n });\n\n process.on('SIGTERM', () => {\n watcher.close();\n serverProc.kill();\n frameworkProc?.kill();\n process.exit(0);\n });\n\n // Keep process alive\n await serverProc.exited;\n}\n\nasync function build() {\n console.log('🔨 Building Zeti project...\\n');\n \n await runPrebuild();\n \n console.log('📦 Compiling TypeScript...');\n await $`tsc`;\n \n console.log('📦 Bundling with esbuild...');\n await $`bun build zeti.config.ts --outfile=dist/index.js --target=bun`;\n \n console.log('\\n✅ Build complete!');\n}\n\nasync function start() {\n console.log('🚀 Starting Zeti server...\\n');\n await $`bun zeti.config.ts`;\n}\n\nasync function prebuild() {\n await runPrebuild();\n}\n\nasync function main() {\n try {\n switch (command) {\n case 'dev':\n await dev();\n break;\n case 'build':\n await build();\n break;\n case 'start':\n await start();\n break;\n case 'prebuild':\n await prebuild();\n break;\n case 'help':\n case '--help':\n case '-h':\n console.log(`\nZeti Framework CLI\n\nUsage: zeti <command>\n\nCommands:\n dev Start development server with hot reload\n build Build for production\n start Start production server\n prebuild Generate registry and swagger schemas\n\nOptions:\n --help Show this help message\n`);\n break;\n default:\n console.error(`Unknown command: ${command}`);\n console.log('Run \"zeti --help\" for usage information.');\n process.exit(1);\n }\n } catch (error) {\n console.error('Error:', error);\n process.exit(1);\n }\n}\n\nmain();\n","import { $ } from 'bun';\r\n\r\n// Portas que são tipicamente usadas por Docker containers e NÃO devem ser mortas\r\n// Essas portas serão gerenciadas pelo Docker Compose\r\nconst DOCKER_MANAGED_PORTS = [\r\n 5432, // PostgreSQL\r\n 3306, // MySQL\r\n 27017, // MongoDB\r\n 6379, // Redis\r\n 9000, // MinIO API\r\n 9001, // MinIO Console\r\n 5672, // RabbitMQ\r\n 15672, // RabbitMQ Management\r\n 9092, // Kafka\r\n 2181, // Zookeeper\r\n];\r\n\r\nexport async function killPorts(ports: number[]): Promise<void> {\r\n const isWindows = process.platform === 'win32';\r\n let killedAny = false;\r\n\r\n // Filtra portas que são gerenciadas pelo Docker\r\n const portsToKill = ports.filter(port => !DOCKER_MANAGED_PORTS.includes(port));\r\n const dockerPorts = ports.filter(port => DOCKER_MANAGED_PORTS.includes(port));\r\n\r\n if (dockerPorts.length > 0) {\r\n console.log(` ⏭️ Skipping Docker-managed ports: ${dockerPorts.join(', ')}`);\r\n }\r\n\r\n for (const port of portsToKill) {\r\n try {\r\n if (isWindows) {\r\n // Windows: Find process using netstat\r\n const result = await $`netstat -ano | findstr :${port} | findstr LISTENING`.text().catch(() => '');\r\n\r\n if (result.trim()) {\r\n const lines = result.trim().split('\\n');\r\n const pids = new Set<string>();\r\n\r\n for (const line of lines) {\r\n const parts = line.trim().split(/\\s+/);\r\n const pid = parts[parts.length - 1];\r\n if (pid && pid !== '0') {\r\n pids.add(pid);\r\n }\r\n }\r\n\r\n for (const pid of pids) {\r\n try {\r\n await $`taskkill /PID ${pid} /F`.quiet();\r\n console.log(` ✓ Killed process ${pid} on port ${port}`);\r\n killedAny = true;\r\n } catch {\r\n // Process might have already exited\r\n }\r\n }\r\n }\r\n } else {\r\n // Unix/Mac: Use lsof\r\n try {\r\n const result = await $`lsof -ti :${port}`.text().catch(() => '');\r\n\r\n if (result.trim()) {\r\n const pids = result.trim().split('\\n').filter(Boolean);\r\n for (const pid of pids) {\r\n try {\r\n await $`kill -9 ${pid}`.quiet();\r\n console.log(` ✓ Killed process ${pid} on port ${port}`);\r\n killedAny = true;\r\n } catch {\r\n // Process might have already exited\r\n }\r\n }\r\n }\r\n } catch {\r\n // No process on this port\r\n }\r\n }\r\n } catch {\r\n // No process on this port, which is fine\r\n }\r\n }\r\n\r\n if (killedAny) {\r\n console.log(` ✓ Ports cleared`);\r\n } else if (portsToKill.length > 0) {\r\n console.log(` ✓ Ports available: ${portsToKill.join(', ')}`);\r\n }\r\n}\r\n","import { $ } from 'bun';\r\nimport path from 'path';\r\n\r\nasync function isDockerRunning(): Promise<boolean> {\r\n try {\r\n // Usa docker info que verifica se o daemon está respondendo\r\n // Com timeout de 5 segundos para não travar\r\n const proc = Bun.spawn(['docker', 'info', '--format', '{{.ServerVersion}}'], {\r\n stdout: 'pipe',\r\n stderr: 'pipe',\r\n });\r\n \r\n // Timeout de 5 segundos\r\n const timeout = new Promise<number>((resolve) => setTimeout(() => resolve(1), 5000));\r\n const exitCode = await Promise.race([proc.exited, timeout]);\r\n \r\n return exitCode === 0;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nasync function startDockerDesktop(): Promise<void> {\r\n const isWindows = process.platform === 'win32';\r\n const isMac = process.platform === 'darwin';\r\n\r\n if (isWindows) {\r\n // Try common Windows paths\r\n const paths = [\r\n `${process.env.ProgramFiles}\\\\Docker\\\\Docker\\\\Docker Desktop.exe`,\r\n `${process.env.LOCALAPPDATA}\\\\Docker\\\\Docker Desktop.exe`,\r\n ];\r\n\r\n for (const dockerPath of paths) {\r\n const file = Bun.file(dockerPath);\r\n if (await file.exists()) {\r\n Bun.spawn([dockerPath], { stdout: 'ignore', stderr: 'ignore' });\r\n break;\r\n }\r\n }\r\n } else if (isMac) {\r\n try {\r\n await $`open -a Docker`.quiet();\r\n } catch {\r\n throw new Error('Could not start Docker Desktop on macOS');\r\n }\r\n } else {\r\n // Linux - Docker daemon should be managed by systemd\r\n try {\r\n await $`sudo systemctl start docker`.quiet();\r\n } catch {\r\n throw new Error('Could not start Docker daemon on Linux');\r\n }\r\n }\r\n\r\n // Wait for Docker to be ready\r\n const maxAttempts = 30;\r\n \r\n for (let i = 0; i < maxAttempts; i++) {\r\n await Bun.sleep(2000);\r\n if (await isDockerRunning()) {\r\n return;\r\n }\r\n }\r\n \r\n throw new Error('Docker did not start within 60 seconds');\r\n}\r\n\r\nexport async function ensureDocker(): Promise<void> {\r\n\r\n // Primeira verificação rápida\r\n if (await isDockerRunning()) {\r\n console.log(' ✓ Docker is running');\r\n return;\r\n }\r\n\r\n // Se falhou, pode ser que o daemon está ocupado. Espera um pouco e tenta de novo\r\n console.log(' ⏳ Checking Docker daemon...');\r\n await Bun.sleep(1000);\r\n \r\n if (await isDockerRunning()) {\r\n console.log(' ✓ Docker is running');\r\n return;\r\n }\r\n\r\n // Realmente não está rodando, tenta iniciar\r\n console.log(' ⏳ Starting Docker Desktop...');\r\n await startDockerDesktop();\r\n console.log(' ✓ Docker started');\r\n}\r\n\r\nexport async function startDockerContainers(composePath: string): Promise<void> {\r\n const fullPath = path.resolve(process.cwd(), composePath);\r\n\r\n try {\r\n // Check if containers are already running\r\n const result = await $`docker compose -f ${fullPath} ps --format \"{{.State}}\"`.text().catch(() => '');\r\n\r\n const states = result.trim().split('\\n').filter(Boolean);\r\n const allRunning = states.length > 0 && states.every(state => state === 'running');\r\n\r\n if (allRunning) {\r\n console.log(' ✓ Docker containers already running');\r\n return;\r\n }\r\n } catch {\r\n // Containers not running, will start them\r\n }\r\n\r\n console.log(' ⏳ Starting containers...');\r\n \r\n try {\r\n await $`docker compose -f ${fullPath} up -d --quiet-pull`;\r\n console.log(' ✓ Docker containers started');\r\n } catch (error) {\r\n throw new Error(`Failed to start Docker containers: ${error}`);\r\n }\r\n}\r\n"],"mappings":";;;;;;;AAEA,SAAS,KAAAA,UAAS;AAClB,OAAOC,WAAU;AACjB,SAAS,aAAa;;;ACJtB,SAAS,SAAS;AAIlB,IAAM,uBAAuB;AAAA,EAC3B;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AACF;AAEA,eAAsB,UAAU,OAAgC;AAC9D,QAAM,YAAY,QAAQ,aAAa;AACvC,MAAI,YAAY;AAGhB,QAAM,cAAc,MAAM,OAAO,UAAQ,CAAC,qBAAqB,SAAS,IAAI,CAAC;AAC7E,QAAM,cAAc,MAAM,OAAO,UAAQ,qBAAqB,SAAS,IAAI,CAAC;AAE5E,MAAI,YAAY,SAAS,GAAG;AAC1B,YAAQ,IAAI,kDAAwC,YAAY,KAAK,IAAI,CAAC,EAAE;AAAA,EAC9E;AAEA,aAAW,QAAQ,aAAa;AAC9B,QAAI;AACF,UAAI,WAAW;AAEb,cAAM,SAAS,MAAM,4BAA4B,IAAI,uBAAuB,KAAK,EAAE,MAAM,MAAM,EAAE;AAEjG,YAAI,OAAO,KAAK,GAAG;AACjB,gBAAM,QAAQ,OAAO,KAAK,EAAE,MAAM,IAAI;AACtC,gBAAM,OAAO,oBAAI,IAAY;AAE7B,qBAAW,QAAQ,OAAO;AACxB,kBAAM,QAAQ,KAAK,KAAK,EAAE,MAAM,KAAK;AACrC,kBAAM,MAAM,MAAM,MAAM,SAAS,CAAC;AAClC,gBAAI,OAAO,QAAQ,KAAK;AACtB,mBAAK,IAAI,GAAG;AAAA,YACd;AAAA,UACF;AAEA,qBAAW,OAAO,MAAM;AACtB,gBAAI;AACF,oBAAM,kBAAkB,GAAG,MAAM,MAAM;AACvC,sBAAQ,IAAI,2BAAsB,GAAG,YAAY,IAAI,EAAE;AACvD,0BAAY;AAAA,YACd,QAAQ;AAAA,YAER;AAAA,UACF;AAAA,QACF;AAAA,MACF,OAAO;AAEL,YAAI;AACF,gBAAM,SAAS,MAAM,cAAc,IAAI,GAAG,KAAK,EAAE,MAAM,MAAM,EAAE;AAE/D,cAAI,OAAO,KAAK,GAAG;AACjB,kBAAM,OAAO,OAAO,KAAK,EAAE,MAAM,IAAI,EAAE,OAAO,OAAO;AACrD,uBAAW,OAAO,MAAM;AACtB,kBAAI;AACF,sBAAM,YAAY,GAAG,GAAG,MAAM;AAC9B,wBAAQ,IAAI,2BAAsB,GAAG,YAAY,IAAI,EAAE;AACvD,4BAAY;AAAA,cACd,QAAQ;AAAA,cAER;AAAA,YACF;AAAA,UACF;AAAA,QACF,QAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,MAAI,WAAW;AACb,YAAQ,IAAI,wBAAmB;AAAA,EACjC,WAAW,YAAY,SAAS,GAAG;AACjC,YAAQ,IAAI,6BAAwB,YAAY,KAAK,IAAI,CAAC,EAAE;AAAA,EAC9D;AACF;;;ACxFA,SAAS,KAAAC,UAAS;AAClB,OAAO,UAAU;AAEjB,eAAe,kBAAoC;AACjD,MAAI;AAGF,UAAM,OAAO,IAAI,MAAM,CAAC,UAAU,QAAQ,YAAY,oBAAoB,GAAG;AAAA,MAC3E,QAAQ;AAAA,MACR,QAAQ;AAAA,IACV,CAAC;AAGD,UAAM,UAAU,IAAI,QAAgB,CAAC,YAAY,WAAW,MAAM,QAAQ,CAAC,GAAG,GAAI,CAAC;AACnF,UAAM,WAAW,MAAM,QAAQ,KAAK,CAAC,KAAK,QAAQ,OAAO,CAAC;AAE1D,WAAO,aAAa;AAAA,EACtB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,qBAAoC;AACjD,QAAM,YAAY,QAAQ,aAAa;AACvC,QAAM,QAAQ,QAAQ,aAAa;AAEnC,MAAI,WAAW;AAEb,UAAM,QAAQ;AAAA,MACZ,GAAG,QAAQ,IAAI,YAAY;AAAA,MAC3B,GAAG,QAAQ,IAAI,YAAY;AAAA,IAC7B;AAEA,eAAW,cAAc,OAAO;AAC9B,YAAM,OAAO,IAAI,KAAK,UAAU;AAChC,UAAI,MAAM,KAAK,OAAO,GAAG;AACvB,YAAI,MAAM,CAAC,UAAU,GAAG,EAAE,QAAQ,UAAU,QAAQ,SAAS,CAAC;AAC9D;AAAA,MACF;AAAA,IACF;AAAA,EACF,WAAW,OAAO;AAChB,QAAI;AACF,YAAMA,mBAAkB,MAAM;AAAA,IAChC,QAAQ;AACN,YAAM,IAAI,MAAM,yCAAyC;AAAA,IAC3D;AAAA,EACF,OAAO;AAEL,QAAI;AACF,YAAMA,gCAA+B,MAAM;AAAA,IAC7C,QAAQ;AACN,YAAM,IAAI,MAAM,wCAAwC;AAAA,IAC1D;AAAA,EACF;AAGA,QAAM,cAAc;AAEpB,WAAS,IAAI,GAAG,IAAI,aAAa,KAAK;AACpC,UAAM,IAAI,MAAM,GAAI;AACpB,QAAI,MAAM,gBAAgB,GAAG;AAC3B;AAAA,IACF;AAAA,EACF;AAEA,QAAM,IAAI,MAAM,wCAAwC;AAC1D;AAEA,eAAsB,eAA8B;AAGlD,MAAI,MAAM,gBAAgB,GAAG;AAC3B,YAAQ,IAAI,4BAAuB;AACnC;AAAA,EACF;AAGA,UAAQ,IAAI,oCAA+B;AAC3C,QAAM,IAAI,MAAM,GAAI;AAEpB,MAAI,MAAM,gBAAgB,GAAG;AAC3B,YAAQ,IAAI,4BAAuB;AACnC;AAAA,EACF;AAGA,UAAQ,IAAI,qCAAgC;AAC5C,QAAM,mBAAmB;AACzB,UAAQ,IAAI,yBAAoB;AAClC;AAEA,eAAsB,sBAAsB,aAAoC;AAC9E,QAAM,WAAW,KAAK,QAAQ,QAAQ,IAAI,GAAG,WAAW;AAExD,MAAI;AAEF,UAAM,SAAS,MAAMA,uBAAsB,QAAQ,4BAA4B,KAAK,EAAE,MAAM,MAAM,EAAE;AAEpG,UAAM,SAAS,OAAO,KAAK,EAAE,MAAM,IAAI,EAAE,OAAO,OAAO;AACvD,UAAM,aAAa,OAAO,SAAS,KAAK,OAAO,MAAM,WAAS,UAAU,SAAS;AAEjF,QAAI,YAAY;AACd,cAAQ,IAAI,4CAAuC;AACnD;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAER;AAEA,UAAQ,IAAI,iCAA4B;AAExC,MAAI;AACF,UAAMA,uBAAsB,QAAQ;AACpC,YAAQ,IAAI,oCAA+B;AAAA,EAC7C,SAAS,OAAO;AACd,UAAM,IAAI,MAAM,sCAAsC,KAAK,EAAE;AAAA,EAC/D;AACF;;;AF1GA,IAAM,OAAO,IAAI,KAAK,MAAM,CAAC;AAC7B,IAAM,UAAU,KAAK,CAAC;AAGtB,IAAM,qBAA8C;AAAA,EAClD,MAAM;AAAA,EACN,eAAe;AAAA,EACf,OAAO,CAAC,MAAM,IAAI;AAAA,EAClB,WAAW;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AACF;AAEA,eAAe,eAAiD;AAC9D,QAAM,aAAaC,MAAK,KAAK,QAAQ,IAAI,GAAG,gBAAgB;AAC5D,QAAM,OAAO,IAAI,KAAK,UAAU;AAEhC,MAAI,CAAE,MAAM,KAAK,OAAO,GAAI;AAC1B,YAAQ,KAAK,wDAA8C;AAC3D,WAAO;AAAA,EACT;AAEA,MAAI;AAGF,UAAM,UAAU,MAAM,KAAK,KAAK;AAGhC,UAAM,WAAW,QAAQ,MAAM,wCAAwC;AAEvE,QAAI,UAAU;AACZ,YAAM,aAAa,SAAS,CAAC;AAG7B,YAAM,YAAY,WAAW,MAAM,eAAe;AAClD,YAAM,qBAAqB,WAAW,MAAM,mCAAmC;AAC/E,YAAM,aAAa,WAAW,MAAM,uBAAuB;AAC3D,YAAM,qBAAqB,WAAW,MAAM,0BAA0B;AACtE,YAAM,sBAAsB,WAAW,MAAM,uBAAuB;AAEpE,aAAO;AAAA,QACL,MAAM,YAAY,SAAS,UAAU,CAAC,CAAC,IAAI,mBAAmB;AAAA,QAC9D,eAAe,qBAAqB,mBAAmB,CAAC,IAAI,mBAAmB;AAAA,QAC/E,OAAO,aACH,WAAW,CAAC,EAAE,MAAM,GAAG,EAAE,IAAI,OAAK,SAAS,EAAE,KAAK,CAAC,CAAC,EAAE,OAAO,OAAK,CAAC,MAAM,CAAC,CAAC,IAC3E,mBAAmB;AAAA,QACvB,WAAW;AAAA,UACT,MAAM,qBAAqB,mBAAmB,CAAC,IAAI,mBAAmB,UAAU;AAAA,UAChF,OAAO,sBAAsB,oBAAoB,CAAC,MAAM,SAAS,mBAAmB,UAAU;AAAA,QAChG;AAAA,MACF;AAAA,IACF;AAAA,EACF,SAAS,KAAK;AAAA,EAEd;AAEA,SAAO;AACT;AAEA,eAAeC,eAAc;AAC3B,QAAM,YAAc,EAAE,OAAO,KAAK,CAAC;AACrC;AAEA,eAAe,MAAM;AACnB,QAAM,SAAS,MAAM,aAAa;AAElC,UAAQ,IAAI,iDAA0C;AAGtD,UAAQ,IAAI,6BAAsB;AAClC,QAAM,UAAU,OAAO,SAAS,CAAC,MAAM,IAAI,CAAC;AAG5C,UAAQ,IAAI,8BAAuB;AACnC,QAAM,aAAa;AAGnB,MAAI,OAAO,eAAe;AACxB,YAAQ,IAAI,yCAAkC;AAC9C,UAAM,sBAAsB,OAAO,aAAa;AAAA,EAClD;AAGA,QAAMA,aAAY;AAElB,UAAQ,IAAI,iDAA4C;AAGxD,QAAM,SAAS;AAAA,IACb,OAAO;AAAA;AAAA,IACP,QAAQ;AAAA;AAAA,IACR,WAAW;AAAA;AAAA,IACX,OAAO;AAAA,EACT;AAGA,MAAI,gBAA8B;AAClC,QAAM,UAAUD,MAAK,KAAK,QAAQ,IAAI,GAAG,KAAK;AAE9C,QAAM,UAAU,MAAM,SAAS,EAAE,WAAW,KAAK,GAAG,OAAO,OAAO,aAAa;AAC7E,QAAI,UAAU,SAAS,KAAK,GAAG;AAC7B,UAAI,cAAe,cAAa,aAAa;AAC7C,sBAAgB,WAAW,YAAY;AACrC,gBAAQ,IAAI,GAAG,OAAO,KAAK,UAAU,OAAO,KAAK,kBAAkB,QAAQ,EAAE;AAC7E,YAAI;AACF,gBAAM,YAAc;AACpB,kBAAQ,IAAI,GAAG,OAAO,KAAK,UAAU,OAAO,KAAK,oBAAoB;AAAA,QACvE,SAAS,KAAK;AACZ,kBAAQ,MAAM,GAAG,OAAO,KAAK,UAAU,OAAO,KAAK,kBAAkB;AAAA,QACvE;AAAA,MACF,GAAG,GAAG;AAAA,IACR;AAAA,EACF,CAAC;AAED,UAAQ,IAAI,GAAG,OAAO,KAAK,UAAU,OAAO,KAAK,sCAAsC;AAGvF,QAAM,aAAa,IAAI,MAAM,CAAC,OAAO,WAAW,gBAAgB,GAAG;AAAA,IACjE,KAAK,QAAQ,IAAI;AAAA,IACjB,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV,CAAC;AAGD,GAAC,YAAY;AACX,UAAM,SAAS,WAAW,OAAO,UAAU;AAC3C,UAAM,UAAU,IAAI,YAAY;AAChC,WAAO,MAAM;AACX,YAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,UAAI,KAAM;AACV,YAAM,OAAO,QAAQ,OAAO,KAAK;AAEjC,UAAI,CAAC,KAAK,SAAS,YAAY,KAAK,CAAC,KAAK,SAAS,qBAAqB,GAAG;AACzE,aAAK,MAAM,IAAI,EAAE,OAAO,OAAO,EAAE,QAAQ,UAAQ;AAC/C,kBAAQ,IAAI,GAAG,OAAO,MAAM,WAAW,OAAO,KAAK,IAAI,IAAI,EAAE;AAAA,QAC/D,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF,GAAG;AAEH,GAAC,YAAY;AACX,UAAM,SAAS,WAAW,OAAO,UAAU;AAC3C,UAAM,UAAU,IAAI,YAAY;AAChC,WAAO,MAAM;AACX,YAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,UAAI,KAAM;AACV,YAAM,OAAO,QAAQ,OAAO,KAAK;AAEjC,UAAI,CAAC,KAAK,SAAS,YAAY,KAAK,CAAC,KAAK,SAAS,qBAAqB,GAAG;AACzE,aAAK,MAAM,IAAI,EAAE,OAAO,OAAO,EAAE,QAAQ,UAAQ;AAC/C,kBAAQ,MAAM,GAAG,OAAO,MAAM,WAAW,OAAO,KAAK,IAAI,IAAI,EAAE;AAAA,QACjE,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF,GAAG;AAGH,MAAI,gBAA8D;AAElE,MAAI,OAAO,WAAW,SAAS,OAAO,WAAW,MAAM;AACrD,UAAM,gBAAgBA,MAAK,QAAQ,QAAQ,IAAI,GAAG,OAAO,UAAU,IAAI;AACvE,UAAM,gBAAgB,IAAI,KAAKA,MAAK,KAAK,eAAe,cAAc,CAAC;AAEvE,QAAI,MAAM,cAAc,OAAO,GAAG;AAChC,sBAAgB,IAAI,MAAM,CAAC,OAAO,KAAK,GAAG;AAAA,QACxC,KAAK;AAAA,QACL,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV,CAAC;AAED,YAAM,WAAW,cAAc;AAC/B,YAAM,WAAW,cAAc;AAE/B,UAAI,YAAY,OAAO,aAAa,UAAU;AAC5C,SAAC,YAAY;AACX,gBAAM,SAAS,SAAS,UAAU;AAClC,gBAAM,UAAU,IAAI,YAAY;AAChC,iBAAO,MAAM;AACX,kBAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,gBAAI,KAAM;AACV,kBAAM,OAAO,QAAQ,OAAO,KAAK;AACjC,iBAAK,MAAM,IAAI,EAAE,OAAO,OAAO,EAAE,QAAQ,UAAQ;AAC/C,sBAAQ,IAAI,GAAG,OAAO,SAAS,cAAc,OAAO,KAAK,IAAI,IAAI,EAAE;AAAA,YACrE,CAAC;AAAA,UACH;AAAA,QACF,GAAG;AAAA,MACL;AAEA,UAAI,YAAY,OAAO,aAAa,UAAU;AAC5C,SAAC,YAAY;AACX,gBAAM,SAAS,SAAS,UAAU;AAClC,gBAAM,UAAU,IAAI,YAAY;AAChC,iBAAO,MAAM;AACX,kBAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,gBAAI,KAAM;AACV,kBAAM,OAAO,QAAQ,OAAO,KAAK;AACjC,iBAAK,MAAM,IAAI,EAAE,OAAO,OAAO,EAAE,QAAQ,UAAQ;AAC/C,sBAAQ,MAAM,GAAG,OAAO,SAAS,cAAc,OAAO,KAAK,IAAI,IAAI,EAAE;AAAA,YACvE,CAAC;AAAA,UACH;AAAA,QACF,GAAG;AAAA,MACL;AAAA,IACF;AAAA,EACF;AAGA,UAAQ,GAAG,UAAU,MAAM;AACzB,YAAQ,IAAI,gCAAyB;AACrC,YAAQ,MAAM;AACd,eAAW,KAAK;AAChB,mBAAe,KAAK;AACpB,YAAQ,KAAK,CAAC;AAAA,EAChB,CAAC;AAED,UAAQ,GAAG,WAAW,MAAM;AAC1B,YAAQ,MAAM;AACd,eAAW,KAAK;AAChB,mBAAe,KAAK;AACpB,YAAQ,KAAK,CAAC;AAAA,EAChB,CAAC;AAGD,QAAM,WAAW;AACnB;AAEA,eAAe,QAAQ;AACrB,UAAQ,IAAI,sCAA+B;AAE3C,QAAMC,aAAY;AAElB,UAAQ,IAAI,mCAA4B;AACxC,QAAMC;AAEN,UAAQ,IAAI,oCAA6B;AACzC,QAAMA;AAEN,UAAQ,IAAI,0BAAqB;AACnC;AAEA,eAAe,QAAQ;AACrB,UAAQ,IAAI,qCAA8B;AAC1C,QAAMA;AACR;AAEA,eAAe,WAAW;AACxB,QAAMD,aAAY;AACpB;AAEA,eAAe,OAAO;AACpB,MAAI;AACF,YAAQ,SAAS;AAAA,MACf,KAAK;AACH,cAAM,IAAI;AACV;AAAA,MACF,KAAK;AACH,cAAM,MAAM;AACZ;AAAA,MACF,KAAK;AACH,cAAM,MAAM;AACZ;AAAA,MACF,KAAK;AACH,cAAM,SAAS;AACf;AAAA,MACF,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,gBAAQ,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAanB;AACO;AAAA,MACF;AACE,gBAAQ,MAAM,oBAAoB,OAAO,EAAE;AAC3C,gBAAQ,IAAI,0CAA0C;AACtD,gBAAQ,KAAK,CAAC;AAAA,IAClB;AAAA,EACF,SAAS,OAAO;AACd,YAAQ,MAAM,UAAU,KAAK;AAC7B,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEA,KAAK;","names":["$","path","$","path","runPrebuild","$"]}
|