@drzl/cli 1.0.0 ā 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -0
- package/dist/cli.cjs +151 -68
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +153 -68
- package/dist/cli.js.map +1 -1
- package/package.json +11 -7
package/dist/cli.js
CHANGED
|
@@ -8,14 +8,91 @@ import {
|
|
|
8
8
|
// src/cli.ts
|
|
9
9
|
import { SchemaAnalyzer } from "@drzl/analyzer";
|
|
10
10
|
import { ORPCGenerator } from "@drzl/generator-orpc";
|
|
11
|
-
import
|
|
11
|
+
import chalk2 from "chalk";
|
|
12
12
|
import chokidar from "chokidar";
|
|
13
13
|
import cliProgress from "cli-progress";
|
|
14
14
|
import { Command } from "commander";
|
|
15
|
-
import * as
|
|
15
|
+
import * as path2 from "path";
|
|
16
16
|
import ora from "ora";
|
|
17
|
+
|
|
18
|
+
// src/sponsor.ts
|
|
19
|
+
import chalk from "chalk";
|
|
20
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
|
|
21
|
+
import path from "path";
|
|
22
|
+
var CACHE_DIR = path.join(process.cwd(), "node_modules", ".cache", "@drzl");
|
|
23
|
+
var CACHE_FILE = path.join(CACHE_DIR, "sponsor-message.json");
|
|
24
|
+
var DEFAULT_INTERVAL_MS = 1e3 * 60 * 15;
|
|
25
|
+
var shownThisProcess = false;
|
|
26
|
+
var tips = [
|
|
27
|
+
"Pair DRZL watch mode with drizzle-kit to keep schema & API synced.",
|
|
28
|
+
"Templatize your ORPC routers to roll out new endpoints safely.",
|
|
29
|
+
"Need typed validators? Enable the zod, valibot, or arktype generators.",
|
|
30
|
+
"Use output headers to track generated files and trim noisy diffs."
|
|
31
|
+
];
|
|
32
|
+
var green = (msg) => chalk.hex("#6ee7b7")(msg);
|
|
33
|
+
var cyan = (msg) => chalk.cyan(msg);
|
|
34
|
+
var gray = (msg) => chalk.gray(msg);
|
|
35
|
+
function maybeShowSponsorMessage({
|
|
36
|
+
reason = "generate",
|
|
37
|
+
minIntervalMs = DEFAULT_INTERVAL_MS,
|
|
38
|
+
force = false
|
|
39
|
+
} = {}) {
|
|
40
|
+
const hideViaEnv = process.env.DRZL_HIDE_SPONSOR?.toLowerCase();
|
|
41
|
+
const hideRequested = hideViaEnv === "1" || hideViaEnv === "true";
|
|
42
|
+
if (hideRequested || process.env.CI && !force || shownThisProcess && !force) return;
|
|
43
|
+
try {
|
|
44
|
+
mkdirSync(CACHE_DIR, { recursive: true });
|
|
45
|
+
const payload = readCache();
|
|
46
|
+
payload.runs += 1;
|
|
47
|
+
const now = Date.now();
|
|
48
|
+
const shouldShow = force || now - (payload.lastShownAt ?? 0) >= minIntervalMs;
|
|
49
|
+
if (shouldShow) {
|
|
50
|
+
payload.lastShownAt = now;
|
|
51
|
+
payload.lastReason = reason;
|
|
52
|
+
}
|
|
53
|
+
writeCache(payload);
|
|
54
|
+
if (!shouldShow) return;
|
|
55
|
+
shownThisProcess = true;
|
|
56
|
+
const tip = tips[payload.runs % tips.length];
|
|
57
|
+
console.log(
|
|
58
|
+
`
|
|
59
|
+
${cyan(`\u{1F680} DRZL finished a ${reason} run (#${payload.runs.toLocaleString()}).`)}
|
|
60
|
+
|
|
61
|
+
${green("\u2728 Sponsors keep DRZL shipping. Consider supporting ongoing dev:")}
|
|
62
|
+
${green("GitHub Sponsors")} ${gray("\u2192 https://github.com/sponsors/omar-dulaimi")}
|
|
63
|
+
|
|
64
|
+
${green("Pro tip:")} ${tip}
|
|
65
|
+
`
|
|
66
|
+
);
|
|
67
|
+
} catch {
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
function readCache() {
|
|
71
|
+
if (!existsSync(CACHE_FILE)) {
|
|
72
|
+
return { runs: 0 };
|
|
73
|
+
}
|
|
74
|
+
try {
|
|
75
|
+
const data = JSON.parse(readFileSync(CACHE_FILE, "utf8"));
|
|
76
|
+
if (typeof data.runs !== "number") return { runs: 0 };
|
|
77
|
+
return data;
|
|
78
|
+
} catch {
|
|
79
|
+
return { runs: 0 };
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
function writeCache(payload) {
|
|
83
|
+
writeFileSync(CACHE_FILE, JSON.stringify(payload, null, 2), "utf8");
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// src/cli.ts
|
|
17
87
|
var program = new Command();
|
|
18
88
|
program.name("drzl").description("DRZL - Drizzle Developer Toolkit").version("0.0.1");
|
|
89
|
+
program.addHelpText(
|
|
90
|
+
"afterAll",
|
|
91
|
+
`
|
|
92
|
+
Need a template, adapter, or generator DRZL doesn't ship yet?
|
|
93
|
+
\u2192 DM @omardulaimidev on X: https://x.com/omardulaimidev
|
|
94
|
+
`
|
|
95
|
+
);
|
|
19
96
|
program.command("analyze").argument("<schema>", "path to drizzle schema (TS)").option("--relations", "include relations", true).option("--validate", "validate constraints", true).option("--out <file>", "write analysis JSON to file").option("--json", "print JSON to stdout (overrides --out)", false).action(async (schema, opts) => {
|
|
20
97
|
try {
|
|
21
98
|
const analyzer = new SchemaAnalyzer(schema);
|
|
@@ -32,9 +109,9 @@ program.command("analyze").argument("<schema>", "path to drizzle schema (TS)").o
|
|
|
32
109
|
} else if (opts.out) {
|
|
33
110
|
const fs = await import("fs/promises");
|
|
34
111
|
await fs.writeFile(opts.out, json, "utf8");
|
|
35
|
-
spinner?.succeed(
|
|
112
|
+
spinner?.succeed(chalk2.green(`Analysis written to ${opts.out} in ${ms}ms`));
|
|
36
113
|
} else {
|
|
37
|
-
spinner?.succeed(
|
|
114
|
+
spinner?.succeed(chalk2.green(`Analyzed in ${ms}ms`));
|
|
38
115
|
console.log(json);
|
|
39
116
|
}
|
|
40
117
|
process.exit(res.issues.some((i) => i.level === "error") ? 2 : 0);
|
|
@@ -44,7 +121,7 @@ program.command("analyze").argument("<schema>", "path to drizzle schema (TS)").o
|
|
|
44
121
|
console.log(JSON.stringify({ event: "error", code: "DRZL_CLI_ANALYZE", message: msg }));
|
|
45
122
|
else
|
|
46
123
|
console.error(
|
|
47
|
-
|
|
124
|
+
chalk2.red("Analyze failed (DRZL_CLI_ANALYZE):"),
|
|
48
125
|
msg,
|
|
49
126
|
"\nTip: run with --json for structured output."
|
|
50
127
|
);
|
|
@@ -56,7 +133,7 @@ program.command("generate").description("Run configured generators (drzl.config.
|
|
|
56
133
|
const cfg = await loadConfig(opts.config);
|
|
57
134
|
if (!cfg) {
|
|
58
135
|
console.error(
|
|
59
|
-
|
|
136
|
+
chalk2.red("No config found (DRZL_CFG_001). Create drzl.config.ts or pass --config.")
|
|
60
137
|
);
|
|
61
138
|
process.exit(2);
|
|
62
139
|
return;
|
|
@@ -91,8 +168,8 @@ program.command("generate").description("Run configured generators (drzl.config.
|
|
|
91
168
|
onProgress: ({ index }) => progress.update(index)
|
|
92
169
|
});
|
|
93
170
|
progress.stop();
|
|
94
|
-
ora().succeed(
|
|
95
|
-
files.forEach((f) => console.log(" -",
|
|
171
|
+
ora().succeed(chalk2.green(`Generated (${g.kind}): ${files.length} files`));
|
|
172
|
+
files.forEach((f) => console.log(" -", chalk2.cyan(f)));
|
|
96
173
|
} else if (g.kind === "service") {
|
|
97
174
|
try {
|
|
98
175
|
const { ServiceGenerator } = await import("@drzl/generator-service");
|
|
@@ -107,15 +184,15 @@ program.command("generate").description("Run configured generators (drzl.config.
|
|
|
107
184
|
schemaImportPath: g.schemaImportPath
|
|
108
185
|
});
|
|
109
186
|
progress.stop();
|
|
110
|
-
ora().succeed(
|
|
111
|
-
files.forEach((f) => console.log(" -",
|
|
187
|
+
ora().succeed(chalk2.green(`Generated (service): ${files.length} files`));
|
|
188
|
+
files.forEach((f) => console.log(" -", chalk2.cyan(f)));
|
|
112
189
|
} catch (e) {
|
|
113
190
|
progress.stop();
|
|
114
191
|
console.error(
|
|
115
|
-
|
|
116
|
-
|
|
192
|
+
chalk2.red("Service generator missing."),
|
|
193
|
+
chalk2.yellow("\nInstall with: npm install @drzl/generator-service")
|
|
117
194
|
);
|
|
118
|
-
console.error(
|
|
195
|
+
console.error(chalk2.gray("Error details:"), e?.message ?? e);
|
|
119
196
|
process.exit(1);
|
|
120
197
|
}
|
|
121
198
|
} else if (g.kind === "zod") {
|
|
@@ -131,15 +208,15 @@ program.command("generate").description("Run configured generators (drzl.config.
|
|
|
131
208
|
fileSuffix: g.fileSuffix
|
|
132
209
|
});
|
|
133
210
|
progress.stop();
|
|
134
|
-
ora().succeed(
|
|
135
|
-
files.forEach((f) => console.log(" -",
|
|
211
|
+
ora().succeed(chalk2.green(`Generated (zod): ${files.length} files`));
|
|
212
|
+
files.forEach((f) => console.log(" -", chalk2.cyan(f)));
|
|
136
213
|
} catch (e) {
|
|
137
214
|
progress.stop();
|
|
138
215
|
console.error(
|
|
139
|
-
|
|
140
|
-
|
|
216
|
+
chalk2.red("Zod generator missing."),
|
|
217
|
+
chalk2.yellow("\nInstall with: npm install @drzl/generator-zod")
|
|
141
218
|
);
|
|
142
|
-
console.error(
|
|
219
|
+
console.error(chalk2.gray("Error details:"), e?.message ?? e);
|
|
143
220
|
process.exit(1);
|
|
144
221
|
}
|
|
145
222
|
} else if (g.kind === "valibot") {
|
|
@@ -155,15 +232,15 @@ program.command("generate").description("Run configured generators (drzl.config.
|
|
|
155
232
|
fileSuffix: g.fileSuffix
|
|
156
233
|
});
|
|
157
234
|
progress.stop();
|
|
158
|
-
ora().succeed(
|
|
159
|
-
files.forEach((f) => console.log(" -",
|
|
235
|
+
ora().succeed(chalk2.green(`Generated (valibot): ${files.length} files`));
|
|
236
|
+
files.forEach((f) => console.log(" -", chalk2.cyan(f)));
|
|
160
237
|
} catch (e) {
|
|
161
238
|
progress.stop();
|
|
162
239
|
console.error(
|
|
163
|
-
|
|
164
|
-
|
|
240
|
+
chalk2.red("Valibot generator missing."),
|
|
241
|
+
chalk2.yellow("\nInstall with: npm install @drzl/generator-valibot")
|
|
165
242
|
);
|
|
166
|
-
console.error(
|
|
243
|
+
console.error(chalk2.gray("Error details:"), e?.message ?? e);
|
|
167
244
|
process.exit(1);
|
|
168
245
|
}
|
|
169
246
|
} else if (g.kind === "arktype") {
|
|
@@ -179,22 +256,25 @@ program.command("generate").description("Run configured generators (drzl.config.
|
|
|
179
256
|
fileSuffix: g.fileSuffix
|
|
180
257
|
});
|
|
181
258
|
progress.stop();
|
|
182
|
-
ora().succeed(
|
|
183
|
-
files.forEach((f) => console.log(" -",
|
|
259
|
+
ora().succeed(chalk2.green(`Generated (arktype): ${files.length} files`));
|
|
260
|
+
files.forEach((f) => console.log(" -", chalk2.cyan(f)));
|
|
184
261
|
} catch (e) {
|
|
185
262
|
progress.stop();
|
|
186
263
|
console.error(
|
|
187
|
-
|
|
188
|
-
|
|
264
|
+
chalk2.red("ArkType generator missing."),
|
|
265
|
+
chalk2.yellow("\nInstall with: npm install @drzl/generator-arktype")
|
|
189
266
|
);
|
|
190
|
-
console.error(
|
|
267
|
+
console.error(chalk2.gray("Error details:"), e?.message ?? e);
|
|
191
268
|
process.exit(1);
|
|
192
269
|
}
|
|
193
270
|
}
|
|
194
271
|
}
|
|
272
|
+
if (cfg.generators.length) {
|
|
273
|
+
maybeShowSponsorMessage({ reason: "generate" });
|
|
274
|
+
}
|
|
195
275
|
} catch (e) {
|
|
196
276
|
console.error(
|
|
197
|
-
|
|
277
|
+
chalk2.red("Generate failed (DRZL_GEN_001):"),
|
|
198
278
|
e?.message ?? e,
|
|
199
279
|
"\nTip: check your drzl.config.ts and template path."
|
|
200
280
|
);
|
|
@@ -214,23 +294,24 @@ program.command("generate:orpc").argument("<schema>", "path to drizzle schema (T
|
|
|
214
294
|
template: opts.template,
|
|
215
295
|
includeRelations: !!opts.includeRelations
|
|
216
296
|
});
|
|
217
|
-
console.log(
|
|
297
|
+
console.log(chalk2.green(`Generated:`), files.map((f) => chalk2.cyan(f)).join(", "));
|
|
298
|
+
maybeShowSponsorMessage({ reason: "generate:orpc" });
|
|
218
299
|
} catch (e) {
|
|
219
|
-
console.error(
|
|
300
|
+
console.error(chalk2.red("Generate orpc failed:"), e?.message ?? e);
|
|
220
301
|
process.exit(1);
|
|
221
302
|
}
|
|
222
303
|
});
|
|
223
304
|
program.command("watch").description("Watch schema and regenerate on changes").option("-c, --config <path>", "path to drzl.config").option("--pipeline <name>", "all | analyze | generate-orpc", "all").option("--debounce <ms>", "debounce ms", "200").option("--json", "emit JSON logs", false).option("--poll", "force polling (helps WSL/Docker/remote FS)", false).action(async (opts) => {
|
|
224
305
|
let cfg = await loadConfig(opts.config);
|
|
225
306
|
if (!cfg) {
|
|
226
|
-
console.error(
|
|
307
|
+
console.error(chalk2.red("No config found. Create drzl.config.ts or pass --config."));
|
|
227
308
|
process.exit(2);
|
|
228
309
|
return;
|
|
229
310
|
}
|
|
230
|
-
const abs = (p) =>
|
|
311
|
+
const abs = (p) => path2.resolve(process.cwd(), p);
|
|
231
312
|
const isInside = (child, parent) => {
|
|
232
|
-
const rel =
|
|
233
|
-
return !!rel && !rel.startsWith("..") && !
|
|
313
|
+
const rel = path2.relative(parent, child);
|
|
314
|
+
return !!rel && !rel.startsWith("..") && !path2.isAbsolute(rel);
|
|
234
315
|
};
|
|
235
316
|
const ignoredOutDirs = new Set(computeGeneratorOutputDirs(cfg).map(abs));
|
|
236
317
|
const currentTargets = new Set(computeWatchTargets(cfg).map(abs));
|
|
@@ -309,7 +390,7 @@ program.command("watch").description("Watch schema and regenerate on changes").o
|
|
|
309
390
|
})
|
|
310
391
|
);
|
|
311
392
|
} else {
|
|
312
|
-
console.log(
|
|
393
|
+
console.log(chalk2.green("Analyze complete."));
|
|
313
394
|
}
|
|
314
395
|
return;
|
|
315
396
|
}
|
|
@@ -331,8 +412,8 @@ program.command("watch").description("Watch schema and regenerate on changes").o
|
|
|
331
412
|
validation: g.validation
|
|
332
413
|
});
|
|
333
414
|
opts.json ? console.log(JSON.stringify({ event: "generate_complete", kind: g.kind, files })) : console.log(
|
|
334
|
-
|
|
335
|
-
files.map((f) =>
|
|
415
|
+
chalk2.green(`Generated (${g.kind}):`),
|
|
416
|
+
files.map((f) => chalk2.cyan(f)).join(", ")
|
|
336
417
|
);
|
|
337
418
|
newFiles.push(...files);
|
|
338
419
|
} else if (g.kind === "service") {
|
|
@@ -349,16 +430,16 @@ program.command("watch").description("Watch schema and regenerate on changes").o
|
|
|
349
430
|
schemaImportPath: g.schemaImportPath
|
|
350
431
|
});
|
|
351
432
|
opts.json ? console.log(JSON.stringify({ event: "generate_complete", kind: g.kind, files })) : console.log(
|
|
352
|
-
|
|
353
|
-
files.map((f) =>
|
|
433
|
+
chalk2.green(`Generated (service): ${files.length} files`),
|
|
434
|
+
files.map((f) => chalk2.cyan(f)).join(", ")
|
|
354
435
|
);
|
|
355
436
|
newFiles.push(...files);
|
|
356
437
|
} catch (e) {
|
|
357
438
|
console.error(
|
|
358
|
-
|
|
359
|
-
|
|
439
|
+
chalk2.red("Service generator missing."),
|
|
440
|
+
chalk2.yellow("\nInstall with: npm install @drzl/generator-service")
|
|
360
441
|
);
|
|
361
|
-
console.error(
|
|
442
|
+
console.error(chalk2.gray("Error details:"), e?.message ?? e);
|
|
362
443
|
return;
|
|
363
444
|
}
|
|
364
445
|
} else if (g.kind === "zod") {
|
|
@@ -374,16 +455,16 @@ program.command("watch").description("Watch schema and regenerate on changes").o
|
|
|
374
455
|
fileSuffix: g.fileSuffix
|
|
375
456
|
});
|
|
376
457
|
opts.json ? console.log(JSON.stringify({ event: "generate_complete", kind: g.kind, files })) : console.log(
|
|
377
|
-
|
|
378
|
-
files.map((f) =>
|
|
458
|
+
chalk2.green(`Generated (zod): ${files.length} files`),
|
|
459
|
+
files.map((f) => chalk2.cyan(f)).join(", ")
|
|
379
460
|
);
|
|
380
461
|
newFiles.push(...files);
|
|
381
462
|
} catch (e) {
|
|
382
463
|
console.error(
|
|
383
|
-
|
|
384
|
-
|
|
464
|
+
chalk2.red("Zod generator missing."),
|
|
465
|
+
chalk2.yellow("\nInstall with: npm install @drzl/generator-zod")
|
|
385
466
|
);
|
|
386
|
-
console.error(
|
|
467
|
+
console.error(chalk2.gray("Error details:"), e?.message ?? e);
|
|
387
468
|
return;
|
|
388
469
|
}
|
|
389
470
|
} else if (g.kind === "valibot") {
|
|
@@ -399,16 +480,16 @@ program.command("watch").description("Watch schema and regenerate on changes").o
|
|
|
399
480
|
fileSuffix: g.fileSuffix
|
|
400
481
|
});
|
|
401
482
|
opts.json ? console.log(JSON.stringify({ event: "generate_complete", kind: g.kind, files })) : console.log(
|
|
402
|
-
|
|
403
|
-
files.map((f) =>
|
|
483
|
+
chalk2.green(`Generated (valibot): ${files.length} files`),
|
|
484
|
+
files.map((f) => chalk2.cyan(f)).join(", ")
|
|
404
485
|
);
|
|
405
486
|
newFiles.push(...files);
|
|
406
487
|
} catch (e) {
|
|
407
488
|
console.error(
|
|
408
|
-
|
|
409
|
-
|
|
489
|
+
chalk2.red("Valibot generator missing."),
|
|
490
|
+
chalk2.yellow("\nInstall with: npm install @drzl/generator-valibot")
|
|
410
491
|
);
|
|
411
|
-
console.error(
|
|
492
|
+
console.error(chalk2.gray("Error details:"), e?.message ?? e);
|
|
412
493
|
return;
|
|
413
494
|
}
|
|
414
495
|
} else if (g.kind === "arktype") {
|
|
@@ -424,16 +505,16 @@ program.command("watch").description("Watch schema and regenerate on changes").o
|
|
|
424
505
|
fileSuffix: g.fileSuffix
|
|
425
506
|
});
|
|
426
507
|
opts.json ? console.log(JSON.stringify({ event: "generate_complete", kind: g.kind, files })) : console.log(
|
|
427
|
-
|
|
428
|
-
files.map((f) =>
|
|
508
|
+
chalk2.green(`Generated (arktype): ${files.length} files`),
|
|
509
|
+
files.map((f) => chalk2.cyan(f)).join(", ")
|
|
429
510
|
);
|
|
430
511
|
newFiles.push(...files);
|
|
431
512
|
} catch (e) {
|
|
432
513
|
console.error(
|
|
433
|
-
|
|
434
|
-
|
|
514
|
+
chalk2.red("ArkType generator missing."),
|
|
515
|
+
chalk2.yellow("\nInstall with: npm install @drzl/generator-arktype")
|
|
435
516
|
);
|
|
436
|
-
console.error(
|
|
517
|
+
console.error(chalk2.gray("Error details:"), e?.message ?? e);
|
|
437
518
|
return;
|
|
438
519
|
}
|
|
439
520
|
}
|
|
@@ -441,12 +522,16 @@ program.command("watch").description("Watch schema and regenerate on changes").o
|
|
|
441
522
|
const added = newFiles.filter((f) => !lastFiles.includes(f));
|
|
442
523
|
const removed = lastFiles.filter((f) => !newFiles.includes(f));
|
|
443
524
|
opts.json ? console.log(JSON.stringify({ event: "diff", added, removed })) : (() => {
|
|
444
|
-
if (added.length) console.log(
|
|
445
|
-
if (removed.length) console.log(
|
|
525
|
+
if (added.length) console.log(chalk2.blue(`Added: ${added.join(", ")}`));
|
|
526
|
+
if (removed.length) console.log(chalk2.yellow(`Removed: ${removed.join(", ")}`));
|
|
446
527
|
})();
|
|
528
|
+
if (newFiles.length && !opts.json) {
|
|
529
|
+
const reason = opts.pipeline && opts.pipeline !== "all" ? `watch:${opts.pipeline}` : "watch";
|
|
530
|
+
maybeShowSponsorMessage({ reason });
|
|
531
|
+
}
|
|
447
532
|
lastFiles = newFiles;
|
|
448
533
|
} catch (e) {
|
|
449
|
-
opts.json ? console.log(JSON.stringify({ event: "error", message: String(e?.message ?? e) })) : console.error(
|
|
534
|
+
opts.json ? console.log(JSON.stringify({ event: "error", message: String(e?.message ?? e) })) : console.error(chalk2.red("Watch pipeline failed:"), e?.message ?? e);
|
|
450
535
|
}
|
|
451
536
|
};
|
|
452
537
|
const debounced = Number(opts.debounce) || 200;
|
|
@@ -471,18 +556,18 @@ program.command("watch").description("Watch schema and regenerate on changes").o
|
|
|
471
556
|
);
|
|
472
557
|
} else {
|
|
473
558
|
console.log(
|
|
474
|
-
|
|
475
|
-
"Watching:\n " + Array.from(currentTargets).map((p) =>
|
|
559
|
+
chalk2.gray(
|
|
560
|
+
"Watching:\n " + Array.from(currentTargets).map((p) => path2.relative(process.cwd(), p)).join("\n ")
|
|
476
561
|
)
|
|
477
562
|
);
|
|
478
563
|
}
|
|
479
|
-
watcher.on("add", (p) => trigger(p)).on("change", (p) => trigger(p)).on("unlink", (p) => trigger(p)).on("error", (err) => console.error(
|
|
564
|
+
watcher.on("add", (p) => trigger(p)).on("change", (p) => trigger(p)).on("unlink", (p) => trigger(p)).on("error", (err) => console.error(chalk2.red("Watcher error:"), err));
|
|
480
565
|
await run();
|
|
481
566
|
});
|
|
482
567
|
program.command("init").description("Scaffold a drzl.config.ts").option("-y, --yes", "accept defaults").action(async (_opts) => {
|
|
483
568
|
const fs = await import("fs/promises");
|
|
484
|
-
const
|
|
485
|
-
const target =
|
|
569
|
+
const path3 = await import("path");
|
|
570
|
+
const target = path3.resolve(process.cwd(), "drzl.config.ts");
|
|
486
571
|
const template = `export default {
|
|
487
572
|
schema: 'src/db/schema.ts',
|
|
488
573
|
outDir: 'src/api',
|
|
@@ -494,9 +579,9 @@ program.command("init").description("Scaffold a drzl.config.ts").option("-y, --y
|
|
|
494
579
|
`;
|
|
495
580
|
try {
|
|
496
581
|
await fs.writeFile(target, template, { flag: "wx" });
|
|
497
|
-
console.log(
|
|
582
|
+
console.log(chalk2.green(`Created ${target}`));
|
|
498
583
|
} catch (e) {
|
|
499
|
-
console.error(
|
|
584
|
+
console.error(chalk2.red("Init failed:"), e?.message ?? e);
|
|
500
585
|
process.exit(1);
|
|
501
586
|
}
|
|
502
587
|
});
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { SchemaAnalyzer } from '@drzl/analyzer';\nimport { ORPCGenerator } from '@drzl/generator-orpc';\nimport chalk from 'chalk';\nimport chokidar from 'chokidar';\nimport cliProgress from 'cli-progress';\nimport { Command } from 'commander';\nimport * as path from 'node:path';\nimport ora from 'ora';\nimport {\n computeGeneratorOutputDirs,\n computeWatchTargets,\n DrzlConfig,\n loadConfig,\n} from './config.js';\n\nconst program = new Command();\nprogram.name('drzl').description('DRZL - Drizzle Developer Toolkit').version('0.0.1');\n\nprogram\n .command('analyze')\n .argument('<schema>', 'path to drizzle schema (TS)')\n .option('--relations', 'include relations', true)\n .option('--validate', 'validate constraints', true)\n .option('--out <file>', 'write analysis JSON to file')\n .option('--json', 'print JSON to stdout (overrides --out)', false)\n .action(async (schema: string, opts: any) => {\n try {\n const analyzer = new SchemaAnalyzer(schema);\n const spinner = !opts.json ? ora('Analyzing schema...').start() : null;\n const start = Date.now();\n const res = await analyzer.analyze({\n includeRelations: !!opts.relations,\n validateConstraints: !!opts.validate,\n });\n const ms = Date.now() - start;\n const json = JSON.stringify(res, null, 2);\n if (opts.json) {\n console.log(json);\n } else if (opts.out) {\n const fs = await import('node:fs/promises');\n await fs.writeFile(opts.out, json, 'utf8');\n spinner?.succeed(chalk.green(`Analysis written to ${opts.out} in ${ms}ms`));\n } else {\n spinner?.succeed(chalk.green(`Analyzed in ${ms}ms`));\n console.log(json);\n }\n process.exit(res.issues.some((i) => i.level === 'error') ? 2 : 0);\n } catch (e: any) {\n const msg = e?.message ?? String(e);\n if (opts.json)\n console.log(JSON.stringify({ event: 'error', code: 'DRZL_CLI_ANALYZE', message: msg }));\n else\n console.error(\n chalk.red('Analyze failed (DRZL_CLI_ANALYZE):'),\n msg,\n '\\nTip: run with --json for structured output.'\n );\n process.exit(1);\n }\n });\n\nprogram\n .command('generate')\n .description('Run configured generators (drzl.config.*)')\n .option('-c, --config <path>', 'path to drzl.config')\n .action(async (opts: any) => {\n try {\n const cfg = await loadConfig(opts.config);\n if (!cfg) {\n console.error(\n chalk.red('No config found (DRZL_CFG_001). Create drzl.config.ts or pass --config.')\n );\n process.exit(2);\n return;\n }\n const analyzer = new SchemaAnalyzer(cfg.schema);\n const spinner = ora('Analyzing...').start();\n const t0 = Date.now();\n const analysis = await analyzer.analyze({\n includeRelations: cfg.analyzer.includeRelations,\n validateConstraints: cfg.analyzer.validateConstraints,\n includeHeuristicRelations: cfg.analyzer.includeHeuristicRelations,\n });\n spinner.succeed(`Analysis complete in ${Date.now() - t0}ms`);\n const progress = new cliProgress.SingleBar(\n { hideCursor: true },\n cliProgress.Presets.shades_classic\n );\n const total = analysis.tables.length || 1;\n progress.start(total, 0);\n for (const g of cfg.generators) {\n if (g.kind === 'orpc') {\n const gen = new ORPCGenerator(analysis);\n const { files } = await gen.generate({\n outputDir: cfg.outDir,\n template: g.template,\n includeRelations: g.includeRelations,\n naming: g.naming,\n outputHeader: g.outputHeader,\n format: g.format,\n templateOptions: g.templateOptions,\n validation: g.validation,\n onProgress: ({ index }) => progress.update(index),\n });\n progress.stop();\n ora().succeed(chalk.green(`Generated (${g.kind}): ${files.length} files`));\n files.forEach((f: string) => console.log(' -', chalk.cyan(f)));\n } else if (g.kind === 'service') {\n try {\n const { ServiceGenerator } = await import('@drzl/generator-service');\n const gen = new ServiceGenerator(analysis);\n const target = g.path ?? 'src/services';\n const files = await gen.generate({\n outDir: target,\n outputHeader: g.outputHeader,\n format: g.format,\n dataAccess: g.dataAccess,\n dbImportPath: g.dbImportPath,\n schemaImportPath: g.schemaImportPath,\n });\n progress.stop();\n ora().succeed(chalk.green(`Generated (service): ${files.length} files`));\n files.forEach((f: string) => console.log(' -', chalk.cyan(f)));\n } catch (e: any) {\n progress.stop();\n console.error(\n chalk.red('Service generator missing.'),\n chalk.yellow('\\nInstall with: npm install @drzl/generator-service')\n );\n console.error(chalk.gray('Error details:'), e?.message ?? e);\n process.exit(1);\n }\n } else if (g.kind === 'zod') {\n try {\n const { ZodGenerator } = await import('@drzl/generator-zod');\n const gen = new ZodGenerator(analysis);\n const target = g.path ?? 'src/validators/zod';\n const files = await gen.generate({\n outDir: target,\n outputHeader: g.outputHeader,\n format: g.format,\n schemaSuffix: g.schemaSuffix,\n fileSuffix: g.fileSuffix,\n });\n progress.stop();\n ora().succeed(chalk.green(`Generated (zod): ${files.length} files`));\n files.forEach((f: string) => console.log(' -', chalk.cyan(f)));\n } catch (e: any) {\n progress.stop();\n console.error(\n chalk.red('Zod generator missing.'),\n chalk.yellow('\\nInstall with: npm install @drzl/generator-zod')\n );\n console.error(chalk.gray('Error details:'), e?.message ?? e);\n process.exit(1);\n }\n } else if (g.kind === 'valibot') {\n try {\n const { ValibotGenerator } = await import('@drzl/generator-valibot');\n const gen = new ValibotGenerator(analysis);\n const target = g.path ?? 'src/validators/valibot';\n const files = await gen.generate({\n outDir: target,\n outputHeader: g.outputHeader,\n format: g.format,\n schemaSuffix: g.schemaSuffix,\n fileSuffix: g.fileSuffix,\n });\n progress.stop();\n ora().succeed(chalk.green(`Generated (valibot): ${files.length} files`));\n files.forEach((f: string) => console.log(' -', chalk.cyan(f)));\n } catch (e: any) {\n progress.stop();\n console.error(\n chalk.red('Valibot generator missing.'),\n chalk.yellow('\\nInstall with: npm install @drzl/generator-valibot')\n );\n console.error(chalk.gray('Error details:'), e?.message ?? e);\n process.exit(1);\n }\n } else if (g.kind === 'arktype') {\n try {\n const { ArkTypeGenerator } = await import('@drzl/generator-arktype');\n const gen = new ArkTypeGenerator(analysis);\n const target = g.path ?? 'src/validators/arktype';\n const files = await gen.generate({\n outDir: target,\n outputHeader: g.outputHeader,\n format: g.format,\n schemaSuffix: g.schemaSuffix,\n fileSuffix: g.fileSuffix,\n });\n progress.stop();\n ora().succeed(chalk.green(`Generated (arktype): ${files.length} files`));\n files.forEach((f: string) => console.log(' -', chalk.cyan(f)));\n } catch (e: any) {\n progress.stop();\n console.error(\n chalk.red('ArkType generator missing.'),\n chalk.yellow('\\nInstall with: npm install @drzl/generator-arktype')\n );\n console.error(chalk.gray('Error details:'), e?.message ?? e);\n process.exit(1);\n }\n }\n }\n } catch (e: any) {\n console.error(\n chalk.red('Generate failed (DRZL_GEN_001):'),\n e?.message ?? e,\n '\\nTip: check your drzl.config.ts and template path.'\n );\n process.exit(1);\n }\n });\n\nprogram\n .command('generate:orpc')\n .argument('<schema>', 'path to drizzle schema (TS)')\n .option('-o, --outDir <dir>', 'output directory', 'src/api')\n .option('--template <name>', 'template name', 'standard')\n .option('--includeRelations', 'include relation endpoints')\n .action(async (schema: string, opts: any) => {\n try {\n const analyzer = new SchemaAnalyzer(schema);\n const analysis = await analyzer.analyze({\n includeRelations: !!opts.includeRelations,\n validateConstraints: true,\n });\n const gen = new ORPCGenerator(analysis);\n const { files } = await gen.generate({\n outputDir: opts.outDir,\n template: opts.template,\n includeRelations: !!opts.includeRelations,\n });\n console.log(chalk.green(`Generated:`), files.map((f) => chalk.cyan(f)).join(', '));\n } catch (e: any) {\n console.error(chalk.red('Generate orpc failed:'), e?.message ?? e);\n process.exit(1);\n }\n });\n\nprogram\n .command('watch')\n .description('Watch schema and regenerate on changes')\n .option('-c, --config <path>', 'path to drzl.config')\n .option('--pipeline <name>', 'all | analyze | generate-orpc', 'all')\n .option('--debounce <ms>', 'debounce ms', '200')\n .option('--json', 'emit JSON logs', false)\n .option('--poll', 'force polling (helps WSL/Docker/remote FS)', false)\n .action(async (opts: any) => {\n let cfg = await loadConfig(opts.config);\n if (!cfg) {\n console.error(chalk.red('No config found. Create drzl.config.ts or pass --config.'));\n process.exit(2);\n return;\n }\n\n const abs = (p: string) => path.resolve(process.cwd(), p);\n const isInside = (child: string, parent: string) => {\n const rel = path.relative(parent, child);\n return !!rel && !rel.startsWith('..') && !path.isAbsolute(rel);\n };\n\n const ignoredOutDirs = new Set<string>(computeGeneratorOutputDirs(cfg).map(abs));\n const currentTargets = new Set<string>(computeWatchTargets(cfg).map(abs));\n\n const syncWatcherTargets = (watcher: import('chokidar').FSWatcher, next: Set<string>) => {\n const add: string[] = [];\n const del: string[] = [];\n for (const p of next) if (!currentTargets.has(p)) add.push(p);\n for (const p of currentTargets) if (!next.has(p)) del.push(p);\n if (add.length) watcher.add(add);\n if (del.length) watcher.unwatch(del);\n currentTargets.clear();\n next.forEach((p) => currentTargets.add(p));\n };\n\n const rebuildIgnoreDirsFrom = (cfgNow: DrzlConfig) => {\n ignoredOutDirs.clear();\n for (const d of computeGeneratorOutputDirs(cfgNow)) ignoredOutDirs.add(abs(d));\n };\n\n const ignoredFn = (p: string) => {\n const full = abs(p);\n for (const dir of ignoredOutDirs) {\n if (full === dir || isInside(full, dir)) return true;\n }\n return false;\n };\n\n const watcher = chokidar.watch(Array.from(currentTargets), {\n ignoreInitial: true,\n awaitWriteFinish: { stabilityThreshold: 400, pollInterval: 50 },\n usePolling: !!opts.poll,\n ignored: ignoredFn,\n });\n\n const logTrigger = (type: 'add' | 'change' | 'unlink', file: string) => {\n if (opts.json) console.log(JSON.stringify({ event: 'trigger', type, file }));\n };\n\n watcher\n .on('add', (p) => {\n logTrigger('add', p);\n trigger(p);\n })\n .on('change', (p) => {\n logTrigger('change', p);\n trigger(p);\n })\n .on('unlink', (p) => {\n logTrigger('unlink', p);\n trigger(p);\n });\n\n let lastFiles: string[] = [];\n\n const run = async () => {\n try {\n const reloaded = await loadConfig(opts.config);\n if (!reloaded) throw new Error('Config disappeared during watch.');\n cfg = reloaded;\n\n rebuildIgnoreDirsFrom(cfg);\n const nextTargets = new Set<string>(computeWatchTargets(cfg).map(abs));\n syncWatcherTargets(watcher, nextTargets);\n\n if (!opts.json) console.clear();\n\n if (opts.json) {\n console.log(\n JSON.stringify({\n event: 'watch_config_applied',\n targets: Array.from(currentTargets),\n ignored: Array.from(ignoredOutDirs),\n })\n );\n }\n\n const analyzer = new SchemaAnalyzer(cfg.schema);\n const analysis = await analyzer.analyze({\n includeRelations: cfg.analyzer.includeRelations,\n validateConstraints: cfg.analyzer.validateConstraints,\n includeHeuristicRelations: cfg.analyzer.includeHeuristicRelations,\n });\n\n if (opts.pipeline === 'analyze') {\n if (opts.json) {\n console.log(\n JSON.stringify({\n event: 'analyze_complete',\n issues: analysis.issues,\n tables: analysis.tables.length,\n })\n );\n } else {\n console.log(chalk.green('Analyze complete.'));\n }\n return;\n }\n\n const newFiles: string[] = [];\n\n for (const g of cfg.generators) {\n if (\n opts.pipeline !== 'all' &&\n !(opts.pipeline === 'generate-orpc' && g.kind === 'orpc')\n ) {\n continue;\n }\n\n if (g.kind === 'orpc') {\n const gen = new ORPCGenerator(analysis);\n const { files } = await gen.generate({\n outputDir: cfg.outDir,\n template: g.template,\n includeRelations: g.includeRelations,\n naming: g.naming,\n outputHeader: g.outputHeader,\n format: g.format,\n templateOptions: g.templateOptions,\n validation: g.validation,\n });\n opts.json\n ? console.log(JSON.stringify({ event: 'generate_complete', kind: g.kind, files }))\n : console.log(\n chalk.green(`Generated (${g.kind}):`),\n files.map((f: string) => chalk.cyan(f)).join(', ')\n );\n newFiles.push(...files);\n } else if (g.kind === 'service') {\n try {\n const { ServiceGenerator } = await import('@drzl/generator-service');\n const gen = new ServiceGenerator(analysis);\n const target = g.path ?? 'src/services';\n const files = await gen.generate({\n outDir: target,\n outputHeader: g.outputHeader,\n format: g.format,\n dataAccess: g.dataAccess,\n dbImportPath: g.dbImportPath,\n schemaImportPath: g.schemaImportPath,\n });\n opts.json\n ? console.log(JSON.stringify({ event: 'generate_complete', kind: g.kind, files }))\n : console.log(\n chalk.green(`Generated (service): ${files.length} files`),\n files.map((f: string) => chalk.cyan(f)).join(', ')\n );\n newFiles.push(...files);\n } catch (e: any) {\n console.error(\n chalk.red('Service generator missing.'),\n chalk.yellow('\\nInstall with: npm install @drzl/generator-service')\n );\n console.error(chalk.gray('Error details:'), e?.message ?? e);\n return;\n }\n } else if (g.kind === 'zod') {\n try {\n const { ZodGenerator } = await import('@drzl/generator-zod');\n const gen = new ZodGenerator(analysis);\n const target = g.path ?? 'src/validators/zod';\n const files = await gen.generate({\n outDir: target,\n outputHeader: g.outputHeader,\n format: g.format,\n schemaSuffix: g.schemaSuffix,\n fileSuffix: g.fileSuffix,\n });\n opts.json\n ? console.log(JSON.stringify({ event: 'generate_complete', kind: g.kind, files }))\n : console.log(\n chalk.green(`Generated (zod): ${files.length} files`),\n files.map((f: string) => chalk.cyan(f)).join(', ')\n );\n newFiles.push(...files);\n } catch (e: any) {\n console.error(\n chalk.red('Zod generator missing.'),\n chalk.yellow('\\nInstall with: npm install @drzl/generator-zod')\n );\n console.error(chalk.gray('Error details:'), e?.message ?? e);\n return;\n }\n } else if (g.kind === 'valibot') {\n try {\n const { ValibotGenerator } = await import('@drzl/generator-valibot');\n const gen = new ValibotGenerator(analysis);\n const target = g.path ?? 'src/validators/valibot';\n const files = await gen.generate({\n outDir: target,\n outputHeader: g.outputHeader,\n format: g.format,\n schemaSuffix: g.schemaSuffix,\n fileSuffix: g.fileSuffix,\n });\n opts.json\n ? console.log(JSON.stringify({ event: 'generate_complete', kind: g.kind, files }))\n : console.log(\n chalk.green(`Generated (valibot): ${files.length} files`),\n files.map((f: string) => chalk.cyan(f)).join(', ')\n );\n newFiles.push(...files);\n } catch (e: any) {\n console.error(\n chalk.red('Valibot generator missing.'),\n chalk.yellow('\\nInstall with: npm install @drzl/generator-valibot')\n );\n console.error(chalk.gray('Error details:'), e?.message ?? e);\n return;\n }\n } else if (g.kind === 'arktype') {\n try {\n const { ArkTypeGenerator } = await import('@drzl/generator-arktype');\n const gen = new ArkTypeGenerator(analysis);\n const target = g.path ?? 'src/validators/arktype';\n const files = await gen.generate({\n outDir: target,\n outputHeader: g.outputHeader,\n format: g.format,\n schemaSuffix: g.schemaSuffix,\n fileSuffix: g.fileSuffix,\n });\n opts.json\n ? console.log(JSON.stringify({ event: 'generate_complete', kind: g.kind, files }))\n : console.log(\n chalk.green(`Generated (arktype): ${files.length} files`),\n files.map((f: string) => chalk.cyan(f)).join(', ')\n );\n newFiles.push(...files);\n } catch (e: any) {\n console.error(\n chalk.red('ArkType generator missing.'),\n chalk.yellow('\\nInstall with: npm install @drzl/generator-arktype')\n );\n console.error(chalk.gray('Error details:'), e?.message ?? e);\n return;\n }\n }\n }\n\n const added = newFiles.filter((f) => !lastFiles.includes(f));\n const removed = lastFiles.filter((f) => !newFiles.includes(f));\n opts.json\n ? console.log(JSON.stringify({ event: 'diff', added, removed }))\n : (() => {\n if (added.length) console.log(chalk.blue(`Added: ${added.join(', ')}`));\n if (removed.length) console.log(chalk.yellow(`Removed: ${removed.join(', ')}`));\n })();\n lastFiles = newFiles;\n } catch (e: any) {\n opts.json\n ? console.log(JSON.stringify({ event: 'error', message: String(e?.message ?? e) }))\n : console.error(chalk.red('Watch pipeline failed:'), e?.message ?? e);\n }\n };\n\n const debounced = Number(opts.debounce) || 200;\n let timer: NodeJS.Timeout | null = null;\n const trigger = (file?: string) => {\n if (file) {\n const full = abs(file);\n for (const dir of ignoredOutDirs) {\n if (full === dir || isInside(full, dir)) return;\n }\n }\n if (timer) clearTimeout(timer);\n timer = setTimeout(run, debounced);\n };\n\n if (opts.json) {\n console.log(\n JSON.stringify({\n event: 'watching',\n targets: Array.from(currentTargets),\n ignored: Array.from(ignoredOutDirs),\n })\n );\n } else {\n console.log(\n chalk.gray(\n 'Watching:\\n ' +\n Array.from(currentTargets)\n .map((p) => path.relative(process.cwd(), p))\n .join('\\n ')\n )\n );\n }\n\n watcher\n .on('add', (p) => trigger(p))\n .on('change', (p) => trigger(p))\n .on('unlink', (p) => trigger(p))\n .on('error', (err) => console.error(chalk.red('Watcher error:'), err));\n\n await run();\n });\n\nprogram\n .command('init')\n .description('Scaffold a drzl.config.ts')\n .option('-y, --yes', 'accept defaults')\n .action(async (_opts: any) => {\n const fs = await import('node:fs/promises');\n const path = await import('node:path');\n const target = path.resolve(process.cwd(), 'drzl.config.ts');\n const template = `export default {\n schema: 'src/db/schema.ts',\n outDir: 'src/api',\n analyzer: { includeRelations: true, validateConstraints: true },\n generators: [\n { kind: 'orpc', template: 'standard', includeRelations: true }\n ]\n} as const\\n`;\n try {\n await fs.writeFile(target, template, { flag: 'wx' });\n console.log(chalk.green(`Created ${target}`));\n } catch (e: any) {\n console.error(chalk.red('Init failed:'), e?.message ?? e);\n process.exit(1);\n }\n });\n\nprogram.parseAsync(process.argv);\n"],"mappings":";;;;;;;;AACA,SAAS,sBAAsB;AAC/B,SAAS,qBAAqB;AAC9B,OAAO,WAAW;AAClB,OAAO,cAAc;AACrB,OAAO,iBAAiB;AACxB,SAAS,eAAe;AACxB,YAAY,UAAU;AACtB,OAAO,SAAS;AAQhB,IAAM,UAAU,IAAI,QAAQ;AAC5B,QAAQ,KAAK,MAAM,EAAE,YAAY,kCAAkC,EAAE,QAAQ,OAAO;AAEpF,QACG,QAAQ,SAAS,EACjB,SAAS,YAAY,6BAA6B,EAClD,OAAO,eAAe,qBAAqB,IAAI,EAC/C,OAAO,cAAc,wBAAwB,IAAI,EACjD,OAAO,gBAAgB,6BAA6B,EACpD,OAAO,UAAU,0CAA0C,KAAK,EAChE,OAAO,OAAO,QAAgB,SAAc;AAC3C,MAAI;AACF,UAAM,WAAW,IAAI,eAAe,MAAM;AAC1C,UAAM,UAAU,CAAC,KAAK,OAAO,IAAI,qBAAqB,EAAE,MAAM,IAAI;AAClE,UAAM,QAAQ,KAAK,IAAI;AACvB,UAAM,MAAM,MAAM,SAAS,QAAQ;AAAA,MACjC,kBAAkB,CAAC,CAAC,KAAK;AAAA,MACzB,qBAAqB,CAAC,CAAC,KAAK;AAAA,IAC9B,CAAC;AACD,UAAM,KAAK,KAAK,IAAI,IAAI;AACxB,UAAM,OAAO,KAAK,UAAU,KAAK,MAAM,CAAC;AACxC,QAAI,KAAK,MAAM;AACb,cAAQ,IAAI,IAAI;AAAA,IAClB,WAAW,KAAK,KAAK;AACnB,YAAM,KAAK,MAAM,OAAO,aAAkB;AAC1C,YAAM,GAAG,UAAU,KAAK,KAAK,MAAM,MAAM;AACzC,eAAS,QAAQ,MAAM,MAAM,uBAAuB,KAAK,GAAG,OAAO,EAAE,IAAI,CAAC;AAAA,IAC5E,OAAO;AACL,eAAS,QAAQ,MAAM,MAAM,eAAe,EAAE,IAAI,CAAC;AACnD,cAAQ,IAAI,IAAI;AAAA,IAClB;AACA,YAAQ,KAAK,IAAI,OAAO,KAAK,CAAC,MAAM,EAAE,UAAU,OAAO,IAAI,IAAI,CAAC;AAAA,EAClE,SAAS,GAAQ;AACf,UAAM,MAAM,GAAG,WAAW,OAAO,CAAC;AAClC,QAAI,KAAK;AACP,cAAQ,IAAI,KAAK,UAAU,EAAE,OAAO,SAAS,MAAM,oBAAoB,SAAS,IAAI,CAAC,CAAC;AAAA;AAEtF,cAAQ;AAAA,QACN,MAAM,IAAI,oCAAoC;AAAA,QAC9C;AAAA,QACA;AAAA,MACF;AACF,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QACG,QAAQ,UAAU,EAClB,YAAY,2CAA2C,EACvD,OAAO,uBAAuB,qBAAqB,EACnD,OAAO,OAAO,SAAc;AAC3B,MAAI;AACF,UAAM,MAAM,MAAM,WAAW,KAAK,MAAM;AACxC,QAAI,CAAC,KAAK;AACR,cAAQ;AAAA,QACN,MAAM,IAAI,yEAAyE;AAAA,MACrF;AACA,cAAQ,KAAK,CAAC;AACd;AAAA,IACF;AACA,UAAM,WAAW,IAAI,eAAe,IAAI,MAAM;AAC9C,UAAM,UAAU,IAAI,cAAc,EAAE,MAAM;AAC1C,UAAM,KAAK,KAAK,IAAI;AACpB,UAAM,WAAW,MAAM,SAAS,QAAQ;AAAA,MACtC,kBAAkB,IAAI,SAAS;AAAA,MAC/B,qBAAqB,IAAI,SAAS;AAAA,MAClC,2BAA2B,IAAI,SAAS;AAAA,IAC1C,CAAC;AACD,YAAQ,QAAQ,wBAAwB,KAAK,IAAI,IAAI,EAAE,IAAI;AAC3D,UAAM,WAAW,IAAI,YAAY;AAAA,MAC/B,EAAE,YAAY,KAAK;AAAA,MACnB,YAAY,QAAQ;AAAA,IACtB;AACA,UAAM,QAAQ,SAAS,OAAO,UAAU;AACxC,aAAS,MAAM,OAAO,CAAC;AACvB,eAAW,KAAK,IAAI,YAAY;AAC9B,UAAI,EAAE,SAAS,QAAQ;AACrB,cAAM,MAAM,IAAI,cAAc,QAAQ;AACtC,cAAM,EAAE,MAAM,IAAI,MAAM,IAAI,SAAS;AAAA,UACnC,WAAW,IAAI;AAAA,UACf,UAAU,EAAE;AAAA,UACZ,kBAAkB,EAAE;AAAA,UACpB,QAAQ,EAAE;AAAA,UACV,cAAc,EAAE;AAAA,UAChB,QAAQ,EAAE;AAAA,UACV,iBAAiB,EAAE;AAAA,UACnB,YAAY,EAAE;AAAA,UACd,YAAY,CAAC,EAAE,MAAM,MAAM,SAAS,OAAO,KAAK;AAAA,QAClD,CAAC;AACD,iBAAS,KAAK;AACd,YAAI,EAAE,QAAQ,MAAM,MAAM,cAAc,EAAE,IAAI,MAAM,MAAM,MAAM,QAAQ,CAAC;AACzE,cAAM,QAAQ,CAAC,MAAc,QAAQ,IAAI,OAAO,MAAM,KAAK,CAAC,CAAC,CAAC;AAAA,MAChE,WAAW,EAAE,SAAS,WAAW;AAC/B,YAAI;AACF,gBAAM,EAAE,iBAAiB,IAAI,MAAM,OAAO,yBAAyB;AACnE,gBAAM,MAAM,IAAI,iBAAiB,QAAQ;AACzC,gBAAM,SAAS,EAAE,QAAQ;AACzB,gBAAM,QAAQ,MAAM,IAAI,SAAS;AAAA,YAC/B,QAAQ;AAAA,YACR,cAAc,EAAE;AAAA,YAChB,QAAQ,EAAE;AAAA,YACV,YAAY,EAAE;AAAA,YACd,cAAc,EAAE;AAAA,YAChB,kBAAkB,EAAE;AAAA,UACtB,CAAC;AACD,mBAAS,KAAK;AACd,cAAI,EAAE,QAAQ,MAAM,MAAM,wBAAwB,MAAM,MAAM,QAAQ,CAAC;AACvE,gBAAM,QAAQ,CAAC,MAAc,QAAQ,IAAI,OAAO,MAAM,KAAK,CAAC,CAAC,CAAC;AAAA,QAChE,SAAS,GAAQ;AACf,mBAAS,KAAK;AACd,kBAAQ;AAAA,YACN,MAAM,IAAI,4BAA4B;AAAA,YACtC,MAAM,OAAO,qDAAqD;AAAA,UACpE;AACA,kBAAQ,MAAM,MAAM,KAAK,gBAAgB,GAAG,GAAG,WAAW,CAAC;AAC3D,kBAAQ,KAAK,CAAC;AAAA,QAChB;AAAA,MACF,WAAW,EAAE,SAAS,OAAO;AAC3B,YAAI;AACF,gBAAM,EAAE,aAAa,IAAI,MAAM,OAAO,qBAAqB;AAC3D,gBAAM,MAAM,IAAI,aAAa,QAAQ;AACrC,gBAAM,SAAS,EAAE,QAAQ;AACzB,gBAAM,QAAQ,MAAM,IAAI,SAAS;AAAA,YAC/B,QAAQ;AAAA,YACR,cAAc,EAAE;AAAA,YAChB,QAAQ,EAAE;AAAA,YACV,cAAc,EAAE;AAAA,YAChB,YAAY,EAAE;AAAA,UAChB,CAAC;AACD,mBAAS,KAAK;AACd,cAAI,EAAE,QAAQ,MAAM,MAAM,oBAAoB,MAAM,MAAM,QAAQ,CAAC;AACnE,gBAAM,QAAQ,CAAC,MAAc,QAAQ,IAAI,OAAO,MAAM,KAAK,CAAC,CAAC,CAAC;AAAA,QAChE,SAAS,GAAQ;AACf,mBAAS,KAAK;AACd,kBAAQ;AAAA,YACN,MAAM,IAAI,wBAAwB;AAAA,YAClC,MAAM,OAAO,iDAAiD;AAAA,UAChE;AACA,kBAAQ,MAAM,MAAM,KAAK,gBAAgB,GAAG,GAAG,WAAW,CAAC;AAC3D,kBAAQ,KAAK,CAAC;AAAA,QAChB;AAAA,MACF,WAAW,EAAE,SAAS,WAAW;AAC/B,YAAI;AACF,gBAAM,EAAE,iBAAiB,IAAI,MAAM,OAAO,yBAAyB;AACnE,gBAAM,MAAM,IAAI,iBAAiB,QAAQ;AACzC,gBAAM,SAAS,EAAE,QAAQ;AACzB,gBAAM,QAAQ,MAAM,IAAI,SAAS;AAAA,YAC/B,QAAQ;AAAA,YACR,cAAc,EAAE;AAAA,YAChB,QAAQ,EAAE;AAAA,YACV,cAAc,EAAE;AAAA,YAChB,YAAY,EAAE;AAAA,UAChB,CAAC;AACD,mBAAS,KAAK;AACd,cAAI,EAAE,QAAQ,MAAM,MAAM,wBAAwB,MAAM,MAAM,QAAQ,CAAC;AACvE,gBAAM,QAAQ,CAAC,MAAc,QAAQ,IAAI,OAAO,MAAM,KAAK,CAAC,CAAC,CAAC;AAAA,QAChE,SAAS,GAAQ;AACf,mBAAS,KAAK;AACd,kBAAQ;AAAA,YACN,MAAM,IAAI,4BAA4B;AAAA,YACtC,MAAM,OAAO,qDAAqD;AAAA,UACpE;AACA,kBAAQ,MAAM,MAAM,KAAK,gBAAgB,GAAG,GAAG,WAAW,CAAC;AAC3D,kBAAQ,KAAK,CAAC;AAAA,QAChB;AAAA,MACF,WAAW,EAAE,SAAS,WAAW;AAC/B,YAAI;AACF,gBAAM,EAAE,iBAAiB,IAAI,MAAM,OAAO,yBAAyB;AACnE,gBAAM,MAAM,IAAI,iBAAiB,QAAQ;AACzC,gBAAM,SAAS,EAAE,QAAQ;AACzB,gBAAM,QAAQ,MAAM,IAAI,SAAS;AAAA,YAC/B,QAAQ;AAAA,YACR,cAAc,EAAE;AAAA,YAChB,QAAQ,EAAE;AAAA,YACV,cAAc,EAAE;AAAA,YAChB,YAAY,EAAE;AAAA,UAChB,CAAC;AACD,mBAAS,KAAK;AACd,cAAI,EAAE,QAAQ,MAAM,MAAM,wBAAwB,MAAM,MAAM,QAAQ,CAAC;AACvE,gBAAM,QAAQ,CAAC,MAAc,QAAQ,IAAI,OAAO,MAAM,KAAK,CAAC,CAAC,CAAC;AAAA,QAChE,SAAS,GAAQ;AACf,mBAAS,KAAK;AACd,kBAAQ;AAAA,YACN,MAAM,IAAI,4BAA4B;AAAA,YACtC,MAAM,OAAO,qDAAqD;AAAA,UACpE;AACA,kBAAQ,MAAM,MAAM,KAAK,gBAAgB,GAAG,GAAG,WAAW,CAAC;AAC3D,kBAAQ,KAAK,CAAC;AAAA,QAChB;AAAA,MACF;AAAA,IACF;AAAA,EACF,SAAS,GAAQ;AACf,YAAQ;AAAA,MACN,MAAM,IAAI,iCAAiC;AAAA,MAC3C,GAAG,WAAW;AAAA,MACd;AAAA,IACF;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QACG,QAAQ,eAAe,EACvB,SAAS,YAAY,6BAA6B,EAClD,OAAO,sBAAsB,oBAAoB,SAAS,EAC1D,OAAO,qBAAqB,iBAAiB,UAAU,EACvD,OAAO,sBAAsB,4BAA4B,EACzD,OAAO,OAAO,QAAgB,SAAc;AAC3C,MAAI;AACF,UAAM,WAAW,IAAI,eAAe,MAAM;AAC1C,UAAM,WAAW,MAAM,SAAS,QAAQ;AAAA,MACtC,kBAAkB,CAAC,CAAC,KAAK;AAAA,MACzB,qBAAqB;AAAA,IACvB,CAAC;AACD,UAAM,MAAM,IAAI,cAAc,QAAQ;AACtC,UAAM,EAAE,MAAM,IAAI,MAAM,IAAI,SAAS;AAAA,MACnC,WAAW,KAAK;AAAA,MAChB,UAAU,KAAK;AAAA,MACf,kBAAkB,CAAC,CAAC,KAAK;AAAA,IAC3B,CAAC;AACD,YAAQ,IAAI,MAAM,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,MAAM,MAAM,KAAK,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC;AAAA,EACnF,SAAS,GAAQ;AACf,YAAQ,MAAM,MAAM,IAAI,uBAAuB,GAAG,GAAG,WAAW,CAAC;AACjE,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QACG,QAAQ,OAAO,EACf,YAAY,wCAAwC,EACpD,OAAO,uBAAuB,qBAAqB,EACnD,OAAO,qBAAqB,iCAAiC,KAAK,EAClE,OAAO,mBAAmB,eAAe,KAAK,EAC9C,OAAO,UAAU,kBAAkB,KAAK,EACxC,OAAO,UAAU,8CAA8C,KAAK,EACpE,OAAO,OAAO,SAAc;AAC3B,MAAI,MAAM,MAAM,WAAW,KAAK,MAAM;AACtC,MAAI,CAAC,KAAK;AACR,YAAQ,MAAM,MAAM,IAAI,0DAA0D,CAAC;AACnF,YAAQ,KAAK,CAAC;AACd;AAAA,EACF;AAEA,QAAM,MAAM,CAAC,MAAmB,aAAQ,QAAQ,IAAI,GAAG,CAAC;AACxD,QAAM,WAAW,CAAC,OAAe,WAAmB;AAClD,UAAM,MAAW,cAAS,QAAQ,KAAK;AACvC,WAAO,CAAC,CAAC,OAAO,CAAC,IAAI,WAAW,IAAI,KAAK,CAAM,gBAAW,GAAG;AAAA,EAC/D;AAEA,QAAM,iBAAiB,IAAI,IAAY,2BAA2B,GAAG,EAAE,IAAI,GAAG,CAAC;AAC/E,QAAM,iBAAiB,IAAI,IAAY,oBAAoB,GAAG,EAAE,IAAI,GAAG,CAAC;AAExE,QAAM,qBAAqB,CAACA,UAAuC,SAAsB;AACvF,UAAM,MAAgB,CAAC;AACvB,UAAM,MAAgB,CAAC;AACvB,eAAW,KAAK,KAAM,KAAI,CAAC,eAAe,IAAI,CAAC,EAAG,KAAI,KAAK,CAAC;AAC5D,eAAW,KAAK,eAAgB,KAAI,CAAC,KAAK,IAAI,CAAC,EAAG,KAAI,KAAK,CAAC;AAC5D,QAAI,IAAI,OAAQ,CAAAA,SAAQ,IAAI,GAAG;AAC/B,QAAI,IAAI,OAAQ,CAAAA,SAAQ,QAAQ,GAAG;AACnC,mBAAe,MAAM;AACrB,SAAK,QAAQ,CAAC,MAAM,eAAe,IAAI,CAAC,CAAC;AAAA,EAC3C;AAEA,QAAM,wBAAwB,CAAC,WAAuB;AACpD,mBAAe,MAAM;AACrB,eAAW,KAAK,2BAA2B,MAAM,EAAG,gBAAe,IAAI,IAAI,CAAC,CAAC;AAAA,EAC/E;AAEA,QAAM,YAAY,CAAC,MAAc;AAC/B,UAAM,OAAO,IAAI,CAAC;AAClB,eAAW,OAAO,gBAAgB;AAChC,UAAI,SAAS,OAAO,SAAS,MAAM,GAAG,EAAG,QAAO;AAAA,IAClD;AACA,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,SAAS,MAAM,MAAM,KAAK,cAAc,GAAG;AAAA,IACzD,eAAe;AAAA,IACf,kBAAkB,EAAE,oBAAoB,KAAK,cAAc,GAAG;AAAA,IAC9D,YAAY,CAAC,CAAC,KAAK;AAAA,IACnB,SAAS;AAAA,EACX,CAAC;AAED,QAAM,aAAa,CAAC,MAAmC,SAAiB;AACtE,QAAI,KAAK,KAAM,SAAQ,IAAI,KAAK,UAAU,EAAE,OAAO,WAAW,MAAM,KAAK,CAAC,CAAC;AAAA,EAC7E;AAEA,UACG,GAAG,OAAO,CAAC,MAAM;AAChB,eAAW,OAAO,CAAC;AACnB,YAAQ,CAAC;AAAA,EACX,CAAC,EACA,GAAG,UAAU,CAAC,MAAM;AACnB,eAAW,UAAU,CAAC;AACtB,YAAQ,CAAC;AAAA,EACX,CAAC,EACA,GAAG,UAAU,CAAC,MAAM;AACnB,eAAW,UAAU,CAAC;AACtB,YAAQ,CAAC;AAAA,EACX,CAAC;AAEH,MAAI,YAAsB,CAAC;AAE3B,QAAM,MAAM,YAAY;AACtB,QAAI;AACF,YAAM,WAAW,MAAM,WAAW,KAAK,MAAM;AAC7C,UAAI,CAAC,SAAU,OAAM,IAAI,MAAM,kCAAkC;AACjE,YAAM;AAEN,4BAAsB,GAAG;AACzB,YAAM,cAAc,IAAI,IAAY,oBAAoB,GAAG,EAAE,IAAI,GAAG,CAAC;AACrE,yBAAmB,SAAS,WAAW;AAEvC,UAAI,CAAC,KAAK,KAAM,SAAQ,MAAM;AAE9B,UAAI,KAAK,MAAM;AACb,gBAAQ;AAAA,UACN,KAAK,UAAU;AAAA,YACb,OAAO;AAAA,YACP,SAAS,MAAM,KAAK,cAAc;AAAA,YAClC,SAAS,MAAM,KAAK,cAAc;AAAA,UACpC,CAAC;AAAA,QACH;AAAA,MACF;AAEA,YAAM,WAAW,IAAI,eAAe,IAAI,MAAM;AAC9C,YAAM,WAAW,MAAM,SAAS,QAAQ;AAAA,QACtC,kBAAkB,IAAI,SAAS;AAAA,QAC/B,qBAAqB,IAAI,SAAS;AAAA,QAClC,2BAA2B,IAAI,SAAS;AAAA,MAC1C,CAAC;AAED,UAAI,KAAK,aAAa,WAAW;AAC/B,YAAI,KAAK,MAAM;AACb,kBAAQ;AAAA,YACN,KAAK,UAAU;AAAA,cACb,OAAO;AAAA,cACP,QAAQ,SAAS;AAAA,cACjB,QAAQ,SAAS,OAAO;AAAA,YAC1B,CAAC;AAAA,UACH;AAAA,QACF,OAAO;AACL,kBAAQ,IAAI,MAAM,MAAM,mBAAmB,CAAC;AAAA,QAC9C;AACA;AAAA,MACF;AAEA,YAAM,WAAqB,CAAC;AAE5B,iBAAW,KAAK,IAAI,YAAY;AAC9B,YACE,KAAK,aAAa,SAClB,EAAE,KAAK,aAAa,mBAAmB,EAAE,SAAS,SAClD;AACA;AAAA,QACF;AAEA,YAAI,EAAE,SAAS,QAAQ;AACrB,gBAAM,MAAM,IAAI,cAAc,QAAQ;AACtC,gBAAM,EAAE,MAAM,IAAI,MAAM,IAAI,SAAS;AAAA,YACnC,WAAW,IAAI;AAAA,YACf,UAAU,EAAE;AAAA,YACZ,kBAAkB,EAAE;AAAA,YACpB,QAAQ,EAAE;AAAA,YACV,cAAc,EAAE;AAAA,YAChB,QAAQ,EAAE;AAAA,YACV,iBAAiB,EAAE;AAAA,YACnB,YAAY,EAAE;AAAA,UAChB,CAAC;AACD,eAAK,OACD,QAAQ,IAAI,KAAK,UAAU,EAAE,OAAO,qBAAqB,MAAM,EAAE,MAAM,MAAM,CAAC,CAAC,IAC/E,QAAQ;AAAA,YACN,MAAM,MAAM,cAAc,EAAE,IAAI,IAAI;AAAA,YACpC,MAAM,IAAI,CAAC,MAAc,MAAM,KAAK,CAAC,CAAC,EAAE,KAAK,IAAI;AAAA,UACnD;AACJ,mBAAS,KAAK,GAAG,KAAK;AAAA,QACxB,WAAW,EAAE,SAAS,WAAW;AAC/B,cAAI;AACF,kBAAM,EAAE,iBAAiB,IAAI,MAAM,OAAO,yBAAyB;AACnE,kBAAM,MAAM,IAAI,iBAAiB,QAAQ;AACzC,kBAAM,SAAS,EAAE,QAAQ;AACzB,kBAAM,QAAQ,MAAM,IAAI,SAAS;AAAA,cAC/B,QAAQ;AAAA,cACR,cAAc,EAAE;AAAA,cAChB,QAAQ,EAAE;AAAA,cACV,YAAY,EAAE;AAAA,cACd,cAAc,EAAE;AAAA,cAChB,kBAAkB,EAAE;AAAA,YACtB,CAAC;AACD,iBAAK,OACD,QAAQ,IAAI,KAAK,UAAU,EAAE,OAAO,qBAAqB,MAAM,EAAE,MAAM,MAAM,CAAC,CAAC,IAC/E,QAAQ;AAAA,cACN,MAAM,MAAM,wBAAwB,MAAM,MAAM,QAAQ;AAAA,cACxD,MAAM,IAAI,CAAC,MAAc,MAAM,KAAK,CAAC,CAAC,EAAE,KAAK,IAAI;AAAA,YACnD;AACJ,qBAAS,KAAK,GAAG,KAAK;AAAA,UACxB,SAAS,GAAQ;AACf,oBAAQ;AAAA,cACN,MAAM,IAAI,4BAA4B;AAAA,cACtC,MAAM,OAAO,qDAAqD;AAAA,YACpE;AACA,oBAAQ,MAAM,MAAM,KAAK,gBAAgB,GAAG,GAAG,WAAW,CAAC;AAC3D;AAAA,UACF;AAAA,QACF,WAAW,EAAE,SAAS,OAAO;AAC3B,cAAI;AACF,kBAAM,EAAE,aAAa,IAAI,MAAM,OAAO,qBAAqB;AAC3D,kBAAM,MAAM,IAAI,aAAa,QAAQ;AACrC,kBAAM,SAAS,EAAE,QAAQ;AACzB,kBAAM,QAAQ,MAAM,IAAI,SAAS;AAAA,cAC/B,QAAQ;AAAA,cACR,cAAc,EAAE;AAAA,cAChB,QAAQ,EAAE;AAAA,cACV,cAAc,EAAE;AAAA,cAChB,YAAY,EAAE;AAAA,YAChB,CAAC;AACD,iBAAK,OACD,QAAQ,IAAI,KAAK,UAAU,EAAE,OAAO,qBAAqB,MAAM,EAAE,MAAM,MAAM,CAAC,CAAC,IAC/E,QAAQ;AAAA,cACN,MAAM,MAAM,oBAAoB,MAAM,MAAM,QAAQ;AAAA,cACpD,MAAM,IAAI,CAAC,MAAc,MAAM,KAAK,CAAC,CAAC,EAAE,KAAK,IAAI;AAAA,YACnD;AACJ,qBAAS,KAAK,GAAG,KAAK;AAAA,UACxB,SAAS,GAAQ;AACf,oBAAQ;AAAA,cACN,MAAM,IAAI,wBAAwB;AAAA,cAClC,MAAM,OAAO,iDAAiD;AAAA,YAChE;AACA,oBAAQ,MAAM,MAAM,KAAK,gBAAgB,GAAG,GAAG,WAAW,CAAC;AAC3D;AAAA,UACF;AAAA,QACF,WAAW,EAAE,SAAS,WAAW;AAC/B,cAAI;AACF,kBAAM,EAAE,iBAAiB,IAAI,MAAM,OAAO,yBAAyB;AACnE,kBAAM,MAAM,IAAI,iBAAiB,QAAQ;AACzC,kBAAM,SAAS,EAAE,QAAQ;AACzB,kBAAM,QAAQ,MAAM,IAAI,SAAS;AAAA,cAC/B,QAAQ;AAAA,cACR,cAAc,EAAE;AAAA,cAChB,QAAQ,EAAE;AAAA,cACV,cAAc,EAAE;AAAA,cAChB,YAAY,EAAE;AAAA,YAChB,CAAC;AACD,iBAAK,OACD,QAAQ,IAAI,KAAK,UAAU,EAAE,OAAO,qBAAqB,MAAM,EAAE,MAAM,MAAM,CAAC,CAAC,IAC/E,QAAQ;AAAA,cACN,MAAM,MAAM,wBAAwB,MAAM,MAAM,QAAQ;AAAA,cACxD,MAAM,IAAI,CAAC,MAAc,MAAM,KAAK,CAAC,CAAC,EAAE,KAAK,IAAI;AAAA,YACnD;AACJ,qBAAS,KAAK,GAAG,KAAK;AAAA,UACxB,SAAS,GAAQ;AACf,oBAAQ;AAAA,cACN,MAAM,IAAI,4BAA4B;AAAA,cACtC,MAAM,OAAO,qDAAqD;AAAA,YACpE;AACA,oBAAQ,MAAM,MAAM,KAAK,gBAAgB,GAAG,GAAG,WAAW,CAAC;AAC3D;AAAA,UACF;AAAA,QACF,WAAW,EAAE,SAAS,WAAW;AAC/B,cAAI;AACF,kBAAM,EAAE,iBAAiB,IAAI,MAAM,OAAO,yBAAyB;AACnE,kBAAM,MAAM,IAAI,iBAAiB,QAAQ;AACzC,kBAAM,SAAS,EAAE,QAAQ;AACzB,kBAAM,QAAQ,MAAM,IAAI,SAAS;AAAA,cAC/B,QAAQ;AAAA,cACR,cAAc,EAAE;AAAA,cAChB,QAAQ,EAAE;AAAA,cACV,cAAc,EAAE;AAAA,cAChB,YAAY,EAAE;AAAA,YAChB,CAAC;AACD,iBAAK,OACD,QAAQ,IAAI,KAAK,UAAU,EAAE,OAAO,qBAAqB,MAAM,EAAE,MAAM,MAAM,CAAC,CAAC,IAC/E,QAAQ;AAAA,cACN,MAAM,MAAM,wBAAwB,MAAM,MAAM,QAAQ;AAAA,cACxD,MAAM,IAAI,CAAC,MAAc,MAAM,KAAK,CAAC,CAAC,EAAE,KAAK,IAAI;AAAA,YACnD;AACJ,qBAAS,KAAK,GAAG,KAAK;AAAA,UACxB,SAAS,GAAQ;AACf,oBAAQ;AAAA,cACN,MAAM,IAAI,4BAA4B;AAAA,cACtC,MAAM,OAAO,qDAAqD;AAAA,YACpE;AACA,oBAAQ,MAAM,MAAM,KAAK,gBAAgB,GAAG,GAAG,WAAW,CAAC;AAC3D;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,YAAM,QAAQ,SAAS,OAAO,CAAC,MAAM,CAAC,UAAU,SAAS,CAAC,CAAC;AAC3D,YAAM,UAAU,UAAU,OAAO,CAAC,MAAM,CAAC,SAAS,SAAS,CAAC,CAAC;AAC7D,WAAK,OACD,QAAQ,IAAI,KAAK,UAAU,EAAE,OAAO,QAAQ,OAAO,QAAQ,CAAC,CAAC,KAC5D,MAAM;AACL,YAAI,MAAM,OAAQ,SAAQ,IAAI,MAAM,KAAK,UAAU,MAAM,KAAK,IAAI,CAAC,EAAE,CAAC;AACtE,YAAI,QAAQ,OAAQ,SAAQ,IAAI,MAAM,OAAO,YAAY,QAAQ,KAAK,IAAI,CAAC,EAAE,CAAC;AAAA,MAChF,GAAG;AACP,kBAAY;AAAA,IACd,SAAS,GAAQ;AACf,WAAK,OACD,QAAQ,IAAI,KAAK,UAAU,EAAE,OAAO,SAAS,SAAS,OAAO,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,IAChF,QAAQ,MAAM,MAAM,IAAI,wBAAwB,GAAG,GAAG,WAAW,CAAC;AAAA,IACxE;AAAA,EACF;AAEA,QAAM,YAAY,OAAO,KAAK,QAAQ,KAAK;AAC3C,MAAI,QAA+B;AACnC,QAAM,UAAU,CAAC,SAAkB;AACjC,QAAI,MAAM;AACR,YAAM,OAAO,IAAI,IAAI;AACrB,iBAAW,OAAO,gBAAgB;AAChC,YAAI,SAAS,OAAO,SAAS,MAAM,GAAG,EAAG;AAAA,MAC3C;AAAA,IACF;AACA,QAAI,MAAO,cAAa,KAAK;AAC7B,YAAQ,WAAW,KAAK,SAAS;AAAA,EACnC;AAEA,MAAI,KAAK,MAAM;AACb,YAAQ;AAAA,MACN,KAAK,UAAU;AAAA,QACb,OAAO;AAAA,QACP,SAAS,MAAM,KAAK,cAAc;AAAA,QAClC,SAAS,MAAM,KAAK,cAAc;AAAA,MACpC,CAAC;AAAA,IACH;AAAA,EACF,OAAO;AACL,YAAQ;AAAA,MACN,MAAM;AAAA,QACJ,kBACE,MAAM,KAAK,cAAc,EACtB,IAAI,CAAC,MAAW,cAAS,QAAQ,IAAI,GAAG,CAAC,CAAC,EAC1C,KAAK,MAAM;AAAA,MAClB;AAAA,IACF;AAAA,EACF;AAEA,UACG,GAAG,OAAO,CAAC,MAAM,QAAQ,CAAC,CAAC,EAC3B,GAAG,UAAU,CAAC,MAAM,QAAQ,CAAC,CAAC,EAC9B,GAAG,UAAU,CAAC,MAAM,QAAQ,CAAC,CAAC,EAC9B,GAAG,SAAS,CAAC,QAAQ,QAAQ,MAAM,MAAM,IAAI,gBAAgB,GAAG,GAAG,CAAC;AAEvE,QAAM,IAAI;AACZ,CAAC;AAEH,QACG,QAAQ,MAAM,EACd,YAAY,2BAA2B,EACvC,OAAO,aAAa,iBAAiB,EACrC,OAAO,OAAO,UAAe;AAC5B,QAAM,KAAK,MAAM,OAAO,aAAkB;AAC1C,QAAMC,QAAO,MAAM,OAAO,MAAW;AACrC,QAAM,SAASA,MAAK,QAAQ,QAAQ,IAAI,GAAG,gBAAgB;AAC3D,QAAM,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQjB,MAAI;AACF,UAAM,GAAG,UAAU,QAAQ,UAAU,EAAE,MAAM,KAAK,CAAC;AACnD,YAAQ,IAAI,MAAM,MAAM,WAAW,MAAM,EAAE,CAAC;AAAA,EAC9C,SAAS,GAAQ;AACf,YAAQ,MAAM,MAAM,IAAI,cAAc,GAAG,GAAG,WAAW,CAAC;AACxD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QAAQ,WAAW,QAAQ,IAAI;","names":["watcher","path"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../src/sponsor.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { SchemaAnalyzer } from '@drzl/analyzer';\nimport { ORPCGenerator } from '@drzl/generator-orpc';\nimport chalk from 'chalk';\nimport chokidar from 'chokidar';\nimport cliProgress from 'cli-progress';\nimport { Command } from 'commander';\nimport * as path from 'node:path';\nimport ora from 'ora';\nimport {\n computeGeneratorOutputDirs,\n computeWatchTargets,\n DrzlConfig,\n loadConfig,\n} from './config.js';\nimport { maybeShowSponsorMessage } from './sponsor.js';\n\nconst program = new Command();\nprogram.name('drzl').description('DRZL - Drizzle Developer Toolkit').version('0.0.1');\nprogram.addHelpText(\n 'afterAll',\n `\\nNeed a template, adapter, or generator DRZL doesn't ship yet?\\nā DM @omardulaimidev on X: https://x.com/omardulaimidev\\n`\n);\n\nprogram\n .command('analyze')\n .argument('<schema>', 'path to drizzle schema (TS)')\n .option('--relations', 'include relations', true)\n .option('--validate', 'validate constraints', true)\n .option('--out <file>', 'write analysis JSON to file')\n .option('--json', 'print JSON to stdout (overrides --out)', false)\n .action(async (schema: string, opts: any) => {\n try {\n const analyzer = new SchemaAnalyzer(schema);\n const spinner = !opts.json ? ora('Analyzing schema...').start() : null;\n const start = Date.now();\n const res = await analyzer.analyze({\n includeRelations: !!opts.relations,\n validateConstraints: !!opts.validate,\n });\n const ms = Date.now() - start;\n const json = JSON.stringify(res, null, 2);\n if (opts.json) {\n console.log(json);\n } else if (opts.out) {\n const fs = await import('node:fs/promises');\n await fs.writeFile(opts.out, json, 'utf8');\n spinner?.succeed(chalk.green(`Analysis written to ${opts.out} in ${ms}ms`));\n } else {\n spinner?.succeed(chalk.green(`Analyzed in ${ms}ms`));\n console.log(json);\n }\n process.exit(res.issues.some((i) => i.level === 'error') ? 2 : 0);\n } catch (e: any) {\n const msg = e?.message ?? String(e);\n if (opts.json)\n console.log(JSON.stringify({ event: 'error', code: 'DRZL_CLI_ANALYZE', message: msg }));\n else\n console.error(\n chalk.red('Analyze failed (DRZL_CLI_ANALYZE):'),\n msg,\n '\\nTip: run with --json for structured output.'\n );\n process.exit(1);\n }\n });\n\nprogram\n .command('generate')\n .description('Run configured generators (drzl.config.*)')\n .option('-c, --config <path>', 'path to drzl.config')\n .action(async (opts: any) => {\n try {\n const cfg = await loadConfig(opts.config);\n if (!cfg) {\n console.error(\n chalk.red('No config found (DRZL_CFG_001). Create drzl.config.ts or pass --config.')\n );\n process.exit(2);\n return;\n }\n const analyzer = new SchemaAnalyzer(cfg.schema);\n const spinner = ora('Analyzing...').start();\n const t0 = Date.now();\n const analysis = await analyzer.analyze({\n includeRelations: cfg.analyzer.includeRelations,\n validateConstraints: cfg.analyzer.validateConstraints,\n includeHeuristicRelations: cfg.analyzer.includeHeuristicRelations,\n });\n spinner.succeed(`Analysis complete in ${Date.now() - t0}ms`);\n const progress = new cliProgress.SingleBar(\n { hideCursor: true },\n cliProgress.Presets.shades_classic\n );\n const total = analysis.tables.length || 1;\n progress.start(total, 0);\n for (const g of cfg.generators) {\n if (g.kind === 'orpc') {\n const gen = new ORPCGenerator(analysis);\n const { files } = await gen.generate({\n outputDir: cfg.outDir,\n template: g.template,\n includeRelations: g.includeRelations,\n naming: g.naming,\n outputHeader: g.outputHeader,\n format: g.format,\n templateOptions: g.templateOptions,\n validation: g.validation,\n onProgress: ({ index }) => progress.update(index),\n });\n progress.stop();\n ora().succeed(chalk.green(`Generated (${g.kind}): ${files.length} files`));\n files.forEach((f: string) => console.log(' -', chalk.cyan(f)));\n } else if (g.kind === 'service') {\n try {\n const { ServiceGenerator } = await import('@drzl/generator-service');\n const gen = new ServiceGenerator(analysis);\n const target = g.path ?? 'src/services';\n const files = await gen.generate({\n outDir: target,\n outputHeader: g.outputHeader,\n format: g.format,\n dataAccess: g.dataAccess,\n dbImportPath: g.dbImportPath,\n schemaImportPath: g.schemaImportPath,\n });\n progress.stop();\n ora().succeed(chalk.green(`Generated (service): ${files.length} files`));\n files.forEach((f: string) => console.log(' -', chalk.cyan(f)));\n } catch (e: any) {\n progress.stop();\n console.error(\n chalk.red('Service generator missing.'),\n chalk.yellow('\\nInstall with: npm install @drzl/generator-service')\n );\n console.error(chalk.gray('Error details:'), e?.message ?? e);\n process.exit(1);\n }\n } else if (g.kind === 'zod') {\n try {\n const { ZodGenerator } = await import('@drzl/generator-zod');\n const gen = new ZodGenerator(analysis);\n const target = g.path ?? 'src/validators/zod';\n const files = await gen.generate({\n outDir: target,\n outputHeader: g.outputHeader,\n format: g.format,\n schemaSuffix: g.schemaSuffix,\n fileSuffix: g.fileSuffix,\n });\n progress.stop();\n ora().succeed(chalk.green(`Generated (zod): ${files.length} files`));\n files.forEach((f: string) => console.log(' -', chalk.cyan(f)));\n } catch (e: any) {\n progress.stop();\n console.error(\n chalk.red('Zod generator missing.'),\n chalk.yellow('\\nInstall with: npm install @drzl/generator-zod')\n );\n console.error(chalk.gray('Error details:'), e?.message ?? e);\n process.exit(1);\n }\n } else if (g.kind === 'valibot') {\n try {\n const { ValibotGenerator } = await import('@drzl/generator-valibot');\n const gen = new ValibotGenerator(analysis);\n const target = g.path ?? 'src/validators/valibot';\n const files = await gen.generate({\n outDir: target,\n outputHeader: g.outputHeader,\n format: g.format,\n schemaSuffix: g.schemaSuffix,\n fileSuffix: g.fileSuffix,\n });\n progress.stop();\n ora().succeed(chalk.green(`Generated (valibot): ${files.length} files`));\n files.forEach((f: string) => console.log(' -', chalk.cyan(f)));\n } catch (e: any) {\n progress.stop();\n console.error(\n chalk.red('Valibot generator missing.'),\n chalk.yellow('\\nInstall with: npm install @drzl/generator-valibot')\n );\n console.error(chalk.gray('Error details:'), e?.message ?? e);\n process.exit(1);\n }\n } else if (g.kind === 'arktype') {\n try {\n const { ArkTypeGenerator } = await import('@drzl/generator-arktype');\n const gen = new ArkTypeGenerator(analysis);\n const target = g.path ?? 'src/validators/arktype';\n const files = await gen.generate({\n outDir: target,\n outputHeader: g.outputHeader,\n format: g.format,\n schemaSuffix: g.schemaSuffix,\n fileSuffix: g.fileSuffix,\n });\n progress.stop();\n ora().succeed(chalk.green(`Generated (arktype): ${files.length} files`));\n files.forEach((f: string) => console.log(' -', chalk.cyan(f)));\n } catch (e: any) {\n progress.stop();\n console.error(\n chalk.red('ArkType generator missing.'),\n chalk.yellow('\\nInstall with: npm install @drzl/generator-arktype')\n );\n console.error(chalk.gray('Error details:'), e?.message ?? e);\n process.exit(1);\n }\n }\n }\n if (cfg.generators.length) {\n maybeShowSponsorMessage({ reason: 'generate' });\n }\n } catch (e: any) {\n console.error(\n chalk.red('Generate failed (DRZL_GEN_001):'),\n e?.message ?? e,\n '\\nTip: check your drzl.config.ts and template path.'\n );\n process.exit(1);\n }\n });\n\nprogram\n .command('generate:orpc')\n .argument('<schema>', 'path to drizzle schema (TS)')\n .option('-o, --outDir <dir>', 'output directory', 'src/api')\n .option('--template <name>', 'template name', 'standard')\n .option('--includeRelations', 'include relation endpoints')\n .action(async (schema: string, opts: any) => {\n try {\n const analyzer = new SchemaAnalyzer(schema);\n const analysis = await analyzer.analyze({\n includeRelations: !!opts.includeRelations,\n validateConstraints: true,\n });\n const gen = new ORPCGenerator(analysis);\n const { files } = await gen.generate({\n outputDir: opts.outDir,\n template: opts.template,\n includeRelations: !!opts.includeRelations,\n });\n console.log(chalk.green(`Generated:`), files.map((f) => chalk.cyan(f)).join(', '));\n maybeShowSponsorMessage({ reason: 'generate:orpc' });\n } catch (e: any) {\n console.error(chalk.red('Generate orpc failed:'), e?.message ?? e);\n process.exit(1);\n }\n });\n\nprogram\n .command('watch')\n .description('Watch schema and regenerate on changes')\n .option('-c, --config <path>', 'path to drzl.config')\n .option('--pipeline <name>', 'all | analyze | generate-orpc', 'all')\n .option('--debounce <ms>', 'debounce ms', '200')\n .option('--json', 'emit JSON logs', false)\n .option('--poll', 'force polling (helps WSL/Docker/remote FS)', false)\n .action(async (opts: any) => {\n let cfg = await loadConfig(opts.config);\n if (!cfg) {\n console.error(chalk.red('No config found. Create drzl.config.ts or pass --config.'));\n process.exit(2);\n return;\n }\n\n const abs = (p: string) => path.resolve(process.cwd(), p);\n const isInside = (child: string, parent: string) => {\n const rel = path.relative(parent, child);\n return !!rel && !rel.startsWith('..') && !path.isAbsolute(rel);\n };\n\n const ignoredOutDirs = new Set<string>(computeGeneratorOutputDirs(cfg).map(abs));\n const currentTargets = new Set<string>(computeWatchTargets(cfg).map(abs));\n\n const syncWatcherTargets = (watcher: import('chokidar').FSWatcher, next: Set<string>) => {\n const add: string[] = [];\n const del: string[] = [];\n for (const p of next) if (!currentTargets.has(p)) add.push(p);\n for (const p of currentTargets) if (!next.has(p)) del.push(p);\n if (add.length) watcher.add(add);\n if (del.length) watcher.unwatch(del);\n currentTargets.clear();\n next.forEach((p) => currentTargets.add(p));\n };\n\n const rebuildIgnoreDirsFrom = (cfgNow: DrzlConfig) => {\n ignoredOutDirs.clear();\n for (const d of computeGeneratorOutputDirs(cfgNow)) ignoredOutDirs.add(abs(d));\n };\n\n const ignoredFn = (p: string) => {\n const full = abs(p);\n for (const dir of ignoredOutDirs) {\n if (full === dir || isInside(full, dir)) return true;\n }\n return false;\n };\n\n const watcher = chokidar.watch(Array.from(currentTargets), {\n ignoreInitial: true,\n awaitWriteFinish: { stabilityThreshold: 400, pollInterval: 50 },\n usePolling: !!opts.poll,\n ignored: ignoredFn,\n });\n\n const logTrigger = (type: 'add' | 'change' | 'unlink', file: string) => {\n if (opts.json) console.log(JSON.stringify({ event: 'trigger', type, file }));\n };\n\n watcher\n .on('add', (p) => {\n logTrigger('add', p);\n trigger(p);\n })\n .on('change', (p) => {\n logTrigger('change', p);\n trigger(p);\n })\n .on('unlink', (p) => {\n logTrigger('unlink', p);\n trigger(p);\n });\n\n let lastFiles: string[] = [];\n\n const run = async () => {\n try {\n const reloaded = await loadConfig(opts.config);\n if (!reloaded) throw new Error('Config disappeared during watch.');\n cfg = reloaded;\n\n rebuildIgnoreDirsFrom(cfg);\n const nextTargets = new Set<string>(computeWatchTargets(cfg).map(abs));\n syncWatcherTargets(watcher, nextTargets);\n\n if (!opts.json) console.clear();\n\n if (opts.json) {\n console.log(\n JSON.stringify({\n event: 'watch_config_applied',\n targets: Array.from(currentTargets),\n ignored: Array.from(ignoredOutDirs),\n })\n );\n }\n\n const analyzer = new SchemaAnalyzer(cfg.schema);\n const analysis = await analyzer.analyze({\n includeRelations: cfg.analyzer.includeRelations,\n validateConstraints: cfg.analyzer.validateConstraints,\n includeHeuristicRelations: cfg.analyzer.includeHeuristicRelations,\n });\n\n if (opts.pipeline === 'analyze') {\n if (opts.json) {\n console.log(\n JSON.stringify({\n event: 'analyze_complete',\n issues: analysis.issues,\n tables: analysis.tables.length,\n })\n );\n } else {\n console.log(chalk.green('Analyze complete.'));\n }\n return;\n }\n\n const newFiles: string[] = [];\n\n for (const g of cfg.generators) {\n if (\n opts.pipeline !== 'all' &&\n !(opts.pipeline === 'generate-orpc' && g.kind === 'orpc')\n ) {\n continue;\n }\n\n if (g.kind === 'orpc') {\n const gen = new ORPCGenerator(analysis);\n const { files } = await gen.generate({\n outputDir: cfg.outDir,\n template: g.template,\n includeRelations: g.includeRelations,\n naming: g.naming,\n outputHeader: g.outputHeader,\n format: g.format,\n templateOptions: g.templateOptions,\n validation: g.validation,\n });\n opts.json\n ? console.log(JSON.stringify({ event: 'generate_complete', kind: g.kind, files }))\n : console.log(\n chalk.green(`Generated (${g.kind}):`),\n files.map((f: string) => chalk.cyan(f)).join(', ')\n );\n newFiles.push(...files);\n } else if (g.kind === 'service') {\n try {\n const { ServiceGenerator } = await import('@drzl/generator-service');\n const gen = new ServiceGenerator(analysis);\n const target = g.path ?? 'src/services';\n const files = await gen.generate({\n outDir: target,\n outputHeader: g.outputHeader,\n format: g.format,\n dataAccess: g.dataAccess,\n dbImportPath: g.dbImportPath,\n schemaImportPath: g.schemaImportPath,\n });\n opts.json\n ? console.log(JSON.stringify({ event: 'generate_complete', kind: g.kind, files }))\n : console.log(\n chalk.green(`Generated (service): ${files.length} files`),\n files.map((f: string) => chalk.cyan(f)).join(', ')\n );\n newFiles.push(...files);\n } catch (e: any) {\n console.error(\n chalk.red('Service generator missing.'),\n chalk.yellow('\\nInstall with: npm install @drzl/generator-service')\n );\n console.error(chalk.gray('Error details:'), e?.message ?? e);\n return;\n }\n } else if (g.kind === 'zod') {\n try {\n const { ZodGenerator } = await import('@drzl/generator-zod');\n const gen = new ZodGenerator(analysis);\n const target = g.path ?? 'src/validators/zod';\n const files = await gen.generate({\n outDir: target,\n outputHeader: g.outputHeader,\n format: g.format,\n schemaSuffix: g.schemaSuffix,\n fileSuffix: g.fileSuffix,\n });\n opts.json\n ? console.log(JSON.stringify({ event: 'generate_complete', kind: g.kind, files }))\n : console.log(\n chalk.green(`Generated (zod): ${files.length} files`),\n files.map((f: string) => chalk.cyan(f)).join(', ')\n );\n newFiles.push(...files);\n } catch (e: any) {\n console.error(\n chalk.red('Zod generator missing.'),\n chalk.yellow('\\nInstall with: npm install @drzl/generator-zod')\n );\n console.error(chalk.gray('Error details:'), e?.message ?? e);\n return;\n }\n } else if (g.kind === 'valibot') {\n try {\n const { ValibotGenerator } = await import('@drzl/generator-valibot');\n const gen = new ValibotGenerator(analysis);\n const target = g.path ?? 'src/validators/valibot';\n const files = await gen.generate({\n outDir: target,\n outputHeader: g.outputHeader,\n format: g.format,\n schemaSuffix: g.schemaSuffix,\n fileSuffix: g.fileSuffix,\n });\n opts.json\n ? console.log(JSON.stringify({ event: 'generate_complete', kind: g.kind, files }))\n : console.log(\n chalk.green(`Generated (valibot): ${files.length} files`),\n files.map((f: string) => chalk.cyan(f)).join(', ')\n );\n newFiles.push(...files);\n } catch (e: any) {\n console.error(\n chalk.red('Valibot generator missing.'),\n chalk.yellow('\\nInstall with: npm install @drzl/generator-valibot')\n );\n console.error(chalk.gray('Error details:'), e?.message ?? e);\n return;\n }\n } else if (g.kind === 'arktype') {\n try {\n const { ArkTypeGenerator } = await import('@drzl/generator-arktype');\n const gen = new ArkTypeGenerator(analysis);\n const target = g.path ?? 'src/validators/arktype';\n const files = await gen.generate({\n outDir: target,\n outputHeader: g.outputHeader,\n format: g.format,\n schemaSuffix: g.schemaSuffix,\n fileSuffix: g.fileSuffix,\n });\n opts.json\n ? console.log(JSON.stringify({ event: 'generate_complete', kind: g.kind, files }))\n : console.log(\n chalk.green(`Generated (arktype): ${files.length} files`),\n files.map((f: string) => chalk.cyan(f)).join(', ')\n );\n newFiles.push(...files);\n } catch (e: any) {\n console.error(\n chalk.red('ArkType generator missing.'),\n chalk.yellow('\\nInstall with: npm install @drzl/generator-arktype')\n );\n console.error(chalk.gray('Error details:'), e?.message ?? e);\n return;\n }\n }\n }\n\n const added = newFiles.filter((f) => !lastFiles.includes(f));\n const removed = lastFiles.filter((f) => !newFiles.includes(f));\n opts.json\n ? console.log(JSON.stringify({ event: 'diff', added, removed }))\n : (() => {\n if (added.length) console.log(chalk.blue(`Added: ${added.join(', ')}`));\n if (removed.length) console.log(chalk.yellow(`Removed: ${removed.join(', ')}`));\n })();\n if (newFiles.length && !opts.json) {\n const reason =\n opts.pipeline && opts.pipeline !== 'all' ? `watch:${opts.pipeline}` : 'watch';\n maybeShowSponsorMessage({ reason });\n }\n lastFiles = newFiles;\n } catch (e: any) {\n opts.json\n ? console.log(JSON.stringify({ event: 'error', message: String(e?.message ?? e) }))\n : console.error(chalk.red('Watch pipeline failed:'), e?.message ?? e);\n }\n };\n\n const debounced = Number(opts.debounce) || 200;\n let timer: NodeJS.Timeout | null = null;\n const trigger = (file?: string) => {\n if (file) {\n const full = abs(file);\n for (const dir of ignoredOutDirs) {\n if (full === dir || isInside(full, dir)) return;\n }\n }\n if (timer) clearTimeout(timer);\n timer = setTimeout(run, debounced);\n };\n\n if (opts.json) {\n console.log(\n JSON.stringify({\n event: 'watching',\n targets: Array.from(currentTargets),\n ignored: Array.from(ignoredOutDirs),\n })\n );\n } else {\n console.log(\n chalk.gray(\n 'Watching:\\n ' +\n Array.from(currentTargets)\n .map((p) => path.relative(process.cwd(), p))\n .join('\\n ')\n )\n );\n }\n\n watcher\n .on('add', (p) => trigger(p))\n .on('change', (p) => trigger(p))\n .on('unlink', (p) => trigger(p))\n .on('error', (err) => console.error(chalk.red('Watcher error:'), err));\n\n await run();\n });\n\nprogram\n .command('init')\n .description('Scaffold a drzl.config.ts')\n .option('-y, --yes', 'accept defaults')\n .action(async (_opts: any) => {\n const fs = await import('node:fs/promises');\n const path = await import('node:path');\n const target = path.resolve(process.cwd(), 'drzl.config.ts');\n const template = `export default {\n schema: 'src/db/schema.ts',\n outDir: 'src/api',\n analyzer: { includeRelations: true, validateConstraints: true },\n generators: [\n { kind: 'orpc', template: 'standard', includeRelations: true }\n ]\n} as const\\n`;\n try {\n await fs.writeFile(target, template, { flag: 'wx' });\n console.log(chalk.green(`Created ${target}`));\n } catch (e: any) {\n console.error(chalk.red('Init failed:'), e?.message ?? e);\n process.exit(1);\n }\n });\n\nprogram.parseAsync(process.argv);\n","import chalk from 'chalk';\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport path from 'node:path';\n\nexport interface SponsorMessageOptions {\n reason?: string;\n minIntervalMs?: number;\n force?: boolean;\n}\n\ninterface SponsorCachePayload {\n runs: number;\n lastShownAt?: number;\n lastReason?: string;\n}\n\nconst CACHE_DIR = path.join(process.cwd(), 'node_modules', '.cache', '@drzl');\nconst CACHE_FILE = path.join(CACHE_DIR, 'sponsor-message.json');\nconst DEFAULT_INTERVAL_MS = 1000 * 60 * 15; // 15 minutes\nlet shownThisProcess = false;\n\nconst tips = [\n 'Pair DRZL watch mode with drizzle-kit to keep schema & API synced.',\n 'Templatize your ORPC routers to roll out new endpoints safely.',\n 'Need typed validators? Enable the zod, valibot, or arktype generators.',\n 'Use output headers to track generated files and trim noisy diffs.',\n];\n\nconst green = (msg: string) => chalk.hex('#6ee7b7')(msg);\nconst cyan = (msg: string) => chalk.cyan(msg);\nconst gray = (msg: string) => chalk.gray(msg);\n\nexport function maybeShowSponsorMessage({\n reason = 'generate',\n minIntervalMs = DEFAULT_INTERVAL_MS,\n force = false,\n}: SponsorMessageOptions = {}) {\n const hideViaEnv = process.env.DRZL_HIDE_SPONSOR?.toLowerCase();\n const hideRequested = hideViaEnv === '1' || hideViaEnv === 'true';\n if (hideRequested || (process.env.CI && !force) || (shownThisProcess && !force)) return;\n\n try {\n mkdirSync(CACHE_DIR, { recursive: true });\n const payload = readCache();\n payload.runs += 1;\n\n const now = Date.now();\n const shouldShow = force || now - (payload.lastShownAt ?? 0) >= minIntervalMs;\n\n if (shouldShow) {\n payload.lastShownAt = now;\n payload.lastReason = reason;\n }\n\n writeCache(payload);\n\n if (!shouldShow) return;\n\n shownThisProcess = true;\n const tip = tips[payload.runs % tips.length];\n\n console.log(\n `\\n${cyan(`š DRZL finished a ${reason} run (#${payload.runs.toLocaleString()}).`)}\\n\\n` +\n `${green('⨠Sponsors keep DRZL shipping. Consider supporting ongoing dev:')}\\n` +\n ` ${green('GitHub Sponsors')} ${gray('ā https://github.com/sponsors/omar-dulaimi')}\\n\\n` +\n `${green('Pro tip:')} ${tip}\\n`\n );\n } catch {\n // Swallow to avoid impacting generator success paths\n }\n}\n\nfunction readCache(): SponsorCachePayload {\n if (!existsSync(CACHE_FILE)) {\n return { runs: 0 };\n }\n try {\n const data = JSON.parse(readFileSync(CACHE_FILE, 'utf8')) as SponsorCachePayload;\n if (typeof data.runs !== 'number') return { runs: 0 };\n return data;\n } catch {\n return { runs: 0 };\n }\n}\n\nfunction writeCache(payload: SponsorCachePayload) {\n writeFileSync(CACHE_FILE, JSON.stringify(payload, null, 2), 'utf8');\n}\n"],"mappings":"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","names":["chalk","path","chalk","watcher","path"]}
|