@igniter-js/cli 0.4.6 → 0.4.7

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.
Files changed (39) hide show
  1. package/dist/index.mjs +6 -6
  2. package/dist/index.mjs.map +1 -1
  3. package/package.json +2 -2
  4. package/dist/templates/templates/add-ons/auth/better-auth/auth.hbs +0 -37
  5. package/dist/templates/templates/add-ons/bots/nextjs/route-handler.hbs +0 -10
  6. package/dist/templates/templates/add-ons/bots/sample-bot.hbs +0 -26
  7. package/dist/templates/templates/add-ons/bots/tanstack-start/route-handler.hbs +0 -15
  8. package/dist/templates/templates/add-ons/database/prisma/lib.hbs +0 -11
  9. package/dist/templates/templates/add-ons/database/prisma/prisma.config.hbs +0 -13
  10. package/dist/templates/templates/add-ons/database/prisma/schema.hbs +0 -15
  11. package/dist/templates/templates/add-ons/jobs/jobs.ts.hbs +0 -32
  12. package/dist/templates/templates/add-ons/jobs/redis.ts.hbs +0 -13
  13. package/dist/templates/templates/add-ons/jobs/store.ts.hbs +0 -12
  14. package/dist/templates/templates/add-ons/logging/logger.ts.hbs +0 -14
  15. package/dist/templates/templates/add-ons/mcp/mcp.ts.hbs +0 -21
  16. package/dist/templates/templates/add-ons/mcp/nextjs/route-handler.hbs +0 -11
  17. package/dist/templates/templates/add-ons/mcp/tanstack-start/route-handler.hbs +0 -19
  18. package/dist/templates/templates/add-ons/store/redis.ts.hbs +0 -13
  19. package/dist/templates/templates/add-ons/store/store.ts.hbs +0 -12
  20. package/dist/templates/templates/add-ons/telemetry/telemetry.ts.hbs +0 -20
  21. package/dist/templates/templates/generate/feature/empty.controller.hbs +0 -20
  22. package/dist/templates/templates/generate/feature/empty.interfaces.hbs +0 -5
  23. package/dist/templates/templates/generate/feature/procedure.hbs +0 -23
  24. package/dist/templates/templates/generate/feature/schema.controller.hbs +0 -73
  25. package/dist/templates/templates/generate/feature/schema.interfaces.hbs +0 -23
  26. package/dist/templates/templates/generate/feature/schema.procedure.hbs +0 -23
  27. package/dist/templates/templates/scaffold/example-feature/example.controller.hbs +0 -23
  28. package/dist/templates/templates/scaffold/example-feature/example.interfaces.hbs +0 -14
  29. package/dist/templates/templates/scaffold/example-feature/example.procedure.hbs +0 -28
  30. package/dist/templates/templates/scaffold/igniter.schema.hbs +0 -21
  31. package/dist/templates/templates/starters/igniter.client.hbs +0 -52
  32. package/dist/templates/templates/starters/igniter.context.hbs +0 -10
  33. package/dist/templates/templates/starters/igniter.hbs +0 -43
  34. package/dist/templates/templates/starters/igniter.router.hbs +0 -14
  35. package/dist/templates/templates/starters/nextjs/route-handler.hbs +0 -8
  36. package/dist/templates/templates/starters/nextjs/tsconfig.hbs +0 -35
  37. package/dist/templates/templates/starters/open-api.hbs +0 -45
  38. package/dist/templates/templates/starters/tanstack-start/route-handler.hbs +0 -13
  39. package/dist/templates/templates/starters/tanstack-start/tsconfig.hbs +0 -15
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/commands/init/index.ts","../src/commands/init/action.ts","../src/commands/init/prompts.ts","../src/core/package-manager.ts","../src/core/registry/starters/starter-registry.ts","../src/registry/starters/nextjs-starter.ts","../src/core/registry/starters/base-starter.ts","../src/core/handlebars-helpers.ts","../src/core/terminal.ts","../src/registry/starters/express-starter.ts","../src/registry/starters/deno-starter.ts","../src/registry/starters/bun-api-starter.ts","../src/registry/starters/bun-react-starter.ts","../src/registry/starters/tanstack-start-starter.ts","../src/registry/starters/index.ts","../src/core/registry/add-ons/add-on-registry.ts","../src/registry/add-ons/store.ts","../src/core/registry/add-ons/base-addon.ts","../src/registry/add-ons/jobs.ts","../src/registry/add-ons/mcp.ts","../src/registry/add-ons/logging.ts","../src/registry/add-ons/telemetry.ts","../src/registry/add-ons/bots.ts","../src/registry/add-ons/database.ts","../src/registry/add-ons/auth.ts","../src/registry/add-ons/shadcn.ts","../src/registry/add-ons/index.ts","../src/core/file-system.ts","../src/core/framework.ts","../src/core/logger.ts","../src/commands/init/generator.ts","../src/commands/generate/index.ts","../src/commands/generate/feature/index.ts","../src/commands/generate/feature/action.ts","../src/core/template-engine.ts","../src/commands/generate/feature/feature.ts","../src/commands/generate/feature/prompts.ts","../src/core/registry/schema-provider/schema-provider-registry.ts","../src/registry/schema-provider/prisma.ts","../src/core/registry/schema-provider/base-schema-provider.ts","../src/utils/casing.ts","../src/registry/schema-provider/index.ts","../src/commands/generate/docs/index.ts","../src/core/openapi.ts","../src/core/router-instrospector.ts","../src/commands/generate/docs/action.ts","../src/commands/generate/schema/index.ts","../src/commands/generate/schema/action.ts","../src/commands/generate/controller/index.ts","../src/commands/generate/controller/action.ts","../src/utils/try-catch.ts","../src/commands/generate/procedure/index.ts","../src/commands/generate/procedure/action.ts","../src/commands/dev/index.ts","../src/commands/dev/action.ts","../src/commands/dev/components/DevUI.tsx"],"sourcesContent":["import { Command } from 'commander';\nimport { initCommand } from './commands/init';\nimport { generateCommand } from './commands/generate';\nimport { devCommand } from './commands/dev';\n\nconst program = new Command();\n\nprogram\n .name(\"igniter\")\n .description(\"The next-generation command-line interface for Igniter.js\")\n .version(\"0.0.1\");\n\nprogram.addCommand(initCommand);\nprogram.addCommand(generateCommand);\nprogram.addCommand(devCommand);\n\nprogram.parse(process.argv);\n","import { Command } from \"commander\";\nimport { handleInitAction } from \"./action\";\n\nexport const initCommand = new Command()\n .command(\"init\")\n .description(\"Create a new Igniter.js project with interactive setup\")\n .argument(\"[project-name]\", \"Name of the project directory\")\n .option(\"--mode <mode>\", \"Mode to use (install, new-project)\", \"new-project\")\n .option(\n \"--pm, --package-manager <manager>\",\n \"Package manager to use (npm, yarn, pnpm, bun)\",\n )\n .option(\n \"--template <template>\",\n \"Use a specific template (e.g., starter-nextjs, starter-express-rest-api)\",\n )\n .option(\n \"--add-ons <add-ons>\",\n \"Comma-separated list of add-ons (store,jobs,mcp,logging,telemetry)\",\n )\n .option(\n \"--database <database>\",\n \"Database provider (none, postgresql, mysql, sqlite)\",\n )\n .option(\"--no-git\", \"Skip git repository initialization\")\n .option(\"--no-install\", \"Skip automatic dependency installation\")\n .option(\"--no-docker\", \"Skip Docker Compose setup\")\n .action(handleInitAction);\n","import * as p from \"@clack/prompts\";\nimport * as path from \"path\";\nimport { runInitPrompts } from \"./prompts\";\nimport { ProjectGenerator } from \"./generator\";\n\nexport interface InitPromptsOptions {\n projectName?: string;\n useCurrentDir?: boolean;\n mode?: \"install\" | \"new-project\";\n packageManager?: string;\n starter?: string;\n addOns?: string[];\n git?: boolean;\n install?: boolean;\n}\n\nexport async function handleInitAction(\n projectName: string,\n options: InitPromptsOptions,\n) {\n try {\n p.intro(\"Welcome to Igniter.js!\");\n\n options.projectName = projectName;\n\n const config = await runInitPrompts({\n projectName: options.projectName,\n mode: options.mode,\n useCurrentDir: options.useCurrentDir,\n packageManager: options.packageManager,\n starter: options.starter,\n addOns: options.addOns,\n git: options.git,\n install: options.install,\n });\n\n const targetDir = path.resolve(config.projectName);\n\n const generator = new ProjectGenerator(config, targetDir);\n await generator.generate();\n\n p.log.success(\"Project initialized successfully!\");\n } catch (error) {\n p.log.error(\"Project initialization failed\");\n p.log.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n","import * as p from \"@clack/prompts\";\nimport * as path from \"path\";\nimport { detectPackageManager } from \"@/core/package-manager\";\nimport { ProjectSetupConfig } from \"@/commands/init/types\";\nimport { starterRegistry } from \"@/registry/starters\";\nimport { addOnRegistry } from \"@/registry/add-ons\";\nimport type { InitPromptsOptions } from \"./action\";\nimport { isPathEmpty } from \"@/core/file-system\";\nimport { detectFramework } from \"@/core/framework\";\nimport type { AddOnOption } from \"@/registry/types\";\n\nasync function processAddOnOptions(\n options: AddOnOption[],\n): Promise<Record<string, string[] | string | undefined>> {\n const selectedOptions: Record<string, string[] | string | undefined> = {};\n\n for (const option of options) {\n let selectedValues: string[] | string | undefined = undefined;\n\n if (option.multiple) {\n const values = await p.multiselect({\n message: option.message,\n options: option.choices.map((choice: any) => ({\n value: choice.value,\n label: choice.label,\n hint: choice.hint,\n })),\n });\n selectedValues = values as unknown as string[];\n } else {\n const value = await p.select({\n message: option.message,\n options: option.choices.map((choice) => ({\n value: choice.value,\n label: choice.label,\n hint: choice.hint,\n })),\n });\n selectedValues = value as string | undefined;\n }\n\n selectedOptions[option.key] = selectedValues;\n\n // Process sub-options if they exist for the selected choice(s)\n const valuesToProcess = Array.isArray(selectedValues)\n ? selectedValues\n : selectedValues\n ? [selectedValues]\n : [];\n\n for (const value of valuesToProcess) {\n const choice = option.choices.find((c) => c.value === value);\n if (choice?.subOptions && choice.subOptions.length > 0) {\n const subOptionsResult = await processAddOnOptions(choice.subOptions);\n Object.assign(selectedOptions, subOptionsResult);\n }\n }\n }\n\n return selectedOptions;\n}\n\nexport async function runInitPrompts(\n options: InitPromptsOptions,\n): Promise<ProjectSetupConfig> {\n const detectedPackageManager = detectPackageManager();\n\n const config = await p.group(\n {\n useCurrentDir: async () => {\n if (options.projectName) return false;\n return p.confirm({\n message: `Do you want to use current folder as a project directory?`,\n initialValue: false,\n });\n },\n projectName: async ({ results }) => {\n if (options.projectName) return options.projectName;\n if (results.useCurrentDir) return path.basename(process.cwd());\n const projectName = await p.text({\n message: \"What will your project be called?\",\n validate: (value) => {\n if (!value.trim()) return \"Project name is required\";\n if (!/^[a-z0-9-_]+$/i.test(value.trim())) {\n return \"Project name can only contain letters, numbers, hyphens, and underscores\";\n }\n return;\n },\n });\n return projectName as string;\n },\n mode: async ({ results }) => {\n const projectName = results.projectName as string;\n\n const targetDir = path.resolve(projectName);\n const isEmpty = await isPathEmpty(targetDir);\n\n if (!isEmpty) {\n return await p.select({\n message: `Directory '${projectName}' is not empty. Do you want to overwrite with starter ou just install Igniter.js?`,\n options: [\n { value: \"new-project\", label: \"Overwrite and select a starter\" },\n { value: \"install\", label: \"Just install Igniter.js\" },\n ],\n });\n }\n\n return \"new-project\";\n },\n starter: async ({ results }) => {\n if (results.mode !== \"new-project\") {\n const targetDir = path.resolve(results.projectName as string);\n const framework = detectFramework(targetDir);\n if (framework === \"nextjs\") {\n return \"nextjs\";\n } else if (framework === \"tanstack-start\") {\n return \"tanstack-start\";\n } else {\n return \"generic\";\n }\n }\n\n return await p.select({\n message: \"Which starter would you like to use?\",\n options: starterRegistry.getAll().map((s) => ({\n value: s.id,\n label: s.name,\n hint: s.hint,\n })),\n });\n },\n addOns: async () => {\n const addOnResult = await p.multiselect({\n message: \"What add-ons would you like for your project?\",\n options: addOnRegistry.getAll().map((f) => ({\n value: f.value,\n label: f.name,\n hint: f.hint,\n })),\n });\n\n return addOnResult as unknown as string[];\n },\n addOnOptions: async ({ results }) => {\n const addOnOptions: Record<\n string,\n Record<string, string[] | string | undefined>\n > = {};\n for (const addOnValue of results.addOns || []) {\n const addOn = addOnRegistry.get(addOnValue);\n if (addOn?.options && addOn.options.length > 0) {\n addOnOptions[addOnValue] = await processAddOnOptions(addOn.options);\n }\n }\n return addOnOptions;\n },\n packageManager: () =>\n p.select({\n message: \"Which package manager?\",\n initialValue: detectedPackageManager,\n options: [\n { value: \"npm\", label: \"npm\" },\n { value: \"yarn\", label: \"yarn\" },\n { value: \"pnpm\", label: \"pnpm\" },\n { value: \"bun\", label: \"bun\" },\n ],\n }),\n initDocker: ({ results }) => {\n const hasAnyAddOn = results.addOns && results.addOns.length > 0;\n\n if (!hasAnyAddOn) return;\n return p.confirm({\n message: \"Setup Docker services for development?\",\n initialValue: true,\n });\n },\n initGit: () =>\n p.confirm({\n message: \"Initialize Git repository?\",\n initialValue: true,\n }),\n installDependencies: () =>\n p.confirm({\n message: \"Install dependencies automatically?\",\n initialValue: true,\n }),\n },\n {\n onCancel: () => {\n p.cancel(\"Operation cancelled.\");\n process.exit(0);\n },\n },\n );\n\n return {\n projectName: config.projectName,\n mode: config.mode,\n starter: config.starter,\n packageManager: config.packageManager,\n initGit: config.initGit,\n addOns: config.addOns,\n addOnOptions: config.addOnOptions,\n initDocker: config.initDocker,\n installDependencies: config.installDependencies,\n } as ProjectSetupConfig;\n}\n","import { PackageManager } from \"../commands/init/types\";\n\nexport function getInstallCommand(pm: PackageManager): { command: string; args: string[] } {\n switch (pm) {\n case 'yarn':\n return { command: 'yarn', args: ['install'] };\n case 'pnpm':\n return { command: 'pnpm', args: ['install'] };\n case 'bun':\n return { command: 'bun', args: ['install'] };\n default:\n return { command: 'npm', args: ['install'] };\n }\n}\n\nexport function detectPackageManager(): PackageManager {\n const userAgent = process.env.npm_config_user_agent;\n if (userAgent) {\n if (userAgent.startsWith('yarn')) return 'yarn';\n if (userAgent.startsWith('pnpm')) return 'pnpm';\n if (userAgent.startsWith('bun')) return 'bun';\n }\n return 'npm';\n}\n\nexport function getPackageManagerCommand(pm: PackageManager, command?: string): string {\n switch (pm) {\n case 'npm':\n return command ? `npx ${command}` : 'npx';\n case 'pnpm':\n return command ? `pnpx ${command}` : 'pnpx';\n case 'bun':\n return command ? `bunx ${command}` : 'bunx';\n case 'yarn':\n return command ? `yarn dlx ${command}` : 'yarn dlx';\n default:\n return command ? `npx ${command}` : 'npx';\n }\n}\n","import { BaseStarter } from './base-starter';\n\nexport class StarterRegistry {\n private starters = new Map<string, BaseStarter>();\n \n static create() {\n return new StarterRegistry();\n }\n\n register(starter: BaseStarter) {\n this.starters.set(starter.id, starter);\n return this;\n }\n\n build() {\n return {\n get: (value: string): BaseStarter | undefined => {\n return this.starters.get(value);\n },\n getMany: (values: string[]): BaseStarter[] => {\n return values.map(value => this.starters.get(value)).filter(Boolean) as BaseStarter[];\n },\n getAll: (): BaseStarter[] => {\n return Array.from(this.starters.values());\n }\n }\n }\n}\n","import path from 'path';\nimport { BaseStarter } from '../../core/registry/starters/base-starter';\nimport type { ProjectSetupConfig } from '@/commands/init/types';\nimport { getPackageManagerCommand } from '@/core/package-manager';\nimport { runCommand } from '@/core/terminal';\n\nexport class NextJsStarter extends BaseStarter {\n id = 'nextjs';\n name = 'Next.js';\n description = 'A full-stack starter with Next.js';\n hint = 'Fullstack';\n repository = 'starter-nextjs';\n templates = [\n {\n template: path.resolve(process.cwd(), 'templates/starters/nextjs/route-handler.hbs'),\n outputPath: 'src/app/api/v1/[[...all]]/route.ts',\n },\n {\n template: path.resolve(process.cwd(), 'templates/starters/igniter.router.hbs'),\n outputPath: 'src/igniter.router.ts',\n },\n {\n template: path.resolve(process.cwd(), 'templates/starters/igniter.client.hbs'),\n outputPath: 'src/igniter.client.ts',\n },\n {\n template: path.resolve(process.cwd(), 'templates/starters/igniter.context.hbs'),\n outputPath: 'src/igniter.context.ts',\n },\n {\n template: path.resolve(process.cwd(), 'templates/starters/igniter.hbs'),\n outputPath: 'src/igniter.ts',\n },\n {\n template: path.resolve(process.cwd(), 'templates/scaffold/example-feature/example.controller.hbs'),\n outputPath: 'src/features/example/controllers/example.controller.ts',\n },\n {\n template: path.resolve(process.cwd(), 'templates/scaffold/example-feature/example.procedure.hbs'),\n outputPath: 'src/features/example/procedures/example.procedure.ts',\n },\n {\n template: path.resolve(process.cwd(), 'templates/scaffold/example-feature/example.interfaces.hbs'),\n outputPath: 'src/features/example/example.interfaces.ts',\n },\n {\n template: path.resolve(process.cwd(), 'templates/starters/nextjs/tsconfig.hbs'),\n outputPath: 'tsconfig.json',\n },\n {\n template: path.resolve(process.cwd(), 'templates/starters/open-api.hbs'),\n outputPath: 'src/docs/openapi.json',\n },\n ];\n dependencies = [\n { name: '@igniter-js/core', version: 'latest', type: 'dependency' },\n ];\n envVars = [\n { key: 'IGNITER_APP_NAME', value: 'Igniter App', description: 'Application name' },\n { key: 'IGNITER_APP_SECRET', value: 'my-secret-key', description: 'Application secret' },\n { key: 'IGNITER_API_URL', value: 'http://localhost:3000/', description: 'API URL' },\n { key: 'IGNITER_API_BASE_PATH', value: '/api/v1', description: 'API base path' },\n { key: 'NEXT_PUBLIC_IGNITER_API_URL', value: 'http://localhost:3000/', description: 'API URL' },\n { key: 'NEXT_PUBLIC_IGNITER_API_BASE_PATH', value: '/api/v1', description: 'API base path' },\n ];\n public async install(targetDir: string, options: ProjectSetupConfig): Promise<void> {\n let command = ''\n const baseOptions = `--typescript --eslint --tailwind --app-router --turbopack --src-dir --no-linter --use-${options.packageManager} --skip-install --disable-git --yes`;\n\n if(options.packageManager === 'npm') {\n command = `npx create-next-app@latest ${options.projectName} ${baseOptions}`;\n } else if(options.packageManager === 'yarn') {\n command = `yarn create next-app@latest ${options.projectName} ${baseOptions}`;\n } else if(options.packageManager === 'pnpm') {\n command = `pnpm create next-app@latest ${options.projectName} ${baseOptions}`;\n } else if(options.packageManager === 'bun') {\n command = `bun create next-app@latest ${options.projectName} ${baseOptions}`;\n }\n\n await runCommand(`${command}`);\n\n options.mode = 'install';\n return super.install(targetDir, options);\n }\n}\n","import * as path from \"path\";\nimport * as fs from \"fs/promises\";\nimport { execa } from \"execa\";\nimport { existsSync } from 'fs';\nimport type { RegistryAssetDependency, RegistryAssetEnvVar, RegistryAssetTemplate } from \"@/registry/types\";\nimport { readFile, writeFile } from 'fs/promises';\nimport { join } from 'path';\nimport * as handlebars from 'handlebars';\nimport { registerHandlebarsHelpers } from '../../handlebars-helpers';\nimport type { ProjectSetupConfig } from \"@/commands/init/types\";\n\nexport abstract class BaseStarter {\n abstract id: string;\n abstract name: string;\n abstract description: string;\n abstract hint: string;\n abstract repository: string;\n public templates: RegistryAssetTemplate[] = [\n {\n template: path.resolve(process.cwd(), 'templates/starters/igniter.router.hbs'),\n outputPath: 'src/igniter.router.ts',\n },\n {\n template: path.resolve(process.cwd(), 'templates/starters/igniter.client.hbs'),\n outputPath: 'src/igniter.client.ts',\n },\n {\n template: path.resolve(process.cwd(), 'templates/starters/igniter.context.hbs'),\n outputPath: 'src/igniter.context.ts',\n },\n {\n template: path.resolve(process.cwd(), 'templates/starters/igniter.hbs'),\n outputPath: 'src/igniter.ts',\n },\n {\n template: path.resolve(process.cwd(), 'templates/scaffold/example-feature/example.controller.hbs'),\n outputPath: 'src/features/example/controllers/example.controller.ts',\n },\n {\n template: path.resolve(process.cwd(), 'templates/scaffold/example-feature/example.procedure.hbs'),\n outputPath: 'src/features/example/procedures/example.procedure.ts',\n },\n {\n template: path.resolve(process.cwd(), 'templates/scaffold/example-feature/example.interfaces.hbs'),\n outputPath: 'src/features/example/example.interfaces.ts',\n },\n {\n template: path.resolve(process.cwd(), 'templates/starters/open-api.hbs'),\n outputPath: 'src/docs/openapi.json',\n },\n ];\n public dependencies: RegistryAssetDependency[] = [\n { name: '@igniter-js/core', version: 'latest', type: 'dependency' },\n ];\n public envVars: RegistryAssetEnvVar[] = [\n { key: 'IGNITER_APP_NAME', value: 'My App', description: 'Application name' },\n { key: 'IGNITER_APP_SECRET', value: 'my-secret-key', description: 'Application secret' },\n { key: 'IGNITER_API_BASE_PATH', value: '/api/v1', description: 'API base path' },\n ];\n\n /**\n * Install the starter\n */\n public async install(targetDir: string, options: ProjectSetupConfig): Promise<void> {\n if(options.mode === 'install') {\n await this.createProjectStructure(targetDir, options);\n } else {\n await this.download({ targetDir });\n }\n }\n\n /**\n * Create the project structure\n */\n private async createProjectStructure(targetDir: string, options: ProjectSetupConfig): Promise<void> {\n await this.addToPackageJson(targetDir);\n await this.addToEnvFile(targetDir);\n await this.renderTemplates(targetDir, options);\n }\n\n /**\n * Add dependencies to package.json file\n */\n private async addToPackageJson(projectDir: string): Promise<void> {\n const packageJsonPath = join(projectDir, 'package.json');\n\n let packageJson: any = {};\n if (existsSync(packageJsonPath)) {\n const content = await readFile(packageJsonPath, 'utf-8');\n packageJson = JSON.parse(content);\n }\n\n const dependencies = this.dependencies || [];\n const deps = dependencies.filter(d => d.type === 'dependency');\n const devDeps = dependencies.filter(d => d.type === 'devDependency');\n\n // Add regular dependencies (avoid duplicates)\n if (deps.length > 0) {\n packageJson.dependencies = packageJson.dependencies || {};\n deps.forEach(dep => {\n if (!packageJson.dependencies[dep.name]) {\n packageJson.dependencies[dep.name] = dep.version;\n }\n });\n }\n\n // Add dev dependencies (avoid duplicates)\n if (devDeps.length > 0) {\n packageJson.devDependencies = packageJson.devDependencies || {};\n devDeps.forEach(dep => {\n if (!packageJson.devDependencies[dep.name]) {\n packageJson.devDependencies[dep.name] = dep.version;\n }\n });\n }\n\n await writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2));\n }\n\n /**\n * Add environment variables to .env file\n */\n private async addToEnvFile(projectDir: string): Promise<void> {\n const envPath = join(projectDir, '.env');\n\n let envContent = '';\n if (existsSync(envPath)) {\n envContent = await readFile(envPath, 'utf-8');\n }\n\n // Parse existing env vars to avoid duplicates\n const existingVars = new Set<string>();\n const lines = envContent.split('\\n');\n lines.forEach(line => {\n const trimmed = line.trim();\n if (trimmed && !trimmed.startsWith('#') && trimmed.includes('=')) {\n const key = trimmed.split('=')[0];\n existingVars.add(key);\n }\n });\n\n const envVars = this.envVars || [];\n\n if (envVars.length > 0) {\n // Only add new env vars\n const newVars = envVars.filter(envVar => !existingVars.has(envVar.key));\n\n if (newVars.length > 0) {\n if (envContent && !envContent.endsWith('\\n\\n')) {\n envContent += '\\n';\n }\n\n newVars.forEach(envVar => {\n if (envVar.description) {\n envContent += `# ${envVar.description}\\n`;\n }\n envContent += `${envVar.key}=${envVar.value}\\n\\n`;\n });\n }\n }\n\n if (envContent.trim()) {\n await writeFile(envPath, envContent);\n }\n }\n\n /**\n * Render and create template files\n */\n private async renderTemplates(projectDir: string, data: ProjectSetupConfig): Promise<void> {\n // Register Handlebars helpers\n registerHandlebarsHelpers();\n\n const templates = this.templates || [];\n\n for (const template of templates) {\n try {\n // If template.template is a function, call it with the data\n if (typeof template.template === 'function') {\n template.template = template.template(data);\n }\n\n // Read template file\n const templateContent = await readFile(template.template as string, 'utf-8');\n\n // Compile and render template\n const compiledTemplate = handlebars.compile(templateContent);\n const renderedContent = compiledTemplate(data);\n\n // If template.outputPath is a function, call it with the data\n if (typeof template.outputPath === 'function') {\n template.outputPath = template.outputPath(data);\n }\n\n // Write to output path\n const outputPath = join(projectDir, template.outputPath);\n const outputDir = join(outputPath, '..');\n\n // Ensure output directory exists\n await import('fs').then(fs => {\n if (!fs.existsSync(outputDir)) {\n fs.mkdirSync(outputDir, { recursive: true });\n }\n });\n\n // Always overwrite the file if it already exists\n await writeFile(outputPath, renderedContent); // writeFile will overwrite by default\n } catch (error) {\n console.error(error);\n throw new Error(`Failed to render template ${template.template}: ${error}`);\n }\n }\n }\n\n /**\n * Download the starter template from the repository or path.\n *\n * Possible formats for this.repository:\n * - \"my-template\" (relative path inside igniter-js repository)\n * - \"felipebarcelospro/igniter-js/path/to/template\" (path inside public repo)\n * - \"org/repo\" (entire public repository)\n * - \"org/repo/path\" (a subpath inside a public repository)\n * - \"https://github.com/org/repo.git\" (whole repository, main branch)\n * - \"https://github.com/org/repo.git#branch:path\" (custom branch & path)\n */\n private async download({ targetDir }: { targetDir: string }): Promise<void> {\n const starter = this.repository\n const templateUrl = `https://github.com/felipebarcelospro/igniter-js.git`\n const branch = 'main'\n const tempDir = path.join(targetDir, '__igniter_tmp__')\n const starterDir = path.join(tempDir, 'apps', starter)\n const destDir = targetDir\n\n\n await fs.rm(tempDir, { recursive: true, force: true }).catch(() => {})\n await execa('git', [\n 'clone',\n '--depth', '1',\n '--branch', branch,\n '--single-branch',\n templateUrl,\n tempDir\n ])\n \n const stat = await fs.stat(starterDir).catch(() => null)\n if (!stat || !stat.isDirectory()) {\n throw new Error(`Starter directory '${starter}' not found in the repository.`)\n }\n\n const copyRecursive = async (src: string, dest: string) => {\n const entries = await fs.readdir(src, { withFileTypes: true })\n for (const entry of entries) {\n const srcPath = path.join(src, entry.name)\n const destPath = path.join(dest, entry.name)\n if (entry.isDirectory()) {\n await fs.mkdir(destPath, { recursive: true })\n await copyRecursive(srcPath, destPath)\n } else if (entry.isFile()) {\n await fs.copyFile(srcPath, destPath)\n }\n }\n }\n\n await copyRecursive(starterDir, destDir)\n\n await fs.rm(tempDir, { recursive: true, force: true }).catch(() => {})\n }\n}\n","import * as handlebars from \"handlebars\";\n\n/**\n * Register custom Handlebars helpers\n */\nexport function registerHandlebarsHelpers(): void {\n // Helper to check if an array includes a value\n handlebars.registerHelper(\"includes\", function (array: any[], value: any) {\n if (!Array.isArray(array)) {\n return false;\n }\n return array.includes(value);\n });\n\n // Helper to check if an array is empty\n handlebars.registerHelper(\"isEmpty\", function (array: any[]) {\n return !Array.isArray(array) || array.length === 0;\n });\n\n // Helper to check if a value is defined/not null\n handlebars.registerHelper(\"isDefined\", function (value: any) {\n return value !== null && value !== undefined;\n });\n\n // Helper to join array elements with a separator\n handlebars.registerHelper(\n \"join\",\n function (array: any[], separator: string = \", \") {\n if (!Array.isArray(array)) {\n return \"\";\n }\n return array.join(separator);\n },\n );\n\n // Capitalize a slug string (e.g. my-project -> My Project)\n handlebars.registerHelper(\"capitalizeSlug\", function (slug: string) {\n return slug\n .replace(/-/g, \" \")\n .replace(/\\b\\w/g, (char) => char.toUpperCase());\n });\n\n // Safely get a nested property from an object\n handlebars.registerHelper(\"get\", function (obj, path) {\n if (!path || typeof path !== \"string\") {\n return undefined;\n }\n const pathArray = path.split(\".\");\n let current = obj;\n for (let i = 0; i < pathArray.length; i++) {\n if (current === null || current === undefined) {\n return undefined;\n }\n current = current[pathArray[i]];\n }\n return current;\n });\n\n // Equality check\n handlebars.registerHelper(\"eq\", function (a, b) {\n return a === b;\n });\n\n // Convert string to camelCase (e.g., \"two-factor\" -> \"twoFactor\")\n handlebars.registerHelper(\"camelCase\", function (str: string) {\n if (!str) return str;\n if (str === \"email-otp\") return \"emailOTP\"; // Specific case for emailOTP\n if (str === \"open-api\") return \"openAPI\"; // Specific case for openAPI\n return str.replace(/-([a-z])/g, (g) => g[1].toUpperCase());\n });\n\n // Filters an array to exclude a specific item, like \"next-cookies\"\n handlebars.registerHelper(\"filterPlugins\", function (plugins: string[] = []) {\n if (!Array.isArray(plugins)) return [];\n return plugins.filter((p) => p !== \"next-cookies\");\n });\n\n // Generates all auth plugin import statements correctly\n handlebars.registerHelper(\n \"generatePluginImports\",\n function (plugins: string[] = []) {\n if (!Array.isArray(plugins) || plugins.length === 0) {\n return \"\";\n }\n\n // Re-implement camelCase logic locally to be self-contained\n const camelCase = (str: string) => {\n if (!str) return str;\n if (str === \"email-otp\") return \"emailOTP\";\n if (str === \"open-api\") return \"openAPI\";\n return str.replace(/-([a-z])/g, (g) => g[1].toUpperCase());\n };\n\n const regularPlugins = plugins\n .filter((p) => p !== \"next-cookies\")\n .map(camelCase);\n\n const hasNextCookies = plugins.includes(\"next-cookies\");\n\n const importStatements = [];\n\n if (regularPlugins.length > 0) {\n importStatements.push(\n `import { ${regularPlugins.join(\", \")} } from \"better-auth/plugins\";`,\n );\n }\n\n if (hasNextCookies) {\n importStatements.push(\n `import { nextCookies } from \"better-auth/next-js\";`,\n );\n }\n\n // Use SafeString to prevent Handlebars from escaping the output\n return new handlebars.SafeString(importStatements.join(\"\\n\"));\n },\n );\n}\n","import { spawn } from 'child_process';\nimport * as os from 'os';\n\n// Run a command on the terminal, supports all major OS and returns a result object\nexport function runCommand(command: string, options?: { cwd?: string }): Promise<{ success: boolean; errorMessage?: string }> {\n return new Promise((resolve) => {\n let cmd: string = 'cmd';\n\n if (os.platform() !== 'win32') cmd = command;\n\n const child = spawn(cmd, { shell: true, cwd: options?.cwd });\n\n child.on('close', (code) => {\n if (code === 0) {\n resolve({ success: true });\n } else {\n resolve({ success: false, errorMessage: `Command exited with code ${code}` });\n }\n });\n\n child.on('error', (err) => {\n resolve({ success: false, errorMessage: err.message });\n });\n });\n}\n\nexport function parseCommandOptions(data: Record<string, string | string[] | undefined>): string {\n return Object.entries(data).map(([key, value]) => {\n if (value === undefined) return '';\n if (Array.isArray(value)) {\n return value.map((v) => `--${key}=${v}`).join(' ');\n }\n return `--${key}=${value}`;\n }).join(' ');\n}","import { BaseStarter } from '@/core/registry/starters/base-starter';\nimport path from 'path';\n\nexport class ExpressStarter extends BaseStarter {\n id = 'express-rest-api';\n name = 'Express.js';\n description = 'A classic REST API starter with Express.js';\n hint = 'REST API';\n repository = 'starter-express-rest-api';\n envVars = [\n { key: 'IGNITER_APP_NAME', value: 'Igniter App', description: 'Application name' },\n { key: 'IGNITER_APP_SECRET', value: 'my-secret-key', description: 'Application secret' },\n { key: 'IGNITER_API_URL', value: 'http://localhost:3000/', description: 'API URL' },\n { key: 'IGNITER_API_BASE_PATH', value: '/api/v1', description: 'API base path' },\n ];\n}\n","import { BaseStarter } from '@/core/registry/starters/base-starter';\nimport path from 'path';\n\nexport class DenoStarter extends BaseStarter {\n id = 'deno-rest-api';\n name = 'Deno';\n description = 'A modern REST API starter with Deno';\n hint = 'REST API';\n repository = 'starter-deno-rest-api';\n envVars = [\n { key: 'IGNITER_APP_NAME', value: 'Igniter App', description: 'Application name' },\n { key: 'IGNITER_APP_SECRET', value: 'my-secret-key', description: 'Application secret' },\n { key: 'IGNITER_API_URL', value: 'http://localhost:3000/', description: 'API URL' },\n { key: 'IGNITER_API_BASE_PATH', value: '/api/v1', description: 'API base path' },\n ];\n}\n","import { BaseStarter } from '@/core/registry/starters/base-starter';\n\nexport class BunApiStarter extends BaseStarter {\n id = 'bun-rest-api';\n name = 'Bun';\n description = 'A high-performance REST API starter with Bun';\n hint = 'REST API';\n repository = 'starter-bun-rest-api';\n envVars = [\n { key: 'IGNITER_APP_NAME', value: 'Igniter App', description: 'Application name' },\n { key: 'IGNITER_APP_SECRET', value: 'my-secret-key', description: 'Application secret' },\n { key: 'IGNITER_API_URL', value: 'http://localhost:3000/', description: 'API URL' },\n { key: 'IGNITER_API_BASE_PATH', value: '/api/v1', description: 'API base path' },\n ];\n}\n","import { BaseStarter } from '@/core/registry/starters/base-starter';\n\nexport class BunReactStarter extends BaseStarter {\n id = 'bun-react-app';\n name = 'Bun + React (Vite)';\n description = 'A full-stack starter with Bun, React, and Vite';\n hint = 'Fullstack';\n repository = 'starter-bun-react-app';\n envVars = [\n { key: 'IGNITER_APP_NAME', value: 'Igniter App', description: 'Application name' },\n { key: 'IGNITER_APP_SECRET', value: 'my-secret-key', description: 'Application secret' },\n { key: 'IGNITER_API_URL', value: 'http://localhost:3000/', description: 'API URL' },\n { key: 'IGNITER_API_BASE_PATH', value: '/api/v1', description: 'API base path' },\n ];\n}\n","import { BaseStarter } from '@/core/registry/starters/base-starter';\nimport path from 'path';\n\nexport class TanStackStartStarter extends BaseStarter {\n id = 'tanstack-start';\n name = 'TanStack Start';\n description = 'A type-safe full-stack starter with TanStack Start';\n hint = 'Fullstack';\n repository = 'starter-tanstack-start';\n templates = [\n {\n template: path.resolve(process.cwd(), 'templates/starters/tanstack-start/route-handler.hbs'),\n outputPath: 'src/routes/api/v1/$.ts',\n },\n {\n template: path.resolve(process.cwd(), 'templates/starters/igniter.router.hbs'),\n outputPath: 'src/igniter.router.ts',\n },\n {\n template: path.resolve(process.cwd(), 'templates/starters/igniter.client.hbs'),\n outputPath: 'src/igniter.client.ts',\n },\n {\n template: path.resolve(process.cwd(), 'templates/starters/igniter.context.hbs'),\n outputPath: 'src/igniter.context.ts',\n },\n {\n template: path.resolve(process.cwd(), 'templates/starters/igniter.hbs'),\n outputPath: 'src/igniter.ts',\n },\n {\n template: path.resolve(process.cwd(), 'templates/scaffold/example-feature/example.controller.hbs'),\n outputPath: 'src/features/example/controllers/example.controller.ts',\n },\n {\n template: path.resolve(process.cwd(), 'templates/scaffold/example-feature/example.procedure.hbs'),\n outputPath: 'src/features/example/procedures/example.procedure.ts',\n },\n {\n template: path.resolve(process.cwd(), 'templates/scaffold/example-feature/example.interfaces.hbs'),\n outputPath: 'src/features/example/example.interfaces.ts',\n },\n {\n template: path.resolve(process.cwd(), 'templates/starters/tanstack-start/tsconfig.hbs'),\n outputPath: 'tsconfig.json',\n },\n {\n template: path.resolve(process.cwd(), 'templates/starters/open-api.hbs'),\n outputPath: 'src/docs/openapi.json',\n },\n ];\n dependencies = [\n { name: '@igniter-js/core', version: 'latest', type: 'dependency' },\n ];\n envVars = [\n { key: 'IGNITER_APP_NAME', value: 'Igniter App', description: 'Application name' },\n { key: 'IGNITER_APP_SECRET', value: 'my-secret-key', description: 'Application secret' },\n { key: 'IGNITER_API_URL', value: 'http://localhost:3000/', description: 'API URL' },\n { key: 'IGNITER_API_BASE_PATH', value: '/api/v1', description: 'API base path' },\n { key: 'REACT_APP_IGNITER_API_URL', value: 'http://localhost:3000/', description: 'API URL' },\n { key: 'REACT_APP_IGNITER_API_BASE_PATH', value: '/api/v1', description: 'API base path' },\n ];\n}\n","import { StarterRegistry } from \"@/core/registry/starters/starter-registry\";\nimport { NextJsStarter } from \"./nextjs-starter\";\nimport { ExpressStarter } from \"./express-starter\";\nimport { DenoStarter } from \"./deno-starter\";\nimport { BunApiStarter } from \"./bun-api-starter\";\nimport { BunReactStarter } from \"./bun-react-starter\";\nimport { TanStackStartStarter } from \"./tanstack-start-starter\";\n\n/**\n * Starter registry\n */\nexport const starterRegistry = StarterRegistry.create()\n .register(new NextJsStarter())\n .register(new ExpressStarter())\n .register(new DenoStarter())\n .register(new BunApiStarter())\n .register(new BunReactStarter())\n .register(new TanStackStartStarter())\n .build();","import type { BaseAddOn } from \"./base-addon\";\n\nexport class AddOnRegistry {\n private addOns = new Map<string, BaseAddOn>();\n\n static create() {\n return new AddOnRegistry();\n }\n\n register(addOn: BaseAddOn) {\n this.addOns.set(addOn.value, addOn);\n return this;\n }\n\n build() {\n return {\n get: (value: string): BaseAddOn | undefined => {\n return this.addOns.get(value);\n },\n getMany: (values: string[]): BaseAddOn[] => {\n return values\n .map((value) => this.addOns.get(value))\n .filter(Boolean) as BaseAddOn[];\n },\n getAll: (): BaseAddOn[] => {\n return Array.from(this.addOns.values());\n },\n };\n }\n}\n\n// Legacy type alias for backward compatibility\nexport type FeatureRegistry = AddOnRegistry;\n","import path from \"path\";\nimport { BaseAddOn } from \"@/core/registry/add-ons/base-addon\";\n\nexport class RedisStoreAddOn extends BaseAddOn {\n name = \"Store\";\n description = \"Caching, sessions, and pub/sub messaging\";\n value = \"store\";\n hint = \"Recommended\";\n templates = [\n {\n template: path.resolve(\n process.cwd(),\n \"templates/add-ons/store/redis.ts.hbs\",\n ),\n outputPath: \"src/services/redis.ts\",\n },\n {\n template: path.resolve(\n process.cwd(),\n \"templates/add-ons/store/store.ts.hbs\",\n ),\n outputPath: \"src/services/store.ts\",\n },\n ];\n dependencies = [\n {\n name: \"@igniter-js/adapter-redis\",\n version: \"latest\",\n type: \"dependency\",\n },\n {\n name: \"ioredis\",\n version: \"5.6.1\",\n type: \"dependency\",\n },\n {\n name: \"@types/ioredis\",\n version: \"4.28.10\",\n type: \"devDependency\",\n },\n ];\n dockerServices = [\n {\n name: \"redis\",\n image: \"redis:7-alpine\",\n ports: [\"6379:6379\"],\n environment: {\n REDIS_PASSWORD: \"${REDIS_PASSWORD}\",\n },\n volumes: [\"redis_data:/data\"],\n },\n ];\n envVars = [\n {\n key: \"REDIS_URL\",\n value: \"redis://localhost:6379\",\n description: \"Redis connection URL\",\n },\n {\n key: \"REDIS_HOST\",\n value: \"localhost\",\n description: \"Redis host\",\n },\n {\n key: \"REDIS_PORT\",\n value: \"6379\",\n description: \"Redis port\",\n },\n {\n key: \"REDIS_PASSWORD\",\n value: \"\",\n description: \"Redis password (leave empty for no password)\",\n },\n ];\n}\n","import type {\n AddOnOption,\n RegistryAssetDependency,\n RegistryAssetDockerService,\n RegistryAssetEnvVar,\n RegistryAssetTemplate,\n} from \"@/registry/types\";\nimport { readFile, writeFile } from \"fs/promises\";\nimport { existsSync } from \"fs\";\nimport { join } from \"path\";\nimport * as handlebars from \"handlebars\";\nimport { registerHandlebarsHelpers } from \"../../handlebars-helpers\";\nimport type { ProjectSetupConfig } from \"@/commands/init/types\";\n\ntype SetupFunction = (\n projectDir: string,\n config: ProjectSetupConfig,\n) => Promise<void>;\n\n// Export the new class\nexport abstract class BaseAddOn {\n abstract name: string;\n abstract description: string;\n abstract value: string;\n abstract hint?: string;\n templates?: RegistryAssetTemplate[];\n dependencies?: RegistryAssetDependency[];\n dockerServices?: RegistryAssetDockerService[];\n envVars?: RegistryAssetEnvVar[];\n options?: AddOnOption[];\n\n\n public async runSetup(\n projectDir: string,\n config: ProjectSetupConfig,\n ): Promise<void> {\n // Orchestrate only: each method self-collects its required assets\n await this.addToPackageJson(projectDir, config);\n await this.addToDockerCompose(projectDir, config);\n await this.addToEnvFile(projectDir, config);\n await this.renderTemplates(projectDir, config);\n }\n\n /**\n * Add dependencies to package.json file\n */\n private async addToPackageJson(\n projectDir: string,\n config: ProjectSetupConfig,\n ): Promise<void> {\n // Collect dependencies from base add-on and selected options\n const selectedOptions = config.addOnOptions?.[this.value] || {};\n const collectDependencies = (options: AddOnOption[] = []): RegistryAssetDependency[] => {\n const out: RegistryAssetDependency[] = [];\n for (const option of options) {\n const selectedValue = selectedOptions[option.key];\n if (!selectedValue) continue;\n if (option.setup) {\n // setup functions are handled elsewhere\n }\n const selectedChoices = Array.isArray(selectedValue)\n ? selectedValue\n : [selectedValue];\n for (const value of selectedChoices) {\n const choice = option.choices.find((c) => c.value === value);\n if (!choice) continue;\n if (choice.dependencies) out.push(...choice.dependencies);\n if (choice.subOptions) out.push(...collectDependencies(choice.subOptions));\n }\n }\n return out;\n };\n\n const dependencies: RegistryAssetDependency[] = [\n ...(this.dependencies || []),\n ...collectDependencies(this.options || []),\n ];\n const packageJsonPath = join(projectDir, \"package.json\");\n\n let packageJson: any = {};\n if (existsSync(packageJsonPath)) {\n const content = await readFile(packageJsonPath, \"utf-8\");\n packageJson = JSON.parse(content);\n }\n\n const deps = dependencies.filter((d) => d.type === \"dependency\");\n const devDeps = dependencies.filter((d) => d.type === \"devDependency\");\n\n // Add regular dependencies (avoid duplicates)\n if (deps.length > 0) {\n packageJson.dependencies = packageJson.dependencies || {};\n deps.forEach((dep) => {\n if (!packageJson.dependencies[dep.name]) {\n packageJson.dependencies[dep.name] = dep.version;\n }\n });\n }\n\n // Add dev dependencies (avoid duplicates)\n if (devDeps.length > 0) {\n packageJson.devDependencies = packageJson.devDependencies || {};\n devDeps.forEach((dep) => {\n if (!packageJson.devDependencies[dep.name]) {\n packageJson.devDependencies[dep.name] = dep.version;\n }\n });\n }\n\n await writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2));\n }\n\n /**\n * Add services to docker-compose.yml file\n */\n private async addToDockerCompose(\n projectDir: string,\n config: ProjectSetupConfig,\n ): Promise<void> {\n // Collect docker services and env vars from base and selected options\n const selectedOptions = config.addOnOptions?.[this.value] || {};\n const collectDocker = (options: AddOnOption[] = []): {\n services: RegistryAssetDockerService[];\n envVars: RegistryAssetEnvVar[];\n } => {\n const services: RegistryAssetDockerService[] = [];\n const envVars: RegistryAssetEnvVar[] = [];\n for (const option of options) {\n const selectedValue = selectedOptions[option.key];\n if (!selectedValue) continue;\n const selectedChoices = Array.isArray(selectedValue)\n ? selectedValue\n : [selectedValue];\n for (const value of selectedChoices) {\n const choice = option.choices.find((c) => c.value === value);\n if (!choice) continue;\n if (choice.dockerServices) services.push(...choice.dockerServices);\n if (choice.envVars) envVars.push(...choice.envVars);\n if (choice.subOptions) {\n const sub = collectDocker(choice.subOptions);\n services.push(...sub.services);\n envVars.push(...sub.envVars);\n }\n }\n }\n return { services, envVars };\n };\n\n const fromOptions = collectDocker(this.options || []);\n const dockerServices: RegistryAssetDockerService[] = [\n ...(this.dockerServices || []),\n ...fromOptions.services,\n ];\n const envVars: RegistryAssetEnvVar[] = [\n ...(this.envVars || []),\n ...fromOptions.envVars,\n ];\n const dockerComposePath = join(projectDir, \"docker-compose.yml\");\n\n let dockerCompose: any = {};\n if (existsSync(dockerComposePath)) {\n const content = await readFile(dockerComposePath, \"utf-8\");\n try {\n dockerCompose = JSON.parse(content);\n } catch {\n // If it's not JSON, assume it's YAML and parse it\n // For now, we'll recreate the file if it exists\n dockerCompose = {};\n }\n }\n\n const services = dockerServices;\n const resolvedEnvVars = envVars?.reduce(\n (acc, envVar) => {\n acc[envVar.key] = envVar.value;\n return acc;\n },\n {} as Record<string, string>,\n );\n\n if (services.length > 0) {\n dockerCompose.services = dockerCompose.services || {};\n\n services.forEach((service) => {\n // Skip if service already exists\n if (dockerCompose.services[service.name]) {\n return;\n }\n\n // Replace environment variable placeholders with actual values\n const processedEnvironment = { ...service.environment };\n Object.keys(processedEnvironment).forEach((key) => {\n const value = processedEnvironment[key];\n // Replace ${VAR_NAME} with actual env var value\n if (\n typeof value === \"string\" &&\n value.startsWith(\"${\") &&\n value.endsWith(\"}\")\n ) {\n const envVarName = value.slice(2, -1); // Remove ${}\n if (resolvedEnvVars && resolvedEnvVars[envVarName]) {\n processedEnvironment[key] = resolvedEnvVars[envVarName];\n }\n }\n });\n\n dockerCompose.services[service.name] = {\n image: service.image,\n ports: service.ports,\n environment: processedEnvironment,\n volumes: service.volumes,\n };\n });\n\n // Add volumes if any service defines them\n const volumes = services\n .filter((s) => s.volumes)\n .flatMap((s) => s.volumes)\n .filter((volume) => !volume.startsWith(\"/\")) // Exclude host mounts\n .map((volume) => volume.split(\":\")[0])\n .filter((volume, index, arr) => arr.indexOf(volume) === index); // Unique\n\n if (volumes.length > 0) {\n dockerCompose.volumes = dockerCompose.volumes || {};\n volumes.forEach((volume) => {\n if (!dockerCompose.volumes[volume]) {\n dockerCompose.volumes[volume] = {};\n }\n });\n }\n }\n\n // Write the docker-compose file as YAML\n let yamlContent = \"version: '3.8'\\n\\n\";\n if (\n dockerCompose.services &&\n Object.keys(dockerCompose.services).length > 0\n ) {\n yamlContent += \"services:\\n\";\n Object.entries(dockerCompose.services).forEach(\n ([name, service]: [string, any]) => {\n yamlContent += ` ${name}:\\n`;\n yamlContent += ` image: ${service.image}\\n`;\n if (service.ports && service.ports.length > 0) {\n yamlContent += ` ports:\\n`;\n service.ports.forEach((port: string) => {\n yamlContent += ` - \"${port}\"\\n`;\n });\n }\n if (\n service.environment &&\n Object.keys(service.environment).length > 0\n ) {\n yamlContent += ` environment:\\n`;\n Object.entries(service.environment).forEach(([key, value]) => {\n yamlContent += ` ${key}: ${value}\\n`;\n });\n }\n if (service.volumes && service.volumes.length > 0) {\n yamlContent += ` volumes:\\n`;\n service.volumes.forEach((volume: string) => {\n yamlContent += ` - ${volume}\\n`;\n });\n }\n yamlContent += \"\\n\";\n },\n );\n }\n\n if (\n dockerCompose.volumes &&\n Object.keys(dockerCompose.volumes).length > 0\n ) {\n yamlContent += \"volumes:\\n\";\n Object.keys(dockerCompose.volumes).forEach((volume) => {\n yamlContent += ` ${volume}:\\n`;\n });\n }\n\n await writeFile(dockerComposePath, yamlContent);\n }\n\n /**\n * Add environment variables to .env file\n */\n private async addToEnvFile(\n projectDir: string,\n config: ProjectSetupConfig,\n ): Promise<void> {\n // Collect env vars from base and selected options\n const selectedOptions = config.addOnOptions?.[this.value] || {};\n const collectEnvVars = (options: AddOnOption[] = []): RegistryAssetEnvVar[] => {\n const out: RegistryAssetEnvVar[] = [];\n for (const option of options) {\n const selectedValue = selectedOptions[option.key];\n if (!selectedValue) continue;\n const selectedChoices = Array.isArray(selectedValue)\n ? selectedValue\n : [selectedValue];\n for (const value of selectedChoices) {\n const choice = option.choices.find((c) => c.value === value);\n if (!choice) continue;\n if (choice.envVars) out.push(...choice.envVars);\n if (choice.subOptions) out.push(...collectEnvVars(choice.subOptions));\n }\n }\n return out;\n };\n\n const envVars: RegistryAssetEnvVar[] = [\n ...(this.envVars || []),\n ...collectEnvVars(this.options || []),\n ];\n const envPath = join(projectDir, \".env\");\n\n let envContent = \"\";\n if (existsSync(envPath)) {\n envContent = await readFile(envPath, \"utf-8\");\n }\n\n // Parse existing env vars to avoid duplicates\n const existingVars = new Set<string>();\n const lines = envContent.split(\"\\n\");\n lines.forEach((line) => {\n const trimmed = line.trim();\n if (trimmed && !trimmed.startsWith(\"#\") && trimmed.includes(\"=\")) {\n const key = trimmed.split(\"=\")[0];\n existingVars.add(key);\n }\n });\n\n if (envVars.length > 0) {\n // Only add new env vars\n const newVars = envVars.filter((envVar) => !existingVars.has(envVar.key));\n\n if (newVars.length > 0) {\n if (envContent && !envContent.endsWith(\"\\n\\n\")) {\n envContent += \"\\n\";\n }\n\n newVars.forEach((envVar) => {\n if (envVar.description) {\n envContent += `# ${envVar.description}\\n`;\n }\n envContent += `${envVar.key}=${envVar.value}\\n\\n`;\n });\n }\n }\n\n if (envContent.trim()) {\n await writeFile(envPath, envContent);\n }\n }\n\n /**\n * Render and create template files\n */\n private async renderTemplates(\n projectDir: string,\n config: ProjectSetupConfig,\n ): Promise<void> {\n // Collect templates from base and selected options\n const selectedOptions = config.addOnOptions?.[this.value] || {};\n const collectTemplates = (options: AddOnOption[] = []): RegistryAssetTemplate[] => {\n const out: RegistryAssetTemplate[] = [];\n for (const option of options) {\n const selectedValue = selectedOptions[option.key];\n if (!selectedValue) continue;\n const selectedChoices = Array.isArray(selectedValue)\n ? selectedValue\n : [selectedValue];\n for (const value of selectedChoices) {\n const choice = option.choices.find((c) => c.value === value);\n if (!choice) continue;\n if (choice.templates) out.push(...choice.templates);\n if (choice.subOptions) out.push(...collectTemplates(choice.subOptions));\n }\n }\n return out;\n };\n\n const templates: RegistryAssetTemplate[] = [\n ...(this.templates || []),\n ...collectTemplates(this.options || []),\n ];\n // Register Handlebars helpers\n registerHandlebarsHelpers();\n\n // Create enhanced template context with add-on options\n const templateData = {\n ...config,\n enabledAddOns: config.addOns || [],\n addOnOptions: config.addOnOptions || {},\n };\n\n for (const template of templates) {\n try {\n // If template.template is a function, call it with the data\n if (typeof template.template === \"function\") {\n template.template = template.template(config);\n }\n\n if (!template.template) continue;\n\n // Read template file\n const templateContent = await readFile(template.template, \"utf-8\");\n\n // Compile and render template\n const compiledTemplate = handlebars.compile(templateContent);\n const renderedContent = compiledTemplate(templateData);\n\n // Write to output path\n if (typeof template.outputPath === \"function\") {\n template.outputPath = template.outputPath(config);\n }\n\n const outputPath = join(projectDir, template.outputPath);\n const outputDir = join(outputPath, \"..\");\n\n // Ensure output directory exists\n await import(\"fs\").then((fs) => {\n if (!fs.existsSync(outputDir)) {\n fs.mkdirSync(outputDir, { recursive: true });\n }\n });\n\n // Always overwrite the file if it already exists\n await writeFile(outputPath, renderedContent); // writeFile will overwrite by default\n } catch (error) {\n console.error(error);\n throw new Error(\n `Failed to render template ${template.template}: ${error}`,\n );\n }\n }\n }\n\n private _collectSetupSteps(\n options: AddOnOption[],\n selectedOptions: Record<string, string[] | string | undefined>,\n ): SetupFunction[] {\n const steps: SetupFunction[] = [];\n for (const option of options) {\n const selectedValue = selectedOptions[option.key];\n if (selectedValue) {\n if (option.setup) {\n steps.push(option.setup);\n }\n const selectedChoices = Array.isArray(selectedValue)\n ? selectedValue\n : [selectedValue];\n for (const value of selectedChoices) {\n const choice = option.choices.find((c) => c.value === value);\n if (choice?.subOptions) {\n steps.push(\n ...this._collectSetupSteps(choice.subOptions, selectedOptions),\n );\n }\n }\n }\n }\n return steps;\n }\n\n /**\n * Execute all setup functions from selected add-on options.\n */\n public async runPostInstall(\n projectDir: string,\n config: ProjectSetupConfig,\n ): Promise<void> {\n const selectedOptions = config.addOnOptions?.[this.value] || {};\n const setups = this._collectSetupSteps(this.options || [], selectedOptions);\n for (const setup of setups) {\n await setup(projectDir, config);\n }\n }\n}\n","import { BaseAddOn } from \"@/core/registry/add-ons/base-addon\";\nimport path from \"path\";\n\nexport class JobsAddOn extends BaseAddOn {\n name = \"Jobs\";\n description = \"Background task processing and job queues\";\n value = \"jobs\";\n hint = \"For background processing\";\n templates = [\n {\n template: path.resolve(\n process.cwd(),\n \"templates/add-ons/jobs/jobs.ts.hbs\",\n ),\n outputPath: \"src/services/jobs.ts\",\n },\n {\n template: path.resolve(\n process.cwd(),\n \"templates/add-ons/jobs/redis.ts.hbs\",\n ),\n outputPath: \"src/services/redis.ts\",\n },\n {\n template: path.resolve(\n process.cwd(),\n \"templates/add-ons/jobs/store.ts.hbs\",\n ),\n outputPath: \"src/services/store.ts\",\n },\n ];\n dependencies = [\n {\n name: \"@igniter-js/adapter-redis\",\n version: \"latest\",\n type: \"dependency\",\n },\n {\n name: \"@igniter-js/adapter-bullmq\",\n version: \"latest\",\n type: \"dependency\",\n },\n {\n name: \"bullmq\",\n version: \"5.58.7\",\n type: \"dependency\",\n },\n {\n name: \"ioredis\",\n version: \"5.6.1\",\n type: \"dependency\",\n },\n {\n name: \"@types/ioredis\",\n version: \"4.28.10\",\n type: \"devDependency\",\n },\n ];\n dockerServices = [\n {\n name: \"redis\",\n image: \"redis:7-alpine\",\n ports: [\"6379:6379\"],\n environment: {\n REDIS_PASSWORD: \"${REDIS_PASSWORD}\",\n },\n volumes: [\"redis_data:/data\"],\n },\n ];\n envVars = [\n {\n key: \"REDIS_URL\",\n value: \"redis://localhost:6379\",\n description: \"Redis connection URL\",\n },\n {\n key: \"REDIS_HOST\",\n value: \"localhost\",\n description: \"Redis host\",\n },\n {\n key: \"REDIS_PORT\",\n value: \"6379\",\n description: \"Redis port\",\n },\n {\n key: \"REDIS_PASSWORD\",\n value: \"\",\n description: \"Redis password (leave empty for no password)\",\n },\n {\n key: \"IGNITER_JOBS_QUEUE_PREFIX\",\n value: \"igniter\",\n description: \"Job queue prefix\",\n },\n ];\n}\n","import type { ProjectSetupConfig } from \"@/commands/init/types\";\nimport { BaseAddOn } from \"@/core/registry/add-ons/base-addon\";\nimport path from \"path\";\nimport { z } from \"zod\";\n\nexport class McpServerAddOn extends BaseAddOn {\n name = \"MCP Server\";\n description = \"AI assistant integration with Model Context Protocol\";\n value = \"mcp\";\n hint = \"For AI integration\";\n templates = [\n {\n template: path.resolve(\n process.cwd(),\n \"templates/add-ons/mcp/mcp.ts.hbs\",\n ),\n outputPath: \"src/igniter.mcp.ts\",\n },\n {\n template: (data: ProjectSetupConfig) => {\n const templates = {\n nextjs: path.resolve(\n process.cwd(),\n \"templates/add-ons/mcp/nextjs/route-handler.hbs\",\n ),\n \"tanstack-start\": path.resolve(\n process.cwd(),\n \"templates/add-ons/mcp/tanstack-start/route-handler.hbs\",\n ),\n };\n\n return templates[data.starter as keyof typeof templates] || \"\";\n },\n outputPath: (data: ProjectSetupConfig) => {\n const outputPaths = {\n nextjs: \"src/app/api/mcp/[...transport]/route.ts\",\n \"tanstack-start\": \"src/routes/mcp/$.ts\",\n };\n\n return outputPaths[data.starter as keyof typeof outputPaths] || \"\";\n },\n },\n ];\n dependencies = [\n {\n name: \"@igniter-js/adapter-mcp-server\",\n version: \"latest\",\n type: \"dependency\",\n },\n {\n name: \"ioredis\",\n version: \"5.6.1\",\n type: \"dependency\",\n },\n {\n name: \"@types/ioredis\",\n version: \"4.28.10\",\n type: \"devDependency\",\n },\n ];\n dockerServices = [\n {\n name: \"redis\",\n image: \"redis:7-alpine\",\n ports: [\"6379:6379\"],\n environment: {\n REDIS_PASSWORD: \"${REDIS_PASSWORD}\",\n },\n volumes: [\"redis_data:/data\"],\n },\n ];\n envVars = [\n {\n key: \"IGNITER_MCP_SERVER_BASE_PATH\",\n value: \"/mcp\",\n description: \"MCP server base path\",\n },\n {\n key: \"IGNITER_MCP_SERVER_TIMEOUT\",\n value: \"3600000\",\n description: \"MCP session timeout in ms\",\n },\n {\n key: \"REDIS_URL\",\n value: \"redis://localhost:6379\",\n description: \"Redis connection URL\",\n },\n {\n key: \"REDIS_HOST\",\n value: \"localhost\",\n description: \"Redis host\",\n },\n {\n key: \"REDIS_PORT\",\n value: \"6379\",\n description: \"Redis port\",\n },\n {\n key: \"REDIS_PASSWORD\",\n value: \"\",\n description: \"Redis password (leave empty for no password)\",\n },\n ];\n}\n","import { BaseAddOn } from \"@/core/registry/add-ons/base-addon\";\nimport path from \"path\";\n\nexport class LoggingAddOn extends BaseAddOn {\n name = \"Logging\";\n description = \"Advanced console logging with structured output\";\n value = \"logging\";\n hint = \"For better observability\";\n templates = [\n {\n template: path.resolve(\n process.cwd(),\n \"templates/add-ons/logging/logger.ts.hbs\",\n ),\n outputPath: \"src/services/logger.ts\",\n },\n ];\n dependencies = [\n {\n name: \"@igniter-js/core\",\n version: \"latest\",\n type: \"dependency\",\n },\n ];\n dockerServices = [];\n envVars = [\n {\n key: \"IGNITER_LOG_LEVEL\",\n value: \"info\",\n description: \"Logging level (debug, info, warn, error)\",\n },\n ];\n}\n","import { BaseAddOn } from \"@/core/registry/add-ons/base-addon\";\nimport path from \"path\";\n\nexport class TelemetryAddOn extends BaseAddOn {\n name = \"Telemetry\";\n description = \"Telemetry for tracking requests and errors\";\n value = \"telemetry\";\n hint = \"For observability\";\n dockerServices = [];\n templates = [\n {\n template: path.resolve(\n process.cwd(),\n \"templates/add-ons/telemetry/telemetry.ts.hbs\",\n ),\n outputPath: \"src/services/telemetry.ts\",\n },\n ];\n dependencies = [\n {\n name: \"@igniter-js/core\",\n version: \"latest\",\n type: \"dependency\",\n },\n ];\n envVars = [\n {\n key: \"IGNITER_TELEMETRY_ENABLE_TRACING\",\n value: \"true\",\n description: \"Enable telemetry tracing\",\n },\n {\n key: \"IGNITER_TELEMETRY_ENABLE_METRICS\",\n value: \"true\",\n description: \"Enable telemetry metrics\",\n },\n {\n key: \"IGNITER_TELEMETRY_ENABLE_EVENTS\",\n value: \"true\",\n description: \"Enable telemetry events\",\n },\n {\n key: \"IGNITER_TELEMETRY_ENABLE_CLI_INTEGRATION\",\n value: \"true\",\n description: \"Enable telemetry CLI integration\",\n },\n ];\n}\n","import type { ProjectSetupConfig } from \"@/commands/init/types\";\nimport { BaseAddOn } from \"@/core/registry/add-ons/base-addon\";\nimport path from \"path\";\n\nexport class BotsAddOn extends BaseAddOn {\n name = \"Bots (Telegram, WhatsApp, Discord, etc.)\";\n description = \"Multi-platform chatbot support\";\n value = \"bots\";\n hint = \"For multi-platform chatbot support\";\n templates = [\n {\n template: path.resolve(\n process.cwd(),\n \"templates/add-ons/bots/sample-bot.hbs\",\n ),\n outputPath: \"src/bots/sample-bot.ts\",\n },\n {\n template: (data: ProjectSetupConfig) => {\n const templates = {\n nextjs: path.resolve(\n process.cwd(),\n \"templates/add-ons/bots/nextjs/route-handler.hbs\",\n ),\n \"tanstack-start\": path.resolve(\n process.cwd(),\n \"templates/add-ons/bots/tanstack-start/route-handler.hbs\",\n ),\n };\n\n return templates[data.starter as keyof typeof templates] || \"\";\n },\n outputPath: (data: ProjectSetupConfig) => {\n const outputPaths = {\n nextjs: \"src/app/api/bots/[provider]/[botId]/route.ts\",\n \"tanstack-start\": \"src/routes/api/bots/$provider/$botId.ts\",\n };\n\n return outputPaths[data.starter as keyof typeof outputPaths] || \"\";\n },\n },\n ];\n dependencies = [\n {\n name: \"@igniter-js/bot\",\n version: \"alpha\",\n type: \"dependency\",\n },\n ];\n envVars = [\n {\n key: \"TELEGRAM_TOKEN\",\n value: \"\",\n description: \"Telegram bot token\",\n },\n {\n key: \"TELEGRAM_WEBHOOK_URL\",\n value: \"\",\n description: \"Telegram webhook URL\",\n },\n {\n key: \"TELEGRAM_WEBHOOK_SECRET\",\n value: \"\",\n description: \"Telegram webhook secret\",\n },\n ];\n}\n","import type { ProjectSetupConfig } from \"@/commands/init/types\";\nimport { getPackageManagerCommand } from \"@/core/package-manager\";\nimport { BaseAddOn } from \"@/core/registry/add-ons/base-addon\";\nimport { runCommand } from \"@/core/terminal\";\nimport path from \"path\";\n\nexport class DatabaseAddOn extends BaseAddOn {\n name = \"Database\";\n description = \"Database integration with multiple ORMs and providers\";\n value = \"database\";\n hint = \"Essential for data persistence\";\n options = [\n {\n key: \"orm\",\n message: \"Choose your preferred ORM for type-safe database operations\",\n multiple: false,\n required: true,\n choices: [\n {\n value: \"prisma\",\n label: \"Prisma\",\n hint: \"Type-safe, mature, excellent tooling\",\n dependencies: [\n {\n name: \"dotenv\",\n type: \"dependency\",\n version: \"latest\",\n },\n {\n name: \"prisma\",\n type: \"dependency\",\n version: \"^6.19.0\",\n },\n {\n name: \"@prisma/client\",\n type: \"dependency\",\n version: \"^6.19.0\",\n }\n ],\n templates: [\n {\n template: path.resolve(\n process.cwd(),\n \"templates/add-ons/database/prisma/lib.hbs\",\n ),\n outputPath: \"src/lib/database.ts\",\n },\n {\n template: path.resolve(\n process.cwd(),\n \"templates/add-ons/database/prisma/prisma.config.hbs\",\n ),\n outputPath: \"prisma.config.ts\",\n },\n {\n template: path.resolve(\n process.cwd(),\n \"templates/add-ons/database/prisma/schema.hbs\",\n ),\n outputPath: \"prisma/schema.prisma\",\n }\n ],\n },\n {\n value: \"drizzle\",\n label: \"Drizzle ORM\",\n hint: \"Lightweight, modern, SQL-like\",\n templates: [\n {\n template: path.resolve(\n process.cwd(),\n \"templates/add-ons/database/drizzle/lib.hbs\",\n ),\n outputPath: \"src/lib/database.ts\",\n },\n ],\n },\n ],\n },\n {\n key: \"provider\",\n message: \"Choose the database engine\",\n multiple: false,\n required: true,\n choices: [\n {\n value: \"postgresql\",\n label: \"PostgreSQL\",\n hint: \"Production-ready, full-featured\",\n dockerServices: [\n {\n name: \"postgres\",\n image: \"postgres:16-alpine\",\n ports: [\"5432:5432\"],\n environment: {\n POSTGRES_DB: \"${DATABASE_NAME}\",\n POSTGRES_USER: \"${DATABASE_USER}\",\n POSTGRES_PASSWORD: \"${DATABASE_PASSWORD}\",\n },\n volumes: [\"postgres_data:/var/lib/postgresql/data\"],\n },\n ],\n envVars: [\n {\n key: \"DATABASE_URL\",\n value:\n \"postgresql://igniter:${DATABASE_PASSWORD}@localhost:5432/igniter_db\",\n description: \"PostgreSQL connection string\",\n },\n {\n key: \"DATABASE_PASSWORD\",\n value: \"igniter\",\n description: \"Database password\",\n },\n {\n key: \"DATABASE_USER\",\n value: \"igniter\",\n description: \"Database username\",\n },\n ],\n },\n {\n value: \"mysql\",\n label: \"MySQL\",\n hint: \"Wide compatibility, popular\",\n dockerServices: [\n {\n name: \"mysql\",\n image: \"mysql:8.0\",\n ports: [\"3306:3306\"],\n environment: {\n MYSQL_ROOT_PASSWORD: \"${DATABASE_PASSWORD}\",\n MYSQL_DATABASE: \"${DATABASE_NAME}\",\n MYSQL_USER: \"${DATABASE_USER}\",\n MYSQL_PASSWORD: \"${DATABASE_PASSWORD}\",\n },\n volumes: [\"mysql_data:/var/lib/mysql\"],\n },\n ],\n envVars: [\n {\n key: \"DATABASE_URL\",\n value:\n \"mysql://igniter:${DATABASE_PASSWORD}@localhost:3306/igniter_db\",\n description: \"MySQL connection string\",\n },\n {\n key: \"DATABASE_PASSWORD\",\n value: \"docker\",\n description: \"Database password\",\n },\n {\n key: \"DATABASE_USER\",\n value: \"docker\",\n description: \"Database username\",\n },\n {\n key: \"DATABASE_NAME\",\n value: \"docker\",\n description: \"Database name\",\n },\n ],\n },\n {\n value: \"sqlite\",\n label: \"SQLite\",\n hint: \"Local development, file-based\",\n envVars: [\n {\n key: \"DATABASE_URL\",\n value: \"file:./dev.db\",\n description: \"SQLite database file path\",\n },\n ],\n },\n ],\n setup: async (projectDir: string, config: ProjectSetupConfig) => {\n // if database.orm is prisma, we need use prisma cli to setup the database\n if (config.addOnOptions?.database?.orm === \"prisma\") {\n const command = getPackageManagerCommand(\n config.packageManager,\n \"prisma\",\n );\n await runCommand(`${command} generate`, { cwd: projectDir });\n }\n // if database.orm is drizzle, we need use drizzle cli to setup the database\n if (config.addOnOptions?.database?.orm === \"drizzle\") {\n const command = getPackageManagerCommand(\n config.packageManager,\n \"drizzle\",\n );\n await runCommand(`${command} init`, { cwd: projectDir });\n }\n },\n },\n ];\n}\n","import path from \"node:path\";\nimport type { ProjectSetupConfig } from \"@/commands/init/types\";\nimport { getPackageManagerCommand } from \"@/core/package-manager\";\nimport { BaseAddOn } from \"@/core/registry/add-ons/base-addon\";\nimport { parseCommandOptions, runCommand } from \"@/core/terminal\";\nimport * as p from \"@clack/prompts\";\n\nexport class AuthAddOn extends BaseAddOn {\n name = \"Authentication\";\n description = \"Authentication and authorization\";\n value = \"auth\";\n hint = \"Essential for user authentication and authorization\";\n options = [\n {\n key: \"provider\",\n message: \"Choose the authentication provider\",\n multiple: false,\n required: true,\n choices: [\n {\n value: \"better-auth\",\n label: \"Better Auth\",\n hint: \"Universal TypeScript auth, plugin support, secure and extensible—focus on your app.\",\n dependencies: [\n {\n name: \"better-auth\",\n version: \"1.3.0\",\n type: \"dependency\",\n },\n ],\n templates: [\n {\n template: \"templates/add-ons/auth/better-auth/auth.hbs\",\n outputPath: \"src/lib/auth.ts\",\n },\n ],\n subOptions: [\n {\n key: \"plugins\",\n message: \"Choose the authentication plugins\",\n multiple: true,\n required: true,\n choices: [\n {\n value: \"email\",\n label: \"Email\",\n hint: \"Email authentication\",\n },\n {\n value: \"two-factor\",\n label: \"Two Factor\",\n hint: \"Two-factor authentication\",\n },\n {\n value: \"username\",\n label: \"Username\",\n hint: \"Username authentication\",\n },\n {\n value: \"anonymous\",\n label: \"Anonymous\",\n hint: \"Anonymous authentication\",\n },\n {\n value: \"phone-number\",\n label: \"Phone Number\",\n hint: \"Phone number authentication\",\n },\n {\n value: \"magic-link\",\n label: \"Magic Link\",\n hint: \"Magic link authentication\",\n },\n {\n value: \"email-otp\",\n label: \"Email OTP\",\n hint: \"One-time password email authentication\",\n },\n {\n value: \"passkey\",\n label: \"Passkey\",\n hint: \"Passkey authentication\",\n },\n {\n value: \"generic-oauth\",\n label: \"Generic OAuth\",\n hint: \"Provider-independent OAuth authentication\",\n },\n {\n value: \"one-tap\",\n label: \"One Tap\",\n hint: \"Google One Tap authentication\",\n },\n {\n value: \"api-key\",\n label: \"API Key\",\n hint: \"API Key authentication\",\n },\n {\n value: \"admin\",\n label: \"Admin\",\n hint: \"Admin authentication\",\n },\n {\n value: \"organization\",\n label: \"Organization\",\n hint: \"Organization-based authentication\",\n },\n {\n value: \"oidc\",\n label: \"OIDC Provider\",\n hint: \"OpenID Connect authentication provider\",\n },\n {\n value: \"sso\",\n label: \"SSO\",\n hint: \"Single sign-on authentication (SSO)\",\n },\n {\n value: \"bearer\",\n label: \"Bearer\",\n hint: \"Bearer token authentication\",\n },\n {\n value: \"multi-session\",\n label: \"Multi Session\",\n hint: \"Concurrent multi-session authentication\",\n },\n {\n value: \"oauth-proxy\",\n label: \"OAuth Proxy\",\n hint: \"OAuth proxy authentication\",\n },\n {\n value: \"open-api\",\n label: \"Open API\",\n hint: \"OpenAPI authentication support\",\n },\n {\n value: \"jwt\",\n label: \"JWT\",\n hint: \"JWT authentication\",\n },\n {\n value: \"next-cookies\",\n label: \"Next.js Cookies\",\n hint: \"Cookie support for Next.js\",\n },\n ],\n },\n ],\n },\n ],\n setup: async (projectDir: string, config: ProjectSetupConfig) => {\n // we need use better-auth cli to setup the auth\n const command = getPackageManagerCommand(\n config.packageManager,\n \"@better-auth/cli\",\n );\n\n // run the command and wait for it to complete with the options\n const result = await runCommand(\n `${command} generate --config src/lib/auth.ts --yes`,\n {\n cwd: projectDir,\n },\n );\n\n if (result.errorMessage) {\n p.log.error(`Better Auth setup failed: ${result.errorMessage}`);\n }\n },\n },\n ];\n}\n","import type { ProjectSetupConfig } from \"@/commands/init/types\";\nimport { getPackageManagerCommand } from \"@/core/package-manager\";\nimport { BaseAddOn } from \"@/core/registry/add-ons/base-addon\";\nimport { runCommand } from \"@/core/terminal\";\n\nexport class ShadcnAddOn extends BaseAddOn {\n name = \"Shadcn/UI\";\n description = \"Beautifully designed components built with Radix UI and Tailwind CSS.\";\n value = \"shadcn-ui\";\n hint = \"Production-grade UI built on top of Shadcn/UI and Radix primitives\";\n public async runPostInstall(projectDir: string, options: ProjectSetupConfig): Promise<void> {\n const command = getPackageManagerCommand(\n options.packageManager,\n \"shadcn@latest init --base-color zinc --src-dir --silent --yes\",\n );\n await runCommand(`${command}`, { cwd: projectDir });\n }\n}\n","import { AddOnRegistry } from \"@/core/registry/add-ons/add-on-registry\";\nimport { RedisStoreAddOn } from \"./store\";\nimport { JobsAddOn } from \"./jobs\";\nimport { McpServerAddOn } from \"./mcp\";\nimport { LoggingAddOn } from \"./logging\";\nimport { TelemetryAddOn } from \"./telemetry\";\nimport { BotsAddOn } from \"./bots\";\nimport { DatabaseAddOn } from \"./database\";\nimport { AuthAddOn } from \"./auth\";\nimport { ShadcnAddOn } from \"./shadcn\";\n\n/**\n * Add-on registry\n */\nexport const addOnRegistry = AddOnRegistry.create()\n .register(new RedisStoreAddOn())\n .register(new JobsAddOn())\n .register(new McpServerAddOn())\n .register(new LoggingAddOn())\n .register(new TelemetryAddOn())\n .register(new BotsAddOn())\n .register(new DatabaseAddOn())\n .register(new AuthAddOn())\n .register(new ShadcnAddOn())\n .build();\n","import * as fs from 'fs/promises';\n\nexport async function isPathEmpty(path: string): Promise<boolean> {\n try {\n const files = await fs.readdir(path);\n return files.length === 0;\n } catch (error: any) {\n if (error.code === 'ENOENT') {\n return true;\n }\n throw error;\n }\n}","import path from \"path\";\nimport fs from \"fs\";\n\ntype SupportedFramework = 'nextjs' | 'tanstack-start' | 'generic';\n\nexport function detectFramework(projectDir: string): SupportedFramework {\n // Check if the project is a Next.js project\n if (fs.existsSync(path.join(projectDir, 'next.config.js')) || fs.existsSync(path.join(projectDir, 'next.config.ts'))) {\n return 'nextjs';\n }\n\n // Precisa ler o package.json e verificar se tem @tanstack/start\n const packageJson = JSON.parse(fs.readFileSync(path.join(projectDir, 'package.json'), 'utf8'));\n if (packageJson.dependencies['@tanstack/react-start']) {\n return 'tanstack-start';\n } else {\n return 'generic';\n }\n}\n","import * as p from '@clack/prompts';\nimport * as color from 'picocolors';\n\nclass Logger {\n private component: string;\n\n constructor(component: string) {\n this.component = component;\n }\n\n private formatMessage(level: string, message: string, data?: object) {\n const timestamp = new Date().toISOString();\n const componentInfo = this.component ? `[${this.component}] ` : '';\n const dataString = data ? ` ${JSON.stringify(data)}` : '';\n return `${color.dim(timestamp)} ${level} ${componentInfo}${message}${dataString}`;\n }\n\n info(message: string, data?: object) {\n p.log.info(this.formatMessage(color.blue('INFO'), message, data));\n }\n\n warn(message: string, data?: object) {\n p.log.warn(this.formatMessage(color.yellow('WARN'), message, data));\n }\n\n error(message: string, data?: object) {\n p.log.error(this.formatMessage(color.red('ERROR'), message, data));\n }\n\n success(message: string, data?: object) {\n p.log.success(this.formatMessage(color.green('SUCCESS'), message, data));\n }\n}\n\nexport function createLogger(component: string) {\n return new Logger(component);\n}\n","import { ProjectSetupConfig } from \"./types\";\nimport { createLogger } from \"../../core/logger\";\nimport * as p from \"@clack/prompts\";\nimport { execa } from \"execa\";\nimport { getInstallCommand } from \"../../core/package-manager\";\nimport { starterRegistry } from \"@/registry/starters\";\nimport { addOnRegistry } from \"@/registry/add-ons\";\n\nconst logger = createLogger(\"ProjectGenerator\");\n\nexport class ProjectGenerator {\n private config: ProjectSetupConfig;\n private targetDir: string;\n\n constructor(config: ProjectSetupConfig, targetDir: string) {\n this.config = config;\n this.targetDir = targetDir;\n }\n\n public async generate() {\n // 1. Create project structure\n await this.setupProject();\n\n // 2. Apply add-ons (templates, env vars, docker services)\n await this.setupAddOns();\n\n // 3. Install dependencies\n if (this.config.installDependencies) await this.installDependencies();\n\n // 4. Initialize Docker services\n if (this.config.initDocker) await this.setupDocker();\n\n // 5. Initialize Git repository\n if (this.config.initGit) await this.setupGit();\n\n // 6. Run add-on post-install steps LAST (requires deps installed)\n if (this.config.installDependencies) {\n await this.runPostInstallSteps();\n } else {\n p.log.warn(\n \"Skipping add-on post-install steps because dependencies were not installed.\",\n );\n }\n }\n\n private async installDependencies(): Promise<void> {\n const installer = p.spinner();\n\n try {\n installer.start(\"Installing dependencies...\");\n const { command, args } = getInstallCommand(this.config.packageManager);\n await execa(command, args, { cwd: this.targetDir, stdio: \"pipe\" });\n installer.stop(\"Dependencies installed successfully!\");\n } catch (error) {\n installer.stop(\"Failed to install dependencies.\");\n logger.error(\"Dependency installation failed\", { error });\n p.log.warn(\"Please install dependencies manually.\");\n }\n }\n\n private async setupProject(): Promise<void> {\n const starter = this.config.starter\n ? starterRegistry.get(this.config.starter)\n : undefined;\n if (!starter) {\n p.log.error(\"Starter not found\");\n process.exit(1);\n }\n\n const projectGenerator = p.spinner();\n projectGenerator.start(\"Generating project structure...\");\n await starter.install(this.targetDir, this.config);\n projectGenerator.stop(\"Project structure generated successfully!\");\n }\n\n private async setupAddOns(): Promise<void> {\n const selectedAddOns = this.config.addOns || [];\n if (selectedAddOns.length === 0) return;\n\n const addOns = addOnRegistry.getMany(selectedAddOns);\n\n for (const addOn of addOns) {\n const addOnSetup = p.spinner();\n addOnSetup.start(`Setting up ${addOn.name}...`);\n try {\n // runSetup() applies assets (package.json, env, docker, templates)\n await addOn.runSetup(this.targetDir, this.config);\n addOnSetup.stop(`${addOn.name} setup completed!`);\n } catch (error) {\n addOnSetup.stop(`Failed to setup ${addOn.name}.`);\n logger.error(`Add-on setup failed for ${addOn.name}`, { error });\n }\n }\n }\n\n // Run add-on post-install steps after dependencies are installed\n private async runPostInstallSteps(): Promise<void> {\n const selectedAddOns = this.config.addOns || [];\n if (selectedAddOns.length === 0) return;\n\n const addOns = addOnRegistry.getMany(selectedAddOns);\n\n for (const addOn of addOns) {\n const setupSpinner = p.spinner();\n setupSpinner.start(`Running post-install steps for ${addOn.name}...`);\n try {\n await addOn.runPostInstall(this.targetDir, this.config);\n setupSpinner.stop(`${addOn.name} post-install steps completed!`);\n } catch (error) {\n setupSpinner.stop(`Failed to run post-install steps for ${addOn.name}.`);\n logger.error(`Add-on post-install steps failed for ${addOn.name}`, { error });\n }\n }\n }\n\n private async setupGit(): Promise<void> {\n const gitSetup = p.spinner();\n gitSetup.start(\"Initializing Git repository...\");\n try {\n await execa(\"git\", [\"init\"], { cwd: this.targetDir });\n await execa(\"git\", [\"add\", \".\"], { cwd: this.targetDir });\n await execa(\n \"git\",\n [\"commit\", \"-m\", \"Initial commit from Igniter.js CLI\"],\n { cwd: this.targetDir },\n );\n gitSetup.stop(\"Git repository initialized successfully!\");\n } catch (error) {\n gitSetup.stop(\n \"Failed to initialize Git repository. Please initialize it manually.\",\n );\n }\n }\n\n private async setupDocker(): Promise<void> {\n const dockerSetup = p.spinner();\n dockerSetup.start(\"Initializing Docker services...\");\n try {\n // 1. Stop all running docker containers\n await execa(\"docker\", [\n \"container\",\n \"stop\",\n ...(await execa(\"docker\", [\"ps\", \"-q\"])).stdout\n .split(\"\\n\")\n .filter(Boolean),\n ]);\n dockerSetup.message(\n `Checking and stopping currently running containers...`,\n );\n\n // 2. Find all ports used in docker-compose.yml\n const fs = await import(\"fs/promises\");\n const path = await import(\"path\");\n const yaml = await import(\"js-yaml\");\n\n const composeFilePath = path.join(this.targetDir, \"docker-compose.yml\");\n let ports: number[] = [];\n\n try {\n const composeContent = await fs.readFile(composeFilePath, \"utf8\");\n const doc = yaml.load(composeContent) as any;\n\n const services = doc?.services || {};\n for (const svcKey of Object.keys(services)) {\n const service = services[svcKey];\n const svcPorts = service.ports || [];\n for (const portMapping of svcPorts) {\n // Supports formats like '3000:3000' and '3000'\n const [hostPortStr] = String(portMapping).split(\":\");\n const hostPort = parseInt(hostPortStr, 10);\n if (!isNaN(hostPort)) ports.push(hostPort);\n }\n }\n dockerSetup.message(`Found ${ports.length} ports to check.`);\n } catch (err) {\n dockerSetup.stop(\n \"Failed to read docker-compose.yml. Maybe you are not using Docker Compose?\",\n );\n }\n\n // 3. Try to kill any processes listening on those ports\n if (ports.length > 0) {\n for (const port of ports) {\n try {\n // Cross-platform port killing\n if (process.platform === \"win32\") {\n // Windows: find PID with netstat and kill with taskkill\n const { stdout } = await execa(\"netstat\", [\"-ano\", \"-p\", \"tcp\"]);\n const lines = stdout.split(\"\\n\");\n const matching = lines.find(\n (line) =>\n line.includes(`:${port} `) &&\n line.trim().endsWith(\"LISTENING\"),\n );\n if (matching) {\n const parts = matching.trim().split(/\\s+/);\n const pid = parts[parts.length - 1];\n if (pid && pid !== \"0\") {\n await execa(\"taskkill\", [\"/PID\", pid, \"/F\"]);\n }\n }\n } else {\n // Unix (Linux/macOS): find PID with lsof or fuser and kill\n try {\n const { stdout } = await execa(\"lsof\", [\"-ti\", `tcp:${port}`]);\n const pids = stdout.split(\"\\n\").filter(Boolean);\n for (const pid of pids) {\n await execa(\"kill\", [\"-9\", pid]);\n }\n } catch {\n // If lsof not available, fallback to fuser\n try {\n await execa(\"fuser\", [\"-k\", \"-n\", \"tcp\", `${port}`]);\n } catch {}\n }\n }\n dockerSetup.message(`Port ${port} freed successfully.`);\n } catch (e) {\n dockerSetup.stop(\n `Could not free port ${port}. Please free it manually.`,\n );\n }\n }\n }\n\n await execa(\"docker-compose\", [\"up\", \"-d\"], { cwd: this.targetDir });\n dockerSetup.stop(\"Docker services initialized successfully!\");\n } catch (error) {\n dockerSetup.stop(\n \"Failed to initialize Docker services. Please initialize it manually.\",\n );\n }\n }\n}\n","import { Command } from 'commander';\nimport { featureCommand } from './feature';\nimport { docsCommand } from './docs';\nimport { schemaCommand } from './schema';\nimport { controllerCommand } from './controller';\nimport { procedureCommand } from './procedure';\n\nexport const generateCommand = new Command()\n .command('generate')\n .description('Scaffold new features or generate client schema')\n .addCommand(featureCommand)\n .addCommand(controllerCommand)\n .addCommand(procedureCommand)\n .addCommand(docsCommand)\n .addCommand(schemaCommand);\n","import { Command } from 'commander';\nimport { handleGenerateFeatureAction } from './action';\n\nexport const featureCommand = new Command()\n .command('feature')\n .description('Scaffold a new feature module')\n .argument('[name]', 'The name of the feature (e.g., \"user\", \"products\")')\n .option('--schema <value>', 'Generate from a schema provider (e.g., \"prisma:User\")')\n .option('--schema-path <path>', 'Custom schema path for the selected provider')\n .action(handleGenerateFeatureAction);\n","import * as path from \"path\";\nimport * as p from \"@clack/prompts\";\nimport { existsSync } from \"fs\";\nimport { writeFile } from \"fs/promises\";\nimport { TemplateEngine } from \"@/core/template-engine\";\nimport { FeatureWorkspace } from \"./feature\";\nimport { FeaturePrompts } from \"./prompts\";\nimport { schemaProviderRegistry } from \"@/registry/schema-provider\";\nimport { Casing } from \"@/utils/casing\";\nimport type { SchemaProvider, SchemaProviderSelection } from \"@/core/registry/schema-provider/base-schema-provider\";\nimport type { SchemaProviderRegistry } from \"@/core/registry/schema-provider/schema-provider-registry\";\n\ninterface GenerateOptions {\n schema?: string;\n schemaPath?: string;\n}\n\nfunction cancelOperation(message: string): never {\n p.cancel(message);\n process.exit(0);\n}\n\nexport async function handleGenerateFeatureAction(\n name: string | undefined,\n options: GenerateOptions,\n): Promise<void> {\n p.intro(\"Generate Feature\");\n\n const templateEngine = TemplateEngine.create();\n \n const { provider, selection } = await resolveSchemaProvider({\n registry: schemaProviderRegistry,\n options,\n cancel: cancelOperation,\n });\n\n let featureInput = name\n\n if (!featureInput) {\n featureInput = await FeaturePrompts.askForFeatureName(\"Feature generation cancelled.\", selection?.modelName);\n }\n\n const featureSlug = Casing.toKebabCase(featureInput);\n const featureDir = FeatureWorkspace.featureDir(featureSlug);\n\n if (existsSync(featureDir)) {\n p.log.error(\n `Feature '${featureSlug}' already exists at ${path.relative(process.cwd(), featureDir)}.`,\n );\n p.outro(\"Nothing to do.\");\n process.exit(1);\n }\n\n const spinner = p.spinner();\n spinner.start(`Scaffolding feature '${featureSlug}'...`);\n\n try {\n if (provider && selection) {\n await FeatureWorkspace.ensureStructure(featureDir);\n\n await provider.generateFeature(selection, {\n featureName: featureSlug,\n featureDir,\n templateEngine,\n });\n } else {\n await FeatureWorkspace.ensureStructure(featureDir);\n\n await generateEmptyFeature(featureSlug, featureDir, templateEngine);\n }\n\n spinner.stop(`Feature '${featureSlug}' created successfully!`);\n p.log.success(\n `Scaffolded feature '${featureSlug}'. Remember to register the controller in your router.`,\n );\n p.outro(\"Feature generation complete!\");\n } catch (error) {\n spinner.stop(\"Failed to scaffold the feature.\");\n const message = error instanceof Error ? error.message : String(error);\n p.log.error(`Feature generation failed: ${message}`);\n process.exit(1);\n }\n}\n\nasync function resolveSchemaProvider({\n registry,\n options,\n cancel,\n}: {\n registry: SchemaProviderRegistry;\n options: GenerateOptions;\n cancel: (message: string) => never;\n}): Promise<{\n provider: SchemaProvider | null;\n selection: SchemaProviderSelection | null;\n}> {\n if (options.schema) {\n const provider = registry.findBySchemaOption(options.schema);\n if (!provider) {\n throw new Error(\n `No registered schema provider can handle '${options.schema}'.`,\n );\n }\n \n const selection = provider.parseSchemaOption(options.schema, {\n schemaPath: options.schemaPath,\n });\n\n await provider.validateSelection(selection);\n return { provider, selection };\n }\n\n const availableProviders = await registry.detectAvailableProviders({\n schemaPath: options.schemaPath,\n });\n\n if (availableProviders.length === 0) {\n return { provider: null, selection: null };\n }\n\n const choice = await p.select({\n message: \"Generate from an available schema provider?\",\n options: [\n { value: \"none\", label: \"No, create an empty feature\" },\n ...availableProviders.map((provider) => ({\n value: provider.id,\n label: provider.name,\n })),\n ],\n initialValue: \"none\",\n });\n\n if (p.isCancel(choice)) {\n cancel(\"Feature generation cancelled.\");\n }\n\n if (choice === \"none\") {\n return { provider: null, selection: null };\n }\n\n const provider = registry.get(String(choice));\n if (!provider) {\n throw new Error(`Schema provider '${String(choice)}' is not registered.`);\n }\n\n const schemaPath = provider.resolveSchemaPath(options.schemaPath);\n\n const selection = await provider.listModels(schemaPath);\n if (selection.length === 0) {\n return { provider: null, selection: null };\n }\n \n const modelChoice = await p.select({\n message: \"Which model would you like to scaffold?\",\n options: selection.map((model) => ({ value: model, label: model })),\n initialValue: selection[0],\n });\n\n return { provider, selection: { providerId: provider.id, modelName: String(modelChoice), schemaPath: schemaPath } };\n}\n\nasync function generateEmptyFeature(\n featureSlug: string,\n featureDir: string,\n templateEngine: TemplateEngine,\n): Promise<void> {\n const controllerTemplate = templateEngine.resolvePath(\n \"generate\",\n \"feature\",\n \"empty.controller.hbs\",\n );\n const interfacesTemplate = templateEngine.resolvePath(\n \"generate\",\n \"feature\",\n \"empty.interfaces.hbs\",\n );\n\n const controllerExport = `${Casing.toPascalCase(featureSlug)}Controller`;\n const controllerDisplayName = Casing.toPascalCase(featureSlug);\n\n await templateEngine.renderToFile(\n controllerTemplate,\n {\n controllerExport,\n controllerDisplayName,\n controllerRoute: featureSlug,\n },\n path.join(featureDir, \"controllers\", `${featureSlug}.controller.ts`),\n );\n\n await templateEngine.renderToFile(\n interfacesTemplate,\n { featureName: Casing.toPascalCase(featureSlug) },\n path.join(featureDir, `${featureSlug}.interfaces.ts`),\n );\n \n await writeFile(path.join(featureDir, \"procedures\", \".gitkeep\"), \"\");\n}\n","import { mkdirSync, existsSync } from \"fs\";\nimport { readFile, writeFile } from \"fs/promises\";\nimport * as path from \"path\";\nimport * as handlebars from \"handlebars\";\nimport { fileURLToPath } from \"url\";\nimport { registerHandlebarsHelpers } from \"./handlebars-helpers\";\n\nconst __filename = fileURLToPath(import.meta?.url);\nconst __dirname = path.dirname(__filename);\n\n/**\n * Abstract template engine used to render Handlebars templates within the CLI.\n * Concrete implementations can customise discovery or rendering behaviour while\n * callers depend on the abstract API only.\n */\nexport abstract class TemplateEngine {\n protected constructor() {}\n\n /**\n * Creates the default template engine.\n */\n public static create(): TemplateEngine {\n return new DefaultTemplateEngine();\n }\n\n /**\n * Resolves a template path relative to the CLI template root.\n */\n public abstract resolvePath(...segments: string[]): string;\n\n /**\n * Renders a template and returns its content as a string.\n */\n public abstract render(\n templatePath: string,\n context: Record<string, unknown>,\n ): Promise<string>;\n\n /**\n * Renders a template and writes the result to the provided output path.\n */\n public abstract renderToFile(\n templatePath: string,\n context: Record<string, unknown>,\n outputPath: string,\n ): Promise<void>;\n}\n\nclass DefaultTemplateEngine extends TemplateEngine {\n private readonly templateRoot: string;\n private helpersRegistered = false;\n\n private static readonly TEMPLATE_CANDIDATES = [\n path.resolve(__dirname, \"..\", \"..\", \"templates\"),\n path.resolve(__dirname, \"..\", \"..\", \"..\", \"templates\"),\n path.resolve(__dirname, \"..\", \"templates\"),\n path.resolve(__dirname, \"..\", \"..\", \"..\", \"templates\"),\n path.resolve(\n process.cwd(),\n \"node_modules\",\n \"@igniter-js\",\n \"new-cli\",\n \"templates\",\n ),\n path.resolve(process.cwd(), \"templates\"),\n ];\n\n constructor() {\n super();\n this.templateRoot = this.resolveTemplateRoot();\n }\n\n public resolvePath(...segments: string[]): string {\n return path.join(this.templateRoot, ...segments);\n }\n\n public async render(\n templatePath: string,\n context: Record<string, unknown>,\n ): Promise<string> {\n this.ensureHelpersRegistered();\n const templateContent = await readFile(templatePath, \"utf-8\");\n const compiled = handlebars.compile(templateContent);\n return compiled(context);\n }\n\n public async renderToFile(\n templatePath: string,\n context: Record<string, unknown>,\n outputPath: string,\n ): Promise<void> {\n const rendered = await this.render(templatePath, context);\n const outputDir = path.dirname(outputPath);\n if (!existsSync(outputDir)) {\n mkdirSync(outputDir, { recursive: true });\n }\n await writeFile(outputPath, rendered, \"utf-8\");\n }\n\n private resolveTemplateRoot(): string {\n for (const candidate of DefaultTemplateEngine.TEMPLATE_CANDIDATES) {\n if (existsSync(candidate)) {\n return candidate;\n }\n }\n\n throw new Error(\n [\n \"Could not locate the CLI templates directory.\",\n \"Looked in the following locations:\",\n ...DefaultTemplateEngine.TEMPLATE_CANDIDATES.map(\n (candidate) => `- ${candidate}`,\n ),\n ].join(\"\\n\"),\n );\n }\n\n private ensureHelpersRegistered(): void {\n if (!this.helpersRegistered) {\n registerHandlebarsHelpers();\n this.helpersRegistered = true;\n }\n }\n}\n","import { mkdir, readdir, stat, writeFile } from \"fs/promises\";\nimport * as path from \"path\";\n\n/**\n * Utility helpers for working with feature directories. The class is abstract\n * to make it non-instantiable while still grouping the behaviour in a single\n * namespace.\n */\nexport abstract class FeatureWorkspace {\n protected constructor() {\n // Static utility class – no instances allowed.\n }\n\n /**\n * Returns the absolute path to the feature root directory.\n */\n public static root(): string {\n return path.join(process.cwd(), \"src\", \"features\");\n }\n\n /**\n * Returns the absolute path for a specific feature name.\n */\n public static featureDir(featureName: string): string {\n return path.join(this.root(), featureName);\n }\n\n /**\n * Ensures that the directory structure required for a feature exists.\n */\n public static async ensureStructure(featureDir: string): Promise<void> {\n await mkdir(featureDir, { recursive: true });\n await mkdir(path.join(featureDir, \"controllers\"), { recursive: true });\n await mkdir(path.join(featureDir, \"procedures\"), { recursive: true });\n await mkdir(path.join(featureDir, \"presentation\"), { recursive: true });\n await mkdir(path.join(featureDir, \"presentation\", \"components\"), { recursive: true });\n await writeFile(path.join(featureDir, \"presentation\", \"components\", \".gitkeep\"), \"\");\n await mkdir(path.join(featureDir, \"presentation\", \"hooks\"), { recursive: true });\n await writeFile(path.join(featureDir, \"presentation\", \"hooks\", \".gitkeep\"), \"\");\n await mkdir(path.join(featureDir, \"presentation\", \"contexts\"), { recursive: true });\n await writeFile(path.join(featureDir, \"presentation\", \"contexts\", \".gitkeep\"), \"\");\n await mkdir(path.join(featureDir, \"presentation\", \"utils\"), { recursive: true });\n await writeFile(path.join(featureDir, \"presentation\", \"utils\", \".gitkeep\"), \"\");\n }\n\n /**\n * Lists all available feature directories under `src/features`.\n */\n public static async listFeatures(): Promise<string[]> {\n try {\n const entries = await readdir(this.root(), { withFileTypes: true });\n return entries\n .filter((entry) => entry.isDirectory())\n .map((entry) => entry.name)\n .sort();\n } catch {\n return [];\n }\n }\n\n /**\n * Checks if the provided path exists and corresponds to a file.\n */\n public static async fileExists(filePath: string): Promise<boolean> {\n try {\n const fileStat = await stat(filePath);\n return fileStat.isFile();\n } catch {\n return false;\n }\n }\n}\n","import * as p from \"@clack/prompts\";\nimport { FeatureWorkspace } from \"./feature\";\n\n/**\n * Encapsulates all interactive prompts required for feature generation.\n */\nexport abstract class FeaturePrompts {\n protected constructor() {}\n\n /**\n * Asks the user to confirm or supply a feature name.\n */\n public static async askForFeatureName(cancelMessage: string, initial?: string): Promise<string> {\n return this.askForEntityName({\n message: \"What is the name of your feature?\",\n placeholder: initial || \"users\",\n cancelMessage,\n });\n }\n\n /**\n * Resolves the feature slug either from user input or from available features.\n */\n public static async resolveFeatureSlug(\n cancelMessage: string,\n initial?: string,\n ): Promise<string> {\n if (initial) {\n const validation = this.validateSlug(initial);\n if (validation === true) {\n return initial.trim().toLowerCase();\n }\n throw new Error(typeof validation === \"string\" ? validation : \"Invalid feature name.\");\n }\n\n const existing = await FeatureWorkspace.listFeatures();\n if (existing.length === 0) {\n return this.askForFeatureName(cancelMessage);\n }\n\n const selection = await p.select({\n message: \"Select the target feature:\",\n options: [\n ...existing.map((feature) => ({\n label: feature,\n value: feature,\n })),\n { label: \"Create a new feature\", value: \"__new__\" },\n ],\n initialValue: existing[0],\n });\n\n if (p.isCancel(selection)) {\n this.cancel(cancelMessage);\n }\n\n if (selection === \"__new__\") {\n return this.askForFeatureName(cancelMessage);\n }\n\n return String(selection);\n }\n\n /**\n * Generic helper for asking an entity name while applying the standard validation.\n */\n public static async askForEntityName({\n message,\n placeholder,\n cancelMessage,\n }: {\n message: string;\n placeholder: string;\n cancelMessage: string;\n }): Promise<string> {\n const response = await p.text({\n message,\n placeholder,\n validate: (value) => {\n const validation = this.validateSlug(value);\n if (validation === true) {\n return undefined;\n }\n return validation;\n },\n });\n\n if (p.isCancel(response)) {\n this.cancel(cancelMessage);\n }\n\n return String(response).trim();\n }\n\n private static validateSlug(value: string | undefined): true | string {\n if (!value || !value.trim()) {\n return \"A value is required.\";\n }\n if (!/^[a-zA-Z][a-zA-Z0-9-_]*$/.test(value.trim())) {\n return \"Use letters, numbers, hyphens, and underscores only (must start with a letter).\";\n }\n return true;\n }\n\n private static cancel(message: string): never {\n p.cancel(message);\n process.exit(0);\n }\n}\n","import type {\n SchemaProvider,\n SchemaProviderOptions,\n} from \"./base-schema-provider\";\n\nclass SchemaProviderRegistry {\n private readonly providers: Map<string, SchemaProvider>;\n\n constructor(providers: SchemaProvider[]) {\n this.providers = new Map(\n providers.map((provider) => [provider.id, provider]),\n );\n }\n\n public static create(): SchemaProviderRegistryBuilder {\n return new SchemaProviderRegistryBuilder();\n }\n\n public list(): SchemaProvider[] {\n return Array.from(this.providers.values());\n }\n\n public get(id: string): SchemaProvider | undefined {\n return this.providers.get(id);\n }\n\n public findBySchemaOption(option: string): SchemaProvider | undefined {\n return this.list().find((provider) => provider.matchesSchemaOption(option));\n }\n\n public async detectAvailableProviders(\n options: SchemaProviderOptions = {},\n ): Promise<SchemaProvider[]> {\n const results: SchemaProvider[] = [];\n for (const provider of this.list()) {\n if (await provider.isAvailable(options)) {\n results.push(provider);\n }\n }\n return results;\n }\n}\n\nclass SchemaProviderRegistryBuilder {\n private readonly providers: SchemaProvider[] = [];\n\n public register(provider: SchemaProvider): this {\n this.providers.push(provider);\n return this;\n }\n\n public build(): SchemaProviderRegistry {\n return new SchemaProviderRegistry(this.providers);\n }\n}\n\nexport { SchemaProviderRegistry, SchemaProviderRegistryBuilder };\n","import { getSchema, Model, Field, Attribute, Func } from \"@mrleebo/prisma-ast\";\nimport * as fs from \"fs/promises\";\nimport * as path from \"path\";\nimport { SchemaProvider, SchemaProviderSelection, SchemaGenerationContext } from \"@/core/registry/schema-provider/base-schema-provider\";\nimport { Casing } from \"@/utils/casing\";\nimport { FeatureWorkspace } from \"../../commands/generate/feature/feature\";\n\ninterface PrismaField {\n name: string;\n type: string;\n isRelation: boolean;\n isId: boolean;\n isOptional: boolean;\n hasDefault: boolean;\n isAutoGenerated: boolean;\n}\n\nexport class PrismaSchemaProvider extends SchemaProvider {\n public readonly id = \"prisma\";\n public readonly name = \"Prisma\";\n public readonly defaultSchemaPath = path.join(process.cwd(), \"prisma\", \"schema.prisma\");\n\n public async validateSchemaPath(schemaPath: string): Promise<void> {\n try {\n const stat = await fs.stat(schemaPath);\n if (!stat.isFile()) {\n throw new Error();\n }\n } catch {\n throw new Error(`Prisma schema not found at '${schemaPath}'.`);\n }\n }\n\n public async listModels(schemaPath: string): Promise<string[]> {\n const content = await fs.readFile(schemaPath, \"utf-8\");\n const ast = getSchema(content);\n\n return ast.list\n .filter((node): node is Model => node.type === \"model\")\n .map((model) => model.name)\n .sort();\n }\n\n public async generateFeature(\n selection: SchemaProviderSelection,\n context: SchemaGenerationContext,\n ): Promise<void> {\n await this.validateSelection(selection);\n\n const schemaContent = await fs.readFile(selection.schemaPath, \"utf-8\");\n const ast = getSchema(schemaContent);\n const model = ast.list.find(\n (node): node is Model => node.type === \"model\" && node.name === selection.modelName,\n );\n\n if (!model) {\n throw new Error(`Model '${selection.modelName}' not found in Prisma schema.`);\n }\n\n const modelFields = this.extractFields(model);\n const target = this.buildNaming(selection.modelName, context.featureName);\n\n await this.ensurePathsAreFree(context.featureDir, context.featureName);\n\n const interfacesTemplate = context.templateEngine.resolvePath(\n \"generate\",\n \"feature\",\n \"schema.interfaces.hbs\",\n );\n const procedureTemplate = context.templateEngine.resolvePath(\n \"generate\",\n \"feature\",\n \"schema.procedure.hbs\",\n );\n const controllerTemplate = context.templateEngine.resolvePath(\n \"generate\",\n \"feature\",\n \"schema.controller.hbs\",\n );\n\n await context.templateEngine.renderToFile(\n interfacesTemplate,\n {\n modelName: target.modelNamePascal,\n fields: modelFields\n .filter((field) => !field.isRelation)\n .map((field) => ({\n name: field.name,\n zodType: this.getZodType(field.type, field.isOptional),\n })),\n createOmitFields: modelFields\n .filter((field) => field.isId || field.isAutoGenerated || field.hasDefault)\n .map((field) => field.name),\n },\n path.join(context.featureDir, `${context.featureName}.interfaces.ts`),\n );\n\n await context.templateEngine.renderToFile(\n procedureTemplate,\n {\n modelName: target.modelNamePascal,\n procedureExport: target.procedureExport,\n procedureDisplayName: `${target.modelNamePascal} Procedure`,\n prismaDelegate: target.prismaDelegate,\n featureName: context.featureName,\n idType: this.mapIdType(modelFields),\n },\n path.join(context.featureDir, \"procedures\", `${context.featureName}.procedure.ts`),\n );\n\n await context.templateEngine.renderToFile(\n controllerTemplate,\n {\n controllerExport: target.controllerExport,\n controllerDisplayName: `${target.modelNamePascal} Controller`,\n modelName: target.modelNamePascal,\n modelNamePlural: target.modelNamePlural,\n resourcePath: target.resourcePath,\n idZodType: this.getIdZodType(modelFields),\n featureName: context.featureName,\n procedureExport: target.procedureExport,\n },\n path.join(context.featureDir, \"controllers\", `${context.featureName}.controller.ts`),\n );\n }\n\n private extractFields(model: Model): PrismaField[] {\n return model.properties\n .filter((property): property is Field => property.type === \"field\")\n .map((property) => {\n // Extract field type: can be string or Func\n const fieldTypeStr = typeof property.fieldType === \"string\"\n ? property.fieldType\n : property.fieldType.type === \"function\"\n ? property.fieldType.name\n : \"string\";\n \n return {\n name: property.name,\n type: this.mapPrismaType(fieldTypeStr),\n isRelation: this.isRelation(fieldTypeStr),\n isId: this.hasAttribute(property, \"id\"),\n isOptional: Boolean(property.optional),\n hasDefault: this.hasAttribute(property, \"default\"),\n isAutoGenerated: this.isAutoGenerated(property),\n };\n });\n }\n\n private buildNaming(modelName: string, featureName: string) {\n const modelNamePascal = Casing.toPascalCase(modelName);\n return {\n modelNamePascal,\n modelNamePlural: Casing.pluralize(modelNamePascal),\n controllerExport: `${modelNamePascal}Controller`,\n procedureExport: `${Casing.toCamelCase(modelNamePascal)}`,\n resourcePath: Casing.pluralize(Casing.toCamelCase(modelName)),\n prismaDelegate: Casing.toCamelCase(modelName),\n };\n }\n\n private async ensurePathsAreFree(\n featureDir: string,\n featureSlug: string,\n ): Promise<void> {\n const filesToCheck = [\n path.join(featureDir, \"controllers\", `${featureSlug}.controller.ts`),\n path.join(featureDir, \"procedures\", `${featureSlug}.procedure.ts`),\n path.join(featureDir, `${featureSlug}.interfaces.ts`),\n ];\n\n for (const file of filesToCheck) {\n if (await FeatureWorkspace.fileExists(file)) {\n throw new Error(`File '${path.relative(process.cwd(), file)}' already exists.`);\n }\n }\n }\n\n private mapPrismaType(type: string): string {\n const cleanType = type.replace(/\\?$/, \"\");\n switch (cleanType) {\n case \"String\":\n case \"Json\":\n case \"Bytes\":\n case \"Unsupported\":\n return \"string\";\n case \"BigInt\":\n return \"bigint\";\n case \"Int\":\n case \"Float\":\n case \"Decimal\":\n return \"number\";\n case \"Boolean\":\n return \"boolean\";\n case \"DateTime\":\n return \"Date\";\n default:\n return \"string\";\n }\n }\n\n private getZodType(type: string, optional: boolean): string {\n let base: string;\n switch (type) {\n case \"string\":\n base = \"z.string()\";\n break;\n case \"number\":\n base = \"z.number()\";\n break;\n case \"boolean\":\n base = \"z.boolean()\";\n break;\n case \"Date\":\n base = \"z.date()\";\n break;\n case \"bigint\":\n base = \"z.bigint()\";\n break;\n default:\n base = \"z.any()\";\n }\n return optional ? `${base}.nullable()` : base;\n }\n\n private getIdZodType(fields: PrismaField[]): string {\n const idField = fields.find((field) => field.isId);\n if (!idField) {\n return \"z.string()\";\n }\n if (idField.type === \"number\") {\n return \"z.coerce.number()\";\n }\n if (idField.type === \"bigint\") {\n return \"z.coerce.bigint()\";\n }\n return \"z.string()\";\n }\n\n private mapIdType(fields: PrismaField[]): string {\n const idField = fields.find((field) => field.isId);\n if (!idField) {\n return \"string\";\n }\n return idField.type;\n }\n\n private hasAttribute(property: Field, attributeName: string): boolean {\n if (!property.attributes || !Array.isArray(property.attributes)) {\n return false;\n }\n return property.attributes.some((attribute: Attribute) => attribute.name === attributeName);\n }\n\n private isAutoGenerated(property: Field): boolean {\n if (!property.attributes || !Array.isArray(property.attributes)) {\n return false;\n }\n const defaultAttribute = property.attributes.find(\n (attribute: Attribute) => attribute.name === \"default\",\n );\n if (!defaultAttribute || !defaultAttribute.args || !Array.isArray(defaultAttribute.args)) {\n return false;\n }\n const firstArg = defaultAttribute.args[0];\n if (!firstArg) {\n return false;\n }\n \n // Check if the argument value is a function call (Func type)\n if (\n firstArg.value &&\n typeof firstArg.value === \"object\" &&\n \"type\" in firstArg.value &&\n firstArg.value.type === \"function\"\n ) {\n const funcValue = firstArg.value as Func;\n return [\"autoincrement\", \"now\", \"cuid\", \"uuid\"].includes(funcValue.name);\n }\n \n // Check if it's a string value (for legacy format)\n if (typeof firstArg.value === \"string\") {\n return [\"autoincrement()\", \"now()\", \"cuid()\", \"uuid()\"].includes(firstArg.value);\n }\n \n return false;\n }\n\n private isRelation(type: string): boolean {\n return /^[A-Z]/.test(type) && ![\"String\", \"Int\", \"Boolean\", \"DateTime\", \"Float\", \"Decimal\", \"BigInt\", \"Json\", \"Bytes\"].includes(type);\n }\n}\n","import type { TemplateEngine } from \"@/core/template-engine\";\n\nexport interface SchemaProviderOptions {\n schemaPath?: string;\n}\n\nexport interface SchemaPromptContext extends SchemaProviderOptions {\n cancel: (message: string) => never;\n}\n\nexport interface SchemaProviderSelection {\n providerId: string;\n modelName: string;\n schemaPath: string;\n}\n\nexport interface SchemaGenerationContext {\n featureName: string;\n featureDir: string;\n templateEngine: TemplateEngine;\n}\n\n/**\n * Base class for schema-aware feature generators. Providers are responsible for\n * validating their schema sources, collecting interactive input (when needed),\n * and generating feature files.\n */\nexport abstract class SchemaProvider {\n public abstract readonly id: string;\n public abstract readonly name: string;\n public abstract readonly defaultSchemaPath: string;\n\n public matchesSchemaOption(option: string): boolean {\n return option.startsWith(`${this.id}:`);\n }\n\n public parseSchemaOption(\n option: string,\n options: SchemaProviderOptions = {},\n ): SchemaProviderSelection {\n if (!this.matchesSchemaOption(option)) {\n throw new Error(\n `Schema option '${option}' does not match provider '${this.id}'.`,\n );\n }\n\n const [, rawModel] = option.split(\":\");\n if (!rawModel || !rawModel.trim()) {\n throw new Error(\n `Missing model name in schema option '${option}'. Use the format '${this.id}:ModelName'.`,\n );\n }\n\n return {\n providerId: this.id,\n modelName: rawModel.trim(),\n schemaPath: this.resolveSchemaPath(options.schemaPath),\n };\n }\n\n public resolveSchemaPath(schemaPath?: string): string {\n return schemaPath ?? this.defaultSchemaPath;\n }\n\n public async isAvailable(options: SchemaProviderOptions = {}): Promise<boolean> {\n try {\n await this.validateSchemaPath(this.resolveSchemaPath(options.schemaPath));\n return true;\n } catch {\n return false;\n }\n }\n\n public async validateSelection(\n selection: SchemaProviderSelection,\n ): Promise<void> {\n await this.validateSchemaPath(selection.schemaPath);\n const models = await this.listModels(selection.schemaPath);\n if (!models.includes(selection.modelName)) {\n throw new Error(\n `Model '${selection.modelName}' not found for provider '${this.name}'.`,\n );\n }\n }\n\n public async promptForSelection(\n _context: SchemaPromptContext,\n ): Promise<SchemaProviderSelection | null> {\n return null;\n }\n\n public abstract validateSchemaPath(schemaPath?: string): Promise<void>;\n\n public abstract listModels(schemaPath?: string): Promise<string[]>;\n\n public abstract generateFeature(\n selection: SchemaProviderSelection,\n context: SchemaGenerationContext,\n ): Promise<void>;\n}\n","/**\n * Helper for converting strings between different naming conventions.\n * Abstract to signal that it groups static helpers only.\n */\nexport abstract class Casing {\n protected constructor() {}\n\n public static toKebabCase(value: string): string {\n return value\n .replace(/([a-z0-9])([A-Z])/g, \"$1-$2\")\n .replace(/[\\s_]+/g, \"-\")\n .replace(/-+/g, \"-\")\n .toLowerCase();\n }\n\n public static toPascalCase(value: string): string {\n return this.toKebabCase(value)\n .split(\"-\")\n .filter(Boolean)\n .map((segment) => segment.charAt(0).toUpperCase() + segment.slice(1))\n .join(\"\");\n }\n\n public static toCamelCase(value: string): string {\n const pascal = this.toPascalCase(value);\n return pascal.charAt(0).toLowerCase() + pascal.slice(1);\n }\n\n public static pluralize(value: string): string {\n if (value.endsWith(\"s\")) {\n return value;\n }\n if (value.endsWith(\"y\") && !/[aeiou]y$/.test(value)) {\n return `${value.slice(0, -1)}ies`;\n }\n return `${value}s`;\n }\n}\n","import { SchemaProviderRegistry } from \"@/core/registry/schema-provider/schema-provider-registry\";\nimport { PrismaSchemaProvider } from \"./prisma\";\n\nexport const schemaProviderRegistry = SchemaProviderRegistry.create().register(new PrismaSchemaProvider()).build();","import { Command } from 'commander';\nimport { handleGenerateDocsAction } from './action';\n\nexport const docsCommand = new Command()\n .command('docs')\n .description('Generate OpenAPI specification')\n .option('--router <path>', 'Path to the router file', 'src/igniter.router.ts')\n .option('--output <dir>', 'Output directory for the OpenAPI spec', './src/docs')\n .action(handleGenerateDocsAction);\n","import type { IntrospectedRouter } from \"./router-instrospector\";\n\ntype OpenApiV3Document = Record<string, any>;\n\n// Local minimal DocsConfig type to avoid cross-package type resolution issues during CLI build/testing\nexport interface DocsConfig {\n info?: { title?: string; version?: string; description?: string };\n servers?: Array<{ url: string; description?: string }>;\n securitySchemes?: Record<string, any>;\n playground?: any;\n filepath?: string;\n}\n\nfunction toPascalCase(str: string): string {\n if (!str) return '';\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\nexport class OpenAPIGenerator {\n private docsConfig: DocsConfig;\n private schemas: Record<string, any> = {};\n\n private constructor(config: DocsConfig) {\n this.docsConfig = config || {};\n }\n\n static create(config: DocsConfig): OpenAPIGenerator {\n return new OpenAPIGenerator(config);\n }\n\n public generate(router: IntrospectedRouter): OpenApiV3Document {\n const servers = (this.docsConfig.servers && this.docsConfig.servers.length > 0)\n ? this.docsConfig.servers\n : [{ url: 'http://localhost:3000/api/v1', description: 'Default server' }];\n\n const spec: OpenApiV3Document = {\n openapi: '3.0.0',\n info: this.docsConfig.info || { title: 'Igniter API', version: '1.0.0' },\n servers,\n tags: this.buildTags(router),\n paths: this.buildPaths(router),\n components: {\n schemas: this.schemas,\n securitySchemes: this.docsConfig.securitySchemes || {},\n },\n };\n return spec;\n }\n\n private buildTags(router: IntrospectedRouter): any[] {\n const tags: any[] = [];\n for (const [controllerKey, controller] of Object.entries(router.controllers)) {\n const tag = {\n name: controller.name || controllerKey,\n description: controller.description,\n };\n tags.push(tag);\n }\n return tags;\n }\n\n private buildPaths(router: IntrospectedRouter): Record<string, any> {\n const paths: Record<string, any> = {};\n for (const [controllerKey, controller] of Object.entries(router.controllers)) {\n for (const [actionKey, action] of Object.entries(controller.actions)) {\n const actionName = action.name || actionKey;\n let path = `/${controller.path}/${action.path}`;\n path = path.replace(/\\/{2,}/g, '/');\n if (path.length > 1 && path.endsWith('/')) {\n path = path.slice(0, -1);\n }\n\n if (!paths[path]) {\n paths[path] = {};\n }\n\n const operation: Record<string, any> = {\n summary: action.description || actionName,\n operationId: actionName,\n tags: [controller.name || controllerKey],\n parameters: [],\n requestBody: undefined,\n responses: {\n '200': {\n description: 'Success',\n content: {\n 'application/json': {\n schema: {},\n },\n },\n },\n },\n };\n\n const pathParams = action.path.match(/:([a-zA-Z0-9_]+)/g);\n if (pathParams) {\n for (const param of pathParams) {\n const paramName = param.substring(1);\n operation.parameters.push({\n name: paramName,\n in: 'path',\n required: true,\n schema: { type: 'string' },\n });\n }\n }\n\n if ((action as any).querySchema) {\n const querySchemaName = `${toPascalCase(controller.name || controllerKey)}${toPascalCase(actionName)}Query`;\n const queryJsonSchema = (action as any).querySchema; // already JSON Schema\n this.schemas[querySchemaName] = queryJsonSchema;\n const properties = this.schemas[querySchemaName].properties || {};\n const requiredProps: string[] = this.schemas[querySchemaName].required || [];\n for (const propName of Object.keys(properties)) {\n operation.parameters.push({\n name: propName,\n in: 'query',\n required: requiredProps.includes(propName),\n schema: properties[propName],\n });\n }\n }\n\n if ((action as any).bodySchema) {\n const bodySchemaName = `${toPascalCase(controller.name || controllerKey)}${toPascalCase(actionName)}Body`;\n const bodyJsonSchema = (action as any).bodySchema; // already JSON Schema\n this.schemas[bodySchemaName] = bodyJsonSchema;\n operation.requestBody = {\n required: true,\n content: {\n 'application/json': {\n schema: { $ref: `#/components/schemas/${bodySchemaName}` },\n },\n },\n };\n }\n\n if ((action as any).isStream) {\n operation.description = (operation.description ? operation.description + '\\n\\n' : '') +\n 'This endpoint supports Server-Sent Events (SSE) for real-time updates. ' +\n 'It functions as a standard GET request initially, then maintains an open connection for streaming data.';\n }\n\n paths[path][action.method.toLowerCase()] = operation;\n }\n }\n return paths;\n }\n}\n","import * as path from 'path';\nimport { build, type BuildFailure } from 'esbuild';\nimport { IgniterRouter, IgniterControllerConfig, IgniterAction } from '@igniter-js/core';\nimport zodToJsonSchema from 'zod-to-json-schema';\nimport { createRequire } from 'module';\nimport { nodeExternalsPlugin} from 'esbuild-node-externals';\nimport * as p from '@clack/prompts';\n\nexport interface IntrospectedRouter {\n controllers: Record<string, IntrospectedController>;\n docs?: any;\n}\n\ninterface IntrospectedController {\n name: string;\n description?: string;\n path: string;\n actions: Record<string, IntrospectedAction>;\n}\n\ninterface IntrospectedAction {\n name?: string;\n description?: string;\n path: string;\n method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\n tags?: string[];\n bodySchema?: any;\n querySchema?: any;\n paramSchemas?: Record<string, any>;\n responseSchema?: any;\n isStream?: boolean;\n security?: any;\n}\n\n/**\n * Custom error class for router loading failures.\n */\nexport class RouterLoadError extends Error {\n public originalError: any;\n\n constructor(message: string, originalError?: any) {\n super(message);\n this.name = 'RouterLoadError';\n this.originalError = originalError;\n }\n}\n\n/**\n * RouterIntrospector is responsible for:\n * 1. Loading a user's Igniter router dynamically (optionally compiling with esbuild).\n * 2. Traversing and introspecting the loaded router to construct a serializable schema with JSON schemas.\n */\nexport class RouterInstrospector {\n private constructor() {}\n\n static create(): RouterInstrospector {\n return new RouterInstrospector();\n }\n\n /**\n * Loads the user's router file by compiling it in memory with esbuild.\n * @param routerPath The path to the router file.\n * @returns Promise resolving to the loaded and evaluated IgniterRouter instance.\n * @throws RouterLoadError if loading or compiling fails.\n */\n public async loadRouter(routerPath: string): Promise<IgniterRouter<any, any, any, any, any>> {\n const fullPath = path.resolve(process.cwd(), routerPath);\n\n try {\n const result = await build({\n entryPoints: [fullPath],\n bundle: true,\n platform: 'node',\n format: 'cjs',\n write: false, // Keep the result in memory\n logLevel: 'silent', // We will handle our own logging\n plugins: [nodeExternalsPlugin()],\n external: [\n '@igniter-js/*',\n '@prisma/*',\n 'prisma',\n 'redis',\n 'ioredis',\n 'bullmq',\n '@opentelemetry/*',\n 'chalk',\n 'supports-color',\n ],\n });\n\n const [outputFile] = result.outputFiles;\n if (!outputFile) {\n throw new RouterLoadError('esbuild did not produce any output.');\n }\n\n const compiledCode = outputFile.text;\n const routerModule = { exports: {} };\n\n const projectRequire = createRequire(fullPath);\n const requireFunc = (moduleName: string) => {\n try {\n return projectRequire(moduleName);\n } catch (error) {\n return require(moduleName);\n }\n };\n\n const factory = new Function('exports', 'require', 'module', '__filename', '__dirname', compiledCode);\n factory(routerModule.exports, requireFunc, routerModule, fullPath, path.dirname(fullPath));\n\n const moduleExports = routerModule.exports as any;\n const router = moduleExports.AppRouter || moduleExports.default || moduleExports;\n\n if (router && typeof router.controllers === 'object') {\n return router;\n }\n\n throw new RouterLoadError('Module was compiled and loaded, but no valid Igniter router export was found.');\n } catch (error: any) {\n if (error && Array.isArray((error as BuildFailure).errors)) {\n const buildFailure = error as BuildFailure;\n const errorMessages = buildFailure.errors.map(e => e.text).join('\\n');\n const detailedMessage = `esbuild failed to compile the router file:\\n${errorMessages}`;\n throw new RouterLoadError(detailedMessage, error);\n }\n\n p.log.error(`Error loading router: ${error instanceof Error ? error.message : String(error)}`);\n\n throw new RouterLoadError(`Failed to load router from ${routerPath}`, error);\n }\n }\n\n /**\n * Traverses a loaded router object and converts it into a serializable schema.\n * Converts Zod schemas to JSON schemas.\n * @param router The loaded IgniterRouter instance.\n * @returns An object containing the introspected schema and statistics.\n */\n public introspectRouter(router: IgniterRouter<any, any, any, any, any>): { schema: IntrospectedRouter, stats: { controllers: number, actions: number } } {\n const introspectedControllers: Record<string, IntrospectedController> = {};\n let totalActions = 0;\n\n \n\n for (const [controllerName, controller] of Object.entries(router.controllers)) {\n const introspectedActions: Record<string, IntrospectedAction> = {};\n const typedController = controller as IgniterControllerConfig<any>;\n\n if (typedController && typedController.actions) {\n for (const [actionName, action] of Object.entries(typedController.actions)) {\n try {\n const typedAction = action as IgniterAction<any, any, any, any, any, any, any, any, any, any>;\n\n introspectedActions[actionName] = {\n name: actionName,\n path: typedAction.path,\n method: typedAction.method,\n description: typedAction.description,\n bodySchema: typedAction.body ? zodToJsonSchema(typedAction.body, { target: 'openApi3' }) : undefined,\n querySchema: typedAction.query ? zodToJsonSchema(typedAction.query, { target: 'openApi3' }) : undefined,\n };\n totalActions++;\n } catch (err) {\n throw err;\n }\n }\n }\n\n introspectedControllers[controllerName] = {\n ...typedController,\n actions: introspectedActions,\n };\n }\n\n const schemaResult: IntrospectedRouter = {\n controllers: introspectedControllers,\n docs: router.config.docs,\n };\n\n return {\n schema: schemaResult,\n stats: {\n controllers: Object.keys(introspectedControllers).length,\n actions: totalActions\n }\n };\n }\n}\n","import { OpenAPIGenerator } from '@/core/openapi';\nimport { RouterInstrospector } from '@/core/router-instrospector';\nimport * as p from '@clack/prompts';\nimport * as fs from 'fs';\nimport * as path from 'path';\n\nexport interface DocsGenerationResult {\n durationMs: number;\n sizeKb: number;\n outputPath: string;\n}\n\nexport async function generateDocsWatchMode(routerPath: string, outputDir: string): Promise<DocsGenerationResult> {\n const startTime = Date.now();\n\n const outputDirFull = path.resolve(outputDir);\n if (!fs.existsSync(outputDirFull)) {\n fs.mkdirSync(outputDirFull, { recursive: true });\n }\n\n const outputPath = path.join(outputDirFull, 'openapi.json');\n\n // Se o arquivo openapi.json não existir, pode criar\n if (!fs.existsSync(outputPath)) {\n fs.writeFileSync(outputPath, '{}', 'utf8'); // Garante que o arquivo seja criado vazio antes de popular\n }\n\n const routerInstrospector = RouterInstrospector.create();\n const router = await routerInstrospector.loadRouter(routerPath);\n\n if (!router) {\n throw new Error(`Router not found at: ${routerPath}`);\n }\n\n if (!router.config.docs) {\n throw new Error('Router does not have docs configuration');\n }\n\n const openapiGenerator = OpenAPIGenerator.create(router.config.docs);\n const openapi = openapiGenerator.generate(router);\n\n fs.writeFileSync(outputPath, JSON.stringify(openapi, null, 2), 'utf8');\n\n const sizeKb = fs.statSync(outputPath).size / 1024;\n\n return {\n durationMs: Date.now() - startTime,\n sizeKb,\n outputPath,\n };\n}\n\nexport async function handleGenerateDocsAction(options: { router: string; output: string }) {\n try {\n p.intro('Generate OpenAPI documentation');\n\n const spinner = p.spinner();\n spinner.start('Generating OpenAPI documentation...');\n\n const result = await generateDocsWatchMode(options.router, options.output);\n\n spinner.stop('OpenAPI documentation generated successfully.');\n p.log.success(\n `Docs generated in ${(result.durationMs / 1000).toFixed(2)}s (${result.sizeKb.toFixed(1)} KB)`,\n );\n p.log.info('Test your API on Igniter Studio at: http://localhost:3000/api/v1/docs');\n process.exit(0);\n } catch (error) {\n p.log.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n","import { Command } from 'commander';\nimport { handleGenerateSchemaAction } from './action';\n\nexport const schemaCommand = new Command()\n .command('schema')\n .description('Generate client schema from your API router')\n .option('--router <path>', 'Path to the router file', 'src/igniter.router.ts')\n .option('--output <path>', 'Output path for the schema file', 'src/igniter.schema.ts')\n .action(handleGenerateSchemaAction);\n","import { RouterInstrospector } from '@/core/router-instrospector';\nimport { TemplateEngine } from '@/core/template-engine';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as handlebars from 'handlebars';\nimport * as p from '@clack/prompts';\n\nexport interface SchemaGenerationResult {\n durationMs: number;\n controllers: number;\n actions: number;\n}\n\nexport async function generateSchemaWatchMode(routerPath: string, outputPath: string): Promise<SchemaGenerationResult> {\n const startTime = Date.now();\n\n const routerInstrospector = RouterInstrospector.create();\n const router = await routerInstrospector.loadRouter(routerPath);\n const { schema, stats } = routerInstrospector.introspectRouter(router);\n\n const templateEngine = TemplateEngine.create();\n const templatePath = templateEngine.resolvePath('scaffold', 'igniter.schema.hbs');\n const templateSource = fs.readFileSync(templatePath, 'utf8');\n const template = handlebars.compile(templateSource);\n const schemaContent = template({\n generatedAt: new Date().toISOString(),\n schemaString: JSON.stringify(schema, null, 2),\n });\n\n const outputFullPath = path.resolve(process.cwd(), outputPath);\n fs.writeFileSync(outputFullPath, schemaContent, 'utf8');\n\n return {\n durationMs: Date.now() - startTime,\n controllers: stats.controllers,\n actions: stats.actions,\n };\n}\n\nexport async function handleGenerateSchemaAction({ router: routerPath, output: outputPath }: { router: string; output: string; watch: boolean }) {\n try {\n p.intro('Generate Igniter.js Client Schema');\n\n const spinner = p.spinner();\n spinner.start('Generating schema...');\n\n const result = await generateSchemaWatchMode(routerPath, outputPath);\n\n spinner.stop('Schema generated successfully.');\n p.log.success(\n `Schema generated in ${(result.durationMs / 1000).toFixed(2)}s (${result.controllers} controllers, ${result.actions} actions).`,\n );\n\n p.outro('All done!');\n process.exit(0);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n p.log.error(`Failed to generate schema: ${errorMessage}`);\n process.exit(1);\n }\n}\n","import { Command } from \"commander\";\nimport { handleGenerateControllerAction } from \"./action\";\n\nexport const controllerCommand = new Command()\n .command(\"controller\")\n .description(\"Scaffold a new controller within a feature\")\n .argument(\"[name]\", \"Name of the controller (e.g., 'profile')\")\n .option(\"-f, --feature <feature>\", \"Target feature name\")\n .action(handleGenerateControllerAction);\n","import * as path from \"path\";\nimport * as p from \"@clack/prompts\";\nimport { FeatureWorkspace } from \"@/commands/generate/feature/feature\";\nimport { FeaturePrompts } from \"@/commands/generate/feature/prompts\";\nimport { TemplateEngine } from \"@/core/template-engine\";\nimport { Casing } from \"@/utils/casing\";\nimport { tryCatch } from \"@/utils/try-catch\";\n\ninterface ControllerOptions {\n feature?: string;\n}\n\nexport async function handleGenerateControllerAction(\n name: string | undefined,\n options: ControllerOptions,\n): Promise<void> {\n p.intro(\"Generate Controller\");\n\n let controllerInput =\n name\n\n if (!controllerInput) {\n controllerInput = await FeaturePrompts.askForEntityName({\n message: \"What is the name of the controller?\",\n placeholder: \"profile\",\n cancelMessage: \"Controller generation cancelled.\",\n });\n }\n\n const controllerSlug = Casing.toKebabCase(controllerInput);\n const controllerExport = `${Casing.toPascalCase(controllerSlug)}Controller`;\n const controllerDisplay = Casing.toPascalCase(controllerSlug);\n\n const selectedFeature = await tryCatch(FeaturePrompts.resolveFeatureSlug(\n \"Controller generation cancelled.\",\n options.feature,\n ));\n\n if (selectedFeature.error) {\n p.log.error(`Controller generation failed: ${selectedFeature.error.message}`);\n process.exit(1);\n }\n\n const featureSlug = Casing.toKebabCase(selectedFeature.data);\n\n const featureDir = FeatureWorkspace.featureDir(featureSlug);\n await FeatureWorkspace.ensureStructure(featureDir);\n\n const controllerPath = path.join(\n featureDir,\n \"controllers\",\n `${controllerSlug}.controller.ts`,\n );\n\n if (await FeatureWorkspace.fileExists(controllerPath)) {\n p.log.error(\n `Controller '${controllerSlug}' already exists at ${path.relative(process.cwd(), controllerPath)}.`,\n );\n process.exit(1);\n }\n\n const templateEngine = TemplateEngine.create();\n const controllerTemplate = templateEngine.resolvePath(\n \"generate\",\n \"feature\",\n \"empty.controller.hbs\",\n );\n\n const spinner = p.spinner();\n spinner.start(\n `Creating controller '${controllerSlug}' inside feature '${featureSlug}'...`,\n );\n\n try {\n await templateEngine.renderToFile(\n controllerTemplate,\n {\n controllerExport,\n controllerDisplayName: controllerDisplay,\n controllerRoute: controllerSlug,\n },\n controllerPath,\n );\n\n spinner.stop(\"Controller created successfully!\");\n p.log.success(\n `Created controller '${controllerSlug}' in feature '${featureSlug}'.`,\n );\n p.outro(\"Controller generation complete!\");\n } catch (error) {\n spinner.stop(\"Failed to create the controller.\");\n const message = error instanceof Error ? error.message : String(error);\n p.log.error(`Controller generation failed: ${message}`);\n process.exit(1);\n }\n}\n","/**\n * Represents a successful result containing data and no error\n * @template T The type of the successful data\n */\ntype Success<T> = {\n data: T;\n error: null;\n};\n\n/**\n * Represents a failure result containing an error and no data\n * @template E The type of the error\n */\ntype Failure<E> = {\n data: null;\n error: E;\n};\n\n/**\n * Discriminated union type representing either a successful or failed result\n * @template T The type of the successful data\n * @template E The type of the error, defaults to Error\n */\ntype Result<T, E = Error> = Success<T> | Failure<E>;\n\n/**\n * A utility function that wraps promise execution in a type-safe try-catch block.\n * Provides a standardized way to handle asynchronous operations and their potential errors.\n * \n * @template T The type of the successful data\n * @template E The type of the error, defaults to Error\n * @param promise The promise to execute\n * @returns A Result object containing either the successful data or an error\n * \n * @remarks\n * This function provides a more elegant way to handle promise rejections without try-catch blocks\n * in your business logic. It returns a discriminated union type that makes error handling more explicit\n * and type-safe.\n * \n * @example\n * ```typescript\n * // Simple usage with fetch\n * const result = await tryCatch(fetch('https://api.example.com/data'));\n * if (result.error) {\n * console.error('Failed to fetch:', result.error);\n * } else {\n * const data = await result.data.json();\n * console.log('Success:', data);\n * }\n * \n * // Usage with custom error type\n * interface ApiError {\n * code: string;\n * message: string;\n * }\n * \n * const result = await tryCatch<UserData, ApiError>(fetchUserData(userId));\n * if (result.error) {\n * console.error(`Error ${result.error.code}: ${result.error.message}`);\n * } else {\n * console.log('User data:', result.data);\n * }\n * ```\n */\nexport async function tryCatch<T, E = Error>(\n promise: Promise<T>,\n): Promise<Result<T, E>> {\n try {\n const data = await promise;\n return { data, error: null };\n } catch (error) {\n return { data: null, error: error as E };\n }\n}","import { Command } from \"commander\";\nimport { handleGenerateProcedureAction } from \"./action\";\n\nexport const procedureCommand = new Command()\n .command(\"procedure\")\n .description(\"Scaffold a new procedure within a feature\")\n .argument(\"[name]\", \"Name of the procedure (e.g., 'profile')\")\n .option(\"-f, --feature <feature>\", \"Target feature name\")\n .action(handleGenerateProcedureAction);\n","import * as path from \"path\";\nimport * as p from \"@clack/prompts\";\nimport { FeatureWorkspace } from \"@/commands/generate/feature/feature\";\nimport { FeaturePrompts } from \"@/commands/generate/feature/prompts\";\nimport { TemplateEngine } from \"@/core/template-engine\";\nimport { Casing } from \"@/utils/casing\";\nimport { tryCatch } from \"@/utils/try-catch\";\nimport { rm } from \"fs/promises\";\n\ninterface ProcedureOptions {\n feature?: string;\n}\n\nexport async function handleGenerateProcedureAction(\n name: string | undefined,\n options: ProcedureOptions,\n): Promise<void> {\n p.intro(\"Generate Procedure\");\n\n let procedureInput =\n name\n\n if (!procedureInput) {\n procedureInput = await FeaturePrompts.askForEntityName({\n message: \"What is the name of the procedure?\",\n placeholder: \"profile\",\n cancelMessage: \"Procedure generation cancelled.\",\n });\n }\n\n const procedureSlug = Casing.toKebabCase(procedureInput);\n const procedureExport = `${Casing.toPascalCase(procedureSlug)}Procedure`;\n const procedureDisplay = Casing.toPascalCase(procedureSlug);\n\n const selectedFeature = await tryCatch(FeaturePrompts.resolveFeatureSlug(\n \"Procedure generation cancelled.\",\n options.feature,\n ));\n\n if (selectedFeature.error) {\n p.log.error(`Procedure generation failed: ${selectedFeature.error.message}`);\n process.exit(1);\n }\n\n const featureSlug = Casing.toKebabCase(selectedFeature.data);\n\n const featureDir = FeatureWorkspace.featureDir(featureSlug);\n await FeatureWorkspace.ensureStructure(featureDir);\n\n const procedurePath = path.join(\n featureDir,\n \"procedures\",\n `${procedureSlug}.procedure.ts`,\n );\n\n if (await FeatureWorkspace.fileExists(procedurePath)) {\n p.log.error(\n `Procedure '${procedureSlug}' already exists at ${path.relative(process.cwd(), procedurePath)}.`,\n );\n process.exit(1);\n }\n\n const templateEngine = TemplateEngine.create();\n const procedureTemplate = templateEngine.resolvePath(\n \"generate\",\n \"feature\",\n \"procedure.hbs\",\n );\n\n const spinner = p.spinner();\n spinner.start(\n `Creating procedure '${procedureSlug}' inside feature '${featureSlug}'...`,\n );\n\n if (await FeatureWorkspace.fileExists(path.join(featureDir, \"procedures\", \".gitkeep\"))) {\n await rm(path.join(featureDir, \"procedures\", \".gitkeep\"));\n }\n\n try {\n await templateEngine.renderToFile(\n procedureTemplate,\n {\n procedureExport,\n procedureDisplayName: procedureDisplay,\n featureName: Casing.toKebabCase(featureSlug),\n },\n procedurePath,\n );\n\n spinner.stop(\"Procedure created successfully!\");\n p.log.success(\n `Created procedure '${procedureSlug}' in feature '${featureSlug}'.`,\n );\n p.outro(\"Procedure generation complete!\");\n } catch (error) {\n spinner.stop(\"Failed to create the procedure.\");\n const message = error instanceof Error ? error.message : String(error);\n p.log.error(`Procedure generation failed: ${message}`);\n process.exit(1);\n }\n}\n","import { Command } from 'commander';\nimport { handleDevAction } from './action';\n\nexport const devCommand = new Command()\n .command('dev')\n .description('Start development mode with automatic schema and docs regeneration')\n .option('--router <path>', 'Path to the router file', 'src/igniter.router.ts')\n .option('--output <path>', 'Output path for the schema file', 'src/igniter.schema.ts')\n .option('--docs-output <dir>', 'Output directory for the OpenAPI spec', './src/docs')\n .option('--cmd <command>', 'Custom command to start the development server')\n .action(handleDevAction);\n\n","import * as path from 'path';\nimport * as fs from 'fs';\nimport { spawn, ChildProcess } from 'child_process';\nimport chokidar from 'chokidar';\nimport { render } from 'ink';\nimport React from 'react';\nimport { detectPackageManager } from '@/core/package-manager';\nimport { generateSchemaWatchMode } from '../generate/schema/action';\nimport { generateDocsWatchMode } from '../generate/docs/action';\nimport { DevUI, type LogEntry } from './components';\nimport type { DevCommandOptions } from './types';\n\nfunction getDefaultDevCommand(packageManager: string): string {\n switch (packageManager) {\n case 'yarn':\n return 'yarn dev';\n case 'pnpm':\n return 'pnpm dev';\n case 'bun':\n return 'bun dev';\n default:\n return 'npm run dev';\n }\n}\n\nasync function regenerateSchemaAndDocs(\n routerPath: string,\n outputPath: string,\n docsOutputDir: string,\n addLog: (log: LogEntry) => void,\n): Promise<void> {\n try {\n const schemaResult = await generateSchemaWatchMode(routerPath, outputPath);\n addLog({\n type: 'success',\n message: `Schema regenerated in ${(schemaResult.durationMs / 1000).toFixed(2)}s (${schemaResult.controllers} controllers, ${schemaResult.actions} actions)`,\n timestamp: new Date(),\n });\n\n const docsResult = await generateDocsWatchMode(routerPath, docsOutputDir);\n addLog({\n type: 'success',\n message: `OpenAPI docs regenerated in ${(docsResult.durationMs / 1000).toFixed(2)}s (${docsResult.sizeKb.toFixed(1)} KB)`,\n timestamp: new Date(),\n });\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n addLog({\n type: 'error',\n message: `Failed to regenerate: ${errorMessage}`,\n timestamp: new Date(),\n });\n }\n}\n\nexport async function handleDevAction(options: DevCommandOptions): Promise<void> {\n // Setup\n const packageManager = detectPackageManager();\n const routerPath = path.resolve(process.cwd(), options.router || 'src/igniter.router.ts');\n const outputPath = options.output || 'src/igniter.schema.ts';\n const docsOutputDir = options.docsOutput || './src/docs';\n const devCommand = options.cmd || getDefaultDevCommand(packageManager);\n\n // Validate router exists\n if (!fs.existsSync(routerPath)) {\n console.error(`Router file not found: ${routerPath}`);\n process.exit(1);\n }\n\n // State for logs\n const igniterLogs: LogEntry[] = [];\n const appLogs: LogEntry[] = [];\n\n let rerenderFn: (() => void) | null = null;\n\n const addIgniterLog = (log: LogEntry) => {\n igniterLogs.push(log);\n // Keep only last 1000 logs\n if (igniterLogs.length > 1000) {\n igniterLogs.shift();\n }\n if (rerenderFn) {\n rerenderFn();\n }\n };\n\n const addAppLog = (log: LogEntry) => {\n appLogs.push(log);\n // Keep only last 1000 logs\n if (appLogs.length > 1000) {\n appLogs.shift();\n }\n if (rerenderFn) {\n rerenderFn();\n }\n };\n\n // Initial generation\n try {\n const docsResult = await generateDocsWatchMode(routerPath, docsOutputDir);\n addIgniterLog({\n type: 'success',\n message: `OpenAPI docs generated in ${(docsResult.durationMs / 1000).toFixed(2)}s (${docsResult.sizeKb.toFixed(1)} KB)`,\n timestamp: new Date(),\n });\n\n const schemaResult = await generateSchemaWatchMode(routerPath, outputPath);\n addIgniterLog({\n type: 'success',\n message: `Schema generated in ${(schemaResult.durationMs / 1000).toFixed(2)}s (${schemaResult.controllers} controllers, ${schemaResult.actions} actions)`,\n timestamp: new Date(),\n }); \n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n addIgniterLog({\n type: 'error',\n message: `Failed to generate: ${errorMessage}`,\n timestamp: new Date(),\n });\n process.exit(1);\n }\n\n // Setup watch paths\n const featuresDir = path.join(process.cwd(), 'src', 'features');\n const watchPaths = [\n routerPath, // Watch router file directly\n featuresDir, // Watch features directory recursively\n ].filter((p) => fs.existsSync(p));\n\n if (watchPaths.length === 0) {\n addIgniterLog({\n type: 'warn',\n message: 'No watchable paths found. Only watching router file.',\n timestamp: new Date(),\n });\n watchPaths.push(routerPath);\n }\n\n addIgniterLog({\n type: 'info',\n message: `Watching for changes in: ${watchPaths.map((p) => path.relative(process.cwd(), p)).join(', ')}`,\n timestamp: new Date(),\n });\n\n // Setup file watcher with debounce\n let regenerateTimeout: NodeJS.Timeout | null = null;\n const DEBOUNCE_MS = 300;\n\n const watcher = chokidar.watch(watchPaths, {\n ignored: [\n /node_modules/,\n /\\.git/,\n /dist/,\n /\\.next/,\n /\\.turbo/,\n /\\.cache/,\n /\\.test\\.ts$/,\n /\\.spec\\.ts$/,\n ],\n persistent: true,\n ignoreInitial: true,\n });\n\n watcher.on('change', (filePath) => {\n const relativePath = path.relative(process.cwd(), filePath);\n \n // Clear existing timeout\n if (regenerateTimeout) {\n clearTimeout(regenerateTimeout);\n }\n\n // Debounce regeneration\n regenerateTimeout = setTimeout(async () => {\n addIgniterLog({\n type: 'info',\n message: `File changed: ${relativePath}`,\n timestamp: new Date(),\n });\n await regenerateSchemaAndDocs(routerPath, outputPath, docsOutputDir, addIgniterLog);\n }, DEBOUNCE_MS);\n });\n\n watcher.on('error', (error: unknown) => {\n const errorMessage = error instanceof Error ? error.message : String(error);\n addIgniterLog({\n type: 'error',\n message: `Watcher error: ${errorMessage}`,\n timestamp: new Date(),\n });\n });\n\n // Start dev server\n let devProcess: ChildProcess | null = null;\n\n if (devCommand) {\n addAppLog({\n type: 'info',\n message: `Starting dev server: ${devCommand}`,\n timestamp: new Date(),\n });\n \n const [cmd, ...args] = devCommand.split(' ');\n devProcess = spawn(cmd, args, {\n stdio: ['ignore', 'pipe', 'pipe'],\n shell: true,\n env: {\n ...process.env,\n NODE_ENV: 'development',\n },\n cwd: process.cwd(),\n });\n\n devProcess.stdout?.on('data', (data: Buffer) => {\n const lines = data.toString().split('\\n').filter((line) => line.trim());\n lines.forEach((line) => {\n addAppLog({\n type: 'info',\n message: line,\n timestamp: new Date(),\n });\n });\n });\n\n devProcess.stderr?.on('data', (data: Buffer) => {\n const lines = data.toString().split('\\n').filter((line) => line.trim());\n lines.forEach((line) => {\n addAppLog({\n type: 'error',\n message: line,\n timestamp: new Date(),\n });\n });\n });\n\n devProcess.on('error', (error: Error) => {\n addAppLog({\n type: 'error',\n message: `Dev server error: ${error.message}`,\n timestamp: new Date(),\n });\n });\n\n devProcess.on('exit', (code) => {\n if (code !== null && code !== 0) {\n addAppLog({\n type: 'warn',\n message: `Dev server exited with code ${code}`,\n timestamp: new Date(),\n });\n } else {\n addAppLog({\n type: 'info',\n message: 'Dev server stopped',\n timestamp: new Date(),\n });\n }\n });\n }\n\n // Cleanup function\n const cleanup = () => {\n if (regenerateTimeout) {\n clearTimeout(regenerateTimeout);\n }\n \n watcher.close();\n \n if (devProcess) {\n devProcess.kill('SIGTERM');\n }\n };\n\n // Render UI\n const DevComponent: React.FC = () => {\n return React.createElement(DevUI, {\n igniterLogs,\n appLogs,\n onExit: () => {\n cleanup();\n unmount();\n process.exit(0);\n },\n });\n };\n \n const { rerender, unmount } = render(React.createElement(DevComponent));\n rerenderFn = () => rerender(React.createElement(DevComponent));\n\n // Handle exit signals\n process.on('SIGINT', () => {\n cleanup();\n unmount();\n process.exit(0);\n });\n\n process.on('SIGTERM', () => {\n cleanup();\n unmount();\n process.exit(0);\n });\n\n // Wait for dev process if it exists\n if (devProcess) {\n await new Promise<void>((resolve) => {\n devProcess!.on('exit', () => resolve());\n });\n } else {\n // If no dev process, keep alive indefinitely\n await new Promise(() => {});\n }\n}\n","import React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\n\nexport interface LogEntry {\n type: 'info' | 'success' | 'error' | 'warn';\n message: string;\n timestamp: Date;\n}\n\ninterface DevUIProps {\n igniterLogs: LogEntry[];\n appLogs: LogEntry[];\n onExit: () => void;\n}\n\nfunction DevUI({ igniterLogs, appLogs, onExit }: DevUIProps) {\n const [activeTab, setActiveTab] = useState<'igniter' | 'app'>('igniter');\n\n useInput((input, key) => {\n if (key.escape || (key.ctrl && input === 'c')) {\n onExit();\n return;\n }\n \n if (key.leftArrow || input === '1') {\n setActiveTab('igniter');\n }\n \n if (key.rightArrow || input === '2') {\n setActiveTab('app');\n }\n });\n\n const formatLogEntry = (entry: LogEntry): string => {\n const time = entry.timestamp.toLocaleTimeString();\n const prefix = {\n info: 'ℹ',\n success: '✓',\n error: '✗',\n warn: '⚠',\n }[entry.type];\n \n return `[${time}] ${prefix} ${entry.message}`;\n };\n\n const renderLogs = (logs: LogEntry[], maxLines: number = 50) => {\n const visibleLogs = logs.slice(-maxLines);\n return (\n <Box flexDirection=\"column\">\n {visibleLogs.length === 0 ? (\n <Text dimColor>No logs yet...</Text>\n ) : (\n visibleLogs.map((log, index) => {\n const color = {\n info: 'cyan',\n success: 'green',\n error: 'red',\n warn: 'yellow',\n }[log.type];\n \n return (\n <Text key={`${log.timestamp.getTime()}-${index}`} color={color}>\n {formatLogEntry(log)}\n </Text>\n );\n })\n )}\n </Box>\n );\n };\n\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text bold>Igniter.js Development Mode</Text>\n </Box>\n \n {/* Custom Tabs */}\n <Box flexDirection=\"row\">\n <Box\n borderStyle={activeTab === 'igniter' ? 'round' : 'single'}\n borderColor={activeTab === 'igniter' ? 'cyan' : 'gray'}\n paddingX={1}\n marginRight={1}\n >\n <Text color={activeTab === 'igniter' ? 'cyan' : 'gray'} bold={activeTab === 'igniter'}>\n Igniter.js\n </Text>\n </Box>\n <Box\n borderStyle={activeTab === 'app' ? 'round' : 'single'}\n borderColor={activeTab === 'app' ? 'green' : 'gray'}\n paddingX={1}\n >\n <Text color={activeTab === 'app' ? 'green' : 'gray'} bold={activeTab === 'app'}>\n Application\n </Text>\n </Box>\n </Box>\n \n <Box marginTop={1} borderStyle=\"round\" paddingX={1} minHeight={20}>\n {activeTab === 'igniter' ? (\n <Box flexDirection=\"column\">\n <Text bold color=\"cyan\">\n Igniter.js Logs ({igniterLogs.length})\n </Text>\n <Box marginTop={1}>\n {renderLogs(igniterLogs)}\n </Box>\n </Box>\n ) : (\n <Box flexDirection=\"column\">\n <Text bold color=\"green\">\n Application Logs ({appLogs.length})\n </Text>\n <Box marginTop={1}>\n {renderLogs(appLogs)}\n </Box>\n </Box>\n )}\n </Box>\n \n <Box marginTop={1}>\n <Text dimColor>\n Press <Text bold>1</Text> or <Text bold>←</Text> for Igniter.js |{' '}\n <Text bold>2</Text> or <Text bold>→</Text> for Application |{' '}\n <Text bold>Ctrl+C</Text> or <Text bold>ESC</Text> to exit\n </Text>\n </Box>\n </Box>\n );\n}\n\nexport default DevUI;\n"],"mappings":"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","names":["Command","p","path","p","path","path","join","handlebars","path","p","join","fs","stat","resolve","path","path","path","readFile","writeFile","existsSync","join","handlebars","join","existsSync","readFile","writeFile","services","envVars","fs","path","path","path","path","path","path","path","fs","path","path","fs","p","p","execa","execa","fs","path","Command","Command","path","p","existsSync","writeFile","existsSync","readFile","writeFile","path","handlebars","__filename","__dirname","readFile","existsSync","writeFile","mkdir","readdir","stat","writeFile","path","p","fs","path","stat","existsSync","spinner","cancel","provider","selection","writeFile","Command","Command","path","path","p","p","fs","path","spinner","Command","Command","fs","path","handlebars","p","spinner","Command","Command","path","p","spinner","Command","Command","path","p","rm","spinner","Command","Command","Command","path","fs","spawn","React","log","color","devCommand","log","p","spawn","React","resolve","Command","Command"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/commands/init/index.ts","../src/commands/init/action.ts","../src/commands/init/prompts.ts","../src/core/package-manager.ts","../src/core/registry/starters/starter-registry.ts","../src/registry/starters/nextjs-starter.ts","../src/core/registry/starters/base-starter.ts","../src/core/handlebars-helpers.ts","../src/core/terminal.ts","../src/registry/starters/express-starter.ts","../src/registry/starters/deno-starter.ts","../src/registry/starters/bun-api-starter.ts","../src/registry/starters/bun-react-starter.ts","../src/registry/starters/tanstack-start-starter.ts","../src/registry/starters/index.ts","../src/core/registry/add-ons/add-on-registry.ts","../src/registry/add-ons/store.ts","../src/core/registry/add-ons/base-addon.ts","../src/registry/add-ons/jobs.ts","../src/registry/add-ons/mcp.ts","../src/registry/add-ons/logging.ts","../src/registry/add-ons/telemetry.ts","../src/registry/add-ons/bots.ts","../src/registry/add-ons/database.ts","../src/registry/add-ons/auth.ts","../src/registry/add-ons/shadcn.ts","../src/registry/add-ons/index.ts","../src/core/file-system.ts","../src/core/framework.ts","../src/core/logger.ts","../src/commands/init/generator.ts","../src/commands/generate/index.ts","../src/commands/generate/feature/index.ts","../src/commands/generate/feature/action.ts","../src/core/template-engine.ts","../src/commands/generate/feature/feature.ts","../src/commands/generate/feature/prompts.ts","../src/core/registry/schema-provider/schema-provider-registry.ts","../src/registry/schema-provider/prisma.ts","../src/core/registry/schema-provider/base-schema-provider.ts","../src/utils/casing.ts","../src/registry/schema-provider/index.ts","../src/commands/generate/docs/index.ts","../src/core/openapi.ts","../src/core/router-instrospector.ts","../src/commands/generate/docs/action.ts","../src/commands/generate/schema/index.ts","../src/commands/generate/schema/action.ts","../src/commands/generate/controller/index.ts","../src/commands/generate/controller/action.ts","../src/utils/try-catch.ts","../src/commands/generate/procedure/index.ts","../src/commands/generate/procedure/action.ts","../src/commands/dev/index.ts","../src/commands/dev/action.ts","../src/commands/dev/components/DevUI.tsx"],"sourcesContent":["import { Command } from 'commander';\nimport { initCommand } from './commands/init';\nimport { generateCommand } from './commands/generate';\nimport { devCommand } from './commands/dev';\n\nconst program = new Command();\n\nprogram\n .name(\"igniter\")\n .description(\"The next-generation command-line interface for Igniter.js\")\n .version(\"0.0.1\");\n\nprogram.addCommand(initCommand);\nprogram.addCommand(generateCommand);\nprogram.addCommand(devCommand);\n\nprogram.parse(process.argv);\n","import { Command } from \"commander\";\nimport { handleInitAction } from \"./action\";\n\nexport const initCommand = new Command()\n .command(\"init\")\n .description(\"Create a new Igniter.js project with interactive setup\")\n .argument(\"[project-name]\", \"Name of the project directory\")\n .option(\"--mode <mode>\", \"Mode to use (install, new-project)\", \"new-project\")\n .option(\n \"--pm, --package-manager <manager>\",\n \"Package manager to use (npm, yarn, pnpm, bun)\",\n )\n .option(\n \"--template <template>\",\n \"Use a specific template (e.g., starter-nextjs, starter-express-rest-api)\",\n )\n .option(\n \"--add-ons <add-ons>\",\n \"Comma-separated list of add-ons (store,jobs,mcp,logging,telemetry)\",\n )\n .option(\n \"--database <database>\",\n \"Database provider (none, postgresql, mysql, sqlite)\",\n )\n .option(\"--no-git\", \"Skip git repository initialization\")\n .option(\"--no-install\", \"Skip automatic dependency installation\")\n .option(\"--no-docker\", \"Skip Docker Compose setup\")\n .action(handleInitAction);\n","import * as p from \"@clack/prompts\";\nimport * as path from \"path\";\nimport { runInitPrompts } from \"./prompts\";\nimport { ProjectGenerator } from \"./generator\";\n\nexport interface InitPromptsOptions {\n projectName?: string;\n useCurrentDir?: boolean;\n mode?: \"install\" | \"new-project\";\n packageManager?: string;\n starter?: string;\n addOns?: string[];\n git?: boolean;\n install?: boolean;\n}\n\nexport async function handleInitAction(\n projectName: string,\n options: InitPromptsOptions,\n) {\n try {\n p.intro(\"Welcome to Igniter.js!\");\n\n options.projectName = projectName;\n\n const config = await runInitPrompts({\n projectName: options.projectName,\n mode: options.mode,\n useCurrentDir: options.useCurrentDir,\n packageManager: options.packageManager,\n starter: options.starter,\n addOns: options.addOns,\n git: options.git,\n install: options.install,\n });\n\n const targetDir = path.resolve(config.projectName);\n\n const generator = new ProjectGenerator(config, targetDir);\n await generator.generate();\n\n p.log.success(\"Project initialized successfully!\");\n } catch (error) {\n p.log.error(\"Project initialization failed\");\n p.log.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n","import * as p from \"@clack/prompts\";\nimport * as path from \"path\";\nimport { detectPackageManager } from \"@/core/package-manager\";\nimport { ProjectSetupConfig } from \"@/commands/init/types\";\nimport { starterRegistry } from \"@/registry/starters\";\nimport { addOnRegistry } from \"@/registry/add-ons\";\nimport type { InitPromptsOptions } from \"./action\";\nimport { isPathEmpty } from \"@/core/file-system\";\nimport { detectFramework } from \"@/core/framework\";\nimport type { AddOnOption } from \"@/registry/types\";\n\nasync function processAddOnOptions(\n options: AddOnOption[],\n): Promise<Record<string, string[] | string | undefined>> {\n const selectedOptions: Record<string, string[] | string | undefined> = {};\n\n for (const option of options) {\n let selectedValues: string[] | string | undefined = undefined;\n\n if (option.multiple) {\n const values = await p.multiselect({\n message: option.message,\n options: option.choices.map((choice: any) => ({\n value: choice.value,\n label: choice.label,\n hint: choice.hint,\n })),\n });\n selectedValues = values as unknown as string[];\n } else {\n const value = await p.select({\n message: option.message,\n options: option.choices.map((choice) => ({\n value: choice.value,\n label: choice.label,\n hint: choice.hint,\n })),\n });\n selectedValues = value as string | undefined;\n }\n\n selectedOptions[option.key] = selectedValues;\n\n // Process sub-options if they exist for the selected choice(s)\n const valuesToProcess = Array.isArray(selectedValues)\n ? selectedValues\n : selectedValues\n ? [selectedValues]\n : [];\n\n for (const value of valuesToProcess) {\n const choice = option.choices.find((c) => c.value === value);\n if (choice?.subOptions && choice.subOptions.length > 0) {\n const subOptionsResult = await processAddOnOptions(choice.subOptions);\n Object.assign(selectedOptions, subOptionsResult);\n }\n }\n }\n\n return selectedOptions;\n}\n\nexport async function runInitPrompts(\n options: InitPromptsOptions,\n): Promise<ProjectSetupConfig> {\n const detectedPackageManager = detectPackageManager();\n\n const config = await p.group(\n {\n useCurrentDir: async () => {\n if (options.projectName) return false;\n return p.confirm({\n message: `Do you want to use current folder as a project directory?`,\n initialValue: false,\n });\n },\n projectName: async ({ results }) => {\n if (options.projectName) return options.projectName;\n if (results.useCurrentDir) return path.basename(process.cwd());\n const projectName = await p.text({\n message: \"What will your project be called?\",\n validate: (value) => {\n if (!value.trim()) return \"Project name is required\";\n if (!/^[a-z0-9-_]+$/i.test(value.trim())) {\n return \"Project name can only contain letters, numbers, hyphens, and underscores\";\n }\n return;\n },\n });\n return projectName as string;\n },\n mode: async ({ results }) => {\n const projectName = results.projectName as string;\n\n const targetDir = path.resolve(projectName);\n const isEmpty = await isPathEmpty(targetDir);\n\n if (!isEmpty) {\n return await p.select({\n message: `Directory '${projectName}' is not empty. Do you want to overwrite with starter ou just install Igniter.js?`,\n options: [\n { value: \"new-project\", label: \"Overwrite and select a starter\" },\n { value: \"install\", label: \"Just install Igniter.js\" },\n ],\n });\n }\n\n return \"new-project\";\n },\n starter: async ({ results }) => {\n if (results.mode !== \"new-project\") {\n const targetDir = path.resolve(results.projectName as string);\n const framework = detectFramework(targetDir);\n if (framework === \"nextjs\") {\n return \"nextjs\";\n } else if (framework === \"tanstack-start\") {\n return \"tanstack-start\";\n } else {\n return \"generic\";\n }\n }\n\n return await p.select({\n message: \"Which starter would you like to use?\",\n options: starterRegistry.getAll().map((s) => ({\n value: s.id,\n label: s.name,\n hint: s.hint,\n })),\n });\n },\n addOns: async () => {\n const addOnResult = await p.multiselect({\n message: \"What add-ons would you like for your project?\",\n options: addOnRegistry.getAll().map((f) => ({\n value: f.value,\n label: f.name,\n hint: f.hint,\n })),\n });\n\n return addOnResult as unknown as string[];\n },\n addOnOptions: async ({ results }) => {\n const addOnOptions: Record<\n string,\n Record<string, string[] | string | undefined>\n > = {};\n for (const addOnValue of results.addOns || []) {\n const addOn = addOnRegistry.get(addOnValue);\n if (addOn?.options && addOn.options.length > 0) {\n addOnOptions[addOnValue] = await processAddOnOptions(addOn.options);\n }\n }\n return addOnOptions;\n },\n packageManager: () =>\n p.select({\n message: \"Which package manager?\",\n initialValue: detectedPackageManager,\n options: [\n { value: \"npm\", label: \"npm\" },\n { value: \"yarn\", label: \"yarn\" },\n { value: \"pnpm\", label: \"pnpm\" },\n { value: \"bun\", label: \"bun\" },\n ],\n }),\n initDocker: ({ results }) => {\n const hasAnyAddOn = results.addOns && results.addOns.length > 0;\n\n if (!hasAnyAddOn) return;\n return p.confirm({\n message: \"Setup Docker services for development?\",\n initialValue: true,\n });\n },\n initGit: () =>\n p.confirm({\n message: \"Initialize Git repository?\",\n initialValue: true,\n }),\n installDependencies: () =>\n p.confirm({\n message: \"Install dependencies automatically?\",\n initialValue: true,\n }),\n },\n {\n onCancel: () => {\n p.cancel(\"Operation cancelled.\");\n process.exit(0);\n },\n },\n );\n\n return {\n projectName: config.projectName,\n mode: config.mode,\n starter: config.starter,\n packageManager: config.packageManager,\n initGit: config.initGit,\n addOns: config.addOns,\n addOnOptions: config.addOnOptions,\n initDocker: config.initDocker,\n installDependencies: config.installDependencies,\n } as ProjectSetupConfig;\n}\n","import { PackageManager } from \"../commands/init/types\";\n\nexport function getInstallCommand(pm: PackageManager): { command: string; args: string[] } {\n switch (pm) {\n case 'yarn':\n return { command: 'yarn', args: ['install'] };\n case 'pnpm':\n return { command: 'pnpm', args: ['install'] };\n case 'bun':\n return { command: 'bun', args: ['install'] };\n default:\n return { command: 'npm', args: ['install'] };\n }\n}\n\nexport function detectPackageManager(): PackageManager {\n const userAgent = process.env.npm_config_user_agent;\n if (userAgent) {\n if (userAgent.startsWith('yarn')) return 'yarn';\n if (userAgent.startsWith('pnpm')) return 'pnpm';\n if (userAgent.startsWith('bun')) return 'bun';\n }\n return 'npm';\n}\n\nexport function getPackageManagerCommand(pm: PackageManager, command?: string): string {\n switch (pm) {\n case 'npm':\n return command ? `npx ${command}` : 'npx';\n case 'pnpm':\n return command ? `pnpx ${command}` : 'pnpx';\n case 'bun':\n return command ? `bunx ${command}` : 'bunx';\n case 'yarn':\n return command ? `yarn dlx ${command}` : 'yarn dlx';\n default:\n return command ? `npx ${command}` : 'npx';\n }\n}\n","import { BaseStarter } from './base-starter';\n\nexport class StarterRegistry {\n private starters = new Map<string, BaseStarter>();\n \n static create() {\n return new StarterRegistry();\n }\n\n register(starter: BaseStarter) {\n this.starters.set(starter.id, starter);\n return this;\n }\n\n build() {\n return {\n get: (value: string): BaseStarter | undefined => {\n return this.starters.get(value);\n },\n getMany: (values: string[]): BaseStarter[] => {\n return values.map(value => this.starters.get(value)).filter(Boolean) as BaseStarter[];\n },\n getAll: (): BaseStarter[] => {\n return Array.from(this.starters.values());\n }\n }\n }\n}\n","import path from 'path';\nimport { BaseStarter } from '../../core/registry/starters/base-starter';\nimport type { ProjectSetupConfig } from '@/commands/init/types';\nimport { getPackageManagerCommand } from '@/core/package-manager';\nimport { runCommand } from '@/core/terminal';\n\nexport class NextJsStarter extends BaseStarter {\n id = 'nextjs';\n name = 'Next.js';\n description = 'A full-stack starter with Next.js';\n hint = 'Fullstack';\n repository = 'starter-nextjs';\n templates = [\n {\n template: path.resolve(process.cwd(), 'templates/starters/nextjs/route-handler.hbs'),\n outputPath: 'src/app/api/v1/[[...all]]/route.ts',\n },\n {\n template: path.resolve(process.cwd(), 'templates/starters/igniter.router.hbs'),\n outputPath: 'src/igniter.router.ts',\n },\n {\n template: path.resolve(process.cwd(), 'templates/starters/igniter.client.hbs'),\n outputPath: 'src/igniter.client.ts',\n },\n {\n template: path.resolve(process.cwd(), 'templates/starters/igniter.context.hbs'),\n outputPath: 'src/igniter.context.ts',\n },\n {\n template: path.resolve(process.cwd(), 'templates/starters/igniter.hbs'),\n outputPath: 'src/igniter.ts',\n },\n {\n template: path.resolve(process.cwd(), 'templates/scaffold/example-feature/example.controller.hbs'),\n outputPath: 'src/features/example/controllers/example.controller.ts',\n },\n {\n template: path.resolve(process.cwd(), 'templates/scaffold/example-feature/example.procedure.hbs'),\n outputPath: 'src/features/example/procedures/example.procedure.ts',\n },\n {\n template: path.resolve(process.cwd(), 'templates/scaffold/example-feature/example.interfaces.hbs'),\n outputPath: 'src/features/example/example.interfaces.ts',\n },\n {\n template: path.resolve(process.cwd(), 'templates/starters/nextjs/tsconfig.hbs'),\n outputPath: 'tsconfig.json',\n },\n {\n template: path.resolve(process.cwd(), 'templates/starters/open-api.hbs'),\n outputPath: 'src/docs/openapi.json',\n },\n ];\n dependencies = [\n { name: '@igniter-js/core', version: 'latest', type: 'dependency' },\n ];\n envVars = [\n { key: 'IGNITER_APP_NAME', value: 'Igniter App', description: 'Application name' },\n { key: 'IGNITER_APP_SECRET', value: 'my-secret-key', description: 'Application secret' },\n { key: 'IGNITER_API_URL', value: 'http://localhost:3000/', description: 'API URL' },\n { key: 'IGNITER_API_BASE_PATH', value: '/api/v1', description: 'API base path' },\n { key: 'NEXT_PUBLIC_IGNITER_API_URL', value: 'http://localhost:3000/', description: 'API URL' },\n { key: 'NEXT_PUBLIC_IGNITER_API_BASE_PATH', value: '/api/v1', description: 'API base path' },\n ];\n public async install(targetDir: string, options: ProjectSetupConfig): Promise<void> {\n let command = ''\n const baseOptions = `--typescript --eslint --tailwind --app-router --turbopack --src-dir --no-linter --use-${options.packageManager} --skip-install --disable-git --yes`;\n\n if(options.packageManager === 'npm') {\n command = `npx create-next-app@latest ${options.projectName} ${baseOptions}`;\n } else if(options.packageManager === 'yarn') {\n command = `yarn create next-app@latest ${options.projectName} ${baseOptions}`;\n } else if(options.packageManager === 'pnpm') {\n command = `pnpm create next-app@latest ${options.projectName} ${baseOptions}`;\n } else if(options.packageManager === 'bun') {\n command = `bun create next-app@latest ${options.projectName} ${baseOptions}`;\n }\n\n await runCommand(`${command}`);\n\n options.mode = 'install';\n return super.install(targetDir, options);\n }\n}\n","import * as path from \"path\";\nimport * as fs from \"fs/promises\";\nimport { execa } from \"execa\";\nimport { existsSync } from 'fs';\nimport type { RegistryAssetDependency, RegistryAssetEnvVar, RegistryAssetTemplate } from \"@/registry/types\";\nimport { readFile, writeFile } from 'fs/promises';\nimport { join } from 'path';\nimport * as handlebars from 'handlebars';\nimport { registerHandlebarsHelpers } from '../../handlebars-helpers';\nimport type { ProjectSetupConfig } from \"@/commands/init/types\";\n\nexport abstract class BaseStarter {\n abstract id: string;\n abstract name: string;\n abstract description: string;\n abstract hint: string;\n abstract repository: string;\n public templates: RegistryAssetTemplate[] = [\n {\n template: path.resolve(process.cwd(), 'templates/starters/igniter.router.hbs'),\n outputPath: 'src/igniter.router.ts',\n },\n {\n template: path.resolve(process.cwd(), 'templates/starters/igniter.client.hbs'),\n outputPath: 'src/igniter.client.ts',\n },\n {\n template: path.resolve(process.cwd(), 'templates/starters/igniter.context.hbs'),\n outputPath: 'src/igniter.context.ts',\n },\n {\n template: path.resolve(process.cwd(), 'templates/starters/igniter.hbs'),\n outputPath: 'src/igniter.ts',\n },\n {\n template: path.resolve(process.cwd(), 'templates/scaffold/example-feature/example.controller.hbs'),\n outputPath: 'src/features/example/controllers/example.controller.ts',\n },\n {\n template: path.resolve(process.cwd(), 'templates/scaffold/example-feature/example.procedure.hbs'),\n outputPath: 'src/features/example/procedures/example.procedure.ts',\n },\n {\n template: path.resolve(process.cwd(), 'templates/scaffold/example-feature/example.interfaces.hbs'),\n outputPath: 'src/features/example/example.interfaces.ts',\n },\n {\n template: path.resolve(process.cwd(), 'templates/starters/open-api.hbs'),\n outputPath: 'src/docs/openapi.json',\n },\n ];\n public dependencies: RegistryAssetDependency[] = [\n { name: '@igniter-js/core', version: 'latest', type: 'dependency' },\n ];\n public envVars: RegistryAssetEnvVar[] = [\n { key: 'IGNITER_APP_NAME', value: 'My App', description: 'Application name' },\n { key: 'IGNITER_APP_SECRET', value: 'my-secret-key', description: 'Application secret' },\n { key: 'IGNITER_API_BASE_PATH', value: '/api/v1', description: 'API base path' },\n ];\n\n /**\n * Install the starter\n */\n public async install(targetDir: string, options: ProjectSetupConfig): Promise<void> {\n if(options.mode === 'install') {\n await this.createProjectStructure(targetDir, options);\n } else {\n await this.download({ targetDir });\n }\n }\n\n /**\n * Create the project structure\n */\n private async createProjectStructure(targetDir: string, options: ProjectSetupConfig): Promise<void> {\n await this.addToPackageJson(targetDir);\n await this.addToEnvFile(targetDir);\n await this.renderTemplates(targetDir, options);\n }\n\n /**\n * Add dependencies to package.json file\n */\n private async addToPackageJson(projectDir: string): Promise<void> {\n const packageJsonPath = join(projectDir, 'package.json');\n\n let packageJson: any = {};\n if (existsSync(packageJsonPath)) {\n const content = await readFile(packageJsonPath, 'utf-8');\n packageJson = JSON.parse(content);\n }\n\n const dependencies = this.dependencies || [];\n const deps = dependencies.filter(d => d.type === 'dependency');\n const devDeps = dependencies.filter(d => d.type === 'devDependency');\n\n // Add regular dependencies (avoid duplicates)\n if (deps.length > 0) {\n packageJson.dependencies = packageJson.dependencies || {};\n deps.forEach(dep => {\n if (!packageJson.dependencies[dep.name]) {\n packageJson.dependencies[dep.name] = dep.version;\n }\n });\n }\n\n // Add dev dependencies (avoid duplicates)\n if (devDeps.length > 0) {\n packageJson.devDependencies = packageJson.devDependencies || {};\n devDeps.forEach(dep => {\n if (!packageJson.devDependencies[dep.name]) {\n packageJson.devDependencies[dep.name] = dep.version;\n }\n });\n }\n\n await writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2));\n }\n\n /**\n * Add environment variables to .env file\n */\n private async addToEnvFile(projectDir: string): Promise<void> {\n const envPath = join(projectDir, '.env');\n\n let envContent = '';\n if (existsSync(envPath)) {\n envContent = await readFile(envPath, 'utf-8');\n }\n\n // Parse existing env vars to avoid duplicates\n const existingVars = new Set<string>();\n const lines = envContent.split('\\n');\n lines.forEach(line => {\n const trimmed = line.trim();\n if (trimmed && !trimmed.startsWith('#') && trimmed.includes('=')) {\n const key = trimmed.split('=')[0];\n existingVars.add(key);\n }\n });\n\n const envVars = this.envVars || [];\n\n if (envVars.length > 0) {\n // Only add new env vars\n const newVars = envVars.filter(envVar => !existingVars.has(envVar.key));\n\n if (newVars.length > 0) {\n if (envContent && !envContent.endsWith('\\n\\n')) {\n envContent += '\\n';\n }\n\n newVars.forEach(envVar => {\n if (envVar.description) {\n envContent += `# ${envVar.description}\\n`;\n }\n envContent += `${envVar.key}=${envVar.value}\\n\\n`;\n });\n }\n }\n\n if (envContent.trim()) {\n await writeFile(envPath, envContent);\n }\n }\n\n /**\n * Render and create template files\n */\n private async renderTemplates(projectDir: string, data: ProjectSetupConfig): Promise<void> {\n // Register Handlebars helpers\n registerHandlebarsHelpers();\n\n const templates = this.templates || [];\n\n for (const template of templates) {\n try {\n // If template.template is a function, call it with the data\n if (typeof template.template === 'function') {\n template.template = template.template(data);\n }\n\n // Read template file\n const templateContent = await readFile(template.template as string, 'utf-8');\n\n // Compile and render template\n const compiledTemplate = handlebars.compile(templateContent);\n const renderedContent = compiledTemplate(data);\n\n // If template.outputPath is a function, call it with the data\n if (typeof template.outputPath === 'function') {\n template.outputPath = template.outputPath(data);\n }\n\n // Write to output path\n const outputPath = join(projectDir, template.outputPath);\n const outputDir = join(outputPath, '..');\n\n // Ensure output directory exists\n await import('fs').then(fs => {\n if (!fs.existsSync(outputDir)) {\n fs.mkdirSync(outputDir, { recursive: true });\n }\n });\n\n // Always overwrite the file if it already exists\n await writeFile(outputPath, renderedContent); // writeFile will overwrite by default\n } catch (error) {\n console.error(error);\n throw new Error(`Failed to render template ${template.template}: ${error}`);\n }\n }\n }\n\n /**\n * Download the starter template from the repository or path.\n *\n * Possible formats for this.repository:\n * - \"my-template\" (relative path inside igniter-js repository)\n * - \"felipebarcelospro/igniter-js/path/to/template\" (path inside public repo)\n * - \"org/repo\" (entire public repository)\n * - \"org/repo/path\" (a subpath inside a public repository)\n * - \"https://github.com/org/repo.git\" (whole repository, main branch)\n * - \"https://github.com/org/repo.git#branch:path\" (custom branch & path)\n */\n private async download({ targetDir }: { targetDir: string }): Promise<void> {\n const starter = this.repository\n const templateUrl = `https://github.com/felipebarcelospro/igniter-js.git`\n const branch = 'main'\n const tempDir = path.join(targetDir, '__igniter_tmp__')\n const starterDir = path.join(tempDir, 'apps', starter)\n const destDir = targetDir\n\n\n await fs.rm(tempDir, { recursive: true, force: true }).catch(() => {})\n await execa('git', [\n 'clone',\n '--depth', '1',\n '--branch', branch,\n '--single-branch',\n templateUrl,\n tempDir\n ])\n \n const stat = await fs.stat(starterDir).catch(() => null)\n if (!stat || !stat.isDirectory()) {\n throw new Error(`Starter directory '${starter}' not found in the repository.`)\n }\n\n const copyRecursive = async (src: string, dest: string) => {\n const entries = await fs.readdir(src, { withFileTypes: true })\n for (const entry of entries) {\n const srcPath = path.join(src, entry.name)\n const destPath = path.join(dest, entry.name)\n if (entry.isDirectory()) {\n await fs.mkdir(destPath, { recursive: true })\n await copyRecursive(srcPath, destPath)\n } else if (entry.isFile()) {\n await fs.copyFile(srcPath, destPath)\n }\n }\n }\n\n await copyRecursive(starterDir, destDir)\n\n await fs.rm(tempDir, { recursive: true, force: true }).catch(() => {})\n }\n}\n","import * as handlebars from \"handlebars\";\n\n/**\n * Register custom Handlebars helpers\n */\nexport function registerHandlebarsHelpers(): void {\n // Helper to check if an array includes a value\n handlebars.registerHelper(\"includes\", function (array: any[], value: any) {\n if (!Array.isArray(array)) {\n return false;\n }\n return array.includes(value);\n });\n\n // Helper to check if an array is empty\n handlebars.registerHelper(\"isEmpty\", function (array: any[]) {\n return !Array.isArray(array) || array.length === 0;\n });\n\n // Helper to check if a value is defined/not null\n handlebars.registerHelper(\"isDefined\", function (value: any) {\n return value !== null && value !== undefined;\n });\n\n // Helper to join array elements with a separator\n handlebars.registerHelper(\n \"join\",\n function (array: any[], separator: string = \", \") {\n if (!Array.isArray(array)) {\n return \"\";\n }\n return array.join(separator);\n },\n );\n\n // Capitalize a slug string (e.g. my-project -> My Project)\n handlebars.registerHelper(\"capitalizeSlug\", function (slug: string) {\n return slug\n .replace(/-/g, \" \")\n .replace(/\\b\\w/g, (char) => char.toUpperCase());\n });\n\n // Safely get a nested property from an object\n handlebars.registerHelper(\"get\", function (obj, path) {\n if (!path || typeof path !== \"string\") {\n return undefined;\n }\n const pathArray = path.split(\".\");\n let current = obj;\n for (let i = 0; i < pathArray.length; i++) {\n if (current === null || current === undefined) {\n return undefined;\n }\n current = current[pathArray[i]];\n }\n return current;\n });\n\n // Equality check\n handlebars.registerHelper(\"eq\", function (a, b) {\n return a === b;\n });\n\n // Convert string to camelCase (e.g., \"two-factor\" -> \"twoFactor\")\n handlebars.registerHelper(\"camelCase\", function (str: string) {\n if (!str) return str;\n if (str === \"email-otp\") return \"emailOTP\"; // Specific case for emailOTP\n if (str === \"open-api\") return \"openAPI\"; // Specific case for openAPI\n return str.replace(/-([a-z])/g, (g) => g[1].toUpperCase());\n });\n\n // Filters an array to exclude a specific item, like \"next-cookies\"\n handlebars.registerHelper(\"filterPlugins\", function (plugins: string[] = []) {\n if (!Array.isArray(plugins)) return [];\n return plugins.filter((p) => p !== \"next-cookies\");\n });\n\n // Generates all auth plugin import statements correctly\n handlebars.registerHelper(\n \"generatePluginImports\",\n function (plugins: string[] = []) {\n if (!Array.isArray(plugins) || plugins.length === 0) {\n return \"\";\n }\n\n // Re-implement camelCase logic locally to be self-contained\n const camelCase = (str: string) => {\n if (!str) return str;\n if (str === \"email-otp\") return \"emailOTP\";\n if (str === \"open-api\") return \"openAPI\";\n return str.replace(/-([a-z])/g, (g) => g[1].toUpperCase());\n };\n\n const regularPlugins = plugins\n .filter((p) => p !== \"next-cookies\")\n .map(camelCase);\n\n const hasNextCookies = plugins.includes(\"next-cookies\");\n\n const importStatements = [];\n\n if (regularPlugins.length > 0) {\n importStatements.push(\n `import { ${regularPlugins.join(\", \")} } from \"better-auth/plugins\";`,\n );\n }\n\n if (hasNextCookies) {\n importStatements.push(\n `import { nextCookies } from \"better-auth/next-js\";`,\n );\n }\n\n // Use SafeString to prevent Handlebars from escaping the output\n return new handlebars.SafeString(importStatements.join(\"\\n\"));\n },\n );\n}\n","import { spawn } from 'child_process';\nimport * as os from 'os';\n\n// Run a command on the terminal, supports all major OS and returns a result object\nexport function runCommand(command: string, options?: { cwd?: string }): Promise<{ success: boolean; errorMessage?: string }> {\n return new Promise((resolve) => {\n let cmd: string = 'cmd';\n\n if (os.platform() !== 'win32') cmd = command;\n\n const child = spawn(cmd, { shell: true, cwd: options?.cwd });\n\n child.on('close', (code) => {\n if (code === 0) {\n resolve({ success: true });\n } else {\n resolve({ success: false, errorMessage: `Command exited with code ${code}` });\n }\n });\n\n child.on('error', (err) => {\n resolve({ success: false, errorMessage: err.message });\n });\n });\n}\n\nexport function parseCommandOptions(data: Record<string, string | string[] | undefined>): string {\n return Object.entries(data).map(([key, value]) => {\n if (value === undefined) return '';\n if (Array.isArray(value)) {\n return value.map((v) => `--${key}=${v}`).join(' ');\n }\n return `--${key}=${value}`;\n }).join(' ');\n}","import { BaseStarter } from '@/core/registry/starters/base-starter';\nimport path from 'path';\n\nexport class ExpressStarter extends BaseStarter {\n id = 'express-rest-api';\n name = 'Express.js';\n description = 'A classic REST API starter with Express.js';\n hint = 'REST API';\n repository = 'starter-express-rest-api';\n envVars = [\n { key: 'IGNITER_APP_NAME', value: 'Igniter App', description: 'Application name' },\n { key: 'IGNITER_APP_SECRET', value: 'my-secret-key', description: 'Application secret' },\n { key: 'IGNITER_API_URL', value: 'http://localhost:3000/', description: 'API URL' },\n { key: 'IGNITER_API_BASE_PATH', value: '/api/v1', description: 'API base path' },\n ];\n}\n","import { BaseStarter } from '@/core/registry/starters/base-starter';\nimport path from 'path';\n\nexport class DenoStarter extends BaseStarter {\n id = 'deno-rest-api';\n name = 'Deno';\n description = 'A modern REST API starter with Deno';\n hint = 'REST API';\n repository = 'starter-deno-rest-api';\n envVars = [\n { key: 'IGNITER_APP_NAME', value: 'Igniter App', description: 'Application name' },\n { key: 'IGNITER_APP_SECRET', value: 'my-secret-key', description: 'Application secret' },\n { key: 'IGNITER_API_URL', value: 'http://localhost:3000/', description: 'API URL' },\n { key: 'IGNITER_API_BASE_PATH', value: '/api/v1', description: 'API base path' },\n ];\n}\n","import { BaseStarter } from '@/core/registry/starters/base-starter';\n\nexport class BunApiStarter extends BaseStarter {\n id = 'bun-rest-api';\n name = 'Bun';\n description = 'A high-performance REST API starter with Bun';\n hint = 'REST API';\n repository = 'starter-bun-rest-api';\n envVars = [\n { key: 'IGNITER_APP_NAME', value: 'Igniter App', description: 'Application name' },\n { key: 'IGNITER_APP_SECRET', value: 'my-secret-key', description: 'Application secret' },\n { key: 'IGNITER_API_URL', value: 'http://localhost:3000/', description: 'API URL' },\n { key: 'IGNITER_API_BASE_PATH', value: '/api/v1', description: 'API base path' },\n ];\n}\n","import { BaseStarter } from '@/core/registry/starters/base-starter';\n\nexport class BunReactStarter extends BaseStarter {\n id = 'bun-react-app';\n name = 'Bun + React (Vite)';\n description = 'A full-stack starter with Bun, React, and Vite';\n hint = 'Fullstack';\n repository = 'starter-bun-react-app';\n envVars = [\n { key: 'IGNITER_APP_NAME', value: 'Igniter App', description: 'Application name' },\n { key: 'IGNITER_APP_SECRET', value: 'my-secret-key', description: 'Application secret' },\n { key: 'IGNITER_API_URL', value: 'http://localhost:3000/', description: 'API URL' },\n { key: 'IGNITER_API_BASE_PATH', value: '/api/v1', description: 'API base path' },\n ];\n}\n","import { BaseStarter } from '@/core/registry/starters/base-starter';\nimport path from 'path';\n\nexport class TanStackStartStarter extends BaseStarter {\n id = 'tanstack-start';\n name = 'TanStack Start';\n description = 'A type-safe full-stack starter with TanStack Start';\n hint = 'Fullstack';\n repository = 'starter-tanstack-start';\n templates = [\n {\n template: path.resolve(process.cwd(), 'templates/starters/tanstack-start/route-handler.hbs'),\n outputPath: 'src/routes/api/v1/$.ts',\n },\n {\n template: path.resolve(process.cwd(), 'templates/starters/igniter.router.hbs'),\n outputPath: 'src/igniter.router.ts',\n },\n {\n template: path.resolve(process.cwd(), 'templates/starters/igniter.client.hbs'),\n outputPath: 'src/igniter.client.ts',\n },\n {\n template: path.resolve(process.cwd(), 'templates/starters/igniter.context.hbs'),\n outputPath: 'src/igniter.context.ts',\n },\n {\n template: path.resolve(process.cwd(), 'templates/starters/igniter.hbs'),\n outputPath: 'src/igniter.ts',\n },\n {\n template: path.resolve(process.cwd(), 'templates/scaffold/example-feature/example.controller.hbs'),\n outputPath: 'src/features/example/controllers/example.controller.ts',\n },\n {\n template: path.resolve(process.cwd(), 'templates/scaffold/example-feature/example.procedure.hbs'),\n outputPath: 'src/features/example/procedures/example.procedure.ts',\n },\n {\n template: path.resolve(process.cwd(), 'templates/scaffold/example-feature/example.interfaces.hbs'),\n outputPath: 'src/features/example/example.interfaces.ts',\n },\n {\n template: path.resolve(process.cwd(), 'templates/starters/tanstack-start/tsconfig.hbs'),\n outputPath: 'tsconfig.json',\n },\n {\n template: path.resolve(process.cwd(), 'templates/starters/open-api.hbs'),\n outputPath: 'src/docs/openapi.json',\n },\n ];\n dependencies = [\n { name: '@igniter-js/core', version: 'latest', type: 'dependency' },\n ];\n envVars = [\n { key: 'IGNITER_APP_NAME', value: 'Igniter App', description: 'Application name' },\n { key: 'IGNITER_APP_SECRET', value: 'my-secret-key', description: 'Application secret' },\n { key: 'IGNITER_API_URL', value: 'http://localhost:3000/', description: 'API URL' },\n { key: 'IGNITER_API_BASE_PATH', value: '/api/v1', description: 'API base path' },\n { key: 'REACT_APP_IGNITER_API_URL', value: 'http://localhost:3000/', description: 'API URL' },\n { key: 'REACT_APP_IGNITER_API_BASE_PATH', value: '/api/v1', description: 'API base path' },\n ];\n}\n","import { StarterRegistry } from \"@/core/registry/starters/starter-registry\";\nimport { NextJsStarter } from \"./nextjs-starter\";\nimport { ExpressStarter } from \"./express-starter\";\nimport { DenoStarter } from \"./deno-starter\";\nimport { BunApiStarter } from \"./bun-api-starter\";\nimport { BunReactStarter } from \"./bun-react-starter\";\nimport { TanStackStartStarter } from \"./tanstack-start-starter\";\n\n/**\n * Starter registry\n */\nexport const starterRegistry = StarterRegistry.create()\n .register(new NextJsStarter())\n .register(new ExpressStarter())\n .register(new DenoStarter())\n .register(new BunApiStarter())\n .register(new BunReactStarter())\n .register(new TanStackStartStarter())\n .build();","import type { BaseAddOn } from \"./base-addon\";\n\nexport class AddOnRegistry {\n private addOns = new Map<string, BaseAddOn>();\n\n static create() {\n return new AddOnRegistry();\n }\n\n register(addOn: BaseAddOn) {\n this.addOns.set(addOn.value, addOn);\n return this;\n }\n\n build() {\n return {\n get: (value: string): BaseAddOn | undefined => {\n return this.addOns.get(value);\n },\n getMany: (values: string[]): BaseAddOn[] => {\n return values\n .map((value) => this.addOns.get(value))\n .filter(Boolean) as BaseAddOn[];\n },\n getAll: (): BaseAddOn[] => {\n return Array.from(this.addOns.values());\n },\n };\n }\n}\n\n// Legacy type alias for backward compatibility\nexport type FeatureRegistry = AddOnRegistry;\n","import path from \"path\";\nimport { BaseAddOn } from \"@/core/registry/add-ons/base-addon\";\n\nexport class RedisStoreAddOn extends BaseAddOn {\n name = \"Store\";\n description = \"Caching, sessions, and pub/sub messaging\";\n value = \"store\";\n hint = \"Recommended\";\n templates = [\n {\n template: path.resolve(\n process.cwd(),\n \"templates/add-ons/store/redis.ts.hbs\",\n ),\n outputPath: \"src/services/redis.ts\",\n },\n {\n template: path.resolve(\n process.cwd(),\n \"templates/add-ons/store/store.ts.hbs\",\n ),\n outputPath: \"src/services/store.ts\",\n },\n ];\n dependencies = [\n {\n name: \"@igniter-js/adapter-redis\",\n version: \"latest\",\n type: \"dependency\",\n },\n {\n name: \"ioredis\",\n version: \"5.6.1\",\n type: \"dependency\",\n },\n {\n name: \"@types/ioredis\",\n version: \"4.28.10\",\n type: \"devDependency\",\n },\n ];\n dockerServices = [\n {\n name: \"redis\",\n image: \"redis:7-alpine\",\n ports: [\"6379:6379\"],\n environment: {\n REDIS_PASSWORD: \"${REDIS_PASSWORD}\",\n },\n volumes: [\"redis_data:/data\"],\n },\n ];\n envVars = [\n {\n key: \"REDIS_URL\",\n value: \"redis://localhost:6379\",\n description: \"Redis connection URL\",\n },\n {\n key: \"REDIS_HOST\",\n value: \"localhost\",\n description: \"Redis host\",\n },\n {\n key: \"REDIS_PORT\",\n value: \"6379\",\n description: \"Redis port\",\n },\n {\n key: \"REDIS_PASSWORD\",\n value: \"\",\n description: \"Redis password (leave empty for no password)\",\n },\n ];\n}\n","import type {\n AddOnOption,\n RegistryAssetDependency,\n RegistryAssetDockerService,\n RegistryAssetEnvVar,\n RegistryAssetTemplate,\n} from \"@/registry/types\";\nimport { readFile, writeFile } from \"fs/promises\";\nimport { existsSync } from \"fs\";\nimport { join } from \"path\";\nimport * as handlebars from \"handlebars\";\nimport { registerHandlebarsHelpers } from \"../../handlebars-helpers\";\nimport type { ProjectSetupConfig } from \"@/commands/init/types\";\n\ntype SetupFunction = (\n projectDir: string,\n config: ProjectSetupConfig,\n) => Promise<void>;\n\n// Export the new class\nexport abstract class BaseAddOn {\n abstract name: string;\n abstract description: string;\n abstract value: string;\n abstract hint?: string;\n templates?: RegistryAssetTemplate[];\n dependencies?: RegistryAssetDependency[];\n dockerServices?: RegistryAssetDockerService[];\n envVars?: RegistryAssetEnvVar[];\n options?: AddOnOption[];\n\n\n public async runSetup(\n projectDir: string,\n config: ProjectSetupConfig,\n ): Promise<void> {\n // Orchestrate only: each method self-collects its required assets\n await this.addToPackageJson(projectDir, config);\n await this.addToDockerCompose(projectDir, config);\n await this.addToEnvFile(projectDir, config);\n await this.renderTemplates(projectDir, config);\n }\n\n /**\n * Add dependencies to package.json file\n */\n private async addToPackageJson(\n projectDir: string,\n config: ProjectSetupConfig,\n ): Promise<void> {\n // Collect dependencies from base add-on and selected options\n const selectedOptions = config.addOnOptions?.[this.value] || {};\n const collectDependencies = (options: AddOnOption[] = []): RegistryAssetDependency[] => {\n const out: RegistryAssetDependency[] = [];\n for (const option of options) {\n const selectedValue = selectedOptions[option.key];\n if (!selectedValue) continue;\n if (option.setup) {\n // setup functions are handled elsewhere\n }\n const selectedChoices = Array.isArray(selectedValue)\n ? selectedValue\n : [selectedValue];\n for (const value of selectedChoices) {\n const choice = option.choices.find((c) => c.value === value);\n if (!choice) continue;\n if (choice.dependencies) out.push(...choice.dependencies);\n if (choice.subOptions) out.push(...collectDependencies(choice.subOptions));\n }\n }\n return out;\n };\n\n const dependencies: RegistryAssetDependency[] = [\n ...(this.dependencies || []),\n ...collectDependencies(this.options || []),\n ];\n const packageJsonPath = join(projectDir, \"package.json\");\n\n let packageJson: any = {};\n if (existsSync(packageJsonPath)) {\n const content = await readFile(packageJsonPath, \"utf-8\");\n packageJson = JSON.parse(content);\n }\n\n const deps = dependencies.filter((d) => d.type === \"dependency\");\n const devDeps = dependencies.filter((d) => d.type === \"devDependency\");\n\n // Add regular dependencies (avoid duplicates)\n if (deps.length > 0) {\n packageJson.dependencies = packageJson.dependencies || {};\n deps.forEach((dep) => {\n if (!packageJson.dependencies[dep.name]) {\n packageJson.dependencies[dep.name] = dep.version;\n }\n });\n }\n\n // Add dev dependencies (avoid duplicates)\n if (devDeps.length > 0) {\n packageJson.devDependencies = packageJson.devDependencies || {};\n devDeps.forEach((dep) => {\n if (!packageJson.devDependencies[dep.name]) {\n packageJson.devDependencies[dep.name] = dep.version;\n }\n });\n }\n\n await writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2));\n }\n\n /**\n * Add services to docker-compose.yml file\n */\n private async addToDockerCompose(\n projectDir: string,\n config: ProjectSetupConfig,\n ): Promise<void> {\n // Collect docker services and env vars from base and selected options\n const selectedOptions = config.addOnOptions?.[this.value] || {};\n const collectDocker = (options: AddOnOption[] = []): {\n services: RegistryAssetDockerService[];\n envVars: RegistryAssetEnvVar[];\n } => {\n const services: RegistryAssetDockerService[] = [];\n const envVars: RegistryAssetEnvVar[] = [];\n for (const option of options) {\n const selectedValue = selectedOptions[option.key];\n if (!selectedValue) continue;\n const selectedChoices = Array.isArray(selectedValue)\n ? selectedValue\n : [selectedValue];\n for (const value of selectedChoices) {\n const choice = option.choices.find((c) => c.value === value);\n if (!choice) continue;\n if (choice.dockerServices) services.push(...choice.dockerServices);\n if (choice.envVars) envVars.push(...choice.envVars);\n if (choice.subOptions) {\n const sub = collectDocker(choice.subOptions);\n services.push(...sub.services);\n envVars.push(...sub.envVars);\n }\n }\n }\n return { services, envVars };\n };\n\n const fromOptions = collectDocker(this.options || []);\n const dockerServices: RegistryAssetDockerService[] = [\n ...(this.dockerServices || []),\n ...fromOptions.services,\n ];\n const envVars: RegistryAssetEnvVar[] = [\n ...(this.envVars || []),\n ...fromOptions.envVars,\n ];\n const dockerComposePath = join(projectDir, \"docker-compose.yml\");\n\n let dockerCompose: any = {};\n if (existsSync(dockerComposePath)) {\n const content = await readFile(dockerComposePath, \"utf-8\");\n try {\n dockerCompose = JSON.parse(content);\n } catch {\n // If it's not JSON, assume it's YAML and parse it\n // For now, we'll recreate the file if it exists\n dockerCompose = {};\n }\n }\n\n const services = dockerServices;\n const resolvedEnvVars = envVars?.reduce(\n (acc, envVar) => {\n acc[envVar.key] = envVar.value;\n return acc;\n },\n {} as Record<string, string>,\n );\n\n if (services.length > 0) {\n dockerCompose.services = dockerCompose.services || {};\n\n services.forEach((service) => {\n // Skip if service already exists\n if (dockerCompose.services[service.name]) {\n return;\n }\n\n // Replace environment variable placeholders with actual values\n const processedEnvironment = { ...service.environment };\n Object.keys(processedEnvironment).forEach((key) => {\n const value = processedEnvironment[key];\n // Replace ${VAR_NAME} with actual env var value\n if (\n typeof value === \"string\" &&\n value.startsWith(\"${\") &&\n value.endsWith(\"}\")\n ) {\n const envVarName = value.slice(2, -1); // Remove ${}\n if (resolvedEnvVars && resolvedEnvVars[envVarName]) {\n processedEnvironment[key] = resolvedEnvVars[envVarName];\n }\n }\n });\n\n dockerCompose.services[service.name] = {\n image: service.image,\n ports: service.ports,\n environment: processedEnvironment,\n volumes: service.volumes,\n };\n });\n\n // Add volumes if any service defines them\n const volumes = services\n .filter((s) => s.volumes)\n .flatMap((s) => s.volumes)\n .filter((volume) => !volume.startsWith(\"/\")) // Exclude host mounts\n .map((volume) => volume.split(\":\")[0])\n .filter((volume, index, arr) => arr.indexOf(volume) === index); // Unique\n\n if (volumes.length > 0) {\n dockerCompose.volumes = dockerCompose.volumes || {};\n volumes.forEach((volume) => {\n if (!dockerCompose.volumes[volume]) {\n dockerCompose.volumes[volume] = {};\n }\n });\n }\n }\n\n // Write the docker-compose file as YAML\n let yamlContent = \"version: '3.8'\\n\\n\";\n if (\n dockerCompose.services &&\n Object.keys(dockerCompose.services).length > 0\n ) {\n yamlContent += \"services:\\n\";\n Object.entries(dockerCompose.services).forEach(\n ([name, service]: [string, any]) => {\n yamlContent += ` ${name}:\\n`;\n yamlContent += ` image: ${service.image}\\n`;\n if (service.ports && service.ports.length > 0) {\n yamlContent += ` ports:\\n`;\n service.ports.forEach((port: string) => {\n yamlContent += ` - \"${port}\"\\n`;\n });\n }\n if (\n service.environment &&\n Object.keys(service.environment).length > 0\n ) {\n yamlContent += ` environment:\\n`;\n Object.entries(service.environment).forEach(([key, value]) => {\n yamlContent += ` ${key}: ${value}\\n`;\n });\n }\n if (service.volumes && service.volumes.length > 0) {\n yamlContent += ` volumes:\\n`;\n service.volumes.forEach((volume: string) => {\n yamlContent += ` - ${volume}\\n`;\n });\n }\n yamlContent += \"\\n\";\n },\n );\n }\n\n if (\n dockerCompose.volumes &&\n Object.keys(dockerCompose.volumes).length > 0\n ) {\n yamlContent += \"volumes:\\n\";\n Object.keys(dockerCompose.volumes).forEach((volume) => {\n yamlContent += ` ${volume}:\\n`;\n });\n }\n\n await writeFile(dockerComposePath, yamlContent);\n }\n\n /**\n * Add environment variables to .env file\n */\n private async addToEnvFile(\n projectDir: string,\n config: ProjectSetupConfig,\n ): Promise<void> {\n // Collect env vars from base and selected options\n const selectedOptions = config.addOnOptions?.[this.value] || {};\n const collectEnvVars = (options: AddOnOption[] = []): RegistryAssetEnvVar[] => {\n const out: RegistryAssetEnvVar[] = [];\n for (const option of options) {\n const selectedValue = selectedOptions[option.key];\n if (!selectedValue) continue;\n const selectedChoices = Array.isArray(selectedValue)\n ? selectedValue\n : [selectedValue];\n for (const value of selectedChoices) {\n const choice = option.choices.find((c) => c.value === value);\n if (!choice) continue;\n if (choice.envVars) out.push(...choice.envVars);\n if (choice.subOptions) out.push(...collectEnvVars(choice.subOptions));\n }\n }\n return out;\n };\n\n const envVars: RegistryAssetEnvVar[] = [\n ...(this.envVars || []),\n ...collectEnvVars(this.options || []),\n ];\n const envPath = join(projectDir, \".env\");\n\n let envContent = \"\";\n if (existsSync(envPath)) {\n envContent = await readFile(envPath, \"utf-8\");\n }\n\n // Parse existing env vars to avoid duplicates\n const existingVars = new Set<string>();\n const lines = envContent.split(\"\\n\");\n lines.forEach((line) => {\n const trimmed = line.trim();\n if (trimmed && !trimmed.startsWith(\"#\") && trimmed.includes(\"=\")) {\n const key = trimmed.split(\"=\")[0];\n existingVars.add(key);\n }\n });\n\n if (envVars.length > 0) {\n // Only add new env vars\n const newVars = envVars.filter((envVar) => !existingVars.has(envVar.key));\n\n if (newVars.length > 0) {\n if (envContent && !envContent.endsWith(\"\\n\\n\")) {\n envContent += \"\\n\";\n }\n\n newVars.forEach((envVar) => {\n if (envVar.description) {\n envContent += `# ${envVar.description}\\n`;\n }\n envContent += `${envVar.key}=${envVar.value}\\n\\n`;\n });\n }\n }\n\n if (envContent.trim()) {\n await writeFile(envPath, envContent);\n }\n }\n\n /**\n * Render and create template files\n */\n private async renderTemplates(\n projectDir: string,\n config: ProjectSetupConfig,\n ): Promise<void> {\n // Collect templates from base and selected options\n const selectedOptions = config.addOnOptions?.[this.value] || {};\n const collectTemplates = (options: AddOnOption[] = []): RegistryAssetTemplate[] => {\n const out: RegistryAssetTemplate[] = [];\n for (const option of options) {\n const selectedValue = selectedOptions[option.key];\n if (!selectedValue) continue;\n const selectedChoices = Array.isArray(selectedValue)\n ? selectedValue\n : [selectedValue];\n for (const value of selectedChoices) {\n const choice = option.choices.find((c) => c.value === value);\n if (!choice) continue;\n if (choice.templates) out.push(...choice.templates);\n if (choice.subOptions) out.push(...collectTemplates(choice.subOptions));\n }\n }\n return out;\n };\n\n const templates: RegistryAssetTemplate[] = [\n ...(this.templates || []),\n ...collectTemplates(this.options || []),\n ];\n // Register Handlebars helpers\n registerHandlebarsHelpers();\n\n // Create enhanced template context with add-on options\n const templateData = {\n ...config,\n enabledAddOns: config.addOns || [],\n addOnOptions: config.addOnOptions || {},\n };\n\n for (const template of templates) {\n try {\n // If template.template is a function, call it with the data\n if (typeof template.template === \"function\") {\n template.template = template.template(config);\n }\n\n if (!template.template) continue;\n\n // Read template file\n const templateContent = await readFile(template.template, \"utf-8\");\n\n // Compile and render template\n const compiledTemplate = handlebars.compile(templateContent);\n const renderedContent = compiledTemplate(templateData);\n\n // Write to output path\n if (typeof template.outputPath === \"function\") {\n template.outputPath = template.outputPath(config);\n }\n\n const outputPath = join(projectDir, template.outputPath);\n const outputDir = join(outputPath, \"..\");\n\n // Ensure output directory exists\n await import(\"fs\").then((fs) => {\n if (!fs.existsSync(outputDir)) {\n fs.mkdirSync(outputDir, { recursive: true });\n }\n });\n\n // Always overwrite the file if it already exists\n await writeFile(outputPath, renderedContent); // writeFile will overwrite by default\n } catch (error) {\n console.error(error);\n throw new Error(\n `Failed to render template ${template.template}: ${error}`,\n );\n }\n }\n }\n\n private _collectSetupSteps(\n options: AddOnOption[],\n selectedOptions: Record<string, string[] | string | undefined>,\n ): SetupFunction[] {\n const steps: SetupFunction[] = [];\n for (const option of options) {\n const selectedValue = selectedOptions[option.key];\n if (selectedValue) {\n if (option.setup) {\n steps.push(option.setup);\n }\n const selectedChoices = Array.isArray(selectedValue)\n ? selectedValue\n : [selectedValue];\n for (const value of selectedChoices) {\n const choice = option.choices.find((c) => c.value === value);\n if (choice?.subOptions) {\n steps.push(\n ...this._collectSetupSteps(choice.subOptions, selectedOptions),\n );\n }\n }\n }\n }\n return steps;\n }\n\n /**\n * Execute all setup functions from selected add-on options.\n */\n public async runPostInstall(\n projectDir: string,\n config: ProjectSetupConfig,\n ): Promise<void> {\n const selectedOptions = config.addOnOptions?.[this.value] || {};\n const setups = this._collectSetupSteps(this.options || [], selectedOptions);\n for (const setup of setups) {\n await setup(projectDir, config);\n }\n }\n}\n","import { BaseAddOn } from \"@/core/registry/add-ons/base-addon\";\nimport path from \"path\";\n\nexport class JobsAddOn extends BaseAddOn {\n name = \"Jobs\";\n description = \"Background task processing and job queues\";\n value = \"jobs\";\n hint = \"For background processing\";\n templates = [\n {\n template: path.resolve(\n process.cwd(),\n \"templates/add-ons/jobs/jobs.ts.hbs\",\n ),\n outputPath: \"src/services/jobs.ts\",\n },\n {\n template: path.resolve(\n process.cwd(),\n \"templates/add-ons/jobs/redis.ts.hbs\",\n ),\n outputPath: \"src/services/redis.ts\",\n },\n {\n template: path.resolve(\n process.cwd(),\n \"templates/add-ons/jobs/store.ts.hbs\",\n ),\n outputPath: \"src/services/store.ts\",\n },\n ];\n dependencies = [\n {\n name: \"@igniter-js/adapter-redis\",\n version: \"latest\",\n type: \"dependency\",\n },\n {\n name: \"@igniter-js/adapter-bullmq\",\n version: \"latest\",\n type: \"dependency\",\n },\n {\n name: \"bullmq\",\n version: \"5.58.7\",\n type: \"dependency\",\n },\n {\n name: \"ioredis\",\n version: \"5.6.1\",\n type: \"dependency\",\n },\n {\n name: \"@types/ioredis\",\n version: \"4.28.10\",\n type: \"devDependency\",\n },\n ];\n dockerServices = [\n {\n name: \"redis\",\n image: \"redis:7-alpine\",\n ports: [\"6379:6379\"],\n environment: {\n REDIS_PASSWORD: \"${REDIS_PASSWORD}\",\n },\n volumes: [\"redis_data:/data\"],\n },\n ];\n envVars = [\n {\n key: \"REDIS_URL\",\n value: \"redis://localhost:6379\",\n description: \"Redis connection URL\",\n },\n {\n key: \"REDIS_HOST\",\n value: \"localhost\",\n description: \"Redis host\",\n },\n {\n key: \"REDIS_PORT\",\n value: \"6379\",\n description: \"Redis port\",\n },\n {\n key: \"REDIS_PASSWORD\",\n value: \"\",\n description: \"Redis password (leave empty for no password)\",\n },\n {\n key: \"IGNITER_JOBS_QUEUE_PREFIX\",\n value: \"igniter\",\n description: \"Job queue prefix\",\n },\n ];\n}\n","import type { ProjectSetupConfig } from \"@/commands/init/types\";\nimport { BaseAddOn } from \"@/core/registry/add-ons/base-addon\";\nimport path from \"path\";\nimport { z } from \"zod\";\n\nexport class McpServerAddOn extends BaseAddOn {\n name = \"MCP Server\";\n description = \"AI assistant integration with Model Context Protocol\";\n value = \"mcp\";\n hint = \"For AI integration\";\n templates = [\n {\n template: path.resolve(\n process.cwd(),\n \"templates/add-ons/mcp/mcp.ts.hbs\",\n ),\n outputPath: \"src/igniter.mcp.ts\",\n },\n {\n template: (data: ProjectSetupConfig) => {\n const templates = {\n nextjs: path.resolve(\n process.cwd(),\n \"templates/add-ons/mcp/nextjs/route-handler.hbs\",\n ),\n \"tanstack-start\": path.resolve(\n process.cwd(),\n \"templates/add-ons/mcp/tanstack-start/route-handler.hbs\",\n ),\n };\n\n return templates[data.starter as keyof typeof templates] || \"\";\n },\n outputPath: (data: ProjectSetupConfig) => {\n const outputPaths = {\n nextjs: \"src/app/api/mcp/[...transport]/route.ts\",\n \"tanstack-start\": \"src/routes/mcp/$.ts\",\n };\n\n return outputPaths[data.starter as keyof typeof outputPaths] || \"\";\n },\n },\n ];\n dependencies = [\n {\n name: \"@igniter-js/adapter-mcp-server\",\n version: \"latest\",\n type: \"dependency\",\n },\n {\n name: \"ioredis\",\n version: \"5.6.1\",\n type: \"dependency\",\n },\n {\n name: \"@types/ioredis\",\n version: \"4.28.10\",\n type: \"devDependency\",\n },\n ];\n dockerServices = [\n {\n name: \"redis\",\n image: \"redis:7-alpine\",\n ports: [\"6379:6379\"],\n environment: {\n REDIS_PASSWORD: \"${REDIS_PASSWORD}\",\n },\n volumes: [\"redis_data:/data\"],\n },\n ];\n envVars = [\n {\n key: \"IGNITER_MCP_SERVER_BASE_PATH\",\n value: \"/mcp\",\n description: \"MCP server base path\",\n },\n {\n key: \"IGNITER_MCP_SERVER_TIMEOUT\",\n value: \"3600000\",\n description: \"MCP session timeout in ms\",\n },\n {\n key: \"REDIS_URL\",\n value: \"redis://localhost:6379\",\n description: \"Redis connection URL\",\n },\n {\n key: \"REDIS_HOST\",\n value: \"localhost\",\n description: \"Redis host\",\n },\n {\n key: \"REDIS_PORT\",\n value: \"6379\",\n description: \"Redis port\",\n },\n {\n key: \"REDIS_PASSWORD\",\n value: \"\",\n description: \"Redis password (leave empty for no password)\",\n },\n ];\n}\n","import { BaseAddOn } from \"@/core/registry/add-ons/base-addon\";\nimport path from \"path\";\n\nexport class LoggingAddOn extends BaseAddOn {\n name = \"Logging\";\n description = \"Advanced console logging with structured output\";\n value = \"logging\";\n hint = \"For better observability\";\n templates = [\n {\n template: path.resolve(\n process.cwd(),\n \"templates/add-ons/logging/logger.ts.hbs\",\n ),\n outputPath: \"src/services/logger.ts\",\n },\n ];\n dependencies = [\n {\n name: \"@igniter-js/core\",\n version: \"latest\",\n type: \"dependency\",\n },\n ];\n dockerServices = [];\n envVars = [\n {\n key: \"IGNITER_LOG_LEVEL\",\n value: \"info\",\n description: \"Logging level (debug, info, warn, error)\",\n },\n ];\n}\n","import { BaseAddOn } from \"@/core/registry/add-ons/base-addon\";\nimport path from \"path\";\n\nexport class TelemetryAddOn extends BaseAddOn {\n name = \"Telemetry\";\n description = \"Telemetry for tracking requests and errors\";\n value = \"telemetry\";\n hint = \"For observability\";\n dockerServices = [];\n templates = [\n {\n template: path.resolve(\n process.cwd(),\n \"templates/add-ons/telemetry/telemetry.ts.hbs\",\n ),\n outputPath: \"src/services/telemetry.ts\",\n },\n ];\n dependencies = [\n {\n name: \"@igniter-js/core\",\n version: \"latest\",\n type: \"dependency\",\n },\n ];\n envVars = [\n {\n key: \"IGNITER_TELEMETRY_ENABLE_TRACING\",\n value: \"true\",\n description: \"Enable telemetry tracing\",\n },\n {\n key: \"IGNITER_TELEMETRY_ENABLE_METRICS\",\n value: \"true\",\n description: \"Enable telemetry metrics\",\n },\n {\n key: \"IGNITER_TELEMETRY_ENABLE_EVENTS\",\n value: \"true\",\n description: \"Enable telemetry events\",\n },\n {\n key: \"IGNITER_TELEMETRY_ENABLE_CLI_INTEGRATION\",\n value: \"true\",\n description: \"Enable telemetry CLI integration\",\n },\n ];\n}\n","import type { ProjectSetupConfig } from \"@/commands/init/types\";\nimport { BaseAddOn } from \"@/core/registry/add-ons/base-addon\";\nimport path from \"path\";\n\nexport class BotsAddOn extends BaseAddOn {\n name = \"Bots (Telegram, WhatsApp, Discord, etc.)\";\n description = \"Multi-platform chatbot support\";\n value = \"bots\";\n hint = \"For multi-platform chatbot support\";\n templates = [\n {\n template: path.resolve(\n process.cwd(),\n \"templates/add-ons/bots/sample-bot.hbs\",\n ),\n outputPath: \"src/bots/sample-bot.ts\",\n },\n {\n template: (data: ProjectSetupConfig) => {\n const templates = {\n nextjs: path.resolve(\n process.cwd(),\n \"templates/add-ons/bots/nextjs/route-handler.hbs\",\n ),\n \"tanstack-start\": path.resolve(\n process.cwd(),\n \"templates/add-ons/bots/tanstack-start/route-handler.hbs\",\n ),\n };\n\n return templates[data.starter as keyof typeof templates] || \"\";\n },\n outputPath: (data: ProjectSetupConfig) => {\n const outputPaths = {\n nextjs: \"src/app/api/bots/[provider]/[botId]/route.ts\",\n \"tanstack-start\": \"src/routes/api/bots/$provider/$botId.ts\",\n };\n\n return outputPaths[data.starter as keyof typeof outputPaths] || \"\";\n },\n },\n ];\n dependencies = [\n {\n name: \"@igniter-js/bot\",\n version: \"alpha\",\n type: \"dependency\",\n },\n ];\n envVars = [\n {\n key: \"TELEGRAM_TOKEN\",\n value: \"\",\n description: \"Telegram bot token\",\n },\n {\n key: \"TELEGRAM_WEBHOOK_URL\",\n value: \"\",\n description: \"Telegram webhook URL\",\n },\n {\n key: \"TELEGRAM_WEBHOOK_SECRET\",\n value: \"\",\n description: \"Telegram webhook secret\",\n },\n ];\n}\n","import type { ProjectSetupConfig } from \"@/commands/init/types\";\nimport { getPackageManagerCommand } from \"@/core/package-manager\";\nimport { BaseAddOn } from \"@/core/registry/add-ons/base-addon\";\nimport { runCommand } from \"@/core/terminal\";\nimport path from \"path\";\n\nexport class DatabaseAddOn extends BaseAddOn {\n name = \"Database\";\n description = \"Database integration with multiple ORMs and providers\";\n value = \"database\";\n hint = \"Essential for data persistence\";\n options = [\n {\n key: \"orm\",\n message: \"Choose your preferred ORM for type-safe database operations\",\n multiple: false,\n required: true,\n choices: [\n {\n value: \"prisma\",\n label: \"Prisma\",\n hint: \"Type-safe, mature, excellent tooling\",\n dependencies: [\n {\n name: \"dotenv\",\n type: \"dependency\",\n version: \"latest\",\n },\n {\n name: \"prisma\",\n type: \"dependency\",\n version: \"^6.19.0\",\n },\n {\n name: \"@prisma/client\",\n type: \"dependency\",\n version: \"^6.19.0\",\n }\n ],\n templates: [\n {\n template: path.resolve(\n process.cwd(),\n \"templates/add-ons/database/prisma/lib.hbs\",\n ),\n outputPath: \"src/lib/database.ts\",\n },\n {\n template: path.resolve(\n process.cwd(),\n \"templates/add-ons/database/prisma/prisma.config.hbs\",\n ),\n outputPath: \"prisma.config.ts\",\n },\n {\n template: path.resolve(\n process.cwd(),\n \"templates/add-ons/database/prisma/schema.hbs\",\n ),\n outputPath: \"prisma/schema.prisma\",\n }\n ],\n },\n {\n value: \"drizzle\",\n label: \"Drizzle ORM\",\n hint: \"Lightweight, modern, SQL-like\",\n templates: [\n {\n template: path.resolve(\n process.cwd(),\n \"templates/add-ons/database/drizzle/lib.hbs\",\n ),\n outputPath: \"src/lib/database.ts\",\n },\n ],\n },\n ],\n },\n {\n key: \"provider\",\n message: \"Choose the database engine\",\n multiple: false,\n required: true,\n choices: [\n {\n value: \"postgresql\",\n label: \"PostgreSQL\",\n hint: \"Production-ready, full-featured\",\n dockerServices: [\n {\n name: \"postgres\",\n image: \"postgres:16-alpine\",\n ports: [\"5432:5432\"],\n environment: {\n POSTGRES_DB: \"${DATABASE_NAME}\",\n POSTGRES_USER: \"${DATABASE_USER}\",\n POSTGRES_PASSWORD: \"${DATABASE_PASSWORD}\",\n },\n volumes: [\"postgres_data:/var/lib/postgresql/data\"],\n },\n ],\n envVars: [\n {\n key: \"DATABASE_URL\",\n value:\n \"postgresql://igniter:${DATABASE_PASSWORD}@localhost:5432/igniter_db\",\n description: \"PostgreSQL connection string\",\n },\n {\n key: \"DATABASE_PASSWORD\",\n value: \"igniter\",\n description: \"Database password\",\n },\n {\n key: \"DATABASE_USER\",\n value: \"igniter\",\n description: \"Database username\",\n },\n ],\n },\n {\n value: \"mysql\",\n label: \"MySQL\",\n hint: \"Wide compatibility, popular\",\n dockerServices: [\n {\n name: \"mysql\",\n image: \"mysql:8.0\",\n ports: [\"3306:3306\"],\n environment: {\n MYSQL_ROOT_PASSWORD: \"${DATABASE_PASSWORD}\",\n MYSQL_DATABASE: \"${DATABASE_NAME}\",\n MYSQL_USER: \"${DATABASE_USER}\",\n MYSQL_PASSWORD: \"${DATABASE_PASSWORD}\",\n },\n volumes: [\"mysql_data:/var/lib/mysql\"],\n },\n ],\n envVars: [\n {\n key: \"DATABASE_URL\",\n value:\n \"mysql://igniter:${DATABASE_PASSWORD}@localhost:3306/igniter_db\",\n description: \"MySQL connection string\",\n },\n {\n key: \"DATABASE_PASSWORD\",\n value: \"docker\",\n description: \"Database password\",\n },\n {\n key: \"DATABASE_USER\",\n value: \"docker\",\n description: \"Database username\",\n },\n {\n key: \"DATABASE_NAME\",\n value: \"docker\",\n description: \"Database name\",\n },\n ],\n },\n {\n value: \"sqlite\",\n label: \"SQLite\",\n hint: \"Local development, file-based\",\n envVars: [\n {\n key: \"DATABASE_URL\",\n value: \"file:./dev.db\",\n description: \"SQLite database file path\",\n },\n ],\n },\n ],\n setup: async (projectDir: string, config: ProjectSetupConfig) => {\n // if database.orm is prisma, we need use prisma cli to setup the database\n if (config.addOnOptions?.database?.orm === \"prisma\") {\n const command = getPackageManagerCommand(\n config.packageManager,\n \"prisma\",\n );\n await runCommand(`${command} generate`, { cwd: projectDir });\n }\n // if database.orm is drizzle, we need use drizzle cli to setup the database\n if (config.addOnOptions?.database?.orm === \"drizzle\") {\n const command = getPackageManagerCommand(\n config.packageManager,\n \"drizzle\",\n );\n await runCommand(`${command} init`, { cwd: projectDir });\n }\n },\n },\n ];\n}\n","import path from \"node:path\";\nimport type { ProjectSetupConfig } from \"@/commands/init/types\";\nimport { getPackageManagerCommand } from \"@/core/package-manager\";\nimport { BaseAddOn } from \"@/core/registry/add-ons/base-addon\";\nimport { parseCommandOptions, runCommand } from \"@/core/terminal\";\nimport * as p from \"@clack/prompts\";\n\nexport class AuthAddOn extends BaseAddOn {\n name = \"Authentication\";\n description = \"Authentication and authorization\";\n value = \"auth\";\n hint = \"Essential for user authentication and authorization\";\n options = [\n {\n key: \"provider\",\n message: \"Choose the authentication provider\",\n multiple: false,\n required: true,\n choices: [\n {\n value: \"better-auth\",\n label: \"Better Auth\",\n hint: \"Universal TypeScript auth, plugin support, secure and extensible—focus on your app.\",\n dependencies: [\n {\n name: \"better-auth\",\n version: \"1.3.0\",\n type: \"dependency\",\n },\n ],\n templates: [\n {\n template: \"templates/add-ons/auth/better-auth/auth.hbs\",\n outputPath: \"src/lib/auth.ts\",\n },\n ],\n subOptions: [\n {\n key: \"plugins\",\n message: \"Choose the authentication plugins\",\n multiple: true,\n required: true,\n choices: [\n {\n value: \"email\",\n label: \"Email\",\n hint: \"Email authentication\",\n },\n {\n value: \"two-factor\",\n label: \"Two Factor\",\n hint: \"Two-factor authentication\",\n },\n {\n value: \"username\",\n label: \"Username\",\n hint: \"Username authentication\",\n },\n {\n value: \"anonymous\",\n label: \"Anonymous\",\n hint: \"Anonymous authentication\",\n },\n {\n value: \"phone-number\",\n label: \"Phone Number\",\n hint: \"Phone number authentication\",\n },\n {\n value: \"magic-link\",\n label: \"Magic Link\",\n hint: \"Magic link authentication\",\n },\n {\n value: \"email-otp\",\n label: \"Email OTP\",\n hint: \"One-time password email authentication\",\n },\n {\n value: \"passkey\",\n label: \"Passkey\",\n hint: \"Passkey authentication\",\n },\n {\n value: \"generic-oauth\",\n label: \"Generic OAuth\",\n hint: \"Provider-independent OAuth authentication\",\n },\n {\n value: \"one-tap\",\n label: \"One Tap\",\n hint: \"Google One Tap authentication\",\n },\n {\n value: \"api-key\",\n label: \"API Key\",\n hint: \"API Key authentication\",\n },\n {\n value: \"admin\",\n label: \"Admin\",\n hint: \"Admin authentication\",\n },\n {\n value: \"organization\",\n label: \"Organization\",\n hint: \"Organization-based authentication\",\n },\n {\n value: \"oidc\",\n label: \"OIDC Provider\",\n hint: \"OpenID Connect authentication provider\",\n },\n {\n value: \"sso\",\n label: \"SSO\",\n hint: \"Single sign-on authentication (SSO)\",\n },\n {\n value: \"bearer\",\n label: \"Bearer\",\n hint: \"Bearer token authentication\",\n },\n {\n value: \"multi-session\",\n label: \"Multi Session\",\n hint: \"Concurrent multi-session authentication\",\n },\n {\n value: \"oauth-proxy\",\n label: \"OAuth Proxy\",\n hint: \"OAuth proxy authentication\",\n },\n {\n value: \"open-api\",\n label: \"Open API\",\n hint: \"OpenAPI authentication support\",\n },\n {\n value: \"jwt\",\n label: \"JWT\",\n hint: \"JWT authentication\",\n },\n {\n value: \"next-cookies\",\n label: \"Next.js Cookies\",\n hint: \"Cookie support for Next.js\",\n },\n ],\n },\n ],\n },\n ],\n setup: async (projectDir: string, config: ProjectSetupConfig) => {\n // we need use better-auth cli to setup the auth\n const command = getPackageManagerCommand(\n config.packageManager,\n \"@better-auth/cli\",\n );\n\n // run the command and wait for it to complete with the options\n const result = await runCommand(\n `${command} generate --config src/lib/auth.ts --yes`,\n {\n cwd: projectDir,\n },\n );\n\n if (result.errorMessage) {\n p.log.error(`Better Auth setup failed: ${result.errorMessage}`);\n }\n },\n },\n ];\n}\n","import type { ProjectSetupConfig } from \"@/commands/init/types\";\nimport { getPackageManagerCommand } from \"@/core/package-manager\";\nimport { BaseAddOn } from \"@/core/registry/add-ons/base-addon\";\nimport { runCommand } from \"@/core/terminal\";\n\nexport class ShadcnAddOn extends BaseAddOn {\n name = \"Shadcn/UI\";\n description = \"Beautifully designed components built with Radix UI and Tailwind CSS.\";\n value = \"shadcn-ui\";\n hint = \"Production-grade UI built on top of Shadcn/UI and Radix primitives\";\n public async runPostInstall(projectDir: string, options: ProjectSetupConfig): Promise<void> {\n const command = getPackageManagerCommand(\n options.packageManager,\n \"shadcn@latest init --base-color zinc --src-dir --silent --yes\",\n );\n await runCommand(`${command}`, { cwd: projectDir });\n }\n}\n","import { AddOnRegistry } from \"@/core/registry/add-ons/add-on-registry\";\nimport { RedisStoreAddOn } from \"./store\";\nimport { JobsAddOn } from \"./jobs\";\nimport { McpServerAddOn } from \"./mcp\";\nimport { LoggingAddOn } from \"./logging\";\nimport { TelemetryAddOn } from \"./telemetry\";\nimport { BotsAddOn } from \"./bots\";\nimport { DatabaseAddOn } from \"./database\";\nimport { AuthAddOn } from \"./auth\";\nimport { ShadcnAddOn } from \"./shadcn\";\n\n/**\n * Add-on registry\n */\nexport const addOnRegistry = AddOnRegistry.create()\n .register(new RedisStoreAddOn())\n .register(new JobsAddOn())\n .register(new McpServerAddOn())\n .register(new LoggingAddOn())\n .register(new TelemetryAddOn())\n .register(new BotsAddOn())\n .register(new DatabaseAddOn())\n .register(new AuthAddOn())\n .register(new ShadcnAddOn())\n .build();\n","import * as fs from 'fs/promises';\n\nexport async function isPathEmpty(path: string): Promise<boolean> {\n try {\n const files = await fs.readdir(path);\n return files.length === 0;\n } catch (error: any) {\n if (error.code === 'ENOENT') {\n return true;\n }\n throw error;\n }\n}","import path from \"path\";\nimport fs from \"fs\";\n\ntype SupportedFramework = 'nextjs' | 'tanstack-start' | 'generic';\n\nexport function detectFramework(projectDir: string): SupportedFramework {\n // Check if the project is a Next.js project\n if (fs.existsSync(path.join(projectDir, 'next.config.js')) || fs.existsSync(path.join(projectDir, 'next.config.ts'))) {\n return 'nextjs';\n }\n\n // Precisa ler o package.json e verificar se tem @tanstack/start\n const packageJson = JSON.parse(fs.readFileSync(path.join(projectDir, 'package.json'), 'utf8'));\n if (packageJson.dependencies['@tanstack/react-start']) {\n return 'tanstack-start';\n } else {\n return 'generic';\n }\n}\n","import * as p from '@clack/prompts';\nimport * as color from 'picocolors';\n\nclass Logger {\n private component: string;\n\n constructor(component: string) {\n this.component = component;\n }\n\n private formatMessage(level: string, message: string, data?: object) {\n const timestamp = new Date().toISOString();\n const componentInfo = this.component ? `[${this.component}] ` : '';\n const dataString = data ? ` ${JSON.stringify(data)}` : '';\n return `${color.dim(timestamp)} ${level} ${componentInfo}${message}${dataString}`;\n }\n\n info(message: string, data?: object) {\n p.log.info(this.formatMessage(color.blue('INFO'), message, data));\n }\n\n warn(message: string, data?: object) {\n p.log.warn(this.formatMessage(color.yellow('WARN'), message, data));\n }\n\n error(message: string, data?: object) {\n p.log.error(this.formatMessage(color.red('ERROR'), message, data));\n }\n\n success(message: string, data?: object) {\n p.log.success(this.formatMessage(color.green('SUCCESS'), message, data));\n }\n}\n\nexport function createLogger(component: string) {\n return new Logger(component);\n}\n","import { ProjectSetupConfig } from \"./types\";\nimport { createLogger } from \"../../core/logger\";\nimport * as p from \"@clack/prompts\";\nimport { execa } from \"execa\";\nimport { getInstallCommand } from \"../../core/package-manager\";\nimport { starterRegistry } from \"@/registry/starters\";\nimport { addOnRegistry } from \"@/registry/add-ons\";\n\nconst logger = createLogger(\"ProjectGenerator\");\n\nexport class ProjectGenerator {\n private config: ProjectSetupConfig;\n private targetDir: string;\n\n constructor(config: ProjectSetupConfig, targetDir: string) {\n this.config = config;\n this.targetDir = targetDir;\n }\n\n public async generate() {\n // 1. Create project structure\n await this.setupProject();\n\n // 2. Apply add-ons (templates, env vars, docker services)\n await this.setupAddOns();\n\n // 3. Install dependencies\n if (this.config.installDependencies) await this.installDependencies();\n\n // 4. Initialize Docker services\n if (this.config.initDocker) await this.setupDocker();\n\n // 5. Initialize Git repository\n if (this.config.initGit) await this.setupGit();\n\n // 6. Run add-on post-install steps LAST (requires deps installed)\n if (this.config.installDependencies) {\n await this.runPostInstallSteps();\n } else {\n p.log.warn(\n \"Skipping add-on post-install steps because dependencies were not installed.\",\n );\n }\n }\n\n private async installDependencies(): Promise<void> {\n const installer = p.spinner();\n\n try {\n installer.start(\"Installing dependencies...\");\n const { command, args } = getInstallCommand(this.config.packageManager);\n await execa(command, args, { cwd: this.targetDir, stdio: \"pipe\" });\n installer.stop(\"Dependencies installed successfully!\");\n } catch (error) {\n installer.stop(\"Failed to install dependencies.\");\n logger.error(\"Dependency installation failed\", { error });\n p.log.warn(\"Please install dependencies manually.\");\n }\n }\n\n private async setupProject(): Promise<void> {\n const starter = this.config.starter\n ? starterRegistry.get(this.config.starter)\n : undefined;\n if (!starter) {\n p.log.error(\"Starter not found\");\n process.exit(1);\n }\n\n const projectGenerator = p.spinner();\n projectGenerator.start(\"Generating project structure...\");\n await starter.install(this.targetDir, this.config);\n projectGenerator.stop(\"Project structure generated successfully!\");\n }\n\n private async setupAddOns(): Promise<void> {\n const selectedAddOns = this.config.addOns || [];\n if (selectedAddOns.length === 0) return;\n\n const addOns = addOnRegistry.getMany(selectedAddOns);\n\n for (const addOn of addOns) {\n const addOnSetup = p.spinner();\n addOnSetup.start(`Setting up ${addOn.name}...`);\n try {\n // runSetup() applies assets (package.json, env, docker, templates)\n await addOn.runSetup(this.targetDir, this.config);\n addOnSetup.stop(`${addOn.name} setup completed!`);\n } catch (error) {\n addOnSetup.stop(`Failed to setup ${addOn.name}.`);\n logger.error(`Add-on setup failed for ${addOn.name}`, { error });\n }\n }\n }\n\n // Run add-on post-install steps after dependencies are installed\n private async runPostInstallSteps(): Promise<void> {\n const selectedAddOns = this.config.addOns || [];\n if (selectedAddOns.length === 0) return;\n\n const addOns = addOnRegistry.getMany(selectedAddOns);\n\n for (const addOn of addOns) {\n const setupSpinner = p.spinner();\n setupSpinner.start(`Running post-install steps for ${addOn.name}...`);\n try {\n await addOn.runPostInstall(this.targetDir, this.config);\n setupSpinner.stop(`${addOn.name} post-install steps completed!`);\n } catch (error) {\n setupSpinner.stop(`Failed to run post-install steps for ${addOn.name}.`);\n logger.error(`Add-on post-install steps failed for ${addOn.name}`, { error });\n }\n }\n }\n\n private async setupGit(): Promise<void> {\n const gitSetup = p.spinner();\n gitSetup.start(\"Initializing Git repository...\");\n try {\n await execa(\"git\", [\"init\"], { cwd: this.targetDir });\n await execa(\"git\", [\"add\", \".\"], { cwd: this.targetDir });\n await execa(\n \"git\",\n [\"commit\", \"-m\", \"Initial commit from Igniter.js CLI\"],\n { cwd: this.targetDir },\n );\n gitSetup.stop(\"Git repository initialized successfully!\");\n } catch (error) {\n gitSetup.stop(\n \"Failed to initialize Git repository. Please initialize it manually.\",\n );\n }\n }\n\n private async setupDocker(): Promise<void> {\n const dockerSetup = p.spinner();\n dockerSetup.start(\"Initializing Docker services...\");\n try {\n // 1. Stop all running docker containers\n await execa(\"docker\", [\n \"container\",\n \"stop\",\n ...(await execa(\"docker\", [\"ps\", \"-q\"])).stdout\n .split(\"\\n\")\n .filter(Boolean),\n ]);\n dockerSetup.message(\n `Checking and stopping currently running containers...`,\n );\n\n // 2. Find all ports used in docker-compose.yml\n const fs = await import(\"fs/promises\");\n const path = await import(\"path\");\n const yaml = await import(\"js-yaml\");\n\n const composeFilePath = path.join(this.targetDir, \"docker-compose.yml\");\n let ports: number[] = [];\n\n try {\n const composeContent = await fs.readFile(composeFilePath, \"utf8\");\n const doc = yaml.load(composeContent) as any;\n\n const services = doc?.services || {};\n for (const svcKey of Object.keys(services)) {\n const service = services[svcKey];\n const svcPorts = service.ports || [];\n for (const portMapping of svcPorts) {\n // Supports formats like '3000:3000' and '3000'\n const [hostPortStr] = String(portMapping).split(\":\");\n const hostPort = parseInt(hostPortStr, 10);\n if (!isNaN(hostPort)) ports.push(hostPort);\n }\n }\n dockerSetup.message(`Found ${ports.length} ports to check.`);\n } catch (err) {\n dockerSetup.stop(\n \"Failed to read docker-compose.yml. Maybe you are not using Docker Compose?\",\n );\n }\n\n // 3. Try to kill any processes listening on those ports\n if (ports.length > 0) {\n for (const port of ports) {\n try {\n // Cross-platform port killing\n if (process.platform === \"win32\") {\n // Windows: find PID with netstat and kill with taskkill\n const { stdout } = await execa(\"netstat\", [\"-ano\", \"-p\", \"tcp\"]);\n const lines = stdout.split(\"\\n\");\n const matching = lines.find(\n (line) =>\n line.includes(`:${port} `) &&\n line.trim().endsWith(\"LISTENING\"),\n );\n if (matching) {\n const parts = matching.trim().split(/\\s+/);\n const pid = parts[parts.length - 1];\n if (pid && pid !== \"0\") {\n await execa(\"taskkill\", [\"/PID\", pid, \"/F\"]);\n }\n }\n } else {\n // Unix (Linux/macOS): find PID with lsof or fuser and kill\n try {\n const { stdout } = await execa(\"lsof\", [\"-ti\", `tcp:${port}`]);\n const pids = stdout.split(\"\\n\").filter(Boolean);\n for (const pid of pids) {\n await execa(\"kill\", [\"-9\", pid]);\n }\n } catch {\n // If lsof not available, fallback to fuser\n try {\n await execa(\"fuser\", [\"-k\", \"-n\", \"tcp\", `${port}`]);\n } catch {}\n }\n }\n dockerSetup.message(`Port ${port} freed successfully.`);\n } catch (e) {\n dockerSetup.stop(\n `Could not free port ${port}. Please free it manually.`,\n );\n }\n }\n }\n\n await execa(\"docker-compose\", [\"up\", \"-d\"], { cwd: this.targetDir });\n dockerSetup.stop(\"Docker services initialized successfully!\");\n } catch (error) {\n dockerSetup.stop(\n \"Failed to initialize Docker services. Please initialize it manually.\",\n );\n }\n }\n}\n","import { Command } from 'commander';\nimport { featureCommand } from './feature';\nimport { docsCommand } from './docs';\nimport { schemaCommand } from './schema';\nimport { controllerCommand } from './controller';\nimport { procedureCommand } from './procedure';\n\nexport const generateCommand = new Command()\n .command('generate')\n .description('Scaffold new features or generate client schema')\n .addCommand(featureCommand)\n .addCommand(controllerCommand)\n .addCommand(procedureCommand)\n .addCommand(docsCommand)\n .addCommand(schemaCommand);\n","import { Command } from 'commander';\nimport { handleGenerateFeatureAction } from './action';\n\nexport const featureCommand = new Command()\n .command('feature')\n .description('Scaffold a new feature module')\n .argument('[name]', 'The name of the feature (e.g., \"user\", \"products\")')\n .option('--schema <value>', 'Generate from a schema provider (e.g., \"prisma:User\")')\n .option('--schema-path <path>', 'Custom schema path for the selected provider')\n .action(handleGenerateFeatureAction);\n","import * as path from \"path\";\nimport * as p from \"@clack/prompts\";\nimport { existsSync } from \"fs\";\nimport { writeFile } from \"fs/promises\";\nimport { TemplateEngine } from \"@/core/template-engine\";\nimport { FeatureWorkspace } from \"./feature\";\nimport { FeaturePrompts } from \"./prompts\";\nimport { schemaProviderRegistry } from \"@/registry/schema-provider\";\nimport { Casing } from \"@/utils/casing\";\nimport type { SchemaProvider, SchemaProviderSelection } from \"@/core/registry/schema-provider/base-schema-provider\";\nimport type { SchemaProviderRegistry } from \"@/core/registry/schema-provider/schema-provider-registry\";\n\ninterface GenerateOptions {\n schema?: string;\n schemaPath?: string;\n}\n\nfunction cancelOperation(message: string): never {\n p.cancel(message);\n process.exit(0);\n}\n\nexport async function handleGenerateFeatureAction(\n name: string | undefined,\n options: GenerateOptions,\n): Promise<void> {\n p.intro(\"Generate Feature\");\n\n const templateEngine = TemplateEngine.create();\n \n const { provider, selection } = await resolveSchemaProvider({\n registry: schemaProviderRegistry,\n options,\n cancel: cancelOperation,\n });\n\n let featureInput = name\n\n if (!featureInput) {\n featureInput = await FeaturePrompts.askForFeatureName(\"Feature generation cancelled.\", selection?.modelName);\n }\n\n const featureSlug = Casing.toKebabCase(featureInput);\n const featureDir = FeatureWorkspace.featureDir(featureSlug);\n\n if (existsSync(featureDir)) {\n p.log.error(\n `Feature '${featureSlug}' already exists at ${path.relative(process.cwd(), featureDir)}.`,\n );\n p.outro(\"Nothing to do.\");\n process.exit(1);\n }\n\n const spinner = p.spinner();\n spinner.start(`Scaffolding feature '${featureSlug}'...`);\n\n try {\n if (provider && selection) {\n await FeatureWorkspace.ensureStructure(featureDir);\n\n await provider.generateFeature(selection, {\n featureName: featureSlug,\n featureDir,\n templateEngine,\n });\n } else {\n await FeatureWorkspace.ensureStructure(featureDir);\n\n await generateEmptyFeature(featureSlug, featureDir, templateEngine);\n }\n\n spinner.stop(`Feature '${featureSlug}' created successfully!`);\n p.log.success(\n `Scaffolded feature '${featureSlug}'. Remember to register the controller in your router.`,\n );\n p.outro(\"Feature generation complete!\");\n } catch (error) {\n spinner.stop(\"Failed to scaffold the feature.\");\n const message = error instanceof Error ? error.message : String(error);\n p.log.error(`Feature generation failed: ${message}`);\n process.exit(1);\n }\n}\n\nasync function resolveSchemaProvider({\n registry,\n options,\n cancel,\n}: {\n registry: SchemaProviderRegistry;\n options: GenerateOptions;\n cancel: (message: string) => never;\n}): Promise<{\n provider: SchemaProvider | null;\n selection: SchemaProviderSelection | null;\n}> {\n if (options.schema) {\n const provider = registry.findBySchemaOption(options.schema);\n if (!provider) {\n throw new Error(\n `No registered schema provider can handle '${options.schema}'.`,\n );\n }\n \n const selection = provider.parseSchemaOption(options.schema, {\n schemaPath: options.schemaPath,\n });\n\n await provider.validateSelection(selection);\n return { provider, selection };\n }\n\n const availableProviders = await registry.detectAvailableProviders({\n schemaPath: options.schemaPath,\n });\n\n if (availableProviders.length === 0) {\n return { provider: null, selection: null };\n }\n\n const choice = await p.select({\n message: \"Generate from an available schema provider?\",\n options: [\n { value: \"none\", label: \"No, create an empty feature\" },\n ...availableProviders.map((provider) => ({\n value: provider.id,\n label: provider.name,\n })),\n ],\n initialValue: \"none\",\n });\n\n if (p.isCancel(choice)) {\n cancel(\"Feature generation cancelled.\");\n }\n\n if (choice === \"none\") {\n return { provider: null, selection: null };\n }\n\n const provider = registry.get(String(choice));\n if (!provider) {\n throw new Error(`Schema provider '${String(choice)}' is not registered.`);\n }\n\n const schemaPath = provider.resolveSchemaPath(options.schemaPath);\n\n const selection = await provider.listModels(schemaPath);\n if (selection.length === 0) {\n return { provider: null, selection: null };\n }\n \n const modelChoice = await p.select({\n message: \"Which model would you like to scaffold?\",\n options: selection.map((model) => ({ value: model, label: model })),\n initialValue: selection[0],\n });\n\n return { provider, selection: { providerId: provider.id, modelName: String(modelChoice), schemaPath: schemaPath } };\n}\n\nasync function generateEmptyFeature(\n featureSlug: string,\n featureDir: string,\n templateEngine: TemplateEngine,\n): Promise<void> {\n const controllerTemplate = templateEngine.resolvePath(\n \"generate\",\n \"feature\",\n \"empty.controller.hbs\",\n );\n const interfacesTemplate = templateEngine.resolvePath(\n \"generate\",\n \"feature\",\n \"empty.interfaces.hbs\",\n );\n\n const controllerExport = `${Casing.toPascalCase(featureSlug)}Controller`;\n const controllerDisplayName = Casing.toPascalCase(featureSlug);\n\n await templateEngine.renderToFile(\n controllerTemplate,\n {\n controllerExport,\n controllerDisplayName,\n controllerRoute: featureSlug,\n },\n path.join(featureDir, \"controllers\", `${featureSlug}.controller.ts`),\n );\n\n await templateEngine.renderToFile(\n interfacesTemplate,\n { featureName: Casing.toPascalCase(featureSlug) },\n path.join(featureDir, `${featureSlug}.interfaces.ts`),\n );\n \n await writeFile(path.join(featureDir, \"procedures\", \".gitkeep\"), \"\");\n}\n","import { mkdirSync, existsSync } from \"fs\";\nimport { readFile, writeFile } from \"fs/promises\";\nimport * as path from \"path\";\nimport * as handlebars from \"handlebars\";\nimport { fileURLToPath } from \"url\";\nimport { registerHandlebarsHelpers } from \"./handlebars-helpers\";\n\nconst __filename = fileURLToPath(import.meta?.url);\nconst __dirname = path.dirname(__filename);\n\n/**\n * Abstract template engine used to render Handlebars templates within the CLI.\n * Concrete implementations can customise discovery or rendering behaviour while\n * callers depend on the abstract API only.\n */\nexport abstract class TemplateEngine {\n protected constructor() {}\n\n /**\n * Creates the default template engine.\n */\n public static create(): TemplateEngine {\n return new DefaultTemplateEngine();\n }\n\n /**\n * Resolves a template path relative to the CLI template root.\n */\n public abstract resolvePath(...segments: string[]): string;\n\n /**\n * Renders a template and returns its content as a string.\n */\n public abstract render(\n templatePath: string,\n context: Record<string, unknown>,\n ): Promise<string>;\n\n /**\n * Renders a template and writes the result to the provided output path.\n */\n public abstract renderToFile(\n templatePath: string,\n context: Record<string, unknown>,\n outputPath: string,\n ): Promise<void>;\n}\n\nclass DefaultTemplateEngine extends TemplateEngine {\n private readonly templateRoot: string;\n private helpersRegistered = false;\n\n private static readonly TEMPLATE_CANDIDATES = [\n path.resolve(__dirname, \"..\", \"..\", \"templates\"),\n path.resolve(__dirname, \"..\", \"..\", \"..\", \"templates\"),\n path.resolve(__dirname, \"..\", \"templates\"),\n path.resolve(__dirname, \"..\", \"..\", \"..\", \"templates\"),\n path.resolve(\n process.cwd(),\n \"node_modules\",\n \"@igniter-js\",\n \"new-cli\",\n \"templates\",\n ),\n path.resolve(process.cwd(), \"templates\"),\n ];\n\n constructor() {\n super();\n this.templateRoot = this.resolveTemplateRoot();\n }\n\n public resolvePath(...segments: string[]): string {\n return path.join(this.templateRoot, ...segments);\n }\n\n public async render(\n templatePath: string,\n context: Record<string, unknown>,\n ): Promise<string> {\n this.ensureHelpersRegistered();\n const templateContent = await readFile(templatePath, \"utf-8\");\n const compiled = handlebars.compile(templateContent);\n return compiled(context);\n }\n\n public async renderToFile(\n templatePath: string,\n context: Record<string, unknown>,\n outputPath: string,\n ): Promise<void> {\n const rendered = await this.render(templatePath, context);\n const outputDir = path.dirname(outputPath);\n if (!existsSync(outputDir)) {\n mkdirSync(outputDir, { recursive: true });\n }\n await writeFile(outputPath, rendered, \"utf-8\");\n }\n\n private resolveTemplateRoot(): string {\n for (const candidate of DefaultTemplateEngine.TEMPLATE_CANDIDATES) {\n if (existsSync(candidate)) {\n return candidate;\n }\n }\n\n throw new Error(\n [\n \"Could not locate the CLI templates directory.\",\n \"Looked in the following locations:\",\n ...DefaultTemplateEngine.TEMPLATE_CANDIDATES.map(\n (candidate) => `- ${candidate}`,\n ),\n ].join(\"\\n\"),\n );\n }\n\n private ensureHelpersRegistered(): void {\n if (!this.helpersRegistered) {\n registerHandlebarsHelpers();\n this.helpersRegistered = true;\n }\n }\n}\n","import { mkdir, readdir, stat, writeFile } from \"fs/promises\";\nimport * as path from \"path\";\n\n/**\n * Utility helpers for working with feature directories. The class is abstract\n * to make it non-instantiable while still grouping the behaviour in a single\n * namespace.\n */\nexport abstract class FeatureWorkspace {\n protected constructor() {\n // Static utility class – no instances allowed.\n }\n\n /**\n * Returns the absolute path to the feature root directory.\n */\n public static root(): string {\n return path.join(process.cwd(), \"src\", \"features\");\n }\n\n /**\n * Returns the absolute path for a specific feature name.\n */\n public static featureDir(featureName: string): string {\n return path.join(this.root(), featureName);\n }\n\n /**\n * Ensures that the directory structure required for a feature exists.\n */\n public static async ensureStructure(featureDir: string): Promise<void> {\n await mkdir(featureDir, { recursive: true });\n await mkdir(path.join(featureDir, \"controllers\"), { recursive: true });\n await mkdir(path.join(featureDir, \"procedures\"), { recursive: true });\n await mkdir(path.join(featureDir, \"presentation\"), { recursive: true });\n await mkdir(path.join(featureDir, \"presentation\", \"components\"), { recursive: true });\n await writeFile(path.join(featureDir, \"presentation\", \"components\", \".gitkeep\"), \"\");\n await mkdir(path.join(featureDir, \"presentation\", \"hooks\"), { recursive: true });\n await writeFile(path.join(featureDir, \"presentation\", \"hooks\", \".gitkeep\"), \"\");\n await mkdir(path.join(featureDir, \"presentation\", \"contexts\"), { recursive: true });\n await writeFile(path.join(featureDir, \"presentation\", \"contexts\", \".gitkeep\"), \"\");\n await mkdir(path.join(featureDir, \"presentation\", \"utils\"), { recursive: true });\n await writeFile(path.join(featureDir, \"presentation\", \"utils\", \".gitkeep\"), \"\");\n }\n\n /**\n * Lists all available feature directories under `src/features`.\n */\n public static async listFeatures(): Promise<string[]> {\n try {\n const entries = await readdir(this.root(), { withFileTypes: true });\n return entries\n .filter((entry) => entry.isDirectory())\n .map((entry) => entry.name)\n .sort();\n } catch {\n return [];\n }\n }\n\n /**\n * Checks if the provided path exists and corresponds to a file.\n */\n public static async fileExists(filePath: string): Promise<boolean> {\n try {\n const fileStat = await stat(filePath);\n return fileStat.isFile();\n } catch {\n return false;\n }\n }\n}\n","import * as p from \"@clack/prompts\";\nimport { FeatureWorkspace } from \"./feature\";\n\n/**\n * Encapsulates all interactive prompts required for feature generation.\n */\nexport abstract class FeaturePrompts {\n protected constructor() {}\n\n /**\n * Asks the user to confirm or supply a feature name.\n */\n public static async askForFeatureName(cancelMessage: string, initial?: string): Promise<string> {\n return this.askForEntityName({\n message: \"What is the name of your feature?\",\n placeholder: initial || \"users\",\n cancelMessage,\n });\n }\n\n /**\n * Resolves the feature slug either from user input or from available features.\n */\n public static async resolveFeatureSlug(\n cancelMessage: string,\n initial?: string,\n ): Promise<string> {\n if (initial) {\n const validation = this.validateSlug(initial);\n if (validation === true) {\n return initial.trim().toLowerCase();\n }\n throw new Error(typeof validation === \"string\" ? validation : \"Invalid feature name.\");\n }\n\n const existing = await FeatureWorkspace.listFeatures();\n if (existing.length === 0) {\n return this.askForFeatureName(cancelMessage);\n }\n\n const selection = await p.select({\n message: \"Select the target feature:\",\n options: [\n ...existing.map((feature) => ({\n label: feature,\n value: feature,\n })),\n { label: \"Create a new feature\", value: \"__new__\" },\n ],\n initialValue: existing[0],\n });\n\n if (p.isCancel(selection)) {\n this.cancel(cancelMessage);\n }\n\n if (selection === \"__new__\") {\n return this.askForFeatureName(cancelMessage);\n }\n\n return String(selection);\n }\n\n /**\n * Generic helper for asking an entity name while applying the standard validation.\n */\n public static async askForEntityName({\n message,\n placeholder,\n cancelMessage,\n }: {\n message: string;\n placeholder: string;\n cancelMessage: string;\n }): Promise<string> {\n const response = await p.text({\n message,\n placeholder,\n validate: (value) => {\n const validation = this.validateSlug(value);\n if (validation === true) {\n return undefined;\n }\n return validation;\n },\n });\n\n if (p.isCancel(response)) {\n this.cancel(cancelMessage);\n }\n\n return String(response).trim();\n }\n\n private static validateSlug(value: string | undefined): true | string {\n if (!value || !value.trim()) {\n return \"A value is required.\";\n }\n if (!/^[a-zA-Z][a-zA-Z0-9-_]*$/.test(value.trim())) {\n return \"Use letters, numbers, hyphens, and underscores only (must start with a letter).\";\n }\n return true;\n }\n\n private static cancel(message: string): never {\n p.cancel(message);\n process.exit(0);\n }\n}\n","import type {\n SchemaProvider,\n SchemaProviderOptions,\n} from \"./base-schema-provider\";\n\nclass SchemaProviderRegistry {\n private readonly providers: Map<string, SchemaProvider>;\n\n constructor(providers: SchemaProvider[]) {\n this.providers = new Map(\n providers.map((provider) => [provider.id, provider]),\n );\n }\n\n public static create(): SchemaProviderRegistryBuilder {\n return new SchemaProviderRegistryBuilder();\n }\n\n public list(): SchemaProvider[] {\n return Array.from(this.providers.values());\n }\n\n public get(id: string): SchemaProvider | undefined {\n return this.providers.get(id);\n }\n\n public findBySchemaOption(option: string): SchemaProvider | undefined {\n return this.list().find((provider) => provider.matchesSchemaOption(option));\n }\n\n public async detectAvailableProviders(\n options: SchemaProviderOptions = {},\n ): Promise<SchemaProvider[]> {\n const results: SchemaProvider[] = [];\n for (const provider of this.list()) {\n if (await provider.isAvailable(options)) {\n results.push(provider);\n }\n }\n return results;\n }\n}\n\nclass SchemaProviderRegistryBuilder {\n private readonly providers: SchemaProvider[] = [];\n\n public register(provider: SchemaProvider): this {\n this.providers.push(provider);\n return this;\n }\n\n public build(): SchemaProviderRegistry {\n return new SchemaProviderRegistry(this.providers);\n }\n}\n\nexport { SchemaProviderRegistry, SchemaProviderRegistryBuilder };\n","import { getSchema, Model, Field, Attribute, Func } from \"@mrleebo/prisma-ast\";\nimport * as fs from \"fs/promises\";\nimport * as path from \"path\";\nimport { SchemaProvider, SchemaProviderSelection, SchemaGenerationContext } from \"@/core/registry/schema-provider/base-schema-provider\";\nimport { Casing } from \"@/utils/casing\";\nimport { FeatureWorkspace } from \"../../commands/generate/feature/feature\";\n\ninterface PrismaField {\n name: string;\n type: string;\n isRelation: boolean;\n isId: boolean;\n isOptional: boolean;\n hasDefault: boolean;\n isAutoGenerated: boolean;\n}\n\nexport class PrismaSchemaProvider extends SchemaProvider {\n public readonly id = \"prisma\";\n public readonly name = \"Prisma\";\n public readonly defaultSchemaPath = path.join(process.cwd(), \"prisma\", \"schema.prisma\");\n\n public async validateSchemaPath(schemaPath: string): Promise<void> {\n try {\n const stat = await fs.stat(schemaPath);\n if (!stat.isFile()) {\n throw new Error();\n }\n } catch {\n throw new Error(`Prisma schema not found at '${schemaPath}'.`);\n }\n }\n\n public async listModels(schemaPath: string): Promise<string[]> {\n const content = await fs.readFile(schemaPath, \"utf-8\");\n const ast = getSchema(content);\n\n return ast.list\n .filter((node): node is Model => node.type === \"model\")\n .map((model) => model.name)\n .sort();\n }\n\n public async generateFeature(\n selection: SchemaProviderSelection,\n context: SchemaGenerationContext,\n ): Promise<void> {\n await this.validateSelection(selection);\n\n const schemaContent = await fs.readFile(selection.schemaPath, \"utf-8\");\n const ast = getSchema(schemaContent);\n const model = ast.list.find(\n (node): node is Model => node.type === \"model\" && node.name === selection.modelName,\n );\n\n if (!model) {\n throw new Error(`Model '${selection.modelName}' not found in Prisma schema.`);\n }\n\n const modelFields = this.extractFields(model);\n const target = this.buildNaming(selection.modelName, context.featureName);\n\n await this.ensurePathsAreFree(context.featureDir, context.featureName);\n\n const interfacesTemplate = context.templateEngine.resolvePath(\n \"generate\",\n \"feature\",\n \"schema.interfaces.hbs\",\n );\n const procedureTemplate = context.templateEngine.resolvePath(\n \"generate\",\n \"feature\",\n \"schema.procedure.hbs\",\n );\n const controllerTemplate = context.templateEngine.resolvePath(\n \"generate\",\n \"feature\",\n \"schema.controller.hbs\",\n );\n\n await context.templateEngine.renderToFile(\n interfacesTemplate,\n {\n modelName: target.modelNamePascal,\n fields: modelFields\n .filter((field) => !field.isRelation)\n .map((field) => ({\n name: field.name,\n zodType: this.getZodType(field.type, field.isOptional),\n })),\n createOmitFields: modelFields\n .filter((field) => field.isId || field.isAutoGenerated || field.hasDefault)\n .map((field) => field.name),\n },\n path.join(context.featureDir, `${context.featureName}.interfaces.ts`),\n );\n\n await context.templateEngine.renderToFile(\n procedureTemplate,\n {\n modelName: target.modelNamePascal,\n procedureExport: target.procedureExport,\n procedureDisplayName: `${target.modelNamePascal} Procedure`,\n prismaDelegate: target.prismaDelegate,\n featureName: context.featureName,\n idType: this.mapIdType(modelFields),\n },\n path.join(context.featureDir, \"procedures\", `${context.featureName}.procedure.ts`),\n );\n\n await context.templateEngine.renderToFile(\n controllerTemplate,\n {\n controllerExport: target.controllerExport,\n controllerDisplayName: `${target.modelNamePascal} Controller`,\n modelName: target.modelNamePascal,\n modelNamePlural: target.modelNamePlural,\n resourcePath: target.resourcePath,\n idZodType: this.getIdZodType(modelFields),\n featureName: context.featureName,\n procedureExport: target.procedureExport,\n },\n path.join(context.featureDir, \"controllers\", `${context.featureName}.controller.ts`),\n );\n }\n\n private extractFields(model: Model): PrismaField[] {\n return model.properties\n .filter((property): property is Field => property.type === \"field\")\n .map((property) => {\n // Extract field type: can be string or Func\n const fieldTypeStr = typeof property.fieldType === \"string\"\n ? property.fieldType\n : property.fieldType.type === \"function\"\n ? property.fieldType.name\n : \"string\";\n \n return {\n name: property.name,\n type: this.mapPrismaType(fieldTypeStr),\n isRelation: this.isRelation(fieldTypeStr),\n isId: this.hasAttribute(property, \"id\"),\n isOptional: Boolean(property.optional),\n hasDefault: this.hasAttribute(property, \"default\"),\n isAutoGenerated: this.isAutoGenerated(property),\n };\n });\n }\n\n private buildNaming(modelName: string, featureName: string) {\n const modelNamePascal = Casing.toPascalCase(modelName);\n return {\n modelNamePascal,\n modelNamePlural: Casing.pluralize(modelNamePascal),\n controllerExport: `${modelNamePascal}Controller`,\n procedureExport: `${Casing.toCamelCase(modelNamePascal)}`,\n resourcePath: Casing.pluralize(Casing.toCamelCase(modelName)),\n prismaDelegate: Casing.toCamelCase(modelName),\n };\n }\n\n private async ensurePathsAreFree(\n featureDir: string,\n featureSlug: string,\n ): Promise<void> {\n const filesToCheck = [\n path.join(featureDir, \"controllers\", `${featureSlug}.controller.ts`),\n path.join(featureDir, \"procedures\", `${featureSlug}.procedure.ts`),\n path.join(featureDir, `${featureSlug}.interfaces.ts`),\n ];\n\n for (const file of filesToCheck) {\n if (await FeatureWorkspace.fileExists(file)) {\n throw new Error(`File '${path.relative(process.cwd(), file)}' already exists.`);\n }\n }\n }\n\n private mapPrismaType(type: string): string {\n const cleanType = type.replace(/\\?$/, \"\");\n switch (cleanType) {\n case \"String\":\n case \"Json\":\n case \"Bytes\":\n case \"Unsupported\":\n return \"string\";\n case \"BigInt\":\n return \"bigint\";\n case \"Int\":\n case \"Float\":\n case \"Decimal\":\n return \"number\";\n case \"Boolean\":\n return \"boolean\";\n case \"DateTime\":\n return \"Date\";\n default:\n return \"string\";\n }\n }\n\n private getZodType(type: string, optional: boolean): string {\n let base: string;\n switch (type) {\n case \"string\":\n base = \"z.string()\";\n break;\n case \"number\":\n base = \"z.number()\";\n break;\n case \"boolean\":\n base = \"z.boolean()\";\n break;\n case \"Date\":\n base = \"z.date()\";\n break;\n case \"bigint\":\n base = \"z.bigint()\";\n break;\n default:\n base = \"z.any()\";\n }\n return optional ? `${base}.nullable()` : base;\n }\n\n private getIdZodType(fields: PrismaField[]): string {\n const idField = fields.find((field) => field.isId);\n if (!idField) {\n return \"z.string()\";\n }\n if (idField.type === \"number\") {\n return \"z.coerce.number()\";\n }\n if (idField.type === \"bigint\") {\n return \"z.coerce.bigint()\";\n }\n return \"z.string()\";\n }\n\n private mapIdType(fields: PrismaField[]): string {\n const idField = fields.find((field) => field.isId);\n if (!idField) {\n return \"string\";\n }\n return idField.type;\n }\n\n private hasAttribute(property: Field, attributeName: string): boolean {\n if (!property.attributes || !Array.isArray(property.attributes)) {\n return false;\n }\n return property.attributes.some((attribute: Attribute) => attribute.name === attributeName);\n }\n\n private isAutoGenerated(property: Field): boolean {\n if (!property.attributes || !Array.isArray(property.attributes)) {\n return false;\n }\n const defaultAttribute = property.attributes.find(\n (attribute: Attribute) => attribute.name === \"default\",\n );\n if (!defaultAttribute || !defaultAttribute.args || !Array.isArray(defaultAttribute.args)) {\n return false;\n }\n const firstArg = defaultAttribute.args[0];\n if (!firstArg) {\n return false;\n }\n \n // Check if the argument value is a function call (Func type)\n if (\n firstArg.value &&\n typeof firstArg.value === \"object\" &&\n \"type\" in firstArg.value &&\n firstArg.value.type === \"function\"\n ) {\n const funcValue = firstArg.value as Func;\n return [\"autoincrement\", \"now\", \"cuid\", \"uuid\"].includes(funcValue.name);\n }\n \n // Check if it's a string value (for legacy format)\n if (typeof firstArg.value === \"string\") {\n return [\"autoincrement()\", \"now()\", \"cuid()\", \"uuid()\"].includes(firstArg.value);\n }\n \n return false;\n }\n\n private isRelation(type: string): boolean {\n return /^[A-Z]/.test(type) && ![\"String\", \"Int\", \"Boolean\", \"DateTime\", \"Float\", \"Decimal\", \"BigInt\", \"Json\", \"Bytes\"].includes(type);\n }\n}\n","import type { TemplateEngine } from \"@/core/template-engine\";\n\nexport interface SchemaProviderOptions {\n schemaPath?: string;\n}\n\nexport interface SchemaPromptContext extends SchemaProviderOptions {\n cancel: (message: string) => never;\n}\n\nexport interface SchemaProviderSelection {\n providerId: string;\n modelName: string;\n schemaPath: string;\n}\n\nexport interface SchemaGenerationContext {\n featureName: string;\n featureDir: string;\n templateEngine: TemplateEngine;\n}\n\n/**\n * Base class for schema-aware feature generators. Providers are responsible for\n * validating their schema sources, collecting interactive input (when needed),\n * and generating feature files.\n */\nexport abstract class SchemaProvider {\n public abstract readonly id: string;\n public abstract readonly name: string;\n public abstract readonly defaultSchemaPath: string;\n\n public matchesSchemaOption(option: string): boolean {\n return option.startsWith(`${this.id}:`);\n }\n\n public parseSchemaOption(\n option: string,\n options: SchemaProviderOptions = {},\n ): SchemaProviderSelection {\n if (!this.matchesSchemaOption(option)) {\n throw new Error(\n `Schema option '${option}' does not match provider '${this.id}'.`,\n );\n }\n\n const [, rawModel] = option.split(\":\");\n if (!rawModel || !rawModel.trim()) {\n throw new Error(\n `Missing model name in schema option '${option}'. Use the format '${this.id}:ModelName'.`,\n );\n }\n\n return {\n providerId: this.id,\n modelName: rawModel.trim(),\n schemaPath: this.resolveSchemaPath(options.schemaPath),\n };\n }\n\n public resolveSchemaPath(schemaPath?: string): string {\n return schemaPath ?? this.defaultSchemaPath;\n }\n\n public async isAvailable(options: SchemaProviderOptions = {}): Promise<boolean> {\n try {\n await this.validateSchemaPath(this.resolveSchemaPath(options.schemaPath));\n return true;\n } catch {\n return false;\n }\n }\n\n public async validateSelection(\n selection: SchemaProviderSelection,\n ): Promise<void> {\n await this.validateSchemaPath(selection.schemaPath);\n const models = await this.listModels(selection.schemaPath);\n if (!models.includes(selection.modelName)) {\n throw new Error(\n `Model '${selection.modelName}' not found for provider '${this.name}'.`,\n );\n }\n }\n\n public async promptForSelection(\n _context: SchemaPromptContext,\n ): Promise<SchemaProviderSelection | null> {\n return null;\n }\n\n public abstract validateSchemaPath(schemaPath?: string): Promise<void>;\n\n public abstract listModels(schemaPath?: string): Promise<string[]>;\n\n public abstract generateFeature(\n selection: SchemaProviderSelection,\n context: SchemaGenerationContext,\n ): Promise<void>;\n}\n","/**\n * Helper for converting strings between different naming conventions.\n * Abstract to signal that it groups static helpers only.\n */\nexport abstract class Casing {\n protected constructor() {}\n\n public static toKebabCase(value: string): string {\n return value\n .replace(/([a-z0-9])([A-Z])/g, \"$1-$2\")\n .replace(/[\\s_]+/g, \"-\")\n .replace(/-+/g, \"-\")\n .toLowerCase();\n }\n\n public static toPascalCase(value: string): string {\n return this.toKebabCase(value)\n .split(\"-\")\n .filter(Boolean)\n .map((segment) => segment.charAt(0).toUpperCase() + segment.slice(1))\n .join(\"\");\n }\n\n public static toCamelCase(value: string): string {\n const pascal = this.toPascalCase(value);\n return pascal.charAt(0).toLowerCase() + pascal.slice(1);\n }\n\n public static pluralize(value: string): string {\n if (value.endsWith(\"s\")) {\n return value;\n }\n if (value.endsWith(\"y\") && !/[aeiou]y$/.test(value)) {\n return `${value.slice(0, -1)}ies`;\n }\n return `${value}s`;\n }\n}\n","import { SchemaProviderRegistry } from \"@/core/registry/schema-provider/schema-provider-registry\";\nimport { PrismaSchemaProvider } from \"./prisma\";\n\nexport const schemaProviderRegistry = SchemaProviderRegistry.create().register(new PrismaSchemaProvider()).build();","import { Command } from 'commander';\nimport { handleGenerateDocsAction } from './action';\n\nexport const docsCommand = new Command()\n .command('docs')\n .description('Generate OpenAPI specification')\n .option('--router <path>', 'Path to the router file', 'src/igniter.router.ts')\n .option('--output <dir>', 'Output directory for the OpenAPI spec', './src/docs')\n .action(handleGenerateDocsAction);\n","import type { IntrospectedRouter } from \"./router-instrospector\";\n\ntype OpenApiV3Document = Record<string, any>;\n\n// Local minimal DocsConfig type to avoid cross-package type resolution issues during CLI build/testing\nexport interface DocsConfig {\n info?: { title?: string; version?: string; description?: string };\n servers?: Array<{ url: string; description?: string }>;\n securitySchemes?: Record<string, any>;\n playground?: any;\n filepath?: string;\n}\n\nfunction toPascalCase(str: string): string {\n if (!str) return '';\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\nexport class OpenAPIGenerator {\n private docsConfig: DocsConfig;\n private schemas: Record<string, any> = {};\n\n private constructor(config: DocsConfig) {\n this.docsConfig = config || {};\n }\n\n static create(config: DocsConfig): OpenAPIGenerator {\n return new OpenAPIGenerator(config);\n }\n\n public generate(router: IntrospectedRouter): OpenApiV3Document {\n const servers = (this.docsConfig.servers && this.docsConfig.servers.length > 0)\n ? this.docsConfig.servers\n : [{ url: 'http://localhost:3000/api/v1', description: 'Default server' }];\n\n const spec: OpenApiV3Document = {\n openapi: '3.0.0',\n info: this.docsConfig.info || { title: 'Igniter API', version: '1.0.0' },\n servers,\n tags: this.buildTags(router),\n paths: this.buildPaths(router),\n components: {\n schemas: this.schemas,\n securitySchemes: this.docsConfig.securitySchemes || {},\n },\n };\n return spec;\n }\n\n private buildTags(router: IntrospectedRouter): any[] {\n const tags: any[] = [];\n for (const [controllerKey, controller] of Object.entries(router.controllers)) {\n const tag = {\n name: controller.name || controllerKey,\n description: controller.description,\n };\n tags.push(tag);\n }\n return tags;\n }\n\n private buildPaths(router: IntrospectedRouter): Record<string, any> {\n const paths: Record<string, any> = {};\n for (const [controllerKey, controller] of Object.entries(router.controllers)) {\n for (const [actionKey, action] of Object.entries(controller.actions)) {\n const actionName = action.name || actionKey;\n let path = `/${controller.path}/${action.path}`;\n path = path.replace(/\\/{2,}/g, '/');\n if (path.length > 1 && path.endsWith('/')) {\n path = path.slice(0, -1);\n }\n\n if (!paths[path]) {\n paths[path] = {};\n }\n\n const operation: Record<string, any> = {\n summary: action.description || actionName,\n operationId: actionName,\n tags: [controller.name || controllerKey],\n parameters: [],\n requestBody: undefined,\n responses: {\n '200': {\n description: 'Success',\n content: {\n 'application/json': {\n schema: {},\n },\n },\n },\n },\n };\n\n const pathParams = action.path.match(/:([a-zA-Z0-9_]+)/g);\n if (pathParams) {\n for (const param of pathParams) {\n const paramName = param.substring(1);\n operation.parameters.push({\n name: paramName,\n in: 'path',\n required: true,\n schema: { type: 'string' },\n });\n }\n }\n\n if ((action as any).querySchema) {\n const querySchemaName = `${toPascalCase(controller.name || controllerKey)}${toPascalCase(actionName)}Query`;\n const queryJsonSchema = (action as any).querySchema; // already JSON Schema\n this.schemas[querySchemaName] = queryJsonSchema;\n const properties = this.schemas[querySchemaName].properties || {};\n const requiredProps: string[] = this.schemas[querySchemaName].required || [];\n for (const propName of Object.keys(properties)) {\n operation.parameters.push({\n name: propName,\n in: 'query',\n required: requiredProps.includes(propName),\n schema: properties[propName],\n });\n }\n }\n\n if ((action as any).bodySchema) {\n const bodySchemaName = `${toPascalCase(controller.name || controllerKey)}${toPascalCase(actionName)}Body`;\n const bodyJsonSchema = (action as any).bodySchema; // already JSON Schema\n this.schemas[bodySchemaName] = bodyJsonSchema;\n operation.requestBody = {\n required: true,\n content: {\n 'application/json': {\n schema: { $ref: `#/components/schemas/${bodySchemaName}` },\n },\n },\n };\n }\n\n if ((action as any).isStream) {\n operation.description = (operation.description ? operation.description + '\\n\\n' : '') +\n 'This endpoint supports Server-Sent Events (SSE) for real-time updates. ' +\n 'It functions as a standard GET request initially, then maintains an open connection for streaming data.';\n }\n\n paths[path][action.method.toLowerCase()] = operation;\n }\n }\n return paths;\n }\n}\n","import * as path from 'path';\nimport { build, type BuildFailure } from 'esbuild';\nimport { IgniterRouter, IgniterControllerConfig, IgniterAction } from '@igniter-js/core';\nimport zodToJsonSchema from 'zod-to-json-schema';\nimport { createRequire } from 'module';\nimport { nodeExternalsPlugin} from 'esbuild-node-externals';\nimport * as p from '@clack/prompts';\n\nexport interface IntrospectedRouter {\n controllers: Record<string, IntrospectedController>;\n docs?: any;\n}\n\ninterface IntrospectedController {\n name: string;\n description?: string;\n path: string;\n actions: Record<string, IntrospectedAction>;\n}\n\ninterface IntrospectedAction {\n name?: string;\n description?: string;\n path: string;\n method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\n tags?: string[];\n bodySchema?: any;\n querySchema?: any;\n paramSchemas?: Record<string, any>;\n responseSchema?: any;\n isStream?: boolean;\n security?: any;\n}\n\n/**\n * Custom error class for router loading failures.\n */\nexport class RouterLoadError extends Error {\n public originalError: any;\n\n constructor(message: string, originalError?: any) {\n super(message);\n this.name = 'RouterLoadError';\n this.originalError = originalError;\n }\n}\n\n/**\n * RouterIntrospector is responsible for:\n * 1. Loading a user's Igniter router dynamically (optionally compiling with esbuild).\n * 2. Traversing and introspecting the loaded router to construct a serializable schema with JSON schemas.\n */\nexport class RouterInstrospector {\n private constructor() {}\n\n static create(): RouterInstrospector {\n return new RouterInstrospector();\n }\n\n /**\n * Loads the user's router file by compiling it in memory with esbuild.\n * @param routerPath The path to the router file.\n * @returns Promise resolving to the loaded and evaluated IgniterRouter instance.\n * @throws RouterLoadError if loading or compiling fails.\n */\n public async loadRouter(routerPath: string): Promise<IgniterRouter<any, any, any, any, any>> {\n const fullPath = path.resolve(process.cwd(), routerPath);\n\n try {\n const result = await build({\n entryPoints: [fullPath],\n bundle: true,\n platform: 'node',\n format: 'cjs',\n write: false, // Keep the result in memory\n logLevel: 'silent', // We will handle our own logging\n plugins: [nodeExternalsPlugin()],\n external: [\n '@igniter-js/*',\n '@prisma/*',\n 'prisma',\n 'redis',\n 'ioredis',\n 'bullmq',\n '@opentelemetry/*',\n 'chalk',\n 'supports-color',\n ],\n });\n\n const [outputFile] = result.outputFiles;\n if (!outputFile) {\n throw new RouterLoadError('esbuild did not produce any output.');\n }\n\n const compiledCode = outputFile.text;\n const routerModule = { exports: {} };\n\n const projectRequire = createRequire(fullPath);\n const requireFunc = (moduleName: string) => {\n try {\n return projectRequire(moduleName);\n } catch (error) {\n return require(moduleName);\n }\n };\n\n const factory = new Function('exports', 'require', 'module', '__filename', '__dirname', compiledCode);\n factory(routerModule.exports, requireFunc, routerModule, fullPath, path.dirname(fullPath));\n\n const moduleExports = routerModule.exports as any;\n const router = moduleExports.AppRouter || moduleExports.default || moduleExports;\n\n if (router && typeof router.controllers === 'object') {\n return router;\n }\n\n throw new RouterLoadError('Module was compiled and loaded, but no valid Igniter router export was found.');\n } catch (error: any) {\n if (error && Array.isArray((error as BuildFailure).errors)) {\n const buildFailure = error as BuildFailure;\n const errorMessages = buildFailure.errors.map(e => e.text).join('\\n');\n const detailedMessage = `esbuild failed to compile the router file:\\n${errorMessages}`;\n throw new RouterLoadError(detailedMessage, error);\n }\n\n p.log.error(`Error loading router: ${error instanceof Error ? error.message : String(error)}`);\n\n throw new RouterLoadError(`Failed to load router from ${routerPath}`, error);\n }\n }\n\n /**\n * Traverses a loaded router object and converts it into a serializable schema.\n * Converts Zod schemas to JSON schemas.\n * @param router The loaded IgniterRouter instance.\n * @returns An object containing the introspected schema and statistics.\n */\n public introspectRouter(router: IgniterRouter<any, any, any, any, any>): { schema: IntrospectedRouter, stats: { controllers: number, actions: number } } {\n const introspectedControllers: Record<string, IntrospectedController> = {};\n let totalActions = 0;\n\n \n\n for (const [controllerName, controller] of Object.entries(router.controllers)) {\n const introspectedActions: Record<string, IntrospectedAction> = {};\n const typedController = controller as IgniterControllerConfig<any>;\n\n if (typedController && typedController.actions) {\n for (const [actionName, action] of Object.entries(typedController.actions)) {\n try {\n const typedAction = action as IgniterAction<any, any, any, any, any, any, any, any, any, any>;\n\n introspectedActions[actionName] = {\n name: actionName,\n path: typedAction.path,\n method: typedAction.method,\n description: typedAction.description,\n bodySchema: typedAction.body ? zodToJsonSchema(typedAction.body, { target: 'openApi3' }) : undefined,\n querySchema: typedAction.query ? zodToJsonSchema(typedAction.query, { target: 'openApi3' }) : undefined,\n };\n totalActions++;\n } catch (err) {\n throw err;\n }\n }\n }\n\n introspectedControllers[controllerName] = {\n ...typedController,\n actions: introspectedActions,\n };\n }\n\n const schemaResult: IntrospectedRouter = {\n controllers: introspectedControllers,\n docs: router.config.docs,\n };\n\n return {\n schema: schemaResult,\n stats: {\n controllers: Object.keys(introspectedControllers).length,\n actions: totalActions\n }\n };\n }\n}\n","import { OpenAPIGenerator } from '@/core/openapi';\nimport { RouterInstrospector } from '@/core/router-instrospector';\nimport * as p from '@clack/prompts';\nimport * as fs from 'fs';\nimport * as path from 'path';\n\nexport interface DocsGenerationResult {\n durationMs: number;\n sizeKb: number;\n outputPath: string;\n}\n\nexport async function generateDocsWatchMode(routerPath: string, outputDir: string): Promise<DocsGenerationResult> {\n const startTime = Date.now();\n\n const outputDirFull = path.resolve(outputDir);\n if (!fs.existsSync(outputDirFull)) {\n fs.mkdirSync(outputDirFull, { recursive: true });\n }\n\n const outputPath = path.join(outputDirFull, 'openapi.json');\n\n // Se o arquivo openapi.json não existir, pode criar\n if (!fs.existsSync(outputPath)) {\n fs.writeFileSync(outputPath, '{}', 'utf8'); // Garante que o arquivo seja criado vazio antes de popular\n }\n\n const routerInstrospector = RouterInstrospector.create();\n const router = await routerInstrospector.loadRouter(routerPath);\n\n if (!router) {\n throw new Error(`Router not found at: ${routerPath}`);\n }\n\n if (!router.config.docs) {\n throw new Error('Router does not have docs configuration');\n }\n\n const openapiGenerator = OpenAPIGenerator.create(router.config.docs);\n const openapi = openapiGenerator.generate(router);\n\n fs.writeFileSync(outputPath, JSON.stringify(openapi, null, 2), 'utf8');\n\n const sizeKb = fs.statSync(outputPath).size / 1024;\n\n return {\n durationMs: Date.now() - startTime,\n sizeKb,\n outputPath,\n };\n}\n\nexport async function handleGenerateDocsAction(options: { router: string; output: string }) {\n try {\n p.intro('Generate OpenAPI documentation');\n\n const spinner = p.spinner();\n spinner.start('Generating OpenAPI documentation...');\n\n const result = await generateDocsWatchMode(options.router, options.output);\n\n spinner.stop('OpenAPI documentation generated successfully.');\n p.log.success(\n `Docs generated in ${(result.durationMs / 1000).toFixed(2)}s (${result.sizeKb.toFixed(1)} KB)`,\n );\n p.log.info('Test your API on Igniter Studio at: http://localhost:3000/api/v1/docs');\n process.exit(0);\n } catch (error) {\n p.log.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n","import { Command } from 'commander';\nimport { handleGenerateSchemaAction } from './action';\n\nexport const schemaCommand = new Command()\n .command('schema')\n .description('Generate client schema from your API router')\n .option('--router <path>', 'Path to the router file', 'src/igniter.router.ts')\n .option('--output <path>', 'Output path for the schema file', 'src/igniter.schema.ts')\n .action(handleGenerateSchemaAction);\n","import { RouterInstrospector } from '@/core/router-instrospector';\nimport { TemplateEngine } from '@/core/template-engine';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as handlebars from 'handlebars';\nimport * as p from '@clack/prompts';\n\nexport interface SchemaGenerationResult {\n durationMs: number;\n controllers: number;\n actions: number;\n}\n\nexport async function generateSchemaWatchMode(routerPath: string, outputPath: string): Promise<SchemaGenerationResult> {\n const startTime = Date.now();\n\n const routerInstrospector = RouterInstrospector.create();\n const router = await routerInstrospector.loadRouter(routerPath);\n const { schema, stats } = routerInstrospector.introspectRouter(router);\n\n const templateEngine = TemplateEngine.create();\n const templatePath = templateEngine.resolvePath('scaffold', 'igniter.schema.hbs');\n const templateSource = fs.readFileSync(templatePath, 'utf8');\n const template = handlebars.compile(templateSource);\n const schemaContent = template({\n generatedAt: new Date().toISOString(),\n schemaString: JSON.stringify(schema, null, 2),\n });\n\n const outputFullPath = path.resolve(process.cwd(), outputPath);\n fs.writeFileSync(outputFullPath, schemaContent, 'utf8');\n\n return {\n durationMs: Date.now() - startTime,\n controllers: stats.controllers,\n actions: stats.actions,\n };\n}\n\nexport async function handleGenerateSchemaAction({ router: routerPath, output: outputPath }: { router: string; output: string; watch: boolean }) {\n try {\n p.intro('Generate Igniter.js Client Schema');\n\n const spinner = p.spinner();\n spinner.start('Generating schema...');\n\n const result = await generateSchemaWatchMode(routerPath, outputPath);\n\n spinner.stop('Schema generated successfully.');\n p.log.success(\n `Schema generated in ${(result.durationMs / 1000).toFixed(2)}s (${result.controllers} controllers, ${result.actions} actions).`,\n );\n\n p.outro('All done!');\n process.exit(0);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n p.log.error(`Failed to generate schema: ${errorMessage}`);\n process.exit(1);\n }\n}\n","import { Command } from \"commander\";\nimport { handleGenerateControllerAction } from \"./action\";\n\nexport const controllerCommand = new Command()\n .command(\"controller\")\n .description(\"Scaffold a new controller within a feature\")\n .argument(\"[name]\", \"Name of the controller (e.g., 'profile')\")\n .option(\"-f, --feature <feature>\", \"Target feature name\")\n .action(handleGenerateControllerAction);\n","import * as path from \"path\";\nimport * as p from \"@clack/prompts\";\nimport { FeatureWorkspace } from \"@/commands/generate/feature/feature\";\nimport { FeaturePrompts } from \"@/commands/generate/feature/prompts\";\nimport { TemplateEngine } from \"@/core/template-engine\";\nimport { Casing } from \"@/utils/casing\";\nimport { tryCatch } from \"@/utils/try-catch\";\n\ninterface ControllerOptions {\n feature?: string;\n}\n\nexport async function handleGenerateControllerAction(\n name: string | undefined,\n options: ControllerOptions,\n): Promise<void> {\n p.intro(\"Generate Controller\");\n\n let controllerInput =\n name\n\n if (!controllerInput) {\n controllerInput = await FeaturePrompts.askForEntityName({\n message: \"What is the name of the controller?\",\n placeholder: \"profile\",\n cancelMessage: \"Controller generation cancelled.\",\n });\n }\n\n const controllerSlug = Casing.toKebabCase(controllerInput);\n const controllerExport = `${Casing.toPascalCase(controllerSlug)}Controller`;\n const controllerDisplay = Casing.toPascalCase(controllerSlug);\n\n const selectedFeature = await tryCatch(FeaturePrompts.resolveFeatureSlug(\n \"Controller generation cancelled.\",\n options.feature,\n ));\n\n if (selectedFeature.error) {\n p.log.error(`Controller generation failed: ${selectedFeature.error.message}`);\n process.exit(1);\n }\n\n const featureSlug = Casing.toKebabCase(selectedFeature.data);\n\n const featureDir = FeatureWorkspace.featureDir(featureSlug);\n await FeatureWorkspace.ensureStructure(featureDir);\n\n const controllerPath = path.join(\n featureDir,\n \"controllers\",\n `${controllerSlug}.controller.ts`,\n );\n\n if (await FeatureWorkspace.fileExists(controllerPath)) {\n p.log.error(\n `Controller '${controllerSlug}' already exists at ${path.relative(process.cwd(), controllerPath)}.`,\n );\n process.exit(1);\n }\n\n const templateEngine = TemplateEngine.create();\n const controllerTemplate = templateEngine.resolvePath(\n \"generate\",\n \"feature\",\n \"empty.controller.hbs\",\n );\n\n const spinner = p.spinner();\n spinner.start(\n `Creating controller '${controllerSlug}' inside feature '${featureSlug}'...`,\n );\n\n try {\n await templateEngine.renderToFile(\n controllerTemplate,\n {\n controllerExport,\n controllerDisplayName: controllerDisplay,\n controllerRoute: controllerSlug,\n },\n controllerPath,\n );\n\n spinner.stop(\"Controller created successfully!\");\n p.log.success(\n `Created controller '${controllerSlug}' in feature '${featureSlug}'.`,\n );\n p.outro(\"Controller generation complete!\");\n } catch (error) {\n spinner.stop(\"Failed to create the controller.\");\n const message = error instanceof Error ? error.message : String(error);\n p.log.error(`Controller generation failed: ${message}`);\n process.exit(1);\n }\n}\n","/**\n * Represents a successful result containing data and no error\n * @template T The type of the successful data\n */\ntype Success<T> = {\n data: T;\n error: null;\n};\n\n/**\n * Represents a failure result containing an error and no data\n * @template E The type of the error\n */\ntype Failure<E> = {\n data: null;\n error: E;\n};\n\n/**\n * Discriminated union type representing either a successful or failed result\n * @template T The type of the successful data\n * @template E The type of the error, defaults to Error\n */\ntype Result<T, E = Error> = Success<T> | Failure<E>;\n\n/**\n * A utility function that wraps promise execution in a type-safe try-catch block.\n * Provides a standardized way to handle asynchronous operations and their potential errors.\n * \n * @template T The type of the successful data\n * @template E The type of the error, defaults to Error\n * @param promise The promise to execute\n * @returns A Result object containing either the successful data or an error\n * \n * @remarks\n * This function provides a more elegant way to handle promise rejections without try-catch blocks\n * in your business logic. It returns a discriminated union type that makes error handling more explicit\n * and type-safe.\n * \n * @example\n * ```typescript\n * // Simple usage with fetch\n * const result = await tryCatch(fetch('https://api.example.com/data'));\n * if (result.error) {\n * console.error('Failed to fetch:', result.error);\n * } else {\n * const data = await result.data.json();\n * console.log('Success:', data);\n * }\n * \n * // Usage with custom error type\n * interface ApiError {\n * code: string;\n * message: string;\n * }\n * \n * const result = await tryCatch<UserData, ApiError>(fetchUserData(userId));\n * if (result.error) {\n * console.error(`Error ${result.error.code}: ${result.error.message}`);\n * } else {\n * console.log('User data:', result.data);\n * }\n * ```\n */\nexport async function tryCatch<T, E = Error>(\n promise: Promise<T>,\n): Promise<Result<T, E>> {\n try {\n const data = await promise;\n return { data, error: null };\n } catch (error) {\n return { data: null, error: error as E };\n }\n}","import { Command } from \"commander\";\nimport { handleGenerateProcedureAction } from \"./action\";\n\nexport const procedureCommand = new Command()\n .command(\"procedure\")\n .description(\"Scaffold a new procedure within a feature\")\n .argument(\"[name]\", \"Name of the procedure (e.g., 'profile')\")\n .option(\"-f, --feature <feature>\", \"Target feature name\")\n .action(handleGenerateProcedureAction);\n","import * as path from \"path\";\nimport * as p from \"@clack/prompts\";\nimport { FeatureWorkspace } from \"@/commands/generate/feature/feature\";\nimport { FeaturePrompts } from \"@/commands/generate/feature/prompts\";\nimport { TemplateEngine } from \"@/core/template-engine\";\nimport { Casing } from \"@/utils/casing\";\nimport { tryCatch } from \"@/utils/try-catch\";\nimport { rm } from \"fs/promises\";\n\ninterface ProcedureOptions {\n feature?: string;\n}\n\nexport async function handleGenerateProcedureAction(\n name: string | undefined,\n options: ProcedureOptions,\n): Promise<void> {\n p.intro(\"Generate Procedure\");\n\n let procedureInput =\n name\n\n if (!procedureInput) {\n procedureInput = await FeaturePrompts.askForEntityName({\n message: \"What is the name of the procedure?\",\n placeholder: \"profile\",\n cancelMessage: \"Procedure generation cancelled.\",\n });\n }\n\n const procedureSlug = Casing.toKebabCase(procedureInput);\n const procedureExport = `${Casing.toPascalCase(procedureSlug)}Procedure`;\n const procedureDisplay = Casing.toPascalCase(procedureSlug);\n\n const selectedFeature = await tryCatch(FeaturePrompts.resolveFeatureSlug(\n \"Procedure generation cancelled.\",\n options.feature,\n ));\n\n if (selectedFeature.error) {\n p.log.error(`Procedure generation failed: ${selectedFeature.error.message}`);\n process.exit(1);\n }\n\n const featureSlug = Casing.toKebabCase(selectedFeature.data);\n\n const featureDir = FeatureWorkspace.featureDir(featureSlug);\n await FeatureWorkspace.ensureStructure(featureDir);\n\n const procedurePath = path.join(\n featureDir,\n \"procedures\",\n `${procedureSlug}.procedure.ts`,\n );\n\n if (await FeatureWorkspace.fileExists(procedurePath)) {\n p.log.error(\n `Procedure '${procedureSlug}' already exists at ${path.relative(process.cwd(), procedurePath)}.`,\n );\n process.exit(1);\n }\n\n const templateEngine = TemplateEngine.create();\n const procedureTemplate = templateEngine.resolvePath(\n \"generate\",\n \"feature\",\n \"procedure.hbs\",\n );\n\n const spinner = p.spinner();\n spinner.start(\n `Creating procedure '${procedureSlug}' inside feature '${featureSlug}'...`,\n );\n\n if (await FeatureWorkspace.fileExists(path.join(featureDir, \"procedures\", \".gitkeep\"))) {\n await rm(path.join(featureDir, \"procedures\", \".gitkeep\"));\n }\n\n try {\n await templateEngine.renderToFile(\n procedureTemplate,\n {\n procedureExport,\n procedureDisplayName: procedureDisplay,\n featureName: Casing.toKebabCase(featureSlug),\n },\n procedurePath,\n );\n\n spinner.stop(\"Procedure created successfully!\");\n p.log.success(\n `Created procedure '${procedureSlug}' in feature '${featureSlug}'.`,\n );\n p.outro(\"Procedure generation complete!\");\n } catch (error) {\n spinner.stop(\"Failed to create the procedure.\");\n const message = error instanceof Error ? error.message : String(error);\n p.log.error(`Procedure generation failed: ${message}`);\n process.exit(1);\n }\n}\n","import { Command } from 'commander';\nimport { handleDevAction } from './action';\n\nexport const devCommand = new Command()\n .command('dev')\n .description('Start development mode with automatic schema and docs regeneration')\n .option('--router <path>', 'Path to the router file', 'src/igniter.router.ts')\n .option('--output <path>', 'Output path for the schema file', 'src/igniter.schema.ts')\n .option('--docs-output <dir>', 'Output directory for the OpenAPI spec', './src/docs')\n .option('--cmd <command>', 'Custom command to start the development server')\n .action(handleDevAction);\n\n","import * as path from 'path';\nimport * as fs from 'fs';\nimport { spawn, ChildProcess } from 'child_process';\nimport chokidar from 'chokidar';\nimport { render } from 'ink';\nimport React from 'react';\nimport { detectPackageManager } from '@/core/package-manager';\nimport { generateSchemaWatchMode } from '../generate/schema/action';\nimport { generateDocsWatchMode } from '../generate/docs/action';\nimport { DevUI, type LogEntry } from './components';\nimport type { DevCommandOptions } from './types';\n\nfunction getDefaultDevCommand(packageManager: string): string {\n switch (packageManager) {\n case 'yarn':\n return 'yarn dev';\n case 'pnpm':\n return 'pnpm dev';\n case 'bun':\n return 'bun dev';\n default:\n return 'npm run dev';\n }\n}\n\nasync function regenerateSchemaAndDocs(\n routerPath: string,\n outputPath: string,\n docsOutputDir: string,\n addLog: (log: LogEntry) => void,\n): Promise<void> {\n try {\n const schemaResult = await generateSchemaWatchMode(routerPath, outputPath);\n addLog({\n type: 'success',\n message: `Schema regenerated in ${(schemaResult.durationMs / 1000).toFixed(2)}s (${schemaResult.controllers} controllers, ${schemaResult.actions} actions)`,\n timestamp: new Date(),\n });\n\n const docsResult = await generateDocsWatchMode(routerPath, docsOutputDir);\n addLog({\n type: 'success',\n message: `OpenAPI docs regenerated in ${(docsResult.durationMs / 1000).toFixed(2)}s (${docsResult.sizeKb.toFixed(1)} KB)`,\n timestamp: new Date(),\n });\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n addLog({\n type: 'error',\n message: `Failed to regenerate: ${errorMessage}`,\n timestamp: new Date(),\n });\n }\n}\n\nexport async function handleDevAction(options: DevCommandOptions): Promise<void> {\n // Setup\n const packageManager = detectPackageManager();\n const routerPath = path.resolve(process.cwd(), options.router || 'src/igniter.router.ts');\n const outputPath = options.output || 'src/igniter.schema.ts';\n const docsOutputDir = options.docsOutput || './src/docs';\n const devCommand = options.cmd || getDefaultDevCommand(packageManager);\n\n // Validate router exists\n if (!fs.existsSync(routerPath)) {\n console.error(`Router file not found: ${routerPath}`);\n process.exit(1);\n }\n\n // State for logs\n const igniterLogs: LogEntry[] = [];\n const appLogs: LogEntry[] = [];\n\n let rerenderFn: (() => void) | null = null;\n\n const addIgniterLog = (log: LogEntry) => {\n igniterLogs.push(log);\n // Keep only last 1000 logs\n if (igniterLogs.length > 1000) {\n igniterLogs.shift();\n }\n if (rerenderFn) {\n rerenderFn();\n }\n };\n\n const addAppLog = (log: LogEntry) => {\n appLogs.push(log);\n // Keep only last 1000 logs\n if (appLogs.length > 1000) {\n appLogs.shift();\n }\n if (rerenderFn) {\n rerenderFn();\n }\n };\n\n // Initial generation\n try {\n const docsResult = await generateDocsWatchMode(routerPath, docsOutputDir);\n addIgniterLog({\n type: 'success',\n message: `OpenAPI docs generated in ${(docsResult.durationMs / 1000).toFixed(2)}s (${docsResult.sizeKb.toFixed(1)} KB)`,\n timestamp: new Date(),\n });\n\n const schemaResult = await generateSchemaWatchMode(routerPath, outputPath);\n addIgniterLog({\n type: 'success',\n message: `Schema generated in ${(schemaResult.durationMs / 1000).toFixed(2)}s (${schemaResult.controllers} controllers, ${schemaResult.actions} actions)`,\n timestamp: new Date(),\n }); \n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n addIgniterLog({\n type: 'error',\n message: `Failed to generate: ${errorMessage}`,\n timestamp: new Date(),\n });\n process.exit(1);\n }\n\n // Setup watch paths\n const featuresDir = path.join(process.cwd(), 'src', 'features');\n const watchPaths = [\n routerPath, // Watch router file directly\n featuresDir, // Watch features directory recursively\n ].filter((p) => fs.existsSync(p));\n\n if (watchPaths.length === 0) {\n addIgniterLog({\n type: 'warn',\n message: 'No watchable paths found. Only watching router file.',\n timestamp: new Date(),\n });\n watchPaths.push(routerPath);\n }\n\n addIgniterLog({\n type: 'info',\n message: `Watching for changes in: ${watchPaths.map((p) => path.relative(process.cwd(), p)).join(', ')}`,\n timestamp: new Date(),\n });\n\n // Setup file watcher with debounce\n let regenerateTimeout: NodeJS.Timeout | null = null;\n const DEBOUNCE_MS = 300;\n\n const watcher = chokidar.watch(watchPaths, {\n ignored: [\n /node_modules/,\n /\\.git/,\n /dist/,\n /\\.next/,\n /\\.turbo/,\n /\\.cache/,\n /\\.test\\.ts$/,\n /\\.spec\\.ts$/,\n ],\n persistent: true,\n ignoreInitial: true,\n });\n\n watcher.on('change', (filePath) => {\n const relativePath = path.relative(process.cwd(), filePath);\n \n // Clear existing timeout\n if (regenerateTimeout) {\n clearTimeout(regenerateTimeout);\n }\n\n // Debounce regeneration\n regenerateTimeout = setTimeout(async () => {\n addIgniterLog({\n type: 'info',\n message: `File changed: ${relativePath}`,\n timestamp: new Date(),\n });\n await regenerateSchemaAndDocs(routerPath, outputPath, docsOutputDir, addIgniterLog);\n }, DEBOUNCE_MS);\n });\n\n watcher.on('error', (error: unknown) => {\n const errorMessage = error instanceof Error ? error.message : String(error);\n addIgniterLog({\n type: 'error',\n message: `Watcher error: ${errorMessage}`,\n timestamp: new Date(),\n });\n });\n\n // Start dev server\n let devProcess: ChildProcess | null = null;\n\n if (devCommand) {\n addAppLog({\n type: 'info',\n message: `Starting dev server: ${devCommand}`,\n timestamp: new Date(),\n });\n \n const [cmd, ...args] = devCommand.split(' ');\n devProcess = spawn(cmd, args, {\n stdio: ['ignore', 'pipe', 'pipe'],\n shell: true,\n env: {\n ...process.env,\n NODE_ENV: 'development',\n },\n cwd: process.cwd(),\n });\n\n devProcess.stdout?.on('data', (data: Buffer) => {\n const lines = data.toString().split('\\n').filter((line) => line.trim());\n lines.forEach((line) => {\n addAppLog({\n type: 'info',\n message: line,\n timestamp: new Date(),\n });\n });\n });\n\n devProcess.stderr?.on('data', (data: Buffer) => {\n const lines = data.toString().split('\\n').filter((line) => line.trim());\n lines.forEach((line) => {\n addAppLog({\n type: 'error',\n message: line,\n timestamp: new Date(),\n });\n });\n });\n\n devProcess.on('error', (error: Error) => {\n addAppLog({\n type: 'error',\n message: `Dev server error: ${error.message}`,\n timestamp: new Date(),\n });\n });\n\n devProcess.on('exit', (code) => {\n if (code !== null && code !== 0) {\n addAppLog({\n type: 'warn',\n message: `Dev server exited with code ${code}`,\n timestamp: new Date(),\n });\n } else {\n addAppLog({\n type: 'info',\n message: 'Dev server stopped',\n timestamp: new Date(),\n });\n }\n });\n }\n\n // Cleanup function\n const cleanup = () => {\n if (regenerateTimeout) {\n clearTimeout(regenerateTimeout);\n }\n \n watcher.close();\n \n if (devProcess) {\n devProcess.kill('SIGTERM');\n }\n };\n\n // Render UI\n const DevComponent: React.FC = () => {\n return React.createElement(DevUI, {\n igniterLogs,\n appLogs,\n onExit: () => {\n cleanup();\n unmount();\n process.exit(0);\n },\n });\n };\n \n const { rerender, unmount } = render(React.createElement(DevComponent));\n rerenderFn = () => rerender(React.createElement(DevComponent));\n\n // Handle exit signals\n process.on('SIGINT', () => {\n cleanup();\n unmount();\n process.exit(0);\n });\n\n process.on('SIGTERM', () => {\n cleanup();\n unmount();\n process.exit(0);\n });\n\n // Wait for dev process if it exists\n if (devProcess) {\n await new Promise<void>((resolve) => {\n devProcess!.on('exit', () => resolve());\n });\n } else {\n // If no dev process, keep alive indefinitely\n await new Promise(() => {});\n }\n}\n","import React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\n\nexport interface LogEntry {\n type: 'info' | 'success' | 'error' | 'warn';\n message: string;\n timestamp: Date;\n}\n\ninterface DevUIProps {\n igniterLogs: LogEntry[];\n appLogs: LogEntry[];\n onExit: () => void;\n}\n\nfunction DevUI({ igniterLogs, appLogs, onExit }: DevUIProps) {\n const [activeTab, setActiveTab] = useState<'igniter' | 'app'>('igniter');\n\n useInput((input, key) => {\n if (key.escape || (key.ctrl && input === 'c')) {\n onExit();\n return;\n }\n \n if (key.leftArrow || input === '1') {\n setActiveTab('igniter');\n }\n \n if (key.rightArrow || input === '2') {\n setActiveTab('app');\n }\n });\n\n const formatLogEntry = (entry: LogEntry): string => {\n const time = entry.timestamp.toLocaleTimeString();\n const prefix = {\n info: 'ℹ',\n success: '✓',\n error: '✗',\n warn: '⚠',\n }[entry.type];\n \n return `[${time}] ${prefix} ${entry.message}`;\n };\n\n const renderLogs = (logs: LogEntry[], maxLines: number = 50) => {\n const visibleLogs = logs.slice(-maxLines);\n return (\n <Box flexDirection=\"column\">\n {visibleLogs.length === 0 ? (\n <Text dimColor>No logs yet...</Text>\n ) : (\n visibleLogs.map((log, index) => {\n const color = {\n info: 'cyan',\n success: 'green',\n error: 'red',\n warn: 'yellow',\n }[log.type];\n \n return (\n <Text key={`${log.timestamp.getTime()}-${index}`} color={color}>\n {formatLogEntry(log)}\n </Text>\n );\n })\n )}\n </Box>\n );\n };\n\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text bold>Igniter.js Development Mode</Text>\n </Box>\n \n {/* Custom Tabs */}\n <Box flexDirection=\"row\">\n <Box\n borderStyle={activeTab === 'igniter' ? 'round' : 'single'}\n borderColor={activeTab === 'igniter' ? 'cyan' : 'gray'}\n paddingX={1}\n marginRight={1}\n >\n <Text color={activeTab === 'igniter' ? 'cyan' : 'gray'} bold={activeTab === 'igniter'}>\n Igniter.js\n </Text>\n </Box>\n <Box\n borderStyle={activeTab === 'app' ? 'round' : 'single'}\n borderColor={activeTab === 'app' ? 'green' : 'gray'}\n paddingX={1}\n >\n <Text color={activeTab === 'app' ? 'green' : 'gray'} bold={activeTab === 'app'}>\n Application\n </Text>\n </Box>\n </Box>\n \n <Box marginTop={1} borderStyle=\"round\" paddingX={1} minHeight={20}>\n {activeTab === 'igniter' ? (\n <Box flexDirection=\"column\">\n <Text bold color=\"cyan\">\n Igniter.js Logs ({igniterLogs.length})\n </Text>\n <Box marginTop={1}>\n {renderLogs(igniterLogs)}\n </Box>\n </Box>\n ) : (\n <Box flexDirection=\"column\">\n <Text bold color=\"green\">\n Application Logs ({appLogs.length})\n </Text>\n <Box marginTop={1}>\n {renderLogs(appLogs)}\n </Box>\n </Box>\n )}\n </Box>\n \n <Box marginTop={1}>\n <Text dimColor>\n Press <Text bold>1</Text> or <Text bold>←</Text> for Igniter.js |{' '}\n <Text bold>2</Text> or <Text bold>→</Text> for Application |{' '}\n <Text bold>Ctrl+C</Text> or <Text bold>ESC</Text> to exit\n </Text>\n </Box>\n </Box>\n );\n}\n\nexport default DevUI;\n"],"mappings":"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","names":["Command","p","path","p","path","path","join","handlebars","path","p","join","fs","stat","resolve","path","path","path","readFile","writeFile","existsSync","join","handlebars","join","existsSync","readFile","writeFile","services","envVars","fs","path","path","path","path","path","path","path","fs","path","path","fs","p","p","execa","execa","fs","path","Command","Command","path","p","existsSync","writeFile","existsSync","readFile","writeFile","path","handlebars","readFile","existsSync","writeFile","mkdir","readdir","stat","writeFile","path","p","fs","path","stat","existsSync","spinner","cancel","provider","selection","writeFile","Command","Command","path","path","p","p","fs","path","spinner","Command","Command","fs","path","handlebars","p","spinner","Command","Command","path","p","spinner","Command","Command","path","p","rm","spinner","Command","Command","Command","path","fs","spawn","React","log","color","devCommand","log","p","spawn","React","resolve","Command","Command"]}