import { mkdir, writeFile } from "node:fs/promises"; import { join } from "node:path"; import type { RuntimeArtifacts } from "@arconym/core"; export interface ArtifactGenerationOptions { artifacts: RuntimeArtifacts; outputDir: string; } export interface GeneratedArtifactFile { stage: "schema" | "ops" | "orm" | "react"; plugin: string; filePath: string; } const STAGE_KEYS: GeneratedArtifactFile["stage"][] = ["schema", "ops", "orm", "react"]; export async function writeGeneratedArtifacts(options: ArtifactGenerationOptions): Promise { const { artifacts, outputDir } = options; await mkdir(outputDir, { recursive: true }); const written: GeneratedArtifactFile[] = []; for (const stage of STAGE_KEYS) { const stageArtifacts = artifacts[stage]; if (!stageArtifacts || typeof stageArtifacts !== "object") continue; const stageDir = join(outputDir, stage); await mkdir(stageDir, { recursive: true }); for (const [pluginName, artifact] of Object.entries(stageArtifacts as Record)) { if (artifact === undefined) continue; const filePath = join(stageDir, `${sanitizeFileName(pluginName)}.json`); const payload = JSON.stringify(artifact, null, 2); await writeFile(filePath, `${payload}\n`, "utf8"); written.push({ stage, plugin: pluginName, filePath }); } } return written; } function sanitizeFileName(name: string): string { return name.replace(/[^a-zA-Z0-9._-]+/g, "-"); }