@drzl/cli 4.19.0 → 4.23.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.
@@ -0,0 +1,434 @@
1
+ // ../generator-nestjs/dist/index.js
2
+ import { fileWriter } from "@drzl/validation-core";
3
+ import {
4
+ formatCode,
5
+ importSpecifier,
6
+ insertColumns,
7
+ selectColumns,
8
+ updateColumns
9
+ } from "@drzl/validation-core";
10
+ var APP_MODULE = "index";
11
+ var VALIDATION_MODULE = "validation";
12
+ var q = (v) => JSON.stringify(v);
13
+ var NUMERIC_SEGMENT = String.raw`/^-?\d+(\.\d+)?$/`;
14
+ var BIGINT_DIGITS = String.raw`/^-?\d+$/`;
15
+ var LIB_IMPORTS = {
16
+ zod: "import { z } from 'zod';",
17
+ valibot: "import * as v from 'valibot';",
18
+ arktype: "import { type } from 'arktype';"
19
+ };
20
+ var LIBS = {
21
+ zod: {
22
+ number: "z.number()",
23
+ string: "z.string()",
24
+ boolean: "z.boolean()",
25
+ date: "z.date()",
26
+ dateInput: "z.iso.datetime().transform((s) => new Date(s))",
27
+ bigint: `z.string().regex(${BIGINT_DIGITS})`,
28
+ unknown: "z.unknown()",
29
+ enum: (vals) => `z.enum([${vals.map(q).join(", ")}] as const)`,
30
+ nullable: (b) => `${b}.nullable()`,
31
+ optional: (b) => `${b}.optional()`,
32
+ object: (body) => `z.object({
33
+ ${body}
34
+ })`,
35
+ objectInline: (body) => `z.object({ ${body} })`,
36
+ coerce: (t) => t === "number" ? `z.string().regex(${NUMERIC_SEGMENT}).transform(Number)` : t === "Date" ? "z.iso.datetime().transform((s) => new Date(s))" : t === "bigint" ? `z.string().regex(${BIGINT_DIGITS})` : null
37
+ },
38
+ valibot: {
39
+ number: "v.number()",
40
+ string: "v.string()",
41
+ boolean: "v.boolean()",
42
+ date: "v.date()",
43
+ dateInput: "v.pipe(v.string(), v.isoTimestamp(), v.transform((s) => new Date(s)))",
44
+ bigint: `v.pipe(v.string(), v.regex(${BIGINT_DIGITS}))`,
45
+ unknown: "v.unknown()",
46
+ enum: (vals) => `v.picklist([${vals.map(q).join(", ")}] as const)`,
47
+ nullable: (b) => `v.nullable(${b})`,
48
+ optional: (b) => `v.optional(${b})`,
49
+ object: (body) => `v.object({
50
+ ${body}
51
+ })`,
52
+ objectInline: (body) => `v.object({ ${body} })`,
53
+ // A valibot pipe step sees the previous step's *output*, so the check has to happen while
54
+ // the value is still the string: after a `v.transform(Number)` there is no string left.
55
+ coerce: (t) => t === "number" ? `v.pipe(v.string(), v.regex(${NUMERIC_SEGMENT}), v.transform(Number))` : t === "Date" ? "v.pipe(v.string(), v.isoTimestamp(), v.transform((s) => new Date(s)))" : t === "bigint" ? `v.pipe(v.string(), v.regex(${BIGINT_DIGITS}))` : null
56
+ },
57
+ arktype: {
58
+ number: "number",
59
+ string: "string",
60
+ boolean: "boolean",
61
+ date: "Date",
62
+ dateInput: "string.date.iso.parse",
63
+ bigint: BIGINT_DIGITS,
64
+ unknown: "unknown",
65
+ // The surrounding encode adds the quotes, so the union is built with the inner quoting
66
+ // ArkType expects.
67
+ enum: (vals) => vals.map((x) => `'${x.replace(/'/g, "\\'")}'`).join(" | "),
68
+ nullable: (b) => `(${b} | null)`,
69
+ optional: (b) => `${b}?`,
70
+ // `.onUndeclaredKey('delete')` because ArkType's default keeps undeclared keys (measured on
71
+ // 2.2.3), where zod and valibot strip them. A DTO's whole point is that the controller
72
+ // receives the declared shape, so the three libraries are aligned on the strict side.
73
+ object: (body) => `type({
74
+ ${body}
75
+ }).onUndeclaredKey('delete')`,
76
+ objectInline: (body) => `type({ ${body} }).onUndeclaredKey('delete')`,
77
+ fieldIsString: true,
78
+ // ArkType ships these as keywords, and they are morphs: the declared output type is the
79
+ // parsed one. `string.date.iso.parse` and not `string.date.parse`, which accepts `"1"` as
80
+ // the year 2001.
81
+ coerce: (t) => t === "number" ? "string.numeric.parse" : t === "Date" ? "string.date.iso.parse" : t === "bigint" ? BIGINT_DIGITS : null
82
+ }
83
+ };
84
+ var cap = (s) => s.charAt(0).toUpperCase() + s.slice(1);
85
+ var isIdent = (s) => /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(s);
86
+ function keyColumns(table) {
87
+ const names = table.primaryKey?.columns ?? [];
88
+ if (!names.length) return null;
89
+ const cols = names.map((n) => table.columns.find((c) => c.name === n));
90
+ if (cols.some((c) => !c)) return null;
91
+ return cols;
92
+ }
93
+ function isWide(column) {
94
+ if (column.enumValues && column.enumValues.length) return false;
95
+ if (column.shape?.kind === "tuple" || column.shape?.kind === "numberObject") return false;
96
+ return !["number", "string", "boolean", "Date", "bigint"].includes(column.tsType);
97
+ }
98
+ function baseExpr(column, d, mode) {
99
+ if (column.enumValues && column.enumValues.length) return d.enum(column.enumValues);
100
+ switch (column.tsType) {
101
+ case "number":
102
+ return d.number;
103
+ case "string":
104
+ return d.string;
105
+ case "boolean":
106
+ return d.boolean;
107
+ case "Date":
108
+ return mode === "select" ? d.date : d.dateInput;
109
+ case "bigint":
110
+ return d.bigint;
111
+ default:
112
+ return d.unknown;
113
+ }
114
+ }
115
+ function mapExpr(column, lib, mode) {
116
+ const d = LIBS[lib];
117
+ let expr = baseExpr(column, d, mode);
118
+ if (column.nullable) expr = d.nullable(expr);
119
+ if (mode === "update" || mode === "insert" && column.hasDefault) expr = d.optional(expr);
120
+ return expr;
121
+ }
122
+ function objectKey(name) {
123
+ return isIdent(name) ? name : JSON.stringify(name);
124
+ }
125
+ function field(column, lib, mode) {
126
+ const d = LIBS[lib];
127
+ const expr = mapExpr(column, lib, mode);
128
+ return `${objectKey(column.name)}: ${d.fieldIsString ? JSON.stringify(expr) : expr}`;
129
+ }
130
+ function paramField(column, lib) {
131
+ const d = LIBS[lib];
132
+ const expr = (() => {
133
+ if (column.enumValues && column.enumValues.length) return d.enum(column.enumValues);
134
+ return d.coerce(column.tsType) ?? d.string;
135
+ })();
136
+ return `${objectKey(column.name)}: ${d.fieldIsString ? JSON.stringify(expr) : expr}`;
137
+ }
138
+ function renderSchema(cols, lib, mode) {
139
+ const d = LIBS[lib];
140
+ const body = cols.map((c) => ` ${field(c, lib, mode)},`).join("\n");
141
+ return d.object(body);
142
+ }
143
+ function fieldType(column) {
144
+ if (column.enumValues && column.enumValues.length) {
145
+ return column.enumValues.map((x) => `'${x.replace(/'/g, "\\'")}'`).join(" | ");
146
+ }
147
+ switch (column.tsType) {
148
+ case "number":
149
+ return "number";
150
+ case "string":
151
+ return "string";
152
+ case "boolean":
153
+ return "boolean";
154
+ case "Date":
155
+ return "Date";
156
+ case "bigint":
157
+ return "string";
158
+ default:
159
+ return "unknown";
160
+ }
161
+ }
162
+ function paramFieldType(column) {
163
+ if (column.enumValues && column.enumValues.length) return fieldType(column);
164
+ switch (column.tsType) {
165
+ case "number":
166
+ return "number";
167
+ case "Date":
168
+ return "Date";
169
+ default:
170
+ return "string";
171
+ }
172
+ }
173
+ function classField(column, mode) {
174
+ const key = isIdent(column.name) ? column.name : `'${column.name.replace(/'/g, "\\'")}'`;
175
+ if (mode === "params") return ` ${key}!: ${paramFieldType(column)};`;
176
+ const optional = mode === "update" || mode === "insert" && column.hasDefault;
177
+ const type = `${fieldType(column)}${column.nullable ? " | null" : ""}`;
178
+ return optional ? ` ${key}?: ${type};` : ` ${key}!: ${type};`;
179
+ }
180
+ function toCase(s, c) {
181
+ if (!c) return s;
182
+ const parts = s.replace(/([a-z0-9])([A-Z])/g, "$1 $2").replace(/[_-]/g, " ").split(/\s+/);
183
+ if (c === "camel") {
184
+ return parts.map(
185
+ (p, i) => i === 0 ? p.toLowerCase() : p.charAt(0).toUpperCase() + p.slice(1).toLowerCase()
186
+ ).join("");
187
+ }
188
+ if (c === "kebab") return parts.map((p) => p.toLowerCase()).join("-");
189
+ if (c === "snake") return parts.map((p) => p.toLowerCase()).join("_");
190
+ return s;
191
+ }
192
+ var NestJSGenerator = class {
193
+ constructor(analysis) {
194
+ this.analysis = analysis;
195
+ }
196
+ async generate(opts) {
197
+ const fs = fileWriter(opts.fileSink);
198
+ const path = await import("path");
199
+ const out = path.resolve(process.cwd(), opts.outputDir);
200
+ const ctx = { out };
201
+ await fs.mkdir(out, { recursive: true });
202
+ const files = [];
203
+ const write = async (filePath, content) => {
204
+ const formatted = await formatCode(
205
+ buildHeader(opts.outputHeader) + content,
206
+ filePath,
207
+ opts.format
208
+ );
209
+ await fs.writeFile(filePath, formatted, "utf8");
210
+ files.push(filePath);
211
+ };
212
+ const barrelPath = path.join(out, `${APP_MODULE}.ts`);
213
+ const validationPath = path.join(out, `${VALIDATION_MODULE}.ts`);
214
+ const modules = [];
215
+ const total = this.analysis.tables.length;
216
+ let index = 0;
217
+ for (const table of this.analysis.tables) {
218
+ const base = `${table.tsName}${opts.naming?.routerSuffix ?? ""}`;
219
+ const filePath = path.join(out, `${toCase(base, opts.naming?.procedureCase)}.ts`);
220
+ if (filePath === barrelPath || filePath === validationPath) {
221
+ const which = filePath === barrelPath ? "the barrel" : "the validation pipe module";
222
+ throw new Error(
223
+ `@drzl/generator-nestjs: the DTOs for table "${table.name}" would be written to ${filePath}, which is ${which} this generator also writes. Set naming.routerSuffix to move it out of the way.`
224
+ );
225
+ }
226
+ await write(filePath, renderTable(table, opts));
227
+ modules.push({ filePath });
228
+ index++;
229
+ opts.onProgress?.({ index, total, table: table.name, filePath });
230
+ }
231
+ await write(validationPath, renderValidationModule());
232
+ await write(barrelPath, renderBarrel(modules, ctx, path, opts));
233
+ return { files };
234
+ }
235
+ };
236
+ var index_default = NestJSGenerator;
237
+ function buildHeader(h) {
238
+ if (h && h.enabled === false) return "";
239
+ const text = h?.text?.trim();
240
+ const lines = text ? text.split(/\r?\n/).map((l) => `// ${l}`) : [
241
+ "// Generated by DRZL (@drzl/*)",
242
+ "// Generated output is granted to you under your project's license.",
243
+ "// You may use, copy, modify, and distribute without attribution."
244
+ ];
245
+ return lines.join("\n") + "\n\n";
246
+ }
247
+ function renderValidationModule() {
248
+ return `// Generated by @drzl/generator-nestjs
249
+ // A validation pipe over Standard Schema v1. Bind it globally
250
+ // (app.useGlobalPipes(new SchemaValidationPipe())) or per handler with @UsePipes. A parameter
251
+ // whose class carries a static Standard Schema (every DTO in this directory) is validated and
252
+ // replaced by the parsed output; anything else, primitives and foreign DTOs alike, passes
253
+ // through untouched. On failure it throws BadRequestException with
254
+ // { error, slot, issues: [{ message, path }] }, which Nest answers as a 400.
255
+ //
256
+ // These DTOs do not use Nest's class-validator ValidationPipe and assume nothing about its
257
+ // options. If your app also binds one globally, note one measured interaction: with
258
+ // whitelist: true it strips every property of these classes before this pipe runs, because
259
+ // they carry no class-validator metadata.
260
+ import { BadRequestException, type ArgumentMetadata, type PipeTransform } from '@nestjs/common';
261
+
262
+ interface StandardIssue {
263
+ readonly message: string;
264
+ readonly path?: ReadonlyArray<PropertyKey | { readonly key: PropertyKey }> | undefined;
265
+ }
266
+
267
+ type StandardResult<Output> =
268
+ | { readonly value: Output; readonly issues?: undefined }
269
+ | { readonly issues: ReadonlyArray<StandardIssue> };
270
+
271
+ export interface StandardSchema<Output = unknown> {
272
+ readonly '~standard': {
273
+ readonly version: 1;
274
+ readonly vendor: string;
275
+ readonly validate: (
276
+ value: unknown
277
+ ) => StandardResult<Output> | Promise<StandardResult<Output>>;
278
+ };
279
+ }
280
+
281
+ interface CarriesSchema {
282
+ readonly schema: StandardSchema;
283
+ }
284
+
285
+ function carriesSchema(metatype: unknown): metatype is CarriesSchema {
286
+ return (
287
+ typeof metatype === 'function' &&
288
+ typeof (metatype as { schema?: { '~standard'?: { validate?: unknown } } }).schema?.[
289
+ '~standard'
290
+ ]?.validate === 'function'
291
+ );
292
+ }
293
+
294
+ export class SchemaValidationPipe implements PipeTransform {
295
+ async transform(value: unknown, metadata: ArgumentMetadata): Promise<unknown> {
296
+ const { metatype } = metadata;
297
+ if (!carriesSchema(metatype)) return value;
298
+ const result = await metatype.schema['~standard'].validate(value);
299
+ if (result.issues) {
300
+ throw new BadRequestException({
301
+ error: 'Validation failed',
302
+ slot: metadata.type,
303
+ issues: result.issues.map((issue) => ({
304
+ message: issue.message,
305
+ path: (issue.path ?? []).map((p) => (typeof p === 'object' && p !== null ? p.key : p)),
306
+ })),
307
+ });
308
+ }
309
+ return result.value;
310
+ }
311
+ }
312
+ `;
313
+ }
314
+ function renderTable(table, opts) {
315
+ const lib = opts.validation?.library ?? "zod";
316
+ const d = LIBS[lib];
317
+ const insertName = `Insert${table.tsName}Schema`;
318
+ const updateName = `Update${table.tsName}Schema`;
319
+ const selectName = `Select${table.tsName}Schema`;
320
+ const paramsName = `${cap(table.tsName)}ParamsSchema`;
321
+ const createDto = `Create${cap(table.tsName)}Dto`;
322
+ const updateDto = `Update${cap(table.tsName)}Dto`;
323
+ const paramsDto = `${cap(table.tsName)}ParamsDto`;
324
+ const entity = `${cap(table.tsName)}Entity`;
325
+ const writable = !table.readOnly;
326
+ const key = keyColumns(table);
327
+ const declared = [];
328
+ const insertCols = insertColumns(table);
329
+ const updateCols = updateColumns(table);
330
+ const selectCols = selectColumns(table);
331
+ if (writable) {
332
+ declared.push(`export const ${insertName} = ${renderSchema(insertCols, lib, "insert")};`);
333
+ declared.push(`export const ${updateName} = ${renderSchema(updateCols, lib, "update")};`);
334
+ }
335
+ declared.push(`export const ${selectName} = ${renderSchema(selectCols, lib, "select")};`);
336
+ if (key) {
337
+ declared.push(
338
+ `export const ${paramsName} = ${d.objectInline(key.map((c) => paramField(c, lib)).join(", "))};`
339
+ );
340
+ }
341
+ const dtoClass = (name, doc, cols, mode, schema) => {
342
+ const fields = cols.map((c) => classField(c, mode)).join("\n");
343
+ return `/**
344
+ * ${doc}
345
+ */
346
+ export class ${name} {
347
+ ${fields}
348
+
349
+ static readonly schema: StandardSchema<${name}> = ${schema};
350
+ }`;
351
+ };
352
+ if (writable) {
353
+ declared.push(
354
+ dtoClass(
355
+ createDto,
356
+ `The insert shape of ${table.name}. Fields state what the pipe hands your controller; a nullable column with no default is required, null spelled out.`,
357
+ insertCols,
358
+ "insert",
359
+ insertName
360
+ )
361
+ );
362
+ declared.push(
363
+ dtoClass(
364
+ updateDto,
365
+ `The update shape of ${table.name}: every field optional, primary key excluded.`,
366
+ updateCols,
367
+ "update",
368
+ updateName
369
+ )
370
+ );
371
+ }
372
+ if (key) {
373
+ declared.push(
374
+ dtoClass(
375
+ paramsDto,
376
+ `The path parameters addressing one ${table.name} row, parsed strictly from their string segments.`,
377
+ key,
378
+ "params",
379
+ paramsName
380
+ )
381
+ );
382
+ }
383
+ declared.push(
384
+ dtoClass(
385
+ entity,
386
+ `One ${table.name} row, at its select shape.`,
387
+ selectCols,
388
+ "select",
389
+ selectName
390
+ )
391
+ );
392
+ const decided = declared.join("\n\n");
393
+ const imports = [];
394
+ imports.push(LIB_IMPORTS[lib]);
395
+ const spec = importSpecifier(`./${VALIDATION_MODULE}.ts`, opts.importExtension);
396
+ imports.push(`import type { StandardSchema } from '${spec}';`);
397
+ const wide = table.columns.filter(isWide).map((c) => c.name);
398
+ const wideNote = wide.length ? `// No validated type for ${wide.length === 1 ? "this column" : "these columns"}: ${wide.join(", ")}.
399
+ // DRZL could not derive one from the schema, so these DTOs accept any value there.
400
+ ` : "";
401
+ return `// Generated by @drzl/generator-nestjs
402
+ // DTOs for table: ${table.name}
403
+ ${wideNote}${imports.join("\n")}
404
+
405
+ ${decided}
406
+ `;
407
+ }
408
+ function renderBarrel(modules, ctx, path, opts) {
409
+ const validationSpec = importSpecifier(`./${VALIDATION_MODULE}.ts`, opts.importExtension);
410
+ if (!modules.length) {
411
+ return `// Generated by @drzl/generator-nestjs
412
+ // No tables detected in analysis. Add tables to your schema and regenerate.
413
+ export * from '${validationSpec}';
414
+ `;
415
+ }
416
+ const reExports = modules.map(({ filePath }) => {
417
+ const rel = importSpecifier(
418
+ "./" + path.relative(ctx.out, filePath).replace(/\\/g, "/"),
419
+ opts.importExtension
420
+ );
421
+ return `export * from '${rel}';`;
422
+ }).join("\n");
423
+ return `// Generated by @drzl/generator-nestjs
424
+ ${reExports}
425
+ export * from '${validationSpec}';
426
+ `;
427
+ }
428
+ export {
429
+ APP_MODULE,
430
+ NestJSGenerator,
431
+ VALIDATION_MODULE,
432
+ index_default as default
433
+ };
434
+ //# sourceMappingURL=dist-SGI2I53L.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../generator-nestjs/dist/index.js"],"sourcesContent":["// src/index.ts\nimport { fileWriter } from \"@drzl/validation-core\";\nimport {\n formatCode,\n importSpecifier,\n insertColumns,\n selectColumns,\n updateColumns\n} from \"@drzl/validation-core\";\nvar APP_MODULE = \"index\";\nvar VALIDATION_MODULE = \"validation\";\nvar q = (v) => JSON.stringify(v);\nvar NUMERIC_SEGMENT = String.raw`/^-?\\d+(\\.\\d+)?$/`;\nvar BIGINT_DIGITS = String.raw`/^-?\\d+$/`;\nvar LIB_IMPORTS = {\n zod: \"import { z } from 'zod';\",\n valibot: \"import * as v from 'valibot';\",\n arktype: \"import { type } from 'arktype';\"\n};\nvar LIBS = {\n zod: {\n number: \"z.number()\",\n string: \"z.string()\",\n boolean: \"z.boolean()\",\n date: \"z.date()\",\n dateInput: \"z.iso.datetime().transform((s) => new Date(s))\",\n bigint: `z.string().regex(${BIGINT_DIGITS})`,\n unknown: \"z.unknown()\",\n enum: (vals) => `z.enum([${vals.map(q).join(\", \")}] as const)`,\n nullable: (b) => `${b}.nullable()`,\n optional: (b) => `${b}.optional()`,\n object: (body) => `z.object({\n${body}\n})`,\n objectInline: (body) => `z.object({ ${body} })`,\n coerce: (t) => t === \"number\" ? `z.string().regex(${NUMERIC_SEGMENT}).transform(Number)` : t === \"Date\" ? \"z.iso.datetime().transform((s) => new Date(s))\" : t === \"bigint\" ? `z.string().regex(${BIGINT_DIGITS})` : null\n },\n valibot: {\n number: \"v.number()\",\n string: \"v.string()\",\n boolean: \"v.boolean()\",\n date: \"v.date()\",\n dateInput: \"v.pipe(v.string(), v.isoTimestamp(), v.transform((s) => new Date(s)))\",\n bigint: `v.pipe(v.string(), v.regex(${BIGINT_DIGITS}))`,\n unknown: \"v.unknown()\",\n enum: (vals) => `v.picklist([${vals.map(q).join(\", \")}] as const)`,\n nullable: (b) => `v.nullable(${b})`,\n optional: (b) => `v.optional(${b})`,\n object: (body) => `v.object({\n${body}\n})`,\n objectInline: (body) => `v.object({ ${body} })`,\n // A valibot pipe step sees the previous step's *output*, so the check has to happen while\n // the value is still the string: after a `v.transform(Number)` there is no string left.\n coerce: (t) => t === \"number\" ? `v.pipe(v.string(), v.regex(${NUMERIC_SEGMENT}), v.transform(Number))` : t === \"Date\" ? \"v.pipe(v.string(), v.isoTimestamp(), v.transform((s) => new Date(s)))\" : t === \"bigint\" ? `v.pipe(v.string(), v.regex(${BIGINT_DIGITS}))` : null\n },\n arktype: {\n number: \"number\",\n string: \"string\",\n boolean: \"boolean\",\n date: \"Date\",\n dateInput: \"string.date.iso.parse\",\n bigint: BIGINT_DIGITS,\n unknown: \"unknown\",\n // The surrounding encode adds the quotes, so the union is built with the inner quoting\n // ArkType expects.\n enum: (vals) => vals.map((x) => `'${x.replace(/'/g, \"\\\\'\")}'`).join(\" | \"),\n nullable: (b) => `(${b} | null)`,\n optional: (b) => `${b}?`,\n // `.onUndeclaredKey('delete')` because ArkType's default keeps undeclared keys (measured on\n // 2.2.3), where zod and valibot strip them. A DTO's whole point is that the controller\n // receives the declared shape, so the three libraries are aligned on the strict side.\n object: (body) => `type({\n${body}\n}).onUndeclaredKey('delete')`,\n objectInline: (body) => `type({ ${body} }).onUndeclaredKey('delete')`,\n fieldIsString: true,\n // ArkType ships these as keywords, and they are morphs: the declared output type is the\n // parsed one. `string.date.iso.parse` and not `string.date.parse`, which accepts `\"1\"` as\n // the year 2001.\n coerce: (t) => t === \"number\" ? \"string.numeric.parse\" : t === \"Date\" ? \"string.date.iso.parse\" : t === \"bigint\" ? BIGINT_DIGITS : null\n }\n};\nvar cap = (s) => s.charAt(0).toUpperCase() + s.slice(1);\nvar isIdent = (s) => /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(s);\nfunction keyColumns(table) {\n const names = table.primaryKey?.columns ?? [];\n if (!names.length) return null;\n const cols = names.map((n) => table.columns.find((c) => c.name === n));\n if (cols.some((c) => !c)) return null;\n return cols;\n}\nfunction isWide(column) {\n if (column.enumValues && column.enumValues.length) return false;\n if (column.shape?.kind === \"tuple\" || column.shape?.kind === \"numberObject\") return false;\n return ![\"number\", \"string\", \"boolean\", \"Date\", \"bigint\"].includes(column.tsType);\n}\nfunction baseExpr(column, d, mode) {\n if (column.enumValues && column.enumValues.length) return d.enum(column.enumValues);\n switch (column.tsType) {\n case \"number\":\n return d.number;\n case \"string\":\n return d.string;\n case \"boolean\":\n return d.boolean;\n case \"Date\":\n return mode === \"select\" ? d.date : d.dateInput;\n case \"bigint\":\n return d.bigint;\n default:\n return d.unknown;\n }\n}\nfunction mapExpr(column, lib, mode) {\n const d = LIBS[lib];\n let expr = baseExpr(column, d, mode);\n if (column.nullable) expr = d.nullable(expr);\n if (mode === \"update\" || mode === \"insert\" && column.hasDefault) expr = d.optional(expr);\n return expr;\n}\nfunction objectKey(name) {\n return isIdent(name) ? name : JSON.stringify(name);\n}\nfunction field(column, lib, mode) {\n const d = LIBS[lib];\n const expr = mapExpr(column, lib, mode);\n return `${objectKey(column.name)}: ${d.fieldIsString ? JSON.stringify(expr) : expr}`;\n}\nfunction paramField(column, lib) {\n const d = LIBS[lib];\n const expr = (() => {\n if (column.enumValues && column.enumValues.length) return d.enum(column.enumValues);\n return d.coerce(column.tsType) ?? d.string;\n })();\n return `${objectKey(column.name)}: ${d.fieldIsString ? JSON.stringify(expr) : expr}`;\n}\nfunction renderSchema(cols, lib, mode) {\n const d = LIBS[lib];\n const body = cols.map((c) => ` ${field(c, lib, mode)},`).join(\"\\n\");\n return d.object(body);\n}\nfunction fieldType(column) {\n if (column.enumValues && column.enumValues.length) {\n return column.enumValues.map((x) => `'${x.replace(/'/g, \"\\\\'\")}'`).join(\" | \");\n }\n switch (column.tsType) {\n case \"number\":\n return \"number\";\n case \"string\":\n return \"string\";\n case \"boolean\":\n return \"boolean\";\n case \"Date\":\n return \"Date\";\n case \"bigint\":\n return \"string\";\n default:\n return \"unknown\";\n }\n}\nfunction paramFieldType(column) {\n if (column.enumValues && column.enumValues.length) return fieldType(column);\n switch (column.tsType) {\n case \"number\":\n return \"number\";\n case \"Date\":\n return \"Date\";\n default:\n return \"string\";\n }\n}\nfunction classField(column, mode) {\n const key = isIdent(column.name) ? column.name : `'${column.name.replace(/'/g, \"\\\\'\")}'`;\n if (mode === \"params\") return ` ${key}!: ${paramFieldType(column)};`;\n const optional = mode === \"update\" || mode === \"insert\" && column.hasDefault;\n const type = `${fieldType(column)}${column.nullable ? \" | null\" : \"\"}`;\n return optional ? ` ${key}?: ${type};` : ` ${key}!: ${type};`;\n}\nfunction toCase(s, c) {\n if (!c) return s;\n const parts = s.replace(/([a-z0-9])([A-Z])/g, \"$1 $2\").replace(/[_-]/g, \" \").split(/\\s+/);\n if (c === \"camel\") {\n return parts.map(\n (p, i) => i === 0 ? p.toLowerCase() : p.charAt(0).toUpperCase() + p.slice(1).toLowerCase()\n ).join(\"\");\n }\n if (c === \"kebab\") return parts.map((p) => p.toLowerCase()).join(\"-\");\n if (c === \"snake\") return parts.map((p) => p.toLowerCase()).join(\"_\");\n return s;\n}\nvar NestJSGenerator = class {\n constructor(analysis) {\n this.analysis = analysis;\n }\n async generate(opts) {\n const fs = fileWriter(opts.fileSink);\n const path = await import(\"path\");\n const out = path.resolve(process.cwd(), opts.outputDir);\n const ctx = { out };\n await fs.mkdir(out, { recursive: true });\n const files = [];\n const write = async (filePath, content) => {\n const formatted = await formatCode(\n buildHeader(opts.outputHeader) + content,\n filePath,\n opts.format\n );\n await fs.writeFile(filePath, formatted, \"utf8\");\n files.push(filePath);\n };\n const barrelPath = path.join(out, `${APP_MODULE}.ts`);\n const validationPath = path.join(out, `${VALIDATION_MODULE}.ts`);\n const modules = [];\n const total = this.analysis.tables.length;\n let index = 0;\n for (const table of this.analysis.tables) {\n const base = `${table.tsName}${opts.naming?.routerSuffix ?? \"\"}`;\n const filePath = path.join(out, `${toCase(base, opts.naming?.procedureCase)}.ts`);\n if (filePath === barrelPath || filePath === validationPath) {\n const which = filePath === barrelPath ? \"the barrel\" : \"the validation pipe module\";\n throw new Error(\n `@drzl/generator-nestjs: the DTOs for table \"${table.name}\" would be written to ${filePath}, which is ${which} this generator also writes. Set naming.routerSuffix to move it out of the way.`\n );\n }\n await write(filePath, renderTable(table, opts));\n modules.push({ filePath });\n index++;\n opts.onProgress?.({ index, total, table: table.name, filePath });\n }\n await write(validationPath, renderValidationModule());\n await write(barrelPath, renderBarrel(modules, ctx, path, opts));\n return { files };\n }\n};\nvar index_default = NestJSGenerator;\nfunction buildHeader(h) {\n if (h && h.enabled === false) return \"\";\n const text = h?.text?.trim();\n const lines = text ? text.split(/\\r?\\n/).map((l) => `// ${l}`) : [\n \"// Generated by DRZL (@drzl/*)\",\n \"// Generated output is granted to you under your project's license.\",\n \"// You may use, copy, modify, and distribute without attribution.\"\n ];\n return lines.join(\"\\n\") + \"\\n\\n\";\n}\nfunction renderValidationModule() {\n return `// Generated by @drzl/generator-nestjs\n// A validation pipe over Standard Schema v1. Bind it globally\n// (app.useGlobalPipes(new SchemaValidationPipe())) or per handler with @UsePipes. A parameter\n// whose class carries a static Standard Schema (every DTO in this directory) is validated and\n// replaced by the parsed output; anything else, primitives and foreign DTOs alike, passes\n// through untouched. On failure it throws BadRequestException with\n// { error, slot, issues: [{ message, path }] }, which Nest answers as a 400.\n//\n// These DTOs do not use Nest's class-validator ValidationPipe and assume nothing about its\n// options. If your app also binds one globally, note one measured interaction: with\n// whitelist: true it strips every property of these classes before this pipe runs, because\n// they carry no class-validator metadata.\nimport { BadRequestException, type ArgumentMetadata, type PipeTransform } from '@nestjs/common';\n\ninterface StandardIssue {\n readonly message: string;\n readonly path?: ReadonlyArray<PropertyKey | { readonly key: PropertyKey }> | undefined;\n}\n\ntype StandardResult<Output> =\n | { readonly value: Output; readonly issues?: undefined }\n | { readonly issues: ReadonlyArray<StandardIssue> };\n\nexport interface StandardSchema<Output = unknown> {\n readonly '~standard': {\n readonly version: 1;\n readonly vendor: string;\n readonly validate: (\n value: unknown\n ) => StandardResult<Output> | Promise<StandardResult<Output>>;\n };\n}\n\ninterface CarriesSchema {\n readonly schema: StandardSchema;\n}\n\nfunction carriesSchema(metatype: unknown): metatype is CarriesSchema {\n return (\n typeof metatype === 'function' &&\n typeof (metatype as { schema?: { '~standard'?: { validate?: unknown } } }).schema?.[\n '~standard'\n ]?.validate === 'function'\n );\n}\n\nexport class SchemaValidationPipe implements PipeTransform {\n async transform(value: unknown, metadata: ArgumentMetadata): Promise<unknown> {\n const { metatype } = metadata;\n if (!carriesSchema(metatype)) return value;\n const result = await metatype.schema['~standard'].validate(value);\n if (result.issues) {\n throw new BadRequestException({\n error: 'Validation failed',\n slot: metadata.type,\n issues: result.issues.map((issue) => ({\n message: issue.message,\n path: (issue.path ?? []).map((p) => (typeof p === 'object' && p !== null ? p.key : p)),\n })),\n });\n }\n return result.value;\n }\n}\n`;\n}\nfunction renderTable(table, opts) {\n const lib = opts.validation?.library ?? \"zod\";\n const d = LIBS[lib];\n const insertName = `Insert${table.tsName}Schema`;\n const updateName = `Update${table.tsName}Schema`;\n const selectName = `Select${table.tsName}Schema`;\n const paramsName = `${cap(table.tsName)}ParamsSchema`;\n const createDto = `Create${cap(table.tsName)}Dto`;\n const updateDto = `Update${cap(table.tsName)}Dto`;\n const paramsDto = `${cap(table.tsName)}ParamsDto`;\n const entity = `${cap(table.tsName)}Entity`;\n const writable = !table.readOnly;\n const key = keyColumns(table);\n const declared = [];\n const insertCols = insertColumns(table);\n const updateCols = updateColumns(table);\n const selectCols = selectColumns(table);\n if (writable) {\n declared.push(`export const ${insertName} = ${renderSchema(insertCols, lib, \"insert\")};`);\n declared.push(`export const ${updateName} = ${renderSchema(updateCols, lib, \"update\")};`);\n }\n declared.push(`export const ${selectName} = ${renderSchema(selectCols, lib, \"select\")};`);\n if (key) {\n declared.push(\n `export const ${paramsName} = ${d.objectInline(key.map((c) => paramField(c, lib)).join(\", \"))};`\n );\n }\n const dtoClass = (name, doc, cols, mode, schema) => {\n const fields = cols.map((c) => classField(c, mode)).join(\"\\n\");\n return `/**\n * ${doc}\n */\nexport class ${name} {\n${fields}\n\n static readonly schema: StandardSchema<${name}> = ${schema};\n}`;\n };\n if (writable) {\n declared.push(\n dtoClass(\n createDto,\n `The insert shape of ${table.name}. Fields state what the pipe hands your controller; a nullable column with no default is required, null spelled out.`,\n insertCols,\n \"insert\",\n insertName\n )\n );\n declared.push(\n dtoClass(\n updateDto,\n `The update shape of ${table.name}: every field optional, primary key excluded.`,\n updateCols,\n \"update\",\n updateName\n )\n );\n }\n if (key) {\n declared.push(\n dtoClass(\n paramsDto,\n `The path parameters addressing one ${table.name} row, parsed strictly from their string segments.`,\n key,\n \"params\",\n paramsName\n )\n );\n }\n declared.push(\n dtoClass(\n entity,\n `One ${table.name} row, at its select shape.`,\n selectCols,\n \"select\",\n selectName\n )\n );\n const decided = declared.join(\"\\n\\n\");\n const imports = [];\n imports.push(LIB_IMPORTS[lib]);\n const spec = importSpecifier(`./${VALIDATION_MODULE}.ts`, opts.importExtension);\n imports.push(`import type { StandardSchema } from '${spec}';`);\n const wide = table.columns.filter(isWide).map((c) => c.name);\n const wideNote = wide.length ? `// No validated type for ${wide.length === 1 ? \"this column\" : \"these columns\"}: ${wide.join(\", \")}.\n// DRZL could not derive one from the schema, so these DTOs accept any value there.\n` : \"\";\n return `// Generated by @drzl/generator-nestjs\n// DTOs for table: ${table.name}\n${wideNote}${imports.join(\"\\n\")}\n\n${decided}\n`;\n}\nfunction renderBarrel(modules, ctx, path, opts) {\n const validationSpec = importSpecifier(`./${VALIDATION_MODULE}.ts`, opts.importExtension);\n if (!modules.length) {\n return `// Generated by @drzl/generator-nestjs\n// No tables detected in analysis. Add tables to your schema and regenerate.\nexport * from '${validationSpec}';\n`;\n }\n const reExports = modules.map(({ filePath }) => {\n const rel = importSpecifier(\n \"./\" + path.relative(ctx.out, filePath).replace(/\\\\/g, \"/\"),\n opts.importExtension\n );\n return `export * from '${rel}';`;\n }).join(\"\\n\");\n return `// Generated by @drzl/generator-nestjs\n${reExports}\nexport * from '${validationSpec}';\n`;\n}\nexport {\n APP_MODULE,\n NestJSGenerator,\n VALIDATION_MODULE,\n index_default as default\n};\n"],"mappings":"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","names":[]}