@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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@drzl/cli",
3
- "version": "4.19.0",
3
+ "version": "4.23.0",
4
4
  "private": false,
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
@@ -29,16 +29,17 @@
29
29
  "jiti": "^2.7.0",
30
30
  "ora": "^9.4.1",
31
31
  "zod": "^4.4.3",
32
- "@drzl/analyzer": "^1.18.0",
33
- "@drzl/generator-arktype": "^3.14.0",
34
- "@drzl/generator-orpc": "^2.8.0",
35
- "@drzl/generator-service": "^2.4.0",
36
- "@drzl/generator-typebox": "^0.11.0",
37
- "@drzl/generator-valibot": "^3.17.0",
38
- "@drzl/generator-zod": "^3.18.0",
39
- "@drzl/validation-core": "^3.18.0"
32
+ "@drzl/analyzer": "^1.21.0",
33
+ "@drzl/generator-arktype": "^3.17.0",
34
+ "@drzl/generator-orpc": "^2.9.0",
35
+ "@drzl/generator-service": "^2.5.0",
36
+ "@drzl/generator-typebox": "^0.14.0",
37
+ "@drzl/generator-valibot": "^3.20.0",
38
+ "@drzl/generator-zod": "^3.21.0",
39
+ "@drzl/validation-core": "^3.22.0"
40
40
  },
41
41
  "devDependencies": {
42
+ "ajv": "^8.17.1",
42
43
  "drizzle-orm": "^0.45.2",
43
44
  "ts-node": "^10.9.2",
44
45
  "tsup": "^8.5.1",
@@ -62,12 +63,17 @@
62
63
  "url": "https://github.com/sponsors/omar-dulaimi"
63
64
  },
64
65
  "optionalDependencies": {
65
- "@drzl/generator-effect": "^0.2.0",
66
- "@drzl/generator-json-schema": "^0.6.0",
67
- "@drzl/generator-trpc": "^0.2.0"
66
+ "@drzl/generator-effect": "^0.5.0",
67
+ "@drzl/generator-express": "^0.2.0",
68
+ "@drzl/generator-fastify": "^0.2.0",
69
+ "@drzl/generator-graphql": "^0.2.0",
70
+ "@drzl/generator-hono": "^0.2.0",
71
+ "@drzl/generator-json-schema": "^0.9.0",
72
+ "@drzl/generator-nestjs": "^0.2.0",
73
+ "@drzl/generator-trpc": "^0.3.0"
68
74
  },
69
75
  "scripts": {
70
- "build": "tsup src/cli.ts src/config.ts --format esm,cjs --sourcemap --dts --clean",
76
+ "build": "tsup src/cli.ts src/config.ts --format esm,cjs --sourcemap --dts --clean && node scripts/gen-config-schema.mjs",
71
77
  "dev": "node --loader ts-node/esm src/cli.ts --help",
72
78
  "lint": "eslint . --ext .ts",
73
79
  "test": "vitest run --testTimeout=20000"
@@ -1,465 +0,0 @@
1
- // src/config.ts
2
- import {
3
- AFFIX_PROBE_TABLE,
4
- DEFAULT_IMPORT_EXTENSION,
5
- IMPORT_EXTENSIONS,
6
- NAME_MODES,
7
- resolveAffix,
8
- schemaName,
9
- validateAffix
10
- } from "@drzl/validation-core";
11
- import * as fs from "fs";
12
- import { createRequire } from "module";
13
- import * as path from "path";
14
- import { z } from "zod";
15
- var NamingSchema = z.object({
16
- routerSuffix: z.string().default("Router"),
17
- procedureCase: z.enum(["camel", "kebab", "snake"]).default("camel")
18
- }).partial();
19
- var AffixValueSchema = z.union(
20
- [
21
- z.string(),
22
- z.object({
23
- insert: z.string().optional(),
24
- update: z.string().optional(),
25
- select: z.string().optional()
26
- }).strict()
27
- ],
28
- {
29
- error: 'Expected a string to use for every mode, or an object with any of the keys "insert", "update" and "select". Those keys are lowercase, matching the mode names drzl uses everywhere else.'
30
- }
31
- );
32
- var AffixPartSchema = z.object({
33
- prefix: AffixValueSchema.optional(),
34
- suffix: AffixValueSchema.optional()
35
- }).strict();
36
- var AffixSchema = z.object({
37
- /**
38
- * `preserve` (default) keeps today's output: the Drizzle export name goes into the
39
- * identifier verbatim, so `export const users` yields `InsertusersSchema`. `pascal`
40
- * upper-camels it first, yielding `InsertUsersSchema`.
41
- */
42
- tableCase: z.enum(["preserve", "pascal"]).optional(),
43
- schema: AffixPartSchema.optional(),
44
- type: AffixPartSchema.optional()
45
- }).strict();
46
- var ImportExtensionSchema = z.enum(IMPORT_EXTENSIONS);
47
- var GeneratorSchema = z.object({
48
- kind: z.enum([
49
- "orpc",
50
- "trpc",
51
- "service",
52
- "zod",
53
- "valibot",
54
- "arktype",
55
- "typebox",
56
- "effect",
57
- "json-schema"
58
- ]),
59
- /**
60
- * Overrides the top-level `importExtension` for this generator alone, for a project whose
61
- * generated directories are compiled by different tsconfigs.
62
- */
63
- importExtension: ImportExtensionSchema.optional(),
64
- template: z.string().optional(),
65
- includeRelations: z.boolean().optional(),
66
- /**
67
- * Type `json` and `jsonb` columns from the schema rather than leaving them wide.
68
- *
69
- * `.$type<T>()` is a compile-time cast, so no runtime-derived validator can see it and
70
- * `drizzle-orm/zod` types every json column as its generic `Json`. A generator can reference
71
- * `typeof <table>.$inferSelect['<column>']` instead, which is the declared type resolved by
72
- * TypeScript itself, so generics, unions and imported interfaces all work.
73
- *
74
- * Off by default because it makes the generated file import your schema module, as a
75
- * type-only import that disappears at build time.
76
- */
77
- // What a date column accepts. Documented on the zod generator and, until now, accepted by the
78
- // config parser and then dropped on the floor: the generators default it to 'input' themselves,
79
- // so setting it here changed nothing.
80
- coerceDates: z.enum(["input", "all", "none"]).optional(),
81
- typedJson: z.boolean().optional(),
82
- // The wider form: every column's static type comes from Drizzle, not just the untyped ones.
83
- typedColumns: z.boolean().optional(),
84
- // Reproduce literal column defaults in the insert schema, so parsing fills them in.
85
- applyDefaults: z.boolean().optional(),
86
- /**
87
- * Emit `findDuplicate<Table>` beside the schemas: the rows in a batch that collide with an
88
- * earlier row on a unique constraint.
89
- *
90
- * Uniqueness is the one constraint a per-row validator structurally cannot see, since it is a
91
- * fact about the table rather than the row. This checks the half that needs no database.
92
- */
93
- duplicateFinder: z.boolean().optional(),
94
- /**
95
- * Emit `NestedInsert<Table>` and `NestedSelect<Table>` beside the flat schemas: the table plus
96
- * one key per relation, so `{ ...user, posts: [...] }` can be validated whole.
97
- *
98
- * Nothing in the Drizzle validator ecosystem describes that payload, and `db.insert` drops the
99
- * relation key silently rather than refusing it, so the children are never written and nothing
100
- * says so.
101
- */
102
- nestedSchemas: z.boolean().optional(),
103
- /**
104
- * How many levels of children a nested schema describes. Defaults to 1, capped at 3.
105
- *
106
- * Nesting is expanded inline rather than by reference, so this multiplies the emitted size, and
107
- * it is also what terminates a cycle: `users -> posts -> users` stops here.
108
- */
109
- nestedDepth: z.number().int().optional(),
110
- naming: NamingSchema.optional(),
111
- outputHeader: z.object({
112
- enabled: z.boolean().default(true).optional(),
113
- text: z.string().optional()
114
- }).optional(),
115
- format: z.object({
116
- enabled: z.boolean().default(true).optional(),
117
- engine: z.enum(["auto", "prettier", "biome"]).default("auto").optional(),
118
- configPath: z.string().optional()
119
- }).optional(),
120
- /**
121
- * Which spelling of JSON Schema the `json-schema` generator emits.
122
- *
123
- * OpenAPI 3.0 is not an older superset of the 2020-12 draft, it is a different dialect: a
124
- * nullable type is `nullable: true` rather than a type array, and an exclusive bound is a
125
- * boolean flag beside the bound rather than its own keyword. An unknown keyword is not an error
126
- * in JSON Schema, it is ignored, so emitting the wrong dialect produces a document that
127
- * validates and then accepts the values the constraints exist to reject.
128
- */
129
- target: z.enum(["draft-2020-12", "openapi-3.1", "openapi-3.0"]).optional(),
130
- /** Also emit `components.ts` for the `json-schema` generator, ready for an OpenAPI document. */
131
- components: z.boolean().optional(),
132
- /**
133
- * Also emit the whole OpenAPI document for the `json-schema` generator: paths, verbs, request and
134
- * response bodies per table, with `components.schemas` embedded so the file stands alone.
135
- *
136
- * `true` is the short form. The object form carries the three things a Drizzle schema genuinely
137
- * cannot say: what the API is called, where it is served, and which status code that particular
138
- * server answers a request that fails its schema with.
139
- */
140
- document: z.union([
141
- z.boolean(),
142
- z.object({
143
- enabled: z.boolean().optional(),
144
- /** `ts` (default) writes a module, `json` the file OpenAPI tooling reads directly. */
145
- format: z.enum(["ts", "json", "both"]).optional(),
146
- info: z.object({
147
- title: z.string().optional(),
148
- version: z.string().optional(),
149
- description: z.string().optional()
150
- }).strict().optional(),
151
- /**
152
- * Omitted by default, which the specification reads as a single server at `/`: the
153
- * document describes whatever is serving it. A placeholder host would be a fabrication
154
- * that tooling then follows.
155
- */
156
- servers: z.array(z.object({ url: z.string(), description: z.string().optional() }).strict()).optional(),
157
- /** 400 by default. 422 is the other defensible reading; exactly one is emitted. */
158
- validationStatus: z.union([z.literal(400), z.literal(422)]).optional()
159
- }).strict()
160
- ]).optional(),
161
- // service generator specific options
162
- path: z.string().optional(),
163
- dataAccess: z.enum(["stub", "drizzle"]).default("stub").optional(),
164
- dbImportPath: z.string().optional(),
165
- schemaImportPath: z.string().optional(),
166
- // zod/valibot/arktype generator specific options
167
- schemaSuffix: z.string().optional(),
168
- fileSuffix: z.string().optional(),
169
- /**
170
- * Prefixes, suffixes and table casing for generated identifiers (zod/valibot/arktype).
171
- * Omitting it reproduces the output of every previous release exactly.
172
- */
173
- affix: AffixSchema.optional(),
174
- /**
175
- * How the router generators reach a database handle: through the request context, rather than
176
- * through a module-level import in the service layer.
177
- *
178
- * Documented on the oRPC generator since it was added and, until now, absent from this schema
179
- * entirely. `GeneratorSchema` is not strict, so zod stripped the key without a word and the
180
- * option did nothing at all when set from a config file. It was only ever reachable by calling
181
- * the generator's API directly.
182
- */
183
- databaseInjection: z.object({
184
- enabled: z.boolean().optional(),
185
- /** The type annotation for the injected handle, e.g. `DrizzleD1Database`. */
186
- databaseType: z.string().optional(),
187
- databaseTypeImport: z.object({ name: z.string(), from: z.string() }).optional()
188
- }).optional(),
189
- // router validation sharing (orpc, trpc)
190
- validation: z.object({
191
- useShared: z.boolean().default(false).optional(),
192
- library: z.enum(["zod", "valibot", "arktype"]).default("zod").optional(),
193
- importPath: z.string().optional(),
194
- schemaSuffix: z.string().optional(),
195
- /**
196
- * How the validation generator named its exports. Usually left unset: the CLI copies
197
- * it from the sibling generator whose `kind` matches `library`.
198
- */
199
- affix: AffixSchema.optional()
200
- }).optional(),
201
- // template options
202
- templateOptions: z.record(z.string(), z.any()).optional()
203
- });
204
- var AnalyzerSchema = z.object({
205
- includeRelations: z.boolean().default(true),
206
- validateConstraints: z.boolean().default(true),
207
- includeHeuristicRelations: z.boolean().default(false)
208
- });
209
- var ConfigSchema = z.object({
210
- schema: z.string(),
211
- outDir: z.string().default("src/api"),
212
- /**
213
- * Which tables to generate for, matched against the database table name.
214
- *
215
- * There was no way to say this, and every generator loops over every table it finds, so
216
- * DRZL emitted unauthenticated CRUD over whatever shared the schema file. That is noise for
217
- * a migrations table and a genuine leak for an auth one: Better Auth puts `user`, `session`,
218
- * `account` and `verification` alongside your own tables, and `account` holds
219
- * `accessToken`, `refreshToken`, `idToken` and `password`.
220
- *
221
- * Deliberately name-based and explicit rather than detecting any particular library. Auth
222
- * table names are all renameable, so a built-in list would miss renamed tables and, worse,
223
- * silently skip an ordinary table that happened to be called `user`, which is usually the
224
- * application's main entity.
225
- *
226
- * `exclude` wins over `include`. Patterns support `*`, matching within a name.
227
- */
228
- include: z.array(z.string()).optional(),
229
- exclude: z.array(z.string()).optional(),
230
- /**
231
- * How every relative specifier drzl invents spells its extension, for every generator.
232
- * A generator may override it. Defaults to `js`, which is the only form that resolves
233
- * under every `moduleResolution` without a compiler flag.
234
- */
235
- importExtension: ImportExtensionSchema.default(DEFAULT_IMPORT_EXTENSION),
236
- analyzer: AnalyzerSchema.default({
237
- includeRelations: true,
238
- validateConstraints: true,
239
- includeHeuristicRelations: false
240
- }),
241
- generators: z.array(GeneratorSchema).min(1).default([{ kind: "orpc" }])
242
- }).superRefine((cfg, ctx) => {
243
- cfg.generators.forEach((g, i) => {
244
- const report = (base, affix, schemaSuffix) => {
245
- for (const issue of validateAffix(affix, schemaSuffix)) {
246
- ctx.addIssue({
247
- code: "custom",
248
- path: ["generators", i, ...base, ...issue.path],
249
- message: issue.message
250
- });
251
- }
252
- };
253
- report(["affix"], g.affix, g.schemaSuffix);
254
- report(
255
- ["validation", "affix"],
256
- g.validation?.affix,
257
- g.validation?.schemaSuffix
258
- );
259
- });
260
- });
261
- function defineConfig(cfg) {
262
- return cfg;
263
- }
264
- var ROUTER_KINDS = /* @__PURE__ */ new Set(["orpc", "trpc"]);
265
- function trpcOutDir(g, cfg) {
266
- return g.path ?? cfg.outDir;
267
- }
268
- function sharedSchemaNames(opts) {
269
- const resolved = resolveAffix(opts);
270
- return NAME_MODES.map((mode) => schemaName(mode, AFFIX_PROBE_TABLE, resolved));
271
- }
272
- function resolveConfig(cfg) {
273
- const warnings = [];
274
- const generators = cfg.generators.map((g) => ({
275
- ...g,
276
- importExtension: g.importExtension ?? cfg.importExtension
277
- }));
278
- for (const g of generators) {
279
- if (!ROUTER_KINDS.has(g.kind)) continue;
280
- if (g.databaseInjection?.enabled) {
281
- for (const s of generators.filter((x) => x.kind === "service")) {
282
- if (!s.databaseInjection) {
283
- s.databaseInjection = g.databaseInjection;
284
- } else if (!s.databaseInjection.enabled) {
285
- warnings.push(
286
- `drzl config: the "${g.kind}" generator sets databaseInjection.enabled while the "service" generator sets it to false. The router will call Service.method(ctx.db, ...) against services that take no database parameter, so the generated project will not compile. Set both, or neither.`
287
- );
288
- }
289
- if ((s.dataAccess ?? "stub") === "stub") {
290
- warnings.push(
291
- `drzl config: the "${g.kind}" generator sets databaseInjection.enabled, so its handlers call Service.method(ctx.db, ...). The "service" generator emits stub bodies, which take no database parameter whatever this option says, so those calls will not compile. Set dataAccess: 'drizzle' on the "service" generator, or drop databaseInjection.`
292
- );
293
- }
294
- }
295
- }
296
- const v = g.validation;
297
- if (!v?.useShared) continue;
298
- const library = v.library ?? "zod";
299
- const siblings = generators.filter((s) => s.kind === library);
300
- if (siblings.length !== 1) continue;
301
- const sibling = siblings[0];
302
- const theirs = sharedSchemaNames({
303
- affix: sibling.affix,
304
- schemaSuffix: sibling.schemaSuffix
305
- });
306
- if (!v.affix) {
307
- if (sibling.affix) {
308
- g.validation = {
309
- ...v,
310
- affix: resolveAffix({
311
- affix: sibling.affix,
312
- schemaSuffix: sibling.schemaSuffix
313
- })
314
- };
315
- continue;
316
- }
317
- const mine2 = sharedSchemaNames({ schemaSuffix: v.schemaSuffix });
318
- if (mine2.join(",") !== theirs.join(",")) {
319
- warnings.push(
320
- `drzl config: the "${g.kind}" generator's validation.schemaSuffix (${JSON.stringify(v.schemaSuffix ?? "Schema")}) does not match the "${library}" generator's schemaSuffix (${JSON.stringify(sibling.schemaSuffix ?? "Schema")}). The router will import ${mine2.join(", ")} but the "${library}" generator exports ${theirs.join(", ")}, so the generated router will not compile. Set both to the same value, or move to "affix", which is inherited automatically.`
321
- );
322
- }
323
- continue;
324
- }
325
- const mine = sharedSchemaNames({
326
- affix: v.affix,
327
- schemaSuffix: v.schemaSuffix
328
- });
329
- if (mine.join(",") !== theirs.join(",")) {
330
- throw new Error(
331
- `drzl config: the "${g.kind}" generator imports shared ${library} schemas, but its validation.affix disagrees with the "${library}" generator's own naming. The router would import ${mine.join(", ")} while the "${library}" generator exports ${theirs.join(", ")}. Make them match, or drop validation.affix and let it be inherited from the "${library}" generator.`
332
- );
333
- }
334
- }
335
- return { config: { ...cfg, generators }, warnings };
336
- }
337
- function finalize(raw) {
338
- const { config, warnings } = resolveConfig(ConfigSchema.parse(raw));
339
- for (const w of warnings) console.warn(w);
340
- return config;
341
- }
342
- async function loadConfig(customPath) {
343
- const fsp = await import("fs/promises");
344
- const candidates = customPath ? [customPath] : [
345
- "drzl.config.ts",
346
- "drzl.config.mjs",
347
- "drzl.config.js",
348
- "drzl.config.cjs",
349
- "drzl.config.json"
350
- ];
351
- for (const c of candidates) {
352
- const p = path.resolve(process.cwd(), c);
353
- try {
354
- await fsp.access(p);
355
- } catch {
356
- continue;
357
- }
358
- const ext = path.extname(p).toLowerCase();
359
- if (ext === ".json") {
360
- const raw2 = JSON.parse(await fsp.readFile(p, "utf8"));
361
- return finalize(raw2);
362
- }
363
- const { createJiti } = await import("jiti");
364
- const stat = await fsp.stat(p);
365
- const base = typeof __filename !== "undefined" ? __filename : path.join(process.cwd(), "index.js");
366
- const jiti = createJiti(base, {
367
- moduleCache: false,
368
- // re-evaluate each time
369
- fsCache: true,
370
- // keep transform cache
371
- cacheVersion: String(stat.mtimeMs),
372
- // bump on edit
373
- interopDefault: true,
374
- tryNative: false
375
- // <-- prevent native import of .ts
376
- // debug: true,
377
- });
378
- const mod = await jiti.import(p);
379
- const raw = mod?.default ?? mod;
380
- return finalize(raw);
381
- }
382
- return null;
383
- }
384
- function computeGeneratorOutputDirs(cfg, cwd = process.cwd()) {
385
- const abs = (p) => path.resolve(cwd, p);
386
- const dirs = /* @__PURE__ */ new Set();
387
- dirs.add(abs(cfg.outDir));
388
- for (const g of cfg.generators) {
389
- if (g.kind === "trpc") dirs.add(abs(trpcOutDir(g, cfg)));
390
- if (g.kind === "service") dirs.add(abs(g.path ?? "src/services"));
391
- if (g.kind === "zod") dirs.add(abs(g.path ?? "src/validators/zod"));
392
- if (g.kind === "valibot") dirs.add(abs(g.path ?? "src/validators/valibot"));
393
- if (g.kind === "arktype") dirs.add(abs(g.path ?? "src/validators/arktype"));
394
- if (g.kind === "typebox") dirs.add(abs(g.path ?? "src/validators/typebox"));
395
- if (g.kind === "effect") dirs.add(abs(g.path ?? "src/validators/effect"));
396
- if (g.kind === "json-schema") dirs.add(abs(g.path ?? "src/validators/json-schema"));
397
- }
398
- return [...dirs];
399
- }
400
- function resolveTemplateDirsSync(cfg, cwd = process.cwd()) {
401
- const results = [];
402
- const req = createRequire(
403
- typeof __filename !== "undefined" ? __filename : path.join(process.cwd(), "index.js")
404
- );
405
- for (const g of cfg.generators) {
406
- const t = g.template;
407
- if (!t || t === "standard" || t === "minimal" || t === "service") continue;
408
- let pkgDir = null;
409
- try {
410
- const pkg = req.resolve(`${t}/package.json`, { paths: [cwd] });
411
- pkgDir = path.dirname(pkg);
412
- } catch {
413
- }
414
- if (pkgDir) {
415
- results.push(pkgDir);
416
- continue;
417
- }
418
- if (/[./\\]/.test(t)) {
419
- const abs = path.resolve(cwd, t);
420
- if (fs.existsSync(abs)) results.push(abs);
421
- }
422
- }
423
- return Array.from(new Set(results));
424
- }
425
- function filterTables(tables, opts) {
426
- const toRegExp = (pattern) => new RegExp(
427
- "^" + pattern.split("*").map((part) => part.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")).join(".*") + "$"
428
- );
429
- const matches = (patterns, name) => patterns.some((p) => toRegExp(p).test(name));
430
- let out = tables;
431
- if (opts.include?.length) out = out.filter((t) => matches(opts.include, t.name));
432
- if (opts.exclude?.length) out = out.filter((t) => !matches(opts.exclude, t.name));
433
- return out;
434
- }
435
- function computeWatchTargets(cfg, cwd = process.cwd()) {
436
- const abs = (p) => path.resolve(cwd, p);
437
- const schemaAbs = abs(cfg.schema);
438
- const targets = /* @__PURE__ */ new Set([
439
- path.dirname(schemaAbs),
440
- abs("drzl.config.ts"),
441
- abs("drzl.config.js"),
442
- abs("drzl.config.mjs"),
443
- abs("drzl.config.cjs")
444
- ]);
445
- for (const t of resolveTemplateDirsSync(cfg, cwd)) targets.add(t);
446
- return [...targets];
447
- }
448
-
449
- export {
450
- NamingSchema,
451
- AffixSchema,
452
- ImportExtensionSchema,
453
- GeneratorSchema,
454
- AnalyzerSchema,
455
- ConfigSchema,
456
- defineConfig,
457
- trpcOutDir,
458
- resolveConfig,
459
- loadConfig,
460
- computeGeneratorOutputDirs,
461
- resolveTemplateDirsSync,
462
- filterTables,
463
- computeWatchTargets
464
- };
465
- //# sourceMappingURL=chunk-V2IXXAC2.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/config.ts"],"sourcesContent":["import type { AffixOptions } from '@drzl/validation-core';\nimport {\n AFFIX_PROBE_TABLE,\n DEFAULT_IMPORT_EXTENSION,\n IMPORT_EXTENSIONS,\n NAME_MODES,\n resolveAffix,\n schemaName,\n validateAffix,\n} from '@drzl/validation-core';\nimport * as fs from 'node:fs';\nimport { createRequire } from 'node:module';\nimport * as path from 'node:path';\nimport { z } from 'zod';\n\nexport const NamingSchema = z\n .object({\n routerSuffix: z.string().default('Router'),\n procedureCase: z.enum(['camel', 'kebab', 'snake']).default('camel'),\n })\n .partial();\n\n/** One affix for every mode, or a per-mode map. Keys match drzl's internal mode names. */\nconst AffixValueSchema = z.union(\n [\n z.string(),\n z\n .object({\n insert: z.string().optional(),\n update: z.string().optional(),\n select: z.string().optional(),\n })\n .strict(),\n ],\n {\n error:\n 'Expected a string to use for every mode, or an object with any of the keys \"insert\", ' +\n '\"update\" and \"select\". Those keys are lowercase, matching the mode names drzl uses ' +\n 'everywhere else.',\n }\n);\n\nconst AffixPartSchema = z\n .object({\n prefix: AffixValueSchema.optional(),\n suffix: AffixValueSchema.optional(),\n })\n .strict();\n\nexport const AffixSchema = z\n .object({\n /**\n * `preserve` (default) keeps today's output: the Drizzle export name goes into the\n * identifier verbatim, so `export const users` yields `InsertusersSchema`. `pascal`\n * upper-camels it first, yielding `InsertUsersSchema`.\n */\n tableCase: z.enum(['preserve', 'pascal']).optional(),\n schema: AffixPartSchema.optional(),\n type: AffixPartSchema.optional(),\n })\n .strict();\n\n/**\n * How every relative specifier drzl invents spells its extension.\n *\n * The generated files land in the consumer's own source tree, so the consumer's\n * `moduleResolution` decides which forms resolve. `js` is the only one that resolves under\n * all of `bundler`, `node10`, `node16` and `nodenext` with no compiler flag, so it is the\n * default. See the `ImportExtension` docs in `@drzl/validation-core` for the measured grid.\n */\nexport const ImportExtensionSchema = z.enum(IMPORT_EXTENSIONS);\n\nexport const GeneratorSchema = z.object({\n kind: z.enum([\n 'orpc',\n 'trpc',\n 'service',\n 'zod',\n 'valibot',\n 'arktype',\n 'typebox',\n 'effect',\n 'json-schema',\n ]),\n /**\n * Overrides the top-level `importExtension` for this generator alone, for a project whose\n * generated directories are compiled by different tsconfigs.\n */\n importExtension: ImportExtensionSchema.optional(),\n template: z.string().optional(),\n includeRelations: z.boolean().optional(),\n /**\n * Type `json` and `jsonb` columns from the schema rather than leaving them wide.\n *\n * `.$type<T>()` is a compile-time cast, so no runtime-derived validator can see it and\n * `drizzle-orm/zod` types every json column as its generic `Json`. A generator can reference\n * `typeof <table>.$inferSelect['<column>']` instead, which is the declared type resolved by\n * TypeScript itself, so generics, unions and imported interfaces all work.\n *\n * Off by default because it makes the generated file import your schema module, as a\n * type-only import that disappears at build time.\n */\n // What a date column accepts. Documented on the zod generator and, until now, accepted by the\n // config parser and then dropped on the floor: the generators default it to 'input' themselves,\n // so setting it here changed nothing.\n coerceDates: z.enum(['input', 'all', 'none']).optional(),\n typedJson: z.boolean().optional(),\n // The wider form: every column's static type comes from Drizzle, not just the untyped ones.\n typedColumns: z.boolean().optional(),\n // Reproduce literal column defaults in the insert schema, so parsing fills them in.\n applyDefaults: z.boolean().optional(),\n /**\n * Emit `findDuplicate<Table>` beside the schemas: the rows in a batch that collide with an\n * earlier row on a unique constraint.\n *\n * Uniqueness is the one constraint a per-row validator structurally cannot see, since it is a\n * fact about the table rather than the row. This checks the half that needs no database.\n */\n duplicateFinder: z.boolean().optional(),\n /**\n * Emit `NestedInsert<Table>` and `NestedSelect<Table>` beside the flat schemas: the table plus\n * one key per relation, so `{ ...user, posts: [...] }` can be validated whole.\n *\n * Nothing in the Drizzle validator ecosystem describes that payload, and `db.insert` drops the\n * relation key silently rather than refusing it, so the children are never written and nothing\n * says so.\n */\n nestedSchemas: z.boolean().optional(),\n /**\n * How many levels of children a nested schema describes. Defaults to 1, capped at 3.\n *\n * Nesting is expanded inline rather than by reference, so this multiplies the emitted size, and\n * it is also what terminates a cycle: `users -> posts -> users` stops here.\n */\n nestedDepth: z.number().int().optional(),\n naming: NamingSchema.optional(),\n outputHeader: z\n .object({\n enabled: z.boolean().default(true).optional(),\n text: z.string().optional(),\n })\n .optional(),\n format: z\n .object({\n enabled: z.boolean().default(true).optional(),\n engine: z.enum(['auto', 'prettier', 'biome']).default('auto').optional(),\n configPath: z.string().optional(),\n })\n .optional(),\n /**\n * Which spelling of JSON Schema the `json-schema` generator emits.\n *\n * OpenAPI 3.0 is not an older superset of the 2020-12 draft, it is a different dialect: a\n * nullable type is `nullable: true` rather than a type array, and an exclusive bound is a\n * boolean flag beside the bound rather than its own keyword. An unknown keyword is not an error\n * in JSON Schema, it is ignored, so emitting the wrong dialect produces a document that\n * validates and then accepts the values the constraints exist to reject.\n */\n target: z.enum(['draft-2020-12', 'openapi-3.1', 'openapi-3.0']).optional(),\n /** Also emit `components.ts` for the `json-schema` generator, ready for an OpenAPI document. */\n components: z.boolean().optional(),\n /**\n * Also emit the whole OpenAPI document for the `json-schema` generator: paths, verbs, request and\n * response bodies per table, with `components.schemas` embedded so the file stands alone.\n *\n * `true` is the short form. The object form carries the three things a Drizzle schema genuinely\n * cannot say: what the API is called, where it is served, and which status code that particular\n * server answers a request that fails its schema with.\n */\n document: z\n .union([\n z.boolean(),\n z\n .object({\n enabled: z.boolean().optional(),\n /** `ts` (default) writes a module, `json` the file OpenAPI tooling reads directly. */\n format: z.enum(['ts', 'json', 'both']).optional(),\n info: z\n .object({\n title: z.string().optional(),\n version: z.string().optional(),\n description: z.string().optional(),\n })\n .strict()\n .optional(),\n /**\n * Omitted by default, which the specification reads as a single server at `/`: the\n * document describes whatever is serving it. A placeholder host would be a fabrication\n * that tooling then follows.\n */\n servers: z\n .array(z.object({ url: z.string(), description: z.string().optional() }).strict())\n .optional(),\n /** 400 by default. 422 is the other defensible reading; exactly one is emitted. */\n validationStatus: z.union([z.literal(400), z.literal(422)]).optional(),\n })\n .strict(),\n ])\n .optional(),\n // service generator specific options\n path: z.string().optional(),\n dataAccess: z.enum(['stub', 'drizzle']).default('stub').optional(),\n dbImportPath: z.string().optional(),\n schemaImportPath: z.string().optional(),\n // zod/valibot/arktype generator specific options\n schemaSuffix: z.string().optional(),\n fileSuffix: z.string().optional(),\n /**\n * Prefixes, suffixes and table casing for generated identifiers (zod/valibot/arktype).\n * Omitting it reproduces the output of every previous release exactly.\n */\n affix: AffixSchema.optional(),\n /**\n * How the router generators reach a database handle: through the request context, rather than\n * through a module-level import in the service layer.\n *\n * Documented on the oRPC generator since it was added and, until now, absent from this schema\n * entirely. `GeneratorSchema` is not strict, so zod stripped the key without a word and the\n * option did nothing at all when set from a config file. It was only ever reachable by calling\n * the generator's API directly.\n */\n databaseInjection: z\n .object({\n enabled: z.boolean().optional(),\n /** The type annotation for the injected handle, e.g. `DrizzleD1Database`. */\n databaseType: z.string().optional(),\n databaseTypeImport: z.object({ name: z.string(), from: z.string() }).optional(),\n })\n .optional(),\n // router validation sharing (orpc, trpc)\n validation: z\n .object({\n useShared: z.boolean().default(false).optional(),\n library: z.enum(['zod', 'valibot', 'arktype']).default('zod').optional(),\n importPath: z.string().optional(),\n schemaSuffix: z.string().optional(),\n /**\n * How the validation generator named its exports. Usually left unset: the CLI copies\n * it from the sibling generator whose `kind` matches `library`.\n */\n affix: AffixSchema.optional(),\n })\n .optional(),\n // template options\n templateOptions: z.record(z.string(), z.any()).optional(),\n});\n\nexport const AnalyzerSchema = z.object({\n includeRelations: z.boolean().default(true),\n validateConstraints: z.boolean().default(true),\n includeHeuristicRelations: z.boolean().default(false),\n});\n\nexport const ConfigSchema = z\n .object({\n schema: z.string(),\n outDir: z.string().default('src/api'),\n /**\n * Which tables to generate for, matched against the database table name.\n *\n * There was no way to say this, and every generator loops over every table it finds, so\n * DRZL emitted unauthenticated CRUD over whatever shared the schema file. That is noise for\n * a migrations table and a genuine leak for an auth one: Better Auth puts `user`, `session`,\n * `account` and `verification` alongside your own tables, and `account` holds\n * `accessToken`, `refreshToken`, `idToken` and `password`.\n *\n * Deliberately name-based and explicit rather than detecting any particular library. Auth\n * table names are all renameable, so a built-in list would miss renamed tables and, worse,\n * silently skip an ordinary table that happened to be called `user`, which is usually the\n * application's main entity.\n *\n * `exclude` wins over `include`. Patterns support `*`, matching within a name.\n */\n include: z.array(z.string()).optional(),\n exclude: z.array(z.string()).optional(),\n /**\n * How every relative specifier drzl invents spells its extension, for every generator.\n * A generator may override it. Defaults to `js`, which is the only form that resolves\n * under every `moduleResolution` without a compiler flag.\n */\n importExtension: ImportExtensionSchema.default(DEFAULT_IMPORT_EXTENSION),\n analyzer: AnalyzerSchema.default({\n includeRelations: true,\n validateConstraints: true,\n includeHeuristicRelations: false,\n }),\n generators: z\n .array(GeneratorSchema)\n .min(1)\n .default([{ kind: 'orpc' } as any]),\n })\n // Reject an affix before anything is written, rather than emitting a file that cannot\n // compile. Only `affix` is inspected; the legacy flat `schemaSuffix` is left alone so\n // configs that parse today keep parsing.\n .superRefine((cfg, ctx) => {\n cfg.generators.forEach((g, i) => {\n const report = (base: (string | number)[], affix?: AffixOptions, schemaSuffix?: string) => {\n for (const issue of validateAffix(affix, schemaSuffix)) {\n ctx.addIssue({\n code: 'custom',\n path: ['generators', i, ...base, ...issue.path],\n message: issue.message,\n });\n }\n };\n report(['affix'], g.affix as AffixOptions | undefined, g.schemaSuffix);\n report(\n ['validation', 'affix'],\n g.validation?.affix as AffixOptions | undefined,\n g.validation?.schemaSuffix\n );\n });\n });\n\n// ✨ Separate input vs output types\nexport type DrzlConfigInput = z.input<typeof ConfigSchema>;\nexport type DrzlConfig = z.output<typeof ConfigSchema>;\n\nexport function defineConfig<T extends DrzlConfigInput>(cfg: T): T {\n return cfg;\n}\n\ntype GeneratorConfig = DrzlConfig['generators'][number];\n\n/** The generators that emit an RPC router, and so share `outDir` and `validation`. */\nconst ROUTER_KINDS = new Set(['orpc', 'trpc']);\n\n/**\n * Where the tRPC generator writes.\n *\n * `outDir` by default, exactly like oRPC, so a config that names one router generator puts its\n * output where the top-level setting says. `path` is the escape hatch, and a config that runs\n * *both* router generators needs it: they would otherwise write two different `index.ts` files to\n * the same directory and the second would win.\n *\n * Exported because `computeGeneratorOutputDirs` has to agree with the dispatch in cli.ts about\n * this, and the watcher ignoring the wrong directory is an infinite regeneration loop.\n */\nexport function trpcOutDir(g: { path?: string }, cfg: { outDir: string }): string {\n return g.path ?? cfg.outDir;\n}\n\nfunction sharedSchemaNames(opts: { affix?: AffixOptions; schemaSuffix?: string }): string[] {\n const resolved = resolveAffix(opts);\n return NAME_MODES.map((mode) => schemaName(mode, AFFIX_PROBE_TABLE, resolved));\n}\n\n/**\n * Fill in cross-generator defaults and refuse configs whose generators would disagree.\n *\n * An oRPC router that imports shared schemas has to spell the exact names the validation\n * generator exported. Both sides used to be configured independently, so they could silently\n * drift into a router that does not compile. When an oRPC generator uses shared validation\n * and exactly one sibling generator produces that library, its `affix` is copied across.\n *\n * Deliberately conservative about the pre-existing flat `schemaSuffix`: a disagreement there\n * is only reported, never repaired, because repairing it would change the bytes an existing\n * config emits.\n *\n * `importExtension` is pushed down here too. A consumer compiles the whole generated tree\n * with one tsconfig, so the setting that has to hold is the same for every generator, and\n * every call site downstream can then read it off the generator without knowing about the\n * top-level default.\n */\nexport function resolveConfig(cfg: DrzlConfig): { config: DrzlConfig; warnings: string[] } {\n const warnings: string[] = [];\n const generators: GeneratorConfig[] = cfg.generators.map((g) => ({\n ...g,\n importExtension: g.importExtension ?? cfg.importExtension,\n }));\n\n for (const g of generators) {\n // Both router generators import the validation generators' exports by name, so both have to\n // spell them the way the sibling generator wrote them.\n if (!ROUTER_KINDS.has(g.kind)) continue;\n\n /**\n * `databaseInjection` describes a contract between two generators, not a setting of one.\n *\n * A router in injection mode emits `Service.getById(ctx.db, id)`, and only a service\n * generated in the same mode has a `db` parameter to receive it. Declared once on the router\n * and pushed onto the service generator here, exactly as `validation.affix` is pulled the\n * other way, because the alternative is writing the same block twice and a project that\n * compiles in halves and not as a whole.\n *\n * `@drzl/generator-service` honours the flag only while emitting real Drizzle queries: its\n * stub bodies take no database whatever they are told. That combination cannot be repaired\n * from here without changing what an existing config emits, so it is reported instead.\n */\n if (g.databaseInjection?.enabled) {\n for (const s of generators.filter((x) => x.kind === 'service')) {\n if (!s.databaseInjection) {\n s.databaseInjection = g.databaseInjection;\n } else if (!s.databaseInjection.enabled) {\n warnings.push(\n `drzl config: the \"${g.kind}\" generator sets databaseInjection.enabled while the ` +\n `\"service\" generator sets it to false. The router will call ` +\n `Service.method(ctx.db, ...) against services that take no database parameter, so ` +\n `the generated project will not compile. Set both, or neither.`\n );\n }\n if ((s.dataAccess ?? 'stub') === 'stub') {\n warnings.push(\n `drzl config: the \"${g.kind}\" generator sets databaseInjection.enabled, so its ` +\n `handlers call Service.method(ctx.db, ...). The \"service\" generator emits stub ` +\n `bodies, which take no database parameter whatever this option says, so those ` +\n `calls will not compile. Set dataAccess: 'drizzle' on the \"service\" generator, or ` +\n `drop databaseInjection.`\n );\n }\n }\n }\n\n const v = g.validation;\n if (!v?.useShared) continue;\n\n const library = v.library ?? 'zod';\n const siblings = generators.filter((s) => s.kind === library);\n // Zero siblings means the user points at a barrel drzl does not generate; more than one\n // means there is no single source of truth. Either way, leave the config alone.\n if (siblings.length !== 1) continue;\n const sibling = siblings[0];\n\n const theirs = sharedSchemaNames({\n affix: sibling.affix as AffixOptions | undefined,\n schemaSuffix: sibling.schemaSuffix,\n });\n\n if (!v.affix) {\n if (sibling.affix) {\n // Bake the sibling's fully resolved naming in, so its own schemaSuffix fallback\n // travels with it and cannot be re-interpreted on the oRPC side.\n g.validation = {\n ...v,\n affix: resolveAffix({\n affix: sibling.affix as AffixOptions,\n schemaSuffix: sibling.schemaSuffix,\n }),\n };\n continue;\n }\n const mine = sharedSchemaNames({ schemaSuffix: v.schemaSuffix });\n if (mine.join(',') !== theirs.join(',')) {\n warnings.push(\n `drzl config: the \"${g.kind}\" generator's validation.schemaSuffix ` +\n `(${JSON.stringify(v.schemaSuffix ?? 'Schema')}) does not match the \"${library}\" ` +\n `generator's schemaSuffix (${JSON.stringify(sibling.schemaSuffix ?? 'Schema')}). ` +\n `The router will import ${mine.join(', ')} but the \"${library}\" generator exports ` +\n `${theirs.join(', ')}, so the generated router will not compile. Set both to the ` +\n `same value, or move to \"affix\", which is inherited automatically.`\n );\n }\n continue;\n }\n\n const mine = sharedSchemaNames({\n affix: v.affix as AffixOptions,\n schemaSuffix: v.schemaSuffix,\n });\n if (mine.join(',') !== theirs.join(',')) {\n throw new Error(\n `drzl config: the \"${g.kind}\" generator imports shared ${library} schemas, but its ` +\n `validation.affix disagrees with the \"${library}\" generator's own naming. The router ` +\n `would import ${mine.join(', ')} while the \"${library}\" generator exports ` +\n `${theirs.join(', ')}. Make them match, or drop validation.affix and let it be ` +\n `inherited from the \"${library}\" generator.`\n );\n }\n }\n\n return { config: { ...cfg, generators }, warnings };\n}\n\n/**\n * Parse, then resolve cross-generator defaults. Both `generate` and `watch` go through\n * loadConfig, so putting the resolution here is what keeps the two duplicated generator\n * dispatch blocks in cli.ts from needing the logic twice.\n */\nfunction finalize(raw: unknown): DrzlConfig {\n const { config, warnings } = resolveConfig(ConfigSchema.parse(raw));\n for (const w of warnings) console.warn(w);\n return config;\n}\n\nexport async function loadConfig(customPath?: string): Promise<DrzlConfig | null> {\n const fsp = await import('node:fs/promises');\n\n const candidates = customPath\n ? [customPath]\n : [\n 'drzl.config.ts',\n 'drzl.config.mjs',\n 'drzl.config.js',\n 'drzl.config.cjs',\n 'drzl.config.json',\n ];\n\n for (const c of candidates) {\n const p = path.resolve(process.cwd(), c);\n try {\n await fsp.access(p);\n } catch {\n continue;\n }\n\n const ext = path.extname(p).toLowerCase();\n\n // JSON: read directly\n if (ext === '.json') {\n const raw = JSON.parse(await fsp.readFile(p, 'utf8'));\n return finalize(raw);\n }\n\n // Everything else (TS/JS/MJS/CJS) -> Jiti with cache-busting\n const { createJiti } = await import('jiti');\n const stat = await fsp.stat(p);\n\n // Passing __filename is safe in CJS; fallback to cwd if not defined.\n const base =\n typeof __filename !== 'undefined' ? __filename : path.join(process.cwd(), 'index.js');\n\n const jiti = createJiti(base, {\n moduleCache: false, // re-evaluate each time\n fsCache: true, // keep transform cache\n cacheVersion: String(stat.mtimeMs), // bump on edit\n interopDefault: true,\n tryNative: false, // <-- prevent native import of .ts\n // debug: true,\n }) as any;\n\n const mod = await jiti.import(p);\n const raw = mod?.default ?? mod;\n return finalize(raw);\n }\n\n return null;\n}\n\n/** Absolute output dirs for all generators (to ignore in watcher). */\nexport function computeGeneratorOutputDirs(cfg: DrzlConfig, cwd = process.cwd()): string[] {\n const abs = (p: string) => path.resolve(cwd, p);\n const dirs = new Set<string>();\n dirs.add(abs(cfg.outDir)); // orpc\n for (const g of cfg.generators) {\n if (g.kind === 'trpc') dirs.add(abs(trpcOutDir(g, cfg)));\n if (g.kind === 'service') dirs.add(abs(g.path ?? 'src/services'));\n if (g.kind === 'zod') dirs.add(abs(g.path ?? 'src/validators/zod'));\n if (g.kind === 'valibot') dirs.add(abs(g.path ?? 'src/validators/valibot'));\n if (g.kind === 'arktype') dirs.add(abs(g.path ?? 'src/validators/arktype'));\n if (g.kind === 'typebox') dirs.add(abs(g.path ?? 'src/validators/typebox'));\n if (g.kind === 'effect') dirs.add(abs(g.path ?? 'src/validators/effect'));\n if (g.kind === 'json-schema') dirs.add(abs(g.path ?? 'src/validators/json-schema'));\n }\n return [...dirs];\n}\n\n/** Resolve custom template directories (local path or installed package). */\nexport function resolveTemplateDirsSync(cfg: DrzlConfig, cwd = process.cwd()): string[] {\n const results: string[] = [];\n const req = createRequire(\n typeof __filename !== 'undefined' ? __filename : path.join(process.cwd(), 'index.js')\n );\n\n for (const g of cfg.generators) {\n const t = g.template;\n // Built-in template names, not packages. `service` is the tRPC generator's, and without it\n // here every run would try to resolve a package called \"service\" and then watch a directory\n // of that name, neither of which exists.\n if (!t || t === 'standard' || t === 'minimal' || t === 'service') continue;\n\n // Try package resolution relative to cwd\n let pkgDir: string | null = null;\n try {\n const pkg = req.resolve(`${t}/package.json`, { paths: [cwd] as any });\n pkgDir = path.dirname(pkg);\n } catch {}\n\n if (pkgDir) {\n results.push(pkgDir);\n continue;\n }\n\n // Local path-like template\n if (/[./\\\\]/.test(t)) {\n const abs = path.resolve(cwd, t);\n if (fs.existsSync(abs)) results.push(abs);\n }\n }\n\n return Array.from(new Set(results));\n}\n\n/** Build watch targets (exclude output dirs; watcher will ignore those). */\n/**\n * Narrow an analysis's tables to the ones the config asked for.\n *\n * Matching is on the database table name, anchored, with `*` as the only metacharacter. Anchored\n * matters: `user` must not also drop `users`, and a substring match would. `exclude` is applied\n * after `include`, so the safer direction wins when both name the same table.\n */\nexport function filterTables<T extends { name: string }>(\n tables: T[],\n opts: { include?: string[]; exclude?: string[] }\n): T[] {\n const toRegExp = (pattern: string) =>\n new RegExp(\n '^' +\n pattern\n .split('*')\n .map((part) => part.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'))\n .join('.*') +\n '$'\n );\n\n const matches = (patterns: string[], name: string) =>\n patterns.some((p) => toRegExp(p).test(name));\n\n let out = tables;\n if (opts.include?.length) out = out.filter((t) => matches(opts.include!, t.name));\n if (opts.exclude?.length) out = out.filter((t) => !matches(opts.exclude!, t.name));\n return out;\n}\n\nexport function computeWatchTargets(cfg: DrzlConfig, cwd = process.cwd()): string[] {\n const abs = (p: string) => path.resolve(cwd, p);\n const schemaAbs = abs(cfg.schema);\n // The schema's directory, not a glob under it. Chokidar removed glob support in v4 and treats\n // `<dir>/**/*.{ts,tsx,js}` as a literal path, so it watched a directory named `**` that does\n // not exist: no event ever fired and `drzl watch` did its initial build and then sat inert.\n // A directory is watched recursively by chokidar itself, and the extension filtering that the\n // glob was doing now happens on the event instead.\n const targets = new Set<string>([\n path.dirname(schemaAbs),\n abs('drzl.config.ts'),\n abs('drzl.config.js'),\n abs('drzl.config.mjs'),\n abs('drzl.config.cjs'),\n ]);\n for (const t of resolveTemplateDirsSync(cfg, cwd)) targets.add(t);\n return [...targets];\n}\n"],"mappings":"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","names":["mine","raw"]}