import { expect } from "vitest"; import { imageExportModule } from "../modules/built-ins/image-export/image-export-module"; import { svgExportModule } from "../modules/built-ins/svg-export/svg-export-module"; import { videoExportModule } from "../modules/built-ins/video-export/video-export-module"; import type { ToolcraftProductBase } from "./product-base"; import type { ToolcraftControlSchema } from "./types"; export function createProductBaseFixture( controls: Record = { intensity: { applicability: { mode: "always" as const }, defaultValue: 50, label: "Intensity", max: 100, min: 0, target: "product.intensity", type: "slider", }, }, ): ToolcraftProductBase { return { canvas: { draggable: true, enabled: true, size: { height: 240, unit: "px", width: 360 }, sizing: { mode: "editable-output" }, }, identity: { id: "module-composition", title: "Module Composition" }, panels: { controls: { sections: [{ controls, id: "product", title: "Product" }], title: "Module Composition", }, }, persistence: { additionalValueTargets: ["product.seed"], storage: "localStorage", }, settingsTransfer: { additionalValueTargets: ["product.seed"], fileName: "module-settings.json", }, toolbar: { history: true, radar: true, theme: true, zoom: true }, }; } export function cloneUnsafeProductBaseFixture( base: ToolcraftProductBase, ): Record { return structuredClone(base) as Record; } export function expectProductFixtureRecursivelyFrozen(value: unknown): void { if (value === null || typeof value !== "object") return; expect(Object.isFrozen(value)).toBe(true); for (const child of Object.values(value)) { expectProductFixtureRecursivelyFrozen(child); } } export const artifactModuleFixtures = Object.freeze([ imageExportModule(), svgExportModule(), videoExportModule(), ]);