{
  "version": 3,
  "sources": ["../../src/document/components/canvas/CanvasEventTargetId.ts", "../../src/document/components/tools/getEmptySpaceRect.ts", "../../src/document/models/CanvasTree/traits/WithPreviouslyUsedPluginVariableIds.ts", "../../../../plugin-api/src/assets.ts", "../../src/utils/getSidebarModuleIdentifierByModuleURL.ts", "../../src/plugins/utils/modules.ts", "../../src/plugins/utils/convertPluginHTMLToVekterHTML.ts", "../../src/plugins/utils/convertVekterHTMLToPluginHTML.ts", "../../src/document/components/chrome/shared/localeSuggestions.ts", "../../src/plugins/utils/modes.ts", "../../src/document/utils/isLocalizedValueManagedByPlugin.ts", "../../../../plugin-api/src/variables.ts", "../../../../plugin-api/src/computedValues.ts", "../../../../plugin-api/src/fonts.ts", "../../../../plugin-api/src/gradients.ts", "../../../../plugin-api/src/styles.ts", "../../../../plugin-api/src/unmarshal.ts", "../../../../plugin-api/src/collections.ts", "../../src/plugins/utils/processWhenConnected.ts", "../../src/plugins/localization.ts", "../../src/plugins/fonts.ts", "../../../../plugin-api/src/css.ts", "../../src/plugins/css.ts", "../../src/plugins/getVekterStyleDataFromPlugin.ts", "../../src/plugins/stylesValidation.ts", "../../src/plugins/styles.ts", "../../src/plugins/utils/mapHelpers.ts", "../../src/plugins/verifyExternalPluginCollectionItemId.ts", "../../src/plugins/collections.ts", "../../src/utils/moduleVersions.ts", "../../src/utils/shaderFiles.ts", "../../src/document/components/tools/utils/gridCreateHelper.ts", "../../src/document/components/chrome/properties/panels/utils/stackAndGridLayoutActions.ts", "../../src/document/components/utils/updateRichTextLink.ts", "../../src/document/components/utils/getThemeOverrideMode.ts"],
  "sourcesContent": ["export const CanvasEventTargetId = \"CanvasEventTarget\"\n", "import type { CanvasTree, LoadedScopeNode } from \"document/models/CanvasTree/index.ts\"\nimport { isSmartComponentNode, isWebPageNode } from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport { getBoundingFrameForNodes } from \"document/models/CanvasTree/utils/geometry.ts\"\nimport { getNodesInRect } from \"document/models/CanvasTree/utils/hitTesting.ts\"\nimport type { Rect } from \"library/render/types/Rect.ts\"\nimport { isNumber } from \"utils/typeChecks.ts\"\n\nexport function getEmptySpaceRect(tree: CanvasTree, width: number, height: number, activeScope: LoadedScopeNode): Rect {\n\tlet x = 0\n\tlet y = 0\n\n\tif (isWebPageNode(activeScope) || isSmartComponentNode(activeScope)) {\n\t\tconst primaryVariant = activeScope.getPrimaryVariant()\n\t\tif (isNumber(primaryVariant.top)) {\n\t\t\ty = primaryVariant.top\n\t\t}\n\t\tif (isNumber(primaryVariant.left)) {\n\t\t\tx = primaryVariant.left - width - 100\n\t\t}\n\t}\n\n\t// eslint-disable-next-line no-constant-condition\n\twhile (true) {\n\t\tconst frame = { x, y, width, height }\n\n\t\tconst intersectingNodes = getNodesInRect(tree, activeScope, frame, true)\n\t\t// If there is no intersecting node we can insert at this place.\n\t\tif (intersectingNodes.length === 0) return frame\n\n\t\t// Otherwise, move to the left and find an empty space.\n\t\tconst intersectingFrame = getBoundingFrameForNodes(tree, intersectingNodes)\n\t\tx = intersectingFrame.x - width - 100\n\t}\n}\n", "import type { WithFieldId } from \"#framer-plugin/collections.ts\"\nimport type { NodeId } from \"#framer-plugin/traits.ts\"\nimport type { CanvasTree } from \"../CanvasTree.ts\"\nimport { getContentManagementNode } from \"../nodes/ContentManagementNode.utils.ts\"\nimport {\n\ttype VariableDefinition,\n\ttype VariableID,\n\ttype VariableType,\n\tisAnyCollectionReferencingVariableDefinition,\n} from \"./WithVariables.ts\"\n\nconst separator = \"__\" as const\ntype Separator = typeof separator\n\ntype PluginFieldReferencedCollectionId = NodeId\ntype PluginFieldExternalId = WithFieldId[\"id\"]\ntype PluginVariableIdKey =\n\t| `${VariableType}${Separator}${PluginFieldExternalId}`\n\t| `${VariableType}${Separator}${PluginFieldExternalId}${Separator}${PluginFieldReferencedCollectionId}`\nexport type PluginVariableIds = Record<PluginVariableIdKey, VariableID>\n\ninterface GetPluginVariableIdKeyArgs {\n\ttype: VariableType\n\texternalId: PluginFieldExternalId\n\treferencedCollectionId: PluginFieldReferencedCollectionId | undefined\n}\n\nfunction getPluginVariableIdKey({\n\ttype,\n\texternalId,\n\treferencedCollectionId,\n}: GetPluginVariableIdKeyArgs): PluginVariableIdKey {\n\tif (!referencedCollectionId) return `${type}${separator}${externalId}`\n\treturn `${type}${separator}${externalId}${separator}${referencedCollectionId}`\n}\n\nexport function getPluginVariableIdKeyFromVariable(\n\ttree: CanvasTree,\n\tvariable: VariableDefinition,\n): PluginVariableIdKey | null {\n\tif (!variable.externalId) return null\n\n\tif (isAnyCollectionReferencingVariableDefinition(variable)) {\n\t\tconst contentManagedNode = getContentManagementNode(tree)\n\t\tif (!contentManagedNode || !contentManagedNode.isLoaded()) return null\n\n\t\tfor (const collection of contentManagedNode.children) {\n\t\t\tif (collection.instanceIdentifier === variable.dataIdentifier) {\n\t\t\t\treturn getPluginVariableIdKey({\n\t\t\t\t\ttype: variable.type,\n\t\t\t\t\texternalId: variable.externalId,\n\t\t\t\t\treferencedCollectionId: collection.id,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\treturn null\n\t}\n\n\treturn getPluginVariableIdKey({\n\t\ttype: variable.type,\n\t\texternalId: variable.externalId,\n\t\treferencedCollectionId: undefined,\n\t})\n}\n\nexport interface WithPluginVariableIds {\n\t/**\n\t * Previously used variable IDs so we can reuse them when a field re-appears\n\t * with the same type and external ID.\n\t *\n\t * This is useful because we don't clean up any references when deleting a\n\t * field, but rather do it when there's an attempt to resolve the reference.\n\t * Such fields will become undefined on the canvas, but re-enabling makes\n\t * them work again as long as the original references weren't removed.\n\t *\n\t * More context on Slack:\n\t * https://framer-team.slack.com/archives/C06L5H5ADK2/p1735668999683269\n\t */\n\tpluginVariableIds?: PluginVariableIds\n}\n", "import type { Prettify } from \"./Prettify.ts\"\nimport type { PluginEngine } from \"./engine.ts\"\nimport { $framerInternal } from \"./internal.ts\"\nimport type { ImageRendering } from \"./traits.ts\"\nimport { classKey, isObject, isString } from \"./utils.ts\"\n\nexport type AssetId = string\n\nexport interface AssetIdentifier {\n\tid: string\n}\n\ninterface WithOptionalName {\n\tname?: string\n}\n\ninterface AssetData extends WithOptionalName {\n\t/** Something that can be rendered within the iFrame. Always the original size of the image */\n\turl: string\n}\n\nexport interface ImageOptions {\n\t/**\n\t * The image rendering to use.\n\t * Defaults to \"auto\"\n\t */\n\tpreferredImageRendering?: ImageRendering\n\t/**\n\t * The alt text to use for the image.\n\t */\n\taltText?: string\n\t/**\n\t * The resolution to use for the image.\n\t * Defaults to \"auto\"\n\t */\n\tresolution?: Resolution\n}\n\ninterface FileAssetDataFields extends AssetData {\n\textension: string | null\n}\n\nconst fileAssetDiscriminator = \"FileAsset\" as const\n\nexport interface FileAssetData extends AssetIdentifier, FileAssetDataFields {\n\t[classKey]: typeof fileAssetDiscriminator\n}\n\nexport function isFileAssetData(data: unknown): data is FileAssetData {\n\tif (!isObject(data)) return false\n\n\treturn data[classKey] === fileAssetDiscriminator\n}\n\n/**\n * A file asset uploaded to the Framer project.\n * @category canvas\n */\nexport class FileAsset implements AssetIdentifier, FileAssetDataFields {\n\treadonly id: AssetId\n\treadonly url: string\n\treadonly extension: string | null\n\n\tconstructor(data: FileAssetData) {\n\t\tthis.url = data.url\n\t\tthis.id = data.id\n\t\tthis.extension = data.extension\n\t}\n\n\tstatic [$framerInternal.unmarshal](_: PluginEngine, data: FileAssetData): FileAsset {\n\t\treturn new FileAsset(data)\n\t}\n\n\t[$framerInternal.marshal](): FileAssetData {\n\t\treturn {\n\t\t\t[classKey]: \"FileAsset\",\n\t\t\tid: this.id,\n\t\t\turl: this.url,\n\t\t\textension: this.extension,\n\t\t}\n\t}\n}\n\nexport function isFileAsset(value: unknown): value is FileAsset {\n\treturn value instanceof FileAsset\n}\n\ninterface ImageDataFields extends AssetData {\n\t/**\n\t * Thumbnail URL of the image.\n\t */\n\tthumbnailUrl: string\n\t/**\n\t * Optional Alt Text of the image.\n\t */\n\taltText?: string\n\t/**\n\t * The resolution set on the image. Defaults to \"auto\"\n\t */\n\tresolution: Resolution\n}\n\nconst imageAssetDiscriminator = \"ImageAsset\" as const\n\nexport interface ImageAssetData extends AssetIdentifier, ImageDataFields {\n\t[classKey]: typeof imageAssetDiscriminator\n}\n\nexport function isImageAssetData(data: unknown): data is ImageAssetData {\n\tif (!isObject(data)) return false\n\n\treturn data[classKey] === imageAssetDiscriminator\n}\n\ninterface Size {\n\t/** Same as [HTMLImageElement.naturalWidth](https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement/naturalWidth).\n\t *\n\t * **Warning**: May be zero!\n\t */\n\twidth: number\n\t/** Same as [HTMLImageElement.naturalHeight](https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement/naturalHeight).\n\t *\n\t * **Warning**: May be zero!\n\t */\n\theight: number\n}\n\n/**\n * An image that has been uploaded to the Framer project. Provides methods\n * to access image data, measure dimensions, and load as bitmap or HTML element.\n * @category canvas\n */\nexport class ImageAsset implements ImageDataFields, AssetIdentifier {\n\treadonly id: AssetId\n\treadonly url: string\n\treadonly thumbnailUrl: string\n\treadonly altText: string | undefined\n\treadonly resolution: Resolution\n\n\t#imageData: BytesData | undefined\n\n\t#engine: PluginEngine\n\n\tconstructor(engine: PluginEngine, data: ImageAssetData) {\n\t\tthis.#engine = engine\n\n\t\tthis.url = data.url\n\t\tthis.id = data.id\n\t\tthis.thumbnailUrl = data.thumbnailUrl\n\t\tthis.altText = data.altText\n\t\tthis.resolution = data.resolution\n\t}\n\n\tstatic [$framerInternal.unmarshal](engine: PluginEngine, data: ImageAssetData): ImageAsset {\n\t\treturn new ImageAsset(engine, data)\n\t}\n\n\t[$framerInternal.marshal](): ImageAssetData {\n\t\treturn {\n\t\t\t[classKey]: \"ImageAsset\",\n\t\t\tid: this.id,\n\t\t\turl: this.url,\n\t\t\tthumbnailUrl: this.thumbnailUrl,\n\t\t\taltText: this.altText,\n\t\t\tresolution: this.resolution,\n\t\t}\n\t}\n\n\t/**\n\t * Clone this image asset, optionally overriding `altText` or `resolution`.\n\t * The clone shares the same underlying image data.\n\t */\n\tcloneWithAttributes({\n\t\taltText,\n\t\tresolution,\n\t}: Prettify<Partial<Pick<ImageAssetData, \"altText\" | \"resolution\">>>): ImageAsset {\n\t\treturn new ImageAsset(this.#engine, {\n\t\t\t[classKey]: \"ImageAsset\",\n\t\t\tid: this.id,\n\t\t\turl: this.url,\n\t\t\tthumbnailUrl: this.thumbnailUrl,\n\t\t\taltText: altText ?? this.altText,\n\t\t\tresolution: resolution ?? this.resolution,\n\t\t})\n\t}\n\n\t/**\n\t * Measure this image's natural dimensions.\n\t *\n\t * @returns The width and height in pixels. Warning: values may be zero.\n\t */\n\tasync measure(): Promise<Size> {\n\t\treturn measureImage(this.url)\n\t}\n\n\t/**\n\t * Get the data such as the bytes of the image. The bytes can be used to manipulate the pixels\n\t * of the image.\n\t */\n\tasync getData(): Promise<BytesData> {\n\t\tif (\n\t\t\tthis.#imageData &&\n\t\t\t// When data is transfered over postMessage (instead of the structured clone, which is default)\n\t\t\t// The array buffer becomes empty on the sending side.\n\t\t\t// In these cases we need to load the bytes again.\n\t\t\tthis.#imageData.bytes.length > 0\n\t\t) {\n\t\t\treturn this.#imageData\n\t\t}\n\n\t\tconst data = await this.#engine.invoke(\"getImageData\", { id: this.id, resolution: this.resolution })\n\n\t\tif (!data) {\n\t\t\tthrow new Error(\"Failed to load image data\")\n\t\t}\n\n\t\tthis.#imageData = data\n\n\t\treturn data\n\t}\n\n\t/**\n\t * Load this image as `ImageBitmap`.\n\t */\n\tasync loadBitmap(): Promise<ImageBitmap> {\n\t\tconst { mimeType, bytes } = await this.getData()\n\t\tconst blob = new Blob([bytes], { type: mimeType })\n\t\treturn createImageBitmap(blob)\n\t}\n\n\t/**\n\t * Load this image as `HTMLImageElement`.\n\t */\n\tasync loadImage(): Promise<HTMLImageElement> {\n\t\tconst data = await this.getData()\n\t\tconst url = URL.createObjectURL(new Blob([data.bytes]))\n\n\t\treturn new Promise<HTMLImageElement>((resolve, reject) => {\n\t\t\tconst img = new Image()\n\t\t\timg.onload = () => resolve(img)\n\t\t\timg.onerror = () => reject()\n\t\t\timg.src = url\n\t\t})\n\t}\n}\n\nexport function isImageAsset(value: unknown): value is ImageAsset {\n\treturn value instanceof ImageAsset\n}\n\nexport type AssetInput = string | File | BytesData\n\nexport interface NamedImageAssetInput extends ImageData {\n\timage: AssetInput\n}\n\nexport interface NamedFileAssetInput extends WithOptionalName {\n\tfile: AssetInput\n}\n\ninterface AssetURLDataTransfer {\n\ttype: \"url\"\n\turl: string\n}\n\nexport interface BytesData {\n\tbytes: Uint8Array<ArrayBuffer>\n\tmimeType: string\n}\n\ntype BytesDataTransfer = BytesData & { type: \"bytes\" }\n\nexport type Resolution = \"auto\" | \"lossless\" | \"small\" | \"medium\" | \"large\" | \"full\"\n\nexport interface ImageData extends WithOptionalName, ImageOptions {}\n\nexport type AssetDataTransfer = AssetURLDataTransfer | BytesDataTransfer\nexport type NamedImageTransfer = AssetDataTransfer & ImageData\nexport type NamedAssetTransfer = AssetDataTransfer & WithOptionalName\n\nexport interface SVGData extends WithOptionalName {\n\tsvg: string\n}\n\nexport function getTransferable(data: AssetDataTransfer): Transferable[] {\n\tif (data.type === \"bytes\") {\n\t\treturn [data.bytes.buffer]\n\t}\n\n\treturn []\n}\n\nfunction isBytesData(value: unknown): value is BytesData {\n\tif (!isObject(value)) return false\n\n\tconst bytesKey: keyof BytesData = \"bytes\"\n\tconst mimeTypeKey: keyof BytesData = \"mimeType\"\n\n\tif (!(bytesKey in value)) return false\n\tif (!(mimeTypeKey in value)) return false\n\n\tif (!(value[bytesKey] instanceof Uint8Array)) return false\n\tif (!isString(value[mimeTypeKey])) return false\n\n\treturn true\n}\n\nexport async function createImageTransferFromInput(input: NamedImageAssetInput | File): Promise<NamedImageTransfer> {\n\tif (input instanceof File) {\n\t\treturn getAssetDataFromFile(input)\n\t}\n\n\tconst assetData = await createAssetTransferFromAssetInput(input.image)\n\n\treturn {\n\t\tname: input.name,\n\t\taltText: input.altText,\n\t\tresolution: input.resolution,\n\t\tpreferredImageRendering: input.preferredImageRendering,\n\t\t...assetData,\n\t}\n}\n\nexport async function createFileTransferFromInput(input: NamedFileAssetInput | File): Promise<NamedAssetTransfer> {\n\tif (input instanceof File) {\n\t\treturn getAssetDataFromFile(input)\n\t}\n\n\tconst assetData = await createAssetTransferFromAssetInput(input.file)\n\n\treturn {\n\t\tname: input.name,\n\t\t...assetData,\n\t}\n}\n\nasync function createAssetTransferFromAssetInput(input: AssetInput): Promise<AssetDataTransfer> {\n\tif (input instanceof File) {\n\t\treturn getAssetDataFromFile(input)\n\t}\n\n\tif (isBytesData(input)) {\n\t\treturn {\n\t\t\ttype: \"bytes\",\n\t\t\tmimeType: input.mimeType,\n\t\t\tbytes: input.bytes,\n\t\t}\n\t}\n\n\treturn {\n\t\ttype: \"url\",\n\t\turl: input,\n\t}\n}\n\nexport function createNamedAssetDataTransferFromInput(\n\tinput: readonly NamedImageAssetInput[],\n): Promise<NamedImageTransfer[]> {\n\treturn Promise.all(input.map(createImageTransferFromInput))\n}\n\ntype ImageMimeType = `image/${string}`\nexport function assertIsImageMimeType(mimeType: string): asserts mimeType is ImageMimeType {\n\tif (!mimeType.startsWith(\"image/\")) {\n\t\tthrow new Error(`Unsupported mime type: ${mimeType}`)\n\t}\n}\n\n/**\n *  Returns the bytes bytes and mime type of a file from a given File object\n */\nexport async function getAssetDataFromFile(file: File): Promise<AssetDataTransfer & WithOptionalName> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst reader = new FileReader()\n\t\treader.onload = event => {\n\t\t\tconst type = file.type\n\n\t\t\tconst arrayBuffer = event.target?.result\n\t\t\tif (!arrayBuffer || !(arrayBuffer instanceof ArrayBuffer)) {\n\t\t\t\treject(new Error(\"Failed to read file, arrayBuffer is null\"))\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst bytes = new Uint8Array(arrayBuffer)\n\n\t\t\tresolve({ bytes, mimeType: type, type: \"bytes\", name: file.name })\n\t\t}\n\t\treader.onerror = error => {\n\t\t\treject(error)\n\t\t}\n\t\treader.readAsArrayBuffer(file)\n\t})\n}\n\nexport async function measureImage(input: File | string): Promise<Size> {\n\tconst isFileInput = input instanceof File\n\tconst src = isFileInput ? URL.createObjectURL(input) : input\n\n\tconst image = new Image()\n\timage.crossOrigin = \"anonymous\"\n\n\treturn new Promise<Size>((resolve, reject) => {\n\t\timage.onload = () => {\n\t\t\tresolve({ width: image.naturalWidth, height: image.naturalHeight })\n\t\t}\n\n\t\timage.onerror = error => {\n\t\t\treject(error)\n\t\t}\n\n\t\timage.src = src\n\t}).finally(() => {\n\t\tif (isFileInput) URL.revokeObjectURL(src)\n\t})\n}\n", "import type { VekterEngine } from \"document/VekterEngine.ts\"\nimport { getModuleIdentifierForItem } from \"document/components/chrome/insertSidebar/types.ts\"\nimport { assert } from \"library/utils/assert.ts\"\nimport { isExternalModuleNode } from \"../document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\n\nexport function getSidebarModuleIdentifierByModuleURL(engine: VekterEngine, moduleURL: string) {\n\tconst item = engine.stores.insertSidebarStore.getItemByURL(moduleURL)\n\tassert(item, \"Can't find insert sidebar item for module URL\")\n\tconst module = item.module\n\tassert(module, \"Can't find module for insert sidebar item\")\n\n\tconst moduleNode = engine.tree.getNodeWithTrait(module.id, isExternalModuleNode)\n\tif (moduleNode) {\n\t\treturn moduleNode.codeComponentIdentifier\n\t} else {\n\t\tconst moduleIdentifier = getModuleIdentifierForItem(item)\n\t\tassert(moduleIdentifier, \"Can't get module identifier for insert sidebar item\")\n\t\treturn moduleIdentifier.value\n\t}\n}\n", "import type { VekterEngine } from \"document/VekterEngine.ts\"\nimport { htmlUnescape } from \"document/models/CanvasTree/traits/utils/applyValueTransform.ts\"\nimport type { ControlProps } from \"document/models/controlProps/ControlProp.ts\"\nimport { getControlProp } from \"document/models/controlProps/getControlProps.ts\"\nimport { escapeHTML } from \"library/render/utils/dom.ts\"\nimport { assert } from \"library/utils/assert.ts\"\nimport { CMS_MODULE_TAG } from \"prosemirror/schema/module.ts\"\nimport type { Mutable } from \"utils/Mutable.ts\"\nimport { getSidebarModuleIdentifierByModuleURL } from \"utils/getSidebarModuleIdentifierByModuleURL.ts\"\nimport { moduleComponents } from \"utils/moduleComponents.ts\"\nimport { parseHTML } from \"utils/parseHTML.ts\"\nimport { isString } from \"utils/typeChecks.ts\"\n\nexport interface SupportedModule<Element extends HTMLElement = HTMLElement> {\n\turl: string\n\tpropsToElement: (props: Record<string, unknown>) => Element\n\telementToProps: (element: Element) => Record<string, unknown>\n}\n\nconst VIMEO_ID_REGEX = /vimeo\\.com\\/(?<videoId>[^?]+)/u\nconst VIMEO_EMBED_ID_REGEX = /video\\/(?<videoId>[^?]+)/u\nconst YOUTUBE_ID_REGEX = /(?:youtu\\.be\\/|youtube\\.com\\/(?:watch\\?v=|embed\\/))(?<videoId>[^?&]+)/u\nconst YOUTUBE_EMBED_ID_REGEX = /embed\\/(?<videoId>[^?]+)/u\nconst TRAILING_NEWLINES_REGEX = /\\n+$/\n\nexport const codeBlockModule: SupportedModule<HTMLPreElement> = {\n\turl: moduleComponents.codeblock.moduleURL,\n\tpropsToElement: ({ code, language }) => {\n\t\tassert(isString(code), \"Invalid code\")\n\t\tconst escapedCode = escapeHTML(code)\n\n\t\tconst pre = parseHTML(`<pre data-language=\"${language}\"><code>${escapedCode}</code></pre>`).querySelector(\"pre\")\n\t\tassert(pre, \"Failed to generate code block\")\n\n\t\treturn pre\n\t},\n\telementToProps: element => {\n\t\tconst rawCode = element.querySelector(\"code\")?.innerHTML || \"\"\n\t\tconst language = element.getAttribute(\"data-language\") || \"\"\n\n\t\t// Clean up trailing newlines from the code\n\t\tconst code = htmlUnescape(rawCode).replace(TRAILING_NEWLINES_REGEX, \"\")\n\n\t\treturn { code, language }\n\t},\n}\n\nexport const vimeoModule: SupportedModule<HTMLIFrameElement> = {\n\turl: moduleComponents.vimeo.moduleURL,\n\tpropsToElement: ({ video, controls, autoplay, loop, mute }) => {\n\t\tassert(isString(video), \"Invalid video URL\")\n\t\tconst videoId = VIMEO_ID_REGEX.exec(video)?.groups?.videoId || \"\"\n\t\tassert(videoId, `Invalid video URL: ${video}`)\n\n\t\tconst params = new URLSearchParams()\n\t\tparams.set(\"controls\", controls ? \"1\" : \"0\")\n\t\tparams.set(\"autoplay\", autoplay ? \"1\" : \"0\")\n\t\tparams.set(\"loop\", loop ? \"1\" : \"0\")\n\t\tparams.set(\"muted\", mute ? \"1\" : \"0\")\n\n\t\tconst iframe = parseHTML(\n\t\t\t`<iframe src=\"https://player.vimeo.com/video/${escapeHTML(videoId)}?${params.toString()}\" frameborder=\"0\" allow=\"autoplay; fullscreen; picture-in-picture; clipboard-write\"></iframe>`,\n\t\t).querySelector(\"iframe\")\n\t\tassert(iframe, \"Failed to generate iframe\")\n\n\t\treturn iframe\n\t},\n\telementToProps: element => {\n\t\tconst src = element.getAttribute(\"src\") || \"\"\n\t\tconst videoId = VIMEO_EMBED_ID_REGEX.exec(src)?.groups?.videoId || \"\"\n\t\tassert(videoId, `Invalid video URL: ${src}`)\n\n\t\tconst params = new URLSearchParams(src.split(\"?\")[1])\n\n\t\treturn {\n\t\t\tvideo: `https://vimeo.com/${videoId}`,\n\t\t\tcontrols: params.get(\"controls\") === \"1\",\n\t\t\tautoplay: params.get(\"autoplay\") === \"1\",\n\t\t\tloop: params.get(\"loop\") === \"1\",\n\t\t\tmute: params.get(\"muted\") === \"1\",\n\t\t}\n\t},\n}\n\nexport const youTubeModule: SupportedModule<HTMLIFrameElement> = {\n\turl: moduleComponents.youtube.moduleURL,\n\tpropsToElement: ({ url, play, shouldMute, thumbnail }) => {\n\t\tassert(isString(url), \"Invalid video URL\")\n\t\tassert(isString(thumbnail), \"Invalid thumbnail quality\")\n\t\tconst videoId = YOUTUBE_ID_REGEX.exec(url)?.groups?.videoId || \"\"\n\t\tassert(videoId, `Invalid video URL: ${url}`)\n\n\t\tconst params = new URLSearchParams()\n\t\tparams.set(\"iv_load_policy\", \"3\")\n\t\tparams.set(\"rel\", \"0\")\n\t\tparams.set(\"modestbranding\", \"1\")\n\t\tparams.set(\"playsinline\", \"1\")\n\n\t\tparams.set(\"autoplay\", play === \"Off\" ? \"0\" : \"1\")\n\t\tparams.set(\"mute\", shouldMute ? \"1\" : \"0\")\n\n\t\tif (play === \"Loop\") {\n\t\t\tparams.set(\"loop\", \"1\")\n\t\t\t// YouTube only supports looping if the video is in the playlist\n\t\t\tparams.set(\"playlist\", videoId)\n\t\t}\n\n\t\tconst iframe = parseHTML(\n\t\t\t`<iframe src=\"https://www.youtube.com/embed/${escapeHTML(videoId)}?${params.toString()}\" data-thumbnail=\"${escapeHTML(thumbnail)}\" frameborder=\"0\" allow=\"presentation; fullscreen; accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\"></iframe>`,\n\t\t).querySelector(\"iframe\")\n\t\tassert(iframe, \"Failed to generate iframe\")\n\n\t\treturn iframe\n\t},\n\telementToProps: element => {\n\t\tconst src = element.getAttribute(\"src\") || \"\"\n\t\tconst videoId = YOUTUBE_EMBED_ID_REGEX.exec(src)?.groups?.videoId || \"\"\n\t\tassert(videoId, `Invalid video URL: ${src}`)\n\n\t\tconst params = new URLSearchParams(src.split(\"?\")[1])\n\t\tconst thumbnail = element.getAttribute(\"data-thumbnail\") || \"Medium Quality\"\n\n\t\tlet play = params.get(\"autoplay\") === \"0\" ? \"Off\" : \"On\"\n\t\tif (params.get(\"loop\") === \"1\") play = \"Loop\"\n\n\t\treturn {\n\t\t\turl: `https://youtube.com/watch?v=${videoId}`,\n\t\t\tplay,\n\t\t\tshouldMute: params.get(\"mute\") === \"1\",\n\t\t\tthumbnail,\n\t\t}\n\t},\n}\n\nexport const supportedModules: SupportedModule[] = [codeBlockModule, vimeoModule, youTubeModule]\n\nexport function convertModuleToDOM(engine: VekterEngine, module: SupportedModule, element: HTMLElement) {\n\tconst moduleIdentifier = getSidebarModuleIdentifierByModuleURL(engine, module.url)\n\tassert(moduleIdentifier, `Unsupported module: ${module.url}`)\n\n\tconst rawProps = module.elementToProps(element)\n\n\tconst component = engine.componentLoader.reactComponentForIdentifier(moduleIdentifier)\n\tif (!component) {\n\t\tthrow new Error(`Component not loaded: ${moduleIdentifier}`)\n\t}\n\n\tconst props: Mutable<ControlProps> = {}\n\n\tfor (const key in rawProps) {\n\t\tconst controlProp = component.properties[key]\n\t\tif (!controlProp) continue\n\n\t\tconst rawPropValue = rawProps[key]\n\t\t// Skip if the value is the same as the default value\n\t\tif (\"defaultValue\" in controlProp && controlProp.defaultValue === rawPropValue) continue\n\n\t\tconst controlPropValue = getControlProp(controlProp, undefined, rawPropValue)\n\t\tif (!controlPropValue) continue\n\n\t\tprops[key] = controlPropValue\n\t}\n\n\tconst serializedControlPropValues = JSON.stringify(props)\n\n\tconst tag = CMS_MODULE_TAG\n\tconst generatedElement = parseHTML(\n\t\t`<${tag} data-module-identifier=\"${moduleIdentifier}\" data-module-props=\"${escapeHTML(serializedControlPropValues)}\"></${tag}>`,\n\t).querySelector(tag)\n\tassert(generatedElement instanceof HTMLElement, \"Failed to convert module to DOM\")\n\n\treturn generatedElement\n}\n", "import type { VekterEngine } from \"document/VekterEngine.ts\"\nimport {\n\ttype ConvertToRichTextOptions,\n\tconvertHTMLToCanvasRichText,\n\tconvertHTMLToCollectionRichText,\n} from \"document/components/chrome/shared/utils/convertHTMLToRichText.ts\"\nimport type { CanvasNode } from \"document/models/CanvasTree/index.ts\"\nimport { assert } from \"library/utils/assert.ts\"\nimport { getLogger } from \"library/utils/getLogger.ts\"\nimport { setAnchorElementLink, setAnchorElementOpenInNewTab } from \"prosemirror/schema/link.ts\"\nimport { CMS_MODULE_TAG } from \"prosemirror/schema/module.ts\"\nimport { convertMarkdownToHTML, isLikelyMarkdownText } from \"prosemirror/serialization/markdown.ts\"\nimport { parseHTML } from \"utils/parseHTML.ts\"\nimport { getVekterLinkFromURL } from \"utils/resolveLink.ts\"\nimport type { BatchAssetUploader } from \"web/lib/BatchAssetUploader.ts\"\nimport type { ContentType } from \"#framer-plugin/collections.ts\"\nimport { codeBlockModule, convertModuleToDOM, vimeoModule, youTubeModule } from \"./modules.ts\"\n\nconst log = getLogger(\"convertPluginHTMLToVekterHTML\")\n\nfunction parseAndRewriteCommon(\n\tengine: VekterEngine,\n\tcontent: string,\n\tnode: CanvasNode | null,\n\tcontentType: ContentType = \"auto\",\n): HTMLElement {\n\tlet processedHtml = content\n\tif (contentType === \"markdown\" || (contentType === \"auto\" && isLikelyMarkdownText(content))) {\n\t\tprocessedHtml = convertMarkdownToHTML(content)\n\t}\n\n\tconst dom = parseHTML(processedHtml)\n\n\trewriteAnchorElementsToInternalModel(engine, dom, node)\n\trewriteEmbeds(engine, dom)\n\n\treturn dom\n}\n\nexport async function convertPluginHTMLToCollectionHTML(\n\tengine: VekterEngine,\n\thtml: string,\n\tnode: CanvasNode | null,\n\tassetUploader: BatchAssetUploader,\n\tcontentType: ContentType = \"auto\",\n): Promise<string> {\n\tconst dom = parseAndRewriteCommon(engine, html, node, contentType)\n\n\t// Sanitize, upload the images and run it through ProseMirror\n\treturn convertHTMLToCollectionRichText(dom.innerHTML, assetUploader)\n}\n\n/** See `convertHTMLToCanvasRichText` for why this exists. */\nexport function convertPluginHTMLToCanvasHTML(\n\tengine: VekterEngine,\n\thtml: string,\n\tnode: CanvasNode | null,\n\toptions?: ConvertToRichTextOptions,\n): string {\n\tif (html === \"\") return \"\"\n\n\tconst dom = parseAndRewriteCommon(engine, html, node)\n\n\t// Remove elements that are not supported on the canvas\n\tremoveElementsWithTag(dom, \"img\")\n\tremoveElementsWithTag(dom, CMS_MODULE_TAG)\n\t// `template` is the old tag used for modules before we switched to `framer-module`\n\tremoveElementsWithTag(dom, \"template\")\n\n\t// Sanitize and run it through ProseMirror\n\treturn convertHTMLToCanvasRichText(dom.innerHTML, options)\n}\n\nfunction rewriteEmbeds(engine: VekterEngine, dom: HTMLElement): void {\n\tconst preElements = dom.querySelectorAll(\"pre\")\n\tfor (const preElement of preElements) {\n\t\ttry {\n\t\t\tconst convertedEmbed = convertModuleToDOM(engine, codeBlockModule, preElement)\n\t\t\tpreElement.replaceWith(convertedEmbed)\n\t\t} catch (error) {\n\t\t\tpreElement.remove()\n\t\t\tlog.error(error, preElement)\n\t\t}\n\t}\n\n\tconst iframeElements = dom.querySelectorAll(\"iframe\")\n\tfor (const iframeElement of iframeElements) {\n\t\ttry {\n\t\t\tconst url = iframeElement.getAttribute(\"src\")\n\t\t\tassert(url, \"Iframe element has no src\")\n\n\t\t\tlet convertedEmbed: HTMLElement\n\t\t\tif (url.includes(\"vimeo.com\")) {\n\t\t\t\tconvertedEmbed = convertModuleToDOM(engine, vimeoModule, iframeElement)\n\t\t\t} else if (url.includes(\"youtube.com\")) {\n\t\t\t\tconvertedEmbed = convertModuleToDOM(engine, youTubeModule, iframeElement)\n\t\t\t} else {\n\t\t\t\tthrow new Error(`Unsupported iframe: ${url}`)\n\t\t\t}\n\n\t\t\tiframeElement.replaceWith(convertedEmbed)\n\t\t} catch (error) {\n\t\t\tiframeElement.remove()\n\t\t\tlog.error(error, iframeElement)\n\t\t}\n\t}\n}\n\nfunction removeElementPreserveChildren(element: HTMLElement): void {\n\tconst fragment = document.createDocumentFragment()\n\n\twhile (element.firstChild) {\n\t\tfragment.appendChild(element.firstChild)\n\t}\n\n\tassert(element.parentNode, \"Element has no parent\")\n\telement.parentNode.insertBefore(fragment, element)\n\n\telement.remove()\n}\n\nfunction rewriteAnchorElementsToInternalModel(engine: VekterEngine, dom: HTMLElement, node: CanvasNode | null): void {\n\tconst anchorElements = dom.querySelectorAll(\"a\")\n\tfor (const anchorElement of anchorElements) {\n\t\tconst href = anchorElement.getAttribute(\"href\")\n\t\tif (!href) continue\n\n\t\tconst link = getVekterLinkFromURL(engine, href, node)\n\t\tif (!link) {\n\t\t\tremoveElementPreserveChildren(anchorElement)\n\t\t\tcontinue\n\t\t}\n\n\t\tsetAnchorElementLink(anchorElement, link)\n\n\t\tconst target = anchorElement.getAttribute(\"target\")\n\t\tif (target !== \"_blank\") continue\n\n\t\tsetAnchorElementOpenInNewTab(anchorElement, true)\n\t}\n}\n\nfunction removeElementsWithTag(dom: HTMLElement, tag: string): void {\n\tconst elements = dom.querySelectorAll(tag)\n\tfor (const element of elements) {\n\t\telement.remove()\n\t}\n}\n", "import { createAbsoluteImageAssetURL, parseAssetReference } from \"@framerjs/assets\"\nimport { assert, type ExternalModuleExportIdentifier, getLogger, parseModuleIdentifier } from \"@framerjs/shared\"\nimport type { VekterEngine } from \"document/VekterEngine.ts\"\nimport type { CanvasNode } from \"document/models/CanvasTree/index.ts\"\nimport { isVariableReference } from \"document/models/CanvasTree/traits/VariableReference.ts\"\nimport { isLink } from \"document/models/CanvasTree/traits/utils/Link.ts\"\nimport { getControlPropValues } from \"document/models/controlProps/getControlPropValues.ts\"\nimport { getControlProps } from \"document/models/controlProps/getControlProps.ts\"\nimport { LINK_ATTR, getAnchorElementLink, getAnchorElementOpenInNewTab } from \"prosemirror/schema/link.ts\"\nimport { CMS_MODULE_IDENTIFIER_ATTR, CMS_MODULE_PROPS_ATTR, CMS_MODULE_TAG } from \"prosemirror/schema/module.ts\"\nimport { getSidebarModuleIdentifierByModuleURL } from \"utils/getSidebarModuleIdentifierByModuleURL.ts\"\nimport { parseHTML } from \"utils/parseHTML.ts\"\nimport { removeImagesWithInvalidSrc } from \"utils/removeImagesWithInvalidSrc.ts\"\nimport { resolveLinkToURL } from \"utils/resolveLink.ts\"\nimport { isBoolean, isObject, isString } from \"utils/typeChecks.ts\"\nimport { type SupportedModule, supportedModules } from \"./modules.ts\"\n\nconst log = getLogger(\"convertVekterHTMLToPluginHTML\")\n\n/**\n * Compares two external module export identifiers for equality, ignoring only\n * the saveId which changes between module versions.\n */\nfunction externalModuleExportsEqual(a: ExternalModuleExportIdentifier, b: ExternalModuleExportIdentifier): boolean {\n\treturn a.moduleId === b.moduleId && a.file === b.file && a.exportSpecifier === b.exportSpecifier\n}\n\n/**\n * Finds a supported module that matches the given module identifier.\n * Returns both the module and its current identifier (with up-to-date saveId).\n */\nfunction findSupportedModule(\n\tengine: VekterEngine,\n\ttargetIdentifier: ExternalModuleExportIdentifier,\n): { module: SupportedModule; currentIdentifier: string } | undefined {\n\tfor (const module of supportedModules) {\n\t\t// Returns the identifier for the currently installed version of the module\n\t\tconst currentIdentifier = getSidebarModuleIdentifierByModuleURL(engine, module.url)\n\t\tconst parsed = parseModuleIdentifier(currentIdentifier)\n\t\tif (parsed?.kind !== \"externalModuleExport\") continue\n\n\t\tif (externalModuleExportsEqual(targetIdentifier, parsed)) {\n\t\t\treturn { module, currentIdentifier }\n\t\t}\n\t}\n\treturn undefined\n}\n\nexport function convertVekterHTMLToPluginHTML(engine: VekterEngine, html: string, node: CanvasNode | null) {\n\tconst container = parseHTML(html)\n\n\tconst anchorElements = container.querySelectorAll(\"a\")\n\tfor (const anchorElement of anchorElements) {\n\t\tconvertLinkAttributeToHref(anchorElement, engine, node)\n\t\tconvertOpenInNewTabAttributeToTarget(anchorElement, node)\n\t}\n\n\tremoveUnsupportedAttributes(container)\n\tremoveImagesWithInvalidSrc(container)\n\n\t// `template` used to be an old tag for modules; we switched to `framer-module` in Jun 2025.\n\tconst moduleElements = container.querySelectorAll(`template, ${CMS_MODULE_TAG}`)\n\tfor (const templateElement of moduleElements) {\n\t\ttry {\n\t\t\tconst moduleIdentifier = templateElement.getAttribute(CMS_MODULE_IDENTIFIER_ATTR)\n\t\t\tif (!moduleIdentifier) {\n\t\t\t\tthrow new Error(\"No module identifier found\")\n\t\t\t}\n\n\t\t\tconst parsedModuleIdentifier = parseModuleIdentifier(moduleIdentifier)\n\t\t\tif (!parsedModuleIdentifier || parsedModuleIdentifier.kind !== \"externalModuleExport\") {\n\t\t\t\tthrow new Error(`Unsupported module identifier: ${moduleIdentifier}`)\n\t\t\t}\n\n\t\t\tconst match = findSupportedModule(engine, parsedModuleIdentifier)\n\t\t\tif (!match) {\n\t\t\t\tthrow new Error(`Unsupported module identifier: ${moduleIdentifier}`)\n\t\t\t}\n\n\t\t\tconst serializedRawProps = templateElement.getAttribute(CMS_MODULE_PROPS_ATTR)\n\t\t\tif (!serializedRawProps) {\n\t\t\t\tthrow new Error(`No props found for module ${moduleIdentifier}`)\n\t\t\t}\n\n\t\t\tconst rawProps = JSON.parse(serializedRawProps)\n\t\t\tif (!isObject(rawProps)) {\n\t\t\t\tthrow new Error(`Invalid module props for ${moduleIdentifier}: ${rawProps}`)\n\t\t\t}\n\n\t\t\tconst component = engine.componentLoader.reactComponentForIdentifier(match.currentIdentifier)\n\t\t\tif (!component) {\n\t\t\t\tthrow new Error(`Component not loaded: ${moduleIdentifier}`)\n\t\t\t}\n\n\t\t\tconst controlProps = getControlProps(component.properties, rawProps)\n\t\t\tconst controlPropValues = getControlPropValues(component.properties, controlProps)\n\n\t\t\tconst convertedModule = match.module.propsToElement(controlPropValues)\n\t\t\ttemplateElement.replaceWith(convertedModule)\n\t\t} catch (error) {\n\t\t\ttemplateElement.remove()\n\t\t\tlog.error(error, templateElement)\n\t\t}\n\t}\n\n\treturn container.innerHTML\n}\n\ntype SupportedAttributeKey =\n\t| keyof HTMLElement\n\t| keyof HTMLAnchorElement\n\t| keyof HTMLHeadingElement\n\t| keyof HTMLParagraphElement\n\t| keyof HTMLImageElement\n\nconst supportedAttributes: string[] = [\n\t\"href\",\n\t\"target\",\n\t\"style\",\n\t\"src\",\n\t\"alt\",\n\t\"dir\",\n] satisfies readonly SupportedAttributeKey[]\n\n// the node.dataSet API becomes camelCase by default\nconst supportedDataAttributes: string[] = [\"presetTag\", \"moduleIdentifier\", \"moduleProps\"]\n\nfunction updateStyleAttribute(node: HTMLElement, cssText: string) {\n\tif (cssText) {\n\t\tnode.setAttribute(\"style\", cssText)\n\t} else {\n\t\tnode.removeAttribute(\"style\")\n\t}\n}\n\nfunction sanitizeStyleAttribute(node: HTMLElement): void {\n\tif (node instanceof HTMLImageElement) {\n\t\t// We don't want aspect ratio to be exposed because its automatically applied on import\n\t\tnode.style.removeProperty(\"aspect-ratio\")\n\t\tupdateStyleAttribute(node, node.style.cssText)\n\t}\n}\n\nfunction removeUnsupportedAttributes(node: HTMLElement) {\n\tsanitizeStyleAttribute(node)\n\n\tif (node instanceof HTMLImageElement && !node.hasAttribute(\"alt\")) {\n\t\tnode.setAttribute(\"alt\", \"\")\n\t}\n\n\tfor (const attribute of node.attributes) {\n\t\tif (attribute.name.startsWith(\"data-\")) continue\n\t\tif (supportedAttributes.includes(attribute.name)) continue\n\n\t\tnode.removeAttribute(attribute.name)\n\t}\n\n\tfor (const dataAttribute in node.dataset) {\n\t\tif (dataAttribute === \"framerAsset\") {\n\t\t\tconst value = node.dataset[dataAttribute]\n\t\t\tif (isString(value)) {\n\t\t\t\tconst parsedReference = parseAssetReference(value)\n\t\t\t\tif (parsedReference?.identifier) {\n\t\t\t\t\tconst url = createAbsoluteImageAssetURL(parsedReference.identifier)\n\t\t\t\t\tnode.setAttribute(\"src\", url)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (supportedDataAttributes.includes(dataAttribute)) continue\n\t\tdelete node.dataset[dataAttribute]\n\t}\n\n\tfor (const child of node.children) {\n\t\tif (!(child instanceof HTMLElement)) continue\n\t\tremoveUnsupportedAttributes(child)\n\t}\n}\n\nfunction convertLinkAttributeToHref(anchorElement: HTMLAnchorElement, engine: VekterEngine, node: CanvasNode | null) {\n\tlet link = getAnchorElementLink(anchorElement)\n\tanchorElement.removeAttribute(LINK_ATTR)\n\n\tif (isVariableReference(link)) {\n\t\tassert(node, \"Encountered variable on Link but no Node was given\")\n\n\t\tconst resolved = node.cache.getVariableReferenceValue(link)\n\n\t\tif (!isLink(resolved)) return\n\t\tlink = resolved\n\t}\n\n\tif (!isLink(link)) return\n\n\tconst resolvedLink = resolveLinkToURL(engine.tree, link)\n\tif (!resolvedLink) return\n\n\tanchorElement.setAttribute(\"href\", resolvedLink)\n}\n\nfunction convertOpenInNewTabAttributeToTarget(anchorElement: HTMLAnchorElement, node: CanvasNode | null) {\n\tlet openInNewTab = getAnchorElementOpenInNewTab(anchorElement)\n\n\tif (isVariableReference(openInNewTab)) {\n\t\tassert(node, \"Encountered variable on Link but no Node was given\")\n\n\t\tconst resolved = node.cache.getVariableReferenceValue(openInNewTab)\n\t\tif (!isBoolean(resolved)) return\n\t\topenInNewTab = resolved\n\t}\n\n\tif (openInNewTab === true) {\n\t\tanchorElement.setAttribute(\"target\", \"_blank\")\n\t}\n}\n", "import { slugify } from \"library/utils/slugify.ts\"\nimport { getNameForLocaleCode } from \"utils/getNameForLocaleCode.ts\"\nimport { isCommonLocaleCode } from \"./commonLocales.ts\"\nimport { type LocaleCode, isLocaleCode } from \"./locales.ts\"\n\n/**\n * Suggests a slug for a locale code, preferring a short slug (language only)\n * and falling back to the full locale code.\n * Returns undefined if all candidates are already taken.\n */\nexport function suggestLocaleSlug(localeCode: LocaleCode, takenSlugs: ReadonlySet<string>): string | undefined {\n\tif (!isLocaleCode(localeCode)) return\n\n\tif (isCommonLocaleCode(localeCode)) {\n\t\tconst shortLocaleSlug = slugify(localeCode.split(\"-\")[0])\n\t\tif (!takenSlugs.has(shortLocaleSlug)) {\n\t\t\treturn shortLocaleSlug\n\t\t}\n\t}\n\n\tconst fullLocaleSlug = slugify(localeCode)\n\tif (!takenSlugs.has(fullLocaleSlug)) {\n\t\treturn fullLocaleSlug\n\t}\n}\n\n/**\n * Suggests a display name for a locale code.\n * Returns undefined if no name can be determined or the name is already taken.\n */\nexport function suggestLocaleName(localeCode: LocaleCode, takenNames: ReadonlySet<string>): string | undefined {\n\tconst longName = getNameForLocaleCode(localeCode, { includeParenthesis: true })\n\tif (longName && !takenNames.has(longName)) {\n\t\treturn longName\n\t}\n}\n", "import { assertNever } from \"@framerjs/shared\"\nimport type { Mode } from \"#framer-plugin/messages.ts\"\n\nexport function isManagedMode(value: Mode) {\n\tswitch (value) {\n\t\tcase \"configureManagedCollection\":\n\t\tcase \"syncManagedCollection\":\n\t\tcase \"api\":\n\t\t\treturn true\n\t\tcase \"canvas\":\n\t\tcase \"image\":\n\t\tcase \"editImage\":\n\t\tcase \"collection\":\n\t\tcase \"localization\":\n\t\tcase \"code\":\n\t\t\treturn false\n\t\tdefault:\n\t\t\tassertNever(value)\n\t}\n}\n\nexport function shouldRenderAsModal(mode: Mode) {\n\tswitch (mode) {\n\t\tcase \"canvas\":\n\t\tcase \"code\":\n\t\tcase \"api\":\n\t\t\treturn false\n\t\tcase \"collection\":\n\t\tcase \"localization\":\n\t\tcase \"image\":\n\t\tcase \"editImage\":\n\t\tcase \"configureManagedCollection\":\n\t\tcase \"syncManagedCollection\":\n\t\t\treturn true\n\t\tdefault:\n\t\t\tassertNever(mode)\n\t}\n}\n", "import type { VekterEngine } from \"document/VekterEngine.ts\"\nimport type { LocalizationSource } from \"document/components/chrome/localization/getLocalizationSources.ts\"\nimport { isCollectionItemNode, isCollectionNode } from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport type { LocalizedTextValue, LocalizedValue } from \"document/models/LocalizedValue.ts\"\nimport { isManagedMode } from \"plugins/utils/modes.ts\"\n\nexport function isLocalizedValueManagedByPlugin(\n\tengine: VekterEngine,\n\tsource: LocalizationSource,\n\tlocalizedValue: LocalizedValue<LocalizedTextValue>,\n): boolean {\n\tif (!localizedValue.pluginId) return false\n\n\tif (!localizedValue.pluginMode || !isManagedMode(localizedValue.pluginMode)) {\n\t\treturn false\n\t}\n\n\t// Sources that are explicitly marked user editable are not deemed to be managed by the plugin.\n\tif (source.managedByPluginButUserEditable) return false\n\n\tconst node = engine.tree.get(source.nodeId)\n\n\tif (isCollectionNode(node)) {\n\t\treturn node.managedByPlugin === localizedValue.pluginId\n\t}\n\n\tif (!isCollectionItemNode(node)) return false\n\n\tconst parent = engine.tree.get(node.parentid)\n\tif (!isCollectionNode(parent)) return false\n\n\treturn parent.managedByPlugin === localizedValue.pluginId\n}\n", "import type { FileAsset, FileAssetData, ImageAsset, ImageAssetData } from \"./assets.ts\"\nimport type { PluginEngine } from \"./engine.ts\"\nimport { $framerInternal } from \"./internal.ts\"\nimport type { InlineLocalizationValueByLocale, LocalizationSourceUpdate } from \"./localization.ts\"\nimport type { Marshaled } from \"./marshal.ts\"\nimport type { ColorStyle, ColorStyleData } from \"./styles.ts\"\nimport type { Border } from \"./traits.ts\"\nimport type { ExplicitPartial, NullablePartialRecord, classKey } from \"./utils.ts\"\nimport { assert, deepFreeze, isNull, isUndefined } from \"./utils.ts\"\n\ninterface WithNodeId {\n\tnodeId: string\n}\n\nexport type NodeType = \"component\" | \"collection\"\n\ninterface WithNodeType {\n\tnodeType: NodeType\n}\n\ninterface WithId {\n\tid: string\n}\n\ninterface WithName {\n\tname: string\n}\n\ninterface WithNameByLocale {\n\tnameByLocale: InlineLocalizationValueByLocale\n}\n\ninterface WithNameByLocaleUpdate {\n\tnameByLocale: LocalizationSourceUpdate\n}\n\ninterface WithDescription {\n\tdescription: string\n}\n\nexport interface BaseVariableData\n\textends WithNodeId, WithNodeType, WithId, WithName, ExplicitPartial<WithDescription> {}\n\nexport interface CreateVariableBase extends WithName, Partial<WithDescription> {}\n\nexport interface UpdateVariableBase extends Partial<WithName>, NullablePartialRecord<WithDescription> {}\n\ntype UpdateVariableAttributes<T extends { type: UpdateVariable[\"type\"] }> = Omit<\n\tExtract<UpdateVariable, { type: T[\"type\"] }>,\n\t\"type\"\n>\n\nabstract class VariableBase {\n\tabstract readonly type: UpdateVariable[\"type\"] // A must for UpdateVariableAttributes to work\n\treadonly #engine: PluginEngine\n\treadonly #data: VariableData\n\n\tget nodeId(): string {\n\t\treturn this.#data.nodeId\n\t}\n\n\tget nodeType(): NodeType {\n\t\treturn this.#data.nodeType\n\t}\n\n\tget id(): string {\n\t\treturn this.#data.id\n\t}\n\n\tget name(): string {\n\t\treturn this.#data.name\n\t}\n\n\tget description(): string | null {\n\t\treturn this.#data.description ?? null\n\t}\n\n\tconstructor(engine: PluginEngine, data: VariableData) {\n\t\tthis.#engine = engine\n\t\tthis.#data = data\n\t}\n\n\t/**\n\t * Use to rename or change the description of this variable:\n\t *\n\t * ```ts\n\t * const updatedVariable = await variable.setAttributes({ name: \"New Name\" })\n\t * ```\n\t *\n\t * And to update other attributes too, but make sure to narrow using `instanceof` first, as to\n\t * avoid potential bugs:\n\t *\n\t * ```ts\n\t * if (variable instanceof FileVariable) await variable.setAttributes({ allowedFileTypes: [\"txt\", \"md\"] })\n\t * ```\n\t *\n\t * Returns the updated variable on success, and `null` in the unlikely event of it being removed\n\t * between getting it and calling this method.\n\t *\n\t * Use `\"Variable.setAttributes\"` to check if this method is allowed.\n\t */\n\tasync setAttributes(attributes: UpdateVariableAttributes<typeof this>): Promise<typeof this | null> {\n\t\tconst data = await this.#engine.invoke(\"updateVariable\", this.nodeId, this.id, {\n\t\t\t...attributes,\n\t\t\ttype: this.type,\n\t\t})\n\n\t\tif (isNull(data)) return null\n\n\t\t// See FieldBase.setAttributes for why this cast in unavoidable\n\t\tconst Class = this.constructor as new (...args: ConstructorParameters<typeof VariableBase>) => typeof this\n\n\t\treturn new Class(this.#engine, data)\n\t}\n\n\t/**\n\t * Remove this variable.\n\t *\n\t * Use `\"Variable.remove\"` to check if this method is allowed.\n\t */\n\tasync remove(): Promise<void> {\n\t\tawait this.#engine.invoke(\"removeVariables\", this.nodeId, [this.id])\n\t}\n}\n\n// \"__class\" is for internal marshaled structures (so that marshaling functions can detect them\n// relatively unambiguously), \"type\" is for public structures (to be used for input and union\n// discrimination by plugin authors).\n\nconst classSuffix = \"Variable\"\ntype ClassSuffix = typeof classSuffix\n\ntype ClassToType<T extends `${string}${ClassSuffix}`> = T extends `${infer P}${ClassSuffix}` ? Uncapitalize<P> : never\n\nexport function classToType<T extends `${string}${ClassSuffix}`>(input: T): ClassToType<T> {\n\tconst first = input.at(0)\n\tassert(!isUndefined(first))\n\treturn `${first.toLowerCase()}${input.slice(1, -classSuffix.length)}` as ReturnType<typeof classToType<T>>\n}\n\nexport type TypeToClass<T extends string> = `${Capitalize<T>}${ClassSuffix}`\n\nconst booleanVariableClass = `Boolean${classSuffix}`\nconst booleanVariableType = classToType(booleanVariableClass)\n\ninterface WithBooleanVariableClass {\n\t[classKey]: typeof booleanVariableClass\n}\n\ninterface WithBooleanVariableType {\n\ttype: typeof booleanVariableType\n}\n\ninterface WithBooleanDefaultValue {\n\tdefaultValue: boolean\n}\n\nexport interface BooleanVariableData extends WithBooleanVariableClass, BaseVariableData, WithBooleanDefaultValue {}\n\nexport interface CreateBooleanVariable\n\textends WithBooleanVariableType, CreateVariableBase, Partial<WithBooleanDefaultValue> {}\n\nexport interface UpdateBooleanVariable\n\textends WithBooleanVariableType, UpdateVariableBase, Partial<WithBooleanDefaultValue> {}\n\n/**\n * A boolean variable.\n * @category canvas\n */\nexport class BooleanVariable extends VariableBase {\n\treadonly type = booleanVariableType\n\treadonly #data: BooleanVariableData\n\n\tconstructor(engine: PluginEngine, data: BooleanVariableData) {\n\t\tsuper(engine, data)\n\t\tthis.#data = data\n\t}\n\n\tstatic [$framerInternal.unmarshal](engine: PluginEngine, data: BooleanVariableData): BooleanVariable {\n\t\treturn new BooleanVariable(engine, data)\n\t}\n\n\t[$framerInternal.marshal](): BooleanVariableData {\n\t\treturn this.#data\n\t}\n}\n\nconst numberVariableClass = `Number${classSuffix}`\nconst numberVariableType = classToType(numberVariableClass)\n\ninterface WithNumberVariableClass {\n\t[classKey]: typeof numberVariableClass\n}\n\ninterface WithNumberVariableType {\n\ttype: typeof numberVariableType\n}\n\ninterface WithNumberDefaultValue {\n\tdefaultValue: number\n}\n\nexport interface NumberVariableData extends WithNumberVariableClass, BaseVariableData, WithNumberDefaultValue {}\n\nexport interface CreateNumberVariable\n\textends WithNumberVariableType, CreateVariableBase, Partial<WithNumberDefaultValue> {}\n\nexport interface UpdateNumberVariable\n\textends WithNumberVariableType, UpdateVariableBase, Partial<WithNumberDefaultValue> {}\n\n/**\n * A number variable.\n * @category canvas\n */\nexport class NumberVariable extends VariableBase {\n\treadonly type = numberVariableType\n\treadonly #data: NumberVariableData\n\n\tconstructor(engine: PluginEngine, data: NumberVariableData) {\n\t\tsuper(engine, data)\n\t\tthis.#data = data\n\t}\n\n\tstatic [$framerInternal.unmarshal](engine: PluginEngine, data: NumberVariableData): NumberVariable {\n\t\treturn new NumberVariable(engine, data)\n\t}\n\n\t[$framerInternal.marshal](): NumberVariableData {\n\t\treturn this.#data\n\t}\n}\n\nconst stringVariableClass = `String${classSuffix}`\nconst stringVariableType = classToType(stringVariableClass)\n\ninterface WithStringVariableClass {\n\t[classKey]: typeof stringVariableClass\n}\n\ninterface WithStringVariableType {\n\ttype: typeof stringVariableType\n}\n\ninterface WithStringDefaultValue {\n\tdefaultValue: string\n}\n\nexport interface StringVariableData extends WithStringVariableClass, BaseVariableData, WithStringDefaultValue {}\n\nexport interface CreateStringVariable\n\textends WithStringVariableType, CreateVariableBase, Partial<WithStringDefaultValue> {}\n\nexport interface UpdateStringVariable\n\textends WithStringVariableType, UpdateVariableBase, Partial<WithStringDefaultValue> {}\n\n/**\n * A string variable.\n * @category canvas\n */\nexport class StringVariable extends VariableBase {\n\treadonly type = stringVariableType\n\treadonly #data: StringVariableData\n\n\tconstructor(engine: PluginEngine, data: StringVariableData) {\n\t\tsuper(engine, data)\n\t\tthis.#data = data\n\t}\n\n\tstatic [$framerInternal.unmarshal](engine: PluginEngine, data: StringVariableData): StringVariable {\n\t\treturn new StringVariable(engine, data)\n\t}\n\n\t[$framerInternal.marshal](): StringVariableData {\n\t\treturn this.#data\n\t}\n}\n\nconst formattedTextVariableClass = `FormattedText${classSuffix}`\nconst formattedTextVariableType = classToType(formattedTextVariableClass)\n\ninterface WithFormattedTextVariableClass {\n\t[classKey]: typeof formattedTextVariableClass\n}\n\ninterface WithFormattedTextVariableType {\n\ttype: typeof formattedTextVariableType\n}\n\nexport interface FormattedTextVariableData\n\textends WithFormattedTextVariableClass, BaseVariableData, WithStringDefaultValue {}\n\nexport interface CreateFormattedTextVariable\n\textends WithFormattedTextVariableType, CreateVariableBase, Partial<WithStringDefaultValue> {}\n\nexport interface UpdateFormattedTextVariable\n\textends WithFormattedTextVariableType, UpdateVariableBase, Partial<WithStringDefaultValue> {}\n\n/**\n * A formatted text (rich text) variable.\n * @category canvas\n */\nexport class FormattedTextVariable extends VariableBase {\n\treadonly type = formattedTextVariableType\n\treadonly #data: FormattedTextVariableData\n\n\tconstructor(engine: PluginEngine, data: FormattedTextVariableData) {\n\t\tsuper(engine, data)\n\t\tthis.#data = data\n\t}\n\n\tstatic [$framerInternal.unmarshal](engine: PluginEngine, data: FormattedTextVariableData): FormattedTextVariable {\n\t\treturn new FormattedTextVariable(engine, data)\n\t}\n\n\t[$framerInternal.marshal](): FormattedTextVariableData {\n\t\treturn this.#data\n\t}\n}\n\nconst enumVariableClass = `Enum${classSuffix}`\nconst enumVariableType = classToType(enumVariableClass)\n\nexport interface EnumCaseData extends WithId, WithName, WithNameByLocale {}\n\nexport interface UpdateEnumCase extends Partial<WithName>, Partial<WithNameByLocaleUpdate> {}\n\n/**\n * An individual case (option) within an Enum Field or Enum Variable.\n * @category cms\n */\nexport class EnumCase {\n\treadonly #engine: PluginEngine\n\treadonly #nodeId: string\n\treadonly #variableId: string\n\treadonly #data: EnumCaseData\n\n\t/** A unique identifier for the enum case. */\n\tget id() {\n\t\treturn this.#data.id\n\t}\n\n\t/** The display name of the enum case. */\n\tget name() {\n\t\treturn this.#data.name\n\t}\n\n\t/**\n\t * Localized values for the name of this enum case.\n\t *\n\t * @example\n\t * ```ts\n\t * const dutchName = enumCase.nameByLocale[dutchLocale.id] // \"Naam\"\n\t * ```\n\t */\n\tget nameByLocale() {\n\t\treturn this.#data.nameByLocale\n\t}\n\n\tconstructor(engine: PluginEngine, nodeId: string, variableId: string, enumCaseData: EnumCaseData) {\n\t\tthis.#engine = engine\n\t\tthis.#nodeId = nodeId\n\t\tthis.#variableId = variableId\n\t\tthis.#data = enumCaseData\n\t}\n\n\t/**\n\t * Update the attributes of this enum case.\n\t *\n\t * @example\n\t * ```ts\n\t * enumCase.setAttributes({\n\t * \tname: \"New Name\",\n\t * \tnameByLocale: {\n\t * \t\tnl: { action: \"set\", value: \"Nieuwe naam\" }\n\t * \t}\n\t * })\n\t * ```\n\t *\n\t * @param attributes - The attributes to update: `name` and/or `nameByLocale`.\n\t * @returns The updated `EnumCase`, or `null` if the case was removed before the update.\n\t *\n\t * Use `\"EnumCase.setAttributes\"` to check if this method is allowed.\n\t */\n\tasync setAttributes(attributes: UpdateEnumCase): Promise<EnumCase | null> {\n\t\tconst updatedEnumCase = await this.#engine.invoke(\n\t\t\t\"updateEnumCase\",\n\t\t\tthis.#nodeId,\n\t\t\tthis.#variableId,\n\t\t\tthis.id,\n\t\t\tattributes,\n\t\t)\n\t\tif (!updatedEnumCase) return null\n\t\treturn new EnumCase(this.#engine, this.#nodeId, this.#variableId, updatedEnumCase)\n\t}\n\n\t/**\n\t * Remove this enum case from its parent enum field.\n\t *\n\t * @example\n\t * ```ts\n\t * enumCase.remove()\n\t * ```\n\t *\n\t * Use `\"EnumCase.remove\"` to check if this method is allowed.\n\t */\n\tasync remove(): Promise<void> {\n\t\tawait this.#engine.invoke(\"removeEnumCase\", this.#nodeId, this.#variableId, this.id)\n\t}\n}\n\ninterface WithEnumVariableClass {\n\t[classKey]: typeof enumVariableClass\n}\n\ninterface WithEnumVariableType {\n\ttype: typeof enumVariableType\n}\n\nexport interface EnumVariableData\n\textends WithEnumVariableClass, BaseVariableData, ExplicitPartial<WithStringDefaultValue> {\n\tcases: EnumCaseData[]\n}\n\nexport interface CreateEnumCase extends WithName, Partial<WithNameByLocaleUpdate> {}\n\nexport interface CreateEnumVariable extends WithEnumVariableType, CreateVariableBase {\n\tdefaultCaseIndex?: number | undefined\n\tcases: CreateEnumCase[]\n}\n\nexport interface UpdateEnumVariable extends WithEnumVariableType, UpdateVariableBase, Partial<WithStringDefaultValue> {}\n\n/**\n * An enum variable with a fixed set of cases.\n * @category canvas\n */\nexport class EnumVariable extends VariableBase {\n\treadonly type = enumVariableType\n\treadonly #engine: PluginEngine\n\treadonly #data: EnumVariableData\n\t#caseInstances: readonly EnumCase[] | undefined\n\n\tget cases(): readonly EnumCase[] {\n\t\tif (!this.#caseInstances) {\n\t\t\tthis.#caseInstances = deepFreeze(\n\t\t\t\tthis.#data.cases.map(data => new EnumCase(this.#engine, this.nodeId, this.id, data)),\n\t\t\t)\n\t\t}\n\n\t\treturn this.#caseInstances\n\t}\n\n\tconstructor(engine: PluginEngine, data: EnumVariableData) {\n\t\tsuper(engine, data)\n\t\tthis.#engine = engine\n\t\tthis.#data = data\n\t}\n\n\tstatic [$framerInternal.unmarshal](engine: PluginEngine, data: EnumVariableData): EnumVariable {\n\t\treturn new EnumVariable(engine, data)\n\t}\n\n\t[$framerInternal.marshal](): EnumVariableData {\n\t\treturn this.#data\n\t}\n\n\t/**\n\t * Add a new enum case.\n\t *\n\t * Use `\"EnumVariable.addCase\"` to check if this method is allowed.\n\t */\n\tasync addCase(attributes: CreateEnumCase): Promise<EnumCase | null> {\n\t\tconst newEnumCase = await this.#engine.invoke(\"addEnumCase\", this.nodeId, this.id, attributes)\n\t\tif (!newEnumCase) return null\n\t\treturn new EnumCase(this.#engine, this.nodeId, this.id, newEnumCase)\n\t}\n\n\t/**\n\t * Arrange enum cases in a specific order.\n\t *\n\t * Use `\"EnumVariable.setCaseOrder\"` to check if this method is allowed.\n\t */\n\tasync setCaseOrder(caseIds: string[]): Promise<void> {\n\t\tawait this.#engine.invoke(\"setEnumCaseOrder\", this.nodeId, this.id, caseIds)\n\t}\n}\n\nconst colorVariableClass = `Color${classSuffix}`\nconst colorVariableType = classToType(colorVariableClass)\n\ninterface WithColorVariableClass {\n\t[classKey]: typeof colorVariableClass\n}\n\ninterface WithColorVariableType {\n\ttype: typeof colorVariableType\n}\n\ninterface WithColorDefaultValueData {\n\tdefaultValue: string | ColorStyleData\n}\n\nexport interface ColorVariableData extends WithColorVariableClass, BaseVariableData, WithColorDefaultValueData {}\n\ninterface WithColorDefaultValue {\n\tdefaultValue: string | ColorStyle\n}\n\nexport interface CreateColorVariable\n\textends WithColorVariableType, CreateVariableBase, Partial<WithColorDefaultValue> {}\n\nexport interface UpdateColorVariable\n\textends WithColorVariableType, UpdateVariableBase, Partial<WithColorDefaultValue> {}\n\n/**\n * A color variable.\n * @category canvas\n */\nexport class ColorVariable extends VariableBase {\n\treadonly type = colorVariableType\n\treadonly #data: ColorVariableData\n\n\tconstructor(engine: PluginEngine, data: ColorVariableData) {\n\t\tsuper(engine, data)\n\t\tthis.#data = data\n\t}\n\n\tstatic [$framerInternal.unmarshal](engine: PluginEngine, data: ColorVariableData): ColorVariable {\n\t\treturn new ColorVariable(engine, data)\n\t}\n\n\t[$framerInternal.marshal](): ColorVariableData {\n\t\treturn this.#data\n\t}\n}\n\nconst imageVariableClass = `Image${classSuffix}`\nconst imageVariableType = classToType(imageVariableClass)\n\ninterface WithImageVariableClass {\n\t[classKey]: typeof imageVariableClass\n}\n\ninterface WithImageVariableType {\n\ttype: typeof imageVariableType\n}\n\ninterface WithImageDefaultValueData {\n\tdefaultValue: ImageAssetData\n}\n\nexport interface ImageVariableData\n\textends WithImageVariableClass, BaseVariableData, ExplicitPartial<WithImageDefaultValueData> {}\n\ninterface WithImageDefaultValue {\n\tdefaultValue: ImageAsset\n}\n\nexport interface CreateImageVariable\n\textends WithImageVariableType, CreateVariableBase, Partial<WithImageDefaultValue> {}\n\nexport interface UpdateImageVariable\n\textends WithImageVariableType, UpdateVariableBase, Partial<WithImageDefaultValue> {}\n\n/**\n * An image variable.\n * @category canvas\n */\nexport class ImageVariable extends VariableBase {\n\treadonly type = imageVariableType\n\treadonly #data: ImageVariableData\n\n\tconstructor(engine: PluginEngine, data: ImageVariableData) {\n\t\tsuper(engine, data)\n\t\tthis.#data = data\n\t}\n\n\tstatic [$framerInternal.unmarshal](engine: PluginEngine, data: ImageVariableData): ImageVariable {\n\t\treturn new ImageVariable(engine, data)\n\t}\n\n\t[$framerInternal.marshal](): ImageVariableData {\n\t\treturn this.#data\n\t}\n}\n\nconst fileVariableClass = `File${classSuffix}`\nconst fileVariableType = classToType(fileVariableClass)\n\ninterface WithFileVariableClass {\n\t[classKey]: typeof fileVariableClass\n}\n\ninterface WithFileVariableType {\n\ttype: typeof fileVariableType\n}\n\ninterface WithFileDefaultValueData {\n\tdefaultValue: FileAssetData\n}\n\nexport interface WithAllowedFileTypes {\n\t/**\n\t * Supported types are:\n\t * 1. Valid media types (`\"image/png\"`, `\"audio/*\"`, `\"\u2731/\u2731\"`)\n\t * 2. File extensions with a leading dot (`\".png\"`)\n\t * 3. `\"*\"` (`.*` as a pseudo file extension was confirmed to allow everything in file pickers of all three major browser engines)\n\t * 4. File extensions WITHOUT a leading dot (`\"png\"`) \u2013 unlike in browser APIs \u2013 for backward compatibility and in case something doesn't parse as a media type\n\t * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/input/file#unique_file_type_specifiers\n\t */\n\tallowedFileTypes: string[]\n}\n\nexport interface FileVariableData\n\textends WithFileVariableClass, BaseVariableData, ExplicitPartial<WithFileDefaultValueData>, WithAllowedFileTypes {}\n\ninterface WithFileDefaultValue {\n\tdefaultValue: FileAsset\n}\n\nexport interface CreateFileVariable\n\textends WithFileVariableType, CreateVariableBase, Partial<WithFileDefaultValue>, WithAllowedFileTypes {}\n\nexport interface UpdateFileVariable\n\textends WithFileVariableType, UpdateVariableBase, Partial<WithFileDefaultValue>, Partial<WithAllowedFileTypes> {}\n\n/**\n * A file variable.\n * @category canvas\n */\nexport class FileVariable extends VariableBase {\n\treadonly type = fileVariableType\n\treadonly #data: FileVariableData\n\n\tget allowedFileTypes(): readonly string[] {\n\t\treturn this.#data.allowedFileTypes\n\t}\n\n\tconstructor(engine: PluginEngine, data: FileVariableData) {\n\t\tsuper(engine, data)\n\t\tthis.#data = data\n\t}\n\n\tstatic [$framerInternal.unmarshal](engine: PluginEngine, data: FileVariableData): FileVariable {\n\t\treturn new FileVariable(engine, data)\n\t}\n\n\t[$framerInternal.marshal](): FileVariableData {\n\t\treturn this.#data\n\t}\n}\n\nconst linkVariableClass = `Link${classSuffix}`\nconst linkVariableType = classToType(linkVariableClass)\n\ninterface WithLinkVariableClass {\n\t[classKey]: typeof linkVariableClass\n}\n\ninterface WithLinkVariableType {\n\ttype: typeof linkVariableType\n}\n\nexport interface LinkVariableData extends WithLinkVariableClass, BaseVariableData {}\n\nexport interface CreateLinkVariable extends WithLinkVariableType, CreateVariableBase {}\n\nexport interface UpdateLinkVariable extends WithLinkVariableType, UpdateVariableBase {}\n\n/**\n * A link variable.\n * @category canvas\n */\nexport class LinkVariable extends VariableBase {\n\treadonly type = linkVariableType\n\treadonly #data: LinkVariableData\n\n\tconstructor(engine: PluginEngine, data: LinkVariableData) {\n\t\tsuper(engine, data)\n\t\tthis.#data = data\n\t}\n\n\tstatic [$framerInternal.unmarshal](engine: PluginEngine, data: LinkVariableData): LinkVariable {\n\t\treturn new LinkVariable(engine, data)\n\t}\n\n\t[$framerInternal.marshal](): LinkVariableData {\n\t\treturn this.#data\n\t}\n}\n\nconst dateVariableClass = `Date${classSuffix}`\nconst dateVariableType = classToType(dateVariableClass)\n\ninterface WithDateVariableClass {\n\t[classKey]: typeof dateVariableClass\n}\n\ninterface WithDateVariableType {\n\ttype: typeof dateVariableType\n}\n\ninterface WithDisplayTime {\n\tdisplayTime?: boolean\n}\n\nexport interface DateVariableData\n\textends WithDateVariableClass, BaseVariableData, ExplicitPartial<WithStringDefaultValue>, WithDisplayTime {}\n\nexport interface CreateDateVariable\n\textends WithDateVariableType, CreateVariableBase, Partial<WithStringDefaultValue>, Partial<WithDisplayTime> {}\n\nexport interface UpdateDateVariable\n\textends WithDateVariableType, UpdateVariableBase, Partial<WithStringDefaultValue>, Partial<WithDisplayTime> {}\n\n/**\n * A date variable.\n * @category canvas\n */\nexport class DateVariable extends VariableBase {\n\treadonly type = dateVariableType\n\treadonly #data: DateVariableData\n\n\tget displayTime(): boolean | undefined {\n\t\treturn this.#data.displayTime\n\t}\n\n\tconstructor(engine: PluginEngine, data: DateVariableData) {\n\t\tsuper(engine, data)\n\t\tthis.#data = data\n\t}\n\n\tstatic [$framerInternal.unmarshal](engine: PluginEngine, data: DateVariableData): DateVariable {\n\t\treturn new DateVariable(engine, data)\n\t}\n\n\t[$framerInternal.marshal](): DateVariableData {\n\t\treturn this.#data\n\t}\n}\n\nconst borderVariableClass = `Border${classSuffix}`\nconst borderVariableType = classToType(borderVariableClass)\n\ninterface WithBorderVariableClass {\n\t[classKey]: typeof borderVariableClass\n}\n\ninterface WithBorderVariableType {\n\ttype: typeof borderVariableType\n}\n\ninterface WithBorderDefaultValueData {\n\tdefaultValue: Marshaled<Border>\n}\n\nexport interface BorderVariableData\n\textends WithBorderVariableClass, BaseVariableData, ExplicitPartial<WithBorderDefaultValueData> {}\n\ninterface WithBorderDefaultValue {\n\tdefaultValue: Border\n}\n\nexport interface CreateBorderVariable\n\textends WithBorderVariableType, CreateVariableBase, Partial<WithBorderDefaultValue> {}\n\nexport interface UpdateBorderVariable\n\textends WithBorderVariableType, UpdateVariableBase, Partial<WithBorderDefaultValue> {}\n\n/**\n * A border variable.\n * @category canvas\n */\nexport class BorderVariable extends VariableBase {\n\treadonly type = borderVariableType\n\treadonly #data: BorderVariableData\n\n\tconstructor(engine: PluginEngine, data: BorderVariableData) {\n\t\tsuper(engine, data)\n\t\tthis.#data = data\n\t}\n\n\tstatic [$framerInternal.unmarshal](engine: PluginEngine, data: BorderVariableData): BorderVariable {\n\t\treturn new BorderVariable(engine, data)\n\t}\n\n\t[$framerInternal.marshal](): BorderVariableData {\n\t\treturn this.#data\n\t}\n}\n\nconst unsupportedVariableClass = `Unsupported${classSuffix}`\nconst unsupportedVariableType = classToType(unsupportedVariableClass)\n\ninterface WithUnsupportedVariableClass {\n\t[classKey]: typeof unsupportedVariableClass\n}\n\ninterface WithUnsupportedVariableType {\n\ttype: typeof unsupportedVariableType\n}\n\nexport interface UnsupportedVariableData extends WithUnsupportedVariableClass, BaseVariableData {}\n\nexport interface UpdateUnsupportedVariable extends WithUnsupportedVariableType, UpdateVariableBase {}\n\n/**\n * A variable type not yet supported by the plugin API.\n * @category canvas\n */\nexport class UnsupportedVariable extends VariableBase {\n\treadonly type = unsupportedVariableType\n\treadonly #data: UnsupportedVariableData\n\n\tconstructor(engine: PluginEngine, data: UnsupportedVariableData) {\n\t\tsuper(engine, data)\n\t\tthis.#data = data\n\t}\n\n\tstatic [$framerInternal.unmarshal](engine: PluginEngine, data: UnsupportedVariableData): UnsupportedVariable {\n\t\treturn new UnsupportedVariable(engine, data)\n\t}\n\n\t[$framerInternal.marshal](): UnsupportedVariableData {\n\t\treturn this.#data\n\t}\n}\n\nexport type VariableData =\n\t| BooleanVariableData\n\t| NumberVariableData\n\t| StringVariableData\n\t| FormattedTextVariableData\n\t| EnumVariableData\n\t| ColorVariableData\n\t| ImageVariableData\n\t| FileVariableData\n\t| LinkVariableData\n\t| DateVariableData\n\t| BorderVariableData\n\t| UnsupportedVariableData\n\nexport type CreateVariable =\n\t| CreateBooleanVariable\n\t| CreateNumberVariable\n\t| CreateStringVariable\n\t| CreateFormattedTextVariable\n\t| CreateEnumVariable\n\t| CreateColorVariable\n\t| CreateImageVariable\n\t| CreateFileVariable\n\t| CreateLinkVariable\n\t| CreateDateVariable\n\t| CreateBorderVariable\n\nexport type UpdateVariable =\n\t| UpdateBooleanVariable\n\t| UpdateNumberVariable\n\t| UpdateStringVariable\n\t| UpdateFormattedTextVariable\n\t| UpdateEnumVariable\n\t| UpdateColorVariable\n\t| UpdateImageVariable\n\t| UpdateFileVariable\n\t| UpdateLinkVariable\n\t| UpdateDateVariable\n\t| UpdateBorderVariable\n\t| UpdateUnsupportedVariable\n\nexport type ComponentVariable =\n\t| BooleanVariable\n\t| NumberVariable\n\t| StringVariable\n\t| FormattedTextVariable\n\t| EnumVariable\n\t| ColorVariable\n\t| ImageVariable\n\t| FileVariable\n\t| LinkVariable\n\t| DateVariable\n\t| BorderVariable\n\t| UnsupportedVariable\n\nexport type Variable = ComponentVariable\n\nexport function isVariable(value: unknown): value is Variable {\n\treturn value instanceof VariableBase\n}\n\nexport function isComponentVariable(value: unknown): value is ComponentVariable {\n\treturn isVariable(value) && value.nodeType === \"component\"\n}\n", "import type { PluginEngine } from \"./engine.ts\"\nimport { $framerInternal } from \"./internal.ts\"\nimport { classKey } from \"./utils.ts\"\n\n// This is just a placeholder. Use variables for inspiration when implementing.\n\nexport type ComputedValue = UnsupportedComputedValue\n\nabstract class ComputedValueBase {\n\tabstract readonly type: typeof unsupportedComputedValueType\n}\n\nconst unsupportedComputedValueClass = \"UnsupportedComputedValue\"\nconst unsupportedComputedValueType = \"unsupported\"\n\ninterface WithUnsupportedComputedValueClass {\n\t[classKey]: typeof unsupportedComputedValueClass\n}\n\nexport type UnsupportedComputedValueData = WithUnsupportedComputedValueClass\n\n/**\n * A computed value type not yet supported by the plugin API.\n * @category canvas\n */\nexport class UnsupportedComputedValue extends ComputedValueBase {\n\treadonly type = unsupportedComputedValueType\n\treadonly #data: UnsupportedComputedValueData\n\n\tconstructor(data: UnsupportedComputedValueData) {\n\t\tsuper()\n\t\tthis.#data = data\n\t}\n\n\tstatic [$framerInternal.unmarshal](_: PluginEngine, data: UnsupportedComputedValueData): UnsupportedComputedValue {\n\t\treturn new UnsupportedComputedValue(data)\n\t}\n\n\t[$framerInternal.marshal](): UnsupportedComputedValueData {\n\t\treturn this.#data\n\t}\n}\n\nexport function isComputedValue(value: unknown): value is ComputedValueBase {\n\treturn value instanceof ComputedValueBase\n}\n", "import type { Prettify } from \"./Prettify.ts\"\nimport type { PluginEngine } from \"./engine.ts\"\nimport { $framerInternal } from \"./internal.ts\"\nimport { classKey, isNumber, isObject, isString } from \"./utils.ts\"\n\nconst fontClassDiscriminator = \"Font\"\ntype FontSelector = string\n\nexport interface FontData {\n\t[classKey]: typeof fontClassDiscriminator\n\tselector: FontSelector\n\tfamily: string\n\tweight: FontWeight | null\n\tstyle: FontStyle | null\n}\n\nexport function isFontData(value: unknown): value is FontData {\n\treturn isObject(value) && value[classKey] === fontClassDiscriminator\n}\n\nexport type FontAttributes = Prettify<\n\tPartial<{\n\t\tweight: FontWeight\n\t\tstyle: FontStyle\n\t}>\n>\n\nconst fontStyles = [\"normal\", \"italic\"] as const\nexport type FontStyle = (typeof fontStyles)[number]\n\nconst fontWeights = [100, 200, 300, 400, 500, 600, 700, 800, 900] as const\n/**\n * Boldness as an absolute value.\n *\n *  These values are usually associated with the following names:\n * - `100` - Thin\n * - `200` - Extra Light (Ultra Light)\n * - `300` - Light\n * - `400` - Normal\n * - `500` - Medium\n * - `600` - Semi Bold (Demi Bold)\n * - `700` - Bold\n * - `800` - Extra Bold\n * - `900` - Black (Heavy)\n * */\nexport type FontWeight = (typeof fontWeights)[number]\n\nexport function isFontWeight(value: unknown): value is FontWeight {\n\tif (!isNumber(value)) return false\n\n\tswitch (value) {\n\t\tcase 100:\n\t\tcase 200:\n\t\tcase 300:\n\t\tcase 400:\n\t\tcase 500:\n\t\tcase 600:\n\t\tcase 700:\n\t\tcase 800:\n\t\tcase 900:\n\t\t\treturn true\n\t\tdefault:\n\t\t\treturn false\n\t}\n}\n\nexport function isFontStyle(value: unknown): value is FontStyle {\n\tif (!isString(value)) return false\n\n\tswitch (value) {\n\t\tcase \"normal\":\n\t\tcase \"italic\":\n\t\t\treturn true\n\t\tdefault:\n\t\t\treturn false\n\t}\n}\n\nexport function isFont(value: unknown): value is Font {\n\tif (!isObject(value)) return false\n\treturn isString(value.family) && isString(value.selector) && isFontWeight(value.weight) && isFontStyle(value.style)\n}\n\n/**\n * A font available in the project, including custom uploaded fonts.\n * @category canvas\n */\nexport class Font {\n\t/** An identifier used internally for differentiating fonts. */\n\treadonly selector: string\n\t/** Name of the family the font belongs to. */\n\treadonly family: string\n\t/**\n\t * Specifies how thin or bold the font appears.\n\t *\n\t * Note: This will be `null` for custom fonts since their weight isn't\n\t * calculated.\n\t * */\n\treadonly weight: FontWeight | null\n\t/**\n\t * Specifies if the font is normal or _italic_.\n\t *\n\t * Note: This will be `null` for custom fonts since their weight isn't\n\t * calculated.\n\t * */\n\treadonly style: FontStyle | null\n\n\tconstructor(data: FontData) {\n\t\tthis.selector = data.selector\n\t\tthis.family = data.family\n\t\tthis.weight = data.weight\n\t\tthis.style = data.style\n\t}\n\n\tstatic [$framerInternal.unmarshal](_: PluginEngine, data: FontData): Font {\n\t\tconst existingFont = fontInstanceCache.get(data.selector)\n\t\tif (existingFont) return existingFont\n\n\t\tconst font = new Font(data)\n\t\tfontInstanceCache.set(data.selector, font)\n\n\t\treturn font\n\t}\n\n\t[$framerInternal.marshal](): FontData {\n\t\treturn {\n\t\t\t[classKey]: \"Font\",\n\t\t\tselector: this.selector,\n\t\t\tfamily: this.family,\n\t\t\tweight: this.weight,\n\t\t\tstyle: this.style,\n\t\t}\n\t}\n}\n\nconst fontInstanceCache = new Map<FontSelector, Font>()\n", "import type { CSSDimension, CSSUnit } from \"./css.ts\"\nimport type { PluginEngine } from \"./engine.ts\"\nimport { $framerInternal } from \"./internal.ts\"\nimport { marshal } from \"./marshal.ts\"\nimport type { ColorStyle, ColorStyleData } from \"./styles.ts\"\nimport { unmarshal } from \"./unmarshal.ts\"\nimport { assert, type ClassKey, classKey, isString } from \"./utils.ts\"\n\n// ColorStyle is NOT implemented yet, it's there only to encourage plugin authors to do an\n// isColorStyle check on ColorStop.color.\n\nexport interface ColorStopData {\n\tcolor: ColorStyleData | string\n\tposition: number\n}\n\ninterface BaseGradientData {\n\tstops: readonly ColorStopData[]\n}\n\nconst linearGradientType = \"LinearGradient\" as const\ntype LinearGradientType = typeof linearGradientType\n\nexport interface LinearGradientData extends BaseGradientData {\n\t[classKey]: LinearGradientType\n\tangle: number\n}\n\nconst radialGradientType = \"RadialGradient\" as const\ntype RadialGradientType = typeof radialGradientType\n\nexport interface RadialGradientData extends BaseGradientData {\n\t[classKey]: RadialGradientType\n\twidth: CSSDimension<CSSUnit.Percentage>\n\theight: CSSDimension<CSSUnit.Percentage>\n\tx: CSSDimension<CSSUnit.Percentage>\n\ty: CSSDimension<CSSUnit.Percentage>\n}\n\nconst conicGradientType = \"ConicGradient\" as const\ntype ConicGradientType = typeof conicGradientType\n\nexport interface ConicGradientData extends BaseGradientData {\n\t[classKey]: ConicGradientType\n\tangle: number\n\tx: CSSDimension<CSSUnit.Percentage>\n\ty: CSSDimension<CSSUnit.Percentage>\n}\n\nexport type GradientData = LinearGradientData | RadialGradientData | ConicGradientData\n\nexport interface ColorStop {\n\t/** CSS color */\n\tcolor: ColorStyle | string\n\t/** 0-1 */\n\tposition: number\n}\n\ninterface UnmarshaledGradientBase {\n\tstops: readonly ColorStop[]\n}\n\ninterface UnmarshaledLinearGradient extends UnmarshaledGradientBase {\n\t[classKey]: LinearGradientType\n\tangle: number\n}\n\ninterface UnmarshaledRadialGradient extends UnmarshaledGradientBase {\n\t[classKey]: RadialGradientType\n\twidth: CSSDimension<CSSUnit.Percentage>\n\theight: CSSDimension<CSSUnit.Percentage>\n\tx: CSSDimension<CSSUnit.Percentage>\n\ty: CSSDimension<CSSUnit.Percentage>\n}\n\ninterface UnmarshaledConicGradient extends UnmarshaledGradientBase {\n\t[classKey]: ConicGradientType\n\tangle: number\n\tx: CSSDimension<CSSUnit.Percentage>\n\ty: CSSDimension<CSSUnit.Percentage>\n}\n\ntype UnmarshaledGradient = UnmarshaledLinearGradient | UnmarshaledRadialGradient | UnmarshaledConicGradient\n\ntype UnmarshaledGradientAttributes = Omit<UnmarshaledGradient, ClassKey>\n\nexport type ExtractUnmarshaledGradientAttributes<T extends { [classKey]: UnmarshaledGradient[ClassKey] }> = Omit<\n\tExtract<UnmarshaledGradient, { [classKey]: T[ClassKey] }>,\n\tClassKey\n>\n\nabstract class GradientBase {\n\tabstract readonly [classKey]: UnmarshaledGradient[ClassKey]\n\treadonly #unmarshaledAttributes: UnmarshaledGradientAttributes\n\n\t/** Color stops with position */\n\tget stops(): readonly ColorStop[] {\n\t\treturn this.#unmarshaledAttributes.stops\n\t}\n\n\t// Taking unmarshaled data and not wire data for backward compatibility\n\tconstructor(unmarshaledAttributes: UnmarshaledGradientAttributes) {\n\t\tthis.#unmarshaledAttributes = unmarshaledAttributes\n\t}\n\n\t// Marshaling could live here, but it might not always be identical, and the generics are\n\t// challenging to get right.\n\n\tcloneWithAttributes(attributes: Partial<ExtractUnmarshaledGradientAttributes<typeof this>>): typeof this {\n\t\t// See FieldBase.setAttributes for why this cast in unavoidable\n\t\tconst Class = this.constructor as new (...args: ConstructorParameters<typeof GradientBase>) => typeof this\n\n\t\t// Careful with this, the generics are so hairy that it will accept almost anything\n\t\treturn new Class({ ...this.#unmarshaledAttributes, ...attributes })\n\t}\n}\n\ntype UnmarshaledLinearGradientAttributes = Omit<UnmarshaledLinearGradient, ClassKey>\n\n/**\n * A linear gradient with two or more color stops.\n * @category canvas\n */\nexport class LinearGradient extends GradientBase {\n\treadonly [classKey] = linearGradientType\n\treadonly #unmarshaledAttributes: UnmarshaledLinearGradientAttributes\n\n\t/** 0-360 */\n\tget angle(): number {\n\t\treturn this.#unmarshaledAttributes.angle\n\t}\n\n\tconstructor(unmarshaledAttributes: UnmarshaledLinearGradientAttributes) {\n\t\tsuper(unmarshaledAttributes)\n\t\tthis.#unmarshaledAttributes = unmarshaledAttributes\n\t}\n\n\tstatic [$framerInternal.unmarshal](engine: PluginEngine, data: LinearGradientData): LinearGradient {\n\t\treturn new LinearGradient({ ...data, stops: unmarshal(engine, data.stops) })\n\t}\n\n\t[$framerInternal.marshal](): LinearGradientData {\n\t\treturn marshal({ ...this.#unmarshaledAttributes, [classKey]: this[classKey] })\n\t}\n\n\ttoCSS(): string {\n\t\tconst cssColorStops = this.#unmarshaledAttributes.stops\n\t\t\t.map(stop => {\n\t\t\t\tassert(isString(stop.color), \"ColorStyle not supported yet\")\n\t\t\t\treturn `${stop.color} ${stop.position * 100}%`\n\t\t\t})\n\t\t\t.join(\", \")\n\n\t\treturn `linear-gradient(${this.angle}deg, ${cssColorStops})`\n\t}\n}\n\ntype UnmarshaledRadialGradientAttributes = Omit<UnmarshaledRadialGradient, ClassKey>\n\n/**\n * A radial gradient with two or more color stops.\n * @category canvas\n */\nexport class RadialGradient extends GradientBase {\n\treadonly [classKey] = radialGradientType\n\treadonly #unmarshaledAttributes: UnmarshaledRadialGradientAttributes\n\n\t/** Relative width */\n\tget width(): CSSDimension<CSSUnit.Percentage> {\n\t\treturn this.#unmarshaledAttributes.width\n\t}\n\n\t/** Relative height */\n\tget height(): CSSDimension<CSSUnit.Percentage> {\n\t\treturn this.#unmarshaledAttributes.height\n\t}\n\n\t/** Relative horizontal position */\n\tget x(): CSSDimension<CSSUnit.Percentage> {\n\t\treturn this.#unmarshaledAttributes.x\n\t}\n\n\t/** Relative vertical position */\n\tget y(): CSSDimension<CSSUnit.Percentage> {\n\t\treturn this.#unmarshaledAttributes.y\n\t}\n\n\tconstructor(unmarshaledAttributes: UnmarshaledRadialGradientAttributes) {\n\t\tsuper(unmarshaledAttributes)\n\t\tthis.#unmarshaledAttributes = unmarshaledAttributes\n\t}\n\n\tstatic [$framerInternal.unmarshal](engine: PluginEngine, data: RadialGradientData): RadialGradient {\n\t\treturn new RadialGradient({ ...data, stops: unmarshal(engine, data.stops) })\n\t}\n\n\t[$framerInternal.marshal](): RadialGradientData {\n\t\treturn marshal({ ...this.#unmarshaledAttributes, [classKey]: this[classKey] })\n\t}\n\n\ttoCSS(): string {\n\t\t// When both gradient stops are at 100% the gradient is a circle. This however is not\n\t\t// supported by Safari, so we need to make sure that one of the stops is not at 100%. We do\n\t\t// this by setting the stop before the last stop to slightly less than 100%.\n\t\tconst cssStops = this.stops\n\t\t\t.map((stop, index) => {\n\t\t\t\tassert(isString(stop.color), \"ColorStyle not supported yet\")\n\t\t\t\tconst nextStop = this.stops[index + 1]\n\t\t\t\tconst position = stop.position === 1 && nextStop?.position === 1 ? stop.position - 0.0001 : stop.position\n\t\t\t\treturn `${stop.color} ${position * 100}%`\n\t\t\t})\n\t\t\t.join(\", \")\n\n\t\treturn `radial-gradient(${this.width} ${this.height} at ${this.x} ${this.y}, ${cssStops})`\n\t}\n}\n\ntype UnmarshaledConicGradientAttributes = Omit<UnmarshaledConicGradient, ClassKey>\n\n/**\n * A conic (angular) gradient with two or more color stops.\n * @category canvas\n */\nexport class ConicGradient extends GradientBase {\n\treadonly [classKey] = conicGradientType\n\treadonly #unmarshaledAttributes: UnmarshaledConicGradientAttributes\n\n\t/** 0-360 */\n\tget angle(): number {\n\t\treturn this.#unmarshaledAttributes.angle\n\t}\n\n\t/** Relative horizontal position */\n\tget x(): CSSDimension<CSSUnit.Percentage> {\n\t\treturn this.#unmarshaledAttributes.x\n\t}\n\n\t/** Relative vertical position */\n\tget y(): CSSDimension<CSSUnit.Percentage> {\n\t\treturn this.#unmarshaledAttributes.y\n\t}\n\n\tconstructor(unmarshaledAttributes: UnmarshaledConicGradientAttributes) {\n\t\tsuper(unmarshaledAttributes)\n\t\tthis.#unmarshaledAttributes = unmarshaledAttributes\n\t}\n\n\tstatic [$framerInternal.unmarshal](engine: PluginEngine, data: ConicGradientData): ConicGradient {\n\t\treturn new ConicGradient({ ...data, stops: unmarshal(engine, data.stops) })\n\t}\n\n\t[$framerInternal.marshal](): ConicGradientData {\n\t\treturn marshal({ ...this.#unmarshaledAttributes, [classKey]: this[classKey] })\n\t}\n\n\ttoCSS(): string {\n\t\tconst cssStops = this.stops\n\t\t\t.map(stop => {\n\t\t\t\tassert(isString(stop.color), \"ColorStyle not supported yet\")\n\t\t\t\treturn `${stop.color} ${stop.position * 360}deg`\n\t\t\t})\n\t\t\t.join(\", \")\n\n\t\treturn `conic-gradient(from ${this.angle}deg at ${this.x} ${this.y}, ${cssStops})`\n\t}\n}\n\nexport type Gradient = LinearGradient | RadialGradient | ConicGradient\n\nexport function isGradient(value: unknown): value is Gradient {\n\treturn value instanceof GradientBase\n}\n", "import type { Prettify } from \"./Prettify.ts\"\nimport type { CSSDimension, CSSUnit } from \"./css.ts\"\nimport type { PluginEngine } from \"./engine.ts\"\nimport { Font, type FontData } from \"./fonts.ts\"\nimport { $framerInternal } from \"./internal.ts\"\nimport type {\n\tTextAlignment,\n\tTextDecoration,\n\tTextDecorationSkipInk,\n\tTextDecorationStyle,\n\tTextTransform,\n} from \"./text.ts\"\nimport type { NodeId } from \"./traits.ts\"\nimport { classKey, isObject } from \"./utils.ts\"\n\nconst colorStyleDiscriminator = \"ColorStyle\" as const\n\n// Define mutually exclusive attributes\ninterface WithAssetName {\n\tname?: string\n\tpath?: never\n}\n\ninterface WithAssetPath {\n\tname?: never\n\tpath?: string\n}\n\ntype AssetPath = WithAssetName | WithAssetPath\n\n// RequiredColorStyleAttributes now enforces mutual exclusivity between name and path\ninterface RequiredColorStyleAttributes {\n\tlight: string\n}\n\ninterface OptionalColorStyleAttributes {\n\tdark: string | null\n}\n\nexport interface ColorStyleData extends RequiredColorStyleAttributes, OptionalColorStyleAttributes {\n\t[classKey]: typeof colorStyleDiscriminator\n\tid: NodeId\n\tname: string\n\tpath: string\n}\n\nexport function isColorStyleData(data: unknown): data is ColorStyleData {\n\tif (!isObject(data)) return false\n\n\treturn data[classKey] === colorStyleDiscriminator\n}\n\nexport type ColorStyleAttributes = Prettify<\n\tRequiredColorStyleAttributes & Partial<OptionalColorStyleAttributes> & AssetPath\n>\n\n/**\n * A reusable color style defined in the project. Supports light and dark\n * theme variants. Color styles let you manage color appearances from one\n * place in a project. In the UI, you can find them in the Assets panel.\n * Plugins can use these styles to do things like sync design systems or\n * check accessibility.\n *\n * Colors are stored in RGBA format, e.g. `rgba(242, 59, 57, 1)`. The\n * `light` attribute is the default color used in light theme. The `dark`\n * attribute is an optional color used in the dark theme.\n *\n * To organize color styles into folders, use `/` as a separator in the\n * name, e.g. `\"My Plugin/My Cool Color\"`.\n *\n * @example\n * ```ts\n * // Create a new color style with light and dark variants.\n * const colorStyle = await framer.createColorStyle({\n *   name: \"My Cool Color\",\n *   light: \"rgba(242, 59, 57, 1)\",\n *   dark: \"rgba(120, 22, 11, 1)\"\n * })\n *\n * // Update an existing color style.\n * await colorStyle.setAttributes({ dark: \"rgba(10, 10, 10, 0.2)\" })\n *\n * // Remove a color style from the project.\n * await colorStyle.remove()\n *\n * // Store plugin data on a color style.\n * await colorStyle.setPluginData(\"key\", \"value\")\n * ```\n * @category canvas\n */\nexport class ColorStyle {\n\t/** A unique identifier for the color style. */\n\treadonly id: NodeId\n\treadonly name: string\n\t/**\n\t * Hierarchical path to the color style in the assets folder structure, e.g. `ui/modals/background`.\n\t * Used for organizing color styles in the UI and for programmatic access.\n\t * Segments are separated by forward slashes.\n\t */\n\treadonly path: string\n\t/** Color used for the default or light theme in RGBA format, e.g `rgba(242, 59, 57, 1)` */\n\treadonly light: string\n\t/** Optional color used for the dark theme in RGBA format, e.g `rgba(242, 59, 57, 1)` */\n\treadonly dark: string | null\n\n\t#engine: PluginEngine\n\n\tconstructor(engine: PluginEngine, data: ColorStyleData) {\n\t\tthis.id = data.id\n\t\tthis.name = data.name\n\t\tthis.light = data.light\n\t\tthis.dark = data.dark\n\t\tthis.path = data.path\n\n\t\tthis.#engine = engine\n\t}\n\n\tstatic [$framerInternal.unmarshal](engine: PluginEngine, data: ColorStyleData): ColorStyle {\n\t\treturn new ColorStyle(engine, data)\n\t}\n\n\t[$framerInternal.marshal](): ColorStyleData {\n\t\treturn {\n\t\t\t[classKey]: \"ColorStyle\",\n\t\t\tid: this.id,\n\t\t\tname: this.name,\n\t\t\tlight: this.light,\n\t\t\tdark: this.dark,\n\t\t\tpath: this.path,\n\t\t}\n\t}\n\n\t/**\n\t * Set the attributes of a color style. Attributes are merged with existing\n\t * values, so only the provided attributes are updated.\n\t *\n\t * @param update - The attributes to update.\n\t * @returns The updated color style, or `null` if the style was not found.\n\t *\n\t * Use `\"ColorStyle.setAttributes\"` to check if this method is allowed.\n\t *\n\t * @example\n\t * ```ts\n\t * await colorStyle.setAttributes({ dark: \"rgba(10, 10, 10, 0.2)\" })\n\t * ```\n\t */\n\tasync setAttributes(update: Partial<ColorStyleAttributes>): Promise<ColorStyle | null> {\n\t\tconst colorStyleData = await this.#engine.invoke(\"setColorStyleAttributes\", this.id, update)\n\t\tif (!colorStyleData) return null\n\n\t\treturn new ColorStyle(this.#engine, colorStyleData)\n\t}\n\n\t/**\n\t * Get plugin data for this color style by key.\n\t *\n\t * @param key - The plugin data key.\n\t * @returns The stored value, or `null` if no data exists for the key.\n\t */\n\tasync getPluginData(key: string): Promise<string | null> {\n\t\treturn this.#engine.invoke(\"getPluginDataForNode\", this.id, key)\n\t}\n\n\t/**\n\t * Set plugin data on this color style by key.\n\t *\n\t * @param key - The plugin data key.\n\t * @param value - The value to set, or `null` to remove.\n\t *\n\t * Use `\"ColorStyle.setPluginData\"` to check if this method is allowed.\n\t *\n\t * @example\n\t * ```ts\n\t * await colorStyle.setPluginData(\"key\", \"value\")\n\t * ```\n\t */\n\tasync setPluginData(key: string, value: string | null): Promise<void> {\n\t\treturn this.#engine.invoke(\"setPluginDataForNode\", this.id, key, value)\n\t}\n\n\t/**\n\t * Get all plugin data keys for this color style.\n\t *\n\t * @returns An array of all plugin data keys set on this color style.\n\t */\n\tasync getPluginDataKeys() {\n\t\treturn this.#engine.invoke(\"getPluginDataKeysForNode\", this.id)\n\t}\n\n\t/**\n\t * Deletes the color style from the project. You need a reference to the\n\t * style to call this method.\n\t *\n\t * Use `\"ColorStyle.remove\"` to check if this method is allowed.\n\t *\n\t * @example\n\t * ```ts\n\t * await colorStyle.remove()\n\t * ```\n\t */\n\tasync remove(): Promise<void> {\n\t\treturn this.#engine.invoke(\"removeColorStyle\", this.id)\n\t}\n}\n\nexport function isColorStyle(value: unknown): value is ColorStyle {\n\treturn value instanceof ColorStyle\n}\n\n// These are the same as rich text tags in `WithRichTextTag` trait in Vekter.\nexport type TextStyleTag = \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\"\n\nexport interface TextStyleBreakpointData {\n\t/**\n\t * How big does the window width need to be for this breakpoint's styles to\n\t * take affect.\n\t *\n\t * This must be unique for each breakpoint.\n\t * */\n\tminWidth: number\n\t/** Size of the text at this breakpoint. */\n\tfontSize: CSSDimension<CSSUnit.Pixel | CSSUnit.Rem>\n\t/** Size of the space between each letter at this breakpoint. */\n\tletterSpacing: CSSDimension<CSSUnit.Pixel | CSSUnit.Em>\n\t/** Size of the space between each line of text at this breakpoint. */\n\tlineHeight: CSSDimension<CSSUnit.Pixel | CSSUnit.Em | CSSUnit.Percentage>\n\t/** Size of the space between each paragraph at this breakpoint. */\n\tparagraphSpacing: number\n}\n\n// Ensure `minWidth` is the only required attribute and everything else is optional.\nexport type TextStyleBreakpointAttributes = Prettify<\n\tPartial<TextStyleBreakpointData> & Pick<TextStyleBreakpointData, \"minWidth\">\n>\n\nexport type TextStyleBreakpoint = Prettify<TextStyleBreakpointData>\n\nconst textStyleDiscriminator = \"TextStyle\" as const\n\nexport interface TextStyleData extends TextStyleBreakpointData {\n\t[classKey]: typeof textStyleDiscriminator\n\tid: NodeId\n\tname: string\n\tpath: string\n\ttag: TextStyleTag\n\tcolor: ColorStyleData | string\n\tfont: FontData\n\tboldFont: FontData | null\n\titalicFont: FontData | null\n\tboldItalicFont: FontData | null\n\ttransform: TextTransform\n\talignment: TextAlignment\n\tdecoration: TextDecoration\n\tdecorationColor: ColorStyleData | string\n\tdecorationThickness: \"auto\" | CSSDimension<CSSUnit.Pixel | CSSUnit.Em>\n\tdecorationStyle: TextDecorationStyle\n\tdecorationSkipInk: TextDecorationSkipInk\n\tdecorationOffset: \"auto\" | CSSDimension<CSSUnit.Pixel | CSSUnit.Em>\n\tbalance: boolean\n\tbreakpoints: TextStyleBreakpointData[]\n}\n\nexport function isTextStyleData(data: unknown): data is TextStyleData {\n\tif (!isObject(data)) return false\n\n\treturn data[classKey] === textStyleDiscriminator\n}\n\nexport type TextStyleAttributes = Prettify<\n\tPartial<\n\t\tOmit<TextStyleData, \"id\" | \"color\" | \"font\" | \"boldFont\" | \"italicFont\" | \"boldItalicFont\" | \"breakpoints\"> & {\n\t\t\tcolor: ColorStyle | string\n\t\t\t// Ensure font and all font variants are of type `Font` and not `FontData`.\n\t\t\tfont: Font\n\t\t\tboldFont: Font | null\n\t\t\titalicFont: Font | null\n\t\t\tboldItalicFont: Font | null\n\t\t\t// Ensure `breakpoints` is of type `TextStyleBreakpointAttributes` and not `TextStyleBreakpointData`\n\t\t\tbreakpoints: TextStyleBreakpointAttributes[]\n\t\t}\n\t> &\n\t\tAssetPath\n>\n\n/**\n * A reusable text style defined in the project, including font, size,\n * color, and responsive breakpoints. Text styles let you manage text\n * appearances from one place in a project. In the UI, you can find them\n * in the Assets panel.\n *\n * Text styles support responsive breakpoints that apply different values\n * at different window widths. A maximum of four breakpoints can be added.\n * Breakpoints are automatically ordered from largest to smallest `minWidth`.\n * Each breakpoint must have a unique `minWidth` value.\n *\n * By default, text styles use a built-in font. Use\n * {@link Font} to customize a text style's typeface. All font variants\n * (bold, italic, boldItalic) must share the same font family as the base\n * font.\n *\n * To organize text styles into folders, use `/` as a separator in the\n * name, e.g. `\"My Plugin/Heading\"`.\n *\n * @example\n * ```ts\n * // Create a new text style.\n * const textStyle = await framer.createTextStyle({\n *   name: \"Heading\",\n *   tag: \"h1\",\n *   fontSize: \"30px\",\n *   lineHeight: \"1.6em\",\n * })\n *\n * // Create a text style with responsive breakpoints.\n * const textStyle = await framer.createTextStyle({\n *   fontSize: \"24px\",\n *   minWidth: 1280,\n *   breakpoints: [\n *     { minWidth: 1024, fontSize: \"18px\" },\n *     { minWidth: 320, fontSize: \"16px\" }\n *   ]\n * })\n *\n * // Update an existing text style.\n * await textStyle.setAttributes({\n *   color: \"rgba(242, 59, 57, 1)\"\n * })\n *\n * // Create a text style with a custom font.\n * const font = await framer.getFont(\"Open Sans\")\n * if (font) {\n *   const textStyle = await framer.createTextStyle({ font })\n * }\n *\n * // Remove a text style from the project.\n * await textStyle.remove()\n * ```\n * @category canvas\n */\nexport class TextStyle {\n\treadonly id: NodeId\n\treadonly name: string\n\n\t/**\n\t * Hierarchical path to the text style in the assets folder structure, e.g. `ui/modals/text`.\n\t * Used for organizing text styles in the UI and for programmatic access.\n\t * Segments are separated by forward slashes.\n\t */\n\treadonly path: string\n\t/** HTML tag that the style will use. */\n\treadonly tag: TextStyleTag\n\n\t/**\n\t * Base font of the text.\n\t *\n\t * Setting this will automatically update `boldFont`, `italicFont` or\n\t * `boldItalicFont` with the appropriate variants if they are not already\n\t * specified.\n\t * */\n\treadonly font: Font\n\t/**\n\t * Font to use for bold text.\n\t *\n\t * Note: This must have the same family name as the base `font` attribute.\n\t * */\n\treadonly boldFont: Font | null\n\t/**\n\t * Font to use for italic text.\n\t *\n\t * Note: This must be the same family name as the base `font` attribute.\n\t * */\n\treadonly italicFont: Font | null\n\t/**\n\t * Font to use for bold italic text.\n\t *\n\t * Note: This must have the same family name as the base `font` attribute.\n\t * */\n\treadonly boldItalicFont: Font | null\n\t/** Color of the text in RGBA format for all breakpoints, e.g `rgba(242, 59, 57, 1)` */\n\treadonly color: ColorStyle | string\n\t/** Specifies how to capitalize the text for all breakpoints. */\n\treadonly transform: TextTransform\n\t/** Specifies the horizontal direction of the text for all breakpoints. */\n\treadonly alignment: TextAlignment\n\t/** Appearance of any decorative lines on the text for all breakpoints. */\n\treadonly decoration: TextDecoration\n\t/** Color of the text decoration in RGBA format for all breakpoints, e.g `rgba(242, 59, 57, 1)` */\n\treadonly decorationColor: ColorStyle | string\n\t/** Thickness of the text decoration for all breakpoints. */\n\treadonly decorationThickness: \"auto\" | CSSDimension<CSSUnit.Pixel | CSSUnit.Em>\n\t/** Style of the text decoration for all breakpoints. */\n\treadonly decorationStyle: TextDecorationStyle\n\t/** Whether to skip ink when drawing the text decoration for all breakpoints. */\n\treadonly decorationSkipInk: TextDecorationSkipInk\n\t/** Offset of the text decoration for all breakpoints. */\n\treadonly decorationOffset: \"auto\" | CSSDimension<CSSUnit.Pixel | CSSUnit.Em>\n\t/** When enabled, use a text wrap method that tries to balance the number of characters on each line for legibility. */\n\treadonly balance: boolean\n\t/** A list of style overrides that take affect at specific window widths. Breakpoints are automatically sorted by `minWidth` from largest to smallest. */\n\treadonly breakpoints: TextStyleBreakpoint[]\n\n\t/**\n\t * How big does the window width need to be for primary breakpoint styles to\n\t * take affect.\n\t *\n\t * Note: This is ignored if the text style has no breakpoints.\n\t * */\n\treadonly minWidth: number\n\t/**\n\t * Size of the text of the primary breakpoint.\n\t *\n\t * Note: This is used by default when there are no breakpoints.\n\t * */\n\treadonly fontSize: CSSDimension<CSSUnit.Pixel | CSSUnit.Rem>\n\t/**\n\t * Size of the space between each letter for the primary breakpoint.\n\t *\n\t * Note: This is used by default when there are no breakpoints.\n\t * */\n\treadonly letterSpacing: CSSDimension<CSSUnit.Pixel | CSSUnit.Em>\n\t/**\n\t * Size of the space between each line of text for the primary breakpoint.\n\t *\n\t * Note: This is used by default when there are no breakpoints.\n\t * */\n\treadonly lineHeight: CSSDimension<CSSUnit.Pixel | CSSUnit.Em | CSSUnit.Percentage>\n\t/**\n\t * Size of the space between each paragraph for the primary breakpoint.\n\t *\n\t * Note: This is used by default when there are no breakpoints.\n\t * */\n\treadonly paragraphSpacing: number\n\n\t#engine: PluginEngine\n\n\tconstructor(engine: PluginEngine, data: TextStyleData) {\n\t\tthis.id = data.id\n\t\tthis.name = data.name\n\t\tthis.path = data.path\n\t\tthis.tag = data.tag\n\n\t\tthis.font = Font[$framerInternal.unmarshal](engine, data.font)\n\t\tthis.boldFont = data.boldFont && Font[$framerInternal.unmarshal](engine, data.boldFont)\n\t\tthis.italicFont = data.italicFont && Font[$framerInternal.unmarshal](engine, data.italicFont)\n\t\tthis.boldItalicFont = data.boldItalicFont && Font[$framerInternal.unmarshal](engine, data.boldItalicFont)\n\t\tthis.color = isColorStyleData(data.color) ? ColorStyle[$framerInternal.unmarshal](engine, data.color) : data.color\n\t\tthis.transform = data.transform\n\t\tthis.alignment = data.alignment\n\t\tthis.decoration = data.decoration\n\t\tthis.decorationColor = isColorStyleData(data.decorationColor)\n\t\t\t? ColorStyle[$framerInternal.unmarshal](engine, data.decorationColor)\n\t\t\t: data.decorationColor\n\t\tthis.decorationThickness = data.decorationThickness\n\t\tthis.decorationStyle = data.decorationStyle\n\t\tthis.decorationSkipInk = data.decorationSkipInk\n\t\tthis.decorationOffset = data.decorationOffset\n\t\tthis.balance = data.balance\n\t\tthis.breakpoints = data.breakpoints\n\n\t\tthis.minWidth = data.minWidth\n\t\tthis.fontSize = data.fontSize\n\t\tthis.letterSpacing = data.letterSpacing\n\t\tthis.lineHeight = data.lineHeight\n\t\tthis.paragraphSpacing = data.paragraphSpacing\n\n\t\tthis.#engine = engine\n\t}\n\n\tstatic [$framerInternal.unmarshal](engine: PluginEngine, data: TextStyleData): TextStyle {\n\t\treturn new TextStyle(engine, data)\n\t}\n\n\t[$framerInternal.marshal](): TextStyleData {\n\t\treturn {\n\t\t\t[classKey]: \"TextStyle\",\n\n\t\t\tid: this.id,\n\t\t\tname: this.name,\n\t\t\tpath: this.path,\n\t\t\ttag: this.tag,\n\n\t\t\tfont: this.font[$framerInternal.marshal](),\n\t\t\tboldFont: this.boldFont?.[$framerInternal.marshal]() ?? null,\n\t\t\titalicFont: this.italicFont?.[$framerInternal.marshal]() ?? null,\n\t\t\tboldItalicFont: this.boldItalicFont?.[$framerInternal.marshal]() ?? null,\n\t\t\tcolor: isColorStyle(this.color) ? this.color[$framerInternal.marshal]() : this.color,\n\t\t\ttransform: this.transform,\n\t\t\talignment: this.alignment,\n\t\t\tdecoration: this.decoration,\n\t\t\tdecorationColor: isColorStyle(this.decorationColor)\n\t\t\t\t? this.decorationColor[$framerInternal.marshal]()\n\t\t\t\t: this.decorationColor,\n\t\t\tdecorationThickness: this.decorationThickness,\n\t\t\tdecorationStyle: this.decorationStyle,\n\t\t\tdecorationSkipInk: this.decorationSkipInk,\n\t\t\tdecorationOffset: this.decorationOffset,\n\t\t\tbalance: this.balance,\n\t\t\tbreakpoints: this.breakpoints,\n\n\t\t\tminWidth: this.minWidth,\n\t\t\tfontSize: this.fontSize,\n\t\t\tletterSpacing: this.letterSpacing,\n\t\t\tlineHeight: this.lineHeight,\n\t\t\tparagraphSpacing: this.paragraphSpacing,\n\t\t}\n\t}\n\n\t/**\n\t * Set the attributes of the text style. All attributes except\n\t * `breakpoints` are merged with existing values. When setting\n\t * `breakpoints`, the provided array replaces any existing breakpoints\n\t * entirely. To update breakpoints without overriding them all, iterate\n\t * over the existing breakpoints and merge them.\n\t *\n\t * @param attributes - The attributes to update.\n\t * @returns The updated text style, or `null` if the style was not found.\n\t * @throws If the number of breakpoints is bigger than the limit of 4.\n\t * @throws If any of the font families used for `boldFont`, `italicFont` and\n\t * `boldItalicFont` do not match the family of `font`.\n\t *\n\t * Use `\"TextStyle.setAttributes\"` to check if this method is allowed.\n\t *\n\t * @example\n\t * ```ts\n\t * // Update the color of a text style.\n\t * const textStyle = await framer.getTextStyle(\"text-style-id\")\n\t * if (textStyle) {\n\t *   await textStyle.setAttributes({\n\t *     color: \"rgba(242, 59, 57, 1)\"\n\t *   })\n\t * }\n\t *\n\t * // Replace breakpoints on a text style.\n\t * await textStyle.setAttributes({\n\t *   breakpoints: [\n\t *     { minWidth: 320, fontSize: \"24px\" }\n\t *   ]\n\t * })\n\t *\n\t * // Scale font sizes across all breakpoints without losing them.\n\t * await textStyle.setAttributes({\n\t *   fontSize: parseInt(textStyle.fontSize) * 0.8 + \"px\",\n\t *   breakpoints: textStyle.breakpoints.map((bp) => ({\n\t *     ...bp,\n\t *     fontSize: parseInt(bp.fontSize) * 0.8 + \"px\"\n\t *   }))\n\t * })\n\t * ```\n\t */\n\tasync setAttributes(attributes: TextStyleAttributes): Promise<TextStyle | null> {\n\t\tconst textStyleData = await this.#engine.invoke(\"setTextStyleAttributes\", this.id, attributes)\n\t\tif (!textStyleData) return null\n\n\t\treturn new TextStyle(this.#engine, textStyleData)\n\t}\n\n\t/**\n\t * Get plugin data for this text style by key.\n\t *\n\t * @param key - The plugin data key.\n\t * @returns The stored value, or `null` if no data exists for the key.\n\t */\n\tasync getPluginData(key: string): Promise<string | null> {\n\t\treturn this.#engine.invoke(\"getPluginDataForNode\", this.id, key)\n\t}\n\n\t/**\n\t * Set plugin data on this text style by key.\n\t *\n\t * @param key - The plugin data key.\n\t * @param value - The value to set, or `null` to remove.\n\t *\n\t * Use `\"TextStyle.setPluginData\"` to check if this method is allowed.\n\t *\n\t * @example\n\t * ```ts\n\t * await textStyle.setPluginData(\"key\", \"value\")\n\t * ```\n\t */\n\tasync setPluginData(key: string, value: string | null): Promise<void> {\n\t\treturn this.#engine.invoke(\"setPluginDataForNode\", this.id, key, value)\n\t}\n\n\t/**\n\t * Get all plugin data keys for this text style.\n\t *\n\t * @returns An array of all plugin data keys set on this text style.\n\t */\n\tasync getPluginDataKeys() {\n\t\treturn this.#engine.invoke(\"getPluginDataKeysForNode\", this.id)\n\t}\n\n\t/**\n\t * Deletes the text style from the project. You need a reference to\n\t * the style to call this method.\n\t *\n\t * Use `\"TextStyle.remove\"` to check if this method is allowed.\n\t *\n\t * @example\n\t * ```ts\n\t * await textStyle.remove()\n\t * ```\n\t */\n\tasync remove(): Promise<void> {\n\t\treturn this.#engine.invoke(\"removeTextStyle\", this.id)\n\t}\n}\n\nexport function isTextStyle(value: unknown): value is TextStyle {\n\treturn value instanceof TextStyle\n}\n", "import { FileAsset, ImageAsset } from \"./assets.ts\"\nimport { UnsupportedComputedValue } from \"./computedValues.ts\"\nimport type { PluginEngine } from \"./engine.ts\"\nimport { Font } from \"./fonts.ts\"\nimport { ConicGradient, LinearGradient, RadialGradient } from \"./gradients.ts\"\nimport { $framerInternal } from \"./internal.ts\"\nimport { ColorStyle, TextStyle } from \"./styles.ts\"\nimport { type ClassKey, classKey, isArray, isPlainObject, isString } from \"./utils.ts\"\nimport {\n\tBooleanVariable,\n\tBorderVariable,\n\tColorVariable,\n\tDateVariable,\n\tEnumVariable,\n\tFileVariable,\n\tFormattedTextVariable,\n\tImageVariable,\n\tLinkVariable,\n\tNumberVariable,\n\tStringVariable,\n\tUnsupportedVariable,\n} from \"./variables.ts\"\n\nconst dataClassToClass = {\n\tColorStyle,\n\tConicGradient,\n\tFileAsset,\n\tFont,\n\tImageAsset,\n\tLinearGradient,\n\tRadialGradient,\n\tTextStyle,\n\n\tBooleanVariable,\n\tBorderVariable,\n\tColorVariable,\n\tDateVariable,\n\tEnumVariable,\n\tFileVariable,\n\tFormattedTextVariable,\n\tImageVariable,\n\tLinkVariable,\n\tNumberVariable,\n\tStringVariable,\n\tUnsupportedVariable,\n\n\tUnsupportedComputedValue,\n} as const\n\ntype DataClassToClass = typeof dataClassToClass\ntype DataClass = keyof DataClassToClass\n\nexport type Unmarshaled<T> = T extends { [classKey]: DataClass }\n\t? ReturnType<DataClassToClass[T[ClassKey]][typeof $framerInternal.unmarshal]>\n\t: T extends string & {}\n\t\t? T\n\t\t: T extends number & {}\n\t\t\t? T\n\t\t\t: T extends object // Covers arrays too\n\t\t\t\t? { [K in keyof T]: Unmarshaled<T[K]> }\n\t\t\t\t: T\n\nfunction isSelfUnmarshalable(value: unknown): value is { [classKey]: DataClass } {\n\treturn isPlainObject(value) && isString(value[classKey]) && value[classKey] in dataClassToClass\n}\n\n// No attempt at validation here either, we assume that data structures are backward-compatible\nexport function unmarshal<T>(engine: PluginEngine, value: T): Unmarshaled<T> {\n\ttype R = ReturnType<typeof unmarshal<T>>\n\n\tif (isSelfUnmarshalable(value)) {\n\t\t// As always, TypeScript doesn't do correlated unions, so this is as nice as it gets\n\t\treturn dataClassToClass[value[classKey]][$framerInternal.unmarshal](engine, value as never) as R\n\t}\n\n\tif (isArray(value)) return value.map(item => unmarshal(engine, item)) as R\n\n\tif (isPlainObject(value)) {\n\t\tconst result: Record<string, unknown> = {}\n\t\tfor (const key of Object.keys(value)) {\n\t\t\tresult[key] = unmarshal(engine, value[key])\n\t\t}\n\n\t\treturn result as R\n\t}\n\n\treturn value as R\n}\n", "import type { Prettify } from \"./Prettify.ts\"\nimport type { FileAsset, FileAssetData, ImageAsset, ImageAssetData } from \"./assets.ts\"\nimport { type Field, fieldDefinitionDataArrayToFieldClassInstances } from \"./collectionFields.ts\"\nimport type { PluginEngine } from \"./engine.ts\"\nimport type { Navigable, NavigableOptions } from \"./framerAPI.ts\"\nimport {\n\ttype InlineLocalizationValueByLocale,\n\ttype LocaleId,\n\ttype LocalizationGroupStatus,\n\ttype LocalizationGroupStatusByLocale,\n\ttype LocalizationSourceUpdate,\n\ttype LocalizationValue,\n\ttype LocalizedValueUpdate,\n\tfilterInlineLocalizationValues,\n} from \"./localization.ts\"\nimport type { ColorStyle, ColorStyleData } from \"./styles.ts\"\nimport type { NodeId } from \"./traits.ts\"\nimport { unmarshal } from \"./unmarshal.ts\"\nimport { assert, deepFreeze, isNotNull, isObject, isString } from \"./utils.ts\"\nimport type { CreateEnumCase, EnumCaseData, WithAllowedFileTypes } from \"./variables.ts\"\n\ntype ManagedCollectionManagedBy = \"thisPlugin\" | \"anotherPlugin\"\nexport type CollectionManagedBy = \"user\" | ManagedCollectionManagedBy\n\n/** Controls how formatted text content is processed */\nexport type ContentType = \"auto\" | \"markdown\" | \"html\"\n\nexport interface CollectionData {\n\tid: string\n\tname: string\n\tslugFieldName: string | null\n\tslugFieldBasedOn: string | null\n\t/** @deprecated Use `managedBy` instead. */\n\treadonly: boolean\n\tmanagedBy: CollectionManagedBy\n}\n\nexport interface BooleanFieldDataEntry {\n\ttype: BooleanFieldType\n\tvalue: boolean\n}\n\nexport type BooleanFieldDataEntryInput = BooleanFieldDataEntry\n\nexport interface ColorFieldDataEntryInput {\n\ttype: ColorFieldType\n\tvalue: string | ColorStyleData | null\n}\n\nexport interface ColorFieldDataEntrySerializable {\n\ttype: ColorFieldType\n\tvalue: string | ColorStyleData\n}\n\nexport interface ColorFieldDataEntry {\n\ttype: ColorFieldType\n\tvalue: string | ColorStyle\n}\n\nexport interface DateFieldDataEntryInput {\n\ttype: DateFieldType\n\tvalue: string | number | null\n}\n\nexport interface DateFieldDataEntry {\n\ttype: DateFieldType\n\tvalue: string | undefined\n}\n\nexport interface EnumFieldDataEntryInput {\n\ttype: EnumFieldType\n\tvalue: string\n}\n\nexport interface EnumFieldDataEntry {\n\ttype: EnumFieldType\n\tvalue: string\n}\n\nexport interface FileFieldDataEntryInput {\n\ttype: FileFieldType\n\tvalue: string | null\n}\n\nexport interface FileFieldDataEntrySerializable {\n\ttype: FileFieldType\n\tvalue: FileAssetData | undefined\n}\n\nexport interface FileFieldDataEntry {\n\ttype: FileFieldType\n\tvalue: FileAsset | undefined\n}\n\nexport interface LinkFieldDataEntryInput {\n\ttype: LinkFieldType\n\tvalue: string | null\n\tvalueByLocale?: LocalizationSourceUpdate\n}\n\nexport interface LinkFieldDataEntry {\n\ttype: LinkFieldType\n\tvalue: string | undefined\n\tvalueByLocale: InlineLocalizationValueByLocale\n}\n\nexport interface NumberFieldDataEntry {\n\ttype: NumberFieldType\n\tvalue: number\n}\n\nexport type NumberFieldDataEntryInput = NumberFieldDataEntry\n\nexport interface FormattedTextFieldDataEntry {\n\ttype: FormattedTextFieldType\n\tvalue: string\n\tvalueByLocale: InlineLocalizationValueByLocale\n}\n\nexport interface FormattedTextFieldDataEntryInput {\n\ttype: FormattedTextFieldType\n\tvalue: string\n\t// The existing behaviour for a long time was \"html\", to avoid breaking changes, we're making it the default again\n\t/** @default \"html\" */\n\tcontentType?: ContentType\n\tvalueByLocale?: LocalizationSourceUpdate\n}\n\nexport interface StringFieldDataEntry {\n\ttype: StringFieldType\n\tvalue: string\n\tvalueByLocale: InlineLocalizationValueByLocale\n}\n\nexport interface StringFieldDataEntryInput {\n\ttype: StringFieldType\n\tvalue: string\n\tvalueByLocale?: LocalizationSourceUpdate\n}\n\nexport interface ImageFieldDataEntryInput {\n\ttype: ImageFieldType\n\tvalue: string | null\n\talt?: string\n\taltByLocale?: LocalizationSourceUpdate\n}\n\nexport interface ImageFieldDataEntrySerializable {\n\ttype: ImageFieldType\n\tvalue: ImageAssetData | undefined\n}\n\nexport interface ImageFieldDataEntry {\n\ttype: ImageFieldType\n\tvalue: ImageAsset | undefined\n}\n\nexport interface ArrayItemSerializableData {\n\t/** Unique ID. */\n\tid: string\n\t/** Data for the fields. */\n\tfieldData: FieldSerializableData\n}\n\nconst supportedArrayItemFieldTypes: Record<SupportedFieldType | UnsupportedFieldType, boolean> = {\n\tarray: false,\n\tboolean: false,\n\tcollectionReference: false,\n\tcolor: false,\n\tdate: false,\n\tenum: false,\n\tfile: false,\n\tformattedText: false,\n\timage: true,\n\tlink: false,\n\tmultiCollectionReference: false,\n\tnumber: false,\n\tstring: false,\n\tunsupported: false,\n}\n\nfunction isSupportedArrayItemFieldType(fieldType: SupportedFieldType | UnsupportedFieldType) {\n\treturn supportedArrayItemFieldTypes[fieldType]\n}\n\nfunction isSupportedArrayItemFieldDataEntry(fieldDataEntry: FieldDataEntry): fieldDataEntry is ArrayItemFieldDataEntry {\n\treturn isSupportedArrayItemFieldType(fieldDataEntry.type)\n}\n\nexport function isArrayItemFieldDataDefinition(\n\tfield: SupportedFieldDefinitionData | UnsupportedFieldDefinitionData,\n): field is ArrayItemFieldDefinitionData {\n\treturn isSupportedArrayItemFieldType(field.type)\n}\n\ntype ArrayItemFieldDataEntry = ImageFieldDataEntry\ntype ArrayItemFieldData = Record<string, ArrayItemFieldDataEntry>\n\nexport interface ArrayItemData {\n\t/** Unique ID. */\n\tid: string\n\t/** Data for the fields. */\n\tfieldData: ArrayItemFieldData\n}\n\ntype ArrayItemFieldDataEntryInput = ImageFieldDataEntryInput\ntype ArrayItemFieldDataInput = Record<string, ArrayItemFieldDataEntryInput>\n\ninterface CreateArrayItem {\n\t/** Data for the fields. */\n\tfieldData: ArrayItemFieldDataInput | undefined\n}\n\nexport interface EditableArrayItemAttributes {\n\t/** Data for the fields. */\n\tfieldData?: ArrayItemFieldDataInput | undefined\n}\n\ninterface UpdateArrayItem extends EditableArrayItemAttributes {\n\t/** The ID of an existing item if updating. Omit if adding. */\n\tid: string\n}\n\nexport type ArrayItemInput = CreateArrayItem | UpdateArrayItem\n\nexport function isUpdateArrayItem(\n\tarrayItemInput: CreateArrayItem | UpdateArrayItem,\n): arrayItemInput is UpdateArrayItem {\n\treturn \"id\" in arrayItemInput\n}\n\nexport interface ArrayFieldDataEntryInput {\n\ttype: ArrayFieldType\n\tvalue: ArrayItemInput[]\n}\n\nexport interface ArrayFieldDataEntrySerializable {\n\ttype: ArrayFieldType\n\tvalue: ArrayItemSerializableData[]\n}\n\nexport interface ArrayItem {\n\tid: string\n\tfieldData: Readonly<ArrayItemFieldData>\n}\n\nexport interface ArrayFieldDataEntry {\n\ttype: ArrayFieldType\n\tvalue: ArrayItem[]\n}\n\nexport interface CollectionReferenceFieldDataEntryInput {\n\ttype: CollectionReferenceFieldType\n\tvalue: string | null\n}\n\nexport interface CollectionReferenceFieldDataEntry {\n\ttype: CollectionReferenceFieldType\n\tvalue: string | undefined\n}\n\nexport interface MultiCollectionReferenceFieldDataEntryInput {\n\ttype: MultiCollectionReferenceFieldType\n\tvalue: readonly string[] | null\n}\n\nexport interface MultiCollectionReferenceFieldDataEntry {\n\ttype: MultiCollectionReferenceFieldType\n\tvalue: readonly string[]\n}\n\nexport type FieldDataEntry =\n\t| BooleanFieldDataEntry\n\t| ColorFieldDataEntry\n\t| DateFieldDataEntry\n\t| EnumFieldDataEntry\n\t| FileFieldDataEntry\n\t| LinkFieldDataEntry\n\t| NumberFieldDataEntry\n\t| FormattedTextFieldDataEntry\n\t| StringFieldDataEntry\n\t| ImageFieldDataEntry\n\t| CollectionReferenceFieldDataEntry\n\t| MultiCollectionReferenceFieldDataEntry\n\t| ArrayFieldDataEntry\n\nexport type FieldDataEntrySerializable =\n\t| Exclude<FieldDataEntry, ImageFieldDataEntry | FileFieldDataEntry | ColorFieldDataEntry | ArrayFieldDataEntry>\n\t| ImageFieldDataEntrySerializable\n\t| FileFieldDataEntrySerializable\n\t| ColorFieldDataEntrySerializable\n\t| ArrayFieldDataEntrySerializable\n\nexport type FieldDataEntryInput =\n\t| BooleanFieldDataEntryInput\n\t| ColorFieldDataEntryInput\n\t| DateFieldDataEntryInput\n\t| EnumFieldDataEntryInput\n\t| FileFieldDataEntryInput\n\t| LinkFieldDataEntryInput\n\t| NumberFieldDataEntryInput\n\t| FormattedTextFieldDataEntryInput\n\t| StringFieldDataEntryInput\n\t| ImageFieldDataEntryInput\n\t| CollectionReferenceFieldDataEntryInput\n\t| MultiCollectionReferenceFieldDataEntryInput\n\t| ArrayFieldDataEntryInput\n\nexport type ApiV2FieldData = Record<string, unknown>\nexport type FieldData = Record<string, FieldDataEntry>\nexport type FieldSerializableData = Record<string, FieldDataEntrySerializable>\nexport type FieldDataInput = Record<string, FieldDataEntryInput>\n\nconst typeKey: keyof (FieldDataEntry & FieldDataEntryInput) = \"type\"\nconst valueKey: keyof (FieldDataEntry & FieldDataEntryInput) = \"value\"\n\nfunction isApiV3FieldData(data: unknown): data is FieldDataEntry | FieldDataEntryInput {\n\tif (!data || !isObject(data)) return false\n\n\treturn isSupportedCollectionFieldType(data[typeKey]) && valueKey in data\n}\n\nexport function isFieldDataEntryInput(data: unknown | FieldDataEntryInput): data is FieldDataEntryInput {\n\treturn isApiV3FieldData(data)\n}\n\nexport function isApiV3CollectionItemInput(\n\tdata: ApiV2CollectionItemInput | CollectionItemInput,\n): data is CollectionItemInput {\n\tif (\"slugByLocale\" in data) return true\n\tif (\"statusByLocale\" in data) return true\n\tif (!data.fieldData) return false\n\n\treturn Object.values(data.fieldData).some(fieldDataEntryInput => isFieldDataEntryInput(fieldDataEntryInput))\n}\n\nexport function isApiV3ManagedCollectionItemInput(\n\tdata: ApiV2ManagedCollectionItemInput | ManagedCollectionItemInput,\n): data is ManagedCollectionItemInput {\n\tif (\"slugByLocale\" in data) return true\n\tif (\"statusByLocale\" in data) return true\n\tif (!data.fieldData) return false\n\n\treturn Object.values(data.fieldData).some(fieldDataEntryInput => isFieldDataEntryInput(fieldDataEntryInput))\n}\n\nexport interface BaseCollectionItemData {\n\t/** Drafts are excluded from publishing. */\n\tdraft?: boolean | undefined\n}\n\nexport interface ApiV2CollectionItemData extends BaseCollectionItemData {\n\t/** Unique ID. */\n\tid: string\n\t/** Unique slug. */\n\tslug: string\n\t/** Data for the fields. */\n\tfieldData: ApiV2FieldData\n}\n\nexport interface CollectionItemSerializableData extends BaseCollectionItemData {\n\t/** @deprecated use `externalId ?? nodeId` to emulate the old behaviour, or use `nodeId` or `externalId` directly */\n\tid: string\n\t/** Node ID. This is a unique ID for the node that can be used to navigate to the node */\n\tnodeId: string\n\t/** External ID. This is the ID of the node in the external system */\n\texternalId: string | undefined\n\t/** Unique slug. */\n\tslug: string\n\t/** Slug by locale. */\n\tslugByLocale: InlineLocalizationValueByLocale\n\t/** Data for the fields. */\n\tfieldData: FieldSerializableData\n}\n\nexport interface CollectionItemData extends BaseCollectionItemData {\n\t/** Unique ID. */\n\tid: string\n\t/** Unique slug. */\n\tslug: string\n\t/** Slug by locale. */\n\tslugByLocale: InlineLocalizationValueByLocale\n\t/** Data for the fields. */\n\tfieldData: FieldData\n}\n\nexport interface ApiV2ManagedCollectionItemInput extends BaseCollectionItemData {\n\t/** Required unique ID of your choice. Using an ID instead of the slug helps avoid data loss. */\n\tid: string\n\t/** Unique on collection level. */\n\tslug: string\n\t/** Data for the fields. */\n\tfieldData: ApiV2FieldData\n}\n\nexport interface ManagedCollectionItemInput extends BaseCollectionItemData {\n\t/** Required unique ID of your choice. Using an ID instead of the slug helps avoid data loss. */\n\tid: string\n\t/** Unique on collection level. */\n\tslug: string\n\t/** Localized values for the slug */\n\tslugByLocale?: LocalizationSourceUpdate\n\t/** Data for the fields. */\n\tfieldData: FieldDataInput\n\t/** Status of each locale for the resulting localization  group */\n\tstatusByLocale?: LocalizationGroupStatusByLocale\n}\n\ninterface ApiV2CreateCollectionItem extends BaseCollectionItemData {\n\t/** The ID of an existing item if updating. Omit if adding. */\n\tid?: undefined\n\t/** Unique on collection level. Required if adding, optional if updating. */\n\tslug: string\n\t/** Data for the fields. */\n\tfieldData?: ApiV2FieldData | undefined\n}\n\ninterface CreateCollectionItem extends BaseCollectionItemData {\n\t/** The ID of an existing item if updating. Omit if adding. */\n\tid?: undefined\n\t/** Unique on collection level. Required if adding, optional if updating. */\n\tslug: string\n\t/** Localized values for the slug */\n\tslugByLocale?: LocalizationSourceUpdate\n\t/** Data for the fields. */\n\tfieldData?: FieldDataInput | undefined\n\t/** Status of each locale for the resulting localization  group */\n\tstatusByLocale?: LocalizationGroupStatusByLocale\n}\n\nexport interface ApiV2EditableCollectionItemAttributes extends BaseCollectionItemData {\n\t/** Unique on collection level. Required if adding, optional if updating. */\n\tslug?: string | undefined\n\t/** Data for the fields. */\n\tfieldData?: ApiV2FieldData | undefined\n}\n\nexport interface EditableCollectionItemAttributes extends BaseCollectionItemData {\n\t/** Unique on collection level. Required if adding, optional if updating. */\n\tslug?: string | undefined\n\t/** Localized values for the slug */\n\tslugByLocale?: LocalizationSourceUpdate\n\t/** Data for the fields. */\n\tfieldData?: FieldDataInput | undefined\n\t/** Status of each locale for the resulting localization  group */\n\tstatusByLocale?: Record<LocaleId, LocalizationGroupStatus>\n}\n\ninterface ApiV2EditableCollectionItemAttributesWithId extends ApiV2EditableCollectionItemAttributes {\n\t/** The ID of an existing item if updating. Omit if adding. */\n\tid: NodeId\n}\n\ninterface EditableCollectionItemAttributesWithId extends EditableCollectionItemAttributes {\n\t/** The ID of an existing item if updating. Omit if adding. */\n\tid: NodeId\n}\n\nexport type ApiV2CollectionItemInput = ApiV2CreateCollectionItem | ApiV2EditableCollectionItemAttributesWithId\nexport type CollectionItemInput = CreateCollectionItem | EditableCollectionItemAttributesWithId\n\nexport interface WithFieldId {\n\t/** Required unique ID. Use a unique identifier to prevent data loss when the field is renamed. */\n\tid: string\n}\n\ninterface WithFieldName {\n\t/** The name of the field as displayed in the UI. */\n\tname: string\n}\n\nexport interface WithFieldBasedOn {\n\t/**\n\t * The ID of the field on which this field is based.\n\t *\n\t * When set, this field will use the referenced field's value as a fallback\n\t * when no value is provided.\n\t */\n\tbasedOn: string | null\n}\n\nexport interface WithFieldRequired {\n\trequired: boolean\n}\n\ntype WithOptionalFieldRequired = Partial<WithFieldRequired>\n\nexport interface FieldDefinitionBase extends WithFieldId, WithFieldName {}\ntype CreateFieldBase = WithFieldName\ninterface UpdateFieldBase extends WithFieldId, Partial<WithFieldName> {}\n\ninterface WithIdAndOptionalUserEditable extends WithFieldId, Partial<WithUserEditable> {}\n\nexport const booleanFieldType = \"boolean\"\ntype BooleanFieldType = typeof booleanFieldType\n\ninterface BooleanFieldBase {\n\ttype: BooleanFieldType\n}\n\ninterface BooleanFieldDefinitionData extends BooleanFieldBase, FieldDefinitionBase {}\ninterface CreateBooleanField extends BooleanFieldBase, CreateFieldBase {}\ninterface UpdateBooleanField extends BooleanFieldBase, UpdateFieldBase {}\ninterface ManagedBooleanFieldInput extends CreateBooleanField, WithIdAndOptionalUserEditable {}\n\nexport const colorFieldType = \"color\"\ntype ColorFieldType = typeof colorFieldType\n\ninterface ColorFieldBase {\n\ttype: ColorFieldType\n}\n\ninterface ColorFieldDefinitionData extends ColorFieldBase, FieldDefinitionBase {}\ninterface CreateColorField extends ColorFieldBase, CreateFieldBase {}\ninterface UpdateColorField extends ColorFieldBase, UpdateFieldBase {}\ninterface ManagedColorFieldInput extends CreateColorField, WithIdAndOptionalUserEditable {}\n\nexport const numberFieldType = \"number\"\ntype NumberFieldType = typeof numberFieldType\n\ninterface NumberFieldBase {\n\ttype: NumberFieldType\n}\n\ninterface NumberFieldDefinitionData extends NumberFieldBase, FieldDefinitionBase {}\ninterface CreateNumberField extends NumberFieldBase, CreateFieldBase {}\ninterface UpdateNumberField extends NumberFieldBase, UpdateFieldBase {}\ninterface ManagedNumberFieldInput extends CreateNumberField, WithIdAndOptionalUserEditable {}\n\nexport const stringFieldType = \"string\"\ntype StringFieldType = typeof stringFieldType\n\ninterface StringFieldBase {\n\ttype: StringFieldType\n}\n\nexport interface StringFieldDefinitionData\n\textends StringFieldBase, WithFieldRequired, WithFieldBasedOn, FieldDefinitionBase {}\ninterface CreateStringField extends StringFieldBase, CreateFieldBase, WithOptionalFieldRequired {}\ninterface UpdateStringField extends StringFieldBase, UpdateFieldBase, WithOptionalFieldRequired {}\ninterface ManagedStringFieldInput extends CreateStringField, WithIdAndOptionalUserEditable {}\n\nexport const formattedTextFieldType = \"formattedText\"\ntype FormattedTextFieldType = typeof formattedTextFieldType\n\ninterface FormattedTextFieldBase {\n\ttype: FormattedTextFieldType\n\t/** Controls how formatted text content is processed: \"auto\" (detect), \"markdown\", or \"html\" */\n\tcontentType?: ContentType\n}\n\ninterface FormattedTextFieldDefinitionData extends FormattedTextFieldBase, WithFieldRequired, FieldDefinitionBase {}\ninterface CreateFormattedTextField extends FormattedTextFieldBase, CreateFieldBase, WithOptionalFieldRequired {}\ninterface UpdateFormattedTextField extends FormattedTextFieldBase, UpdateFieldBase, WithOptionalFieldRequired {}\ninterface FormattedTextFieldInput extends CreateFormattedTextField, WithIdAndOptionalUserEditable {}\n\nexport const imageFieldType = \"image\"\ntype ImageFieldType = typeof imageFieldType\n\ninterface ImageFieldBase {\n\ttype: ImageFieldType\n}\n\ninterface ImageFieldDefinitionData extends ImageFieldBase, WithFieldRequired, FieldDefinitionBase {}\ninterface CreateImageField extends ImageFieldBase, CreateFieldBase, WithOptionalFieldRequired {}\ninterface UpdateImageField extends ImageFieldBase, UpdateFieldBase, WithOptionalFieldRequired {}\ninterface ManagedImageFieldInput extends CreateImageField, WithIdAndOptionalUserEditable {}\n\ntype ArrayItemFieldBase = ImageFieldBase\n\nexport interface ArrayItemFieldDefinitionData extends ArrayItemFieldBase, WithFieldRequired, FieldDefinitionBase {}\ninterface CreateArrayItemField extends ArrayItemFieldBase, CreateFieldBase, WithOptionalFieldRequired {}\ninterface ManagedArrayItemFieldInput extends CreateArrayItemField, WithIdAndOptionalUserEditable {}\n\nexport const arrayFieldType = \"array\"\ntype ArrayFieldType = typeof arrayFieldType\n\ninterface ArrayFieldBase {\n\ttype: ArrayFieldType\n}\n\nexport interface ArrayFieldDefinitionData extends ArrayFieldBase, WithFieldRequired, FieldDefinitionBase {\n\tfields: [ArrayItemFieldDefinitionData]\n}\ninterface CreateArrayField extends ArrayFieldBase, CreateFieldBase, WithOptionalFieldRequired {\n\tfields: [CreateArrayItemField]\n}\ninterface UpdateArrayField extends ArrayFieldBase, UpdateFieldBase, WithOptionalFieldRequired {\n\tfields?: [CreateArrayItemField]\n}\ninterface ManagedArrayFieldInput extends CreateArrayField, WithIdAndOptionalUserEditable {\n\tfields: [ManagedArrayItemFieldInput]\n}\n\nexport const linkFieldType = \"link\"\ntype LinkFieldType = typeof linkFieldType\n\ninterface LinkFieldBase {\n\ttype: LinkFieldType\n}\n\ninterface LinkFieldDefinitionData extends LinkFieldBase, WithFieldRequired, FieldDefinitionBase {}\ninterface CreateLinkField extends LinkFieldBase, CreateFieldBase, WithOptionalFieldRequired {}\ninterface UpdateLinkField extends LinkFieldBase, UpdateFieldBase, WithOptionalFieldRequired {}\ninterface ManagedLinkFieldInput extends CreateLinkField, WithIdAndOptionalUserEditable {}\n\nexport const dateFieldType = \"date\"\ntype DateFieldType = typeof dateFieldType\n\ninterface DateFieldBase {\n\ttype: DateFieldType\n\tdisplayTime?: boolean\n}\n\nexport interface DateFieldDefinitionData extends DateFieldBase, WithFieldRequired, FieldDefinitionBase {}\ninterface CreateDateField extends DateFieldBase, CreateFieldBase, WithOptionalFieldRequired {}\ninterface UpdateDateField extends DateFieldBase, UpdateFieldBase, WithOptionalFieldRequired {}\ninterface ManagedDateFieldInput extends CreateDateField, WithIdAndOptionalUserEditable {}\n\nexport const fileFieldType = \"file\"\ntype FileFieldType = typeof fileFieldType\n\ninterface FileFieldBase {\n\ttype: FileFieldType\n}\n\nexport interface FileFieldDefinitionData\n\textends FileFieldBase, FieldDefinitionBase, WithAllowedFileTypes, WithFieldRequired {}\ninterface CreateFileField extends FileFieldBase, CreateFieldBase, WithAllowedFileTypes, WithOptionalFieldRequired {}\ninterface UpdateFileField\n\textends FileFieldBase, UpdateFieldBase, Partial<WithAllowedFileTypes>, WithOptionalFieldRequired {}\ninterface ManagedFileFieldInput extends CreateFileField, WithIdAndOptionalUserEditable {}\n\nexport const enumFieldType = \"enum\"\ntype EnumFieldType = typeof enumFieldType\n\ninterface EnumFieldBase {\n\ttype: EnumFieldType\n}\n\ninterface WithEnumCaseId {\n\tid: string\n}\n\ninterface WithEnumCaseNameInput {\n\tname: string\n\tnameByLocale?: LocalizationSourceUpdate\n}\n\ninterface WithEnumCaseNameInputForUpdate {\n\tname: string\n\tnameByLocale?: Record<LocaleId, LocalizedValueUpdate | LocalizationValue>\n}\n\nexport interface EnumCaseDataInput extends WithEnumCaseId, WithEnumCaseNameInput {}\nexport interface EnumCaseDataInputForUpdate extends WithEnumCaseId, WithEnumCaseNameInputForUpdate {}\n\nexport interface EnumFieldDefinitionData extends EnumFieldBase, FieldDefinitionBase {\n\tcases: EnumCaseData[]\n}\ninterface CreateEnumField extends EnumFieldBase, CreateFieldBase {\n\tcases: CreateEnumCase[]\n}\ninterface UpdateEnumField extends EnumFieldBase, UpdateFieldBase {}\nexport interface ManagedEnumFieldInput extends EnumFieldBase, CreateFieldBase, WithIdAndOptionalUserEditable {\n\t// We can't inherit from `CreateEnumField` because managed cases need to include ids for enum cases.\n\tcases: EnumCaseDataInput[]\n}\nexport interface ManagedEnumFieldInputForSetFields extends Omit<ManagedEnumFieldInput, \"cases\"> {\n\tcases: EnumCaseDataInputForUpdate[]\n}\n\nexport const collectionReferenceFieldType = \"collectionReference\"\ntype CollectionReferenceFieldType = typeof collectionReferenceFieldType\n\ninterface CollectionReferenceFieldBase {\n\ttype: CollectionReferenceFieldType\n}\n\nexport interface WithFieldCollectionId {\n\tcollectionId: string\n}\n\nexport interface CollectionReferenceFieldDefinitionData\n\textends CollectionReferenceFieldBase, FieldDefinitionBase, WithFieldCollectionId, WithFieldRequired {}\ninterface CreateCollectionReferenceField\n\textends CollectionReferenceFieldBase, CreateFieldBase, WithFieldCollectionId, WithOptionalFieldRequired {}\ninterface UpdateCollectionReferenceField\n\textends CollectionReferenceFieldBase, UpdateFieldBase, WithOptionalFieldRequired {}\ninterface ManagedCollectionReferenceFieldInput extends CreateCollectionReferenceField, WithIdAndOptionalUserEditable {}\n\nexport const multiCollectionReferenceFieldType = \"multiCollectionReference\"\ntype MultiCollectionReferenceFieldType = typeof multiCollectionReferenceFieldType\n\ninterface MultiCollectionReferenceFieldBase {\n\ttype: MultiCollectionReferenceFieldType\n}\n\nexport interface MultiCollectionReferenceFieldDefinitionData\n\textends MultiCollectionReferenceFieldBase, FieldDefinitionBase, WithFieldCollectionId, WithFieldRequired {}\ninterface CreateMultiCollectionReferenceField\n\textends MultiCollectionReferenceFieldBase, CreateFieldBase, WithFieldCollectionId, WithOptionalFieldRequired {}\ninterface UpdateMultiCollectionReferenceField\n\textends MultiCollectionReferenceFieldBase, UpdateFieldBase, WithOptionalFieldRequired {}\ninterface ManagedMultiCollectionReferenceFieldInput\n\textends CreateMultiCollectionReferenceField, WithIdAndOptionalUserEditable {}\n\nexport const fieldDividerType = \"divider\"\ntype FieldDividerType = typeof fieldDividerType\n\ninterface FieldDividerBase {\n\ttype: FieldDividerType\n}\n\nexport interface FieldDividerDefinitionData extends FieldDividerBase, FieldDefinitionBase {}\ninterface CreateFieldDivider extends FieldDividerBase, CreateFieldBase {}\ninterface UpdateFieldDivider extends FieldDividerBase, UpdateFieldBase {}\n\nexport const unsupportedFieldType = \"unsupported\"\ntype UnsupportedFieldType = typeof unsupportedFieldType\n\ninterface UnsupportedFieldBase {\n\ttype: UnsupportedFieldType\n}\n\nexport interface UnsupportedFieldDefinitionData extends UnsupportedFieldBase, FieldDefinitionBase {}\ninterface UpdateUnsupportedField extends UnsupportedFieldBase, UpdateFieldBase {}\n\n/**\n * Remove inline localization values from enum cases provided by `ManagedCollection.prototype.getFields` so they can be\n * sent directly to `ManagedCollection.prototype.setFields`.\n */\nexport function sanitizeEnumFieldForMessage(fields: ManagedCollectionFieldInput[]): ManagedCollectionFieldInputData[] {\n\treturn fields.map(field => {\n\t\tif (field.type !== \"enum\") return field\n\n\t\tconst cases = field.cases.map(enumCase => {\n\t\t\tconst nameByLocale = enumCase.nameByLocale ? filterInlineLocalizationValues(enumCase.nameByLocale) : undefined\n\t\t\treturn {\n\t\t\t\t...enumCase,\n\t\t\t\tnameByLocale,\n\t\t\t}\n\t\t})\n\n\t\treturn {\n\t\t\t...field,\n\t\t\tcases,\n\t\t}\n\t})\n}\n\n/**\n * A collection field that Framer knows about and the plugin API fully supports.\n */\nexport type SupportedFieldDefinitionData =\n\t| BooleanFieldDefinitionData\n\t| ColorFieldDefinitionData\n\t| NumberFieldDefinitionData\n\t| StringFieldDefinitionData\n\t| FormattedTextFieldDefinitionData\n\t| ImageFieldDefinitionData\n\t| LinkFieldDefinitionData\n\t| DateFieldDefinitionData\n\t| FileFieldDefinitionData\n\t| EnumFieldDefinitionData\n\t| CollectionReferenceFieldDefinitionData\n\t| MultiCollectionReferenceFieldDefinitionData\n\t| ArrayFieldDefinitionData\n\nexport type ManagedCollectionFieldInputData =\n\t| ManagedBooleanFieldInput\n\t| ManagedColorFieldInput\n\t| ManagedNumberFieldInput\n\t| ManagedStringFieldInput\n\t| FormattedTextFieldInput\n\t| ManagedImageFieldInput\n\t| ManagedLinkFieldInput\n\t| ManagedDateFieldInput\n\t| ManagedFileFieldInput\n\t| ManagedEnumFieldInput\n\t| ManagedCollectionReferenceFieldInput\n\t| ManagedMultiCollectionReferenceFieldInput\n\t| ManagedArrayFieldInput\n\nexport type ManagedCollectionFieldInput =\n\t| Exclude<ManagedCollectionFieldInputData, ManagedEnumFieldInput>\n\t| ManagedEnumFieldInputForSetFields\n\ntype SupportedFieldType = SupportedFieldDefinitionData[\"type\"]\n\n/**\n * Any kind of collection field definition. The field may be unsupported by the\n * plugin API.\n */\nexport type FieldDefinitionData =\n\t| SupportedFieldDefinitionData\n\t| FieldDividerDefinitionData\n\t| UnsupportedFieldDefinitionData\n\nexport type CreateField =\n\t| CreateBooleanField\n\t| CreateColorField\n\t| CreateNumberField\n\t| CreateStringField\n\t| CreateFormattedTextField\n\t| CreateImageField\n\t| CreateLinkField\n\t| CreateDateField\n\t| CreateFileField\n\t| CreateEnumField\n\t| CreateCollectionReferenceField\n\t| CreateMultiCollectionReferenceField\n\t| CreateFieldDivider\n\t| CreateArrayField\n\nexport type UpdateField =\n\t| UpdateBooleanField\n\t| UpdateColorField\n\t| UpdateNumberField\n\t| UpdateStringField\n\t| UpdateFormattedTextField\n\t| UpdateImageField\n\t| UpdateLinkField\n\t| UpdateDateField\n\t| UpdateFileField\n\t| UpdateEnumField\n\t| UpdateCollectionReferenceField\n\t| UpdateMultiCollectionReferenceField\n\t| UpdateFieldDivider\n\t| UpdateUnsupportedField\n\t| UpdateArrayField\n\nexport type FieldInput = Prettify<CreateField | UpdateField>\n\ninterface WithUserEditable {\n\t/** Is the user able to edit the field within the UI. */\n\tuserEditable: boolean\n}\n\n/**\n * Any kind of collection field definition that was created by a plugin and is\n * supported by the API.\n */\nexport type ManagedCollectionField = SupportedFieldDefinitionData & WithUserEditable\n\n/** @deprecated Use `ManagedCollectionFieldInput` instead. */\nexport type EditableManagedCollectionField = ManagedCollectionFieldInputData\n\nconst allSupportedFieldTypes: Record<SupportedFieldType, true> = {\n\tstring: true,\n\tnumber: true,\n\tboolean: true,\n\tcolor: true,\n\tformattedText: true,\n\timage: true,\n\tlink: true,\n\tdate: true,\n\tfile: true,\n\tenum: true,\n\tcollectionReference: true,\n\tmultiCollectionReference: true,\n\tarray: true,\n}\n\nfunction isSupportedCollectionFieldType(type: unknown): type is SupportedFieldType {\n\treturn isString(type) && Object.hasOwn(allSupportedFieldTypes, type)\n}\n\n/**\n * Replace any instance data with actual instances. For example,\n * `ImageAssetData` becomes `ImageAsset`.\n */\nexport function deserializeFieldData(fieldData: FieldSerializableData, engine: PluginEngine): FieldData {\n\tconst deserializedFieldData: FieldData = {}\n\n\tfor (const fieldId in fieldData) {\n\t\tconst value = fieldData[fieldId]\n\t\tif (!value) continue\n\n\t\tif (value.type !== \"array\") {\n\t\t\tdeserializedFieldData[fieldId] = unmarshal(engine, value)\n\t\t\tcontinue\n\t\t}\n\n\t\tconst deserializedArrayItems = value.value.map((arrayItem): ArrayItem => {\n\t\t\tconst deserializedArrayItemFieldData = deserializeFieldData(arrayItem.fieldData, engine)\n\n\t\t\tconst arrayItemFieldData: ArrayItemFieldData = {}\n\n\t\t\tfor (const arrayItemFieldId in deserializedArrayItemFieldData) {\n\t\t\t\tconst arrayItemFieldDataEntry = deserializedArrayItemFieldData[arrayItemFieldId]\n\t\t\t\tassert(\n\t\t\t\t\tarrayItemFieldDataEntry && isSupportedArrayItemFieldDataEntry(arrayItemFieldDataEntry),\n\t\t\t\t\t\"Unsupported array item field data entry\",\n\t\t\t\t)\n\t\t\t\tarrayItemFieldData[arrayItemFieldId] = arrayItemFieldDataEntry\n\t\t\t}\n\n\t\t\treturn { ...arrayItem, fieldData: arrayItemFieldData }\n\t\t})\n\n\t\tdeserializedFieldData[fieldId] = { ...value, value: deserializedArrayItems }\n\t}\n\n\treturn deserializedFieldData\n}\n\n/**\n * A CMS Collection that is fully controlled by a plugin.\n *\n * Managed Collections allow plugins to define fields and sync items\n * programmatically. Fields and items can only be added, edited, and deleted\n * by the owning plugin, not by the user (unless a field is marked\n * `userEditable`).\n *\n * A Managed Collection plugin becomes available within the CMS when it supports\n * both `configureManagedCollection` and `syncManagedCollection` modes.\n *\n * Use `framer.getManagedCollection()` to obtain an instance when the plugin is\n * launched in either of those modes.\n * @category cms\n */\nexport class ManagedCollection implements Navigable {\n\treadonly id: NodeId\n\treadonly name: string\n\t/**\n\t * @deprecated Use `managedBy` instead and the [Permissions\n\t * API](https://www.framer.com/developers/plugins-permissions) to check if users can edit the\n\t * collection.\n\t */\n\treadonly readonly: boolean\n\t/**\n\t * Returns who manages this Collection.\n\t *\n\t * - `\"thisPlugin\"` if the Collection is managed by the current plugin.\n\t * - `\"anotherPlugin\"` if the Collection is managed by a different plugin.\n\t *\n\t * Collections managed by other plugins are read-only.\n\t */\n\treadonly managedBy: ManagedCollectionManagedBy\n\n\t// We use `#` to make sure the engine can not be observed when a user logs or loops over a node\n\t// instance.\n\t#engine: PluginEngine\n\n\tconstructor(data: CollectionData, engine: PluginEngine) {\n\t\tthis.id = data.id\n\t\tthis.name = data.name\n\t\tthis.readonly = data.readonly\n\t\tassert(data.managedBy !== \"user\", \"Managed Collection can only be managed by a plugin\")\n\t\tthis.managedBy = data.managedBy\n\n\t\tthis.#engine = engine\n\n\t\tdeepFreeze(this)\n\t}\n\n\t/**\n\t * Retrieve all item IDs in this Managed Collection, in their current order.\n\t *\n\t * @returns An array of item IDs.\n\t *\n\t * @example\n\t * ```ts\n\t * const itemIds = await collection.getItemIds()\n\t * ```\n\t */\n\tasync getItemIds() {\n\t\treturn this.#engine.invoke(\"getManagedCollectionItemIds\", this.id)\n\t}\n\n\t/**\n\t * Arrange CMS items in a specific order.\n\t *\n\t * Use `\"ManagedCollection.setItemOrder\"` to check if this method is allowed.\n\t *\n\t * @param ids - An array of item IDs in the desired order. Unknown IDs are ignored.\n\t *\n\t * @example\n\t * ```ts\n\t * await collection.setItemOrder([item3.id, item1.id, item2.id])\n\t * ```\n\t */\n\tasync setItemOrder(ids: string[]) {\n\t\treturn this.#engine.invoke(\"setManagedCollectionItemOrder\", this.id, ids)\n\t}\n\n\t/**\n\t * Get all fields defined on this Managed Collection.\n\t *\n\t * @returns An array of managed collection field definitions.\n\t *\n\t * @example\n\t * ```ts\n\t * const fields = await collection.getFields()\n\t * ```\n\t */\n\tasync getFields() {\n\t\treturn this.#engine.invoke(\"getManagedCollectionFields2\", this.id)\n\t}\n\n\t/**\n\t * Add, update, or remove Collection fields.\n\t *\n\t * Fields not included in the array will be removed. You can configure\n\t * up to 30 custom fields.\n\t *\n\t * Each field requires an `id`, `name`, and `type`. For the `id`, use a\n\t * unique identifier that stays the same across future synchronizations.\n\t * Any change in `id` can break data assignments on the canvas. The maximum\n\t * length for an `id` is 64 characters.\n\t *\n\t * By default, managed collection fields set by a plugin are not editable by\n\t * users. Set `userEditable: true` on a field to allow user editing. Note\n\t * that fields marked as `userEditable` can no longer have their values set\n\t * by the plugin when using `addItems`.\n\t *\n\t * Use `\"ManagedCollection.setFields\"` to check if this method is allowed.\n\t *\n\t * @param fields - The array of fields that should be used for the collection.\n\t *\n\t * @example\n\t * ```ts\n\t * await collection.setFields([\n\t *   { id: \"1\", type: \"string\", name: \"Name\" },\n\t *   { id: \"2\", type: \"number\", name: \"Age\" },\n\t *   { id: \"3\", type: \"string\", name: \"Description\", userEditable: true },\n\t * ])\n\t * ```\n\t */\n\tasync setFields(fields: ManagedCollectionFieldInput[]) {\n\t\tconst fieldsWithoutInlineLocalizationValues = sanitizeEnumFieldForMessage(fields)\n\t\treturn this.#engine.invoke(\"setManagedCollectionFields\", this.id, fieldsWithoutInlineLocalizationValues)\n\t}\n\n\t/**\n\t * Add new items or update existing ones if their IDs match.\n\t *\n\t * This method performs an upsert: items with matching IDs are updated,\n\t * new IDs are inserted.\n\t *\n\t * Each item requires an `id` and `slug`. Custom field data is provided via\n\t * the `fieldData` object, using field IDs as keys.\n\t *\n\t * Currently, calling `addItems` with existing item IDs merges the provided\n\t * field data with the existing items' current field data, meaning any\n\t * omitted fields remain unchanged. In version 4.0.0, this behavior will\n\t * change to fully replace items, removing any fields not explicitly\n\t * included. Always include all fields when updating existing items to avoid\n\t * unexpected behavior.\n\t *\n\t * Use `\"ManagedCollection.addItems\"` to check if this method is allowed.\n\t *\n\t * @param items - An array of items to add or update.\n\t *\n\t * @example\n\t * ```ts\n\t * await collection.addItems([\n\t *   {\n\t *     id: \"1\",\n\t *     slug: \"item-1\",\n\t *     fieldData: {\n\t *       [nameField.id]: { type: \"string\", value: \"Eric\" },\n\t *       [ageField.id]: { type: \"number\", value: 47 },\n\t *     },\n\t *   },\n\t * ])\n\t * ```\n\t */\n\tasync addItems(items: ManagedCollectionItemInput[]) {\n\t\treturn this.#engine.invoke(\"addManagedCollectionItems2\", this.id, items)\n\t}\n\n\t/**\n\t * Remove CMS items by their ID.\n\t *\n\t * Use `\"ManagedCollection.removeItems\"` to check if this method is allowed.\n\t *\n\t * @param itemIds - The IDs of the items to remove.\n\t *\n\t * @example\n\t * ```ts\n\t * await collection.removeItems([item1.id, item5.id])\n\t * ```\n\t */\n\tasync removeItems(itemIds: string[]) {\n\t\treturn this.#engine.invoke(\"removeManagedCollectionItems\", this.id, itemIds)\n\t}\n\n\t/**\n\t * Open this Collection in the Editor, making it the active selection in\n\t * the Framer UI.\n\t *\n\t * @example\n\t * ```ts\n\t * await collection.setAsActive()\n\t * ```\n\t */\n\tasync setAsActive() {\n\t\treturn this.#engine.invoke(\"setActiveCollection\", this.id)\n\t}\n\n\t/**\n\t * Set plugin data by key.\n\t *\n\t * Similar to local storage, you can store custom data on the Managed\n\t * Collection (e.g., the last synchronization date or a connected database\n\t * ID).\n\t *\n\t * Use `\"ManagedCollection.setPluginData\"` to check if this method is allowed.\n\t *\n\t * @param key - The plugin data key.\n\t * @param value - The value to set, or `null` to remove.\n\t *\n\t * @example\n\t * ```ts\n\t * const currentDate = new Date().toISOString()\n\t * await collection.setPluginData(\"lastSynchronizedAt\", currentDate)\n\t * ```\n\t */\n\tasync setPluginData(key: string, value: string | null) {\n\t\treturn this.#engine.invoke(\"setPluginDataForNode\", this.id, key, value)\n\t}\n\n\t/**\n\t * Get plugin data by key.\n\t *\n\t * @param key - The plugin data key.\n\t *\n\t * @example\n\t * ```ts\n\t * const lastSynchronized = await collection.getPluginData(\"lastSynchronizedAt\")\n\t * ```\n\t */\n\tasync getPluginData(key: string) {\n\t\treturn this.#engine.invoke(\"getPluginDataForNode\", this.id, key)\n\t}\n\n\t/**\n\t * Get all plugin data keys.\n\t */\n\tasync getPluginDataKeys() {\n\t\treturn this.#engine.invoke(\"getPluginDataKeysForNode\", this.id)\n\t}\n\n\t/**\n\t * Navigate to this collection.\n\t *\n\t * May switch modes to reveal the relevant view.\n\t */\n\tasync navigateTo(opts?: NavigableOptions): Promise<void> {\n\t\treturn this.#engine.invoke(\"navigateTo\", this.id, opts)\n\t}\n}\n\n/**\n * A CMS Collection in the project.\n *\n * Collections can be created by users or managed by plugins. Use `managedBy`\n * to check the owner. Any kind of Collection can be read from, while those\n * managed by other plugins are read-only.\n * @category cms\n */\nexport class Collection implements Navigable {\n\treadonly id: NodeId\n\treadonly name: string\n\t/**\n\t * The name of the field used as the slug.\n\t *\n\t * - Only Collections that are not managed by a Plugin will have this value set.\n\t */\n\treadonly slugFieldName: string | null\n\t/**\n\t * The ID of the field the slug is based on.\n\t *\n\t * - Only Collections that are not managed by a Plugin will have this value set.\n\t */\n\treadonly slugFieldBasedOn: string | null\n\t/**\n\t * Whether this Collection is read-only.\n\t *\n\t * A Collection is considered read-only if:\n\t * - The plugin operates in a view-only mode (e.g., user does not have\n\t *   permission to edit content).\n\t * - The Collection is managed by another plugin.\n\t *\n\t * Read-only Collections cannot be modified via the API.\n\t *\n\t * @deprecated Use `managedBy` instead and the [Permissions\n\t * API](https://www.framer.com/developers/plugins-permissions) to check if users can edit the\n\t * collection.\n\t */\n\treadonly readonly: boolean\n\t/**\n\t * Returns who manages this Collection.\n\t *\n\t * - `\"user\"` if the Collection is user-created.\n\t * - `\"thisPlugin\"` if the Collection is managed by the current plugin.\n\t * - `\"anotherPlugin\"` if the Collection is managed by another plugin.\n\t *\n\t * Collections managed by plugins are read-only. To modify them, use\n\t * `ManagedCollection` (only possible in `configureManagedCollection` or\n\t * `syncManagedCollection` modes).\n\t *\n\t * Note: the plugin still needs to check if the user has permission to edit\n\t * content via `framer.isAllowedTo`.\n\t *\n\t * @example\n\t * ```ts\n\t * const collection = await framer.getActiveCollection()\n\t *\n\t * if (framer.mode === \"collection\" && collection.managedBy !== \"user\") {\n\t *   framer.notify(\"This Collection cannot be modified.\", { variant: \"warning\" })\n\t * }\n\t * ```\n\t */\n\treadonly managedBy: CollectionManagedBy\n\n\t#engine: PluginEngine\n\n\tconstructor(data: CollectionData, engine: PluginEngine) {\n\t\tthis.id = data.id\n\t\tthis.name = data.name\n\t\tthis.slugFieldName = data.slugFieldName\n\t\tthis.slugFieldBasedOn = data.slugFieldBasedOn\n\t\tthis.readonly = data.readonly\n\t\tthis.managedBy = data.managedBy\n\n\t\tthis.#engine = engine\n\n\t\tdeepFreeze(this)\n\t}\n\n\t/**\n\t * Reorder the items in this Collection based on an array of item IDs.\n\t *\n\t * Unknown item IDs are ignored.\n\t *\n\t * Use `\"Collection.setItemOrder\"` to check if this method is allowed.\n\t *\n\t * @param ids - An array of item IDs representing the desired order.\n\t *\n\t * @example\n\t * ```ts\n\t * await collection.setItemOrder([item3.id, item1.id, item2.id])\n\t * ```\n\t */\n\tasync setItemOrder(ids: NodeId[]) {\n\t\treturn this.#engine.invoke(\"setCollectionItemOrder\", this.id, ids)\n\t}\n\n\t/**\n\t * Fetch all fields defined on this Collection, including dividers.\n\t *\n\t * Some fields might not be fully supported by the API; unsupported fields\n\t * will be returned with an `unsupported` field type.\n\t *\n\t * @returns An array of Field instances.\n\t *\n\t * @example\n\t * ```ts\n\t * const fields = await collection.getFields()\n\t * ```\n\t */\n\tasync getFields(): Promise<Field[]> {\n\t\tconst fieldDefinitionDataArray = await this.#engine.invoke(\"getCollectionFields2\", this.id, true)\n\t\treturn fieldDefinitionDataArrayToFieldClassInstances(fieldDefinitionDataArray, this.#engine, this.id)\n\t}\n\n\t/**\n\t * Create new unmanaged Collection fields.\n\t *\n\t * Use `Field.setAttributes` to update existing fields.\n\t *\n\t * Use `\"Collection.addFields\"` to check if this method is allowed.\n\t *\n\t * @param fields - The array of fields that should be added to the collection.\n\t * @returns The newly created Field instances.\n\t *\n\t * @example\n\t * ```ts\n\t * const createdFields = await collection.addFields([\n\t *   { type: \"string\", name: \"Name\" },\n\t *   { type: \"enum\", name: \"Status\", cases: [{ name: \"New\" }, { name: \"Done\" }] },\n\t *   { type: \"file\", name: \"Text\", allowedFileTypes: [\"md\"] },\n\t *   { type: \"collectionReference\", name: \"Author\", collectionId: \"ASh5SZOh\" },\n\t * ])\n\t * ```\n\t */\n\tasync addFields(fields: CreateField[]): Promise<Field[]> {\n\t\tconst fieldDefinitionDataArray = await this.#engine.invoke(\"addCollectionFields2\", this.id, fields)\n\t\tassert(fieldDefinitionDataArray.every(isNotNull))\n\t\treturn fieldDefinitionDataArrayToFieldClassInstances(fieldDefinitionDataArray, this.#engine, this.id)\n\t}\n\n\t/**\n\t * Remove fields from this Collection by their IDs.\n\t *\n\t * Use `\"Collection.removeFields\"` to check if this method is allowed.\n\t *\n\t * @param fieldIds - An array of field IDs to remove.\n\t *\n\t * @example\n\t * ```ts\n\t * await collection.removeFields([field3.id, field4.id])\n\t * ```\n\t */\n\tasync removeFields(fieldIds: string[]): Promise<void> {\n\t\treturn this.#engine.invoke(\"removeCollectionFields\", this.id, fieldIds)\n\t}\n\n\t/**\n\t * Reorder the fields in this Collection based on an array of field IDs.\n\t *\n\t * Unknown field IDs are ignored.\n\t *\n\t * Use `\"Collection.setFieldOrder\"` to check if this method is allowed.\n\t *\n\t * @param fieldIds - An array of field IDs representing the desired order.\n\t *\n\t * @example\n\t * ```ts\n\t * await collection.setFieldOrder([nameField.id, ageField.id])\n\t * ```\n\t */\n\tasync setFieldOrder(fieldIds: string[]): Promise<void> {\n\t\treturn this.#engine.invoke(\"setCollectionFieldOrder\", this.id, fieldIds)\n\t}\n\n\t/**\n\t * Retrieve all items within this Collection, in their current order.\n\t *\n\t * Items may include drafts (unpublished items).\n\t *\n\t * @returns An array of CollectionItem instances.\n\t *\n\t * @example\n\t * ```ts\n\t * const items = await collection.getItems()\n\t * ```\n\t */\n\tasync getItems(): Promise<CollectionItem[]> {\n\t\tconst itemsData = await this.#engine.invoke(\"getCollectionItems2\", this.id)\n\t\treturn itemsData.map(itemData => new CollectionItem(itemData, this.#engine))\n\t}\n\n\t/**\n\t * Add new items to this Collection, or update existing ones if their IDs\n\t * match.\n\t *\n\t * - If an `id` is provided and matches an existing item, that item will be\n\t *   updated.\n\t * - Items without an `id` are created as new records.\n\t * - `slug` should be unique.\n\t *\n\t * Use `\"Collection.addItems\"` to check if this method is allowed.\n\t *\n\t * @param items - An array of items to add or update.\n\t *\n\t * @example\n\t * ```ts\n\t * // Create a new item\n\t * await collection.addItems([{\n\t *   slug: \"eric\",\n\t *   fieldData: {\n\t *     [nameField.id]: { type: \"string\", value: \"Eric\" },\n\t *     [ageField.id]: { type: \"number\", value: 47 },\n\t *   },\n\t * }])\n\t *\n\t * // Update an existing item\n\t * await collection.addItems([{ id: \"aBc123\", slug: \"bar\" }])\n\t * ```\n\t */\n\tasync addItems(items: CollectionItemInput[]): Promise<void> {\n\t\tawait this.#engine.invoke(\"addCollectionItems2\", this.id, items)\n\t}\n\n\t/**\n\t * Remove items from this Collection by their IDs.\n\t *\n\t * Use `\"Collection.removeItems\"` to check if this method is allowed.\n\t *\n\t * @param itemIds - An array of item IDs to remove.\n\t *\n\t * @example\n\t * ```ts\n\t * await collection.removeItems([item3.id, item4.id])\n\t * ```\n\t */\n\tasync removeItems(itemIds: NodeId[]) {\n\t\treturn this.#engine.invoke(\"removeCollectionItems\", itemIds)\n\t}\n\n\t/**\n\t * Set this Collection as active, changing the selected Collection in the\n\t * Framer UI.\n\t *\n\t * @example\n\t * ```ts\n\t * await collection.setAsActive()\n\t * ```\n\t */\n\tasync setAsActive() {\n\t\treturn this.#engine.invoke(\"setActiveCollection\", this.id)\n\t}\n\n\t/**\n\t * Set plugin data by key.\n\t *\n\t * Use `\"Collection.setPluginData\"` to check if this method is allowed.\n\t *\n\t * @param key - The plugin data key.\n\t * @param value - The value to set, or `null` to remove.\n\t */\n\tasync setPluginData(key: string, value: string | null) {\n\t\treturn this.#engine.invoke(\"setPluginDataForNode\", this.id, key, value)\n\t}\n\n\t/**\n\t * Get plugin data by key.\n\t *\n\t * @param key - The plugin data key.\n\t */\n\tasync getPluginData(key: string) {\n\t\treturn this.#engine.invoke(\"getPluginDataForNode\", this.id, key)\n\t}\n\n\t/**\n\t * Get all plugin data keys.\n\t */\n\tasync getPluginDataKeys() {\n\t\treturn this.#engine.invoke(\"getPluginDataKeysForNode\", this.id)\n\t}\n\n\t/**\n\t * Navigate to this collection.\n\t *\n\t * May switch modes to reveal the relevant view.\n\t */\n\tasync navigateTo(opts?: NavigableOptions): Promise<void> {\n\t\treturn this.#engine.invoke(\"navigateTo\", this.id, opts)\n\t}\n}\n\n/**\n * An item (row) in a CMS Collection.\n *\n * Each item contains field data keyed by field ID, a unique slug, and a\n * draft status.\n * @category cms\n */\nexport class CollectionItem implements Navigable {\n\t/** A unique identifier for this Collection item. */\n\treadonly id: NodeId\n\n\t/** External ID for managed collections, unique node ID otherwise. */\n\treadonly nodeId: NodeId\n\n\t/** Slug value of the CMS item. Slugs should be unique within a Collection. */\n\treadonly slug: string\n\treadonly slugByLocale: InlineLocalizationValueByLocale\n\t/** Drafts are excluded from publishing. */\n\treadonly draft: boolean\n\t/**\n\t * The fields and corresponding values of this Collection item.\n\t *\n\t * Field data uses the field `id` as keys in an object.\n\t *\n\t * @example\n\t * ```ts\n\t * const titleFieldData = collectionItem.fieldData[titleField.id]\n\t * console.log(titleFieldData.value) // \"Getting Started\"\n\t * ```\n\t */\n\treadonly fieldData: Readonly<FieldData>\n\n\t#engine: PluginEngine\n\n\tconstructor(collectionItemData: CollectionItemSerializableData, engine: PluginEngine) {\n\t\tconst fieldData = deserializeFieldData(collectionItemData.fieldData, engine)\n\n\t\tthis.id = collectionItemData.externalId ?? collectionItemData.nodeId\n\t\tthis.nodeId = collectionItemData.nodeId\n\t\tthis.slug = collectionItemData.slug\n\t\tthis.slugByLocale = collectionItemData.slugByLocale\n\t\tthis.draft = collectionItemData.draft ?? false\n\t\tthis.fieldData = fieldData\n\n\t\tthis.#engine = engine\n\n\t\tdeepFreeze(this)\n\t}\n\n\t/**\n\t * Remove this item from the Collection.\n\t *\n\t * Use `\"CollectionItem.remove\"` to check if this method is allowed.\n\t *\n\t * @example\n\t * ```ts\n\t * await collectionItem.remove()\n\t * ```\n\t */\n\tasync remove(): Promise<void> {\n\t\treturn this.#engine.invoke(\"removeCollectionItems\", [this.id])\n\t}\n\n\t/**\n\t * Set the values of the fields of this CMS item. May return `null` if the\n\t * item was deleted before this method was called.\n\t *\n\t * Use `\"CollectionItem.setAttributes\"` to check if this method is allowed.\n\t *\n\t * @param update - The updated attributes for the collection item.\n\t * @returns The updated CollectionItem, or `null` if the item no longer exists.\n\t *\n\t * @example\n\t * ```ts\n\t * const updatedItem = await collectionItem.setAttributes({\n\t *   slug: \"new-slug\",\n\t *   fieldData: {\n\t *     [ageField.id]: { type: \"number\", value: 48 },\n\t *   },\n\t * })\n\t * ```\n\t */\n\tasync setAttributes(update: EditableCollectionItemAttributes): Promise<CollectionItem | null> {\n\t\tconst itemData = await this.#engine.invoke(\"setCollectionItemAttributes2\", this.id, update)\n\t\tif (!itemData) return null\n\t\treturn new CollectionItem(itemData, this.#engine)\n\t}\n\n\t/**\n\t * Set plugin data by key.\n\t *\n\t * Use `\"CollectionItem.setPluginData\"` to check if this method is allowed.\n\t *\n\t * @param key - The plugin data key.\n\t * @param value - The value to set, or `null` to remove.\n\t */\n\tasync setPluginData(key: string, value: string | null) {\n\t\treturn this.#engine.invoke(\"setPluginDataForNode\", this.id, key, value)\n\t}\n\n\t/**\n\t * Get plugin data by key.\n\t *\n\t * @param key - The plugin data key.\n\t */\n\tasync getPluginData(key: string) {\n\t\treturn this.#engine.invoke(\"getPluginDataForNode\", this.id, key)\n\t}\n\n\t/**\n\t * Get all plugin data keys.\n\t */\n\tasync getPluginDataKeys() {\n\t\treturn this.#engine.invoke(\"getPluginDataKeysForNode\", this.id)\n\t}\n\n\t/**\n\t * Navigate the UI to this Collection item. May switch modes to reveal the\n\t * relevant view, such as the CMS editor.\n\t *\n\t * @param opts - Optional navigation options, such as scrolling to a\n\t *   specific field.\n\t *\n\t * @example\n\t * ```ts\n\t * await collectionItem.navigateTo({\n\t *   scrollTo: { collectionFieldId: fieldId },\n\t * })\n\t * ```\n\t */\n\tasync navigateTo(opts?: NavigableOptions): Promise<void> {\n\t\treturn this.#engine.invoke(\"navigateTo\", this.nodeId, opts)\n\t}\n}\n", "import { delay } from \"@framerjs/shared\"\nimport type { VekterEngine } from \"document/VekterEngine.ts\"\nimport { PluginOnlyError } from \"../pluginErrors.ts\"\n\nconst DEFAULT_PROCESS_WHEN_CONNECTED_TIMEOUT_MS = 20_000\n\nexport async function processWhenConnected(\n\tengine: VekterEngine,\n\tsignal: AbortSignal | undefined,\n\ttask: () => void,\n): Promise<void> {\n\tconst deadline = performance.now() + DEFAULT_PROCESS_WHEN_CONNECTED_TIMEOUT_MS\n\n\twhile (performance.now() < deadline) {\n\t\tif (signal?.aborted) {\n\t\t\tthrow new PluginOnlyError(\"Plugin closed while waiting for the project to reconnect\")\n\t\t}\n\n\t\tif (engine.stores.loadingStore.busyReconnecting) {\n\t\t\tawait delay(1000)\n\t\t\tcontinue\n\t\t}\n\n\t\tlet done = false\n\t\tawait engine.scheduler.processWhenReadyAsync(() => {\n\t\t\tif (engine.stores.loadingStore.busyReconnecting) return\n\n\t\t\tdone = true\n\t\t\ttask()\n\t\t})\n\n\t\tif (done) return\n\n\t\tawait delay(1000)\n\t}\n\n\tthrow new PluginOnlyError(\n\t\t`Project did not reconnect within ${DEFAULT_PROCESS_WHEN_CONNECTED_TIMEOUT_MS / 1000} seconds`,\n\t)\n}\n", "import { environment } from \"@framerjs/framer-environment\"\nimport type { ComponentLoader } from \"@framerjs/framer-runtime\"\nimport { assert, List, assertNever, getLogger } from \"@framerjs/shared\"\nimport type { VekterEngine } from \"document/VekterEngine.ts\"\nimport {\n\taddArrayItemIdToKeyPath,\n\taddObjectPropToKeyPath,\n} from \"document/components/chrome/localization/ancestorControlKeyPath.ts\"\nimport { getCodeGenerationScopeId } from \"document/components/chrome/localization/getCodeGenerationScopeId.ts\"\nimport type {\n\tLocalizationSource,\n\tLocalizationSourceGroup,\n\tLocalizationSourceRouteSegmentNode,\n} from \"document/components/chrome/localization/getLocalizationSources.ts\"\nimport {\n\tcollectLocalizationSourcesFromContentManagementNode,\n\tgetCollectionSlugOccurrencesByLocaleId,\n\tgetLocalizationSourceGroups,\n\tisHTMLBackedRichTextSource,\n\twithCollectionNodeParentInfo,\n\twithLocalizationSourceControlProp,\n\twithLocalizationSubGroups,\n} from \"document/components/chrome/localization/getLocalizationSources.ts\"\nimport { clearLocalizedValue, setLocalizedValue } from \"document/components/chrome/localization/updateLocalizedValue.ts\"\nimport { getCommonRegionsForLanguage, isCommonLocaleCode } from \"document/components/chrome/shared/commonLocales.ts\"\nimport { suggestLocaleName, suggestLocaleSlug } from \"document/components/chrome/shared/localeSuggestions.ts\"\nimport {\n\tisLocaleCode,\n\tisLocaleLanguageCode,\n\tisLocaleRegionCode,\n\tlocaleLanguages,\n\tlocaleRegions,\n} from \"document/components/chrome/shared/locales.ts\"\nimport type { CanvasNode, CollectionNode } from \"document/models/CanvasTree/index.ts\"\nimport { getContentManagementNode } from \"document/models/CanvasTree/nodes/ContentManagementNode.utils.ts\"\nimport { randomID } from \"document/models/CanvasTree/nodes/NodeID.ts\"\nimport { updateHTMLText } from \"document/models/CanvasTree/nodes/utils/updateHTMLText.ts\"\nimport type { IncludedLocales } from \"document/models/CanvasTree/traits/WithLocaleConfig.ts\"\nimport { withLocaleConfig } from \"document/models/CanvasTree/traits/WithLocaleConfig.ts\"\nimport type { LocaleId, Locale as VekterLocale } from \"document/models/CanvasTree/traits/WithLocales.ts\"\nimport { defaultLocaleId } from \"document/models/CanvasTree/traits/WithLocales.ts\"\nimport { type VariableDefinition, isVariableDefinition } from \"document/models/CanvasTree/traits/WithVariables.ts\"\nimport type { LocalizedTextValue, LocalizedValue } from \"document/models/LocalizedValue.ts\"\nimport { getLocalizedValueText } from \"document/models/LocalizedValue.ts\"\nimport type { CollectionControlProp } from \"document/models/controlProps/CollectionControlProp.ts\"\nimport { ActiveMainView } from \"document/utils/ActiveEditorType.ts\"\nimport { isLocalizedValueManagedByPlugin } from \"document/utils/isLocalizedValueManagedByPlugin.ts\"\nimport { ControlType } from \"library/render/types/PropertyControls.ts\"\nimport { isEqual } from \"library/render/utils/isEqual.ts\"\nimport { slugify } from \"library/utils/slugify.ts\"\nimport { encodeByteArrayToBase62 } from \"utils/base62.ts\"\nimport { isShallowArrayEqual } from \"utils/isShallowEqual.ts\"\nimport { sha256 } from \"utils/sha256.ts\"\nimport { isDefined, isString } from \"utils/typeChecks.ts\"\nimport { ClassDiscriminator } from \"utils/withClassDiscriminator.ts\"\nimport { BatchAssetUploader } from \"web/lib/BatchAssetUploader.ts\"\nimport { getIsViewOnly } from \"web/pages/project/permissions/isViewOnly.ts\"\nimport { type ContentType, type FieldDataEntryInput, isUpdateArrayItem } from \"#framer-plugin/collections.ts\"\nimport type {\n\tCreateLocaleInput,\n\tGetLocalizationGroupsFilter,\n\tLocalizationData,\n\tLocalizationGroup,\n\tLocalizationGroupStatus,\n\tLocalizationGroupStatusByLocale,\n\tLocalizationSourceId,\n\tLocalizationSourceUpdate,\n\tLocalizationValueByLocale,\n\tLocalizedValueUpdate,\n\tLocale as PluginLocale,\n\tLocalizationSource as PluginLocalizationSource,\n\tSetLocalizationDataResult,\n} from \"#framer-plugin/localization.ts\"\nimport type { Mode } from \"#framer-plugin/messages.ts\"\nimport type { EngineStores } from \"../document/EngineStores.ts\"\nimport type { DeepMutable } from \"../utils/Mutable.ts\"\nimport type { NormalizedCollectionItemInput } from \"./collections.ts\"\nimport { PluginOnlyError } from \"./pluginErrors.ts\"\nimport type { PluginManifestId } from \"./plugins.ts\"\nimport {\n\tconvertPluginHTMLToCanvasHTML,\n\tconvertPluginHTMLToCollectionHTML,\n} from \"./utils/convertPluginHTMLToVekterHTML.ts\"\nimport { convertVekterHTMLToPluginHTML } from \"./utils/convertVekterHTMLToPluginHTML.ts\"\nimport { processWhenConnected } from \"./utils/processWhenConnected.ts\"\n\nconst log = getLogger(\"PluginLocalization\")\n\ntype LocalizationSourceExcludingRouteSegments = Exclude<LocalizationSource, LocalizationSourceRouteSegmentNode>\ntype InternalLocalizedValueUpdate =\n\t| {\n\t\t\taction: \"set\"\n\t\t\tvalue: LocalizedTextValue\n\t\t\tneedsReview?: boolean\n\t  }\n\t| {\n\t\t\taction: \"clear\"\n\t  }\n\t| {\n\t\t\taction: \"ignore\"\n\t\t\tneedsReview?: boolean\n\t  }\ntype InternalLocalizationSourceUpdate = Record<LocaleId, InternalLocalizedValueUpdate>\n\nfunction vekterLocaleToPluginLocale(locale: VekterLocale): PluginLocale {\n\treturn {\n\t\tid: locale.id,\n\t\tcode: locale.code,\n\t\tname: locale.name,\n\t\tslug: locale.slug,\n\t\tfallbackLocaleId: locale.fallback,\n\t}\n}\n\nexport function getLocales(engine: VekterEngine): PluginLocale[] {\n\tconst locales = engine.tree.root.locales\n\n\tif (!locales) return []\n\n\treturn locales.map(vekterLocaleToPluginLocale)\n}\n\nexport function getDefaultLocale(engine: VekterEngine): PluginLocale {\n\tconst locale = engine.tree.root.getDefaultLocale()\n\n\treturn vekterLocaleToPluginLocale(locale)\n}\n\nexport function getActiveLocale(engine: VekterEngine): PluginLocale | null {\n\tlet activeLocaleId: string | null = null\n\n\tif (engine.stores.chromeStore.mainView === ActiveMainView.Localizations) {\n\t\tactiveLocaleId = engine.stores.localizationStore.selectedLocaleId\n\t} else {\n\t\tactiveLocaleId = engine.stores.chromeStore.canvasLocaleId\n\t}\n\n\tif (!activeLocaleId) return null\n\n\tconst activeLocale = engine.tree.root.getLocale(activeLocaleId)\n\tif (!activeLocale) return null\n\n\treturn vekterLocaleToPluginLocale(activeLocale)\n}\n\nexport function vekterSourceTypeToPluginSourceType(\n\ttype: LocalizationSource[\"type\"],\n): PluginLocalizationSource[\"type\"] | null {\n\tswitch (type) {\n\t\tcase \"convertFromBoolean\":\n\t\tcase \"convertFromEnum\":\n\t\tcase \"prefix\":\n\t\tcase \"suffix\":\n\t\tcase ClassDiscriminator.FormPlainTextInputNode:\n\t\tcase ClassDiscriminator.FormSelectNode:\n\t\tcase \"formSelectGenericOption\":\n\t\tcase ClassDiscriminator.WebPageNode:\n\t\tcase ClassDiscriminator.RootNode:\n\t\tcase ControlType.String:\n\t\tcase ControlType.Enum:\n\t\t\treturn \"string\"\n\t\tcase \"nodeLink\":\n\t\tcase ControlType.Link:\n\t\t\treturn \"link\"\n\t\tcase ControlType.RichText:\n\t\tcase ClassDiscriminator.RichTextNode:\n\t\t\treturn \"formattedText\"\n\t\tcase \"slug\":\n\t\t\treturn \"slug\"\n\t\tcase ClassDiscriminator.FrameNode:\n\t\tcase ControlType.Image:\n\t\t\treturn \"altText\"\n\t\tcase ClassDiscriminator.RouteSegmentNode:\n\t\t\treturn null\n\t\tdefault:\n\t\t\tassertNever(type)\n\t}\n}\n\n/**\n * Get the plugin-visible value for a localized value. Used for both export and\n * no-op comparison on import, so that read/write round-trips are stable.\n */\nfunction getPluginVisibleLocalizedValue(\n\tengine: VekterEngine,\n\tsource: LocalizationSource,\n\tlocalizedValue: LocalizedValue<LocalizedTextValue>,\n\tisHTML: boolean,\n): string | null {\n\tconst plainTextValue = getLocalizedValueText(localizedValue, { preserveNewLines: true })\n\tif (plainTextValue === null || plainTextValue === undefined) return null\n\n\tlet value = plainTextValue\n\n\tif (isHTML) {\n\t\tif (localizedValue.type === \"rich-text\") {\n\t\t\tif (!isString(localizedValue.value)) return null\n\t\t\tvalue = localizedValue.value\n\t\t} else {\n\t\t\tvalue = updateHTMLText(source.value, value)\n\t\t}\n\t}\n\n\treturn normalizeValue(engine, source, value, isHTML)\n}\n\nfunction resultForLocale(\n\tengine: VekterEngine,\n\tsource: LocalizationSource,\n\tisHTML: boolean,\n\tlocaleId: LocaleId,\n): LocalizationValueByLocale[LocaleId] {\n\tconst localizedValue = source.localizedValues[localeId]\n\tconst status = source.localizedValueStatuses[localeId]\n\n\tif (!localizedValue || !status || status === \"new\") {\n\t\treturn {\n\t\t\tstatus: \"new\",\n\t\t\tvalue: null,\n\t\t}\n\t}\n\n\tconst managedByPlugin = isLocalizedValueManagedByPlugin(engine, source, localizedValue)\n\tconst value = getPluginVisibleLocalizedValue(engine, source, localizedValue, isHTML)\n\n\tif (status === \"warning\") {\n\t\tconst warning = source.warnings?.[localeId]\n\t\tassert(warning, \"Warning must exist for locale if status is warning\")\n\n\t\treturn {\n\t\t\tstatus: \"warning\",\n\t\t\tvalue,\n\t\t\twarning,\n\t\t\tlastEdited: localizedValue.lastEdited,\n\t\t\treadonly: managedByPlugin,\n\t\t}\n\t}\n\n\treturn {\n\t\tvalue,\n\t\tlastEdited: localizedValue.lastEdited,\n\t\treadonly: managedByPlugin,\n\t\tstatus,\n\t}\n}\n\nexport function vekterLocalizedValuesToPluginLocalizationSourceLocales(\n\tengine: VekterEngine,\n\tsource: LocalizationSource,\n\tisHTML: boolean,\n): LocalizationValueByLocale {\n\tconst result: LocalizationValueByLocale = {}\n\n\tconst locales = engine.tree.root.locales\n\tif (!locales) return result\n\n\tfor (const locale of locales) {\n\t\tresult[locale.id] = resultForLocale(engine, source, isHTML, locale.id)\n\t}\n\n\treturn result\n}\n\n/**\n * The keypath on a LocalizationSource is used as a stable ID for the source.\n * Plugins that use the Localizations API need a stable identifier for each\n * localization source So that they can synchronize localizations back into\n * Framer after a period of time.\n *\n * We hash the keyPath to get a stable ID and not leak internals how this\n * keypath is constructed\n */\nexport async function getLocalizationSourceId(keyPath: string): Promise<LocalizationSourceId> {\n\t// 16 bytes is 128 bits, plenty for no chance of collisions\n\treturn sha256(keyPath, 16, encodeByteArrayToBase62)\n}\n\nfunction normalizeValue(engine: VekterEngine, source: LocalizationSource, value: string, isHTML: boolean): string {\n\tif (!isHTML) return value\n\tconst node = engine.tree.get(source.nodeId)\n\treturn convertVekterHTMLToPluginHTML(engine, value, node)\n}\n\nfunction getGroupIncludedLocaleIds(engine: VekterEngine, group: LocalizationSourceGroup): IncludedLocales {\n\tif (group.includedLocaleIds) {\n\t\t// While it makes sense that the default locale is included in this\n\t\t// property in general, in plugins we need to ignore it.\n\t\treturn group.includedLocaleIds.filter(id => id !== defaultLocaleId)\n\t}\n\n\tconst locales = engine.tree.root.locales\n\tif (!locales) return\n\n\treturn locales.map(locale => locale.id)\n}\n\nfunction getStatusByLocale(\n\tengine: VekterEngine,\n\tgroup: LocalizationSourceGroup,\n): Record<LocaleId, LocalizationGroupStatus> {\n\tconst locales = engine.tree.root.locales\n\tif (!locales || locales.length === 0) return {}\n\n\tconst includedLocaleIds = getGroupIncludedLocaleIds(engine, group)\n\tif (!includedLocaleIds) return {}\n\n\tconst statusByLocale: Record<LocaleId, LocalizationGroupStatus> = {}\n\tfor (const locale of locales) {\n\t\tstatusByLocale[locale.id] = includedLocaleIds.includes(locale.id) ? \"ready\" : \"excluded\"\n\t}\n\treturn statusByLocale\n}\n\nfunction inferPluginLocalizationGroupType(group: LocalizationSourceGroup): LocalizationGroup[\"type\"] {\n\tswitch (group.groupType) {\n\t\tcase \"component\":\n\t\t\treturn \"component\"\n\t\tcase \"template\":\n\t\t\treturn \"template\"\n\t\tcase \"page\":\n\t\t\treturn \"page\"\n\t\tcase \"settings\":\n\t\t\treturn \"settings\"\n\t\tcase \"collection\":\n\t\t\treturn \"collection\"\n\t\tcase \"collectionItem\":\n\t\t\treturn \"collection-item\"\n\t\tdefault:\n\t\t\tassertNever(group)\n\t}\n}\n\nfunction getGroupName(group: LocalizationSourceGroup): string {\n\tif (withCollectionNodeParentInfo(group)) {\n\t\treturn `${group.collectionName} \u203A ${group.name}`\n\t}\n\n\treturn group.name\n}\n\nfunction flattenGroups(groups: LocalizationSourceGroup[]): LocalizationSourceGroup[] {\n\tconst flattenedGroups: LocalizationSourceGroup[] = []\n\n\tfor (const group of groups) {\n\t\t// Groups with sub groups might not have any items and should be excluded.\n\t\tif (group.items.length > 0) {\n\t\t\tflattenedGroups.push(group)\n\t\t}\n\n\t\tif (withLocalizationSubGroups(group)) {\n\t\t\tfor (const subGroup of group.groups) {\n\t\t\t\tflattenedGroups.push(subGroup)\n\t\t\t}\n\t\t}\n\t}\n\n\treturn flattenedGroups\n}\n\nfunction getAllFlattenedGroups(\n\tcomponentLoader: ComponentLoader,\n\t{ componentsStore, treeStore }: Pick<EngineStores, \"componentsStore\" | \"treeStore\">,\n): LocalizationSourceGroup[] {\n\tconst activeBundleHash = componentsStore.activeBundleHash\n\n\tconst groups = getLocalizationSourceGroups(\n\t\ttreeStore.tree,\n\t\tcomponentLoader,\n\t\ttreeStore.tree.root.locales,\n\t\tactiveBundleHash,\n\t\t\"canvasHtmlAsHtml\",\n\t)\n\n\treturn flattenGroups(groups)\n}\n\nexport async function getLocalizationGroups(\n\tengine: VekterEngine,\n\tpluginAbortSignal: AbortSignal,\n\tfilter?: GetLocalizationGroupsFilter,\n): Promise<LocalizationGroup[]> {\n\tawait engine.prioritizedFullDocumentLoad({\n\t\toperationName: \"plugin:getLocalizationSources\",\n\t\tsignal: pluginAbortSignal,\n\t})\n\n\tlet groups: LocalizationSourceGroup[] = getAllFlattenedGroups(engine.componentLoader, engine.stores)\n\n\tif (filter?.groupIds) {\n\t\tconst ids = new Set(filter.groupIds)\n\t\tgroups = groups.filter(group => ids.has(group.nodeId))\n\t}\n\n\tif (filter?.type) {\n\t\tconst targetType = filter.type\n\t\tgroups = groups.filter(group => inferPluginLocalizationGroupType(group) === targetType)\n\t}\n\n\tconst localizationGroups = await Promise.all(\n\t\tgroups.map(\n\t\t\tasync (group): Promise<LocalizationGroup> => ({\n\t\t\t\tid: group.nodeId,\n\t\t\t\tname: getGroupName(group),\n\t\t\t\ttype: inferPluginLocalizationGroupType(group),\n\t\t\t\tsources: await getLocalizationGroupSources(engine, group),\n\t\t\t\tstatusByLocale: getStatusByLocale(engine, group),\n\t\t\t\tsupportsExcludedStatus: group.supportsLocaleVisibility,\n\t\t\t}),\n\t\t),\n\t)\n\n\treturn localizationGroups\n}\n\nasync function getLocalizationGroupSources(\n\tengine: VekterEngine,\n\tgroup: LocalizationSourceGroup,\n): Promise<PluginLocalizationSource[]> {\n\tconst sources: PluginLocalizationSource[] = []\n\n\tfor (const source of group.items) {\n\t\tlet type = vekterSourceTypeToPluginSourceType(source.type)\n\t\t// JSON-backed rich text is plain text, not HTML \u2014 expose as \"string\" to plugins.\n\t\tconst isHTML = type === \"formattedText\" && isHTMLBackedRichTextSource(source)\n\t\tif (type === \"formattedText\" && !isHTML) type = \"string\"\n\n\t\tif (type === null) continue\n\n\t\tsources.push({\n\t\t\tid: await getLocalizationSourceId(source.keyPath),\n\t\t\ttype,\n\t\t\tvalue: normalizeValue(engine, source, source.value, isHTML),\n\t\t\tvalueByLocale: vekterLocalizedValuesToPluginLocalizationSourceLocales(engine, source, isHTML),\n\t\t})\n\t}\n\n\treturn sources\n}\n\ninterface SourceUpdate {\n\tsource: LocalizationSource\n\tupdatesByLocale: InternalLocalizationSourceUpdate\n}\n\ninterface IncludedLocalesUpdate {\n\tincludedLocales: LocaleId[] | undefined\n}\n\ninterface UpdateLocalizationStats {\n\ttotalUploads: number\n\tcompletedUploads: number\n\ttotalScopes: number\n\tcompletedScopes: number\n\ttotalSources: number\n\tcompletedSources: number\n}\n\ninterface UpdateLocalizationProgress {\n\tprogress: number\n\tdone: boolean\n\tresult: SetLocalizationDataResult\n}\n\nasync function createSourcesById(\n\tgroups: LocalizationSourceGroup[],\n): Promise<Map<LocalizationSourceId, LocalizationSource>> {\n\tconst sourcesById = new Map<LocalizationSourceId, LocalizationSource>()\n\tconst tasks = groups.flatMap(group =>\n\t\tgroup.items.map(async source => {\n\t\t\tconst id = await getLocalizationSourceId(source.keyPath)\n\t\t\tsourcesById.set(id, source)\n\t\t}),\n\t)\n\tawait Promise.all(tasks)\n\treturn sourcesById\n}\n\nasync function processLocaleUpdate(\n\tengine: VekterEngine,\n\tsource: LocalizationSource,\n\tnode: CanvasNode | null,\n\tupdateForLocale: LocalizedValueUpdate,\n\tcurrentLocalizedValue: LocalizedValue<LocalizedTextValue> | undefined,\n\tassetUploader: BatchAssetUploader,\n\tcontentType: ContentType = \"html\",\n): Promise<InternalLocalizedValueUpdate | undefined> {\n\tif (updateForLocale.action === \"clear\" && !currentLocalizedValue) {\n\t\treturn\n\t}\n\n\tif (updateForLocale.action === \"clear\") {\n\t\treturn updateForLocale\n\t}\n\n\tconst needsReview = updateForLocale.needsReview ? true : undefined\n\n\tif (updateForLocale.action === \"ignore\") {\n\t\t// If the value was already ignored and the needsReview flag // isn't changing, don't process.\n\t\tif (currentLocalizedValue?.value === null && currentLocalizedValue.needsReview === needsReview) {\n\t\t\treturn\n\t\t}\n\t\treturn updateForLocale\n\t}\n\n\tlet { value } = updateForLocale\n\n\tif (source.type === \"slug\" && isString(value)) {\n\t\tconst slugifiedValue = slugify(value)\n\t\tif (slugifiedValue !== value) {\n\t\t\tthrow new PluginOnlyError(`Invalid slug: ${value}`)\n\t\t}\n\t}\n\n\t// For non-HTML sources (including JSON-backed rich text exposed as plain text), compare\n\t// the incoming plugin value against the plugin-visible normalized form of the stored value.\n\t// This ensures read/write round-trips are stable when stored HTML is normalized to text.\n\tif (!isHTMLBackedRichTextSource(source) && currentLocalizedValue) {\n\t\tconst visibleValue = getPluginVisibleLocalizedValue(engine, source, currentLocalizedValue, false)\n\t\tif (visibleValue === value) {\n\t\t\tif (currentLocalizedValue.needsReview === needsReview) return\n\t\t\t// Text is unchanged but needsReview changed \u2014 preserve the existing stored\n\t\t\t// value (which may be HTML markup) and only update needsReview.\n\t\t\treturn {\n\t\t\t\taction: \"set\",\n\t\t\t\tvalue: currentLocalizedValue.value ?? value,\n\t\t\t\tneedsReview,\n\t\t\t}\n\t\t}\n\t}\n\n\t// For HTML-backed rich text, convert incoming plugin HTML to internal format.\n\tif (isHTMLBackedRichTextSource(source) && isString(value)) {\n\t\tif (source.type === ControlType.RichText) {\n\t\t\tvalue = await convertPluginHTMLToCollectionHTML(engine, value, node, assetUploader, contentType)\n\t\t} else {\n\t\t\tvalue = convertPluginHTMLToCanvasHTML(engine, value, node)\n\t\t}\n\t}\n\n\t// For HTML-backed sources, compare after conversion (internal-to-internal).\n\tif (currentLocalizedValue?.value === value && currentLocalizedValue.needsReview === needsReview) {\n\t\treturn\n\t}\n\n\treturn { action: \"set\", value, needsReview }\n}\n\nasync function processSourceUpdate(\n\tengine: VekterEngine,\n\tsource: LocalizationSource,\n\tsourceId: string,\n\tsourceUpdate: LocalizationSourceUpdate,\n\tassetUploader: BatchAssetUploader,\n\tresult: DeepMutable<SetLocalizationDataResult>,\n): Promise<InternalLocalizationSourceUpdate | null> {\n\tconst node = engine.tree.get(source.nodeId)\n\tconst localizedValuesThatChanged: InternalLocalizationSourceUpdate = {}\n\t// The existing behaviour for a long time was \"html\", to avoid breaking changes, we're making it the default again\n\tlet contentType: ContentType = \"html\"\n\tif (source.type === ControlType.RichText && \"contentType\" in source && source.contentType) {\n\t\t// apply the contentType from the source for localised values\n\t\tcontentType = source.contentType\n\t}\n\n\tconst localeTasks = Object.keys(sourceUpdate).map(async localeId => {\n\t\tconst locale = engine.tree.root.getNonDefaultLocale(localeId)\n\t\tif (!locale) {\n\t\t\tresult.valuesBySource.errors.push({\n\t\t\t\tsourceId,\n\t\t\t\tlocaleId,\n\t\t\t\terror: `Locale not found: ${localeId}`,\n\t\t\t})\n\t\t\treturn\n\t\t}\n\n\t\tconst updateForLocale = sourceUpdate[localeId]\n\t\tassert(isDefined(updateForLocale), \"Expected a value for locale\")\n\n\t\ttry {\n\t\t\tconst currentLocalizedValue = source.localizedValues[localeId]\n\n\t\t\tif (currentLocalizedValue && isLocalizedValueManagedByPlugin(engine, source, currentLocalizedValue)) {\n\t\t\t\tthrow new PluginOnlyError(\"Cannot update readonly localized value due to being set by a managed collection\")\n\t\t\t}\n\n\t\t\tconst update = await processLocaleUpdate(\n\t\t\t\tengine,\n\t\t\t\tsource,\n\t\t\t\tnode,\n\t\t\t\tupdateForLocale,\n\t\t\t\tcurrentLocalizedValue,\n\t\t\t\tassetUploader,\n\t\t\t\tcontentType,\n\t\t\t)\n\n\t\t\tif (update) {\n\t\t\t\tlocalizedValuesThatChanged[localeId] = update\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tif (error instanceof PluginOnlyError) {\n\t\t\t\tresult.valuesBySource.errors.push({\n\t\t\t\t\tsourceId,\n\t\t\t\t\tlocaleId,\n\t\t\t\t\terror: error.message,\n\t\t\t\t})\n\t\t\t} else {\n\t\t\t\tthrow error\n\t\t\t}\n\t\t}\n\t})\n\n\tawait Promise.all(localeTasks)\n\n\treturn localizedValuesThatChanged\n}\n\ntype UpdatesByScopeId = Map<string, { sourceUpdates?: SourceUpdate[]; includedLocalesUpdate?: IncludedLocalesUpdate }>\n\ntype ProcessedIncludedLocales = { hasChanges: true; includedLocales: LocaleId[] | undefined } | { hasChanges: false }\n\n/**\n * Process statusByLocale into includedLocales.\n *\n * Note that `undefined` is a valid value for `includedLocales`, hence why this\n * can return `undefined` or `null`, with the latter meaning that no update\n * is needed.\n */\nfunction processIncludedLocales(\n\tengine: VekterEngine,\n\tlocaleIds: LocaleId[],\n\tallLocaleIds: LocaleId[],\n\tgroupId: string,\n\tstatusByLocale: LocalizationGroupStatusByLocale,\n): ProcessedIncludedLocales {\n\tconst scope = engine.tree.get(groupId)\n\n\tconst missingLocales = localeIds.filter(id => !(id in statusByLocale))\n\tif (missingLocales.length > 0) {\n\t\tthrow new PluginOnlyError(`Missing locales: ${missingLocales.join(\", \")}`)\n\t}\n\n\tlet includedLocales: LocaleId[] | undefined = [\n\t\tdefaultLocaleId,\n\t\t...localeIds.filter(id => {\n\t\t\tconst status = statusByLocale[id]\n\t\t\tassert(status !== undefined, \"Expected status for locale\")\n\t\t\treturn status === \"ready\"\n\t\t}),\n\t]\n\n\tif (!scope) {\n\t\tthrow new PluginOnlyError(`No localization group with this ID exist`)\n\t}\n\n\tif (!withLocaleConfig(engine.tree, scope)) {\n\t\tthrow new PluginOnlyError(`Group does not support locale visibility`)\n\t}\n\n\tif (isShallowArrayEqual(allLocaleIds, includedLocales)) {\n\t\tincludedLocales = undefined\n\t}\n\n\t// Don't update if the node's value won't actually change\n\tif (isEqual(includedLocales, scope.includedLocales)) {\n\t\treturn { hasChanges: false }\n\t}\n\n\treturn { hasChanges: true, includedLocales }\n}\n\nfunction processStatusByLocale(\n\tengine: VekterEngine,\n\tstatusByLocaleByGroup: LocalizationData[\"statusByLocaleByGroup\"],\n\tlocaleIds: LocaleId[],\n\tallLocaleIds: LocaleId[],\n\tresult: DeepMutable<SetLocalizationDataResult>,\n\tupdatesByScopeId: UpdatesByScopeId,\n\tstats: UpdateLocalizationStats,\n) {\n\tfor (const groupId in statusByLocaleByGroup) {\n\t\tconst statusByLocale = statusByLocaleByGroup[groupId]\n\t\tassert(statusByLocale, \"Expected an update for group with id\")\n\n\t\tlet includedLocales: LocaleId[] | undefined | null\n\n\t\ttry {\n\t\t\tconst processIncludedLocalesResult = processIncludedLocales(\n\t\t\t\tengine,\n\t\t\t\tlocaleIds,\n\t\t\t\tallLocaleIds,\n\t\t\t\tgroupId,\n\t\t\t\tstatusByLocale,\n\t\t\t)\n\n\t\t\tif (!processIncludedLocalesResult.hasChanges) {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tincludedLocales = processIncludedLocalesResult.includedLocales\n\t\t} catch (error) {\n\t\t\tif (error instanceof PluginOnlyError) {\n\t\t\t\tresult.statusByLocaleByGroup.errors.push({ groupId, error: error.message })\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tthrow error\n\t\t}\n\n\t\tlet scopeUpdate = updatesByScopeId.get(groupId)\n\t\tif (!scopeUpdate) {\n\t\t\tstats.totalScopes++\n\t\t\tscopeUpdate = {}\n\t\t}\n\t\tscopeUpdate.includedLocalesUpdate = { includedLocales }\n\t\tupdatesByScopeId.set(groupId, scopeUpdate)\n\t}\n}\n\nfunction updateLocaleValue(\n\tengine: VekterEngine,\n\tpluginManifestId: PluginManifestId,\n\tpluginMode: Mode,\n\tupdateForLocale: InternalLocalizedValueUpdate,\n\tsource: LocalizationSource,\n\tlocale: VekterLocale,\n) {\n\tswitch (updateForLocale.action) {\n\t\tcase \"set\": {\n\t\t\tsetLocalizedValue(engine, updateForLocale.value, source, locale, {\n\t\t\t\tneedsReview: updateForLocale.needsReview ? true : undefined,\n\t\t\t\tpluginId: pluginManifestId,\n\t\t\t\tpluginMode,\n\t\t\t\t// FIXME: we should add one tracking event for the entire plugin localization\n\t\t\t\t// update.\n\t\t\t\tignoreTracking: true,\n\t\t\t\ttrackingSource: \"plugin-api\",\n\t\t\t})\n\t\t\tbreak\n\t\t}\n\t\tcase \"clear\": {\n\t\t\tclearLocalizedValue(engine, source, locale, {\n\t\t\t\ttarget: \"default\",\n\t\t\t\t// FIXME: we should add one tracking event for the entire plugin localization\n\t\t\t\t// update.\n\t\t\t\tignoreTracking: true,\n\t\t\t\ttrackingSource: \"plugin-api\",\n\t\t\t})\n\t\t\tbreak\n\t\t}\n\t\tcase \"ignore\": {\n\t\t\tsetLocalizedValue(engine, null, source, locale, {\n\t\t\t\tneedsReview: updateForLocale.needsReview ? true : undefined,\n\t\t\t\tpluginId: pluginManifestId,\n\t\t\t\tpluginMode,\n\t\t\t\t// FIXME: we should add one tracking event for the entire plugin localization\n\t\t\t\t// update.\n\t\t\t\tignoreTracking: true,\n\t\t\t\ttrackingSource: \"plugin-api\",\n\t\t\t})\n\t\t\tbreak\n\t\t}\n\t\tdefault:\n\t\t\tassertNever(updateForLocale)\n\t}\n}\n\nfunction getLocalizationProgressValue(stats: UpdateLocalizationStats): number {\n\tconst scopeProgress = stats.totalScopes === 0 ? 0 : stats.completedScopes / stats.totalScopes\n\tconst uploadProgress = stats.totalUploads === 0 ? 0 : stats.completedUploads / stats.totalUploads\n\n\tif (uploadProgress === 0) {\n\t\treturn scopeProgress\n\t}\n\n\treturn 0.2 * uploadProgress + 0.8 * scopeProgress\n}\n\nfunction updateProgress(progress: UpdateLocalizationProgress, stats: UpdateLocalizationStats) {\n\tprogress.progress = progress.done ? 1 : getLocalizationProgressValue(stats)\n\treturn progress\n}\n\nfunction assertLocalizationWriteAllowed(engine: VekterEngine, signal: AbortSignal | undefined) {\n\tif (signal?.aborted) {\n\t\tthrow new PluginOnlyError(\"Plugin closed before localization updates could be applied\")\n\t}\n\n\tif (getIsViewOnly(engine, \"canEditLocalizedValues\")) {\n\t\tthrow new PluginOnlyError(\"Plugin no longer has permission to edit localized values\")\n\t}\n}\n\nexport async function* updateLocalization(\n\tengine: VekterEngine,\n\tpluginManifestId: PluginManifestId,\n\tpluginMode: Mode,\n\t{ valuesBySource, statusByLocaleByGroup }: LocalizationData,\n\tsignal?: AbortSignal,\n): AsyncGenerator<UpdateLocalizationProgress> {\n\tconst groups = getAllFlattenedGroups(engine.componentLoader, engine.stores)\n\n\tconst sourcesById = await createSourcesById(groups)\n\n\tconst result: DeepMutable<SetLocalizationDataResult> = {\n\t\tvaluesBySource: { errors: [] },\n\t\tstatusByLocaleByGroup: { errors: [] },\n\t}\n\n\tconst stats: UpdateLocalizationStats = {\n\t\ttotalUploads: 0,\n\t\tcompletedUploads: 0,\n\t\ttotalScopes: 0,\n\t\tcompletedScopes: 0,\n\t\ttotalSources: 0,\n\t\tcompletedSources: 0,\n\t}\n\tconst progress: UpdateLocalizationProgress = {\n\t\tprogress: 0,\n\t\tdone: false,\n\t\tresult,\n\t}\n\n\t// First we collect all updates by code generation scope\n\tconst updatesByScopeId: UpdatesByScopeId = new Map()\n\n\tconst locales = engine.tree.root.locales\n\tif (!locales || locales.length === 0) {\n\t\tprogress.done = true\n\t\tyield updateProgress(progress, stats)\n\t\treturn\n\t}\n\n\tconst localeIds = locales.map(locale => locale.id)\n\tconst allLocaleIds = [defaultLocaleId, ...localeIds]\n\n\tconst assetUploader = new BatchAssetUploader(engine, { silent: true })\n\n\tconst sourceTasks = Object.keys(valuesBySource ?? []).map(async sourceId => {\n\t\tconst source = sourcesById.get(sourceId)\n\t\tconst sourceUpdate = valuesBySource?.[sourceId]\n\n\t\tif (!sourceUpdate) return\n\t\tif (!source) {\n\t\t\tresult.valuesBySource.errors.push({ sourceId, localeId: null, error: \"No source with this ID exists\" })\n\t\t\treturn\n\t\t}\n\n\t\tconst localizedValuesThatChanged = await processSourceUpdate(\n\t\t\tengine,\n\t\t\tsource,\n\t\t\tsourceId,\n\t\t\tsourceUpdate,\n\t\t\tassetUploader,\n\t\t\tresult,\n\t\t)\n\n\t\tif (!localizedValuesThatChanged) return\n\n\t\tconst codeGenerationScopeId = getCodeGenerationScopeId(engine, source)\n\t\tif (!updatesByScopeId.has(codeGenerationScopeId)) {\n\t\t\tstats.totalScopes++\n\t\t}\n\n\t\tconst sourceUpdates = updatesByScopeId.get(codeGenerationScopeId)?.sourceUpdates ?? []\n\t\tupdatesByScopeId.set(codeGenerationScopeId, { sourceUpdates })\n\t\tsourceUpdates.push({ source, updatesByLocale: localizedValuesThatChanged })\n\n\t\tstats.totalSources++\n\t})\n\n\tfor await (const { completed, started } of assetUploader.statusUpdates()) {\n\t\tstats.totalUploads = started\n\t\tstats.completedUploads = completed\n\t\tyield updateProgress(progress, stats)\n\t}\n\n\tstats.completedUploads = stats.totalUploads\n\tyield updateProgress(progress, stats)\n\n\t// Needed as assetUploader might be done, but the rest of the tasks not. No\n\t// progress updates needed because there's very little processing there.\n\tawait Promise.all(sourceTasks)\n\n\t// As totalSources might change\n\tyield updateProgress(progress, stats)\n\n\tprocessStatusByLocale(engine, statusByLocaleByGroup, localeIds, allLocaleIds, result, updatesByScopeId, stats)\n\n\tfor (const [scopeId, { sourceUpdates, includedLocalesUpdate }] of updatesByScopeId) {\n\t\tfor (const { source, updatesByLocale } of sourceUpdates ?? []) {\n\t\t\tawait processWhenConnected(engine, signal, () => {\n\t\t\t\tassertLocalizationWriteAllowed(engine, signal)\n\t\t\t\tapplyLocalizationUpdatesForSource(engine, pluginManifestId, pluginMode, updatesByLocale, source)\n\t\t\t\tstats.completedSources++\n\t\t\t})\n\t\t}\n\n\t\tif (includedLocalesUpdate) {\n\t\t\tconst { includedLocales } = includedLocalesUpdate\n\n\t\t\tawait processWhenConnected(engine, signal, () => {\n\t\t\t\tassertLocalizationWriteAllowed(engine, signal)\n\t\t\t\tconst scope = engine.tree.get(scopeId)\n\t\t\t\t// This was already checked\n\t\t\t\tassert(withLocaleConfig(engine.tree, scope), \"Scope does not support locale visibility\")\n\t\t\t\tscope.set({ includedLocales })\n\t\t\t})\n\t\t}\n\n\t\tlog.debug(\"compiling scope: \" + scopeId)\n\t\tif (!environment.isTest) {\n\t\t\t// Wait for the scope to code generate and compile. Persistence\n\t\t\t// will happen in the background when Vekter thinks it's most\n\t\t\t// appropriate.\n\t\t\tawait engine.stores.codeGenerationStore.updateComponent(scopeId)\n\t\t}\n\n\t\tlog.debug(\"compiled scope: \" + scopeId)\n\n\t\tstats.completedScopes++\n\t\tyield updateProgress(progress, stats)\n\t}\n\n\tprogress.done = true\n\tyield updateProgress(progress, stats)\n}\n\nasync function processLocalizationUpdate(\n\tengine: VekterEngine,\n\tsource: LocalizationSource,\n\tsourceUpdate: LocalizationSourceUpdate,\n\tassetUploader: BatchAssetUploader,\n): Promise<InternalLocalizationSourceUpdate> {\n\tconst node = engine.tree.get(source.nodeId)\n\tconst localizedValuesThatChanged: InternalLocalizationSourceUpdate = {}\n\tlet contentType: ContentType = \"html\"\n\tif (source.type === ControlType.RichText && \"contentType\" in source && source.contentType) {\n\t\tcontentType = source.contentType\n\t}\n\n\tconst localeTasks = Object.keys(sourceUpdate).map(async localeId => {\n\t\tconst locale = engine.tree.root.getNonDefaultLocale(localeId)\n\t\tif (!locale) {\n\t\t\tthrow new PluginOnlyError(`Locale not found: ${localeId}`)\n\t\t}\n\n\t\tconst updateForLocale = sourceUpdate[localeId]\n\t\tassert(isDefined(updateForLocale), \"Expected a value for locale\")\n\n\t\tconst update = await processLocaleUpdate(\n\t\t\tengine,\n\t\t\tsource,\n\t\t\tnode,\n\t\t\tupdateForLocale,\n\t\t\tsource.localizedValues[localeId],\n\t\t\tassetUploader,\n\t\t\tcontentType,\n\t\t)\n\n\t\tif (update) {\n\t\t\tlocalizedValuesThatChanged[localeId] = update\n\t\t}\n\t})\n\n\tawait Promise.all(localeTasks)\n\n\treturn localizedValuesThatChanged\n}\n\ntype LocalizationUpdates = Map<LocalizationSource, InternalLocalizationSourceUpdate>\n\ntype SourcesByKeyPath = Map<string, LocalizationSourceExcludingRouteSegments>\n\nasync function processLocalizationUpdatesOfField(\n\tengine: VekterEngine,\n\tlocalizationUpdates: LocalizationUpdates,\n\tsourcesByKeyPath: SourcesByKeyPath,\n\tassetUploader: BatchAssetUploader,\n\tkeyPath: string,\n\tvalue: FieldDataEntryInput,\n\tvariable: VariableDefinition,\n\tcontrolProp: CollectionControlProp,\n) {\n\tswitch (value.type) {\n\t\tcase \"string\":\n\t\tcase \"formattedText\":\n\t\tcase \"link\": {\n\t\t\tif (value.valueByLocale) {\n\t\t\t\tconst source = sourcesByKeyPath.get(keyPath)\n\t\t\t\tif (!source) return\n\n\t\t\t\tconst updates = await processLocalizationUpdate(engine, source, value.valueByLocale, assetUploader)\n\t\t\t\tlocalizationUpdates.set(source, updates)\n\t\t\t}\n\t\t\treturn\n\t\t}\n\t\tcase \"image\": {\n\t\t\tif (value.altByLocale) {\n\t\t\t\tconst source = sourcesByKeyPath.get(keyPath)\n\t\t\t\tif (!source) return\n\n\t\t\t\tconst updates = await processLocalizationUpdate(engine, source, value.altByLocale, assetUploader)\n\t\t\t\tlocalizationUpdates.set(source, updates)\n\t\t\t}\n\t\t\treturn\n\t\t}\n\t\tcase \"array\": {\n\t\t\tassert(variable.type === value.type, \"Expected an array variable\")\n\t\t\tassert(controlProp.type === ControlType.Array, \"Expected array control prop for array variable\")\n\n\t\t\tconst tasks: Promise<void>[] = []\n\n\t\t\t// We need to look up the control props because we need to know the\n\t\t\t// IDs that were assigned to any created array items.\n\t\t\tfor (let index = 0; index < value.value.length; index++) {\n\t\t\t\tconst item = value.value[index]\n\t\t\t\tif (!item) continue\n\n\t\t\t\tconst itemControlProp = controlProp.value[index]\n\t\t\t\tassert(itemControlProp, \"No corresponding array item control prop found\")\n\n\t\t\t\t// Sanity check that any update inputs, which do have IDs,\n\t\t\t\t// actually match the control prop IDs.\n\t\t\t\tif (isUpdateArrayItem(item)) {\n\t\t\t\t\tassert(item.id === itemControlProp.id, \"Mismatched array item IDs found\")\n\t\t\t\t}\n\n\t\t\t\tconst keyPathForObject = addArrayItemIdToKeyPath(undefined, itemControlProp.id)\n\t\t\t\tconst itemKeyPath = addObjectPropToKeyPath(keyPath, keyPathForObject)\n\n\t\t\t\tfor (const itemVariable of variable.itemVariables) {\n\t\t\t\t\tif (!isVariableDefinition(itemVariable)) continue\n\n\t\t\t\t\tconst itemField = item.fieldData?.[itemVariable.externalId ?? itemVariable.id]\n\t\t\t\t\tif (!itemField) continue\n\t\t\t\t\tconst itemVariableKeyPath = addObjectPropToKeyPath(itemKeyPath, itemVariable.id)\n\n\t\t\t\t\tconst itemVariableControlProp = itemControlProp.value?.[itemVariable.id]\n\t\t\t\t\tassert(itemVariableControlProp, `Expected control prop for item variable ${itemVariable.id}`)\n\n\t\t\t\t\tconst task = processLocalizationUpdatesOfField(\n\t\t\t\t\t\tengine,\n\t\t\t\t\t\tlocalizationUpdates,\n\t\t\t\t\t\tsourcesByKeyPath,\n\t\t\t\t\t\tassetUploader,\n\t\t\t\t\t\titemVariableKeyPath,\n\t\t\t\t\t\titemField,\n\t\t\t\t\t\titemVariable,\n\t\t\t\t\t\titemVariableControlProp,\n\t\t\t\t\t)\n\t\t\t\t\ttasks.push(task)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tawait Promise.all(tasks)\n\t\t\treturn\n\t\t}\n\t\tcase \"boolean\":\n\t\tcase \"color\":\n\t\tcase \"date\":\n\t\tcase \"enum\":\n\t\tcase \"file\":\n\t\tcase \"number\":\n\t\tcase \"collectionReference\":\n\t\tcase \"multiCollectionReference\":\n\t\t\t// Don't support localization\n\t\t\treturn\n\t\tdefault:\n\t\t\tassertNever(value)\n\t}\n}\n\nexport async function prepareCollectionItemLocalizationUpdates(\n\tengine: VekterEngine,\n\tcollection: CollectionNode,\n\tinputItems: readonly NormalizedCollectionItemInput[],\n\tassetUploader: BatchAssetUploader,\n): Promise<{\n\tlocalizationUpdates: LocalizationUpdates\n\tincludedLocalesUpdates: Map<string, LocaleId[] | undefined>\n}> {\n\tconst localizationUpdates: LocalizationUpdates = new Map()\n\tconst includedLocalesUpdates = new Map<string, LocaleId[] | undefined>()\n\tconst locales = engine.tree.root.locales\n\n\tif (!locales?.length) return { localizationUpdates, includedLocalesUpdates }\n\n\tconst localeIds = locales.map(locale => locale.id)\n\tconst allLocaleIds = [defaultLocaleId, ...localeIds]\n\n\tconst nestedGroups: LocalizationSourceGroup[] = []\n\tconst contentManagementNode = getContentManagementNode(engine.tree)\n\tassert(contentManagementNode?.isLoaded(), \"Scope node must be fully loaded\")\n\tcollectLocalizationSourcesFromContentManagementNode(\n\t\tengine.tree,\n\t\tengine.componentLoader,\n\t\tcontentManagementNode,\n\t\tlocales,\n\t\tengine.stores.componentsStore.activeBundleHash,\n\t\tnestedGroups,\n\t)\n\tconst flattenedGroups = flattenGroups(nestedGroups)\n\n\tconst sourcesByKeyPath: SourcesByKeyPath = new Map()\n\tfor (const group of flattenedGroups) {\n\t\tfor (const source of group.items) {\n\t\t\tif (withLocalizationSourceControlProp(source) && source.type !== ClassDiscriminator.RouteSegmentNode) {\n\t\t\t\tsourcesByKeyPath.set(source.keyPath, source)\n\t\t\t}\n\t\t}\n\t}\n\n\tconst slugsByLocale = getCollectionSlugOccurrencesByLocaleId(locales, collection)\n\n\tconst localizationTasks = inputItems.map(async inputItem => {\n\t\tif (inputItem.statusByLocale) {\n\t\t\tconst includedLocalesResult = processIncludedLocales(\n\t\t\t\tengine,\n\t\t\t\tlocaleIds,\n\t\t\t\tallLocaleIds,\n\t\t\t\tinputItem.id,\n\t\t\t\tinputItem.statusByLocale,\n\t\t\t)\n\n\t\t\tif (includedLocalesResult.hasChanges) {\n\t\t\t\tincludedLocalesUpdates.set(inputItem.id, includedLocalesResult.includedLocales)\n\t\t\t}\n\t\t}\n\n\t\tconst keyPath = inputItem.id\n\n\t\tconst collectionItem = collection.children.find(child => child.id === inputItem.id)\n\t\tif (!collectionItem) return\n\n\t\tif (inputItem.slugByLocale) {\n\t\t\tconst { variable, value } = inputItem.slugByLocale\n\t\t\tconst slugKeyPath = addObjectPropToKeyPath(keyPath, variable.id)\n\t\t\tconst source = sourcesByKeyPath.get(slugKeyPath)\n\t\t\tassert(source, `Source not found for variable ${variable.id}`)\n\n\t\t\tconst updates = await processLocalizationUpdate(engine, source, value, assetUploader)\n\n\t\t\tfor (const locale in updates) {\n\t\t\t\tconst localizedValueUpdate = updates[locale]\n\t\t\t\t// Use the default locale's value if not setting a new value\n\t\t\t\tlet slug = source.value\n\t\t\t\tif (localizedValueUpdate?.action === \"set\") {\n\t\t\t\t\tassert(typeof localizedValueUpdate.value === \"string\", \"Slug updates must stay string values\")\n\t\t\t\t\tslug = slugify(localizedValueUpdate.value)\n\t\t\t\t}\n\t\t\t\tconst slugsForLocale = slugsByLocale[locale]\n\t\t\t\tassert(slugsForLocale, `Slug occurrences not found for locale ${locale}`)\n\n\t\t\t\tconst slugOccurences = slugsForLocale.get(slug) ?? 0\n\t\t\t\tslugsForLocale.set(slug, slugOccurences + 1)\n\t\t\t}\n\n\t\t\tlocalizationUpdates.set(source, updates)\n\t\t}\n\n\t\tfor (const field of inputItem.fieldData) {\n\t\t\tconst { value, variable } = field\n\t\t\tconst fieldKeyPath = addObjectPropToKeyPath(keyPath, variable.id)\n\n\t\t\tconst fieldControlProp = collectionItem?.getControlProp(variable.id)\n\t\t\tassert(fieldControlProp, `Expected control prop for variable ${variable.id}`)\n\n\t\t\tawait processLocalizationUpdatesOfField(\n\t\t\t\tengine,\n\t\t\t\tlocalizationUpdates,\n\t\t\t\tsourcesByKeyPath,\n\t\t\t\tassetUploader,\n\t\t\t\tfieldKeyPath,\n\t\t\t\tvalue,\n\t\t\t\tvariable,\n\t\t\t\tfieldControlProp,\n\t\t\t)\n\t\t}\n\t})\n\n\tawait Promise.all(localizationTasks)\n\n\tfor (const locale in slugsByLocale) {\n\t\tconst slugs = slugsByLocale[locale]\n\t\tassert(slugs)\n\n\t\tconst duplicateSlugs: string[] = []\n\t\tfor (const [slug, occurrences] of slugs.entries()) {\n\t\t\tif (occurrences > 1) {\n\t\t\t\tduplicateSlugs.push(slug)\n\t\t\t}\n\t\t}\n\n\t\tif (duplicateSlugs.length > 0) {\n\t\t\tthrow new PluginOnlyError(`Duplicate slugs found in locale ${locale}: ${duplicateSlugs.join(\", \")}`)\n\t\t}\n\t}\n\n\treturn { localizationUpdates, includedLocalesUpdates }\n}\n\nexport function applyIncludedLocalesUpdates(\n\tengine: VekterEngine,\n\tincludedLocalesUpdates: Map<string, LocaleId[] | undefined>,\n) {\n\tfor (const [nodeId, includedLocales] of includedLocalesUpdates) {\n\t\tconst node = engine.tree.get(nodeId)\n\n\t\t// It's possible that the node has been deleted\n\t\tif (!withLocaleConfig(engine.tree, node)) continue\n\n\t\tnode.set({ includedLocales })\n\t}\n}\n\nexport function applyLocalizationUpdates(\n\tengine: VekterEngine,\n\tpluginManifestId: PluginManifestId,\n\tpluginMode: Mode,\n\tlocalizationUpdates: LocalizationUpdates,\n) {\n\tfor (const [source, updates] of localizationUpdates) {\n\t\tapplyLocalizationUpdatesForSource(engine, pluginManifestId, pluginMode, updates, source)\n\t}\n}\n\nfunction applyLocalizationUpdatesForSource(\n\tengine: VekterEngine,\n\tpluginManifestId: PluginManifestId,\n\tpluginMode: Mode,\n\tupdatesByLocale: InternalLocalizationSourceUpdate,\n\tsource: LocalizationSource,\n) {\n\tfor (const localeId in updatesByLocale) {\n\t\tconst update = updatesByLocale[localeId]\n\t\tassert(update)\n\t\tconst locale = engine.tree.root.getNonDefaultLocale(localeId)\n\t\tif (!locale) {\n\t\t\tthrow new PluginOnlyError(`Locale not found: ${localeId}`)\n\t\t}\n\n\t\tupdateLocaleValue(engine, pluginManifestId, pluginMode, update, source, locale)\n\t}\n}\n\nfunction canUseCustomLocaleRegions(engine: VekterEngine): boolean {\n\treturn engine.stores.projectStore.featureFlags?.canUseCustomLocaleRegions === \"on\"\n}\n\nexport function getLocaleLanguages(): { code: string; name: string }[] {\n\treturn Object.entries(localeLanguages)\n\t\t.map(([code, name]) => ({ code, name }))\n\t\t.sort((a, b) => a.name.localeCompare(b.name))\n}\n\nexport function getLocaleRegions(\n\tengine: VekterEngine,\n\tlanguage: string,\n): { code: string; name: string; isCommon: boolean }[] {\n\tif (!isLocaleLanguageCode(language)) {\n\t\tthrow new PluginOnlyError(`Language code \"${language}\" is not valid`)\n\t}\n\n\tconst commonRegions = getCommonRegionsForLanguage(language)\n\n\tif (canUseCustomLocaleRegions(engine)) {\n\t\treturn Object.entries(localeRegions)\n\t\t\t.map(([code, name]) => ({ code, name, isCommon: commonRegions.has(code as never) }))\n\t\t\t.sort((a, b) => a.name.localeCompare(b.name))\n\t}\n\n\t// Free plan: only return common regions for this language\n\treturn Object.entries(localeRegions)\n\t\t.filter(([code]) => commonRegions.has(code as never))\n\t\t.map(([code, name]) => ({ code, name, isCommon: true }))\n\t\t.sort((a, b) => a.name.localeCompare(b.name))\n}\n\nexport function createLocale(engine: VekterEngine, input: CreateLocaleInput): PluginLocale {\n\tconst currentLocales = engine.tree.root.locales ?? []\n\n\tif (!isLocaleLanguageCode(input.language)) {\n\t\tthrow new PluginOnlyError(`Language code \"${input.language}\" is not valid`)\n\t}\n\tif (input.region !== undefined && !isLocaleRegionCode(input.region)) {\n\t\tthrow new PluginOnlyError(`Region code \"${input.region}\" is not valid`)\n\t}\n\n\tconst code = input.region ? `${input.language}-${input.region}` : input.language\n\tif (code === engine.tree.root.getDefaultLocaleCode() || currentLocales.some(locale => locale.code === code)) {\n\t\tthrow new PluginOnlyError(`Locale with code \"${code}\" already exists`)\n\t}\n\n\tif (input.fallbackLocaleId !== undefined) {\n\t\tconst isDefaultLocale = input.fallbackLocaleId === defaultLocaleId\n\t\tconst fallbackLocale = currentLocales.find(locale => locale.id === input.fallbackLocaleId)\n\t\tif (!isDefaultLocale && !fallbackLocale) {\n\t\t\tthrow new PluginOnlyError(`Fallback locale with id \"${input.fallbackLocaleId}\" does not exist`)\n\t\t}\n\t}\n\n\tif (canUseCustomLocaleRegions(engine)) {\n\t\tif (!isLocaleCode(code)) {\n\t\t\tthrow new PluginOnlyError(`Locale code \"${code}\" is not valid`)\n\t\t}\n\t} else {\n\t\tif (!isCommonLocaleCode(code)) {\n\t\t\tthrow new PluginOnlyError(`Locale code \"${code}\" is not available on your plan`)\n\t\t}\n\t}\n\n\tconst defaultLocaleName = engine.tree.root.getDefaultLocaleName()\n\tconst takenNames = new Set(currentLocales.map(locale => locale.name))\n\ttakenNames.add(defaultLocaleName)\n\tconst name = input.name ?? suggestLocaleName(code, takenNames) ?? code\n\tif (takenNames.has(name)) {\n\t\tthrow new PluginOnlyError(`Locale name \"${name}\" is already in use`)\n\t}\n\n\tconst defaultLocaleCode = engine.tree.root.getDefaultLocaleCode()\n\tconst takenSlugs = new Set(currentLocales.map(locale => locale.slug))\n\ttakenSlugs.add(slugify(defaultLocaleCode.split(\"-\")[0]))\n\tconst slug = input.slug ?? suggestLocaleSlug(code, takenSlugs) ?? slugify(code)\n\tif (takenSlugs.has(slug)) {\n\t\tthrow new PluginOnlyError(`Locale slug \"${slug}\" is already in use`)\n\t}\n\n\tconst id = randomID()\n\tconst newLocale: VekterLocale = {\n\t\tid,\n\t\tcode,\n\t\tslug,\n\t\tname,\n\t\tdraft: input.draft ?? false,\n\t\tfallback: input.fallbackLocaleId,\n\t}\n\n\tconst newLocales = List.push(currentLocales, newLocale)\n\tengine.tree.root.set({ locales: newLocales })\n\n\treturn vekterLocaleToPluginLocale(newLocale)\n}\n\nexport const testing = { processLocaleUpdate }\n", "import { REGULAR_FONT_WEIGHT } from \"@framerjs/app-shared\"\nimport { getClosestToRegularFont } from \"document/components/utils/getClosestToRegularFont.ts\"\nimport type { ReadonlyFont } from \"library/index.ts\"\nimport type { FontStore } from \"library/render/fonts/fontStore.ts\"\nimport type { FontData, FontStyle, FontWeight } from \"#framer-plugin/fonts.ts\"\nimport { isFontStyle, isFontWeight } from \"#framer-plugin/fonts.ts\"\n\nfunction isWebFontSource(font: ReadonlyFont): boolean {\n\treturn font.family.source === \"google\" || font.family.source === \"fontshare\"\n}\n\nexport function getFontDataFromReadonlyFont(font: ReadonlyFont | undefined): FontData | null {\n\tif (!font) return null\n\n\treturn {\n\t\t__class: \"Font\",\n\t\tselector: font.selector,\n\t\tfamily: font.family.name,\n\t\tweight: isFontWeight(font.weight) ? font.weight : null,\n\t\tstyle: isFontStyle(font.style) ? font.style : null,\n\t}\n}\n\n/**\n * Find the equivalent font from the store.\n *\n * No `custom`, `local` or `framer` fonts are returned since they are not\n * guaranteed to have weights or styles. Letting plugin authors use them would\n * make things error prone (e.g font works on one computer but not on another).\n * */\nexport function getFont(fontStore: FontStore, family: string, attributes?: Record<string, unknown>): FontData | null {\n\tconst fonts = fontStore.getAvailableFonts()\n\n\tfor (const font of fonts) {\n\t\tif (!isWebFontSource(font)) continue\n\n\t\tconst isFamilyMatch = font.family.name.toLowerCase() === family.toLowerCase()\n\n\t\tif (isFamilyMatch && !attributes) {\n\t\t\tconst defaultFont = getClosestToRegularFont(font.family)\n\t\t\treturn getFontDataFromReadonlyFont(defaultFont)\n\t\t}\n\n\t\tif (isFamilyMatch && attributes) {\n\t\t\tconst weight: FontWeight = isFontWeight(attributes.weight) ? attributes.weight : REGULAR_FONT_WEIGHT\n\t\t\tconst style: FontStyle = isFontStyle(attributes.style) ? attributes.style : \"normal\"\n\n\t\t\tif (font.weight === weight && font.style === style) {\n\t\t\t\treturn getFontDataFromReadonlyFont(font)\n\t\t\t}\n\t\t}\n\t}\n\n\treturn null\n}\n\nexport function getFonts(fontStore: FontStore): FontData[] {\n\tconst fonts = fontStore.getAvailableFonts()\n\n\tconst allFontData: FontData[] = []\n\n\tfor (const font of fonts) {\n\t\tif (!isWebFontSource(font)) continue\n\n\t\tconst fontData = getFontDataFromReadonlyFont(font)\n\t\tif (!fontData) continue\n\n\t\tallFontData.push(fontData)\n\t}\n\n\treturn allFontData\n}\n", "export enum CSSUnit {\n\tPixel = \"px\",\n\tRem = \"rem\",\n\tEm = \"em\",\n\tPercentage = \"%\",\n\tFraction = \"fr\",\n\tViewportWidth = \"vw\",\n\tViewportHeight = \"vh\",\n}\n\nexport type CSSDimension<U extends CSSUnit> = `${number}${U}`\n", "import { parseCSSDimension } from \"document/models/CanvasTree/traits/utils/CSSDimension.ts\"\nimport { isNull, isString, isUndefined } from \"utils/typeChecks.ts\"\nimport { CSSUnit as PluginCSSUnit } from \"#framer-plugin/css.ts\"\n\nconst pluginCssUnits = Object.values(PluginCSSUnit)\nexport const isPluginCssUnit = (unit: unknown): unit is PluginCSSUnit => pluginCssUnits.includes(unit as PluginCSSUnit)\n\ninterface PluginCSSUnitValue {\n\tvalue: number\n\tunit: PluginCSSUnit\n}\n\nexport function parsePluginCSSDimension(dimension: unknown): PluginCSSUnitValue | null {\n\tif (!isString(dimension)) return null\n\tconst [value, unit] = parseCSSDimension(dimension)\n\tif (isUndefined(unit)) return null\n\tif (!isPluginCssUnit(unit)) return null\n\treturn { value, unit }\n}\n\nexport function parsePluginCSSDimensions(dimensions: unknown): PluginCSSUnitValue[] | null {\n\tif (!isString(dimensions)) return null\n\tconst segments = dimensions.split(\" \")\n\tconst values: PluginCSSUnitValue[] = []\n\tfor (const segment of segments) {\n\t\tconst pluginCssUnitValue = parsePluginCSSDimension(segment)\n\t\tif (isNull(pluginCssUnitValue)) return null\n\t\tvalues.push(pluginCssUnitValue)\n\t}\n\treturn values\n}\n", "import { assert } from \"@framerjs/shared\"\nimport { getClosestToRegularFont } from \"document/components/utils/getClosestToRegularFont.ts\"\nimport type { CanvasNode } from \"document/models/CanvasTree/index.ts\"\nimport type { ColorStyleTokenNode } from \"document/models/CanvasTree/nodes/ColorStyleTokenNode.ts\"\nimport { getTextStylePresetNameForTag } from \"document/models/CanvasTree/nodes/TextStylePresetNode.ts\"\nimport type { TextStylePresetPrimaryNode } from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport { isColorStyleTokenNode, isTextStylePresetNode } from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport { isRichTextTag } from \"document/models/CanvasTree/traits/WithRichTextTag.ts\"\nimport {\n\tisFontSizeCSSDimension,\n\tisLetterSpacing,\n\tisLineHeight,\n\tisTextAlignment,\n\tisTextDecoration,\n\tisTextDecorationCSSDimension,\n\tisTextDecorationSkipInk,\n\tisTextDecorationStyle,\n\tisTextTransform,\n} from \"document/models/CanvasTree/traits/WithTextStyle.ts\"\nimport { parseCSSDimension } from \"document/models/CanvasTree/traits/utils/CSSDimension.ts\"\nimport { tokenToCSSVariable } from \"document/models/CanvasTree/utils/tokens.ts\"\nimport { isBoolean, isNull, isNumber, isObject, isString } from \"utils/typeChecks.ts\"\nimport { isFont } from \"#framer-plugin/fonts.ts\"\nimport { isColorStyleData } from \"#framer-plugin/styles.ts\"\nimport type { ActivePluginContext } from \"./ActivePlugin.ts\"\nimport type { StyleNode } from \"./styles.ts\"\nimport type { ReadonlyAttributes, ValidatedReadonlyAttributes } from \"./stylesValidation.ts\"\n\ntype AnyStyleNodeUpdate = Partial<ColorStyleTokenNode & TextStylePresetPrimaryNode>\n\n/**\n * Return an object suitable to use with `set` on a style related node. E.g\n * `textStyle.set()`.\n *\n * Any attributes that are invalid or are missing will either be ignored or\n * fixed depending on the node type.\n */\nexport function getVekterStyleDataFromPlugin(\n\tcontext: ActivePluginContext,\n\tnode: StyleNode,\n\t{ attributes }: ValidatedReadonlyAttributes,\n): AnyStyleNodeUpdate {\n\tconst update: AnyStyleNodeUpdate = {}\n\n\tif (!isObject(attributes)) return update\n\n\tcollectColorToken(node, attributes, update)\n\tcollectTextStylePreset(node, attributes, update, context)\n\n\treturn update\n}\n\nfunction collectColorToken(node: CanvasNode, attributes: ReadonlyAttributes, update: AnyStyleNodeUpdate) {\n\tif (!isColorStyleTokenNode(node)) return\n\n\tif (isString(attributes.name)) {\n\t\tupdate.name = attributes.name\n\t}\n\n\tif (isString(attributes.light)) {\n\t\tupdate.light = attributes.light\n\t}\n\n\tif (isString(attributes.dark)) {\n\t\tupdate.dark = attributes.dark\n\t}\n\n\tif (isNull(attributes.dark)) {\n\t\tupdate.dark = undefined\n\t}\n}\n\nfunction collectTextStylePreset(\n\tnode: CanvasNode,\n\tattributes: ReadonlyAttributes,\n\tupdate: AnyStyleNodeUpdate,\n\tcontext: ActivePluginContext,\n) {\n\tif (!isTextStylePresetNode(node)) return\n\n\tif (isRichTextTag(attributes.tag)) {\n\t\tupdate.tag = attributes.tag\n\t}\n\n\tif (isString(attributes.name)) {\n\t\tupdate.name = attributes.name\n\t} else {\n\t\tif (update.tag) {\n\t\t\tupdate.name = getTextStylePresetNameForTag(update.tag)\n\t\t}\n\t}\n\n\tif (isFont(attributes.font)) {\n\t\tconst existingBaseFont = context.fontStore.getFontBySelector(node.font)\n\t\tassert(existingBaseFont, \"Expected preset base font to exist\")\n\n\t\tconst newBaseFont = context.fontStore.getFontBySelector(attributes.font.selector)\n\t\tassert(newBaseFont, \"Expected font attribute to be validated as an existing font\")\n\n\t\tconst isNewBaseFontDifferentFromExisting = existingBaseFont.family.name !== newBaseFont.family.name\n\n\t\t// Update the base font.\n\t\tupdate.font = newBaseFont.selector\n\n\t\t// If a font is different when compared to the existing one used by the\n\t\t// preset one, update the font variants with suitable fonts if they are\n\t\t// not defined.\n\t\tif (isNewBaseFontDifferentFromExisting) {\n\t\t\tif (!isFont(attributes.boldFont)) {\n\t\t\t\tupdate.fontBold = newBaseFont.selectorBold\n\t\t\t}\n\n\t\t\tif (!isFont(attributes.italicFont)) {\n\t\t\t\tupdate.fontItalic = newBaseFont.selectorItalic\n\t\t\t}\n\n\t\t\tif (!isFont(attributes.boldItalicFont)) {\n\t\t\t\tupdate.fontBoldItalic = newBaseFont.selectorBoldItalic\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// When the base font has **not** been set, update the preset's font\n\t\t// variants if any of them have not been set.\n\t\t//\n\t\t// This will happen when initiating a new text style, since by default\n\t\t// on a preset only the base font will be defined with the variants\n\t\t// being undefined.\n\t\tconst existingBaseFont = context.fontStore.getFontBySelector(node.font)\n\t\tassert(existingBaseFont, \"Expected preset base font to exist\")\n\n\t\tconst existingDefaultBaseFont = getClosestToRegularFont(existingBaseFont.family)\n\n\t\tif (!isFont(attributes.boldFont)) {\n\t\t\tupdate.fontBold = existingDefaultBaseFont.selectorBold\n\t\t}\n\n\t\tif (!isFont(attributes.italicFont)) {\n\t\t\tupdate.fontItalic = existingDefaultBaseFont.selectorItalic\n\t\t}\n\n\t\tif (!isFont(attributes.boldItalicFont)) {\n\t\t\tupdate.fontBoldItalic = existingDefaultBaseFont.selectorBoldItalic\n\t\t}\n\t}\n\n\tif (isFont(attributes.boldFont)) {\n\t\tconst boldFont = context.fontStore.getFontBySelector(attributes.boldFont.selector)\n\t\tassert(boldFont, \"Expected boldFont attribute to be validated as an existing font\")\n\n\t\tupdate.fontBold = boldFont.selector\n\t}\n\n\tif (isFont(attributes.italicFont)) {\n\t\tconst italicFont = context.fontStore.getFontBySelector(attributes.italicFont.selector)\n\t\tassert(italicFont, \"Expected italicFont attribute to be validated as an existing font\")\n\n\t\tupdate.fontItalic = italicFont.selector\n\t}\n\n\tif (isFont(attributes.boldItalicFont)) {\n\t\tconst boldItalicFont = context.fontStore.getFontBySelector(attributes.boldItalicFont.selector)\n\t\tassert(boldItalicFont, \"Expected boldItalicFont attribute to be validated as an existing font\")\n\n\t\tupdate.fontBoldItalic = boldItalicFont.selector\n\t}\n\n\tif (isString(attributes.color)) {\n\t\tupdate.textColor = attributes.color\n\t}\n\n\tif (isColorStyleData(attributes.color)) {\n\t\tconst token = context.engine.tree.getNode(attributes.color.id)\n\t\tif (!isColorStyleTokenNode(token)) return\n\n\t\tupdate.textColor = tokenToCSSVariable(token)\n\t}\n\n\tif (isTextTransform(attributes.transform)) {\n\t\tupdate.textTransform = attributes.transform\n\t}\n\n\tif (isTextAlignment(attributes.alignment)) {\n\t\tupdate.textAlignment = attributes.alignment\n\t}\n\n\tif (isTextDecoration(attributes.decoration)) {\n\t\tupdate.textDecoration = attributes.decoration\n\t}\n\n\tif (isString(attributes.decorationColor)) {\n\t\tupdate.textDecorationColor = attributes.decorationColor\n\t}\n\n\tif (isColorStyleData(attributes.decorationColor)) {\n\t\tconst token = context.engine.tree.getNode(attributes.decorationColor.id)\n\t\tif (!isColorStyleTokenNode(token)) return\n\n\t\tupdate.textDecorationColor = tokenToCSSVariable(token)\n\t}\n\n\tif (isTextDecorationCSSDimension(attributes.decorationThickness)) {\n\t\tupdate.textDecorationThickness = attributes.decorationThickness\n\t}\n\n\tif (isTextDecorationStyle(attributes.decorationStyle)) {\n\t\tupdate.textDecorationStyle = attributes.decorationStyle\n\t}\n\n\tif (isTextDecorationSkipInk(attributes.decorationSkipInk)) {\n\t\tupdate.textDecorationSkipInk = attributes.decorationSkipInk\n\t}\n\n\tif (isTextDecorationCSSDimension(attributes.decorationOffset)) {\n\t\tupdate.textDecorationOffset = attributes.decorationOffset\n\t}\n\n\tif (isBoolean(attributes.balance)) {\n\t\tupdate.textWrapBalance = attributes.balance\n\t}\n\n\tif (isNumber(attributes.minWidth)) {\n\t\tupdate.breakpointWidth = attributes.minWidth\n\t}\n\n\tif (isFontSizeCSSDimension(attributes.fontSize)) {\n\t\tupdate.fontSize = attributes.fontSize\n\t}\n\n\tconst parsedLetterSpacing = isString(attributes.letterSpacing) ? parseCSSDimension(attributes.letterSpacing) : null\n\tif (isLetterSpacing(parsedLetterSpacing)) {\n\t\tupdate.letterSpacing = parsedLetterSpacing\n\t}\n\n\tconst parsedLineHeight = isString(attributes.lineHeight) ? parseCSSDimension(attributes.lineHeight) : null\n\tif (isLineHeight(parsedLineHeight)) {\n\t\tupdate.lineHeight = parsedLineHeight\n\t}\n\n\tif (isNumber(attributes.paragraphSpacing)) {\n\t\tupdate.paragraphSpacing = attributes.paragraphSpacing\n\t}\n}\n", "import { assert } from \"@framerjs/shared\"\nimport { getClosestToRegularFont } from \"document/components/utils/getClosestToRegularFont.ts\"\nimport {\n\tisColorStyleTokenNode,\n\tisTextStylePresetNode,\n\tisTextStylePresetPrimaryNode,\n} from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport { isArray, isNumber, isObject, isString } from \"utils/typeChecks.ts\"\nimport { isFont } from \"#framer-plugin/fonts.ts\"\nimport type { ActivePluginContext } from \"./ActivePlugin.ts\"\nimport { PluginOnlyError } from \"./pluginErrors.ts\"\nimport type { StyleNode } from \"./styles.ts\"\n\nexport type ReadonlyAttributes = Readonly<Record<string, unknown>>\n\nexport interface ValidatedReadonlyAttributes {\n\tvalid: true\n\tattributes: Readonly<Record<string, unknown>>\n}\n\n/**\n * Validate attributes for creating style nodes.\n *\n * @throws If an attribute fails validation.\n */\nexport function getValidatedStyleAttributesForCreate(\n\tcontext: ActivePluginContext,\n\tnode: StyleNode,\n\tattributes: ReadonlyAttributes,\n): ValidatedReadonlyAttributes {\n\tvalidateStylesNameForCreate(node, attributes)\n\tvalidateColorStyles(context, node, attributes)\n\tvalidateTextStyleBreakpoints(context, node, attributes)\n\tvalidateFonts(context, node, attributes)\n\n\tconst name = isNonEmptyString(attributes.name) ? attributes.name : attributes.path\n\n\treturn { valid: true, attributes: { ...attributes, name } }\n}\n\n/**\n * Validate attributes for updating style nodes.\n *\n * @throws If an attribute fails validation.\n */\nexport function getValidatedStyleAttributesForUpdate(\n\tcontext: ActivePluginContext,\n\tnode: StyleNode,\n\tattributes: ReadonlyAttributes,\n): ValidatedReadonlyAttributes {\n\tvalidateStylesNameForUpdate(attributes)\n\tvalidateTextStyleBreakpoints(context, node, attributes)\n\tvalidateFonts(context, node, attributes)\n\n\tconst name = isNonEmptyString(attributes.name) ? attributes.name : attributes.path\n\n\treturn { valid: true, attributes: { ...attributes, name } }\n}\n\n/**\n * @throws If Color Style does not contain a `name` or `light` attribute.\n */\nfunction validateColorStyles(_context: ActivePluginContext, node: StyleNode, attributes: ReadonlyAttributes) {\n\tif (!isColorStyleTokenNode(node)) return\n\n\tif (!isString(attributes.light) || !attributes.light.trim()) {\n\t\tthrow new PluginOnlyError(\"Color Styles require a `light` attribute to be set. This is used for the default color.\")\n\t}\n}\n\n/**\n * @throws If breakpoint count is over the limit, or if there are any\n * breakpoints with duplicate `minWidth` attributes.\n */\nfunction validateTextStyleBreakpoints(_context: ActivePluginContext, node: StyleNode, attributes: ReadonlyAttributes) {\n\tif (!isTextStylePresetNode(node)) return\n\n\tif (!isArray(attributes.breakpoints)) return\n\n\tif (attributes.breakpoints.length > 4) {\n\t\tthrow new PluginOnlyError(\"The maximum number of breakpoints a text style can have is 4\")\n\t}\n\n\tconst minWidths: number[] = []\n\tfor (const breakpointAttributes of attributes.breakpoints) {\n\t\tif (!isObject(breakpointAttributes)) {\n\t\t\tthrow new PluginOnlyError(\"Breakpoint should be an object\")\n\t\t}\n\n\t\tif (!isNumber(breakpointAttributes.minWidth)) {\n\t\t\tthrow new PluginOnlyError(\"Breakpoints require a `minWidth` attribute to be set\")\n\t\t}\n\n\t\tif (minWidths.includes(breakpointAttributes.minWidth)) {\n\t\t\tthrow new PluginOnlyError(\"Breakpoint `minWidth` must be unique from each other breakpoints\")\n\t\t}\n\n\t\tminWidths.push(breakpointAttributes.minWidth ?? 0)\n\t}\n}\n\n/**\n * @throws If the base font does not exist, or if the base font does not match\n * the same family of any of the variants.\n */\nfunction validateFonts(context: ActivePluginContext, node: StyleNode, attributes: ReadonlyAttributes) {\n\tif (!isTextStylePresetPrimaryNode(node)) return\n\n\tconst baseFont = context.fontStore.getFontBySelector(node.font)\n\tassert(baseFont, \"Expected base font to always exist\")\n\n\tconst existingBaseFont = getClosestToRegularFont(baseFont.family)\n\n\t// The user is setting the base font, but may also be setting other font\n\t// variants.\n\tif (isFont(attributes.font)) {\n\t\tconst updateBaseFont = context.fontStore.getFontBySelector(attributes.font.selector)\n\t\tif (!updateBaseFont) {\n\t\t\tthrow new PluginOnlyError(`Font does not exist with selector: \"${attributes.font.selector}\"`)\n\t\t}\n\n\t\tfor (const fontVariant of [attributes.boldFont, attributes.italicFont, attributes.boldItalicFont]) {\n\t\t\tif (!isFont(fontVariant)) continue\n\n\t\t\tconst fontStoreFont = context.fontStore.getFontBySelector(fontVariant.selector)\n\t\t\tif (!fontStoreFont) {\n\t\t\t\tthrow new PluginOnlyError(`Font does not exist with selector: \"${fontVariant.selector}\"`)\n\t\t\t}\n\n\t\t\tif (fontStoreFont.family.name !== updateBaseFont.family.name) {\n\t\t\t\tthrow new PluginOnlyError(\n\t\t\t\t\t`Font \"${fontVariant.family}\" is not the same family as the base font \"${attributes.font.family}\"`,\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\t}\n\n\tconst isAnyVariantSet =\n\t\tisFont(attributes.boldFont) || isFont(attributes.italicFont) || isFont(attributes.boldItalicFont)\n\n\t// The user is **not** setting the base font but is setting a font variant.\n\tif (!isFont(attributes.font) && isAnyVariantSet) {\n\t\tfor (const fontVariant of [attributes.boldFont, attributes.italicFont, attributes.boldItalicFont]) {\n\t\t\tif (!isFont(fontVariant)) continue\n\n\t\t\tconst otherFont = context.fontStore.getFontBySelector(fontVariant.selector)\n\t\t\tif (!otherFont) throw new PluginOnlyError(`Font does not exist with selector: \"${fontVariant.selector}\"`)\n\n\t\t\tif (otherFont.family.name !== existingBaseFont.family.name) {\n\t\t\t\tthrow new PluginOnlyError(\n\t\t\t\t\t`Font \"${fontVariant.family}\" is not the same family as the existing base font \"${existingBaseFont.family.name}\"`,\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * @throws If name and path are both set. Only one can be provided.\n */\nfunction validateStylesNameForUpdate(attributes: ReadonlyAttributes) {\n\tif (isNonEmptyString(attributes.name) && isNonEmptyString(attributes.path)) {\n\t\tthrow new PluginOnlyError(\"Styles can only set either a `name` or `path` attribute, not both.\")\n\t}\n}\n\n/**\n * @throws If neither `name` nor `path` is set.\n * @throws If both `name` and `path` are set. Only one should be provided.\n */\nfunction validateStylesNameForCreate(node: StyleNode, attributes: ReadonlyAttributes) {\n\tvalidateStylesNameForUpdate(attributes)\n\n\tconst nameIsSet = isNonEmptyString(attributes.name)\n\tconst pathIsSet = isNonEmptyString(attributes.path)\n\n\tif (nameIsSet && pathIsSet) {\n\t\tthrow new PluginOnlyError(\"Styles require either a `name` or `path` attribute to be set, not both.\")\n\t}\n\n\tif (!nameIsSet && !pathIsSet && isColorStyleTokenNode(node)) {\n\t\tthrow new PluginOnlyError(\"Styles require either a `name` or `path` attribute to be set.\")\n\t}\n}\n\nfunction isNonEmptyString(value: unknown): boolean {\n\treturn isString(value) && value.trim().length > 0\n}\n", "import { assert, getLogger } from \"@framerjs/shared\"\nimport type { VekterEngine } from \"document/VekterEngine.ts\"\nimport { getTextStylePresetBreakpointsFromTree } from \"document/components/chrome/properties/panels/utils/getTextStylePresetBreakpoints.ts\"\nimport { softDeleteColorToken } from \"document/components/utils/tokenContextActions.ts\"\nimport type { NodeID } from \"document/models/CanvasTree/index.ts\"\nimport { ColorStyleTokenListNode } from \"document/models/CanvasTree/nodes/ColorStyleTokenListNode.ts\"\nimport { ColorStyleTokenNode } from \"document/models/CanvasTree/nodes/ColorStyleTokenNode.ts\"\nimport { COLOR_ENTITY_ROOT_ID, TEXT_ENTITY_ROOT_ID } from \"document/models/CanvasTree/nodes/EntityTypeRootNode.ts\"\nimport { PresetsListNode } from \"document/models/CanvasTree/nodes/PresetsListNode.ts\"\nimport { TemplateHelper } from \"document/models/CanvasTree/nodes/TemplateHelper.ts\"\nimport { TextStylePresetNode } from \"document/models/CanvasTree/nodes/TextStylePresetNode.ts\"\nimport { getPathForReferencedNodeId } from \"document/models/CanvasTree/nodes/utils/entityFolderNode.ts\"\nimport type {\n\tTextStylePresetBreakpointNode,\n\tTextStylePresetPrimaryNode,\n} from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport {\n\tisColorStyleTokenNode,\n\tisTextStylePresetPrimaryNode,\n} from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport { isRichTextTag } from \"document/models/CanvasTree/traits/WithRichTextTag.ts\"\nimport { isMaster } from \"document/models/CanvasTree/traits/WithTemplate.ts\"\nimport {\n\ttype FontSizeCSSDimension,\n\ttype LetterSpacing,\n\ttype LineHeight,\n\ttextStyleDefaults,\n} from \"document/models/CanvasTree/traits/WithTextStyle.ts\"\nimport { createCSSDimension } from \"document/models/CanvasTree/traits/utils/CSSDimension.ts\"\nimport {\n\tfallbackValueFromCSSVariable,\n\tisTokenCSSVariable,\n\ttokenIdFromCSSVariable,\n\ttokenToCSSVariable,\n} from \"document/models/CanvasTree/utils/tokens.ts\"\nimport { removeEncodedAxesFromSelector } from \"document/models/CanvasTree/utils/variableFont.ts\"\nimport { Color } from \"library/index.ts\"\nimport { assertNever } from \"library/utils/assert.ts\"\nimport { isArray, isNumber, isObject } from \"utils/typeChecks.ts\"\nimport { type CSSDimension, CSSUnit as PluginCSSUnit } from \"#framer-plugin/css.ts\"\nimport type { ColorStyleData, TextStyleBreakpointData, TextStyleData } from \"#framer-plugin/styles.ts\"\nimport { isColorStyleData } from \"#framer-plugin/styles.ts\"\nimport type { ActivePluginContext } from \"./ActivePlugin.ts\"\nimport { isPluginCssUnit } from \"./css.ts\"\nimport { setupFolderStructureForNodeName } from \"./entityReference.ts\"\nimport { getFontDataFromReadonlyFont } from \"./fonts.ts\"\nimport { getVekterStyleDataFromPlugin } from \"./getVekterStyleDataFromPlugin.ts\"\nimport { PluginOnlyError } from \"./pluginErrors.ts\"\nimport type { ReadonlyAttributes } from \"./stylesValidation.ts\"\nimport { getValidatedStyleAttributesForCreate, getValidatedStyleAttributesForUpdate } from \"./stylesValidation.ts\"\n\nexport type StyleNode = ColorStyleTokenNode | TextStylePresetPrimaryNode | TextStylePresetBreakpointNode\n\nconst log = getLogger(\"PluginStyles\")\n\nexport function getColorStyleDataFromToken(engine: VekterEngine, token: ColorStyleTokenNode): ColorStyleData {\n\treturn {\n\t\t__class: \"ColorStyle\",\n\t\tid: token.id,\n\t\tname: token.name,\n\t\tlight: token.light,\n\t\tdark: token.dark ?? null,\n\t\tpath: getPathForReferencedNodeId(engine.tree, token.id, COLOR_ENTITY_ROOT_ID),\n\t}\n}\n\nexport function getColorStyles(engine: VekterEngine): ColorStyleData[] {\n\treturn ColorStyleTokenListNode.getTokenNodes(engine.tree).map(token => getColorStyleDataFromToken(engine, token))\n}\n\nexport function createColorStyle(context: ActivePluginContext, attributes: Record<string, unknown>): ColorStyleData {\n\tconst token = new ColorStyleTokenNode()\n\n\tconst validatedAttributes = getValidatedStyleAttributesForCreate(context, token, attributes)\n\tconst update = getVekterStyleDataFromPlugin(context, token, validatedAttributes)\n\ttoken.set(update)\n\n\tconst tokenNode = context.engine.tree.insertNode(token, ColorStyleTokenListNode.ensure(context.engine.tree).id)\n\n\tsetupFolderStructureForNodeName(context.engine.tree, tokenNode, update.name, COLOR_ENTITY_ROOT_ID, true)\n\n\treturn getColorStyleDataFromToken(context.engine, token)\n}\n\nexport function setColorStyleAttributes(\n\tcontext: ActivePluginContext,\n\tid: NodeID,\n\tattributes: Record<string, unknown>,\n): ColorStyleData | null {\n\tconst token = context.engine.tree.get(id)\n\tif (!token) return null\n\tif (!isColorStyleTokenNode(token)) throw new PluginOnlyError(\"Node is not a color style\")\n\tif (token.softDeleted) return null\n\n\tconst validatedAttributes = getValidatedStyleAttributesForUpdate(context, token, attributes)\n\n\tconst update = getVekterStyleDataFromPlugin(context, token, validatedAttributes)\n\tconst updatedToken = token.set(update)\n\n\tsetupFolderStructureForNodeName(context.engine.tree, updatedToken, update.name, COLOR_ENTITY_ROOT_ID)\n\treturn getColorStyleDataFromToken(context.engine, updatedToken)\n}\n\nexport function removeColorStyle(engine: VekterEngine, id: NodeID): void {\n\tconst token = engine.tree.getNode(id)\n\tif (!token) return\n\tif (!isColorStyleTokenNode(token)) throw new PluginOnlyError(\"Node is not a color style\")\n\n\tsoftDeleteColorToken(engine.tree, token)\n}\n\nfunction getTextStyleBreakpointDataFromPreset(preset: TextStylePresetBreakpointNode): TextStyleBreakpointData {\n\treturn {\n\t\tminWidth: preset.breakpointWidth ?? 0,\n\t\tfontSize: stringifyFontSize(preset.fontSize),\n\t\tletterSpacing: stringifyLetterSpacing(preset.letterSpacing),\n\t\tlineHeight: stringifyLineHeight(preset.lineHeight),\n\t\tparagraphSpacing: preset.paragraphSpacing ?? 0,\n\t}\n}\n\nconst NO_COLOR_FALLBACK = Color(\"\").toValue()\n\n/*\n * Return either the color literal as a string or as `ColorStyleData` if it's a\n * color token variable.\n */\nexport function getColorValueFromSerializedColor(engine: VekterEngine, color: string): ColorStyleData | string {\n\tif (!isTokenCSSVariable(color)) return color\n\n\tconst tokenId = tokenIdFromCSSVariable(color)\n\tif (!tokenId) return NO_COLOR_FALLBACK\n\n\tconst token = engine.tree.get(tokenId)\n\n\tif (!isColorStyleTokenNode(token)) {\n\t\tconst fallback = fallbackValueFromCSSVariable(color)\n\t\treturn fallback ?? NO_COLOR_FALLBACK\n\t}\n\n\tif (token.softDeleted) return token.light\n\n\treturn getColorStyleDataFromToken(engine, token)\n}\n\n/**\n * Return a string that's either a literal color value or a CSS variable of a\n * token.\n */\nexport function getSerializedColorFromColorValue(engine: VekterEngine, color: ColorStyleData | string) {\n\tif (isColorStyleData(color)) {\n\t\tconst token = engine.tree.get(color.id)\n\t\tif (!isColorStyleTokenNode(token) || token.softDeleted) return NO_COLOR_FALLBACK\n\n\t\treturn tokenToCSSVariable(token)\n\t}\n\n\treturn Color(color).toValue()\n}\n\nexport function getTextStyleDataFromPreset(\n\tcontext: ActivePluginContext,\n\tpreset: TextStylePresetPrimaryNode,\n): TextStyleData {\n\tconst breakpoints = getTextStylePresetBreakpointsFromTree(context.engine.tree, preset)\n\tconst selector = removeEncodedAxesFromSelector(preset.font)\n\tlet font = context.fontStore.getFontBySelector(selector)\n\n\t// Handle missing fonts: can occur when custom fonts are manually removed\n\t// or when external fonts are no longer available in the provider's catalog\n\tif (!font) {\n\t\tlog.warn(`Font ${preset.font} not found, use fallback font ${textStyleDefaults.font}.`)\n\t\tfont = context.fontStore.getFontBySelector(textStyleDefaults.font)\n\t}\n\n\tassert(font, \"Expected preset to have font base, either by default or by fallback\")\n\n\tconst fontData = getFontDataFromReadonlyFont(font)\n\tassert(fontData, \"Expected preset to always have base font that exists\")\n\n\tconst fontBold = context.fontStore.getFontBySelector(preset.fontBold)\n\tconst fontItalic = context.fontStore.getFontBySelector(preset.fontItalic)\n\tconst fontBoldItalic = context.fontStore.getFontBySelector(preset.fontBoldItalic)\n\n\tconst fontBoldData = getFontDataFromReadonlyFont(fontBold)\n\tconst fontItalicData = getFontDataFromReadonlyFont(fontItalic)\n\tconst fontBoldItalicData = getFontDataFromReadonlyFont(fontBoldItalic)\n\n\treturn {\n\t\t__class: \"TextStyle\",\n\n\t\tid: preset.id,\n\t\tname: preset.resolveValue(\"name\") ?? \"\",\n\t\tpath: getPathForReferencedNodeId(context.engine.tree, preset.id, TEXT_ENTITY_ROOT_ID),\n\t\ttag: preset.tag,\n\n\t\tfont: fontData,\n\t\tboldFont: fontBoldData,\n\t\titalicFont: fontItalicData,\n\t\tboldItalicFont: fontBoldItalicData,\n\t\tcolor: getColorValueFromSerializedColor(context.engine, preset.textColor),\n\t\ttransform: preset.textTransform,\n\t\talignment: preset.textAlignment === \"start\" ? \"left\" : preset.textAlignment,\n\t\tdecoration: preset.textDecoration ?? \"none\",\n\t\tdecorationColor: preset.textDecorationColor ?? \"currentcolor\",\n\t\tdecorationThickness: preset.textDecorationThickness ?? \"auto\",\n\t\tdecorationStyle: preset.textDecorationStyle ?? \"solid\",\n\t\tdecorationSkipInk: preset.textDecorationSkipInk ?? \"auto\",\n\t\tdecorationOffset: preset.textDecorationOffset ?? \"auto\",\n\t\tbalance: preset.textWrapBalance ?? false,\n\n\t\tminWidth: preset.breakpointWidth ?? 0,\n\t\tfontSize: stringifyFontSize(preset.fontSize),\n\t\tletterSpacing: stringifyLetterSpacing(preset.letterSpacing),\n\t\tlineHeight: stringifyLineHeight(preset.lineHeight),\n\t\tparagraphSpacing: preset.paragraphSpacing ?? 0,\n\n\t\tbreakpoints: breakpoints.map(getTextStyleBreakpointDataFromPreset),\n\t}\n}\n\nexport function getTextStyles(context: ActivePluginContext): TextStyleData[] {\n\tconst listNode = PresetsListNode.get(context.engine.tree)\n\tif (!listNode) return []\n\n\tconst presets = listNode.getTextStylePresets()\n\treturn presets.map(preset => getTextStyleDataFromPreset(context, preset))\n}\n\nfunction createTextStyleBreakpoint(\n\tengine: VekterEngine,\n\tpreset: TextStylePresetNode,\n\tupdate: Partial<TextStylePresetNode>,\n) {\n\tconst master = preset.set({\n\t\tisMaster: true,\n\t\treplicaInfo: null,\n\t\toriginalid: null,\n\t})\n\tassert(master && isMaster(master), \"Expected preset to a master node\")\n\n\treturn TemplateHelper.create(engine.tree, master, {\n\t\toverrides: {\n\t\t\t[master.id]: update,\n\t\t},\n\t})\n}\n\nfunction createTextStyleBreakpoints(\n\tcontext: ActivePluginContext,\n\tlistNode: PresetsListNode,\n\tpreset: TextStylePresetPrimaryNode,\n\tattributes: ReadonlyAttributes,\n\tdeleteExistingBreakpoints: boolean = false,\n) {\n\tif (!isArray(attributes.breakpoints)) return\n\n\t// Remove nodes if needed and apply all updates.\n\tif (deleteExistingBreakpoints) {\n\t\tconst existingBreakpoints = getTextStylePresetBreakpointsFromTree(context.engine.tree, preset)\n\n\t\tfor (const breakpoint of existingBreakpoints) {\n\t\t\tcontext.engine.deleteNode(breakpoint.id)\n\t\t}\n\t}\n\n\tfor (const breakpointAttributes of attributes.breakpoints) {\n\t\tif (!isObject(breakpointAttributes)) continue\n\n\t\tconst validatedBreakpointAttributes = getValidatedStyleAttributesForCreate(context, preset, breakpointAttributes)\n\t\tconst breakpointUpdate = getVekterStyleDataFromPlugin(context, preset, validatedBreakpointAttributes)\n\t\tconst breakpoint = createTextStyleBreakpoint(context.engine, preset, breakpointUpdate)\n\t\tcontext.engine.tree.insertNode(breakpoint, listNode.id)\n\t}\n}\n\nexport function createTextStyle(context: ActivePluginContext, attributes: Record<string, unknown>): TextStyleData {\n\tconst tag = isRichTextTag(attributes.tag) ? attributes.tag : \"p\"\n\n\t// Create the primary preset.\n\tconst preset = TextStylePresetNode.createDefault(tag)\n\tassert(isTextStylePresetPrimaryNode(preset), \"Expected preset to be primary\")\n\n\tconst validatedAttributes = getValidatedStyleAttributesForCreate(context, preset, attributes)\n\tconst update = getVekterStyleDataFromPlugin(context, preset, validatedAttributes)\n\tpreset.set(update)\n\n\tconst listNode = PresetsListNode.ensure(context.engine.tree)\n\tconst presetNode = context.engine.tree.insertNode(preset, listNode.id)\n\n\tsetupFolderStructureForNodeName(context.engine.tree, presetNode, update.name, TEXT_ENTITY_ROOT_ID, true)\n\n\tcreateTextStyleBreakpoints(context, listNode, presetNode, attributes)\n\n\treturn getTextStyleDataFromPreset(context, presetNode)\n}\n\nexport function setTextStyleAttributes(\n\tcontext: ActivePluginContext,\n\tid: NodeID,\n\tattributes: Record<string, unknown>,\n): TextStyleData | null {\n\tconst preset = context.engine.tree.get(id)\n\tif (!preset) return null\n\tif (!isTextStylePresetPrimaryNode(preset)) throw new PluginOnlyError(\"Node is not a text style\")\n\n\tconst validatedAttributes = getValidatedStyleAttributesForUpdate(context, preset, attributes)\n\tconst update = getVekterStyleDataFromPlugin(context, preset, validatedAttributes)\n\tconst updatedPreset = preset.set(update)\n\n\t// If the text preset name changes, update the reference node and handle path changes.\n\t// When name contains slashes (e.g. \"Headings/H1\"), create necessary folder structure.\n\tsetupFolderStructureForNodeName(context.engine.tree, updatedPreset, update.name, TEXT_ENTITY_ROOT_ID)\n\n\t// Recreate breakpoints if needed.\n\tif (attributes.breakpoints) {\n\t\tconst listNode = PresetsListNode.ensure(context.engine.tree)\n\n\t\t// The array of breakpoints is overridden and not merged. It's up to the\n\t\t// plugin author to ensure they merge the breakpoints array if they want\n\t\t// to keep existing breakpoints or breakpoint attributes.\n\t\t//\n\t\t// This is done like this because merging an array is complicated\n\t\t// technically and in terms of expected behavior.\n\t\tcreateTextStyleBreakpoints(context, listNode, updatedPreset, attributes, true)\n\t}\n\n\treturn getTextStyleDataFromPreset(context, updatedPreset)\n}\n\nexport function removeTextStyle(engine: VekterEngine, id: NodeID): void {\n\tconst preset = engine.tree.getNode(id)\n\tif (!preset) return\n\tif (!isTextStylePresetPrimaryNode(preset)) throw new PluginOnlyError(\"Node is not a text style\")\n\n\tfor (const breakpointId of preset.cache.replicaInstances ?? []) {\n\t\tengine.tree.remove(breakpointId)\n\t}\n\n\tengine.deleteNode(id)\n}\n\nfunction stringifyFontSize(\n\tfontSize: number | FontSizeCSSDimension,\n): CSSDimension<PluginCSSUnit.Pixel | PluginCSSUnit.Rem> {\n\tif (isNumber(fontSize)) {\n\t\treturn createCSSDimension(fontSize, PluginCSSUnit.Pixel)\n\t}\n\n\treturn fontSize\n}\n\nfunction stringifyLetterSpacing(\n\tletterSpacing: number | LetterSpacing,\n): CSSDimension<PluginCSSUnit.Pixel | PluginCSSUnit.Em> {\n\tif (isNumber(letterSpacing)) {\n\t\treturn createCSSDimension(letterSpacing, PluginCSSUnit.Pixel)\n\t}\n\n\tconst [value, unit] = letterSpacing\n\tif (!value || !unit) return createCSSDimension(0, PluginCSSUnit.Pixel)\n\tassert(isPluginCssUnit(unit), `Unit ${unit} isn't supported in plugins`)\n\n\tswitch (unit) {\n\t\tcase PluginCSSUnit.Pixel:\n\t\tcase PluginCSSUnit.Em:\n\t\t\treturn createCSSDimension(value, unit)\n\t\tdefault:\n\t\t\tassertNever(unit)\n\t}\n}\n\nfunction stringifyLineHeight(\n\tlineHeight: LineHeight,\n): CSSDimension<PluginCSSUnit.Pixel | PluginCSSUnit.Em | PluginCSSUnit.Percentage> {\n\tconst [value, unit] = lineHeight\n\n\tif (!value || !unit) return createCSSDimension(0, PluginCSSUnit.Pixel)\n\tassert(isPluginCssUnit(unit), `Unit ${unit} isn't supported in plugins`)\n\n\tswitch (unit) {\n\t\tcase PluginCSSUnit.Pixel:\n\t\tcase PluginCSSUnit.Em:\n\t\tcase PluginCSSUnit.Percentage:\n\t\t\treturn createCSSDimension(value, unit)\n\t\tdefault:\n\t\t\tassertNever(unit)\n\t}\n}\n", "/** Guaranteed to Be Random\u2122 */\nconst SEPARATOR = \"guTHZA7x\"\n\n/**\n * Use this to avoid collisions between pairs like this:\n *\n * ```\n * { a: \"f\", b: \"oo\" }\n * { a: \"fo\", b: \"o\" }\n * ```\n *\n * Not `/` as the separator (or similar) because you could sometimes get this:\n *\n * ```\n * { a: \"f/\", b: \"oo\" }\n * { a: \"f/o\", b: \"o\" }\n * ```\n *\n * But much less likely this:\n *\n * ```\n * { a: \"fguTHZA7x\", b: \"oo\" }\n * { a: \"fguTHZA7xo\", b: \"o\" }\n * ```\n */\nexport function joinForLookup<A extends string, B extends string>(a: A, b: B): `${A}${typeof SEPARATOR}${B}` {\n\treturn `${a}${SEPARATOR}${b}`\n}\n", "import { PluginOnlyError } from \"./pluginErrors.ts\"\n\nconst maxLength = 64\n\nexport function verifyExternalPluginCollectionItemId(value: string, entityName: string, prefix?: string): void {\n\tif (value.length === 0) {\n\t\tthrow new PluginOnlyError(`${prefix}Invalid id of ${entityName}, must not be empty`)\n\t}\n\tif (value.length > maxLength) {\n\t\tthrow new PluginOnlyError(\n\t\t\t`${prefix}Invalid id of ${entityName}, maximum length is ${maxLength} characters. Received: ${value}`,\n\t\t)\n\t}\n}\n", "import { createAssetReference, isAssetReference } from \"@framerjs/assets\"\nimport { isValidDate } from \"@framerjs/fresco/src/components/dateUtils.ts\"\nimport {\n\tassert,\n\ttype DeepReadonly,\n\ttype ModuleExportIdentifierString,\n\tarrayToMap,\n\tassertNever,\n\tisEmptyObject,\n\tmurmurHash,\n\tunhandledError,\n} from \"@framerjs/shared\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport { isLocalizedControlPropKey } from \"code-generation/utils/stripLocalizedValues.ts\"\nimport type { VekterEngine } from \"document/VekterEngine.ts\"\nimport { createContentManagementNodeIfNeeded } from \"document/components/chrome/contentManagement/utils/createContentManagementNodeIfNeeded.ts\"\nimport {\n\ttype LocalizableVariable,\n\ttype SlugOccurrencesByLocale,\n\tgetCollectionItemNodeLocalizationSource,\n\tgetCollectionSlugOccurrencesByLocaleId,\n\tgetEnumCaseLocalizationSource,\n} from \"document/components/chrome/localization/getLocalizationSources.ts\"\nimport { createVariable } from \"document/components/chrome/properties/utils/createVariable.ts\"\nimport type { CanvasNode, CanvasTree, NodeID } from \"document/models/CanvasTree/index.ts\"\nimport { CollectionNode } from \"document/models/CanvasTree/index.ts\"\nimport type { CollectionItemNode } from \"document/models/CanvasTree/nodes/CollectionItemNode.ts\"\nimport { randomID } from \"document/models/CanvasTree/nodes/NodeID.ts\"\nimport { isCollectionItemNode, isCollectionNode } from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport {\n\tisCollectionVariableDefinition,\n\ttype CollectionVariableDefinition,\n} from \"document/models/CanvasTree/traits/CollectionVariableDefinition.ts\"\nimport { isDynamicValue } from \"document/models/CanvasTree/traits/DynamicValue.ts\"\nimport type { Locale } from \"document/models/CanvasTree/traits/WithLocales.ts\"\nimport { getPluginVariableIdKeyFromVariable } from \"document/models/CanvasTree/traits/WithPreviouslyUsedPluginVariableIds.ts\"\nimport type {\n\tArrayVariableDefinition,\n\tCollectionReferenceVariableDefinition,\n\tEnumVariableCase,\n\tEnumVariableDefinition,\n\tFileVariableExtension,\n\tImageVariableDefinition,\n\tMultiCollectionReferenceVariableDefinition,\n\tSlugVariableDefinition,\n\tVariableDefinition,\n\tVariableOrDivider,\n\tVariableType,\n\tVariablesAndDividers,\n\tWithVariables,\n} from \"document/models/CanvasTree/traits/WithVariables.ts\"\nimport {\n\tisAnyCollectionReferencingVariableDefinition,\n\tisArrayItemVariableDefinition,\n\tisSlugVariableDefinition,\n\tisVariableDefinition,\n\twithRequired,\n} from \"document/models/CanvasTree/traits/WithVariables.ts\"\nimport { type Link, isLink, isLinkToURL, isLinkToWebPage } from \"document/models/CanvasTree/traits/utils/Link.ts\"\nimport type { OmitEvery } from \"document/models/CanvasTree/traits/utils/OmitEvery.ts\"\nimport { getFallbackValue } from \"document/models/CanvasTree/traits/utils/codeComponentProps.ts\"\nimport type { LocalizedValue } from \"document/models/LocalizedValue.ts\"\nimport type {\n\tCollectionControlProp,\n\tCollectionObjectControlProp,\n\tCollectionObjectControlPropValue,\n} from \"document/models/controlProps/CollectionControlProp.ts\"\nimport { isCollectionControlProp } from \"document/models/controlProps/CollectionControlProp.ts\"\nimport { isCollectionControlType } from \"document/models/controlProps/CollectionControlType.ts\"\nimport type { WithId } from \"document/models/controlProps/ControlProp.ts\"\nimport { isRawControlProp } from \"document/models/controlProps/RawControlProp.ts\"\nimport { type PrefixedControlPropKey, prefixControlPropKey } from \"document/models/controlProps/controlPropKey.ts\"\nimport { assertRichTextTreeValueIsHTML } from \"document/models/richText/richTextStorage.ts\"\nimport { createAssetReferenceForUploadImageResult } from \"document/utils/createAssetReferenceFromImageUpload.ts\"\nimport { castDraft, produce } from \"immer\"\nimport { ControlType } from \"library/render/types/PropertyControls.ts\"\nimport { isEqual } from \"library/render/utils/isEqual.ts\"\nimport { slugify } from \"library/utils/slugify.ts\"\nimport { getCollectionItemSlug } from \"utils/collectionUtils.ts\"\nimport { getCollectionForIdentifier } from \"utils/getCollectionForIdentifier.ts\"\nimport { getVekterLinkFromURL, resolveLinkToURL } from \"utils/resolveLink.ts\"\nimport { isArray, isBoolean, isDefined, isNull, isNullish, isNumber, isString, isUndefined } from \"utils/typeChecks.ts\"\nimport type { BatchAssetUploader } from \"web/lib/BatchAssetUploader.ts\"\nimport type { AssetUploadResult } from \"web/pages/project/lib/UploadService.ts\"\nimport type { FileAssetData, ImageAssetData } from \"#framer-plugin/assets.ts\"\nimport {\n\ttype ApiV2CollectionItemData,\n\ttype ApiV2CollectionItemInput,\n\ttype ApiV2FieldData,\n\ttype ApiV2ManagedCollectionItemInput,\n\ttype ArrayItemInput,\n\ttype ArrayItemSerializableData,\n\ttype BaseCollectionItemData,\n\ttype CollectionData,\n\ttype CollectionItemInput,\n\ttype CollectionItemSerializableData,\n\ttype CollectionManagedBy,\n\ttype CreateField,\n\ttype EnumCaseDataInput,\n\ttype FieldDataEntryInput,\n\ttype FieldDefinitionData,\n\ttype FieldDividerDefinitionData,\n\ttype FieldInput,\n\ttype FieldSerializableData,\n\ttype ManagedCollectionField,\n\ttype ManagedCollectionFieldInputData,\n\ttype ManagedCollectionItemInput,\n\ttype UnsupportedFieldDefinitionData,\n\ttype UpdateField,\n\tisApiV3CollectionItemInput,\n\tisApiV3ManagedCollectionItemInput,\n\tisArrayItemFieldDataDefinition,\n\tisFieldDataEntryInput,\n\tisUpdateArrayItem,\n} from \"#framer-plugin/collections.ts\"\nimport type {\n\tInlineLocalizationValueByLocale,\n\tLocaleId,\n\tLocalizationGroupStatusByLocale,\n\tLocalizationSourceUpdate,\n} from \"#framer-plugin/localization.ts\"\nimport type { Mode } from \"#framer-plugin/messages.ts\"\nimport { isColorStyleData } from \"#framer-plugin/styles.ts\"\nimport type { EnumCaseData } from \"#framer-plugin/variables.ts\"\nimport type { ActivePluginContext } from \"./ActivePlugin.ts\"\nimport {\n\tvekterLocalizedValuesToPluginLocalizationSourceLocales,\n\tvekterSourceTypeToPluginSourceType,\n} from \"./localization.ts\"\nimport { PluginOnlyError, serializeForError, verifyForPlugin } from \"./pluginErrors.ts\"\nimport type { PluginManifestId, VekterPluginManifest } from \"./plugins.ts\"\nimport { getColorValueFromSerializedColor, getSerializedColorFromColorValue } from \"./styles.ts\"\nimport { convertPluginHTMLToCollectionHTML } from \"./utils/convertPluginHTMLToVekterHTML.ts\"\nimport { convertVekterHTMLToPluginHTML } from \"./utils/convertVekterHTMLToPluginHTML.ts\"\nimport { joinForLookup } from \"./utils/mapHelpers.ts\"\nimport { verifyExternalPluginCollectionItemId } from \"./verifyExternalPluginCollectionItemId.ts\"\n\ntype CollectionControlProps = Record<PrefixedControlPropKey, CollectionControlProp | undefined>\n\ntype SlugVariableByDataIdentifier = Map<string, SlugVariableDefinition>\n\ninterface NormalizedCollectionItemInsert {\n\trawSlug: string\n\texistingItem?: undefined\n}\n\ninterface NormalizedCollectionItemUpdate {\n\trawSlug?: string | undefined\n\texistingItem: CollectionItemNode\n}\n\nexport type NormalizedCollectionItemInput = BaseCollectionItemData & {\n\tid: string\n\texternalId?: string | undefined\n\tidForErrors: string\n\tisDraft?: true | undefined\n\tslugByLocale?: { variable: SlugVariableDefinition; value: LocalizationSourceUpdate }\n\tfieldData: { variable: VariableDefinition; value: FieldDataEntryInput }[]\n\tstatusByLocale?: LocalizationGroupStatusByLocale\n} & (NormalizedCollectionItemInsert | NormalizedCollectionItemUpdate)\n\nexport function validateManagedCollectionFields(fields: ManagedCollectionFieldInputData[]) {\n\tconst seenIds = new Set<string>()\n\n\tfor (const field of fields) {\n\t\tverifyExternalPluginCollectionItemId(field.id, \"field\")\n\n\t\tif (seenIds.has(field.id)) {\n\t\t\tthrow new PluginOnlyError(`Duplicate field id: ${field.id}`)\n\t\t}\n\t\tseenIds.add(field.id)\n\n\t\tif (field.type === \"enum\") {\n\t\t\tconst seenCaseIds = new Set<string>()\n\t\t\tfor (const caseOption of field.cases) {\n\t\t\t\tverifyExternalPluginCollectionItemId(caseOption.id, \"enum case\")\n\n\t\t\t\tif (seenCaseIds.has(caseOption.id)) {\n\t\t\t\t\tthrow new PluginOnlyError(`Duplicate enum case id: ${caseOption.id}, for field: ${field.name}`)\n\t\t\t\t}\n\t\t\t\tseenCaseIds.add(caseOption.id)\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * Translate old plugin API structure to the current typed field inputs\n */\nfunction unknownFieldDataToAnyFieldDataEntryInput(\n\tidForErrors: string,\n\tvalue: unknown,\n\tvariable: VariableDefinition,\n): FieldDataEntryInput {\n\tassert(isFieldVariableType(variable.type), \"Expected a field variable type\")\n\n\tswitch (variable.type) {\n\t\tcase ControlType.String: {\n\t\t\tverifyForPlugin(isString(value), `${idForErrors} - Expected a string value for field: ${variable.name}`)\n\t\t\treturn { type: \"string\", value }\n\t\t}\n\n\t\tcase ControlType.Number: {\n\t\t\tverifyForPlugin(isNumber(value), `${idForErrors} - Expected a number value for field: ${variable.name}`)\n\t\t\treturn { type: \"number\", value }\n\t\t}\n\n\t\tcase ControlType.Boolean: {\n\t\t\tverifyForPlugin(isBoolean(value), `${idForErrors} - Expected a boolean value for field: ${variable.name}`)\n\t\t\treturn { type: \"boolean\", value }\n\t\t}\n\n\t\tcase ControlType.Date: {\n\t\t\tverifyForPlugin(\n\t\t\t\tisString(value) || isNumber(value) || isNull(value),\n\t\t\t\t`${idForErrors} - Expected a string or number or null value for date of field: ${variable.name}`,\n\t\t\t)\n\n\t\t\treturn { type: \"date\", value }\n\t\t}\n\n\t\tcase ControlType.Enum: {\n\t\t\tverifyForPlugin(isString(value), `${idForErrors} - Expected a string value for field: ${variable.name}`)\n\t\t\treturn { type: \"enum\", value }\n\t\t}\n\n\t\tcase ControlType.Color: {\n\t\t\tverifyForPlugin(\n\t\t\t\tisString(value) || isColorStyleData(value) || isNull(value),\n\t\t\t\t`${idForErrors} - Expected a color style or a string or null value for color of field: ${variable.name}`,\n\t\t\t)\n\t\t\treturn { type: \"color\", value }\n\t\t}\n\n\t\tcase ControlType.Link: {\n\t\t\tverifyForPlugin(\n\t\t\t\tisString(value) || isNull(value),\n\t\t\t\t`${idForErrors} - Expected a string or null value for field: ${variable.name}`,\n\t\t\t)\n\t\t\treturn { type: \"link\", value }\n\t\t}\n\n\t\tcase ControlType.Image: {\n\t\t\tverifyForPlugin(\n\t\t\t\tisString(value) || isNull(value),\n\t\t\t\t`${idForErrors} - Expected a string or null value for field: ${variable.name}`,\n\t\t\t)\n\t\t\treturn { type: \"image\", value }\n\t\t}\n\n\t\tcase ControlType.RichText: {\n\t\t\tverifyForPlugin(isString(value), `${idForErrors} - Expected a string value for field: ${variable.name}`)\n\t\t\treturn { type: \"formattedText\", value }\n\t\t}\n\n\t\tcase ControlType.File: {\n\t\t\tverifyForPlugin(\n\t\t\t\tisString(value) || isNull(value),\n\t\t\t\t`${idForErrors} - Expected a string or null value for field: ${variable.name}`,\n\t\t\t)\n\t\t\treturn { type: \"file\", value }\n\t\t}\n\n\t\tcase ControlType.CollectionReference: {\n\t\t\tverifyForPlugin(\n\t\t\t\tisString(value) || isNull(value),\n\t\t\t\t`${idForErrors} - Expected a string or null value for field: ${variable.name}`,\n\t\t\t)\n\t\t\treturn { type: \"collectionReference\", value }\n\t\t}\n\n\t\tcase ControlType.MultiCollectionReference: {\n\t\t\tverifyForPlugin(\n\t\t\t\tisArray(value) && value.every(isString),\n\t\t\t\t`${idForErrors} - Expected a value of an array of strings for field: ${variable.name}`,\n\t\t\t)\n\t\t\treturn { type: \"multiCollectionReference\", value }\n\t\t}\n\n\t\t// The plugin API versions we are translating from here never supported arrays\n\t\tcase ControlType.Array: {\n\t\t\tthrow new Error(\"Unsupported type\")\n\t\t}\n\n\t\tdefault: {\n\t\t\tassertNever(variable.type)\n\t\t}\n\t}\n}\n\nexport function createVariableFromManagedCollectionField(\n\tcollection: CollectionNode,\n\tengine: VekterEngine,\n\tpluginManifestId: PluginManifestId,\n\tpluginMode: Mode,\n\tfield: ManagedCollectionFieldInputData,\n): CollectionVariableDefinition {\n\tswitch (field.type) {\n\t\tcase \"string\":\n\t\t\treturn createVariable(\n\t\t\t\t{\n\t\t\t\t\ttype: ControlType.String,\n\t\t\t\t\tname: field.name,\n\t\t\t\t\tinitialValue: \"\",\n\t\t\t\t\texternalId: field.id,\n\t\t\t\t\tuserEditable: Boolean(field.userEditable),\n\t\t\t\t\trequired: field.required === true,\n\t\t\t\t},\n\t\t\t\t\"collection\",\n\t\t\t)\n\t\tcase \"formattedText\":\n\t\t\treturn createVariable(\n\t\t\t\t{\n\t\t\t\t\ttype: ControlType.RichText,\n\t\t\t\t\tname: field.name,\n\t\t\t\t\tinitialValue: \"\",\n\t\t\t\t\texternalId: field.id,\n\t\t\t\t\tuserEditable: Boolean(field.userEditable),\n\t\t\t\t\trequired: field.required === true,\n\t\t\t\t\t// The existing behaviour for a long time was \"html\", to avoid breaking changes, we're making it the default again\n\t\t\t\t\tcontentType: field.contentType ?? \"html\",\n\t\t\t\t},\n\t\t\t\t\"collection\",\n\t\t\t)\n\t\tcase \"number\":\n\t\t\treturn createVariable(\n\t\t\t\t{\n\t\t\t\t\ttype: ControlType.Number,\n\t\t\t\t\tname: field.name,\n\t\t\t\t\tinitialValue: 0,\n\t\t\t\t\texternalId: field.id,\n\t\t\t\t\tuserEditable: Boolean(field.userEditable),\n\t\t\t\t},\n\t\t\t\t\"collection\",\n\t\t\t)\n\t\tcase \"boolean\":\n\t\t\treturn createVariable(\n\t\t\t\t{\n\t\t\t\t\ttype: ControlType.Boolean,\n\t\t\t\t\tname: field.name,\n\t\t\t\t\tinitialValue: false,\n\t\t\t\t\texternalId: field.id,\n\t\t\t\t\tuserEditable: Boolean(field.userEditable),\n\t\t\t\t},\n\t\t\t\t\"collection\",\n\t\t\t)\n\t\tcase \"date\":\n\t\t\treturn createVariable(\n\t\t\t\t{\n\t\t\t\t\ttype: ControlType.Date,\n\t\t\t\t\tname: field.name,\n\t\t\t\t\tinitialValue: undefined,\n\t\t\t\t\texternalId: field.id,\n\t\t\t\t\tuserEditable: Boolean(field.userEditable),\n\t\t\t\t\trequired: field.required === true,\n\t\t\t\t\toptions: {\n\t\t\t\t\t\tdisplayTime: field.displayTime === true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"collection\",\n\t\t\t)\n\t\tcase \"enum\":\n\t\t\treturn createVariable(\n\t\t\t\t{\n\t\t\t\t\ttype: ControlType.Enum,\n\t\t\t\t\tname: field.name,\n\t\t\t\t\tcases: field.cases.map(caseOption => {\n\t\t\t\t\t\tconst nameLocalized = getEnumCaseNameLocalized(\n\t\t\t\t\t\t\tengine.tree,\n\t\t\t\t\t\t\tpluginManifestId,\n\t\t\t\t\t\t\tpluginMode,\n\t\t\t\t\t\t\tcaseOption.name,\n\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\tcaseOption.nameByLocale,\n\t\t\t\t\t\t)\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tid: randomID(),\n\t\t\t\t\t\t\tname: caseOption.name,\n\t\t\t\t\t\t\tnameLocalized,\n\t\t\t\t\t\t\texternalId: caseOption.id,\n\t\t\t\t\t\t}\n\t\t\t\t\t}),\n\t\t\t\t\tinitialValue: undefined,\n\t\t\t\t\texternalId: field.id,\n\t\t\t\t\tuserEditable: Boolean(field.userEditable),\n\t\t\t\t},\n\t\t\t\t\"collection\",\n\t\t\t)\n\t\tcase \"color\":\n\t\t\treturn createVariable(\n\t\t\t\t{\n\t\t\t\t\ttype: ControlType.Color,\n\t\t\t\t\tname: field.name,\n\t\t\t\t\tinitialValue: \"#09F\",\n\t\t\t\t\texternalId: field.id,\n\t\t\t\t\tuserEditable: Boolean(field.userEditable),\n\t\t\t\t},\n\t\t\t\t\"collection\",\n\t\t\t)\n\t\tcase \"image\":\n\t\t\treturn createVariable(\n\t\t\t\t{\n\t\t\t\t\ttype: ControlType.Image,\n\t\t\t\t\tname: field.name,\n\t\t\t\t\tinitialValue: undefined,\n\t\t\t\t\texternalId: field.id,\n\t\t\t\t\tuserEditable: Boolean(field.userEditable),\n\t\t\t\t\trequired: field.required === true,\n\t\t\t\t},\n\t\t\t\t\"collection\",\n\t\t\t)\n\t\tcase \"link\":\n\t\t\treturn createVariable(\n\t\t\t\t{\n\t\t\t\t\ttype: ControlType.Link,\n\t\t\t\t\tname: field.name,\n\t\t\t\t\tinitialValue: undefined,\n\t\t\t\t\texternalId: field.id,\n\t\t\t\t\tuserEditable: Boolean(field.userEditable),\n\t\t\t\t\trequired: field.required === true,\n\t\t\t\t},\n\t\t\t\t\"collection\",\n\t\t\t)\n\t\tcase \"file\":\n\t\t\treturn createVariable(\n\t\t\t\t{\n\t\t\t\t\ttype: ControlType.File,\n\t\t\t\t\tname: field.name,\n\t\t\t\t\tinitialValue: undefined,\n\t\t\t\t\texternalId: field.id,\n\t\t\t\t\tuserEditable: Boolean(field.userEditable),\n\t\t\t\t\trequired: field.required === true,\n\t\t\t\t\tallowedFileTypes: field.allowedFileTypes.map(extension => {\n\t\t\t\t\t\treturn { id: randomID(), extension }\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t\t\"collection\",\n\t\t\t)\n\t\tcase \"collectionReference\": {\n\t\t\tconst referencedCollection = engine.tree.get(field.collectionId)\n\t\t\tassert(isCollectionNode(referencedCollection), `\"Collection with ID ${field.collectionId} cannot be found\"`)\n\t\t\tif (collection.managedByPlugin) {\n\t\t\t\tassertManagedBySamePlugin(collection, referencedCollection)\n\t\t\t}\n\n\t\t\treturn createVariable(\n\t\t\t\t{\n\t\t\t\t\ttype: ControlType.CollectionReference,\n\t\t\t\t\tdataIdentifier: referencedCollection.instanceIdentifier,\n\t\t\t\t\tname: field.name,\n\t\t\t\t\tinitialValue: undefined,\n\t\t\t\t\texternalId: field.id,\n\t\t\t\t\tuserEditable: Boolean(field.userEditable),\n\t\t\t\t\trequired: field.required === true,\n\t\t\t\t},\n\t\t\t\t\"collection\",\n\t\t\t)\n\t\t}\n\t\tcase \"multiCollectionReference\": {\n\t\t\tconst referencedCollection = engine.tree.get(field.collectionId)\n\t\t\tassert(isCollectionNode(referencedCollection), `\"Collection with ID ${field.collectionId} cannot be found\"`)\n\t\t\tif (collection.managedByPlugin) {\n\t\t\t\tassertManagedBySamePlugin(collection, referencedCollection)\n\t\t\t}\n\n\t\t\treturn createVariable(\n\t\t\t\t{\n\t\t\t\t\ttype: ControlType.MultiCollectionReference,\n\t\t\t\t\tdataIdentifier: referencedCollection.instanceIdentifier,\n\t\t\t\t\tname: field.name,\n\t\t\t\t\tinitialValue: undefined,\n\t\t\t\t\texternalId: field.id,\n\t\t\t\t\tuserEditable: Boolean(field.userEditable),\n\t\t\t\t\trequired: field.required === true,\n\t\t\t\t},\n\t\t\t\t\"collection\",\n\t\t\t)\n\t\t}\n\t\tcase \"array\": {\n\t\t\treturn createVariable(\n\t\t\t\t{\n\t\t\t\t\ttype: ControlType.Array,\n\t\t\t\t\titemVariables: field.fields.map(itemField => {\n\t\t\t\t\t\tconst variable = createVariableFromManagedCollectionField(\n\t\t\t\t\t\t\tcollection,\n\t\t\t\t\t\t\tengine,\n\t\t\t\t\t\t\tpluginManifestId,\n\t\t\t\t\t\t\tpluginMode,\n\t\t\t\t\t\t\titemField,\n\t\t\t\t\t\t)\n\n\t\t\t\t\t\tassert(isArrayItemVariableDefinition(variable), \"Invalid array item variable\")\n\n\t\t\t\t\t\treturn variable\n\t\t\t\t\t}),\n\t\t\t\t\tname: field.name,\n\t\t\t\t\tinitialValue: [],\n\t\t\t\t\texternalId: field.id,\n\t\t\t\t\tuserEditable: Boolean(field.userEditable),\n\t\t\t\t\trequired: field.required === true,\n\t\t\t\t},\n\t\t\t\t\"collection\",\n\t\t\t)\n\t\t}\n\t\tdefault:\n\t\t\tassertNever(field)\n\t}\n}\n\nfunction getCollectionFieldFromVariable(\n\tengine: VekterEngine,\n\tcollection: CollectionNode,\n\tvariable: Exclude<VariableDefinition, SlugVariableDefinition>,\n): Exclude<FieldDefinitionData, FieldDividerDefinitionData> | null {\n\tassert(variable.type !== \"controlReference\")\n\tassert(variable.type !== \"nodePropertyControlReference\")\n\tassert(isCollectionControlType(variable.type), \"Expected variable to be a collection control type\")\n\n\tconst variableId = collection.managedByPlugin ? (variable.externalId ?? variable.id) : variable.id\n\n\tswitch (variable.type) {\n\t\tcase ControlType.String:\n\t\t\treturn {\n\t\t\t\ttype: \"string\",\n\t\t\t\tname: variable.name,\n\t\t\t\tid: variableId,\n\t\t\t\trequired: variable.required === true,\n\t\t\t\tbasedOn: variable.associatedStringVariable ?? null,\n\t\t\t}\n\t\tcase ControlType.RichText:\n\t\t\treturn {\n\t\t\t\ttype: \"formattedText\",\n\t\t\t\tname: variable.name,\n\t\t\t\tid: variableId,\n\t\t\t\trequired: variable.required === true,\n\t\t\t\tcontentType: variable.contentType ?? \"html\",\n\t\t\t}\n\t\tcase ControlType.Number:\n\t\t\treturn {\n\t\t\t\ttype: \"number\",\n\t\t\t\tname: variable.name,\n\t\t\t\tid: variableId,\n\t\t\t}\n\t\tcase ControlType.Boolean:\n\t\t\treturn {\n\t\t\t\ttype: \"boolean\",\n\t\t\t\tname: variable.name,\n\t\t\t\tid: variableId,\n\t\t\t}\n\t\tcase ControlType.Date:\n\t\t\treturn {\n\t\t\t\ttype: \"date\",\n\t\t\t\tname: variable.name,\n\t\t\t\tid: variableId,\n\t\t\t\trequired: variable.required === true,\n\t\t\t\tdisplayTime: variable.options?.displayTime ?? false,\n\t\t\t}\n\t\tcase ControlType.Enum:\n\t\t\treturn {\n\t\t\t\ttype: \"enum\",\n\t\t\t\tname: variable.name,\n\t\t\t\tid: variableId,\n\t\t\t\tcases: variable.cases.map(enumVariableCase =>\n\t\t\t\t\tenumVariableCaseToEnumCaseData(\n\t\t\t\t\t\tengine,\n\t\t\t\t\t\tcollection,\n\t\t\t\t\t\tvariable,\n\t\t\t\t\t\tenumVariableCase,\n\t\t\t\t\t\tBoolean(collection.managedByPlugin),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t}\n\t\tcase ControlType.Color:\n\t\t\treturn {\n\t\t\t\ttype: \"color\",\n\t\t\t\tname: variable.name,\n\t\t\t\tid: variableId,\n\t\t\t}\n\t\tcase ControlType.Image:\n\t\t\treturn {\n\t\t\t\ttype: \"image\",\n\t\t\t\tname: variable.name,\n\t\t\t\tid: variableId,\n\t\t\t\trequired: variable.required === true,\n\t\t\t}\n\t\tcase ControlType.Link:\n\t\t\treturn {\n\t\t\t\ttype: \"link\",\n\t\t\t\tname: variable.name,\n\t\t\t\tid: variableId,\n\t\t\t\trequired: variable.required === true,\n\t\t\t}\n\t\tcase ControlType.File:\n\t\t\treturn {\n\t\t\t\ttype: \"file\",\n\t\t\t\tname: variable.name,\n\t\t\t\tid: variableId,\n\t\t\t\tallowedFileTypes: variable.allowedFileTypes.map(type => type.extension),\n\t\t\t\trequired: variable.required === true,\n\t\t\t}\n\t\tcase ControlType.CollectionReference: {\n\t\t\tconst referencedCollection = getCollectionForIdentifier(engine.tree, variable.dataIdentifier)\n\t\t\tif (!isCollectionNode(referencedCollection)) return null\n\n\t\t\treturn {\n\t\t\t\ttype: \"collectionReference\",\n\t\t\t\tname: variable.name,\n\t\t\t\tid: variableId,\n\t\t\t\tcollectionId: referencedCollection.id,\n\t\t\t\trequired: variable.required === true,\n\t\t\t}\n\t\t}\n\t\tcase ControlType.MultiCollectionReference: {\n\t\t\tconst referencedCollection = getCollectionForIdentifier(engine.tree, variable.dataIdentifier)\n\t\t\tif (!isCollectionNode(referencedCollection)) return null\n\n\t\t\treturn {\n\t\t\t\ttype: \"multiCollectionReference\",\n\t\t\t\tname: variable.name,\n\t\t\t\tid: variableId,\n\t\t\t\tcollectionId: referencedCollection.id,\n\t\t\t\trequired: variable.required === true,\n\t\t\t}\n\t\t}\n\t\tcase ControlType.Array: {\n\t\t\ttry {\n\t\t\t\tconst itemVariable = getSingleArrayItemImageVariable(variable)\n\t\t\t\tconst itemField = getCollectionFieldFromVariable(engine, collection, itemVariable)\n\t\t\t\tassert(itemField !== null, \"Item field cannot be null\")\n\t\t\t\tassert(isArrayItemFieldDataDefinition(itemField), \"Invalid array item variable\")\n\n\t\t\t\treturn {\n\t\t\t\t\ttype: \"array\",\n\t\t\t\t\tfields: [itemField],\n\t\t\t\t\tname: variable.name,\n\t\t\t\t\tid: variableId,\n\t\t\t\t\trequired: variable.required === true,\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\treturn null\n\t\t\t}\n\t\t}\n\t\tcase ControlType.VectorSetItem:\n\t\t\treturn {\n\t\t\t\ttype: \"unsupported\",\n\t\t\t\tname: variable.name,\n\t\t\t\tid: variableId,\n\t\t\t}\n\t\tdefault:\n\t\t\tassertNever(variable.type)\n\t}\n}\n\n/**\n * Get a single image variable from an array variable.\n *\n * Currently, arrays only support a single field, that must be an image. This\n * is not currently reflected in the variables types, but as it is in the\n * plugin's types, we need to check and enforce this here.\n */\nfunction getSingleArrayItemImageVariable(variable: ArrayVariableDefinition): ImageVariableDefinition {\n\tassert(variable.itemVariables.length === 1, \"Array variable must have a single item variable\")\n\tconst itemVariable = variable.itemVariables[0]\n\tassert(itemVariable?.type === ControlType.Image, \"Item variable must exist and be of type image\")\n\treturn itemVariable\n}\n\nexport function getManagedCollectionFieldFromVariable(\n\tengine: VekterEngine,\n\tcollection: CollectionNode,\n\tvariable: Exclude<VariableDefinition, SlugVariableDefinition>,\n): ManagedCollectionField | null {\n\tconst field = getCollectionFieldFromVariable(engine, collection, variable)\n\tif (!field) return null\n\tif (field.type === \"unsupported\") return null\n\n\treturn {\n\t\t...field,\n\t\tuserEditable: Boolean(variable.userEditable),\n\t}\n}\n\nconst fieldVariableTypes = [\n\tControlType.String,\n\tControlType.RichText,\n\tControlType.Number,\n\tControlType.Boolean,\n\tControlType.Date,\n\tControlType.Enum,\n\tControlType.Color,\n\tControlType.Image,\n\tControlType.Link,\n\tControlType.File,\n\tControlType.CollectionReference,\n\tControlType.MultiCollectionReference,\n\tControlType.Array,\n] as const satisfies VariableType[]\n\nfunction isFieldVariableType(value: unknown): value is FieldVariableType {\n\treturn fieldVariableTypes.includes(value as FieldVariableType)\n}\n\nexport type FieldVariableType = (typeof fieldVariableTypes)[number]\n\nfunction getVariableTypeFromManagedField(\n\tfield: ManagedCollectionFieldInputData | UnsupportedFieldDefinitionData,\n): FieldVariableType {\n\tswitch (field.type) {\n\t\tcase \"string\":\n\t\t\treturn ControlType.String\n\t\tcase \"formattedText\":\n\t\t\treturn ControlType.RichText\n\t\tcase \"number\":\n\t\t\treturn ControlType.Number\n\t\tcase \"boolean\":\n\t\t\treturn ControlType.Boolean\n\t\tcase \"date\":\n\t\t\treturn ControlType.Date\n\t\tcase \"enum\":\n\t\t\treturn ControlType.Enum\n\t\tcase \"color\":\n\t\t\treturn ControlType.Color\n\t\tcase \"image\":\n\t\t\treturn ControlType.Image\n\t\tcase \"link\":\n\t\t\treturn ControlType.Link\n\t\tcase \"file\":\n\t\t\treturn ControlType.File\n\t\tcase \"collectionReference\":\n\t\t\treturn ControlType.CollectionReference\n\t\tcase \"multiCollectionReference\":\n\t\t\treturn ControlType.MultiCollectionReference\n\t\tcase \"array\":\n\t\t\treturn ControlType.Array\n\t\tcase \"unsupported\":\n\t\t\tthrow new Error(\"Unsupported field type\")\n\t\tdefault:\n\t\t\tassertNever(field)\n\t}\n}\n\ntype CollectionVariablesBySomeId = Map<string, CollectionVariableDefinition>\n\nfunction getCollectionVariablesByExternalId(collection: CollectionNode): CollectionVariablesBySomeId {\n\treturn arrayToMap(collection.variables, variable => {\n\t\tif (!isVariableDefinition(variable) || isSlugVariableDefinition(variable)) return\n\t\tassert(isDefined(variable.externalId), \"Expected variable to have external ID\")\n\t\treturn [variable.externalId, variable]\n\t})\n}\n\nfunction getUpdatedEnumCases(\n\ttree: CanvasTree,\n\tpluginManifestId: PluginManifestId,\n\tpluginMode: Mode,\n\texistingEnumCases: readonly EnumVariableCase[],\n\tfieldCases: EnumCaseDataInput[],\n): readonly EnumVariableCase[] {\n\tconst updatedEnumCases: EnumVariableCase[] = []\n\n\tconst existingEnumCasesById = arrayToMap(existingEnumCases, enumCase => {\n\t\tassert(isDefined(enumCase.externalId), \"Expected enum case to have an externalId\")\n\t\treturn [enumCase.externalId, enumCase]\n\t})\n\n\tfor (const fieldCase of fieldCases) {\n\t\tconst existingEnumCase = existingEnumCasesById.get(fieldCase.id)\n\n\t\tconst nameLocalized = getEnumCaseNameLocalized(\n\t\t\ttree,\n\t\t\tpluginManifestId,\n\t\t\tpluginMode,\n\t\t\tfieldCase.name,\n\t\t\texistingEnumCase?.nameLocalized,\n\t\t\tfieldCase.nameByLocale,\n\t\t)\n\n\t\tif (existingEnumCase) {\n\t\t\tupdatedEnumCases.push({ ...existingEnumCase, name: fieldCase.name, nameLocalized })\n\t\t} else {\n\t\t\tupdatedEnumCases.push({\n\t\t\t\tid: randomID(),\n\t\t\t\tname: fieldCase.name,\n\t\t\t\texternalId: fieldCase.id,\n\t\t\t\tnameLocalized,\n\t\t\t})\n\t\t}\n\t}\n\n\treturn updatedEnumCases\n}\n\nexport function getEnumCaseNameLocalized(\n\ttree: CanvasTree,\n\tpluginId: PluginManifestId,\n\tpluginMode: Mode,\n\tname: string,\n\tcurrentNameLocalized: Record<LocaleId, LocalizedValue> | undefined,\n\tnameByLocale: LocalizationSourceUpdate | undefined,\n): Record<LocaleId, LocalizedValue> | undefined {\n\tif (!tree.root.locales || !nameByLocale) return\n\n\tconst nameLocalized: Record<LocaleId, LocalizedValue> = {}\n\n\tfor (const locale of tree.root.locales) {\n\t\tconst update = nameByLocale[locale.id]\n\t\tconst current = currentNameLocalized?.[locale.id]\n\n\t\tif (!update) {\n\t\t\tif (current) {\n\t\t\t\tnameLocalized[locale.id] = current\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\n\t\tif (update.action === \"clear\") continue\n\n\t\tnameLocalized[locale.id] = {\n\t\t\tvalue: update.action === \"set\" ? update.value : null,\n\t\t\tneedsReview: update.needsReview || undefined,\n\t\t\tlastEdited: Date.now(),\n\t\t\thash: murmurHash(name),\n\t\t\tpluginId,\n\t\t\tpluginMode,\n\t\t}\n\t}\n\n\treturn nameLocalized\n}\n\nexport function enumVariableCaseToEnumCaseData(\n\tengine: VekterEngine,\n\tnode: CanvasNode & WithVariables,\n\tvariable: EnumVariableDefinition,\n\tenumCase: EnumVariableCase,\n\tuseExternalId = true,\n): EnumCaseData {\n\tconst locales = engine.tree.root.locales\n\tconst localizationSource = locales ? getEnumCaseLocalizationSource(node, variable, enumCase, locales) : undefined\n\tconst nameByLocale = localizationSource\n\t\t? vekterLocalizedValuesToPluginLocalizationSourceLocales(engine, localizationSource, false)\n\t\t: {}\n\n\treturn {\n\t\tid: useExternalId ? (enumCase.externalId ?? enumCase.id) : enumCase.id,\n\t\tname: enumCase.name,\n\t\tnameByLocale,\n\t}\n}\n\nfunction getUpdatedManagedCollectionVariable(\n\ttree: CanvasTree,\n\tpluginManifestId: PluginManifestId,\n\tpluginMode: Mode,\n\texistingVariable: CollectionVariableDefinition,\n\tfield: ManagedCollectionFieldInputData,\n): CollectionVariableDefinition {\n\tconst requiredVariableType = getVariableTypeFromManagedField(field)\n\tassert(existingVariable.type === requiredVariableType, \"Variable type mismatch for field:\", field.id)\n\n\tconst updatedVariable = { ...existingVariable }\n\n\tif (field.name !== existingVariable.name) {\n\t\tupdatedVariable.name = field.name\n\t}\n\n\tif (Boolean(field.userEditable) !== Boolean(existingVariable.userEditable)) {\n\t\tupdatedVariable.userEditable = field.userEditable\n\t}\n\n\tif (withRequired(existingVariable)) {\n\t\tassert(withRequired(updatedVariable))\n\t\tupdatedVariable.required = \"required\" in field && isBoolean(field.required) ? field.required : false\n\t}\n\n\tif (field.type === \"enum\") {\n\t\tassert(updatedVariable.type === ControlType.Enum, \"Expected enum variable\")\n\t\tupdatedVariable.cases = getUpdatedEnumCases(tree, pluginManifestId, pluginMode, updatedVariable.cases, field.cases)\n\t}\n\n\tif (field.type === \"date\") {\n\t\tassert(updatedVariable.type === ControlType.Date, \"Expected date variable\")\n\t\tupdatedVariable.options ??= {}\n\t\tupdatedVariable.options.displayTime = field.displayTime ?? false\n\t}\n\n\treturn isEqual(existingVariable, updatedVariable) ? existingVariable : updatedVariable\n}\n\nexport function getUpdatedManagedCollectionVariables(\n\tengine: VekterEngine,\n\tpluginManifestId: PluginManifestId,\n\tpluginMode: Mode,\n\tcollection: ManagedCollectionNode,\n\tfields: ManagedCollectionFieldInputData[],\n) {\n\tvalidateManagedCollectionFields(fields)\n\n\tconst variablesByExternalId = getCollectionVariablesByExternalId(collection)\n\tconst slugVariable = collection.variables.find(variable => variable.type === \"slug\")\n\tassert(slugVariable?.type === \"slug\", \"Slug variable can't be found\")\n\n\tconst variables: CollectionVariableDefinition[] = []\n\n\tfor (const field of fields) {\n\t\tverifyExternalPluginCollectionItemId(field.id, \"field\")\n\n\t\tconst existingVariable = variablesByExternalId.get(field.id)\n\t\tconst requiredVariableType = getVariableTypeFromManagedField(field)\n\n\t\tif (!existingVariable || existingVariable.type !== requiredVariableType) {\n\t\t\tconst variable = createVariableFromManagedCollectionField(collection, engine, pluginManifestId, pluginMode, field)\n\t\t\tvariables.push(variable)\n\n\t\t\tif (collection.pluginVariableIds) {\n\t\t\t\tconst pluginFieldIdKey = getPluginVariableIdKeyFromVariable(engine.tree, variable)\n\t\t\t\tif (!pluginFieldIdKey) continue\n\n\t\t\t\tconst previouslyUsedVariableId = collection.pluginVariableIds[pluginFieldIdKey]\n\t\t\t\tif (isString(previouslyUsedVariableId)) variable.id = previouslyUsedVariableId\n\t\t\t}\n\n\t\t\tcontinue\n\t\t}\n\n\t\tif (field.type === \"collectionReference\" || field.type === \"multiCollectionReference\") {\n\t\t\tassert(isAnyCollectionReferencingVariableDefinition(existingVariable), \"Expected a collection reference variable\")\n\n\t\t\tconst referencedCollection = engine.tree.get(field.collectionId)\n\t\t\tif (!referencedCollection) {\n\t\t\t\t// Can happen if the referenced collection was deleted, then we keep the variable\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tassertPluginManagedCollection(collection.managedByPlugin, referencedCollection)\n\n\t\t\tif (existingVariable.dataIdentifier !== referencedCollection.instanceIdentifier) {\n\t\t\t\tconst variable = createVariableFromManagedCollectionField(\n\t\t\t\t\tcollection,\n\t\t\t\t\tengine,\n\t\t\t\t\tpluginManifestId,\n\t\t\t\t\tpluginMode,\n\t\t\t\t\tfield,\n\t\t\t\t)\n\t\t\t\tassert(isAnyCollectionReferencingVariableDefinition(variable), \"Expected a collection reference variable\")\n\t\t\t\tvariables.push(variable)\n\n\t\t\t\tif (collection.pluginVariableIds) {\n\t\t\t\t\tconst pluginFieldIdKey = getPluginVariableIdKeyFromVariable(engine.tree, variable)\n\t\t\t\t\tif (!pluginFieldIdKey) continue\n\n\t\t\t\t\tconst previouslyUsedVariableId = collection.pluginVariableIds[pluginFieldIdKey]\n\t\t\t\t\tif (isString(previouslyUsedVariableId)) variable.id = previouslyUsedVariableId\n\t\t\t\t}\n\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\n\t\tvariablesByExternalId.delete(field.id)\n\t\tvariables.push(\n\t\t\tgetUpdatedManagedCollectionVariable(engine.tree, pluginManifestId, pluginMode, existingVariable, field),\n\t\t)\n\t}\n\n\t// Add the slug variable as the second variable\n\tconst slugVariableIndex = Math.min(1, variables.length)\n\tvariables.splice(slugVariableIndex, 0, slugVariable)\n\n\tconst removedVariables = Array.from(variablesByExternalId.values())\n\n\t// Make sure we don't have any duplicate variable ids\n\tconst allVariableIds = new Set(variables.map(variable => variable.id))\n\tassert(allVariableIds.size === variables.length, \"Duplicate variable ids\")\n\n\treturn { variables, removedVariables }\n}\n\nexport function createPluginManagedCollectionNode(name: string, manifest: VekterPluginManifest) {\n\tconst slugVariable = createVariable(\n\t\t{\n\t\t\ttype: \"slug\",\n\t\t\tname: \"Slug\",\n\t\t\tinitialValue: \"\",\n\t\t\tassociatedStringVariable: null,\n\t\t},\n\t\t\"collection\",\n\t)\n\n\tconst variables: VariablesAndDividers<CollectionVariableDefinition> = [slugVariable]\n\n\treturn new CollectionNode({ managedByPlugin: manifest.id, name, variables })\n}\n\nexport function createCollectionNode(engine: VekterEngine, name: string): CollectionNode {\n\tconst contentManagementNode = createContentManagementNodeIfNeeded(engine.tree)\n\tfor (const child of contentManagementNode.children) {\n\t\tif (child.name === name) {\n\t\t\tthrow new PluginOnlyError(`A collection with the name \"${name}\" already exists`)\n\t\t}\n\t}\n\n\tconst slugVariable = createVariable(\n\t\t{\n\t\t\ttype: \"slug\",\n\t\t\tname: \"Slug\",\n\t\t\tinitialValue: \"\",\n\t\t\tassociatedStringVariable: null,\n\t\t},\n\t\t\"collection\",\n\t)\n\n\tconst collectionNode = new CollectionNode({ name, variables: [slugVariable] })\n\n\tengine.tree.insertNode(collectionNode, contentManagementNode.id)\n\n\treturn collectionNode\n}\n\nexport function createManagedCollectionNode(\n\tengine: VekterEngine,\n\tmanifest: VekterPluginManifest,\n\tname: string,\n): CollectionNode {\n\tassert(\n\t\tmanifest.modes.includes(\"configureManagedCollection\"),\n\t\t\"Expected the plugin to support `configureManagedCollection` mode\",\n\t)\n\n\tconst contentManagementNode = createContentManagementNodeIfNeeded(engine.tree)\n\n\tfor (const child of contentManagementNode.children) {\n\t\tif (child.name === name) {\n\t\t\tthrow new PluginOnlyError(`A collection with the name \"${name}\" already exists`)\n\t\t}\n\t}\n\n\tconst collectionNode = createPluginManagedCollectionNode(name, manifest)\n\tengine.tree.insertNode(collectionNode, contentManagementNode.id)\n\treturn collectionNode\n}\n\nexport function createPluginManagedCollection(engine: VekterEngine, manifest: VekterPluginManifest, name: string) {\n\tassert(\n\t\tmanifest.modes.includes(\"configureManagedCollection\"),\n\t\t\"Expected the plugin to support `configureManagedCollection` mode\",\n\t)\n\n\tconst contentManagementNode = createContentManagementNodeIfNeeded(engine.tree)\n\n\tconst collectionNode = createPluginManagedCollectionNode(name, manifest)\n\n\tengine.stores.scopeStore.insertNode(collectionNode, contentManagementNode.id)\n\tengine.stores.scopeStore.select(contentManagementNode.id, { keepHistory: false })\n\tengine.stores.selectionStore.set(collectionNode.id)\n\n\tconst supportsConfigureCollectionMode = manifest.modes.includes(\"configureManagedCollection\")\n\tconst supportsSyncCollectionMode = manifest.modes.includes(\"syncManagedCollection\")\n\tassert(\n\t\tsupportsConfigureCollectionMode || supportsSyncCollectionMode,\n\t\t\"Expected the plugin to support either `configureCollection` or `syncCollection` mode\",\n\t)\n\n\tconst mode: Mode = supportsConfigureCollectionMode ? \"configureManagedCollection\" : \"syncManagedCollection\"\n\n\tengine.stores.pluginStore\n\t\t.openPlugin(manifest, engine, { mode })\n\t\t.then(() => engine.stores.modalStore.dismiss())\n\t\t.catch(unhandledError)\n}\n\nfunction assertManagedBySamePlugin(collectionA: CollectionNode, collectionB: CollectionNode) {\n\tassert(collectionA.managedByPlugin, \"Expected collection A to be managed by a plugin\")\n\tassert(collectionB.managedByPlugin, \"Expected collection B to be managed by a plugin\")\n\tassert(\n\t\tcollectionA.managedByPlugin === collectionB.managedByPlugin,\n\t\t\"Expected the collections to be managed by the same plugin\",\n\t)\n}\n\ntype ManagedCollectionNode = CollectionNode & { managedByPlugin: string }\n\nexport function assertPluginManagedCollection(\n\tmanifestId: PluginManifestId,\n\tnode: CanvasNode | null | undefined,\n): asserts node is ManagedCollectionNode {\n\tverifyForPlugin(isCollectionNode(node), \"Expected a collection node\")\n\tverifyForPlugin(node.managedByPlugin === manifestId, \"Expected the collection to be managed by this plugin\")\n}\n\ntype UnmanagedCollectionNode = CollectionNode & { managedByPlugin: undefined }\n\nexport function assertUnmanagedCollection(\n\tnode: CanvasNode | null | undefined,\n): asserts node is UnmanagedCollectionNode {\n\tverifyForPlugin(isCollectionNode(node), \"Expected a collection node\")\n\tverifyForPlugin(isUndefined(node.managedByPlugin), \"Expected the collection to be unmanaged\")\n}\n\nexport function isUnmanagedCollection(node: CanvasNode | null | undefined): node is UnmanagedCollectionNode {\n\treturn isCollectionNode(node) && isUndefined(node.managedByPlugin)\n}\n\nfunction isCollectionReadonly(collection: CollectionNode, manifestId: PluginManifestId, mode: Mode): boolean {\n\tswitch (mode) {\n\t\tcase \"configureManagedCollection\":\n\t\tcase \"syncManagedCollection\":\n\t\t\treturn collection.managedByPlugin !== manifestId\n\t\tcase \"canvas\":\n\t\tcase \"api\":\n\t\tcase \"collection\":\n\t\tcase \"image\":\n\t\tcase \"editImage\":\n\t\tcase \"localization\":\n\t\tcase \"code\":\n\t\t\treturn !isUndefined(collection.managedByPlugin)\n\t\tdefault:\n\t\t\treturn assertNever(mode)\n\t}\n}\n\nfunction getCollectionManagedBy(collection: CollectionNode, manifestId: PluginManifestId): CollectionManagedBy {\n\tif (isUndefined(collection.managedByPlugin)) {\n\t\treturn \"user\"\n\t}\n\n\tif (collection.managedByPlugin === manifestId) {\n\t\treturn \"thisPlugin\"\n\t}\n\n\treturn \"anotherPlugin\"\n}\n\nexport function getPluginCollectionData(\n\tcollection: CollectionNode,\n\tmanifestId: PluginManifestId,\n\tmode: Mode,\n): CollectionData {\n\tconst slug = collection.variables.find(variable => variable.type === \"slug\")\n\treturn {\n\t\tid: collection.id,\n\t\tname: collection.resolveValue(\"name\") ?? Dictionary.Unknown,\n\t\tslugFieldName: slug?.name ?? null,\n\t\tslugFieldBasedOn: slug?.associatedStringVariable ?? null,\n\t\treadonly: isCollectionReadonly(collection, manifestId, mode),\n\t\tmanagedBy: getCollectionManagedBy(collection, manifestId),\n\t}\n}\n\nfunction variableToField(\n\tvariable: VariableOrDivider,\n\tcollection: CollectionNode,\n\tdividerMode: \"includeDividers\" | \"excludeDividers\",\n\tengine: VekterEngine,\n): FieldDefinitionData | null {\n\tif (isSlugVariableDefinition(variable)) return null\n\n\tif (variable.type === \"divider\") {\n\t\tif (dividerMode === \"includeDividers\") return { type: \"divider\", id: variable.id, name: variable.name }\n\t\treturn null\n\t}\n\n\treturn getCollectionFieldFromVariable(engine, collection, variable)\n}\n\nexport function getCollectionFields(\n\tengine: VekterEngine,\n\tcollection: CollectionNode,\n\tdividerMode: \"includeDividers\" | \"excludeDividers\",\n): FieldDefinitionData[] {\n\tconst fields: FieldDefinitionData[] = []\n\n\tfor (const variable of collection.variables) {\n\t\tconst field = variableToField(variable, collection, dividerMode, engine)\n\t\tif (field) fields.push(field)\n\t}\n\n\treturn fields\n}\n\nexport function mapSpecificVariablesToCollectionFields(\n\tengine: VekterEngine,\n\tcollection: CollectionNode,\n\tvariables: (VariableOrDivider | null)[],\n): (FieldDefinitionData | null)[] {\n\treturn variables.map(variable => {\n\t\tif (isNull(variable)) return null\n\t\treturn variableToField(variable, collection, \"includeDividers\", engine)\n\t})\n}\n\nexport function getPluginManagedCollectionFields(\n\tengine: VekterEngine,\n\tcollection: CollectionNode,\n): ManagedCollectionField[] {\n\tconst fields: ManagedCollectionField[] = []\n\n\tfor (const variable of collection.variables) {\n\t\tif (!isVariableDefinition(variable)) continue\n\t\tif (isSlugVariableDefinition(variable)) continue\n\n\t\tconst field = getManagedCollectionFieldFromVariable(engine, collection, variable)\n\t\tif (!field) continue\n\n\t\tfields.push(field)\n\t}\n\n\treturn fields\n}\n\nfunction getCollectionItemCollectionReferenceValue(\n\tpluginManifestId: PluginManifestId,\n\tcontext: ActivePluginContext,\n\tvariableDefinition: CollectionReferenceVariableDefinition | MultiCollectionReferenceVariableDefinition,\n\tslugVariableByDataIdentifier: SlugVariableByDataIdentifier,\n\tvalue: string | undefined,\n): string | undefined {\n\tif (!value) return\n\n\tconst referencedItem = context.engine.tree.get(value)\n\tif (!isCollectionItemNode(referencedItem)) return\n\n\tconst referencedCollection = context.engine.tree.get(referencedItem.parentid)\n\tif (!isCollectionNode(referencedCollection)) return\n\n\tif (referencedCollection.managedByPlugin === pluginManifestId) {\n\t\t// For managed plugins we need to return references as their external IDs\n\t\tassert(\n\t\t\tisDefined(referencedItem.externalId),\n\t\t\t\"Expected the referenced managed collection item to have an external id\",\n\t\t)\n\t\treturn referencedItem.externalId\n\t}\n\n\t// Otherwise we export references as slugs.\n\tconst referencedSlugVariable = slugVariableByDataIdentifier.get(variableDefinition.dataIdentifier)\n\treturn getCollectionItemSlug(referencedItem, referencedSlugVariable)\n}\n\nfunction getDefaultEnumCase(variableDefinition: EnumVariableDefinition) {\n\tconst defaultCase =\n\t\tvariableDefinition.cases.find(enumCase => {\n\t\t\treturn enumCase.id === variableDefinition.initialValue\n\t\t}) ?? variableDefinition.cases[0]\n\n\tassert(defaultCase, \"Expected default enum case to exist\")\n\n\treturn defaultCase\n}\n\nfunction getValueByLocale(\n\tcontext: ActivePluginContext,\n\tcollectionNodeId: NodeID,\n\tcollectionItemNode: CollectionItemNode,\n\tvariable: LocalizableVariable,\n\tcontrolProp: CollectionControlProp | undefined,\n\tlocales: readonly Locale[],\n\tslugsByLocaleId: SlugOccurrencesByLocale,\n): InlineLocalizationValueByLocale {\n\tconst localizationSource = getCollectionItemNodeLocalizationSource(\n\t\tcontext.engine.tree,\n\t\tcontext.engine.componentLoader,\n\t\tcollectionNodeId,\n\t\tcollectionItemNode,\n\t\tlocales,\n\t\tundefined,\n\t\tvariable,\n\t\tvariable.id,\n\t\tcontrolProp,\n\t\tslugsByLocaleId,\n\t)\n\n\tif (!localizationSource) {\n\t\treturn Object.fromEntries(\n\t\t\tlocales.map(localeId => {\n\t\t\t\treturn [localeId, { status: \"notLocalizable\" }]\n\t\t\t}),\n\t\t)\n\t}\n\n\tconst type = vekterSourceTypeToPluginSourceType(localizationSource.type)\n\tconst isHTML = type === \"formattedText\"\n\n\treturn vekterLocalizedValuesToPluginLocalizationSourceLocales(context.engine, localizationSource, isHTML)\n}\n\n/**\n * Populate field data with serialized versions of a collection item's variables.\n *\n * @param fieldData - This object will be mutated.\n */\nfunction collectFieldDataFromControlProp(\n\tpluginManifestId: PluginManifestId,\n\tcontext: ActivePluginContext,\n\tcollectionNodeId: NodeID,\n\tcollectionItemNode: CollectionItemNode,\n\tvariable: VariableDefinition,\n\tcontrolProp: CollectionControlProp | undefined,\n\tfieldData: FieldSerializableData,\n\tslugVariableByDataIdentifier: SlugVariableByDataIdentifier,\n\tlocales: readonly Locale[],\n\tslugsByLocaleId: SlugOccurrencesByLocale,\n): void {\n\tconst variableId: string = variable.externalId ?? variable.id\n\n\tif (!controlProp) {\n\t\tswitch (variable.type) {\n\t\t\tcase ControlType.String: {\n\t\t\t\tconst valueByLocale = getValueByLocale(\n\t\t\t\t\tcontext,\n\t\t\t\t\tcollectionNodeId,\n\t\t\t\t\tcollectionItemNode,\n\t\t\t\t\tvariable,\n\t\t\t\t\tcontrolProp,\n\t\t\t\t\tlocales,\n\t\t\t\t\tslugsByLocaleId,\n\t\t\t\t)\n\t\t\t\tassert(!isNullish(variable.initialValue), \"Optional strings are not supported in the CMS\")\n\t\t\t\tfieldData[variableId] = {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\tvalue: variable.initialValue,\n\t\t\t\t\tvalueByLocale,\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t}\n\t\t\tcase ControlType.Number: {\n\t\t\t\tassert(!isNullish(variable.initialValue), \"Optional numbers are not supported in the CMS\")\n\t\t\t\tfieldData[variableId] = { type: \"number\", value: variable.initialValue }\n\t\t\t\treturn\n\t\t\t}\n\t\t\tcase ControlType.Boolean: {\n\t\t\t\tassert(!isNullish(variable.initialValue), \"Optional booleans are not supported in the CMS\")\n\t\t\t\tfieldData[variableId] = { type: \"boolean\", value: variable.initialValue }\n\t\t\t\treturn\n\t\t\t}\n\t\t\tcase ControlType.Date: {\n\t\t\t\tfieldData[variableId] = { type: \"date\", value: variable.initialValue }\n\t\t\t\treturn\n\t\t\t}\n\t\t\tcase ControlType.Enum: {\n\t\t\t\tconst defaultCase = getDefaultEnumCase(variable)\n\t\t\t\tfieldData[variableId] = { type: \"enum\", value: defaultCase.name }\n\t\t\t\treturn\n\t\t\t}\n\t\t\tcase ControlType.Color: {\n\t\t\t\tfieldData[variableId] = {\n\t\t\t\t\ttype: \"color\",\n\t\t\t\t\tvalue: getColorValueFromSerializedColor(context.engine, variable.initialValue),\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t}\n\t\t\tcase ControlType.Link: {\n\t\t\t\tconst valueByLocale = getValueByLocale(\n\t\t\t\t\tcontext,\n\t\t\t\t\tcollectionNodeId,\n\t\t\t\t\tcollectionItemNode,\n\t\t\t\t\tvariable,\n\t\t\t\t\tcontrolProp,\n\t\t\t\t\tlocales,\n\t\t\t\t\tslugsByLocaleId,\n\t\t\t\t)\n\n\t\t\t\tif (!isLink(variable.initialValue)) {\n\t\t\t\t\tfieldData[variableId] = {\n\t\t\t\t\t\ttype: \"link\",\n\t\t\t\t\t\tvalue: undefined,\n\t\t\t\t\t\tvalueByLocale,\n\t\t\t\t\t}\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tconst value = resolveLinkToURL(context.engine.tree, variable.initialValue)\n\t\t\t\tif (!value) {\n\t\t\t\t\tfieldData[variableId] = {\n\t\t\t\t\t\ttype: \"link\",\n\t\t\t\t\t\tvalue: undefined,\n\t\t\t\t\t\tvalueByLocale,\n\t\t\t\t\t}\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tfieldData[variableId] = {\n\t\t\t\t\ttype: \"link\",\n\t\t\t\t\tvalue,\n\t\t\t\t\tvalueByLocale,\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t}\n\t\t\tcase ControlType.Image: {\n\t\t\t\tif (!isString(variable.initialValue) || !isAssetReference(variable.initialValue)) {\n\t\t\t\t\tfieldData[variableId] = { type: \"image\", value: undefined }\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tfieldData[variableId] = {\n\t\t\t\t\ttype: \"image\",\n\t\t\t\t\tvalue: context.assetResolver.addImage(variable.initialValue, undefined),\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t}\n\t\t\tcase ControlType.RichText: {\n\t\t\t\tconst valueByLocale = getValueByLocale(\n\t\t\t\t\tcontext,\n\t\t\t\t\tcollectionNodeId,\n\t\t\t\t\tcollectionItemNode,\n\t\t\t\t\tvariable,\n\t\t\t\t\tcontrolProp,\n\t\t\t\t\tlocales,\n\t\t\t\t\tslugsByLocaleId,\n\t\t\t\t)\n\n\t\t\t\tfieldData[variableId] = {\n\t\t\t\t\ttype: \"formattedText\",\n\t\t\t\t\tvalue: convertVekterHTMLToPluginHTML(context.engine, variable.initialValue, null),\n\t\t\t\t\tvalueByLocale,\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t}\n\t\t\tcase ControlType.File: {\n\t\t\t\tif (!isString(variable.initialValue) || !isAssetReference(variable.initialValue)) {\n\t\t\t\t\tfieldData[variableId] = { type: \"file\", value: undefined }\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tfieldData[variableId] = {\n\t\t\t\t\ttype: \"file\",\n\t\t\t\t\tvalue: context.assetResolver.addFile(variable.initialValue),\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t}\n\t\t\tcase ControlType.CollectionReference: {\n\t\t\t\tconst value = getCollectionItemCollectionReferenceValue(\n\t\t\t\t\tpluginManifestId,\n\t\t\t\t\tcontext,\n\t\t\t\t\tvariable,\n\t\t\t\t\tslugVariableByDataIdentifier,\n\t\t\t\t\tvariable.initialValue,\n\t\t\t\t)\n\t\t\t\tif (!value) {\n\t\t\t\t\tfieldData[variableId] = { type: \"collectionReference\", value: undefined }\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tfieldData[variableId] = { type: \"collectionReference\", value }\n\t\t\t\treturn\n\t\t\t}\n\t\t\tcase ControlType.MultiCollectionReference: {\n\t\t\t\tconst value = (variable.initialValue ?? [])\n\t\t\t\t\t.map(internalId => {\n\t\t\t\t\t\treturn getCollectionItemCollectionReferenceValue(\n\t\t\t\t\t\t\tpluginManifestId,\n\t\t\t\t\t\t\tcontext,\n\t\t\t\t\t\t\tvariable,\n\t\t\t\t\t\t\tslugVariableByDataIdentifier,\n\t\t\t\t\t\t\tinternalId,\n\t\t\t\t\t\t)\n\t\t\t\t\t})\n\t\t\t\t\t.filter(isDefined)\n\n\t\t\t\tfieldData[variableId] = {\n\t\t\t\t\ttype: \"multiCollectionReference\",\n\t\t\t\t\tvalue,\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t}\n\t\t\tcase ControlType.Array: {\n\t\t\t\tfieldData[variableId] = { type: \"array\", value: [] }\n\t\t\t\treturn\n\t\t\t}\n\t\t\tcase ControlType.Border:\n\t\t\tcase ControlType.BorderRadius:\n\t\t\tcase ControlType.BoxShadow:\n\t\t\tcase ControlType.Cursor:\n\t\t\tcase ControlType.CustomCursor:\n\t\t\tcase ControlType.EventHandler:\n\t\t\tcase ControlType.Gap:\n\t\t\tcase ControlType.Padding:\n\t\t\tcase ControlType.ScrollSectionRef:\n\t\t\tcase ControlType.Transition:\n\t\t\tcase ControlType.TrackingId:\n\t\t\tcase ControlType.VectorSetItem:\n\t\t\tcase ControlType.LinkRelValues:\n\t\t\tcase ControlType.Location:\n\t\t\tcase \"slug\":\n\t\t\tcase \"controlReference\":\n\t\t\tcase \"nodePropertyControlReference\": {\n\t\t\t\t// These kind of control types cannot be collection fields\n\t\t\t\treturn\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tassertNever(variable)\n\t\t\t}\n\t\t}\n\t}\n\n\tif (isDynamicValue(controlProp.value)) return\n\n\tswitch (controlProp.type) {\n\t\tcase ControlType.Boolean: {\n\t\t\tconst { value } = controlProp\n\t\t\tassert(!isNull(value), \"Optional booleans are not supported in the CMS\")\n\t\t\tfieldData[variableId] = { type: \"boolean\", value }\n\t\t\tbreak\n\t\t}\n\t\tcase ControlType.Number: {\n\t\t\tconst { value } = controlProp\n\t\t\tassert(!isNull(value), \"Optional numbers are not supported in the CMS\")\n\t\t\tfieldData[variableId] = { type: \"number\", value }\n\t\t\tbreak\n\t\t}\n\t\tcase ControlType.Date: {\n\t\t\tconst { value } = controlProp\n\n\t\t\tif (!isString(value)) {\n\t\t\t\tassert(variable.type === controlProp.type, \"Variable type must match control type\")\n\t\t\t\tfieldData[variableId] = { type: \"date\", value: variable.initialValue }\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tfieldData[variableId] = { type: \"date\", value }\n\t\t\tbreak\n\t\t}\n\t\tcase ControlType.String: {\n\t\t\tassert(variable.type === controlProp.type, \"Variable type must match control type\")\n\t\t\tassert(!isNull(controlProp.value), \"Optional strings are not supported in the CMS\")\n\n\t\t\tconst valueByLocale = getValueByLocale(\n\t\t\t\tcontext,\n\t\t\t\tcollectionNodeId,\n\t\t\t\tcollectionItemNode,\n\t\t\t\tvariable,\n\t\t\t\tcontrolProp,\n\t\t\t\tlocales,\n\t\t\t\tslugsByLocaleId,\n\t\t\t)\n\n\t\t\tfieldData[variableId] = {\n\t\t\t\ttype: \"string\",\n\t\t\t\tvalue: controlProp.value,\n\t\t\t\tvalueByLocale,\n\t\t\t}\n\t\t\tbreak\n\t\t}\n\t\tcase ControlType.RichText: {\n\t\t\tassert(variable.type === controlProp.type, \"Variable type must match control type\")\n\n\t\t\tconst valueByLocale = getValueByLocale(\n\t\t\t\tcontext,\n\t\t\t\tcollectionNodeId,\n\t\t\t\tcollectionItemNode,\n\t\t\t\tvariable,\n\t\t\t\tcontrolProp,\n\t\t\t\tlocales,\n\t\t\t\tslugsByLocaleId,\n\t\t\t)\n\n\t\t\tconst value = controlProp.value\n\t\t\tassertRichTextTreeValueIsHTML(value, \"plugins.collections(ControlType.RichText)\")\n\t\t\tfieldData[variableId] = {\n\t\t\t\ttype: \"formattedText\",\n\t\t\t\tvalue: convertVekterHTMLToPluginHTML(context.engine, value, null),\n\t\t\t\tvalueByLocale,\n\t\t\t}\n\t\t\tbreak\n\t\t}\n\n\t\tcase ControlType.Color: {\n\t\t\tconst { value } = controlProp\n\t\t\tassert(variable.type === controlProp.type, \"Variable type must match control type\")\n\n\t\t\tfieldData[variableId] = {\n\t\t\t\ttype: \"color\",\n\t\t\t\tvalue: isNull(value) ? variable.initialValue : getColorValueFromSerializedColor(context.engine, value),\n\t\t\t}\n\t\t\tbreak\n\t\t}\n\n\t\tcase ControlType.Enum: {\n\t\t\tconst { value: selectedEnumId } = controlProp\n\t\t\tassert(variable.type === ControlType.Enum, \"Variable type must match control type\")\n\n\t\t\tconst selectedEnumCase = variable.cases.find(enumCase => {\n\t\t\t\treturn enumCase.id === selectedEnumId\n\t\t\t})\n\n\t\t\t// It's possible for an enum variable to have an invalid value, if, e.g., a case has\n\t\t\t// been removed. Framer is expected to handle such a situation gracefully.\n\t\t\tconst effectiveEnumCase = selectedEnumCase ?? getDefaultEnumCase(variable)\n\n\t\t\tfieldData[variableId] = { type: \"enum\", value: effectiveEnumCase.name }\n\t\t\tbreak\n\t\t}\n\n\t\tcase ControlType.File: {\n\t\t\tlet { value } = controlProp\n\t\t\tassert(variable.type === ControlType.File, \"Variable type must match control type\")\n\n\t\t\tif (!isString(value) || !isAssetReference(value)) {\n\t\t\t\tvalue = variable.initialValue\n\t\t\t}\n\n\t\t\tlet fileAssetData: FileAssetData | undefined = undefined\n\n\t\t\tif (isString(value) && isAssetReference(value)) {\n\t\t\t\tfileAssetData = context.assetResolver.addFile(value)\n\t\t\t}\n\n\t\t\tfieldData[variableId] = { type: \"file\", value: fileAssetData }\n\t\t\tbreak\n\t\t}\n\n\t\tcase ControlType.Image: {\n\t\t\tconst { value } = controlProp\n\n\t\t\tlet imageAssetData: ImageAssetData | undefined = undefined\n\n\t\t\tif (!isString(value) || !isAssetReference(value)) {\n\t\t\t\tassert(variable.type === ControlType.Image, \"Variable type must match control type\")\n\n\t\t\t\tif (isString(variable.initialValue) && isAssetReference(variable.initialValue)) {\n\t\t\t\t\timageAssetData = context.assetResolver.addImage(variable.initialValue, controlProp.alt)\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\timageAssetData = context.assetResolver.addImage(value, controlProp.alt)\n\t\t\t}\n\n\t\t\tfieldData[variableId] = { type: \"image\", value: imageAssetData }\n\t\t\tbreak\n\t\t}\n\n\t\tcase ControlType.Link: {\n\t\t\tassert(variable.type === ControlType.Link, \"Variable type must match control type\")\n\t\t\tlet value: Link | undefined = controlProp.value\n\n\t\t\tconst valueByLocale = getValueByLocale(\n\t\t\t\tcontext,\n\t\t\t\tcollectionNodeId,\n\t\t\t\tcollectionItemNode,\n\t\t\t\tvariable,\n\t\t\t\tcontrolProp,\n\t\t\t\tlocales,\n\t\t\t\tslugsByLocaleId,\n\t\t\t)\n\n\t\t\tif (!isLink(value)) {\n\t\t\t\tif (isString(variable.initialValue)) {\n\t\t\t\t\tfieldData[variableId] = {\n\t\t\t\t\t\ttype: \"link\",\n\t\t\t\t\t\tvalue: variable.initialValue,\n\t\t\t\t\t\tvalueByLocale,\n\t\t\t\t\t}\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tif (isLinkToURL(variable.initialValue) || isLinkToWebPage(variable.initialValue)) {\n\t\t\t\t\tvalue = variable.initialValue\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (isUndefined(value)) {\n\t\t\t\tfieldData[variableId] = {\n\t\t\t\t\ttype: \"link\",\n\t\t\t\t\tvalue: undefined,\n\t\t\t\t\tvalueByLocale,\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tconst url = resolveLinkToURL(context.engine.tree, value)\n\n\t\t\tif (!isString(url)) {\n\t\t\t\tfieldData[variableId] = {\n\t\t\t\t\ttype: \"link\",\n\t\t\t\t\tvalue: undefined,\n\t\t\t\t\tvalueByLocale,\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tfieldData[variableId] = {\n\t\t\t\ttype: \"link\",\n\t\t\t\tvalue: url,\n\t\t\t\tvalueByLocale,\n\t\t\t}\n\t\t\tbreak\n\t\t}\n\n\t\tcase ControlType.CollectionReference: {\n\t\t\tlet { value } = controlProp\n\t\t\tassert(variable.type === controlProp.type, \"Variable type must match control type\")\n\n\t\t\tif (isUndefined(value)) {\n\t\t\t\tvalue = variable.initialValue\n\t\t\t}\n\n\t\t\tconst referencedId = getCollectionItemCollectionReferenceValue(\n\t\t\t\tpluginManifestId,\n\t\t\t\tcontext,\n\t\t\t\tvariable,\n\t\t\t\tslugVariableByDataIdentifier,\n\t\t\t\tvalue,\n\t\t\t)\n\n\t\t\tif (!isString(referencedId)) {\n\t\t\t\tif (isUndefined(value)) {\n\t\t\t\t\tfieldData[variableId] = { type: \"collectionReference\", value: undefined }\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfieldData[variableId] = {\n\t\t\t\ttype: \"collectionReference\",\n\t\t\t\tvalue: referencedId,\n\t\t\t}\n\t\t\tbreak\n\t\t}\n\n\t\tcase ControlType.MultiCollectionReference: {\n\t\t\tlet { value } = controlProp\n\t\t\tassert(variable.type === controlProp.type, \"Variable type must match control type\")\n\n\t\t\tif (isUndefined(value)) {\n\t\t\t\tvalue = variable.initialValue\n\t\t\t}\n\n\t\t\tconst referencedIds = isUndefined(value)\n\t\t\t\t? []\n\t\t\t\t: value\n\t\t\t\t\t\t.map(internalId => {\n\t\t\t\t\t\t\treturn getCollectionItemCollectionReferenceValue(\n\t\t\t\t\t\t\t\tpluginManifestId,\n\t\t\t\t\t\t\t\tcontext,\n\t\t\t\t\t\t\t\tvariable,\n\t\t\t\t\t\t\t\tslugVariableByDataIdentifier,\n\t\t\t\t\t\t\t\tinternalId,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.filter(isDefined)\n\n\t\t\tfieldData[variableId] = {\n\t\t\t\ttype: \"multiCollectionReference\",\n\t\t\t\tvalue: referencedIds,\n\t\t\t}\n\t\t\tbreak\n\t\t}\n\n\t\tcase ControlType.Array: {\n\t\t\tconst arrayItems: ArrayItemSerializableData[] = []\n\t\t\tassert(variable.type === controlProp.type, \"Variable type must match control type\")\n\n\t\t\tfor (const item of controlProp.value) {\n\t\t\t\tassert(item.type === ControlType.Object, \"Item type must be object\")\n\t\t\t\tif (item.value === null) continue\n\n\t\t\t\tconst itemFieldData: FieldSerializableData = {}\n\n\t\t\t\tfor (const itemVariable of variable.itemVariables) {\n\t\t\t\t\tif (!isVariableDefinition(itemVariable)) continue\n\n\t\t\t\t\tconst itemFieldControlProp = item.value[itemVariable.id]\n\t\t\t\t\tif (!itemFieldControlProp) continue\n\t\t\t\t\tassert(\n\t\t\t\t\t\tisCollectionControlProp(itemFieldControlProp),\n\t\t\t\t\t\t\"Item field control prop must be a collection control prop\",\n\t\t\t\t\t)\n\n\t\t\t\t\tcollectFieldDataFromControlProp(\n\t\t\t\t\t\tpluginManifestId,\n\t\t\t\t\t\tcontext,\n\t\t\t\t\t\tcollectionNodeId,\n\t\t\t\t\t\tcollectionItemNode,\n\t\t\t\t\t\titemVariable,\n\t\t\t\t\t\titemFieldControlProp,\n\t\t\t\t\t\titemFieldData,\n\t\t\t\t\t\tslugVariableByDataIdentifier,\n\t\t\t\t\t\tlocales,\n\t\t\t\t\t\tslugsByLocaleId,\n\t\t\t\t\t)\n\n\t\t\t\t\tarrayItems.push({ id: item.id, fieldData: itemFieldData })\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfieldData[variableId] = { type: \"array\", value: arrayItems }\n\t\t\treturn\n\t\t}\n\n\t\tcase ControlType.Object:\n\t\tcase ControlType.VectorSetItem:\n\t\t\tbreak\n\n\t\tdefault:\n\t\t\tassertNever(controlProp)\n\t}\n}\n\nexport function migrateToApiV2CollectionItemData(item: CollectionItemSerializableData): ApiV2CollectionItemData {\n\tconst fieldData: ApiV2FieldData = {}\n\n\tfor (const variableId in item.fieldData) {\n\t\tconst value = item.fieldData[variableId]\n\t\tassert(isDefined(value), \"Value must be defined\")\n\n\t\tif (value.type === \"array\") continue\n\n\t\tfieldData[variableId] = value.value\n\t}\n\n\treturn {\n\t\t...item,\n\t\tfieldData,\n\t}\n}\n\n/**\n * Returns a serialized list of all the items from a collection, which can be\n * either a managed or unmanaged collection.\n * */\nexport function getCollectionItems(\n\tpluginManifestId: PluginManifestId,\n\tcontext: ActivePluginContext,\n\tcollection: CollectionNode,\n\tcollectionItems = collection.getUnsortedChildren(),\n): CollectionItemSerializableData[] {\n\tconst items: CollectionItemSerializableData[] = []\n\n\tconst slugVariable = collection.variables.find(isSlugVariableDefinition)\n\n\tconst locales = context.engine.tree.root.locales ?? []\n\tconst slugsByLocaleId = getCollectionSlugOccurrencesByLocaleId(locales, collection)\n\n\tconst slugVariableByDataIdentifier = arrayToMap(collection.variables, variable => {\n\t\tif (!isAnyCollectionReferencingVariableDefinition(variable)) return\n\n\t\tconst referencedCollection = getCollectionForIdentifier(context.engine.tree, variable.dataIdentifier)\n\t\tif (!referencedCollection) return\n\n\t\tconst referencedSlugVariable = referencedCollection.getSlugVariable()\n\t\tif (!referencedSlugVariable) return\n\n\t\treturn [variable.dataIdentifier, referencedSlugVariable]\n\t})\n\n\tfor (const collectionItem of collectionItems) {\n\t\tconst slugControlProp =\n\t\t\tslugVariable && isSlugVariableDefinition(slugVariable)\n\t\t\t\t? collectionItem.getControlProp(slugVariable?.id)\n\t\t\t\t: undefined\n\n\t\tconst slugByLocale = slugVariable\n\t\t\t? getValueByLocale(\n\t\t\t\t\tcontext,\n\t\t\t\t\tcollection.id,\n\t\t\t\t\tcollectionItem,\n\t\t\t\t\tslugVariable,\n\t\t\t\t\tslugControlProp,\n\t\t\t\t\tlocales,\n\t\t\t\t\tslugsByLocaleId,\n\t\t\t\t)\n\t\t\t: {}\n\n\t\tconst item: CollectionItemSerializableData = {\n\t\t\tid: collectionItem.externalId ?? collectionItem.id,\n\t\t\tnodeId: collectionItem.id,\n\t\t\texternalId: collectionItem.externalId,\n\t\t\tslug: isString(slugControlProp?.value) ? slugControlProp.value : \"\",\n\t\t\tslugByLocale,\n\t\t\tfieldData: {},\n\t\t}\n\n\t\tif (collectionItem.isDraft) {\n\t\t\titem.draft = true\n\t\t}\n\n\t\tfor (const variable of collection.variables) {\n\t\t\tif (!isVariableDefinition(variable)) continue\n\t\t\tif (slugVariable?.id === variable.id) continue\n\n\t\t\tconst controlProp = collectionItem.getControlProp(variable.id)\n\n\t\t\tcollectFieldDataFromControlProp(\n\t\t\t\tpluginManifestId,\n\t\t\t\tcontext,\n\t\t\t\tcollection.id,\n\t\t\t\tcollectionItem,\n\t\t\t\tvariable,\n\t\t\t\tisCollectionControlProp(controlProp) ? controlProp : undefined,\n\t\t\t\titem.fieldData,\n\t\t\t\tslugVariableByDataIdentifier,\n\t\t\t\tlocales,\n\t\t\t\tslugsByLocaleId,\n\t\t\t)\n\t\t}\n\n\t\titems.push(item)\n\t}\n\n\treturn items\n}\n\nfunction isCollectionItemInCollection(node: CanvasNode, collectionNodeId: string): node is CollectionItemNode {\n\treturn isCollectionItemNode(node) && node.parentid === collectionNodeId\n}\n\nfunction awaitAssetUpload(assetUploader: BatchAssetUploader, value: string): Promise<AssetUploadResult> {\n\treturn new Promise<AssetUploadResult>((resolve, reject) => {\n\t\tassetUploader\n\t\t\t.createTask(value, assetUploadResult => {\n\t\t\t\tresolve(assetUploadResult)\n\t\t\t})()\n\t\t\t.catch(error => reject(error))\n\t})\n}\n\nasync function getArrayControlPropForData(\n\tidForErrors: string,\n\tarrayItemInput: ArrayItemInput,\n\tvariable: ArrayVariableDefinition,\n\tassetUploader: BatchAssetUploader,\n\tengine: VekterEngine,\n\tareReferenceIdsPreVerified: boolean,\n): Promise<CollectionObjectControlProp & WithId> {\n\tconst arrayItemControlPropPromises: Promise<void>[] = []\n\tconst arrayItemObjectControlProps: CollectionObjectControlPropValue = {}\n\n\tfor (const itemVariable of variable.itemVariables) {\n\t\tif (!isVariableDefinition(itemVariable)) continue\n\n\t\tconst fieldDataEntryInput = arrayItemInput.fieldData?.[itemVariable.externalId ?? itemVariable.id]\n\t\tif (!fieldDataEntryInput) continue\n\n\t\tarrayItemControlPropPromises.push(\n\t\t\tgetControlPropForData(\n\t\t\t\tidForErrors,\n\t\t\t\titemVariable,\n\t\t\t\tfieldDataEntryInput,\n\t\t\t\tassetUploader,\n\t\t\t\tengine,\n\t\t\t\tareReferenceIdsPreVerified,\n\t\t\t).then(fieldControlProp => {\n\t\t\t\tif (fieldControlProp) {\n\t\t\t\t\tarrayItemObjectControlProps[itemVariable.id] = fieldControlProp\n\t\t\t\t}\n\t\t\t}),\n\t\t)\n\t}\n\n\tconst id = isUpdateArrayItem(arrayItemInput) ? arrayItemInput.id : randomID()\n\n\tawait Promise.all(arrayItemControlPropPromises)\n\n\treturn {\n\t\ttype: ControlType.Object,\n\t\tid,\n\t\tvalue: arrayItemObjectControlProps,\n\t}\n}\n\nasync function mapFieldDataInputToControlProp(\n\tidForErrors: string,\n\tvariable: VariableDefinition,\n\tvalue: FieldDataEntryInput,\n\tassetUploader: BatchAssetUploader,\n\tengine: VekterEngine,\n\tareReferenceIdsPreVerified: boolean,\n): Promise<CollectionControlProp | undefined> {\n\t// This is an internal error\n\tassert(isFieldVariableType(variable.type), \"Expected a field variable type\")\n\n\tif (isUndefined(value.value)) return\n\n\tswitch (value.type) {\n\t\tcase \"string\": {\n\t\t\treturn { type: ControlType.String, value: value.value }\n\t\t}\n\n\t\tcase \"number\": {\n\t\t\treturn { type: ControlType.Number, value: value.value }\n\t\t}\n\n\t\tcase \"boolean\": {\n\t\t\treturn { type: ControlType.Boolean, value: value.value }\n\t\t}\n\n\t\tcase \"date\": {\n\t\t\tif (isNull(value.value)) return { type: ControlType.Date, value: undefined }\n\n\t\t\tconst date = new Date(value.value)\n\t\t\tverifyForPlugin(isValidDate(date), `${idForErrors} - Invalid date for field: ${variable.name}`)\n\n\t\t\treturn { type: ControlType.Date, value: date.toJSON() }\n\t\t}\n\n\t\tcase \"enum\": {\n\t\t\tassert(variable.type === ControlType.Enum, \"Expected an enum variable\")\n\t\t\tconst matchingEnumCase = variable.cases.find(enumCase => enumCase.id === value.value)\n\n\t\t\tverifyForPlugin(\n\t\t\t\tmatchingEnumCase,\n\t\t\t\t`${idForErrors} - Expected a valid enum case, got: ${value}, for field: ${variable.name}`,\n\t\t\t)\n\n\t\t\treturn { type: ControlType.Enum, value: matchingEnumCase.id }\n\t\t}\n\n\t\tcase \"color\": {\n\t\t\treturn {\n\t\t\t\ttype: ControlType.Color,\n\t\t\t\tvalue: isNull(value.value) ? null : getSerializedColorFromColorValue(engine, value.value),\n\t\t\t}\n\t\t}\n\n\t\tcase \"link\": {\n\t\t\treturn {\n\t\t\t\ttype: ControlType.Link,\n\t\t\t\tvalue: isString(value.value) ? getVekterLinkFromURL(engine, value.value, null) : undefined,\n\t\t\t}\n\t\t}\n\n\t\tcase \"image\": {\n\t\t\tif (isNull(value.value) || value.value.length === 0) {\n\t\t\t\treturn { type: ControlType.Image, value: undefined }\n\t\t\t}\n\n\t\t\tverifyForPlugin(\n\t\t\t\t!isAssetReference(value.value),\n\t\t\t\t`${idForErrors} - Unexpected asset reference for field: ${variable.name}`,\n\t\t\t)\n\n\t\t\tconst uploadedImage = await awaitAssetUpload(assetUploader, value.value)\n\t\t\tverifyForPlugin(\n\t\t\t\tuploadedImage.type === \"image\",\n\t\t\t\t`Expected an image upload result for field: ${variable.name}, on item: ${idForErrors}`,\n\t\t\t)\n\n\t\t\treturn {\n\t\t\t\ttype: ControlType.Image,\n\t\t\t\tvalue: createAssetReferenceForUploadImageResult(uploadedImage),\n\t\t\t\talt: value.alt,\n\t\t\t}\n\t\t}\n\n\t\tcase \"formattedText\": {\n\t\t\ttry {\n\t\t\t\tif (isUndefined(value.value)) return\n\t\t\t\tconst contentType = value.contentType ?? \"html\"\n\t\t\t\tconst html = await convertPluginHTMLToCollectionHTML(engine, value.value, null, assetUploader, contentType)\n\t\t\t\treturn { type: ControlType.RichText, value: html }\n\t\t\t} catch {\n\t\t\t\tthrow new PluginOnlyError(\n\t\t\t\t\t`${idForErrors} - Failed to upload images in formatted text for field: ${variable.name}`,\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\n\t\tcase \"file\": {\n\t\t\tif (isNull(value.value) || value.value.length === 0) {\n\t\t\t\treturn { type: ControlType.File, value: undefined }\n\t\t\t}\n\n\t\t\tverifyForPlugin(\n\t\t\t\t!isAssetReference(value.value),\n\t\t\t\t`${idForErrors} - Unexpected asset reference for field: ${variable.name}`,\n\t\t\t)\n\n\t\t\tconst { filename, originalFilename } = await awaitAssetUpload(assetUploader, value.value)\n\t\t\treturn {\n\t\t\t\ttype: ControlType.File,\n\t\t\t\tvalue: createAssetReference(filename, null, originalFilename),\n\t\t\t}\n\t\t}\n\n\t\tcase \"collectionReference\": {\n\t\t\tassert(variable.type === ControlType.CollectionReference, \"Expected a collection reference variable\")\n\t\t\tif (value.value && areReferenceIdsPreVerified) {\n\t\t\t\treturn { type: ControlType.CollectionReference, value: value.value }\n\t\t\t}\n\n\t\t\tif (isNull(value.value)) {\n\t\t\t\treturn { type: ControlType.CollectionReference, value: undefined }\n\t\t\t}\n\n\t\t\tconst referencedCollection = getCollectionForIdentifier(engine.tree, variable.dataIdentifier)\n\t\t\tassert(referencedCollection)\n\n\t\t\tconst item = engine.tree.getNodeWithTrait(value.value, node =>\n\t\t\t\tisCollectionItemInCollection(node, referencedCollection.id),\n\t\t\t)\n\n\t\t\tverifyForPlugin(item, `${idForErrors} - Bad reference, ID: ${value.value}, field: ${variable.name}`)\n\n\t\t\treturn { type: ControlType.CollectionReference, value: value.value }\n\t\t}\n\n\t\tcase \"multiCollectionReference\": {\n\t\t\tif (isNull(value.value)) {\n\t\t\t\treturn { type: ControlType.MultiCollectionReference, value: undefined }\n\t\t\t}\n\n\t\t\tassert(variable.type === ControlType.MultiCollectionReference, \"Expected a multi collection reference variable\")\n\t\t\tconst referencedCollection = getCollectionForIdentifier(engine.tree, variable.dataIdentifier)\n\t\t\tassert(referencedCollection)\n\n\t\t\tconst newValue = value.value.map(valueItem => {\n\t\t\t\tif (areReferenceIdsPreVerified) {\n\t\t\t\t\treturn valueItem\n\t\t\t\t}\n\n\t\t\t\tconst item = engine.tree.getNodeWithTrait(valueItem, node =>\n\t\t\t\t\tisCollectionItemInCollection(node, referencedCollection.id),\n\t\t\t\t)\n\n\t\t\t\tverifyForPlugin(item, `${idForErrors} - Bad reference, ID: ${valueItem}, field: ${variable.name}`)\n\t\t\t\treturn valueItem\n\t\t\t})\n\n\t\t\treturn { type: ControlType.MultiCollectionReference, value: newValue }\n\t\t}\n\n\t\tcase \"array\": {\n\t\t\tassert(variable.type === ControlType.Array, \"Expected an array variable\")\n\n\t\t\tconst arrayItemControlProps = await Promise.all(\n\t\t\t\tvalue.value.map(arrayItemInput =>\n\t\t\t\t\tgetArrayControlPropForData(\n\t\t\t\t\t\tidForErrors,\n\t\t\t\t\t\tarrayItemInput,\n\t\t\t\t\t\tvariable,\n\t\t\t\t\t\tassetUploader,\n\t\t\t\t\t\tengine,\n\t\t\t\t\t\tareReferenceIdsPreVerified,\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t)\n\n\t\t\treturn {\n\t\t\t\ttype: ControlType.Array,\n\t\t\t\tvalue: arrayItemControlProps,\n\t\t\t}\n\t\t}\n\n\t\tdefault: {\n\t\t\tassertNever(value)\n\t\t}\n\t}\n}\n\nasync function getControlPropForData(\n\tidForErrors: string,\n\tvariable: VariableDefinition,\n\tvalue: FieldDataEntryInput,\n\tassetUploader: BatchAssetUploader,\n\tengine: VekterEngine,\n\tareReferenceIdsPreVerified: boolean,\n): Promise<CollectionControlProp | undefined> {\n\tconst controlProp = await mapFieldDataInputToControlProp(\n\t\tidForErrors,\n\t\tvariable,\n\t\tvalue,\n\t\tassetUploader,\n\t\tengine,\n\t\tareReferenceIdsPreVerified,\n\t)\n\n\tif (!controlProp) return\n\n\tif (variable.type !== controlProp.type) {\n\t\tconst fieldType = variableTypeToFieldType.get(variable.type)\n\t\tassert(fieldType, `Expected a field type for variable type ${variable.type}`)\n\n\t\tthrow new PluginOnlyError(`Expected a value of type \"${fieldType}\" but got \"${value.type}\" on item ${idForErrors}`)\n\t}\n\n\treturn controlProp\n}\n\nfunction preserveLocalizedValues(newControlProp: CollectionControlProp, existingControlProp: unknown) {\n\tif (!isRawControlProp(existingControlProp) || newControlProp.type !== existingControlProp.type) return\n\n\tfor (const propKey of Object.keys(existingControlProp) as (keyof CollectionControlProp)[]) {\n\t\tif (!isLocalizedControlPropKey(propKey)) continue\n\t\t;(newControlProp[propKey] as unknown) = existingControlProp[propKey]\n\t}\n}\n\ntype PreparedCollectionItemUpsertionTreeOperation<T extends NormalizedCollectionItemInput> =\n\t| { type: \"update\"; properties: Partial<Omit<CollectionItemNode, \"id\">>; nodeId: string }\n\t| { type: \"insert\"; properties: Partial<CollectionItemNode> & { id: string; externalId: T[\"externalId\"] } }\n\nexport async function prepareCollectionItemUpsertionTreeOperations<T extends NormalizedCollectionItemInput>(\n\tcollection: CollectionNode,\n\tslugVariable: SlugVariableDefinition,\n\tnormalizedInputItems: T[],\n\tassetUploader: BatchAssetUploader,\n\tengine: VekterEngine,\n\tareReferenceIdsPreVerified: boolean,\n): Promise<PreparedCollectionItemUpsertionTreeOperation<T>[]> {\n\tconst slugsById = arrayToMap(collection.getUnsortedChildren(), item => {\n\t\tconst slug = item.getControlProp(slugVariable.id)?.value\n\t\tassert(isString(slug), \"Expected slug to be a string\")\n\t\treturn [item.id, slug]\n\t})\n\n\tconst runningPreparedTreeOperationTasks = normalizedInputItems.map(\n\t\tasync (inputItem): Promise<PreparedCollectionItemUpsertionTreeOperation<T> | undefined> => {\n\t\t\tconst { id, idForErrors, externalId, existingItem, rawSlug, isDraft, fieldData } = inputItem\n\t\t\tconst controlProps: CollectionControlProps = {}\n\t\t\tconst controlPropPromises: Promise<void>[] = []\n\n\t\t\tif (isDefined(rawSlug)) {\n\t\t\t\tconst slug = slugify(rawSlug)\n\t\t\t\tverifyForPlugin(slug !== \"\", `${idForErrors} - Expected a non-empty string value for slug`)\n\t\t\t\tcontrolProps[prefixControlPropKey(slugVariable.id)] = { type: ControlType.String, value: slug }\n\t\t\t\tslugsById.set(id, slug) // Used for dupe detection later\n\t\t\t}\n\n\t\t\tfor (const { variable, value } of fieldData) {\n\t\t\t\tconst key = prefixControlPropKey(variable.id)\n\n\t\t\t\tcontrolPropPromises.push(\n\t\t\t\t\tgetControlPropForData(idForErrors, variable, value, assetUploader, engine, areReferenceIdsPreVerified).then(\n\t\t\t\t\t\tcontrolProp => {\n\t\t\t\t\t\t\tcontrolProps[key] = controlProp\n\t\t\t\t\t\t},\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t}\n\n\t\t\tawait Promise.all(controlPropPromises)\n\n\t\t\tif (existingItem) {\n\t\t\t\tconst update: Partial<CollectionItemNode> = {}\n\n\t\t\t\tfor (const variableKey of Object.keys(controlProps) as PrefixedControlPropKey[]) {\n\t\t\t\t\tconst newControlProp = controlProps[variableKey]\n\t\t\t\t\tassert(newControlProp, \"All control props are expected to be defined\")\n\n\t\t\t\t\tconst existingControlProp = existingItem[variableKey]\n\t\t\t\t\tpreserveLocalizedValues(newControlProp, existingControlProp)\n\n\t\t\t\t\tif (!isEqual(newControlProp, existingControlProp)) update[variableKey] = newControlProp\n\t\t\t\t}\n\n\t\t\t\tif (isDraft !== existingItem.isDraft) update.isDraft = isDraft\n\n\t\t\t\tif (!isEmptyObject(update)) return { type: \"update\", properties: update, nodeId: id } as const\n\t\t\t} else {\n\t\t\t\treturn {\n\t\t\t\t\ttype: \"insert\",\n\t\t\t\t\tproperties: { ...controlProps, id, externalId, isDraft },\n\t\t\t\t} as const\n\t\t\t}\n\t\t},\n\t)\n\n\tconst preparedTreeOperations = (await Promise.all(runningPreparedTreeOperationTasks)).filter(isDefined)\n\n\t// After the await as slugsById is populated in those promises\n\tif (slugsById.size !== new Set(slugsById.values()).size) {\n\t\t// Doing this work twice because the condition above is faster, and we\n\t\t// don't care about unhappy path performance. This is done here and not\n\t\t// during the main loop because it's tricky to keep track of both\n\t\t// inserts and updates, easier in a second pass.\n\n\t\tconst seenSlugs = new Set()\n\t\tfor (const slug of slugsById.values()) {\n\t\t\tif (seenSlugs.has(slug)) throw new PluginOnlyError(`Duplicate slug: ${slug}`)\n\t\t\tseenSlugs.add(slug)\n\t\t}\n\n\t\tthrow new Error(\"Detected duplicate slug but could not find it\")\n\t}\n\n\treturn preparedTreeOperations\n}\n\nexport function normalizeUnmanagedCollectionItemInputs(\n\tcollection: UnmanagedCollectionNode,\n\tinputItems: DeepReadonly<(CollectionItemInput | ApiV2CollectionItemInput)[]>,\n\tengine: VekterEngine,\n): OmitEvery<NormalizedCollectionItemInput, \"externalId\">[] {\n\tconst variablesById = arrayToMap(collection.variables, variable => {\n\t\tif (isVariableDefinition(variable)) return [variable.id, variable]\n\t})\n\n\tconst normalizedInputItems = inputItems.map((inputItem, index): NormalizedCollectionItemInput => {\n\t\tconst { id, slug: rawSlug, draft, fieldData: originalFieldData } = inputItem\n\t\tconst idForErrors = serializeForError({ index, id, slug: rawSlug })\n\t\tconst isDraft = Boolean(draft) || undefined\n\n\t\tconst fieldData: NormalizedCollectionItemInput[\"fieldData\"] = []\n\n\t\tif (originalFieldData) {\n\t\t\tfor (const variableId of Object.keys(originalFieldData)) {\n\t\t\t\tconst variable = variablesById.get(variableId)\n\t\t\t\tverifyForPlugin(variable, `${idForErrors} - Field not found for key: ${variableId}`)\n\n\t\t\t\tconst data = originalFieldData[variableId]\n\t\t\t\tassert(isDefined(data), `${idForErrors} - Expected a value for field: ${variable.name}`)\n\n\t\t\t\tconst value = !isFieldDataEntryInput(data)\n\t\t\t\t\t? unknownFieldDataToAnyFieldDataEntryInput(idForErrors, data, variable)\n\t\t\t\t\t: data\n\n\t\t\t\tfieldData.push({ variable, value })\n\t\t\t}\n\t\t}\n\n\t\tconst slugByLocaleValue = isApiV3CollectionItemInput(inputItem) ? inputItem.slugByLocale : undefined\n\t\tconst slugVariable = collection.variables.find(isSlugVariableDefinition)\n\t\tassert(slugVariable, \"Slug variable must exist\")\n\t\tconst slugByLocale = slugByLocaleValue ? { variable: slugVariable, value: slugByLocaleValue } : undefined\n\n\t\tconst statusByLocale =\n\t\t\tisApiV3CollectionItemInput(inputItem) && inputItem.statusByLocale ? inputItem.statusByLocale : undefined\n\n\t\tconst baseNormalizedItem = {\n\t\t\tidForErrors,\n\t\t\tisDraft,\n\t\t\tfieldData,\n\t\t\tslugByLocale,\n\t\t\tstatusByLocale,\n\t\t}\n\n\t\tif (isDefined(id)) {\n\t\t\tconst existingItem = engine.tree.getNodeWithTrait(id, node => isCollectionItemInCollection(node, collection.id))\n\n\t\t\tverifyForPlugin(existingItem, `${idForErrors} - No item found with ID ${id}`)\n\n\t\t\treturn {\n\t\t\t\tid,\n\t\t\t\trawSlug,\n\t\t\t\texistingItem,\n\t\t\t\t...baseNormalizedItem,\n\t\t\t}\n\t\t}\n\n\t\t// Expected to be covered by input validation\n\t\tassert(isDefined(rawSlug), `${idForErrors} - Slugs are required in to-be-added items`)\n\n\t\treturn {\n\t\t\tid: randomID(),\n\t\t\trawSlug,\n\t\t\t...baseNormalizedItem,\n\t\t}\n\t})\n\n\treturn normalizedInputItems\n}\n\nexport function normalizeManagedCollectionItemInputs(\n\tcollection: ManagedCollectionNode,\n\tinputItems: DeepReadonly<(ApiV2ManagedCollectionItemInput | ManagedCollectionItemInput)[]>,\n\tengine: VekterEngine,\n): (NormalizedCollectionItemInput & { externalId: string })[] {\n\tconst existingItemsByExternalId = arrayToMap(collection.getUnsortedChildren(), item => {\n\t\tassert(isDefined(item.externalId), \"Expected the item to have an external ID\")\n\t\treturn [item.externalId, item]\n\t})\n\n\tconst externalIdsById = arrayToMap(collection.getUnsortedChildren(), item => {\n\t\tassert(isDefined(item.externalId), \"Expected the item to have an external ID\")\n\t\treturn [item.id, item.externalId]\n\t})\n\n\tconst variablesByExternalId = getCollectionVariablesByExternalId(collection)\n\n\tconst normalizedInputItems = inputItems.map(\n\t\t(inputItem, index): NormalizedCollectionItemInput & { externalId: string } => {\n\t\t\tconst { id: externalId, slug: rawSlug, draft, fieldData: originalFieldData } = inputItem\n\t\t\tconst idForErrors = serializeForError({ index, id: externalId, slug: rawSlug })\n\n\t\t\tverifyForPlugin(isDefined(externalId), `${idForErrors} - Each item must have an ID`)\n\t\t\tverifyExternalPluginCollectionItemId(externalId, \"collection item\", `${idForErrors} - `)\n\n\t\t\tconst existingItem = existingItemsByExternalId.get(externalId)\n\t\t\tconst isDraft = Boolean(draft) || undefined\n\n\t\t\tconst fieldData: NormalizedCollectionItemInput[\"fieldData\"] = []\n\n\t\t\tif (originalFieldData) {\n\t\t\t\tfor (const variableExternalId of Object.keys(originalFieldData)) {\n\t\t\t\t\tconst variable = variablesByExternalId.get(variableExternalId)\n\t\t\t\t\tverifyForPlugin(variable, `${idForErrors} - Field not found for key: ${variableExternalId}`)\n\t\t\t\t\tif (variable.userEditable) continue\n\n\t\t\t\t\tconst data = originalFieldData[variableExternalId]\n\t\t\t\t\tassert(isDefined(data), `${idForErrors} - Expected a value for field: ${variable.name}`)\n\n\t\t\t\t\tconst value = !isFieldDataEntryInput(data)\n\t\t\t\t\t\t? unknownFieldDataToAnyFieldDataEntryInput(idForErrors, data, variable)\n\t\t\t\t\t\t: data\n\n\t\t\t\t\tfieldData.push({ variable, value })\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst slugByLocaleValue = isApiV3ManagedCollectionItemInput(inputItem) ? inputItem.slugByLocale : undefined\n\t\t\tconst slugVariable = collection.variables.find(isSlugVariableDefinition)\n\t\t\tassert(slugVariable, \"Slug variable must exist\")\n\t\t\tconst slugByLocale = slugByLocaleValue ? { variable: slugVariable, value: slugByLocaleValue } : undefined\n\n\t\t\tconst statusByLocale =\n\t\t\t\tisApiV3ManagedCollectionItemInput(inputItem) && inputItem.statusByLocale ? inputItem.statusByLocale : undefined\n\n\t\t\tconst baseNormalizedItem = {\n\t\t\t\tidForErrors,\n\t\t\t\texternalId,\n\t\t\t\trawSlug,\n\t\t\t\tisDraft,\n\t\t\t\tslugByLocale,\n\t\t\t\tfieldData,\n\t\t\t\tstatusByLocale,\n\t\t\t}\n\n\t\t\tif (existingItem) {\n\t\t\t\t// Used for dupe detection later\n\t\t\t\texternalIdsById.set(existingItem.id, externalId)\n\n\t\t\t\treturn {\n\t\t\t\t\tid: existingItem.id,\n\t\t\t\t\texistingItem,\n\t\t\t\t\t...baseNormalizedItem,\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst id = randomID()\n\t\t\texternalIdsById.set(id, externalId)\n\n\t\t\treturn {\n\t\t\t\tid,\n\t\t\t\t...baseNormalizedItem,\n\t\t\t}\n\t\t},\n\t)\n\n\t// See \"slugsById\" in \"prepareCollectionItemUpsertionTreeOperations\" for details\n\tif (externalIdsById.size !== new Set(externalIdsById.values()).size) {\n\t\tconst seenExternalIds = new Set()\n\t\tfor (const externalId of externalIdsById.values()) {\n\t\t\tif (seenExternalIds.has(externalId)) {\n\t\t\t\t// Not filtering out the dupes, to help troubleshoot\n\t\t\t\tconst offendingSlugs = normalizedInputItems\n\t\t\t\t\t.filter(item => item.externalId === externalId)\n\t\t\t\t\t.map(item => item.rawSlug)\n\t\t\t\t\t.join(\", \")\n\n\t\t\t\tthrow new PluginOnlyError(`Duplicate ID: ${externalId} (${offendingSlugs})`)\n\t\t\t}\n\n\t\t\tseenExternalIds.add(externalId)\n\t\t}\n\n\t\tthrow new Error(\"Detected duplicate external ID but could not find it\")\n\t}\n\n\tconst enumCaseIdsByExternalId = new Map<ReturnType<typeof joinForLookup>, string>()\n\tconst targetItemIdsByExternalId = new Map<\n\t\tReturnType<typeof joinForLookup<ModuleExportIdentifierString, string>>,\n\t\tstring\n\t>()\n\n\tfor (const variable of collection.variables) {\n\t\tif (variable.type === ControlType.Enum) {\n\t\t\tfor (const enumCase of variable.cases) {\n\t\t\t\tassert(isDefined(enumCase.externalId), \"Enum cases must have external ID\")\n\t\t\t\tenumCaseIdsByExternalId.set(joinForLookup(variable.id, enumCase.externalId), enumCase.id)\n\t\t\t}\n\t\t} else if (isAnyCollectionReferencingVariableDefinition(variable)) {\n\t\t\tconst targetCollection = getCollectionForIdentifier(engine.tree, variable.dataIdentifier)\n\t\t\tassert(targetCollection, \"Collection node should exist\")\n\n\t\t\t// Using variable.dataIdentifier rather than variable.id because\n\t\t\t// it'll use less memory if there are multiple variables referencing\n\t\t\t// the same collection.\n\n\t\t\tfor (const targetItem of targetCollection.getUnsortedChildren()) {\n\t\t\t\tassert(isDefined(targetItem.externalId), \"Referenced collection items must have external ID\")\n\t\t\t\ttargetItemIdsByExternalId.set(joinForLookup(variable.dataIdentifier, targetItem.externalId), targetItem.id)\n\t\t\t}\n\n\t\t\t// If self-referential, also populate with to-be-inserted items\n\t\t\tif (targetCollection === collection) {\n\t\t\t\tfor (const targetItem of normalizedInputItems) {\n\t\t\t\t\tif (targetItem.existingItem) continue // It's an update\n\t\t\t\t\ttargetItemIdsByExternalId.set(joinForLookup(variable.dataIdentifier, targetItem.externalId), targetItem.id)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tfor (const normalizedInputItem of normalizedInputItems) {\n\t\tconst { idForErrors } = normalizedInputItem\n\n\t\tnormalizedInputItem.fieldData = normalizedInputItem.fieldData.map(\n\t\t\t(fieldDataItem): { variable: VariableDefinition; value: FieldDataEntryInput } => {\n\t\t\t\tconst { variable, value } = fieldDataItem\n\n\t\t\t\t// Using \"return\" rather than throwing as it's\n\t\t\t\t// collectControlPropForData's job to validate.\n\n\t\t\t\tswitch (value.type) {\n\t\t\t\t\tcase \"enum\": {\n\t\t\t\t\t\tconst caseId = enumCaseIdsByExternalId.get(joinForLookup(variable.id, value.value))\n\n\t\t\t\t\t\tassert(\n\t\t\t\t\t\t\tisDefined(caseId),\n\t\t\t\t\t\t\t`${idForErrors} - Expected a valid enum case, got: ${value}, for field: ${variable.name}`,\n\t\t\t\t\t\t)\n\n\t\t\t\t\t\treturn { variable, value: { ...value, value: caseId } }\n\t\t\t\t\t}\n\n\t\t\t\t\tcase \"collectionReference\": {\n\t\t\t\t\t\tassert(variable.type === ControlType.CollectionReference, \"Variable type must match control type\")\n\n\t\t\t\t\t\tlet referencedId: string | null = null\n\n\t\t\t\t\t\tif (isString(value.value)) {\n\t\t\t\t\t\t\tconst targetItemId = targetItemIdsByExternalId.get(joinForLookup(variable.dataIdentifier, value.value))\n\t\t\t\t\t\t\tif (targetItemId) {\n\t\t\t\t\t\t\t\treferencedId = targetItemId\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn { variable, value: { ...value, value: referencedId } }\n\t\t\t\t\t}\n\n\t\t\t\t\tcase \"multiCollectionReference\": {\n\t\t\t\t\t\tassert(variable.type === ControlType.MultiCollectionReference, \"Variable type must match control type\")\n\t\t\t\t\t\tconst referencedIds = isNull(value.value)\n\t\t\t\t\t\t\t? null\n\t\t\t\t\t\t\t: value.value\n\t\t\t\t\t\t\t\t\t.map(referencedExternalId => {\n\t\t\t\t\t\t\t\t\t\tconst referencedId = targetItemIdsByExternalId.get(\n\t\t\t\t\t\t\t\t\t\t\tjoinForLookup(variable.dataIdentifier, referencedExternalId),\n\t\t\t\t\t\t\t\t\t\t)\n\n\t\t\t\t\t\t\t\t\t\treturn referencedId\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t// Drop bad references\n\t\t\t\t\t\t\t\t\t.filter(isDefined)\n\n\t\t\t\t\t\treturn { variable, value: { ...value, value: referencedIds } }\n\t\t\t\t\t}\n\n\t\t\t\t\tdefault: {\n\t\t\t\t\t\treturn fieldDataItem\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t)\n\t}\n\n\treturn normalizedInputItems\n}\n\n/**\n * Returns the collection node assuming the user is in the CMS view. Either viewing all items or\n * viewing a single selected collection item. If no collection is selected, returns null.\n */\nexport function getCollectionNodeFromSelection(engine: VekterEngine): CollectionNode | null {\n\tconst nodes = engine.stores.selectionStore.nodes\n\tconst node = nodes[0]\n\tif (!node) return null\n\n\tif (isCollectionNode(node)) {\n\t\treturn node\n\t}\n\tif (isCollectionItemNode(node)) {\n\t\tconst parentNode = engine.tree.getParent(node.id)\n\t\tassert(isCollectionNode(parentNode), \"Expected parent of collection item to be a collection\")\n\n\t\treturn parentNode\n\t}\n\treturn null\n}\n\nexport const variableTypeToFieldType = new Map(\n\tObject.entries({\n\t\t[ControlType.String]: \"string\",\n\t\t[ControlType.RichText]: \"formattedText\",\n\t\t[ControlType.Number]: \"number\",\n\t\t[ControlType.Boolean]: \"boolean\",\n\t\t[ControlType.Date]: \"date\",\n\t\t[ControlType.Enum]: \"enum\",\n\t\t[ControlType.Color]: \"color\",\n\t\t[ControlType.Image]: \"image\",\n\t\t[ControlType.Link]: \"link\",\n\t\t[ControlType.File]: \"file\",\n\t\t[ControlType.CollectionReference]: \"collectionReference\",\n\t\t[ControlType.MultiCollectionReference]: \"multiCollectionReference\",\n\t\tdivider: \"divider\",\n\t\t[ControlType.Array]: \"array\",\n\t} satisfies Record<FieldVariableType | \"divider\", UpdateField[\"type\"]>),\n)\n\ntype KeysOfUnion<T> = T extends unknown ? keyof T : never\n\nexport function fieldFileTypesToVariableFileTypes(fileTypes: string[]): FileVariableExtension[] {\n\treturn fileTypes.map(extension => ({ id: randomID(), extension }))\n}\n\nfunction createFieldToVariableDefinition(\n\tfield: CreateField,\n\tengine: VekterEngine,\n\tpluginManifestId: PluginManifestId,\n\tpluginMode: Mode,\n): VariableOrDivider<CollectionVariableDefinition> {\n\tswitch (field.type) {\n\t\tcase \"boolean\": {\n\t\t\treturn createVariable(\n\t\t\t\t{\n\t\t\t\t\ttype: ControlType.Boolean,\n\t\t\t\t\tname: field.name,\n\t\t\t\t\tinitialValue: getFallbackValue(ControlType.Boolean),\n\t\t\t\t},\n\t\t\t\t\"collection\",\n\t\t\t)\n\t\t}\n\t\tcase \"color\": {\n\t\t\treturn createVariable(\n\t\t\t\t{\n\t\t\t\t\ttype: ControlType.Color,\n\t\t\t\t\tname: field.name,\n\t\t\t\t\tinitialValue: getFallbackValue(ControlType.Color),\n\t\t\t\t},\n\t\t\t\t\"collection\",\n\t\t\t)\n\t\t}\n\t\tcase \"number\": {\n\t\t\treturn createVariable(\n\t\t\t\t{\n\t\t\t\t\ttype: ControlType.Number,\n\t\t\t\t\tname: field.name,\n\t\t\t\t\tinitialValue: getFallbackValue(ControlType.Number),\n\t\t\t\t},\n\t\t\t\t\"collection\",\n\t\t\t)\n\t\t}\n\t\tcase \"string\": {\n\t\t\treturn createVariable(\n\t\t\t\t{\n\t\t\t\t\ttype: ControlType.String,\n\t\t\t\t\tname: field.name,\n\t\t\t\t\tinitialValue: getFallbackValue(ControlType.String),\n\t\t\t\t\trequired: field.required === true,\n\t\t\t\t},\n\t\t\t\t\"collection\",\n\t\t\t)\n\t\t}\n\t\tcase \"formattedText\": {\n\t\t\treturn createVariable(\n\t\t\t\t{\n\t\t\t\t\ttype: ControlType.RichText,\n\t\t\t\t\tname: field.name,\n\t\t\t\t\tinitialValue: getFallbackValue(ControlType.RichText),\n\t\t\t\t\trequired: field.required === true,\n\t\t\t\t},\n\t\t\t\t\"collection\",\n\t\t\t)\n\t\t}\n\t\tcase \"date\": {\n\t\t\treturn createVariable(\n\t\t\t\t{\n\t\t\t\t\ttype: ControlType.Date,\n\t\t\t\t\tname: field.name,\n\t\t\t\t\tinitialValue: getFallbackValue(ControlType.Date),\n\t\t\t\t\trequired: field.required === true,\n\t\t\t\t\toptions: field.displayTime !== undefined ? { displayTime: field.displayTime } : undefined,\n\t\t\t\t},\n\t\t\t\t\"collection\",\n\t\t\t)\n\t\t}\n\t\tcase \"enum\": {\n\t\t\tverifyForPlugin(field.cases.length > 0, \"Enums must have at least 1 case\")\n\n\t\t\treturn createVariable(\n\t\t\t\t{\n\t\t\t\t\ttype: ControlType.Enum,\n\t\t\t\t\tname: field.name,\n\t\t\t\t\tinitialValue: getFallbackValue(ControlType.Enum),\n\t\t\t\t\tcases: field.cases.map(caseOption => {\n\t\t\t\t\t\tconst nameLocalized = getEnumCaseNameLocalized(\n\t\t\t\t\t\t\tengine.tree,\n\t\t\t\t\t\t\tpluginManifestId,\n\t\t\t\t\t\t\tpluginMode,\n\t\t\t\t\t\t\tcaseOption.name,\n\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\tcaseOption.nameByLocale,\n\t\t\t\t\t\t)\n\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tid: randomID(),\n\t\t\t\t\t\t\tname: caseOption.name,\n\t\t\t\t\t\t\tnameLocalized,\n\t\t\t\t\t\t}\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t\t\"collection\",\n\t\t\t)\n\t\t}\n\t\tcase \"file\": {\n\t\t\treturn createVariable(\n\t\t\t\t{\n\t\t\t\t\ttype: ControlType.File,\n\t\t\t\t\tname: field.name,\n\t\t\t\t\tinitialValue: getFallbackValue(ControlType.File),\n\t\t\t\t\tallowedFileTypes: fieldFileTypesToVariableFileTypes(field.allowedFileTypes),\n\t\t\t\t\trequired: field.required === true,\n\t\t\t\t},\n\t\t\t\t\"collection\",\n\t\t\t)\n\t\t}\n\t\tcase \"image\": {\n\t\t\treturn createVariable(\n\t\t\t\t{\n\t\t\t\t\ttype: ControlType.Image,\n\t\t\t\t\tname: field.name,\n\t\t\t\t\tinitialValue: getFallbackValue(ControlType.Image),\n\t\t\t\t\trequired: field.required === true,\n\t\t\t\t},\n\t\t\t\t\"collection\",\n\t\t\t)\n\t\t}\n\t\tcase \"link\": {\n\t\t\treturn createVariable(\n\t\t\t\t{\n\t\t\t\t\ttype: ControlType.Link,\n\t\t\t\t\tname: field.name,\n\t\t\t\t\tinitialValue: getFallbackValue(ControlType.Link),\n\t\t\t\t\trequired: field.required === true,\n\t\t\t\t},\n\t\t\t\t\"collection\",\n\t\t\t)\n\t\t}\n\t\tcase \"collectionReference\":\n\t\tcase \"multiCollectionReference\": {\n\t\t\tconst referencedCollection = engine.tree.get(field.collectionId)\n\n\t\t\tverifyForPlugin(\n\t\t\t\tisCollectionNode(referencedCollection),\n\t\t\t\t`Referenced collection with ID ${field.collectionId} cannot be found`,\n\t\t\t)\n\n\t\t\tconst variableDefinition = createVariable(\n\t\t\t\t{\n\t\t\t\t\ttype:\n\t\t\t\t\t\tfield.type === \"collectionReference\"\n\t\t\t\t\t\t\t? ControlType.CollectionReference\n\t\t\t\t\t\t\t: ControlType.MultiCollectionReference,\n\t\t\t\t\tname: field.name,\n\t\t\t\t\tinitialValue:\n\t\t\t\t\t\tfield.type === \"collectionReference\"\n\t\t\t\t\t\t\t? getFallbackValue(ControlType.CollectionReference)\n\t\t\t\t\t\t\t: getFallbackValue(ControlType.MultiCollectionReference),\n\t\t\t\t\tdataIdentifier: referencedCollection.instanceIdentifier,\n\t\t\t\t\trequired: field.required === true,\n\t\t\t\t},\n\t\t\t\t\"collection\",\n\t\t\t)\n\t\t\tassert(isCollectionVariableDefinition(variableDefinition), \"Expected a collection variable definition\")\n\t\t\treturn variableDefinition\n\t\t}\n\n\t\tcase \"array\": {\n\t\t\treturn createVariable(\n\t\t\t\t{\n\t\t\t\t\ttype: ControlType.Array,\n\t\t\t\t\tname: field.name,\n\t\t\t\t\tinitialValue: getFallbackValue(ControlType.Array),\n\t\t\t\t\trequired: field.required === true,\n\t\t\t\t\titemVariables: field.fields.map(itemField => {\n\t\t\t\t\t\tconst variable = createFieldToVariableDefinition(itemField, engine, pluginManifestId, pluginMode)\n\t\t\t\t\t\tassert(isArrayItemVariableDefinition(variable), \"Expected array item variable definition\")\n\t\t\t\t\t\treturn variable\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t\t\"collection\",\n\t\t\t)\n\t\t}\n\n\t\tcase \"divider\": {\n\t\t\treturn {\n\t\t\t\ttype: \"divider\",\n\t\t\t\tid: randomID(),\n\t\t\t\tname: field.name,\n\t\t\t}\n\t\t}\n\t\tdefault:\n\t\t\treturn assertNever(field)\n\t}\n}\n\nexport function upsertCollectionFields(\n\tpluginManifestId: PluginManifestId,\n\tpluginMode: Mode,\n\tcollection: CollectionNode,\n\tfields: FieldInput[],\n\tengine: VekterEngine,\n): {\n\tvariables: VariablesAndDividers<CollectionVariableDefinition>\n\tupsertedVariables: (VariableOrDivider<CollectionVariableDefinition> | null)[]\n} {\n\tconst upsertedVariableIndices: (number | null)[] = []\n\n\tconst variables = produce(collection.variables, draft => {\n\t\tconst variableIndexById = arrayToMap(draft, (variable, index) => [variable.id, index])\n\t\tfor (const field of fields) {\n\t\t\t// If the id is included we are updating an existing variable\n\t\t\tif (\"id\" in field) {\n\t\t\t\tconst variableIndex = variableIndexById.get(field.id)\n\t\t\t\tif (!isDefined(variableIndex)) {\n\t\t\t\t\t// We don't know if it was just removed or never existed, so we don't throw\n\t\t\t\t\tupsertedVariableIndices.push(null)\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\tconst variable = draft[variableIndex]\n\t\t\t\tassert(isDefined(variable))\n\n\t\t\t\tconst expectedFieldType = variableTypeToFieldType.get(variable.type)\n\t\t\t\tif (!isDefined(expectedFieldType)) {\n\t\t\t\t\t// To be consistent with the early continue above\n\t\t\t\t\tupsertedVariableIndices.push(null)\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\tupsertedVariableIndices.push(variableIndex)\n\n\t\t\t\t// Done here and not in the cases where actually needed as to catch bugs early and\n\t\t\t\t// not allow, e.g., rename a boolean via a string-oriented update.\n\t\t\t\tverifyForPlugin(\n\t\t\t\t\tfield.type === expectedFieldType,\n\t\t\t\t\t`Field ${variable.name} type mismatch, expected ${expectedFieldType}, got ${field.type}`,\n\t\t\t\t)\n\n\t\t\t\tconst properties = Object.keys(field) as KeysOfUnion<typeof field>[]\n\t\t\t\tfor (const property of properties) {\n\t\t\t\t\tswitch (property) {\n\t\t\t\t\t\tcase \"id\":\n\t\t\t\t\t\tcase \"type\": {\n\t\t\t\t\t\t\tcontinue\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcase \"name\": {\n\t\t\t\t\t\t\tif (!isDefined(field.name)) continue\n\n\t\t\t\t\t\t\tvariable.name = field.name\n\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcase \"allowedFileTypes\": {\n\t\t\t\t\t\t\tif (field.type !== \"file\") continue\n\t\t\t\t\t\t\tif (!isDefined(field.allowedFileTypes)) continue\n\n\t\t\t\t\t\t\t// verifyForPlugin above doesn't narrow, as TS doesn't do correlated unions\n\t\t\t\t\t\t\tassert(variable.type === ControlType.File)\n\n\t\t\t\t\t\t\tvariable.allowedFileTypes = fieldFileTypesToVariableFileTypes(field.allowedFileTypes)\n\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcase \"required\": {\n\t\t\t\t\t\t\tif (!withRequired(variable)) continue\n\t\t\t\t\t\t\tif (!(\"required\" in field)) continue\n\t\t\t\t\t\t\tif (!isBoolean(field.required)) continue\n\n\t\t\t\t\t\t\tvariable.required = field.required\n\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcase \"fields\": {\n\t\t\t\t\t\t\tif (field.type !== \"array\") continue\n\t\t\t\t\t\t\tif (!isDefined(field.fields)) continue\n\n\t\t\t\t\t\t\tassert(variable.type === ControlType.Array)\n\t\t\t\t\t\t\tconst itemVariables = field.fields.map(itemField => {\n\t\t\t\t\t\t\t\tconst itemFieldVariable = createFieldToVariableDefinition(\n\t\t\t\t\t\t\t\t\titemField,\n\t\t\t\t\t\t\t\t\tengine,\n\t\t\t\t\t\t\t\t\tpluginManifestId,\n\t\t\t\t\t\t\t\t\tpluginMode,\n\t\t\t\t\t\t\t\t)\n\n\t\t\t\t\t\t\t\tassert(isArrayItemVariableDefinition(itemFieldVariable), \"Invalid array item variable\")\n\n\t\t\t\t\t\t\t\treturn itemFieldVariable\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\tvariable.itemVariables = castDraft(itemVariables)\n\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcase \"contentType\": {\n\t\t\t\t\t\t\tif (variable.type !== ControlType.RichText) continue\n\t\t\t\t\t\t\tif (!(\"contentType\" in field)) continue\n\t\t\t\t\t\t\tif (!isDefined(field.contentType)) continue\n\n\t\t\t\t\t\t\tvariable.contentType = field.contentType\n\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcase \"displayTime\": {\n\t\t\t\t\t\t\tif (field.type !== \"date\") continue\n\t\t\t\t\t\t\tif (!(\"displayTime\" in field)) continue\n\t\t\t\t\t\t\tif (!isBoolean(field.displayTime) && !isUndefined(field.displayTime)) continue\n\n\t\t\t\t\t\t\tassert(variable.type === ControlType.Date)\n\t\t\t\t\t\t\tvariable.options = { ...variable.options, displayTime: field.displayTime }\n\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tdefault: {\n\t\t\t\t\t\t\t// Not throwing because this is for us to remember to process all\n\t\t\t\t\t\t\t// properties, not to validate anything.\n\t\t\t\t\t\t\tproperty satisfies never\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst newVariable = createFieldToVariableDefinition(field, engine, pluginManifestId, pluginMode)\n\t\t\t\tdraft.push(castDraft(newVariable))\n\n\t\t\t\tupsertedVariableIndices.push(draft.length - 1)\n\t\t\t}\n\t\t}\n\t})\n\n\tassert(upsertedVariableIndices.length === fields.length)\n\n\t// Collecting indices instead of variables because there can be more than one update, and we'd\n\t// be returning a \"stale\" version of a variable for the updates that aren't the very last one.\n\tconst upsertedVariables = upsertedVariableIndices.map(index => {\n\t\tif (isNull(index)) return null\n\t\tconst variable = variables[index]\n\t\tassert(variable)\n\t\treturn variable\n\t})\n\n\treturn { variables, upsertedVariables }\n}\n", "import type { ModulesAPI } from \"@framerjs/framer-services\"\nimport { apiFetcher } from \"web/lib/apiFetcher.ts\"\n\n/**\n * Fetches save history for a module.\n */\nexport async function fetchSaves(moduleId: string): Promise<ModulesAPI.Save[] | undefined> {\n\tconst result = await apiFetcher.get(`/modules/v1/modules/${moduleId}/saves/`)\n\treturn result?.data\n}\n\n/**\n * Fetches the content of a module.\n */\nexport async function getModuleContent(baseURL: string, name: string): Promise<string> {\n\tconst response = await fetch(`${baseURL}${name}`)\n\tif (!response.ok) {\n\t\tthrow new Error(`Failed to fetch module content: ${response.status} ${response.statusText}`)\n\t}\n\treturn response.text()\n}\n\n/**\n * Fetches a save for a module.\n */\nexport async function fetchSaveForModule(moduleId: string, versionId: string): Promise<ModulesAPI.Save | undefined> {\n\tconst result = await apiFetcher.get(`/modules/v1/modules/${moduleId}/saves/${versionId}`)\n\treturn result\n}\n", "import type { Immutable } from \"@framerjs/app-shared/src/lib/immer.ts\"\nimport { assert, type LocalModuleId, ModuleType } from \"@framerjs/shared\"\nimport { sanitizeFilePath } from \"code-editor/utils.ts\"\nimport type { ModulesStore } from \"document/stores/ModulesStore.ts\"\nimport type { ModuleEntry } from \"modules/ModulesStorage.ts\"\nimport { getUniquePath } from \"utils/codeFiles.ts\"\nimport { tsExtension } from \"utils/fileExtensionNames.ts\"\n\nexport function normalizeShaderFilePath(input: string): string {\n\tconst { path, extension } = sanitizeFilePath(input, false)\n\tif (extension === tsExtension) return path\n\n\tlet basePath = path\n\tif (extension) basePath = path.slice(0, path.length - extension.length)\n\treturn basePath + tsExtension\n}\n\nexport function createShaderFile(rawName: string) {\n\tconst name = normalizeShaderFilePath(rawName || \"MyShader\")\n\tconst content = getDefaultShaderSource()\n\treturn { name, content }\n}\n\nexport async function createShaderModule(\n\tmodulesStore: ModulesStore,\n\tpath: string,\n\tsource: string,\n): Promise<Immutable<ModuleEntry>> {\n\tconst uniquePath = getUniquePath(modulesStore, path)\n\n\tconst localId = await modulesStore.forType(ModuleType.Shader).create({\n\t\tname: uniquePath,\n\t\tsource,\n\t})\n\n\tconst entry = modulesStore.getModuleEntryByLocalId(localId)\n\tassert(entry, \"Module entry for shader not found\", localId)\n\treturn entry\n}\n\nexport async function deleteShaderModule(modulesStore: ModulesStore, localId: LocalModuleId): Promise<void> {\n\tconst entry = modulesStore.getModuleEntryByLocalId(localId)\n\tassert(entry, \"Module entry for shader not found\", localId)\n\tconst handle = modulesStore.forType(ModuleType.Shader).getByLocalId(localId)\n\tawait handle.delete()\n}\n\nexport async function renameShaderModule(\n\tmodulesStore: ModulesStore,\n\tlocalId: LocalModuleId,\n\tnewPath: string,\n): Promise<Immutable<ModuleEntry>> {\n\tconst entry = modulesStore.getModuleEntryByLocalId(localId)\n\tassert(entry, \"Module entry for shader not found\", localId)\n\n\tconst sanitizedPath = normalizeShaderFilePath(newPath)\n\tconst uniquePath = getUniquePath(modulesStore, sanitizedPath)\n\n\tconst handle = modulesStore.forType(ModuleType.Shader).getByLocalId(localId)\n\tawait handle.rename(uniquePath)\n\tconst renamedEntry = modulesStore.getModuleEntryByLocalId(localId)\n\tassert(renamedEntry, \"Module entry for renamed shader not found\", localId)\n\treturn renamedEntry\n}\n\nexport async function duplicateShaderModule(\n\tmodulesStore: ModulesStore,\n\tlocalId: LocalModuleId,\n): Promise<Immutable<ModuleEntry>> {\n\tconst entry = modulesStore.getModuleEntryByLocalId(localId)\n\tassert(entry, \"Module entry for shader not found\", localId)\n\tconst sourceContent = entry.sourceContent ?? getDefaultShaderSource()\n\treturn createShaderModule(modulesStore, entry.name, sourceContent)\n}\n\n/** Default template for a new shader module */\nfunction getDefaultShaderSource(): string {\n\treturn `\n// Get Started: https://www.framer.com/developers\nimport { defineShader, ControlType } from \"framer\"\n\nexport default defineShader({\n\tfragment: \\`\n\t\tvoid main() {\n\t\t\tfragColor = vec4(v_uv * u_scale, 0.5, 1.0);\n\t\t}\n\t\\`,\n\tpropertyControls: {\n\t\tscale: { type: ControlType.Number, defaultValue: 1.0, min: 0, max: 2 },\n\t},\n})\n`\n}\n", "import { isEmptyObject } from \"@framerjs/shared\"\nimport type { CanvasNode } from \"document/models/CanvasTree/index.ts\"\nimport { withChildren } from \"document/models/CanvasTree/traits/WithChildren.ts\"\nimport { type WithGridItemSize, withGridItemSize } from \"document/models/CanvasTree/traits/WithGridItemSize.ts\"\nimport {\n\ttype HasGridLayout,\n\ttype WithLayout,\n\thasGridLayout,\n\twithLayout,\n} from \"document/models/CanvasTree/traits/WithLayout.ts\"\nimport { type WithPadding, paddingDefinedDefaults, withPadding } from \"document/models/CanvasTree/traits/WithPadding.ts\"\nimport { isPinnable } from \"document/models/CanvasTree/traits/WithPins.ts\"\nimport { DimensionType } from \"library/index.ts\"\nimport { entries } from \"utils/entries.ts\"\n\nconst gridLayoutDefaults: HasGridLayout & WithPadding = {\n\tlayout: \"grid\",\n\tgap: 20,\n\tgridColumnCount: 2,\n\tgridAlignment: \"center\",\n\tgridColumnWidthType: \"minmax\",\n\tgridColumnWidth: 200,\n\tgridColumnMinWidth: 50,\n\tgridRowHeightType: \"auto\",\n\tgridRowHeight: 200,\n\tgridRowCount: 2,\n\tgridType: undefined,\n\t...paddingDefinedDefaults,\n}\n\nexport function enableGridLayoutForNode(node: CanvasNode) {\n\tif (!withLayout(node) || !withChildren(node) || !withPadding(node)) return\n\tif (hasGridLayout(node)) return\n\n\tconst gridLayout: Partial<WithLayout & WithPadding> = {\n\t\tlayout: \"grid\",\n\t}\n\tentries(gridLayoutDefaults).forEach(([key, value]) => {\n\t\tif (node[key] === undefined) {\n\t\t\t// @ts-expect-error - we know that the key is valid\n\t\t\tgridLayout[key] = value\n\t\t}\n\t})\n\n\tnode.set(gridLayout)\n\n\tif (!node.children) return\n\tfor (const child of node.children) {\n\t\tif (!withGridItemSize(child)) continue\n\t\tconst update: Partial<WithGridItemSize> = {}\n\t\tif (child.gridItemFillCellWidth === undefined) {\n\t\t\tupdate.gridItemFillCellWidth = true\n\t\t}\n\t\tconst gridHasAutoHeight = isPinnable(node) && node.heightType === DimensionType.Auto\n\t\tif (child.gridItemFillCellHeight === undefined && !gridHasAutoHeight) {\n\t\t\tupdate.gridItemFillCellHeight = true\n\t\t} else if (gridHasAutoHeight && child.gridItemFillCellHeight) {\n\t\t\t// If a stack fits the height of a fixed height child, the child should not to fill the cell\n\t\t\t// height because it is probably not the user's intent and would cause the grid to collapse.\n\t\t\tupdate.gridItemFillCellHeight = false\n\t\t}\n\n\t\tif (!isEmptyObject(update)) child.set(update)\n\t}\n}\n", "import { assert } from \"@framerjs/shared\"\nimport { getRelatedReplicaNodes } from \"code-generation/utils/isOnlyVisibleInCurrentVariant.ts\"\nimport type { VekterEngine } from \"document/VekterEngine.ts\"\nimport { enableGridLayoutForNode } from \"document/components/tools/utils/gridCreateHelper.ts\"\nimport { enableStackLayoutForNode } from \"document/components/tools/utils/stackCreateHelper.ts\"\nimport type { NodeID } from \"document/models/CanvasTree/index.ts\"\nimport { TemplateHelper } from \"document/models/CanvasTree/nodes/TemplateHelper.ts\"\nimport { isDataRepeater, isStackOrGridComponent } from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport { TraitType } from \"document/models/CanvasTree/traits/TraitType.ts\"\nimport type { WithAspectRatio } from \"document/models/CanvasTree/traits/WithAspectRatio.ts\"\nimport { withAspectRatio } from \"document/models/CanvasTree/traits/WithAspectRatio.ts\"\nimport { hasAnyLayout, withLayout } from \"document/models/CanvasTree/traits/WithLayout.ts\"\nimport type { WithPins } from \"document/models/CanvasTree/traits/WithPins.ts\"\nimport { isPinnable } from \"document/models/CanvasTree/traits/WithPins.ts\"\nimport { isMasterOrMasterChild, isReplicaOrReplicaChild } from \"document/models/CanvasTree/traits/WithTemplate.ts\"\nimport { hasReplicaOverrides } from \"document/models/CanvasTree/traits/utils/hasReplicaOverrides.ts\"\nimport { shouldGuessPinToBottom } from \"document/models/shouldGuessPinToBottom.ts\"\nimport { shouldGuessPinToRight } from \"document/models/shouldGuessPinToRight.ts\"\nimport { DimensionType } from \"library/render/types/Constraints.ts\"\nimport { record } from \"web/lib/tracker.ts\"\nimport { trackDimensionTypeChange } from \"./trackDimensionTypeChange.ts\"\n\nexport function enableStackLayout(engine: VekterEngine, nodeIds: NodeID[]) {\n\tengine.tree.getNodes(nodeIds).forEach(node => {\n\t\trecord(\"layout_stack\", { source: \"stack_layout_panel\", layoutType: \"stack\" })\n\t\tenableStackLayoutForNode(engine, node)\n\t})\n\tengine.stores.selectionOutlineTracker.forceEnableSelectionOutline()\n}\n\nexport function enableGridLayout(engine: VekterEngine, nodeIds: NodeID[]) {\n\tconst nodesWithLayout = engine.tree.getNodes(nodeIds)\n\n\tnodesWithLayout.forEach(node => {\n\t\trecord(\"layout_stack\", { source: \"stack_layout_panel\", layoutType: \"grid\" })\n\t\tenableGridLayoutForNode(node)\n\t})\n}\n\nexport function disableStackAndGridLayout(engine: VekterEngine, nodeIds: NodeID[]) {\n\tconst nodes = engine.tree.getNodesWithTrait(nodeIds, withLayout)\n\n\t// Make sure all children keep the same position and size\n\tnodes.forEach(node => {\n\t\tassert(!isDataRepeater(node), \"Data repeaters should never have their layout disabled.\")\n\n\t\tconst nodesToUpdate = [node]\n\t\tif (isMasterOrMasterChild(node)) {\n\t\t\t// Make sure related replica children with size override reset\n\t\t\t// their layout so they stay in position\n\t\t\t// @TODO: currently we only check individual node, but the node's\n\t\t\t// position can be changed by its siblings or the parent's layout.\n\t\t\tnodesToUpdate.push(...getRelatedReplicaNodes(engine.tree, node).map(({ relatedNode }) => relatedNode))\n\t\t}\n\n\t\tconst isDisabledReplica = isReplicaOrReplicaChild(node)\n\n\t\tnodesToUpdate.forEach(nodeOrRelatedReplica => {\n\t\t\t// Related replica nodes could not have stack or grid enabled. We\n\t\t\t// should skip these nodes as their children don't need their layout\n\t\t\t// updated.\n\t\t\tif (!isStackOrGridComponent(nodeOrRelatedReplica)) return\n\t\t\tif (!nodeOrRelatedReplica.children) return\n\n\t\t\t// If the node we are disabling stack layout on is a replica node,\n\t\t\t// not the primary node, and the css flexbox experiment is on, we\n\t\t\t// always want to update the child rect.\n\t\t\tnodeOrRelatedReplica.children.forEach(child => {\n\t\t\t\tif (!isPinnable(child)) return\n\t\t\t\tif (isReplicaOrReplicaChild(child) && !isDisabledReplica) {\n\t\t\t\t\tconst overrideKeys = TemplateHelper.overrideKeys(engine.tree, [child])\n\t\t\t\t\tconst sizeHasBeenOverridden = hasReplicaOverrides(overrideKeys, [TraitType.Size], undefined)\n\t\t\t\t\tif (!sizeHasBeenOverridden) return\n\t\t\t\t}\n\n\t\t\t\tconst childRect = engine.tree.getRect(child)\n\t\t\t\tconst update: Partial<WithPins & WithAspectRatio> = child.updateForRect({\n\t\t\t\t\trect: childRect,\n\t\t\t\t\tparentSizeInfo: engine.tree.getParentSizeInfo(child),\n\t\t\t\t\tconstraintsLocked: false,\n\t\t\t\t\tshouldGuessPinToBottom: shouldGuessPinToBottom(engine.tree, null, nodeOrRelatedReplica),\n\t\t\t\t\tshouldGuessPinToRight: shouldGuessPinToRight(engine.tree, null, nodeOrRelatedReplica),\n\t\t\t\t})\n\n\t\t\t\tswitch (child.widthType) {\n\t\t\t\t\tcase DimensionType.FractionOfFreeSpace:\n\t\t\t\t\t\tupdate.widthType = DimensionType.FixedNumber\n\t\t\t\t\t\tupdate.width = childRect.width\n\t\t\t\t\t\tbreak\n\t\t\t\t}\n\n\t\t\t\tswitch (child.heightType) {\n\t\t\t\t\tcase DimensionType.FractionOfFreeSpace:\n\t\t\t\t\t\tupdate.heightType = DimensionType.FixedNumber\n\t\t\t\t\t\tupdate.height = childRect.height\n\t\t\t\t\t\tbreak\n\t\t\t\t}\n\n\t\t\t\t// Stack children their aspect ratio is ignored\n\t\t\t\tif (withAspectRatio(child)) {\n\t\t\t\t\tupdate.aspectRatio = null\n\t\t\t\t}\n\t\t\t\ttrackDimensionTypeChange(node, update, \"stack_layout_panel\")\n\t\t\t\tchild.set(update)\n\t\t\t})\n\t\t})\n\t})\n\n\tnodes.forEach(node => {\n\t\tif (!hasAnyLayout(node)) return\n\n\t\tnode.set({ layout: undefined })\n\n\t\tif (!isPinnable(node)) return\n\n\t\tconst nodeRect = engine.tree.getRect(node)\n\n\t\tif (node.widthType === DimensionType.Auto) {\n\t\t\tnode.set({\n\t\t\t\twidthType: DimensionType.FixedNumber,\n\t\t\t\twidth: nodeRect.width,\n\t\t\t})\n\t\t}\n\n\t\tif (node.heightType === DimensionType.Auto) {\n\t\t\tnode.set({\n\t\t\t\theightType: DimensionType.FixedNumber,\n\t\t\t\theight: nodeRect.height,\n\t\t\t})\n\t\t}\n\t})\n}\n", "import type { VekterEngine } from \"document/VekterEngine.ts\"\nimport type { RichTextNode } from \"document/models/CanvasTree/index.ts\"\nimport { LinkStylePresetNode } from \"document/models/CanvasTree/nodes/LinkStylePresetNode.ts\"\nimport type { VariableReference } from \"document/models/CanvasTree/traits/VariableReference.ts\"\nimport type { WithLinkUpdate } from \"document/models/CanvasTree/traits/WithLink.ts\"\nimport type { Link } from \"document/models/CanvasTree/traits/utils/Link.ts\"\nimport { isLinkToWebPage } from \"library/modules/LinkToWebPage.ts\"\nimport { getDefaultLinkStylePreset, insertLinkStylePreset } from \"utils/linkStylePresetUtils.ts\"\nimport { isUndefined } from \"utils/typeChecks.ts\"\nimport { record } from \"web/lib/tracker.ts\"\n\nexport function updateRichTextNodeLink(\n\tengine: VekterEngine,\n\tnode: RichTextNode,\n\tlink: Link | VariableReference | undefined,\n\tupdate: WithLinkUpdate,\n) {\n\tconst isEmptyPageLink = isLinkToWebPage(link) && !link?.webPageId\n\tconst existingLinks = node.getLinks(true)\n\tconst hasExistingLinks = Boolean(existingLinks[0])\n\n\tif (isUndefined(link) || isEmptyPageLink) {\n\t\tnode.removeLink(true)\n\t} else if (hasExistingLinks) {\n\t\tnode.updateLinks(link, update, true)\n\t} else {\n\t\t// no existing links (or using old UX) so create a new anchor tag for the selection\n\t\tconst preset =\n\t\t\tnode.getNodeLinkStylePreset(engine.tree) ??\n\t\t\tgetDefaultLinkStylePreset(engine.tree) ??\n\t\t\tLinkStylePresetNode.createDefault()\n\n\t\tinsertLinkStylePreset(engine, preset)\n\t\tnode.setNodeLinkStylePreset(preset)\n\n\t\tnode.applyDefaultTextLinkStylePreset(preset, true)\n\t\tnode.removeLegacyLinkStyle()\n\n\t\trecord(\"styles_preset_add\", {\n\t\t\ttag: \"a\",\n\t\t\tname: preset.getName(),\n\t\t\tid: preset.id,\n\t\t})\n\n\t\tnode.setLink(link, preset, update, true)\n\t}\n}\n", "import type { ThemeOverrideMode } from \"@framerjs/fresco\"\nimport type { EngineStores } from \"document/EngineStores.ts\"\nimport type { CanvasNode } from \"document/models/CanvasTree/index.ts\"\nimport { isLayoutTemplateNode, isSmartComponentNode } from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport { ActiveMainView } from \"document/utils/ActiveEditorType.ts\"\n\n/**\n * Returns the engine dependencies that are used to determine the theme override mode.\n */\nexport function getThemeOverrideDependencies(stores: EngineStores) {\n\treturn [stores.toolStore, stores.scopeStore, stores.chromeStore, stores.overlayStore]\n}\n\nexport function getThemeOverrideMode(stores: EngineStores): ThemeOverrideMode | undefined {\n\tif (stores.chromeStore.mainView !== ActiveMainView.Canvas && stores.chromeStore.mainView !== ActiveMainView.Preview) {\n\t\treturn\n\t}\n\n\tconst activeScope = stores.scopeStore.active\n\tconst inOverlayEditMode = stores.overlayStore.editModeActive && stores.chromeStore.mainView === ActiveMainView.Canvas\n\n\tif (isScopeUsingComponentTint(activeScope)) {\n\t\tif (inOverlayEditMode) return \"componentOverlayEditMode\"\n\t\treturn \"component\"\n\t}\n}\n\nexport function isScopeUsingComponentTint<N extends CanvasNode>(activeScope: N | undefined | null) {\n\treturn isSmartComponentNode(activeScope) || isLayoutTemplateNode(activeScope)\n}\n"],
  "mappings": "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",
  "names": ["isObject", "isObject", "assert", "assert", "getLogger", "assert", "log", "_engine", "isNull", "assert", "isUndefined", "_data", "_data", "isObject", "isNumber", "isString", "isObject", "_unmarshaledAttributes", "assert", "isString", "_a", "isObject", "_engine", "isString", "isArray", "isObject", "isString", "assert", "_engine", "log", "CSSUnit", "log", "assertNever", "isLinkToWebPage"]
}
