@ajke/cli 0.1.11 → 0.1.13

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.
@@ -42,6 +42,7 @@ function packageJsonTemplate(name: string) {
42
42
  dependencies: {
43
43
  hono: "^4.12.0",
44
44
  "@ajke/core": "^0.1.0",
45
+ "@ajke/swagger": "^0.1.0",
45
46
  "reflect-metadata": "^0.2.2",
46
47
  tsyringe: "^4.10.0",
47
48
  zod: "^4.0.0",
@@ -192,7 +193,9 @@ import { secureHeaders } from "hono/secure-headers";
192
193
 
193
194
  import { Module, createModule } from "@ajke/core";
194
195
  import { requestLogger } from "@ajke/core/middleware";
196
+ import { SwaggerModule } from "@ajke/swagger";
195
197
  import { HelloModule } from "./modules/app/hello/hello.module";
198
+ import { HelloController } from "./modules/app/hello/hello.controller";
196
199
 
197
200
  @Module({
198
201
  imports: [HelloModule],
@@ -203,6 +206,13 @@ const app = createModule(AppModule, {
203
206
  middlewares: [cors(), secureHeaders(), requestLogger],
204
207
  });
205
208
 
209
+ SwaggerModule.setup(app, {
210
+ controllers: [HelloController],
211
+ title: "${p} API",
212
+ version: "1.0.0",
213
+ path: "/api-docs",
214
+ });
215
+
206
216
  app.get("/", (c) => c.json({ success: true, status: "healthy", timestamp: new Date().toISOString() }));
207
217
  app.get("/health", (c) => c.json({ success: true, status: "healthy", timestamp: new Date().toISOString() }));
208
218
 
@@ -227,13 +237,17 @@ function helloControllerTemplate() {
227
237
  return `import type { Context } from "hono";
228
238
  import { Controller, Get, Inject } from "@ajke/core";
229
239
  import { ResponseUtil } from "@ajke/core";
240
+ import { ApiTags, ApiOperation, ApiResponse } from "@ajke/swagger";
230
241
  import { HelloService } from "./hello.service";
231
242
 
243
+ @ApiTags("hello")
232
244
  @Controller("/hello")
233
245
  export class HelloController {
234
246
  constructor(@Inject(HelloService) private helloService: HelloService) {}
235
247
 
236
248
  @Get()
249
+ @ApiOperation({ summary: "Health greeting" })
250
+ @ApiResponse({ status: 200, description: "Returns a greeting message" })
237
251
  async greet(c: Context) {
238
252
  const message = this.helloService.greet();
239
253
  return ResponseUtil.success(c, { message });
@@ -284,6 +298,13 @@ coverage/
284
298
  `;
285
299
  }
286
300
 
301
+ function pnpmWorkspaceTemplate() {
302
+ return `# This file makes pnpm treat this project as its own workspace root,
303
+ # preventing it from resolving packages against a parent workspace.
304
+ packages: []
305
+ `;
306
+ }
307
+
287
308
 
288
309
  function wiltConfigTemplate() {
289
310
  return `import { defineConfig } from "@ajke/core/config";
@@ -395,6 +416,7 @@ export function runNew(args: string[]): void {
395
416
  write(join(projectDir, "vitest.config.ts"), vitestConfigTemplate());
396
417
  write(join(projectDir, "worker-configuration.d.ts"), workerTypesTemplate());
397
418
  write(join(projectDir, "ajke.config.ts"), wiltConfigTemplate());
419
+ write(join(projectDir, "pnpm-workspace.yaml"), pnpmWorkspaceTemplate());
398
420
  write(join(projectDir, ".gitignore"), gitignoreTemplate());
399
421
  write(join(projectDir, ".env.example"), envExampleTemplate());
400
422
  write(join(projectDir, "drizzle.config.ts"), drizzleConfigTemplate());
@@ -439,6 +461,10 @@ export function runNew(args: string[]): void {
439
461
  curl http://localhost:4001/health
440
462
  curl http://localhost:4001/hello
441
463
 
464
+ API docs (Swagger UI):
465
+ http://localhost:4001/api-docs
466
+ http://localhost:4001/api-docs/json # raw OpenAPI 3.0 JSON
467
+
442
468
  Generate a new module:
443
469
  pnpm ajke generate module posts
444
470
  `);
package/dist/bin/ajke.js CHANGED
@@ -34,6 +34,7 @@ function packageJsonTemplate(name) {
34
34
  dependencies: {
35
35
  hono: "^4.12.0",
36
36
  "@ajke/core": "^0.1.0",
37
+ "@ajke/swagger": "^0.1.0",
37
38
  "reflect-metadata": "^0.2.2",
38
39
  tsyringe: "^4.10.0",
39
40
  zod: "^4.0.0",
@@ -177,7 +178,9 @@ import { secureHeaders } from "hono/secure-headers";
177
178
 
178
179
  import { Module, createModule } from "@ajke/core";
179
180
  import { requestLogger } from "@ajke/core/middleware";
181
+ import { SwaggerModule } from "@ajke/swagger";
180
182
  import { HelloModule } from "./modules/app/hello/hello.module";
183
+ import { HelloController } from "./modules/app/hello/hello.controller";
181
184
 
182
185
  @Module({
183
186
  imports: [HelloModule],
@@ -188,6 +191,13 @@ const app = createModule(AppModule, {
188
191
  middlewares: [cors(), secureHeaders(), requestLogger],
189
192
  });
190
193
 
194
+ SwaggerModule.setup(app, {
195
+ controllers: [HelloController],
196
+ title: "${p} API",
197
+ version: "1.0.0",
198
+ path: "/api-docs",
199
+ });
200
+
191
201
  app.get("/", (c) => c.json({ success: true, status: "healthy", timestamp: new Date().toISOString() }));
192
202
  app.get("/health", (c) => c.json({ success: true, status: "healthy", timestamp: new Date().toISOString() }));
193
203
 
@@ -210,13 +220,17 @@ function helloControllerTemplate() {
210
220
  return `import type { Context } from "hono";
211
221
  import { Controller, Get, Inject } from "@ajke/core";
212
222
  import { ResponseUtil } from "@ajke/core";
223
+ import { ApiTags, ApiOperation, ApiResponse } from "@ajke/swagger";
213
224
  import { HelloService } from "./hello.service";
214
225
 
226
+ @ApiTags("hello")
215
227
  @Controller("/hello")
216
228
  export class HelloController {
217
229
  constructor(@Inject(HelloService) private helloService: HelloService) {}
218
230
 
219
231
  @Get()
232
+ @ApiOperation({ summary: "Health greeting" })
233
+ @ApiResponse({ status: 200, description: "Returns a greeting message" })
220
234
  async greet(c: Context) {
221
235
  const message = this.helloService.greet();
222
236
  return ResponseUtil.success(c, { message });
@@ -262,6 +276,12 @@ coverage/
262
276
  *.log
263
277
  `;
264
278
  }
279
+ function pnpmWorkspaceTemplate() {
280
+ return `# This file makes pnpm treat this project as its own workspace root,
281
+ # preventing it from resolving packages against a parent workspace.
282
+ packages: []
283
+ `;
284
+ }
265
285
  function wiltConfigTemplate() {
266
286
  return `import { defineConfig } from "@ajke/core/config";
267
287
 
@@ -357,6 +377,7 @@ function runNew(args) {
357
377
  write(join(projectDir, "vitest.config.ts"), vitestConfigTemplate());
358
378
  write(join(projectDir, "worker-configuration.d.ts"), workerTypesTemplate());
359
379
  write(join(projectDir, "ajke.config.ts"), wiltConfigTemplate());
380
+ write(join(projectDir, "pnpm-workspace.yaml"), pnpmWorkspaceTemplate());
360
381
  write(join(projectDir, ".gitignore"), gitignoreTemplate());
361
382
  write(join(projectDir, ".env.example"), envExampleTemplate());
362
383
  write(join(projectDir, "drizzle.config.ts"), drizzleConfigTemplate());
@@ -390,6 +411,10 @@ function runNew(args) {
390
411
  curl http://localhost:4001/health
391
412
  curl http://localhost:4001/hello
392
413
 
414
+ API docs (Swagger UI):
415
+ http://localhost:4001/api-docs
416
+ http://localhost:4001/api-docs/json # raw OpenAPI 3.0 JSON
417
+
393
418
  Generate a new module:
394
419
  pnpm ajke generate module posts
395
420
  `);
@@ -1 +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/ajke.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 ajke: \"tsx node_modules/@ajke/cli/bin/ajke.ts\",\n },\n dependencies: {\n hono: \"^4.12.0\",\n \"@ajke/core\": \"^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 \"@ajke/cli\": \"^0.1.0\",\n \"@cloudflare/vite-plugin\": \"^1.36.0\",\n \"@cloudflare/workers-types\": \"^4.0.0\",\n \"@cloudflare/vitest-pool-workers\": \"^0.16.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 \"@ajke/core\";\nimport { requestLogger } from \"@ajke/core/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 \"@ajke/core\";\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 \"@ajke/core\";\nimport { ResponseUtil } from \"@ajke/core\";\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 \"@ajke/core\";\n\n@Injectable()\nexport class HelloService {\n greet() {\n return \"Hello from Ajke!\";\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 \"@ajke/core/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 \\`ajke 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: ajke 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 Ajke 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, \"ajke.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 ajke 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 @ajke/core import used in generated files */\nexport function wiltImportPath(): string {\n return \"@ajke/core\";\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\";\n\nexport interface WiltConfig {\n modulesDir?: string;\n srcDir?: string;\n generate?: {\n files?: Array<\"module\" | \"controller\" | \"service\" | \"dto\" | \"entity\">;\n };\n}\n\nexport interface ResolvedWiltConfig {\n modulesDir: string;\n srcDir: string;\n generate: {\n files: Array<\"module\" | \"controller\" | \"service\" | \"dto\" | \"entity\">;\n };\n}\n\nexport async function loadConfig(cwd: string = process.cwd()): Promise<ResolvedWiltConfig> {\n let userConfig: WiltConfig = {};\n\n for (const name of [\"ajke.config.ts\", \"ajke.config.js\", \"ajke.config.mjs\", \"wilt.config.ts\", \"wilt.config.js\", \"wilt.config.mjs\"]) {\n const configPath = join(cwd, name);\n if (existsSync(configPath)) {\n try {\n const mod = await import(configPath);\n userConfig = mod.default ?? {};\n } catch {\n // .ts files require tsx; compiled binary falls back to defaults\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\"],\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 ajke generate module <name> [--path <dir>] [--no-test]\n pnpm ajke generate service <name> [--path <dir>]\n pnpm ajke 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 ajke generate module payment\n pnpm ajke g m payment\n pnpm ajke generate module payment --no-test\n pnpm ajke 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 ajke add d1 <BINDING_NAME> <database-name>\n pnpm ajke add r2 <BINDING_NAME> <bucket-name>\n pnpm ajke add kv <BINDING_NAME>\n pnpm ajke add queue <BINDING_NAME> <queue-name>\n pnpm ajke add ai <BINDING_NAME>\n pnpm ajke add durable-object <BINDING_NAME> <ClassName>\n pnpm ajke add vectorize <BINDING_NAME> <index-name> [dimensions]\n pnpm ajke add browser <BINDING_NAME>\n pnpm ajke add hyperdrive <BINDING_NAME> <connection-string>\n\nExamples:\n pnpm ajke add d1 PAYMENTS_DB payments-db\n pnpm ajke add r2 ASSETS_BUCKET my-assets\n pnpm ajke add kv SESSION_KV\n pnpm ajke add queue MAIL_QUEUE mailer\n pnpm ajke add ai AI\n pnpm ajke add durable-object CHAT_ROOM ChatRoom\n pnpm ajke add vectorize VECTOR_IDX my-index 1536\n pnpm ajke add browser BROWSER\n pnpm ajke 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 ajke 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 ajke 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 ajke 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 ajke 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 ajke 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 ajke 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 ajke 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 ajke 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 ajke 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 Ajke CLI — Cloudflare Workers & Hono Framework\n`.trim();\n\nconst HELP = `\n${BANNER}\n\nUsage:\n pnpm ajke <command> [subcommand] [args...]\n\nCommands:\n new Create a new Ajke 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 ajke new my-app\n pnpm ajke generate module payment\n pnpm ajke g m payment\n pnpm ajke add d1 PAYMENTS_DB payments-db\n pnpm ajke add r2 ASSETS_BUCKET my-assets\n pnpm ajke add kv SESSION_KV\n pnpm ajke add queue MAIL_QUEUE mailer\n pnpm ajke add ai AI\n pnpm ajke 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"]}
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/ajke.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 ajke: \"tsx node_modules/@ajke/cli/bin/ajke.ts\",\n },\n dependencies: {\n hono: \"^4.12.0\",\n \"@ajke/core\": \"^0.1.0\",\n \"@ajke/swagger\": \"^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 \"@ajke/cli\": \"^0.1.0\",\n \"@cloudflare/vite-plugin\": \"^1.36.0\",\n \"@cloudflare/workers-types\": \"^4.0.0\",\n \"@cloudflare/vitest-pool-workers\": \"^0.16.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 \"@ajke/core\";\nimport { requestLogger } from \"@ajke/core/middleware\";\nimport { SwaggerModule } from \"@ajke/swagger\";\nimport { HelloModule } from \"./modules/app/hello/hello.module\";\nimport { HelloController } from \"./modules/app/hello/hello.controller\";\n\n@Module({\n imports: [HelloModule],\n})\nexport class AppModule {}\n\nconst app = createModule(AppModule, {\n middlewares: [cors(), secureHeaders(), requestLogger],\n});\n\nSwaggerModule.setup(app, {\n controllers: [HelloController],\n title: \"${p} API\",\n version: \"1.0.0\",\n path: \"/api-docs\",\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 \"@ajke/core\";\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 \"@ajke/core\";\nimport { ResponseUtil } from \"@ajke/core\";\nimport { ApiTags, ApiOperation, ApiResponse } from \"@ajke/swagger\";\nimport { HelloService } from \"./hello.service\";\n\n@ApiTags(\"hello\")\n@Controller(\"/hello\")\nexport class HelloController {\n constructor(@Inject(HelloService) private helloService: HelloService) {}\n\n @Get()\n @ApiOperation({ summary: \"Health greeting\" })\n @ApiResponse({ status: 200, description: \"Returns a greeting message\" })\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 \"@ajke/core\";\n\n@Injectable()\nexport class HelloService {\n greet() {\n return \"Hello from Ajke!\";\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\nfunction pnpmWorkspaceTemplate() {\n return `# This file makes pnpm treat this project as its own workspace root,\n# preventing it from resolving packages against a parent workspace.\npackages: []\n`;\n}\n\n\nfunction wiltConfigTemplate() {\n return `import { defineConfig } from \"@ajke/core/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 \\`ajke 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: ajke 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 Ajke 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, \"ajke.config.ts\"), wiltConfigTemplate());\n write(join(projectDir, \"pnpm-workspace.yaml\"), pnpmWorkspaceTemplate());\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 API docs (Swagger UI):\n http://localhost:4001/api-docs\n http://localhost:4001/api-docs/json # raw OpenAPI 3.0 JSON\n\n Generate a new module:\n pnpm ajke 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 @ajke/core import used in generated files */\nexport function wiltImportPath(): string {\n return \"@ajke/core\";\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\";\n\nexport interface WiltConfig {\n modulesDir?: string;\n srcDir?: string;\n generate?: {\n files?: Array<\"module\" | \"controller\" | \"service\" | \"dto\" | \"entity\">;\n };\n}\n\nexport interface ResolvedWiltConfig {\n modulesDir: string;\n srcDir: string;\n generate: {\n files: Array<\"module\" | \"controller\" | \"service\" | \"dto\" | \"entity\">;\n };\n}\n\nexport async function loadConfig(cwd: string = process.cwd()): Promise<ResolvedWiltConfig> {\n let userConfig: WiltConfig = {};\n\n for (const name of [\"ajke.config.ts\", \"ajke.config.js\", \"ajke.config.mjs\", \"wilt.config.ts\", \"wilt.config.js\", \"wilt.config.mjs\"]) {\n const configPath = join(cwd, name);\n if (existsSync(configPath)) {\n try {\n const mod = await import(configPath);\n userConfig = mod.default ?? {};\n } catch {\n // .ts files require tsx; compiled binary falls back to defaults\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\"],\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 ajke generate module <name> [--path <dir>] [--no-test]\n pnpm ajke generate service <name> [--path <dir>]\n pnpm ajke 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 ajke generate module payment\n pnpm ajke g m payment\n pnpm ajke generate module payment --no-test\n pnpm ajke 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 ajke add d1 <BINDING_NAME> <database-name>\n pnpm ajke add r2 <BINDING_NAME> <bucket-name>\n pnpm ajke add kv <BINDING_NAME>\n pnpm ajke add queue <BINDING_NAME> <queue-name>\n pnpm ajke add ai <BINDING_NAME>\n pnpm ajke add durable-object <BINDING_NAME> <ClassName>\n pnpm ajke add vectorize <BINDING_NAME> <index-name> [dimensions]\n pnpm ajke add browser <BINDING_NAME>\n pnpm ajke add hyperdrive <BINDING_NAME> <connection-string>\n\nExamples:\n pnpm ajke add d1 PAYMENTS_DB payments-db\n pnpm ajke add r2 ASSETS_BUCKET my-assets\n pnpm ajke add kv SESSION_KV\n pnpm ajke add queue MAIL_QUEUE mailer\n pnpm ajke add ai AI\n pnpm ajke add durable-object CHAT_ROOM ChatRoom\n pnpm ajke add vectorize VECTOR_IDX my-index 1536\n pnpm ajke add browser BROWSER\n pnpm ajke 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 ajke 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 ajke 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 ajke 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 ajke 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 ajke 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 ajke 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 ajke 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 ajke 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 ajke 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 Ajke CLI — Cloudflare Workers & Hono Framework\n`.trim();\n\nconst HELP = `\n${BANNER}\n\nUsage:\n pnpm ajke <command> [subcommand] [args...]\n\nCommands:\n new Create a new Ajke 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 ajke new my-app\n pnpm ajke generate module payment\n pnpm ajke g m payment\n pnpm ajke add d1 PAYMENTS_DB payments-db\n pnpm ajke add r2 ASSETS_BUCKET my-assets\n pnpm ajke add kv SESSION_KV\n pnpm ajke add queue MAIL_QUEUE mailer\n pnpm ajke add ai AI\n pnpm ajke 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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ajke/cli",
3
- "version": "0.1.11",
3
+ "version": "0.1.13",
4
4
  "type": "module",
5
5
  "description": "CLI for the Ajke framework — scaffold Cloudflare Workers projects",
6
6
  "keywords": [