@drzl/cli 0.2.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
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":"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","names":[]}
1
+ {"version":3,"sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { SchemaAnalyzer } from '@drzl/analyzer';\nimport { ORPCGenerator } from '@drzl/generator-orpc';\nimport chalk from 'chalk';\nimport chokidar from 'chokidar';\nimport cliProgress from 'cli-progress';\nimport { Command } from 'commander';\nimport * as path from 'node:path';\nimport ora from 'ora';\nimport {\n computeGeneratorOutputDirs,\n computeWatchTargets,\n DrzlConfig,\n loadConfig,\n} from './config.js';\n\nconst program = new Command();\nprogram.name('drzl').description('DRZL - Drizzle Developer Toolkit').version('0.0.1');\n\nprogram\n .command('analyze')\n .argument('<schema>', 'path to drizzle schema (TS)')\n .option('--relations', 'include relations', true)\n .option('--validate', 'validate constraints', true)\n .option('--out <file>', 'write analysis JSON to file')\n .option('--json', 'print JSON to stdout (overrides --out)', false)\n .action(async (schema: string, opts: any) => {\n try {\n const analyzer = new SchemaAnalyzer(schema);\n const spinner = !opts.json ? ora('Analyzing schema...').start() : null;\n const start = Date.now();\n const res = await analyzer.analyze({\n includeRelations: !!opts.relations,\n validateConstraints: !!opts.validate,\n });\n const ms = Date.now() - start;\n const json = JSON.stringify(res, null, 2);\n if (opts.json) {\n console.log(json);\n } else if (opts.out) {\n const fs = await import('node:fs/promises');\n await fs.writeFile(opts.out, json, 'utf8');\n spinner?.succeed(chalk.green(`Analysis written to ${opts.out} in ${ms}ms`));\n } else {\n spinner?.succeed(chalk.green(`Analyzed in ${ms}ms`));\n console.log(json);\n }\n process.exit(res.issues.some((i) => i.level === 'error') ? 2 : 0);\n } catch (e: any) {\n const msg = e?.message ?? String(e);\n if (opts.json)\n console.log(JSON.stringify({ event: 'error', code: 'DRZL_CLI_ANALYZE', message: msg }));\n else\n console.error(\n chalk.red('Analyze failed (DRZL_CLI_ANALYZE):'),\n msg,\n '\\nTip: run with --json for structured output.'\n );\n process.exit(1);\n }\n });\n\nprogram\n .command('generate')\n .description('Run configured generators (drzl.config.*)')\n .option('-c, --config <path>', 'path to drzl.config')\n .action(async (opts: any) => {\n try {\n const cfg = await loadConfig(opts.config);\n if (!cfg) {\n console.error(\n chalk.red('No config found (DRZL_CFG_001). Create drzl.config.ts or pass --config.')\n );\n process.exit(2);\n return;\n }\n const analyzer = new SchemaAnalyzer(cfg.schema);\n const spinner = ora('Analyzing...').start();\n const t0 = Date.now();\n const analysis = await analyzer.analyze({\n includeRelations: cfg.analyzer.includeRelations,\n validateConstraints: cfg.analyzer.validateConstraints,\n includeHeuristicRelations: cfg.analyzer.includeHeuristicRelations,\n });\n spinner.succeed(`Analysis complete in ${Date.now() - t0}ms`);\n const progress = new cliProgress.SingleBar(\n { hideCursor: true },\n cliProgress.Presets.shades_classic\n );\n const total = analysis.tables.length || 1;\n progress.start(total, 0);\n for (const g of cfg.generators) {\n if (g.kind === 'orpc') {\n const gen = new ORPCGenerator(analysis);\n const { files } = await gen.generate({\n outputDir: cfg.outDir,\n template: g.template,\n includeRelations: g.includeRelations,\n naming: g.naming,\n outputHeader: g.outputHeader,\n format: g.format,\n templateOptions: g.templateOptions,\n validation: g.validation,\n onProgress: ({ index }) => progress.update(index),\n });\n progress.stop();\n ora().succeed(chalk.green(`Generated (${g.kind}): ${files.length} files`));\n files.forEach((f: string) => console.log(' -', chalk.cyan(f)));\n } else if (g.kind === 'service') {\n try {\n const { ServiceGenerator } = await import('@drzl/generator-service');\n const gen = new ServiceGenerator(analysis);\n const target = g.path ?? 'src/services';\n const files = await gen.generate({\n outDir: target,\n outputHeader: g.outputHeader,\n format: g.format,\n dataAccess: g.dataAccess,\n dbImportPath: g.dbImportPath,\n schemaImportPath: g.schemaImportPath,\n });\n progress.stop();\n ora().succeed(chalk.green(`Generated (service): ${files.length} files`));\n files.forEach((f: string) => console.log(' -', chalk.cyan(f)));\n } catch (e: any) {\n progress.stop();\n console.error(\n chalk.red('Service generator missing.'),\n chalk.yellow('\\nInstall with: npm install @drzl/generator-service')\n );\n console.error(chalk.gray('Error details:'), e?.message ?? e);\n process.exit(1);\n }\n } else if (g.kind === 'zod') {\n try {\n const { ZodGenerator } = await import('@drzl/generator-zod');\n const gen = new ZodGenerator(analysis);\n const target = g.path ?? 'src/validators/zod';\n const files = await gen.generate({\n outDir: target,\n outputHeader: g.outputHeader,\n format: g.format,\n schemaSuffix: g.schemaSuffix,\n fileSuffix: g.fileSuffix,\n });\n progress.stop();\n ora().succeed(chalk.green(`Generated (zod): ${files.length} files`));\n files.forEach((f: string) => console.log(' -', chalk.cyan(f)));\n } catch (e: any) {\n progress.stop();\n console.error(\n chalk.red('Zod generator missing.'),\n chalk.yellow('\\nInstall with: npm install @drzl/generator-zod')\n );\n console.error(chalk.gray('Error details:'), e?.message ?? e);\n process.exit(1);\n }\n } else if (g.kind === 'valibot') {\n try {\n const { ValibotGenerator } = await import('@drzl/generator-valibot');\n const gen = new ValibotGenerator(analysis);\n const target = g.path ?? 'src/validators/valibot';\n const files = await gen.generate({\n outDir: target,\n outputHeader: g.outputHeader,\n format: g.format,\n schemaSuffix: g.schemaSuffix,\n fileSuffix: g.fileSuffix,\n });\n progress.stop();\n ora().succeed(chalk.green(`Generated (valibot): ${files.length} files`));\n files.forEach((f: string) => console.log(' -', chalk.cyan(f)));\n } catch (e: any) {\n progress.stop();\n console.error(\n chalk.red('Valibot generator missing.'),\n chalk.yellow('\\nInstall with: npm install @drzl/generator-valibot')\n );\n console.error(chalk.gray('Error details:'), e?.message ?? e);\n process.exit(1);\n }\n } else if (g.kind === 'arktype') {\n try {\n const { ArkTypeGenerator } = await import('@drzl/generator-arktype');\n const gen = new ArkTypeGenerator(analysis);\n const target = g.path ?? 'src/validators/arktype';\n const files = await gen.generate({\n outDir: target,\n outputHeader: g.outputHeader,\n format: g.format,\n schemaSuffix: g.schemaSuffix,\n fileSuffix: g.fileSuffix,\n });\n progress.stop();\n ora().succeed(chalk.green(`Generated (arktype): ${files.length} files`));\n files.forEach((f: string) => console.log(' -', chalk.cyan(f)));\n } catch (e: any) {\n progress.stop();\n console.error(\n chalk.red('ArkType generator missing.'),\n chalk.yellow('\\nInstall with: npm install @drzl/generator-arktype')\n );\n console.error(chalk.gray('Error details:'), e?.message ?? e);\n process.exit(1);\n }\n }\n }\n } catch (e: any) {\n console.error(\n chalk.red('Generate failed (DRZL_GEN_001):'),\n e?.message ?? e,\n '\\nTip: check your drzl.config.ts and template path.'\n );\n process.exit(1);\n }\n });\n\nprogram\n .command('generate:orpc')\n .argument('<schema>', 'path to drizzle schema (TS)')\n .option('-o, --outDir <dir>', 'output directory', 'src/api')\n .option('--template <name>', 'template name', 'standard')\n .option('--includeRelations', 'include relation endpoints')\n .action(async (schema: string, opts: any) => {\n try {\n const analyzer = new SchemaAnalyzer(schema);\n const analysis = await analyzer.analyze({\n includeRelations: !!opts.includeRelations,\n validateConstraints: true,\n });\n const gen = new ORPCGenerator(analysis);\n const { files } = await gen.generate({\n outputDir: opts.outDir,\n template: opts.template,\n includeRelations: !!opts.includeRelations,\n });\n console.log(chalk.green(`Generated:`), files.map((f) => chalk.cyan(f)).join(', '));\n } catch (e: any) {\n console.error(chalk.red('Generate orpc failed:'), e?.message ?? e);\n process.exit(1);\n }\n });\n\nprogram\n .command('watch')\n .description('Watch schema and regenerate on changes')\n .option('-c, --config <path>', 'path to drzl.config')\n .option('--pipeline <name>', 'all | analyze | generate-orpc', 'all')\n .option('--debounce <ms>', 'debounce ms', '200')\n .option('--json', 'emit JSON logs', false)\n .option('--poll', 'force polling (helps WSL/Docker/remote FS)', false)\n .action(async (opts: any) => {\n let cfg = await loadConfig(opts.config);\n if (!cfg) {\n console.error(chalk.red('No config found. Create drzl.config.ts or pass --config.'));\n process.exit(2);\n return;\n }\n\n const abs = (p: string) => path.resolve(process.cwd(), p);\n const isInside = (child: string, parent: string) => {\n const rel = path.relative(parent, child);\n return !!rel && !rel.startsWith('..') && !path.isAbsolute(rel);\n };\n\n const ignoredOutDirs = new Set<string>(computeGeneratorOutputDirs(cfg).map(abs));\n const currentTargets = new Set<string>(computeWatchTargets(cfg).map(abs));\n\n const syncWatcherTargets = (watcher: import('chokidar').FSWatcher, next: Set<string>) => {\n const add: string[] = [];\n const del: string[] = [];\n for (const p of next) if (!currentTargets.has(p)) add.push(p);\n for (const p of currentTargets) if (!next.has(p)) del.push(p);\n if (add.length) watcher.add(add);\n if (del.length) watcher.unwatch(del);\n currentTargets.clear();\n next.forEach((p) => currentTargets.add(p));\n };\n\n const rebuildIgnoreDirsFrom = (cfgNow: DrzlConfig) => {\n ignoredOutDirs.clear();\n for (const d of computeGeneratorOutputDirs(cfgNow)) ignoredOutDirs.add(abs(d));\n };\n\n const ignoredFn = (p: string) => {\n const full = abs(p);\n for (const dir of ignoredOutDirs) {\n if (full === dir || isInside(full, dir)) return true;\n }\n return false;\n };\n\n const watcher = chokidar.watch(Array.from(currentTargets), {\n ignoreInitial: true,\n awaitWriteFinish: { stabilityThreshold: 400, pollInterval: 50 },\n usePolling: !!opts.poll,\n ignored: ignoredFn,\n });\n\n const logTrigger = (type: 'add' | 'change' | 'unlink', file: string) => {\n if (opts.json) console.log(JSON.stringify({ event: 'trigger', type, file }));\n };\n\n watcher\n .on('add', (p) => {\n logTrigger('add', p);\n trigger(p);\n })\n .on('change', (p) => {\n logTrigger('change', p);\n trigger(p);\n })\n .on('unlink', (p) => {\n logTrigger('unlink', p);\n trigger(p);\n });\n\n let lastFiles: string[] = [];\n\n const run = async () => {\n try {\n const reloaded = await loadConfig(opts.config);\n if (!reloaded) throw new Error('Config disappeared during watch.');\n cfg = reloaded;\n\n rebuildIgnoreDirsFrom(cfg);\n const nextTargets = new Set<string>(computeWatchTargets(cfg).map(abs));\n syncWatcherTargets(watcher, nextTargets);\n\n if (!opts.json) console.clear();\n\n if (opts.json) {\n console.log(\n JSON.stringify({\n event: 'watch_config_applied',\n targets: Array.from(currentTargets),\n ignored: Array.from(ignoredOutDirs),\n })\n );\n }\n\n const analyzer = new SchemaAnalyzer(cfg.schema);\n const analysis = await analyzer.analyze({\n includeRelations: cfg.analyzer.includeRelations,\n validateConstraints: cfg.analyzer.validateConstraints,\n includeHeuristicRelations: cfg.analyzer.includeHeuristicRelations,\n });\n\n if (opts.pipeline === 'analyze') {\n if (opts.json) {\n console.log(\n JSON.stringify({\n event: 'analyze_complete',\n issues: analysis.issues,\n tables: analysis.tables.length,\n })\n );\n } else {\n console.log(chalk.green('Analyze complete.'));\n }\n return;\n }\n\n const newFiles: string[] = [];\n\n for (const g of cfg.generators) {\n if (\n opts.pipeline !== 'all' &&\n !(opts.pipeline === 'generate-orpc' && g.kind === 'orpc')\n ) {\n continue;\n }\n\n if (g.kind === 'orpc') {\n const gen = new ORPCGenerator(analysis);\n const { files } = await gen.generate({\n outputDir: cfg.outDir,\n template: g.template,\n includeRelations: g.includeRelations,\n naming: g.naming,\n outputHeader: g.outputHeader,\n format: g.format,\n templateOptions: g.templateOptions,\n validation: g.validation,\n });\n opts.json\n ? console.log(JSON.stringify({ event: 'generate_complete', kind: g.kind, files }))\n : console.log(\n chalk.green(`Generated (${g.kind}):`),\n files.map((f: string) => chalk.cyan(f)).join(', ')\n );\n newFiles.push(...files);\n } else if (g.kind === 'service') {\n try {\n const { ServiceGenerator } = await import('@drzl/generator-service');\n const gen = new ServiceGenerator(analysis);\n const target = g.path ?? 'src/services';\n const files = await gen.generate({\n outDir: target,\n outputHeader: g.outputHeader,\n format: g.format,\n dataAccess: g.dataAccess,\n dbImportPath: g.dbImportPath,\n schemaImportPath: g.schemaImportPath,\n });\n opts.json\n ? console.log(JSON.stringify({ event: 'generate_complete', kind: g.kind, files }))\n : console.log(\n chalk.green(`Generated (service): ${files.length} files`),\n files.map((f: string) => chalk.cyan(f)).join(', ')\n );\n newFiles.push(...files);\n } catch (e: any) {\n console.error(\n chalk.red('Service generator missing.'),\n chalk.yellow('\\nInstall with: npm install @drzl/generator-service')\n );\n console.error(chalk.gray('Error details:'), e?.message ?? e);\n return;\n }\n } else if (g.kind === 'zod') {\n try {\n const { ZodGenerator } = await import('@drzl/generator-zod');\n const gen = new ZodGenerator(analysis);\n const target = g.path ?? 'src/validators/zod';\n const files = await gen.generate({\n outDir: target,\n outputHeader: g.outputHeader,\n format: g.format,\n schemaSuffix: g.schemaSuffix,\n fileSuffix: g.fileSuffix,\n });\n opts.json\n ? console.log(JSON.stringify({ event: 'generate_complete', kind: g.kind, files }))\n : console.log(\n chalk.green(`Generated (zod): ${files.length} files`),\n files.map((f: string) => chalk.cyan(f)).join(', ')\n );\n newFiles.push(...files);\n } catch (e: any) {\n console.error(\n chalk.red('Zod generator missing.'),\n chalk.yellow('\\nInstall with: npm install @drzl/generator-zod')\n );\n console.error(chalk.gray('Error details:'), e?.message ?? e);\n return;\n }\n } else if (g.kind === 'valibot') {\n try {\n const { ValibotGenerator } = await import('@drzl/generator-valibot');\n const gen = new ValibotGenerator(analysis);\n const target = g.path ?? 'src/validators/valibot';\n const files = await gen.generate({\n outDir: target,\n outputHeader: g.outputHeader,\n format: g.format,\n schemaSuffix: g.schemaSuffix,\n fileSuffix: g.fileSuffix,\n });\n opts.json\n ? console.log(JSON.stringify({ event: 'generate_complete', kind: g.kind, files }))\n : console.log(\n chalk.green(`Generated (valibot): ${files.length} files`),\n files.map((f: string) => chalk.cyan(f)).join(', ')\n );\n newFiles.push(...files);\n } catch (e: any) {\n console.error(\n chalk.red('Valibot generator missing.'),\n chalk.yellow('\\nInstall with: npm install @drzl/generator-valibot')\n );\n console.error(chalk.gray('Error details:'), e?.message ?? e);\n return;\n }\n } else if (g.kind === 'arktype') {\n try {\n const { ArkTypeGenerator } = await import('@drzl/generator-arktype');\n const gen = new ArkTypeGenerator(analysis);\n const target = g.path ?? 'src/validators/arktype';\n const files = await gen.generate({\n outDir: target,\n outputHeader: g.outputHeader,\n format: g.format,\n schemaSuffix: g.schemaSuffix,\n fileSuffix: g.fileSuffix,\n });\n opts.json\n ? console.log(JSON.stringify({ event: 'generate_complete', kind: g.kind, files }))\n : console.log(\n chalk.green(`Generated (arktype): ${files.length} files`),\n files.map((f: string) => chalk.cyan(f)).join(', ')\n );\n newFiles.push(...files);\n } catch (e: any) {\n console.error(\n chalk.red('ArkType generator missing.'),\n chalk.yellow('\\nInstall with: npm install @drzl/generator-arktype')\n );\n console.error(chalk.gray('Error details:'), e?.message ?? e);\n return;\n }\n }\n }\n\n const added = newFiles.filter((f) => !lastFiles.includes(f));\n const removed = lastFiles.filter((f) => !newFiles.includes(f));\n opts.json\n ? console.log(JSON.stringify({ event: 'diff', added, removed }))\n : (() => {\n if (added.length) console.log(chalk.blue(`Added: ${added.join(', ')}`));\n if (removed.length) console.log(chalk.yellow(`Removed: ${removed.join(', ')}`));\n })();\n lastFiles = newFiles;\n } catch (e: any) {\n opts.json\n ? console.log(JSON.stringify({ event: 'error', message: String(e?.message ?? e) }))\n : console.error(chalk.red('Watch pipeline failed:'), e?.message ?? e);\n }\n };\n\n const debounced = Number(opts.debounce) || 200;\n let timer: NodeJS.Timeout | null = null;\n const trigger = (file?: string) => {\n if (file) {\n const full = abs(file);\n for (const dir of ignoredOutDirs) {\n if (full === dir || isInside(full, dir)) return;\n }\n }\n if (timer) clearTimeout(timer);\n timer = setTimeout(run, debounced);\n };\n\n if (opts.json) {\n console.log(\n JSON.stringify({\n event: 'watching',\n targets: Array.from(currentTargets),\n ignored: Array.from(ignoredOutDirs),\n })\n );\n } else {\n console.log(\n chalk.gray(\n 'Watching:\\n ' +\n Array.from(currentTargets)\n .map((p) => path.relative(process.cwd(), p))\n .join('\\n ')\n )\n );\n }\n\n watcher\n .on('add', (p) => trigger(p))\n .on('change', (p) => trigger(p))\n .on('unlink', (p) => trigger(p))\n .on('error', (err) => console.error(chalk.red('Watcher error:'), err));\n\n await run();\n });\n\nprogram\n .command('init')\n .description('Scaffold a drzl.config.ts')\n .option('-y, --yes', 'accept defaults')\n .action(async (_opts: any) => {\n const fs = await import('node:fs/promises');\n const path = await import('node:path');\n const target = path.resolve(process.cwd(), 'drzl.config.ts');\n const template = `export default {\n schema: 'src/db/schema.ts',\n outDir: 'src/api',\n analyzer: { includeRelations: true, validateConstraints: true },\n generators: [\n { kind: 'orpc', template: 'standard', includeRelations: true }\n ]\n} as const\\n`;\n try {\n await fs.writeFile(target, template, { flag: 'wx' });\n console.log(chalk.green(`Created ${target}`));\n } catch (e: any) {\n console.error(chalk.red('Init failed:'), e?.message ?? e);\n process.exit(1);\n }\n });\n\nprogram.parseAsync(process.argv);\n"],"mappings":"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","names":["watcher","path"]}
package/dist/config.cjs CHANGED
@@ -34,12 +34,17 @@ __export(config_exports, {
34
34
  ConfigSchema: () => ConfigSchema,
35
35
  GeneratorSchema: () => GeneratorSchema,
36
36
  NamingSchema: () => NamingSchema,
37
+ computeGeneratorOutputDirs: () => computeGeneratorOutputDirs,
38
+ computeWatchTargets: () => computeWatchTargets,
37
39
  defineConfig: () => defineConfig,
38
- loadConfig: () => loadConfig
40
+ loadConfig: () => loadConfig,
41
+ resolveTemplateDirsSync: () => resolveTemplateDirsSync
39
42
  });
40
43
  module.exports = __toCommonJS(config_exports);
44
+ var fs = __toESM(require("fs"), 1);
45
+ var import_node_module = require("module");
46
+ var path = __toESM(require("path"), 1);
41
47
  var import_zod = require("zod");
42
- var import_meta = {};
43
48
  var NamingSchema = import_zod.z.object({
44
49
  routerSuffix: import_zod.z.string().default("Router"),
45
50
  procedureCase: import_zod.z.enum(["camel", "kebab", "snake"]).default("camel")
@@ -63,7 +68,7 @@ var GeneratorSchema = import_zod.z.object({
63
68
  dataAccess: import_zod.z.enum(["stub", "drizzle"]).default("stub").optional(),
64
69
  dbImportPath: import_zod.z.string().optional(),
65
70
  schemaImportPath: import_zod.z.string().optional(),
66
- // zod generator specific options
71
+ // zod/valibot/arktype generator specific options
67
72
  schemaSuffix: import_zod.z.string().optional(),
68
73
  fileSuffix: import_zod.z.string().optional(),
69
74
  // orpc validation sharing
@@ -95,43 +100,96 @@ function defineConfig(cfg) {
95
100
  return cfg;
96
101
  }
97
102
  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"];
103
+ const fsp = await import("fs/promises");
104
+ const candidates = customPath ? [customPath] : [
105
+ "drzl.config.ts",
106
+ "drzl.config.mjs",
107
+ "drzl.config.js",
108
+ "drzl.config.cjs",
109
+ "drzl.config.json"
110
+ ];
101
111
  for (const c of candidates) {
102
112
  const p = path.resolve(process.cwd(), c);
103
113
  try {
104
- await fs.access(p);
114
+ await fsp.access(p);
105
115
  } catch {
106
116
  continue;
107
117
  }
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
- }
118
+ const ext = path.extname(p).toLowerCase();
119
+ if (ext === ".json") {
120
+ const raw2 = JSON.parse(await fsp.readFile(p, "utf8"));
121
+ return ConfigSchema.parse(raw2);
116
122
  }
123
+ const { createJiti } = await import("jiti");
124
+ const stat = await fsp.stat(p);
125
+ const base = typeof __filename !== "undefined" ? __filename : path.join(process.cwd(), "index.js");
126
+ const jiti = createJiti(base, {
127
+ moduleCache: false,
128
+ // re-evaluate each time
129
+ fsCache: true,
130
+ // keep transform cache
131
+ cacheVersion: String(stat.mtimeMs),
132
+ // bump on edit
133
+ interopDefault: true,
134
+ tryNative: false
135
+ // <— prevent native import of .ts
136
+ // debug: true,
137
+ });
138
+ const mod = await jiti.import(p);
139
+ const raw = mod?.default ?? mod;
140
+ return ConfigSchema.parse(raw);
141
+ }
142
+ return null;
143
+ }
144
+ function computeGeneratorOutputDirs(cfg, cwd = process.cwd()) {
145
+ const abs = (p) => path.resolve(cwd, p);
146
+ const dirs = /* @__PURE__ */ new Set();
147
+ dirs.add(abs(cfg.outDir));
148
+ for (const g of cfg.generators) {
149
+ if (g.kind === "service") dirs.add(abs(g.path ?? "src/services"));
150
+ if (g.kind === "zod") dirs.add(abs(g.path ?? "src/validators/zod"));
151
+ if (g.kind === "valibot") dirs.add(abs(g.path ?? "src/validators/valibot"));
152
+ if (g.kind === "arktype") dirs.add(abs(g.path ?? "src/validators/arktype"));
153
+ }
154
+ return [...dirs];
155
+ }
156
+ function resolveTemplateDirsSync(cfg, cwd = process.cwd()) {
157
+ const results = [];
158
+ const req = (0, import_node_module.createRequire)(
159
+ typeof __filename !== "undefined" ? __filename : path.join(process.cwd(), "index.js")
160
+ );
161
+ for (const g of cfg.generators) {
162
+ const t = g.template;
163
+ if (!t || t === "standard" || t === "minimal") continue;
164
+ let pkgDir = null;
117
165
  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
- }
166
+ const pkg = req.resolve(`${t}/package.json`, { paths: [cwd] });
167
+ pkgDir = path.dirname(pkg);
168
+ } catch {
169
+ }
170
+ if (pkgDir) {
171
+ results.push(pkgDir);
172
+ continue;
173
+ }
174
+ if (/[./\\]/.test(t)) {
175
+ const abs = path.resolve(cwd, t);
176
+ if (fs.existsSync(abs)) results.push(abs);
132
177
  }
133
178
  }
134
- return null;
179
+ return Array.from(new Set(results));
180
+ }
181
+ function computeWatchTargets(cfg, cwd = process.cwd()) {
182
+ const abs = (p) => path.resolve(cwd, p);
183
+ const schemaAbs = abs(cfg.schema);
184
+ const targets = /* @__PURE__ */ new Set([
185
+ path.join(path.dirname(schemaAbs), "**/*.{ts,tsx,js}"),
186
+ abs("drzl.config.ts"),
187
+ abs("drzl.config.js"),
188
+ abs("drzl.config.mjs"),
189
+ abs("drzl.config.cjs")
190
+ ]);
191
+ for (const t of resolveTemplateDirsSync(cfg, cwd)) targets.add(t);
192
+ return [...targets];
135
193
  }
136
194
  // Annotate the CommonJS export names for ESM import in node:
137
195
  0 && (module.exports = {
@@ -139,7 +197,10 @@ async function loadConfig(customPath) {
139
197
  ConfigSchema,
140
198
  GeneratorSchema,
141
199
  NamingSchema,
200
+ computeGeneratorOutputDirs,
201
+ computeWatchTargets,
142
202
  defineConfig,
143
- loadConfig
203
+ loadConfig,
204
+ resolveTemplateDirsSync
144
205
  });
145
206
  //# sourceMappingURL=config.cjs.map
@@ -1 +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":[]}
1
+ {"version":3,"sources":["../src/config.ts"],"sourcesContent":["import * as fs from 'node:fs';\nimport { createRequire } from 'node:module';\nimport * as path from 'node:path';\nimport { z } from 'zod';\n\nexport const NamingSchema = z\n .object({\n routerSuffix: z.string().default('Router'),\n procedureCase: z.enum(['camel', 'kebab', 'snake']).default('camel'),\n })\n .partial();\n\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/valibot/arktype 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 fsp = await import('node:fs/promises');\n\n const candidates = customPath\n ? [customPath]\n : [\n 'drzl.config.ts',\n 'drzl.config.mjs',\n 'drzl.config.js',\n 'drzl.config.cjs',\n 'drzl.config.json',\n ];\n\n for (const c of candidates) {\n const p = path.resolve(process.cwd(), c);\n try {\n await fsp.access(p);\n } catch {\n continue;\n }\n\n const ext = path.extname(p).toLowerCase();\n\n // JSON: read directly\n if (ext === '.json') {\n const raw = JSON.parse(await fsp.readFile(p, 'utf8'));\n return ConfigSchema.parse(raw);\n }\n\n // Everything else (TS/JS/MJS/CJS) -> Jiti with cache-busting\n const { createJiti } = await import('jiti');\n const stat = await fsp.stat(p);\n\n // Passing __filename is safe in CJS; fallback to cwd if not defined.\n const base =\n typeof __filename !== 'undefined' ? __filename : path.join(process.cwd(), 'index.js');\n\n const jiti = createJiti(base, {\n moduleCache: false, // re-evaluate each time\n fsCache: true, // keep transform cache\n cacheVersion: String(stat.mtimeMs), // bump on edit\n interopDefault: true,\n tryNative: false, // <— prevent native import of .ts\n // debug: true,\n }) as any;\n\n const mod = await jiti.import(p);\n const raw = mod?.default ?? mod;\n return ConfigSchema.parse(raw);\n }\n\n return null;\n}\n\n/** Absolute output dirs for all generators (to ignore in watcher). */\nexport function computeGeneratorOutputDirs(cfg: DrzlConfig, cwd = process.cwd()): string[] {\n const abs = (p: string) => path.resolve(cwd, p);\n const dirs = new Set<string>();\n dirs.add(abs(cfg.outDir)); // orpc\n for (const g of cfg.generators) {\n if (g.kind === 'service') dirs.add(abs(g.path ?? 'src/services'));\n if (g.kind === 'zod') dirs.add(abs(g.path ?? 'src/validators/zod'));\n if (g.kind === 'valibot') dirs.add(abs(g.path ?? 'src/validators/valibot'));\n if (g.kind === 'arktype') dirs.add(abs(g.path ?? 'src/validators/arktype'));\n }\n return [...dirs];\n}\n\n/** Resolve custom template directories (local path or installed package). */\nexport function resolveTemplateDirsSync(cfg: DrzlConfig, cwd = process.cwd()): string[] {\n const results: string[] = [];\n const req = createRequire(\n typeof __filename !== 'undefined' ? __filename : path.join(process.cwd(), 'index.js')\n );\n\n for (const g of cfg.generators) {\n const t = g.template;\n if (!t || t === 'standard' || t === 'minimal') continue;\n\n // Try package resolution relative to cwd\n let pkgDir: string | null = null;\n try {\n const pkg = req.resolve(`${t}/package.json`, { paths: [cwd] as any });\n pkgDir = path.dirname(pkg);\n } catch {}\n\n if (pkgDir) {\n results.push(pkgDir);\n continue;\n }\n\n // Local path-like template\n if (/[./\\\\]/.test(t)) {\n const abs = path.resolve(cwd, t);\n if (fs.existsSync(abs)) results.push(abs);\n }\n }\n\n return Array.from(new Set(results));\n}\n\n/** Build watch targets (exclude output dirs; watcher will ignore those). */\nexport function computeWatchTargets(cfg: DrzlConfig, cwd = process.cwd()): string[] {\n const abs = (p: string) => path.resolve(cwd, p);\n const schemaAbs = abs(cfg.schema);\n const targets = new Set<string>([\n path.join(path.dirname(schemaAbs), '**/*.{ts,tsx,js}'),\n abs('drzl.config.ts'),\n abs('drzl.config.js'),\n abs('drzl.config.mjs'),\n abs('drzl.config.cjs'),\n ]);\n for (const t of resolveTemplateDirsSync(cfg, cwd)) targets.add(t);\n return [...targets];\n}\n"],"mappings":"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","names":["raw"]}
package/dist/config.d.cts CHANGED
@@ -130,5 +130,11 @@ type DrzlConfigInput = z.input<typeof ConfigSchema>;
130
130
  type DrzlConfig = z.output<typeof ConfigSchema>;
131
131
  declare function defineConfig<T extends DrzlConfigInput>(cfg: T): T;
132
132
  declare function loadConfig(customPath?: string): Promise<DrzlConfig | null>;
133
+ /** Absolute output dirs for all generators (to ignore in watcher). */
134
+ declare function computeGeneratorOutputDirs(cfg: DrzlConfig, cwd?: string): string[];
135
+ /** Resolve custom template directories (local path or installed package). */
136
+ declare function resolveTemplateDirsSync(cfg: DrzlConfig, cwd?: string): string[];
137
+ /** Build watch targets (exclude output dirs; watcher will ignore those). */
138
+ declare function computeWatchTargets(cfg: DrzlConfig, cwd?: string): string[];
133
139
 
134
- export { AnalyzerSchema, ConfigSchema, type DrzlConfig, type DrzlConfigInput, GeneratorSchema, NamingSchema, defineConfig, loadConfig };
140
+ export { AnalyzerSchema, ConfigSchema, type DrzlConfig, type DrzlConfigInput, GeneratorSchema, NamingSchema, computeGeneratorOutputDirs, computeWatchTargets, defineConfig, loadConfig, resolveTemplateDirsSync };
package/dist/config.d.ts CHANGED
@@ -130,5 +130,11 @@ type DrzlConfigInput = z.input<typeof ConfigSchema>;
130
130
  type DrzlConfig = z.output<typeof ConfigSchema>;
131
131
  declare function defineConfig<T extends DrzlConfigInput>(cfg: T): T;
132
132
  declare function loadConfig(customPath?: string): Promise<DrzlConfig | null>;
133
+ /** Absolute output dirs for all generators (to ignore in watcher). */
134
+ declare function computeGeneratorOutputDirs(cfg: DrzlConfig, cwd?: string): string[];
135
+ /** Resolve custom template directories (local path or installed package). */
136
+ declare function resolveTemplateDirsSync(cfg: DrzlConfig, cwd?: string): string[];
137
+ /** Build watch targets (exclude output dirs; watcher will ignore those). */
138
+ declare function computeWatchTargets(cfg: DrzlConfig, cwd?: string): string[];
133
139
 
134
- export { AnalyzerSchema, ConfigSchema, type DrzlConfig, type DrzlConfigInput, GeneratorSchema, NamingSchema, defineConfig, loadConfig };
140
+ export { AnalyzerSchema, ConfigSchema, type DrzlConfig, type DrzlConfigInput, GeneratorSchema, NamingSchema, computeGeneratorOutputDirs, computeWatchTargets, defineConfig, loadConfig, resolveTemplateDirsSync };
package/dist/config.js CHANGED
@@ -3,15 +3,21 @@ import {
3
3
  ConfigSchema,
4
4
  GeneratorSchema,
5
5
  NamingSchema,
6
+ computeGeneratorOutputDirs,
7
+ computeWatchTargets,
6
8
  defineConfig,
7
- loadConfig
8
- } from "./chunk-AWFAECUZ.js";
9
+ loadConfig,
10
+ resolveTemplateDirsSync
11
+ } from "./chunk-MEPFGJIF.js";
9
12
  export {
10
13
  AnalyzerSchema,
11
14
  ConfigSchema,
12
15
  GeneratorSchema,
13
16
  NamingSchema,
17
+ computeGeneratorOutputDirs,
18
+ computeWatchTargets,
14
19
  defineConfig,
15
- loadConfig
20
+ loadConfig,
21
+ resolveTemplateDirsSync
16
22
  };
17
23
  //# sourceMappingURL=config.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@drzl/cli",
3
- "version": "0.2.0",
3
+ "version": "0.3.1",
4
4
  "private": false,
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
@@ -29,12 +29,12 @@
29
29
  "cli-progress": "^3.12.0",
30
30
  "zod": "^4.1.5",
31
31
  "jiti": "^2.5.1",
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"
32
+ "@drzl/analyzer": "^0.3.0",
33
+ "@drzl/generator-orpc": "^0.4.0",
34
+ "@drzl/generator-zod": "^0.3.0",
35
+ "@drzl/generator-service": "^0.4.0",
36
+ "@drzl/generator-valibot": "^0.3.0",
37
+ "@drzl/generator-arktype": "^0.3.0"
38
38
  },
39
39
  "devDependencies": {
40
40
  "tsup": "^8.5.0",
@@ -1,105 +0,0 @@
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
@@ -1 +0,0 @@
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":[]}