export const COMMENT_DESIGN_VARIANTS_KEY = "designVariants"; export type PrototypeCommentDesignVariantCapture = { getVariant: () => string; setVariant: (value: string) => void; }; export function augmentLiveStateWithDesignVariants( live: unknown, designVariants: Record, ): Record { return { ...(typeof live === "object" && live !== null ? (live as Record) : {}), [COMMENT_DESIGN_VARIANTS_KEY]: designVariants, }; } export function splitDesignVariants(live: unknown): { designVariants: Record | undefined; prototypeLive: unknown; } { if (typeof live !== "object" || live === null) { return { designVariants: undefined, prototypeLive: live }; } const state = live as Record; const raw = state[COMMENT_DESIGN_VARIANTS_KEY]; const designVariants = raw && typeof raw === "object" && !Array.isArray(raw) ? Object.fromEntries( Object.entries(raw as Record).filter( (entry): entry is [string, string] => typeof entry[1] === "string", ), ) : undefined; const { [COMMENT_DESIGN_VARIANTS_KEY]: _removed, ...prototypeLive } = state; return { designVariants, prototypeLive }; } export function restoreDesignVariants( designVariants: Record | undefined, captures: ReadonlyMap, ): void { if (!designVariants) return; for (const [variantSetId, value] of Object.entries(designVariants)) { captures.get(variantSetId)?.setVariant(value); } } export function collectDesignVariants( captures: ReadonlyMap, ): Record { const designVariants: Record = {}; captures.forEach((capture, variantSetId) => { designVariants[variantSetId] = capture.getVariant(); }); return designVariants; }