import { getLayerAssetRef, ProjectFileSchema, type Project, type ProjectFile, } from "@pien-studio/types"; import { normalizeProject } from "./normalize"; export function serializeProjectFile( project: Project, options?: { checkpointCount?: number }, ): string { const normalized = normalizeProject(project); const document: ProjectFile = { format: "pien.project", version: 2, exportedAt: new Date().toISOString(), app: { name: "pien.studio", platform: "web" }, project: normalized, assets: normalized.layers.flatMap((layer) => { const asset = getLayerAssetRef(layer); if (!asset) return []; if (asset.kind === "stored") { return [ { id: asset.id, kind: layer.type === "sticker" ? ("sticker" as const) : ("image" as const), name: layer.name ?? layer.id, uri: `asset:${asset.id}`, }, ]; } return [ { id: layer.id, kind: layer.type === "sticker" ? ("sticker" as const) : ("image" as const), name: layer.name ?? layer.id, uri: asset.uri, }, ]; }), history: { checkpointCount: options?.checkpointCount ?? 0 }, }; return JSON.stringify(document, null, 2); } export function parseProjectFile( raw: string, ): { ok: true; project: Project } | { ok: false; error: string } { try { const data = JSON.parse(raw) as unknown; const result = ProjectFileSchema.safeParse(data); if (result.success) return { ok: true, project: normalizeProject(result.data.project) }; return { ok: false, error: "Invalid project format" }; } catch { return { ok: false, error: "Invalid JSON" }; } }