import { existsSync, mkdirSync, writeFileSync } from "node:fs"; import { dirname, join, resolve } from "node:path"; import { runGenerateResource } from "./generate.ts"; const FEATURES: Record> = { queue: { "app/queues/example.ts": `import { defineQueue } from "@wrnexus/queue";\n\nexport default defineQueue({\n name: "example",\n jobs: {\n run: {\n run: async (data: { id: string }) => { console.log("job", data.id); },\n success: async (data) => { console.log("completed", data.id); },\n failed: async (data, error) => { console.error("failed", data.id, error); },\n },\n },\n});\n`, }, mail: { "app/lib/mail.ts": `import { defineMail } from "@wrnexus/mail";\n\nexport const mail = defineMail({\n from: process.env.MAIL_FROM,\n driver: { send: async () => { throw new Error("Configure a mail driver"); } },\n sandbox: { enabled: process.env.NODE_ENV !== "production", allowlist: [] },\n});\n`, }, seed: { "app/db/seed.ts": `import { addSeedData, defineSeed } from "@wrnexus/db";\n\nexport default defineSeed(async (db) => {\n await addSeedData(db, { name: "Example" }, "examples", { conflict: "ignore" });\n});\n`, }, testing: { "test/app.test.ts": `import { expect, test } from "bun:test";\nimport { createTestApp } from "@wrnexus/test";\n\ntest("app boots", async () => {\n const app = await createTestApp(import.meta.dir + "/..");\n expect((await app.fetch("/healthz")).ok).toBe(true);\n app.close();\n});\n`, }, }; export function runAdd(root: string, feature: string | undefined, name?: string) { if (feature === "resource") return runGenerateResource(root, name); const files = feature ? FEATURES[feature] : undefined; if (!files) throw new Error(`Use wrnexus add ${Object.keys(FEATURES).join(" | ")} | resource `); for (const [relative, content] of Object.entries(files)) { const target = join(resolve(root), relative); if (existsSync(target)) { console.log(`• ${relative} exists — skipped`); continue; } mkdirSync(dirname(target), { recursive: true }); writeFileSync(target, content, "utf8"); console.log(`✓ Added ${relative}`); } }