@ajke/cli 0.1.1 → 0.1.12

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.
@@ -284,6 +284,13 @@ coverage/
284
284
  `;
285
285
  }
286
286
 
287
+ function pnpmWorkspaceTemplate() {
288
+ return `# This file makes pnpm treat this project as its own workspace root,
289
+ # preventing it from resolving packages against a parent workspace.
290
+ packages: []
291
+ `;
292
+ }
293
+
287
294
 
288
295
  function wiltConfigTemplate() {
289
296
  return `import { defineConfig } from "@ajke/core/config";
@@ -395,6 +402,7 @@ export function runNew(args: string[]): void {
395
402
  write(join(projectDir, "vitest.config.ts"), vitestConfigTemplate());
396
403
  write(join(projectDir, "worker-configuration.d.ts"), workerTypesTemplate());
397
404
  write(join(projectDir, "ajke.config.ts"), wiltConfigTemplate());
405
+ write(join(projectDir, "pnpm-workspace.yaml"), pnpmWorkspaceTemplate());
398
406
  write(join(projectDir, ".gitignore"), gitignoreTemplate());
399
407
  write(join(projectDir, ".env.example"), envExampleTemplate());
400
408
  write(join(projectDir, "drizzle.config.ts"), drizzleConfigTemplate());
package/dist/bin/ajke.js CHANGED
@@ -262,6 +262,12 @@ coverage/
262
262
  *.log
263
263
  `;
264
264
  }
265
+ function pnpmWorkspaceTemplate() {
266
+ return `# This file makes pnpm treat this project as its own workspace root,
267
+ # preventing it from resolving packages against a parent workspace.
268
+ packages: []
269
+ `;
270
+ }
265
271
  function wiltConfigTemplate() {
266
272
  return `import { defineConfig } from "@ajke/core/config";
267
273
 
@@ -357,6 +363,7 @@ function runNew(args) {
357
363
  write(join(projectDir, "vitest.config.ts"), vitestConfigTemplate());
358
364
  write(join(projectDir, "worker-configuration.d.ts"), workerTypesTemplate());
359
365
  write(join(projectDir, "ajke.config.ts"), wiltConfigTemplate());
366
+ write(join(projectDir, "pnpm-workspace.yaml"), pnpmWorkspaceTemplate());
360
367
  write(join(projectDir, ".gitignore"), gitignoreTemplate());
361
368
  write(join(projectDir, ".env.example"), envExampleTemplate());
362
369
  write(join(projectDir, "drizzle.config.ts"), drizzleConfigTemplate());
@@ -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 \"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\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 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.1",
3
+ "version": "0.1.12",
4
4
  "type": "module",
5
5
  "description": "CLI for the Ajke framework — scaffold Cloudflare Workers projects",
6
6
  "keywords": [