@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.
- package/bin/commands/new.ts +26 -0
- package/dist/bin/ajke.js +25 -0
- package/dist/bin/ajke.js.map +1 -1
- package/package.json +1 -1
package/bin/commands/new.ts
CHANGED
|
@@ -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
|
`);
|
package/dist/bin/ajke.js.map
CHANGED
|
@@ -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"]}
|