@drzl/cli 4.15.0 → 4.16.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/dist/cli.js CHANGED
@@ -5,7 +5,7 @@ import {
5
5
  filterTables,
6
6
  loadConfig,
7
7
  trpcOutDir
8
- } from "./chunk-FZNDWYBB.js";
8
+ } from "./chunk-K4J4XIFO.js";
9
9
 
10
10
  // src/cli.ts
11
11
  import { SchemaAnalyzer } from "@drzl/analyzer";
@@ -49,6 +49,8 @@ function validationOptions(g, cfg, outDir, caps = {}) {
49
49
  coerceDates: g.coerceDates,
50
50
  applyDefaults: g.applyDefaults,
51
51
  duplicateFinder: g.duplicateFinder,
52
+ nestedSchemas: g.nestedSchemas,
53
+ nestedDepth: g.nestedDepth,
52
54
  // Only where the generator can act on them, so an unsupported option is absent rather than
53
55
  // present and ignored.
54
56
  ...caps.schemaTypes ? {
@@ -572,10 +574,7 @@ program.command("generate:trpc").argument("<schema>", "path to drizzle schema (T
572
574
  // cannot become the branch that forgets it.
573
575
  servicesDir: opts.servicesDir
574
576
  });
575
- console.log(
576
- chalk2.green(`Generated:`),
577
- files.map((f) => chalk2.cyan(f)).join(", ")
578
- );
577
+ console.log(chalk2.green(`Generated:`), files.map((f) => chalk2.cyan(f)).join(", "));
579
578
  maybeShowSponsorMessage({ reason: "generate:trpc" });
580
579
  } catch (e) {
581
580
  reportGeneratorFailure("trpc", e);
@@ -763,15 +762,9 @@ program.command("watch").description("Watch schema and regenerate on changes").o
763
762
  );
764
763
  const gen = new ZodGenerator(analysis);
765
764
  const target = g.path ?? "src/validators/zod";
766
- const files = await gen.generate({
767
- outDir: target,
768
- outputHeader: g.outputHeader,
769
- format: g.format,
770
- schemaSuffix: g.schemaSuffix,
771
- fileSuffix: g.fileSuffix,
772
- importExtension: g.importExtension,
773
- affix: g.affix
774
- });
765
+ const files = await gen.generate(
766
+ validationOptions(g, cfg, target, { schemaTypes: true })
767
+ );
775
768
  opts.json ? console.log(JSON.stringify({ event: "generate_complete", kind: g.kind, files })) : console.log(
776
769
  chalk2.green(`Generated (zod): ${files.length} files`),
777
770
  files.map((f) => chalk2.cyan(f)).join(", ")
@@ -789,15 +782,9 @@ program.command("watch").description("Watch schema and regenerate on changes").o
789
782
  );
790
783
  const gen = new ValibotGenerator(analysis);
791
784
  const target = g.path ?? "src/validators/valibot";
792
- const files = await gen.generate({
793
- outDir: target,
794
- outputHeader: g.outputHeader,
795
- format: g.format,
796
- schemaSuffix: g.schemaSuffix,
797
- fileSuffix: g.fileSuffix,
798
- importExtension: g.importExtension,
799
- affix: g.affix
800
- });
785
+ const files = await gen.generate(
786
+ validationOptions(g, cfg, target, { schemaTypes: true })
787
+ );
801
788
  opts.json ? console.log(JSON.stringify({ event: "generate_complete", kind: g.kind, files })) : console.log(
802
789
  chalk2.green(`Generated (valibot): ${files.length} files`),
803
790
  files.map((f) => chalk2.cyan(f)).join(", ")
@@ -815,17 +802,54 @@ program.command("watch").description("Watch schema and regenerate on changes").o
815
802
  );
816
803
  const gen = new ArkTypeGenerator(analysis);
817
804
  const target = g.path ?? "src/validators/arktype";
805
+ const files = await gen.generate(
806
+ validationOptions(g, cfg, target, { schemaTypes: false })
807
+ );
808
+ opts.json ? console.log(JSON.stringify({ event: "generate_complete", kind: g.kind, files })) : console.log(
809
+ chalk2.green(`Generated (arktype): ${files.length} files`),
810
+ files.map((f) => chalk2.cyan(f)).join(", ")
811
+ );
812
+ newFiles.push(...files);
813
+ } catch (e) {
814
+ reportGeneratorFailure(g.kind, e);
815
+ return;
816
+ }
817
+ } else if (g.kind === "typebox") {
818
+ try {
819
+ const { TypeBoxGenerator } = await loadGenerator(
820
+ "@drzl/generator-typebox",
821
+ () => import("@drzl/generator-typebox")
822
+ );
823
+ const gen = new TypeBoxGenerator(analysis);
824
+ const target = g.path ?? "src/validators/typebox";
825
+ const files = await gen.generate(
826
+ validationOptions(g, cfg, target, { schemaTypes: true })
827
+ );
828
+ opts.json ? console.log(JSON.stringify({ event: "generate_complete", kind: g.kind, files })) : console.log(
829
+ chalk2.green(`Generated (typebox): ${files.length} files`),
830
+ files.map((f) => chalk2.cyan(f)).join(", ")
831
+ );
832
+ newFiles.push(...files);
833
+ } catch (e) {
834
+ reportGeneratorFailure(g.kind, e);
835
+ return;
836
+ }
837
+ } else if (g.kind === "json-schema") {
838
+ try {
839
+ const { JsonSchemaGenerator } = await loadGenerator(
840
+ "@drzl/generator-json-schema",
841
+ () => import("./dist-UE55LTXV.js")
842
+ );
843
+ const gen = new JsonSchemaGenerator(analysis);
844
+ const target = g.path ?? "src/validators/json-schema";
818
845
  const files = await gen.generate({
819
- outDir: target,
820
- outputHeader: g.outputHeader,
821
- format: g.format,
822
- schemaSuffix: g.schemaSuffix,
823
- fileSuffix: g.fileSuffix,
824
- importExtension: g.importExtension,
825
- affix: g.affix
846
+ // JSON Schema is data, so nothing here references a type from the schema module.
847
+ ...validationOptions(g, cfg, target, { schemaTypes: false }),
848
+ target: g.target,
849
+ components: g.components
826
850
  });
827
851
  opts.json ? console.log(JSON.stringify({ event: "generate_complete", kind: g.kind, files })) : console.log(
828
- chalk2.green(`Generated (arktype): ${files.length} files`),
852
+ chalk2.green(`Generated (json-schema): ${files.length} files`),
829
853
  files.map((f) => chalk2.cyan(f)).join(", ")
830
854
  );
831
855
  newFiles.push(...files);
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli.ts","../src/trpc-options.ts","../src/validation-options.ts","../src/drift.ts","../src/generator-loader.ts","../src/sponsor.ts","../src/version.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 { trpcOptions } from './trpc-options.js';\nimport { validationOptions } from './validation-options';\nimport {\n computeGeneratorOutputDirs,\n computeWatchTargets,\n DrzlConfig,\n filterTables,\n loadConfig,\n} from './config.js';\nimport { diffSnapshots, restoreSnapshot, snapshotAll } from './drift.js';\nimport { GeneratorNotInstalledError, loadGenerator } from './generator-loader.js';\nimport { maybeShowSponsorMessage } from './sponsor.js';\nimport { CLI_VERSION } from './version.js';\n\n/**\n * Say what went wrong with a generator, distinguishing the two things that can.\n *\n * Every branch below used to print \"<name> generator missing. Install with: npm install\n * @drzl/generator-<name>\" for anything at all that threw, with the real reason on a trailing\n * \"Error details\" line. A generator that was installed and merely failed therefore sent its user\n * to reinstall a package they already had, and the sentence that would have told them what\n * actually happened was the one written as a footnote.\n *\n * `loadGenerator` marks the one case that is an install problem, so the package name comes off the\n * error rather than being repeated here beside the `import()` that already spells it.\n */\nfunction reportGeneratorFailure(kind: string, e: unknown): void {\n if (e instanceof GeneratorNotInstalledError) {\n console.error(\n chalk.red(`The ${kind} generator is not installed.`),\n chalk.yellow(`\\nInstall with: npm install ${e.specifier}`)\n );\n return;\n }\n console.error(chalk.red(`The ${kind} generator failed:`), (e as any)?.message ?? e);\n}\n\nconst program = new Command();\nprogram.name('drzl').description('DRZL - Drizzle Developer Toolkit').version(CLI_VERSION);\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 .option(\n '--check',\n 'regenerate and fail if the result differs from what is on disk, without changing it'\n )\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 // Applied before any generator sees the analysis, so every one of them honours it without\n // needing to know the option exists.\n analysis.tables = filterTables(analysis.tables, cfg);\n spinner.succeed(`Analysis complete in ${Date.now() - t0}ms`);\n reportWideColumns(analysis.issues);\n // Under --check the existing output is captured before anything overwrites it, so the\n // regenerated result can be compared against it and the tree put back either way.\n const driftDirs = computeGeneratorOutputDirs(cfg);\n const driftBefore = opts.check ? await snapshotAll(driftDirs) : null;\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 // Where the service generator is actually writing, so a router template that imports\n // services spells a path that exists. Templates default this to 'src/services', and with\n // nothing passed that default was used no matter where the services really went, emitting\n // an import of a module that was never created. Must match the `g.path ?? 'src/services'`\n // used by the service branch below.\n const servicesDir =\n cfg.generators.find((x: { kind: string }) => x.kind === 'service')?.path ?? 'src/services';\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 importExtension: g.importExtension,\n validation: g.validation,\n // Documented on this generator since it was added and never reachable from a config\n // file, because the config schema had no such key and zod stripped it in silence.\n databaseInjection: g.databaseInjection,\n servicesDir,\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 === 'trpc') {\n try {\n // An optional dependency, like the json-schema generator and unlike oRPC. A package\n // that has never been published cannot publish through npm's trusted-publisher OIDC\n // flow, so its first version has to go out by hand; naming it as a hard dependency of\n // the CLI in the same release breaks `npm i @drzl/cli` for everyone until it exists.\n // A missing optional dependency is skipped by the installer rather than failing it,\n // which is why this one really can be absent on an ordinary install.\n const { TRPCGenerator } = await loadGenerator(\n '@drzl/generator-trpc',\n () => import('@drzl/generator-trpc')\n );\n const gen = new TRPCGenerator(analysis);\n const { files } = await gen.generate({\n ...trpcOptions(g, cfg, servicesDir),\n onProgress: ({ index }: { index: number }) => progress.update(index),\n });\n progress.stop();\n ora().succeed(chalk.green(`Generated (trpc): ${files.length} files`));\n files.forEach((f: string) => console.log(' -', chalk.cyan(f)));\n } catch (e: any) {\n progress.stop();\n reportGeneratorFailure(g.kind, e);\n process.exit(1);\n }\n } else if (g.kind === 'service') {\n try {\n const { ServiceGenerator } = await loadGenerator(\n '@drzl/generator-service',\n () => import('@drzl/generator-service')\n );\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 importExtension: g.importExtension,\n // The other half of `databaseInjection`. A router generator in injection mode\n // emits `Service.getById(ctx.db, id)`, and only a service generated in the same\n // mode has a `db` parameter to receive it. This branch never passed the option, so\n // the two halves of one generated project disagreed about the signature.\n databaseInjection: g.databaseInjection,\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 reportGeneratorFailure(g.kind, e);\n process.exit(1);\n }\n } else if (g.kind === 'zod') {\n try {\n const { ZodGenerator } = await loadGenerator(\n '@drzl/generator-zod',\n () => import('@drzl/generator-zod')\n );\n const gen = new ZodGenerator(analysis);\n const target = g.path ?? 'src/validators/zod';\n const files = await gen.generate(\n validationOptions(g, cfg, target, { schemaTypes: true }) as never\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 reportGeneratorFailure(g.kind, e);\n process.exit(1);\n }\n } else if (g.kind === 'valibot') {\n try {\n const { ValibotGenerator } = await loadGenerator(\n '@drzl/generator-valibot',\n () => import('@drzl/generator-valibot')\n );\n const gen = new ValibotGenerator(analysis);\n const target = g.path ?? 'src/validators/valibot';\n const files = await gen.generate(\n validationOptions(g, cfg, target, { schemaTypes: true }) as never\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 reportGeneratorFailure(g.kind, e);\n process.exit(1);\n }\n } else if (g.kind === 'arktype') {\n try {\n const { ArkTypeGenerator } = await loadGenerator(\n '@drzl/generator-arktype',\n () => import('@drzl/generator-arktype')\n );\n const gen = new ArkTypeGenerator(analysis);\n const target = g.path ?? 'src/validators/arktype';\n const files = await gen.generate(\n validationOptions(g, cfg, target, { schemaTypes: false }) as never\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 reportGeneratorFailure(g.kind, e);\n process.exit(1);\n }\n } else if (g.kind === 'json-schema') {\n try {\n // An optional dependency, unlike the other generators, until its npm trusted publisher\n // exists. A missing optional dependency is skipped rather than failing the install,\n // which is what keeps `npm i @drzl/cli` working meanwhile, and is why this one really\n // can be absent on a normal install.\n const { JsonSchemaGenerator } = await loadGenerator(\n '@drzl/generator-json-schema',\n () => import('@drzl/generator-json-schema')\n );\n const gen = new JsonSchemaGenerator(analysis);\n const target = g.path ?? 'src/validators/json-schema';\n const files = await gen.generate({\n // JSON Schema is data, so nothing here references a type from the schema module.\n ...(validationOptions(g, cfg, target, { schemaTypes: false }) as object),\n target: g.target,\n components: g.components,\n } as never);\n progress.stop();\n ora().succeed(chalk.green(`Generated (json-schema): ${files.length} files`));\n files.forEach((f: string) => console.log(' -', chalk.cyan(f)));\n } catch (e: any) {\n progress.stop();\n reportGeneratorFailure(g.kind, e);\n process.exit(1);\n }\n } else if (g.kind === 'typebox') {\n try {\n const { TypeBoxGenerator } = await loadGenerator(\n '@drzl/generator-typebox',\n () => import('@drzl/generator-typebox')\n );\n const gen = new TypeBoxGenerator(analysis);\n const target = g.path ?? 'src/validators/typebox';\n const files = await gen.generate(\n validationOptions(g, cfg, target, { schemaTypes: true }) as never\n );\n progress.stop();\n ora().succeed(chalk.green(`Generated (typebox): ${files.length} files`));\n files.forEach((f: string) => console.log(' -', chalk.cyan(f)));\n } catch (e: any) {\n progress.stop();\n reportGeneratorFailure(g.kind, e);\n process.exit(1);\n }\n }\n }\n if (driftBefore) {\n const after = await snapshotAll(driftDirs);\n const drift = diffSnapshots(driftBefore, after);\n // Restored whether or not anything drifted, so `--check` never leaves the tree altered.\n await restoreSnapshot(driftBefore, after);\n\n if (drift.length) {\n console.error(chalk.red(`\\nGenerated output is out of date (${drift.length} file(s)):`));\n for (const d of drift) {\n const mark = d.status === 'added' ? '+' : d.status === 'removed' ? '-' : '~';\n console.error(\n ` ${mark} ${chalk.yellow(d.status.padEnd(8))} ${path.relative(process.cwd(), d.file)}`\n );\n }\n console.error(\n chalk.dim(\n '\\nRun `drzl generate` and commit the result. Nothing was written by this check.'\n )\n );\n process.exit(1);\n }\n console.log(chalk.green('Generated output is up to date.'));\n return;\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('generate:trpc')\n .argument('<schema>', 'path to drizzle schema (TS)')\n .option('-o, --outDir <dir>', 'output directory', 'src/api')\n .option('--template <name>', 'standard | service', 'standard')\n .option('--includeRelations', 'include relation endpoints')\n .option('--servicesDir <dir>', 'where the service generator writes', 'src/services')\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 { TRPCGenerator } = await loadGenerator(\n '@drzl/generator-trpc',\n () => import('@drzl/generator-trpc')\n );\n const gen = new TRPCGenerator(analysis);\n const { files } = await gen.generate({\n outputDir: opts.outDir,\n template: opts.template,\n includeRelations: !!opts.includeRelations,\n // Only consulted by `--template service`, and passed unconditionally so this command\n // cannot become the branch that forgets it.\n servicesDir: opts.servicesDir,\n });\n console.log(\n chalk.green(`Generated:`),\n files.map((f: string) => chalk.cyan(f)).join(', ')\n );\n maybeShowSponsorMessage({ reason: 'generate:trpc' });\n } catch (e: any) {\n reportGeneratorFailure('trpc', 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 | generate-trpc', '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 // Watch targets are directories now, because chokidar v4 dropped glob support. The\n // extensions the old `**/*.{ts,tsx,js}` glob selected therefore have to be filtered here\n // instead, or every unrelated file in the schema's directory would trigger a rebuild.\n const WATCHED_EXTENSIONS = new Set(['.ts', '.tsx', '.js', '.mjs', '.cjs']);\n\n const ignoredFn = (p: string, stats?: { isDirectory(): boolean }) => {\n const full = abs(p);\n for (const dir of ignoredOutDirs) {\n if (full === dir || isInside(full, dir)) return true;\n }\n // A directory is never ignored: chokidar has to descend into it to reach the files.\n if (stats?.isDirectory()) return false;\n const ext = path.extname(full);\n // Without stats chokidar is asking about a path it has not resolved yet. An extensionless\n // one is almost certainly a directory, so let it through and decide once it is known.\n if (!ext) return false;\n return !WATCHED_EXTENSIONS.has(ext);\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 analysis.tables = filterTables(analysis.tables, cfg);\n if (!opts.json) reportWideColumns(analysis.issues);\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 // Must match the `g.path ?? 'src/services'` the service branch below uses, or a router\n // template that imports services spells a path nothing ever wrote. `generate` has always\n // computed this; `watch` did not, so a rebuild silently emitted the default.\n const servicesDir =\n cfg.generators.find((x: { kind: string }) => x.kind === 'service')?.path ??\n 'src/services';\n\n const PIPELINE_KINDS: Record<string, string> = {\n 'generate-orpc': 'orpc',\n 'generate-trpc': 'trpc',\n };\n\n for (const g of cfg.generators) {\n if (opts.pipeline !== 'all' && PIPELINE_KINDS[opts.pipeline] !== g.kind) {\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 importExtension: g.importExtension,\n validation: g.validation,\n databaseInjection: g.databaseInjection,\n servicesDir,\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 === 'trpc') {\n try {\n const { TRPCGenerator } = await loadGenerator(\n '@drzl/generator-trpc',\n () => import('@drzl/generator-trpc')\n );\n const gen = new TRPCGenerator(analysis);\n // The same builder `generate` uses, so the two dispatch loops cannot disagree\n // about what this generator is given.\n const { files } = await gen.generate(trpcOptions(g, cfg, servicesDir));\n opts.json\n ? console.log(JSON.stringify({ event: 'generate_complete', kind: g.kind, files }))\n : console.log(\n chalk.green(`Generated (trpc): ${files.length} files`),\n files.map((f: string) => chalk.cyan(f)).join(', ')\n );\n newFiles.push(...files);\n } catch (e: any) {\n reportGeneratorFailure(g.kind, e);\n return;\n }\n } else if (g.kind === 'service') {\n try {\n const { ServiceGenerator } = await loadGenerator(\n '@drzl/generator-service',\n () => import('@drzl/generator-service')\n );\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 importExtension: g.importExtension,\n databaseInjection: g.databaseInjection,\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 reportGeneratorFailure(g.kind, e);\n return;\n }\n } else if (g.kind === 'zod') {\n try {\n const { ZodGenerator } = await loadGenerator(\n '@drzl/generator-zod',\n () => import('@drzl/generator-zod')\n );\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 importExtension: g.importExtension,\n affix: g.affix,\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 reportGeneratorFailure(g.kind, e);\n return;\n }\n } else if (g.kind === 'valibot') {\n try {\n const { ValibotGenerator } = await loadGenerator(\n '@drzl/generator-valibot',\n () => import('@drzl/generator-valibot')\n );\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 importExtension: g.importExtension,\n affix: g.affix,\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 reportGeneratorFailure(g.kind, e);\n return;\n }\n } else if (g.kind === 'arktype') {\n try {\n const { ArkTypeGenerator } = await loadGenerator(\n '@drzl/generator-arktype',\n () => import('@drzl/generator-arktype')\n );\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 importExtension: g.importExtension,\n affix: g.affix,\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 reportGeneratorFailure(g.kind, 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 // One router generator, not both: they default to the same `outDir` and would each write an\n // `index.ts` there, so a scaffold naming both would emit a config whose second generator\n // silently overwrote the first. Swapping the kind is a one-word edit; running both needs a\n // `path` on one of them, which is what the comment says.\n const template = `export default {\n schema: 'src/db/schema.ts',\n outDir: 'src/api',\n analyzer: { includeRelations: true, validateConstraints: true },\n generators: [\n // For tRPC instead: { kind: 'trpc', template: 'standard', includeRelations: true }\n // To run both, give one of them its own \\`path\\`; they share \\`outDir\\` otherwise.\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\n/**\n * Tell the user which columns got a validator that accepts anything.\n *\n * This is the user-facing half of a check `verify-packed.sh` runs on this repository. Two real\n * bugs took exactly this shape, `.array()` and `pgEnum` columns coming back untyped on\n * drizzle-orm 0.4x, and the only way anyone noticed was reading the generated file. A user whose\n * schema uses a type nobody here has modelled gets the same silence, and no gate of ours helps\n * them.\n *\n * Printed once with a count rather than a line per column, so a schema with fifty custom types\n * stays readable.\n */\nfunction reportWideColumns(issues: Array<{ code?: string; message?: string; hint?: string }>) {\n const wide = issues.filter((i) => i.code === 'DRZL_ANL_UNKNOWN_COLUMN');\n if (!wide.length) return;\n console.warn(\n chalk.yellow(`\\n${wide.length} column${wide.length === 1 ? '' : 's'} could not be typed:`)\n );\n for (const i of wide.slice(0, 10)) console.warn(chalk.gray(` - ${i.message}`));\n if (wide.length > 10) console.warn(chalk.gray(` ... and ${wide.length - 10} more`));\n // One hint for the set, since they are almost always the same two.\n const hints = [...new Set(wide.map((i) => i.hint).filter(Boolean))];\n for (const h of hints) console.warn(chalk.gray(` ${h}`));\n}\n\nprogram.parseAsync(process.argv);\n","/**\n * The options `@drzl/generator-trpc` receives, built in one place.\n *\n * `generate` and `watch` each dispatch over `cfg.generators` in their own loop, and every branch\n * in both assembles its own options object by hand. Three documented options have already been\n * found dead that way: `typedJson` never reached typebox, `coerceDates` and `applyDefaults`\n * reached nothing but zod, and `servicesDir` is passed by `generate`'s oRPC branch and not by\n * `watch`'s, so a watch rebuild emits a service import pointing at the default directory whatever\n * the config says. None of those is visible in the wiring: the option parses, the generator\n * defaults it, and the feature simply does nothing.\n *\n * One builder means the two call sites are the same object by construction rather than by review.\n * It also gives the drift something to be asserted against, which is what\n * `packages/cli/test/trpc-branch-parity.spec.ts` does by running both commands and comparing the\n * bytes they wrote.\n */\nimport { trpcOutDir } from './config.js';\n\n/** A generator entry from the config, loosely typed because the config schema owns its shape. */\ntype GeneratorConfig = {\n path?: string;\n template?: unknown;\n includeRelations?: unknown;\n naming?: unknown;\n outputHeader?: unknown;\n format?: unknown;\n importExtension?: unknown;\n validation?: unknown;\n databaseInjection?: unknown;\n};\n\nexport function trpcOptions(\n g: GeneratorConfig,\n cfg: { outDir: string },\n servicesDir: string\n): Record<string, unknown> {\n return {\n outputDir: trpcOutDir(g, cfg),\n template: g.template,\n includeRelations: g.includeRelations,\n naming: g.naming,\n outputHeader: g.outputHeader,\n format: g.format,\n importExtension: g.importExtension,\n validation: g.validation,\n databaseInjection: g.databaseInjection,\n // Where the service generator is actually writing, so `template: 'service'` emits an import\n // of a module that exists. The generator defaults this to `src/services`, which is right only\n // by coincidence for a config that puts them elsewhere.\n servicesDir,\n };\n}\n","/**\n * The options every validation generator receives, built in one place.\n *\n * Each of the four branches used to assemble this by hand, and three documented options were\n * found silently dead as a result: `typedJson` never reached typebox, and `coerceDates` and\n * `applyDefaults` never reached anything but zod. The config parsed them, the CLI dropped them,\n * and the feature simply did nothing while nothing said so. Building it once removes the class\n * rather than fixing each instance.\n *\n * What stays per-generator is a real capability rather than an oversight, which is why it is\n * named as one.\n */\n\n/** A generator entry from the config, loosely typed because the config schema owns its shape. */\ntype GeneratorConfig = {\n outputHeader?: unknown;\n format?: unknown;\n schemaSuffix?: unknown;\n fileSuffix?: unknown;\n importExtension?: unknown;\n affix?: unknown;\n coerceDates?: unknown;\n applyDefaults?: unknown;\n typedJson?: unknown;\n typedColumns?: unknown;\n duplicateFinder?: unknown;\n};\n\nexport interface GeneratorCapabilities {\n /**\n * Whether the generator can reference a type from the schema module.\n *\n * `typedJson` and `typedColumns` both work by importing the table back and reading\n * `typeof table.$inferSelect['col']`, so a generator that cannot embed a TypeScript type in its\n * output cannot use either. ArkType is the case: it emits one string per field, and a type\n * reference has nowhere to live inside a string DSL.\n */\n schemaTypes?: boolean;\n}\n\nexport function validationOptions(\n g: GeneratorConfig,\n cfg: { schema?: unknown },\n outDir: string,\n caps: GeneratorCapabilities = {}\n): Record<string, unknown> {\n return {\n outDir,\n outputHeader: g.outputHeader,\n format: g.format,\n schemaSuffix: g.schemaSuffix,\n fileSuffix: g.fileSuffix,\n importExtension: g.importExtension,\n affix: g.affix,\n coerceDates: g.coerceDates,\n applyDefaults: g.applyDefaults,\n duplicateFinder: g.duplicateFinder,\n // Only where the generator can act on them, so an unsupported option is absent rather than\n // present and ignored.\n ...(caps.schemaTypes\n ? {\n // Needed by both: the reference is resolved relative to the emitted file.\n schemaPath: cfg.schema,\n typedJson: g.typedJson,\n typedColumns: g.typedColumns,\n }\n : {}),\n };\n}\n","/**\n * Drift detection for generated output.\n *\n * No runtime validator can offer this. `drizzle-orm/zod` and friends derive schemas in memory at\n * import time, so there is nothing on disk to have drifted and nothing for CI to compare. It is\n * only available to a code generator, which makes it one of the few things DRZL can do that the\n * first-party modules structurally cannot.\n *\n * The check is: regenerate, and require the result to equal what is committed. That catches the\n * two failures that actually happen, someone editing generated files by hand and someone\n * changing the schema without regenerating, and it catches them in CI rather than in review.\n *\n * Content-neutral by construction. Redirecting output to a temporary directory would not work:\n * generated files contain paths computed relative to their own location, so a different output\n * directory produces legitimately different bytes and every file would report as drifted. So the\n * real directories are snapshotted first, regeneration is allowed to overwrite them, and the\n * snapshot is put back if anything changed. Either way the tree ends as it began.\n */\nimport { promises as fs } from 'node:fs';\nimport path from 'node:path';\n\nexport interface DriftEntry {\n file: string;\n status: 'changed' | 'added' | 'removed';\n}\n\n/** Every file under `dir`, keyed by its path relative to `dir`. Missing directory means empty. */\nexport async function snapshotDir(dir: string): Promise<Map<string, string>> {\n const out = new Map<string, string>();\n async function walk(current: string) {\n let entries;\n try {\n entries = await fs.readdir(current, { withFileTypes: true });\n } catch {\n return; // Nothing generated there yet, which a first run should report as additions.\n }\n for (const e of entries) {\n const full = path.join(current, e.name);\n if (e.isDirectory()) await walk(full);\n else out.set(path.relative(dir, full), await fs.readFile(full, 'utf8'));\n }\n }\n await walk(dir);\n return out;\n}\n\n/** Snapshot several directories at once, keys prefixed by directory so they cannot collide. */\nexport async function snapshotAll(dirs: string[]): Promise<Map<string, string>> {\n const all = new Map<string, string>();\n for (const dir of dirs) {\n for (const [rel, content] of await snapshotDir(dir)) {\n all.set(path.join(dir, rel), content);\n }\n }\n return all;\n}\n\n/** What changed between two snapshots. */\nexport function diffSnapshots(\n before: Map<string, string>,\n after: Map<string, string>\n): DriftEntry[] {\n const out: DriftEntry[] = [];\n for (const [file, content] of after) {\n if (!before.has(file)) out.push({ file, status: 'added' });\n else if (before.get(file) !== content) out.push({ file, status: 'changed' });\n }\n for (const file of before.keys()) {\n if (!after.has(file)) out.push({ file, status: 'removed' });\n }\n return out.sort((a, b) => a.file.localeCompare(b.file));\n}\n\n/**\n * Put a snapshot back, so a failed check leaves the tree exactly as it found it.\n *\n * A file that regeneration created and the snapshot does not know about is deleted, since it was\n * not there before the check ran.\n */\nexport async function restoreSnapshot(\n before: Map<string, string>,\n after: Map<string, string>\n): Promise<void> {\n for (const [file, content] of before) {\n await fs.mkdir(path.dirname(file), { recursive: true });\n await fs.writeFile(file, content, 'utf8');\n }\n for (const file of after.keys()) {\n if (!before.has(file)) await fs.rm(file, { force: true });\n }\n}\n","/**\n * Loading an optional generator package, and telling absence apart from failure.\n *\n * Every validation generator is loaded on demand, because a project that only wants zod should not\n * have to install five. That makes \"the package is not installed\" a real, expected outcome worth a\n * helpful message. It does not make it the only outcome: a generator that is installed and running\n * can throw for any reason a program can throw, and the CLI reported all of those as a missing npm\n * package too, with the true reason printed underneath as a detail.\n *\n * Node reports an unresolvable import as `ERR_MODULE_NOT_FOUND`, and reports the same code when\n * the module resolved and something *it* imported did not. The code alone therefore does not\n * separate the two; the message does, because it names the specifier that failed to resolve.\n */\n\n/** A generator package that is not installed. Everything else is somebody's real error. */\nexport class GeneratorNotInstalledError extends Error {\n constructor(\n readonly specifier: string,\n /** What Node threw, kept so nothing is discarded on the way to the message. */\n readonly reason: unknown\n ) {\n super(`${specifier} is not installed`);\n this.name = 'GeneratorNotInstalledError';\n }\n}\n\n/**\n * Whether `err` is Node refusing to resolve `specifier` itself.\n *\n * Measured on Node 22, from an ESM entry and from a CJS one, since the CLI ships both builds and\n * the bundler leaves `import()` as `import()` in each:\n *\n * absent package ERR_MODULE_NOT_FOUND, `Cannot find package '<specifier>' imported…`\n * present, inner dep absent ERR_MODULE_NOT_FOUND, naming the *inner* specifier instead\n * present, main file gone ERR_MODULE_NOT_FOUND, naming the resolved file path\n * throws while evaluating no `code` at all, and whatever message the generator threw\n *\n * Only the first is an install problem, and only the first quotes the specifier that was asked\n * for, which is what this matches on.\n */\nexport function isPackageMissing(err: unknown, specifier: string): boolean {\n const code = (err as { code?: unknown } | null | undefined)?.code;\n if (code !== 'ERR_MODULE_NOT_FOUND') return false;\n const message = (err as { message?: unknown } | null | undefined)?.message;\n return typeof message === 'string' && message.includes(`'${specifier}'`);\n}\n\n/**\n * Run `load` and re-throw a missing package as `GeneratorNotInstalledError`.\n *\n * `load` is a thunk rather than a specifier so the caller keeps a literal `import('@drzl/…')` in\n * its own source, which is what lets the bundler see the dependency. Anything it throws that is\n * not this package's own absence comes out unchanged.\n */\nexport async function loadGenerator<T>(specifier: string, load: () => Promise<T>): Promise<T> {\n try {\n return await load();\n } catch (e) {\n if (isPackageMissing(e, specifier)) throw new GeneratorNotInstalledError(specifier, e);\n throw e;\n }\n}\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, arktype, or typebox generators.',\n 'Need JSON Schema or OpenAPI? The json-schema generator emits both, with no runtime dependency.',\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","/**\n * The version `drzl --version` prints, read from the manifest that ships beside the build.\n *\n * It used to be the literal `'0.0.1'`, passed to `program.version()` when the CLI was scaffolded\n * and never touched again. That was true of exactly one release, the first: the registry lists 29\n * versions of `@drzl/cli`, and the other 28 printed `0.0.1` as well. Reading the manifest is the\n * only form that cannot drift, because it is the same file the registry took the version from.\n *\n * Nothing here falls back. A build that cannot find its own manifest, or finds someone else's, has\n * resolved somewhere it did not intend to, and a placeholder standing in for that is how the\n * original defect stayed invisible for 28 releases.\n */\nimport { readFileSync } from 'node:fs';\nimport * as path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\n/** The name the manifest beside this build must carry, which is what makes it ours. */\nconst PACKAGE_NAME = '@drzl/cli';\n\n/**\n * The directory holding the file this code ends up in, in every form it is reached.\n *\n * Three of them: `dist/cli.js`, `dist/cli.cjs`, and this file unbundled under ts-node, all three\n * run and checked. Only the CommonJS bundle has no `import.meta`; `tsup.config.ts` gives that\n * build a real value for `import.meta.url` rather than esbuild's empty one, so this needs no\n * branch. If that config is ever dropped, `fileURLToPath(undefined)` throws on load, so the\n * CommonJS bundle stops working loudly instead of reporting the wrong directory.\n */\nfunction moduleDir(): string {\n return path.dirname(fileURLToPath(import.meta.url));\n}\n\n/**\n * The `version` a named manifest declares, or a throw naming what was wrong with it.\n *\n * Split out from the caller below only so the three ways it refuses can be exercised without a\n * build. Nothing in the CLI passes a path.\n */\nexport function readVersionFrom(manifestPath: string): string {\n let raw: string;\n try {\n raw = readFileSync(manifestPath, 'utf8');\n } catch (e: any) {\n throw new Error(\n `${PACKAGE_NAME} cannot read its own version: no manifest at ${manifestPath} ` +\n `(${e?.message ?? String(e)}).`\n );\n }\n\n const manifest = JSON.parse(raw) as { name?: unknown; version?: unknown };\n\n if (manifest.name !== PACKAGE_NAME) {\n throw new Error(\n `${PACKAGE_NAME} looked for its own version in ${manifestPath} and found ` +\n `${JSON.stringify(manifest.name)}, so this build is not sitting where it thinks it is.`\n );\n }\n\n if (typeof manifest.version !== 'string' || manifest.version.length === 0) {\n throw new Error(`${manifestPath} declares no version, so there is nothing to report.`);\n }\n\n return manifest.version;\n}\n\n/**\n * The `version` field of this package's own manifest.\n *\n * Both bundles sit one level below it, in `dist/`, and so does `src/` when this file is run\n * unbundled, so one `..` covers every way it is reached. All three were run.\n */\nexport function readCliVersion(): string {\n return readVersionFrom(path.join(moduleDir(), '..', 'package.json'));\n}\n\nexport const CLI_VERSION = readCliVersion();\n"],"mappings":"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","names":["chalk","path","path","readFileSync","path","chalk","fs","watcher","path"]}
1
+ {"version":3,"sources":["../src/cli.ts","../src/trpc-options.ts","../src/validation-options.ts","../src/drift.ts","../src/generator-loader.ts","../src/sponsor.ts","../src/version.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 { trpcOptions } from './trpc-options.js';\nimport { validationOptions } from './validation-options';\nimport {\n computeGeneratorOutputDirs,\n computeWatchTargets,\n DrzlConfig,\n filterTables,\n loadConfig,\n} from './config.js';\nimport { diffSnapshots, restoreSnapshot, snapshotAll } from './drift.js';\nimport { GeneratorNotInstalledError, loadGenerator } from './generator-loader.js';\nimport { maybeShowSponsorMessage } from './sponsor.js';\nimport { CLI_VERSION } from './version.js';\n\n/**\n * Say what went wrong with a generator, distinguishing the two things that can.\n *\n * Every branch below used to print \"<name> generator missing. Install with: npm install\n * @drzl/generator-<name>\" for anything at all that threw, with the real reason on a trailing\n * \"Error details\" line. A generator that was installed and merely failed therefore sent its user\n * to reinstall a package they already had, and the sentence that would have told them what\n * actually happened was the one written as a footnote.\n *\n * `loadGenerator` marks the one case that is an install problem, so the package name comes off the\n * error rather than being repeated here beside the `import()` that already spells it.\n */\nfunction reportGeneratorFailure(kind: string, e: unknown): void {\n if (e instanceof GeneratorNotInstalledError) {\n console.error(\n chalk.red(`The ${kind} generator is not installed.`),\n chalk.yellow(`\\nInstall with: npm install ${e.specifier}`)\n );\n return;\n }\n console.error(chalk.red(`The ${kind} generator failed:`), (e as any)?.message ?? e);\n}\n\nconst program = new Command();\nprogram.name('drzl').description('DRZL - Drizzle Developer Toolkit').version(CLI_VERSION);\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 .option(\n '--check',\n 'regenerate and fail if the result differs from what is on disk, without changing it'\n )\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 // Applied before any generator sees the analysis, so every one of them honours it without\n // needing to know the option exists.\n analysis.tables = filterTables(analysis.tables, cfg);\n spinner.succeed(`Analysis complete in ${Date.now() - t0}ms`);\n reportWideColumns(analysis.issues);\n // Under --check the existing output is captured before anything overwrites it, so the\n // regenerated result can be compared against it and the tree put back either way.\n const driftDirs = computeGeneratorOutputDirs(cfg);\n const driftBefore = opts.check ? await snapshotAll(driftDirs) : null;\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 // Where the service generator is actually writing, so a router template that imports\n // services spells a path that exists. Templates default this to 'src/services', and with\n // nothing passed that default was used no matter where the services really went, emitting\n // an import of a module that was never created. Must match the `g.path ?? 'src/services'`\n // used by the service branch below.\n const servicesDir =\n cfg.generators.find((x: { kind: string }) => x.kind === 'service')?.path ?? 'src/services';\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 importExtension: g.importExtension,\n validation: g.validation,\n // Documented on this generator since it was added and never reachable from a config\n // file, because the config schema had no such key and zod stripped it in silence.\n databaseInjection: g.databaseInjection,\n servicesDir,\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 === 'trpc') {\n try {\n // An optional dependency, like the json-schema generator and unlike oRPC. A package\n // that has never been published cannot publish through npm's trusted-publisher OIDC\n // flow, so its first version has to go out by hand; naming it as a hard dependency of\n // the CLI in the same release breaks `npm i @drzl/cli` for everyone until it exists.\n // A missing optional dependency is skipped by the installer rather than failing it,\n // which is why this one really can be absent on an ordinary install.\n const { TRPCGenerator } = await loadGenerator(\n '@drzl/generator-trpc',\n () => import('@drzl/generator-trpc')\n );\n const gen = new TRPCGenerator(analysis);\n const { files } = await gen.generate({\n ...trpcOptions(g, cfg, servicesDir),\n onProgress: ({ index }: { index: number }) => progress.update(index),\n });\n progress.stop();\n ora().succeed(chalk.green(`Generated (trpc): ${files.length} files`));\n files.forEach((f: string) => console.log(' -', chalk.cyan(f)));\n } catch (e: any) {\n progress.stop();\n reportGeneratorFailure(g.kind, e);\n process.exit(1);\n }\n } else if (g.kind === 'service') {\n try {\n const { ServiceGenerator } = await loadGenerator(\n '@drzl/generator-service',\n () => import('@drzl/generator-service')\n );\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 importExtension: g.importExtension,\n // The other half of `databaseInjection`. A router generator in injection mode\n // emits `Service.getById(ctx.db, id)`, and only a service generated in the same\n // mode has a `db` parameter to receive it. This branch never passed the option, so\n // the two halves of one generated project disagreed about the signature.\n databaseInjection: g.databaseInjection,\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 reportGeneratorFailure(g.kind, e);\n process.exit(1);\n }\n } else if (g.kind === 'zod') {\n try {\n const { ZodGenerator } = await loadGenerator(\n '@drzl/generator-zod',\n () => import('@drzl/generator-zod')\n );\n const gen = new ZodGenerator(analysis);\n const target = g.path ?? 'src/validators/zod';\n const files = await gen.generate(\n validationOptions(g, cfg, target, { schemaTypes: true }) as never\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 reportGeneratorFailure(g.kind, e);\n process.exit(1);\n }\n } else if (g.kind === 'valibot') {\n try {\n const { ValibotGenerator } = await loadGenerator(\n '@drzl/generator-valibot',\n () => import('@drzl/generator-valibot')\n );\n const gen = new ValibotGenerator(analysis);\n const target = g.path ?? 'src/validators/valibot';\n const files = await gen.generate(\n validationOptions(g, cfg, target, { schemaTypes: true }) as never\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 reportGeneratorFailure(g.kind, e);\n process.exit(1);\n }\n } else if (g.kind === 'arktype') {\n try {\n const { ArkTypeGenerator } = await loadGenerator(\n '@drzl/generator-arktype',\n () => import('@drzl/generator-arktype')\n );\n const gen = new ArkTypeGenerator(analysis);\n const target = g.path ?? 'src/validators/arktype';\n const files = await gen.generate(\n validationOptions(g, cfg, target, { schemaTypes: false }) as never\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 reportGeneratorFailure(g.kind, e);\n process.exit(1);\n }\n } else if (g.kind === 'json-schema') {\n try {\n // An optional dependency, unlike the other generators, until its npm trusted publisher\n // exists. A missing optional dependency is skipped rather than failing the install,\n // which is what keeps `npm i @drzl/cli` working meanwhile, and is why this one really\n // can be absent on a normal install.\n const { JsonSchemaGenerator } = await loadGenerator(\n '@drzl/generator-json-schema',\n () => import('@drzl/generator-json-schema')\n );\n const gen = new JsonSchemaGenerator(analysis);\n const target = g.path ?? 'src/validators/json-schema';\n const files = await gen.generate({\n // JSON Schema is data, so nothing here references a type from the schema module.\n ...(validationOptions(g, cfg, target, { schemaTypes: false }) as object),\n target: g.target,\n components: g.components,\n } as never);\n progress.stop();\n ora().succeed(chalk.green(`Generated (json-schema): ${files.length} files`));\n files.forEach((f: string) => console.log(' -', chalk.cyan(f)));\n } catch (e: any) {\n progress.stop();\n reportGeneratorFailure(g.kind, e);\n process.exit(1);\n }\n } else if (g.kind === 'typebox') {\n try {\n const { TypeBoxGenerator } = await loadGenerator(\n '@drzl/generator-typebox',\n () => import('@drzl/generator-typebox')\n );\n const gen = new TypeBoxGenerator(analysis);\n const target = g.path ?? 'src/validators/typebox';\n const files = await gen.generate(\n validationOptions(g, cfg, target, { schemaTypes: true }) as never\n );\n progress.stop();\n ora().succeed(chalk.green(`Generated (typebox): ${files.length} files`));\n files.forEach((f: string) => console.log(' -', chalk.cyan(f)));\n } catch (e: any) {\n progress.stop();\n reportGeneratorFailure(g.kind, e);\n process.exit(1);\n }\n }\n }\n if (driftBefore) {\n const after = await snapshotAll(driftDirs);\n const drift = diffSnapshots(driftBefore, after);\n // Restored whether or not anything drifted, so `--check` never leaves the tree altered.\n await restoreSnapshot(driftBefore, after);\n\n if (drift.length) {\n console.error(chalk.red(`\\nGenerated output is out of date (${drift.length} file(s)):`));\n for (const d of drift) {\n const mark = d.status === 'added' ? '+' : d.status === 'removed' ? '-' : '~';\n console.error(\n ` ${mark} ${chalk.yellow(d.status.padEnd(8))} ${path.relative(process.cwd(), d.file)}`\n );\n }\n console.error(\n chalk.dim(\n '\\nRun `drzl generate` and commit the result. Nothing was written by this check.'\n )\n );\n process.exit(1);\n }\n console.log(chalk.green('Generated output is up to date.'));\n return;\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('generate:trpc')\n .argument('<schema>', 'path to drizzle schema (TS)')\n .option('-o, --outDir <dir>', 'output directory', 'src/api')\n .option('--template <name>', 'standard | service', 'standard')\n .option('--includeRelations', 'include relation endpoints')\n .option('--servicesDir <dir>', 'where the service generator writes', 'src/services')\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 { TRPCGenerator } = await loadGenerator(\n '@drzl/generator-trpc',\n () => import('@drzl/generator-trpc')\n );\n const gen = new TRPCGenerator(analysis);\n const { files } = await gen.generate({\n outputDir: opts.outDir,\n template: opts.template,\n includeRelations: !!opts.includeRelations,\n // Only consulted by `--template service`, and passed unconditionally so this command\n // cannot become the branch that forgets it.\n servicesDir: opts.servicesDir,\n });\n console.log(chalk.green(`Generated:`), files.map((f: string) => chalk.cyan(f)).join(', '));\n maybeShowSponsorMessage({ reason: 'generate:trpc' });\n } catch (e: any) {\n reportGeneratorFailure('trpc', 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 | generate-trpc', '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 // Watch targets are directories now, because chokidar v4 dropped glob support. The\n // extensions the old `**/*.{ts,tsx,js}` glob selected therefore have to be filtered here\n // instead, or every unrelated file in the schema's directory would trigger a rebuild.\n const WATCHED_EXTENSIONS = new Set(['.ts', '.tsx', '.js', '.mjs', '.cjs']);\n\n const ignoredFn = (p: string, stats?: { isDirectory(): boolean }) => {\n const full = abs(p);\n for (const dir of ignoredOutDirs) {\n if (full === dir || isInside(full, dir)) return true;\n }\n // A directory is never ignored: chokidar has to descend into it to reach the files.\n if (stats?.isDirectory()) return false;\n const ext = path.extname(full);\n // Without stats chokidar is asking about a path it has not resolved yet. An extensionless\n // one is almost certainly a directory, so let it through and decide once it is known.\n if (!ext) return false;\n return !WATCHED_EXTENSIONS.has(ext);\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 analysis.tables = filterTables(analysis.tables, cfg);\n if (!opts.json) reportWideColumns(analysis.issues);\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 // Must match the `g.path ?? 'src/services'` the service branch below uses, or a router\n // template that imports services spells a path nothing ever wrote. `generate` has always\n // computed this; `watch` did not, so a rebuild silently emitted the default.\n const servicesDir =\n cfg.generators.find((x: { kind: string }) => x.kind === 'service')?.path ??\n 'src/services';\n\n const PIPELINE_KINDS: Record<string, string> = {\n 'generate-orpc': 'orpc',\n 'generate-trpc': 'trpc',\n };\n\n for (const g of cfg.generators) {\n if (opts.pipeline !== 'all' && PIPELINE_KINDS[opts.pipeline] !== g.kind) {\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 importExtension: g.importExtension,\n validation: g.validation,\n databaseInjection: g.databaseInjection,\n servicesDir,\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 === 'trpc') {\n try {\n const { TRPCGenerator } = await loadGenerator(\n '@drzl/generator-trpc',\n () => import('@drzl/generator-trpc')\n );\n const gen = new TRPCGenerator(analysis);\n // The same builder `generate` uses, so the two dispatch loops cannot disagree\n // about what this generator is given.\n const { files } = await gen.generate(trpcOptions(g, cfg, servicesDir));\n opts.json\n ? console.log(JSON.stringify({ event: 'generate_complete', kind: g.kind, files }))\n : console.log(\n chalk.green(`Generated (trpc): ${files.length} files`),\n files.map((f: string) => chalk.cyan(f)).join(', ')\n );\n newFiles.push(...files);\n } catch (e: any) {\n reportGeneratorFailure(g.kind, e);\n return;\n }\n } else if (g.kind === 'service') {\n try {\n const { ServiceGenerator } = await loadGenerator(\n '@drzl/generator-service',\n () => import('@drzl/generator-service')\n );\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 importExtension: g.importExtension,\n databaseInjection: g.databaseInjection,\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 reportGeneratorFailure(g.kind, e);\n return;\n }\n } else if (g.kind === 'zod') {\n try {\n const { ZodGenerator } = await loadGenerator(\n '@drzl/generator-zod',\n () => import('@drzl/generator-zod')\n );\n const gen = new ZodGenerator(analysis);\n const target = g.path ?? 'src/validators/zod';\n // The same builder `generate` uses. Assembled by hand here until now, and every\n // option added since the builder existed was therefore absent from a watch rebuild:\n // `coerceDates`, `applyDefaults`, `typedJson`, `typedColumns` and `duplicateFinder`\n // were all dropped, so the first save after starting `drzl watch` silently replaced\n // correct output with output generated from defaults.\n const files = await gen.generate(\n validationOptions(g, cfg, target, { schemaTypes: true }) as never\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 reportGeneratorFailure(g.kind, e);\n return;\n }\n } else if (g.kind === 'valibot') {\n try {\n const { ValibotGenerator } = await loadGenerator(\n '@drzl/generator-valibot',\n () => import('@drzl/generator-valibot')\n );\n const gen = new ValibotGenerator(analysis);\n const target = g.path ?? 'src/validators/valibot';\n // The same builder `generate` uses. Assembled by hand here until now, and every\n // option added since the builder existed was therefore absent from a watch rebuild:\n // `coerceDates`, `applyDefaults`, `typedJson`, `typedColumns` and `duplicateFinder`\n // were all dropped, so the first save after starting `drzl watch` silently replaced\n // correct output with output generated from defaults.\n const files = await gen.generate(\n validationOptions(g, cfg, target, { schemaTypes: true }) as never\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 reportGeneratorFailure(g.kind, e);\n return;\n }\n } else if (g.kind === 'arktype') {\n try {\n const { ArkTypeGenerator } = await loadGenerator(\n '@drzl/generator-arktype',\n () => import('@drzl/generator-arktype')\n );\n const gen = new ArkTypeGenerator(analysis);\n const target = g.path ?? 'src/validators/arktype';\n // The same builder `generate` uses. Assembled by hand here until now, and every\n // option added since the builder existed was therefore absent from a watch rebuild:\n // `coerceDates`, `applyDefaults`, `typedJson`, `typedColumns` and `duplicateFinder`\n // were all dropped, so the first save after starting `drzl watch` silently replaced\n // correct output with output generated from defaults.\n const files = await gen.generate(\n validationOptions(g, cfg, target, { schemaTypes: false }) as never\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 reportGeneratorFailure(g.kind, e);\n return;\n }\n } else if (g.kind === 'typebox') {\n try {\n const { TypeBoxGenerator } = await loadGenerator(\n '@drzl/generator-typebox',\n () => import('@drzl/generator-typebox')\n );\n const gen = new TypeBoxGenerator(analysis);\n const target = g.path ?? 'src/validators/typebox';\n // The same builder `generate` uses. Assembled by hand here until now, and every\n // option added since the builder existed was therefore absent from a watch rebuild:\n // `coerceDates`, `applyDefaults`, `typedJson`, `typedColumns` and `duplicateFinder`\n // were all dropped, so the first save after starting `drzl watch` silently replaced\n // correct output with output generated from defaults.\n const files = await gen.generate(\n validationOptions(g, cfg, target, { schemaTypes: true }) as never\n );\n opts.json\n ? console.log(JSON.stringify({ event: 'generate_complete', kind: g.kind, files }))\n : console.log(\n chalk.green(`Generated (typebox): ${files.length} files`),\n files.map((f: string) => chalk.cyan(f)).join(', ')\n );\n newFiles.push(...files);\n } catch (e: any) {\n reportGeneratorFailure(g.kind, e);\n return;\n }\n } else if (g.kind === 'json-schema') {\n try {\n const { JsonSchemaGenerator } = await loadGenerator(\n '@drzl/generator-json-schema',\n () => import('@drzl/generator-json-schema')\n );\n const gen = new JsonSchemaGenerator(analysis);\n const target = g.path ?? 'src/validators/json-schema';\n const files = await gen.generate({\n // JSON Schema is data, so nothing here references a type from the schema module.\n ...(validationOptions(g, cfg, target, { schemaTypes: false }) as object),\n target: g.target,\n components: g.components,\n } as never);\n opts.json\n ? console.log(JSON.stringify({ event: 'generate_complete', kind: g.kind, files }))\n : console.log(\n chalk.green(`Generated (json-schema): ${files.length} files`),\n files.map((f: string) => chalk.cyan(f)).join(', ')\n );\n newFiles.push(...files);\n } catch (e: any) {\n reportGeneratorFailure(g.kind, 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 // One router generator, not both: they default to the same `outDir` and would each write an\n // `index.ts` there, so a scaffold naming both would emit a config whose second generator\n // silently overwrote the first. Swapping the kind is a one-word edit; running both needs a\n // `path` on one of them, which is what the comment says.\n const template = `export default {\n schema: 'src/db/schema.ts',\n outDir: 'src/api',\n analyzer: { includeRelations: true, validateConstraints: true },\n generators: [\n // For tRPC instead: { kind: 'trpc', template: 'standard', includeRelations: true }\n // To run both, give one of them its own \\`path\\`; they share \\`outDir\\` otherwise.\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\n/**\n * Tell the user which columns got a validator that accepts anything.\n *\n * This is the user-facing half of a check `verify-packed.sh` runs on this repository. Two real\n * bugs took exactly this shape, `.array()` and `pgEnum` columns coming back untyped on\n * drizzle-orm 0.4x, and the only way anyone noticed was reading the generated file. A user whose\n * schema uses a type nobody here has modelled gets the same silence, and no gate of ours helps\n * them.\n *\n * Printed once with a count rather than a line per column, so a schema with fifty custom types\n * stays readable.\n */\nfunction reportWideColumns(issues: Array<{ code?: string; message?: string; hint?: string }>) {\n const wide = issues.filter((i) => i.code === 'DRZL_ANL_UNKNOWN_COLUMN');\n if (!wide.length) return;\n console.warn(\n chalk.yellow(`\\n${wide.length} column${wide.length === 1 ? '' : 's'} could not be typed:`)\n );\n for (const i of wide.slice(0, 10)) console.warn(chalk.gray(` - ${i.message}`));\n if (wide.length > 10) console.warn(chalk.gray(` ... and ${wide.length - 10} more`));\n // One hint for the set, since they are almost always the same two.\n const hints = [...new Set(wide.map((i) => i.hint).filter(Boolean))];\n for (const h of hints) console.warn(chalk.gray(` ${h}`));\n}\n\nprogram.parseAsync(process.argv);\n","/**\n * The options `@drzl/generator-trpc` receives, built in one place.\n *\n * `generate` and `watch` each dispatch over `cfg.generators` in their own loop, and every branch\n * in both assembles its own options object by hand. Three documented options have already been\n * found dead that way: `typedJson` never reached typebox, `coerceDates` and `applyDefaults`\n * reached nothing but zod, and `servicesDir` is passed by `generate`'s oRPC branch and not by\n * `watch`'s, so a watch rebuild emits a service import pointing at the default directory whatever\n * the config says. None of those is visible in the wiring: the option parses, the generator\n * defaults it, and the feature simply does nothing.\n *\n * One builder means the two call sites are the same object by construction rather than by review.\n * It also gives the drift something to be asserted against, which is what\n * `packages/cli/test/trpc-branch-parity.spec.ts` does by running both commands and comparing the\n * bytes they wrote.\n */\nimport { trpcOutDir } from './config.js';\n\n/** A generator entry from the config, loosely typed because the config schema owns its shape. */\ntype GeneratorConfig = {\n path?: string;\n template?: unknown;\n includeRelations?: unknown;\n naming?: unknown;\n outputHeader?: unknown;\n format?: unknown;\n importExtension?: unknown;\n validation?: unknown;\n databaseInjection?: unknown;\n};\n\nexport function trpcOptions(\n g: GeneratorConfig,\n cfg: { outDir: string },\n servicesDir: string\n): Record<string, unknown> {\n return {\n outputDir: trpcOutDir(g, cfg),\n template: g.template,\n includeRelations: g.includeRelations,\n naming: g.naming,\n outputHeader: g.outputHeader,\n format: g.format,\n importExtension: g.importExtension,\n validation: g.validation,\n databaseInjection: g.databaseInjection,\n // Where the service generator is actually writing, so `template: 'service'` emits an import\n // of a module that exists. The generator defaults this to `src/services`, which is right only\n // by coincidence for a config that puts them elsewhere.\n servicesDir,\n };\n}\n","/**\n * The options every validation generator receives, built in one place.\n *\n * Each of the four branches used to assemble this by hand, and three documented options were\n * found silently dead as a result: `typedJson` never reached typebox, and `coerceDates` and\n * `applyDefaults` never reached anything but zod. The config parsed them, the CLI dropped them,\n * and the feature simply did nothing while nothing said so. Building it once removes the class\n * rather than fixing each instance.\n *\n * What stays per-generator is a real capability rather than an oversight, which is why it is\n * named as one.\n */\n\n/** A generator entry from the config, loosely typed because the config schema owns its shape. */\ntype GeneratorConfig = {\n outputHeader?: unknown;\n format?: unknown;\n schemaSuffix?: unknown;\n fileSuffix?: unknown;\n importExtension?: unknown;\n affix?: unknown;\n coerceDates?: unknown;\n applyDefaults?: unknown;\n typedJson?: unknown;\n typedColumns?: unknown;\n duplicateFinder?: unknown;\n nestedSchemas?: unknown;\n nestedDepth?: unknown;\n};\n\nexport interface GeneratorCapabilities {\n /**\n * Whether the generator can reference a type from the schema module.\n *\n * `typedJson` and `typedColumns` both work by importing the table back and reading\n * `typeof table.$inferSelect['col']`, so a generator that cannot embed a TypeScript type in its\n * output cannot use either. ArkType is the case: it emits one string per field, and a type\n * reference has nowhere to live inside a string DSL.\n */\n schemaTypes?: boolean;\n}\n\nexport function validationOptions(\n g: GeneratorConfig,\n cfg: { schema?: unknown },\n outDir: string,\n caps: GeneratorCapabilities = {}\n): Record<string, unknown> {\n return {\n outDir,\n outputHeader: g.outputHeader,\n format: g.format,\n schemaSuffix: g.schemaSuffix,\n fileSuffix: g.fileSuffix,\n importExtension: g.importExtension,\n affix: g.affix,\n coerceDates: g.coerceDates,\n applyDefaults: g.applyDefaults,\n duplicateFinder: g.duplicateFinder,\n nestedSchemas: g.nestedSchemas,\n nestedDepth: g.nestedDepth,\n // Only where the generator can act on them, so an unsupported option is absent rather than\n // present and ignored.\n ...(caps.schemaTypes\n ? {\n // Needed by both: the reference is resolved relative to the emitted file.\n schemaPath: cfg.schema,\n typedJson: g.typedJson,\n typedColumns: g.typedColumns,\n }\n : {}),\n };\n}\n","/**\n * Drift detection for generated output.\n *\n * No runtime validator can offer this. `drizzle-orm/zod` and friends derive schemas in memory at\n * import time, so there is nothing on disk to have drifted and nothing for CI to compare. It is\n * only available to a code generator, which makes it one of the few things DRZL can do that the\n * first-party modules structurally cannot.\n *\n * The check is: regenerate, and require the result to equal what is committed. That catches the\n * two failures that actually happen, someone editing generated files by hand and someone\n * changing the schema without regenerating, and it catches them in CI rather than in review.\n *\n * Content-neutral by construction. Redirecting output to a temporary directory would not work:\n * generated files contain paths computed relative to their own location, so a different output\n * directory produces legitimately different bytes and every file would report as drifted. So the\n * real directories are snapshotted first, regeneration is allowed to overwrite them, and the\n * snapshot is put back if anything changed. Either way the tree ends as it began.\n */\nimport { promises as fs } from 'node:fs';\nimport path from 'node:path';\n\nexport interface DriftEntry {\n file: string;\n status: 'changed' | 'added' | 'removed';\n}\n\n/** Every file under `dir`, keyed by its path relative to `dir`. Missing directory means empty. */\nexport async function snapshotDir(dir: string): Promise<Map<string, string>> {\n const out = new Map<string, string>();\n async function walk(current: string) {\n let entries;\n try {\n entries = await fs.readdir(current, { withFileTypes: true });\n } catch {\n return; // Nothing generated there yet, which a first run should report as additions.\n }\n for (const e of entries) {\n const full = path.join(current, e.name);\n if (e.isDirectory()) await walk(full);\n else out.set(path.relative(dir, full), await fs.readFile(full, 'utf8'));\n }\n }\n await walk(dir);\n return out;\n}\n\n/** Snapshot several directories at once, keys prefixed by directory so they cannot collide. */\nexport async function snapshotAll(dirs: string[]): Promise<Map<string, string>> {\n const all = new Map<string, string>();\n for (const dir of dirs) {\n for (const [rel, content] of await snapshotDir(dir)) {\n all.set(path.join(dir, rel), content);\n }\n }\n return all;\n}\n\n/** What changed between two snapshots. */\nexport function diffSnapshots(\n before: Map<string, string>,\n after: Map<string, string>\n): DriftEntry[] {\n const out: DriftEntry[] = [];\n for (const [file, content] of after) {\n if (!before.has(file)) out.push({ file, status: 'added' });\n else if (before.get(file) !== content) out.push({ file, status: 'changed' });\n }\n for (const file of before.keys()) {\n if (!after.has(file)) out.push({ file, status: 'removed' });\n }\n return out.sort((a, b) => a.file.localeCompare(b.file));\n}\n\n/**\n * Put a snapshot back, so a failed check leaves the tree exactly as it found it.\n *\n * A file that regeneration created and the snapshot does not know about is deleted, since it was\n * not there before the check ran.\n */\nexport async function restoreSnapshot(\n before: Map<string, string>,\n after: Map<string, string>\n): Promise<void> {\n for (const [file, content] of before) {\n await fs.mkdir(path.dirname(file), { recursive: true });\n await fs.writeFile(file, content, 'utf8');\n }\n for (const file of after.keys()) {\n if (!before.has(file)) await fs.rm(file, { force: true });\n }\n}\n","/**\n * Loading an optional generator package, and telling absence apart from failure.\n *\n * Every validation generator is loaded on demand, because a project that only wants zod should not\n * have to install five. That makes \"the package is not installed\" a real, expected outcome worth a\n * helpful message. It does not make it the only outcome: a generator that is installed and running\n * can throw for any reason a program can throw, and the CLI reported all of those as a missing npm\n * package too, with the true reason printed underneath as a detail.\n *\n * Node reports an unresolvable import as `ERR_MODULE_NOT_FOUND`, and reports the same code when\n * the module resolved and something *it* imported did not. The code alone therefore does not\n * separate the two; the message does, because it names the specifier that failed to resolve.\n */\n\n/** A generator package that is not installed. Everything else is somebody's real error. */\nexport class GeneratorNotInstalledError extends Error {\n constructor(\n readonly specifier: string,\n /** What Node threw, kept so nothing is discarded on the way to the message. */\n readonly reason: unknown\n ) {\n super(`${specifier} is not installed`);\n this.name = 'GeneratorNotInstalledError';\n }\n}\n\n/**\n * Whether `err` is Node refusing to resolve `specifier` itself.\n *\n * Measured on Node 22, from an ESM entry and from a CJS one, since the CLI ships both builds and\n * the bundler leaves `import()` as `import()` in each:\n *\n * absent package ERR_MODULE_NOT_FOUND, `Cannot find package '<specifier>' imported…`\n * present, inner dep absent ERR_MODULE_NOT_FOUND, naming the *inner* specifier instead\n * present, main file gone ERR_MODULE_NOT_FOUND, naming the resolved file path\n * throws while evaluating no `code` at all, and whatever message the generator threw\n *\n * Only the first is an install problem, and only the first quotes the specifier that was asked\n * for, which is what this matches on.\n */\nexport function isPackageMissing(err: unknown, specifier: string): boolean {\n const code = (err as { code?: unknown } | null | undefined)?.code;\n if (code !== 'ERR_MODULE_NOT_FOUND') return false;\n const message = (err as { message?: unknown } | null | undefined)?.message;\n return typeof message === 'string' && message.includes(`'${specifier}'`);\n}\n\n/**\n * Run `load` and re-throw a missing package as `GeneratorNotInstalledError`.\n *\n * `load` is a thunk rather than a specifier so the caller keeps a literal `import('@drzl/…')` in\n * its own source, which is what lets the bundler see the dependency. Anything it throws that is\n * not this package's own absence comes out unchanged.\n */\nexport async function loadGenerator<T>(specifier: string, load: () => Promise<T>): Promise<T> {\n try {\n return await load();\n } catch (e) {\n if (isPackageMissing(e, specifier)) throw new GeneratorNotInstalledError(specifier, e);\n throw e;\n }\n}\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, arktype, or typebox generators.',\n 'Need JSON Schema or OpenAPI? The json-schema generator emits both, with no runtime dependency.',\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","/**\n * The version `drzl --version` prints, read from the manifest that ships beside the build.\n *\n * It used to be the literal `'0.0.1'`, passed to `program.version()` when the CLI was scaffolded\n * and never touched again. That was true of exactly one release, the first: the registry lists 29\n * versions of `@drzl/cli`, and the other 28 printed `0.0.1` as well. Reading the manifest is the\n * only form that cannot drift, because it is the same file the registry took the version from.\n *\n * Nothing here falls back. A build that cannot find its own manifest, or finds someone else's, has\n * resolved somewhere it did not intend to, and a placeholder standing in for that is how the\n * original defect stayed invisible for 28 releases.\n */\nimport { readFileSync } from 'node:fs';\nimport * as path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\n/** The name the manifest beside this build must carry, which is what makes it ours. */\nconst PACKAGE_NAME = '@drzl/cli';\n\n/**\n * The directory holding the file this code ends up in, in every form it is reached.\n *\n * Three of them: `dist/cli.js`, `dist/cli.cjs`, and this file unbundled under ts-node, all three\n * run and checked. Only the CommonJS bundle has no `import.meta`; `tsup.config.ts` gives that\n * build a real value for `import.meta.url` rather than esbuild's empty one, so this needs no\n * branch. If that config is ever dropped, `fileURLToPath(undefined)` throws on load, so the\n * CommonJS bundle stops working loudly instead of reporting the wrong directory.\n */\nfunction moduleDir(): string {\n return path.dirname(fileURLToPath(import.meta.url));\n}\n\n/**\n * The `version` a named manifest declares, or a throw naming what was wrong with it.\n *\n * Split out from the caller below only so the three ways it refuses can be exercised without a\n * build. Nothing in the CLI passes a path.\n */\nexport function readVersionFrom(manifestPath: string): string {\n let raw: string;\n try {\n raw = readFileSync(manifestPath, 'utf8');\n } catch (e: any) {\n throw new Error(\n `${PACKAGE_NAME} cannot read its own version: no manifest at ${manifestPath} ` +\n `(${e?.message ?? String(e)}).`\n );\n }\n\n const manifest = JSON.parse(raw) as { name?: unknown; version?: unknown };\n\n if (manifest.name !== PACKAGE_NAME) {\n throw new Error(\n `${PACKAGE_NAME} looked for its own version in ${manifestPath} and found ` +\n `${JSON.stringify(manifest.name)}, so this build is not sitting where it thinks it is.`\n );\n }\n\n if (typeof manifest.version !== 'string' || manifest.version.length === 0) {\n throw new Error(`${manifestPath} declares no version, so there is nothing to report.`);\n }\n\n return manifest.version;\n}\n\n/**\n * The `version` field of this package's own manifest.\n *\n * Both bundles sit one level below it, in `dist/`, and so does `src/` when this file is run\n * unbundled, so one `..` covers every way it is reached. All three were run.\n */\nexport function readCliVersion(): string {\n return readVersionFrom(path.join(moduleDir(), '..', 'package.json'));\n}\n\nexport const CLI_VERSION = readCliVersion();\n"],"mappings":"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","names":["chalk","path","path","readFileSync","path","chalk","fs","watcher","path"]}
package/dist/config.cjs CHANGED
@@ -121,6 +121,22 @@ var GeneratorSchema = import_zod.z.object({
121
121
  * fact about the table rather than the row. This checks the half that needs no database.
122
122
  */
123
123
  duplicateFinder: import_zod.z.boolean().optional(),
124
+ /**
125
+ * Emit `NestedInsert<Table>` and `NestedSelect<Table>` beside the flat schemas: the table plus
126
+ * one key per relation, so `{ ...user, posts: [...] }` can be validated whole.
127
+ *
128
+ * Nothing in the Drizzle validator ecosystem describes that payload, and `db.insert` drops the
129
+ * relation key silently rather than refusing it, so the children are never written and nothing
130
+ * says so.
131
+ */
132
+ nestedSchemas: import_zod.z.boolean().optional(),
133
+ /**
134
+ * How many levels of children a nested schema describes. Defaults to 1, capped at 3.
135
+ *
136
+ * Nesting is expanded inline rather than by reference, so this multiplies the emitted size, and
137
+ * it is also what terminates a cycle: `users -> posts -> users` stops here.
138
+ */
139
+ nestedDepth: import_zod.z.number().int().optional(),
124
140
  naming: NamingSchema.optional(),
125
141
  outputHeader: import_zod.z.object({
126
142
  enabled: import_zod.z.boolean().default(true).optional(),