@drzl/cli 0.0.3 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,105 @@
1
+ // src/config.ts
2
+ import { z } from "zod";
3
+ var NamingSchema = z.object({
4
+ routerSuffix: z.string().default("Router"),
5
+ procedureCase: z.enum(["camel", "kebab", "snake"]).default("camel")
6
+ }).partial();
7
+ var GeneratorSchema = z.object({
8
+ kind: z.enum(["orpc", "service", "zod", "valibot", "arktype"]),
9
+ template: z.string().optional(),
10
+ includeRelations: z.boolean().optional(),
11
+ naming: NamingSchema.optional(),
12
+ outputHeader: z.object({
13
+ enabled: z.boolean().default(true).optional(),
14
+ text: z.string().optional()
15
+ }).optional(),
16
+ format: z.object({
17
+ enabled: z.boolean().default(true).optional(),
18
+ engine: z.enum(["auto", "prettier", "biome"]).default("auto").optional(),
19
+ configPath: z.string().optional()
20
+ }).optional(),
21
+ // service generator specific options
22
+ path: z.string().optional(),
23
+ dataAccess: z.enum(["stub", "drizzle"]).default("stub").optional(),
24
+ dbImportPath: z.string().optional(),
25
+ schemaImportPath: z.string().optional(),
26
+ // zod generator specific options
27
+ schemaSuffix: z.string().optional(),
28
+ fileSuffix: z.string().optional(),
29
+ // orpc validation sharing
30
+ validation: z.object({
31
+ useShared: z.boolean().default(false).optional(),
32
+ library: z.enum(["zod", "valibot", "arktype"]).default("zod").optional(),
33
+ importPath: z.string().optional(),
34
+ schemaSuffix: z.string().optional()
35
+ }).optional(),
36
+ // template options
37
+ templateOptions: z.record(z.string(), z.any()).optional()
38
+ });
39
+ var AnalyzerSchema = z.object({
40
+ includeRelations: z.boolean().default(true),
41
+ validateConstraints: z.boolean().default(true),
42
+ includeHeuristicRelations: z.boolean().default(false)
43
+ });
44
+ var ConfigSchema = z.object({
45
+ schema: z.string(),
46
+ outDir: z.string().default("src/api"),
47
+ analyzer: AnalyzerSchema.default({
48
+ includeRelations: true,
49
+ validateConstraints: true,
50
+ includeHeuristicRelations: false
51
+ }),
52
+ generators: z.array(GeneratorSchema).min(1).default([{ kind: "orpc" }])
53
+ });
54
+ function defineConfig(cfg) {
55
+ return cfg;
56
+ }
57
+ async function loadConfig(customPath) {
58
+ const path = await import("path");
59
+ const fs = await import("fs/promises");
60
+ const candidates = customPath ? [customPath] : ["drzl.config.ts", "drzl.config.mjs", "drzl.config.js", "drzl.config.json"];
61
+ for (const c of candidates) {
62
+ const p = path.resolve(process.cwd(), c);
63
+ try {
64
+ await fs.access(p);
65
+ } catch {
66
+ continue;
67
+ }
68
+ if (/\.json$/i.test(p)) {
69
+ try {
70
+ const content = await fs.readFile(p, "utf8");
71
+ const raw = JSON.parse(content);
72
+ return ConfigSchema.parse(raw);
73
+ } catch (e2) {
74
+ throw new Error(`Failed to load config from ${p}: ${String(e2)}`);
75
+ }
76
+ }
77
+ try {
78
+ const { createJiti } = await import("jiti");
79
+ const jit = createJiti(import.meta.url);
80
+ const mod = await jit.import(p);
81
+ const raw = mod && typeof mod === "object" && "default" in mod ? mod.default : mod;
82
+ return ConfigSchema.parse(raw);
83
+ } catch (e) {
84
+ console.error(`jiti failed to load ${p}:`, e);
85
+ try {
86
+ const content = await fs.readFile(p, "utf8");
87
+ const raw = JSON.parse(content);
88
+ return ConfigSchema.parse(raw);
89
+ } catch (e2) {
90
+ throw new Error(`Failed to load config from ${p}: ${String(e2)}`);
91
+ }
92
+ }
93
+ }
94
+ return null;
95
+ }
96
+
97
+ export {
98
+ NamingSchema,
99
+ GeneratorSchema,
100
+ AnalyzerSchema,
101
+ ConfigSchema,
102
+ defineConfig,
103
+ loadConfig
104
+ };
105
+ //# sourceMappingURL=chunk-AWFAECUZ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/config.ts"],"sourcesContent":["import { z } from 'zod';\n\nexport const NamingSchema = z\n .object({\n routerSuffix: z.string().default('Router'),\n procedureCase: z.enum(['camel', 'kebab', 'snake']).default('camel'),\n })\n .partial();\n\nexport const GeneratorSchema = z.object({\n kind: z.enum(['orpc', 'service', 'zod', 'valibot', 'arktype']),\n template: z.string().optional(),\n includeRelations: z.boolean().optional(),\n naming: NamingSchema.optional(),\n outputHeader: z\n .object({\n enabled: z.boolean().default(true).optional(),\n text: z.string().optional(),\n })\n .optional(),\n format: z\n .object({\n enabled: z.boolean().default(true).optional(),\n engine: z.enum(['auto', 'prettier', 'biome']).default('auto').optional(),\n configPath: z.string().optional(),\n })\n .optional(),\n // service generator specific options\n path: z.string().optional(),\n dataAccess: z.enum(['stub', 'drizzle']).default('stub').optional(),\n dbImportPath: z.string().optional(),\n schemaImportPath: z.string().optional(),\n // zod generator specific options\n schemaSuffix: z.string().optional(),\n fileSuffix: z.string().optional(),\n // orpc validation sharing\n validation: z\n .object({\n useShared: z.boolean().default(false).optional(),\n library: z.enum(['zod', 'valibot', 'arktype']).default('zod').optional(),\n importPath: z.string().optional(),\n schemaSuffix: z.string().optional(),\n })\n .optional(),\n // template options\n templateOptions: z.record(z.string(), z.any()).optional(),\n});\n\nexport const AnalyzerSchema = z.object({\n includeRelations: z.boolean().default(true),\n validateConstraints: z.boolean().default(true),\n includeHeuristicRelations: z.boolean().default(false),\n});\n\nexport const ConfigSchema = z.object({\n schema: z.string(),\n outDir: z.string().default('src/api'),\n analyzer: AnalyzerSchema.default({\n includeRelations: true,\n validateConstraints: true,\n includeHeuristicRelations: false,\n }),\n generators: z\n .array(GeneratorSchema)\n .min(1)\n .default([{ kind: 'orpc' } as any]),\n});\n\n// ✨ Separate input vs output types\nexport type DrzlConfigInput = z.input<typeof ConfigSchema>;\nexport type DrzlConfig = z.output<typeof ConfigSchema>;\n\nexport function defineConfig<T extends DrzlConfigInput>(cfg: T): T {\n return cfg;\n}\n\nexport async function loadConfig(customPath?: string): Promise<DrzlConfig | null> {\n const path = await import('node:path');\n const fs = await import('node:fs/promises');\n\n const candidates = customPath\n ? [customPath]\n : ['drzl.config.ts', 'drzl.config.mjs', 'drzl.config.js', 'drzl.config.json'];\n\n for (const c of candidates) {\n const p = path.resolve(process.cwd(), c);\n try {\n await fs.access(p);\n } catch {\n continue;\n }\n\n // JSON path — parse directly\n if (/\\.json$/i.test(p)) {\n try {\n const content = await fs.readFile(p, 'utf8');\n const raw = JSON.parse(content);\n return ConfigSchema.parse(raw); // -> DrzlConfig (output)\n } catch (e2) {\n throw new Error(`Failed to load config from ${p}: ${String(e2)}`);\n }\n }\n\n // TS/ESM/CJS via jiti\n try {\n const { createJiti } = await import('jiti');\n const jit = createJiti(import.meta.url);\n const mod = await jit.import(p);\n const raw = mod && typeof mod === 'object' && 'default' in mod ? mod.default : mod;\n return ConfigSchema.parse(raw); // parse to resolved output\n } catch (e) {\n console.error(`jiti failed to load ${p}:`, e);\n // Fallback: try JSON parse\n try {\n const content = await fs.readFile(p, 'utf8');\n const raw = JSON.parse(content);\n return ConfigSchema.parse(raw);\n } catch (e2) {\n throw new Error(`Failed to load config from ${p}: ${String(e2)}`);\n }\n }\n }\n return null;\n}\n"],"mappings":"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","names":[]}
package/dist/cli.cjs CHANGED
@@ -68,14 +68,15 @@ var GeneratorSchema = import_zod.z.object({
68
68
  // template options
69
69
  templateOptions: import_zod.z.record(import_zod.z.string(), import_zod.z.any()).optional()
70
70
  });
71
+ var AnalyzerSchema = import_zod.z.object({
72
+ includeRelations: import_zod.z.boolean().default(true),
73
+ validateConstraints: import_zod.z.boolean().default(true),
74
+ includeHeuristicRelations: import_zod.z.boolean().default(false)
75
+ });
71
76
  var ConfigSchema = import_zod.z.object({
72
77
  schema: import_zod.z.string(),
73
78
  outDir: import_zod.z.string().default("src/api"),
74
- analyzer: import_zod.z.object({
75
- includeRelations: import_zod.z.boolean().default(true),
76
- validateConstraints: import_zod.z.boolean().default(true),
77
- includeHeuristicRelations: import_zod.z.boolean().default(false)
78
- }).default({
79
+ analyzer: AnalyzerSchema.default({
79
80
  includeRelations: true,
80
81
  validateConstraints: true,
81
82
  includeHeuristicRelations: false
@@ -85,7 +86,7 @@ var ConfigSchema = import_zod.z.object({
85
86
  async function loadConfig(customPath) {
86
87
  const path = await import("path");
87
88
  const fs = await import("fs/promises");
88
- const candidates = customPath ? [customPath] : ["drzl.config.ts", "drzl.config.mjs", "drzl.config.js"];
89
+ const candidates = customPath ? [customPath] : ["drzl.config.ts", "drzl.config.mjs", "drzl.config.js", "drzl.config.json"];
89
90
  for (const c of candidates) {
90
91
  const p = path.resolve(process.cwd(), c);
91
92
  try {
@@ -97,28 +98,23 @@ async function loadConfig(customPath) {
97
98
  try {
98
99
  const content = await fs.readFile(p, "utf8");
99
100
  const raw = JSON.parse(content);
100
- const parsed = ConfigSchema.parse(raw);
101
- return parsed;
101
+ return ConfigSchema.parse(raw);
102
102
  } catch (e2) {
103
103
  throw new Error(`Failed to load config from ${p}: ${String(e2)}`);
104
104
  }
105
105
  }
106
106
  try {
107
- const { default: jiti } = await import("jiti");
108
- const jit = jiti(import_meta.url);
109
- const mod = jit(p);
107
+ const { createJiti } = await import("jiti");
108
+ const jit = createJiti(import_meta.url);
109
+ const mod = await jit.import(p);
110
110
  const raw = mod && typeof mod === "object" && "default" in mod ? mod.default : mod;
111
- const parsed = ConfigSchema.safeParse(raw);
112
- if (!parsed.success) {
113
- throw new Error(parsed.error.message);
114
- }
115
- return parsed.data;
111
+ return ConfigSchema.parse(raw);
116
112
  } catch (e) {
113
+ console.error(`jiti failed to load ${p}:`, e);
117
114
  try {
118
115
  const content = await fs.readFile(p, "utf8");
119
116
  const raw = JSON.parse(content);
120
- const parsed = ConfigSchema.parse(raw);
121
- return parsed;
117
+ return ConfigSchema.parse(raw);
122
118
  } catch (e2) {
123
119
  throw new Error(`Failed to load config from ${p}: ${String(e2)}`);
124
120
  }
package/dist/cli.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli.ts","../src/config.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport cliProgress from 'cli-progress';\nimport { loadConfig } from './config.js';\nimport { SchemaAnalyzer } from '@drzl/analyzer';\nimport { ORPCGenerator } from '@drzl/generator-orpc';\nimport chokidar from 'chokidar';\n\nconst program = new Command();\nprogram.name('drzl').description('DRZL - Drizzle Developer Toolkit').version('0.0.1');\n\nprogram\n .command('analyze')\n .argument('<schema>', 'path to drizzle schema (TS)')\n .option('--relations', 'include relations', true)\n .option('--validate', 'validate constraints', true)\n .option('--out <file>', 'write analysis JSON to file')\n .option('--json', 'print JSON to stdout (overrides --out)', false)\n .action(async (schema: string, opts: any) => {\n try {\n const analyzer = new SchemaAnalyzer(schema);\n const spinner = !opts.json ? ora('Analyzing schema...').start() : null;\n const start = Date.now();\n const res = await analyzer.analyze({\n includeRelations: !!opts.relations,\n validateConstraints: !!opts.validate,\n });\n const ms = Date.now() - start;\n const json = JSON.stringify(res, null, 2);\n if (opts.json) {\n console.log(json);\n } else if (opts.out) {\n const fs = await import('node:fs/promises');\n await fs.writeFile(opts.out, json, 'utf8');\n spinner?.succeed(chalk.green(`Analysis written to ${opts.out} in ${ms}ms`));\n } else {\n spinner?.succeed(chalk.green(`Analyzed in ${ms}ms`));\n console.log(json);\n }\n process.exit(res.issues.some((i) => i.level === 'error') ? 2 : 0);\n } catch (e: any) {\n const msg = e?.message ?? String(e);\n if (opts.json)\n console.log(JSON.stringify({ event: 'error', code: 'DRZL_CLI_ANALYZE', message: msg }));\n else\n console.error(\n chalk.red('Analyze failed (DRZL_CLI_ANALYZE):'),\n msg,\n '\\nTip: run with --json for structured output.'\n );\n process.exit(1);\n }\n });\n\nprogram\n .command('generate')\n .description('Run configured generators (drzl.config.*)')\n .option('-c, --config <path>', 'path to drzl.config')\n .action(async (opts: any) => {\n try {\n const cfg = await loadConfig(opts.config);\n if (!cfg) {\n console.error(\n chalk.red('No config found (DRZL_CFG_001). Create drzl.config.ts or pass --config.')\n );\n process.exit(2);\n return;\n }\n const analyzer = new SchemaAnalyzer(cfg.schema);\n const spinner = ora('Analyzing...').start();\n const t0 = Date.now();\n const analysis = await analyzer.analyze({\n includeRelations: cfg.analyzer.includeRelations,\n validateConstraints: cfg.analyzer.validateConstraints,\n includeHeuristicRelations: cfg.analyzer.includeHeuristicRelations,\n });\n spinner.succeed(`Analysis complete in ${Date.now() - t0}ms`);\n const progress = new cliProgress.SingleBar(\n { hideCursor: true },\n cliProgress.Presets.shades_classic\n );\n const total = analysis.tables.length || 1;\n progress.start(total, 0);\n for (const g of cfg.generators) {\n if (g.kind === 'orpc') {\n const gen = new ORPCGenerator(analysis);\n const { files } = await gen.generate({\n outputDir: cfg.outDir,\n template: g.template,\n includeRelations: g.includeRelations,\n naming: g.naming,\n outputHeader: g.outputHeader,\n format: g.format,\n templateOptions: g.templateOptions,\n validation: g.validation,\n onProgress: ({ index }) => progress.update(index),\n });\n progress.stop();\n ora().succeed(chalk.green(`Generated (${g.kind}): ${files.length} files`));\n files.forEach((f: string) => console.log(' -', chalk.cyan(f)));\n } else if (g.kind === 'service') {\n try {\n const { ServiceGenerator } = await import('@drzl/generator-service');\n const gen = new ServiceGenerator(analysis);\n const target = g.path ?? 'src/services';\n const files = await gen.generate({\n outDir: target,\n outputHeader: g.outputHeader,\n format: g.format,\n dataAccess: g.dataAccess,\n dbImportPath: g.dbImportPath,\n schemaImportPath: g.schemaImportPath,\n });\n progress.stop();\n ora().succeed(chalk.green(`Generated (service): ${files.length} files`));\n files.forEach((f: string) => console.log(' -', chalk.cyan(f)));\n } catch (e: any) {\n progress.stop();\n console.error(\n chalk.red('Service generator missing.'),\n chalk.yellow('\\nInstall with: npm install @drzl/generator-service')\n );\n console.error(chalk.gray('Error details:'), e?.message ?? e);\n process.exit(1);\n }\n } else if (g.kind === 'zod') {\n try {\n const { ZodGenerator } = await import('@drzl/generator-zod');\n const gen = new ZodGenerator(analysis);\n const target = g.path ?? 'src/validators/zod';\n const files = await gen.generate({\n outDir: target,\n outputHeader: g.outputHeader,\n format: g.format,\n schemaSuffix: g.schemaSuffix,\n fileSuffix: g.fileSuffix,\n });\n progress.stop();\n ora().succeed(chalk.green(`Generated (zod): ${files.length} files`));\n files.forEach((f: string) => console.log(' -', chalk.cyan(f)));\n } catch (e: any) {\n progress.stop();\n console.error(\n chalk.red('Zod generator missing.'),\n chalk.yellow('\\nInstall with: npm install @drzl/generator-zod')\n );\n console.error(chalk.gray('Error details:'), e?.message ?? e);\n process.exit(1);\n }\n } else if (g.kind === 'valibot') {\n try {\n const { ValibotGenerator } = await import('@drzl/generator-valibot');\n const gen = new ValibotGenerator(analysis);\n const target = g.path ?? 'src/validators/valibot';\n const files = await gen.generate({\n outDir: target,\n outputHeader: g.outputHeader,\n format: g.format,\n schemaSuffix: g.schemaSuffix,\n fileSuffix: g.fileSuffix,\n });\n progress.stop();\n ora().succeed(chalk.green(`Generated (valibot): ${files.length} files`));\n files.forEach((f: string) => console.log(' -', chalk.cyan(f)));\n } catch (e: any) {\n progress.stop();\n console.error(\n chalk.red('Valibot generator missing.'),\n chalk.yellow('\\nInstall with: npm install @drzl/generator-valibot')\n );\n console.error(chalk.gray('Error details:'), e?.message ?? e);\n process.exit(1);\n }\n } else if (g.kind === 'arktype') {\n try {\n const { ArkTypeGenerator } = await import('@drzl/generator-arktype');\n const gen = new ArkTypeGenerator(analysis);\n const target = g.path ?? 'src/validators/arktype';\n const files = await gen.generate({\n outDir: target,\n outputHeader: g.outputHeader,\n format: g.format,\n schemaSuffix: g.schemaSuffix,\n fileSuffix: g.fileSuffix,\n });\n progress.stop();\n ora().succeed(chalk.green(`Generated (arktype): ${files.length} files`));\n files.forEach((f: string) => console.log(' -', chalk.cyan(f)));\n } catch (e: any) {\n progress.stop();\n console.error(\n chalk.red('ArkType generator missing.'),\n chalk.yellow('\\nInstall with: npm install @drzl/generator-arktype')\n );\n console.error(chalk.gray('Error details:'), e?.message ?? e);\n process.exit(1);\n }\n }\n }\n } catch (e: any) {\n console.error(\n chalk.red('Generate failed (DRZL_GEN_001):'),\n e?.message ?? e,\n '\\nTip: check your drzl.config.ts and template path.'\n );\n process.exit(1);\n }\n });\n\nprogram\n .command('generate:orpc')\n .argument('<schema>', 'path to drizzle schema (TS)')\n .option('-o, --outDir <dir>', 'output directory', 'src/api')\n .option('--template <name>', 'template name', 'standard')\n .option('--includeRelations', 'include relation endpoints')\n .action(async (schema: string, opts: any) => {\n try {\n const analyzer = new SchemaAnalyzer(schema);\n const analysis = await analyzer.analyze({\n includeRelations: !!opts.includeRelations,\n validateConstraints: true,\n });\n const gen = new ORPCGenerator(analysis);\n const { files } = await gen.generate({\n outputDir: opts.outDir,\n template: opts.template,\n includeRelations: !!opts.includeRelations,\n });\n console.log(chalk.green(`Generated:`), files.map((f) => chalk.cyan(f)).join(', '));\n } catch (e: any) {\n console.error(chalk.red('Generate orpc failed:'), e?.message ?? e);\n process.exit(1);\n }\n });\n\nprogram\n .command('watch')\n .description('Watch schema and regenerate on changes')\n .option('-c, --config <path>', 'path to drzl.config')\n .option('--pipeline <name>', 'all | analyze | generate-orpc', 'all')\n .option('--debounce <ms>', 'debounce ms', '200')\n .option('--json', 'emit JSON logs', false)\n .action(async (opts: any) => {\n const 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 let lastFiles: string[] = [];\n const run = async () => {\n try {\n if (!opts.json) console.clear();\n const analyzer = new SchemaAnalyzer(cfg.schema);\n const analysis = await analyzer.analyze({\n includeRelations: cfg.analyzer.includeRelations,\n validateConstraints: cfg.analyzer.validateConstraints,\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 const newFiles: string[] = [];\n for (const g of cfg.generators) {\n if (g.kind === 'orpc' && (opts.pipeline === 'all' || opts.pipeline === 'generate-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 });\n if (opts.json) {\n console.log(JSON.stringify({ event: 'generate_complete', kind: g.kind, files }));\n } else {\n console.log(\n chalk.green(`Generated (${g.kind}):`),\n files.map((f: string) => chalk.cyan(f)).join(', ')\n );\n }\n newFiles.push(...files);\n }\n }\n // Diff\n const added = newFiles.filter((f) => !lastFiles.includes(f));\n const removed = lastFiles.filter((f) => !newFiles.includes(f));\n if (opts.json) {\n console.log(JSON.stringify({ event: 'diff', added, removed }));\n } else {\n if (added.length) console.log(chalk.blue(`Added: ${added.join(', ')}`));\n if (removed.length) console.log(chalk.yellow(`Removed: ${removed.join(', ')}`));\n }\n lastFiles = newFiles;\n } catch (e: any) {\n if (opts.json)\n console.log(JSON.stringify({ event: 'error', message: String(e?.message ?? e) }));\n else console.error(chalk.red('Watch pipeline failed:'), e?.message ?? e);\n }\n };\n const debounced = Number(opts.debounce) || 200;\n let timer: any = null;\n const trigger = (file?: string) => {\n // Ignore changes in outDir to avoid loops\n if (file && file.startsWith(cfg.outDir)) return;\n clearTimeout(timer);\n timer = setTimeout(run, debounced);\n };\n console.log(chalk.gray('Watching for changes...'));\n const watchSet = new Set<string>([cfg.schema]);\n // Watch template paths (only when path-like and exists)\n for (const g of cfg.generators) {\n if (g.template && g.template !== 'standard' && g.template !== 'minimal') {\n watchSet.add(g.template);\n }\n }\n // Also watch outDir but ignore events from it to report diffs cleanly\n watchSet.add(cfg.outDir);\n chokidar\n .watch(Array.from(watchSet), { ignoreInitial: true })\n .on('add', (p) => trigger(p))\n .on('change', (p) => trigger(p))\n .on('unlink', (p) => trigger(p));\n await run();\n });\n\nprogram\n .command('init')\n .description('Scaffold a drzl.config.ts')\n .option('-y, --yes', 'accept defaults')\n .action(async (_opts: any) => {\n const fs = await import('node:fs/promises');\n const path = await import('node:path');\n const target = path.resolve(process.cwd(), 'drzl.config.ts');\n const template = `export default {\n schema: 'src/db/schema.ts',\n outDir: 'src/api',\n analyzer: { includeRelations: true, validateConstraints: true },\n generators: [\n { kind: 'orpc', template: 'standard', includeRelations: true }\n ]\n} as const\\n`;\n try {\n await fs.writeFile(target, template, { flag: 'wx' });\n console.log(chalk.green(`Created ${target}`));\n } catch (e: any) {\n console.error(chalk.red('Init failed:'), e?.message ?? e);\n process.exit(1);\n }\n });\n\nprogram.parseAsync(process.argv);\n","import { z } from 'zod';\n\nexport const NamingSchema = z\n .object({\n routerSuffix: z.string().default('Router'),\n procedureCase: z.enum(['camel', 'kebab', 'snake']).default('camel'),\n })\n .partial();\n\nexport const GeneratorSchema = z.object({\n kind: z.enum(['orpc', 'service', 'zod', 'valibot', 'arktype']),\n template: z.string().optional(),\n includeRelations: z.boolean().optional(),\n naming: NamingSchema.optional(),\n outputHeader: z\n .object({\n enabled: z.boolean().default(true).optional(),\n text: z.string().optional(),\n })\n .optional(),\n format: z\n .object({\n enabled: z.boolean().default(true).optional(),\n engine: z.enum(['auto', 'prettier', 'biome']).default('auto').optional(),\n configPath: z.string().optional(),\n })\n .optional(),\n // service generator specific options\n path: z.string().optional(),\n dataAccess: z.enum(['stub', 'drizzle']).default('stub').optional(),\n dbImportPath: z.string().optional(),\n schemaImportPath: z.string().optional(),\n // zod generator specific options\n schemaSuffix: z.string().optional(),\n fileSuffix: z.string().optional(),\n // orpc validation sharing\n validation: z\n .object({\n useShared: z.boolean().default(false).optional(),\n library: z.enum(['zod', 'valibot', 'arktype']).default('zod').optional(),\n importPath: z.string().optional(),\n schemaSuffix: z.string().optional(),\n })\n .optional(),\n // template options\n templateOptions: z.record(z.string(), z.any()).optional(),\n});\n\nexport const ConfigSchema = z.object({\n schema: z.string(),\n outDir: z.string().default('src/api'),\n analyzer: z\n .object({\n includeRelations: z.boolean().default(true),\n validateConstraints: z.boolean().default(true),\n includeHeuristicRelations: z.boolean().default(false),\n })\n .default({\n includeRelations: true,\n validateConstraints: true,\n includeHeuristicRelations: false,\n }),\n generators: z\n .array(GeneratorSchema)\n .min(1)\n .default([{ kind: 'orpc' } as any]),\n});\n\nexport type DrzlConfig = z.infer<typeof ConfigSchema>;\n\nexport function defineConfig(cfg: DrzlConfig) {\n return cfg;\n}\n\nexport async function loadConfig(customPath?: string): Promise<DrzlConfig | null> {\n const path = await import('node:path');\n const fs = await import('node:fs/promises');\n\n const candidates = customPath\n ? [customPath]\n : ['drzl.config.ts', 'drzl.config.mjs', 'drzl.config.js'];\n\n for (const c of candidates) {\n const p = path.resolve(process.cwd(), c);\n try {\n await fs.access(p);\n } catch {\n continue;\n }\n // If JSON, parse directly and skip module loading\n if (/\\.json$/i.test(p)) {\n try {\n const content = await fs.readFile(p, 'utf8');\n const raw = JSON.parse(content);\n const parsed = ConfigSchema.parse(raw);\n return parsed;\n } catch (e2) {\n throw new Error(`Failed to load config from ${p}: ${String(e2)}`);\n }\n }\n // Try jiti to seamlessly load TS/ESM/CJS\n try {\n const { default: jiti } = await import('jiti');\n const jit = (jiti as any)(import.meta.url);\n const mod = jit(p);\n const raw = mod && typeof mod === 'object' && 'default' in mod ? (mod as any).default : mod;\n const parsed = ConfigSchema.safeParse(raw);\n if (!parsed.success) {\n throw new Error(parsed.error.message);\n }\n return parsed.data;\n } catch (e) {\n // Fallback: try JSON parse\n try {\n const content = await fs.readFile(p, 'utf8');\n const raw = JSON.parse(content);\n const parsed = ConfigSchema.parse(raw);\n return parsed;\n } catch (e2) {\n throw new Error(`Failed to load config from ${p}: ${String(e2)}`);\n }\n }\n }\n return null;\n}\n"],"mappings":"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","names":["ora","chalk","cliProgress","chokidar"]}
1
+ {"version":3,"sources":["../src/cli.ts","../src/config.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport cliProgress from 'cli-progress';\nimport { loadConfig } from './config.js';\nimport { SchemaAnalyzer } from '@drzl/analyzer';\nimport { ORPCGenerator } from '@drzl/generator-orpc';\nimport chokidar from 'chokidar';\n\nconst program = new Command();\nprogram.name('drzl').description('DRZL - Drizzle Developer Toolkit').version('0.0.1');\n\nprogram\n .command('analyze')\n .argument('<schema>', 'path to drizzle schema (TS)')\n .option('--relations', 'include relations', true)\n .option('--validate', 'validate constraints', true)\n .option('--out <file>', 'write analysis JSON to file')\n .option('--json', 'print JSON to stdout (overrides --out)', false)\n .action(async (schema: string, opts: any) => {\n try {\n const analyzer = new SchemaAnalyzer(schema);\n const spinner = !opts.json ? ora('Analyzing schema...').start() : null;\n const start = Date.now();\n const res = await analyzer.analyze({\n includeRelations: !!opts.relations,\n validateConstraints: !!opts.validate,\n });\n const ms = Date.now() - start;\n const json = JSON.stringify(res, null, 2);\n if (opts.json) {\n console.log(json);\n } else if (opts.out) {\n const fs = await import('node:fs/promises');\n await fs.writeFile(opts.out, json, 'utf8');\n spinner?.succeed(chalk.green(`Analysis written to ${opts.out} in ${ms}ms`));\n } else {\n spinner?.succeed(chalk.green(`Analyzed in ${ms}ms`));\n console.log(json);\n }\n process.exit(res.issues.some((i) => i.level === 'error') ? 2 : 0);\n } catch (e: any) {\n const msg = e?.message ?? String(e);\n if (opts.json)\n console.log(JSON.stringify({ event: 'error', code: 'DRZL_CLI_ANALYZE', message: msg }));\n else\n console.error(\n chalk.red('Analyze failed (DRZL_CLI_ANALYZE):'),\n msg,\n '\\nTip: run with --json for structured output.'\n );\n process.exit(1);\n }\n });\n\nprogram\n .command('generate')\n .description('Run configured generators (drzl.config.*)')\n .option('-c, --config <path>', 'path to drzl.config')\n .action(async (opts: any) => {\n try {\n const cfg = await loadConfig(opts.config);\n if (!cfg) {\n console.error(\n chalk.red('No config found (DRZL_CFG_001). Create drzl.config.ts or pass --config.')\n );\n process.exit(2);\n return;\n }\n const analyzer = new SchemaAnalyzer(cfg.schema);\n const spinner = ora('Analyzing...').start();\n const t0 = Date.now();\n const analysis = await analyzer.analyze({\n includeRelations: cfg.analyzer.includeRelations,\n validateConstraints: cfg.analyzer.validateConstraints,\n includeHeuristicRelations: cfg.analyzer.includeHeuristicRelations,\n });\n spinner.succeed(`Analysis complete in ${Date.now() - t0}ms`);\n const progress = new cliProgress.SingleBar(\n { hideCursor: true },\n cliProgress.Presets.shades_classic\n );\n const total = analysis.tables.length || 1;\n progress.start(total, 0);\n for (const g of cfg.generators) {\n if (g.kind === 'orpc') {\n const gen = new ORPCGenerator(analysis);\n const { files } = await gen.generate({\n outputDir: cfg.outDir,\n template: g.template,\n includeRelations: g.includeRelations,\n naming: g.naming,\n outputHeader: g.outputHeader,\n format: g.format,\n templateOptions: g.templateOptions,\n validation: g.validation,\n onProgress: ({ index }) => progress.update(index),\n });\n progress.stop();\n ora().succeed(chalk.green(`Generated (${g.kind}): ${files.length} files`));\n files.forEach((f: string) => console.log(' -', chalk.cyan(f)));\n } else if (g.kind === 'service') {\n try {\n const { ServiceGenerator } = await import('@drzl/generator-service');\n const gen = new ServiceGenerator(analysis);\n const target = g.path ?? 'src/services';\n const files = await gen.generate({\n outDir: target,\n outputHeader: g.outputHeader,\n format: g.format,\n dataAccess: g.dataAccess,\n dbImportPath: g.dbImportPath,\n schemaImportPath: g.schemaImportPath,\n });\n progress.stop();\n ora().succeed(chalk.green(`Generated (service): ${files.length} files`));\n files.forEach((f: string) => console.log(' -', chalk.cyan(f)));\n } catch (e: any) {\n progress.stop();\n console.error(\n chalk.red('Service generator missing.'),\n chalk.yellow('\\nInstall with: npm install @drzl/generator-service')\n );\n console.error(chalk.gray('Error details:'), e?.message ?? e);\n process.exit(1);\n }\n } else if (g.kind === 'zod') {\n try {\n const { ZodGenerator } = await import('@drzl/generator-zod');\n const gen = new ZodGenerator(analysis);\n const target = g.path ?? 'src/validators/zod';\n const files = await gen.generate({\n outDir: target,\n outputHeader: g.outputHeader,\n format: g.format,\n schemaSuffix: g.schemaSuffix,\n fileSuffix: g.fileSuffix,\n });\n progress.stop();\n ora().succeed(chalk.green(`Generated (zod): ${files.length} files`));\n files.forEach((f: string) => console.log(' -', chalk.cyan(f)));\n } catch (e: any) {\n progress.stop();\n console.error(\n chalk.red('Zod generator missing.'),\n chalk.yellow('\\nInstall with: npm install @drzl/generator-zod')\n );\n console.error(chalk.gray('Error details:'), e?.message ?? e);\n process.exit(1);\n }\n } else if (g.kind === 'valibot') {\n try {\n const { ValibotGenerator } = await import('@drzl/generator-valibot');\n const gen = new ValibotGenerator(analysis);\n const target = g.path ?? 'src/validators/valibot';\n const files = await gen.generate({\n outDir: target,\n outputHeader: g.outputHeader,\n format: g.format,\n schemaSuffix: g.schemaSuffix,\n fileSuffix: g.fileSuffix,\n });\n progress.stop();\n ora().succeed(chalk.green(`Generated (valibot): ${files.length} files`));\n files.forEach((f: string) => console.log(' -', chalk.cyan(f)));\n } catch (e: any) {\n progress.stop();\n console.error(\n chalk.red('Valibot generator missing.'),\n chalk.yellow('\\nInstall with: npm install @drzl/generator-valibot')\n );\n console.error(chalk.gray('Error details:'), e?.message ?? e);\n process.exit(1);\n }\n } else if (g.kind === 'arktype') {\n try {\n const { ArkTypeGenerator } = await import('@drzl/generator-arktype');\n const gen = new ArkTypeGenerator(analysis);\n const target = g.path ?? 'src/validators/arktype';\n const files = await gen.generate({\n outDir: target,\n outputHeader: g.outputHeader,\n format: g.format,\n schemaSuffix: g.schemaSuffix,\n fileSuffix: g.fileSuffix,\n });\n progress.stop();\n ora().succeed(chalk.green(`Generated (arktype): ${files.length} files`));\n files.forEach((f: string) => console.log(' -', chalk.cyan(f)));\n } catch (e: any) {\n progress.stop();\n console.error(\n chalk.red('ArkType generator missing.'),\n chalk.yellow('\\nInstall with: npm install @drzl/generator-arktype')\n );\n console.error(chalk.gray('Error details:'), e?.message ?? e);\n process.exit(1);\n }\n }\n }\n } catch (e: any) {\n console.error(\n chalk.red('Generate failed (DRZL_GEN_001):'),\n e?.message ?? e,\n '\\nTip: check your drzl.config.ts and template path.'\n );\n process.exit(1);\n }\n });\n\nprogram\n .command('generate:orpc')\n .argument('<schema>', 'path to drizzle schema (TS)')\n .option('-o, --outDir <dir>', 'output directory', 'src/api')\n .option('--template <name>', 'template name', 'standard')\n .option('--includeRelations', 'include relation endpoints')\n .action(async (schema: string, opts: any) => {\n try {\n const analyzer = new SchemaAnalyzer(schema);\n const analysis = await analyzer.analyze({\n includeRelations: !!opts.includeRelations,\n validateConstraints: true,\n });\n const gen = new ORPCGenerator(analysis);\n const { files } = await gen.generate({\n outputDir: opts.outDir,\n template: opts.template,\n includeRelations: !!opts.includeRelations,\n });\n console.log(chalk.green(`Generated:`), files.map((f) => chalk.cyan(f)).join(', '));\n } catch (e: any) {\n console.error(chalk.red('Generate orpc failed:'), e?.message ?? e);\n process.exit(1);\n }\n });\n\nprogram\n .command('watch')\n .description('Watch schema and regenerate on changes')\n .option('-c, --config <path>', 'path to drzl.config')\n .option('--pipeline <name>', 'all | analyze | generate-orpc', 'all')\n .option('--debounce <ms>', 'debounce ms', '200')\n .option('--json', 'emit JSON logs', false)\n .action(async (opts: any) => {\n const 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 let lastFiles: string[] = [];\n const run = async () => {\n try {\n if (!opts.json) console.clear();\n const analyzer = new SchemaAnalyzer(cfg.schema);\n const analysis = await analyzer.analyze({\n includeRelations: cfg.analyzer.includeRelations,\n validateConstraints: cfg.analyzer.validateConstraints,\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 const newFiles: string[] = [];\n for (const g of cfg.generators) {\n if (g.kind === 'orpc' && (opts.pipeline === 'all' || opts.pipeline === 'generate-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 });\n if (opts.json) {\n console.log(JSON.stringify({ event: 'generate_complete', kind: g.kind, files }));\n } else {\n console.log(\n chalk.green(`Generated (${g.kind}):`),\n files.map((f: string) => chalk.cyan(f)).join(', ')\n );\n }\n newFiles.push(...files);\n }\n }\n // Diff\n const added = newFiles.filter((f) => !lastFiles.includes(f));\n const removed = lastFiles.filter((f) => !newFiles.includes(f));\n if (opts.json) {\n console.log(JSON.stringify({ event: 'diff', added, removed }));\n } else {\n if (added.length) console.log(chalk.blue(`Added: ${added.join(', ')}`));\n if (removed.length) console.log(chalk.yellow(`Removed: ${removed.join(', ')}`));\n }\n lastFiles = newFiles;\n } catch (e: any) {\n if (opts.json)\n console.log(JSON.stringify({ event: 'error', message: String(e?.message ?? e) }));\n else console.error(chalk.red('Watch pipeline failed:'), e?.message ?? e);\n }\n };\n const debounced = Number(opts.debounce) || 200;\n let timer: any = null;\n const trigger = (file?: string) => {\n // Ignore changes in outDir to avoid loops\n if (file && file.startsWith(cfg.outDir)) return;\n clearTimeout(timer);\n timer = setTimeout(run, debounced);\n };\n console.log(chalk.gray('Watching for changes...'));\n const watchSet = new Set<string>([cfg.schema]);\n // Watch template paths (only when path-like and exists)\n for (const g of cfg.generators) {\n if (g.template && g.template !== 'standard' && g.template !== 'minimal') {\n watchSet.add(g.template);\n }\n }\n // Also watch outDir but ignore events from it to report diffs cleanly\n watchSet.add(cfg.outDir);\n chokidar\n .watch(Array.from(watchSet), { ignoreInitial: true })\n .on('add', (p) => trigger(p))\n .on('change', (p) => trigger(p))\n .on('unlink', (p) => trigger(p));\n await run();\n });\n\nprogram\n .command('init')\n .description('Scaffold a drzl.config.ts')\n .option('-y, --yes', 'accept defaults')\n .action(async (_opts: any) => {\n const fs = await import('node:fs/promises');\n const path = await import('node:path');\n const target = path.resolve(process.cwd(), 'drzl.config.ts');\n const template = `export default {\n schema: 'src/db/schema.ts',\n outDir: 'src/api',\n analyzer: { includeRelations: true, validateConstraints: true },\n generators: [\n { kind: 'orpc', template: 'standard', includeRelations: true }\n ]\n} as const\\n`;\n try {\n await fs.writeFile(target, template, { flag: 'wx' });\n console.log(chalk.green(`Created ${target}`));\n } catch (e: any) {\n console.error(chalk.red('Init failed:'), e?.message ?? e);\n process.exit(1);\n }\n });\n\nprogram.parseAsync(process.argv);\n","import { z } from 'zod';\n\nexport const NamingSchema = z\n .object({\n routerSuffix: z.string().default('Router'),\n procedureCase: z.enum(['camel', 'kebab', 'snake']).default('camel'),\n })\n .partial();\n\nexport const GeneratorSchema = z.object({\n kind: z.enum(['orpc', 'service', 'zod', 'valibot', 'arktype']),\n template: z.string().optional(),\n includeRelations: z.boolean().optional(),\n naming: NamingSchema.optional(),\n outputHeader: z\n .object({\n enabled: z.boolean().default(true).optional(),\n text: z.string().optional(),\n })\n .optional(),\n format: z\n .object({\n enabled: z.boolean().default(true).optional(),\n engine: z.enum(['auto', 'prettier', 'biome']).default('auto').optional(),\n configPath: z.string().optional(),\n })\n .optional(),\n // service generator specific options\n path: z.string().optional(),\n dataAccess: z.enum(['stub', 'drizzle']).default('stub').optional(),\n dbImportPath: z.string().optional(),\n schemaImportPath: z.string().optional(),\n // zod generator specific options\n schemaSuffix: z.string().optional(),\n fileSuffix: z.string().optional(),\n // orpc validation sharing\n validation: z\n .object({\n useShared: z.boolean().default(false).optional(),\n library: z.enum(['zod', 'valibot', 'arktype']).default('zod').optional(),\n importPath: z.string().optional(),\n schemaSuffix: z.string().optional(),\n })\n .optional(),\n // template options\n templateOptions: z.record(z.string(), z.any()).optional(),\n});\n\nexport const AnalyzerSchema = z.object({\n includeRelations: z.boolean().default(true),\n validateConstraints: z.boolean().default(true),\n includeHeuristicRelations: z.boolean().default(false),\n});\n\nexport const ConfigSchema = z.object({\n schema: z.string(),\n outDir: z.string().default('src/api'),\n analyzer: AnalyzerSchema.default({\n includeRelations: true,\n validateConstraints: true,\n includeHeuristicRelations: false,\n }),\n generators: z\n .array(GeneratorSchema)\n .min(1)\n .default([{ kind: 'orpc' } as any]),\n});\n\n// ✨ Separate input vs output types\nexport type DrzlConfigInput = z.input<typeof ConfigSchema>;\nexport type DrzlConfig = z.output<typeof ConfigSchema>;\n\nexport function defineConfig<T extends DrzlConfigInput>(cfg: T): T {\n return cfg;\n}\n\nexport async function loadConfig(customPath?: string): Promise<DrzlConfig | null> {\n const path = await import('node:path');\n const fs = await import('node:fs/promises');\n\n const candidates = customPath\n ? [customPath]\n : ['drzl.config.ts', 'drzl.config.mjs', 'drzl.config.js', 'drzl.config.json'];\n\n for (const c of candidates) {\n const p = path.resolve(process.cwd(), c);\n try {\n await fs.access(p);\n } catch {\n continue;\n }\n\n // JSON path — parse directly\n if (/\\.json$/i.test(p)) {\n try {\n const content = await fs.readFile(p, 'utf8');\n const raw = JSON.parse(content);\n return ConfigSchema.parse(raw); // -> DrzlConfig (output)\n } catch (e2) {\n throw new Error(`Failed to load config from ${p}: ${String(e2)}`);\n }\n }\n\n // TS/ESM/CJS via jiti\n try {\n const { createJiti } = await import('jiti');\n const jit = createJiti(import.meta.url);\n const mod = await jit.import(p);\n const raw = mod && typeof mod === 'object' && 'default' in mod ? mod.default : mod;\n return ConfigSchema.parse(raw); // parse to resolved output\n } catch (e) {\n console.error(`jiti failed to load ${p}:`, e);\n // Fallback: try JSON parse\n try {\n const content = await fs.readFile(p, 'utf8');\n const raw = JSON.parse(content);\n return ConfigSchema.parse(raw);\n } catch (e2) {\n throw new Error(`Failed to load config from ${p}: ${String(e2)}`);\n }\n }\n }\n return null;\n}\n"],"mappings":"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","names":["ora","chalk","cliProgress","chokidar"]}
package/dist/cli.d.cts ADDED
@@ -0,0 +1 @@
1
+ #!/usr/bin/env node
package/dist/cli.d.ts ADDED
@@ -0,0 +1 @@
1
+ #!/usr/bin/env node
package/dist/cli.js CHANGED
@@ -1,109 +1,13 @@
1
1
  #!/usr/bin/env node
2
+ import {
3
+ loadConfig
4
+ } from "./chunk-AWFAECUZ.js";
2
5
 
3
6
  // src/cli.ts
4
7
  import { Command } from "commander";
5
8
  import chalk from "chalk";
6
9
  import ora from "ora";
7
10
  import cliProgress from "cli-progress";
8
-
9
- // src/config.ts
10
- import { z } from "zod";
11
- var NamingSchema = z.object({
12
- routerSuffix: z.string().default("Router"),
13
- procedureCase: z.enum(["camel", "kebab", "snake"]).default("camel")
14
- }).partial();
15
- var GeneratorSchema = z.object({
16
- kind: z.enum(["orpc", "service", "zod", "valibot", "arktype"]),
17
- template: z.string().optional(),
18
- includeRelations: z.boolean().optional(),
19
- naming: NamingSchema.optional(),
20
- outputHeader: z.object({
21
- enabled: z.boolean().default(true).optional(),
22
- text: z.string().optional()
23
- }).optional(),
24
- format: z.object({
25
- enabled: z.boolean().default(true).optional(),
26
- engine: z.enum(["auto", "prettier", "biome"]).default("auto").optional(),
27
- configPath: z.string().optional()
28
- }).optional(),
29
- // service generator specific options
30
- path: z.string().optional(),
31
- dataAccess: z.enum(["stub", "drizzle"]).default("stub").optional(),
32
- dbImportPath: z.string().optional(),
33
- schemaImportPath: z.string().optional(),
34
- // zod generator specific options
35
- schemaSuffix: z.string().optional(),
36
- fileSuffix: z.string().optional(),
37
- // orpc validation sharing
38
- validation: z.object({
39
- useShared: z.boolean().default(false).optional(),
40
- library: z.enum(["zod", "valibot", "arktype"]).default("zod").optional(),
41
- importPath: z.string().optional(),
42
- schemaSuffix: z.string().optional()
43
- }).optional(),
44
- // template options
45
- templateOptions: z.record(z.string(), z.any()).optional()
46
- });
47
- var ConfigSchema = z.object({
48
- schema: z.string(),
49
- outDir: z.string().default("src/api"),
50
- analyzer: z.object({
51
- includeRelations: z.boolean().default(true),
52
- validateConstraints: z.boolean().default(true),
53
- includeHeuristicRelations: z.boolean().default(false)
54
- }).default({
55
- includeRelations: true,
56
- validateConstraints: true,
57
- includeHeuristicRelations: false
58
- }),
59
- generators: z.array(GeneratorSchema).min(1).default([{ kind: "orpc" }])
60
- });
61
- async function loadConfig(customPath) {
62
- const path = await import("path");
63
- const fs = await import("fs/promises");
64
- const candidates = customPath ? [customPath] : ["drzl.config.ts", "drzl.config.mjs", "drzl.config.js"];
65
- for (const c of candidates) {
66
- const p = path.resolve(process.cwd(), c);
67
- try {
68
- await fs.access(p);
69
- } catch {
70
- continue;
71
- }
72
- if (/\.json$/i.test(p)) {
73
- try {
74
- const content = await fs.readFile(p, "utf8");
75
- const raw = JSON.parse(content);
76
- const parsed = ConfigSchema.parse(raw);
77
- return parsed;
78
- } catch (e2) {
79
- throw new Error(`Failed to load config from ${p}: ${String(e2)}`);
80
- }
81
- }
82
- try {
83
- const { default: jiti } = await import("jiti");
84
- const jit = jiti(import.meta.url);
85
- const mod = jit(p);
86
- const raw = mod && typeof mod === "object" && "default" in mod ? mod.default : mod;
87
- const parsed = ConfigSchema.safeParse(raw);
88
- if (!parsed.success) {
89
- throw new Error(parsed.error.message);
90
- }
91
- return parsed.data;
92
- } catch (e) {
93
- try {
94
- const content = await fs.readFile(p, "utf8");
95
- const raw = JSON.parse(content);
96
- const parsed = ConfigSchema.parse(raw);
97
- return parsed;
98
- } catch (e2) {
99
- throw new Error(`Failed to load config from ${p}: ${String(e2)}`);
100
- }
101
- }
102
- }
103
- return null;
104
- }
105
-
106
- // src/cli.ts
107
11
  import { SchemaAnalyzer } from "@drzl/analyzer";
108
12
  import { ORPCGenerator } from "@drzl/generator-orpc";
109
13
  import chokidar from "chokidar";
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli.ts","../src/config.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport cliProgress from 'cli-progress';\nimport { loadConfig } from './config.js';\nimport { SchemaAnalyzer } from '@drzl/analyzer';\nimport { ORPCGenerator } from '@drzl/generator-orpc';\nimport chokidar from 'chokidar';\n\nconst program = new Command();\nprogram.name('drzl').description('DRZL - Drizzle Developer Toolkit').version('0.0.1');\n\nprogram\n .command('analyze')\n .argument('<schema>', 'path to drizzle schema (TS)')\n .option('--relations', 'include relations', true)\n .option('--validate', 'validate constraints', true)\n .option('--out <file>', 'write analysis JSON to file')\n .option('--json', 'print JSON to stdout (overrides --out)', false)\n .action(async (schema: string, opts: any) => {\n try {\n const analyzer = new SchemaAnalyzer(schema);\n const spinner = !opts.json ? ora('Analyzing schema...').start() : null;\n const start = Date.now();\n const res = await analyzer.analyze({\n includeRelations: !!opts.relations,\n validateConstraints: !!opts.validate,\n });\n const ms = Date.now() - start;\n const json = JSON.stringify(res, null, 2);\n if (opts.json) {\n console.log(json);\n } else if (opts.out) {\n const fs = await import('node:fs/promises');\n await fs.writeFile(opts.out, json, 'utf8');\n spinner?.succeed(chalk.green(`Analysis written to ${opts.out} in ${ms}ms`));\n } else {\n spinner?.succeed(chalk.green(`Analyzed in ${ms}ms`));\n console.log(json);\n }\n process.exit(res.issues.some((i) => i.level === 'error') ? 2 : 0);\n } catch (e: any) {\n const msg = e?.message ?? String(e);\n if (opts.json)\n console.log(JSON.stringify({ event: 'error', code: 'DRZL_CLI_ANALYZE', message: msg }));\n else\n console.error(\n chalk.red('Analyze failed (DRZL_CLI_ANALYZE):'),\n msg,\n '\\nTip: run with --json for structured output.'\n );\n process.exit(1);\n }\n });\n\nprogram\n .command('generate')\n .description('Run configured generators (drzl.config.*)')\n .option('-c, --config <path>', 'path to drzl.config')\n .action(async (opts: any) => {\n try {\n const cfg = await loadConfig(opts.config);\n if (!cfg) {\n console.error(\n chalk.red('No config found (DRZL_CFG_001). Create drzl.config.ts or pass --config.')\n );\n process.exit(2);\n return;\n }\n const analyzer = new SchemaAnalyzer(cfg.schema);\n const spinner = ora('Analyzing...').start();\n const t0 = Date.now();\n const analysis = await analyzer.analyze({\n includeRelations: cfg.analyzer.includeRelations,\n validateConstraints: cfg.analyzer.validateConstraints,\n includeHeuristicRelations: cfg.analyzer.includeHeuristicRelations,\n });\n spinner.succeed(`Analysis complete in ${Date.now() - t0}ms`);\n const progress = new cliProgress.SingleBar(\n { hideCursor: true },\n cliProgress.Presets.shades_classic\n );\n const total = analysis.tables.length || 1;\n progress.start(total, 0);\n for (const g of cfg.generators) {\n if (g.kind === 'orpc') {\n const gen = new ORPCGenerator(analysis);\n const { files } = await gen.generate({\n outputDir: cfg.outDir,\n template: g.template,\n includeRelations: g.includeRelations,\n naming: g.naming,\n outputHeader: g.outputHeader,\n format: g.format,\n templateOptions: g.templateOptions,\n validation: g.validation,\n onProgress: ({ index }) => progress.update(index),\n });\n progress.stop();\n ora().succeed(chalk.green(`Generated (${g.kind}): ${files.length} files`));\n files.forEach((f: string) => console.log(' -', chalk.cyan(f)));\n } else if (g.kind === 'service') {\n try {\n const { ServiceGenerator } = await import('@drzl/generator-service');\n const gen = new ServiceGenerator(analysis);\n const target = g.path ?? 'src/services';\n const files = await gen.generate({\n outDir: target,\n outputHeader: g.outputHeader,\n format: g.format,\n dataAccess: g.dataAccess,\n dbImportPath: g.dbImportPath,\n schemaImportPath: g.schemaImportPath,\n });\n progress.stop();\n ora().succeed(chalk.green(`Generated (service): ${files.length} files`));\n files.forEach((f: string) => console.log(' -', chalk.cyan(f)));\n } catch (e: any) {\n progress.stop();\n console.error(\n chalk.red('Service generator missing.'),\n chalk.yellow('\\nInstall with: npm install @drzl/generator-service')\n );\n console.error(chalk.gray('Error details:'), e?.message ?? e);\n process.exit(1);\n }\n } else if (g.kind === 'zod') {\n try {\n const { ZodGenerator } = await import('@drzl/generator-zod');\n const gen = new ZodGenerator(analysis);\n const target = g.path ?? 'src/validators/zod';\n const files = await gen.generate({\n outDir: target,\n outputHeader: g.outputHeader,\n format: g.format,\n schemaSuffix: g.schemaSuffix,\n fileSuffix: g.fileSuffix,\n });\n progress.stop();\n ora().succeed(chalk.green(`Generated (zod): ${files.length} files`));\n files.forEach((f: string) => console.log(' -', chalk.cyan(f)));\n } catch (e: any) {\n progress.stop();\n console.error(\n chalk.red('Zod generator missing.'),\n chalk.yellow('\\nInstall with: npm install @drzl/generator-zod')\n );\n console.error(chalk.gray('Error details:'), e?.message ?? e);\n process.exit(1);\n }\n } else if (g.kind === 'valibot') {\n try {\n const { ValibotGenerator } = await import('@drzl/generator-valibot');\n const gen = new ValibotGenerator(analysis);\n const target = g.path ?? 'src/validators/valibot';\n const files = await gen.generate({\n outDir: target,\n outputHeader: g.outputHeader,\n format: g.format,\n schemaSuffix: g.schemaSuffix,\n fileSuffix: g.fileSuffix,\n });\n progress.stop();\n ora().succeed(chalk.green(`Generated (valibot): ${files.length} files`));\n files.forEach((f: string) => console.log(' -', chalk.cyan(f)));\n } catch (e: any) {\n progress.stop();\n console.error(\n chalk.red('Valibot generator missing.'),\n chalk.yellow('\\nInstall with: npm install @drzl/generator-valibot')\n );\n console.error(chalk.gray('Error details:'), e?.message ?? e);\n process.exit(1);\n }\n } else if (g.kind === 'arktype') {\n try {\n const { ArkTypeGenerator } = await import('@drzl/generator-arktype');\n const gen = new ArkTypeGenerator(analysis);\n const target = g.path ?? 'src/validators/arktype';\n const files = await gen.generate({\n outDir: target,\n outputHeader: g.outputHeader,\n format: g.format,\n schemaSuffix: g.schemaSuffix,\n fileSuffix: g.fileSuffix,\n });\n progress.stop();\n ora().succeed(chalk.green(`Generated (arktype): ${files.length} files`));\n files.forEach((f: string) => console.log(' -', chalk.cyan(f)));\n } catch (e: any) {\n progress.stop();\n console.error(\n chalk.red('ArkType generator missing.'),\n chalk.yellow('\\nInstall with: npm install @drzl/generator-arktype')\n );\n console.error(chalk.gray('Error details:'), e?.message ?? e);\n process.exit(1);\n }\n }\n }\n } catch (e: any) {\n console.error(\n chalk.red('Generate failed (DRZL_GEN_001):'),\n e?.message ?? e,\n '\\nTip: check your drzl.config.ts and template path.'\n );\n process.exit(1);\n }\n });\n\nprogram\n .command('generate:orpc')\n .argument('<schema>', 'path to drizzle schema (TS)')\n .option('-o, --outDir <dir>', 'output directory', 'src/api')\n .option('--template <name>', 'template name', 'standard')\n .option('--includeRelations', 'include relation endpoints')\n .action(async (schema: string, opts: any) => {\n try {\n const analyzer = new SchemaAnalyzer(schema);\n const analysis = await analyzer.analyze({\n includeRelations: !!opts.includeRelations,\n validateConstraints: true,\n });\n const gen = new ORPCGenerator(analysis);\n const { files } = await gen.generate({\n outputDir: opts.outDir,\n template: opts.template,\n includeRelations: !!opts.includeRelations,\n });\n console.log(chalk.green(`Generated:`), files.map((f) => chalk.cyan(f)).join(', '));\n } catch (e: any) {\n console.error(chalk.red('Generate orpc failed:'), e?.message ?? e);\n process.exit(1);\n }\n });\n\nprogram\n .command('watch')\n .description('Watch schema and regenerate on changes')\n .option('-c, --config <path>', 'path to drzl.config')\n .option('--pipeline <name>', 'all | analyze | generate-orpc', 'all')\n .option('--debounce <ms>', 'debounce ms', '200')\n .option('--json', 'emit JSON logs', false)\n .action(async (opts: any) => {\n const 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 let lastFiles: string[] = [];\n const run = async () => {\n try {\n if (!opts.json) console.clear();\n const analyzer = new SchemaAnalyzer(cfg.schema);\n const analysis = await analyzer.analyze({\n includeRelations: cfg.analyzer.includeRelations,\n validateConstraints: cfg.analyzer.validateConstraints,\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 const newFiles: string[] = [];\n for (const g of cfg.generators) {\n if (g.kind === 'orpc' && (opts.pipeline === 'all' || opts.pipeline === 'generate-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 });\n if (opts.json) {\n console.log(JSON.stringify({ event: 'generate_complete', kind: g.kind, files }));\n } else {\n console.log(\n chalk.green(`Generated (${g.kind}):`),\n files.map((f: string) => chalk.cyan(f)).join(', ')\n );\n }\n newFiles.push(...files);\n }\n }\n // Diff\n const added = newFiles.filter((f) => !lastFiles.includes(f));\n const removed = lastFiles.filter((f) => !newFiles.includes(f));\n if (opts.json) {\n console.log(JSON.stringify({ event: 'diff', added, removed }));\n } else {\n if (added.length) console.log(chalk.blue(`Added: ${added.join(', ')}`));\n if (removed.length) console.log(chalk.yellow(`Removed: ${removed.join(', ')}`));\n }\n lastFiles = newFiles;\n } catch (e: any) {\n if (opts.json)\n console.log(JSON.stringify({ event: 'error', message: String(e?.message ?? e) }));\n else console.error(chalk.red('Watch pipeline failed:'), e?.message ?? e);\n }\n };\n const debounced = Number(opts.debounce) || 200;\n let timer: any = null;\n const trigger = (file?: string) => {\n // Ignore changes in outDir to avoid loops\n if (file && file.startsWith(cfg.outDir)) return;\n clearTimeout(timer);\n timer = setTimeout(run, debounced);\n };\n console.log(chalk.gray('Watching for changes...'));\n const watchSet = new Set<string>([cfg.schema]);\n // Watch template paths (only when path-like and exists)\n for (const g of cfg.generators) {\n if (g.template && g.template !== 'standard' && g.template !== 'minimal') {\n watchSet.add(g.template);\n }\n }\n // Also watch outDir but ignore events from it to report diffs cleanly\n watchSet.add(cfg.outDir);\n chokidar\n .watch(Array.from(watchSet), { ignoreInitial: true })\n .on('add', (p) => trigger(p))\n .on('change', (p) => trigger(p))\n .on('unlink', (p) => trigger(p));\n await run();\n });\n\nprogram\n .command('init')\n .description('Scaffold a drzl.config.ts')\n .option('-y, --yes', 'accept defaults')\n .action(async (_opts: any) => {\n const fs = await import('node:fs/promises');\n const path = await import('node:path');\n const target = path.resolve(process.cwd(), 'drzl.config.ts');\n const template = `export default {\n schema: 'src/db/schema.ts',\n outDir: 'src/api',\n analyzer: { includeRelations: true, validateConstraints: true },\n generators: [\n { kind: 'orpc', template: 'standard', includeRelations: true }\n ]\n} as const\\n`;\n try {\n await fs.writeFile(target, template, { flag: 'wx' });\n console.log(chalk.green(`Created ${target}`));\n } catch (e: any) {\n console.error(chalk.red('Init failed:'), e?.message ?? e);\n process.exit(1);\n }\n });\n\nprogram.parseAsync(process.argv);\n","import { z } from 'zod';\n\nexport const NamingSchema = z\n .object({\n routerSuffix: z.string().default('Router'),\n procedureCase: z.enum(['camel', 'kebab', 'snake']).default('camel'),\n })\n .partial();\n\nexport const GeneratorSchema = z.object({\n kind: z.enum(['orpc', 'service', 'zod', 'valibot', 'arktype']),\n template: z.string().optional(),\n includeRelations: z.boolean().optional(),\n naming: NamingSchema.optional(),\n outputHeader: z\n .object({\n enabled: z.boolean().default(true).optional(),\n text: z.string().optional(),\n })\n .optional(),\n format: z\n .object({\n enabled: z.boolean().default(true).optional(),\n engine: z.enum(['auto', 'prettier', 'biome']).default('auto').optional(),\n configPath: z.string().optional(),\n })\n .optional(),\n // service generator specific options\n path: z.string().optional(),\n dataAccess: z.enum(['stub', 'drizzle']).default('stub').optional(),\n dbImportPath: z.string().optional(),\n schemaImportPath: z.string().optional(),\n // zod generator specific options\n schemaSuffix: z.string().optional(),\n fileSuffix: z.string().optional(),\n // orpc validation sharing\n validation: z\n .object({\n useShared: z.boolean().default(false).optional(),\n library: z.enum(['zod', 'valibot', 'arktype']).default('zod').optional(),\n importPath: z.string().optional(),\n schemaSuffix: z.string().optional(),\n })\n .optional(),\n // template options\n templateOptions: z.record(z.string(), z.any()).optional(),\n});\n\nexport const ConfigSchema = z.object({\n schema: z.string(),\n outDir: z.string().default('src/api'),\n analyzer: z\n .object({\n includeRelations: z.boolean().default(true),\n validateConstraints: z.boolean().default(true),\n includeHeuristicRelations: z.boolean().default(false),\n })\n .default({\n includeRelations: true,\n validateConstraints: true,\n includeHeuristicRelations: false,\n }),\n generators: z\n .array(GeneratorSchema)\n .min(1)\n .default([{ kind: 'orpc' } as any]),\n});\n\nexport type DrzlConfig = z.infer<typeof ConfigSchema>;\n\nexport function defineConfig(cfg: DrzlConfig) {\n return cfg;\n}\n\nexport async function loadConfig(customPath?: string): Promise<DrzlConfig | null> {\n const path = await import('node:path');\n const fs = await import('node:fs/promises');\n\n const candidates = customPath\n ? [customPath]\n : ['drzl.config.ts', 'drzl.config.mjs', 'drzl.config.js'];\n\n for (const c of candidates) {\n const p = path.resolve(process.cwd(), c);\n try {\n await fs.access(p);\n } catch {\n continue;\n }\n // If JSON, parse directly and skip module loading\n if (/\\.json$/i.test(p)) {\n try {\n const content = await fs.readFile(p, 'utf8');\n const raw = JSON.parse(content);\n const parsed = ConfigSchema.parse(raw);\n return parsed;\n } catch (e2) {\n throw new Error(`Failed to load config from ${p}: ${String(e2)}`);\n }\n }\n // Try jiti to seamlessly load TS/ESM/CJS\n try {\n const { default: jiti } = await import('jiti');\n const jit = (jiti as any)(import.meta.url);\n const mod = jit(p);\n const raw = mod && typeof mod === 'object' && 'default' in mod ? (mod as any).default : mod;\n const parsed = ConfigSchema.safeParse(raw);\n if (!parsed.success) {\n throw new Error(parsed.error.message);\n }\n return parsed.data;\n } catch (e) {\n // Fallback: try JSON parse\n try {\n const content = await fs.readFile(p, 'utf8');\n const raw = JSON.parse(content);\n const parsed = ConfigSchema.parse(raw);\n return parsed;\n } catch (e2) {\n throw new Error(`Failed to load config from ${p}: ${String(e2)}`);\n }\n }\n }\n return null;\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport cliProgress from 'cli-progress';\nimport { loadConfig } from './config.js';\nimport { SchemaAnalyzer } from '@drzl/analyzer';\nimport { ORPCGenerator } from '@drzl/generator-orpc';\nimport chokidar from 'chokidar';\n\nconst program = new Command();\nprogram.name('drzl').description('DRZL - Drizzle Developer Toolkit').version('0.0.1');\n\nprogram\n .command('analyze')\n .argument('<schema>', 'path to drizzle schema (TS)')\n .option('--relations', 'include relations', true)\n .option('--validate', 'validate constraints', true)\n .option('--out <file>', 'write analysis JSON to file')\n .option('--json', 'print JSON to stdout (overrides --out)', false)\n .action(async (schema: string, opts: any) => {\n try {\n const analyzer = new SchemaAnalyzer(schema);\n const spinner = !opts.json ? ora('Analyzing schema...').start() : null;\n const start = Date.now();\n const res = await analyzer.analyze({\n includeRelations: !!opts.relations,\n validateConstraints: !!opts.validate,\n });\n const ms = Date.now() - start;\n const json = JSON.stringify(res, null, 2);\n if (opts.json) {\n console.log(json);\n } else if (opts.out) {\n const fs = await import('node:fs/promises');\n await fs.writeFile(opts.out, json, 'utf8');\n spinner?.succeed(chalk.green(`Analysis written to ${opts.out} in ${ms}ms`));\n } else {\n spinner?.succeed(chalk.green(`Analyzed in ${ms}ms`));\n console.log(json);\n }\n process.exit(res.issues.some((i) => i.level === 'error') ? 2 : 0);\n } catch (e: any) {\n const msg = e?.message ?? String(e);\n if (opts.json)\n console.log(JSON.stringify({ event: 'error', code: 'DRZL_CLI_ANALYZE', message: msg }));\n else\n console.error(\n chalk.red('Analyze failed (DRZL_CLI_ANALYZE):'),\n msg,\n '\\nTip: run with --json for structured output.'\n );\n process.exit(1);\n }\n });\n\nprogram\n .command('generate')\n .description('Run configured generators (drzl.config.*)')\n .option('-c, --config <path>', 'path to drzl.config')\n .action(async (opts: any) => {\n try {\n const cfg = await loadConfig(opts.config);\n if (!cfg) {\n console.error(\n chalk.red('No config found (DRZL_CFG_001). Create drzl.config.ts or pass --config.')\n );\n process.exit(2);\n return;\n }\n const analyzer = new SchemaAnalyzer(cfg.schema);\n const spinner = ora('Analyzing...').start();\n const t0 = Date.now();\n const analysis = await analyzer.analyze({\n includeRelations: cfg.analyzer.includeRelations,\n validateConstraints: cfg.analyzer.validateConstraints,\n includeHeuristicRelations: cfg.analyzer.includeHeuristicRelations,\n });\n spinner.succeed(`Analysis complete in ${Date.now() - t0}ms`);\n const progress = new cliProgress.SingleBar(\n { hideCursor: true },\n cliProgress.Presets.shades_classic\n );\n const total = analysis.tables.length || 1;\n progress.start(total, 0);\n for (const g of cfg.generators) {\n if (g.kind === 'orpc') {\n const gen = new ORPCGenerator(analysis);\n const { files } = await gen.generate({\n outputDir: cfg.outDir,\n template: g.template,\n includeRelations: g.includeRelations,\n naming: g.naming,\n outputHeader: g.outputHeader,\n format: g.format,\n templateOptions: g.templateOptions,\n validation: g.validation,\n onProgress: ({ index }) => progress.update(index),\n });\n progress.stop();\n ora().succeed(chalk.green(`Generated (${g.kind}): ${files.length} files`));\n files.forEach((f: string) => console.log(' -', chalk.cyan(f)));\n } else if (g.kind === 'service') {\n try {\n const { ServiceGenerator } = await import('@drzl/generator-service');\n const gen = new ServiceGenerator(analysis);\n const target = g.path ?? 'src/services';\n const files = await gen.generate({\n outDir: target,\n outputHeader: g.outputHeader,\n format: g.format,\n dataAccess: g.dataAccess,\n dbImportPath: g.dbImportPath,\n schemaImportPath: g.schemaImportPath,\n });\n progress.stop();\n ora().succeed(chalk.green(`Generated (service): ${files.length} files`));\n files.forEach((f: string) => console.log(' -', chalk.cyan(f)));\n } catch (e: any) {\n progress.stop();\n console.error(\n chalk.red('Service generator missing.'),\n chalk.yellow('\\nInstall with: npm install @drzl/generator-service')\n );\n console.error(chalk.gray('Error details:'), e?.message ?? e);\n process.exit(1);\n }\n } else if (g.kind === 'zod') {\n try {\n const { ZodGenerator } = await import('@drzl/generator-zod');\n const gen = new ZodGenerator(analysis);\n const target = g.path ?? 'src/validators/zod';\n const files = await gen.generate({\n outDir: target,\n outputHeader: g.outputHeader,\n format: g.format,\n schemaSuffix: g.schemaSuffix,\n fileSuffix: g.fileSuffix,\n });\n progress.stop();\n ora().succeed(chalk.green(`Generated (zod): ${files.length} files`));\n files.forEach((f: string) => console.log(' -', chalk.cyan(f)));\n } catch (e: any) {\n progress.stop();\n console.error(\n chalk.red('Zod generator missing.'),\n chalk.yellow('\\nInstall with: npm install @drzl/generator-zod')\n );\n console.error(chalk.gray('Error details:'), e?.message ?? e);\n process.exit(1);\n }\n } else if (g.kind === 'valibot') {\n try {\n const { ValibotGenerator } = await import('@drzl/generator-valibot');\n const gen = new ValibotGenerator(analysis);\n const target = g.path ?? 'src/validators/valibot';\n const files = await gen.generate({\n outDir: target,\n outputHeader: g.outputHeader,\n format: g.format,\n schemaSuffix: g.schemaSuffix,\n fileSuffix: g.fileSuffix,\n });\n progress.stop();\n ora().succeed(chalk.green(`Generated (valibot): ${files.length} files`));\n files.forEach((f: string) => console.log(' -', chalk.cyan(f)));\n } catch (e: any) {\n progress.stop();\n console.error(\n chalk.red('Valibot generator missing.'),\n chalk.yellow('\\nInstall with: npm install @drzl/generator-valibot')\n );\n console.error(chalk.gray('Error details:'), e?.message ?? e);\n process.exit(1);\n }\n } else if (g.kind === 'arktype') {\n try {\n const { ArkTypeGenerator } = await import('@drzl/generator-arktype');\n const gen = new ArkTypeGenerator(analysis);\n const target = g.path ?? 'src/validators/arktype';\n const files = await gen.generate({\n outDir: target,\n outputHeader: g.outputHeader,\n format: g.format,\n schemaSuffix: g.schemaSuffix,\n fileSuffix: g.fileSuffix,\n });\n progress.stop();\n ora().succeed(chalk.green(`Generated (arktype): ${files.length} files`));\n files.forEach((f: string) => console.log(' -', chalk.cyan(f)));\n } catch (e: any) {\n progress.stop();\n console.error(\n chalk.red('ArkType generator missing.'),\n chalk.yellow('\\nInstall with: npm install @drzl/generator-arktype')\n );\n console.error(chalk.gray('Error details:'), e?.message ?? e);\n process.exit(1);\n }\n }\n }\n } catch (e: any) {\n console.error(\n chalk.red('Generate failed (DRZL_GEN_001):'),\n e?.message ?? e,\n '\\nTip: check your drzl.config.ts and template path.'\n );\n process.exit(1);\n }\n });\n\nprogram\n .command('generate:orpc')\n .argument('<schema>', 'path to drizzle schema (TS)')\n .option('-o, --outDir <dir>', 'output directory', 'src/api')\n .option('--template <name>', 'template name', 'standard')\n .option('--includeRelations', 'include relation endpoints')\n .action(async (schema: string, opts: any) => {\n try {\n const analyzer = new SchemaAnalyzer(schema);\n const analysis = await analyzer.analyze({\n includeRelations: !!opts.includeRelations,\n validateConstraints: true,\n });\n const gen = new ORPCGenerator(analysis);\n const { files } = await gen.generate({\n outputDir: opts.outDir,\n template: opts.template,\n includeRelations: !!opts.includeRelations,\n });\n console.log(chalk.green(`Generated:`), files.map((f) => chalk.cyan(f)).join(', '));\n } catch (e: any) {\n console.error(chalk.red('Generate orpc failed:'), e?.message ?? e);\n process.exit(1);\n }\n });\n\nprogram\n .command('watch')\n .description('Watch schema and regenerate on changes')\n .option('-c, --config <path>', 'path to drzl.config')\n .option('--pipeline <name>', 'all | analyze | generate-orpc', 'all')\n .option('--debounce <ms>', 'debounce ms', '200')\n .option('--json', 'emit JSON logs', false)\n .action(async (opts: any) => {\n const 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 let lastFiles: string[] = [];\n const run = async () => {\n try {\n if (!opts.json) console.clear();\n const analyzer = new SchemaAnalyzer(cfg.schema);\n const analysis = await analyzer.analyze({\n includeRelations: cfg.analyzer.includeRelations,\n validateConstraints: cfg.analyzer.validateConstraints,\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 const newFiles: string[] = [];\n for (const g of cfg.generators) {\n if (g.kind === 'orpc' && (opts.pipeline === 'all' || opts.pipeline === 'generate-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 });\n if (opts.json) {\n console.log(JSON.stringify({ event: 'generate_complete', kind: g.kind, files }));\n } else {\n console.log(\n chalk.green(`Generated (${g.kind}):`),\n files.map((f: string) => chalk.cyan(f)).join(', ')\n );\n }\n newFiles.push(...files);\n }\n }\n // Diff\n const added = newFiles.filter((f) => !lastFiles.includes(f));\n const removed = lastFiles.filter((f) => !newFiles.includes(f));\n if (opts.json) {\n console.log(JSON.stringify({ event: 'diff', added, removed }));\n } else {\n if (added.length) console.log(chalk.blue(`Added: ${added.join(', ')}`));\n if (removed.length) console.log(chalk.yellow(`Removed: ${removed.join(', ')}`));\n }\n lastFiles = newFiles;\n } catch (e: any) {\n if (opts.json)\n console.log(JSON.stringify({ event: 'error', message: String(e?.message ?? e) }));\n else console.error(chalk.red('Watch pipeline failed:'), e?.message ?? e);\n }\n };\n const debounced = Number(opts.debounce) || 200;\n let timer: any = null;\n const trigger = (file?: string) => {\n // Ignore changes in outDir to avoid loops\n if (file && file.startsWith(cfg.outDir)) return;\n clearTimeout(timer);\n timer = setTimeout(run, debounced);\n };\n console.log(chalk.gray('Watching for changes...'));\n const watchSet = new Set<string>([cfg.schema]);\n // Watch template paths (only when path-like and exists)\n for (const g of cfg.generators) {\n if (g.template && g.template !== 'standard' && g.template !== 'minimal') {\n watchSet.add(g.template);\n }\n }\n // Also watch outDir but ignore events from it to report diffs cleanly\n watchSet.add(cfg.outDir);\n chokidar\n .watch(Array.from(watchSet), { ignoreInitial: true })\n .on('add', (p) => trigger(p))\n .on('change', (p) => trigger(p))\n .on('unlink', (p) => trigger(p));\n await run();\n });\n\nprogram\n .command('init')\n .description('Scaffold a drzl.config.ts')\n .option('-y, --yes', 'accept defaults')\n .action(async (_opts: any) => {\n const fs = await import('node:fs/promises');\n const path = await import('node:path');\n const target = path.resolve(process.cwd(), 'drzl.config.ts');\n const template = `export default {\n schema: 'src/db/schema.ts',\n outDir: 'src/api',\n analyzer: { includeRelations: true, validateConstraints: true },\n generators: [\n { kind: 'orpc', template: 'standard', includeRelations: true }\n ]\n} as const\\n`;\n try {\n await fs.writeFile(target, template, { flag: 'wx' });\n console.log(chalk.green(`Created ${target}`));\n } catch (e: any) {\n console.error(chalk.red('Init failed:'), e?.message ?? e);\n process.exit(1);\n }\n });\n\nprogram.parseAsync(process.argv);\n"],"mappings":";;;;;;AACA,SAAS,eAAe;AACxB,OAAO,WAAW;AAClB,OAAO,SAAS;AAChB,OAAO,iBAAiB;AAExB,SAAS,sBAAsB;AAC/B,SAAS,qBAAqB;AAC9B,OAAO,cAAc;AAErB,IAAM,UAAU,IAAI,QAAQ;AAC5B,QAAQ,KAAK,MAAM,EAAE,YAAY,kCAAkC,EAAE,QAAQ,OAAO;AAEpF,QACG,QAAQ,SAAS,EACjB,SAAS,YAAY,6BAA6B,EAClD,OAAO,eAAe,qBAAqB,IAAI,EAC/C,OAAO,cAAc,wBAAwB,IAAI,EACjD,OAAO,gBAAgB,6BAA6B,EACpD,OAAO,UAAU,0CAA0C,KAAK,EAChE,OAAO,OAAO,QAAgB,SAAc;AAC3C,MAAI;AACF,UAAM,WAAW,IAAI,eAAe,MAAM;AAC1C,UAAM,UAAU,CAAC,KAAK,OAAO,IAAI,qBAAqB,EAAE,MAAM,IAAI;AAClE,UAAM,QAAQ,KAAK,IAAI;AACvB,UAAM,MAAM,MAAM,SAAS,QAAQ;AAAA,MACjC,kBAAkB,CAAC,CAAC,KAAK;AAAA,MACzB,qBAAqB,CAAC,CAAC,KAAK;AAAA,IAC9B,CAAC;AACD,UAAM,KAAK,KAAK,IAAI,IAAI;AACxB,UAAM,OAAO,KAAK,UAAU,KAAK,MAAM,CAAC;AACxC,QAAI,KAAK,MAAM;AACb,cAAQ,IAAI,IAAI;AAAA,IAClB,WAAW,KAAK,KAAK;AACnB,YAAM,KAAK,MAAM,OAAO,aAAkB;AAC1C,YAAM,GAAG,UAAU,KAAK,KAAK,MAAM,MAAM;AACzC,eAAS,QAAQ,MAAM,MAAM,uBAAuB,KAAK,GAAG,OAAO,EAAE,IAAI,CAAC;AAAA,IAC5E,OAAO;AACL,eAAS,QAAQ,MAAM,MAAM,eAAe,EAAE,IAAI,CAAC;AACnD,cAAQ,IAAI,IAAI;AAAA,IAClB;AACA,YAAQ,KAAK,IAAI,OAAO,KAAK,CAAC,MAAM,EAAE,UAAU,OAAO,IAAI,IAAI,CAAC;AAAA,EAClE,SAAS,GAAQ;AACf,UAAM,MAAM,GAAG,WAAW,OAAO,CAAC;AAClC,QAAI,KAAK;AACP,cAAQ,IAAI,KAAK,UAAU,EAAE,OAAO,SAAS,MAAM,oBAAoB,SAAS,IAAI,CAAC,CAAC;AAAA;AAEtF,cAAQ;AAAA,QACN,MAAM,IAAI,oCAAoC;AAAA,QAC9C;AAAA,QACA;AAAA,MACF;AACF,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QACG,QAAQ,UAAU,EAClB,YAAY,2CAA2C,EACvD,OAAO,uBAAuB,qBAAqB,EACnD,OAAO,OAAO,SAAc;AAC3B,MAAI;AACF,UAAM,MAAM,MAAM,WAAW,KAAK,MAAM;AACxC,QAAI,CAAC,KAAK;AACR,cAAQ;AAAA,QACN,MAAM,IAAI,yEAAyE;AAAA,MACrF;AACA,cAAQ,KAAK,CAAC;AACd;AAAA,IACF;AACA,UAAM,WAAW,IAAI,eAAe,IAAI,MAAM;AAC9C,UAAM,UAAU,IAAI,cAAc,EAAE,MAAM;AAC1C,UAAM,KAAK,KAAK,IAAI;AACpB,UAAM,WAAW,MAAM,SAAS,QAAQ;AAAA,MACtC,kBAAkB,IAAI,SAAS;AAAA,MAC/B,qBAAqB,IAAI,SAAS;AAAA,MAClC,2BAA2B,IAAI,SAAS;AAAA,IAC1C,CAAC;AACD,YAAQ,QAAQ,wBAAwB,KAAK,IAAI,IAAI,EAAE,IAAI;AAC3D,UAAM,WAAW,IAAI,YAAY;AAAA,MAC/B,EAAE,YAAY,KAAK;AAAA,MACnB,YAAY,QAAQ;AAAA,IACtB;AACA,UAAM,QAAQ,SAAS,OAAO,UAAU;AACxC,aAAS,MAAM,OAAO,CAAC;AACvB,eAAW,KAAK,IAAI,YAAY;AAC9B,UAAI,EAAE,SAAS,QAAQ;AACrB,cAAM,MAAM,IAAI,cAAc,QAAQ;AACtC,cAAM,EAAE,MAAM,IAAI,MAAM,IAAI,SAAS;AAAA,UACnC,WAAW,IAAI;AAAA,UACf,UAAU,EAAE;AAAA,UACZ,kBAAkB,EAAE;AAAA,UACpB,QAAQ,EAAE;AAAA,UACV,cAAc,EAAE;AAAA,UAChB,QAAQ,EAAE;AAAA,UACV,iBAAiB,EAAE;AAAA,UACnB,YAAY,EAAE;AAAA,UACd,YAAY,CAAC,EAAE,MAAM,MAAM,SAAS,OAAO,KAAK;AAAA,QAClD,CAAC;AACD,iBAAS,KAAK;AACd,YAAI,EAAE,QAAQ,MAAM,MAAM,cAAc,EAAE,IAAI,MAAM,MAAM,MAAM,QAAQ,CAAC;AACzE,cAAM,QAAQ,CAAC,MAAc,QAAQ,IAAI,OAAO,MAAM,KAAK,CAAC,CAAC,CAAC;AAAA,MAChE,WAAW,EAAE,SAAS,WAAW;AAC/B,YAAI;AACF,gBAAM,EAAE,iBAAiB,IAAI,MAAM,OAAO,yBAAyB;AACnE,gBAAM,MAAM,IAAI,iBAAiB,QAAQ;AACzC,gBAAM,SAAS,EAAE,QAAQ;AACzB,gBAAM,QAAQ,MAAM,IAAI,SAAS;AAAA,YAC/B,QAAQ;AAAA,YACR,cAAc,EAAE;AAAA,YAChB,QAAQ,EAAE;AAAA,YACV,YAAY,EAAE;AAAA,YACd,cAAc,EAAE;AAAA,YAChB,kBAAkB,EAAE;AAAA,UACtB,CAAC;AACD,mBAAS,KAAK;AACd,cAAI,EAAE,QAAQ,MAAM,MAAM,wBAAwB,MAAM,MAAM,QAAQ,CAAC;AACvE,gBAAM,QAAQ,CAAC,MAAc,QAAQ,IAAI,OAAO,MAAM,KAAK,CAAC,CAAC,CAAC;AAAA,QAChE,SAAS,GAAQ;AACf,mBAAS,KAAK;AACd,kBAAQ;AAAA,YACN,MAAM,IAAI,4BAA4B;AAAA,YACtC,MAAM,OAAO,qDAAqD;AAAA,UACpE;AACA,kBAAQ,MAAM,MAAM,KAAK,gBAAgB,GAAG,GAAG,WAAW,CAAC;AAC3D,kBAAQ,KAAK,CAAC;AAAA,QAChB;AAAA,MACF,WAAW,EAAE,SAAS,OAAO;AAC3B,YAAI;AACF,gBAAM,EAAE,aAAa,IAAI,MAAM,OAAO,qBAAqB;AAC3D,gBAAM,MAAM,IAAI,aAAa,QAAQ;AACrC,gBAAM,SAAS,EAAE,QAAQ;AACzB,gBAAM,QAAQ,MAAM,IAAI,SAAS;AAAA,YAC/B,QAAQ;AAAA,YACR,cAAc,EAAE;AAAA,YAChB,QAAQ,EAAE;AAAA,YACV,cAAc,EAAE;AAAA,YAChB,YAAY,EAAE;AAAA,UAChB,CAAC;AACD,mBAAS,KAAK;AACd,cAAI,EAAE,QAAQ,MAAM,MAAM,oBAAoB,MAAM,MAAM,QAAQ,CAAC;AACnE,gBAAM,QAAQ,CAAC,MAAc,QAAQ,IAAI,OAAO,MAAM,KAAK,CAAC,CAAC,CAAC;AAAA,QAChE,SAAS,GAAQ;AACf,mBAAS,KAAK;AACd,kBAAQ;AAAA,YACN,MAAM,IAAI,wBAAwB;AAAA,YAClC,MAAM,OAAO,iDAAiD;AAAA,UAChE;AACA,kBAAQ,MAAM,MAAM,KAAK,gBAAgB,GAAG,GAAG,WAAW,CAAC;AAC3D,kBAAQ,KAAK,CAAC;AAAA,QAChB;AAAA,MACF,WAAW,EAAE,SAAS,WAAW;AAC/B,YAAI;AACF,gBAAM,EAAE,iBAAiB,IAAI,MAAM,OAAO,yBAAyB;AACnE,gBAAM,MAAM,IAAI,iBAAiB,QAAQ;AACzC,gBAAM,SAAS,EAAE,QAAQ;AACzB,gBAAM,QAAQ,MAAM,IAAI,SAAS;AAAA,YAC/B,QAAQ;AAAA,YACR,cAAc,EAAE;AAAA,YAChB,QAAQ,EAAE;AAAA,YACV,cAAc,EAAE;AAAA,YAChB,YAAY,EAAE;AAAA,UAChB,CAAC;AACD,mBAAS,KAAK;AACd,cAAI,EAAE,QAAQ,MAAM,MAAM,wBAAwB,MAAM,MAAM,QAAQ,CAAC;AACvE,gBAAM,QAAQ,CAAC,MAAc,QAAQ,IAAI,OAAO,MAAM,KAAK,CAAC,CAAC,CAAC;AAAA,QAChE,SAAS,GAAQ;AACf,mBAAS,KAAK;AACd,kBAAQ;AAAA,YACN,MAAM,IAAI,4BAA4B;AAAA,YACtC,MAAM,OAAO,qDAAqD;AAAA,UACpE;AACA,kBAAQ,MAAM,MAAM,KAAK,gBAAgB,GAAG,GAAG,WAAW,CAAC;AAC3D,kBAAQ,KAAK,CAAC;AAAA,QAChB;AAAA,MACF,WAAW,EAAE,SAAS,WAAW;AAC/B,YAAI;AACF,gBAAM,EAAE,iBAAiB,IAAI,MAAM,OAAO,yBAAyB;AACnE,gBAAM,MAAM,IAAI,iBAAiB,QAAQ;AACzC,gBAAM,SAAS,EAAE,QAAQ;AACzB,gBAAM,QAAQ,MAAM,IAAI,SAAS;AAAA,YAC/B,QAAQ;AAAA,YACR,cAAc,EAAE;AAAA,YAChB,QAAQ,EAAE;AAAA,YACV,cAAc,EAAE;AAAA,YAChB,YAAY,EAAE;AAAA,UAChB,CAAC;AACD,mBAAS,KAAK;AACd,cAAI,EAAE,QAAQ,MAAM,MAAM,wBAAwB,MAAM,MAAM,QAAQ,CAAC;AACvE,gBAAM,QAAQ,CAAC,MAAc,QAAQ,IAAI,OAAO,MAAM,KAAK,CAAC,CAAC,CAAC;AAAA,QAChE,SAAS,GAAQ;AACf,mBAAS,KAAK;AACd,kBAAQ;AAAA,YACN,MAAM,IAAI,4BAA4B;AAAA,YACtC,MAAM,OAAO,qDAAqD;AAAA,UACpE;AACA,kBAAQ,MAAM,MAAM,KAAK,gBAAgB,GAAG,GAAG,WAAW,CAAC;AAC3D,kBAAQ,KAAK,CAAC;AAAA,QAChB;AAAA,MACF;AAAA,IACF;AAAA,EACF,SAAS,GAAQ;AACf,YAAQ;AAAA,MACN,MAAM,IAAI,iCAAiC;AAAA,MAC3C,GAAG,WAAW;AAAA,MACd;AAAA,IACF;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QACG,QAAQ,eAAe,EACvB,SAAS,YAAY,6BAA6B,EAClD,OAAO,sBAAsB,oBAAoB,SAAS,EAC1D,OAAO,qBAAqB,iBAAiB,UAAU,EACvD,OAAO,sBAAsB,4BAA4B,EACzD,OAAO,OAAO,QAAgB,SAAc;AAC3C,MAAI;AACF,UAAM,WAAW,IAAI,eAAe,MAAM;AAC1C,UAAM,WAAW,MAAM,SAAS,QAAQ;AAAA,MACtC,kBAAkB,CAAC,CAAC,KAAK;AAAA,MACzB,qBAAqB;AAAA,IACvB,CAAC;AACD,UAAM,MAAM,IAAI,cAAc,QAAQ;AACtC,UAAM,EAAE,MAAM,IAAI,MAAM,IAAI,SAAS;AAAA,MACnC,WAAW,KAAK;AAAA,MAChB,UAAU,KAAK;AAAA,MACf,kBAAkB,CAAC,CAAC,KAAK;AAAA,IAC3B,CAAC;AACD,YAAQ,IAAI,MAAM,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,MAAM,MAAM,KAAK,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC;AAAA,EACnF,SAAS,GAAQ;AACf,YAAQ,MAAM,MAAM,IAAI,uBAAuB,GAAG,GAAG,WAAW,CAAC;AACjE,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QACG,QAAQ,OAAO,EACf,YAAY,wCAAwC,EACpD,OAAO,uBAAuB,qBAAqB,EACnD,OAAO,qBAAqB,iCAAiC,KAAK,EAClE,OAAO,mBAAmB,eAAe,KAAK,EAC9C,OAAO,UAAU,kBAAkB,KAAK,EACxC,OAAO,OAAO,SAAc;AAC3B,QAAM,MAAM,MAAM,WAAW,KAAK,MAAM;AACxC,MAAI,CAAC,KAAK;AACR,YAAQ,MAAM,MAAM,IAAI,0DAA0D,CAAC;AACnF,YAAQ,KAAK,CAAC;AACd;AAAA,EACF;AACA,MAAI,YAAsB,CAAC;AAC3B,QAAM,MAAM,YAAY;AACtB,QAAI;AACF,UAAI,CAAC,KAAK,KAAM,SAAQ,MAAM;AAC9B,YAAM,WAAW,IAAI,eAAe,IAAI,MAAM;AAC9C,YAAM,WAAW,MAAM,SAAS,QAAQ;AAAA,QACtC,kBAAkB,IAAI,SAAS;AAAA,QAC/B,qBAAqB,IAAI,SAAS;AAAA,MACpC,CAAC;AACD,UAAI,KAAK,aAAa,WAAW;AAC/B,YAAI,KAAK,MAAM;AACb,kBAAQ;AAAA,YACN,KAAK,UAAU;AAAA,cACb,OAAO;AAAA,cACP,QAAQ,SAAS;AAAA,cACjB,QAAQ,SAAS,OAAO;AAAA,YAC1B,CAAC;AAAA,UACH;AAAA,QACF,OAAO;AACL,kBAAQ,IAAI,MAAM,MAAM,mBAAmB,CAAC;AAAA,QAC9C;AACA;AAAA,MACF;AACA,YAAM,WAAqB,CAAC;AAC5B,iBAAW,KAAK,IAAI,YAAY;AAC9B,YAAI,EAAE,SAAS,WAAW,KAAK,aAAa,SAAS,KAAK,aAAa,kBAAkB;AACvF,gBAAM,MAAM,IAAI,cAAc,QAAQ;AACtC,gBAAM,EAAE,MAAM,IAAI,MAAM,IAAI,SAAS;AAAA,YACnC,WAAW,IAAI;AAAA,YACf,UAAU,EAAE;AAAA,YACZ,kBAAkB,EAAE;AAAA,YACpB,QAAQ,EAAE;AAAA,UACZ,CAAC;AACD,cAAI,KAAK,MAAM;AACb,oBAAQ,IAAI,KAAK,UAAU,EAAE,OAAO,qBAAqB,MAAM,EAAE,MAAM,MAAM,CAAC,CAAC;AAAA,UACjF,OAAO;AACL,oBAAQ;AAAA,cACN,MAAM,MAAM,cAAc,EAAE,IAAI,IAAI;AAAA,cACpC,MAAM,IAAI,CAAC,MAAc,MAAM,KAAK,CAAC,CAAC,EAAE,KAAK,IAAI;AAAA,YACnD;AAAA,UACF;AACA,mBAAS,KAAK,GAAG,KAAK;AAAA,QACxB;AAAA,MACF;AAEA,YAAM,QAAQ,SAAS,OAAO,CAAC,MAAM,CAAC,UAAU,SAAS,CAAC,CAAC;AAC3D,YAAM,UAAU,UAAU,OAAO,CAAC,MAAM,CAAC,SAAS,SAAS,CAAC,CAAC;AAC7D,UAAI,KAAK,MAAM;AACb,gBAAQ,IAAI,KAAK,UAAU,EAAE,OAAO,QAAQ,OAAO,QAAQ,CAAC,CAAC;AAAA,MAC/D,OAAO;AACL,YAAI,MAAM,OAAQ,SAAQ,IAAI,MAAM,KAAK,UAAU,MAAM,KAAK,IAAI,CAAC,EAAE,CAAC;AACtE,YAAI,QAAQ,OAAQ,SAAQ,IAAI,MAAM,OAAO,YAAY,QAAQ,KAAK,IAAI,CAAC,EAAE,CAAC;AAAA,MAChF;AACA,kBAAY;AAAA,IACd,SAAS,GAAQ;AACf,UAAI,KAAK;AACP,gBAAQ,IAAI,KAAK,UAAU,EAAE,OAAO,SAAS,SAAS,OAAO,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC;AAAA,UAC7E,SAAQ,MAAM,MAAM,IAAI,wBAAwB,GAAG,GAAG,WAAW,CAAC;AAAA,IACzE;AAAA,EACF;AACA,QAAM,YAAY,OAAO,KAAK,QAAQ,KAAK;AAC3C,MAAI,QAAa;AACjB,QAAM,UAAU,CAAC,SAAkB;AAEjC,QAAI,QAAQ,KAAK,WAAW,IAAI,MAAM,EAAG;AACzC,iBAAa,KAAK;AAClB,YAAQ,WAAW,KAAK,SAAS;AAAA,EACnC;AACA,UAAQ,IAAI,MAAM,KAAK,yBAAyB,CAAC;AACjD,QAAM,WAAW,oBAAI,IAAY,CAAC,IAAI,MAAM,CAAC;AAE7C,aAAW,KAAK,IAAI,YAAY;AAC9B,QAAI,EAAE,YAAY,EAAE,aAAa,cAAc,EAAE,aAAa,WAAW;AACvE,eAAS,IAAI,EAAE,QAAQ;AAAA,IACzB;AAAA,EACF;AAEA,WAAS,IAAI,IAAI,MAAM;AACvB,WACG,MAAM,MAAM,KAAK,QAAQ,GAAG,EAAE,eAAe,KAAK,CAAC,EACnD,GAAG,OAAO,CAAC,MAAM,QAAQ,CAAC,CAAC,EAC3B,GAAG,UAAU,CAAC,MAAM,QAAQ,CAAC,CAAC,EAC9B,GAAG,UAAU,CAAC,MAAM,QAAQ,CAAC,CAAC;AACjC,QAAM,IAAI;AACZ,CAAC;AAEH,QACG,QAAQ,MAAM,EACd,YAAY,2BAA2B,EACvC,OAAO,aAAa,iBAAiB,EACrC,OAAO,OAAO,UAAe;AAC5B,QAAM,KAAK,MAAM,OAAO,aAAkB;AAC1C,QAAM,OAAO,MAAM,OAAO,MAAW;AACrC,QAAM,SAAS,KAAK,QAAQ,QAAQ,IAAI,GAAG,gBAAgB;AAC3D,QAAM,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQjB,MAAI;AACF,UAAM,GAAG,UAAU,QAAQ,UAAU,EAAE,MAAM,KAAK,CAAC;AACnD,YAAQ,IAAI,MAAM,MAAM,WAAW,MAAM,EAAE,CAAC;AAAA,EAC9C,SAAS,GAAQ;AACf,YAAQ,MAAM,MAAM,IAAI,cAAc,GAAG,GAAG,WAAW,CAAC;AACxD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QAAQ,WAAW,QAAQ,IAAI;","names":[]}
@@ -0,0 +1,145 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/config.ts
31
+ var config_exports = {};
32
+ __export(config_exports, {
33
+ AnalyzerSchema: () => AnalyzerSchema,
34
+ ConfigSchema: () => ConfigSchema,
35
+ GeneratorSchema: () => GeneratorSchema,
36
+ NamingSchema: () => NamingSchema,
37
+ defineConfig: () => defineConfig,
38
+ loadConfig: () => loadConfig
39
+ });
40
+ module.exports = __toCommonJS(config_exports);
41
+ var import_zod = require("zod");
42
+ var import_meta = {};
43
+ var NamingSchema = import_zod.z.object({
44
+ routerSuffix: import_zod.z.string().default("Router"),
45
+ procedureCase: import_zod.z.enum(["camel", "kebab", "snake"]).default("camel")
46
+ }).partial();
47
+ var GeneratorSchema = import_zod.z.object({
48
+ kind: import_zod.z.enum(["orpc", "service", "zod", "valibot", "arktype"]),
49
+ template: import_zod.z.string().optional(),
50
+ includeRelations: import_zod.z.boolean().optional(),
51
+ naming: NamingSchema.optional(),
52
+ outputHeader: import_zod.z.object({
53
+ enabled: import_zod.z.boolean().default(true).optional(),
54
+ text: import_zod.z.string().optional()
55
+ }).optional(),
56
+ format: import_zod.z.object({
57
+ enabled: import_zod.z.boolean().default(true).optional(),
58
+ engine: import_zod.z.enum(["auto", "prettier", "biome"]).default("auto").optional(),
59
+ configPath: import_zod.z.string().optional()
60
+ }).optional(),
61
+ // service generator specific options
62
+ path: import_zod.z.string().optional(),
63
+ dataAccess: import_zod.z.enum(["stub", "drizzle"]).default("stub").optional(),
64
+ dbImportPath: import_zod.z.string().optional(),
65
+ schemaImportPath: import_zod.z.string().optional(),
66
+ // zod generator specific options
67
+ schemaSuffix: import_zod.z.string().optional(),
68
+ fileSuffix: import_zod.z.string().optional(),
69
+ // orpc validation sharing
70
+ validation: import_zod.z.object({
71
+ useShared: import_zod.z.boolean().default(false).optional(),
72
+ library: import_zod.z.enum(["zod", "valibot", "arktype"]).default("zod").optional(),
73
+ importPath: import_zod.z.string().optional(),
74
+ schemaSuffix: import_zod.z.string().optional()
75
+ }).optional(),
76
+ // template options
77
+ templateOptions: import_zod.z.record(import_zod.z.string(), import_zod.z.any()).optional()
78
+ });
79
+ var AnalyzerSchema = import_zod.z.object({
80
+ includeRelations: import_zod.z.boolean().default(true),
81
+ validateConstraints: import_zod.z.boolean().default(true),
82
+ includeHeuristicRelations: import_zod.z.boolean().default(false)
83
+ });
84
+ var ConfigSchema = import_zod.z.object({
85
+ schema: import_zod.z.string(),
86
+ outDir: import_zod.z.string().default("src/api"),
87
+ analyzer: AnalyzerSchema.default({
88
+ includeRelations: true,
89
+ validateConstraints: true,
90
+ includeHeuristicRelations: false
91
+ }),
92
+ generators: import_zod.z.array(GeneratorSchema).min(1).default([{ kind: "orpc" }])
93
+ });
94
+ function defineConfig(cfg) {
95
+ return cfg;
96
+ }
97
+ async function loadConfig(customPath) {
98
+ const path = await import("path");
99
+ const fs = await import("fs/promises");
100
+ const candidates = customPath ? [customPath] : ["drzl.config.ts", "drzl.config.mjs", "drzl.config.js", "drzl.config.json"];
101
+ for (const c of candidates) {
102
+ const p = path.resolve(process.cwd(), c);
103
+ try {
104
+ await fs.access(p);
105
+ } catch {
106
+ continue;
107
+ }
108
+ if (/\.json$/i.test(p)) {
109
+ try {
110
+ const content = await fs.readFile(p, "utf8");
111
+ const raw = JSON.parse(content);
112
+ return ConfigSchema.parse(raw);
113
+ } catch (e2) {
114
+ throw new Error(`Failed to load config from ${p}: ${String(e2)}`);
115
+ }
116
+ }
117
+ try {
118
+ const { createJiti } = await import("jiti");
119
+ const jit = createJiti(import_meta.url);
120
+ const mod = await jit.import(p);
121
+ const raw = mod && typeof mod === "object" && "default" in mod ? mod.default : mod;
122
+ return ConfigSchema.parse(raw);
123
+ } catch (e) {
124
+ console.error(`jiti failed to load ${p}:`, e);
125
+ try {
126
+ const content = await fs.readFile(p, "utf8");
127
+ const raw = JSON.parse(content);
128
+ return ConfigSchema.parse(raw);
129
+ } catch (e2) {
130
+ throw new Error(`Failed to load config from ${p}: ${String(e2)}`);
131
+ }
132
+ }
133
+ }
134
+ return null;
135
+ }
136
+ // Annotate the CommonJS export names for ESM import in node:
137
+ 0 && (module.exports = {
138
+ AnalyzerSchema,
139
+ ConfigSchema,
140
+ GeneratorSchema,
141
+ NamingSchema,
142
+ defineConfig,
143
+ loadConfig
144
+ });
145
+ //# sourceMappingURL=config.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/config.ts"],"sourcesContent":["import { z } from 'zod';\n\nexport const NamingSchema = z\n .object({\n routerSuffix: z.string().default('Router'),\n procedureCase: z.enum(['camel', 'kebab', 'snake']).default('camel'),\n })\n .partial();\n\nexport const GeneratorSchema = z.object({\n kind: z.enum(['orpc', 'service', 'zod', 'valibot', 'arktype']),\n template: z.string().optional(),\n includeRelations: z.boolean().optional(),\n naming: NamingSchema.optional(),\n outputHeader: z\n .object({\n enabled: z.boolean().default(true).optional(),\n text: z.string().optional(),\n })\n .optional(),\n format: z\n .object({\n enabled: z.boolean().default(true).optional(),\n engine: z.enum(['auto', 'prettier', 'biome']).default('auto').optional(),\n configPath: z.string().optional(),\n })\n .optional(),\n // service generator specific options\n path: z.string().optional(),\n dataAccess: z.enum(['stub', 'drizzle']).default('stub').optional(),\n dbImportPath: z.string().optional(),\n schemaImportPath: z.string().optional(),\n // zod generator specific options\n schemaSuffix: z.string().optional(),\n fileSuffix: z.string().optional(),\n // orpc validation sharing\n validation: z\n .object({\n useShared: z.boolean().default(false).optional(),\n library: z.enum(['zod', 'valibot', 'arktype']).default('zod').optional(),\n importPath: z.string().optional(),\n schemaSuffix: z.string().optional(),\n })\n .optional(),\n // template options\n templateOptions: z.record(z.string(), z.any()).optional(),\n});\n\nexport const AnalyzerSchema = z.object({\n includeRelations: z.boolean().default(true),\n validateConstraints: z.boolean().default(true),\n includeHeuristicRelations: z.boolean().default(false),\n});\n\nexport const ConfigSchema = z.object({\n schema: z.string(),\n outDir: z.string().default('src/api'),\n analyzer: AnalyzerSchema.default({\n includeRelations: true,\n validateConstraints: true,\n includeHeuristicRelations: false,\n }),\n generators: z\n .array(GeneratorSchema)\n .min(1)\n .default([{ kind: 'orpc' } as any]),\n});\n\n// ✨ Separate input vs output types\nexport type DrzlConfigInput = z.input<typeof ConfigSchema>;\nexport type DrzlConfig = z.output<typeof ConfigSchema>;\n\nexport function defineConfig<T extends DrzlConfigInput>(cfg: T): T {\n return cfg;\n}\n\nexport async function loadConfig(customPath?: string): Promise<DrzlConfig | null> {\n const path = await import('node:path');\n const fs = await import('node:fs/promises');\n\n const candidates = customPath\n ? [customPath]\n : ['drzl.config.ts', 'drzl.config.mjs', 'drzl.config.js', 'drzl.config.json'];\n\n for (const c of candidates) {\n const p = path.resolve(process.cwd(), c);\n try {\n await fs.access(p);\n } catch {\n continue;\n }\n\n // JSON path — parse directly\n if (/\\.json$/i.test(p)) {\n try {\n const content = await fs.readFile(p, 'utf8');\n const raw = JSON.parse(content);\n return ConfigSchema.parse(raw); // -> DrzlConfig (output)\n } catch (e2) {\n throw new Error(`Failed to load config from ${p}: ${String(e2)}`);\n }\n }\n\n // TS/ESM/CJS via jiti\n try {\n const { createJiti } = await import('jiti');\n const jit = createJiti(import.meta.url);\n const mod = await jit.import(p);\n const raw = mod && typeof mod === 'object' && 'default' in mod ? mod.default : mod;\n return ConfigSchema.parse(raw); // parse to resolved output\n } catch (e) {\n console.error(`jiti failed to load ${p}:`, e);\n // Fallback: try JSON parse\n try {\n const content = await fs.readFile(p, 'utf8');\n const raw = JSON.parse(content);\n return ConfigSchema.parse(raw);\n } catch (e2) {\n throw new Error(`Failed to load config from ${p}: ${String(e2)}`);\n }\n }\n }\n return null;\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,134 @@
1
+ import { z } from 'zod';
2
+
3
+ declare const NamingSchema: z.ZodObject<{
4
+ routerSuffix: z.ZodOptional<z.ZodDefault<z.ZodString>>;
5
+ procedureCase: z.ZodOptional<z.ZodDefault<z.ZodEnum<{
6
+ camel: "camel";
7
+ kebab: "kebab";
8
+ snake: "snake";
9
+ }>>>;
10
+ }, z.core.$strip>;
11
+ declare const GeneratorSchema: z.ZodObject<{
12
+ kind: z.ZodEnum<{
13
+ orpc: "orpc";
14
+ service: "service";
15
+ zod: "zod";
16
+ valibot: "valibot";
17
+ arktype: "arktype";
18
+ }>;
19
+ template: z.ZodOptional<z.ZodString>;
20
+ includeRelations: z.ZodOptional<z.ZodBoolean>;
21
+ naming: z.ZodOptional<z.ZodObject<{
22
+ routerSuffix: z.ZodOptional<z.ZodDefault<z.ZodString>>;
23
+ procedureCase: z.ZodOptional<z.ZodDefault<z.ZodEnum<{
24
+ camel: "camel";
25
+ kebab: "kebab";
26
+ snake: "snake";
27
+ }>>>;
28
+ }, z.core.$strip>>;
29
+ outputHeader: z.ZodOptional<z.ZodObject<{
30
+ enabled: z.ZodOptional<z.ZodDefault<z.ZodBoolean>>;
31
+ text: z.ZodOptional<z.ZodString>;
32
+ }, z.core.$strip>>;
33
+ format: z.ZodOptional<z.ZodObject<{
34
+ enabled: z.ZodOptional<z.ZodDefault<z.ZodBoolean>>;
35
+ engine: z.ZodOptional<z.ZodDefault<z.ZodEnum<{
36
+ auto: "auto";
37
+ prettier: "prettier";
38
+ biome: "biome";
39
+ }>>>;
40
+ configPath: z.ZodOptional<z.ZodString>;
41
+ }, z.core.$strip>>;
42
+ path: z.ZodOptional<z.ZodString>;
43
+ dataAccess: z.ZodOptional<z.ZodDefault<z.ZodEnum<{
44
+ stub: "stub";
45
+ drizzle: "drizzle";
46
+ }>>>;
47
+ dbImportPath: z.ZodOptional<z.ZodString>;
48
+ schemaImportPath: z.ZodOptional<z.ZodString>;
49
+ schemaSuffix: z.ZodOptional<z.ZodString>;
50
+ fileSuffix: z.ZodOptional<z.ZodString>;
51
+ validation: z.ZodOptional<z.ZodObject<{
52
+ useShared: z.ZodOptional<z.ZodDefault<z.ZodBoolean>>;
53
+ library: z.ZodOptional<z.ZodDefault<z.ZodEnum<{
54
+ zod: "zod";
55
+ valibot: "valibot";
56
+ arktype: "arktype";
57
+ }>>>;
58
+ importPath: z.ZodOptional<z.ZodString>;
59
+ schemaSuffix: z.ZodOptional<z.ZodString>;
60
+ }, z.core.$strip>>;
61
+ templateOptions: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
62
+ }, z.core.$strip>;
63
+ declare const AnalyzerSchema: z.ZodObject<{
64
+ includeRelations: z.ZodDefault<z.ZodBoolean>;
65
+ validateConstraints: z.ZodDefault<z.ZodBoolean>;
66
+ includeHeuristicRelations: z.ZodDefault<z.ZodBoolean>;
67
+ }, z.core.$strip>;
68
+ declare const ConfigSchema: z.ZodObject<{
69
+ schema: z.ZodString;
70
+ outDir: z.ZodDefault<z.ZodString>;
71
+ analyzer: z.ZodDefault<z.ZodObject<{
72
+ includeRelations: z.ZodDefault<z.ZodBoolean>;
73
+ validateConstraints: z.ZodDefault<z.ZodBoolean>;
74
+ includeHeuristicRelations: z.ZodDefault<z.ZodBoolean>;
75
+ }, z.core.$strip>>;
76
+ generators: z.ZodDefault<z.ZodArray<z.ZodObject<{
77
+ kind: z.ZodEnum<{
78
+ orpc: "orpc";
79
+ service: "service";
80
+ zod: "zod";
81
+ valibot: "valibot";
82
+ arktype: "arktype";
83
+ }>;
84
+ template: z.ZodOptional<z.ZodString>;
85
+ includeRelations: z.ZodOptional<z.ZodBoolean>;
86
+ naming: z.ZodOptional<z.ZodObject<{
87
+ routerSuffix: z.ZodOptional<z.ZodDefault<z.ZodString>>;
88
+ procedureCase: z.ZodOptional<z.ZodDefault<z.ZodEnum<{
89
+ camel: "camel";
90
+ kebab: "kebab";
91
+ snake: "snake";
92
+ }>>>;
93
+ }, z.core.$strip>>;
94
+ outputHeader: z.ZodOptional<z.ZodObject<{
95
+ enabled: z.ZodOptional<z.ZodDefault<z.ZodBoolean>>;
96
+ text: z.ZodOptional<z.ZodString>;
97
+ }, z.core.$strip>>;
98
+ format: z.ZodOptional<z.ZodObject<{
99
+ enabled: z.ZodOptional<z.ZodDefault<z.ZodBoolean>>;
100
+ engine: z.ZodOptional<z.ZodDefault<z.ZodEnum<{
101
+ auto: "auto";
102
+ prettier: "prettier";
103
+ biome: "biome";
104
+ }>>>;
105
+ configPath: z.ZodOptional<z.ZodString>;
106
+ }, z.core.$strip>>;
107
+ path: z.ZodOptional<z.ZodString>;
108
+ dataAccess: z.ZodOptional<z.ZodDefault<z.ZodEnum<{
109
+ stub: "stub";
110
+ drizzle: "drizzle";
111
+ }>>>;
112
+ dbImportPath: z.ZodOptional<z.ZodString>;
113
+ schemaImportPath: z.ZodOptional<z.ZodString>;
114
+ schemaSuffix: z.ZodOptional<z.ZodString>;
115
+ fileSuffix: z.ZodOptional<z.ZodString>;
116
+ validation: z.ZodOptional<z.ZodObject<{
117
+ useShared: z.ZodOptional<z.ZodDefault<z.ZodBoolean>>;
118
+ library: z.ZodOptional<z.ZodDefault<z.ZodEnum<{
119
+ zod: "zod";
120
+ valibot: "valibot";
121
+ arktype: "arktype";
122
+ }>>>;
123
+ importPath: z.ZodOptional<z.ZodString>;
124
+ schemaSuffix: z.ZodOptional<z.ZodString>;
125
+ }, z.core.$strip>>;
126
+ templateOptions: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
127
+ }, z.core.$strip>>>;
128
+ }, z.core.$strip>;
129
+ type DrzlConfigInput = z.input<typeof ConfigSchema>;
130
+ type DrzlConfig = z.output<typeof ConfigSchema>;
131
+ declare function defineConfig<T extends DrzlConfigInput>(cfg: T): T;
132
+ declare function loadConfig(customPath?: string): Promise<DrzlConfig | null>;
133
+
134
+ export { AnalyzerSchema, ConfigSchema, type DrzlConfig, type DrzlConfigInput, GeneratorSchema, NamingSchema, defineConfig, loadConfig };
@@ -0,0 +1,134 @@
1
+ import { z } from 'zod';
2
+
3
+ declare const NamingSchema: z.ZodObject<{
4
+ routerSuffix: z.ZodOptional<z.ZodDefault<z.ZodString>>;
5
+ procedureCase: z.ZodOptional<z.ZodDefault<z.ZodEnum<{
6
+ camel: "camel";
7
+ kebab: "kebab";
8
+ snake: "snake";
9
+ }>>>;
10
+ }, z.core.$strip>;
11
+ declare const GeneratorSchema: z.ZodObject<{
12
+ kind: z.ZodEnum<{
13
+ orpc: "orpc";
14
+ service: "service";
15
+ zod: "zod";
16
+ valibot: "valibot";
17
+ arktype: "arktype";
18
+ }>;
19
+ template: z.ZodOptional<z.ZodString>;
20
+ includeRelations: z.ZodOptional<z.ZodBoolean>;
21
+ naming: z.ZodOptional<z.ZodObject<{
22
+ routerSuffix: z.ZodOptional<z.ZodDefault<z.ZodString>>;
23
+ procedureCase: z.ZodOptional<z.ZodDefault<z.ZodEnum<{
24
+ camel: "camel";
25
+ kebab: "kebab";
26
+ snake: "snake";
27
+ }>>>;
28
+ }, z.core.$strip>>;
29
+ outputHeader: z.ZodOptional<z.ZodObject<{
30
+ enabled: z.ZodOptional<z.ZodDefault<z.ZodBoolean>>;
31
+ text: z.ZodOptional<z.ZodString>;
32
+ }, z.core.$strip>>;
33
+ format: z.ZodOptional<z.ZodObject<{
34
+ enabled: z.ZodOptional<z.ZodDefault<z.ZodBoolean>>;
35
+ engine: z.ZodOptional<z.ZodDefault<z.ZodEnum<{
36
+ auto: "auto";
37
+ prettier: "prettier";
38
+ biome: "biome";
39
+ }>>>;
40
+ configPath: z.ZodOptional<z.ZodString>;
41
+ }, z.core.$strip>>;
42
+ path: z.ZodOptional<z.ZodString>;
43
+ dataAccess: z.ZodOptional<z.ZodDefault<z.ZodEnum<{
44
+ stub: "stub";
45
+ drizzle: "drizzle";
46
+ }>>>;
47
+ dbImportPath: z.ZodOptional<z.ZodString>;
48
+ schemaImportPath: z.ZodOptional<z.ZodString>;
49
+ schemaSuffix: z.ZodOptional<z.ZodString>;
50
+ fileSuffix: z.ZodOptional<z.ZodString>;
51
+ validation: z.ZodOptional<z.ZodObject<{
52
+ useShared: z.ZodOptional<z.ZodDefault<z.ZodBoolean>>;
53
+ library: z.ZodOptional<z.ZodDefault<z.ZodEnum<{
54
+ zod: "zod";
55
+ valibot: "valibot";
56
+ arktype: "arktype";
57
+ }>>>;
58
+ importPath: z.ZodOptional<z.ZodString>;
59
+ schemaSuffix: z.ZodOptional<z.ZodString>;
60
+ }, z.core.$strip>>;
61
+ templateOptions: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
62
+ }, z.core.$strip>;
63
+ declare const AnalyzerSchema: z.ZodObject<{
64
+ includeRelations: z.ZodDefault<z.ZodBoolean>;
65
+ validateConstraints: z.ZodDefault<z.ZodBoolean>;
66
+ includeHeuristicRelations: z.ZodDefault<z.ZodBoolean>;
67
+ }, z.core.$strip>;
68
+ declare const ConfigSchema: z.ZodObject<{
69
+ schema: z.ZodString;
70
+ outDir: z.ZodDefault<z.ZodString>;
71
+ analyzer: z.ZodDefault<z.ZodObject<{
72
+ includeRelations: z.ZodDefault<z.ZodBoolean>;
73
+ validateConstraints: z.ZodDefault<z.ZodBoolean>;
74
+ includeHeuristicRelations: z.ZodDefault<z.ZodBoolean>;
75
+ }, z.core.$strip>>;
76
+ generators: z.ZodDefault<z.ZodArray<z.ZodObject<{
77
+ kind: z.ZodEnum<{
78
+ orpc: "orpc";
79
+ service: "service";
80
+ zod: "zod";
81
+ valibot: "valibot";
82
+ arktype: "arktype";
83
+ }>;
84
+ template: z.ZodOptional<z.ZodString>;
85
+ includeRelations: z.ZodOptional<z.ZodBoolean>;
86
+ naming: z.ZodOptional<z.ZodObject<{
87
+ routerSuffix: z.ZodOptional<z.ZodDefault<z.ZodString>>;
88
+ procedureCase: z.ZodOptional<z.ZodDefault<z.ZodEnum<{
89
+ camel: "camel";
90
+ kebab: "kebab";
91
+ snake: "snake";
92
+ }>>>;
93
+ }, z.core.$strip>>;
94
+ outputHeader: z.ZodOptional<z.ZodObject<{
95
+ enabled: z.ZodOptional<z.ZodDefault<z.ZodBoolean>>;
96
+ text: z.ZodOptional<z.ZodString>;
97
+ }, z.core.$strip>>;
98
+ format: z.ZodOptional<z.ZodObject<{
99
+ enabled: z.ZodOptional<z.ZodDefault<z.ZodBoolean>>;
100
+ engine: z.ZodOptional<z.ZodDefault<z.ZodEnum<{
101
+ auto: "auto";
102
+ prettier: "prettier";
103
+ biome: "biome";
104
+ }>>>;
105
+ configPath: z.ZodOptional<z.ZodString>;
106
+ }, z.core.$strip>>;
107
+ path: z.ZodOptional<z.ZodString>;
108
+ dataAccess: z.ZodOptional<z.ZodDefault<z.ZodEnum<{
109
+ stub: "stub";
110
+ drizzle: "drizzle";
111
+ }>>>;
112
+ dbImportPath: z.ZodOptional<z.ZodString>;
113
+ schemaImportPath: z.ZodOptional<z.ZodString>;
114
+ schemaSuffix: z.ZodOptional<z.ZodString>;
115
+ fileSuffix: z.ZodOptional<z.ZodString>;
116
+ validation: z.ZodOptional<z.ZodObject<{
117
+ useShared: z.ZodOptional<z.ZodDefault<z.ZodBoolean>>;
118
+ library: z.ZodOptional<z.ZodDefault<z.ZodEnum<{
119
+ zod: "zod";
120
+ valibot: "valibot";
121
+ arktype: "arktype";
122
+ }>>>;
123
+ importPath: z.ZodOptional<z.ZodString>;
124
+ schemaSuffix: z.ZodOptional<z.ZodString>;
125
+ }, z.core.$strip>>;
126
+ templateOptions: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
127
+ }, z.core.$strip>>>;
128
+ }, z.core.$strip>;
129
+ type DrzlConfigInput = z.input<typeof ConfigSchema>;
130
+ type DrzlConfig = z.output<typeof ConfigSchema>;
131
+ declare function defineConfig<T extends DrzlConfigInput>(cfg: T): T;
132
+ declare function loadConfig(customPath?: string): Promise<DrzlConfig | null>;
133
+
134
+ export { AnalyzerSchema, ConfigSchema, type DrzlConfig, type DrzlConfigInput, GeneratorSchema, NamingSchema, defineConfig, loadConfig };
package/dist/config.js ADDED
@@ -0,0 +1,17 @@
1
+ import {
2
+ AnalyzerSchema,
3
+ ConfigSchema,
4
+ GeneratorSchema,
5
+ NamingSchema,
6
+ defineConfig,
7
+ loadConfig
8
+ } from "./chunk-AWFAECUZ.js";
9
+ export {
10
+ AnalyzerSchema,
11
+ ConfigSchema,
12
+ GeneratorSchema,
13
+ NamingSchema,
14
+ defineConfig,
15
+ loadConfig
16
+ };
17
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@drzl/cli",
3
- "version": "0.0.3",
3
+ "version": "0.2.0",
4
4
  "private": false,
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
@@ -8,6 +8,16 @@
8
8
  "drzl": "dist/cli.js"
9
9
  },
10
10
  "main": "dist/cli.js",
11
+ "types": "dist/config.d.ts",
12
+ "exports": {
13
+ ".": {
14
+ "import": "./dist/cli.js"
15
+ },
16
+ "./config": {
17
+ "import": "./dist/config.js",
18
+ "types": "./dist/config.d.ts"
19
+ }
20
+ },
11
21
  "files": [
12
22
  "dist"
13
23
  ],
@@ -19,12 +29,12 @@
19
29
  "cli-progress": "^3.12.0",
20
30
  "zod": "^4.1.5",
21
31
  "jiti": "^2.5.1",
22
- "@drzl/analyzer": "^0.0.3",
23
- "@drzl/generator-orpc": "^0.0.3",
24
- "@drzl/generator-zod": "^0.0.3",
25
- "@drzl/generator-service": "^0.0.3",
26
- "@drzl/generator-valibot": "^0.0.3",
27
- "@drzl/generator-arktype": "^0.0.3"
32
+ "@drzl/analyzer": "^0.2.0",
33
+ "@drzl/generator-orpc": "^0.2.0",
34
+ "@drzl/generator-zod": "^0.2.0",
35
+ "@drzl/generator-service": "^0.2.0",
36
+ "@drzl/generator-valibot": "^0.2.0",
37
+ "@drzl/generator-arktype": "^0.2.0"
28
38
  },
29
39
  "devDependencies": {
30
40
  "tsup": "^8.5.0",
@@ -45,7 +55,7 @@
45
55
  "directory": "packages/cli"
46
56
  },
47
57
  "scripts": {
48
- "build": "tsup src/cli.ts --format esm,cjs --sourcemap",
58
+ "build": "tsup src/cli.ts src/config.ts --format esm,cjs --sourcemap --dts",
49
59
  "dev": "node --loader ts-node/esm src/cli.ts --help",
50
60
  "lint": "eslint . --ext .ts",
51
61
  "test": "vitest run"