From 0185201cbddd720afc8f96fee76f12763de31136 Mon Sep 17 00:00:00 2001 From: zuiidea Date: Tue, 14 Apr 2026 22:29:50 +0800 Subject: [PATCH] feat(create): load examples manifest from dist/examples.json Made-with: Cursor --- packages/create/src/examples.ts | 35 +++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 packages/create/src/examples.ts diff --git a/packages/create/src/examples.ts b/packages/create/src/examples.ts new file mode 100644 index 0000000..919e7ab --- /dev/null +++ b/packages/create/src/examples.ts @@ -0,0 +1,35 @@ +import fs from "node:fs"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; +import { CliError } from "./errors.js"; + +export type ExamplesManifest = { examples: string[] }; + +export function loadExamplesManifest(): string[] { + const manifestPath = path.join( + path.dirname(fileURLToPath(import.meta.url)), + "examples.json" + ); + if (!fs.existsSync(manifestPath)) { + throw new CliError( + `Missing ${manifestPath}. Run pnpm run build in packages/create.`, + "INVALID_INPUT" + ); + } + const data = JSON.parse( + fs.readFileSync(manifestPath, "utf8") + ) as ExamplesManifest; + if (!Array.isArray(data.examples) || data.examples.length === 0) { + throw new CliError("Invalid examples.json", "INVALID_INPUT"); + } + return data.examples; +} + +export function assertValidExample(name: string, list: string[]): void { + if (!list.includes(name)) { + throw new CliError( + `Unknown example "${name}". Valid: ${list.join(", ")}`, + "INVALID_INPUT" + ); + } +}