@sohan_fahad/wilt 0.1.2

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 (97) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +250 -0
  3. package/bin/commands/add.ts +155 -0
  4. package/bin/commands/generate.ts +74 -0
  5. package/bin/commands/new.ts +457 -0
  6. package/bin/create-wilt-app.ts +3 -0
  7. package/bin/generators/module.generator.ts +266 -0
  8. package/bin/utils/config.ts +46 -0
  9. package/bin/utils/paths.ts +32 -0
  10. package/bin/utils/wrangler.ts +216 -0
  11. package/bin/wilt.ts +79 -0
  12. package/dist/lib/bin/create-wilt-app.js +413 -0
  13. package/dist/lib/bin/create-wilt-app.js.map +1 -0
  14. package/dist/lib/bin/wilt.js +1151 -0
  15. package/dist/lib/bin/wilt.js.map +1 -0
  16. package/dist/lib/chunk-EUXUH3YW.js +15 -0
  17. package/dist/lib/chunk-EUXUH3YW.js.map +1 -0
  18. package/dist/lib/chunk-FIEODUMV.js +234 -0
  19. package/dist/lib/chunk-FIEODUMV.js.map +1 -0
  20. package/dist/lib/chunk-MOVXD653.cjs +234 -0
  21. package/dist/lib/chunk-MOVXD653.cjs.map +1 -0
  22. package/dist/lib/chunk-ZBDE64SD.cjs +15 -0
  23. package/dist/lib/chunk-ZBDE64SD.cjs.map +1 -0
  24. package/dist/lib/config.cjs +10 -0
  25. package/dist/lib/config.cjs.map +1 -0
  26. package/dist/lib/config.d.cts +13 -0
  27. package/dist/lib/config.d.ts +13 -0
  28. package/dist/lib/config.js +10 -0
  29. package/dist/lib/config.js.map +1 -0
  30. package/dist/lib/index.cjs +974 -0
  31. package/dist/lib/index.cjs.map +1 -0
  32. package/dist/lib/index.d.cts +255 -0
  33. package/dist/lib/index.d.ts +255 -0
  34. package/dist/lib/index.js +974 -0
  35. package/dist/lib/index.js.map +1 -0
  36. package/dist/lib/middleware/index.cjs +10 -0
  37. package/dist/lib/middleware/index.cjs.map +1 -0
  38. package/dist/lib/middleware/index.d.cts +18 -0
  39. package/dist/lib/middleware/index.d.ts +18 -0
  40. package/dist/lib/middleware/index.js +10 -0
  41. package/dist/lib/middleware/index.js.map +1 -0
  42. package/package.json +78 -0
  43. package/src/wilt/README.md +285 -0
  44. package/src/wilt/config.ts +14 -0
  45. package/src/wilt/context/execution-context.ts +36 -0
  46. package/src/wilt/context/index.ts +1 -0
  47. package/src/wilt/decorators/core/exception-filters.decorator.ts +24 -0
  48. package/src/wilt/decorators/core/index.ts +6 -0
  49. package/src/wilt/decorators/core/injectable.decorator.ts +41 -0
  50. package/src/wilt/decorators/core/optional.decorator.ts +9 -0
  51. package/src/wilt/decorators/core/set-metadata.decorator.ts +20 -0
  52. package/src/wilt/decorators/core/use-guards.decorator.ts +14 -0
  53. package/src/wilt/decorators/core/use-interceptors.decorator.ts +16 -0
  54. package/src/wilt/decorators/http/controller.decorator.ts +230 -0
  55. package/src/wilt/decorators/http/header.decorator.ts +11 -0
  56. package/src/wilt/decorators/http/http-code.decorator.ts +8 -0
  57. package/src/wilt/decorators/http/index.ts +6 -0
  58. package/src/wilt/decorators/http/redirect.decorator.ts +13 -0
  59. package/src/wilt/decorators/http/route-mapping.decorator.ts +22 -0
  60. package/src/wilt/decorators/http/route-params.decorator.ts +60 -0
  61. package/src/wilt/decorators/index.ts +3 -0
  62. package/src/wilt/decorators/modules/global.decorator.ts +8 -0
  63. package/src/wilt/decorators/modules/index.ts +2 -0
  64. package/src/wilt/decorators/modules/module.decorator.ts +16 -0
  65. package/src/wilt/exceptions/http-exception.ts +17 -0
  66. package/src/wilt/exceptions/http-exceptions.ts +85 -0
  67. package/src/wilt/exceptions/index.ts +2 -0
  68. package/src/wilt/index.ts +11 -0
  69. package/src/wilt/injector/index.ts +1 -0
  70. package/src/wilt/injector/injector.ts +103 -0
  71. package/src/wilt/injector/module-compiler.ts +48 -0
  72. package/src/wilt/injector/module.factory.ts +74 -0
  73. package/src/wilt/interfaces/core/filter.interface.ts +5 -0
  74. package/src/wilt/interfaces/core/guard.interface.ts +5 -0
  75. package/src/wilt/interfaces/core/index.ts +5 -0
  76. package/src/wilt/interfaces/core/interceptor.interface.ts +9 -0
  77. package/src/wilt/interfaces/core/lifecycle.interface.ts +19 -0
  78. package/src/wilt/interfaces/core/pipe.interface.ts +9 -0
  79. package/src/wilt/interfaces/http/index.ts +1 -0
  80. package/src/wilt/interfaces/http/response.interface.ts +27 -0
  81. package/src/wilt/interfaces/index.ts +3 -0
  82. package/src/wilt/interfaces/modules/index.ts +1 -0
  83. package/src/wilt/interfaces/modules/module.interface.ts +17 -0
  84. package/src/wilt/middleware/error-handler.middleware.ts +63 -0
  85. package/src/wilt/middleware/index.ts +2 -0
  86. package/src/wilt/middleware/request-logger.middleware.ts +17 -0
  87. package/src/wilt/pipes/index.ts +3 -0
  88. package/src/wilt/pipes/validate.pipe.ts +79 -0
  89. package/src/wilt/pipes/zod-query.pipe.ts +42 -0
  90. package/src/wilt/pipes/zod-validate.pipe.ts +49 -0
  91. package/src/wilt/services/index.ts +1 -0
  92. package/src/wilt/services/reflector.service.ts +24 -0
  93. package/src/wilt/utils/apply-decorators.util.ts +17 -0
  94. package/src/wilt/utils/forward-ref.util.ts +14 -0
  95. package/src/wilt/utils/index.ts +22 -0
  96. package/src/wilt/utils/logger.util.ts +189 -0
  97. package/src/wilt/utils/response.util.ts +72 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../bin/commands/new.ts","../../../bin/generators/module.generator.ts","../../../bin/utils/paths.ts","../../../bin/utils/config.ts","../../../bin/commands/generate.ts","../../../bin/utils/wrangler.ts","../../../bin/commands/add.ts","../../../bin/wilt.ts"],"sourcesContent":["import { mkdirSync, writeFileSync, existsSync } from \"node:fs\";\nimport { join, resolve } from \"node:path\";\nimport { execSync } from \"node:child_process\";\n\nfunction pascal(name: string) {\n return name\n .replace(/[-_](.)/g, (_, c) => c.toUpperCase())\n .replace(/^(.)/, (_, c) => c.toUpperCase());\n}\n\nfunction kebab(name: string) {\n return name\n .replace(/([A-Z])/g, \"-$1\")\n .replace(/^-/, \"\")\n .replace(/_/g, \"-\")\n .toLowerCase();\n}\n\n// ─── File templates ───────────────────────────────────────────────────────────\n\nfunction packageJsonTemplate(name: string) {\n return JSON.stringify(\n {\n name: kebab(name),\n version: \"0.0.1\",\n private: true,\n type: \"module\",\n scripts: {\n dev: \"vite dev --host --port 4001\",\n \"dev:cf\": \"wrangler dev --port 4001\",\n build: \"vite build\",\n deploy: \"vite build && wrangler deploy\",\n \"cf-typegen\": \"wrangler types --env-interface CloudflareBindings\",\n test: \"vitest --run\",\n \"test:watch\": \"vitest --watch\",\n \"db:gen\": \"drizzle-kit generate\",\n \"db:migrate\": \"wrangler d1 migrations apply DB --local\",\n \"db:migrate:remote\": \"wrangler d1 migrations apply DB --remote\",\n check: \"tsc --noEmit\",\n wilt: \"wilt\",\n },\n dependencies: {\n hono: \"^4.12.0\",\n wilt: \"^0.1.0\",\n \"reflect-metadata\": \"^0.2.2\",\n tsyringe: \"^4.10.0\",\n zod: \"^4.0.0\",\n \"drizzle-orm\": \"^0.45.0\",\n ulid: \"^3.0.0\",\n },\n devDependencies: {\n \"@cloudflare/vite-plugin\": \"^1.36.0\",\n \"@cloudflare/workers-types\": \"^4.0.0\",\n \"@cloudflare/vitest-pool-workers\": \"^0.16.0\",\n \"@sohan_fahad/wilt\": \"^0.1.0\",\n \"@types/node\": \"^22.0.0\",\n \"drizzle-kit\": \"^0.31.0\",\n typescript: \"^5.0.0\",\n vite: \"^6.0.0\",\n vitest: \"^4.1.0\",\n tsx: \"^4.0.0\",\n wrangler: \"^4.0.0\",\n },\n },\n null,\n 2\n );\n}\n\nfunction wranglerTemplate(name: string) {\n return `{\n \"$schema\": \"node_modules/wrangler/config-schema.json\",\n \"name\": \"${kebab(name)}\",\n \"main\": \"./src/index.ts\",\n \"compatibility_date\": \"2025-06-17\",\n \"compatibility_flags\": [\"nodejs_compat\"],\n \"vars\": {\n \"MODE\": \"development\"\n },\n \"observability\": { \"enabled\": true },\n \"d1_databases\": [\n {\n \"binding\": \"DB\",\n \"database_name\": \"REPLACE_WITH_YOUR_D1_NAME\",\n \"database_id\": \"00000000-0000-0000-0000-000000000001\",\n \"migrations_dir\": \"migrations\",\n \"preview_database_id\": \"00000000-0000-0000-0000-000000000002\"\n }\n ],\n \"dev\": { \"port\": 4001 }\n}\n`;\n}\n\nfunction tsconfigTemplate() {\n return `{\n \"compilerOptions\": {\n \"target\": \"ESNext\",\n \"module\": \"ESNext\",\n \"moduleResolution\": \"Bundler\",\n \"strict\": true,\n \"skipLibCheck\": true,\n \"experimentalDecorators\": true,\n \"emitDecoratorMetadata\": true,\n \"lib\": [\"ESNext\", \"DOM\"],\n \"types\": [\"vite/client\", \"@cloudflare/workers-types\"],\n \"baseUrl\": \".\",\n \"paths\": {\n \"@app/*\": [\"src/*\"]\n }\n },\n \"include\": [\"src/**/*\", \"worker-configuration.d.ts\"],\n \"exclude\": [\"node_modules\", \"dist\"]\n}\n`;\n}\n\nfunction viteConfigTemplate() {\n return `import { defineConfig } from \"vite\";\nimport { cloudflare } from \"@cloudflare/vite-plugin\";\nimport { fileURLToPath, URL } from \"node:url\";\n\nexport default defineConfig({\n plugins: [cloudflare()],\n resolve: {\n alias: {\n \"@app\": fileURLToPath(new URL(\"./src\", import.meta.url)),\n },\n },\n});\n`;\n}\n\nfunction workerTypesTemplate() {\n return `// Generated by \\`pnpm cf-typegen\\`. Do not edit manually.\n/// <reference types=\"@cloudflare/vitest-pool-workers/types\" />\ninterface CloudflareBindings {\n DB: D1Database;\n MODE: string;\n}\n\ndeclare namespace Cloudflare {\n interface Env extends CloudflareBindings {\n TEST_MIGRATIONS: string;\n }\n}\n`;\n}\n\nfunction vitestConfigTemplate() {\n return `import path from \"path\";\nimport { defineConfig } from \"vitest/config\";\nimport { cloudflarePool, cloudflareTest, readD1Migrations } from \"@cloudflare/vitest-pool-workers\";\n\nexport default defineConfig(async () => {\n const migrations = await readD1Migrations(\"./migrations\");\n const poolOptions = {\n wrangler: { configPath: \"./wrangler.jsonc\" },\n miniflare: {\n bindings: { TEST_MIGRATIONS: JSON.stringify(migrations) },\n },\n };\n return {\n plugins: [cloudflareTest(poolOptions)],\n resolve: {\n alias: { \"@app\": path.resolve(\"./src\") },\n },\n test: {\n pool: cloudflarePool(poolOptions),\n },\n };\n});\n`;\n}\n\nfunction indexTemplate() {\n return `import \"reflect-metadata\";\nimport { app } from \"./app.module\";\n\nexport default {\n async fetch(request: Request, env: CloudflareBindings, ctx: ExecutionContext): Promise<Response> {\n return app.fetch(request, env, ctx);\n },\n};\n`;\n}\n\nfunction appModuleTemplate(name: string) {\n const p = pascal(name);\n return `import { cors } from \"hono/cors\";\nimport { secureHeaders } from \"hono/secure-headers\";\n\nimport { Module, createModule } from \"wilt\";\nimport { requestLogger } from \"wilt/middleware\";\nimport { HelloModule } from \"./modules/app/hello/hello.module\";\n\n@Module({\n imports: [HelloModule],\n})\nexport class AppModule {}\n\nconst app = createModule(AppModule, {\n middlewares: [cors(), secureHeaders(), requestLogger],\n});\n\napp.get(\"/\", (c) => c.json({ success: true, status: \"healthy\", timestamp: new Date().toISOString() }));\napp.get(\"/health\", (c) => c.json({ success: true, status: \"healthy\", timestamp: new Date().toISOString() }));\n\nexport { app };\n`;\n}\n\nfunction helloModuleTemplate() {\n return `import { Module } from \"wilt\";\nimport { HelloController } from \"./hello.controller\";\nimport { HelloService } from \"./hello.service\";\n\n@Module({\n controllers: [HelloController],\n providers: [HelloService],\n})\nexport class HelloModule {}\n`;\n}\n\nfunction helloControllerTemplate() {\n return `import type { Context } from \"hono\";\nimport { Controller, Get, Inject } from \"wilt\";\nimport { ResponseUtil } from \"wilt\";\nimport { HelloService } from \"./hello.service\";\n\n@Controller(\"/hello\")\nexport class HelloController {\n constructor(@Inject(HelloService) private helloService: HelloService) {}\n\n @Get()\n async greet(c: Context) {\n const message = this.helloService.greet();\n return ResponseUtil.success(c, { message });\n }\n}\n`;\n}\n\nfunction helloServiceTemplate() {\n return `import { Injectable } from \"wilt\";\n\n@Injectable()\nexport class HelloService {\n greet() {\n return \"Hello from Wilt!\";\n }\n}\n`;\n}\n\nfunction dbSchemaTemplate() {\n return `// Register all your entity tables here so Drizzle can build relations and\n// drizzle-kit can generate migrations from a single source of truth.\nexport const schema = {};\n`;\n}\n\nfunction dbConnectionTemplate() {\n return `import { drizzle } from \"drizzle-orm/d1\";\nimport type { Context } from \"hono\";\nimport { schema } from \"./schema\";\nexport function getDb(c: Context) {\n return drizzle(c.env.DB, { schema: schema });\n}\n`;\n}\n\nfunction gitignoreTemplate() {\n return `dist/\nnode_modules/\n.wrangler\n.env\n.env.production\n.dev.vars\n.DS_Store\ncoverage/\n*.log\n`;\n}\n\n\nfunction wiltConfigTemplate() {\n return `import { defineConfig } from \"wilt/config\";\n\nexport default defineConfig({\n // Directory where generated modules are placed (relative to project root)\n modulesDir: \"src/modules/app\",\n\n // Default files scaffolded by \\`wilt generate module <name>\\`\n // Remove \"test\" to skip test files, or pass --no-test at the CLI\n generate: {\n files: [\"module\", \"controller\", \"service\", \"dto\", \"entity\", \"test\"],\n },\n});\n`;\n}\n\nfunction envExampleTemplate() {\n return `CLOUDFLARE_ACCOUNT_ID=\nCLOUDFLARE_TOKEN=\n\nCLOUDFLARE_DATABASE_ID=\n`;\n}\n\nfunction drizzleConfigTemplate() {\n return `import { defineConfig } from \"drizzle-kit\";\n\nexport default defineConfig({\n schema: \"./src/database/schema.ts\",\n out: \"./migrations\",\n dialect: \"sqlite\",\n driver: \"d1-http\",\n dbCredentials: {\n accountId: process.env.CLOUDFLARE_ACCOUNT_ID!,\n databaseId: process.env.CLOUDFLARE_DATABASE_ID!,\n token: process.env.CLOUDFLARE_TOKEN!,\n },\n verbose: true,\n strict: true,\n});\n`;\n}\n\nfunction migrationTemplate() {\n return `-- Initial migration\n-- Add your tables here\n`;\n}\n\nfunction migrationMetaTemplate(name: string) {\n return JSON.stringify(\n {\n version: \"5\",\n dialect: \"sqlite\",\n entries: [\n {\n idx: 0,\n version: \"5\",\n when: Date.now(),\n tag: \"0000_initial\",\n breakpoints: true,\n },\n ],\n },\n null,\n 2\n );\n}\n\n// ─── Scaffold ─────────────────────────────────────────────────────────────────\n\nfunction write(path: string, content: string) {\n writeFileSync(path, content, \"utf-8\");\n console.log(` ✔ ${path.replace(process.cwd() + \"/\", \"\")}`);\n}\n\nfunction dir(path: string) {\n mkdirSync(path, { recursive: true });\n}\n\nexport function runNew(args: string[]): void {\n const [name] = args;\n\n if (!name) {\n console.error(\" ✗ Usage: wilt new <project-name>\");\n process.exit(1);\n }\n\n const projectDir = resolve(process.cwd(), name);\n\n if (existsSync(projectDir)) {\n console.error(` ✗ Directory already exists: ${projectDir}`);\n process.exit(1);\n }\n\n console.log(`\\n Creating Wilt app \"${name}\"...\\n`);\n\n // Directories\n dir(join(projectDir, \"src/modules/app/hello\"));\n dir(join(projectDir, \"src/database\"));\n dir(join(projectDir, \"migrations/meta\"));\n\n // Config files\n write(join(projectDir, \"package.json\"), packageJsonTemplate(name));\n write(join(projectDir, \"wrangler.jsonc\"), wranglerTemplate(name));\n write(join(projectDir, \"tsconfig.json\"), tsconfigTemplate());\n write(join(projectDir, \"vite.config.ts\"), viteConfigTemplate());\n write(join(projectDir, \"vitest.config.ts\"), vitestConfigTemplate());\n write(join(projectDir, \"worker-configuration.d.ts\"), workerTypesTemplate());\n write(join(projectDir, \"wilt.config.ts\"), wiltConfigTemplate());\n write(join(projectDir, \".gitignore\"), gitignoreTemplate());\n write(join(projectDir, \".env.example\"), envExampleTemplate());\n write(join(projectDir, \"drizzle.config.ts\"), drizzleConfigTemplate());\n\n // App entry\n write(join(projectDir, \"src/index.ts\"), indexTemplate());\n write(join(projectDir, \"src/app.module.ts\"), appModuleTemplate(name));\n\n // Hello module\n write(join(projectDir, \"src/modules/app/hello/hello.module.ts\"), helloModuleTemplate());\n write(join(projectDir, \"src/modules/app/hello/hello.controller.ts\"), helloControllerTemplate());\n write(join(projectDir, \"src/modules/app/hello/hello.service.ts\"), helloServiceTemplate());\n\n // Database\n write(join(projectDir, \"src/database/schema.ts\"), dbSchemaTemplate());\n write(join(projectDir, \"src/database/connection.ts\"), dbConnectionTemplate());\n\n // Migrations\n write(join(projectDir, \"migrations/0000_initial.sql\"), migrationTemplate());\n write(join(projectDir, \"migrations/meta/_journal.json\"), migrationMetaTemplate(name));\n\n // Try to install dependencies\n console.log(\"\\n Installing dependencies...\\n\");\n try {\n const pm = detectPackageManager();\n execSync(`${pm} install`, { cwd: projectDir, stdio: \"inherit\" });\n } catch {\n console.log(\" ⚠ Could not auto-install. Run `pnpm install` manually.\\n\");\n }\n\n console.log(`\n ✔ Project created!\n\n Next steps:\n cd ${name}\n cp .env.example .env # fill in Cloudflare credentials\n # Edit wrangler.jsonc: set database_name + database_id\n pnpm db:migrate # apply local D1 migrations\n pnpm dev # http://localhost:4001\n\n Try it:\n curl http://localhost:4001/health\n curl http://localhost:4001/hello\n\n Generate a new module:\n pnpm wilt generate module posts\n`);\n}\n\nfunction detectPackageManager(): string {\n try {\n execSync(\"pnpm --version\", { stdio: \"ignore\" });\n return \"pnpm\";\n } catch { }\n try {\n execSync(\"bun --version\", { stdio: \"ignore\" });\n return \"bun\";\n } catch { }\n return \"npm\";\n}\n","import { writeFileSync, existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { APP_MODULES_DIR, wiltImportPath, ensureDir } from \"../utils/paths.js\";\n\nfunction toPascalCase(name: string): string {\n return name\n .replace(/[-_](.)/g, (_, c) => c.toUpperCase())\n .replace(/^(.)/, (_, c) => c.toUpperCase());\n}\n\nfunction toCamelCase(name: string): string {\n const pascal = toPascalCase(name);\n return pascal.charAt(0).toLowerCase() + pascal.slice(1);\n}\n\nfunction toKebabCase(name: string): string {\n return name\n .replace(/([A-Z])/g, \"-$1\")\n .replace(/^-/, \"\")\n .replace(/_/g, \"-\")\n .toLowerCase();\n}\n\nfunction pluralize(name: string): string {\n return name.endsWith(\"s\") ? name : name + \"s\";\n}\n\nfunction moduleTemplate(name: string, wiltPath: string): string {\n const pascal = toPascalCase(name);\n const kebab = toKebabCase(name);\n\n return `import { Module } from \"${wiltPath}\";\nimport { ${pascal}Controller } from \"./${kebab}.controller\";\nimport { ${pascal}Service } from \"./${kebab}.service\";\n\n@Module({\n controllers: [${pascal}Controller],\n providers: [${pascal}Service],\n exports: [${pascal}Service],\n})\nexport class ${pascal}Module {}\n`;\n}\n\nfunction entityTemplate(name: string): string {\n const camel = toCamelCase(name);\n const kebab = toKebabCase(name);\n const pascal = toPascalCase(name);\n const entityVar = pluralize(camel);\n const tableName = pluralize(kebab);\n\n return `import { sqliteTable, integer } from \"drizzle-orm/sqlite-core\";\n\nexport const ${entityVar} = sqliteTable(\"${tableName}\", {\n id: integer(\"id\").primaryKey({ autoIncrement: true }),\n createdAt: integer(\"created_at\", { mode: \"timestamp\" })\n .$defaultFn(() => new Date())\n .notNull(),\n});\n\nexport type ${pascal} = typeof ${entityVar}.$inferSelect;\nexport type New${pascal} = typeof ${entityVar}.$inferInsert;\n`;\n}\n\nfunction controllerTemplate(name: string, wiltPath: string): string {\n const pascal = toPascalCase(name);\n const camel = toCamelCase(name);\n const kebab = toKebabCase(name);\n return `import type { Context } from \"hono\";\nimport { Controller, Get, Inject } from \"${wiltPath}\";\nimport { ResponseUtil } from \"${wiltPath}\";\nimport { ${pascal}Service } from \"./${kebab}.service\";\n\n@Controller(\"/${kebab}\")\nexport class ${pascal}Controller {\n constructor(@Inject(${pascal}Service) private ${camel}Service: ${pascal}Service) {}\n\n @Get()\n async getAll(c: Context) {\n const data = await this.${camel}Service.findAll();\n return ResponseUtil.success(c, data);\n }\n}\n`;\n}\n\nfunction serviceTemplate(name: string, wiltPath: string): string {\n const pascal = toPascalCase(name);\n return `import { Injectable } from \"${wiltPath}\";\nimport { createDatabase } from \"../../../database/connection\";\n\n@Injectable()\nexport class ${pascal}Service {\n\n private getDatabase(env: CloudflareBindings) {\n return createDatabase(env.DB);\n }\n\n async findAll() {\n return [];\n }\n}\n`;\n}\n\nfunction testTemplate(name: string): string {\n const kebab = toKebabCase(name);\n const pascal = toPascalCase(name);\n const table = pluralize(kebab.replace(/-/g, \"_\"));\n return `import { describe, it, expect, beforeAll, afterEach } from \"vitest\";\nimport { SELF, env, applyD1Migrations } from \"cloudflare:test\";\nimport { ${pascal}Service } from \"./${kebab}.service\";\n\nconst BASE = \"http://localhost\";\nconst service = new ${pascal}Service();\n\nbeforeAll(async () => {\n await applyD1Migrations(env.DB, JSON.parse(env.TEST_MIGRATIONS));\n});\n\nafterEach(async () => {\n await env.DB.prepare(\"DELETE FROM ${table}\").run();\n});\n\ndescribe(\"${pascal}Service\", () => {\n it(\"should be defined\", () => {\n expect(service).toBeDefined();\n });\n});\n\ndescribe(\"GET /${kebab}\", () => {\n it(\"returns an empty list\", async () => {\n const res = await SELF.fetch(\\`\\${BASE}/${kebab}\\`);\n expect(res.status).toBe(200);\n const { data } = await res.json() as { data: unknown[] };\n expect(data).toEqual([]);\n });\n});\n`;\n}\n\nfunction dtoTemplate(name: string): string {\n const pascal = toPascalCase(name);\n return `import { z } from \"zod\";\n\nexport const Create${pascal}Dto = z.object({\n // TODO: define your fields\n});\n\nexport const Update${pascal}Dto = Create${pascal}Dto.partial();\n\nexport type Create${pascal}DtoType = z.infer<typeof Create${pascal}Dto>;\nexport type Update${pascal}DtoType = z.infer<typeof Update${pascal}Dto>;\n`;\n}\n\nexport type GeneratableFile = \"module\" | \"controller\" | \"service\" | \"dto\" | \"entity\" | \"test\";\n\nexport interface GenerateModuleOptions {\n /** Override output directory — defaults to config.modulesDir/<name>/ */\n dir?: string;\n /** Which files to generate — defaults to config.generate.files */\n files?: GeneratableFile[];\n /** Base directory for generated modules (from wilt.config.ts) */\n modulesDir?: string;\n /** Default file list (from wilt.config.ts) */\n defaultFiles?: GeneratableFile[];\n /** Skip generating the test file even if it is in defaultFiles */\n noTest?: boolean;\n}\n\nexport function generateModule(name: string, options: GenerateModuleOptions = {}): void {\n const kebab = toKebabCase(name);\n const pascal = toPascalCase(name);\n const basedir = options.modulesDir ?? APP_MODULES_DIR;\n const moduleDir = options.dir ?? join(basedir, kebab);\n let filesToGen = options.files ?? options.defaultFiles ?? [\"module\", \"controller\", \"service\", \"dto\", \"entity\", \"test\"];\n if (options.noTest) filesToGen = filesToGen.filter((f) => f !== \"test\");\n\n if (existsSync(moduleDir)) {\n console.error(` ✗ Directory already exists: ${moduleDir}`);\n process.exit(1);\n }\n\n ensureDir(moduleDir);\n\n const wiltPath = wiltImportPath();\n const hasEntity = filesToGen.includes(\"entity\");\n\n const fileMap: Record<string, string> = {\n module: moduleTemplate(name, wiltPath),\n controller: controllerTemplate(name, wiltPath),\n service: serviceTemplate(name, wiltPath),\n dto: dtoTemplate(name),\n entity: entityTemplate(name),\n test: testTemplate(name),\n };\n\n const extMap: Record<string, string> = {\n module: `${kebab}.module.ts`,\n controller: `${kebab}.controller.ts`,\n service: `${kebab}.service.ts`,\n dto: `${kebab}.dto.ts`,\n entity: `${kebab}.entity.ts`,\n test: `${kebab}.test.ts`,\n };\n\n for (const file of filesToGen) {\n const filePath = join(moduleDir, extMap[file]);\n writeFileSync(filePath, fileMap[file], \"utf-8\");\n console.log(` ✔ Created ${filePath.replace(process.cwd() + \"/\", \"\")}`);\n }\n\n const relModuleDir = moduleDir.replace(process.cwd() + \"/\", \"\");\n const entityLine = hasEntity\n ? `\\n 2. Add the entity to src/database/schema.ts:\\n\\n import { ${pluralize(toCamelCase(name))} } from \"@app/${relModuleDir.replace(/^src\\//, \"\")}/${kebab}.entity\";\\n\\n export const schema = {\\n ...existing,\\n ${pluralize(toCamelCase(name))},\\n };\\n`\n : \"\";\n console.log(`\n Next steps —\n\n 1. Register the module in src/app.module.ts:\n\n import { ${pascal}Module } from \"./${relModuleDir.replace(/^src\\//, \"\")}/${kebab}.module\";\n\n @Module({\n imports: [..., ${pascal}Module],\n })\n export class AppModule {}\n${entityLine} Then run \\`pnpm db:gen\\` to generate a migration.\n`);\n}\n\nexport function generateService(name: string, dir?: string, modulesDir?: string): void {\n const kebab = toKebabCase(name);\n const basedir = modulesDir ?? APP_MODULES_DIR;\n const targetDir = dir ?? join(basedir, kebab);\n const wiltPath = wiltImportPath();\n const filePath = join(targetDir, `${kebab}.service.ts`);\n\n if (existsSync(filePath)) {\n console.error(` ✗ File already exists: ${filePath}`);\n process.exit(1);\n }\n\n ensureDir(targetDir);\n writeFileSync(filePath, serviceTemplate(name, wiltPath), \"utf-8\");\n console.log(` ✔ Created ${filePath.replace(process.cwd() + \"/\", \"\")}`);\n}\n\nexport function generateController(name: string, dir?: string, modulesDir?: string): void {\n const kebab = toKebabCase(name);\n const basedir = modulesDir ?? APP_MODULES_DIR;\n const targetDir = dir ?? join(basedir, kebab);\n const wiltPath = wiltImportPath();\n const filePath = join(targetDir, `${kebab}.controller.ts`);\n\n if (existsSync(filePath)) {\n console.error(` ✗ File already exists: ${filePath}`);\n process.exit(1);\n }\n\n ensureDir(targetDir);\n writeFileSync(filePath, controllerTemplate(name, wiltPath), \"utf-8\");\n console.log(` ✔ Created ${filePath.replace(process.cwd() + \"/\", \"\")}`);\n}\n","import { join } from \"node:path\";\nimport { existsSync, mkdirSync } from \"node:fs\";\n\n/** Absolute path to the project root (where the CLI is invoked from) */\nexport const PROJECT_ROOT = process.cwd();\n\n/** Absolute path to src/ */\nexport const SRC_DIR = join(PROJECT_ROOT, \"src\");\n\n/** Absolute path to src/modules/ */\nexport const MODULES_DIR = join(SRC_DIR, \"modules\");\n\n/** Absolute path to src/modules/app/ (default location for generated modules) */\nexport const APP_MODULES_DIR = join(MODULES_DIR, \"app\");\n\n/** Absolute path to wrangler.jsonc */\nexport const WRANGLER_JSONC = join(PROJECT_ROOT, \"wrangler.jsonc\");\n\n/** Absolute path to src/app.module.ts */\nexport const APP_MODULE_FILE = join(SRC_DIR, \"app.module.ts\");\n\n/** The wilt import used in generated files */\nexport function wiltImportPath(): string {\n return \"wilt\";\n}\n\n/** Ensure a directory exists, creating it recursively if needed */\nexport function ensureDir(dir: string): void {\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n}\n","import { existsSync } from \"node:fs\";\nimport { join, resolve } from \"node:path\";\nimport { createJiti } from \"jiti\";\nimport type { GeneratableFile } from \"../generators/module.generator.js\";\n\nexport interface WiltConfig {\n modulesDir?: string;\n srcDir?: string;\n generate?: {\n files?: GeneratableFile[];\n };\n}\n\nexport interface ResolvedWiltConfig {\n modulesDir: string;\n srcDir: string;\n generate: {\n files: GeneratableFile[];\n };\n}\n\nexport async function loadConfig(cwd: string = process.cwd()): Promise<ResolvedWiltConfig> {\n let userConfig: WiltConfig = {};\n\n for (const name of [\"wilt.config.ts\", \"wilt.config.js\", \"wilt.config.mjs\"]) {\n const configPath = join(cwd, name);\n if (existsSync(configPath)) {\n try {\n const jiti = createJiti(import.meta.url, { interopDefault: true });\n const mod = await jiti.import(configPath) as WiltConfig;\n userConfig = mod ?? {};\n } catch {\n // fall back to defaults if config can't be loaded\n }\n break;\n }\n }\n\n return {\n modulesDir: resolve(cwd, userConfig.modulesDir ?? \"src/modules/app\"),\n srcDir: resolve(cwd, userConfig.srcDir ?? \"src\"),\n generate: {\n files: userConfig.generate?.files ?? [\"module\", \"controller\", \"service\", \"dto\", \"entity\", \"test\"],\n },\n };\n}\n","import {\n generateModule,\n generateService,\n generateController,\n} from \"../generators/module.generator.js\";\nimport { loadConfig } from \"../utils/config.js\";\n\nconst USAGE = `\nUsage:\n pnpm wilt generate module <name> [--path <dir>] [--no-test]\n pnpm wilt generate service <name> [--path <dir>]\n pnpm wilt generate controller <name> [--path <dir>]\n\nAliases:\n g m → generate module\n g s → generate service\n g c → generate controller\n\nFlags:\n --no-test Skip generating the .test.ts file for a module\n\nExamples:\n pnpm wilt generate module payment\n pnpm wilt g m payment\n pnpm wilt generate module payment --no-test\n pnpm wilt generate service payment --path src/modules/app/payment\n`.trim();\n\nfunction parsePath(args: string[]): { args: string[]; path?: string } {\n const idx = args.indexOf(\"--path\");\n if (idx === -1) return { args };\n const path = args[idx + 1];\n const cleaned = args.filter((_, i) => i !== idx && i !== idx + 1);\n return { args: cleaned, path };\n}\n\nfunction parseNoTest(args: string[]): { args: string[]; noTest: boolean } {\n const idx = args.indexOf(\"--no-test\");\n if (idx === -1) return { args, noTest: false };\n return { args: args.filter((_, i) => i !== idx), noTest: true };\n}\n\nexport async function runGenerate(args: string[]): Promise<void> {\n const { args: withoutPath, path: targetPath } = parsePath(args);\n const { args: cleanArgs, noTest } = parseNoTest(withoutPath);\n const [subcommand, name] = cleanArgs;\n\n if (!subcommand || !name) {\n console.error(` ✗ Missing arguments.\\n\\n${USAGE}`);\n process.exit(1);\n }\n\n const config = await loadConfig();\n const sub = subcommand.toLowerCase();\n\n if (sub === \"module\" || sub === \"m\") {\n console.log(`\\n Generating module \"${name}\"...\\n`);\n generateModule(name, {\n dir: targetPath,\n modulesDir: config.modulesDir,\n defaultFiles: config.generate.files,\n noTest,\n });\n } else if (sub === \"service\" || sub === \"s\") {\n console.log(`\\n Generating service \"${name}\"...\\n`);\n generateService(name, targetPath, config.modulesDir);\n } else if (sub === \"controller\" || sub === \"c\") {\n console.log(`\\n Generating controller \"${name}\"...\\n`);\n generateController(name, targetPath, config.modulesDir);\n } else {\n console.error(` ✗ Unknown generate subcommand: \"${subcommand}\"\\n\\n${USAGE}`);\n process.exit(1);\n }\n}\n","import { readFileSync, writeFileSync } from \"node:fs\";\nimport { WRANGLER_JSONC } from \"./paths.js\";\n\ntype WranglerConfig = Record<string, any>;\n\n/** Strip `//` line comments from a JSONC string so JSON.parse can handle it. */\nfunction stripComments(text: string): string {\n return text\n .split(\"\\n\")\n .map((line) => line.replace(/\\s*\\/\\/.*$/, \"\"))\n .join(\"\\n\");\n}\n\nexport function readWrangler(): WranglerConfig {\n const raw = readFileSync(WRANGLER_JSONC, \"utf-8\");\n return JSON.parse(stripComments(raw));\n}\n\nexport function writeWrangler(config: WranglerConfig): void {\n const header = `{\\n \"$schema\": \"node_modules/wrangler/config-schema.json\",`;\n const body = JSON.stringify(config, null, 2);\n\n // Remove opening brace and $schema from body (we add them above with the comment header)\n const bodyWithoutSchema = body\n .replace(/^\\{/, \"\")\n .replace(/\\s+\"?\\$schema\"?\\s*:\\s*\"[^\"]*\",?\\n/, \"\\n\");\n\n writeFileSync(WRANGLER_JSONC, header + bodyWithoutSchema, \"utf-8\");\n}\n\n// ─── Binding mutators ────────────────────────────────────────────────────────\n\nexport function addD1(binding: string, databaseName: string): void {\n const config = readWrangler();\n if (!config.d1_databases) config.d1_databases = [];\n\n const alreadyExists = config.d1_databases.some(\n (db: any) => db.binding === binding\n );\n if (alreadyExists) {\n console.error(` ✗ D1 binding \"${binding}\" already exists in wrangler.jsonc`);\n process.exit(1);\n }\n\n config.d1_databases.push({\n binding,\n database_name: databaseName,\n database_id: \"00000000-0000-0000-0000-000000000000\",\n migrations_dir: \"migrations\",\n });\n\n writeWrangler(config);\n console.log(` ✔ Added D1 binding \"${binding}\" (database: ${databaseName})`);\n console.log(` ! Remember to replace database_id with your actual D1 database ID.`);\n}\n\nexport function addR2(binding: string, bucketName: string): void {\n const config = readWrangler();\n if (!config.r2_buckets) config.r2_buckets = [];\n\n if (config.r2_buckets.some((b: any) => b.binding === binding)) {\n console.error(` ✗ R2 binding \"${binding}\" already exists in wrangler.jsonc`);\n process.exit(1);\n }\n\n config.r2_buckets.push({\n binding,\n bucket_name: bucketName,\n preview_bucket_name: `${bucketName}-preview`,\n });\n\n writeWrangler(config);\n console.log(` ✔ Added R2 binding \"${binding}\" (bucket: ${bucketName})`);\n}\n\nexport function addKv(binding: string): void {\n const config = readWrangler();\n if (!config.kv_namespaces) config.kv_namespaces = [];\n\n if (config.kv_namespaces.some((k: any) => k.binding === binding)) {\n console.error(` ✗ KV binding \"${binding}\" already exists in wrangler.jsonc`);\n process.exit(1);\n }\n\n config.kv_namespaces.push({\n binding,\n id: \"00000000000000000000000000000000\",\n });\n\n writeWrangler(config);\n console.log(` ✔ Added KV namespace binding \"${binding}\"`);\n console.log(` ! Remember to replace id with your actual KV namespace ID.`);\n}\n\nexport function addQueue(binding: string, queueName: string): void {\n const config = readWrangler();\n if (!config.queues) config.queues = { producers: [], consumers: [] };\n if (!config.queues.producers) config.queues.producers = [];\n if (!config.queues.consumers) config.queues.consumers = [];\n\n if (config.queues.producers.some((p: any) => p.binding === binding)) {\n console.error(` ✗ Queue producer binding \"${binding}\" already exists in wrangler.jsonc`);\n process.exit(1);\n }\n\n config.queues.producers.push({ binding, queue: queueName });\n config.queues.consumers.push({\n queue: queueName,\n max_batch_size: 10,\n max_batch_timeout: 10,\n max_retries: 3,\n });\n\n writeWrangler(config);\n console.log(` ✔ Added Queue binding \"${binding}\" (queue: ${queueName})`);\n}\n\nexport function addAi(binding: string): void {\n const config = readWrangler();\n\n if (config.ai) {\n console.error(` ✗ AI binding already exists in wrangler.jsonc`);\n process.exit(1);\n }\n\n config.ai = { binding };\n writeWrangler(config);\n console.log(` ✔ Added AI binding \"${binding}\"`);\n}\n\nexport function addDurableObject(binding: string, className: string): void {\n const config = readWrangler();\n if (!config.durable_objects) config.durable_objects = { bindings: [] };\n if (!config.durable_objects.bindings) config.durable_objects.bindings = [];\n\n if (config.durable_objects.bindings.some((b: any) => b.name === binding)) {\n console.error(` ✗ Durable Object binding \"${binding}\" already exists in wrangler.jsonc`);\n process.exit(1);\n }\n\n config.durable_objects.bindings.push({\n name: binding,\n class_name: className,\n });\n\n // Also add a migration entry\n if (!config.migrations) config.migrations = [];\n const existingClasses: string[] = config.migrations.flatMap(\n (m: any) => m.new_sqlite_classes ?? m.new_classes ?? []\n );\n if (!existingClasses.includes(className)) {\n const nextTag = `v${config.migrations.length + 1}`;\n config.migrations.push({\n tag: nextTag,\n new_sqlite_classes: [className],\n });\n console.log(` ! Added migration entry \"${nextTag}\" for ${className}.`);\n }\n\n writeWrangler(config);\n console.log(` ✔ Added Durable Object binding \"${binding}\" (class: ${className})`);\n}\n\nexport function addVectorize(binding: string, indexName: string, dimensions: number = 1536): void {\n const config = readWrangler();\n if (!config.vectorize) config.vectorize = [];\n\n if (config.vectorize.some((v: any) => v.binding === binding)) {\n console.error(` ✗ Vectorize binding \"${binding}\" already exists in wrangler.jsonc`);\n process.exit(1);\n }\n\n config.vectorize.push({\n binding,\n index_name: indexName,\n dimensions,\n metric: \"cosine\",\n });\n\n writeWrangler(config);\n console.log(` ✔ Added Vectorize binding \"${binding}\" (index: ${indexName}, dimensions: ${dimensions})`);\n console.log(` ! Create the index with: wrangler vectorize create ${indexName} --dimensions=${dimensions} --metric=cosine`);\n}\n\nexport function addBrowser(binding: string): void {\n const config = readWrangler();\n\n if (config.browser) {\n console.error(` ✗ Browser binding already exists in wrangler.jsonc`);\n process.exit(1);\n }\n\n config.browser = { binding };\n writeWrangler(config);\n console.log(` ✔ Added Browser rendering binding \"${binding}\"`);\n}\n\nexport function addHyperdrive(binding: string, connectionString: string): void {\n const config = readWrangler();\n if (!config.hyperdrive) config.hyperdrive = [];\n\n if (config.hyperdrive.some((h: any) => h.binding === binding)) {\n console.error(` ✗ Hyperdrive binding \"${binding}\" already exists in wrangler.jsonc`);\n process.exit(1);\n }\n\n config.hyperdrive.push({\n binding,\n id: \"00000000000000000000000000000000\",\n localConnectionString: connectionString,\n });\n\n writeWrangler(config);\n console.log(` ✔ Added Hyperdrive binding \"${binding}\"`);\n console.log(` ! Remember to replace id with your actual Hyperdrive config ID.`);\n}\n","import {\n addD1,\n addR2,\n addKv,\n addQueue,\n addAi,\n addDurableObject,\n addVectorize,\n addBrowser,\n addHyperdrive,\n} from \"../utils/wrangler.js\";\n\nconst USAGE = `\nUsage:\n pnpm wilt add d1 <BINDING_NAME> <database-name>\n pnpm wilt add r2 <BINDING_NAME> <bucket-name>\n pnpm wilt add kv <BINDING_NAME>\n pnpm wilt add queue <BINDING_NAME> <queue-name>\n pnpm wilt add ai <BINDING_NAME>\n pnpm wilt add durable-object <BINDING_NAME> <ClassName>\n pnpm wilt add vectorize <BINDING_NAME> <index-name> [dimensions]\n pnpm wilt add browser <BINDING_NAME>\n pnpm wilt add hyperdrive <BINDING_NAME> <connection-string>\n\nExamples:\n pnpm wilt add d1 PAYMENTS_DB payments-db\n pnpm wilt add r2 ASSETS_BUCKET my-assets\n pnpm wilt add kv SESSION_KV\n pnpm wilt add queue MAIL_QUEUE mailer\n pnpm wilt add ai AI\n pnpm wilt add durable-object CHAT_ROOM ChatRoom\n pnpm wilt add vectorize VECTOR_IDX my-index 1536\n pnpm wilt add browser BROWSER\n pnpm wilt add hyperdrive HYPERDRIVE postgres://user:pass@host/db\n`.trim();\n\nexport function runAdd(args: string[]): void {\n const [service, ...rest] = args;\n\n if (!service) {\n console.error(` ✗ Missing service type.\\n\\n${USAGE}`);\n process.exit(1);\n }\n\n const svc = service.toLowerCase();\n\n switch (svc) {\n case \"d1\": {\n const [binding, dbName] = rest;\n if (!binding || !dbName) {\n console.error(` ✗ Usage: pnpm wilt add d1 <BINDING_NAME> <database-name>`);\n process.exit(1);\n }\n console.log(`\\n Adding D1 binding to wrangler.jsonc...\\n`);\n addD1(binding, dbName);\n break;\n }\n\n case \"r2\": {\n const [binding, bucketName] = rest;\n if (!binding || !bucketName) {\n console.error(` ✗ Usage: pnpm wilt add r2 <BINDING_NAME> <bucket-name>`);\n process.exit(1);\n }\n console.log(`\\n Adding R2 binding to wrangler.jsonc...\\n`);\n addR2(binding, bucketName);\n break;\n }\n\n case \"kv\": {\n const [binding] = rest;\n if (!binding) {\n console.error(` ✗ Usage: pnpm wilt add kv <BINDING_NAME>`);\n process.exit(1);\n }\n console.log(`\\n Adding KV namespace binding to wrangler.jsonc...\\n`);\n addKv(binding);\n break;\n }\n\n case \"queue\": {\n const [binding, queueName] = rest;\n if (!binding || !queueName) {\n console.error(` ✗ Usage: pnpm wilt add queue <BINDING_NAME> <queue-name>`);\n process.exit(1);\n }\n console.log(`\\n Adding Queue binding to wrangler.jsonc...\\n`);\n addQueue(binding, queueName);\n break;\n }\n\n case \"ai\": {\n const [binding] = rest;\n if (!binding) {\n console.error(` ✗ Usage: pnpm wilt add ai <BINDING_NAME>`);\n process.exit(1);\n }\n console.log(`\\n Adding AI binding to wrangler.jsonc...\\n`);\n addAi(binding);\n break;\n }\n\n case \"durable-object\":\n case \"do\": {\n const [binding, className] = rest;\n if (!binding || !className) {\n console.error(` ✗ Usage: pnpm wilt add durable-object <BINDING_NAME> <ClassName>`);\n process.exit(1);\n }\n console.log(`\\n Adding Durable Object binding to wrangler.jsonc...\\n`);\n addDurableObject(binding, className);\n break;\n }\n\n case \"vectorize\":\n case \"vector\": {\n const [binding, indexName, rawDimensions] = rest;\n if (!binding || !indexName) {\n console.error(` ✗ Usage: pnpm wilt add vectorize <BINDING_NAME> <index-name> [dimensions]`);\n process.exit(1);\n }\n const dimensions = rawDimensions ? parseInt(rawDimensions, 10) : 1536;\n console.log(`\\n Adding Vectorize binding to wrangler.jsonc...\\n`);\n addVectorize(binding, indexName, dimensions);\n break;\n }\n\n case \"browser\": {\n const [binding] = rest;\n if (!binding) {\n console.error(` ✗ Usage: pnpm wilt add browser <BINDING_NAME>`);\n process.exit(1);\n }\n console.log(`\\n Adding Browser rendering binding to wrangler.jsonc...\\n`);\n addBrowser(binding);\n break;\n }\n\n case \"hyperdrive\": {\n const [binding, connectionString] = rest;\n if (!binding || !connectionString) {\n console.error(` ✗ Usage: pnpm wilt add hyperdrive <BINDING_NAME> <connection-string>`);\n process.exit(1);\n }\n console.log(`\\n Adding Hyperdrive binding to wrangler.jsonc...\\n`);\n addHyperdrive(binding, connectionString);\n break;\n }\n\n default: {\n console.error(` ✗ Unknown service type: \"${service}\"\\n\\n${USAGE}`);\n process.exit(1);\n }\n }\n}\n","import { runNew } from \"./commands/new.js\";\nimport { runGenerate } from \"./commands/generate.js\";\nimport { runAdd } from \"./commands/add.js\";\n\nconst BANNER = `\n ██╗ ██╗██╗██╗ ████████╗\n ██║ ██║██║██║ ╚══██╔══╝\n ██║ █╗ ██║██║██║ ██║\n ██║███╗██║██║██║ ██║\n ╚███╔███╔╝██║███████╗██║\n ╚══╝╚══╝ ╚═╝╚══════╝╚═╝\n Wilt CLI — Cloudflare Workers Framework\n`.trim();\n\nconst HELP = `\n${BANNER}\n\nUsage:\n pnpm wilt <command> [subcommand] [args...]\n\nCommands:\n new Create a new Wilt project\n generate (g) Scaffold module, service, or controller files\n add Add a Cloudflare service binding to wrangler.jsonc\n help Show this help message\n\nGenerate subcommands:\n module (m) Scaffold a full module (module + controller + service + dto)\n service (s) Scaffold a service file\n controller (c) Scaffold a controller file\n\nAdd subcommands:\n d1 D1 database binding\n r2 R2 bucket binding\n kv KV namespace binding\n queue Queue producer + consumer\n ai Workers AI binding\n durable-object Durable Object binding + migration\n vectorize Vectorize index binding\n browser Browser rendering binding\n hyperdrive Hyperdrive binding\n\nExamples:\n pnpm wilt new my-app\n pnpm wilt generate module payment\n pnpm wilt g m payment\n pnpm wilt add d1 PAYMENTS_DB payments-db\n pnpm wilt add r2 ASSETS_BUCKET my-assets\n pnpm wilt add kv SESSION_KV\n pnpm wilt add queue MAIL_QUEUE mailer\n pnpm wilt add ai AI\n pnpm wilt add durable-object CHAT_ROOM ChatRoom\n`.trim();\n\nasync function main(): Promise<void> {\n const args = process.argv.slice(2);\n const [command, ...rest] = args;\n\n if (!command || command === \"help\" || command === \"--help\" || command === \"-h\") {\n console.log(`\\n${HELP}\\n`);\n process.exit(0);\n }\n\n const cmd = command.toLowerCase();\n\n if (cmd === \"new\" || cmd === \"n\") {\n runNew(rest);\n } else if (cmd === \"generate\" || cmd === \"g\") {\n await runGenerate(rest);\n } else if (cmd === \"add\") {\n runAdd(rest);\n } else {\n console.error(` ✗ Unknown command: \"${command}\"\\n`);\n console.log(HELP);\n process.exit(1);\n }\n}\n\nmain();\n"],"mappings":"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","names":["writeFileSync","existsSync","join","join","existsSync","mkdirSync","dir","pascal","kebab","join","existsSync","writeFileSync","dir","existsSync","join","resolve","writeFileSync","writeFileSync","USAGE"]}
@@ -0,0 +1,15 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __decorateClass = (decorators, target, key, kind) => {
4
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
5
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
6
+ if (decorator = decorators[i])
7
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
8
+ if (kind && result) __defProp(target, key, result);
9
+ return result;
10
+ };
11
+
12
+ export {
13
+ __decorateClass
14
+ };
15
+ //# sourceMappingURL=chunk-EUXUH3YW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,234 @@
1
+ // src/wilt/exceptions/http-exception.ts
2
+ var HttpException = class extends Error {
3
+ constructor(response, statusCode) {
4
+ super(typeof response === "string" ? response : response.message ?? "HttpException");
5
+ this.response = response;
6
+ this.statusCode = statusCode;
7
+ this.name = "HttpException";
8
+ }
9
+ response;
10
+ statusCode;
11
+ getStatus() {
12
+ return this.statusCode;
13
+ }
14
+ getResponse() {
15
+ return this.response;
16
+ }
17
+ };
18
+
19
+ // src/wilt/middleware/error-handler.middleware.ts
20
+ function isHttpException(err) {
21
+ return err instanceof HttpException || err instanceof Error && typeof err.getStatus === "function" && typeof err.getResponse === "function";
22
+ }
23
+ function isZodError(err) {
24
+ return err instanceof Error && err.name === "ZodError" && Array.isArray(err.issues);
25
+ }
26
+ async function errorHandler(c, next) {
27
+ try {
28
+ await next();
29
+ } catch (error) {
30
+ if (isHttpException(error)) {
31
+ const response = error.getResponse();
32
+ const body = typeof response === "string" ? { success: false, error: { code: error.name, message: response }, timestamp: (/* @__PURE__ */ new Date()).toISOString() } : { success: false, ...response, timestamp: (/* @__PURE__ */ new Date()).toISOString() };
33
+ return c.json(body, error.getStatus());
34
+ }
35
+ if (isZodError(error)) {
36
+ const details = error.issues.map((i) => ({
37
+ field: i.path.join("."),
38
+ message: i.message,
39
+ code: i.code
40
+ }));
41
+ return c.json(
42
+ {
43
+ success: false,
44
+ error: { code: "VALIDATION_ERROR", message: "Validation failed", details },
45
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
46
+ },
47
+ 400
48
+ );
49
+ }
50
+ console.error("Unhandled error:", error);
51
+ return c.json(
52
+ {
53
+ success: false,
54
+ error: {
55
+ code: "INTERNAL_ERROR",
56
+ message: error instanceof Error ? error.message : "Internal server error"
57
+ },
58
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
59
+ },
60
+ 500
61
+ );
62
+ }
63
+ }
64
+
65
+ // src/wilt/utils/logger.util.ts
66
+ var LogLevel = /* @__PURE__ */ ((LogLevel2) => {
67
+ LogLevel2["ERROR"] = "error";
68
+ LogLevel2["WARN"] = "warn";
69
+ LogLevel2["INFO"] = "info";
70
+ LogLevel2["DEBUG"] = "debug";
71
+ return LogLevel2;
72
+ })(LogLevel || {});
73
+ var META_PLACEHOLDER = "[unserializable-meta]";
74
+ function stringifyLogMeta(meta) {
75
+ try {
76
+ const keys = Object.keys(meta).sort();
77
+ const sorted = {};
78
+ for (const k of keys) sorted[k] = meta[k];
79
+ return JSON.stringify(sorted);
80
+ } catch {
81
+ return META_PLACEHOLDER;
82
+ }
83
+ }
84
+ var colors = {
85
+ reset: "\x1B[0m",
86
+ bright: "\x1B[1m",
87
+ red: "\x1B[31m",
88
+ green: "\x1B[32m",
89
+ yellow: "\x1B[33m",
90
+ blue: "\x1B[34m",
91
+ magenta: "\x1B[35m",
92
+ cyan: "\x1B[36m",
93
+ gray: "\x1B[90m"
94
+ };
95
+ function getStatusColor(status) {
96
+ if (status >= 500) return colors.red;
97
+ if (status >= 400) return colors.yellow;
98
+ if (status >= 300) return colors.cyan;
99
+ if (status >= 200) return colors.green;
100
+ return colors.gray;
101
+ }
102
+ function getMethodColor(method) {
103
+ switch (method) {
104
+ case "GET":
105
+ return colors.green;
106
+ case "POST":
107
+ return colors.blue;
108
+ case "PUT":
109
+ return colors.yellow;
110
+ case "DELETE":
111
+ return colors.red;
112
+ case "PATCH":
113
+ return colors.magenta;
114
+ default:
115
+ return colors.gray;
116
+ }
117
+ }
118
+ var Logger = class _Logger {
119
+ static instance;
120
+ logLevel;
121
+ enableColors;
122
+ constructor() {
123
+ this.logLevel = "info" /* INFO */;
124
+ this.enableColors = true;
125
+ }
126
+ static getInstance() {
127
+ if (!_Logger.instance) {
128
+ _Logger.instance = new _Logger();
129
+ }
130
+ return _Logger.instance;
131
+ }
132
+ shouldLog(level) {
133
+ const levels = Object.values(LogLevel);
134
+ const currentLevelIndex = levels.indexOf(this.logLevel);
135
+ const messageLevelIndex = levels.indexOf(level);
136
+ return messageLevelIndex <= currentLevelIndex;
137
+ }
138
+ formatMessage(level, message, context, meta) {
139
+ const timestamp = (/* @__PURE__ */ new Date()).toISOString();
140
+ const contextStr = context ? ` [${context}]` : "";
141
+ const metaStr = meta && Object.keys(meta).length > 0 ? ` | ${stringifyLogMeta(meta)}` : "";
142
+ const baseMessage = `[${timestamp}] ${level.toUpperCase()}${contextStr}: ${message}${metaStr}`;
143
+ if (!this.enableColors) return baseMessage;
144
+ const colorMap = {
145
+ ["error" /* ERROR */]: colors.red,
146
+ ["warn" /* WARN */]: colors.yellow,
147
+ ["info" /* INFO */]: colors.blue,
148
+ ["debug" /* DEBUG */]: colors.gray
149
+ };
150
+ return `${colorMap[level]}${baseMessage}${colors.reset}`;
151
+ }
152
+ // HTTP request logging (like Hono's logger)
153
+ http(method, path, status, duration, userAgent) {
154
+ if (!this.shouldLog("info" /* INFO */)) return;
155
+ const methodColor = this.enableColors ? getMethodColor(method) : "";
156
+ const statusColor = this.enableColors ? getStatusColor(status) : "";
157
+ const reset = this.enableColors ? colors.reset : "";
158
+ const methodStr = `${methodColor}${method}${reset}`;
159
+ const statusStr = `${statusColor}${status}${reset}`;
160
+ const durationStr = duration > 1e3 ? `${colors.red}${duration}ms${reset}` : `${duration}ms`;
161
+ const logMessage = `${methodStr} ${path} ${statusStr} ${durationStr}`;
162
+ if (userAgent) {
163
+ console.log(`${logMessage} - ${colors.gray}${userAgent}${reset}`);
164
+ } else {
165
+ console.log(logMessage);
166
+ }
167
+ }
168
+ // Standard logging methods
169
+ error(message, context, meta) {
170
+ if (this.shouldLog("error" /* ERROR */)) {
171
+ console.error(this.formatMessage("error" /* ERROR */, message, context, meta));
172
+ }
173
+ }
174
+ warn(message, context, meta) {
175
+ if (this.shouldLog("warn" /* WARN */)) {
176
+ console.warn(this.formatMessage("warn" /* WARN */, message, context, meta));
177
+ }
178
+ }
179
+ info(message, context, meta) {
180
+ if (this.shouldLog("info" /* INFO */)) {
181
+ console.info(this.formatMessage("info" /* INFO */, message, context, meta));
182
+ }
183
+ }
184
+ debug(message, context, meta) {
185
+ if (this.shouldLog("debug" /* DEBUG */)) {
186
+ console.debug(this.formatMessage("debug" /* DEBUG */, message, context, meta));
187
+ }
188
+ }
189
+ // Static methods for convenience
190
+ static http(method, path, status, duration, userAgent) {
191
+ _Logger.getInstance().http(method, path, status, duration, userAgent);
192
+ }
193
+ static error(message, context, meta) {
194
+ _Logger.getInstance().error(message, context, meta);
195
+ }
196
+ static warn(message, context, meta) {
197
+ _Logger.getInstance().warn(message, context, meta);
198
+ }
199
+ static info(message, context, meta) {
200
+ _Logger.getInstance().info(message, context, meta);
201
+ }
202
+ static debug(message, context, meta) {
203
+ _Logger.getInstance().debug(message, context, meta);
204
+ }
205
+ // Configuration methods
206
+ setLogLevel(level) {
207
+ this.logLevel = level;
208
+ }
209
+ setColors(enabled) {
210
+ this.enableColors = enabled;
211
+ }
212
+ };
213
+ var logger = Logger.getInstance();
214
+
215
+ // src/wilt/middleware/request-logger.middleware.ts
216
+ async function requestLogger(c, next) {
217
+ const start = Date.now();
218
+ const method = c.req.method;
219
+ const path = c.req.path;
220
+ const userAgent = c.req.header("User-Agent");
221
+ await next();
222
+ const end = Date.now();
223
+ const duration = end - start;
224
+ const status = c.res.status;
225
+ logger.http(method, path, status, duration, userAgent);
226
+ }
227
+
228
+ export {
229
+ HttpException,
230
+ logger,
231
+ errorHandler,
232
+ requestLogger
233
+ };
234
+ //# sourceMappingURL=chunk-FIEODUMV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/wilt/exceptions/http-exception.ts","../../src/wilt/middleware/error-handler.middleware.ts","../../src/wilt/utils/logger.util.ts","../../src/wilt/middleware/request-logger.middleware.ts"],"sourcesContent":["export class HttpException extends Error {\n\tconstructor(\n\t\tprivate readonly response: string | Record<string, any>,\n\t\tprivate readonly statusCode: number\n\t) {\n\t\tsuper(typeof response === \"string\" ? response : (response as any).message ?? \"HttpException\");\n\t\tthis.name = \"HttpException\";\n\t}\n\n\tgetStatus(): number {\n\t\treturn this.statusCode;\n\t}\n\n\tgetResponse(): string | Record<string, any> {\n\t\treturn this.response;\n\t}\n}\n","import type { Context, Next } from \"hono\";\nimport { HttpException } from \"../exceptions/http-exception\";\n\nfunction isHttpException(err: unknown): err is HttpException {\n\treturn (\n\t\terr instanceof HttpException ||\n\t\t(err instanceof Error &&\n\t\t\ttypeof (err as any).getStatus === \"function\" &&\n\t\t\ttypeof (err as any).getResponse === \"function\")\n\t);\n}\n\nfunction isZodError(err: unknown): err is Error & { issues: Array<{ path: (string | number)[]; message: string; code: string }> } {\n\treturn (\n\t\terr instanceof Error &&\n\t\t(err as any).name === \"ZodError\" &&\n\t\tArray.isArray((err as any).issues)\n\t);\n}\n\nexport async function errorHandler(c: Context, next: Next) {\n\ttry {\n\t\tawait next();\n\t} catch (error) {\n\t\tif (isHttpException(error)) {\n\t\t\tconst response = error.getResponse();\n\t\t\tconst body =\n\t\t\t\ttypeof response === \"string\"\n\t\t\t\t\t? { success: false, error: { code: error.name, message: response }, timestamp: new Date().toISOString() }\n\t\t\t\t\t: { success: false, ...response, timestamp: new Date().toISOString() };\n\t\t\treturn c.json(body, error.getStatus() as any);\n\t\t}\n\n\t\tif (isZodError(error)) {\n\t\t\tconst details = error.issues.map((i) => ({\n\t\t\t\tfield: i.path.join(\".\"),\n\t\t\t\tmessage: i.message,\n\t\t\t\tcode: i.code,\n\t\t\t}));\n\t\t\treturn c.json(\n\t\t\t\t{\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\terror: { code: \"VALIDATION_ERROR\", message: \"Validation failed\", details },\n\t\t\t\t\ttimestamp: new Date().toISOString(),\n\t\t\t\t},\n\t\t\t\t400,\n\t\t\t);\n\t\t}\n\n\t\tconsole.error(\"Unhandled error:\", error);\n\t\treturn c.json(\n\t\t\t{\n\t\t\t\tsuccess: false,\n\t\t\t\terror: {\n\t\t\t\t\tcode: \"INTERNAL_ERROR\",\n\t\t\t\t\tmessage: error instanceof Error ? error.message : \"Internal server error\",\n\t\t\t\t},\n\t\t\t\ttimestamp: new Date().toISOString(),\n\t\t\t},\n\t\t\t500\n\t\t);\n\t}\n}\n","export enum LogLevel {\n\tERROR = \"error\",\n\tWARN = \"warn\",\n\tINFO = \"info\",\n\tDEBUG = \"debug\",\n}\n\nconst META_PLACEHOLDER = \"[unserializable-meta]\";\n\n/** Stable, one-line JSON for log drains / grepping (keys sorted). */\nexport function stringifyLogMeta(meta: Record<string, unknown>): string {\n\ttry {\n\t\tconst keys = Object.keys(meta).sort();\n\t\tconst sorted: Record<string, unknown> = {};\n\t\tfor (const k of keys) sorted[k] = meta[k];\n\t\treturn JSON.stringify(sorted);\n\t} catch {\n\t\treturn META_PLACEHOLDER;\n\t}\n}\n\nexport function formatError(error: unknown): string {\n\tif (error instanceof Error) {\n\t\tconst stack = error.stack ? error.stack.split(\"\\n\").slice(0, 4).join(\" | \") : \"\";\n\t\treturn stack ? `${error.message} | ${stack}` : error.message;\n\t}\n\treturn String(error);\n}\n\n// ANSI color codes for terminal output\nconst colors = {\n\treset: \"\\x1b[0m\",\n\tbright: \"\\x1b[1m\",\n\tred: \"\\x1b[31m\",\n\tgreen: \"\\x1b[32m\",\n\tyellow: \"\\x1b[33m\",\n\tblue: \"\\x1b[34m\",\n\tmagenta: \"\\x1b[35m\",\n\tcyan: \"\\x1b[36m\",\n\tgray: \"\\x1b[90m\",\n};\n\n// HTTP status code colors\nfunction getStatusColor(status: number): string {\n\tif (status >= 500) return colors.red;\n\tif (status >= 400) return colors.yellow;\n\tif (status >= 300) return colors.cyan;\n\tif (status >= 200) return colors.green;\n\treturn colors.gray;\n}\n\n// HTTP method colors\nfunction getMethodColor(method: string): string {\n\tswitch (method) {\n\t\tcase \"GET\":\n\t\t\treturn colors.green;\n\t\tcase \"POST\":\n\t\t\treturn colors.blue;\n\t\tcase \"PUT\":\n\t\t\treturn colors.yellow;\n\t\tcase \"DELETE\":\n\t\t\treturn colors.red;\n\t\tcase \"PATCH\":\n\t\t\treturn colors.magenta;\n\t\tdefault:\n\t\t\treturn colors.gray;\n\t}\n}\n\nexport class Logger {\n\tprivate static instance: Logger;\n\tprivate logLevel: LogLevel;\n\tprivate enableColors: boolean;\n\n\tprivate constructor() {\n\t\tthis.logLevel = LogLevel.INFO;\n\t\tthis.enableColors = true; // Enable colors by default\n\t}\n\n\tpublic static getInstance(): Logger {\n\t\tif (!Logger.instance) {\n\t\t\tLogger.instance = new Logger();\n\t\t}\n\t\treturn Logger.instance;\n\t}\n\n\tprivate shouldLog(level: LogLevel): boolean {\n\t\tconst levels = Object.values(LogLevel);\n\t\tconst currentLevelIndex = levels.indexOf(this.logLevel);\n\t\tconst messageLevelIndex = levels.indexOf(level);\n\t\treturn messageLevelIndex <= currentLevelIndex;\n\t}\n\n\tprivate formatMessage(level: LogLevel, message: string, context?: string, meta?: Record<string, unknown>): string {\n\t\tconst timestamp = new Date().toISOString();\n\t\tconst contextStr = context ? ` [${context}]` : \"\";\n\t\tconst metaStr = meta && Object.keys(meta).length > 0 ? ` | ${stringifyLogMeta(meta)}` : \"\";\n\t\tconst baseMessage = `[${timestamp}] ${level.toUpperCase()}${contextStr}: ${message}${metaStr}`;\n\n\t\tif (!this.enableColors) return baseMessage;\n\n\t\tconst colorMap = {\n\t\t\t[LogLevel.ERROR]: colors.red,\n\t\t\t[LogLevel.WARN]: colors.yellow,\n\t\t\t[LogLevel.INFO]: colors.blue,\n\t\t\t[LogLevel.DEBUG]: colors.gray,\n\t\t};\n\n\t\treturn `${colorMap[level]}${baseMessage}${colors.reset}`;\n\t}\n\n\t// HTTP request logging (like Hono's logger)\n\thttp(method: string, path: string, status: number, duration: number, userAgent?: string): void {\n\t\tif (!this.shouldLog(LogLevel.INFO)) return;\n\n\t\tconst methodColor = this.enableColors ? getMethodColor(method) : \"\";\n\t\tconst statusColor = this.enableColors ? getStatusColor(status) : \"\";\n\t\tconst reset = this.enableColors ? colors.reset : \"\";\n\n\t\tconst methodStr = `${methodColor}${method}${reset}`;\n\t\tconst statusStr = `${statusColor}${status}${reset}`;\n\t\tconst durationStr = duration > 1000 ? `${colors.red}${duration}ms${reset}` : `${duration}ms`;\n\n\t\tconst logMessage = `${methodStr} ${path} ${statusStr} ${durationStr}`;\n\n\t\tif (userAgent) {\n\t\t\tconsole.log(`${logMessage} - ${colors.gray}${userAgent}${reset}`);\n\t\t} else {\n\t\t\tconsole.log(logMessage);\n\t\t}\n\t}\n\n\t// Standard logging methods\n\terror(message: string, context?: string, meta?: Record<string, unknown>): void {\n\t\tif (this.shouldLog(LogLevel.ERROR)) {\n\t\t\tconsole.error(this.formatMessage(LogLevel.ERROR, message, context, meta));\n\t\t}\n\t}\n\n\twarn(message: string, context?: string, meta?: Record<string, unknown>): void {\n\t\tif (this.shouldLog(LogLevel.WARN)) {\n\t\t\tconsole.warn(this.formatMessage(LogLevel.WARN, message, context, meta));\n\t\t}\n\t}\n\n\tinfo(message: string, context?: string, meta?: Record<string, unknown>): void {\n\t\tif (this.shouldLog(LogLevel.INFO)) {\n\t\t\tconsole.info(this.formatMessage(LogLevel.INFO, message, context, meta));\n\t\t}\n\t}\n\n\tdebug(message: string, context?: string, meta?: Record<string, unknown>): void {\n\t\tif (this.shouldLog(LogLevel.DEBUG)) {\n\t\t\tconsole.debug(this.formatMessage(LogLevel.DEBUG, message, context, meta));\n\t\t}\n\t}\n\n\t// Static methods for convenience\n\tstatic http(method: string, path: string, status: number, duration: number, userAgent?: string): void {\n\t\tLogger.getInstance().http(method, path, status, duration, userAgent);\n\t}\n\n\tstatic error(message: string, context?: string, meta?: Record<string, unknown>): void {\n\t\tLogger.getInstance().error(message, context, meta);\n\t}\n\n\tstatic warn(message: string, context?: string, meta?: Record<string, unknown>): void {\n\t\tLogger.getInstance().warn(message, context, meta);\n\t}\n\n\tstatic info(message: string, context?: string, meta?: Record<string, unknown>): void {\n\t\tLogger.getInstance().info(message, context, meta);\n\t}\n\n\tstatic debug(message: string, context?: string, meta?: Record<string, unknown>): void {\n\t\tLogger.getInstance().debug(message, context, meta);\n\t}\n\n\t// Configuration methods\n\tsetLogLevel(level: LogLevel): void {\n\t\tthis.logLevel = level;\n\t}\n\n\tsetColors(enabled: boolean): void {\n\t\tthis.enableColors = enabled;\n\t}\n}\n\nexport const logger = Logger.getInstance();\n","import type { Context, Next } from \"hono\";\nimport { logger } from \"../utils/logger.util\";\n\nexport async function requestLogger(c: Context, next: Next) {\n\tconst start = Date.now();\n\tconst method = c.req.method;\n\tconst path = c.req.path;\n\tconst userAgent = c.req.header(\"User-Agent\");\n\n\tawait next();\n\n\tconst end = Date.now();\n\tconst duration = end - start;\n\tconst status = c.res.status;\n\n\tlogger.http(method, path, status, duration, userAgent);\n}\n"],"mappings":"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","names":["LogLevel"]}