36 lines
2.1 KiB
TypeScript
36 lines
2.1 KiB
TypeScript
import { existsSync, mkdirSync, writeFileSync } from "node:fs";
|
|
import { dirname, join, resolve } from "node:path";
|
|
import { runGenerateResource } from "./generate.ts";
|
|
|
|
const FEATURES: Record<string, Record<string, string>> = {
|
|
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 <name>`);
|
|
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}`);
|
|
}
|
|
}
|