{"version":3,"sources":["../../src/cli/index.ts","../../../../node_modules/tsup/assets/cjs_shims.js","../../src/cli/commands/build.ts","../../src/cli/commands/create.ts","../../src/cli/generators/controller.ts","../../src/cli/generators/repository.ts","../../src/cli/generators/service.ts","../../src/cli/commands/db.ts","../../src/cli/commands/init.ts","../../src/cli/commands/make-docs.ts"],"sourcesContent":["#!/usr/bin/env bun\n\nimport { buildCommand } from \"./commands/build.js\";\nimport { createCommand } from \"./commands/create.js\";\nimport { dbCommand } from \"./commands/db.js\";\nimport { initCommand } from \"./commands/init.js\";\nimport { makeDocsCommand } from \"./commands/make-docs.js\";\n\nfunction printBanner() {\n\tconsole.log(`\n\\x1b[36m  Buntok CLI v0.3.0\\x1b[0m\n`);\n}\n\nfunction printUsage() {\n\tconsole.log(`\n\\x1b[36mUsage:\\x1b[0m\n  buntok <command> [arguments] [options]\n\n\\x1b[36mCommands:\\x1b[0m\n  init                   Setup project: copy SKILL.md + configure package.json + generate env.ts\n  build                  Build project for production (output → .buntok/)\n  create <entity>        Generate all files for entity (repo, service, controller)\n  db <command>           Database operations (migrate, seed, reset, generate, studio, status)\n  make:docs              Generate OpenAPI documentation automatically\n\n\\x1b[36mOptions (for create command):\\x1b[0m\n  --repo                 Generate only repository\n  --service              Generate only service\n  --controller           Generate only controller\n\n\\x1b[36mExamples:\\x1b[0m\n  buntok init                             # Initialize project setup\n  buntok build                            # Build project for production\n  buntok create user                      # Generate all files for user entity\n  buntok create user --repo --service     # Generate repository and service only\n  buntok db migrate                       # Run pending migrations\n  buntok db seed                          # Seed database\n  buntok make:docs                        # Generate OpenAPI documentation\n`);\n}\n\nexport async function main() {\n\tconst args = process.argv.slice(2);\n\tconst command = args[0];\n\tconst arg1 = args[1];\n\n\tif (!command) {\n\t\tprintBanner();\n\t\tprintUsage();\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\n\tswitch (command) {\n\t\tcase \"init\":\n\t\t\tawait initCommand();\n\t\t\tbreak;\n\t\tcase \"build\":\n\t\t\tawait buildCommand();\n\t\t\tbreak;\n\t\tcase \"create\":\n\t\t\tif (!arg1) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t\"\\x1b[31mError: entity name is required for create command\\x1b[0m\",\n\t\t\t\t);\n\t\t\t\tprocess.exitCode = 1;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait createCommand(arg1, args.slice(2));\n\t\t\tbreak;\n\t\tcase \"db\":\n\t\t\tawait dbCommand(args.slice(1));\n\t\t\tbreak;\n\t\tcase \"make:docs\":\n\t\t\tawait makeDocsCommand();\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tconsole.error(`\\x1b[31mUnknown command: ${command}\\x1b[0m`);\n\t\t\tprintUsage();\n\t\t\tprocess.exitCode = 1;\n\t\t\treturn;\n\t}\n}\n\nmain();\n","// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () => \n  typeof document === \"undefined\" \n    ? new URL(`file:${__filename}`).href \n    : (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT') \n      ? document.currentScript.src \n      : new URL(\"main.js\", document.baseURI).href;\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n","import { join } from \"node:path\";\nimport { existsSync } from \"node:fs\";\n\nexport async function buildCommand() {\n\tconst projectRoot = process.cwd();\n\tconst entryPoint = join(projectRoot, \"src/index.ts\");\n\tconst outDir = join(projectRoot, \".buntok\");\n\n\tif (!existsSync(entryPoint)) {\n\t\tconsole.error(\"\\x1b[31m❌ src/index.ts not found\\x1b[0m\");\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\n\tconsole.log(\"\\x1b[36m🔨 Building project...\\x1b[0m\");\n\n\tconst result = await Bun.build({\n\t\tentrypoints: [entryPoint],\n\t\toutdir: outDir,\n\t\ttarget: \"bun\",\n\t\ttsconfig: join(projectRoot, \"tsconfig.json\"),\n\t\tpackages: \"external\",\n\t});\n\n\tif (!result.success) {\n\t\tconsole.error(\"\\x1b[31m❌ Build failed:\\x1b[0m\");\n\t\tfor (const log of result.logs) {\n\t\t\tconsole.error(log);\n\t\t}\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\n\tconsole.log(\"\\x1b[32m✅ Build successful → .buntok/index.js\\x1b[0m\");\n\tconsole.log(\"\\x1b[90m  Deploy: copy .buntok/ + node_modules/ + package.json to server\\x1b[0m\");\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport fs from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { generateController } from \"../generators/controller.js\";\nimport { generateRepository } from \"../generators/repository.js\";\nimport { generateService } from \"../generators/service.js\";\n\ninterface CreateOptions {\n\trepo: boolean;\n\tservice: boolean;\n\tcontroller: boolean;\n\tall: boolean;\n}\n\nfunction parseOptions(args: string[]): CreateOptions {\n\tconst options: CreateOptions = {\n\t\trepo: false,\n\t\tservice: false,\n\t\tcontroller: false,\n\t\tall: true,\n\t};\n\n\tfor (const arg of args) {\n\t\tswitch (arg) {\n\t\t\tcase \"--repo\":\n\t\t\t\toptions.repo = true;\n\t\t\t\toptions.all = false;\n\t\t\t\tbreak;\n\t\t\tcase \"--service\":\n\t\t\t\toptions.service = true;\n\t\t\t\toptions.all = false;\n\t\t\t\tbreak;\n\t\t\tcase \"--controller\":\n\t\t\t\toptions.controller = true;\n\t\t\t\toptions.all = false;\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t// If any specific option is set, don't generate all\n\tif (!options.all) {\n\t\treturn options;\n\t}\n\n\t// Generate all by default\n\treturn {\n\t\trepo: true,\n\t\tservice: true,\n\t\tcontroller: true,\n\t\tall: false,\n\t};\n}\n\nasync function ensureDirectories(_entityName: string) {\n\tconst dirs = [\"src/repositories\", \"src/services\", \"src/controllers\"];\n\n\tawait Promise.all(\n\t\tdirs.map(async (dir) => {\n\t\t\tif (!existsSync(dir)) {\n\t\t\t\tawait fs.mkdir(dir, { recursive: true });\n\t\t\t}\n\t\t}),\n\t);\n}\n\nfunction toPascalCase(str: string): string {\n\treturn str\n\t\t.split(/[-_]/)\n\t\t.map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n\t\t.join(\"\");\n}\n\nexport async function createCommand(entityName: string, args: string[]) {\n\tconst options = parseOptions(args);\n\tconst pascalName = toPascalCase(entityName);\n\n\tconsole.log(`\\n\\x1b[36mCreating ${pascalName} entity...\\x1b[0m\\n`);\n\n\t// Ensure directories exist\n\tawait ensureDirectories(entityName);\n\n\tconst results: string[] = [];\n\tconst generatedFiles: string[] = [];\n\tconst tasks: Promise<void>[] = [];\n\n\t// Helper to generate file asynchronously\n\tconst generateFile = async (\n\t\tpath: string,\n\t\tcontentGenerator: () => string,\n\t\ttype: string,\n\t) => {\n\t\tif (!existsSync(path)) {\n\t\t\tawait fs.writeFile(path, contentGenerator());\n\t\t\tresults.push(`✓ ${type}: ${path}`);\n\t\t\tgeneratedFiles.push(path);\n\t\t} else {\n\t\t\tresults.push(`• ${type}: ${path} (already exists)`);\n\t\t}\n\t};\n\n\tif (options.repo) {\n\t\ttasks.push(\n\t\t\tgenerateFile(\n\t\t\t\tjoin(\"src/repositories\", `${entityName}.repository.ts`),\n\t\t\t\t() => generateRepository(entityName, pascalName),\n\t\t\t\t\"Repository\",\n\t\t\t),\n\t\t);\n\t}\n\n\tif (options.service) {\n\t\ttasks.push(\n\t\t\tgenerateFile(\n\t\t\t\tjoin(\"src/services\", `${entityName}.service.ts`),\n\t\t\t\t() => generateService(entityName, pascalName, options.repo),\n\t\t\t\t\"Service\",\n\t\t\t),\n\t\t);\n\t}\n\n\tif (options.controller) {\n\t\ttasks.push(\n\t\t\tgenerateFile(\n\t\t\t\tjoin(\"src/controllers\", `${entityName}.controller.ts`),\n\t\t\t\t() => generateController(entityName, pascalName, options.service),\n\t\t\t\t\"Controller\",\n\t\t\t),\n\t\t);\n\t}\n\n\t// Execute all file generations concurrently\n\tawait Promise.all(tasks);\n\n\t// Auto-format generated files with Biome if available\n\tif (generatedFiles.length > 0) {\n\t\tconst biomeProc = Bun.spawnSync(\n\t\t\t[\"bunx\", \"biome\", \"format\", \"--write\", ...generatedFiles],\n\t\t\t{\n\t\t\t\tstdio: [\"ignore\", \"ignore\", \"ignore\"],\n\t\t\t},\n\t\t);\n\t\tif (biomeProc.exitCode === 0) {\n\t\t\tconsole.log(\n\t\t\t\t\"\\x1b[90m✨ Auto-formatted generated files with Biome\\x1b[0m\\n\",\n\t\t\t);\n\t\t}\n\t}\n\n\t// Auto-register in src/index.ts\n\tconst indexPath = join(\"src\", \"index.ts\");\n\tif (existsSync(indexPath)) {\n\t\tconst indexContent = readFileSync(indexPath, \"utf-8\");\n\n\t\t// Build imports\n\t\tconst imports: string[] = [];\n\t\tconst instantiations: string[] = [];\n\n\t\t// Only register repo + service if full chain (they're needed by controller)\n\t\tif (options.repo && options.service) {\n\t\t\timports.push(`import { ${pascalName}Repository } from \"@/repositories/${entityName}.repository\";`);\n\t\t\tinstantiations.push(`const ${entityName}Repository = new ${pascalName}Repository();`);\n\t\t}\n\n\t\tif (options.service) {\n\t\t\tconst repoArg = options.repo ? `(${entityName}Repository)` : \"\";\n\t\t\tinstantiations.push(`const ${entityName}Service = new ${pascalName}Service${repoArg};`);\n\t\t\tif (!options.repo) {\n\t\t\t\timports.push(`import { ${pascalName}Service } from \"@/services/${entityName}.service\";`);\n\t\t\t}\n\t\t}\n\n\t\t// Always register controller\n\t\t{\n\t\t\timports.push(`import { ${pascalName}Controller } from \"@/controllers/${entityName}.controller\";`);\n\t\t\tconst serviceArg = options.service ? `(${entityName}Service)` : \"\";\n\t\t\tinstantiations.push(`app.registerController(new ${pascalName}Controller${serviceArg});`);\n\t\t}\n\n\t\tconst importBlock = imports.join(\"\\n\");\n\t\tconst instantiationBlock = instantiations.join(\"\\n\");\n\n\t\tif (!indexContent.includes(importBlock)) {\n\t\t\tconst lines = indexContent.split(\"\\n\");\n\n\t\t\t// Find the last import line and insert after it\n\t\t\tlet lastImportIndex = -1;\n\t\t\tfor (let i = 0; i < lines.length; i++) {\n\t\t\t\tif (lines[i]?.startsWith(\"import \")) {\n\t\t\t\t\tlastImportIndex = i;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (lastImportIndex !== -1) {\n\t\t\t\tlines.splice(lastImportIndex + 1, 0, importBlock);\n\t\t\t} else {\n\t\t\t\tlines.unshift(importBlock);\n\t\t\t}\n\n\t\t\t// Find app.registerController or app.listen and insert before it\n\t\t\tconst content = lines.join(\"\\n\");\n\t\t\tconst updatedContent = content.replace(\n\t\t\t\t/(app\\.(registerController|listen)\\s*\\()/,\n\t\t\t\t`${instantiationBlock}\\n\\n$1`,\n\t\t\t);\n\n\t\t\tawait fs.writeFile(indexPath, updatedContent);\n\t\t\tconsole.log(\n\t\t\t\t`\\x1b[32m✔ Registered ${pascalName} in src/index.ts\\x1b[0m`,\n\t\t\t);\n\t\t} else {\n\t\t\tconsole.log(\n\t\t\t\t`\\x1b[90m• src/index.ts: ${pascalName} already registered\\x1b[0m`,\n\t\t\t);\n\t\t}\n\t}\n\n\t// Print results\n\tconsole.log(\"\\x1b[32mGenerated files:\\x1b[0m\");\n\tfor (const result of results.sort()) {\n\t\tconsole.log(`  ${result}`);\n\t}\n\n\tconsole.log(`\n\\x1b[36mNext steps:\\x1b[0m\n  1. Start dev server: \\x1b[33mbun run dev\\x1b[0m\n`);\n}\n","export function generateController(\n\tentityName: string,\n\tpascalName: string,\n\twithService: boolean = true,\n): string {\n\tif (withService) {\n\t\treturn `import { Controller, BaseController } from \"@buntok/core\";\nimport { ${pascalName}Service } from \"@/services/${entityName}.service\";\n\n@Controller(\"/${entityName}s\")\nexport class ${pascalName}Controller extends BaseController<${pascalName}> {\n  constructor(private readonly ${entityName}Service: ${pascalName}Service) {\n    super(${entityName}Service);\n  }\n}\n`;\n\t}\n\n\treturn `import { Controller, Get, Post, Put, Delete } from \"@buntok/core\";\nimport type { Context } from \"@buntok/core\";\n\n@Controller(\"/${entityName}s\")\nexport class ${pascalName}Controller {\n  @Get(\"/\")\n  async getAll(ctx: Context) {\n    return ctx.success([], \"Records retrieved successfully\");\n  }\n\n  @Get(\"/:id\")\n  async getById(ctx: Context) {\n    return ctx.success({ id: ctx.params.id }, \"Record retrieved successfully\");\n  }\n\n  @Post(\"/\")\n  async create(ctx: Context) {\n    const data = await ctx.body<any>();\n    return ctx.success(data, \"Record created successfully\", 201);\n  }\n\n  @Put(\"/:id\")\n  async update(ctx: Context) {\n    const data = await ctx.body<any>();\n    return ctx.success({ id: ctx.params.id, ...data }, \"Record updated successfully\");\n  }\n\n  @Delete(\"/:id\")\n  async delete(ctx: Context) {\n    return ctx.success(null, \"Record deleted successfully\");\n  }\n}\n`;\n}\n","export function generateRepository(\n\tentityName: string,\n\tpascalName: string,\n): string {\n\treturn `import { BaseRepository } from \"@buntok/prisma\";\n// Replace with your own Prisma client instance\nimport { prisma } from \"@/lib/prisma\";\nimport type { ${pascalName}, PrismaClient, Prisma } from \"@prisma/client\";\n\nexport class ${pascalName}Repository extends BaseRepository<\n  ${pascalName},\n  PrismaClient,\n  Prisma.${pascalName}CreateInput,\n  Prisma.${pascalName}UpdateInput\n> {\n  constructor() {\n    super(prisma, \"${entityName}\");\n  }\n}\n`;\n}\n","export function generateService(\n\tentityName: string,\n\tpascalName: string,\n\twithRepo: boolean = true,\n): string {\n\tif (withRepo) {\n\t\treturn `import { BaseService } from \"@buntok/core\";\nimport { ${pascalName}Repository } from \"@/repositories/${entityName}.repository\";\nimport type { ${pascalName} } from \"@prisma/client\";\n\nexport class ${pascalName}Service extends BaseService<${pascalName}> {\n  constructor(private readonly ${entityName}Repository: ${pascalName}Repository) {\n    super(${entityName}Repository);\n  }\n}\n`;\n\t}\n\n\treturn `export class ${pascalName}Service {\n  async getAll(): Promise<any[]> {\n    return [];\n  }\n\n  async getById(id: string): Promise<any> {\n    return { id };\n  }\n\n  async create(data: any): Promise<any> {\n    return data;\n  }\n\n  async update(id: string, data: any): Promise<any> {\n    return { id, ...data };\n  }\n\n  async delete(id: string): Promise<boolean> {\n    return true;\n  }\n}\n`;\n}\n","import { execSync } from \"node:child_process\";\nimport { existsSync, readFileSync } from \"node:fs\";\n\ntype DbCommand = \"migrate\" | \"seed\" | \"reset\" | \"generate\" | \"studio\" | \"status\";\n\nfunction detectOrm(): \"prisma\" | \"drizzle\" | \"typeorm\" | null {\n\t// Check for Prisma\n\tif (existsSync(\"prisma/schema.prisma\") || existsSync(\"prisma/schema.ts\")) {\n\t\treturn \"prisma\";\n\t}\n\n\t// Check for Drizzle\n\tif (existsSync(\"drizzle.config.ts\") || existsSync(\"drizzle.config.js\")) {\n\t\treturn \"drizzle\";\n\t}\n\n\t// Check for TypeORM\n\tif (existsSync(\"ormconfig.json\") || existsSync(\"ormconfig.ts\") || existsSync(\"ormconfig.js\")) {\n\t\treturn \"typeorm\";\n\t}\n\n\t// Check package.json dependencies\n\tif (existsSync(\"package.json\")) {\n\t\tconst pkg = JSON.parse(readFileSync(\"package.json\", \"utf-8\"));\n\t\tconst allDeps = { ...pkg.dependencies, ...pkg.devDependencies };\n\n\t\tif (allDeps[\"@prisma/client\"] || allDeps[\"prisma\"]) return \"prisma\";\n\t\tif (allDeps[\"drizzle-orm\"] || allDeps[\"drizzle-kit\"]) return \"drizzle\";\n\t\tif (allDeps[\"typeorm\"]) return \"typeorm\";\n\t}\n\n\treturn null;\n}\n\nfunction runCommand(cmd: string): void {\n\tconsole.log(`\\x1b[90m$ ${cmd}\\x1b[0m`);\n\ttry {\n\t\texecSync(cmd, { stdio: \"inherit\", cwd: process.cwd() });\n\t} catch {\n\t\t// Command already printed its error\n\t\tprocess.exitCode = 1;\n\t}\n}\n\nfunction prismaCommand(subcommand: string, args: string[]): void {\n\tconst cmd = `npx prisma ${subcommand} ${args.join(\" \")}`.trim();\n\trunCommand(cmd);\n}\n\nfunction drizzleCommand(subcommand: string, args: string[]): void {\n\tconst commands: Record<string, string> = {\n\t\tmigrate: \"drizzle-kit generate\",\n\t\tseed: \"drizzle-kit seed\",\n\t\treset: \"drizzle-kit drop\",\n\t\tstatus: \"drizzle-kit check\",\n\t\tgenerate: \"drizzle-kit generate\",\n\t\tstudio: \"drizzle-kit studio\",\n\t};\n\tconst cmd = `${commands[subcommand] ?? subcommand} ${args.join(\" \")}`.trim();\n\trunCommand(cmd);\n}\n\nfunction typeormCommand(subcommand: string, args: string[]): void {\n\tconst commands: Record<string, string> = {\n\t\tmigrate: \"typeorm migration:run\",\n\t\tseed: \"typeorm seed\",\n\t\treset: \"typeorm migration:revert\",\n\t\tgenerate: \"typeorm migration:generate\",\n\t\tstatus: \"typeorm migration:show\",\n\t\tstudio: \"echo 'TypeORM does not have a built-in studio command'\",\n\t};\n\tconst cmd = `${commands[subcommand] ?? subcommand} ${args.join(\" \")}`.trim();\n\trunCommand(cmd);\n}\n\nfunction printUsage(): void {\n\tconsole.log(`\n\\x1b[36mUsage:\\x1b[0m\n  buntok db <command> [args]\n\n\\x1b[36mCommands:\\x1b[0m\n  migrate [name]      Run pending migrations\n  seed                Seed database\n  reset               Reset database (drop & recreate)\n  generate            Generate migration from schema changes\n  studio              Open database GUI\n  status              Show migration status\n\n\\x1b[36mSupported ORMs:\\x1b[0m\n  Prisma, Drizzle, TypeORM (auto-detected)\n\n\\x1b[36mExamples:\\x1b[0m\n  buntok db migrate                    # Run pending migrations\n  buntok db migrate add user_table     # Create new migration\n  buntok db seed                       # Seed database\n  buntok db studio                     # Open Prisma Studio / etc\n`);\n}\n\nexport async function dbCommand(args: string[]): Promise<void> {\n\tconst subcommand = args[0] as DbCommand | undefined;\n\n\tif (!subcommand) {\n\t\tprintUsage();\n\t\treturn;\n\t}\n\n\tconst validCommands: DbCommand[] = [\"migrate\", \"seed\", \"reset\", \"generate\", \"studio\", \"status\"];\n\tif (!validCommands.includes(subcommand)) {\n\t\tconsole.error(`\\x1b[31mUnknown command: ${subcommand}\\x1b[0m`);\n\t\tprintUsage();\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\n\tconst orm = detectOrm();\n\tif (!orm) {\n\t\tconsole.error(\"\\x1b[31mCould not detect ORM.\\x1b[0m\");\n\t\tconsole.error(\"Supported: Prisma, Drizzle, TypeORM\");\n\t\tconsole.error(\"Make sure you have one installed in package.json.\");\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\n\tconsole.log(`\\x1b[36mDetected ORM: ${orm}\\x1b[0m`);\n\n\tconst subArgs = args.slice(1);\n\tswitch (orm) {\n\t\tcase \"prisma\":\n\t\t\tprismaCommand(subcommand, subArgs);\n\t\t\tbreak;\n\t\tcase \"drizzle\":\n\t\t\tdrizzleCommand(subcommand, subArgs);\n\t\t\tbreak;\n\t\tcase \"typeorm\":\n\t\t\ttypeormCommand(subcommand, subArgs);\n\t\t\tbreak;\n\t}\n}\n","import { existsSync, readFileSync, writeFileSync, mkdirSync } from \"node:fs\";\nimport { join, dirname } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { execSync } from \"node:child_process\";\nimport { createInterface } from \"node:readline\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\nfunction askQuestion(question: string): Promise<boolean> {\n\treturn new Promise((resolve) => {\n\t\tconst rl = createInterface({\n\t\t\tinput: process.stdin,\n\t\t\toutput: process.stdout,\n\t\t});\n\n\t\trl.question(question, (answer) => {\n\t\t\trl.close();\n\t\t\tconst normalized = answer.trim().toLowerCase();\n\t\t\tresolve(normalized === \"y\" || normalized === \"yes\" || normalized === \"\");\n\t\t});\n\t});\n}\n\nconst REQUIRED_SCRIPTS: Record<string, string> = {\n\tdev: \"bun --watch src/index.ts\",\n\tbuild: \"bunx buntok build\",\n\tstart: \"bun .buntok/index.js\",\n\tcheck: \"bunx @biomejs/biome check --write .\",\n\tformat: \"bunx @biomejs/biome format --write .\",\n\tlint: \"bunx @biomejs/biome lint .\",\n};\n\nconst BIOME_CONFIG = {\n\tvcs: {\n\t\tenabled: true,\n\t\tclientKind: \"git\",\n\t\tuseIgnoreFile: true,\n\t},\n\tfiles: {\n\t\tignoreUnknown: true,\n\t\tincludes: [\"**\", \"!**/node_modules\", \"!**/dist\", \"!**/.buntok\", \"!**/coverage\"],\n\t},\n\tformatter: {\n\t\tenabled: true,\n\t\tindentStyle: \"tab\",\n\t\tindentWidth: 2,\n\t\tlineWidth: 100,\n\t\tlineEnding: \"lf\",\n\t},\n\tlinter: {\n\t\tenabled: true,\n\t\trules: {\n\t\t\tpreset: \"recommended\",\n\t\t\tsuspicious: {\n\t\t\t\tnoExplicitAny: \"off\",\n\t\t\t},\n\t\t},\n\t},\n\tjavascript: {\n\t\tformatter: {\n\t\t\tquoteStyle: \"double\",\n\t\t\ttrailingCommas: \"all\",\n\t\t},\n\t},\n};\n\n\nconst TSCONFIG_TEMPLATE = {\n\tcompilerOptions: {\n\t\t// Environment setup & latest features\n\t\tlib: [\"ESNext\"],\n\t\ttarget: \"ESNext\",\n\t\tmodule: \"Preserve\",\n\t\tmoduleDetection: \"force\",\n\t\tjsx: \"react-jsx\",\n\t\tallowJs: true,\n\t\ttypes: [\"bun\", \"node\"],\n\n\t\t// Bundler mode\n\t\tmoduleResolution: \"bundler\",\n\t\tallowImportingTsExtensions: true,\n\t\tverbatimModuleSyntax: true,\n\t\tnoEmit: true,\n\n\t\t// Strictness Options for TS 7+\n\t\tstrict: true,\n\t\tnoUncheckedIndexedAccess: true,\n\t\texactOptionalPropertyTypes: true,\n\t\tnoImplicitOverride: true,\n\t\tnoFallthroughCasesInSwitch: true,\n\t\tisolatedModules: true,\n\t\tskipLibCheck: true,\n\n\t\t// Path alias\n\t\tpaths: {\n\t\t\t\"@/*\": [\"./src/*\"],\n\t\t},\n\t},\n\tinclude: [\"src/**/*\"],\n\texclude: [\"node_modules\", \".buntok\"],\n};\n\nconst VSCODE_SETTINGS = {\n\t\"editor.formatOnSave\": true,\n\t\"editor.defaultFormatter\": \"biomejs.biome\",\n\t\"editor.codeActionsOnSave\": {\n\t\t\"source.fixAll.biome\": \"explicit\",\n\t\t\"source.organizeImports.biome\": \"explicit\",\n\t},\n};\n\nconst INDEX_TEMPLATE = `import { App } from \"@buntok/core\";\nimport { env } from \"./env\";\n\nexport const app = new App();\n\napp.get(\"/\", (ctx) => {\n  return ctx.json({ message: \"Hello from Buntok!\" });\n});\n\napp.listen(env.PORT);\n`;\n\nconst ENV_TS_TEMPLATE = `import { App, z } from \"@buntok/core\";\n\nexport const env = App.validateEnv({\n\tPORT: z.coerce.number().default(1212),\n\tAUTH_STORE: z.enum([\"header\", \"cookie\"]).default(\"header\"),\n\tAUTH_COOKIE: z.string().default(\"session\"),\n\tNODE_ENV: z.enum([\"development\", \"production\", \"test\"]).default(\"development\"),\n});\n`;\n\nfunction findSkillMdSource(): string | null {\n\t// 1. Relative path (works when running from @buntok/core package)\n\tconst relativePath = join(\n\t\t__dirname,\n\t\t\"..\",\n\t\t\"..\",\n\t\t\"scripts\",\n\t\t\"buntok-skill\",\n\t\t\"SKILL.md\",\n\t);\n\tif (existsSync(relativePath)) return relativePath;\n\n\t// 2. Resolve from @buntok/core package (works when running from buntok CLI)\n\ttry {\n\t\t// biome-ignore lint: dynamic import for package resolution\n\t\tconst pkgJson = require.resolve(\"@buntok/core/package.json\");\n\t\tconst pkgDir = dirname(pkgJson);\n\t\tconst skillPath = join(pkgDir, \"scripts\", \"buntok-skill\", \"SKILL.md\");\n\t\tif (existsSync(skillPath)) return skillPath;\n\t} catch {\n\t\t// package not found\n\t}\n\n\treturn null;\n}\n\nfunction copySkillMd(projectRoot: string): boolean {\n\tconst sourceSkill = findSkillMdSource();\n\n\tif (!sourceSkill) {\n\t\tconsole.warn(\n\t\t\t\"\\x1b[33m⚠ SKILL.md not found in @buntok/core, skipping.\\x1b[0m\",\n\t\t);\n\t\treturn false;\n\t}\n\n\tconst skillDir = join(projectRoot, \".agents\", \"skills\", \"buntok-skill\");\n\tconst destSkill = join(skillDir, \"SKILL.md\");\n\n\tif (!existsSync(skillDir)) {\n\t\tmkdirSync(skillDir, { recursive: true });\n\t}\n\n\twriteFileSync(destSkill, readFileSync(sourceSkill, \"utf-8\"), \"utf-8\");\n\tconsole.log(`\\x1b[32m✓ Created\\x1b[0m .agents/skills/buntok-skill/SKILL.md`);\n\treturn true;\n}\n\nfunction updatePackageJson(projectRoot: string): boolean {\n\tconst pkgPath = join(projectRoot, \"package.json\");\n\n\tlet pkg: { name?: string; scripts?: Record<string, string>; devDependencies?: Record<string, string> };\n\tif (existsSync(pkgPath)) {\n\t\tpkg = JSON.parse(readFileSync(pkgPath, \"utf-8\"));\n\t} else {\n\t\tconst folderName = projectRoot.split(\"/\").pop() || \"my-app\";\n\t\tpkg = { name: folderName, scripts: {}, devDependencies: {} };\n\t}\n\n\tif (!pkg.scripts) pkg.scripts = {};\n\n\tlet added = 0;\n\tfor (const [key, value] of Object.entries(REQUIRED_SCRIPTS)) {\n\t\tif (!pkg.scripts[key]) {\n\t\t\tpkg.scripts[key] = value;\n\t\t\tadded++;\n\t\t}\n\t}\n\n\tif (added === 0) {\n\t\tconsole.log(\"\\x1b[90m• package.json: all scripts already present\\x1b[0m\");\n\t\treturn false;\n\t}\n\n\twriteFileSync(pkgPath, JSON.stringify(pkg, null, 2) + \"\\n\", \"utf-8\");\n\tconsole.log(`\\x1b[32m✓ Updated\\x1b[0m package.json (added ${added} scripts)`);\n\treturn true;\n}\n\nfunction stripJsonComments(text: string): string {\n\t// Remove single-line comments (// ...) but not inside strings\n\treturn text.replace(/(?<![\"':].*)\\/\\/.*$/gm, \"\");\n}\n\nfunction setupTsconfig(projectRoot: string): boolean {\n\tconst tsconfigPath = join(projectRoot, \"tsconfig.json\");\n\n\tif (existsSync(tsconfigPath)) {\n\t\t// Merge paths into existing tsconfig\n\t\tconst raw = readFileSync(tsconfigPath, \"utf-8\");\n\t\tconst existing = JSON.parse(stripJsonComments(raw));\n\t\tif (!existing.compilerOptions) existing.compilerOptions = {};\n\t\tif (!existing.compilerOptions.paths) {\n\t\t\texisting.compilerOptions.paths = { \"@/*\": [\"./src/*\"] };\n\t\t\twriteFileSync(tsconfigPath, JSON.stringify(existing, null, 2) + \"\\n\", \"utf-8\");\n\t\t\tconsole.log(\"\\x1b[32m✓ Updated\\x1b[0m tsconfig.json (added path alias)\");\n\t\t\treturn true;\n\t\t}\n\t\tif (!existing.compilerOptions.paths[\"@/*\"]) {\n\t\t\texisting.compilerOptions.paths[\"@/*\"] = [\"./src/*\"];\n\t\t\twriteFileSync(tsconfigPath, JSON.stringify(existing, null, 2) + \"\\n\", \"utf-8\");\n\t\t\tconsole.log(\"\\x1b[32m✓ Updated\\x1b[0m tsconfig.json (added path alias)\");\n\t\t\treturn true;\n\t\t}\n\t\tconsole.log(\"\\x1b[90m• tsconfig.json: path alias already present\\x1b[0m\");\n\t\treturn false;\n\t}\n\n\t// Create new tsconfig\n\twriteFileSync(tsconfigPath, JSON.stringify(TSCONFIG_TEMPLATE, null, 2) + \"\\n\", \"utf-8\");\n\tconsole.log(\"\\x1b[32m✓ Created\\x1b[0m tsconfig.json\");\n\treturn true;\n}\n\nfunction setupBiome(projectRoot: string): boolean {\n\tconst biomePath = join(projectRoot, \"biome.json\");\n\n\tif (existsSync(biomePath)) {\n\t\tconsole.log(\"\\x1b[90m• biome.json: already exists, skipping\\x1b[0m\");\n\t\treturn false;\n\t}\n\n\t// Check if @biomejs/biome is installed\n\tconst pkgPath = join(projectRoot, \"package.json\");\n\tlet needsInstall = false;\n\tif (existsSync(pkgPath)) {\n\t\tconst pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\"));\n\t\tconst allDeps = {\n\t\t\t...pkg.dependencies,\n\t\t\t...pkg.devDependencies,\n\t\t};\n\t\tneedsInstall = !allDeps[\"@biomejs/biome\"];\n\t}\n\n\tif (needsInstall) {\n\t\tconsole.log(\"\\x1b[90m• Installing @biomejs/biome...\\x1b[0m\");\n\t\ttry {\n\t\t\texecSync(\"bun add -d @biomejs/biome\", {\n\t\t\t\tcwd: projectRoot,\n\t\t\t\tstdio: \"ignore\",\n\t\t\t});\n\t\t\tconsole.log(\"\\x1b[32m✓ Installed\\x1b[0m @biomejs/biome\");\n\t\t} catch {\n\t\t\tconsole.warn(\n\t\t\t\t\"\\x1b[33m⚠ Failed to install @biomejs/biome, please install manually\\x1b[0m\",\n\t\t\t);\n\t\t}\n\t}\n\n\twriteFileSync(biomePath, JSON.stringify(BIOME_CONFIG, null, 2) + \"\\n\", \"utf-8\");\n\tconsole.log(\"\\x1b[32m✓ Created\\x1b[0m biome.json\");\n\treturn true;\n}\n\nfunction createIndexFile(projectRoot: string): boolean {\n\tconst srcDir = join(projectRoot, \"src\");\n\tconst indexPath = join(srcDir, \"index.ts\");\n\n\tif (existsSync(indexPath)) {\n\t\tconsole.log(\"\\x1b[90m• src/index.ts: already exists, skipping\\x1b[0m\");\n\t\treturn false;\n\t}\n\n\tif (!existsSync(srcDir)) {\n\t\tmkdirSync(srcDir, { recursive: true });\n\t}\n\n\twriteFileSync(indexPath, INDEX_TEMPLATE, \"utf-8\");\n\tconsole.log(\"\\x1b[32m✓ Created\\x1b[0m src/index.ts\");\n\treturn true;\n}\n\nfunction createEnvTsFile(projectRoot: string): boolean {\n\tconst srcDir = join(projectRoot, \"src\");\n\tconst envTsPath = join(srcDir, \"env.ts\");\n\n\tif (existsSync(envTsPath)) {\n\t\tconsole.log(\"\\x1b[90m• src/env.ts: already exists, skipping\\x1b[0m\");\n\t\treturn false;\n\t}\n\n\tif (!existsSync(srcDir)) {\n\t\tmkdirSync(srcDir, { recursive: true });\n\t}\n\n\twriteFileSync(envTsPath, ENV_TS_TEMPLATE, \"utf-8\");\n\tconsole.log(\"\\x1b[32m✓ Created\\x1b[0m src/env.ts\");\n\treturn true;\n}\n\nfunction setupVscode(projectRoot: string): boolean {\n\tconst vscodeDir = join(projectRoot, \".vscode\");\n\tconst settingsPath = join(vscodeDir, \"settings.json\");\n\n\tif (existsSync(settingsPath)) {\n\t\tconsole.log(\"\\x1b[90m• .vscode/settings.json: already exists, skipping\\x1b[0m\");\n\t\treturn false;\n\t}\n\n\tif (!existsSync(vscodeDir)) {\n\t\tmkdirSync(vscodeDir, { recursive: true });\n\t}\n\n\twriteFileSync(settingsPath, JSON.stringify(VSCODE_SETTINGS, null, 2) + \"\\n\", \"utf-8\");\n\tconsole.log(\"\\x1b[32m✓ Created\\x1b[0m .vscode/settings.json\");\n\treturn true;\n}\n\nconst ENV_CONTENT = `# Buntok Configuration\nPORT=1212\nAUTH_STORE=header\nAUTH_COOKIE=session\n`;\n\nconst ENV_EXAMPLE_CONTENT = `# Buntok Configuration\n#\n# PORT: port is using for the app\n# AUTH_STORE: Where to store/read JWT tokens\n#   - \"header\" (default): Read from Authorization: Bearer <token> header\n#   - \"cookie\": Read from HttpOnly cookie (set AUTH_COOKIE for cookie name)\n#\n# AUTH_COOKIE: Cookie name for JWT storage (only used when AUTH_STORE=cookie)\n#\nPORT=1212\nAUTH_STORE=header\nAUTH_COOKIE=session\n`;\n\nconst VERCEL_JSON_TEMPLATE = {\n\tbuilds: [\n\t\t{\n\t\t\tsrc: \"src/index.ts\",\n\t\t\tuse: \"@vercel/rest\",\n\t\t},\n\t],\n\troutes: [\n\t\t{\n\t\t\tsrc: \"/(.*)\",\n\t\t\tdest: \"src/index.ts\",\n\t\t},\n\t],\n};\n\nconst GITIGNORE_CONTENT = `# Dependencies\nnode_modules/\n\n# Build output\n.buntok/\n\n# Environment\n.env\n.env.local\n.env.*.local\n\n# IDE\n.vscode/\n.idea/\n*.swp\n*.swo\n*~\n\n# OS\n.DS_Store\nThumbs.db\n\n# Buntok\n.buntok/\n\n# Logs\n*.log\nnpm-debug.log*\n\n# Coverage\ncoverage/\n`;\n\nfunction createEnvFiles(projectRoot: string): boolean {\n\tconst envPath = join(projectRoot, \".env\");\n\tconst envExamplePath = join(projectRoot, \".env.example\");\n\tlet created = false;\n\n\tif (!existsSync(envPath)) {\n\t\twriteFileSync(envPath, ENV_CONTENT, \"utf-8\");\n\t\tconsole.log(\"\\x1b[32m✓ Created\\x1b[0m .env\");\n\t\tcreated = true;\n\t} else {\n\t\tconsole.log(\"\\x1b[90m• .env: already exists, skipping\\x1b[0m\");\n\t}\n\n\tif (!existsSync(envExamplePath)) {\n\t\twriteFileSync(envExamplePath, ENV_EXAMPLE_CONTENT, \"utf-8\");\n\t\tconsole.log(\"\\x1b[32m✓ Created\\x1b[0m .env.example\");\n\t\tcreated = true;\n\t} else {\n\t\tconsole.log(\"\\x1b[90m• .env.example: already exists, skipping\\x1b[0m\");\n\t}\n\n\treturn created;\n}\n\nfunction createGitignore(projectRoot: string): boolean {\n\tconst gitignorePath = join(projectRoot, \".gitignore\");\n\n\tif (existsSync(gitignorePath)) {\n\t\tconsole.log(\"\\x1b[90m• .gitignore: already exists, skipping\\x1b[0m\");\n\t\treturn false;\n\t}\n\n\twriteFileSync(gitignorePath, GITIGNORE_CONTENT, \"utf-8\");\n\tconsole.log(\"\\x1b[32m✓ Created\\x1b[0m .gitignore\");\n\treturn true;\n}\n\nfunction createVercelJson(projectRoot: string): boolean {\n\tconst vercelPath = join(projectRoot, \"vercel.json\");\n\n\tif (existsSync(vercelPath)) {\n\t\tconsole.log(\"\\x1b[90m• vercel.json: already exists, skipping\\x1b[0m\");\n\t\treturn false;\n\t}\n\n\twriteFileSync(vercelPath, JSON.stringify(VERCEL_JSON_TEMPLATE, null, 2) + \"\\n\", \"utf-8\");\n\tconsole.log(\"\\x1b[32m✓ Created\\x1b[0m vercel.json\");\n\treturn true;\n}\n\nexport async function initCommand() {\n\tconst projectRoot = process.cwd();\n\n\tcopySkillMd(projectRoot);\n\tupdatePackageJson(projectRoot);\n\tsetupTsconfig(projectRoot);\n\tsetupBiome(projectRoot);\n\tsetupVscode(projectRoot);\n\tcreateEnvTsFile(projectRoot);\n\tcreateIndexFile(projectRoot);\n\tcreateEnvFiles(projectRoot);\n\tcreateGitignore(projectRoot);\n\n\tconst vercelPath = join(projectRoot, \"vercel.json\");\n\tif (!existsSync(vercelPath)) {\n\t\tconsole.log(\"\");\n\t\tconst useVercel = await askQuestion(\n\t\t\t\"\\x1b[36mDo you want to deploy to Vercel? (y/N): \\x1b[0m\",\n\t\t);\n\t\tif (useVercel) {\n\t\t\tcreateVercelJson(projectRoot);\n\t\t}\n\t} else {\n\t\tconsole.log(\"\\x1b[90m• vercel.json: already exists, skipping\\x1b[0m\");\n\t}\n}\n","import { mkdirSync, writeFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport {\n\textendZodWithOpenApi,\n\tOpenAPIRegistry,\n\tOpenApiGeneratorV3,\n} from \"@asteasolutions/zod-to-openapi\";\nimport { z } from \"zod\";\n\nextendZodWithOpenApi(z);\n\n/**\n * Recursively walk a Zod schema and replace any type that zod-to-openapi\n * cannot handle (e.g. ZodFile from Zod v4) with a safe fallback so that\n * docs generation never crashes on an unsupported schema node.\n */\n// biome-ignore lint/suspicious/noExplicitAny: schema introspection requires any\nfunction sanitizeSchema(schema: any): any {\n\tif (!schema || typeof schema !== \"object\" || !schema._def) return schema;\n\n\tconst typeName: string = schema._def?.typeName ?? schema._def?.type ?? \"\";\n\n\t// ZodFile (Zod v4) → OpenAPI string format:binary\n\tif (typeName === \"ZodFile\" || typeName === \"file\") {\n\t\treturn z.string().openapi({ format: \"binary\", description: \"Binary file\" });\n\t}\n\n\t// For all other types, return as-is — zod-to-openapi handles them\n\t// Only recurse into containers we know how to handle safely\n\tif (typeName === \"ZodObject\" || typeName === \"object\") {\n\t\tconst shape =\n\t\t\ttypeof schema._def.shape === \"function\"\n\t\t\t\t? schema._def.shape()\n\t\t\t\t: (schema._def.shape ?? {});\n\t\tconst newShape: Record<string, unknown> = {};\n\t\tfor (const [key, value] of Object.entries(shape)) {\n\t\t\tnewShape[key] = sanitizeSchema(value);\n\t\t}\n\t\treturn z.object(newShape as Record<string, z.ZodTypeAny>);\n\t}\n\n\tif (typeName === \"ZodArray\" || typeName === \"array\") {\n\t\tconst element = schema._def?.element ?? schema._def?.type;\n\t\treturn z.array(sanitizeSchema(element));\n\t}\n\n\tif (typeName === \"ZodOptional\" || typeName === \"optional\") {\n\t\treturn sanitizeSchema(schema._def.innerType).optional();\n\t}\n\tif (typeName === \"ZodNullable\" || typeName === \"nullable\") {\n\t\treturn sanitizeSchema(schema._def.innerType).nullable();\n\t}\n\n\t// Default: return original schema (don't reconstruct unknown types)\n\treturn schema;\n}\n\nexport async function makeDocsCommand() {\n\tconsole.log(\"\\x1b[36mGenerating OpenAPI documentation...\\x1b[0m\");\n\n\t// Prevent the user's app from starting its HTTP server during import\n\tprocess.env.BUNTOK_DOCS_BUILD = \"1\";\n\n\tconst entryPath = resolve(process.cwd(), \"src/index.ts\");\n\n\ttry {\n\t\tconsole.log(`\\x1b[90mLoading app from ${entryPath}...\\x1b[0m`);\n\n\t\tconst userApp = await import(pathToFileURL(entryPath).href);\n\t\tconst appInstance = userApp.app || userApp.default;\n\n\t\tif (!appInstance?.openApiDocs) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Could not find an exported 'app' instance in src/index.ts. Make sure you export your app: `export const app = new App();`\",\n\t\t\t);\n\t\t}\n\n\t\tconst docsConfig = appInstance._apiDocsConfig;\n\t\tconst registry = new OpenAPIRegistry();\n\n\t\tlet skipped = 0;\n\n\t\tfor (const doc of appInstance.openApiDocs) {\n\t\t\t// Convert express-style params /users/:id → OpenAPI /users/{id}\n\t\t\tconst openapiPath = doc.path.replace(/:([a-zA-Z0-9_]+)/g, \"{$1}\");\n\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: RouteConfig populated dynamically\n\t\t\tconst routeConfig: any = {\n\t\t\t\tmethod: doc.method,\n\t\t\t\tpath: openapiPath,\n\t\t\t\tresponses: {},\n\t\t\t};\n\n\t\t\tif (doc.request.params || doc.request.query || doc.request.body) {\n\t\t\t\trouteConfig.request = {};\n\t\t\t\tif (doc.request.params)\n\t\t\t\t\trouteConfig.request.params = sanitizeSchema(doc.request.params);\n\t\t\t\tif (doc.request.query)\n\t\t\t\t\trouteConfig.request.query = sanitizeSchema(doc.request.query);\n\t\t\t\tif (doc.request.body) {\n\t\t\t\t\tconst contentType = doc.request.bodyContentType || \"application/json\";\n\t\t\t\t\trouteConfig.request.body = {\n\t\t\t\t\t\tcontent: {\n\t\t\t\t\t\t\t[contentType]: { schema: sanitizeSchema(doc.request.body) },\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (doc.responses.length > 0) {\n\t\t\t\tfor (const res of doc.responses) {\n\t\t\t\t\trouteConfig.responses[res.status.toString()] = {\n\t\t\t\t\t\tdescription: res.description,\n\t\t\t\t\t\tcontent: {\n\t\t\t\t\t\t\t\"application/json\": { schema: sanitizeSchema(res.schema) },\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\trouteConfig.responses[\"200\"] = { description: \"Success\" };\n\t\t\t}\n\n\t\t\t// Per-route error handling: one bad schema should not abort everything\n\t\t\ttry {\n\t\t\t\tregistry.registerPath(routeConfig);\n\t\t\t} catch (err) {\n\t\t\t\tskipped++;\n\t\t\t\tconst label = `${doc.method.toUpperCase()} ${doc.path}`;\n\t\t\t\tif (err instanceof Error) {\n\t\t\t\t\tconsole.warn(`\\x1b[33m  ⚠ Skipping ${label}: ${err.message}\\x1b[0m`);\n\t\t\t\t} else {\n\t\t\t\t\tconsole.warn(`\\x1b[33m  ⚠ Skipping ${label}: unknown error\\x1b[0m`);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst generator = new OpenApiGeneratorV3(registry.definitions);\n\t\tconst document = generator.generateDocument({\n\t\t\topenapi: \"3.0.0\",\n\t\t\tinfo: {\n\t\t\t\tversion: docsConfig?.version ?? \"1.0.0\",\n\t\t\t\ttitle: docsConfig?.title ?? \"Buntok API Documentation\",\n\t\t\t\tdescription: docsConfig?.description ?? \"Auto-generated OpenAPI docs from Zod schemas\",\n\t\t\t},\n\t\t});\n\n\t\t// Output directory: public/docs/\n\t\tconst docsDir = resolve(process.cwd(), \"public/docs\");\n\t\tmkdirSync(docsDir, { recursive: true });\n\n\t\tconst swaggerPath = resolve(docsDir, \"swagger.json\");\n\t\twriteFileSync(swaggerPath, JSON.stringify(document, null, 2));\n\t\tconsole.log(\n\t\t\t`\\x1b[32m✔ swagger.json generated at public/docs/swagger.json\\x1b[0m`,\n\t\t);\n\n\t\tconsole.log(`\\n\\x1b[36mNext steps:\\x1b[0m`);\n\t\tconsole.log(\n\t\t\t`\\x1b[90m  Add app.apiDocs() to your src/index.ts:\\x1b[0m`,\n\t\t);\n\t\tconsole.log(\n\t\t\t`\\x1b[90m    app.apiDocs({ path: \"/docs\", title: \"My API\" });\\x1b[0m`,\n\t\t);\n\t\tconsole.log();\n\t\tprocess.exit(0);\n\t} catch (error) {\n\t\tconsole.error(\"\\x1b[31mFailed to generate docs:\\x1b[0m\");\n\t\tconsole.error(error);\n\t\tprocess.exit(1);\n\t}\n}\n"],"mappings":"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","names":["import_node_fs","import_node_path","fs","import_node_fs","import_node_fs","import_node_path","import_node_child_process","__filename","resolve","import_node_fs","import_node_path","import_node_url","document","printUsage"]}