@forinda/kickjs-cli 1.1.2 → 1.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.
- package/dist/cli.js +1303 -172
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +88 -67
- package/dist/index.js +1031 -68
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts","../src/commands/init.ts","../src/generators/project.ts","../src/utils/fs.ts","../src/commands/generate.ts","../src/generators/module.ts","../src/utils/naming.ts","../src/generators/templates/module-index.ts","../src/generators/templates/controller.ts","../src/generators/templates/constants.ts","../src/generators/templates/dtos.ts","../src/generators/templates/use-cases.ts","../src/generators/templates/repository.ts","../src/generators/templates/domain.ts","../src/generators/templates/tests.ts","../src/generators/adapter.ts","../src/generators/middleware.ts","../src/generators/guard.ts","../src/generators/service.ts","../src/generators/controller.ts","../src/generators/dto.ts","../src/generators/config.ts","../src/generators/resolver.ts","../src/generators/job.ts","../src/generators/scaffold.ts","../src/commands/run.ts","../src/utils/shell.ts","../src/config.ts","../src/commands/info.ts","../src/commands/custom.ts","../src/commands/inspect.ts","../src/commands/add.ts","../src/commands/tinker.ts"],"sourcesContent":["import { Command } from 'commander'\nimport { readFileSync } from 'node:fs'\nimport { dirname, join } from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport { registerInitCommand } from './commands/init'\nimport { registerGenerateCommand } from './commands/generate'\nimport { registerRunCommands } from './commands/run'\nimport { registerInfoCommand } from './commands/info'\nimport { registerCustomCommands } from './commands/custom'\nimport { registerInspectCommand } from './commands/inspect'\nimport { registerAddCommand } from './commands/add'\nimport { registerTinkerCommand } from './commands/tinker'\nimport { loadKickConfig } from './config'\n\nconst __dirname = dirname(fileURLToPath(import.meta.url))\nconst pkg = JSON.parse(readFileSync(join(__dirname, '..', 'package.json'), 'utf-8'))\n\nasync function main() {\n const program = new Command()\n\n program\n .name('kick')\n .description('KickJS — A production-grade, decorator-driven Node.js framework')\n .version(pkg.version)\n\n // Load project-level config for custom commands and generator defaults\n const config = await loadKickConfig(process.cwd())\n\n registerInitCommand(program)\n registerGenerateCommand(program)\n registerRunCommands(program)\n registerInfoCommand(program)\n registerInspectCommand(program)\n registerAddCommand(program)\n registerTinkerCommand(program)\n registerCustomCommands(program, config)\n\n program.showHelpAfterError()\n\n await program.parseAsync(process.argv)\n}\n\nmain().catch((err) => {\n console.error(err instanceof Error ? err.message : err)\n process.exitCode = 1\n})\n","import { resolve, basename } from 'node:path'\nimport { createInterface } from 'node:readline'\nimport { existsSync, readdirSync, rmSync } from 'node:fs'\nimport type { Command } from 'commander'\nimport { initProject } from '../generators/project'\n\nfunction ask(question: string, defaultValue?: string): Promise<string> {\n const rl = createInterface({ input: process.stdin, output: process.stdout })\n const suffix = defaultValue ? ` (${defaultValue})` : ''\n return new Promise((res) => {\n rl.question(` ${question}${suffix}: `, (answer) => {\n rl.close()\n res(answer.trim() || defaultValue || '')\n })\n })\n}\n\nasync function choose(question: string, options: string[], defaultIdx = 0): Promise<string> {\n console.log(` ${question}`)\n for (let i = 0; i < options.length; i++) {\n const marker = i === defaultIdx ? '>' : ' '\n console.log(` ${marker} ${i + 1}. ${options[i]}`)\n }\n const answer = await ask('Choose', String(defaultIdx + 1))\n const idx = parseInt(answer, 10) - 1\n return options[idx] ?? options[defaultIdx]\n}\n\nasync function confirm(question: string, defaultYes = true): Promise<boolean> {\n const hint = defaultYes ? 'Y/n' : 'y/N'\n const answer = await ask(`${question} (${hint})`)\n if (!answer) return defaultYes\n return answer.toLowerCase().startsWith('y')\n}\n\nexport function registerInitCommand(program: Command): void {\n program\n .command('new [name]')\n .alias('init')\n .description('Create a new KickJS project (use \".\" for current directory)')\n .option('-d, --directory <dir>', 'Target directory (defaults to project name)')\n .option('--pm <manager>', 'Package manager: pnpm | npm | yarn')\n .option('--git', 'Initialize git repository')\n .option('--no-git', 'Skip git initialization')\n .option('--install', 'Install dependencies after scaffolding')\n .option('--no-install', 'Skip dependency installation')\n .option('-f, --force', 'Remove existing files without prompting')\n .option(\n '-t, --template <type>',\n 'Project template: rest | graphql | ddd | microservice | minimal',\n )\n .action(async (name: string | undefined, opts: any) => {\n console.log()\n\n // Resolve project name — support \".\" for current directory\n if (!name) {\n name = await ask('Project name', 'my-api')\n }\n\n let directory: string\n if (name === '.') {\n directory = resolve('.')\n name = basename(directory)\n } else {\n directory = resolve(opts.directory || name)\n }\n\n // Check if target directory exists and is non-empty\n if (existsSync(directory)) {\n const entries = readdirSync(directory)\n if (entries.length > 0) {\n if (opts.force) {\n console.log(` Clearing existing files in ${directory}...\\n`)\n } else {\n console.log(` Directory \"${name}\" is not empty:`)\n const shown = entries.slice(0, 5)\n for (const entry of shown) {\n console.log(` - ${entry}`)\n }\n if (entries.length > 5) {\n console.log(` ... and ${entries.length - 5} more`)\n }\n console.log()\n const shouldClear = await confirm('Remove all existing files and proceed?', false)\n if (!shouldClear) {\n console.log(' Aborted.\\n')\n return\n }\n }\n // Remove contents but keep the directory itself\n for (const entry of entries) {\n rmSync(resolve(directory, entry), { recursive: true, force: true })\n }\n }\n }\n\n // Template — prompt if not provided via --template\n let template = opts.template\n if (!template) {\n template = await choose(\n 'Project template:',\n [\n 'REST API (Express + Swagger)',\n 'GraphQL API (GraphQL + GraphiQL)',\n 'DDD (Domain-Driven Design modules)',\n 'Microservice (REST + Queue worker)',\n 'Minimal (bare Express)',\n ],\n 0,\n )\n // Map display names to config values\n const templateMap: Record<string, string> = {\n 'REST API (Express + Swagger)': 'rest',\n 'GraphQL API (GraphQL + GraphiQL)': 'graphql',\n 'DDD (Domain-Driven Design modules)': 'ddd',\n 'Microservice (REST + Queue worker)': 'microservice',\n 'Minimal (bare Express)': 'minimal',\n }\n template = templateMap[template] ?? 'rest'\n }\n\n // Package manager — prompt if not provided via --pm\n let packageManager = opts.pm\n if (!packageManager) {\n packageManager = await choose('Package manager:', ['pnpm', 'npm', 'yarn'], 0)\n }\n\n // Git init — prompt if not explicitly set\n let initGit: boolean\n if (opts.git === undefined) {\n initGit = await confirm('Initialize git repository?', true)\n } else {\n initGit = opts.git\n }\n\n // Install deps — prompt if not explicitly set\n let installDeps: boolean\n if (opts.install === undefined) {\n installDeps = await confirm('Install dependencies?', true)\n } else {\n installDeps = opts.install\n }\n\n await initProject({\n name,\n directory,\n packageManager,\n initGit,\n installDeps,\n template,\n })\n })\n}\n","import { join, dirname } from 'node:path'\nimport { execSync } from 'node:child_process'\nimport { readFileSync } from 'node:fs'\nimport { fileURLToPath } from 'node:url'\nimport { writeFileSafe } from '../utils/fs'\n\nconst __dirname = dirname(fileURLToPath(import.meta.url))\nconst cliPkg = JSON.parse(readFileSync(join(__dirname, '..', 'package.json'), 'utf-8'))\nconst KICKJS_VERSION = `^${cliPkg.version}`\n\ntype ProjectTemplate = 'rest' | 'graphql' | 'ddd' | 'microservice' | 'minimal'\n\ninterface InitProjectOptions {\n name: string\n directory: string\n packageManager?: 'pnpm' | 'npm' | 'yarn'\n initGit?: boolean\n installDeps?: boolean\n template?: ProjectTemplate\n}\n\n/** Scaffold a new KickJS project */\nexport async function initProject(options: InitProjectOptions): Promise<void> {\n const { name, directory, packageManager = 'pnpm', template = 'rest' } = options\n const dir = directory\n\n console.log(`\\n Creating KickJS project: ${name}\\n`)\n\n // ── package.json — template-aware deps ────────────────────────────\n const baseDeps: Record<string, string> = {\n '@forinda/kickjs-core': KICKJS_VERSION,\n '@forinda/kickjs-http': KICKJS_VERSION,\n '@forinda/kickjs-config': KICKJS_VERSION,\n express: '^5.1.0',\n 'reflect-metadata': '^0.2.2',\n zod: '^4.3.6',\n pino: '^10.3.1',\n 'pino-pretty': '^13.1.3',\n }\n\n // Add template-specific deps\n if (template !== 'minimal') {\n baseDeps['@forinda/kickjs-swagger'] = KICKJS_VERSION\n }\n if (template === 'graphql') {\n baseDeps['@forinda/kickjs-graphql'] = KICKJS_VERSION\n baseDeps['graphql'] = '^16.11.0'\n }\n if (template === 'microservice') {\n baseDeps['@forinda/kickjs-queue'] = KICKJS_VERSION\n baseDeps['@forinda/kickjs-otel'] = KICKJS_VERSION\n }\n if (template === 'ddd') {\n baseDeps['@forinda/kickjs-swagger'] = KICKJS_VERSION\n }\n\n await writeFileSafe(\n join(dir, 'package.json'),\n JSON.stringify(\n {\n name,\n version: cliPkg.version,\n type: 'module',\n scripts: {\n dev: 'kick dev',\n 'dev:debug': 'kick dev:debug',\n build: 'kick build',\n start: 'kick start',\n test: 'vitest run',\n 'test:watch': 'vitest',\n typecheck: 'tsc --noEmit',\n lint: 'eslint src/',\n format: 'prettier --write src/',\n },\n dependencies: baseDeps,\n devDependencies: {\n '@forinda/kickjs-cli': KICKJS_VERSION,\n '@swc/core': '^1.7.28',\n '@types/express': '^5.0.6',\n '@types/node': '^24.5.2',\n 'unplugin-swc': '^1.5.9',\n vite: '^7.3.1',\n 'vite-node': '^5.3.0',\n vitest: '^3.2.4',\n typescript: '^5.9.2',\n prettier: '^3.8.1',\n },\n },\n null,\n 2,\n ),\n )\n\n // ── vite.config.ts — enables HMR + SWC for decorators ──────────────\n await writeFileSafe(\n join(dir, 'vite.config.ts'),\n `import { defineConfig } from 'vite'\nimport { resolve } from 'path'\nimport swc from 'unplugin-swc'\n\nexport default defineConfig({\n plugins: [swc.vite()],\n resolve: {\n alias: {\n '@': resolve(__dirname, 'src'),\n },\n },\n server: {\n watch: { usePolling: false },\n hmr: true,\n },\n build: {\n target: 'node20',\n ssr: true,\n outDir: 'dist',\n sourcemap: true,\n rollupOptions: {\n input: resolve(__dirname, 'src/index.ts'),\n output: { format: 'esm' },\n },\n },\n})\n`,\n )\n\n // ── tsconfig.json ───────────────────────────────────────────────────\n await writeFileSafe(\n join(dir, 'tsconfig.json'),\n JSON.stringify(\n {\n compilerOptions: {\n target: 'ES2022',\n module: 'ESNext',\n moduleResolution: 'bundler',\n lib: ['ES2022'],\n types: ['node'],\n strict: true,\n esModuleInterop: true,\n skipLibCheck: true,\n sourceMap: true,\n declaration: true,\n experimentalDecorators: true,\n emitDecoratorMetadata: true,\n outDir: 'dist',\n rootDir: 'src',\n paths: { '@/*': ['./src/*'] },\n },\n include: ['src'],\n },\n null,\n 2,\n ),\n )\n\n // ── .prettierrc ─────────────────────────────────────────────────────\n await writeFileSafe(\n join(dir, '.prettierrc'),\n JSON.stringify(\n {\n semi: false,\n singleQuote: true,\n trailingComma: 'all',\n printWidth: 100,\n tabWidth: 2,\n },\n null,\n 2,\n ),\n )\n\n // ── .gitignore ──────────────────────────────────────────────────────\n await writeFileSafe(\n join(dir, '.gitignore'),\n `node_modules/\ndist/\n.env\ncoverage/\n.DS_Store\n*.tsbuildinfo\n`,\n )\n\n // ── .env ────────────────────────────────────────────────────────────\n await writeFileSafe(\n join(dir, '.env'),\n `PORT=3000\nNODE_ENV=development\n`,\n )\n\n await writeFileSafe(\n join(dir, '.env.example'),\n `PORT=3000\nNODE_ENV=development\n`,\n )\n\n // ── src/index.ts — template-aware entry point ─────────────────────\n await writeFileSafe(join(dir, 'src/index.ts'), getEntryFile(name, template))\n\n // ── src/modules/index.ts ────────────────────────────────────────────\n await writeFileSafe(\n join(dir, 'src/modules/index.ts'),\n `import type { AppModuleClass } from '@forinda/kickjs-core'\n\nexport const modules: AppModuleClass[] = []\n`,\n )\n\n // ── Template-specific files ─────────────────────────────────────────\n if (template === 'graphql') {\n await writeFileSafe(join(dir, 'src/resolvers/.gitkeep'), '')\n }\n\n // ── kick.config.ts — CLI configuration ─────────────────────────────\n await writeFileSafe(\n join(dir, 'kick.config.ts'),\n `import { defineConfig } from '@forinda/kickjs-cli'\n\nexport default defineConfig({\n pattern: '${template}',\n modulesDir: 'src/modules',\n defaultRepo: 'inmemory',\n\n commands: [\n {\n name: 'test',\n description: 'Run tests with Vitest',\n steps: 'npx vitest run',\n },\n {\n name: 'format',\n description: 'Format code with Prettier',\n steps: 'npx prettier --write src/',\n },\n {\n name: 'format:check',\n description: 'Check formatting without writing',\n steps: 'npx prettier --check src/',\n },\n {\n name: 'check',\n description: 'Run typecheck + format check',\n steps: ['npx tsc --noEmit', 'npx prettier --check src/'],\n aliases: ['verify', 'ci'],\n },\n ],\n})\n`,\n )\n\n // ── vitest.config.ts ────────────────────────────────────────────────\n await writeFileSafe(\n join(dir, 'vitest.config.ts'),\n `import { defineConfig } from 'vitest/config'\nimport swc from 'unplugin-swc'\n\nexport default defineConfig({\n plugins: [swc.vite()],\n test: {\n globals: true,\n environment: 'node',\n include: ['src/**/*.test.ts'],\n },\n})\n`,\n )\n\n // ── Git Init ─────────────────────────────────────────────────────────\n if (options.initGit) {\n try {\n execSync('git init', { cwd: dir, stdio: 'pipe' })\n execSync('git add -A', { cwd: dir, stdio: 'pipe' })\n execSync('git commit -m \"chore: initial commit from kick new\"', {\n cwd: dir,\n stdio: 'pipe',\n })\n console.log(' Git repository initialized')\n } catch {\n console.log(' Warning: git init failed (git may not be installed)')\n }\n }\n\n // ── Install Dependencies ────────────────────────────────────────────\n if (options.installDeps) {\n console.log(`\\n Installing dependencies with ${packageManager}...\\n`)\n try {\n execSync(`${packageManager} install`, { cwd: dir, stdio: 'inherit' })\n console.log('\\n Dependencies installed successfully!')\n } catch {\n console.log(`\\n Warning: ${packageManager} install failed. Run it manually.`)\n }\n }\n\n console.log('\\n Project scaffolded successfully!')\n console.log()\n\n const needsCd = dir !== process.cwd()\n console.log(' Next steps:')\n if (needsCd) console.log(` cd ${name}`)\n if (!options.installDeps) console.log(` ${packageManager} install`)\n\n const genHint: Record<string, string> = {\n rest: 'kick g module user',\n graphql: 'kick g resolver user',\n ddd: 'kick g module user --repo drizzle',\n microservice: 'kick g module user && kick g job email',\n minimal: '# add your routes to src/index.ts',\n }\n console.log(` ${genHint[template] ?? genHint.rest}`)\n console.log(' kick dev')\n console.log()\n console.log(' Commands:')\n console.log(' kick dev Start dev server with Vite HMR')\n console.log(' kick build Production build via Vite')\n console.log(' kick start Run production build')\n console.log(` kick g module X Generate a DDD module`)\n if (template === 'graphql') console.log(' kick g resolver X Generate a GraphQL resolver')\n if (template === 'microservice')\n console.log(' kick g job X Generate a queue job processor')\n console.log()\n}\n\n// ── Entry file templates ─────────────────────────────────────────────────\n\nfunction getEntryFile(name: string, template: ProjectTemplate): string {\n switch (template) {\n case 'graphql':\n return `import 'reflect-metadata'\nimport { bootstrap } from '@forinda/kickjs-http'\nimport { DevToolsAdapter } from '@forinda/kickjs-devtools'\nimport { GraphQLAdapter } from '@forinda/kickjs-graphql'\nimport { modules } from './modules'\n\n// Import your resolvers here\n// import { UserResolver } from './resolvers/user.resolver'\n\nbootstrap({\n modules,\n adapters: [\n new DevToolsAdapter(),\n new GraphQLAdapter({\n resolvers: [/* UserResolver */],\n // Add custom type definitions here:\n // typeDefs: userTypeDefs,\n }),\n ],\n})\n`\n\n case 'microservice':\n return `import 'reflect-metadata'\nimport { bootstrap } from '@forinda/kickjs-http'\nimport { DevToolsAdapter } from '@forinda/kickjs-devtools'\nimport { SwaggerAdapter } from '@forinda/kickjs-swagger'\nimport { OtelAdapter } from '@forinda/kickjs-otel'\n// import { QueueAdapter, BullMQProvider } from '@forinda/kickjs-queue'\nimport { modules } from './modules'\n\nbootstrap({\n modules,\n adapters: [\n new OtelAdapter({ serviceName: '${name}' }),\n new DevToolsAdapter(),\n new SwaggerAdapter({\n info: { title: '${name}', version: '${cliPkg.version}' },\n }),\n // Uncomment when Redis is available:\n // new QueueAdapter({\n // provider: new BullMQProvider({ host: 'localhost', port: 6379 }),\n // }),\n ],\n})\n`\n\n case 'minimal':\n return `import 'reflect-metadata'\nimport { bootstrap } from '@forinda/kickjs-http'\nimport { modules } from './modules'\n\nbootstrap({ modules })\n`\n\n case 'ddd':\n case 'rest':\n default:\n return `import 'reflect-metadata'\nimport { bootstrap } from '@forinda/kickjs-http'\nimport { DevToolsAdapter } from '@forinda/kickjs-devtools'\nimport { SwaggerAdapter } from '@forinda/kickjs-swagger'\nimport { modules } from './modules'\n\nbootstrap({\n modules,\n adapters: [\n new DevToolsAdapter(),\n new SwaggerAdapter({\n info: { title: '${name}', version: '${cliPkg.version}' },\n }),\n ],\n})\n`\n }\n}\n","import { writeFile, mkdir, access, readFile } from 'node:fs/promises'\nimport { dirname } from 'node:path'\n\n/** Write a file, creating parent directories if needed */\nexport async function writeFileSafe(filePath: string, content: string): Promise<void> {\n await mkdir(dirname(filePath), { recursive: true })\n await writeFile(filePath, content, 'utf-8')\n}\n\n/** Ensure a directory exists */\nexport async function ensureDirectory(dir: string): Promise<void> {\n await mkdir(dir, { recursive: true })\n}\n\n/** Check if a file exists */\nexport async function fileExists(filePath: string): Promise<boolean> {\n try {\n await access(filePath)\n return true\n } catch {\n return false\n }\n}\n\n/** Read a JSON file */\nexport async function readJsonFile<T = any>(filePath: string): Promise<T> {\n const content = await readFile(filePath, 'utf-8')\n return JSON.parse(content)\n}\n","import { resolve } from 'node:path'\nimport type { Command } from 'commander'\nimport { generateModule } from '../generators/module'\nimport { generateAdapter } from '../generators/adapter'\nimport { generateMiddleware } from '../generators/middleware'\nimport { generateGuard } from '../generators/guard'\nimport { generateService } from '../generators/service'\nimport { generateController } from '../generators/controller'\nimport { generateDto } from '../generators/dto'\nimport { generateConfig } from '../generators/config'\nimport { generateResolver } from '../generators/resolver'\nimport { generateJob } from '../generators/job'\nimport { generateScaffold, parseFields } from '../generators/scaffold'\n\nfunction printGenerated(files: string[]): void {\n const cwd = process.cwd()\n console.log(`\\n Generated ${files.length} file${files.length === 1 ? '' : 's'}:`)\n for (const f of files) {\n console.log(` ${f.replace(cwd + '/', '')}`)\n }\n console.log()\n}\n\nexport function registerGenerateCommand(program: Command): void {\n const gen = program.command('generate').alias('g').description('Generate code scaffolds')\n\n // ── kick g module <name> ────────────────────────────────────────────\n gen\n .command('module <name>')\n .description('Generate a full DDD module with all layers')\n .option('--no-entity', 'Skip entity and value object generation')\n .option('--no-tests', 'Skip test file generation')\n .option('--repo <type>', 'Repository implementation: inmemory | drizzle', 'inmemory')\n .option('--minimal', 'Only generate index.ts and controller')\n .option('--modules-dir <dir>', 'Modules directory', 'src/modules')\n .action(async (name: string, opts: any) => {\n const files = await generateModule({\n name,\n modulesDir: resolve(opts.modulesDir),\n noEntity: opts.entity === false,\n noTests: opts.tests === false,\n repo: opts.repo,\n minimal: opts.minimal,\n })\n printGenerated(files)\n })\n\n // ── kick g adapter <name> ──────────────────────────────────────────\n gen\n .command('adapter <name>')\n .description('Generate an AppAdapter with lifecycle hooks and middleware support')\n .option('-o, --out <dir>', 'Output directory', 'src/adapters')\n .action(async (name: string, opts: any) => {\n const files = await generateAdapter({ name, outDir: resolve(opts.out) })\n printGenerated(files)\n })\n\n // ── kick g middleware <name> ────────────────────────────────────────\n gen\n .command('middleware <name>')\n .description('Generate an Express middleware function')\n .option('-o, --out <dir>', 'Output directory', 'src/middleware')\n .action(async (name: string, opts: any) => {\n const files = await generateMiddleware({ name, outDir: resolve(opts.out) })\n printGenerated(files)\n })\n\n // ── kick g guard <name> ────────────────────────────────────────────\n gen\n .command('guard <name>')\n .description('Generate a route guard (auth, roles, etc.)')\n .option('-o, --out <dir>', 'Output directory', 'src/guards')\n .action(async (name: string, opts: any) => {\n const files = await generateGuard({ name, outDir: resolve(opts.out) })\n printGenerated(files)\n })\n\n // ── kick g service <name> ──────────────────────────────────────────\n gen\n .command('service <name>')\n .description('Generate a @Service() class')\n .option('-o, --out <dir>', 'Output directory', 'src/services')\n .action(async (name: string, opts: any) => {\n const files = await generateService({ name, outDir: resolve(opts.out) })\n printGenerated(files)\n })\n\n // ── kick g controller <name> ───────────────────────────────────────\n gen\n .command('controller <name>')\n .description('Generate a @Controller() class with basic routes')\n .option('-o, --out <dir>', 'Output directory', 'src/controllers')\n .action(async (name: string, opts: any) => {\n const files = await generateController({ name, outDir: resolve(opts.out) })\n printGenerated(files)\n })\n\n // ── kick g dto <name> ──────────────────────────────────────────────\n gen\n .command('dto <name>')\n .description('Generate a Zod DTO schema')\n .option('-o, --out <dir>', 'Output directory', 'src/dtos')\n .action(async (name: string, opts: any) => {\n const files = await generateDto({ name, outDir: resolve(opts.out) })\n printGenerated(files)\n })\n\n // ── kick g resolver <name> ────────────────────────────────────────────\n gen\n .command('resolver <name>')\n .description('Generate a GraphQL @Resolver class with @Query and @Mutation methods')\n .option('-o, --out <dir>', 'Output directory', 'src/resolvers')\n .action(async (name: string, opts: any) => {\n const files = await generateResolver({ name, outDir: resolve(opts.out) })\n printGenerated(files)\n })\n\n // ── kick g job <name> ────────────────────────────────────────────────\n gen\n .command('job <name>')\n .description('Generate a @Job queue processor with @Process handlers')\n .option('-o, --out <dir>', 'Output directory', 'src/jobs')\n .option('-q, --queue <name>', 'Queue name (default: <name>-queue)')\n .action(async (name: string, opts: any) => {\n const files = await generateJob({ name, outDir: resolve(opts.out), queue: opts.queue })\n printGenerated(files)\n })\n\n // ── kick g scaffold <name> <fields...> ─────────────────────────────\n gen\n .command('scaffold <name> [fields...]')\n .description(\n 'Generate a full CRUD module from field definitions\\n' +\n ' Example: kick g scaffold Post title:string body:text published:boolean?\\n' +\n ' Types: string, text, number, int, float, boolean, date, email, url, uuid, json, enum:a,b,c\\n' +\n ' Append ? for optional fields: description:text?',\n )\n .option('--no-entity', 'Skip entity and value object generation')\n .option('--no-tests', 'Skip test file generation')\n .option('--modules-dir <dir>', 'Modules directory', 'src/modules')\n .action(async (name: string, rawFields: string[], opts: any) => {\n if (rawFields.length === 0) {\n console.error(\n '\\n Error: At least one field is required.\\n' +\n ' Usage: kick g scaffold <name> <field:type> [field:type...]\\n' +\n ' Example: kick g scaffold Post title:string body:text published:boolean\\n',\n )\n process.exit(1)\n }\n const fields = parseFields(rawFields)\n const files = await generateScaffold({\n name,\n fields,\n modulesDir: resolve(opts.modulesDir),\n noEntity: opts.entity === false,\n noTests: opts.tests === false,\n })\n console.log(`\\n Scaffolded ${name} with ${fields.length} field(s):`)\n for (const f of fields) {\n console.log(` ${f.name}: ${f.type}${f.optional ? ' (optional)' : ''}`)\n }\n printGenerated(files)\n })\n\n // ── kick g config ────────────────────────────────────────────────────\n gen\n .command('config')\n .description('Generate a kick.config.ts at the project root')\n .option('--modules-dir <dir>', 'Modules directory path', 'src/modules')\n .option('--repo <type>', 'Default repository type: inmemory | drizzle', 'inmemory')\n .option('-f, --force', 'Overwrite existing kick.config.ts without prompting')\n .action(async (opts: any) => {\n const files = await generateConfig({\n outDir: resolve('.'),\n modulesDir: opts.modulesDir,\n defaultRepo: opts.repo,\n force: opts.force,\n })\n printGenerated(files)\n })\n}\n","import { join } from 'node:path'\nimport { writeFileSafe, fileExists } from '../utils/fs'\nimport { toPascalCase, toKebabCase, toCamelCase, pluralize, pluralizePascal } from '../utils/naming'\nimport { readFile, writeFile } from 'node:fs/promises'\nimport {\n generateModuleIndex,\n generateController,\n generateConstants,\n generateCreateDTO,\n generateUpdateDTO,\n generateResponseDTO,\n generateUseCases,\n generateRepositoryInterface,\n generateInMemoryRepository,\n generateDomainService,\n generateEntity,\n generateValueObject,\n generateControllerTest,\n generateRepositoryTest,\n} from './templates'\n\ninterface GenerateModuleOptions {\n name: string\n modulesDir: string\n noEntity?: boolean\n noTests?: boolean\n repo?: 'drizzle' | 'inmemory'\n minimal?: boolean\n}\n\n/**\n * Generate a full DDD module with all layers:\n * presentation/ — controller\n * application/ — use-cases, DTOs\n * domain/ — entity, value objects, repository interface, domain service\n * infrastructure/ — repository implementation\n */\nexport async function generateModule(options: GenerateModuleOptions): Promise<string[]> {\n const { name, modulesDir, noEntity, noTests, repo = 'inmemory', minimal } = options\n const kebab = toKebabCase(name)\n const pascal = toPascalCase(name)\n const camel = toCamelCase(name)\n const plural = pluralize(kebab)\n const pluralPascal = pluralizePascal(pascal)\n const moduleDir = join(modulesDir, plural)\n\n const files: string[] = []\n\n const write = async (relativePath: string, content: string) => {\n const fullPath = join(moduleDir, relativePath)\n await writeFileSafe(fullPath, content)\n files.push(fullPath)\n }\n\n // ── Module Index ────────────────────────────────────────────────────\n await write('index.ts', generateModuleIndex(pascal, kebab, plural, repo))\n\n // ── Constants ──────────────────────────────────────────────────────\n await write('constants.ts', generateConstants(pascal))\n\n // ── Controller ──────────────────────────────────────────────────────\n await write(\n `presentation/${kebab}.controller.ts`,\n generateController(pascal, kebab, plural, pluralPascal),\n )\n\n // ── DTOs ────────────────────────────────────────────────────────────\n await write(`application/dtos/create-${kebab}.dto.ts`, generateCreateDTO(pascal, kebab))\n await write(`application/dtos/update-${kebab}.dto.ts`, generateUpdateDTO(pascal, kebab))\n await write(`application/dtos/${kebab}-response.dto.ts`, generateResponseDTO(pascal, kebab))\n\n // ── Use Cases ───────────────────────────────────────────────────────\n const useCases = generateUseCases(pascal, kebab, plural, pluralPascal)\n for (const uc of useCases) {\n await write(`application/use-cases/${uc.file}`, uc.content)\n }\n\n // ── Domain: Repository Interface ────────────────────────────────────\n await write(\n `domain/repositories/${kebab}.repository.ts`,\n generateRepositoryInterface(pascal, kebab),\n )\n\n // ── Domain: Service ─────────────────────────────────────────────────\n await write(`domain/services/${kebab}-domain.service.ts`, generateDomainService(pascal, kebab))\n\n // ── Infrastructure: Repository Implementation ──────────────────────\n if (repo === 'inmemory') {\n await write(\n `infrastructure/repositories/in-memory-${kebab}.repository.ts`,\n generateInMemoryRepository(pascal, kebab),\n )\n }\n\n // ── Entity & Value Objects ──────────────────────────────────────────\n if (!noEntity && !minimal) {\n await write(`domain/entities/${kebab}.entity.ts`, generateEntity(pascal, kebab))\n await write(`domain/value-objects/${kebab}-id.vo.ts`, generateValueObject(pascal, kebab))\n }\n\n // ── Tests ──────────────────────────────────────────────────────────\n if (!noTests) {\n await write(\n `__tests__/${kebab}.controller.test.ts`,\n generateControllerTest(pascal, kebab, plural),\n )\n await write(\n `__tests__/${kebab}.repository.test.ts`,\n generateRepositoryTest(pascal, kebab, plural),\n )\n }\n\n // ── Auto-register in modules index ──────────────────────────────────\n await autoRegisterModule(modulesDir, pascal, plural)\n\n return files\n}\n\n/** Add the new module to src/modules/index.ts */\nasync function autoRegisterModule(\n modulesDir: string,\n pascal: string,\n plural: string,\n): Promise<void> {\n const indexPath = join(modulesDir, 'index.ts')\n const exists = await fileExists(indexPath)\n\n if (!exists) {\n await writeFileSafe(\n indexPath,\n `import type { AppModuleClass } from '@forinda/kickjs-core'\nimport { ${pascal}Module } from './${plural}'\n\nexport const modules: AppModuleClass[] = [${pascal}Module]\n`,\n )\n return\n }\n\n let content = await readFile(indexPath, 'utf-8')\n\n // Add import if not present\n const importLine = `import { ${pascal}Module } from './${plural}'`\n if (!content.includes(`${pascal}Module`)) {\n // Insert import after last existing import\n const lastImportIdx = content.lastIndexOf('import ')\n if (lastImportIdx !== -1) {\n const lineEnd = content.indexOf('\\n', lastImportIdx)\n content = content.slice(0, lineEnd + 1) + importLine + '\\n' + content.slice(lineEnd + 1)\n } else {\n content = importLine + '\\n' + content\n }\n\n // Add to modules array — handle both empty and existing entries\n // Match the array assignment: `= [...]` or `= [\\n...\\n]`\n content = content.replace(/(=\\s*\\[)([\\s\\S]*?)(])/, (_match, open, existing, close) => {\n const trimmed = existing.trim()\n if (!trimmed) {\n // Empty array: `= []`\n return `${open}${pascal}Module${close}`\n }\n // Existing entries: append with comma\n const needsComma = trimmed.endsWith(',') ? '' : ','\n return `${open}${existing.trimEnd()}${needsComma} ${pascal}Module${close}`\n })\n }\n\n await writeFile(indexPath, content, 'utf-8')\n}\n","/** Convert a name to PascalCase */\nexport function toPascalCase(name: string): string {\n return name\n .replace(/[-_\\s]+(.)?/g, (_, c) => (c ? c.toUpperCase() : ''))\n .replace(/^(.)/, (c) => c.toUpperCase())\n}\n\n/** Convert a name to camelCase */\nexport function toCamelCase(name: string): string {\n const pascal = toPascalCase(name)\n return pascal.charAt(0).toLowerCase() + pascal.slice(1)\n}\n\n/** Convert a name to kebab-case */\nexport function toKebabCase(name: string): string {\n return name\n .replace(/([a-z])([A-Z])/g, '$1-$2')\n .replace(/[\\s_]+/g, '-')\n .toLowerCase()\n}\n\n/**\n * Pluralize a kebab-case name for directory/file names.\n * If already plural (ends in 's'), returns as-is.\n */\nexport function pluralize(name: string): string {\n if (name.endsWith('s')) return name\n if (name.endsWith('x') || name.endsWith('z')) return name + 'es'\n if (name.endsWith('sh') || name.endsWith('ch')) return name + 'es'\n if (name.endsWith('y') && !/[aeiou]y$/.test(name)) return name.slice(0, -1) + 'ies'\n return name + 's'\n}\n\n/**\n * Pluralize a PascalCase name for class identifiers.\n * If already plural (ends in 's'), returns as-is.\n * Used for `List${pluralPascal}UseCase` to avoid `ListUserssUseCase`.\n */\nexport function pluralizePascal(name: string): string {\n if (name.endsWith('s')) return name\n if (name.endsWith('x') || name.endsWith('z')) return name + 'es'\n if (name.endsWith('sh') || name.endsWith('ch')) return name + 'es'\n if (name.endsWith('y') && !/[aeiou]y$/i.test(name)) return name.slice(0, -1) + 'ies'\n return name + 's'\n}\n","export function generateModuleIndex(\n pascal: string,\n kebab: string,\n plural: string,\n repo: 'drizzle' | 'inmemory',\n): string {\n const repoClass =\n repo === 'inmemory' ? `InMemory${pascal}Repository` : `Drizzle${pascal}Repository`\n const repoFile = repo === 'inmemory' ? `in-memory-${kebab}` : `drizzle-${kebab}`\n\n return `/**\n * ${pascal} Module\n *\n * Self-contained feature module following Domain-Driven Design (DDD).\n * Registers dependencies in the DI container and declares HTTP routes.\n *\n * Structure:\n * presentation/ — HTTP controllers (entry points)\n * application/ — Use cases (orchestration) and DTOs (validation)\n * domain/ — Entities, value objects, repository interfaces, domain services\n * infrastructure/ — Repository implementations (in-memory, Drizzle, Prisma, etc.)\n */\nimport { Container, type AppModule, type ModuleRoutes } from '@forinda/kickjs-core'\nimport { buildRoutes } from '@forinda/kickjs-http'\nimport { ${pascal.toUpperCase()}_REPOSITORY } from './domain/repositories/${kebab}.repository'\nimport { ${repoClass} } from './infrastructure/repositories/${repoFile}.repository'\nimport { ${pascal}Controller } from './presentation/${kebab}.controller'\n\n// Eagerly load decorated classes so @Service()/@Repository() decorators register in the DI container\nimport.meta.glob(\n ['./domain/services/**/*.ts', './application/use-cases/**/*.ts', '!./**/*.test.ts'],\n { eager: true },\n)\n\nexport class ${pascal}Module implements AppModule {\n /**\n * Register module dependencies in the DI container.\n * Bind repository interface tokens to their implementations here.\n * To swap implementations (e.g. in-memory -> Drizzle), change the factory target.\n */\n register(container: Container): void {\n container.registerFactory(${pascal.toUpperCase()}_REPOSITORY, () =>\n container.resolve(${repoClass}),\n )\n }\n\n /**\n * Declare HTTP routes for this module.\n * The path is prefixed with the global apiPrefix and version (e.g. /api/v1/${plural}).\n * Passing 'controller' enables automatic OpenAPI spec generation via SwaggerAdapter.\n */\n routes(): ModuleRoutes {\n return {\n path: '/${plural}',\n router: buildRoutes(${pascal}Controller),\n controller: ${pascal}Controller,\n }\n }\n}\n`\n}\n","export function generateController(\n pascal: string,\n kebab: string,\n plural: string,\n pluralPascal: string,\n): string {\n return `import { Controller, Get, Post, Put, Delete, Autowired, ApiQueryParams } from '@forinda/kickjs-core'\nimport type { RequestContext } from '@forinda/kickjs-http'\nimport { ApiTags } from '@forinda/kickjs-swagger'\nimport { Create${pascal}UseCase } from '../application/use-cases/create-${kebab}.use-case'\nimport { Get${pascal}UseCase } from '../application/use-cases/get-${kebab}.use-case'\nimport { List${pluralPascal}UseCase } from '../application/use-cases/list-${plural}.use-case'\nimport { Update${pascal}UseCase } from '../application/use-cases/update-${kebab}.use-case'\nimport { Delete${pascal}UseCase } from '../application/use-cases/delete-${kebab}.use-case'\nimport { create${pascal}Schema } from '../application/dtos/create-${kebab}.dto'\nimport { update${pascal}Schema } from '../application/dtos/update-${kebab}.dto'\nimport { ${pascal.toUpperCase()}_QUERY_CONFIG } from '../constants'\n\n@Controller()\nexport class ${pascal}Controller {\n @Autowired() private create${pascal}UseCase!: Create${pascal}UseCase\n @Autowired() private get${pascal}UseCase!: Get${pascal}UseCase\n @Autowired() private list${pluralPascal}UseCase!: List${pluralPascal}UseCase\n @Autowired() private update${pascal}UseCase!: Update${pascal}UseCase\n @Autowired() private delete${pascal}UseCase!: Delete${pascal}UseCase\n\n @Get('/')\n @ApiTags('${pascal}')\n @ApiQueryParams(${pascal.toUpperCase()}_QUERY_CONFIG)\n async list(ctx: RequestContext) {\n return ctx.paginate(\n (parsed) => this.list${pluralPascal}UseCase.execute(parsed),\n ${pascal.toUpperCase()}_QUERY_CONFIG,\n )\n }\n\n @Get('/:id')\n @ApiTags('${pascal}')\n async getById(ctx: RequestContext) {\n const result = await this.get${pascal}UseCase.execute(ctx.params.id)\n if (!result) return ctx.notFound('${pascal} not found')\n ctx.json(result)\n }\n\n @Post('/', { body: create${pascal}Schema, name: 'Create${pascal}' })\n @ApiTags('${pascal}')\n async create(ctx: RequestContext) {\n const result = await this.create${pascal}UseCase.execute(ctx.body)\n ctx.created(result)\n }\n\n @Put('/:id', { body: update${pascal}Schema, name: 'Update${pascal}' })\n @ApiTags('${pascal}')\n async update(ctx: RequestContext) {\n const result = await this.update${pascal}UseCase.execute(ctx.params.id, ctx.body)\n ctx.json(result)\n }\n\n @Delete('/:id')\n @ApiTags('${pascal}')\n async remove(ctx: RequestContext) {\n await this.delete${pascal}UseCase.execute(ctx.params.id)\n ctx.noContent()\n }\n}\n`\n}\n","export function generateConstants(pascal: string): string {\n return `import type { QueryParamsConfig } from '@forinda/kickjs-core'\n\nexport const ${pascal.toUpperCase()}_QUERY_CONFIG: QueryParamsConfig = {\n filterable: ['name'],\n sortable: ['name', 'createdAt'],\n searchable: ['name'],\n}\n`\n}\n","export function generateCreateDTO(pascal: string, kebab: string): string {\n return `import { z } from 'zod'\n\n/**\n * Create ${pascal} DTO — Zod schema for validating POST request bodies.\n * This schema is passed to @Post('/', { body: create${pascal}Schema }) for automatic validation.\n * It also generates OpenAPI request body docs when SwaggerAdapter is used.\n *\n * Add more fields as needed. Supported Zod types:\n * z.string(), z.number(), z.boolean(), z.enum([...]),\n * z.array(), z.object(), .optional(), .default(), .transform()\n */\nexport const create${pascal}Schema = z.object({\n name: z.string().min(1, 'Name is required').max(200),\n})\n\nexport type Create${pascal}DTO = z.infer<typeof create${pascal}Schema>\n`\n}\n\nexport function generateUpdateDTO(pascal: string, kebab: string): string {\n return `import { z } from 'zod'\n\nexport const update${pascal}Schema = z.object({\n name: z.string().min(1).max(200).optional(),\n})\n\nexport type Update${pascal}DTO = z.infer<typeof update${pascal}Schema>\n`\n}\n\nexport function generateResponseDTO(pascal: string, kebab: string): string {\n return `export interface ${pascal}ResponseDTO {\n id: string\n name: string\n createdAt: string\n updatedAt: string\n}\n`\n}\n","export function generateUseCases(\n pascal: string,\n kebab: string,\n plural: string,\n pluralPascal: string,\n): { file: string; content: string }[] {\n return [\n {\n file: `create-${kebab}.use-case.ts`,\n content: `/**\n * Create ${pascal} Use Case\n *\n * Application layer — orchestrates a single business operation.\n * Use cases are thin: validate input (via DTO), call domain/repo, return response.\n * Keep business rules in the domain service, not here.\n */\nimport { Service, Inject } from '@forinda/kickjs-core'\nimport { ${pascal.toUpperCase()}_REPOSITORY, type I${pascal}Repository } from '../../domain/repositories/${kebab}.repository'\nimport type { Create${pascal}DTO } from '../dtos/create-${kebab}.dto'\nimport type { ${pascal}ResponseDTO } from '../dtos/${kebab}-response.dto'\n\n@Service()\nexport class Create${pascal}UseCase {\n constructor(\n @Inject(${pascal.toUpperCase()}_REPOSITORY) private readonly repo: I${pascal}Repository,\n ) {}\n\n async execute(dto: Create${pascal}DTO): Promise<${pascal}ResponseDTO> {\n return this.repo.create(dto)\n }\n}\n`,\n },\n {\n file: `get-${kebab}.use-case.ts`,\n content: `import { Service, Inject } from '@forinda/kickjs-core'\nimport { ${pascal.toUpperCase()}_REPOSITORY, type I${pascal}Repository } from '../../domain/repositories/${kebab}.repository'\nimport type { ${pascal}ResponseDTO } from '../dtos/${kebab}-response.dto'\n\n@Service()\nexport class Get${pascal}UseCase {\n constructor(\n @Inject(${pascal.toUpperCase()}_REPOSITORY) private readonly repo: I${pascal}Repository,\n ) {}\n\n async execute(id: string): Promise<${pascal}ResponseDTO | null> {\n return this.repo.findById(id)\n }\n}\n`,\n },\n {\n file: `list-${plural}.use-case.ts`,\n content: `import { Service, Inject } from '@forinda/kickjs-core'\nimport { ${pascal.toUpperCase()}_REPOSITORY, type I${pascal}Repository } from '../../domain/repositories/${kebab}.repository'\nimport type { ParsedQuery } from '@forinda/kickjs-http'\n\n@Service()\nexport class List${pluralPascal}UseCase {\n constructor(\n @Inject(${pascal.toUpperCase()}_REPOSITORY) private readonly repo: I${pascal}Repository,\n ) {}\n\n async execute(parsed: ParsedQuery) {\n return this.repo.findPaginated(parsed)\n }\n}\n`,\n },\n {\n file: `update-${kebab}.use-case.ts`,\n content: `import { Service, Inject } from '@forinda/kickjs-core'\nimport { ${pascal.toUpperCase()}_REPOSITORY, type I${pascal}Repository } from '../../domain/repositories/${kebab}.repository'\nimport type { Update${pascal}DTO } from '../dtos/update-${kebab}.dto'\nimport type { ${pascal}ResponseDTO } from '../dtos/${kebab}-response.dto'\n\n@Service()\nexport class Update${pascal}UseCase {\n constructor(\n @Inject(${pascal.toUpperCase()}_REPOSITORY) private readonly repo: I${pascal}Repository,\n ) {}\n\n async execute(id: string, dto: Update${pascal}DTO): Promise<${pascal}ResponseDTO> {\n return this.repo.update(id, dto)\n }\n}\n`,\n },\n {\n file: `delete-${kebab}.use-case.ts`,\n content: `import { Service, Inject } from '@forinda/kickjs-core'\nimport { ${pascal.toUpperCase()}_REPOSITORY, type I${pascal}Repository } from '../../domain/repositories/${kebab}.repository'\n\n@Service()\nexport class Delete${pascal}UseCase {\n constructor(\n @Inject(${pascal.toUpperCase()}_REPOSITORY) private readonly repo: I${pascal}Repository,\n ) {}\n\n async execute(id: string): Promise<void> {\n await this.repo.delete(id)\n }\n}\n`,\n },\n ]\n}\n","export function generateRepositoryInterface(pascal: string, kebab: string): string {\n return `/**\n * ${pascal} Repository Interface\n *\n * Domain layer — defines the contract for data access.\n * The interface lives in the domain layer; implementations live in infrastructure.\n * This inversion of dependencies keeps the domain pure and testable.\n *\n * To swap implementations (e.g. in-memory -> Drizzle -> Prisma),\n * change the factory in the module's register() method.\n */\nimport type { ${pascal}ResponseDTO } from '../../application/dtos/${kebab}-response.dto'\nimport type { Create${pascal}DTO } from '../../application/dtos/create-${kebab}.dto'\nimport type { Update${pascal}DTO } from '../../application/dtos/update-${kebab}.dto'\nimport type { ParsedQuery } from '@forinda/kickjs-http'\n\nexport interface I${pascal}Repository {\n findById(id: string): Promise<${pascal}ResponseDTO | null>\n findAll(): Promise<${pascal}ResponseDTO[]>\n findPaginated(parsed: ParsedQuery): Promise<{ data: ${pascal}ResponseDTO[]; total: number }>\n create(dto: Create${pascal}DTO): Promise<${pascal}ResponseDTO>\n update(id: string, dto: Update${pascal}DTO): Promise<${pascal}ResponseDTO>\n delete(id: string): Promise<void>\n}\n\nexport const ${pascal.toUpperCase()}_REPOSITORY = Symbol('I${pascal}Repository')\n`\n}\n\nexport function generateInMemoryRepository(pascal: string, kebab: string): string {\n return `/**\n * In-Memory ${pascal} Repository\n *\n * Infrastructure layer — implements the repository interface using a Map.\n * Useful for prototyping and testing. Replace with a database implementation\n * (Drizzle, Prisma, etc.) for production use.\n *\n * @Repository() registers this class in the DI container as a singleton.\n */\nimport { randomUUID } from 'node:crypto'\nimport { Repository, HttpException } from '@forinda/kickjs-core'\nimport type { ParsedQuery } from '@forinda/kickjs-http'\nimport type { I${pascal}Repository } from '../../domain/repositories/${kebab}.repository'\nimport type { ${pascal}ResponseDTO } from '../../application/dtos/${kebab}-response.dto'\nimport type { Create${pascal}DTO } from '../../application/dtos/create-${kebab}.dto'\nimport type { Update${pascal}DTO } from '../../application/dtos/update-${kebab}.dto'\n\n@Repository()\nexport class InMemory${pascal}Repository implements I${pascal}Repository {\n private store = new Map<string, ${pascal}ResponseDTO>()\n\n async findById(id: string): Promise<${pascal}ResponseDTO | null> {\n return this.store.get(id) ?? null\n }\n\n async findAll(): Promise<${pascal}ResponseDTO[]> {\n return Array.from(this.store.values())\n }\n\n async findPaginated(parsed: ParsedQuery): Promise<{ data: ${pascal}ResponseDTO[]; total: number }> {\n const all = Array.from(this.store.values())\n const data = all.slice(parsed.pagination.offset, parsed.pagination.offset + parsed.pagination.limit)\n return { data, total: all.length }\n }\n\n async create(dto: Create${pascal}DTO): Promise<${pascal}ResponseDTO> {\n const now = new Date().toISOString()\n const entity: ${pascal}ResponseDTO = {\n id: randomUUID(),\n name: dto.name,\n createdAt: now,\n updatedAt: now,\n }\n this.store.set(entity.id, entity)\n return entity\n }\n\n async update(id: string, dto: Update${pascal}DTO): Promise<${pascal}ResponseDTO> {\n const existing = this.store.get(id)\n if (!existing) throw HttpException.notFound('${pascal} not found')\n const updated = { ...existing, ...dto, updatedAt: new Date().toISOString() }\n this.store.set(id, updated)\n return updated\n }\n\n async delete(id: string): Promise<void> {\n if (!this.store.has(id)) throw HttpException.notFound('${pascal} not found')\n this.store.delete(id)\n }\n}\n`\n}\n","export function generateDomainService(pascal: string, kebab: string): string {\n return `/**\n * ${pascal} Domain Service\n *\n * Domain layer — contains business rules that don't belong to a single entity.\n * Use this for cross-entity logic, validation rules, and domain invariants.\n * Keep it free of HTTP/framework concerns.\n */\nimport { Service, Inject, HttpException } from '@forinda/kickjs-core'\nimport { ${pascal.toUpperCase()}_REPOSITORY, type I${pascal}Repository } from '../repositories/${kebab}.repository'\n\n@Service()\nexport class ${pascal}DomainService {\n constructor(\n @Inject(${pascal.toUpperCase()}_REPOSITORY) private readonly repo: I${pascal}Repository,\n ) {}\n\n async ensureExists(id: string): Promise<void> {\n const entity = await this.repo.findById(id)\n if (!entity) {\n throw HttpException.notFound('${pascal} not found')\n }\n }\n}\n`\n}\n\nexport function generateEntity(pascal: string, kebab: string): string {\n return `/**\n * ${pascal} Entity\n *\n * Domain layer — the core business object.\n * Uses a private constructor with static factory methods (create, reconstitute)\n * to enforce invariants. Properties are accessed via getters to maintain encapsulation.\n *\n * Patterns used:\n * - Private constructor: prevents direct instantiation\n * - create(): factory for new entities (generates ID, sets timestamps)\n * - reconstitute(): factory for rebuilding from persistence (no side effects)\n * - changeName(): mutation method that enforces business rules\n */\nimport { ${pascal}Id } from '../value-objects/${kebab}-id.vo'\n\ninterface ${pascal}Props {\n id: ${pascal}Id\n name: string\n createdAt: Date\n updatedAt: Date\n}\n\nexport class ${pascal} {\n private constructor(private props: ${pascal}Props) {}\n\n static create(params: { name: string }): ${pascal} {\n const now = new Date()\n return new ${pascal}({\n id: ${pascal}Id.create(),\n name: params.name,\n createdAt: now,\n updatedAt: now,\n })\n }\n\n static reconstitute(props: ${pascal}Props): ${pascal} {\n return new ${pascal}(props)\n }\n\n get id(): ${pascal}Id {\n return this.props.id\n }\n get name(): string {\n return this.props.name\n }\n get createdAt(): Date {\n return this.props.createdAt\n }\n get updatedAt(): Date {\n return this.props.updatedAt\n }\n\n changeName(name: string): void {\n if (!name || name.trim().length === 0) {\n throw new Error('Name cannot be empty')\n }\n this.props.name = name.trim()\n this.props.updatedAt = new Date()\n }\n\n toJSON() {\n return {\n id: this.props.id.toString(),\n name: this.props.name,\n createdAt: this.props.createdAt.toISOString(),\n updatedAt: this.props.updatedAt.toISOString(),\n }\n }\n}\n`\n}\n\nexport function generateValueObject(pascal: string, kebab: string): string {\n return `/**\n * ${pascal} ID Value Object\n *\n * Domain layer — wraps a primitive ID with type safety and validation.\n * Value objects are immutable and compared by value, not reference.\n *\n * ${pascal}Id.create() — generate a new UUID\n * ${pascal}Id.from(id) — wrap an existing ID string (validates non-empty)\n * id.equals(other) — compare two IDs by value\n */\nimport { randomUUID } from 'node:crypto'\n\nexport class ${pascal}Id {\n private constructor(private readonly value: string) {}\n\n static create(): ${pascal}Id {\n return new ${pascal}Id(randomUUID())\n }\n\n static from(id: string): ${pascal}Id {\n if (!id || id.trim().length === 0) {\n throw new Error('${pascal}Id cannot be empty')\n }\n return new ${pascal}Id(id)\n }\n\n toString(): string {\n return this.value\n }\n\n equals(other: ${pascal}Id): boolean {\n return this.value === other.value\n }\n}\n`\n}\n","export function generateControllerTest(pascal: string, kebab: string, plural: string): string {\n return `import { describe, it, expect, beforeEach } from 'vitest'\nimport { Container } from '@forinda/kickjs-core'\n\ndescribe('${pascal}Controller', () => {\n beforeEach(() => {\n Container.reset()\n })\n\n it('should be defined', () => {\n expect(true).toBe(true)\n })\n\n describe('POST /${plural}', () => {\n it('should create a new ${kebab}', async () => {\n // TODO: Set up test module, call create endpoint, assert 201\n expect(true).toBe(true)\n })\n })\n\n describe('GET /${plural}', () => {\n it('should return paginated ${plural}', async () => {\n // TODO: Set up test module, call list endpoint, assert { data, meta }\n expect(true).toBe(true)\n })\n })\n\n describe('GET /${plural}/:id', () => {\n it('should return a ${kebab} by id', async () => {\n // TODO: Create a ${kebab}, then fetch by id, assert match\n expect(true).toBe(true)\n })\n\n it('should return 404 for non-existent ${kebab}', async () => {\n // TODO: Fetch non-existent id, assert 404\n expect(true).toBe(true)\n })\n })\n\n describe('PUT /${plural}/:id', () => {\n it('should update an existing ${kebab}', async () => {\n // TODO: Create, update, assert changes\n expect(true).toBe(true)\n })\n })\n\n describe('DELETE /${plural}/:id', () => {\n it('should delete a ${kebab}', async () => {\n // TODO: Create, delete, assert gone\n expect(true).toBe(true)\n })\n })\n})\n`\n}\n\nexport function generateRepositoryTest(pascal: string, kebab: string, plural: string): string {\n return `import { describe, it, expect, beforeEach } from 'vitest'\nimport { InMemory${pascal}Repository } from '../infrastructure/repositories/in-memory-${kebab}.repository'\n\ndescribe('InMemory${pascal}Repository', () => {\n let repo: InMemory${pascal}Repository\n\n beforeEach(() => {\n repo = new InMemory${pascal}Repository()\n })\n\n it('should create and retrieve a ${kebab}', async () => {\n const created = await repo.create({ name: 'Test ${pascal}' })\n expect(created).toBeDefined()\n expect(created.name).toBe('Test ${pascal}')\n expect(created.id).toBeDefined()\n\n const found = await repo.findById(created.id)\n expect(found).toEqual(created)\n })\n\n it('should return null for non-existent id', async () => {\n const found = await repo.findById('non-existent')\n expect(found).toBeNull()\n })\n\n it('should list all ${plural}', async () => {\n await repo.create({ name: '${pascal} 1' })\n await repo.create({ name: '${pascal} 2' })\n\n const all = await repo.findAll()\n expect(all).toHaveLength(2)\n })\n\n it('should return paginated results', async () => {\n await repo.create({ name: '${pascal} 1' })\n await repo.create({ name: '${pascal} 2' })\n await repo.create({ name: '${pascal} 3' })\n\n const result = await repo.findPaginated({\n filters: [],\n sort: [],\n search: '',\n pagination: { page: 1, limit: 2, offset: 0 },\n })\n\n expect(result.data).toHaveLength(2)\n expect(result.total).toBe(3)\n })\n\n it('should update a ${kebab}', async () => {\n const created = await repo.create({ name: 'Original' })\n const updated = await repo.update(created.id, { name: 'Updated' })\n expect(updated.name).toBe('Updated')\n })\n\n it('should delete a ${kebab}', async () => {\n const created = await repo.create({ name: 'To Delete' })\n await repo.delete(created.id)\n const found = await repo.findById(created.id)\n expect(found).toBeNull()\n })\n})\n`\n}\n","import { join } from 'node:path'\nimport { writeFileSafe } from '../utils/fs'\nimport { toPascalCase, toKebabCase } from '../utils/naming'\n\ninterface GenerateAdapterOptions {\n name: string\n outDir: string\n}\n\nexport async function generateAdapter(options: GenerateAdapterOptions): Promise<string[]> {\n const { name, outDir } = options\n const kebab = toKebabCase(name)\n const pascal = toPascalCase(name)\n const files: string[] = []\n\n const filePath = join(outDir, `${kebab}.adapter.ts`)\n await writeFileSafe(\n filePath,\n `import type { Express } from 'express'\nimport type { AppAdapter, AdapterMiddleware, Container } from '@forinda/kickjs-core'\n\nexport interface ${pascal}AdapterOptions {\n // Add your adapter configuration here\n}\n\n/**\n * ${pascal} adapter.\n *\n * Hooks into the Application lifecycle to add middleware, routes,\n * or external service connections.\n *\n * Usage:\n * bootstrap({\n * adapters: [new ${pascal}Adapter({ ... })],\n * })\n */\nexport class ${pascal}Adapter implements AppAdapter {\n name = '${pascal}Adapter'\n\n constructor(private options: ${pascal}AdapterOptions = {}) {}\n\n /**\n * Return middleware entries that the Application will mount.\n * Use \\`phase\\` to control where in the pipeline they run:\n * 'beforeGlobal' | 'afterGlobal' | 'beforeRoutes' | 'afterRoutes'\n */\n middleware(): AdapterMiddleware[] {\n return [\n // Example: add a custom header to all responses\n // {\n // phase: 'beforeGlobal',\n // handler: (_req: any, res: any, next: any) => {\n // res.setHeader('X-${pascal}', 'true')\n // next()\n // },\n // },\n // Example: scope middleware to a specific path\n // {\n // phase: 'beforeRoutes',\n // path: '/api/v1/admin',\n // handler: myAdminMiddleware(),\n // },\n ]\n }\n\n /**\n * Called before global middleware.\n * Use this to mount routes that bypass the middleware stack\n * (health checks, docs UI, static assets).\n */\n beforeMount(app: Express, container: Container): void {\n // Example: mount a status route\n // app.get('/${kebab}/status', (_req, res) => {\n // res.json({ status: 'ok' })\n // })\n }\n\n /**\n * Called after modules and routes are registered, before the server starts.\n * Use this for late-stage DI registrations or config validation.\n */\n beforeStart(app: Express, container: Container): void {\n // Example: register a service in the DI container\n // container.registerInstance(MY_TOKEN, new MyService(this.options))\n }\n\n /**\n * Called after the HTTP server is listening.\n * Use this to attach to the raw http.Server (Socket.IO, gRPC, etc).\n */\n afterStart(server: any, container: Container): void {\n // Example: attach Socket.IO\n // const io = new Server(server)\n // container.registerInstance(SOCKET_IO, io)\n }\n\n /**\n * Called on graceful shutdown. Clean up connections.\n */\n async shutdown(): Promise<void> {\n // Example: close a connection pool\n // await this.pool.end()\n }\n}\n`,\n )\n files.push(filePath)\n\n return files\n}\n","import { join } from 'node:path'\nimport { writeFileSafe } from '../utils/fs'\nimport { toPascalCase, toKebabCase, toCamelCase } from '../utils/naming'\n\ninterface GenerateMiddlewareOptions {\n name: string\n outDir: string\n}\n\nexport async function generateMiddleware(options: GenerateMiddlewareOptions): Promise<string[]> {\n const { name, outDir } = options\n const kebab = toKebabCase(name)\n const camel = toCamelCase(name)\n const files: string[] = []\n\n const filePath = join(outDir, `${kebab}.middleware.ts`)\n await writeFileSafe(\n filePath,\n `import type { Request, Response, NextFunction } from 'express'\n\nexport interface ${toPascalCase(name)}Options {\n // Add configuration options here\n}\n\n/**\n * ${toPascalCase(name)} middleware.\n *\n * Usage in bootstrap:\n * middleware: [${camel}()]\n *\n * Usage with adapter:\n * middleware() { return [{ handler: ${camel}(), phase: 'afterGlobal' }] }\n *\n * Usage with @Middleware decorator:\n * @Middleware(${camel}())\n */\nexport function ${camel}(options: ${toPascalCase(name)}Options = {}) {\n return (req: Request, res: Response, next: NextFunction) => {\n // Implement your middleware logic here\n next()\n }\n}\n`,\n )\n files.push(filePath)\n\n return files\n}\n","import { join } from 'node:path'\nimport { writeFileSafe } from '../utils/fs'\nimport { toPascalCase, toKebabCase, toCamelCase } from '../utils/naming'\n\ninterface GenerateGuardOptions {\n name: string\n outDir: string\n}\n\nexport async function generateGuard(options: GenerateGuardOptions): Promise<string[]> {\n const { name, outDir } = options\n const kebab = toKebabCase(name)\n const camel = toCamelCase(name)\n const pascal = toPascalCase(name)\n const files: string[] = []\n\n const filePath = join(outDir, `${kebab}.guard.ts`)\n await writeFileSafe(\n filePath,\n `import { Container, HttpException } from '@forinda/kickjs-core'\nimport type { RequestContext } from '@forinda/kickjs-http'\n\n/**\n * ${pascal} guard.\n *\n * Guards protect routes by checking conditions before the handler runs.\n * Return early with an error response to block access.\n *\n * Usage:\n * @Middleware(${camel}Guard)\n * @Get('/protected')\n * async handler(ctx: RequestContext) { ... }\n */\nexport async function ${camel}Guard(ctx: RequestContext, next: () => void): Promise<void> {\n // Example: check for an authorization header\n const header = ctx.headers.authorization\n if (!header?.startsWith('Bearer ')) {\n ctx.res.status(401).json({ message: 'Missing or invalid authorization header' })\n return\n }\n\n const token = header.slice(7)\n\n try {\n // Verify the token using a service from the DI container\n // const container = Container.getInstance()\n // const authService = container.resolve(AuthService)\n // const payload = authService.verifyToken(token)\n // ctx.set('auth', payload)\n\n next()\n } catch {\n ctx.res.status(401).json({ message: 'Invalid or expired token' })\n }\n}\n`,\n )\n files.push(filePath)\n\n return files\n}\n","import { join } from 'node:path'\nimport { writeFileSafe } from '../utils/fs'\nimport { toPascalCase, toKebabCase } from '../utils/naming'\n\ninterface GenerateServiceOptions {\n name: string\n outDir: string\n}\n\nexport async function generateService(options: GenerateServiceOptions): Promise<string[]> {\n const { name, outDir } = options\n const kebab = toKebabCase(name)\n const pascal = toPascalCase(name)\n const files: string[] = []\n\n const filePath = join(outDir, `${kebab}.service.ts`)\n await writeFileSafe(\n filePath,\n `import { Service } from '@forinda/kickjs-core'\n\n@Service()\nexport class ${pascal}Service {\n // Inject dependencies via constructor\n // constructor(\n // @Inject(MY_REPO) private readonly repo: IMyRepository,\n // ) {}\n}\n`,\n )\n files.push(filePath)\n\n return files\n}\n","import { join } from 'node:path'\nimport { writeFileSafe } from '../utils/fs'\nimport { toPascalCase, toKebabCase } from '../utils/naming'\n\ninterface GenerateControllerOptions {\n name: string\n outDir: string\n}\n\nexport async function generateController(options: GenerateControllerOptions): Promise<string[]> {\n const { name, outDir } = options\n const kebab = toKebabCase(name)\n const pascal = toPascalCase(name)\n const files: string[] = []\n\n const filePath = join(outDir, `${kebab}.controller.ts`)\n await writeFileSafe(\n filePath,\n `import { Controller, Get, Post, Autowired } from '@forinda/kickjs-core'\nimport type { RequestContext } from '@forinda/kickjs-http'\n\n@Controller()\nexport class ${pascal}Controller {\n // @Autowired() private myService!: MyService\n\n @Get('/')\n async list(ctx: RequestContext) {\n ctx.json({ message: '${pascal} list' })\n }\n\n @Post('/')\n async create(ctx: RequestContext) {\n ctx.created({ message: '${pascal} created', data: ctx.body })\n }\n}\n`,\n )\n files.push(filePath)\n\n return files\n}\n","import { join } from 'node:path'\nimport { writeFileSafe } from '../utils/fs'\nimport { toPascalCase, toKebabCase, toCamelCase } from '../utils/naming'\n\ninterface GenerateDtoOptions {\n name: string\n outDir: string\n}\n\nexport async function generateDto(options: GenerateDtoOptions): Promise<string[]> {\n const { name, outDir } = options\n const kebab = toKebabCase(name)\n const pascal = toPascalCase(name)\n const camel = toCamelCase(name)\n const files: string[] = []\n\n const filePath = join(outDir, `${kebab}.dto.ts`)\n await writeFileSafe(\n filePath,\n `import { z } from 'zod'\n\nexport const ${camel}Schema = z.object({\n // Define your schema fields here\n name: z.string().min(1).max(200),\n})\n\nexport type ${pascal}DTO = z.infer<typeof ${camel}Schema>\n`,\n )\n files.push(filePath)\n\n return files\n}\n","import { join } from 'node:path'\nimport { existsSync } from 'node:fs'\nimport { createInterface } from 'node:readline'\nimport { writeFileSafe } from '../utils/fs'\n\ninterface GenerateConfigOptions {\n outDir: string\n modulesDir?: string\n defaultRepo?: string\n force?: boolean\n}\n\nasync function confirm(message: string): Promise<boolean> {\n const rl = createInterface({ input: process.stdin, output: process.stdout })\n return new Promise((resolve) => {\n rl.question(` ${message} (y/N) `, (answer) => {\n rl.close()\n resolve(answer.trim().toLowerCase() === 'y')\n })\n })\n}\n\nexport async function generateConfig(options: GenerateConfigOptions): Promise<string[]> {\n const filePath = join(options.outDir, 'kick.config.ts')\n const modulesDir = options.modulesDir ?? 'src/modules'\n const defaultRepo = options.defaultRepo ?? 'inmemory'\n\n if (existsSync(filePath) && !options.force) {\n const overwrite = await confirm('kick.config.ts already exists. Overwrite?')\n if (!overwrite) {\n console.log('\\n Skipped — existing kick.config.ts preserved.')\n return []\n }\n }\n\n await writeFileSafe(\n filePath,\n `import { defineConfig } from '@forinda/kickjs-cli'\n\nexport default defineConfig({\n modulesDir: '${modulesDir}',\n defaultRepo: '${defaultRepo}',\n\n commands: [\n {\n name: 'test',\n description: 'Run tests with Vitest',\n steps: 'npx vitest run',\n },\n {\n name: 'format',\n description: 'Format code with Prettier',\n steps: 'npx prettier --write src/',\n },\n {\n name: 'format:check',\n description: 'Check formatting without writing',\n steps: 'npx prettier --check src/',\n },\n {\n name: 'check',\n description: 'Run typecheck + format check',\n steps: ['npx tsc --noEmit', 'npx prettier --check src/'],\n aliases: ['verify', 'ci'],\n },\n ],\n})\n`,\n )\n\n return [filePath]\n}\n","import { join } from 'node:path'\nimport { writeFileSafe } from '../utils/fs'\nimport { toPascalCase, toKebabCase, toCamelCase } from '../utils/naming'\n\ninterface GenerateResolverOptions {\n name: string\n outDir: string\n}\n\nexport async function generateResolver(options: GenerateResolverOptions): Promise<string[]> {\n const { name, outDir } = options\n const pascal = toPascalCase(name)\n const kebab = toKebabCase(name)\n const camel = toCamelCase(name)\n const files: string[] = []\n\n const write = async (relativePath: string, content: string) => {\n const fullPath = join(outDir, relativePath)\n await writeFileSafe(fullPath, content)\n files.push(fullPath)\n }\n\n await write(\n `${kebab}.resolver.ts`,\n `import { Service } from '@forinda/kickjs-core'\nimport { Resolver, Query, Mutation, Arg } from '@forinda/kickjs-graphql'\n\n/**\n * ${pascal} GraphQL Resolver\n *\n * Decorators:\n * @Resolver(typeName?) — marks this class as a GraphQL resolver\n * @Query(name?, { returnType?, description? }) — defines a query field\n * @Mutation(name?, { returnType?, description? }) — defines a mutation field\n * @Arg(name, type?) — marks a method parameter as a GraphQL argument\n */\n@Service()\n@Resolver('${pascal}')\nexport class ${pascal}Resolver {\n private items: Array<{ id: string; name: string }> = []\n\n @Query('${camel}s', { returnType: '[${pascal}]', description: 'List all ${camel}s' })\n findAll() {\n return this.items\n }\n\n @Query('${camel}', { returnType: '${pascal}', description: 'Get a ${camel} by ID' })\n findById(@Arg('id', 'ID!') id: string) {\n return this.items.find((item) => item.id === id) ?? null\n }\n\n @Mutation('create${pascal}', { returnType: '${pascal}', description: 'Create a new ${camel}' })\n create(@Arg('name', 'String!') name: string) {\n const item = { id: String(this.items.length + 1), name }\n this.items.push(item)\n return item\n }\n\n @Mutation('update${pascal}', { returnType: '${pascal}', description: 'Update a ${camel}' })\n update(@Arg('id', 'ID!') id: string, @Arg('name', 'String!') name: string) {\n const item = this.items.find((i) => i.id === id)\n if (item) item.name = name\n return item\n }\n\n @Mutation('delete${pascal}', { returnType: 'Boolean', description: 'Delete a ${camel}' })\n remove(@Arg('id', 'ID!') id: string) {\n const idx = this.items.findIndex((i) => i.id === id)\n if (idx === -1) return false\n this.items.splice(idx, 1)\n return true\n }\n}\n`,\n )\n\n await write(\n `${kebab}.typedefs.ts`,\n `/**\n * ${pascal} GraphQL type definitions.\n * Pass to GraphQLAdapter's typeDefs option to register custom types.\n */\nexport const ${camel}TypeDefs = \\`\n type ${pascal} {\n id: ID!\n name: String!\n }\n\\`\n`,\n )\n\n return files\n}\n","import { join } from 'node:path'\nimport { writeFileSafe } from '../utils/fs'\nimport { toPascalCase, toKebabCase, toCamelCase } from '../utils/naming'\n\ninterface GenerateJobOptions {\n name: string\n outDir: string\n queue?: string\n}\n\nexport async function generateJob(options: GenerateJobOptions): Promise<string[]> {\n const { name, outDir } = options\n const pascal = toPascalCase(name)\n const kebab = toKebabCase(name)\n const camel = toCamelCase(name)\n const queueName = options.queue ?? `${kebab}-queue`\n const files: string[] = []\n\n const write = async (relativePath: string, content: string) => {\n const fullPath = join(outDir, relativePath)\n await writeFileSafe(fullPath, content)\n files.push(fullPath)\n }\n\n await write(\n `${kebab}.job.ts`,\n `import { Inject } from '@forinda/kickjs-core'\nimport { Job, Process, QUEUE_MANAGER, type QueueService } from '@forinda/kickjs-queue'\n\n/**\n * ${pascal} Job Processor\n *\n * Decorators:\n * @Job(queueName) — marks this class as a job processor for a queue\n * @Process(jobName?) — marks a method as the handler for a specific job type\n * - Without a name: handles all jobs in the queue\n * - With a name: handles only jobs matching that name\n *\n * To add jobs to this queue from a service or controller:\n * @Inject(QUEUE_MANAGER) private queue: QueueService\n * await this.queue.add('${queueName}', '${camel}', { ... })\n */\n@Job('${queueName}')\nexport class ${pascal}Job {\n @Process()\n async handle(job: { name: string; data: any; id?: string }) {\n console.log(\\`Processing \\${job.name} (id: \\${job.id})\\`, job.data)\n\n // TODO: Implement job logic here\n // Example:\n // await this.emailService.send(job.data.to, job.data.subject, job.data.body)\n }\n\n @Process('${camel}.priority')\n async handlePriority(job: { name: string; data: any; id?: string }) {\n console.log(\\`Priority job: \\${job.name}\\`, job.data)\n // Handle high-priority variant of this job\n }\n}\n`,\n )\n\n return files\n}\n","import { join } from 'node:path'\nimport { writeFileSafe, fileExists } from '../utils/fs'\nimport { toPascalCase, toKebabCase, toCamelCase, pluralize, pluralizePascal } from '../utils/naming'\nimport { readFile, writeFile } from 'node:fs/promises'\n\n// ── Field Parsing ───────────────────────────────────────────────────────\n\nexport interface FieldDef {\n name: string\n type: string\n tsType: string\n zodType: string\n optional: boolean\n}\n\n/**\n * Supported field types and their mappings:\n * string → z.string()\n * text → z.string() (alias, hints at longer content)\n * number → z.number()\n * int → z.number().int()\n * float → z.number()\n * boolean → z.boolean()\n * date → z.string().datetime()\n * email → z.string().email()\n * url → z.string().url()\n * uuid → z.string().uuid()\n * json → z.any()\n * enum:a,b → z.enum(['a','b'])\n *\n * Append ? for optional: title:string body:text? published:boolean?\n */\nconst TYPE_MAP: Record<string, { ts: string; zod: string }> = {\n string: { ts: 'string', zod: 'z.string()' },\n text: { ts: 'string', zod: 'z.string()' },\n number: { ts: 'number', zod: 'z.number()' },\n int: { ts: 'number', zod: 'z.number().int()' },\n float: { ts: 'number', zod: 'z.number()' },\n boolean: { ts: 'boolean', zod: 'z.boolean()' },\n date: { ts: 'string', zod: 'z.string().datetime()' },\n email: { ts: 'string', zod: 'z.string().email()' },\n url: { ts: 'string', zod: 'z.string().url()' },\n uuid: { ts: 'string', zod: 'z.string().uuid()' },\n json: { ts: 'any', zod: 'z.any()' },\n}\n\nexport function parseFields(raw: string[]): FieldDef[] {\n return raw.map((f) => {\n const colonIdx = f.indexOf(':')\n if (colonIdx === -1) {\n throw new Error(`Invalid field: \"${f}\". Use format: name:type (e.g. title:string)`)\n }\n const namePart = f.slice(0, colonIdx)\n const typePart = f.slice(colonIdx + 1)\n if (!namePart || !typePart) {\n throw new Error(`Invalid field: \"${f}\". Use format: name:type (e.g. title:string)`)\n }\n\n const optional = typePart.endsWith('?')\n const cleanType = optional ? typePart.slice(0, -1) : typePart\n\n // Handle enum:val1,val2\n if (cleanType.startsWith('enum:')) {\n const values = cleanType.slice(5).split(',')\n return {\n name: namePart,\n type: 'enum',\n tsType: values.map((v) => `'${v}'`).join(' | '),\n zodType: `z.enum([${values.map((v) => `'${v}'`).join(', ')}])`,\n optional,\n }\n }\n\n const mapped = TYPE_MAP[cleanType]\n if (!mapped) {\n const validTypes = [...Object.keys(TYPE_MAP), 'enum:a,b,c'].join(', ')\n throw new Error(`Unknown field type: \"${cleanType}\". Valid types: ${validTypes}`)\n }\n\n return {\n name: namePart,\n type: cleanType,\n tsType: mapped.ts,\n zodType: mapped.zod,\n optional,\n }\n })\n}\n\n// ── Scaffold Generator ──────────────────────────────────────────────────\n\ninterface ScaffoldOptions {\n name: string\n fields: FieldDef[]\n modulesDir: string\n noEntity?: boolean\n noTests?: boolean\n repo?: 'inmemory'\n}\n\nexport async function generateScaffold(options: ScaffoldOptions): Promise<string[]> {\n const { name, fields, modulesDir, noEntity, noTests, repo = 'inmemory' } = options\n const kebab = toKebabCase(name)\n const pascal = toPascalCase(name)\n const camel = toCamelCase(name)\n const plural = pluralize(kebab)\n const pluralPascal = pluralizePascal(pascal)\n const moduleDir = join(modulesDir, plural)\n\n const files: string[] = []\n\n const write = async (relativePath: string, content: string) => {\n const fullPath = join(moduleDir, relativePath)\n await writeFileSafe(fullPath, content)\n files.push(fullPath)\n }\n\n // ── Module Index\n await write('index.ts', genModuleIndex(pascal, kebab, plural, repo))\n\n // ── Constants\n await write('constants.ts', genConstants(pascal, fields))\n\n // ── Controller\n await write(\n `presentation/${kebab}.controller.ts`,\n genController(pascal, kebab, plural, pluralPascal),\n )\n\n // ── DTOs\n await write(`application/dtos/create-${kebab}.dto.ts`, genCreateDTO(pascal, fields))\n await write(`application/dtos/update-${kebab}.dto.ts`, genUpdateDTO(pascal, fields))\n await write(`application/dtos/${kebab}-response.dto.ts`, genResponseDTO(pascal, fields))\n\n // ── Use Cases\n const useCases = genUseCases(pascal, kebab, plural, pluralPascal)\n for (const uc of useCases) {\n await write(`application/use-cases/${uc.file}`, uc.content)\n }\n\n // ── Domain: Repository Interface\n await write(`domain/repositories/${kebab}.repository.ts`, genRepositoryInterface(pascal, kebab))\n\n // ── Domain: Service\n await write(`domain/services/${kebab}-domain.service.ts`, genDomainService(pascal, kebab))\n\n // ── Infrastructure: Repository\n if (repo === 'inmemory') {\n await write(\n `infrastructure/repositories/in-memory-${kebab}.repository.ts`,\n genInMemoryRepository(pascal, kebab, fields),\n )\n }\n\n // ── Entity & Value Objects\n if (!noEntity) {\n await write(`domain/entities/${kebab}.entity.ts`, genEntity(pascal, kebab, fields))\n await write(`domain/value-objects/${kebab}-id.vo.ts`, genValueObject(pascal))\n }\n\n // ── Auto-register in modules index\n await autoRegisterModule(modulesDir, pascal, plural)\n\n return files\n}\n\n// ── Template Generators ─────────────────────────────────────────────────\n\nfunction genCreateDTO(pascal: string, fields: FieldDef[]): string {\n const zodFields = fields\n .map((f) => {\n const base = f.zodType\n return ` ${f.name}: ${base}${f.optional ? '.optional()' : ''},`\n })\n .join('\\n')\n\n return `import { z } from 'zod'\n\nexport const create${pascal}Schema = z.object({\n${zodFields}\n})\n\nexport type Create${pascal}DTO = z.infer<typeof create${pascal}Schema>\n`\n}\n\nfunction genUpdateDTO(pascal: string, fields: FieldDef[]): string {\n const zodFields = fields.map((f) => ` ${f.name}: ${f.zodType}.optional(),`).join('\\n')\n\n return `import { z } from 'zod'\n\nexport const update${pascal}Schema = z.object({\n${zodFields}\n})\n\nexport type Update${pascal}DTO = z.infer<typeof update${pascal}Schema>\n`\n}\n\nfunction genResponseDTO(pascal: string, fields: FieldDef[]): string {\n const tsFields = fields.map((f) => ` ${f.name}${f.optional ? '?' : ''}: ${f.tsType}`).join('\\n')\n\n return `export interface ${pascal}ResponseDTO {\n id: string\n${tsFields}\n createdAt: string\n updatedAt: string\n}\n`\n}\n\nfunction genConstants(pascal: string, fields: FieldDef[]): string {\n const stringFields = fields.filter((f) => f.tsType === 'string').map((f) => `'${f.name}'`)\n const numberFields = fields.filter((f) => f.tsType === 'number').map((f) => `'${f.name}'`)\n const allFieldNames = fields.map((f) => `'${f.name}'`)\n\n const filterable = [...allFieldNames].join(', ')\n const sortable = [...allFieldNames, \"'createdAt'\", \"'updatedAt'\"].join(', ')\n const searchable = stringFields.length > 0 ? stringFields.join(', ') : \"'name'\"\n\n return `import type { ApiQueryParamsConfig } from '@forinda/kickjs-core'\n\nexport const ${pascal.toUpperCase()}_QUERY_CONFIG: ApiQueryParamsConfig = {\n filterable: [${filterable}],\n sortable: [${sortable}],\n searchable: [${searchable}],\n}\n`\n}\n\nfunction genInMemoryRepository(pascal: string, kebab: string, fields: FieldDef[]): string {\n const fieldAssignments = fields.map((f) => ` ${f.name}: dto.${f.name},`).join('\\n')\n const fieldSpread = '...dto'\n\n return `import { randomUUID } from 'node:crypto'\nimport { Repository, HttpException } from '@forinda/kickjs-core'\nimport type { ParsedQuery } from '@forinda/kickjs-http'\nimport type { I${pascal}Repository } from '../../domain/repositories/${kebab}.repository'\nimport type { ${pascal}ResponseDTO } from '../../application/dtos/${kebab}-response.dto'\nimport type { Create${pascal}DTO } from '../../application/dtos/create-${kebab}.dto'\nimport type { Update${pascal}DTO } from '../../application/dtos/update-${kebab}.dto'\n\n@Repository()\nexport class InMemory${pascal}Repository implements I${pascal}Repository {\n private store = new Map<string, ${pascal}ResponseDTO>()\n\n async findById(id: string): Promise<${pascal}ResponseDTO | null> {\n return this.store.get(id) ?? null\n }\n\n async findAll(): Promise<${pascal}ResponseDTO[]> {\n return Array.from(this.store.values())\n }\n\n async findPaginated(parsed: ParsedQuery): Promise<{ data: ${pascal}ResponseDTO[]; total: number }> {\n const all = Array.from(this.store.values())\n const data = all.slice(parsed.pagination.offset, parsed.pagination.offset + parsed.pagination.limit)\n return { data, total: all.length }\n }\n\n async create(dto: Create${pascal}DTO): Promise<${pascal}ResponseDTO> {\n const now = new Date().toISOString()\n const entity: ${pascal}ResponseDTO = {\n id: randomUUID(),\n${fieldAssignments}\n createdAt: now,\n updatedAt: now,\n }\n this.store.set(entity.id, entity)\n return entity\n }\n\n async update(id: string, dto: Update${pascal}DTO): Promise<${pascal}ResponseDTO> {\n const existing = this.store.get(id)\n if (!existing) throw HttpException.notFound('${pascal} not found')\n const updated = { ...existing, ${fieldSpread}, updatedAt: new Date().toISOString() }\n this.store.set(id, updated)\n return updated\n }\n\n async delete(id: string): Promise<void> {\n if (!this.store.has(id)) throw HttpException.notFound('${pascal} not found')\n this.store.delete(id)\n }\n}\n`\n}\n\nfunction genEntity(pascal: string, kebab: string, fields: FieldDef[]): string {\n const propsInterface = fields\n .map((f) => ` ${f.name}${f.optional ? '?' : ''}: ${f.tsType}`)\n .join('\\n')\n const createParams = fields\n .filter((f) => !f.optional)\n .map((f) => `${f.name}: ${f.tsType}`)\n .join('; ')\n const createAssignments = fields\n .filter((f) => !f.optional)\n .map((f) => ` ${f.name}: params.${f.name},`)\n .join('\\n')\n const getters = fields\n .map(\n (f) => ` get ${f.name}(): ${f.tsType}${f.optional ? ' | undefined' : ''} {\n return this.props.${f.name}\n }`,\n )\n .join('\\n')\n const toJsonFields = fields.map((f) => ` ${f.name}: this.props.${f.name},`).join('\\n')\n\n return `import { ${pascal}Id } from '../value-objects/${kebab}-id.vo'\n\ninterface ${pascal}Props {\n id: ${pascal}Id\n${propsInterface}\n createdAt: Date\n updatedAt: Date\n}\n\nexport class ${pascal} {\n private constructor(private props: ${pascal}Props) {}\n\n static create(params: { ${createParams} }): ${pascal} {\n const now = new Date()\n return new ${pascal}({\n id: ${pascal}Id.create(),\n${createAssignments}\n createdAt: now,\n updatedAt: now,\n })\n }\n\n static reconstitute(props: ${pascal}Props): ${pascal} {\n return new ${pascal}(props)\n }\n\n get id(): ${pascal}Id { return this.props.id }\n${getters}\n get createdAt(): Date { return this.props.createdAt }\n get updatedAt(): Date { return this.props.updatedAt }\n\n toJSON() {\n return {\n id: this.props.id.toString(),\n${toJsonFields}\n createdAt: this.props.createdAt.toISOString(),\n updatedAt: this.props.updatedAt.toISOString(),\n }\n }\n}\n`\n}\n\nfunction genValueObject(pascal: string): string {\n return `import { randomUUID } from 'node:crypto'\n\nexport class ${pascal}Id {\n private constructor(private readonly value: string) {}\n\n static create(): ${pascal}Id { return new ${pascal}Id(randomUUID()) }\n\n static from(id: string): ${pascal}Id {\n if (!id || id.trim().length === 0) throw new Error('${pascal}Id cannot be empty')\n return new ${pascal}Id(id)\n }\n\n toString(): string { return this.value }\n equals(other: ${pascal}Id): boolean { return this.value === other.value }\n}\n`\n}\n\n// These reuse the same patterns as the existing module generator\n\nfunction genModuleIndex(pascal: string, kebab: string, plural: string, repo: string): string {\n return `import type { AppModule, AppModuleClass } from '@forinda/kickjs-core'\nimport { ${pascal}Controller } from './presentation/${kebab}.controller'\nimport { ${pascal}DomainService } from './domain/services/${kebab}-domain.service'\nimport { ${pascal.toUpperCase()}_REPOSITORY } from './domain/repositories/${kebab}.repository'\nimport { InMemory${pascal}Repository } from './infrastructure/repositories/in-memory-${kebab}.repository'\n\nexport class ${pascal}Module implements AppModule {\n register(container: any): void {\n container.registerFactory(\n ${pascal.toUpperCase()}_REPOSITORY,\n () => container.resolve(InMemory${pascal}Repository),\n )\n }\n\n routes() {\n return { prefix: '/${plural}', controllers: [${pascal}Controller] }\n }\n}\n`\n}\n\nfunction genController(\n pascal: string,\n kebab: string,\n plural: string,\n pluralPascal: string,\n): string {\n return `import { Controller, Get, Post, Put, Delete, Autowired, ApiQueryParams } from '@forinda/kickjs-core'\nimport type { RequestContext } from '@forinda/kickjs-http'\nimport { ApiTags } from '@forinda/kickjs-swagger'\nimport { Create${pascal}UseCase } from '../application/use-cases/create-${kebab}.use-case'\nimport { Get${pascal}UseCase } from '../application/use-cases/get-${kebab}.use-case'\nimport { List${pluralPascal}UseCase } from '../application/use-cases/list-${plural}.use-case'\nimport { Update${pascal}UseCase } from '../application/use-cases/update-${kebab}.use-case'\nimport { Delete${pascal}UseCase } from '../application/use-cases/delete-${kebab}.use-case'\nimport { create${pascal}Schema } from '../application/dtos/create-${kebab}.dto'\nimport { update${pascal}Schema } from '../application/dtos/update-${kebab}.dto'\nimport { ${pascal.toUpperCase()}_QUERY_CONFIG } from '../constants'\n\n@Controller()\nexport class ${pascal}Controller {\n @Autowired() private create${pascal}UseCase!: Create${pascal}UseCase\n @Autowired() private get${pascal}UseCase!: Get${pascal}UseCase\n @Autowired() private list${pluralPascal}UseCase!: List${pluralPascal}UseCase\n @Autowired() private update${pascal}UseCase!: Update${pascal}UseCase\n @Autowired() private delete${pascal}UseCase!: Delete${pascal}UseCase\n\n @Get('/')\n @ApiTags('${pascal}')\n @ApiQueryParams(${pascal.toUpperCase()}_QUERY_CONFIG)\n async list(ctx: RequestContext) {\n return ctx.paginate(\n (parsed) => this.list${pluralPascal}UseCase.execute(parsed),\n ${pascal.toUpperCase()}_QUERY_CONFIG,\n )\n }\n\n @Get('/:id')\n @ApiTags('${pascal}')\n async getById(ctx: RequestContext) {\n const result = await this.get${pascal}UseCase.execute(ctx.params.id)\n if (!result) return ctx.notFound('${pascal} not found')\n ctx.json(result)\n }\n\n @Post('/', { body: create${pascal}Schema, name: 'Create${pascal}' })\n @ApiTags('${pascal}')\n async create(ctx: RequestContext) {\n const result = await this.create${pascal}UseCase.execute(ctx.body)\n ctx.created(result)\n }\n\n @Put('/:id', { body: update${pascal}Schema, name: 'Update${pascal}' })\n @ApiTags('${pascal}')\n async update(ctx: RequestContext) {\n const result = await this.update${pascal}UseCase.execute(ctx.params.id, ctx.body)\n ctx.json(result)\n }\n\n @Delete('/:id')\n @ApiTags('${pascal}')\n async remove(ctx: RequestContext) {\n await this.delete${pascal}UseCase.execute(ctx.params.id)\n ctx.noContent()\n }\n}\n`\n}\n\nfunction genRepositoryInterface(pascal: string, kebab: string): string {\n return `import type { ${pascal}ResponseDTO } from '../../application/dtos/${kebab}-response.dto'\nimport type { Create${pascal}DTO } from '../../application/dtos/create-${kebab}.dto'\nimport type { Update${pascal}DTO } from '../../application/dtos/update-${kebab}.dto'\nimport type { ParsedQuery } from '@forinda/kickjs-http'\n\nexport interface I${pascal}Repository {\n findById(id: string): Promise<${pascal}ResponseDTO | null>\n findAll(): Promise<${pascal}ResponseDTO[]>\n findPaginated(parsed: ParsedQuery): Promise<{ data: ${pascal}ResponseDTO[]; total: number }>\n create(dto: Create${pascal}DTO): Promise<${pascal}ResponseDTO>\n update(id: string, dto: Update${pascal}DTO): Promise<${pascal}ResponseDTO>\n delete(id: string): Promise<void>\n}\n\nexport const ${pascal.toUpperCase()}_REPOSITORY = Symbol('I${pascal}Repository')\n`\n}\n\nfunction genDomainService(pascal: string, kebab: string): string {\n return `import { Service, Inject, HttpException } from '@forinda/kickjs-core'\nimport { ${pascal.toUpperCase()}_REPOSITORY, type I${pascal}Repository } from '../repositories/${kebab}.repository'\n\n@Service()\nexport class ${pascal}DomainService {\n constructor(\n @Inject(${pascal.toUpperCase()}_REPOSITORY) private readonly repo: I${pascal}Repository,\n ) {}\n\n async ensureExists(id: string): Promise<void> {\n const entity = await this.repo.findById(id)\n if (!entity) throw HttpException.notFound('${pascal} not found')\n }\n}\n`\n}\n\nfunction genUseCases(\n pascal: string,\n kebab: string,\n plural: string,\n pluralPascal: string,\n): Array<{ file: string; content: string }> {\n return [\n {\n file: `create-${kebab}.use-case.ts`,\n content: `import { Service, Inject } from '@forinda/kickjs-core'\nimport { ${pascal.toUpperCase()}_REPOSITORY, type I${pascal}Repository } from '../../domain/repositories/${kebab}.repository'\nimport type { Create${pascal}DTO } from '../dtos/create-${kebab}.dto'\n\n@Service()\nexport class Create${pascal}UseCase {\n constructor(@Inject(${pascal.toUpperCase()}_REPOSITORY) private repo: I${pascal}Repository) {}\n async execute(dto: Create${pascal}DTO) { return this.repo.create(dto) }\n}\n`,\n },\n {\n file: `get-${kebab}.use-case.ts`,\n content: `import { Service, Inject } from '@forinda/kickjs-core'\nimport { ${pascal.toUpperCase()}_REPOSITORY, type I${pascal}Repository } from '../../domain/repositories/${kebab}.repository'\n\n@Service()\nexport class Get${pascal}UseCase {\n constructor(@Inject(${pascal.toUpperCase()}_REPOSITORY) private repo: I${pascal}Repository) {}\n async execute(id: string) { return this.repo.findById(id) }\n}\n`,\n },\n {\n file: `list-${plural}.use-case.ts`,\n content: `import { Service, Inject } from '@forinda/kickjs-core'\nimport type { ParsedQuery } from '@forinda/kickjs-http'\nimport { ${pascal.toUpperCase()}_REPOSITORY, type I${pascal}Repository } from '../../domain/repositories/${kebab}.repository'\n\n@Service()\nexport class List${pluralPascal}UseCase {\n constructor(@Inject(${pascal.toUpperCase()}_REPOSITORY) private repo: I${pascal}Repository) {}\n async execute(parsed: ParsedQuery) { return this.repo.findPaginated(parsed) }\n}\n`,\n },\n {\n file: `update-${kebab}.use-case.ts`,\n content: `import { Service, Inject } from '@forinda/kickjs-core'\nimport { ${pascal.toUpperCase()}_REPOSITORY, type I${pascal}Repository } from '../../domain/repositories/${kebab}.repository'\nimport type { Update${pascal}DTO } from '../dtos/update-${kebab}.dto'\n\n@Service()\nexport class Update${pascal}UseCase {\n constructor(@Inject(${pascal.toUpperCase()}_REPOSITORY) private repo: I${pascal}Repository) {}\n async execute(id: string, dto: Update${pascal}DTO) { return this.repo.update(id, dto) }\n}\n`,\n },\n {\n file: `delete-${kebab}.use-case.ts`,\n content: `import { Service, Inject } from '@forinda/kickjs-core'\nimport { ${pascal.toUpperCase()}_REPOSITORY, type I${pascal}Repository } from '../../domain/repositories/${kebab}.repository'\n\n@Service()\nexport class Delete${pascal}UseCase {\n constructor(@Inject(${pascal.toUpperCase()}_REPOSITORY) private repo: I${pascal}Repository) {}\n async execute(id: string) { return this.repo.delete(id) }\n}\n`,\n },\n ]\n}\n\n// ── Auto-register ───────────────────────────────────────────────────────\n\nasync function autoRegisterModule(\n modulesDir: string,\n pascal: string,\n plural: string,\n): Promise<void> {\n const indexPath = join(modulesDir, 'index.ts')\n const exists = await fileExists(indexPath)\n\n if (!exists) {\n await writeFileSafe(\n indexPath,\n `import type { AppModuleClass } from '@forinda/kickjs-core'\\nimport { ${pascal}Module } from './${plural}'\\n\\nexport const modules: AppModuleClass[] = [${pascal}Module]\\n`,\n )\n return\n }\n\n let content = await readFile(indexPath, 'utf-8')\n const importLine = `import { ${pascal}Module } from './${plural}'`\n\n if (!content.includes(`${pascal}Module`)) {\n const lastImportIdx = content.lastIndexOf('import ')\n if (lastImportIdx !== -1) {\n const lineEnd = content.indexOf('\\n', lastImportIdx)\n content = content.slice(0, lineEnd + 1) + importLine + '\\n' + content.slice(lineEnd + 1)\n } else {\n content = importLine + '\\n' + content\n }\n\n content = content.replace(/(=\\s*\\[)([\\s\\S]*?)(])/, (_match, open, existing, close) => {\n const trimmed = existing.trim()\n if (!trimmed) return `${open}${pascal}Module${close}`\n const needsComma = trimmed.endsWith(',') ? '' : ','\n return `${open}${existing.trimEnd()}${needsComma} ${pascal}Module${close}`\n })\n }\n\n await writeFile(indexPath, content, 'utf-8')\n}\n","import { cpSync, existsSync, mkdirSync } from 'node:fs'\nimport { resolve, join } from 'node:path'\nimport type { Command } from 'commander'\nimport { runShellCommand } from '../utils/shell'\nimport { loadKickConfig } from '../config'\n\nexport function registerRunCommands(program: Command): void {\n program\n .command('dev')\n .description('Start development server with Vite HMR (zero-downtime reload)')\n .option('-e, --entry <file>', 'Entry file', 'src/index.ts')\n .option('-p, --port <port>', 'Port number')\n .action((opts: any) => {\n const envVars: string[] = []\n if (opts.port) envVars.push(`PORT=${opts.port}`)\n\n // vite-node --watch gives true HMR via import.meta.hot.accept()\n // The Application.rebuild() swaps the Express handler on the existing\n // http.Server — DB, Redis, Socket.IO connections survive across reloads\n const cmd = `npx vite-node --watch ${opts.entry}`\n const fullCmd = envVars.length ? `${envVars.join(' ')} ${cmd}` : cmd\n\n console.log(`\\n KickJS dev server starting...`)\n console.log(` Entry: ${opts.entry}`)\n console.log(` HMR: enabled (vite-node)\\n`)\n\n try {\n runShellCommand(fullCmd)\n } catch {\n // Process exits on SIGINT — expected\n }\n })\n\n program\n .command('build')\n .description('Build for production via Vite')\n .action(async () => {\n console.log('\\n Building for production...\\n')\n runShellCommand('npx vite build')\n\n // Copy static directories to dist (e.g., templates, public assets)\n const config = await loadKickConfig(process.cwd())\n const copyDirs = config?.copyDirs ?? []\n\n if (copyDirs.length > 0) {\n console.log('\\n Copying directories to dist...')\n for (const entry of copyDirs) {\n const src = typeof entry === 'string' ? entry : entry.src\n const dest =\n typeof entry === 'string' ? join('dist', entry) : (entry.dest ?? join('dist', src))\n const srcPath = resolve(src)\n const destPath = resolve(dest)\n\n if (!existsSync(srcPath)) {\n console.log(` ⚠ Skipped ${src} (not found)`)\n continue\n }\n\n mkdirSync(destPath, { recursive: true })\n cpSync(srcPath, destPath, { recursive: true })\n console.log(` ✓ ${src} → ${dest}`)\n }\n }\n\n console.log('\\n Build complete.\\n')\n })\n\n program\n .command('start')\n .description('Start production server')\n .option('-e, --entry <file>', 'Entry file', 'dist/index.js')\n .option('-p, --port <port>', 'Port number')\n .action((opts: any) => {\n const envVars: string[] = ['NODE_ENV=production']\n if (opts.port) envVars.push(`PORT=${opts.port}`)\n runShellCommand(`${envVars.join(' ')} node ${opts.entry}`)\n })\n\n program\n .command('dev:debug')\n .description('Start dev server with Node.js inspector')\n .option('-e, --entry <file>', 'Entry file', 'src/index.ts')\n .option('-p, --port <port>', 'Port number')\n .action((opts: any) => {\n const envVars = opts.port ? `PORT=${opts.port} ` : ''\n try {\n runShellCommand(`${envVars}npx vite-node --inspect --watch ${opts.entry}`)\n } catch {\n // SIGINT\n }\n })\n}\n","import { execSync } from 'node:child_process'\n\n/** Run a shell command synchronously, printing output */\nexport function runShellCommand(command: string, cwd?: string): void {\n execSync(command, {\n cwd,\n stdio: 'inherit',\n })\n}\n","import { readFile, access } from 'node:fs/promises'\nimport { join } from 'node:path'\n\n/** A custom command that developers can register via kick.config.ts */\nexport interface KickCommandDefinition {\n /** The command name (e.g. 'db:migrate', 'seed', 'proto:gen') */\n name: string\n /** Description shown in --help */\n description: string\n /**\n * Shell command(s) to run. Can be a single string or an array of\n * sequential steps. Use {args} as a placeholder for CLI arguments.\n *\n * @example\n * 'npx drizzle-kit migrate'\n * ['npx drizzle-kit generate', 'npx drizzle-kit migrate']\n */\n steps: string | string[]\n /** Optional aliases (e.g. ['migrate'] for 'db:migrate') */\n aliases?: string[]\n}\n\n/** Project pattern — controls what generators produce and which deps are installed */\nexport type ProjectPattern = 'rest' | 'graphql' | 'ddd' | 'microservice' | 'minimal'\n\n/** Configuration for the kick.config.ts file */\nexport interface KickConfig {\n /**\n * Project pattern — controls default generator behavior.\n * - 'rest' — Express + Swagger (default)\n * - 'graphql' — GraphQL + GraphiQL\n * - 'ddd' — Full DDD modules with use cases, entities, value objects\n * - 'microservice' — REST + queue workers\n * - 'minimal' — Bare Express with no scaffolding\n */\n pattern?: ProjectPattern\n /** Where modules live (default: 'src/modules') */\n modulesDir?: string\n /** Default repository implementation for generators */\n defaultRepo?: 'drizzle' | 'inmemory' | 'prisma'\n /** Drizzle schema output directory */\n schemaDir?: string\n /**\n * Directories to copy to dist/ after build.\n * Useful for EJS templates, email templates, static assets, etc.\n *\n * @example\n * ```ts\n * copyDirs: [\n * 'src/views', // copies to dist/src/views\n * { src: 'src/views', dest: 'dist/views' }, // custom dest\n * 'src/emails',\n * ]\n * ```\n */\n copyDirs?: Array<string | { src: string; dest?: string }>\n /** Custom commands that extend the CLI */\n commands?: KickCommandDefinition[]\n /** Code style overrides (auto-detected from prettier when possible) */\n style?: {\n semicolons?: boolean\n quotes?: 'single' | 'double'\n trailingComma?: 'all' | 'es5' | 'none'\n indent?: number\n }\n}\n\n/** Helper to define a type-safe kick.config.ts */\nexport function defineConfig(config: KickConfig): KickConfig {\n return config\n}\n\nconst CONFIG_FILES = ['kick.config.ts', 'kick.config.js', 'kick.config.mjs', 'kick.config.json']\n\n/** Load kick.config.* from the project root */\nexport async function loadKickConfig(cwd: string): Promise<KickConfig | null> {\n for (const filename of CONFIG_FILES) {\n const filepath = join(cwd, filename)\n try {\n await access(filepath)\n } catch {\n continue\n }\n\n if (filename.endsWith('.json')) {\n const content = await readFile(filepath, 'utf-8')\n return JSON.parse(content)\n }\n\n // For .ts/.js/.mjs — dynamic import (use file URL for cross-platform compat)\n try {\n const { pathToFileURL } = await import('node:url')\n const mod = await import(pathToFileURL(filepath).href)\n return mod.default ?? mod\n } catch (err) {\n if (filename.endsWith('.ts')) {\n console.warn(\n `Warning: Failed to load ${filename}. TypeScript config files require ` +\n 'a runtime loader (e.g. tsx, ts-node) or use kick.config.js/.mjs instead.',\n )\n }\n continue\n }\n }\n return null\n}\n","import { platform, release, arch } from 'node:os'\nimport type { Command } from 'commander'\n\nexport function registerInfoCommand(program: Command): void {\n program\n .command('info')\n .description('Print system and framework info')\n .action(() => {\n console.log(`\n KickJS CLI\n\n System:\n OS: ${platform()} ${release()} (${arch()})\n Node: ${process.version}\n\n Packages:\n @forinda/kickjs-core workspace\n @forinda/kickjs-http workspace\n @forinda/kickjs-config workspace\n @forinda/kickjs-cli workspace\n`)\n })\n}\n","import type { Command } from 'commander'\nimport type { KickConfig, KickCommandDefinition } from '../config'\nimport { runShellCommand } from '../utils/shell'\n\n/**\n * Register custom commands defined in kick.config.ts\n *\n * Developers can extend the CLI with project-specific commands like:\n * kick db:migrate\n * kick db:generate\n * kick seed\n * kick proto:gen\n *\n * @example kick.config.ts\n * ```ts\n * import { defineConfig } from '@forinda/kickjs-cli'\n *\n * export default defineConfig({\n * commands: [\n * {\n * name: 'db:generate',\n * description: 'Generate Drizzle migrations from schema',\n * steps: 'npx drizzle-kit generate',\n * },\n * {\n * name: 'db:migrate',\n * description: 'Run database migrations',\n * steps: 'npx drizzle-kit migrate',\n * },\n * {\n * name: 'db:push',\n * description: 'Push schema directly (dev only)',\n * steps: 'npx drizzle-kit push',\n * },\n * {\n * name: 'db:studio',\n * description: 'Open Drizzle Studio GUI',\n * steps: 'npx drizzle-kit studio',\n * },\n * {\n * name: 'db:seed',\n * description: 'Run seed files',\n * steps: 'npx tsx src/db/seed.ts',\n * },\n * {\n * name: 'proto:gen',\n * description: 'Generate TypeScript from protobuf definitions',\n * steps: [\n * 'npx buf generate',\n * 'echo \"Protobuf types generated\"',\n * ],\n * },\n * ],\n * })\n * ```\n */\nexport function registerCustomCommands(program: Command, config: KickConfig | null): void {\n if (!config?.commands?.length) return\n\n for (const cmd of config.commands) {\n registerSingleCommand(program, cmd)\n }\n}\n\nfunction registerSingleCommand(program: Command, def: KickCommandDefinition): void {\n const command = program.command(def.name).description(def.description)\n\n if (def.aliases) {\n for (const alias of def.aliases) {\n command.alias(alias)\n }\n }\n\n // Accept arbitrary trailing arguments\n command.allowUnknownOption(true)\n command.argument('[args...]', 'Additional arguments passed to the command')\n\n command.action((args: string[]) => {\n const extraArgs = args.join(' ')\n const steps = Array.isArray(def.steps) ? def.steps : [def.steps]\n\n for (const step of steps) {\n // Replace {args} placeholder with CLI arguments\n const finalCmd = extraArgs ? `${step} ${extraArgs}` : step\n console.log(` $ ${finalCmd}`)\n try {\n runShellCommand(finalCmd)\n } catch (err: any) {\n console.error(` Command failed: ${def.name}`)\n process.exitCode = 1\n return\n }\n }\n })\n}\n","import type { Command } from 'commander'\n\n// ── ANSI helpers (no deps) ──────────────────────────────────────────────────\nconst esc = (code: string) => `\\x1b[${code}m`\nconst reset = esc('0')\nconst bold = (s: string) => `${esc('1')}${s}${reset}`\nconst dim = (s: string) => `${esc('2')}${s}${reset}`\nconst green = (s: string) => `${esc('32')}${s}${reset}`\nconst red = (s: string) => `${esc('31')}${s}${reset}`\nconst yellow = (s: string) => `${esc('33')}${s}${reset}`\nconst cyan = (s: string) => `${esc('36')}${s}${reset}`\nconst magenta = (s: string) => `${esc('35')}${s}${reset}`\nconst blue = (s: string) => `${esc('34')}${s}${reset}`\n\nconst METHOD_COLORS: Record<string, (s: string) => string> = {\n GET: green,\n POST: cyan,\n PUT: yellow,\n PATCH: magenta,\n DELETE: red,\n}\n\nfunction colorMethod(method: string): string {\n const fn = METHOD_COLORS[method] ?? dim\n return fn(method.padEnd(7))\n}\n\nfunction formatUptime(seconds: number): string {\n const d = Math.floor(seconds / 86400)\n const h = Math.floor((seconds % 86400) / 3600)\n const m = Math.floor((seconds % 3600) / 60)\n const s = seconds % 60\n const parts: string[] = []\n if (d) parts.push(`${d}d`)\n if (h) parts.push(`${h}h`)\n if (m) parts.push(`${m}m`)\n parts.push(`${s}s`)\n return parts.join(' ')\n}\n\n// ── Fetch helpers ───────────────────────────────────────────────────────────\n\nasync function fetchJson(url: string): Promise<any> {\n const res = await fetch(url, { signal: AbortSignal.timeout(5000) })\n if (!res.ok) throw new Error(`${res.status} ${res.statusText}`)\n return res.json()\n}\n\nasync function fetchEndpoint(base: string, path: string): Promise<any> {\n try {\n return await fetchJson(`${base}${path}`)\n } catch {\n return null\n }\n}\n\ninterface InspectData {\n health: any\n metrics: any\n routes: any\n container: any\n ws: any\n}\n\nasync function fetchAll(base: string): Promise<InspectData> {\n const [health, metrics, routes, container, ws] = await Promise.all([\n fetchEndpoint(base, '/health'),\n fetchEndpoint(base, '/metrics'),\n fetchEndpoint(base, '/routes'),\n fetchEndpoint(base, '/container'),\n fetchEndpoint(base, '/ws'),\n ])\n return { health, metrics, routes, container, ws }\n}\n\n// ── Display ─────────────────────────────────────────────────────────────────\n\nfunction printSummary(base: string, data: InspectData): void {\n const { health, metrics, routes, container, ws } = data\n const line = dim('─'.repeat(60))\n\n console.log()\n console.log(bold(` KickJS Inspector`) + dim(` → ${base}`))\n console.log(line)\n\n // Health\n if (health) {\n const statusText = health.status === 'healthy' ? green('● healthy') : red('● ' + health.status)\n console.log(` ${bold('Health:')} ${statusText}`)\n } else {\n console.log(` ${bold('Health:')} ${red('● unreachable')}`)\n }\n\n // Metrics\n if (metrics) {\n const rate = ((metrics.errorRate ?? 0) * 100).toFixed(1)\n const rateColor = metrics.errorRate > 0.1 ? red : metrics.errorRate > 0 ? yellow : green\n console.log(` ${bold('Uptime:')} ${formatUptime(metrics.uptimeSeconds)}`)\n console.log(` ${bold('Requests:')} ${metrics.requests}`)\n console.log(\n ` ${bold('Errors:')} ${metrics.serverErrors} server, ${metrics.clientErrors ?? 0} client ${dim('(')}${rateColor(rate + '%')}${dim(')')}`,\n )\n }\n\n // Container\n if (container) {\n console.log(` ${bold('DI:')} ${container.count} bindings`)\n }\n\n // WebSocket\n if (ws && ws.enabled) {\n console.log(\n ` ${bold('WS:')} ${ws.connections ?? 0} connections, ${ws.namespaces ?? 0} namespaces`,\n )\n }\n\n // Routes table\n if (routes?.routes?.length) {\n console.log()\n console.log(bold(' Routes'))\n console.log(line)\n console.log(` ${dim('METHOD')} ${dim('PATH'.padEnd(36))} ${dim('CONTROLLER')}`)\n for (const r of routes.routes) {\n const path = r.path.length > 36 ? r.path.slice(0, 33) + '...' : r.path.padEnd(36)\n console.log(` ${colorMethod(r.method)} ${path} ${blue(r.controller)}.${dim(r.handler)}`)\n }\n }\n\n console.log(line)\n console.log()\n}\n\n// ── Command Registration ────────────────────────────────────────────────────\n\nexport function registerInspectCommand(program: Command): void {\n program\n .command('inspect [url]')\n .description('Connect to a running KickJS app and display debug info')\n .option('-p, --port <port>', 'Override port')\n .option('-w, --watch', 'Poll every 5 seconds')\n .option('-j, --json', 'Output raw JSON')\n .action(\n async (url: string | undefined, opts: { port?: string; watch?: boolean; json?: boolean }) => {\n let base = url ?? 'http://localhost:3000'\n\n // Override port if provided\n if (opts.port) {\n try {\n const parsed = new URL(base)\n parsed.port = opts.port\n base = parsed.origin\n } catch {\n base = `http://localhost:${opts.port}`\n }\n }\n\n const debugBase = `${base.replace(/\\/$/, '')}/_debug`\n\n const run = async () => {\n try {\n const data = await fetchAll(debugBase)\n\n if (opts.json) {\n console.log(JSON.stringify(data, null, 2))\n } else {\n printSummary(base, data)\n }\n } catch (err) {\n if (opts.json) {\n console.log(JSON.stringify({ error: String(err) }))\n } else {\n console.error(red(` ✖ Could not connect to ${base}`))\n console.error(dim(` ${err instanceof Error ? err.message : String(err)}`))\n }\n if (!opts.watch) process.exitCode = 1\n }\n }\n\n if (opts.watch) {\n const poll = async () => {\n process.stdout.write('\\x1b[2J\\x1b[H') // clear screen\n await run()\n }\n await poll()\n setInterval(poll, 5000)\n } else {\n await run()\n }\n },\n )\n}\n","import { execSync } from 'node:child_process'\nimport { existsSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport type { Command } from 'commander'\n\n/** Registry of KickJS packages and their required peer dependencies */\nconst PACKAGE_REGISTRY: Record<\n string,\n { pkg: string; peers: string[]; description: string; dev?: boolean }\n> = {\n // Core (already installed by kick new)\n core: {\n pkg: '@forinda/kickjs-core',\n peers: [],\n description: 'DI container, decorators, reactivity',\n },\n http: {\n pkg: '@forinda/kickjs-http',\n peers: ['express'],\n description: 'Express 5, routing, middleware',\n },\n config: { pkg: '@forinda/kickjs-config', peers: [], description: 'Zod-based env validation' },\n cli: {\n pkg: '@forinda/kickjs-cli',\n peers: [],\n description: 'CLI tool and code generators',\n dev: true,\n },\n\n // API\n swagger: {\n pkg: '@forinda/kickjs-swagger',\n peers: [],\n description: 'OpenAPI spec + Swagger UI + ReDoc',\n },\n graphql: {\n pkg: '@forinda/kickjs-graphql',\n peers: ['graphql'],\n description: 'GraphQL resolvers + GraphiQL',\n },\n\n // Database\n drizzle: {\n pkg: '@forinda/kickjs-drizzle',\n peers: ['drizzle-orm'],\n description: 'Drizzle ORM adapter + query builder',\n },\n prisma: {\n pkg: '@forinda/kickjs-prisma',\n peers: ['@prisma/client'],\n description: 'Prisma adapter + query builder',\n },\n\n // Real-time\n ws: {\n pkg: '@forinda/kickjs-ws',\n peers: ['socket.io'],\n description: 'WebSocket with @WsController decorators',\n },\n\n // Observability\n otel: {\n pkg: '@forinda/kickjs-otel',\n peers: ['@opentelemetry/api'],\n description: 'OpenTelemetry tracing + metrics',\n },\n\n // DevTools\n devtools: {\n pkg: '@forinda/kickjs-devtools',\n peers: [],\n description: 'Development dashboard — routes, DI, metrics, health',\n dev: true,\n },\n\n // Auth\n auth: {\n pkg: '@forinda/kickjs-auth',\n peers: ['jsonwebtoken'],\n description: 'Authentication — JWT, API key, and custom strategies',\n },\n\n // Mailer\n mailer: {\n pkg: '@forinda/kickjs-mailer',\n peers: ['nodemailer'],\n description: 'Email sending — SMTP, Resend, SES, or custom provider',\n },\n\n // Cron\n cron: {\n pkg: '@forinda/kickjs-cron',\n peers: ['croner'],\n description: 'Cron job scheduling (production-grade with croner)',\n },\n\n // Queue\n queue: {\n pkg: '@forinda/kickjs-queue',\n peers: [],\n description: 'Queue adapter (BullMQ/RabbitMQ/Kafka)',\n },\n 'queue:bullmq': {\n pkg: '@forinda/kickjs-queue',\n peers: ['bullmq', 'ioredis'],\n description: 'Queue with BullMQ + Redis',\n },\n 'queue:rabbitmq': {\n pkg: '@forinda/kickjs-queue',\n peers: ['amqplib'],\n description: 'Queue with RabbitMQ',\n },\n 'queue:kafka': {\n pkg: '@forinda/kickjs-queue',\n peers: ['kafkajs'],\n description: 'Queue with Kafka',\n },\n\n // Multi-tenancy\n 'multi-tenant': {\n pkg: '@forinda/kickjs-multi-tenant',\n peers: [],\n description: 'Tenant resolution middleware',\n },\n\n // Notifications\n notifications: {\n pkg: '@forinda/kickjs-notifications',\n peers: [],\n description: 'Multi-channel notifications — email, Slack, Discord, webhook',\n },\n\n // Testing\n testing: {\n pkg: '@forinda/kickjs-testing',\n peers: [],\n description: 'Test utilities and TestModule builder',\n dev: true,\n },\n}\n\nfunction detectPackageManager(): string {\n if (existsSync(resolve('pnpm-lock.yaml'))) return 'pnpm'\n if (existsSync(resolve('yarn.lock'))) return 'yarn'\n return 'npm'\n}\n\nexport function registerAddCommand(program: Command): void {\n program\n .command('add [packages...]')\n .description('Add KickJS packages with their required dependencies')\n .option('--pm <manager>', 'Package manager override')\n .option('-D, --dev', 'Install as dev dependency')\n .option('--list', 'List all available packages')\n .action(async (packages: string[], opts: any) => {\n // List mode\n if (opts.list || packages.length === 0) {\n console.log('\\n Available KickJS packages:\\n')\n const maxName = Math.max(...Object.keys(PACKAGE_REGISTRY).map((k) => k.length))\n for (const [name, info] of Object.entries(PACKAGE_REGISTRY)) {\n const padded = name.padEnd(maxName + 2)\n const peers = info.peers.length ? ` (+ ${info.peers.join(', ')})` : ''\n console.log(` ${padded} ${info.description}${peers}`)\n }\n console.log('\\n Usage: kick add graphql drizzle otel')\n console.log(' kick add queue:bullmq')\n console.log()\n return\n }\n\n const pm = opts.pm ?? detectPackageManager()\n const forceDevFlag = opts.dev\n const prodDeps = new Set<string>()\n const devDeps = new Set<string>()\n const unknown: string[] = []\n\n for (const name of packages) {\n const entry = PACKAGE_REGISTRY[name]\n if (!entry) {\n unknown.push(name)\n continue\n }\n const target = forceDevFlag || entry.dev ? devDeps : prodDeps\n target.add(entry.pkg)\n for (const peer of entry.peers) {\n target.add(peer)\n }\n }\n\n if (unknown.length > 0) {\n console.log(`\\n Unknown packages: ${unknown.join(', ')}`)\n console.log(' Run \"kick add --list\" to see available packages.\\n')\n if (prodDeps.size === 0 && devDeps.size === 0) return\n }\n\n // Install production dependencies\n if (prodDeps.size > 0) {\n const deps = Array.from(prodDeps)\n const cmd = `${pm} add ${deps.join(' ')}`\n console.log(`\\n Installing ${deps.length} dependency(ies):`)\n for (const dep of deps) console.log(` + ${dep}`)\n console.log()\n try {\n execSync(cmd, { stdio: 'inherit' })\n } catch {\n console.log(`\\n Installation failed. Run manually:\\n ${cmd}\\n`)\n }\n }\n\n // Install dev dependencies\n if (devDeps.size > 0) {\n const deps = Array.from(devDeps)\n const cmd = `${pm} add -D ${deps.join(' ')}`\n console.log(`\\n Installing ${deps.length} dev dependency(ies):`)\n for (const dep of deps) console.log(` + ${dep} (dev)`)\n console.log()\n try {\n execSync(cmd, { stdio: 'inherit' })\n } catch {\n console.log(`\\n Installation failed. Run manually:\\n ${cmd}\\n`)\n }\n }\n\n console.log(' Done!\\n')\n })\n}\n","import { resolve, join } from 'node:path'\nimport { existsSync } from 'node:fs'\nimport { pathToFileURL } from 'node:url'\nimport { fork } from 'node:child_process'\nimport type { Command } from 'commander'\n\nexport function registerTinkerCommand(program: Command): void {\n program\n .command('tinker')\n .description('Interactive REPL with DI container and services loaded')\n .option('-e, --entry <file>', 'Entry file to load', 'src/index.ts')\n .action(async (opts: any) => {\n const cwd = process.cwd()\n const entryPath = resolve(cwd, opts.entry)\n\n if (!existsSync(entryPath)) {\n console.error(`\\n Error: ${opts.entry} not found.\\n`)\n process.exit(1)\n }\n\n // Find tsx for TypeScript + decorator support\n const tsxBin = findBin(cwd, 'tsx')\n if (!tsxBin) {\n console.error('\\n Error: tsx not found. Install it: pnpm add -D tsx\\n')\n process.exit(1)\n }\n\n // Write a temporary tinker script that loads the app and starts REPL\n const tinkerScript = generateTinkerScript(entryPath, opts.entry)\n const tmpFile = join(cwd, '.kick-tinker.mjs')\n\n const { writeFileSync, unlinkSync } = await import('node:fs')\n writeFileSync(tmpFile, tinkerScript, 'utf-8')\n\n try {\n // Run the tinker script under tsx (inherits stdio for interactive REPL)\n const child = fork(tmpFile, [], {\n cwd,\n execPath: tsxBin,\n stdio: 'inherit',\n })\n\n await new Promise<void>((resolve) => {\n child.on('exit', () => resolve())\n })\n } finally {\n // Clean up temp file\n try {\n unlinkSync(tmpFile)\n } catch {\n // ignore\n }\n }\n })\n}\n\nfunction generateTinkerScript(entryPath: string, displayPath: string): string {\n const entryUrl = pathToFileURL(entryPath).href\n\n return `\nimport 'reflect-metadata'\n\n// Prevent bootstrap() from starting the HTTP server\nprocess.env.KICK_TINKER = '1'\n\nconsole.log('\\\\n 🔧 KickJS Tinker')\nconsole.log(' Loading: ${displayPath}\\\\n')\n\n// Load core\nlet Container, Logger, HttpException, HttpStatus\ntry {\n const core = await import('@forinda/kickjs-core')\n Container = core.Container\n Logger = core.Logger\n HttpException = core.HttpException\n HttpStatus = core.HttpStatus\n} catch {\n console.error(' Error: @forinda/kickjs-core not found.')\n console.error(' Install it: pnpm add @forinda/kickjs-core\\\\n')\n process.exit(1)\n}\n\n// Load entry to trigger decorator registration\ntry {\n await import('${entryUrl}')\n} catch (err) {\n console.warn(' Warning: ' + err.message)\n console.warn(' Container may be partially initialized.\\\\n')\n}\n\nconst container = Container.getInstance()\n\n// Start REPL\nconst repl = await import('node:repl')\nconst server = repl.start({ prompt: 'kick> ', useGlobal: true })\n\nserver.context.container = container\nserver.context.Container = Container\nserver.context.resolve = (token) => container.resolve(token)\nserver.context.Logger = Logger\nserver.context.HttpException = HttpException\nserver.context.HttpStatus = HttpStatus\n\nconsole.log(' Available globals:')\nconsole.log(' container — DI container instance')\nconsole.log(' resolve(T) — shorthand for container.resolve(T)')\nconsole.log(' Container, Logger, HttpException, HttpStatus')\nconsole.log()\n\nserver.on('exit', () => {\n console.log('\\\\n Goodbye!\\\\n')\n process.exit(0)\n})\n`\n}\n\nfunction findBin(startDir: string, name: string): string | null {\n let dir = startDir\n while (true) {\n const candidate = join(dir, 'node_modules', '.bin', name)\n if (existsSync(candidate)) return candidate\n const parent = resolve(dir, '..')\n if (parent === dir) break\n dir = parent\n }\n return null\n}\n"],"mappings":"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","names":["Command","readFileSync","dirname","join","fileURLToPath","resolve","basename","createInterface","existsSync","readdirSync","rmSync","join","dirname","execSync","readFileSync","fileURLToPath","writeFile","mkdir","access","readFile","dirname","writeFileSafe","filePath","content","mkdir","dirname","recursive","writeFile","fileExists","filePath","access","__dirname","dirname","fileURLToPath","url","cliPkg","JSON","parse","readFileSync","join","KICKJS_VERSION","version","initProject","options","name","directory","packageManager","template","dir","console","log","baseDeps","express","zod","pino","writeFileSafe","stringify","type","scripts","dev","build","start","test","typecheck","lint","format","dependencies","devDependencies","vite","vitest","typescript","prettier","compilerOptions","target","module","moduleResolution","lib","types","strict","esModuleInterop","skipLibCheck","sourceMap","declaration","experimentalDecorators","emitDecoratorMetadata","outDir","rootDir","paths","include","semi","singleQuote","trailingComma","printWidth","tabWidth","getEntryFile","initGit","execSync","cwd","stdio","installDeps","needsCd","process","genHint","rest","graphql","ddd","microservice","minimal","ask","question","defaultValue","rl","createInterface","input","process","stdin","output","stdout","suffix","Promise","res","answer","close","trim","choose","options","defaultIdx","console","log","i","length","marker","String","idx","parseInt","confirm","defaultYes","hint","toLowerCase","startsWith","registerInitCommand","program","command","alias","description","option","action","name","opts","directory","resolve","basename","existsSync","entries","readdirSync","force","shown","slice","entry","shouldClear","rmSync","recursive","template","templateMap","packageManager","pm","initGit","git","undefined","installDeps","install","initProject","resolve","join","toPascalCase","name","replace","_","c","toUpperCase","toCamelCase","pascal","charAt","toLowerCase","slice","toKebabCase","pluralize","endsWith","test","pluralizePascal","readFile","writeFile","generateModuleIndex","pascal","kebab","plural","repo","repoClass","repoFile","toUpperCase","generateController","pascal","kebab","plural","pluralPascal","toUpperCase","generateConstants","pascal","toUpperCase","generateCreateDTO","pascal","kebab","generateUpdateDTO","generateResponseDTO","generateUseCases","pascal","kebab","plural","pluralPascal","file","content","toUpperCase","generateRepositoryInterface","pascal","kebab","toUpperCase","generateInMemoryRepository","generateDomainService","pascal","kebab","toUpperCase","generateEntity","generateValueObject","generateControllerTest","pascal","kebab","plural","generateRepositoryTest","generateModule","options","name","modulesDir","noEntity","noTests","repo","minimal","kebab","toKebabCase","pascal","toPascalCase","camel","toCamelCase","plural","pluralize","pluralPascal","pluralizePascal","moduleDir","join","files","write","relativePath","content","fullPath","writeFileSafe","push","generateModuleIndex","generateConstants","generateController","generateCreateDTO","generateUpdateDTO","generateResponseDTO","useCases","generateUseCases","uc","file","generateRepositoryInterface","generateDomainService","generateInMemoryRepository","generateEntity","generateValueObject","generateControllerTest","generateRepositoryTest","autoRegisterModule","indexPath","exists","fileExists","readFile","importLine","includes","lastImportIdx","lastIndexOf","lineEnd","indexOf","slice","replace","_match","open","existing","close","trimmed","trim","needsComma","endsWith","trimEnd","writeFile","join","generateAdapter","options","name","outDir","kebab","toKebabCase","pascal","toPascalCase","files","filePath","join","writeFileSafe","push","join","generateMiddleware","options","name","outDir","kebab","toKebabCase","camel","toCamelCase","files","filePath","join","writeFileSafe","toPascalCase","push","join","generateGuard","options","name","outDir","kebab","toKebabCase","camel","toCamelCase","pascal","toPascalCase","files","filePath","join","writeFileSafe","push","join","generateService","options","name","outDir","kebab","toKebabCase","pascal","toPascalCase","files","filePath","join","writeFileSafe","push","join","generateController","options","name","outDir","kebab","toKebabCase","pascal","toPascalCase","files","filePath","join","writeFileSafe","push","join","generateDto","options","name","outDir","kebab","toKebabCase","pascal","toPascalCase","camel","toCamelCase","files","filePath","join","writeFileSafe","push","join","existsSync","createInterface","confirm","message","rl","createInterface","input","process","stdin","output","stdout","Promise","resolve","question","answer","close","trim","toLowerCase","generateConfig","options","filePath","join","outDir","modulesDir","defaultRepo","existsSync","force","overwrite","console","log","writeFileSafe","join","generateResolver","options","name","outDir","pascal","toPascalCase","kebab","toKebabCase","camel","toCamelCase","files","write","relativePath","content","fullPath","join","writeFileSafe","push","join","generateJob","options","name","outDir","pascal","toPascalCase","kebab","toKebabCase","camel","toCamelCase","queueName","queue","files","write","relativePath","content","fullPath","join","writeFileSafe","push","join","readFile","writeFile","TYPE_MAP","string","ts","zod","text","number","int","float","boolean","date","email","url","uuid","json","parseFields","raw","map","f","colonIdx","indexOf","Error","namePart","slice","typePart","optional","endsWith","cleanType","startsWith","values","split","name","type","tsType","v","join","zodType","mapped","validTypes","Object","keys","generateScaffold","options","fields","modulesDir","noEntity","noTests","repo","kebab","toKebabCase","pascal","toPascalCase","camel","toCamelCase","plural","pluralize","pluralPascal","pluralizePascal","moduleDir","files","write","relativePath","content","fullPath","writeFileSafe","push","genModuleIndex","genConstants","genController","genCreateDTO","genUpdateDTO","genResponseDTO","useCases","genUseCases","uc","file","genRepositoryInterface","genDomainService","genInMemoryRepository","genEntity","genValueObject","autoRegisterModule","zodFields","base","tsFields","stringFields","filter","numberFields","allFieldNames","filterable","sortable","searchable","length","toUpperCase","fieldAssignments","fieldSpread","propsInterface","createParams","createAssignments","getters","toJsonFields","indexPath","exists","fileExists","readFile","importLine","includes","lastImportIdx","lastIndexOf","lineEnd","replace","_match","open","existing","close","trimmed","trim","needsComma","trimEnd","writeFile","printGenerated","files","cwd","process","console","log","length","f","replace","registerGenerateCommand","program","gen","command","alias","description","option","action","name","opts","generateModule","modulesDir","resolve","noEntity","entity","noTests","tests","repo","minimal","generateAdapter","outDir","out","generateMiddleware","generateGuard","generateService","generateController","generateDto","generateResolver","generateJob","queue","rawFields","error","exit","fields","parseFields","generateScaffold","type","optional","generateConfig","defaultRepo","force","cpSync","existsSync","mkdirSync","resolve","join","execSync","runShellCommand","command","cwd","execSync","stdio","readFile","access","join","CONFIG_FILES","loadKickConfig","cwd","filename","filepath","join","access","endsWith","content","readFile","JSON","parse","pathToFileURL","mod","href","default","err","console","warn","registerRunCommands","program","command","description","option","action","opts","envVars","port","push","cmd","entry","fullCmd","length","join","console","log","runShellCommand","config","loadKickConfig","process","cwd","copyDirs","src","dest","srcPath","resolve","destPath","existsSync","mkdirSync","recursive","cpSync","platform","release","arch","registerInfoCommand","program","command","description","action","console","log","platform","release","arch","process","version","registerCustomCommands","program","config","commands","length","cmd","registerSingleCommand","def","command","name","description","aliases","alias","allowUnknownOption","argument","action","args","extraArgs","join","steps","Array","isArray","step","finalCmd","console","log","runShellCommand","err","error","process","exitCode","esc","code","reset","bold","s","dim","green","red","yellow","cyan","magenta","blue","METHOD_COLORS","GET","POST","PUT","PATCH","DELETE","colorMethod","method","fn","padEnd","formatUptime","seconds","d","Math","floor","h","m","parts","push","join","fetchJson","url","res","fetch","signal","AbortSignal","timeout","ok","Error","status","statusText","json","fetchEndpoint","base","path","fetchAll","health","metrics","routes","container","ws","Promise","all","printSummary","data","line","repeat","console","log","rate","errorRate","toFixed","rateColor","uptimeSeconds","requests","serverErrors","clientErrors","count","enabled","connections","namespaces","length","r","slice","controller","handler","registerInspectCommand","program","command","description","option","action","opts","port","parsed","URL","origin","debugBase","replace","run","JSON","stringify","err","error","String","message","watch","process","exitCode","poll","stdout","write","setInterval","execSync","existsSync","resolve","PACKAGE_REGISTRY","core","pkg","peers","description","http","config","cli","dev","swagger","graphql","drizzle","prisma","ws","otel","devtools","auth","mailer","cron","queue","notifications","testing","detectPackageManager","existsSync","resolve","registerAddCommand","program","command","option","action","packages","opts","list","length","console","log","maxName","Math","max","Object","keys","map","k","name","info","entries","padded","padEnd","join","pm","forceDevFlag","prodDeps","Set","devDeps","unknown","entry","push","target","add","peer","size","deps","Array","from","cmd","dep","execSync","stdio","resolve","join","existsSync","pathToFileURL","fork","registerTinkerCommand","program","command","description","option","action","opts","cwd","process","entryPath","resolve","entry","existsSync","console","error","exit","tsxBin","findBin","tinkerScript","generateTinkerScript","tmpFile","join","writeFileSync","unlinkSync","child","fork","execPath","stdio","Promise","on","displayPath","entryUrl","pathToFileURL","href","startDir","name","dir","candidate","parent","__dirname","dirname","fileURLToPath","url","pkg","JSON","parse","readFileSync","join","main","program","Command","name","description","version","config","loadKickConfig","process","cwd","registerInitCommand","registerGenerateCommand","registerRunCommands","registerInfoCommand","registerInspectCommand","registerAddCommand","registerTinkerCommand","registerCustomCommands","showHelpAfterError","parseAsync","argv","catch","err","console","error","Error","message","exitCode"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../src/commands/init.ts","../src/generators/project.ts","../src/utils/fs.ts","../src/commands/generate.ts","../src/generators/module.ts","../src/utils/naming.ts","../src/generators/templates/module-index.ts","../src/generators/templates/controller.ts","../src/generators/templates/constants.ts","../src/generators/templates/dtos.ts","../src/generators/templates/use-cases.ts","../src/generators/templates/repository.ts","../src/generators/templates/domain.ts","../src/generators/templates/tests.ts","../src/generators/templates/rest-service.ts","../src/generators/templates/cqrs.ts","../src/generators/adapter.ts","../src/generators/middleware.ts","../src/utils/resolve-out-dir.ts","../src/generators/guard.ts","../src/generators/service.ts","../src/generators/controller.ts","../src/generators/dto.ts","../src/generators/config.ts","../src/generators/resolver.ts","../src/generators/job.ts","../src/generators/scaffold.ts","../src/generators/test.ts","../src/config.ts","../src/commands/run.ts","../src/utils/shell.ts","../src/commands/info.ts","../src/commands/custom.ts","../src/commands/inspect.ts","../src/commands/add.ts","../src/commands/tinker.ts"],"sourcesContent":["import { Command } from 'commander'\nimport { readFileSync } from 'node:fs'\nimport { dirname, join } from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport { registerInitCommand } from './commands/init'\nimport { registerGenerateCommand } from './commands/generate'\nimport { registerRunCommands } from './commands/run'\nimport { registerInfoCommand } from './commands/info'\nimport { registerCustomCommands } from './commands/custom'\nimport { registerInspectCommand } from './commands/inspect'\nimport { registerAddCommand, registerListCommand } from './commands/add'\nimport { registerTinkerCommand } from './commands/tinker'\nimport { loadKickConfig } from './config'\n\nconst __dirname = dirname(fileURLToPath(import.meta.url))\nconst pkg = JSON.parse(readFileSync(join(__dirname, '..', 'package.json'), 'utf-8'))\n\nasync function main() {\n const program = new Command()\n\n program\n .name('kick')\n .description('KickJS — A production-grade, decorator-driven Node.js framework')\n .version(pkg.version)\n\n // Load project-level config for custom commands and generator defaults\n const config = await loadKickConfig(process.cwd())\n\n registerInitCommand(program)\n registerGenerateCommand(program)\n registerRunCommands(program)\n registerInfoCommand(program)\n registerInspectCommand(program)\n registerAddCommand(program)\n registerListCommand(program)\n registerTinkerCommand(program)\n registerCustomCommands(program, config)\n\n program.showHelpAfterError()\n\n await program.parseAsync(process.argv)\n}\n\nmain().catch((err) => {\n console.error(err instanceof Error ? err.message : err)\n process.exitCode = 1\n})\n","import { resolve, basename } from 'node:path'\nimport { createInterface } from 'node:readline'\nimport { existsSync, readdirSync, rmSync } from 'node:fs'\nimport type { Command } from 'commander'\nimport { initProject } from '../generators/project'\n\nfunction ask(question: string, defaultValue?: string): Promise<string> {\n const rl = createInterface({ input: process.stdin, output: process.stdout })\n const suffix = defaultValue ? ` (${defaultValue})` : ''\n return new Promise((res) => {\n rl.question(` ${question}${suffix}: `, (answer) => {\n rl.close()\n res(answer.trim() || defaultValue || '')\n })\n })\n}\n\nasync function choose(question: string, options: string[], defaultIdx = 0): Promise<string> {\n console.log(` ${question}`)\n for (let i = 0; i < options.length; i++) {\n const marker = i === defaultIdx ? '>' : ' '\n console.log(` ${marker} ${i + 1}. ${options[i]}`)\n }\n const answer = await ask('Choose', String(defaultIdx + 1))\n const idx = parseInt(answer, 10) - 1\n return options[idx] ?? options[defaultIdx]\n}\n\nasync function confirm(question: string, defaultYes = true): Promise<boolean> {\n const hint = defaultYes ? 'Y/n' : 'y/N'\n const answer = await ask(`${question} (${hint})`)\n if (!answer) return defaultYes\n return answer.toLowerCase().startsWith('y')\n}\n\nexport function registerInitCommand(program: Command): void {\n program\n .command('new [name]')\n .alias('init')\n .description('Create a new KickJS project (use \".\" for current directory)')\n .option('-d, --directory <dir>', 'Target directory (defaults to project name)')\n .option('--pm <manager>', 'Package manager: pnpm | npm | yarn')\n .option('--git', 'Initialize git repository')\n .option('--no-git', 'Skip git initialization')\n .option('--install', 'Install dependencies after scaffolding')\n .option('--no-install', 'Skip dependency installation')\n .option('-f, --force', 'Remove existing files without prompting')\n .option('-t, --template <type>', 'Project template: rest | graphql | ddd | cqrs | minimal')\n .action(async (name: string | undefined, opts: any) => {\n console.log()\n\n // Resolve project name — support \".\" for current directory\n if (!name) {\n name = await ask('Project name', 'my-api')\n }\n\n let directory: string\n if (name === '.') {\n directory = resolve('.')\n name = basename(directory)\n } else {\n directory = resolve(opts.directory || name)\n }\n\n // Check if target directory exists and is non-empty\n if (existsSync(directory)) {\n const entries = readdirSync(directory)\n if (entries.length > 0) {\n if (opts.force) {\n console.log(` Clearing existing files in ${directory}...\\n`)\n } else {\n console.log(` Directory \"${name}\" is not empty:`)\n const shown = entries.slice(0, 5)\n for (const entry of shown) {\n console.log(` - ${entry}`)\n }\n if (entries.length > 5) {\n console.log(` ... and ${entries.length - 5} more`)\n }\n console.log()\n const shouldClear = await confirm('Remove all existing files and proceed?', false)\n if (!shouldClear) {\n console.log(' Aborted.\\n')\n return\n }\n }\n // Remove contents but keep the directory itself\n for (const entry of entries) {\n rmSync(resolve(directory, entry), { recursive: true, force: true })\n }\n }\n }\n\n // Template — prompt if not provided via --template\n let template = opts.template\n if (!template) {\n template = await choose(\n 'Project template:',\n [\n 'REST API (Express + Swagger)',\n 'GraphQL API (GraphQL + GraphiQL)',\n 'DDD (Domain-Driven Design modules)',\n 'CQRS (Commands, Queries, Events + WS/Queue)',\n 'Minimal (bare Express)',\n ],\n 0,\n )\n // Map display names to config values\n const templateMap: Record<string, string> = {\n 'REST API (Express + Swagger)': 'rest',\n 'GraphQL API (GraphQL + GraphiQL)': 'graphql',\n 'DDD (Domain-Driven Design modules)': 'ddd',\n 'CQRS (Commands, Queries, Events + WS/Queue)': 'cqrs',\n 'Minimal (bare Express)': 'minimal',\n }\n template = templateMap[template] ?? 'rest'\n }\n\n // Package manager — prompt if not provided via --pm\n let packageManager = opts.pm\n if (!packageManager) {\n packageManager = await choose('Package manager:', ['pnpm', 'npm', 'yarn'], 0)\n }\n\n // Git init — prompt if not explicitly set\n let initGit: boolean\n if (opts.git === undefined) {\n initGit = await confirm('Initialize git repository?', true)\n } else {\n initGit = opts.git\n }\n\n // Install deps — prompt if not explicitly set\n let installDeps: boolean\n if (opts.install === undefined) {\n installDeps = await confirm('Install dependencies?', true)\n } else {\n installDeps = opts.install\n }\n\n await initProject({\n name,\n directory,\n packageManager,\n initGit,\n installDeps,\n template,\n })\n })\n}\n","import { join, dirname } from 'node:path'\nimport { execSync } from 'node:child_process'\nimport { readFileSync } from 'node:fs'\nimport { fileURLToPath } from 'node:url'\nimport { writeFileSafe } from '../utils/fs'\n\nconst __dirname = dirname(fileURLToPath(import.meta.url))\nconst cliPkg = JSON.parse(readFileSync(join(__dirname, '..', 'package.json'), 'utf-8'))\nconst KICKJS_VERSION = `^${cliPkg.version}`\n\ntype ProjectTemplate = 'rest' | 'graphql' | 'ddd' | 'cqrs' | 'minimal'\n\ninterface InitProjectOptions {\n name: string\n directory: string\n packageManager?: 'pnpm' | 'npm' | 'yarn'\n initGit?: boolean\n installDeps?: boolean\n template?: ProjectTemplate\n}\n\n/** Scaffold a new KickJS project */\nexport async function initProject(options: InitProjectOptions): Promise<void> {\n const { name, directory, packageManager = 'pnpm', template = 'rest' } = options\n const dir = directory\n\n console.log(`\\n Creating KickJS project: ${name}\\n`)\n\n // ── package.json — template-aware deps ────────────────────────────\n const baseDeps: Record<string, string> = {\n '@forinda/kickjs-core': KICKJS_VERSION,\n '@forinda/kickjs-http': KICKJS_VERSION,\n '@forinda/kickjs-config': KICKJS_VERSION,\n express: '^5.1.0',\n 'reflect-metadata': '^0.2.2',\n zod: '^4.3.6',\n pino: '^10.3.1',\n 'pino-pretty': '^13.1.3',\n }\n\n // Add template-specific deps\n if (template !== 'minimal') {\n baseDeps['@forinda/kickjs-swagger'] = KICKJS_VERSION\n baseDeps['@forinda/kickjs-devtools'] = KICKJS_VERSION\n }\n if (template === 'graphql') {\n baseDeps['@forinda/kickjs-graphql'] = KICKJS_VERSION\n baseDeps['graphql'] = '^16.11.0'\n }\n if (template === 'cqrs') {\n baseDeps['@forinda/kickjs-queue'] = KICKJS_VERSION\n baseDeps['@forinda/kickjs-ws'] = KICKJS_VERSION\n baseDeps['@forinda/kickjs-otel'] = KICKJS_VERSION\n }\n if (template === 'ddd') {\n baseDeps['@forinda/kickjs-swagger'] = KICKJS_VERSION\n }\n\n await writeFileSafe(\n join(dir, 'package.json'),\n JSON.stringify(\n {\n name,\n version: cliPkg.version,\n type: 'module',\n scripts: {\n dev: 'kick dev',\n 'dev:debug': 'kick dev:debug',\n build: 'kick build',\n start: 'kick start',\n test: 'vitest run',\n 'test:watch': 'vitest',\n typecheck: 'tsc --noEmit',\n lint: 'eslint src/',\n format: 'prettier --write src/',\n },\n dependencies: baseDeps,\n devDependencies: {\n '@forinda/kickjs-cli': KICKJS_VERSION,\n '@swc/core': '^1.7.28',\n '@types/express': '^5.0.6',\n '@types/node': '^24.5.2',\n 'unplugin-swc': '^1.5.9',\n vite: '^7.3.1',\n 'vite-node': '^5.3.0',\n vitest: '^3.2.4',\n typescript: '^5.9.2',\n prettier: '^3.8.1',\n },\n },\n null,\n 2,\n ),\n )\n\n // ── vite.config.ts — enables HMR + SWC for decorators ──────────────\n await writeFileSafe(\n join(dir, 'vite.config.ts'),\n `import { defineConfig } from 'vite'\nimport { resolve } from 'path'\nimport swc from 'unplugin-swc'\n\nexport default defineConfig({\n plugins: [swc.vite()],\n resolve: {\n alias: {\n '@': resolve(__dirname, 'src'),\n },\n },\n server: {\n watch: { usePolling: false },\n hmr: true,\n },\n build: {\n target: 'node20',\n ssr: true,\n outDir: 'dist',\n sourcemap: true,\n rollupOptions: {\n input: resolve(__dirname, 'src/index.ts'),\n output: { format: 'esm' },\n },\n },\n})\n`,\n )\n\n // ── tsconfig.json ───────────────────────────────────────────────────\n await writeFileSafe(\n join(dir, 'tsconfig.json'),\n JSON.stringify(\n {\n compilerOptions: {\n target: 'ES2022',\n module: 'ESNext',\n moduleResolution: 'bundler',\n lib: ['ES2022'],\n types: ['node'],\n strict: true,\n esModuleInterop: true,\n skipLibCheck: true,\n sourceMap: true,\n declaration: true,\n experimentalDecorators: true,\n emitDecoratorMetadata: true,\n outDir: 'dist',\n rootDir: 'src',\n paths: { '@/*': ['./src/*'] },\n },\n include: ['src'],\n },\n null,\n 2,\n ),\n )\n\n // ── .prettierrc ─────────────────────────────────────────────────────\n await writeFileSafe(\n join(dir, '.prettierrc'),\n JSON.stringify(\n {\n semi: false,\n singleQuote: true,\n trailingComma: 'all',\n printWidth: 100,\n tabWidth: 2,\n },\n null,\n 2,\n ),\n )\n\n // ── .editorconfig ─────────────────────────────────────────────────────\n await writeFileSafe(\n join(dir, '.editorconfig'),\n `# https://editorconfig.org\nroot = true\n\n[*]\nindent_style = space\nindent_size = 2\nend_of_line = lf\ncharset = utf-8\ntrim_trailing_whitespace = true\ninsert_final_newline = true\n\n[*.md]\ntrim_trailing_whitespace = false\n`,\n )\n\n // ── .gitignore ──────────────────────────────────────────────────────\n await writeFileSafe(\n join(dir, '.gitignore'),\n `node_modules/\ndist/\n.env\ncoverage/\n.DS_Store\n*.tsbuildinfo\n`,\n )\n\n // ── .gitattributes ────────────────────────────────────────────────────\n await writeFileSafe(\n join(dir, '.gitattributes'),\n `# Auto-detect text files and normalise line endings to LF\n* text=auto eol=lf\n\n# Explicitly mark generated / binary files\n*.png binary\n*.jpg binary\n*.jpeg binary\n*.gif binary\n*.ico binary\n*.woff binary\n*.woff2 binary\n*.ttf binary\n*.eot binary\n\n# Lock files — treat as generated\npnpm-lock.yaml -diff linguist-generated\nyarn.lock -diff linguist-generated\npackage-lock.json -diff linguist-generated\n`,\n )\n\n // ── .env ────────────────────────────────────────────────────────────\n await writeFileSafe(\n join(dir, '.env'),\n `PORT=3000\nNODE_ENV=development\n`,\n )\n\n await writeFileSafe(\n join(dir, '.env.example'),\n `PORT=3000\nNODE_ENV=development\n`,\n )\n\n // ── src/index.ts — template-aware entry point ─────────────────────\n await writeFileSafe(join(dir, 'src/index.ts'), getEntryFile(name, template))\n\n // ── src/modules/index.ts ────────────────────────────────────────────\n await writeFileSafe(\n join(dir, 'src/modules/index.ts'),\n `import type { AppModuleClass } from '@forinda/kickjs-core'\n\nexport const modules: AppModuleClass[] = []\n`,\n )\n\n // ── Template-specific files ─────────────────────────────────────────\n if (template === 'graphql') {\n await writeFileSafe(join(dir, 'src/resolvers/.gitkeep'), '')\n }\n\n // ── kick.config.ts — CLI configuration ─────────────────────────────\n await writeFileSafe(\n join(dir, 'kick.config.ts'),\n `import { defineConfig } from '@forinda/kickjs-cli'\n\nexport default defineConfig({\n pattern: '${template}',\n modulesDir: 'src/modules',\n defaultRepo: 'inmemory',\n\n commands: [\n {\n name: 'test',\n description: 'Run tests with Vitest',\n steps: 'npx vitest run',\n },\n {\n name: 'format',\n description: 'Format code with Prettier',\n steps: 'npx prettier --write src/',\n },\n {\n name: 'format:check',\n description: 'Check formatting without writing',\n steps: 'npx prettier --check src/',\n },\n {\n name: 'check',\n description: 'Run typecheck + format check',\n steps: ['npx tsc --noEmit', 'npx prettier --check src/'],\n aliases: ['verify', 'ci'],\n },\n ],\n})\n`,\n )\n\n // ── vitest.config.ts ────────────────────────────────────────────────\n await writeFileSafe(\n join(dir, 'vitest.config.ts'),\n `import { defineConfig } from 'vitest/config'\nimport swc from 'unplugin-swc'\n\nexport default defineConfig({\n plugins: [swc.vite()],\n test: {\n globals: true,\n environment: 'node',\n include: ['src/**/*.test.ts'],\n },\n})\n`,\n )\n\n // ── Git Init ─────────────────────────────────────────────────────────\n if (options.initGit) {\n try {\n execSync('git init', { cwd: dir, stdio: 'pipe' })\n execSync('git add -A', { cwd: dir, stdio: 'pipe' })\n execSync('git commit -m \"chore: initial commit from kick new\"', {\n cwd: dir,\n stdio: 'pipe',\n })\n console.log(' Git repository initialized')\n } catch {\n console.log(' Warning: git init failed (git may not be installed)')\n }\n }\n\n // ── Install Dependencies ────────────────────────────────────────────\n if (options.installDeps) {\n console.log(`\\n Installing dependencies with ${packageManager}...\\n`)\n try {\n execSync(`${packageManager} install`, { cwd: dir, stdio: 'inherit' })\n console.log('\\n Dependencies installed successfully!')\n } catch {\n console.log(`\\n Warning: ${packageManager} install failed. Run it manually.`)\n }\n }\n\n console.log('\\n Project scaffolded successfully!')\n console.log()\n\n const needsCd = dir !== process.cwd()\n console.log(' Next steps:')\n if (needsCd) console.log(` cd ${name}`)\n if (!options.installDeps) console.log(` ${packageManager} install`)\n\n const genHint: Record<string, string> = {\n rest: 'kick g module user',\n graphql: 'kick g resolver user',\n ddd: 'kick g module user --repo drizzle',\n cqrs: 'kick g module user --pattern cqrs',\n minimal: '# add your routes to src/index.ts',\n }\n console.log(` ${genHint[template] ?? genHint.rest}`)\n console.log(' kick dev')\n console.log()\n console.log(' Commands:')\n console.log(' kick dev Start dev server with Vite HMR')\n console.log(' kick build Production build via Vite')\n console.log(' kick start Run production build')\n console.log()\n console.log(' Generators:')\n console.log(' kick g module <name> Full DDD module (controller, DTOs, use-cases, repo)')\n console.log(' kick g scaffold <n> <f..> CRUD module from field definitions')\n console.log(' kick g controller <name> Standalone controller')\n console.log(' kick g service <name> @Service() class')\n console.log(' kick g middleware <name> Express middleware')\n console.log(' kick g guard <name> Route guard (auth, roles, etc.)')\n console.log(' kick g adapter <name> AppAdapter with lifecycle hooks')\n console.log(' kick g dto <name> Zod DTO schema')\n if (template === 'graphql') console.log(' kick g resolver <name> GraphQL resolver')\n if (template === 'cqrs') console.log(' kick g job <name> Queue job processor')\n console.log(' kick g config Generate kick.config.ts')\n console.log()\n console.log(' Add packages:')\n console.log(' kick add <pkg> Install a KickJS package + peers')\n console.log(' kick add --list Show all available packages')\n console.log()\n console.log(' Available: auth, swagger, graphql, drizzle, prisma, ws,')\n console.log(' cron, queue, mailer, otel, multi-tenant, notifications, testing')\n console.log()\n}\n\n// ── Entry file templates ─────────────────────────────────────────────────\n\nfunction getEntryFile(name: string, template: ProjectTemplate): string {\n switch (template) {\n case 'graphql':\n return `import 'reflect-metadata'\nimport { bootstrap } from '@forinda/kickjs-http'\nimport { DevToolsAdapter } from '@forinda/kickjs-devtools'\nimport { GraphQLAdapter } from '@forinda/kickjs-graphql'\nimport { modules } from './modules'\n\n// Import your resolvers here\n// import { UserResolver } from './resolvers/user.resolver'\n\nbootstrap({\n modules,\n adapters: [\n new DevToolsAdapter(),\n new GraphQLAdapter({\n resolvers: [/* UserResolver */],\n // Add custom type definitions here:\n // typeDefs: userTypeDefs,\n }),\n ],\n})\n`\n\n case 'cqrs':\n return `import 'reflect-metadata'\nimport { bootstrap } from '@forinda/kickjs-http'\nimport { DevToolsAdapter } from '@forinda/kickjs-devtools'\nimport { SwaggerAdapter } from '@forinda/kickjs-swagger'\nimport { OtelAdapter } from '@forinda/kickjs-otel'\n// import { WsAdapter } from '@forinda/kickjs-ws'\n// import { QueueAdapter, BullMQProvider } from '@forinda/kickjs-queue'\nimport { modules } from './modules'\n\nbootstrap({\n modules,\n adapters: [\n new OtelAdapter({ serviceName: '${name}' }),\n new DevToolsAdapter(),\n new SwaggerAdapter({\n info: { title: '${name}', version: '${cliPkg.version}' },\n }),\n // Uncomment for WebSocket support:\n // new WsAdapter(),\n // Uncomment when Redis is available:\n // new QueueAdapter({\n // provider: new BullMQProvider({ host: 'localhost', port: 6379 }),\n // }),\n ],\n})\n`\n\n case 'minimal':\n return `import 'reflect-metadata'\nimport { bootstrap } from '@forinda/kickjs-http'\nimport { modules } from './modules'\n\nbootstrap({ modules })\n`\n\n case 'ddd':\n case 'rest':\n default:\n return `import 'reflect-metadata'\nimport { bootstrap } from '@forinda/kickjs-http'\nimport { DevToolsAdapter } from '@forinda/kickjs-devtools'\nimport { SwaggerAdapter } from '@forinda/kickjs-swagger'\nimport { modules } from './modules'\n\nbootstrap({\n modules,\n adapters: [\n new DevToolsAdapter(),\n new SwaggerAdapter({\n info: { title: '${name}', version: '${cliPkg.version}' },\n }),\n ],\n})\n`\n }\n}\n","import { writeFile, mkdir, access, readFile } from 'node:fs/promises'\nimport { dirname } from 'node:path'\n\n/** Write a file, creating parent directories if needed */\nexport async function writeFileSafe(filePath: string, content: string): Promise<void> {\n await mkdir(dirname(filePath), { recursive: true })\n await writeFile(filePath, content, 'utf-8')\n}\n\n/** Ensure a directory exists */\nexport async function ensureDirectory(dir: string): Promise<void> {\n await mkdir(dir, { recursive: true })\n}\n\n/** Check if a file exists */\nexport async function fileExists(filePath: string): Promise<boolean> {\n try {\n await access(filePath)\n return true\n } catch {\n return false\n }\n}\n\n/** Read a JSON file */\nexport async function readJsonFile<T = any>(filePath: string): Promise<T> {\n const content = await readFile(filePath, 'utf-8')\n return JSON.parse(content)\n}\n","import { resolve } from 'node:path'\nimport type { Command } from 'commander'\nimport { generateModule } from '../generators/module'\nimport type { RepoType } from '../generators/module'\nimport { generateAdapter } from '../generators/adapter'\nimport { generateMiddleware } from '../generators/middleware'\nimport { generateGuard } from '../generators/guard'\nimport { generateService } from '../generators/service'\nimport { generateController } from '../generators/controller'\nimport { generateDto } from '../generators/dto'\nimport { generateConfig } from '../generators/config'\nimport { generateResolver } from '../generators/resolver'\nimport { generateJob } from '../generators/job'\nimport { generateScaffold, parseFields } from '../generators/scaffold'\nimport { generateTest } from '../generators/test'\nimport { loadKickConfig } from '../config'\n\nfunction printGenerated(files: string[]): void {\n const cwd = process.cwd()\n console.log(`\\n Generated ${files.length} file${files.length === 1 ? '' : 's'}:`)\n for (const f of files) {\n console.log(` ${f.replace(cwd + '/', '')}`)\n }\n console.log()\n}\n\nconst GENERATORS = [\n { name: 'module <name>', description: 'Full DDD module (controller, DTOs, use-cases, repo)' },\n { name: 'scaffold <name> <fields...>', description: 'CRUD module from field definitions' },\n { name: 'controller <name>', description: '@Controller() class [-m module]' },\n { name: 'service <name>', description: '@Service() singleton [-m module]' },\n { name: 'middleware <name>', description: 'Express middleware function [-m module]' },\n { name: 'guard <name>', description: 'Route guard (auth, roles, etc.) [-m module]' },\n { name: 'dto <name>', description: 'Zod DTO schema [-m module]' },\n { name: 'adapter <name>', description: 'AppAdapter with lifecycle hooks (app-level only)' },\n { name: 'test <name>', description: 'Vitest test scaffold [-m module]' },\n { name: 'resolver <name>', description: 'GraphQL @Resolver class' },\n { name: 'job <name>', description: 'Queue @Job processor' },\n { name: 'config', description: 'Generate kick.config.ts' },\n]\n\nfunction printGeneratorList(): void {\n console.log('\\n Available generators:\\n')\n const maxName = Math.max(...GENERATORS.map((g) => g.name.length))\n for (const g of GENERATORS) {\n console.log(` kick g ${g.name.padEnd(maxName + 2)} ${g.description}`)\n }\n console.log()\n}\n\nexport function registerGenerateCommand(program: Command): void {\n const gen = program\n .command('generate')\n .alias('g')\n .description('Generate code scaffolds')\n .option('--list', 'List all available generators')\n .action((opts: any) => {\n if (opts.list) {\n printGeneratorList()\n } else {\n gen.help()\n }\n })\n\n // ── kick g module <name> ────────────────────────────────────────────\n gen\n .command('module <name>')\n .description('Generate a module (structure depends on project pattern)')\n .option('--no-entity', 'Skip entity and value object generation')\n .option('--no-tests', 'Skip test file generation')\n .option('--repo <type>', 'Repository implementation: inmemory | drizzle | prisma')\n .option('--pattern <pattern>', 'Override project pattern: rest | ddd | cqrs | minimal')\n .option('--minimal', 'Shorthand for --pattern minimal')\n .option('--modules-dir <dir>', 'Modules directory')\n .option('-f, --force', 'Overwrite existing files without prompting')\n .action(async (name: string, opts: any) => {\n const config = await loadKickConfig(process.cwd())\n const modulesDir = opts.modulesDir ?? config?.modulesDir ?? 'src/modules'\n const repo: RepoType = opts.repo ?? config?.defaultRepo ?? 'inmemory'\n const pattern = opts.pattern ?? config?.pattern ?? 'ddd'\n\n const files = await generateModule({\n name,\n modulesDir: resolve(modulesDir),\n noEntity: opts.entity === false,\n noTests: opts.tests === false,\n repo,\n minimal: opts.minimal,\n force: opts.force,\n pattern,\n })\n printGenerated(files)\n })\n\n // ── kick g adapter <name> ──────────────────────────────────────────\n gen\n .command('adapter <name>')\n .description('Generate an AppAdapter with lifecycle hooks and middleware support')\n .option('-o, --out <dir>', 'Output directory', 'src/adapters')\n .action(async (name: string, opts: any) => {\n const files = await generateAdapter({ name, outDir: resolve(opts.out) })\n printGenerated(files)\n })\n\n // ── kick g middleware <name> ────────────────────────────────────────\n gen\n .command('middleware <name>')\n .description(\n 'Generate an Express middleware function\\n' +\n ' Use -m to scope it to a module: kick g middleware auth -m users',\n )\n .option('-o, --out <dir>', 'Output directory (overrides --module)')\n .option('-m, --module <module>', 'Place inside a module folder')\n .action(async (name: string, opts: any) => {\n const config = await loadKickConfig(process.cwd())\n const modulesDir = config?.modulesDir ?? 'src/modules'\n const files = await generateMiddleware({\n name,\n outDir: opts.out,\n moduleName: opts.module,\n modulesDir,\n pattern: config?.pattern,\n })\n printGenerated(files)\n })\n\n // ── kick g guard <name> ────────────────────────────────────────────\n gen\n .command('guard <name>')\n .description(\n 'Generate a route guard (auth, roles, etc.)\\n' +\n ' Use -m to scope it to a module: kick g guard admin -m users',\n )\n .option('-o, --out <dir>', 'Output directory (overrides --module)')\n .option('-m, --module <module>', 'Place inside a module folder')\n .action(async (name: string, opts: any) => {\n const config = await loadKickConfig(process.cwd())\n const modulesDir = config?.modulesDir ?? 'src/modules'\n const files = await generateGuard({\n name,\n outDir: opts.out,\n moduleName: opts.module,\n modulesDir,\n pattern: config?.pattern,\n })\n printGenerated(files)\n })\n\n // ── kick g service <name> ──────────────────────────────────────────\n gen\n .command('service <name>')\n .description(\n 'Generate a @Service() class\\n' +\n ' Use -m to scope it to a module: kick g service payment -m orders',\n )\n .option('-o, --out <dir>', 'Output directory (overrides --module)')\n .option('-m, --module <module>', 'Place inside a module folder')\n .action(async (name: string, opts: any) => {\n const config = await loadKickConfig(process.cwd())\n const modulesDir = config?.modulesDir ?? 'src/modules'\n const files = await generateService({\n name,\n outDir: opts.out,\n moduleName: opts.module,\n modulesDir,\n pattern: config?.pattern,\n })\n printGenerated(files)\n })\n\n // ── kick g controller <name> ───────────────────────────────────────\n gen\n .command('controller <name>')\n .description(\n 'Generate a @Controller() class with basic routes\\n' +\n ' Use -m to scope it to a module: kick g controller auth -m users',\n )\n .option('-o, --out <dir>', 'Output directory (overrides --module)')\n .option('-m, --module <module>', 'Place inside a module folder')\n .action(async (name: string, opts: any) => {\n const config = await loadKickConfig(process.cwd())\n const modulesDir = config?.modulesDir ?? 'src/modules'\n const files = await generateController({\n name,\n outDir: opts.out,\n moduleName: opts.module,\n modulesDir,\n pattern: config?.pattern,\n })\n printGenerated(files)\n })\n\n // ── kick g dto <name> ──────────────────────────────────────────────\n gen\n .command('dto <name>')\n .description(\n 'Generate a Zod DTO schema\\n' +\n ' Use -m to scope it to a module: kick g dto create-user -m users',\n )\n .option('-o, --out <dir>', 'Output directory (overrides --module)')\n .option('-m, --module <module>', 'Place inside a module folder')\n .action(async (name: string, opts: any) => {\n const config = await loadKickConfig(process.cwd())\n const modulesDir = config?.modulesDir ?? 'src/modules'\n const files = await generateDto({\n name,\n outDir: opts.out,\n moduleName: opts.module,\n modulesDir,\n pattern: config?.pattern,\n })\n printGenerated(files)\n })\n\n // ── kick g test <name> ────────────────────────────────────────────────\n gen\n .command('test <name>')\n .description(\n 'Generate a Vitest test scaffold\\n' +\n ' Use -m to scope it to a module: kick g test user-service -m users',\n )\n .option('-o, --out <dir>', 'Output directory (overrides --module)')\n .option('-m, --module <module>', \"Place inside a module's __tests__/ folder\")\n .action(async (name: string, opts: any) => {\n const config = await loadKickConfig(process.cwd())\n const modulesDir = config?.modulesDir ?? 'src/modules'\n const files = await generateTest({\n name,\n outDir: opts.out,\n moduleName: opts.module,\n modulesDir,\n })\n printGenerated(files)\n })\n\n // ── kick g resolver <name> ────────────────────────────────────────────\n gen\n .command('resolver <name>')\n .description('Generate a GraphQL @Resolver class with @Query and @Mutation methods')\n .option('-o, --out <dir>', 'Output directory', 'src/resolvers')\n .action(async (name: string, opts: any) => {\n const files = await generateResolver({ name, outDir: resolve(opts.out) })\n printGenerated(files)\n })\n\n // ── kick g job <name> ────────────────────────────────────────────────\n gen\n .command('job <name>')\n .description('Generate a @Job queue processor with @Process handlers')\n .option('-o, --out <dir>', 'Output directory', 'src/jobs')\n .option('-q, --queue <name>', 'Queue name (default: <name>-queue)')\n .action(async (name: string, opts: any) => {\n const files = await generateJob({ name, outDir: resolve(opts.out), queue: opts.queue })\n printGenerated(files)\n })\n\n // ── kick g scaffold <name> <fields...> ─────────────────────────────\n gen\n .command('scaffold <name> [fields...]')\n .description(\n 'Generate a full CRUD module from field definitions\\n' +\n ' Example: kick g scaffold Post title:string body:text published:boolean?\\n' +\n ' Types: string, text, number, int, float, boolean, date, email, url, uuid, json, enum:a,b,c\\n' +\n ' Append ? for optional fields: description:text?',\n )\n .option('--no-entity', 'Skip entity and value object generation')\n .option('--no-tests', 'Skip test file generation')\n .option('--modules-dir <dir>', 'Modules directory')\n .action(async (name: string, rawFields: string[], opts: any) => {\n if (rawFields.length === 0) {\n console.error(\n '\\n Error: At least one field is required.\\n' +\n ' Usage: kick g scaffold <name> <field:type> [field:type...]\\n' +\n ' Example: kick g scaffold Post title:string body:text published:boolean\\n',\n )\n process.exit(1)\n }\n const config = await loadKickConfig(process.cwd())\n const modulesDir = opts.modulesDir ?? config?.modulesDir ?? 'src/modules'\n const fields = parseFields(rawFields)\n const files = await generateScaffold({\n name,\n fields,\n modulesDir: resolve(modulesDir),\n noEntity: opts.entity === false,\n noTests: opts.tests === false,\n })\n console.log(`\\n Scaffolded ${name} with ${fields.length} field(s):`)\n for (const f of fields) {\n console.log(` ${f.name}: ${f.type}${f.optional ? ' (optional)' : ''}`)\n }\n printGenerated(files)\n })\n\n // ── kick g config ────────────────────────────────────────────────────\n gen\n .command('config')\n .description('Generate a kick.config.ts at the project root')\n .option('--modules-dir <dir>', 'Modules directory path', 'src/modules')\n .option('--repo <type>', 'Default repository type: inmemory | drizzle | prisma', 'inmemory')\n .option('-f, --force', 'Overwrite existing kick.config.ts without prompting')\n .action(async (opts: any) => {\n const files = await generateConfig({\n outDir: resolve('.'),\n modulesDir: opts.modulesDir,\n defaultRepo: opts.repo,\n force: opts.force,\n })\n printGenerated(files)\n })\n}\n","import { join } from 'node:path'\nimport { createInterface } from 'node:readline'\nimport { writeFileSafe, fileExists } from '../utils/fs'\nimport { toPascalCase, toKebabCase, pluralize, pluralizePascal } from '../utils/naming'\nimport { readFile, writeFile } from 'node:fs/promises'\nimport type { ProjectPattern } from '../config'\nimport {\n generateModuleIndex,\n generateRestModuleIndex,\n generateMinimalModuleIndex,\n generateController,\n generateRestController,\n generateConstants,\n generateCreateDTO,\n generateUpdateDTO,\n generateResponseDTO,\n generateUseCases,\n generateRepositoryInterface,\n generateInMemoryRepository,\n generateDrizzleRepository,\n generatePrismaRepository,\n generateDomainService,\n generateEntity,\n generateValueObject,\n generateControllerTest,\n generateRepositoryTest,\n generateRestService,\n generateRestConstants,\n generateCqrsModuleIndex,\n generateCqrsController,\n generateCqrsCommands,\n generateCqrsQueries,\n generateCqrsEvents,\n} from './templates'\n\nexport type RepoType = 'drizzle' | 'inmemory' | 'prisma'\n\ninterface GenerateModuleOptions {\n name: string\n modulesDir: string\n noEntity?: boolean\n noTests?: boolean\n repo?: RepoType\n minimal?: boolean\n force?: boolean\n pattern?: ProjectPattern\n}\n\n/** Prompt the user for a single-line answer via stdin */\nfunction promptUser(question: string): Promise<string> {\n const rl = createInterface({ input: process.stdin, output: process.stdout })\n return new Promise((resolve) => {\n rl.question(question, (answer) => {\n rl.close()\n resolve(answer.trim().toLowerCase())\n })\n })\n}\n\n/** Shared context passed to each pattern generator */\ninterface ModuleContext {\n kebab: string\n pascal: string\n plural: string\n pluralPascal: string\n moduleDir: string\n repo: RepoType\n noEntity: boolean\n noTests: boolean\n write: (relativePath: string, content: string) => Promise<void>\n files: string[]\n}\n\n/**\n * Generate a module — structure depends on the project pattern.\n *\n * Patterns:\n * rest — flat folder: controller + service + DTOs + repo\n * ddd — nested DDD: presentation/ application/ domain/ infrastructure/\n * graphql — flat folder: resolver + service + DTOs + repo (future)\n * cqrs — commands, queries, events with WS/queue integration\n * minimal — just controller + module index\n */\nexport async function generateModule(options: GenerateModuleOptions): Promise<string[]> {\n const { name, modulesDir, noEntity, noTests, repo = 'inmemory', force } = options\n\n let pattern = options.pattern ?? 'ddd'\n if (options.minimal) pattern = 'minimal'\n\n const kebab = toKebabCase(name)\n const pascal = toPascalCase(name)\n const plural = pluralize(kebab)\n const pluralPascal = pluralizePascal(pascal)\n const moduleDir = join(modulesDir, plural)\n\n const files: string[] = []\n let overwriteAll = force ?? false\n\n const write = async (relativePath: string, content: string) => {\n const fullPath = join(moduleDir, relativePath)\n if (!overwriteAll && (await fileExists(fullPath))) {\n const answer = await promptUser(\n ` File already exists: ${relativePath}\\n Overwrite? (y/n/a = yes/no/all) `,\n )\n if (answer === 'a') {\n overwriteAll = true\n } else if (answer !== 'y') {\n console.log(` Skipped: ${relativePath}`)\n return\n }\n }\n await writeFileSafe(fullPath, content)\n files.push(fullPath)\n }\n\n const ctx: ModuleContext = {\n kebab,\n pascal,\n plural,\n pluralPascal,\n moduleDir,\n repo,\n noEntity: noEntity ?? false,\n noTests: noTests ?? false,\n write,\n files,\n }\n\n switch (pattern) {\n case 'minimal':\n await generateMinimalFiles(ctx)\n break\n case 'rest':\n await generateRestFiles(ctx)\n break\n case 'cqrs':\n await generateCqrsFiles(ctx)\n break\n case 'graphql':\n case 'ddd':\n default:\n await generateDddFiles(ctx)\n break\n }\n\n // Auto-register in modules index (all patterns need this)\n await autoRegisterModule(modulesDir, pascal, plural)\n\n return files\n}\n\n// ── Pattern: minimal ────────────────────────────────────────────────────\n\nasync function generateMinimalFiles(ctx: ModuleContext): Promise<void> {\n const { pascal, kebab, plural, write } = ctx\n\n await write('index.ts', generateMinimalModuleIndex(pascal, kebab, plural))\n\n await write(\n `${kebab}.controller.ts`,\n `import { Controller, Get } from '@forinda/kickjs-core'\nimport type { RequestContext } from '@forinda/kickjs-http'\n\n@Controller()\nexport class ${pascal}Controller {\n @Get('/')\n async list(ctx: RequestContext) {\n ctx.json({ message: '${pascal} list' })\n }\n}\n`,\n )\n}\n\n// ── Pattern: rest ───────────────────────────────────────────────────────\n\nasync function generateRestFiles(ctx: ModuleContext): Promise<void> {\n const { pascal, kebab, plural, pluralPascal, repo, noTests, write } = ctx\n\n // Module index\n await write('index.ts', generateRestModuleIndex(pascal, kebab, plural, repo))\n\n // Constants\n await write(`${kebab}.constants.ts`, generateRestConstants(pascal))\n\n // Controller (injects service)\n await write(`${kebab}.controller.ts`, generateRestController(pascal, kebab, plural, pluralPascal))\n\n // Service (wraps repository)\n await write(`${kebab}.service.ts`, generateRestService(pascal, kebab))\n\n // DTOs\n await write(`dtos/create-${kebab}.dto.ts`, generateCreateDTO(pascal, kebab))\n await write(`dtos/update-${kebab}.dto.ts`, generateUpdateDTO(pascal, kebab))\n await write(`dtos/${kebab}-response.dto.ts`, generateResponseDTO(pascal, kebab))\n\n // Repository interface (flat imports)\n await write(`${kebab}.repository.ts`, generateRepositoryInterface(pascal, kebab, './dtos'))\n\n // Repository implementation (flat imports)\n const repoFileMap: Record<RepoType, string> = {\n inmemory: `in-memory-${kebab}`,\n drizzle: `drizzle-${kebab}`,\n prisma: `prisma-${kebab}`,\n }\n const repoGeneratorMap: Record<RepoType, () => string> = {\n inmemory: () => generateInMemoryRepository(pascal, kebab, '.', './dtos'),\n drizzle: () => generateDrizzleRepository(pascal, kebab, '.', './dtos'),\n prisma: () => generatePrismaRepository(pascal, kebab, '.', './dtos'),\n }\n await write(`${repoFileMap[repo]}.repository.ts`, repoGeneratorMap[repo]())\n\n // Tests\n if (!noTests) {\n await write(\n `__tests__/${kebab}.controller.test.ts`,\n generateControllerTest(pascal, kebab, plural),\n )\n await write(\n `__tests__/${kebab}.repository.test.ts`,\n generateRepositoryTest(pascal, kebab, plural, `../${repoFileMap.inmemory}.repository`),\n )\n }\n}\n\n// ── Pattern: cqrs ───────────────────────────────────────────────────────\n\nasync function generateCqrsFiles(ctx: ModuleContext): Promise<void> {\n const { pascal, kebab, plural, pluralPascal, repo, noTests, write } = ctx\n\n // Module index\n await write('index.ts', generateCqrsModuleIndex(pascal, kebab, plural, repo))\n\n // Constants\n await write(`${kebab}.constants.ts`, generateRestConstants(pascal))\n\n // Controller (dispatches commands/queries)\n await write(`${kebab}.controller.ts`, generateCqrsController(pascal, kebab, plural, pluralPascal))\n\n // DTOs\n await write(`dtos/create-${kebab}.dto.ts`, generateCreateDTO(pascal, kebab))\n await write(`dtos/update-${kebab}.dto.ts`, generateUpdateDTO(pascal, kebab))\n await write(`dtos/${kebab}-response.dto.ts`, generateResponseDTO(pascal, kebab))\n\n // Commands\n const commands = generateCqrsCommands(pascal, kebab)\n for (const cmd of commands) {\n await write(`commands/${cmd.file}`, cmd.content)\n }\n\n // Queries\n const queries = generateCqrsQueries(pascal, kebab, plural, pluralPascal)\n for (const q of queries) {\n await write(`queries/${q.file}`, q.content)\n }\n\n // Events\n const events = generateCqrsEvents(pascal, kebab)\n for (const e of events) {\n await write(`events/${e.file}`, e.content)\n }\n\n // Repository interface (flat imports)\n await write(`${kebab}.repository.ts`, generateRepositoryInterface(pascal, kebab, './dtos'))\n\n // Repository implementation (flat imports)\n const repoFileMap: Record<RepoType, string> = {\n inmemory: `in-memory-${kebab}`,\n drizzle: `drizzle-${kebab}`,\n prisma: `prisma-${kebab}`,\n }\n const repoGeneratorMap: Record<RepoType, () => string> = {\n inmemory: () => generateInMemoryRepository(pascal, kebab, '.', './dtos'),\n drizzle: () => generateDrizzleRepository(pascal, kebab, '.', './dtos'),\n prisma: () => generatePrismaRepository(pascal, kebab, '.', './dtos'),\n }\n await write(`${repoFileMap[repo]}.repository.ts`, repoGeneratorMap[repo]())\n\n // Tests\n if (!noTests) {\n await write(\n `__tests__/${kebab}.controller.test.ts`,\n generateControllerTest(pascal, kebab, plural),\n )\n await write(\n `__tests__/${kebab}.repository.test.ts`,\n generateRepositoryTest(pascal, kebab, plural, `../${repoFileMap.inmemory}.repository`),\n )\n }\n}\n\n// ── Pattern: ddd ────────────────────────────────────────────────────────\n\nasync function generateDddFiles(ctx: ModuleContext): Promise<void> {\n const { pascal, kebab, plural, pluralPascal, repo, noEntity, noTests, write } = ctx\n\n // Module index\n await write('index.ts', generateModuleIndex(pascal, kebab, plural, repo))\n\n // Constants\n await write('constants.ts', generateConstants(pascal))\n\n // Controller (injects use-cases)\n await write(\n `presentation/${kebab}.controller.ts`,\n generateController(pascal, kebab, plural, pluralPascal),\n )\n\n // DTOs\n await write(`application/dtos/create-${kebab}.dto.ts`, generateCreateDTO(pascal, kebab))\n await write(`application/dtos/update-${kebab}.dto.ts`, generateUpdateDTO(pascal, kebab))\n await write(`application/dtos/${kebab}-response.dto.ts`, generateResponseDTO(pascal, kebab))\n\n // Use Cases\n const useCases = generateUseCases(pascal, kebab, plural, pluralPascal)\n for (const uc of useCases) {\n await write(`application/use-cases/${uc.file}`, uc.content)\n }\n\n // Repository Interface\n await write(\n `domain/repositories/${kebab}.repository.ts`,\n generateRepositoryInterface(pascal, kebab),\n )\n\n // Domain Service\n await write(`domain/services/${kebab}-domain.service.ts`, generateDomainService(pascal, kebab))\n\n // Repository Implementation\n const repoFileMap: Record<RepoType, string> = {\n inmemory: `in-memory-${kebab}`,\n drizzle: `drizzle-${kebab}`,\n prisma: `prisma-${kebab}`,\n }\n const repoGeneratorMap: Record<RepoType, () => string> = {\n inmemory: () => generateInMemoryRepository(pascal, kebab),\n drizzle: () => generateDrizzleRepository(pascal, kebab),\n prisma: () => generatePrismaRepository(pascal, kebab),\n }\n await write(\n `infrastructure/repositories/${repoFileMap[repo]}.repository.ts`,\n repoGeneratorMap[repo](),\n )\n\n // Entity & Value Objects\n if (!noEntity) {\n await write(`domain/entities/${kebab}.entity.ts`, generateEntity(pascal, kebab))\n await write(`domain/value-objects/${kebab}-id.vo.ts`, generateValueObject(pascal, kebab))\n }\n\n // Tests\n if (!noTests) {\n await write(\n `__tests__/${kebab}.controller.test.ts`,\n generateControllerTest(pascal, kebab, plural),\n )\n await write(\n `__tests__/${kebab}.repository.test.ts`,\n generateRepositoryTest(pascal, kebab, plural),\n )\n }\n}\n\n// ── Auto-register in modules index ──────────────────────────────────────\n\n/** Add the new module to src/modules/index.ts */\nasync function autoRegisterModule(\n modulesDir: string,\n pascal: string,\n plural: string,\n): Promise<void> {\n const indexPath = join(modulesDir, 'index.ts')\n const exists = await fileExists(indexPath)\n\n if (!exists) {\n await writeFileSafe(\n indexPath,\n `import type { AppModuleClass } from '@forinda/kickjs-core'\nimport { ${pascal}Module } from './${plural}'\n\nexport const modules: AppModuleClass[] = [${pascal}Module]\n`,\n )\n return\n }\n\n let content = await readFile(indexPath, 'utf-8')\n\n // Add import if not present\n const importLine = `import { ${pascal}Module } from './${plural}'`\n if (!content.includes(`${pascal}Module`)) {\n // Insert import after last existing import\n const lastImportIdx = content.lastIndexOf('import ')\n if (lastImportIdx !== -1) {\n const lineEnd = content.indexOf('\\n', lastImportIdx)\n content = content.slice(0, lineEnd + 1) + importLine + '\\n' + content.slice(lineEnd + 1)\n } else {\n content = importLine + '\\n' + content\n }\n\n // Add to modules array — handle both empty and existing entries\n // Match the array assignment: `= [...]` or `= [\\n...\\n]`\n content = content.replace(/(=\\s*\\[)([\\s\\S]*?)(])/, (_match, open, existing, close) => {\n const trimmed = existing.trim()\n if (!trimmed) {\n // Empty array: `= []`\n return `${open}${pascal}Module${close}`\n }\n // Existing entries: append with comma\n const needsComma = trimmed.endsWith(',') ? '' : ','\n return `${open}${existing.trimEnd()}${needsComma} ${pascal}Module${close}`\n })\n }\n\n await writeFile(indexPath, content, 'utf-8')\n}\n","/** Convert a name to PascalCase */\nexport function toPascalCase(name: string): string {\n return name\n .replace(/[-_\\s]+(.)?/g, (_, c) => (c ? c.toUpperCase() : ''))\n .replace(/^(.)/, (c) => c.toUpperCase())\n}\n\n/** Convert a name to camelCase */\nexport function toCamelCase(name: string): string {\n const pascal = toPascalCase(name)\n return pascal.charAt(0).toLowerCase() + pascal.slice(1)\n}\n\n/** Convert a name to kebab-case */\nexport function toKebabCase(name: string): string {\n return name\n .replace(/([a-z])([A-Z])/g, '$1-$2')\n .replace(/[\\s_]+/g, '-')\n .toLowerCase()\n}\n\n/**\n * Pluralize a kebab-case name for directory/file names.\n * If already plural (ends in 's'), returns as-is.\n */\nexport function pluralize(name: string): string {\n if (name.endsWith('s')) return name\n if (name.endsWith('x') || name.endsWith('z')) return name + 'es'\n if (name.endsWith('sh') || name.endsWith('ch')) return name + 'es'\n if (name.endsWith('y') && !/[aeiou]y$/.test(name)) return name.slice(0, -1) + 'ies'\n return name + 's'\n}\n\n/**\n * Pluralize a PascalCase name for class identifiers.\n * If already plural (ends in 's'), returns as-is.\n * Used for `List${pluralPascal}UseCase` to avoid `ListUserssUseCase`.\n */\nexport function pluralizePascal(name: string): string {\n if (name.endsWith('s')) return name\n if (name.endsWith('x') || name.endsWith('z')) return name + 'es'\n if (name.endsWith('sh') || name.endsWith('ch')) return name + 'es'\n if (name.endsWith('y') && !/[aeiou]y$/i.test(name)) return name.slice(0, -1) + 'ies'\n return name + 's'\n}\n","import type { RepoType } from '../module'\n\nfunction repoMaps(pascal: string, kebab: string, repo: RepoType) {\n const repoClassMap: Record<string, string> = {\n inmemory: `InMemory${pascal}Repository`,\n drizzle: `Drizzle${pascal}Repository`,\n prisma: `Prisma${pascal}Repository`,\n }\n const repoFileMap: Record<string, string> = {\n inmemory: `in-memory-${kebab}`,\n drizzle: `drizzle-${kebab}`,\n prisma: `prisma-${kebab}`,\n }\n return {\n repoClass: repoClassMap[repo] ?? repoClassMap.inmemory,\n repoFile: repoFileMap[repo] ?? repoFileMap.inmemory,\n }\n}\n\n/** DDD module index — nested folders, use-cases, domain services */\nexport function generateModuleIndex(\n pascal: string,\n kebab: string,\n plural: string,\n repo: RepoType,\n): string {\n const { repoClass, repoFile } = repoMaps(pascal, kebab, repo)\n\n return `/**\n * ${pascal} Module\n *\n * Self-contained feature module following Domain-Driven Design (DDD).\n * Registers dependencies in the DI container and declares HTTP routes.\n *\n * Structure:\n * presentation/ — HTTP controllers (entry points)\n * application/ — Use cases (orchestration) and DTOs (validation)\n * domain/ — Entities, value objects, repository interfaces, domain services\n * infrastructure/ — Repository implementations (in-memory, Drizzle, Prisma, etc.)\n */\nimport { Container, type AppModule, type ModuleRoutes } from '@forinda/kickjs-core'\nimport { buildRoutes } from '@forinda/kickjs-http'\nimport { ${pascal.toUpperCase()}_REPOSITORY } from './domain/repositories/${kebab}.repository'\nimport { ${repoClass} } from './infrastructure/repositories/${repoFile}.repository'\nimport { ${pascal}Controller } from './presentation/${kebab}.controller'\n\n// Eagerly load decorated classes so @Service()/@Repository() decorators register in the DI container\nimport.meta.glob(\n ['./domain/services/**/*.ts', './application/use-cases/**/*.ts', '!./**/*.test.ts'],\n { eager: true },\n)\n\nexport class ${pascal}Module implements AppModule {\n /**\n * Register module dependencies in the DI container.\n * Bind repository interface tokens to their implementations here.\n * To swap implementations (e.g. in-memory -> Drizzle), change the factory target.\n */\n register(container: Container): void {\n container.registerFactory(${pascal.toUpperCase()}_REPOSITORY, () =>\n container.resolve(${repoClass}),\n )\n }\n\n /**\n * Declare HTTP routes for this module.\n * The path is prefixed with the global apiPrefix and version (e.g. /api/v1/${plural}).\n * Passing 'controller' enables automatic OpenAPI spec generation via SwaggerAdapter.\n */\n routes(): ModuleRoutes {\n return {\n path: '/${plural}',\n router: buildRoutes(${pascal}Controller),\n controller: ${pascal}Controller,\n }\n }\n}\n`\n}\n\n/** REST module index — flat folder, service + controller, no use-cases */\nexport function generateRestModuleIndex(\n pascal: string,\n kebab: string,\n plural: string,\n repo: RepoType,\n): string {\n const { repoClass, repoFile } = repoMaps(pascal, kebab, repo)\n\n return `/**\n * ${pascal} Module\n *\n * REST module with a flat folder structure.\n * Controller delegates to service, service wraps the repository.\n *\n * Structure:\n * ${kebab}.controller.ts — HTTP routes (CRUD)\n * ${kebab}.service.ts — Business logic\n * ${kebab}.repository.ts — Repository interface\n * ${repoFile}.repository.ts — Repository implementation\n * dtos/ — Request/response schemas\n */\nimport { Container, type AppModule, type ModuleRoutes } from '@forinda/kickjs-core'\nimport { buildRoutes } from '@forinda/kickjs-http'\nimport { ${pascal.toUpperCase()}_REPOSITORY } from './${kebab}.repository'\nimport { ${repoClass} } from './${repoFile}.repository'\nimport { ${pascal}Controller } from './${kebab}.controller'\n\n// Eagerly load decorated classes so @Service()/@Repository() decorators register in the DI container\nimport.meta.glob(['./**/*.service.ts', './**/*.repository.ts', '!./**/*.test.ts'], { eager: true })\n\nexport class ${pascal}Module implements AppModule {\n register(container: Container): void {\n container.registerFactory(${pascal.toUpperCase()}_REPOSITORY, () =>\n container.resolve(${repoClass}),\n )\n }\n\n routes(): ModuleRoutes {\n return {\n path: '/${plural}',\n router: buildRoutes(${pascal}Controller),\n controller: ${pascal}Controller,\n }\n }\n}\n`\n}\n\n/** Minimal module index — just controller, no service/repo */\nexport function generateMinimalModuleIndex(pascal: string, kebab: string, plural: string): string {\n return `import { type AppModule, type ModuleRoutes } from '@forinda/kickjs-core'\nimport { buildRoutes } from '@forinda/kickjs-http'\nimport { ${pascal}Controller } from './${kebab}.controller'\n\nexport class ${pascal}Module implements AppModule {\n routes(): ModuleRoutes {\n return {\n path: '/${plural}',\n router: buildRoutes(${pascal}Controller),\n controller: ${pascal}Controller,\n }\n }\n}\n`\n}\n","/** DDD controller — injects use-cases, nested import paths */\nexport function generateController(\n pascal: string,\n kebab: string,\n plural: string,\n pluralPascal: string,\n): string {\n return `import { Controller, Get, Post, Put, Delete, Autowired, ApiQueryParams } from '@forinda/kickjs-core'\nimport type { RequestContext } from '@forinda/kickjs-http'\nimport { ApiTags } from '@forinda/kickjs-swagger'\nimport { Create${pascal}UseCase } from '../application/use-cases/create-${kebab}.use-case'\nimport { Get${pascal}UseCase } from '../application/use-cases/get-${kebab}.use-case'\nimport { List${pluralPascal}UseCase } from '../application/use-cases/list-${plural}.use-case'\nimport { Update${pascal}UseCase } from '../application/use-cases/update-${kebab}.use-case'\nimport { Delete${pascal}UseCase } from '../application/use-cases/delete-${kebab}.use-case'\nimport { create${pascal}Schema } from '../application/dtos/create-${kebab}.dto'\nimport { update${pascal}Schema } from '../application/dtos/update-${kebab}.dto'\nimport { ${pascal.toUpperCase()}_QUERY_CONFIG } from '../constants'\n\n@Controller()\nexport class ${pascal}Controller {\n @Autowired() private create${pascal}UseCase!: Create${pascal}UseCase\n @Autowired() private get${pascal}UseCase!: Get${pascal}UseCase\n @Autowired() private list${pluralPascal}UseCase!: List${pluralPascal}UseCase\n @Autowired() private update${pascal}UseCase!: Update${pascal}UseCase\n @Autowired() private delete${pascal}UseCase!: Delete${pascal}UseCase\n\n @Get('/')\n @ApiTags('${pascal}')\n @ApiQueryParams(${pascal.toUpperCase()}_QUERY_CONFIG)\n async list(ctx: RequestContext) {\n return ctx.paginate(\n (parsed) => this.list${pluralPascal}UseCase.execute(parsed),\n ${pascal.toUpperCase()}_QUERY_CONFIG,\n )\n }\n\n @Get('/:id')\n @ApiTags('${pascal}')\n async getById(ctx: RequestContext) {\n const result = await this.get${pascal}UseCase.execute(ctx.params.id)\n if (!result) return ctx.notFound('${pascal} not found')\n ctx.json(result)\n }\n\n @Post('/', { body: create${pascal}Schema, name: 'Create${pascal}' })\n @ApiTags('${pascal}')\n async create(ctx: RequestContext) {\n const result = await this.create${pascal}UseCase.execute(ctx.body)\n ctx.created(result)\n }\n\n @Put('/:id', { body: update${pascal}Schema, name: 'Update${pascal}' })\n @ApiTags('${pascal}')\n async update(ctx: RequestContext) {\n const result = await this.update${pascal}UseCase.execute(ctx.params.id, ctx.body)\n ctx.json(result)\n }\n\n @Delete('/:id')\n @ApiTags('${pascal}')\n async remove(ctx: RequestContext) {\n await this.delete${pascal}UseCase.execute(ctx.params.id)\n ctx.noContent()\n }\n}\n`\n}\n\n/** REST controller — injects service directly, flat import paths */\nexport function generateRestController(\n pascal: string,\n kebab: string,\n plural: string,\n pluralPascal: string,\n): string {\n const camel = pascal.charAt(0).toLowerCase() + pascal.slice(1)\n return `import { Controller, Get, Post, Put, Delete, Autowired, ApiQueryParams } from '@forinda/kickjs-core'\nimport type { RequestContext } from '@forinda/kickjs-http'\nimport { ApiTags } from '@forinda/kickjs-swagger'\nimport { ${pascal}Service } from './${kebab}.service'\nimport { create${pascal}Schema } from './dtos/create-${kebab}.dto'\nimport { update${pascal}Schema } from './dtos/update-${kebab}.dto'\nimport { ${pascal.toUpperCase()}_QUERY_CONFIG } from './${kebab}.constants'\n\n@Controller()\nexport class ${pascal}Controller {\n @Autowired() private ${camel}Service!: ${pascal}Service\n\n @Get('/')\n @ApiTags('${pascal}')\n @ApiQueryParams(${pascal.toUpperCase()}_QUERY_CONFIG)\n async list(ctx: RequestContext) {\n return ctx.paginate(\n (parsed) => this.${camel}Service.findPaginated(parsed),\n ${pascal.toUpperCase()}_QUERY_CONFIG,\n )\n }\n\n @Get('/:id')\n @ApiTags('${pascal}')\n async getById(ctx: RequestContext) {\n const result = await this.${camel}Service.findById(ctx.params.id)\n if (!result) return ctx.notFound('${pascal} not found')\n ctx.json(result)\n }\n\n @Post('/', { body: create${pascal}Schema, name: 'Create${pascal}' })\n @ApiTags('${pascal}')\n async create(ctx: RequestContext) {\n const result = await this.${camel}Service.create(ctx.body)\n ctx.created(result)\n }\n\n @Put('/:id', { body: update${pascal}Schema, name: 'Update${pascal}' })\n @ApiTags('${pascal}')\n async update(ctx: RequestContext) {\n const result = await this.${camel}Service.update(ctx.params.id, ctx.body)\n ctx.json(result)\n }\n\n @Delete('/:id')\n @ApiTags('${pascal}')\n async remove(ctx: RequestContext) {\n await this.${camel}Service.delete(ctx.params.id)\n ctx.noContent()\n }\n}\n`\n}\n","export function generateConstants(pascal: string): string {\n return `import type { QueryParamsConfig } from '@forinda/kickjs-core'\n\nexport const ${pascal.toUpperCase()}_QUERY_CONFIG: QueryParamsConfig = {\n filterable: ['name'],\n sortable: ['name', 'createdAt'],\n searchable: ['name'],\n}\n`\n}\n","export function generateCreateDTO(pascal: string, kebab: string): string {\n return `import { z } from 'zod'\n\n/**\n * Create ${pascal} DTO — Zod schema for validating POST request bodies.\n * This schema is passed to @Post('/', { body: create${pascal}Schema }) for automatic validation.\n * It also generates OpenAPI request body docs when SwaggerAdapter is used.\n *\n * Add more fields as needed. Supported Zod types:\n * z.string(), z.number(), z.boolean(), z.enum([...]),\n * z.array(), z.object(), .optional(), .default(), .transform()\n */\nexport const create${pascal}Schema = z.object({\n name: z.string().min(1, 'Name is required').max(200),\n})\n\nexport type Create${pascal}DTO = z.infer<typeof create${pascal}Schema>\n`\n}\n\nexport function generateUpdateDTO(pascal: string, kebab: string): string {\n return `import { z } from 'zod'\n\nexport const update${pascal}Schema = z.object({\n name: z.string().min(1).max(200).optional(),\n})\n\nexport type Update${pascal}DTO = z.infer<typeof update${pascal}Schema>\n`\n}\n\nexport function generateResponseDTO(pascal: string, kebab: string): string {\n return `export interface ${pascal}ResponseDTO {\n id: string\n name: string\n createdAt: string\n updatedAt: string\n}\n`\n}\n","export function generateUseCases(\n pascal: string,\n kebab: string,\n plural: string,\n pluralPascal: string,\n): { file: string; content: string }[] {\n return [\n {\n file: `create-${kebab}.use-case.ts`,\n content: `/**\n * Create ${pascal} Use Case\n *\n * Application layer — orchestrates a single business operation.\n * Use cases are thin: validate input (via DTO), call domain/repo, return response.\n * Keep business rules in the domain service, not here.\n */\nimport { Service, Inject } from '@forinda/kickjs-core'\nimport { ${pascal.toUpperCase()}_REPOSITORY, type I${pascal}Repository } from '../../domain/repositories/${kebab}.repository'\nimport type { Create${pascal}DTO } from '../dtos/create-${kebab}.dto'\nimport type { ${pascal}ResponseDTO } from '../dtos/${kebab}-response.dto'\n\n@Service()\nexport class Create${pascal}UseCase {\n constructor(\n @Inject(${pascal.toUpperCase()}_REPOSITORY) private readonly repo: I${pascal}Repository,\n ) {}\n\n async execute(dto: Create${pascal}DTO): Promise<${pascal}ResponseDTO> {\n return this.repo.create(dto)\n }\n}\n`,\n },\n {\n file: `get-${kebab}.use-case.ts`,\n content: `import { Service, Inject } from '@forinda/kickjs-core'\nimport { ${pascal.toUpperCase()}_REPOSITORY, type I${pascal}Repository } from '../../domain/repositories/${kebab}.repository'\nimport type { ${pascal}ResponseDTO } from '../dtos/${kebab}-response.dto'\n\n@Service()\nexport class Get${pascal}UseCase {\n constructor(\n @Inject(${pascal.toUpperCase()}_REPOSITORY) private readonly repo: I${pascal}Repository,\n ) {}\n\n async execute(id: string): Promise<${pascal}ResponseDTO | null> {\n return this.repo.findById(id)\n }\n}\n`,\n },\n {\n file: `list-${plural}.use-case.ts`,\n content: `import { Service, Inject } from '@forinda/kickjs-core'\nimport { ${pascal.toUpperCase()}_REPOSITORY, type I${pascal}Repository } from '../../domain/repositories/${kebab}.repository'\nimport type { ParsedQuery } from '@forinda/kickjs-http'\n\n@Service()\nexport class List${pluralPascal}UseCase {\n constructor(\n @Inject(${pascal.toUpperCase()}_REPOSITORY) private readonly repo: I${pascal}Repository,\n ) {}\n\n async execute(parsed: ParsedQuery) {\n return this.repo.findPaginated(parsed)\n }\n}\n`,\n },\n {\n file: `update-${kebab}.use-case.ts`,\n content: `import { Service, Inject } from '@forinda/kickjs-core'\nimport { ${pascal.toUpperCase()}_REPOSITORY, type I${pascal}Repository } from '../../domain/repositories/${kebab}.repository'\nimport type { Update${pascal}DTO } from '../dtos/update-${kebab}.dto'\nimport type { ${pascal}ResponseDTO } from '../dtos/${kebab}-response.dto'\n\n@Service()\nexport class Update${pascal}UseCase {\n constructor(\n @Inject(${pascal.toUpperCase()}_REPOSITORY) private readonly repo: I${pascal}Repository,\n ) {}\n\n async execute(id: string, dto: Update${pascal}DTO): Promise<${pascal}ResponseDTO> {\n return this.repo.update(id, dto)\n }\n}\n`,\n },\n {\n file: `delete-${kebab}.use-case.ts`,\n content: `import { Service, Inject } from '@forinda/kickjs-core'\nimport { ${pascal.toUpperCase()}_REPOSITORY, type I${pascal}Repository } from '../../domain/repositories/${kebab}.repository'\n\n@Service()\nexport class Delete${pascal}UseCase {\n constructor(\n @Inject(${pascal.toUpperCase()}_REPOSITORY) private readonly repo: I${pascal}Repository,\n ) {}\n\n async execute(id: string): Promise<void> {\n await this.repo.delete(id)\n }\n}\n`,\n },\n ]\n}\n","export function generateRepositoryInterface(\n pascal: string,\n kebab: string,\n dtoPrefix = '../../application/dtos',\n): string {\n return `/**\n * ${pascal} Repository Interface\n *\n * Defines the contract for data access.\n * The interface declares what operations are available;\n * implementations (in-memory, Drizzle, Prisma) fulfill the contract.\n *\n * To swap implementations, change the factory in the module's register() method.\n */\nimport type { ${pascal}ResponseDTO } from '${dtoPrefix}/${kebab}-response.dto'\nimport type { Create${pascal}DTO } from '${dtoPrefix}/create-${kebab}.dto'\nimport type { Update${pascal}DTO } from '${dtoPrefix}/update-${kebab}.dto'\nimport type { ParsedQuery } from '@forinda/kickjs-http'\n\nexport interface I${pascal}Repository {\n findById(id: string): Promise<${pascal}ResponseDTO | null>\n findAll(): Promise<${pascal}ResponseDTO[]>\n findPaginated(parsed: ParsedQuery): Promise<{ data: ${pascal}ResponseDTO[]; total: number }>\n create(dto: Create${pascal}DTO): Promise<${pascal}ResponseDTO>\n update(id: string, dto: Update${pascal}DTO): Promise<${pascal}ResponseDTO>\n delete(id: string): Promise<void>\n}\n\nexport const ${pascal.toUpperCase()}_REPOSITORY = Symbol('I${pascal}Repository')\n`\n}\n\nexport function generateInMemoryRepository(\n pascal: string,\n kebab: string,\n repoPrefix = '../../domain/repositories',\n dtoPrefix = '../../application/dtos',\n): string {\n return `/**\n * In-Memory ${pascal} Repository\n *\n * Implements the repository interface using a Map.\n * Useful for prototyping and testing. Replace with a database implementation\n * (Drizzle, Prisma, etc.) for production use.\n *\n * @Repository() registers this class in the DI container as a singleton.\n */\nimport { randomUUID } from 'node:crypto'\nimport { Repository, HttpException } from '@forinda/kickjs-core'\nimport type { ParsedQuery } from '@forinda/kickjs-http'\nimport type { I${pascal}Repository } from '${repoPrefix}/${kebab}.repository'\nimport type { ${pascal}ResponseDTO } from '${dtoPrefix}/${kebab}-response.dto'\nimport type { Create${pascal}DTO } from '${dtoPrefix}/create-${kebab}.dto'\nimport type { Update${pascal}DTO } from '${dtoPrefix}/update-${kebab}.dto'\n\n@Repository()\nexport class InMemory${pascal}Repository implements I${pascal}Repository {\n private store = new Map<string, ${pascal}ResponseDTO>()\n\n async findById(id: string): Promise<${pascal}ResponseDTO | null> {\n return this.store.get(id) ?? null\n }\n\n async findAll(): Promise<${pascal}ResponseDTO[]> {\n return Array.from(this.store.values())\n }\n\n async findPaginated(parsed: ParsedQuery): Promise<{ data: ${pascal}ResponseDTO[]; total: number }> {\n const all = Array.from(this.store.values())\n const data = all.slice(parsed.pagination.offset, parsed.pagination.offset + parsed.pagination.limit)\n return { data, total: all.length }\n }\n\n async create(dto: Create${pascal}DTO): Promise<${pascal}ResponseDTO> {\n const now = new Date().toISOString()\n const entity: ${pascal}ResponseDTO = {\n id: randomUUID(),\n name: dto.name,\n createdAt: now,\n updatedAt: now,\n }\n this.store.set(entity.id, entity)\n return entity\n }\n\n async update(id: string, dto: Update${pascal}DTO): Promise<${pascal}ResponseDTO> {\n const existing = this.store.get(id)\n if (!existing) throw HttpException.notFound('${pascal} not found')\n const updated = { ...existing, ...dto, updatedAt: new Date().toISOString() }\n this.store.set(id, updated)\n return updated\n }\n\n async delete(id: string): Promise<void> {\n if (!this.store.has(id)) throw HttpException.notFound('${pascal} not found')\n this.store.delete(id)\n }\n}\n`\n}\n\nexport function generateDrizzleRepository(\n pascal: string,\n kebab: string,\n repoPrefix = '../../domain/repositories',\n dtoPrefix = '../../application/dtos',\n): string {\n return `/**\n * Drizzle ${pascal} Repository\n *\n * Implements the repository interface using Drizzle ORM.\n * Requires a Drizzle database instance injected via the DI container.\n *\n * TODO: Update the schema import to match your Drizzle schema file.\n * TODO: Replace 'db' injection token with your actual database token.\n *\n * @Repository() registers this class in the DI container as a singleton.\n */\nimport { eq, sql } from 'drizzle-orm'\nimport { Repository, HttpException, Autowired } from '@forinda/kickjs-core'\nimport type { ParsedQuery } from '@forinda/kickjs-http'\nimport type { I${pascal}Repository } from '${repoPrefix}/${kebab}.repository'\nimport type { ${pascal}ResponseDTO } from '${dtoPrefix}/${kebab}-response.dto'\nimport type { Create${pascal}DTO } from '${dtoPrefix}/create-${kebab}.dto'\nimport type { Update${pascal}DTO } from '${dtoPrefix}/update-${kebab}.dto'\n\n// TODO: Import your Drizzle schema table — e.g.:\n// import { ${kebab}s } from '@/db/schema'\n\n// TODO: Import your Drizzle DB injection token — e.g.:\n// import { DRIZZLE_DB } from '@/db/drizzle.provider'\n\n@Repository()\nexport class Drizzle${pascal}Repository implements I${pascal}Repository {\n // TODO: Uncomment and configure your Drizzle DB injection:\n // @Autowired(DRIZZLE_DB) private db!: DrizzleDB\n\n async findById(id: string): Promise<${pascal}ResponseDTO | null> {\n // TODO: Implement with Drizzle\n // const [row] = await this.db.select().from(${kebab}s).where(eq(${kebab}s.id, id))\n // return row ?? null\n throw new Error('Drizzle ${pascal} repository not yet implemented — update schema imports and queries')\n }\n\n async findAll(): Promise<${pascal}ResponseDTO[]> {\n // TODO: Implement with Drizzle\n // return this.db.select().from(${kebab}s)\n throw new Error('Drizzle ${pascal} repository not yet implemented')\n }\n\n async findPaginated(parsed: ParsedQuery): Promise<{ data: ${pascal}ResponseDTO[]; total: number }> {\n // TODO: Implement with Drizzle\n // const data = await this.db.select().from(${kebab}s)\n // .limit(parsed.pagination.limit)\n // .offset(parsed.pagination.offset)\n // const [{ count }] = await this.db.select({ count: sql\\`count(*)\\` }).from(${kebab}s)\n // return { data, total: Number(count) }\n throw new Error('Drizzle ${pascal} repository not yet implemented')\n }\n\n async create(dto: Create${pascal}DTO): Promise<${pascal}ResponseDTO> {\n // TODO: Implement with Drizzle\n // const [row] = await this.db.insert(${kebab}s).values(dto).returning()\n // return row\n throw new Error('Drizzle ${pascal} repository not yet implemented')\n }\n\n async update(id: string, dto: Update${pascal}DTO): Promise<${pascal}ResponseDTO> {\n // TODO: Implement with Drizzle\n // const [row] = await this.db.update(${kebab}s).set(dto).where(eq(${kebab}s.id, id)).returning()\n // if (!row) throw HttpException.notFound('${pascal} not found')\n // return row\n throw new Error('Drizzle ${pascal} repository not yet implemented')\n }\n\n async delete(id: string): Promise<void> {\n // TODO: Implement with Drizzle\n // const result = await this.db.delete(${kebab}s).where(eq(${kebab}s.id, id))\n // if (!result.rowCount) throw HttpException.notFound('${pascal} not found')\n throw new Error('Drizzle ${pascal} repository not yet implemented')\n }\n}\n`\n}\n\nexport function generatePrismaRepository(\n pascal: string,\n kebab: string,\n repoPrefix = '../../domain/repositories',\n dtoPrefix = '../../application/dtos',\n): string {\n const camel = kebab.replace(/-([a-z])/g, (_, c) => c.toUpperCase())\n return `/**\n * Prisma ${pascal} Repository\n *\n * Implements the repository interface using Prisma Client.\n * Requires a PrismaClient instance injected via the DI container.\n *\n * TODO: Ensure your Prisma schema has a '${pascal}' model defined.\n * TODO: Replace 'PRISMA_CLIENT' with your actual Prisma injection token.\n *\n * @Repository() registers this class in the DI container as a singleton.\n */\nimport { Repository, HttpException, Autowired } from '@forinda/kickjs-core'\nimport type { ParsedQuery } from '@forinda/kickjs-http'\nimport type { I${pascal}Repository } from '${repoPrefix}/${kebab}.repository'\nimport type { ${pascal}ResponseDTO } from '${dtoPrefix}/${kebab}-response.dto'\nimport type { Create${pascal}DTO } from '${dtoPrefix}/create-${kebab}.dto'\nimport type { Update${pascal}DTO } from '${dtoPrefix}/update-${kebab}.dto'\n\n// TODO: Import your Prisma injection token — e.g.:\n// import { PRISMA_CLIENT } from '@/db/prisma.provider'\n// import type { PrismaClient } from '@prisma/client'\n\n@Repository()\nexport class Prisma${pascal}Repository implements I${pascal}Repository {\n // TODO: Uncomment and configure your Prisma injection:\n // @Autowired(PRISMA_CLIENT) private prisma!: PrismaClient\n\n async findById(id: string): Promise<${pascal}ResponseDTO | null> {\n // TODO: Implement with Prisma\n // return this.prisma.${camel}.findUnique({ where: { id } })\n throw new Error('Prisma ${pascal} repository not yet implemented — update Prisma imports and queries')\n }\n\n async findAll(): Promise<${pascal}ResponseDTO[]> {\n // TODO: Implement with Prisma\n // return this.prisma.${camel}.findMany()\n throw new Error('Prisma ${pascal} repository not yet implemented')\n }\n\n async findPaginated(parsed: ParsedQuery): Promise<{ data: ${pascal}ResponseDTO[]; total: number }> {\n // TODO: Implement with Prisma\n // const [data, total] = await Promise.all([\n // this.prisma.${camel}.findMany({\n // skip: parsed.pagination.offset,\n // take: parsed.pagination.limit,\n // }),\n // this.prisma.${camel}.count(),\n // ])\n // return { data, total }\n throw new Error('Prisma ${pascal} repository not yet implemented')\n }\n\n async create(dto: Create${pascal}DTO): Promise<${pascal}ResponseDTO> {\n // TODO: Implement with Prisma\n // return this.prisma.${camel}.create({ data: dto })\n throw new Error('Prisma ${pascal} repository not yet implemented')\n }\n\n async update(id: string, dto: Update${pascal}DTO): Promise<${pascal}ResponseDTO> {\n // TODO: Implement with Prisma\n // const row = await this.prisma.${camel}.update({ where: { id }, data: dto })\n // if (!row) throw HttpException.notFound('${pascal} not found')\n // return row\n throw new Error('Prisma ${pascal} repository not yet implemented')\n }\n\n async delete(id: string): Promise<void> {\n // TODO: Implement with Prisma\n // await this.prisma.${camel}.delete({ where: { id } })\n throw new Error('Prisma ${pascal} repository not yet implemented')\n }\n}\n`\n}\n","export function generateDomainService(pascal: string, kebab: string): string {\n return `/**\n * ${pascal} Domain Service\n *\n * Domain layer — contains business rules that don't belong to a single entity.\n * Use this for cross-entity logic, validation rules, and domain invariants.\n * Keep it free of HTTP/framework concerns.\n */\nimport { Service, Inject, HttpException } from '@forinda/kickjs-core'\nimport { ${pascal.toUpperCase()}_REPOSITORY, type I${pascal}Repository } from '../repositories/${kebab}.repository'\n\n@Service()\nexport class ${pascal}DomainService {\n constructor(\n @Inject(${pascal.toUpperCase()}_REPOSITORY) private readonly repo: I${pascal}Repository,\n ) {}\n\n async ensureExists(id: string): Promise<void> {\n const entity = await this.repo.findById(id)\n if (!entity) {\n throw HttpException.notFound('${pascal} not found')\n }\n }\n}\n`\n}\n\nexport function generateEntity(pascal: string, kebab: string): string {\n return `/**\n * ${pascal} Entity\n *\n * Domain layer — the core business object.\n * Uses a private constructor with static factory methods (create, reconstitute)\n * to enforce invariants. Properties are accessed via getters to maintain encapsulation.\n *\n * Patterns used:\n * - Private constructor: prevents direct instantiation\n * - create(): factory for new entities (generates ID, sets timestamps)\n * - reconstitute(): factory for rebuilding from persistence (no side effects)\n * - changeName(): mutation method that enforces business rules\n */\nimport { ${pascal}Id } from '../value-objects/${kebab}-id.vo'\n\ninterface ${pascal}Props {\n id: ${pascal}Id\n name: string\n createdAt: Date\n updatedAt: Date\n}\n\nexport class ${pascal} {\n private constructor(private props: ${pascal}Props) {}\n\n static create(params: { name: string }): ${pascal} {\n const now = new Date()\n return new ${pascal}({\n id: ${pascal}Id.create(),\n name: params.name,\n createdAt: now,\n updatedAt: now,\n })\n }\n\n static reconstitute(props: ${pascal}Props): ${pascal} {\n return new ${pascal}(props)\n }\n\n get id(): ${pascal}Id {\n return this.props.id\n }\n get name(): string {\n return this.props.name\n }\n get createdAt(): Date {\n return this.props.createdAt\n }\n get updatedAt(): Date {\n return this.props.updatedAt\n }\n\n changeName(name: string): void {\n if (!name || name.trim().length === 0) {\n throw new Error('Name cannot be empty')\n }\n this.props.name = name.trim()\n this.props.updatedAt = new Date()\n }\n\n toJSON() {\n return {\n id: this.props.id.toString(),\n name: this.props.name,\n createdAt: this.props.createdAt.toISOString(),\n updatedAt: this.props.updatedAt.toISOString(),\n }\n }\n}\n`\n}\n\nexport function generateValueObject(pascal: string, kebab: string): string {\n return `/**\n * ${pascal} ID Value Object\n *\n * Domain layer — wraps a primitive ID with type safety and validation.\n * Value objects are immutable and compared by value, not reference.\n *\n * ${pascal}Id.create() — generate a new UUID\n * ${pascal}Id.from(id) — wrap an existing ID string (validates non-empty)\n * id.equals(other) — compare two IDs by value\n */\nimport { randomUUID } from 'node:crypto'\n\nexport class ${pascal}Id {\n private constructor(private readonly value: string) {}\n\n static create(): ${pascal}Id {\n return new ${pascal}Id(randomUUID())\n }\n\n static from(id: string): ${pascal}Id {\n if (!id || id.trim().length === 0) {\n throw new Error('${pascal}Id cannot be empty')\n }\n return new ${pascal}Id(id)\n }\n\n toString(): string {\n return this.value\n }\n\n equals(other: ${pascal}Id): boolean {\n return this.value === other.value\n }\n}\n`\n}\n","export function generateControllerTest(pascal: string, kebab: string, plural: string): string {\n return `import { describe, it, expect, beforeEach } from 'vitest'\nimport { Container } from '@forinda/kickjs-core'\n\ndescribe('${pascal}Controller', () => {\n beforeEach(() => {\n Container.reset()\n })\n\n it('should be defined', () => {\n expect(true).toBe(true)\n })\n\n describe('POST /${plural}', () => {\n it('should create a new ${kebab}', async () => {\n // TODO: Set up test module, call create endpoint, assert 201\n expect(true).toBe(true)\n })\n })\n\n describe('GET /${plural}', () => {\n it('should return paginated ${plural}', async () => {\n // TODO: Set up test module, call list endpoint, assert { data, meta }\n expect(true).toBe(true)\n })\n })\n\n describe('GET /${plural}/:id', () => {\n it('should return a ${kebab} by id', async () => {\n // TODO: Create a ${kebab}, then fetch by id, assert match\n expect(true).toBe(true)\n })\n\n it('should return 404 for non-existent ${kebab}', async () => {\n // TODO: Fetch non-existent id, assert 404\n expect(true).toBe(true)\n })\n })\n\n describe('PUT /${plural}/:id', () => {\n it('should update an existing ${kebab}', async () => {\n // TODO: Create, update, assert changes\n expect(true).toBe(true)\n })\n })\n\n describe('DELETE /${plural}/:id', () => {\n it('should delete a ${kebab}', async () => {\n // TODO: Create, delete, assert gone\n expect(true).toBe(true)\n })\n })\n})\n`\n}\n\nexport function generateRepositoryTest(\n pascal: string,\n kebab: string,\n plural: string,\n repoImport = `../infrastructure/repositories/in-memory-${kebab}.repository`,\n): string {\n return `import { describe, it, expect, beforeEach } from 'vitest'\nimport { InMemory${pascal}Repository } from '${repoImport}'\n\ndescribe('InMemory${pascal}Repository', () => {\n let repo: InMemory${pascal}Repository\n\n beforeEach(() => {\n repo = new InMemory${pascal}Repository()\n })\n\n it('should create and retrieve a ${kebab}', async () => {\n const created = await repo.create({ name: 'Test ${pascal}' })\n expect(created).toBeDefined()\n expect(created.name).toBe('Test ${pascal}')\n expect(created.id).toBeDefined()\n\n const found = await repo.findById(created.id)\n expect(found).toEqual(created)\n })\n\n it('should return null for non-existent id', async () => {\n const found = await repo.findById('non-existent')\n expect(found).toBeNull()\n })\n\n it('should list all ${plural}', async () => {\n await repo.create({ name: '${pascal} 1' })\n await repo.create({ name: '${pascal} 2' })\n\n const all = await repo.findAll()\n expect(all).toHaveLength(2)\n })\n\n it('should return paginated results', async () => {\n await repo.create({ name: '${pascal} 1' })\n await repo.create({ name: '${pascal} 2' })\n await repo.create({ name: '${pascal} 3' })\n\n const result = await repo.findPaginated({\n filters: [],\n sort: [],\n search: '',\n pagination: { page: 1, limit: 2, offset: 0 },\n })\n\n expect(result.data).toHaveLength(2)\n expect(result.total).toBe(3)\n })\n\n it('should update a ${kebab}', async () => {\n const created = await repo.create({ name: 'Original' })\n const updated = await repo.update(created.id, { name: 'Updated' })\n expect(updated.name).toBe('Updated')\n })\n\n it('should delete a ${kebab}', async () => {\n const created = await repo.create({ name: 'To Delete' })\n await repo.delete(created.id)\n const found = await repo.findById(created.id)\n expect(found).toBeNull()\n })\n})\n`\n}\n","/** REST service — wraps repository with CRUD methods, replaces use-cases for flat pattern */\nexport function generateRestService(pascal: string, kebab: string): string {\n return `import { Service, Inject, HttpException } from '@forinda/kickjs-core'\nimport type { ParsedQuery } from '@forinda/kickjs-http'\nimport { ${pascal.toUpperCase()}_REPOSITORY, type I${pascal}Repository } from './${kebab}.repository'\nimport type { ${pascal}ResponseDTO } from './dtos/${kebab}-response.dto'\nimport type { Create${pascal}DTO } from './dtos/create-${kebab}.dto'\nimport type { Update${pascal}DTO } from './dtos/update-${kebab}.dto'\n\n@Service()\nexport class ${pascal}Service {\n constructor(\n @Inject(${pascal.toUpperCase()}_REPOSITORY) private readonly repo: I${pascal}Repository,\n ) {}\n\n async findById(id: string): Promise<${pascal}ResponseDTO | null> {\n return this.repo.findById(id)\n }\n\n async findAll(): Promise<${pascal}ResponseDTO[]> {\n return this.repo.findAll()\n }\n\n async findPaginated(parsed: ParsedQuery) {\n return this.repo.findPaginated(parsed)\n }\n\n async create(dto: Create${pascal}DTO): Promise<${pascal}ResponseDTO> {\n return this.repo.create(dto)\n }\n\n async update(id: string, dto: Update${pascal}DTO): Promise<${pascal}ResponseDTO> {\n return this.repo.update(id, dto)\n }\n\n async delete(id: string): Promise<void> {\n await this.repo.delete(id)\n }\n}\n`\n}\n\n/** REST constants — query config for flat pattern */\nexport function generateRestConstants(pascal: string): string {\n return `import type { QueryFieldConfig } from '@forinda/kickjs-http'\n\nexport const ${pascal.toUpperCase()}_QUERY_CONFIG: QueryFieldConfig = {\n filterable: ['name'],\n sortable: ['name', 'createdAt'],\n searchable: ['name'],\n}\n`\n}\n","/** CQRS module index — commands, queries, events, WebSocket + queue integration */\nexport function generateCqrsModuleIndex(\n pascal: string,\n kebab: string,\n plural: string,\n repo: string,\n): string {\n const repoClassMap: Record<string, string> = {\n inmemory: `InMemory${pascal}Repository`,\n drizzle: `Drizzle${pascal}Repository`,\n prisma: `Prisma${pascal}Repository`,\n }\n const repoFileMap: Record<string, string> = {\n inmemory: `in-memory-${kebab}`,\n drizzle: `drizzle-${kebab}`,\n prisma: `prisma-${kebab}`,\n }\n const repoClass = repoClassMap[repo] ?? repoClassMap.inmemory\n const repoFile = repoFileMap[repo] ?? repoFileMap.inmemory\n\n return `/**\n * ${pascal} Module — CQRS Pattern\n *\n * Separates read (queries) and write (commands) operations.\n * Events are emitted after state changes and can be handled via\n * WebSocket broadcasts, queue jobs, or ETL pipelines.\n *\n * Structure:\n * commands/ — Write operations (create, update, delete)\n * queries/ — Read operations (get, list)\n * events/ — Domain events + handlers (WS broadcast, queue dispatch)\n * dtos/ — Request/response schemas\n */\nimport { Container, type AppModule, type ModuleRoutes } from '@forinda/kickjs-core'\nimport { buildRoutes } from '@forinda/kickjs-http'\nimport { ${pascal.toUpperCase()}_REPOSITORY } from './${kebab}.repository'\nimport { ${repoClass} } from './${repoFile}.repository'\nimport { ${pascal}Controller } from './${kebab}.controller'\n\n// Eagerly load decorated classes\nimport.meta.glob(\n [\n './commands/**/*.ts',\n './queries/**/*.ts',\n './events/**/*.ts',\n '!./**/*.test.ts',\n ],\n { eager: true },\n)\n\nexport class ${pascal}Module implements AppModule {\n register(container: Container): void {\n container.registerFactory(${pascal.toUpperCase()}_REPOSITORY, () =>\n container.resolve(${repoClass}),\n )\n }\n\n routes(): ModuleRoutes {\n return {\n path: '/${plural}',\n router: buildRoutes(${pascal}Controller),\n controller: ${pascal}Controller,\n }\n }\n}\n`\n}\n\n/** CQRS controller — dispatches to command/query handlers */\nexport function generateCqrsController(\n pascal: string,\n kebab: string,\n plural: string,\n pluralPascal: string,\n): string {\n const camel = pascal.charAt(0).toLowerCase() + pascal.slice(1)\n return `import { Controller, Get, Post, Put, Delete, Autowired, ApiQueryParams } from '@forinda/kickjs-core'\nimport type { RequestContext } from '@forinda/kickjs-http'\nimport { ApiTags } from '@forinda/kickjs-swagger'\nimport { Create${pascal}Command } from './commands/create-${kebab}.command'\nimport { Update${pascal}Command } from './commands/update-${kebab}.command'\nimport { Delete${pascal}Command } from './commands/delete-${kebab}.command'\nimport { Get${pascal}Query } from './queries/get-${kebab}.query'\nimport { List${pluralPascal}Query } from './queries/list-${plural}.query'\nimport { create${pascal}Schema } from './dtos/create-${kebab}.dto'\nimport { update${pascal}Schema } from './dtos/update-${kebab}.dto'\nimport { ${pascal.toUpperCase()}_QUERY_CONFIG } from './${kebab}.constants'\n\n@Controller()\nexport class ${pascal}Controller {\n @Autowired() private create${pascal}Command!: Create${pascal}Command\n @Autowired() private update${pascal}Command!: Update${pascal}Command\n @Autowired() private delete${pascal}Command!: Delete${pascal}Command\n @Autowired() private get${pascal}Query!: Get${pascal}Query\n @Autowired() private list${pluralPascal}Query!: List${pluralPascal}Query\n\n @Get('/')\n @ApiTags('${pascal}')\n @ApiQueryParams(${pascal.toUpperCase()}_QUERY_CONFIG)\n async list(ctx: RequestContext) {\n return ctx.paginate(\n (parsed) => this.list${pluralPascal}Query.execute(parsed),\n ${pascal.toUpperCase()}_QUERY_CONFIG,\n )\n }\n\n @Get('/:id')\n @ApiTags('${pascal}')\n async getById(ctx: RequestContext) {\n const result = await this.get${pascal}Query.execute(ctx.params.id)\n if (!result) return ctx.notFound('${pascal} not found')\n ctx.json(result)\n }\n\n @Post('/', { body: create${pascal}Schema, name: 'Create${pascal}' })\n @ApiTags('${pascal}')\n async create(ctx: RequestContext) {\n const result = await this.create${pascal}Command.execute(ctx.body)\n ctx.created(result)\n }\n\n @Put('/:id', { body: update${pascal}Schema, name: 'Update${pascal}' })\n @ApiTags('${pascal}')\n async update(ctx: RequestContext) {\n const result = await this.update${pascal}Command.execute(ctx.params.id, ctx.body)\n ctx.json(result)\n }\n\n @Delete('/:id')\n @ApiTags('${pascal}')\n async remove(ctx: RequestContext) {\n await this.delete${pascal}Command.execute(ctx.params.id)\n ctx.noContent()\n }\n}\n`\n}\n\n/** CQRS commands — write operations that emit events */\nexport function generateCqrsCommands(\n pascal: string,\n kebab: string,\n): { file: string; content: string }[] {\n return [\n {\n file: `create-${kebab}.command.ts`,\n content: `import { Service, Inject } from '@forinda/kickjs-core'\nimport { ${pascal.toUpperCase()}_REPOSITORY, type I${pascal}Repository } from '../${kebab}.repository'\nimport type { Create${pascal}DTO } from '../dtos/create-${kebab}.dto'\nimport type { ${pascal}ResponseDTO } from '../dtos/${kebab}-response.dto'\nimport { ${pascal}Events } from '../events/${kebab}.events'\n\n@Service()\nexport class Create${pascal}Command {\n constructor(\n @Inject(${pascal.toUpperCase()}_REPOSITORY) private readonly repo: I${pascal}Repository,\n @Inject(${pascal}Events) private readonly events: ${pascal}Events,\n ) {}\n\n async execute(dto: Create${pascal}DTO): Promise<${pascal}ResponseDTO> {\n const result = await this.repo.create(dto)\n this.events.emit('${kebab}.created', result)\n return result\n }\n}\n`,\n },\n {\n file: `update-${kebab}.command.ts`,\n content: `import { Service, Inject } from '@forinda/kickjs-core'\nimport { ${pascal.toUpperCase()}_REPOSITORY, type I${pascal}Repository } from '../${kebab}.repository'\nimport type { Update${pascal}DTO } from '../dtos/update-${kebab}.dto'\nimport type { ${pascal}ResponseDTO } from '../dtos/${kebab}-response.dto'\nimport { ${pascal}Events } from '../events/${kebab}.events'\n\n@Service()\nexport class Update${pascal}Command {\n constructor(\n @Inject(${pascal.toUpperCase()}_REPOSITORY) private readonly repo: I${pascal}Repository,\n @Inject(${pascal}Events) private readonly events: ${pascal}Events,\n ) {}\n\n async execute(id: string, dto: Update${pascal}DTO): Promise<${pascal}ResponseDTO> {\n const result = await this.repo.update(id, dto)\n this.events.emit('${kebab}.updated', result)\n return result\n }\n}\n`,\n },\n {\n file: `delete-${kebab}.command.ts`,\n content: `import { Service, Inject } from '@forinda/kickjs-core'\nimport { ${pascal.toUpperCase()}_REPOSITORY, type I${pascal}Repository } from '../${kebab}.repository'\nimport { ${pascal}Events } from '../events/${kebab}.events'\n\n@Service()\nexport class Delete${pascal}Command {\n constructor(\n @Inject(${pascal.toUpperCase()}_REPOSITORY) private readonly repo: I${pascal}Repository,\n @Inject(${pascal}Events) private readonly events: ${pascal}Events,\n ) {}\n\n async execute(id: string): Promise<void> {\n await this.repo.delete(id)\n this.events.emit('${kebab}.deleted', { id })\n }\n}\n`,\n },\n ]\n}\n\n/** CQRS queries — read operations */\nexport function generateCqrsQueries(\n pascal: string,\n kebab: string,\n plural: string,\n pluralPascal: string,\n): { file: string; content: string }[] {\n return [\n {\n file: `get-${kebab}.query.ts`,\n content: `import { Service, Inject } from '@forinda/kickjs-core'\nimport { ${pascal.toUpperCase()}_REPOSITORY, type I${pascal}Repository } from '../${kebab}.repository'\nimport type { ${pascal}ResponseDTO } from '../dtos/${kebab}-response.dto'\n\n@Service()\nexport class Get${pascal}Query {\n constructor(\n @Inject(${pascal.toUpperCase()}_REPOSITORY) private readonly repo: I${pascal}Repository,\n ) {}\n\n async execute(id: string): Promise<${pascal}ResponseDTO | null> {\n return this.repo.findById(id)\n }\n}\n`,\n },\n {\n file: `list-${plural}.query.ts`,\n content: `import { Service, Inject } from '@forinda/kickjs-core'\nimport { ${pascal.toUpperCase()}_REPOSITORY, type I${pascal}Repository } from '../${kebab}.repository'\nimport type { ParsedQuery } from '@forinda/kickjs-http'\n\n@Service()\nexport class List${pluralPascal}Query {\n constructor(\n @Inject(${pascal.toUpperCase()}_REPOSITORY) private readonly repo: I${pascal}Repository,\n ) {}\n\n async execute(parsed: ParsedQuery) {\n return this.repo.findPaginated(parsed)\n }\n}\n`,\n },\n ]\n}\n\n/** CQRS events — domain event emitter + handler with WS/queue integration */\nexport function generateCqrsEvents(\n pascal: string,\n kebab: string,\n): { file: string; content: string }[] {\n return [\n {\n file: `${kebab}.events.ts`,\n content: `import { Service } from '@forinda/kickjs-core'\nimport { EventEmitter } from 'node:events'\nimport type { ${pascal}ResponseDTO } from '../dtos/${kebab}-response.dto'\n\n/**\n * ${pascal} domain event types.\n *\n * These events are emitted by commands after state changes.\n * Subscribe to them in event handlers for side effects:\n * - WebSocket broadcasts (real-time UI updates)\n * - Queue jobs (async processing, ETL pipelines)\n * - Audit logging\n * - Cache invalidation\n */\nexport interface ${pascal}EventMap {\n '${kebab}.created': ${pascal}ResponseDTO\n '${kebab}.updated': ${pascal}ResponseDTO\n '${kebab}.deleted': { id: string }\n}\n\n@Service()\nexport class ${pascal}Events {\n private emitter = new EventEmitter()\n\n emit<K extends keyof ${pascal}EventMap>(event: K, data: ${pascal}EventMap[K]): void {\n this.emitter.emit(event, data)\n }\n\n on<K extends keyof ${pascal}EventMap>(event: K, handler: (data: ${pascal}EventMap[K]) => void): void {\n this.emitter.on(event, handler)\n }\n\n off<K extends keyof ${pascal}EventMap>(event: K, handler: (data: ${pascal}EventMap[K]) => void): void {\n this.emitter.off(event, handler)\n }\n}\n`,\n },\n {\n file: `on-${kebab}-change.handler.ts`,\n content: `import { Service, Autowired } from '@forinda/kickjs-core'\nimport { ${pascal}Events } from './${kebab}.events'\n\n/**\n * ${pascal} Change Event Handler\n *\n * Reacts to domain events emitted by commands.\n * Wire up side effects here:\n *\n * 1. WebSocket broadcast — notify connected clients in real-time\n * import { WsGateway } from '@forinda/kickjs-ws'\n * this.ws.broadcast('${kebab}-channel', { event, data })\n *\n * 2. Queue dispatch — offload heavy processing to background workers\n * import { QueueService } from '@forinda/kickjs-queue'\n * this.queue.add('${kebab}-etl', { action: event, payload: data })\n *\n * 3. ETL pipeline — transform and load data to external systems\n * await this.etlPipeline.process(data)\n */\n@Service()\nexport class On${pascal}ChangeHandler {\n @Autowired() private events!: ${pascal}Events\n\n // Uncomment to inject WebSocket and Queue services:\n // @Autowired() private ws!: WsGateway\n // @Autowired() private queue!: QueueService\n\n onInit(): void {\n this.events.on('${kebab}.created', (data) => {\n console.log('[${pascal}] Created:', data.id)\n // TODO: Broadcast via WebSocket\n // this.ws.broadcast('${kebab}-channel', { event: '${kebab}.created', data })\n // TODO: Dispatch to queue for async processing / ETL\n // this.queue.add('${kebab}-etl', { action: 'create', payload: data })\n })\n\n this.events.on('${kebab}.updated', (data) => {\n console.log('[${pascal}] Updated:', data.id)\n // TODO: Broadcast via WebSocket\n // this.ws.broadcast('${kebab}-channel', { event: '${kebab}.updated', data })\n })\n\n this.events.on('${kebab}.deleted', (data) => {\n console.log('[${pascal}] Deleted:', data.id)\n // TODO: Broadcast via WebSocket\n // this.ws.broadcast('${kebab}-channel', { event: '${kebab}.deleted', data })\n })\n }\n}\n`,\n },\n ]\n}\n","import { join } from 'node:path'\nimport { writeFileSafe } from '../utils/fs'\nimport { toPascalCase, toKebabCase } from '../utils/naming'\n\ninterface GenerateAdapterOptions {\n name: string\n outDir: string\n}\n\nexport async function generateAdapter(options: GenerateAdapterOptions): Promise<string[]> {\n const { name, outDir } = options\n const kebab = toKebabCase(name)\n const pascal = toPascalCase(name)\n const files: string[] = []\n\n const filePath = join(outDir, `${kebab}.adapter.ts`)\n await writeFileSafe(\n filePath,\n `import type { Express } from 'express'\nimport type { AppAdapter, AdapterMiddleware, Container } from '@forinda/kickjs-core'\n\nexport interface ${pascal}AdapterOptions {\n // Add your adapter configuration here\n}\n\n/**\n * ${pascal} adapter.\n *\n * Hooks into the Application lifecycle to add middleware, routes,\n * or external service connections.\n *\n * Usage:\n * bootstrap({\n * adapters: [new ${pascal}Adapter({ ... })],\n * })\n */\nexport class ${pascal}Adapter implements AppAdapter {\n name = '${pascal}Adapter'\n\n constructor(private options: ${pascal}AdapterOptions = {}) {}\n\n /**\n * Return middleware entries that the Application will mount.\n * Use \\`phase\\` to control where in the pipeline they run:\n * 'beforeGlobal' | 'afterGlobal' | 'beforeRoutes' | 'afterRoutes'\n */\n middleware(): AdapterMiddleware[] {\n return [\n // Example: add a custom header to all responses\n // {\n // phase: 'beforeGlobal',\n // handler: (_req: any, res: any, next: any) => {\n // res.setHeader('X-${pascal}', 'true')\n // next()\n // },\n // },\n // Example: scope middleware to a specific path\n // {\n // phase: 'beforeRoutes',\n // path: '/api/v1/admin',\n // handler: myAdminMiddleware(),\n // },\n ]\n }\n\n /**\n * Called before global middleware.\n * Use this to mount routes that bypass the middleware stack\n * (health checks, docs UI, static assets).\n */\n beforeMount(app: Express, container: Container): void {\n // Example: mount a status route\n // app.get('/${kebab}/status', (_req, res) => {\n // res.json({ status: 'ok' })\n // })\n }\n\n /**\n * Called after modules and routes are registered, before the server starts.\n * Use this for late-stage DI registrations or config validation.\n */\n beforeStart(app: Express, container: Container): void {\n // Example: register a service in the DI container\n // container.registerInstance(MY_TOKEN, new MyService(this.options))\n }\n\n /**\n * Called after the HTTP server is listening.\n * Use this to attach to the raw http.Server (Socket.IO, gRPC, etc).\n */\n afterStart(server: any, container: Container): void {\n // Example: attach Socket.IO\n // const io = new Server(server)\n // container.registerInstance(SOCKET_IO, io)\n }\n\n /**\n * Called on graceful shutdown. Clean up connections.\n */\n async shutdown(): Promise<void> {\n // Example: close a connection pool\n // await this.pool.end()\n }\n}\n`,\n )\n files.push(filePath)\n\n return files\n}\n","import { join } from 'node:path'\nimport { writeFileSafe } from '../utils/fs'\nimport { toPascalCase, toKebabCase, toCamelCase } from '../utils/naming'\nimport { resolveOutDir } from '../utils/resolve-out-dir'\nimport type { ProjectPattern } from '../config'\n\ninterface GenerateMiddlewareOptions {\n name: string\n outDir?: string\n moduleName?: string\n modulesDir?: string\n pattern?: ProjectPattern\n}\n\nexport async function generateMiddleware(options: GenerateMiddlewareOptions): Promise<string[]> {\n const { name, moduleName, modulesDir, pattern } = options\n const outDir = resolveOutDir({\n type: 'middleware',\n outDir: options.outDir,\n moduleName,\n modulesDir,\n defaultDir: 'src/middleware',\n pattern,\n })\n const kebab = toKebabCase(name)\n const camel = toCamelCase(name)\n const files: string[] = []\n\n const filePath = join(outDir, `${kebab}.middleware.ts`)\n await writeFileSafe(\n filePath,\n `import type { Request, Response, NextFunction } from 'express'\n\nexport interface ${toPascalCase(name)}Options {\n // Add configuration options here\n}\n\n/**\n * ${toPascalCase(name)} middleware.\n *\n * Usage in bootstrap:\n * middleware: [${camel}()]\n *\n * Usage with adapter:\n * middleware() { return [{ handler: ${camel}(), phase: 'afterGlobal' }] }\n *\n * Usage with @Middleware decorator:\n * @Middleware(${camel}())\n */\nexport function ${camel}(options: ${toPascalCase(name)}Options = {}) {\n return (req: Request, res: Response, next: NextFunction) => {\n // Implement your middleware logic here\n next()\n }\n}\n`,\n )\n files.push(filePath)\n\n return files\n}\n","import { resolve, join } from 'node:path'\nimport { pluralize, toKebabCase } from './naming'\nimport type { ProjectPattern } from '../config'\n\n/**\n * DDD folder mapping — nested layered architecture.\n */\nconst DDD_FOLDER_MAP: Record<string, string> = {\n controller: 'presentation',\n service: 'domain/services',\n dto: 'application/dtos',\n guard: 'presentation/guards',\n middleware: 'middleware',\n}\n\n/**\n * Flat folder mapping — REST/GraphQL/minimal patterns.\n * Files live at the module root or in minimal subdirectories.\n */\nconst FLAT_FOLDER_MAP: Record<string, string> = {\n controller: '',\n service: '',\n dto: 'dtos',\n guard: 'guards',\n middleware: 'middleware',\n}\n\n/**\n * CQRS folder mapping — commands, queries, events.\n */\nconst CQRS_FOLDER_MAP: Record<string, string> = {\n controller: '',\n service: '',\n dto: 'dtos',\n guard: 'guards',\n middleware: 'middleware',\n command: 'commands',\n query: 'queries',\n event: 'events',\n}\n\nexport interface ResolveOutDirOptions {\n /** The artifact type (controller, service, dto, guard, middleware) */\n type: string\n /** Explicit -o / --out dir from CLI flag (takes highest priority) */\n outDir?: string\n /** Module name from --module flag */\n moduleName?: string\n /** Modules directory (from config or default) */\n modulesDir?: string\n /** Standalone default directory when no --module is used (e.g. 'src/controllers') */\n defaultDir: string\n /** Project pattern — determines folder structure inside modules */\n pattern?: ProjectPattern\n}\n\n/**\n * Resolve the output directory for a generator artifact.\n *\n * Priority:\n * 1. Explicit --out flag (always wins)\n * 2. --module flag → maps into module's folder (DDD or flat based on pattern)\n * 3. Standalone default directory\n */\nexport function resolveOutDir(options: ResolveOutDirOptions): string {\n const {\n type,\n outDir,\n moduleName,\n modulesDir = 'src/modules',\n defaultDir,\n pattern = 'ddd',\n } = options\n\n // Explicit --out always wins\n if (outDir) return resolve(outDir)\n\n // Module-scoped: place inside the module's folder\n if (moduleName) {\n const folderMap =\n pattern === 'ddd' ? DDD_FOLDER_MAP : pattern === 'cqrs' ? CQRS_FOLDER_MAP : FLAT_FOLDER_MAP\n const kebab = toKebabCase(moduleName)\n const plural = pluralize(kebab)\n const subfolder = folderMap[type] ?? ''\n const base = join(modulesDir, plural)\n return resolve(subfolder ? join(base, subfolder) : base)\n }\n\n // Standalone default\n return resolve(defaultDir)\n}\n","import { join } from 'node:path'\nimport { writeFileSafe } from '../utils/fs'\nimport { toPascalCase, toKebabCase, toCamelCase } from '../utils/naming'\nimport { resolveOutDir } from '../utils/resolve-out-dir'\nimport type { ProjectPattern } from '../config'\n\ninterface GenerateGuardOptions {\n name: string\n outDir?: string\n moduleName?: string\n modulesDir?: string\n pattern?: ProjectPattern\n}\n\nexport async function generateGuard(options: GenerateGuardOptions): Promise<string[]> {\n const { name, moduleName, modulesDir, pattern } = options\n const outDir = resolveOutDir({\n type: 'guard',\n outDir: options.outDir,\n moduleName,\n modulesDir,\n defaultDir: 'src/guards',\n pattern,\n })\n const kebab = toKebabCase(name)\n const camel = toCamelCase(name)\n const pascal = toPascalCase(name)\n const files: string[] = []\n\n const filePath = join(outDir, `${kebab}.guard.ts`)\n await writeFileSafe(\n filePath,\n `import { Container, HttpException } from '@forinda/kickjs-core'\nimport type { RequestContext } from '@forinda/kickjs-http'\n\n/**\n * ${pascal} guard.\n *\n * Guards protect routes by checking conditions before the handler runs.\n * Return early with an error response to block access.\n *\n * Usage:\n * @Middleware(${camel}Guard)\n * @Get('/protected')\n * async handler(ctx: RequestContext) { ... }\n */\nexport async function ${camel}Guard(ctx: RequestContext, next: () => void): Promise<void> {\n // Example: check for an authorization header\n const header = ctx.headers.authorization\n if (!header?.startsWith('Bearer ')) {\n ctx.res.status(401).json({ message: 'Missing or invalid authorization header' })\n return\n }\n\n const token = header.slice(7)\n\n try {\n // Verify the token using a service from the DI container\n // const container = Container.getInstance()\n // const authService = container.resolve(AuthService)\n // const payload = authService.verifyToken(token)\n // ctx.set('auth', payload)\n\n next()\n } catch {\n ctx.res.status(401).json({ message: 'Invalid or expired token' })\n }\n}\n`,\n )\n files.push(filePath)\n\n return files\n}\n","import { join } from 'node:path'\nimport { writeFileSafe } from '../utils/fs'\nimport { toPascalCase, toKebabCase } from '../utils/naming'\nimport { resolveOutDir } from '../utils/resolve-out-dir'\nimport type { ProjectPattern } from '../config'\n\ninterface GenerateServiceOptions {\n name: string\n outDir?: string\n moduleName?: string\n modulesDir?: string\n pattern?: ProjectPattern\n}\n\nexport async function generateService(options: GenerateServiceOptions): Promise<string[]> {\n const { name, moduleName, modulesDir, pattern } = options\n const outDir = resolveOutDir({\n type: 'service',\n outDir: options.outDir,\n moduleName,\n modulesDir,\n defaultDir: 'src/services',\n pattern,\n })\n const kebab = toKebabCase(name)\n const pascal = toPascalCase(name)\n const files: string[] = []\n\n const filePath = join(outDir, `${kebab}.service.ts`)\n await writeFileSafe(\n filePath,\n `import { Service } from '@forinda/kickjs-core'\n\n@Service()\nexport class ${pascal}Service {\n // Inject dependencies via constructor\n // constructor(\n // @Inject(MY_REPO) private readonly repo: IMyRepository,\n // ) {}\n}\n`,\n )\n files.push(filePath)\n\n return files\n}\n","import { join } from 'node:path'\nimport { writeFileSafe } from '../utils/fs'\nimport { toPascalCase, toKebabCase } from '../utils/naming'\nimport { resolveOutDir } from '../utils/resolve-out-dir'\nimport type { ProjectPattern } from '../config'\n\ninterface GenerateControllerOptions {\n name: string\n outDir?: string\n moduleName?: string\n modulesDir?: string\n pattern?: ProjectPattern\n}\n\nexport async function generateController(options: GenerateControllerOptions): Promise<string[]> {\n const { name, moduleName, modulesDir, pattern } = options\n const outDir = resolveOutDir({\n type: 'controller',\n outDir: options.outDir,\n moduleName,\n modulesDir,\n defaultDir: 'src/controllers',\n pattern,\n })\n const kebab = toKebabCase(name)\n const pascal = toPascalCase(name)\n const files: string[] = []\n\n const filePath = join(outDir, `${kebab}.controller.ts`)\n await writeFileSafe(\n filePath,\n `import { Controller, Get, Post, Autowired } from '@forinda/kickjs-core'\nimport type { RequestContext } from '@forinda/kickjs-http'\n\n@Controller()\nexport class ${pascal}Controller {\n // @Autowired() private myService!: MyService\n\n @Get('/')\n async list(ctx: RequestContext) {\n ctx.json({ message: '${pascal} list' })\n }\n\n @Post('/')\n async create(ctx: RequestContext) {\n ctx.created({ message: '${pascal} created', data: ctx.body })\n }\n}\n`,\n )\n files.push(filePath)\n\n return files\n}\n","import { join } from 'node:path'\nimport { writeFileSafe } from '../utils/fs'\nimport { toPascalCase, toKebabCase, toCamelCase } from '../utils/naming'\nimport { resolveOutDir } from '../utils/resolve-out-dir'\nimport type { ProjectPattern } from '../config'\n\ninterface GenerateDtoOptions {\n name: string\n outDir?: string\n moduleName?: string\n modulesDir?: string\n pattern?: ProjectPattern\n}\n\nexport async function generateDto(options: GenerateDtoOptions): Promise<string[]> {\n const { name, moduleName, modulesDir, pattern } = options\n const outDir = resolveOutDir({\n type: 'dto',\n outDir: options.outDir,\n moduleName,\n modulesDir,\n defaultDir: 'src/dtos',\n pattern,\n })\n const kebab = toKebabCase(name)\n const pascal = toPascalCase(name)\n const camel = toCamelCase(name)\n const files: string[] = []\n\n const filePath = join(outDir, `${kebab}.dto.ts`)\n await writeFileSafe(\n filePath,\n `import { z } from 'zod'\n\nexport const ${camel}Schema = z.object({\n // Define your schema fields here\n name: z.string().min(1).max(200),\n})\n\nexport type ${pascal}DTO = z.infer<typeof ${camel}Schema>\n`,\n )\n files.push(filePath)\n\n return files\n}\n","import { join } from 'node:path'\nimport { existsSync } from 'node:fs'\nimport { createInterface } from 'node:readline'\nimport { writeFileSafe } from '../utils/fs'\n\ninterface GenerateConfigOptions {\n outDir: string\n modulesDir?: string\n defaultRepo?: string\n force?: boolean\n}\n\nasync function confirm(message: string): Promise<boolean> {\n const rl = createInterface({ input: process.stdin, output: process.stdout })\n return new Promise((resolve) => {\n rl.question(` ${message} (y/N) `, (answer) => {\n rl.close()\n resolve(answer.trim().toLowerCase() === 'y')\n })\n })\n}\n\nexport async function generateConfig(options: GenerateConfigOptions): Promise<string[]> {\n const filePath = join(options.outDir, 'kick.config.ts')\n const modulesDir = options.modulesDir ?? 'src/modules'\n const defaultRepo = options.defaultRepo ?? 'inmemory'\n\n if (existsSync(filePath) && !options.force) {\n const overwrite = await confirm('kick.config.ts already exists. Overwrite?')\n if (!overwrite) {\n console.log('\\n Skipped — existing kick.config.ts preserved.')\n return []\n }\n }\n\n await writeFileSafe(\n filePath,\n `import { defineConfig } from '@forinda/kickjs-cli'\n\nexport default defineConfig({\n modulesDir: '${modulesDir}',\n defaultRepo: '${defaultRepo}',\n\n commands: [\n {\n name: 'test',\n description: 'Run tests with Vitest',\n steps: 'npx vitest run',\n },\n {\n name: 'format',\n description: 'Format code with Prettier',\n steps: 'npx prettier --write src/',\n },\n {\n name: 'format:check',\n description: 'Check formatting without writing',\n steps: 'npx prettier --check src/',\n },\n {\n name: 'check',\n description: 'Run typecheck + format check',\n steps: ['npx tsc --noEmit', 'npx prettier --check src/'],\n aliases: ['verify', 'ci'],\n },\n ],\n})\n`,\n )\n\n return [filePath]\n}\n","import { join } from 'node:path'\nimport { writeFileSafe } from '../utils/fs'\nimport { toPascalCase, toKebabCase, toCamelCase } from '../utils/naming'\n\ninterface GenerateResolverOptions {\n name: string\n outDir: string\n}\n\nexport async function generateResolver(options: GenerateResolverOptions): Promise<string[]> {\n const { name, outDir } = options\n const pascal = toPascalCase(name)\n const kebab = toKebabCase(name)\n const camel = toCamelCase(name)\n const files: string[] = []\n\n const write = async (relativePath: string, content: string) => {\n const fullPath = join(outDir, relativePath)\n await writeFileSafe(fullPath, content)\n files.push(fullPath)\n }\n\n await write(\n `${kebab}.resolver.ts`,\n `import { Service } from '@forinda/kickjs-core'\nimport { Resolver, Query, Mutation, Arg } from '@forinda/kickjs-graphql'\n\n/**\n * ${pascal} GraphQL Resolver\n *\n * Decorators:\n * @Resolver(typeName?) — marks this class as a GraphQL resolver\n * @Query(name?, { returnType?, description? }) — defines a query field\n * @Mutation(name?, { returnType?, description? }) — defines a mutation field\n * @Arg(name, type?) — marks a method parameter as a GraphQL argument\n */\n@Service()\n@Resolver('${pascal}')\nexport class ${pascal}Resolver {\n private items: Array<{ id: string; name: string }> = []\n\n @Query('${camel}s', { returnType: '[${pascal}]', description: 'List all ${camel}s' })\n findAll() {\n return this.items\n }\n\n @Query('${camel}', { returnType: '${pascal}', description: 'Get a ${camel} by ID' })\n findById(@Arg('id', 'ID!') id: string) {\n return this.items.find((item) => item.id === id) ?? null\n }\n\n @Mutation('create${pascal}', { returnType: '${pascal}', description: 'Create a new ${camel}' })\n create(@Arg('name', 'String!') name: string) {\n const item = { id: String(this.items.length + 1), name }\n this.items.push(item)\n return item\n }\n\n @Mutation('update${pascal}', { returnType: '${pascal}', description: 'Update a ${camel}' })\n update(@Arg('id', 'ID!') id: string, @Arg('name', 'String!') name: string) {\n const item = this.items.find((i) => i.id === id)\n if (item) item.name = name\n return item\n }\n\n @Mutation('delete${pascal}', { returnType: 'Boolean', description: 'Delete a ${camel}' })\n remove(@Arg('id', 'ID!') id: string) {\n const idx = this.items.findIndex((i) => i.id === id)\n if (idx === -1) return false\n this.items.splice(idx, 1)\n return true\n }\n}\n`,\n )\n\n await write(\n `${kebab}.typedefs.ts`,\n `/**\n * ${pascal} GraphQL type definitions.\n * Pass to GraphQLAdapter's typeDefs option to register custom types.\n */\nexport const ${camel}TypeDefs = \\`\n type ${pascal} {\n id: ID!\n name: String!\n }\n\\`\n`,\n )\n\n return files\n}\n","import { join } from 'node:path'\nimport { writeFileSafe } from '../utils/fs'\nimport { toPascalCase, toKebabCase, toCamelCase } from '../utils/naming'\n\ninterface GenerateJobOptions {\n name: string\n outDir: string\n queue?: string\n}\n\nexport async function generateJob(options: GenerateJobOptions): Promise<string[]> {\n const { name, outDir } = options\n const pascal = toPascalCase(name)\n const kebab = toKebabCase(name)\n const camel = toCamelCase(name)\n const queueName = options.queue ?? `${kebab}-queue`\n const files: string[] = []\n\n const write = async (relativePath: string, content: string) => {\n const fullPath = join(outDir, relativePath)\n await writeFileSafe(fullPath, content)\n files.push(fullPath)\n }\n\n await write(\n `${kebab}.job.ts`,\n `import { Inject } from '@forinda/kickjs-core'\nimport { Job, Process, QUEUE_MANAGER, type QueueService } from '@forinda/kickjs-queue'\n\n/**\n * ${pascal} Job Processor\n *\n * Decorators:\n * @Job(queueName) — marks this class as a job processor for a queue\n * @Process(jobName?) — marks a method as the handler for a specific job type\n * - Without a name: handles all jobs in the queue\n * - With a name: handles only jobs matching that name\n *\n * To add jobs to this queue from a service or controller:\n * @Inject(QUEUE_MANAGER) private queue: QueueService\n * await this.queue.add('${queueName}', '${camel}', { ... })\n */\n@Job('${queueName}')\nexport class ${pascal}Job {\n @Process()\n async handle(job: { name: string; data: any; id?: string }) {\n console.log(\\`Processing \\${job.name} (id: \\${job.id})\\`, job.data)\n\n // TODO: Implement job logic here\n // Example:\n // await this.emailService.send(job.data.to, job.data.subject, job.data.body)\n }\n\n @Process('${camel}.priority')\n async handlePriority(job: { name: string; data: any; id?: string }) {\n console.log(\\`Priority job: \\${job.name}\\`, job.data)\n // Handle high-priority variant of this job\n }\n}\n`,\n )\n\n return files\n}\n","import { join } from 'node:path'\nimport { writeFileSafe, fileExists } from '../utils/fs'\nimport { toPascalCase, toKebabCase, toCamelCase, pluralize, pluralizePascal } from '../utils/naming'\nimport { readFile, writeFile } from 'node:fs/promises'\n\n// ── Field Parsing ───────────────────────────────────────────────────────\n\nexport interface FieldDef {\n name: string\n type: string\n tsType: string\n zodType: string\n optional: boolean\n}\n\n/**\n * Supported field types and their mappings:\n * string → z.string()\n * text → z.string() (alias, hints at longer content)\n * number → z.number()\n * int → z.number().int()\n * float → z.number()\n * boolean → z.boolean()\n * date → z.string().datetime()\n * email → z.string().email()\n * url → z.string().url()\n * uuid → z.string().uuid()\n * json → z.any()\n * enum:a,b → z.enum(['a','b'])\n *\n * Append ? for optional: title:string body:text? published:boolean?\n */\nconst TYPE_MAP: Record<string, { ts: string; zod: string }> = {\n string: { ts: 'string', zod: 'z.string()' },\n text: { ts: 'string', zod: 'z.string()' },\n number: { ts: 'number', zod: 'z.number()' },\n int: { ts: 'number', zod: 'z.number().int()' },\n float: { ts: 'number', zod: 'z.number()' },\n boolean: { ts: 'boolean', zod: 'z.boolean()' },\n date: { ts: 'string', zod: 'z.string().datetime()' },\n email: { ts: 'string', zod: 'z.string().email()' },\n url: { ts: 'string', zod: 'z.string().url()' },\n uuid: { ts: 'string', zod: 'z.string().uuid()' },\n json: { ts: 'any', zod: 'z.any()' },\n}\n\nexport function parseFields(raw: string[]): FieldDef[] {\n return raw.map((f) => {\n const colonIdx = f.indexOf(':')\n if (colonIdx === -1) {\n throw new Error(`Invalid field: \"${f}\". Use format: name:type (e.g. title:string)`)\n }\n const namePart = f.slice(0, colonIdx)\n const typePart = f.slice(colonIdx + 1)\n if (!namePart || !typePart) {\n throw new Error(`Invalid field: \"${f}\". Use format: name:type (e.g. title:string)`)\n }\n\n const optional = typePart.endsWith('?')\n const cleanType = optional ? typePart.slice(0, -1) : typePart\n\n // Handle enum:val1,val2\n if (cleanType.startsWith('enum:')) {\n const values = cleanType.slice(5).split(',')\n return {\n name: namePart,\n type: 'enum',\n tsType: values.map((v) => `'${v}'`).join(' | '),\n zodType: `z.enum([${values.map((v) => `'${v}'`).join(', ')}])`,\n optional,\n }\n }\n\n const mapped = TYPE_MAP[cleanType]\n if (!mapped) {\n const validTypes = [...Object.keys(TYPE_MAP), 'enum:a,b,c'].join(', ')\n throw new Error(`Unknown field type: \"${cleanType}\". Valid types: ${validTypes}`)\n }\n\n return {\n name: namePart,\n type: cleanType,\n tsType: mapped.ts,\n zodType: mapped.zod,\n optional,\n }\n })\n}\n\n// ── Scaffold Generator ──────────────────────────────────────────────────\n\ninterface ScaffoldOptions {\n name: string\n fields: FieldDef[]\n modulesDir: string\n noEntity?: boolean\n noTests?: boolean\n repo?: 'inmemory'\n}\n\nexport async function generateScaffold(options: ScaffoldOptions): Promise<string[]> {\n const { name, fields, modulesDir, noEntity, noTests, repo = 'inmemory' } = options\n const kebab = toKebabCase(name)\n const pascal = toPascalCase(name)\n const camel = toCamelCase(name)\n const plural = pluralize(kebab)\n const pluralPascal = pluralizePascal(pascal)\n const moduleDir = join(modulesDir, plural)\n\n const files: string[] = []\n\n const write = async (relativePath: string, content: string) => {\n const fullPath = join(moduleDir, relativePath)\n await writeFileSafe(fullPath, content)\n files.push(fullPath)\n }\n\n // ── Module Index\n await write('index.ts', genModuleIndex(pascal, kebab, plural, repo))\n\n // ── Constants\n await write('constants.ts', genConstants(pascal, fields))\n\n // ── Controller\n await write(\n `presentation/${kebab}.controller.ts`,\n genController(pascal, kebab, plural, pluralPascal),\n )\n\n // ── DTOs\n await write(`application/dtos/create-${kebab}.dto.ts`, genCreateDTO(pascal, fields))\n await write(`application/dtos/update-${kebab}.dto.ts`, genUpdateDTO(pascal, fields))\n await write(`application/dtos/${kebab}-response.dto.ts`, genResponseDTO(pascal, fields))\n\n // ── Use Cases\n const useCases = genUseCases(pascal, kebab, plural, pluralPascal)\n for (const uc of useCases) {\n await write(`application/use-cases/${uc.file}`, uc.content)\n }\n\n // ── Domain: Repository Interface\n await write(`domain/repositories/${kebab}.repository.ts`, genRepositoryInterface(pascal, kebab))\n\n // ── Domain: Service\n await write(`domain/services/${kebab}-domain.service.ts`, genDomainService(pascal, kebab))\n\n // ── Infrastructure: Repository\n if (repo === 'inmemory') {\n await write(\n `infrastructure/repositories/in-memory-${kebab}.repository.ts`,\n genInMemoryRepository(pascal, kebab, fields),\n )\n }\n\n // ── Entity & Value Objects\n if (!noEntity) {\n await write(`domain/entities/${kebab}.entity.ts`, genEntity(pascal, kebab, fields))\n await write(`domain/value-objects/${kebab}-id.vo.ts`, genValueObject(pascal))\n }\n\n // ── Auto-register in modules index\n await autoRegisterModule(modulesDir, pascal, plural)\n\n return files\n}\n\n// ── Template Generators ─────────────────────────────────────────────────\n\nfunction genCreateDTO(pascal: string, fields: FieldDef[]): string {\n const zodFields = fields\n .map((f) => {\n const base = f.zodType\n return ` ${f.name}: ${base}${f.optional ? '.optional()' : ''},`\n })\n .join('\\n')\n\n return `import { z } from 'zod'\n\nexport const create${pascal}Schema = z.object({\n${zodFields}\n})\n\nexport type Create${pascal}DTO = z.infer<typeof create${pascal}Schema>\n`\n}\n\nfunction genUpdateDTO(pascal: string, fields: FieldDef[]): string {\n const zodFields = fields.map((f) => ` ${f.name}: ${f.zodType}.optional(),`).join('\\n')\n\n return `import { z } from 'zod'\n\nexport const update${pascal}Schema = z.object({\n${zodFields}\n})\n\nexport type Update${pascal}DTO = z.infer<typeof update${pascal}Schema>\n`\n}\n\nfunction genResponseDTO(pascal: string, fields: FieldDef[]): string {\n const tsFields = fields.map((f) => ` ${f.name}${f.optional ? '?' : ''}: ${f.tsType}`).join('\\n')\n\n return `export interface ${pascal}ResponseDTO {\n id: string\n${tsFields}\n createdAt: string\n updatedAt: string\n}\n`\n}\n\nfunction genConstants(pascal: string, fields: FieldDef[]): string {\n const stringFields = fields.filter((f) => f.tsType === 'string').map((f) => `'${f.name}'`)\n const numberFields = fields.filter((f) => f.tsType === 'number').map((f) => `'${f.name}'`)\n const allFieldNames = fields.map((f) => `'${f.name}'`)\n\n const filterable = [...allFieldNames].join(', ')\n const sortable = [...allFieldNames, \"'createdAt'\", \"'updatedAt'\"].join(', ')\n const searchable = stringFields.length > 0 ? stringFields.join(', ') : \"'name'\"\n\n return `import type { ApiQueryParamsConfig } from '@forinda/kickjs-core'\n\nexport const ${pascal.toUpperCase()}_QUERY_CONFIG: ApiQueryParamsConfig = {\n filterable: [${filterable}],\n sortable: [${sortable}],\n searchable: [${searchable}],\n}\n`\n}\n\nfunction genInMemoryRepository(pascal: string, kebab: string, fields: FieldDef[]): string {\n const fieldAssignments = fields.map((f) => ` ${f.name}: dto.${f.name},`).join('\\n')\n const fieldSpread = '...dto'\n\n return `import { randomUUID } from 'node:crypto'\nimport { Repository, HttpException } from '@forinda/kickjs-core'\nimport type { ParsedQuery } from '@forinda/kickjs-http'\nimport type { I${pascal}Repository } from '../../domain/repositories/${kebab}.repository'\nimport type { ${pascal}ResponseDTO } from '../../application/dtos/${kebab}-response.dto'\nimport type { Create${pascal}DTO } from '../../application/dtos/create-${kebab}.dto'\nimport type { Update${pascal}DTO } from '../../application/dtos/update-${kebab}.dto'\n\n@Repository()\nexport class InMemory${pascal}Repository implements I${pascal}Repository {\n private store = new Map<string, ${pascal}ResponseDTO>()\n\n async findById(id: string): Promise<${pascal}ResponseDTO | null> {\n return this.store.get(id) ?? null\n }\n\n async findAll(): Promise<${pascal}ResponseDTO[]> {\n return Array.from(this.store.values())\n }\n\n async findPaginated(parsed: ParsedQuery): Promise<{ data: ${pascal}ResponseDTO[]; total: number }> {\n const all = Array.from(this.store.values())\n const data = all.slice(parsed.pagination.offset, parsed.pagination.offset + parsed.pagination.limit)\n return { data, total: all.length }\n }\n\n async create(dto: Create${pascal}DTO): Promise<${pascal}ResponseDTO> {\n const now = new Date().toISOString()\n const entity: ${pascal}ResponseDTO = {\n id: randomUUID(),\n${fieldAssignments}\n createdAt: now,\n updatedAt: now,\n }\n this.store.set(entity.id, entity)\n return entity\n }\n\n async update(id: string, dto: Update${pascal}DTO): Promise<${pascal}ResponseDTO> {\n const existing = this.store.get(id)\n if (!existing) throw HttpException.notFound('${pascal} not found')\n const updated = { ...existing, ${fieldSpread}, updatedAt: new Date().toISOString() }\n this.store.set(id, updated)\n return updated\n }\n\n async delete(id: string): Promise<void> {\n if (!this.store.has(id)) throw HttpException.notFound('${pascal} not found')\n this.store.delete(id)\n }\n}\n`\n}\n\nfunction genEntity(pascal: string, kebab: string, fields: FieldDef[]): string {\n const propsInterface = fields\n .map((f) => ` ${f.name}${f.optional ? '?' : ''}: ${f.tsType}`)\n .join('\\n')\n const createParams = fields\n .filter((f) => !f.optional)\n .map((f) => `${f.name}: ${f.tsType}`)\n .join('; ')\n const createAssignments = fields\n .filter((f) => !f.optional)\n .map((f) => ` ${f.name}: params.${f.name},`)\n .join('\\n')\n const getters = fields\n .map(\n (f) => ` get ${f.name}(): ${f.tsType}${f.optional ? ' | undefined' : ''} {\n return this.props.${f.name}\n }`,\n )\n .join('\\n')\n const toJsonFields = fields.map((f) => ` ${f.name}: this.props.${f.name},`).join('\\n')\n\n return `import { ${pascal}Id } from '../value-objects/${kebab}-id.vo'\n\ninterface ${pascal}Props {\n id: ${pascal}Id\n${propsInterface}\n createdAt: Date\n updatedAt: Date\n}\n\nexport class ${pascal} {\n private constructor(private props: ${pascal}Props) {}\n\n static create(params: { ${createParams} }): ${pascal} {\n const now = new Date()\n return new ${pascal}({\n id: ${pascal}Id.create(),\n${createAssignments}\n createdAt: now,\n updatedAt: now,\n })\n }\n\n static reconstitute(props: ${pascal}Props): ${pascal} {\n return new ${pascal}(props)\n }\n\n get id(): ${pascal}Id { return this.props.id }\n${getters}\n get createdAt(): Date { return this.props.createdAt }\n get updatedAt(): Date { return this.props.updatedAt }\n\n toJSON() {\n return {\n id: this.props.id.toString(),\n${toJsonFields}\n createdAt: this.props.createdAt.toISOString(),\n updatedAt: this.props.updatedAt.toISOString(),\n }\n }\n}\n`\n}\n\nfunction genValueObject(pascal: string): string {\n return `import { randomUUID } from 'node:crypto'\n\nexport class ${pascal}Id {\n private constructor(private readonly value: string) {}\n\n static create(): ${pascal}Id { return new ${pascal}Id(randomUUID()) }\n\n static from(id: string): ${pascal}Id {\n if (!id || id.trim().length === 0) throw new Error('${pascal}Id cannot be empty')\n return new ${pascal}Id(id)\n }\n\n toString(): string { return this.value }\n equals(other: ${pascal}Id): boolean { return this.value === other.value }\n}\n`\n}\n\n// These reuse the same patterns as the existing module generator\n\nfunction genModuleIndex(pascal: string, kebab: string, plural: string, repo: string): string {\n return `import type { AppModule, AppModuleClass } from '@forinda/kickjs-core'\nimport { ${pascal}Controller } from './presentation/${kebab}.controller'\nimport { ${pascal}DomainService } from './domain/services/${kebab}-domain.service'\nimport { ${pascal.toUpperCase()}_REPOSITORY } from './domain/repositories/${kebab}.repository'\nimport { InMemory${pascal}Repository } from './infrastructure/repositories/in-memory-${kebab}.repository'\n\nexport class ${pascal}Module implements AppModule {\n register(container: any): void {\n container.registerFactory(\n ${pascal.toUpperCase()}_REPOSITORY,\n () => container.resolve(InMemory${pascal}Repository),\n )\n }\n\n routes() {\n return { prefix: '/${plural}', controllers: [${pascal}Controller] }\n }\n}\n`\n}\n\nfunction genController(\n pascal: string,\n kebab: string,\n plural: string,\n pluralPascal: string,\n): string {\n return `import { Controller, Get, Post, Put, Delete, Autowired, ApiQueryParams } from '@forinda/kickjs-core'\nimport type { RequestContext } from '@forinda/kickjs-http'\nimport { ApiTags } from '@forinda/kickjs-swagger'\nimport { Create${pascal}UseCase } from '../application/use-cases/create-${kebab}.use-case'\nimport { Get${pascal}UseCase } from '../application/use-cases/get-${kebab}.use-case'\nimport { List${pluralPascal}UseCase } from '../application/use-cases/list-${plural}.use-case'\nimport { Update${pascal}UseCase } from '../application/use-cases/update-${kebab}.use-case'\nimport { Delete${pascal}UseCase } from '../application/use-cases/delete-${kebab}.use-case'\nimport { create${pascal}Schema } from '../application/dtos/create-${kebab}.dto'\nimport { update${pascal}Schema } from '../application/dtos/update-${kebab}.dto'\nimport { ${pascal.toUpperCase()}_QUERY_CONFIG } from '../constants'\n\n@Controller()\nexport class ${pascal}Controller {\n @Autowired() private create${pascal}UseCase!: Create${pascal}UseCase\n @Autowired() private get${pascal}UseCase!: Get${pascal}UseCase\n @Autowired() private list${pluralPascal}UseCase!: List${pluralPascal}UseCase\n @Autowired() private update${pascal}UseCase!: Update${pascal}UseCase\n @Autowired() private delete${pascal}UseCase!: Delete${pascal}UseCase\n\n @Get('/')\n @ApiTags('${pascal}')\n @ApiQueryParams(${pascal.toUpperCase()}_QUERY_CONFIG)\n async list(ctx: RequestContext) {\n return ctx.paginate(\n (parsed) => this.list${pluralPascal}UseCase.execute(parsed),\n ${pascal.toUpperCase()}_QUERY_CONFIG,\n )\n }\n\n @Get('/:id')\n @ApiTags('${pascal}')\n async getById(ctx: RequestContext) {\n const result = await this.get${pascal}UseCase.execute(ctx.params.id)\n if (!result) return ctx.notFound('${pascal} not found')\n ctx.json(result)\n }\n\n @Post('/', { body: create${pascal}Schema, name: 'Create${pascal}' })\n @ApiTags('${pascal}')\n async create(ctx: RequestContext) {\n const result = await this.create${pascal}UseCase.execute(ctx.body)\n ctx.created(result)\n }\n\n @Put('/:id', { body: update${pascal}Schema, name: 'Update${pascal}' })\n @ApiTags('${pascal}')\n async update(ctx: RequestContext) {\n const result = await this.update${pascal}UseCase.execute(ctx.params.id, ctx.body)\n ctx.json(result)\n }\n\n @Delete('/:id')\n @ApiTags('${pascal}')\n async remove(ctx: RequestContext) {\n await this.delete${pascal}UseCase.execute(ctx.params.id)\n ctx.noContent()\n }\n}\n`\n}\n\nfunction genRepositoryInterface(pascal: string, kebab: string): string {\n return `import type { ${pascal}ResponseDTO } from '../../application/dtos/${kebab}-response.dto'\nimport type { Create${pascal}DTO } from '../../application/dtos/create-${kebab}.dto'\nimport type { Update${pascal}DTO } from '../../application/dtos/update-${kebab}.dto'\nimport type { ParsedQuery } from '@forinda/kickjs-http'\n\nexport interface I${pascal}Repository {\n findById(id: string): Promise<${pascal}ResponseDTO | null>\n findAll(): Promise<${pascal}ResponseDTO[]>\n findPaginated(parsed: ParsedQuery): Promise<{ data: ${pascal}ResponseDTO[]; total: number }>\n create(dto: Create${pascal}DTO): Promise<${pascal}ResponseDTO>\n update(id: string, dto: Update${pascal}DTO): Promise<${pascal}ResponseDTO>\n delete(id: string): Promise<void>\n}\n\nexport const ${pascal.toUpperCase()}_REPOSITORY = Symbol('I${pascal}Repository')\n`\n}\n\nfunction genDomainService(pascal: string, kebab: string): string {\n return `import { Service, Inject, HttpException } from '@forinda/kickjs-core'\nimport { ${pascal.toUpperCase()}_REPOSITORY, type I${pascal}Repository } from '../repositories/${kebab}.repository'\n\n@Service()\nexport class ${pascal}DomainService {\n constructor(\n @Inject(${pascal.toUpperCase()}_REPOSITORY) private readonly repo: I${pascal}Repository,\n ) {}\n\n async ensureExists(id: string): Promise<void> {\n const entity = await this.repo.findById(id)\n if (!entity) throw HttpException.notFound('${pascal} not found')\n }\n}\n`\n}\n\nfunction genUseCases(\n pascal: string,\n kebab: string,\n plural: string,\n pluralPascal: string,\n): Array<{ file: string; content: string }> {\n return [\n {\n file: `create-${kebab}.use-case.ts`,\n content: `import { Service, Inject } from '@forinda/kickjs-core'\nimport { ${pascal.toUpperCase()}_REPOSITORY, type I${pascal}Repository } from '../../domain/repositories/${kebab}.repository'\nimport type { Create${pascal}DTO } from '../dtos/create-${kebab}.dto'\n\n@Service()\nexport class Create${pascal}UseCase {\n constructor(@Inject(${pascal.toUpperCase()}_REPOSITORY) private repo: I${pascal}Repository) {}\n async execute(dto: Create${pascal}DTO) { return this.repo.create(dto) }\n}\n`,\n },\n {\n file: `get-${kebab}.use-case.ts`,\n content: `import { Service, Inject } from '@forinda/kickjs-core'\nimport { ${pascal.toUpperCase()}_REPOSITORY, type I${pascal}Repository } from '../../domain/repositories/${kebab}.repository'\n\n@Service()\nexport class Get${pascal}UseCase {\n constructor(@Inject(${pascal.toUpperCase()}_REPOSITORY) private repo: I${pascal}Repository) {}\n async execute(id: string) { return this.repo.findById(id) }\n}\n`,\n },\n {\n file: `list-${plural}.use-case.ts`,\n content: `import { Service, Inject } from '@forinda/kickjs-core'\nimport type { ParsedQuery } from '@forinda/kickjs-http'\nimport { ${pascal.toUpperCase()}_REPOSITORY, type I${pascal}Repository } from '../../domain/repositories/${kebab}.repository'\n\n@Service()\nexport class List${pluralPascal}UseCase {\n constructor(@Inject(${pascal.toUpperCase()}_REPOSITORY) private repo: I${pascal}Repository) {}\n async execute(parsed: ParsedQuery) { return this.repo.findPaginated(parsed) }\n}\n`,\n },\n {\n file: `update-${kebab}.use-case.ts`,\n content: `import { Service, Inject } from '@forinda/kickjs-core'\nimport { ${pascal.toUpperCase()}_REPOSITORY, type I${pascal}Repository } from '../../domain/repositories/${kebab}.repository'\nimport type { Update${pascal}DTO } from '../dtos/update-${kebab}.dto'\n\n@Service()\nexport class Update${pascal}UseCase {\n constructor(@Inject(${pascal.toUpperCase()}_REPOSITORY) private repo: I${pascal}Repository) {}\n async execute(id: string, dto: Update${pascal}DTO) { return this.repo.update(id, dto) }\n}\n`,\n },\n {\n file: `delete-${kebab}.use-case.ts`,\n content: `import { Service, Inject } from '@forinda/kickjs-core'\nimport { ${pascal.toUpperCase()}_REPOSITORY, type I${pascal}Repository } from '../../domain/repositories/${kebab}.repository'\n\n@Service()\nexport class Delete${pascal}UseCase {\n constructor(@Inject(${pascal.toUpperCase()}_REPOSITORY) private repo: I${pascal}Repository) {}\n async execute(id: string) { return this.repo.delete(id) }\n}\n`,\n },\n ]\n}\n\n// ── Auto-register ───────────────────────────────────────────────────────\n\nasync function autoRegisterModule(\n modulesDir: string,\n pascal: string,\n plural: string,\n): Promise<void> {\n const indexPath = join(modulesDir, 'index.ts')\n const exists = await fileExists(indexPath)\n\n if (!exists) {\n await writeFileSafe(\n indexPath,\n `import type { AppModuleClass } from '@forinda/kickjs-core'\\nimport { ${pascal}Module } from './${plural}'\\n\\nexport const modules: AppModuleClass[] = [${pascal}Module]\\n`,\n )\n return\n }\n\n let content = await readFile(indexPath, 'utf-8')\n const importLine = `import { ${pascal}Module } from './${plural}'`\n\n if (!content.includes(`${pascal}Module`)) {\n const lastImportIdx = content.lastIndexOf('import ')\n if (lastImportIdx !== -1) {\n const lineEnd = content.indexOf('\\n', lastImportIdx)\n content = content.slice(0, lineEnd + 1) + importLine + '\\n' + content.slice(lineEnd + 1)\n } else {\n content = importLine + '\\n' + content\n }\n\n content = content.replace(/(=\\s*\\[)([\\s\\S]*?)(])/, (_match, open, existing, close) => {\n const trimmed = existing.trim()\n if (!trimmed) return `${open}${pascal}Module${close}`\n const needsComma = trimmed.endsWith(',') ? '' : ','\n return `${open}${existing.trimEnd()}${needsComma} ${pascal}Module${close}`\n })\n }\n\n await writeFile(indexPath, content, 'utf-8')\n}\n","import { join, resolve } from 'node:path'\nimport { writeFileSafe } from '../utils/fs'\nimport { toPascalCase, toKebabCase, pluralize } from '../utils/naming'\n\ninterface GenerateTestOptions {\n name: string\n outDir?: string\n moduleName?: string\n modulesDir?: string\n}\n\nexport async function generateTest(options: GenerateTestOptions): Promise<string[]> {\n const { name, moduleName, modulesDir } = options\n const kebab = toKebabCase(name)\n const pascal = toPascalCase(name)\n const files: string[] = []\n\n // Resolve output directory\n let outDir: string\n if (options.outDir) {\n outDir = resolve(options.outDir)\n } else if (moduleName) {\n const modKebab = toKebabCase(moduleName)\n const modPlural = pluralize(modKebab)\n const modDir = modulesDir ?? 'src/modules'\n outDir = resolve(join(modDir, modPlural, '__tests__'))\n } else {\n outDir = resolve('src/__tests__')\n }\n\n const filePath = join(outDir, `${kebab}.test.ts`)\n await writeFileSafe(\n filePath,\n `import { describe, it, expect, beforeEach } from 'vitest'\nimport { Container } from '@forinda/kickjs-core'\n\ndescribe('${pascal}', () => {\n beforeEach(() => {\n Container.reset()\n })\n\n it('should be defined', () => {\n // TODO: Import and test your class/function here\n expect(true).toBe(true)\n })\n\n it('should handle the happy path', async () => {\n // TODO: Set up test data and assertions\n expect(true).toBe(true)\n })\n\n it('should handle edge cases', async () => {\n // TODO: Test error handling, empty inputs, etc.\n expect(true).toBe(true)\n })\n})\n`,\n )\n files.push(filePath)\n\n return files\n}\n","import { readFile, access } from 'node:fs/promises'\nimport { join } from 'node:path'\n\n/** A custom command that developers can register via kick.config.ts */\nexport interface KickCommandDefinition {\n /** The command name (e.g. 'db:migrate', 'seed', 'proto:gen') */\n name: string\n /** Description shown in --help */\n description: string\n /**\n * Shell command(s) to run. Can be a single string or an array of\n * sequential steps. Use {args} as a placeholder for CLI arguments.\n *\n * @example\n * 'npx drizzle-kit migrate'\n * ['npx drizzle-kit generate', 'npx drizzle-kit migrate']\n */\n steps: string | string[]\n /** Optional aliases (e.g. ['migrate'] for 'db:migrate') */\n aliases?: string[]\n}\n\n/** Project pattern — controls what generators produce and which deps are installed */\nexport type ProjectPattern = 'rest' | 'graphql' | 'ddd' | 'cqrs' | 'minimal'\n\n/** Configuration for the kick.config.ts file */\nexport interface KickConfig {\n /**\n * Project pattern — controls default generator behavior.\n * - 'rest' — Express + Swagger (default)\n * - 'graphql' — GraphQL + GraphiQL\n * - 'ddd' — Full DDD modules with use cases, entities, value objects\n * - 'cqrs' — CQRS with commands, queries, events, WebSocket + queue\n * - 'minimal' — Bare Express with no scaffolding\n */\n pattern?: ProjectPattern\n /** Where modules live (default: 'src/modules') */\n modulesDir?: string\n /** Default repository implementation for generators */\n defaultRepo?: 'drizzle' | 'inmemory' | 'prisma'\n /** Drizzle schema output directory */\n schemaDir?: string\n /**\n * Directories to copy to dist/ after build.\n * Useful for EJS templates, email templates, static assets, etc.\n *\n * @example\n * ```ts\n * copyDirs: [\n * 'src/views', // copies to dist/src/views\n * { src: 'src/views', dest: 'dist/views' }, // custom dest\n * 'src/emails',\n * ]\n * ```\n */\n copyDirs?: Array<string | { src: string; dest?: string }>\n /** Custom commands that extend the CLI */\n commands?: KickCommandDefinition[]\n /** Code style overrides (auto-detected from prettier when possible) */\n style?: {\n semicolons?: boolean\n quotes?: 'single' | 'double'\n trailingComma?: 'all' | 'es5' | 'none'\n indent?: number\n }\n}\n\n/** Helper to define a type-safe kick.config.ts */\nexport function defineConfig(config: KickConfig): KickConfig {\n return config\n}\n\nconst CONFIG_FILES = ['kick.config.ts', 'kick.config.js', 'kick.config.mjs', 'kick.config.json']\n\n/** Load kick.config.* from the project root */\nexport async function loadKickConfig(cwd: string): Promise<KickConfig | null> {\n for (const filename of CONFIG_FILES) {\n const filepath = join(cwd, filename)\n try {\n await access(filepath)\n } catch {\n continue\n }\n\n if (filename.endsWith('.json')) {\n const content = await readFile(filepath, 'utf-8')\n return JSON.parse(content)\n }\n\n // For .ts/.js/.mjs — dynamic import (use file URL for cross-platform compat)\n try {\n const { pathToFileURL } = await import('node:url')\n const mod = await import(pathToFileURL(filepath).href)\n return mod.default ?? mod\n } catch (err) {\n if (filename.endsWith('.ts')) {\n console.warn(\n `Warning: Failed to load ${filename}. TypeScript config files require ` +\n 'a runtime loader (e.g. tsx, ts-node) or use kick.config.js/.mjs instead.',\n )\n }\n continue\n }\n }\n return null\n}\n","import { cpSync, existsSync, mkdirSync } from 'node:fs'\nimport { resolve, join } from 'node:path'\nimport type { Command } from 'commander'\nimport { runShellCommand } from '../utils/shell'\nimport { loadKickConfig } from '../config'\n\nexport function registerRunCommands(program: Command): void {\n program\n .command('dev')\n .description('Start development server with Vite HMR (zero-downtime reload)')\n .option('-e, --entry <file>', 'Entry file', 'src/index.ts')\n .option('-p, --port <port>', 'Port number')\n .action((opts: any) => {\n const envVars: string[] = []\n if (opts.port) envVars.push(`PORT=${opts.port}`)\n\n // vite-node --watch gives true HMR via import.meta.hot.accept()\n // The Application.rebuild() swaps the Express handler on the existing\n // http.Server — DB, Redis, Socket.IO connections survive across reloads\n const cmd = `npx vite-node --watch ${opts.entry}`\n const fullCmd = envVars.length ? `${envVars.join(' ')} ${cmd}` : cmd\n\n console.log(`\\n KickJS dev server starting...`)\n console.log(` Entry: ${opts.entry}`)\n console.log(` HMR: enabled (vite-node)\\n`)\n\n try {\n runShellCommand(fullCmd)\n } catch {\n // Process exits on SIGINT — expected\n }\n })\n\n program\n .command('build')\n .description('Build for production via Vite')\n .action(async () => {\n console.log('\\n Building for production...\\n')\n runShellCommand('npx vite build')\n\n // Copy static directories to dist (e.g., templates, public assets)\n const config = await loadKickConfig(process.cwd())\n const copyDirs = config?.copyDirs ?? []\n\n if (copyDirs.length > 0) {\n console.log('\\n Copying directories to dist...')\n for (const entry of copyDirs) {\n const src = typeof entry === 'string' ? entry : entry.src\n const dest =\n typeof entry === 'string' ? join('dist', entry) : (entry.dest ?? join('dist', src))\n const srcPath = resolve(src)\n const destPath = resolve(dest)\n\n if (!existsSync(srcPath)) {\n console.log(` ⚠ Skipped ${src} (not found)`)\n continue\n }\n\n mkdirSync(destPath, { recursive: true })\n cpSync(srcPath, destPath, { recursive: true })\n console.log(` ✓ ${src} → ${dest}`)\n }\n }\n\n console.log('\\n Build complete.\\n')\n })\n\n program\n .command('start')\n .description('Start production server')\n .option('-e, --entry <file>', 'Entry file', 'dist/index.js')\n .option('-p, --port <port>', 'Port number')\n .action((opts: any) => {\n const envVars: string[] = ['NODE_ENV=production']\n if (opts.port) envVars.push(`PORT=${opts.port}`)\n runShellCommand(`${envVars.join(' ')} node ${opts.entry}`)\n })\n\n program\n .command('dev:debug')\n .description('Start dev server with Node.js inspector')\n .option('-e, --entry <file>', 'Entry file', 'src/index.ts')\n .option('-p, --port <port>', 'Port number')\n .action((opts: any) => {\n const envVars = opts.port ? `PORT=${opts.port} ` : ''\n try {\n runShellCommand(`${envVars}npx vite-node --inspect --watch ${opts.entry}`)\n } catch {\n // SIGINT\n }\n })\n}\n","import { execSync } from 'node:child_process'\n\n/** Run a shell command synchronously, printing output */\nexport function runShellCommand(command: string, cwd?: string): void {\n execSync(command, {\n cwd,\n stdio: 'inherit',\n })\n}\n","import { platform, release, arch } from 'node:os'\nimport type { Command } from 'commander'\n\nexport function registerInfoCommand(program: Command): void {\n program\n .command('info')\n .description('Print system and framework info')\n .action(() => {\n console.log(`\n KickJS CLI\n\n System:\n OS: ${platform()} ${release()} (${arch()})\n Node: ${process.version}\n\n Packages:\n @forinda/kickjs-core workspace\n @forinda/kickjs-http workspace\n @forinda/kickjs-config workspace\n @forinda/kickjs-cli workspace\n`)\n })\n}\n","import type { Command } from 'commander'\nimport type { KickConfig, KickCommandDefinition } from '../config'\nimport { runShellCommand } from '../utils/shell'\n\n/**\n * Register custom commands defined in kick.config.ts\n *\n * Developers can extend the CLI with project-specific commands like:\n * kick db:migrate\n * kick db:generate\n * kick seed\n * kick proto:gen\n *\n * @example kick.config.ts\n * ```ts\n * import { defineConfig } from '@forinda/kickjs-cli'\n *\n * export default defineConfig({\n * commands: [\n * {\n * name: 'db:generate',\n * description: 'Generate Drizzle migrations from schema',\n * steps: 'npx drizzle-kit generate',\n * },\n * {\n * name: 'db:migrate',\n * description: 'Run database migrations',\n * steps: 'npx drizzle-kit migrate',\n * },\n * {\n * name: 'db:push',\n * description: 'Push schema directly (dev only)',\n * steps: 'npx drizzle-kit push',\n * },\n * {\n * name: 'db:studio',\n * description: 'Open Drizzle Studio GUI',\n * steps: 'npx drizzle-kit studio',\n * },\n * {\n * name: 'db:seed',\n * description: 'Run seed files',\n * steps: 'npx tsx src/db/seed.ts',\n * },\n * {\n * name: 'proto:gen',\n * description: 'Generate TypeScript from protobuf definitions',\n * steps: [\n * 'npx buf generate',\n * 'echo \"Protobuf types generated\"',\n * ],\n * },\n * ],\n * })\n * ```\n */\nexport function registerCustomCommands(program: Command, config: KickConfig | null): void {\n if (!config?.commands?.length) return\n\n for (const cmd of config.commands) {\n registerSingleCommand(program, cmd)\n }\n}\n\nfunction registerSingleCommand(program: Command, def: KickCommandDefinition): void {\n const command = program.command(def.name).description(def.description)\n\n if (def.aliases) {\n for (const alias of def.aliases) {\n command.alias(alias)\n }\n }\n\n // Accept arbitrary trailing arguments\n command.allowUnknownOption(true)\n command.argument('[args...]', 'Additional arguments passed to the command')\n\n command.action((args: string[]) => {\n const extraArgs = args.join(' ')\n const steps = Array.isArray(def.steps) ? def.steps : [def.steps]\n\n for (const step of steps) {\n // Replace {args} placeholder with CLI arguments\n const finalCmd = extraArgs ? `${step} ${extraArgs}` : step\n console.log(` $ ${finalCmd}`)\n try {\n runShellCommand(finalCmd)\n } catch (err: any) {\n console.error(` Command failed: ${def.name}`)\n process.exitCode = 1\n return\n }\n }\n })\n}\n","import type { Command } from 'commander'\n\n// ── ANSI helpers (no deps) ──────────────────────────────────────────────────\nconst esc = (code: string) => `\\x1b[${code}m`\nconst reset = esc('0')\nconst bold = (s: string) => `${esc('1')}${s}${reset}`\nconst dim = (s: string) => `${esc('2')}${s}${reset}`\nconst green = (s: string) => `${esc('32')}${s}${reset}`\nconst red = (s: string) => `${esc('31')}${s}${reset}`\nconst yellow = (s: string) => `${esc('33')}${s}${reset}`\nconst cyan = (s: string) => `${esc('36')}${s}${reset}`\nconst magenta = (s: string) => `${esc('35')}${s}${reset}`\nconst blue = (s: string) => `${esc('34')}${s}${reset}`\n\nconst METHOD_COLORS: Record<string, (s: string) => string> = {\n GET: green,\n POST: cyan,\n PUT: yellow,\n PATCH: magenta,\n DELETE: red,\n}\n\nfunction colorMethod(method: string): string {\n const fn = METHOD_COLORS[method] ?? dim\n return fn(method.padEnd(7))\n}\n\nfunction formatUptime(seconds: number): string {\n const d = Math.floor(seconds / 86400)\n const h = Math.floor((seconds % 86400) / 3600)\n const m = Math.floor((seconds % 3600) / 60)\n const s = seconds % 60\n const parts: string[] = []\n if (d) parts.push(`${d}d`)\n if (h) parts.push(`${h}h`)\n if (m) parts.push(`${m}m`)\n parts.push(`${s}s`)\n return parts.join(' ')\n}\n\n// ── Fetch helpers ───────────────────────────────────────────────────────────\n\nasync function fetchJson(url: string): Promise<any> {\n const res = await fetch(url, { signal: AbortSignal.timeout(5000) })\n if (!res.ok) throw new Error(`${res.status} ${res.statusText}`)\n return res.json()\n}\n\nasync function fetchEndpoint(base: string, path: string): Promise<any> {\n try {\n return await fetchJson(`${base}${path}`)\n } catch {\n return null\n }\n}\n\ninterface InspectData {\n health: any\n metrics: any\n routes: any\n container: any\n ws: any\n}\n\nasync function fetchAll(base: string): Promise<InspectData> {\n const [health, metrics, routes, container, ws] = await Promise.all([\n fetchEndpoint(base, '/health'),\n fetchEndpoint(base, '/metrics'),\n fetchEndpoint(base, '/routes'),\n fetchEndpoint(base, '/container'),\n fetchEndpoint(base, '/ws'),\n ])\n return { health, metrics, routes, container, ws }\n}\n\n// ── Display ─────────────────────────────────────────────────────────────────\n\nfunction printSummary(base: string, data: InspectData): void {\n const { health, metrics, routes, container, ws } = data\n const line = dim('─'.repeat(60))\n\n console.log()\n console.log(bold(` KickJS Inspector`) + dim(` → ${base}`))\n console.log(line)\n\n // Health\n if (health) {\n const statusText = health.status === 'healthy' ? green('● healthy') : red('● ' + health.status)\n console.log(` ${bold('Health:')} ${statusText}`)\n } else {\n console.log(` ${bold('Health:')} ${red('● unreachable')}`)\n }\n\n // Metrics\n if (metrics) {\n const rate = ((metrics.errorRate ?? 0) * 100).toFixed(1)\n const rateColor = metrics.errorRate > 0.1 ? red : metrics.errorRate > 0 ? yellow : green\n console.log(` ${bold('Uptime:')} ${formatUptime(metrics.uptimeSeconds)}`)\n console.log(` ${bold('Requests:')} ${metrics.requests}`)\n console.log(\n ` ${bold('Errors:')} ${metrics.serverErrors} server, ${metrics.clientErrors ?? 0} client ${dim('(')}${rateColor(rate + '%')}${dim(')')}`,\n )\n }\n\n // Container\n if (container) {\n console.log(` ${bold('DI:')} ${container.count} bindings`)\n }\n\n // WebSocket\n if (ws && ws.enabled) {\n console.log(\n ` ${bold('WS:')} ${ws.connections ?? 0} connections, ${ws.namespaces ?? 0} namespaces`,\n )\n }\n\n // Routes table\n if (routes?.routes?.length) {\n console.log()\n console.log(bold(' Routes'))\n console.log(line)\n console.log(` ${dim('METHOD')} ${dim('PATH'.padEnd(36))} ${dim('CONTROLLER')}`)\n for (const r of routes.routes) {\n const path = r.path.length > 36 ? r.path.slice(0, 33) + '...' : r.path.padEnd(36)\n console.log(` ${colorMethod(r.method)} ${path} ${blue(r.controller)}.${dim(r.handler)}`)\n }\n }\n\n console.log(line)\n console.log()\n}\n\n// ── Command Registration ────────────────────────────────────────────────────\n\nexport function registerInspectCommand(program: Command): void {\n program\n .command('inspect [url]')\n .description('Connect to a running KickJS app and display debug info')\n .option('-p, --port <port>', 'Override port')\n .option('-w, --watch', 'Poll every 5 seconds')\n .option('-j, --json', 'Output raw JSON')\n .action(\n async (url: string | undefined, opts: { port?: string; watch?: boolean; json?: boolean }) => {\n let base = url ?? 'http://localhost:3000'\n\n // Override port if provided\n if (opts.port) {\n try {\n const parsed = new URL(base)\n parsed.port = opts.port\n base = parsed.origin\n } catch {\n base = `http://localhost:${opts.port}`\n }\n }\n\n const debugBase = `${base.replace(/\\/$/, '')}/_debug`\n\n const run = async () => {\n try {\n const data = await fetchAll(debugBase)\n\n if (opts.json) {\n console.log(JSON.stringify(data, null, 2))\n } else {\n printSummary(base, data)\n }\n } catch (err) {\n if (opts.json) {\n console.log(JSON.stringify({ error: String(err) }))\n } else {\n console.error(red(` ✖ Could not connect to ${base}`))\n console.error(dim(` ${err instanceof Error ? err.message : String(err)}`))\n }\n if (!opts.watch) process.exitCode = 1\n }\n }\n\n if (opts.watch) {\n const poll = async () => {\n process.stdout.write('\\x1b[2J\\x1b[H') // clear screen\n await run()\n }\n await poll()\n setInterval(poll, 5000)\n } else {\n await run()\n }\n },\n )\n}\n","import { execSync } from 'node:child_process'\nimport { existsSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport type { Command } from 'commander'\n\n/** Registry of KickJS packages and their required peer dependencies */\nconst PACKAGE_REGISTRY: Record<\n string,\n { pkg: string; peers: string[]; description: string; dev?: boolean }\n> = {\n // Core (already installed by kick new)\n core: {\n pkg: '@forinda/kickjs-core',\n peers: [],\n description: 'DI container, decorators, reactivity',\n },\n http: {\n pkg: '@forinda/kickjs-http',\n peers: ['express'],\n description: 'Express 5, routing, middleware',\n },\n config: { pkg: '@forinda/kickjs-config', peers: [], description: 'Zod-based env validation' },\n cli: {\n pkg: '@forinda/kickjs-cli',\n peers: [],\n description: 'CLI tool and code generators',\n dev: true,\n },\n\n // API\n swagger: {\n pkg: '@forinda/kickjs-swagger',\n peers: [],\n description: 'OpenAPI spec + Swagger UI + ReDoc',\n },\n graphql: {\n pkg: '@forinda/kickjs-graphql',\n peers: ['graphql'],\n description: 'GraphQL resolvers + GraphiQL',\n },\n\n // Database\n drizzle: {\n pkg: '@forinda/kickjs-drizzle',\n peers: ['drizzle-orm'],\n description: 'Drizzle ORM adapter + query builder',\n },\n prisma: {\n pkg: '@forinda/kickjs-prisma',\n peers: ['@prisma/client'],\n description: 'Prisma adapter + query builder',\n },\n\n // Real-time\n ws: {\n pkg: '@forinda/kickjs-ws',\n peers: ['socket.io'],\n description: 'WebSocket with @WsController decorators',\n },\n\n // Observability\n otel: {\n pkg: '@forinda/kickjs-otel',\n peers: ['@opentelemetry/api'],\n description: 'OpenTelemetry tracing + metrics',\n },\n\n // DevTools\n devtools: {\n pkg: '@forinda/kickjs-devtools',\n peers: [],\n description: 'Development dashboard — routes, DI, metrics, health',\n dev: true,\n },\n\n // Auth\n auth: {\n pkg: '@forinda/kickjs-auth',\n peers: ['jsonwebtoken'],\n description: 'Authentication — JWT, API key, and custom strategies',\n },\n\n // Mailer\n mailer: {\n pkg: '@forinda/kickjs-mailer',\n peers: ['nodemailer'],\n description: 'Email sending — SMTP, Resend, SES, or custom provider',\n },\n\n // Cron\n cron: {\n pkg: '@forinda/kickjs-cron',\n peers: ['croner'],\n description: 'Cron job scheduling (production-grade with croner)',\n },\n\n // Queue\n queue: {\n pkg: '@forinda/kickjs-queue',\n peers: [],\n description: 'Queue adapter (BullMQ/RabbitMQ/Kafka)',\n },\n 'queue:bullmq': {\n pkg: '@forinda/kickjs-queue',\n peers: ['bullmq', 'ioredis'],\n description: 'Queue with BullMQ + Redis',\n },\n 'queue:rabbitmq': {\n pkg: '@forinda/kickjs-queue',\n peers: ['amqplib'],\n description: 'Queue with RabbitMQ',\n },\n 'queue:kafka': {\n pkg: '@forinda/kickjs-queue',\n peers: ['kafkajs'],\n description: 'Queue with Kafka',\n },\n\n // Multi-tenancy\n 'multi-tenant': {\n pkg: '@forinda/kickjs-multi-tenant',\n peers: [],\n description: 'Tenant resolution middleware',\n },\n\n // Notifications\n notifications: {\n pkg: '@forinda/kickjs-notifications',\n peers: [],\n description: 'Multi-channel notifications — email, Slack, Discord, webhook',\n },\n\n // Testing\n testing: {\n pkg: '@forinda/kickjs-testing',\n peers: [],\n description: 'Test utilities and TestModule builder',\n dev: true,\n },\n}\n\nfunction detectPackageManager(): string {\n if (existsSync(resolve('pnpm-lock.yaml'))) return 'pnpm'\n if (existsSync(resolve('yarn.lock'))) return 'yarn'\n return 'npm'\n}\n\nexport function printPackageList(): void {\n console.log('\\n Available KickJS packages:\\n')\n const maxName = Math.max(...Object.keys(PACKAGE_REGISTRY).map((k) => k.length))\n for (const [name, info] of Object.entries(PACKAGE_REGISTRY)) {\n const padded = name.padEnd(maxName + 2)\n const peers = info.peers.length ? ` (+ ${info.peers.join(', ')})` : ''\n console.log(` ${padded} ${info.description}${peers}`)\n }\n console.log('\\n Usage: kick add graphql drizzle otel')\n console.log(' kick add queue:bullmq')\n console.log()\n}\n\nexport function registerListCommand(program: Command): void {\n program\n .command('list')\n .alias('ls')\n .description('List all available KickJS packages')\n .action(() => {\n printPackageList()\n })\n}\n\nexport function registerAddCommand(program: Command): void {\n program\n .command('add [packages...]')\n .description('Add KickJS packages with their required dependencies')\n .option('--pm <manager>', 'Package manager override')\n .option('-D, --dev', 'Install as dev dependency')\n .option('--list', 'List all available packages')\n .action(async (packages: string[], opts: any) => {\n // List mode\n if (opts.list || packages.length === 0) {\n printPackageList()\n return\n }\n\n const pm = opts.pm ?? detectPackageManager()\n const forceDevFlag = opts.dev\n const prodDeps = new Set<string>()\n const devDeps = new Set<string>()\n const unknown: string[] = []\n\n for (const name of packages) {\n const entry = PACKAGE_REGISTRY[name]\n if (!entry) {\n unknown.push(name)\n continue\n }\n const target = forceDevFlag || entry.dev ? devDeps : prodDeps\n target.add(entry.pkg)\n for (const peer of entry.peers) {\n target.add(peer)\n }\n }\n\n if (unknown.length > 0) {\n console.log(`\\n Unknown packages: ${unknown.join(', ')}`)\n console.log(' Run \"kick add --list\" to see available packages.\\n')\n if (prodDeps.size === 0 && devDeps.size === 0) return\n }\n\n // Install production dependencies\n if (prodDeps.size > 0) {\n const deps = Array.from(prodDeps)\n const cmd = `${pm} add ${deps.join(' ')}`\n console.log(`\\n Installing ${deps.length} dependency(ies):`)\n for (const dep of deps) console.log(` + ${dep}`)\n console.log()\n try {\n execSync(cmd, { stdio: 'inherit' })\n } catch {\n console.log(`\\n Installation failed. Run manually:\\n ${cmd}\\n`)\n }\n }\n\n // Install dev dependencies\n if (devDeps.size > 0) {\n const deps = Array.from(devDeps)\n const cmd = `${pm} add -D ${deps.join(' ')}`\n console.log(`\\n Installing ${deps.length} dev dependency(ies):`)\n for (const dep of deps) console.log(` + ${dep} (dev)`)\n console.log()\n try {\n execSync(cmd, { stdio: 'inherit' })\n } catch {\n console.log(`\\n Installation failed. Run manually:\\n ${cmd}\\n`)\n }\n }\n\n console.log(' Done!\\n')\n })\n}\n","import { resolve, join } from 'node:path'\nimport { existsSync } from 'node:fs'\nimport { pathToFileURL } from 'node:url'\nimport { fork } from 'node:child_process'\nimport type { Command } from 'commander'\n\nexport function registerTinkerCommand(program: Command): void {\n program\n .command('tinker')\n .description('Interactive REPL with DI container and services loaded')\n .option('-e, --entry <file>', 'Entry file to load', 'src/index.ts')\n .action(async (opts: any) => {\n const cwd = process.cwd()\n const entryPath = resolve(cwd, opts.entry)\n\n if (!existsSync(entryPath)) {\n console.error(`\\n Error: ${opts.entry} not found.\\n`)\n process.exit(1)\n }\n\n // Find tsx for TypeScript + decorator support\n const tsxBin = findBin(cwd, 'tsx')\n if (!tsxBin) {\n console.error('\\n Error: tsx not found. Install it: pnpm add -D tsx\\n')\n process.exit(1)\n }\n\n // Write a temporary tinker script that loads the app and starts REPL\n const tinkerScript = generateTinkerScript(entryPath, opts.entry)\n const tmpFile = join(cwd, '.kick-tinker.mjs')\n\n const { writeFileSync, unlinkSync } = await import('node:fs')\n writeFileSync(tmpFile, tinkerScript, 'utf-8')\n\n try {\n // Run the tinker script under tsx (inherits stdio for interactive REPL)\n const child = fork(tmpFile, [], {\n cwd,\n execPath: tsxBin,\n stdio: 'inherit',\n })\n\n await new Promise<void>((resolve) => {\n child.on('exit', () => resolve())\n })\n } finally {\n // Clean up temp file\n try {\n unlinkSync(tmpFile)\n } catch {\n // ignore\n }\n }\n })\n}\n\nfunction generateTinkerScript(entryPath: string, displayPath: string): string {\n const entryUrl = pathToFileURL(entryPath).href\n\n return `\nimport 'reflect-metadata'\n\n// Prevent bootstrap() from starting the HTTP server\nprocess.env.KICK_TINKER = '1'\n\nconsole.log('\\\\n 🔧 KickJS Tinker')\nconsole.log(' Loading: ${displayPath}\\\\n')\n\n// Load core\nlet Container, Logger, HttpException, HttpStatus\ntry {\n const core = await import('@forinda/kickjs-core')\n Container = core.Container\n Logger = core.Logger\n HttpException = core.HttpException\n HttpStatus = core.HttpStatus\n} catch {\n console.error(' Error: @forinda/kickjs-core not found.')\n console.error(' Install it: pnpm add @forinda/kickjs-core\\\\n')\n process.exit(1)\n}\n\n// Load entry to trigger decorator registration\ntry {\n await import('${entryUrl}')\n} catch (err) {\n console.warn(' Warning: ' + err.message)\n console.warn(' Container may be partially initialized.\\\\n')\n}\n\nconst container = Container.getInstance()\n\n// Start REPL\nconst repl = await import('node:repl')\nconst server = repl.start({ prompt: 'kick> ', useGlobal: true })\n\nserver.context.container = container\nserver.context.Container = Container\nserver.context.resolve = (token) => container.resolve(token)\nserver.context.Logger = Logger\nserver.context.HttpException = HttpException\nserver.context.HttpStatus = HttpStatus\n\nconsole.log(' Available globals:')\nconsole.log(' container — DI container instance')\nconsole.log(' resolve(T) — shorthand for container.resolve(T)')\nconsole.log(' Container, Logger, HttpException, HttpStatus')\nconsole.log()\n\nserver.on('exit', () => {\n console.log('\\\\n Goodbye!\\\\n')\n process.exit(0)\n})\n`\n}\n\nfunction findBin(startDir: string, name: string): string | null {\n let dir = startDir\n while (true) {\n const candidate = join(dir, 'node_modules', '.bin', name)\n if (existsSync(candidate)) return candidate\n const parent = resolve(dir, '..')\n if (parent === dir) break\n dir = parent\n }\n return null\n}\n"],"mappings":"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","names":["Command","readFileSync","dirname","join","fileURLToPath","resolve","basename","createInterface","existsSync","readdirSync","rmSync","join","dirname","execSync","readFileSync","fileURLToPath","writeFile","mkdir","access","readFile","dirname","writeFileSafe","filePath","content","mkdir","dirname","recursive","writeFile","fileExists","filePath","access","__dirname","dirname","fileURLToPath","url","cliPkg","JSON","parse","readFileSync","join","KICKJS_VERSION","version","initProject","options","name","directory","packageManager","template","dir","console","log","baseDeps","express","zod","pino","writeFileSafe","stringify","type","scripts","dev","build","start","test","typecheck","lint","format","dependencies","devDependencies","vite","vitest","typescript","prettier","compilerOptions","target","module","moduleResolution","lib","types","strict","esModuleInterop","skipLibCheck","sourceMap","declaration","experimentalDecorators","emitDecoratorMetadata","outDir","rootDir","paths","include","semi","singleQuote","trailingComma","printWidth","tabWidth","getEntryFile","initGit","execSync","cwd","stdio","installDeps","needsCd","process","genHint","rest","graphql","ddd","cqrs","minimal","ask","question","defaultValue","rl","createInterface","input","process","stdin","output","stdout","suffix","Promise","res","answer","close","trim","choose","options","defaultIdx","console","log","i","length","marker","String","idx","parseInt","confirm","defaultYes","hint","toLowerCase","startsWith","registerInitCommand","program","command","alias","description","option","action","name","opts","directory","resolve","basename","existsSync","entries","readdirSync","force","shown","slice","entry","shouldClear","rmSync","recursive","template","templateMap","packageManager","pm","initGit","git","undefined","installDeps","install","initProject","resolve","join","createInterface","toPascalCase","name","replace","_","c","toUpperCase","toCamelCase","pascal","charAt","toLowerCase","slice","toKebabCase","pluralize","endsWith","test","pluralizePascal","readFile","writeFile","repoMaps","pascal","kebab","repo","repoClassMap","inmemory","drizzle","prisma","repoFileMap","repoClass","repoFile","generateModuleIndex","plural","toUpperCase","generateRestModuleIndex","generateMinimalModuleIndex","generateController","pascal","kebab","plural","pluralPascal","toUpperCase","generateRestController","camel","charAt","toLowerCase","slice","generateConstants","pascal","toUpperCase","generateCreateDTO","pascal","kebab","generateUpdateDTO","generateResponseDTO","generateUseCases","pascal","kebab","plural","pluralPascal","file","content","toUpperCase","generateRepositoryInterface","pascal","kebab","dtoPrefix","toUpperCase","generateInMemoryRepository","repoPrefix","generateDrizzleRepository","generatePrismaRepository","camel","replace","_","c","generateDomainService","pascal","kebab","toUpperCase","generateEntity","generateValueObject","generateControllerTest","pascal","kebab","plural","generateRepositoryTest","repoImport","generateRestService","pascal","kebab","toUpperCase","generateRestConstants","generateCqrsModuleIndex","pascal","kebab","plural","repo","repoClassMap","inmemory","drizzle","prisma","repoFileMap","repoClass","repoFile","toUpperCase","generateCqrsController","pluralPascal","camel","charAt","toLowerCase","slice","generateCqrsCommands","file","content","generateCqrsQueries","generateCqrsEvents","promptUser","question","rl","createInterface","input","process","stdin","output","stdout","Promise","resolve","answer","close","trim","toLowerCase","generateModule","options","name","modulesDir","noEntity","noTests","repo","force","pattern","minimal","kebab","toKebabCase","pascal","toPascalCase","plural","pluralize","pluralPascal","pluralizePascal","moduleDir","join","files","overwriteAll","write","relativePath","content","fullPath","fileExists","console","log","writeFileSafe","push","ctx","generateMinimalFiles","generateRestFiles","generateCqrsFiles","generateDddFiles","autoRegisterModule","generateMinimalModuleIndex","generateRestModuleIndex","generateRestConstants","generateRestController","generateRestService","generateCreateDTO","generateUpdateDTO","generateResponseDTO","generateRepositoryInterface","repoFileMap","inmemory","drizzle","prisma","repoGeneratorMap","generateInMemoryRepository","generateDrizzleRepository","generatePrismaRepository","generateControllerTest","generateRepositoryTest","generateCqrsModuleIndex","generateCqrsController","commands","generateCqrsCommands","cmd","file","queries","generateCqrsQueries","q","events","generateCqrsEvents","e","generateModuleIndex","generateConstants","generateController","useCases","generateUseCases","uc","generateDomainService","generateEntity","generateValueObject","indexPath","exists","readFile","importLine","includes","lastImportIdx","lastIndexOf","lineEnd","indexOf","slice","replace","_match","open","existing","trimmed","needsComma","endsWith","trimEnd","writeFile","join","generateAdapter","options","name","outDir","kebab","toKebabCase","pascal","toPascalCase","files","filePath","join","writeFileSafe","push","join","resolve","join","DDD_FOLDER_MAP","controller","service","dto","guard","middleware","FLAT_FOLDER_MAP","CQRS_FOLDER_MAP","command","query","event","resolveOutDir","options","type","outDir","moduleName","modulesDir","defaultDir","pattern","resolve","folderMap","kebab","toKebabCase","plural","pluralize","subfolder","base","join","generateMiddleware","options","name","moduleName","modulesDir","pattern","outDir","resolveOutDir","type","defaultDir","kebab","toKebabCase","camel","toCamelCase","files","filePath","join","writeFileSafe","toPascalCase","push","join","generateGuard","options","name","moduleName","modulesDir","pattern","outDir","resolveOutDir","type","defaultDir","kebab","toKebabCase","camel","toCamelCase","pascal","toPascalCase","files","filePath","join","writeFileSafe","push","join","generateService","options","name","moduleName","modulesDir","pattern","outDir","resolveOutDir","type","defaultDir","kebab","toKebabCase","pascal","toPascalCase","files","filePath","join","writeFileSafe","push","join","generateController","options","name","moduleName","modulesDir","pattern","outDir","resolveOutDir","type","defaultDir","kebab","toKebabCase","pascal","toPascalCase","files","filePath","join","writeFileSafe","push","join","generateDto","options","name","moduleName","modulesDir","pattern","outDir","resolveOutDir","type","defaultDir","kebab","toKebabCase","pascal","toPascalCase","camel","toCamelCase","files","filePath","join","writeFileSafe","push","join","existsSync","createInterface","confirm","message","rl","createInterface","input","process","stdin","output","stdout","Promise","resolve","question","answer","close","trim","toLowerCase","generateConfig","options","filePath","join","outDir","modulesDir","defaultRepo","existsSync","force","overwrite","console","log","writeFileSafe","join","generateResolver","options","name","outDir","pascal","toPascalCase","kebab","toKebabCase","camel","toCamelCase","files","write","relativePath","content","fullPath","join","writeFileSafe","push","join","generateJob","options","name","outDir","pascal","toPascalCase","kebab","toKebabCase","camel","toCamelCase","queueName","queue","files","write","relativePath","content","fullPath","join","writeFileSafe","push","join","readFile","writeFile","TYPE_MAP","string","ts","zod","text","number","int","float","boolean","date","email","url","uuid","json","parseFields","raw","map","f","colonIdx","indexOf","Error","namePart","slice","typePart","optional","endsWith","cleanType","startsWith","values","split","name","type","tsType","v","join","zodType","mapped","validTypes","Object","keys","generateScaffold","options","fields","modulesDir","noEntity","noTests","repo","kebab","toKebabCase","pascal","toPascalCase","camel","toCamelCase","plural","pluralize","pluralPascal","pluralizePascal","moduleDir","files","write","relativePath","content","fullPath","writeFileSafe","push","genModuleIndex","genConstants","genController","genCreateDTO","genUpdateDTO","genResponseDTO","useCases","genUseCases","uc","file","genRepositoryInterface","genDomainService","genInMemoryRepository","genEntity","genValueObject","autoRegisterModule","zodFields","base","tsFields","stringFields","filter","numberFields","allFieldNames","filterable","sortable","searchable","length","toUpperCase","fieldAssignments","fieldSpread","propsInterface","createParams","createAssignments","getters","toJsonFields","indexPath","exists","fileExists","readFile","importLine","includes","lastImportIdx","lastIndexOf","lineEnd","replace","_match","open","existing","close","trimmed","trim","needsComma","trimEnd","writeFile","join","resolve","generateTest","options","name","moduleName","modulesDir","kebab","toKebabCase","pascal","toPascalCase","files","outDir","resolve","modKebab","modPlural","pluralize","modDir","join","filePath","writeFileSafe","push","readFile","access","join","CONFIG_FILES","loadKickConfig","cwd","filename","filepath","join","access","endsWith","content","readFile","JSON","parse","pathToFileURL","mod","href","default","err","console","warn","printGenerated","files","cwd","process","console","log","length","f","replace","GENERATORS","name","description","printGeneratorList","maxName","Math","max","map","g","padEnd","registerGenerateCommand","program","gen","command","alias","option","action","opts","list","help","config","loadKickConfig","modulesDir","repo","defaultRepo","pattern","generateModule","resolve","noEntity","entity","noTests","tests","minimal","force","generateAdapter","outDir","out","generateMiddleware","moduleName","module","generateGuard","generateService","generateController","generateDto","generateTest","generateResolver","generateJob","queue","rawFields","error","exit","fields","parseFields","generateScaffold","type","optional","generateConfig","cpSync","existsSync","mkdirSync","resolve","join","execSync","runShellCommand","command","cwd","execSync","stdio","registerRunCommands","program","command","description","option","action","opts","envVars","port","push","cmd","entry","fullCmd","length","join","console","log","runShellCommand","config","loadKickConfig","process","cwd","copyDirs","src","dest","srcPath","resolve","destPath","existsSync","mkdirSync","recursive","cpSync","platform","release","arch","registerInfoCommand","program","command","description","action","console","log","platform","release","arch","process","version","registerCustomCommands","program","config","commands","length","cmd","registerSingleCommand","def","command","name","description","aliases","alias","allowUnknownOption","argument","action","args","extraArgs","join","steps","Array","isArray","step","finalCmd","console","log","runShellCommand","err","error","process","exitCode","esc","code","reset","bold","s","dim","green","red","yellow","cyan","magenta","blue","METHOD_COLORS","GET","POST","PUT","PATCH","DELETE","colorMethod","method","fn","padEnd","formatUptime","seconds","d","Math","floor","h","m","parts","push","join","fetchJson","url","res","fetch","signal","AbortSignal","timeout","ok","Error","status","statusText","json","fetchEndpoint","base","path","fetchAll","health","metrics","routes","container","ws","Promise","all","printSummary","data","line","repeat","console","log","rate","errorRate","toFixed","rateColor","uptimeSeconds","requests","serverErrors","clientErrors","count","enabled","connections","namespaces","length","r","slice","controller","handler","registerInspectCommand","program","command","description","option","action","opts","port","parsed","URL","origin","debugBase","replace","run","JSON","stringify","err","error","String","message","watch","process","exitCode","poll","stdout","write","setInterval","execSync","existsSync","resolve","PACKAGE_REGISTRY","core","pkg","peers","description","http","config","cli","dev","swagger","graphql","drizzle","prisma","ws","otel","devtools","auth","mailer","cron","queue","notifications","testing","detectPackageManager","existsSync","resolve","printPackageList","console","log","maxName","Math","max","Object","keys","map","k","length","name","info","entries","padded","padEnd","join","registerListCommand","program","command","alias","action","registerAddCommand","option","packages","opts","list","pm","forceDevFlag","prodDeps","Set","devDeps","unknown","entry","push","target","add","peer","size","deps","Array","from","cmd","dep","execSync","stdio","resolve","join","existsSync","pathToFileURL","fork","registerTinkerCommand","program","command","description","option","action","opts","cwd","process","entryPath","resolve","entry","existsSync","console","error","exit","tsxBin","findBin","tinkerScript","generateTinkerScript","tmpFile","join","writeFileSync","unlinkSync","child","fork","execPath","stdio","Promise","on","displayPath","entryUrl","pathToFileURL","href","startDir","name","dir","candidate","parent","__dirname","dirname","fileURLToPath","url","pkg","JSON","parse","readFileSync","join","main","program","Command","name","description","version","config","loadKickConfig","process","cwd","registerInitCommand","registerGenerateCommand","registerRunCommands","registerInfoCommand","registerInspectCommand","registerAddCommand","registerListCommand","registerTinkerCommand","registerCustomCommands","showHelpAfterError","parseAsync","argv","catch","err","console","error","Error","message","exitCode"]}
|