diff --git a/src/Umbraco.Community.BlockPreview.UI/vite.config.ts b/src/Umbraco.Community.BlockPreview.UI/vite.config.ts index 59101b7..8f02d61 100644 --- a/src/Umbraco.Community.BlockPreview.UI/vite.config.ts +++ b/src/Umbraco.Community.BlockPreview.UI/vite.config.ts @@ -3,14 +3,20 @@ import { glob } from 'glob'; import { readFileSync, writeFileSync } from 'fs'; import { resolve } from 'path'; +// Use the project version (version.json at the repo root) as the cache-bust token. +// It is bumped for every release, so the ?v= query changes each version and browsers +// re-fetch the entry bundle. Reading public/umbraco-package.json instead left ?v= frozen +// at a stale value, so upgrades served cached JS. +function getVersion(): string { + const versionJsonPath = resolve(__dirname, '../../version.json'); + return JSON.parse(readFileSync(versionJsonPath, 'utf-8')).version; +} + function cacheBustImports(): Plugin { return { name: 'cache-bust-imports', generateBundle(_, bundle) { - // Read version from umbraco-package.json - const packageJsonPath = resolve(__dirname, 'public/umbraco-package.json'); - const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8')); - const version = packageJson.version; + const version = getVersion(); for (const file of Object.values(bundle)) { if (file.type === 'chunk' && file.code) { @@ -27,13 +33,20 @@ function cacheBustImports(): Plugin { } }, writeBundle() { - // Transform umbraco-package.json after it's copied from public/ + // Transform umbraco-package.json after it's copied from public/. + // Always (re)set ?v= to the current project version so the entry bundle URL + // changes on every release. + const version = getVersion(); const distPath = resolve(__dirname, '../Umbraco.Community.BlockPreview/wwwroot/App_Plugins/Umbraco.Community.BlockPreview/umbraco-package.json'); const json = JSON.parse(readFileSync(distPath, 'utf-8')); + // Keep the manifest version in sync with version.json (the build's + // UpdatePackageManifestVersion target re-sets this to the same value at pack time). + json.version = version; + for (const ext of json.extensions || []) { - if (ext.js && !ext.js.includes('?v=')) { - ext.js = `${ext.js}?v=${json.version}`; + if (ext.js) { + ext.js = `${ext.js.replace(/\?v=.*$/, '')}?v=${version}`; } } diff --git a/src/Umbraco.Community.BlockPreview/wwwroot/App_Plugins/Umbraco.Community.BlockPreview/index.js.map b/src/Umbraco.Community.BlockPreview/wwwroot/App_Plugins/Umbraco.Community.BlockPreview/index.js.map index 3a380ae..4abdd53 100644 --- a/src/Umbraco.Community.BlockPreview/wwwroot/App_Plugins/Umbraco.Community.BlockPreview/index.js.map +++ b/src/Umbraco.Community.BlockPreview/wwwroot/App_Plugins/Umbraco.Community.BlockPreview/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sources":["../../../../Umbraco.Community.BlockPreview.UI/src/api/core/bodySerializer.gen.ts","../../../../Umbraco.Community.BlockPreview.UI/src/api/core/serverSentEvents.gen.ts","../../../../Umbraco.Community.BlockPreview.UI/src/api/core/pathSerializer.gen.ts","../../../../Umbraco.Community.BlockPreview.UI/src/api/core/utils.gen.ts","../../../../Umbraco.Community.BlockPreview.UI/src/api/core/auth.gen.ts","../../../../Umbraco.Community.BlockPreview.UI/src/api/client/utils.gen.ts","../../../../Umbraco.Community.BlockPreview.UI/src/api/client/client.gen.ts","../../../../Umbraco.Community.BlockPreview.UI/src/api/client.gen.ts","../../../../Umbraco.Community.BlockPreview.UI/src/api/sdk.gen.ts","../../../../Umbraco.Community.BlockPreview.UI/src/context/block-preview.context-token.ts","../../../../Umbraco.Community.BlockPreview.UI/src/blockEditor/block-preview-base.element.ts","../../../../Umbraco.Community.BlockPreview.UI/src/repository/preview.data-source.ts","../../../../Umbraco.Community.BlockPreview.UI/src/repository/settings.data-source.ts","../../../../Umbraco.Community.BlockPreview.UI/src/repository/settings.repository.ts","../../../../Umbraco.Community.BlockPreview.UI/src/blockEditor/block-grid-preview.custom-view.element.ts","../../../../Umbraco.Community.BlockPreview.UI/src/blockEditor/block-list-preview.custom-view.element.ts","../../../../Umbraco.Community.BlockPreview.UI/src/blockEditor/block-single-preview.custom-view.element.ts","../../../../Umbraco.Community.BlockPreview.UI/src/blockEditor/rich-text-preview.custom-view.element.ts","../../../../Umbraco.Community.BlockPreview.UI/src/context/block-preview-request-queue.ts","../../../../Umbraco.Community.BlockPreview.UI/src/context/block-preview.context.ts","../../../../Umbraco.Community.BlockPreview.UI/src/context/manifests.ts","../../../../Umbraco.Community.BlockPreview.UI/src/localization/manifests.ts","../../../../Umbraco.Community.BlockPreview.UI/src/index.ts"],"sourcesContent":["// This file is auto-generated by @hey-api/openapi-ts\n\nimport type {\n ArrayStyle,\n ObjectStyle,\n SerializerOptions,\n} from './pathSerializer.gen';\n\nexport type QuerySerializer = (query: Record) => string;\n\nexport type BodySerializer = (body: any) => any;\n\nexport interface QuerySerializerOptions {\n allowReserved?: boolean;\n array?: SerializerOptions;\n object?: SerializerOptions;\n}\n\nconst serializeFormDataPair = (\n data: FormData,\n key: string,\n value: unknown,\n): void => {\n if (typeof value === 'string' || value instanceof Blob) {\n data.append(key, value);\n } else if (value instanceof Date) {\n data.append(key, value.toISOString());\n } else {\n data.append(key, JSON.stringify(value));\n }\n};\n\nconst serializeUrlSearchParamsPair = (\n data: URLSearchParams,\n key: string,\n value: unknown,\n): void => {\n if (typeof value === 'string') {\n data.append(key, value);\n } else {\n data.append(key, JSON.stringify(value));\n }\n};\n\nexport const formDataBodySerializer = {\n bodySerializer: | Array>>(\n body: T,\n ): FormData => {\n const data = new FormData();\n\n Object.entries(body).forEach(([key, value]) => {\n if (value === undefined || value === null) {\n return;\n }\n if (Array.isArray(value)) {\n value.forEach((v) => serializeFormDataPair(data, key, v));\n } else {\n serializeFormDataPair(data, key, value);\n }\n });\n\n return data;\n },\n};\n\nexport const jsonBodySerializer = {\n bodySerializer: (body: T): string =>\n JSON.stringify(body, (_key, value) =>\n typeof value === 'bigint' ? value.toString() : value,\n ),\n};\n\nexport const urlSearchParamsBodySerializer = {\n bodySerializer: | Array>>(\n body: T,\n ): string => {\n const data = new URLSearchParams();\n\n Object.entries(body).forEach(([key, value]) => {\n if (value === undefined || value === null) {\n return;\n }\n if (Array.isArray(value)) {\n value.forEach((v) => serializeUrlSearchParamsPair(data, key, v));\n } else {\n serializeUrlSearchParamsPair(data, key, value);\n }\n });\n\n return data.toString();\n },\n};\n","// This file is auto-generated by @hey-api/openapi-ts\n\nimport type { Config } from './types.gen';\n\nexport type ServerSentEventsOptions = Omit<\n RequestInit,\n 'method'\n> &\n Pick & {\n /**\n * Fetch API implementation. You can use this option to provide a custom\n * fetch instance.\n *\n * @default globalThis.fetch\n */\n fetch?: typeof fetch;\n /**\n * Implementing clients can call request interceptors inside this hook.\n */\n onRequest?: (url: string, init: RequestInit) => Promise;\n /**\n * Callback invoked when a network or parsing error occurs during streaming.\n *\n * This option applies only if the endpoint returns a stream of events.\n *\n * @param error The error that occurred.\n */\n onSseError?: (error: unknown) => void;\n /**\n * Callback invoked when an event is streamed from the server.\n *\n * This option applies only if the endpoint returns a stream of events.\n *\n * @param event Event streamed from the server.\n * @returns Nothing (void).\n */\n onSseEvent?: (event: StreamEvent) => void;\n serializedBody?: RequestInit['body'];\n /**\n * Default retry delay in milliseconds.\n *\n * This option applies only if the endpoint returns a stream of events.\n *\n * @default 3000\n */\n sseDefaultRetryDelay?: number;\n /**\n * Maximum number of retry attempts before giving up.\n */\n sseMaxRetryAttempts?: number;\n /**\n * Maximum retry delay in milliseconds.\n *\n * Applies only when exponential backoff is used.\n *\n * This option applies only if the endpoint returns a stream of events.\n *\n * @default 30000\n */\n sseMaxRetryDelay?: number;\n /**\n * Optional sleep function for retry backoff.\n *\n * Defaults to using `setTimeout`.\n */\n sseSleepFn?: (ms: number) => Promise;\n url: string;\n };\n\nexport interface StreamEvent {\n data: TData;\n event?: string;\n id?: string;\n retry?: number;\n}\n\nexport type ServerSentEventsResult<\n TData = unknown,\n TReturn = void,\n TNext = unknown,\n> = {\n stream: AsyncGenerator<\n TData extends Record ? TData[keyof TData] : TData,\n TReturn,\n TNext\n >;\n};\n\nexport const createSseClient = ({\n onRequest,\n onSseError,\n onSseEvent,\n responseTransformer,\n responseValidator,\n sseDefaultRetryDelay,\n sseMaxRetryAttempts,\n sseMaxRetryDelay,\n sseSleepFn,\n url,\n ...options\n}: ServerSentEventsOptions): ServerSentEventsResult => {\n let lastEventId: string | undefined;\n\n const sleep =\n sseSleepFn ??\n ((ms: number) => new Promise((resolve) => setTimeout(resolve, ms)));\n\n const createStream = async function* () {\n let retryDelay: number = sseDefaultRetryDelay ?? 3000;\n let attempt = 0;\n const signal = options.signal ?? new AbortController().signal;\n\n while (true) {\n if (signal.aborted) break;\n\n attempt++;\n\n const headers =\n options.headers instanceof Headers\n ? options.headers\n : new Headers(options.headers as Record | undefined);\n\n if (lastEventId !== undefined) {\n headers.set('Last-Event-ID', lastEventId);\n }\n\n try {\n const requestInit: RequestInit = {\n redirect: 'follow',\n ...options,\n body: options.serializedBody,\n headers,\n signal,\n };\n let request = new Request(url, requestInit);\n if (onRequest) {\n request = await onRequest(url, requestInit);\n }\n // fetch must be assigned here, otherwise it would throw the error:\n // TypeError: Failed to execute 'fetch' on 'Window': Illegal invocation\n const _fetch = options.fetch ?? globalThis.fetch;\n const response = await _fetch(request);\n\n if (!response.ok)\n throw new Error(\n `SSE failed: ${response.status} ${response.statusText}`,\n );\n\n if (!response.body) throw new Error('No body in SSE response');\n\n const reader = response.body\n .pipeThrough(new TextDecoderStream())\n .getReader();\n\n let buffer = '';\n\n const abortHandler = () => {\n try {\n reader.cancel();\n } catch {\n // noop\n }\n };\n\n signal.addEventListener('abort', abortHandler);\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += value;\n\n const chunks = buffer.split('\\n\\n');\n buffer = chunks.pop() ?? '';\n\n for (const chunk of chunks) {\n const lines = chunk.split('\\n');\n const dataLines: Array = [];\n let eventName: string | undefined;\n\n for (const line of lines) {\n if (line.startsWith('data:')) {\n dataLines.push(line.replace(/^data:\\s*/, ''));\n } else if (line.startsWith('event:')) {\n eventName = line.replace(/^event:\\s*/, '');\n } else if (line.startsWith('id:')) {\n lastEventId = line.replace(/^id:\\s*/, '');\n } else if (line.startsWith('retry:')) {\n const parsed = Number.parseInt(\n line.replace(/^retry:\\s*/, ''),\n 10,\n );\n if (!Number.isNaN(parsed)) {\n retryDelay = parsed;\n }\n }\n }\n\n let data: unknown;\n let parsedJson = false;\n\n if (dataLines.length) {\n const rawData = dataLines.join('\\n');\n try {\n data = JSON.parse(rawData);\n parsedJson = true;\n } catch {\n data = rawData;\n }\n }\n\n if (parsedJson) {\n if (responseValidator) {\n await responseValidator(data);\n }\n\n if (responseTransformer) {\n data = await responseTransformer(data);\n }\n }\n\n onSseEvent?.({\n data,\n event: eventName,\n id: lastEventId,\n retry: retryDelay,\n });\n\n if (dataLines.length) {\n yield data as any;\n }\n }\n }\n } finally {\n signal.removeEventListener('abort', abortHandler);\n reader.releaseLock();\n }\n\n break; // exit loop on normal completion\n } catch (error) {\n // connection failed or aborted; retry after delay\n onSseError?.(error);\n\n if (\n sseMaxRetryAttempts !== undefined &&\n attempt >= sseMaxRetryAttempts\n ) {\n break; // stop after firing error\n }\n\n // exponential backoff: double retry each attempt, cap at 30s\n const backoff = Math.min(\n retryDelay * 2 ** (attempt - 1),\n sseMaxRetryDelay ?? 30000,\n );\n await sleep(backoff);\n }\n }\n };\n\n const stream = createStream();\n\n return { stream };\n};\n","// This file is auto-generated by @hey-api/openapi-ts\n\ninterface SerializeOptions\n extends SerializePrimitiveOptions,\n SerializerOptions {}\n\ninterface SerializePrimitiveOptions {\n allowReserved?: boolean;\n name: string;\n}\n\nexport interface SerializerOptions {\n /**\n * @default true\n */\n explode: boolean;\n style: T;\n}\n\nexport type ArrayStyle = 'form' | 'spaceDelimited' | 'pipeDelimited';\nexport type ArraySeparatorStyle = ArrayStyle | MatrixStyle;\ntype MatrixStyle = 'label' | 'matrix' | 'simple';\nexport type ObjectStyle = 'form' | 'deepObject';\ntype ObjectSeparatorStyle = ObjectStyle | MatrixStyle;\n\ninterface SerializePrimitiveParam extends SerializePrimitiveOptions {\n value: string;\n}\n\nexport const separatorArrayExplode = (style: ArraySeparatorStyle) => {\n switch (style) {\n case 'label':\n return '.';\n case 'matrix':\n return ';';\n case 'simple':\n return ',';\n default:\n return '&';\n }\n};\n\nexport const separatorArrayNoExplode = (style: ArraySeparatorStyle) => {\n switch (style) {\n case 'form':\n return ',';\n case 'pipeDelimited':\n return '|';\n case 'spaceDelimited':\n return '%20';\n default:\n return ',';\n }\n};\n\nexport const separatorObjectExplode = (style: ObjectSeparatorStyle) => {\n switch (style) {\n case 'label':\n return '.';\n case 'matrix':\n return ';';\n case 'simple':\n return ',';\n default:\n return '&';\n }\n};\n\nexport const serializeArrayParam = ({\n allowReserved,\n explode,\n name,\n style,\n value,\n}: SerializeOptions & {\n value: unknown[];\n}) => {\n if (!explode) {\n const joinedValues = (\n allowReserved ? value : value.map((v) => encodeURIComponent(v as string))\n ).join(separatorArrayNoExplode(style));\n switch (style) {\n case 'label':\n return `.${joinedValues}`;\n case 'matrix':\n return `;${name}=${joinedValues}`;\n case 'simple':\n return joinedValues;\n default:\n return `${name}=${joinedValues}`;\n }\n }\n\n const separator = separatorArrayExplode(style);\n const joinedValues = value\n .map((v) => {\n if (style === 'label' || style === 'simple') {\n return allowReserved ? v : encodeURIComponent(v as string);\n }\n\n return serializePrimitiveParam({\n allowReserved,\n name,\n value: v as string,\n });\n })\n .join(separator);\n return style === 'label' || style === 'matrix'\n ? separator + joinedValues\n : joinedValues;\n};\n\nexport const serializePrimitiveParam = ({\n allowReserved,\n name,\n value,\n}: SerializePrimitiveParam) => {\n if (value === undefined || value === null) {\n return '';\n }\n\n if (typeof value === 'object') {\n throw new Error(\n 'Deeply-nested arrays/objects aren’t supported. Provide your own `querySerializer()` to handle these.',\n );\n }\n\n return `${name}=${allowReserved ? value : encodeURIComponent(value)}`;\n};\n\nexport const serializeObjectParam = ({\n allowReserved,\n explode,\n name,\n style,\n value,\n valueOnly,\n}: SerializeOptions & {\n value: Record | Date;\n valueOnly?: boolean;\n}) => {\n if (value instanceof Date) {\n return valueOnly ? value.toISOString() : `${name}=${value.toISOString()}`;\n }\n\n if (style !== 'deepObject' && !explode) {\n let values: string[] = [];\n Object.entries(value).forEach(([key, v]) => {\n values = [\n ...values,\n key,\n allowReserved ? (v as string) : encodeURIComponent(v as string),\n ];\n });\n const joinedValues = values.join(',');\n switch (style) {\n case 'form':\n return `${name}=${joinedValues}`;\n case 'label':\n return `.${joinedValues}`;\n case 'matrix':\n return `;${name}=${joinedValues}`;\n default:\n return joinedValues;\n }\n }\n\n const separator = separatorObjectExplode(style);\n const joinedValues = Object.entries(value)\n .map(([key, v]) =>\n serializePrimitiveParam({\n allowReserved,\n name: style === 'deepObject' ? `${name}[${key}]` : key,\n value: v as string,\n }),\n )\n .join(separator);\n return style === 'label' || style === 'matrix'\n ? separator + joinedValues\n : joinedValues;\n};\n","// This file is auto-generated by @hey-api/openapi-ts\n\nimport type { BodySerializer, QuerySerializer } from './bodySerializer.gen';\nimport {\n type ArraySeparatorStyle,\n serializeArrayParam,\n serializeObjectParam,\n serializePrimitiveParam,\n} from './pathSerializer.gen';\n\nexport interface PathSerializer {\n path: Record;\n url: string;\n}\n\nexport const PATH_PARAM_RE = /\\{[^{}]+\\}/g;\n\nexport const defaultPathSerializer = ({ path, url: _url }: PathSerializer) => {\n let url = _url;\n const matches = _url.match(PATH_PARAM_RE);\n if (matches) {\n for (const match of matches) {\n let explode = false;\n let name = match.substring(1, match.length - 1);\n let style: ArraySeparatorStyle = 'simple';\n\n if (name.endsWith('*')) {\n explode = true;\n name = name.substring(0, name.length - 1);\n }\n\n if (name.startsWith('.')) {\n name = name.substring(1);\n style = 'label';\n } else if (name.startsWith(';')) {\n name = name.substring(1);\n style = 'matrix';\n }\n\n const value = path[name];\n\n if (value === undefined || value === null) {\n continue;\n }\n\n if (Array.isArray(value)) {\n url = url.replace(\n match,\n serializeArrayParam({ explode, name, style, value }),\n );\n continue;\n }\n\n if (typeof value === 'object') {\n url = url.replace(\n match,\n serializeObjectParam({\n explode,\n name,\n style,\n value: value as Record,\n valueOnly: true,\n }),\n );\n continue;\n }\n\n if (style === 'matrix') {\n url = url.replace(\n match,\n `;${serializePrimitiveParam({\n name,\n value: value as string,\n })}`,\n );\n continue;\n }\n\n const replaceValue = encodeURIComponent(\n style === 'label' ? `.${value as string}` : (value as string),\n );\n url = url.replace(match, replaceValue);\n }\n }\n return url;\n};\n\nexport const getUrl = ({\n baseUrl,\n path,\n query,\n querySerializer,\n url: _url,\n}: {\n baseUrl?: string;\n path?: Record;\n query?: Record;\n querySerializer: QuerySerializer;\n url: string;\n}) => {\n const pathUrl = _url.startsWith('/') ? _url : `/${_url}`;\n let url = (baseUrl ?? '') + pathUrl;\n if (path) {\n url = defaultPathSerializer({ path, url });\n }\n let search = query ? querySerializer(query) : '';\n if (search.startsWith('?')) {\n search = search.substring(1);\n }\n if (search) {\n url += `?${search}`;\n }\n return url;\n};\n\nexport function getValidRequestBody(options: {\n body?: unknown;\n bodySerializer?: BodySerializer | null;\n serializedBody?: unknown;\n}) {\n const hasBody = options.body !== undefined;\n const isSerializedBody = hasBody && options.bodySerializer;\n\n if (isSerializedBody) {\n if ('serializedBody' in options) {\n const hasSerializedBody =\n options.serializedBody !== undefined && options.serializedBody !== '';\n\n return hasSerializedBody ? options.serializedBody : null;\n }\n\n // not all clients implement a serializedBody property (i.e. client-axios)\n return options.body !== '' ? options.body : null;\n }\n\n // plain/text body\n if (hasBody) {\n return options.body;\n }\n\n // no body was provided\n return undefined;\n}\n","// This file is auto-generated by @hey-api/openapi-ts\n\nexport type AuthToken = string | undefined;\n\nexport interface Auth {\n /**\n * Which part of the request do we use to send the auth?\n *\n * @default 'header'\n */\n in?: 'header' | 'query' | 'cookie';\n /**\n * Header or query parameter name.\n *\n * @default 'Authorization'\n */\n name?: string;\n scheme?: 'basic' | 'bearer';\n type: 'apiKey' | 'http';\n}\n\nexport const getAuthToken = async (\n auth: Auth,\n callback: ((auth: Auth) => Promise | AuthToken) | AuthToken,\n): Promise => {\n const token =\n typeof callback === 'function' ? await callback(auth) : callback;\n\n if (!token) {\n return;\n }\n\n if (auth.scheme === 'bearer') {\n return `Bearer ${token}`;\n }\n\n if (auth.scheme === 'basic') {\n return `Basic ${btoa(token)}`;\n }\n\n return token;\n};\n","// This file is auto-generated by @hey-api/openapi-ts\n\nimport { getAuthToken } from '../core/auth.gen';\nimport type { QuerySerializerOptions } from '../core/bodySerializer.gen';\nimport { jsonBodySerializer } from '../core/bodySerializer.gen';\nimport {\n serializeArrayParam,\n serializeObjectParam,\n serializePrimitiveParam,\n} from '../core/pathSerializer.gen';\nimport { getUrl } from '../core/utils.gen';\nimport type { Client, ClientOptions, Config, RequestOptions } from './types.gen';\n\nexport const createQuerySerializer = ({\n allowReserved,\n array,\n object,\n}: QuerySerializerOptions = {}) => {\n const querySerializer = (queryParams: T) => {\n const search: string[] = [];\n if (queryParams && typeof queryParams === 'object') {\n for (const name in queryParams) {\n const value = queryParams[name];\n\n if (value === undefined || value === null) {\n continue;\n }\n\n if (Array.isArray(value)) {\n const serializedArray = serializeArrayParam({\n allowReserved,\n explode: true,\n name,\n style: 'form',\n value,\n ...array,\n });\n if (serializedArray) search.push(serializedArray);\n } else if (typeof value === 'object') {\n const serializedObject = serializeObjectParam({\n allowReserved,\n explode: true,\n name,\n style: 'deepObject',\n value: value as Record,\n ...object,\n });\n if (serializedObject) search.push(serializedObject);\n } else {\n const serializedPrimitive = serializePrimitiveParam({\n allowReserved,\n name,\n value: value as string,\n });\n if (serializedPrimitive) search.push(serializedPrimitive);\n }\n }\n }\n return search.join('&');\n };\n return querySerializer;\n};\n\n/**\n * Infers parseAs value from provided Content-Type header.\n */\nexport const getParseAs = (\n contentType: string | null,\n): Exclude => {\n if (!contentType) {\n // If no Content-Type header is provided, the best we can do is return the raw response body,\n // which is effectively the same as the 'stream' option.\n return 'stream';\n }\n\n const cleanContent = contentType.split(';')[0]?.trim();\n\n if (!cleanContent) {\n return;\n }\n\n if (\n cleanContent.startsWith('application/json') ||\n cleanContent.endsWith('+json')\n ) {\n return 'json';\n }\n\n if (cleanContent === 'multipart/form-data') {\n return 'formData';\n }\n\n if (\n ['application/', 'audio/', 'image/', 'video/'].some((type) =>\n cleanContent.startsWith(type),\n )\n ) {\n return 'blob';\n }\n\n if (cleanContent.startsWith('text/')) {\n return 'text';\n }\n\n return;\n};\n\nconst checkForExistence = (\n options: Pick & {\n headers: Headers;\n },\n name?: string,\n): boolean => {\n if (!name) {\n return false;\n }\n if (\n options.headers.has(name) ||\n options.query?.[name] ||\n options.headers.get('Cookie')?.includes(`${name}=`)\n ) {\n return true;\n }\n return false;\n};\n\nexport const setAuthParams = async ({\n security,\n ...options\n}: Pick, 'security'> &\n Pick & {\n headers: Headers;\n }) => {\n for (const auth of security) {\n if (checkForExistence(options, auth.name)) {\n continue;\n }\n\n const token = await getAuthToken(auth, options.auth);\n\n if (!token) {\n continue;\n }\n\n const name = auth.name ?? 'Authorization';\n\n switch (auth.in) {\n case 'query':\n if (!options.query) {\n options.query = {};\n }\n options.query[name] = token;\n break;\n case 'cookie':\n options.headers.append('Cookie', `${name}=${token}`);\n break;\n case 'header':\n default:\n options.headers.set(name, token);\n break;\n }\n }\n};\n\nexport const buildUrl: Client['buildUrl'] = (options) =>\n getUrl({\n baseUrl: options.baseUrl as string,\n path: options.path,\n query: options.query,\n querySerializer:\n typeof options.querySerializer === 'function'\n ? options.querySerializer\n : createQuerySerializer(options.querySerializer),\n url: options.url,\n });\n\nexport const mergeConfigs = (a: Config, b: Config): Config => {\n const config = { ...a, ...b };\n if (config.baseUrl?.endsWith('/')) {\n config.baseUrl = config.baseUrl.substring(0, config.baseUrl.length - 1);\n }\n config.headers = mergeHeaders(a.headers, b.headers);\n return config;\n};\n\nconst headersEntries = (headers: Headers): Array<[string, string]> => {\n const entries: Array<[string, string]> = [];\n headers.forEach((value, key) => {\n entries.push([key, value]);\n });\n return entries;\n};\n\nexport const mergeHeaders = (\n ...headers: Array['headers'] | undefined>\n): Headers => {\n const mergedHeaders = new Headers();\n for (const header of headers) {\n if (!header) {\n continue;\n }\n\n const iterator =\n header instanceof Headers\n ? headersEntries(header)\n : Object.entries(header);\n\n for (const [key, value] of iterator) {\n if (value === null) {\n mergedHeaders.delete(key);\n } else if (Array.isArray(value)) {\n for (const v of value) {\n mergedHeaders.append(key, v as string);\n }\n } else if (value !== undefined) {\n // assume object headers are meant to be JSON stringified, i.e. their\n // content value in OpenAPI specification is 'application/json'\n mergedHeaders.set(\n key,\n typeof value === 'object' ? JSON.stringify(value) : (value as string),\n );\n }\n }\n }\n return mergedHeaders;\n};\n\ntype ErrInterceptor = (\n error: Err,\n response: Res,\n request: Req,\n options: Options,\n) => Err | Promise;\n\ntype ReqInterceptor = (\n request: Req,\n options: Options,\n) => Req | Promise;\n\ntype ResInterceptor = (\n response: Res,\n request: Req,\n options: Options,\n) => Res | Promise;\n\nclass Interceptors {\n fns: Array = [];\n\n clear(): void {\n this.fns = [];\n }\n\n eject(id: number | Interceptor): void {\n const index = this.getInterceptorIndex(id);\n if (this.fns[index]) {\n this.fns[index] = null;\n }\n }\n\n exists(id: number | Interceptor): boolean {\n const index = this.getInterceptorIndex(id);\n return Boolean(this.fns[index]);\n }\n\n getInterceptorIndex(id: number | Interceptor): number {\n if (typeof id === 'number') {\n return this.fns[id] ? id : -1;\n }\n return this.fns.indexOf(id);\n }\n\n update(\n id: number | Interceptor,\n fn: Interceptor,\n ): number | Interceptor | false {\n const index = this.getInterceptorIndex(id);\n if (this.fns[index]) {\n this.fns[index] = fn;\n return id;\n }\n return false;\n }\n\n use(fn: Interceptor): number {\n this.fns.push(fn);\n return this.fns.length - 1;\n }\n}\n\nexport interface Middleware {\n error: Interceptors>;\n request: Interceptors>;\n response: Interceptors>;\n}\n\nexport const createInterceptors = (): Middleware<\n Req,\n Res,\n Err,\n Options\n> => ({\n error: new Interceptors>(),\n request: new Interceptors>(),\n response: new Interceptors>(),\n});\n\nconst defaultQuerySerializer = createQuerySerializer({\n allowReserved: false,\n array: {\n explode: true,\n style: 'form',\n },\n object: {\n explode: true,\n style: 'deepObject',\n },\n});\n\nconst defaultHeaders = {\n 'Content-Type': 'application/json',\n};\n\nexport const createConfig = (\n override: Config & T> = {},\n): Config & T> => ({\n ...jsonBodySerializer,\n headers: defaultHeaders,\n parseAs: 'auto',\n querySerializer: defaultQuerySerializer,\n ...override,\n});\n","// This file is auto-generated by @hey-api/openapi-ts\n\nimport { createSseClient } from '../core/serverSentEvents.gen';\nimport type { HttpMethod } from '../core/types.gen';\nimport { getValidRequestBody } from '../core/utils.gen';\nimport type {\n Client,\n Config,\n RequestOptions,\n ResolvedRequestOptions,\n} from './types.gen';\nimport {\n buildUrl,\n createConfig,\n createInterceptors,\n getParseAs,\n mergeConfigs,\n mergeHeaders,\n setAuthParams,\n} from './utils.gen';\n\ntype ReqInit = Omit & {\n body?: any;\n headers: ReturnType;\n};\n\nexport const createClient = (config: Config = {}): Client => {\n let _config = mergeConfigs(createConfig(), config);\n\n const getConfig = (): Config => ({ ..._config });\n\n const setConfig = (config: Config): Config => {\n _config = mergeConfigs(_config, config);\n return getConfig();\n };\n\n const interceptors = createInterceptors<\n Request,\n Response,\n unknown,\n ResolvedRequestOptions\n >();\n\n const beforeRequest = async (options: RequestOptions) => {\n const opts = {\n ..._config,\n ...options,\n fetch: options.fetch ?? _config.fetch ?? globalThis.fetch,\n headers: mergeHeaders(_config.headers, options.headers),\n serializedBody: undefined,\n };\n\n if (opts.security) {\n await setAuthParams({\n ...opts,\n security: opts.security,\n });\n }\n\n if (opts.requestValidator) {\n await opts.requestValidator(opts);\n }\n\n if (opts.body !== undefined && opts.bodySerializer) {\n opts.serializedBody = opts.bodySerializer(opts.body);\n }\n\n // remove Content-Type header if body is empty to avoid sending invalid requests\n if (opts.body === undefined || opts.serializedBody === '') {\n opts.headers.delete('Content-Type');\n }\n\n const url = buildUrl(opts);\n\n return { opts, url };\n };\n\n const request: Client['request'] = async (options) => {\n // @ts-expect-error\n const { opts, url } = await beforeRequest(options);\n const requestInit: ReqInit = {\n redirect: 'follow',\n ...opts,\n body: getValidRequestBody(opts),\n };\n\n let request = new Request(url, requestInit);\n\n for (const fn of interceptors.request.fns) {\n if (fn) {\n request = await fn(request, opts);\n }\n }\n\n // fetch must be assigned here, otherwise it would throw the error:\n // TypeError: Failed to execute 'fetch' on 'Window': Illegal invocation\n const _fetch = opts.fetch!;\n let response = await _fetch(request);\n\n for (const fn of interceptors.response.fns) {\n if (fn) {\n response = await fn(response, request, opts);\n }\n }\n\n const result = {\n request,\n response,\n };\n\n if (response.ok) {\n const parseAs =\n (opts.parseAs === 'auto'\n ? getParseAs(response.headers.get('Content-Type'))\n : opts.parseAs) ?? 'json';\n\n if (\n response.status === 204 ||\n response.headers.get('Content-Length') === '0'\n ) {\n let emptyData: any;\n switch (parseAs) {\n case 'arrayBuffer':\n case 'blob':\n case 'text':\n emptyData = await response[parseAs]();\n break;\n case 'formData':\n emptyData = new FormData();\n break;\n case 'stream':\n emptyData = response.body;\n break;\n case 'json':\n default:\n emptyData = {};\n break;\n }\n return opts.responseStyle === 'data'\n ? emptyData\n : {\n data: emptyData,\n ...result,\n };\n }\n\n let data: any;\n switch (parseAs) {\n case 'arrayBuffer':\n case 'blob':\n case 'formData':\n case 'json':\n case 'text':\n data = await response[parseAs]();\n break;\n case 'stream':\n return opts.responseStyle === 'data'\n ? response.body\n : {\n data: response.body,\n ...result,\n };\n }\n\n if (parseAs === 'json') {\n if (opts.responseValidator) {\n await opts.responseValidator(data);\n }\n\n if (opts.responseTransformer) {\n data = await opts.responseTransformer(data);\n }\n }\n\n return opts.responseStyle === 'data'\n ? data\n : {\n data,\n ...result,\n };\n }\n\n const textError = await response.text();\n let jsonError: unknown;\n\n try {\n jsonError = JSON.parse(textError);\n } catch {\n // noop\n }\n\n const error = jsonError ?? textError;\n let finalError = error;\n\n for (const fn of interceptors.error.fns) {\n if (fn) {\n finalError = (await fn(error, response, request, opts)) as string;\n }\n }\n\n finalError = finalError || ({} as string);\n\n if (opts.throwOnError) {\n throw finalError;\n }\n\n // TODO: we probably want to return error and improve types\n return opts.responseStyle === 'data'\n ? undefined\n : {\n error: finalError,\n ...result,\n };\n };\n\n const makeMethodFn =\n (method: Uppercase) => (options: RequestOptions) =>\n request({ ...options, method });\n\n const makeSseFn =\n (method: Uppercase) => async (options: RequestOptions) => {\n const { opts, url } = await beforeRequest(options);\n return createSseClient({\n ...opts,\n body: opts.body as BodyInit | null | undefined,\n headers: opts.headers as unknown as Record,\n method,\n onRequest: async (url, init) => {\n let request = new Request(url, init);\n for (const fn of interceptors.request.fns) {\n if (fn) {\n request = await fn(request, opts);\n }\n }\n return request;\n },\n url,\n });\n };\n\n return {\n buildUrl,\n connect: makeMethodFn('CONNECT'),\n delete: makeMethodFn('DELETE'),\n get: makeMethodFn('GET'),\n getConfig,\n head: makeMethodFn('HEAD'),\n interceptors,\n options: makeMethodFn('OPTIONS'),\n patch: makeMethodFn('PATCH'),\n post: makeMethodFn('POST'),\n put: makeMethodFn('PUT'),\n request,\n setConfig,\n sse: {\n connect: makeSseFn('CONNECT'),\n delete: makeSseFn('DELETE'),\n get: makeSseFn('GET'),\n head: makeSseFn('HEAD'),\n options: makeSseFn('OPTIONS'),\n patch: makeSseFn('PATCH'),\n post: makeSseFn('POST'),\n put: makeSseFn('PUT'),\n trace: makeSseFn('TRACE'),\n },\n trace: makeMethodFn('TRACE'),\n } as Client;\n};\n","// This file is auto-generated by @hey-api/openapi-ts\n\nimport { type ClientOptions, type Config, createClient, createConfig } from './client';\nimport type { ClientOptions as ClientOptions2 } from './types.gen';\n\n/**\n * The `createClientConfig()` function will be called on client initialization\n * and the returned object will become the client's initial configuration.\n *\n * You may want to initialize your client this way instead of calling\n * `setConfig()`. This is useful for example if you're using Next.js\n * to ensure your client always has the correct values.\n */\nexport type CreateClientConfig = (override?: Config) => Config & T>;\n\nexport const client = createClient(createConfig({\n baseUrl: 'http://localhost:26293',\n throwOnError: true\n}));\n","// This file is auto-generated by @hey-api/openapi-ts\r\n\r\nimport type { Client, Options as Options2, TDataShape } from './client';\r\nimport { client } from './client.gen';\r\nimport type { GetGridStylesheetData, GetGridStylesheetResponses, GetGridStylesheetsData, GetGridStylesheetsResponses, GetListStylesheetData, GetListStylesheetResponses, GetListStylesheetsData, GetListStylesheetsResponses, GetRteStylesheetData, GetRteStylesheetResponses, GetRteStylesheetsData, GetRteStylesheetsResponses, GetSettingsData, GetSettingsResponses, GetSingleBlockStylesheetsData, GetSingleBlockStylesheetsResponses, PreviewGridBlockData, PreviewGridBlockResponses, PreviewListBlockData, PreviewListBlockResponses, PreviewRichTextMarkupData, PreviewRichTextMarkupResponses, PreviewSingleBlockData, PreviewSingleBlockResponses } from './types.gen';\r\n\r\nexport type Options = Options2 & {\r\n /**\r\n * You can provide a client instance returned by `createClient()` instead of\r\n * individual options. This might be also useful if you want to implement a\r\n * custom client.\r\n */\r\n client?: Client;\r\n /**\r\n * You can pass arbitrary values through the `meta` object. This can be\r\n * used to access values that aren't defined as part of the SDK function.\r\n */\r\n meta?: Record;\r\n};\r\n\r\nexport class BlockPreviewService {\r\n public static previewGridBlock(options?: Options) {\r\n return (options?.client ?? client).post({\r\n url: '/umbraco/block-preview/api/v1/preview/grid',\r\n ...options,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n ...options?.headers\r\n }\r\n });\r\n }\r\n \r\n /**\r\n * @deprecated\r\n */\r\n public static getGridStylesheet(options?: Options) {\r\n return (options?.client ?? client).get({\r\n url: '/umbraco/block-preview/api/v1/preview/grid/stylesheet',\r\n ...options\r\n });\r\n }\r\n \r\n public static getGridStylesheets(options?: Options) {\r\n return (options?.client ?? client).get({\r\n url: '/umbraco/block-preview/api/v1/preview/grid/stylesheets',\r\n ...options\r\n });\r\n }\r\n \r\n public static previewListBlock(options?: Options) {\r\n return (options?.client ?? client).post({\r\n url: '/umbraco/block-preview/api/v1/preview/list',\r\n ...options,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n ...options?.headers\r\n }\r\n });\r\n }\r\n \r\n /**\r\n * @deprecated\r\n */\r\n public static getListStylesheet(options?: Options) {\r\n return (options?.client ?? client).get({\r\n url: '/umbraco/block-preview/api/v1/preview/list/stylesheet',\r\n ...options\r\n });\r\n }\r\n \r\n public static getListStylesheets(options?: Options) {\r\n return (options?.client ?? client).get({\r\n url: '/umbraco/block-preview/api/v1/preview/list/stylesheets',\r\n ...options\r\n });\r\n }\r\n \r\n public static previewRichTextMarkup(options?: Options) {\r\n return (options?.client ?? client).post({\r\n url: '/umbraco/block-preview/api/v1/preview/rte',\r\n ...options,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n ...options?.headers\r\n }\r\n });\r\n }\r\n \r\n /**\r\n * @deprecated\r\n */\r\n public static getRteStylesheet(options?: Options) {\r\n return (options?.client ?? client).get({\r\n url: '/umbraco/block-preview/api/v1/preview/rte/stylesheet',\r\n ...options\r\n });\r\n }\r\n \r\n public static getRteStylesheets(options?: Options) {\r\n return (options?.client ?? client).get({\r\n url: '/umbraco/block-preview/api/v1/preview/rte/stylesheets',\r\n ...options\r\n });\r\n }\r\n \r\n public static previewSingleBlock(options?: Options) {\r\n return (options?.client ?? client).post({\r\n url: '/umbraco/block-preview/api/v1/preview/single',\r\n ...options,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n ...options?.headers\r\n }\r\n });\r\n }\r\n \r\n public static getSingleBlockStylesheets(options?: Options) {\r\n return (options?.client ?? client).get({\r\n url: '/umbraco/block-preview/api/v1/preview/single/stylesheets',\r\n ...options\r\n });\r\n }\r\n \r\n public static getSettings(options?: Options) {\r\n return (options?.client ?? client).get({\r\n url: '/umbraco/block-preview/api/v1/settings',\r\n ...options\r\n });\r\n }\r\n}\r\n","import { UmbContextToken } from \"@umbraco-cms/backoffice/context-api\";\r\nimport BlockPreviewContext from \"./block-preview.context\";\r\n\r\nexport const BLOCK_PREVIEW_CONTEXT = new UmbContextToken('BlockPreviewContext');\r\n","import BlockPreviewContext from '../context/block-preview.context';\r\nimport { BLOCK_PREVIEW_CONTEXT } from '../context/block-preview.context-token';\r\nimport { BlockContext } from './types';\r\nimport { css, html, ifDefined, nothing, property, PropertyValueMap, state, unsafeHTML } from '@umbraco-cms/backoffice/external/lit';\r\nimport { UMB_BLOCK_WORKSPACE_CONTEXT, UmbBlockDataType } from '@umbraco-cms/backoffice/block';\r\nimport type { UmbBlockEditorCustomViewConfiguration, UmbBlockEditorCustomViewElement } from '@umbraco-cms/backoffice/block-custom-view';\r\nimport { UmbLitElement } from '@umbraco-cms/backoffice/lit-element';\r\nimport { UMB_PROPERTY_DATASET_CONTEXT } from '@umbraco-cms/backoffice/property';\r\nimport { UmbApiError } from '@umbraco-cms/backoffice/resources';\r\nimport { UUIButtonElement } from '@umbraco-cms/backoffice/external/uui';\r\n\r\n/**\r\n * Abstract base class for block preview custom view elements.\r\n * Extracts shared behavior (lifecycle, rendering, click handling, validation,\r\n * context observation helpers, and CSS) so that block-type-specific subclasses\r\n * only implement the parts that differ.\r\n */\r\nexport abstract class BlockPreviewBaseElement\r\n extends UmbLitElement\r\n implements UmbBlockEditorCustomViewElement {\r\n\r\n protected _blockPreviewContext?: BlockPreviewContext;\r\n protected _workspaceContextResolved: boolean = false;\r\n\r\n @property({ attribute: false, hasChanged: (val: any, old: any) => JSON.stringify(val) !== JSON.stringify(old) })\r\n content?: UmbBlockDataType;\r\n\r\n @property({ attribute: false, hasChanged: (val: any, old: any) => JSON.stringify(val) !== JSON.stringify(old) })\r\n settings?: UmbBlockDataType;\r\n\r\n @property({ attribute: false })\r\n contentKey?: string;\r\n\r\n @property({ attribute: false })\r\n config?: UmbBlockEditorCustomViewConfiguration;\r\n\r\n @property({ attribute: false })\r\n unpublished?: boolean;\r\n\r\n @property({ attribute: false })\r\n icon?: string;\r\n\r\n @property({ attribute: false })\r\n label?: string;\r\n\r\n @state()\r\n protected _htmlMarkup: string = '';\r\n\r\n @state()\r\n protected _isLoading: boolean = false;\r\n\r\n @state()\r\n protected _error: string | null = null;\r\n\r\n protected _stylesheetsAdopted: boolean = false;\r\n\r\n protected _requestId: number = 0;\r\n\r\n protected _isConnected: boolean = false;\r\n\r\n /** Tracks pointerdown position on the tag to distinguish clicks from drags. */\r\n private _pointerStartPos: { x: number; y: number } | null = null;\r\n\r\n /** Subclass provides a concrete block context object with block-type-specific fields. */\r\n protected abstract _blockContext: TContext;\r\n\r\n /** Set up all context observers (sort mode, property dataset, workspace). */\r\n protected abstract setupContextObservers(): Promise | void;\r\n\r\n /** Observe the block entry context for content/settings keys and element type info. */\r\n protected abstract observeBlockValue(): void;\r\n\r\n /** Call the appropriate BlockPreviewService API method and return the result. */\r\n protected abstract callPreviewApi(): Promise<{ data?: string | null; error?: unknown }>;\r\n\r\n /** Fetch stylesheet paths from the appropriate BlockPreviewService endpoint. */\r\n protected abstract fetchStylesheets(): Promise;\r\n\r\n constructor() {\r\n super();\r\n this.consumeContext(BLOCK_PREVIEW_CONTEXT, async (context) => {\r\n this._blockPreviewContext = context;\r\n await this.setupContextObservers();\r\n });\r\n }\r\n\r\n override connectedCallback() {\r\n super.connectedCallback();\r\n this._isConnected = true;\r\n }\r\n\r\n override disconnectedCallback() {\r\n super.disconnectedCallback();\r\n this._isConnected = false;\r\n }\r\n\r\n protected override updated(_changedProperties: PropertyValueMap | Map) {\r\n super.updated(_changedProperties);\r\n if (_changedProperties.has('content') || _changedProperties.has('settings')) {\r\n this.renderBlockPreview();\r\n }\r\n }\r\n\r\n // region Shared context observers\r\n\r\n protected observePropertyDataset() {\r\n this.consumeContext(UMB_PROPERTY_DATASET_CONTEXT, (instance) => {\r\n if (instance) {\r\n this._blockContext.culture = instance.getVariantId().culture ?? '';\r\n }\r\n });\r\n }\r\n\r\n // endregion\r\n\r\n // region Workspace helpers\r\n\r\n /**\r\n * Shared handler called once the workspace context provides a unique + documentTypeUnique.\r\n * Sets up block context, triggers block value observation, and loads stylesheets.\r\n */\r\n protected async handleWorkspaceData(unique: string | undefined, documentTypeUnique: string | undefined) {\r\n if (!this._isConnected || !documentTypeUnique) {\r\n return;\r\n }\r\n\r\n this._blockContext.unique = unique?.toString() ?? '';\r\n this._blockPreviewContext?.setUnique(this._blockContext.unique);\r\n\r\n this._blockContext.documentTypeUnique = documentTypeUnique;\r\n this._blockPreviewContext?.setDocumentTypeUnique(this._blockContext.documentTypeUnique);\r\n this._workspaceContextResolved = true;\r\n\r\n this.observeBlockValue();\r\n await this.fetchAndLoadStylesheets();\r\n }\r\n\r\n /**\r\n * Fallback workspace observation via UMB_BLOCK_WORKSPACE_CONTEXT.\r\n * Used when the primary workspace context is unavailable (e.g. nested block editing).\r\n */\r\n protected observeBlockWorkspaceFallback() {\r\n if (this._workspaceContextResolved || !this._blockPreviewContext || this._blockContext.unique !== '') {\r\n return;\r\n }\r\n\r\n this.consumeContext(UMB_BLOCK_WORKSPACE_CONTEXT, async (context) => {\r\n if (context) {\r\n this.observe(context.content.structure.contentTypeUniques, async (contentTypeUniques) => {\r\n const documentTypeUnique = contentTypeUniques[0];\r\n if (!this._isConnected || !documentTypeUnique) {\r\n return;\r\n }\r\n\r\n // Try to get unique from context, then fallback to extraction\r\n this._blockContext.unique = this._blockPreviewContext?.getUnique() ?? '';\r\n if (!this._blockContext.unique && this._blockContext.workspaceEditContentPath) {\r\n this._blockContext.unique = this.extractUniqueFromWorkspacePath(this._blockContext.workspaceEditContentPath);\r\n }\r\n\r\n this._blockContext.documentTypeUnique = documentTypeUnique;\r\n this.observeBlockValue();\r\n await this.fetchAndLoadStylesheets();\r\n });\r\n }\r\n });\r\n }\r\n\r\n protected async fetchAndLoadStylesheets() {\r\n if (this._stylesheetsAdopted || !this._blockPreviewContext) return;\r\n const data = await this.fetchStylesheets();\r\n if (data && data.length > 0) {\r\n const sheets = await Promise.all(\r\n data.map(href => this._blockPreviewContext!.getOrCreateStylesheet(href))\r\n );\r\n const shadowRoot = this.renderRoot as ShadowRoot;\r\n shadowRoot.adoptedStyleSheets = [...shadowRoot.adoptedStyleSheets, ...sheets];\r\n this._stylesheetsAdopted = true;\r\n }\r\n }\r\n\r\n // endregion\r\n\r\n // region Preview rendering\r\n\r\n protected resolveUniqueFromContext() {\r\n if (this._blockPreviewContext != null && this._blockContext.unique === '') {\r\n this._blockContext.unique = this._blockPreviewContext.getUnique();\r\n if (!this._blockContext.unique && this._blockContext.workspaceEditContentPath) {\r\n this._blockContext.unique = this.extractUniqueFromWorkspacePath(this._blockContext.workspaceEditContentPath);\r\n }\r\n }\r\n if (this._blockPreviewContext != null && this._blockContext.documentTypeUnique === '') {\r\n this._blockContext.documentTypeUnique = this._blockPreviewContext.getDocumentTypeUnique();\r\n }\r\n }\r\n\r\n protected async renderBlockPreview() {\r\n if (!this._isConnected) {\r\n return;\r\n }\r\n\r\n this.resolveUniqueFromContext();\r\n\r\n if (!this.validatePreviewData()) {\r\n return;\r\n }\r\n\r\n this._isLoading = true;\r\n this._error = null;\r\n\r\n const requestId = ++this._requestId;\r\n\r\n try {\r\n const { data, error } = await this._blockPreviewContext!.requestQueue.enqueue(() =>\r\n this.callPreviewApi()\r\n );\r\n\r\n if (this._requestId !== requestId) return;\r\n\r\n if (data != null) {\r\n this._htmlMarkup = data;\r\n this._isLoading = false;\r\n }\r\n else if (error) {\r\n this._error = UmbApiError.isUmbApiError(error) ? error.message : this.localize.term('blockPreview_renderError');\r\n this._isLoading = false;\r\n }\r\n else {\r\n this._isLoading = false;\r\n }\r\n } catch (error) {\r\n if (this._requestId !== requestId) return;\r\n this._error = this.localize.term('blockPreview_renderFailed');\r\n this._isLoading = false;\r\n console.error('Block preview error:', error);\r\n }\r\n }\r\n\r\n /**\r\n * Validates that sufficient data is available for a preview request.\r\n * Subclasses may override to add additional checks (e.g. contentUdi).\r\n */\r\n protected validatePreviewData(): boolean {\r\n const context = this._blockContext;\r\n return !!(\r\n context.unique !== '' &&\r\n context.blockEditorAlias !== '' &&\r\n context.contentElementTypeAlias !== ''\r\n );\r\n }\r\n\r\n // endregion\r\n\r\n // region Utilities\r\n\r\n protected extractUniqueFromWorkspacePath(path: string): string {\r\n // Extract the document unique from the workspace edit path\r\n // Pattern: /workspace/document/edit/{unique}/\r\n const match = path.match(/\\/workspace\\/document\\/edit\\/([a-f0-9-]{36})/i);\r\n return match ? match[1] : '';\r\n }\r\n\r\n protected _handlePointerDown(event: PointerEvent) {\r\n this._pointerStartPos = { x: event.clientX, y: event.clientY };\r\n }\r\n\r\n protected _handleClick(event: PointerEvent) {\r\n // Detect drag/resize interactions: if the pointer moved significantly between\r\n // pointerdown and click, suppress the navigation. This prevents the edit modal\r\n // from opening when the user finishes resizing a grid block.\r\n const pointerType = 'pointerType' in event ? (event as PointerEvent).pointerType : '';\r\n if (pointerType !== '') {\r\n if (!this._pointerStartPos) {\r\n // Pointer click with no corresponding pointerdown on this element —\r\n // likely a resize/drag that ended over our tag.\r\n event.preventDefault();\r\n event.stopPropagation();\r\n return;\r\n }\r\n const dx = Math.abs(event.clientX - this._pointerStartPos.x);\r\n const dy = Math.abs(event.clientY - this._pointerStartPos.y);\r\n this._pointerStartPos = null;\r\n if (dx > 5 || dy > 5) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n return;\r\n }\r\n }\r\n this._pointerStartPos = null;\r\n\r\n const path = event.composedPath();\r\n\r\n // Check for clicks on action bars or resize handlers.\r\n const interactiveElements = ['UUI-ACTION-BAR', 'UMB-BLOCK-SCALE-HANDLER'];\r\n if (path.some(x => x instanceof Element && interactiveElements.includes(x.tagName))) {\r\n // Allow edit button clicks through — the tag handles navigation.\r\n const editButton = path.find(x => x instanceof UUIButtonElement && x.href?.includes('block/edit'));\r\n if (editButton) {\r\n return;\r\n }\r\n\r\n // Block all other action bar clicks (delete, copy, etc.) to prevent\r\n // the parent block's from navigating when interacting with\r\n // child blocks inside areas.\r\n event.preventDefault();\r\n event.stopPropagation();\r\n return;\r\n }\r\n\r\n // Handle custom links within the preview\r\n const containsLink = path.filter(x => x instanceof Element && x.tagName === 'A' && x.hasAttribute('data-block-preview-link')) as Element[];\r\n if (containsLink.length > 0) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n const blockPreviewEdit = path.find(x => x instanceof Element && x.tagName === 'A' && x.classList.contains('block-preview-edit'));\r\n if (blockPreviewEdit instanceof Element) {\r\n window.history.pushState({}, '', blockPreviewEdit.getAttribute('href'));\r\n } else {\r\n window.history.pushState({}, '', this._blockContext.workspaceEditContentPath);\r\n }\r\n return;\r\n }\r\n\r\n // All other clicks fall through to the element's default behavior,\r\n // which navigates to this block's edit workspace.\r\n }\r\n\r\n // endregion\r\n\r\n // region Rendering\r\n\r\n override render() {\r\n return html`\r\n ${this._isLoading\r\n ? html`
Loading preview...
`\r\n : this._error\r\n ? html`
${this._error}
`\r\n : this._htmlMarkup\r\n ? html`${unsafeHTML(this._htmlMarkup)}
`\r\n : nothing}\r\n `;\r\n }\r\n\r\n // endregion\r\n\r\n static styles = [\r\n css`\r\n a.block-preview-edit {\r\n display: block;\r\n color: inherit;\r\n text-decoration: inherit;\r\n border: 1px solid transparent;\r\n border-radius: 2px;\r\n }\r\n\r\n a.block-preview-edit:hover {\r\n border-color: var(--uui-color-interactive-emphasis, #3544b1);\r\n }\r\n\r\n .preview-alert {\r\n background-color: var(--uui-color-danger, #f0ac00);\r\n border: 1px solid transparent;\r\n border-radius: 0;\r\n margin-bottom: 20px;\r\n padding: 8px 35px 8px 14px;\r\n position: relative;\r\n\r\n &, a, h4 {\r\n color: #fff;\r\n }\r\n\r\n pre {\r\n white-space: normal;\r\n }\r\n\r\n uui-loader {\r\n color: #fff;\r\n margin-right: 16px;\r\n }\r\n }\r\n\r\n .preview-alert-warning {\r\n background-color: var(--uui-color-warning, #f0ac00);\r\n border-color: transparent;\r\n color: #000;\r\n }\r\n\r\n .preview-alert-info {\r\n background-color: var(--uui-color-default, #3544b1);\r\n border-color: transparent;\r\n color: #fff;\r\n }\r\n\r\n .preview-alert-danger, .preview-alert-error {\r\n background-color: var(--uui-color-danger, #f0ac00);\r\n border-color: transparent;\r\n color: #fff;\r\n }\r\n `\r\n ]\r\n}\r\n","import { UmbDataSourceResponse } from \"@umbraco-cms/backoffice/repository\";\r\nimport { BlockPreviewService } from \"../api\";\r\nimport { UmbControllerHost } from \"@umbraco-cms/backoffice/controller-api\";\r\nimport { tryExecute } from \"@umbraco-cms/backoffice/resources\";\r\n\r\n// Query type definitions\r\nexport interface BlockPreviewQuery {\r\n blockEditorAlias: string;\r\n nodeKey: string;\r\n contentElementAlias: string;\r\n documentTypeUnique: string;\r\n contentUdi: string;\r\n settingsUdi: string;\r\n culture: string;\r\n blockIndex: number;\r\n}\r\n\r\nexport interface RtePreviewQuery {\r\n blockEditorAlias: string;\r\n nodeKey: string;\r\n contentElementAlias: string;\r\n documentTypeUnique: string;\r\n culture: string;\r\n}\r\n\r\nexport interface StylesheetQuery {\r\n documentTypeUnique: string;\r\n nodeKey: string;\r\n}\r\n\r\nexport interface IPreviewDataSource {\r\n previewGridBlock(body: string, query: BlockPreviewQuery): Promise>;\r\n previewListBlock(body: string, query: BlockPreviewQuery): Promise>;\r\n previewSingleBlock(body: string, query: BlockPreviewQuery): Promise>;\r\n previewRichTextMarkup(body: string, query: RtePreviewQuery): Promise>;\r\n getGridStylesheets(query: StylesheetQuery): Promise>;\r\n getListStylesheets(query: StylesheetQuery): Promise>;\r\n getSingleBlockStylesheets(query: StylesheetQuery): Promise>;\r\n getRteStylesheets(query: StylesheetQuery): Promise>;\r\n}\r\n\r\nexport class PreviewDataSource implements IPreviewDataSource {\r\n #host: UmbControllerHost;\r\n\r\n constructor(host: UmbControllerHost) {\r\n this.#host = host;\r\n }\r\n\r\n async previewGridBlock(body: string, query: BlockPreviewQuery): Promise> {\r\n return await tryExecute(this.#host, BlockPreviewService.previewGridBlock({ body, query }));\r\n }\r\n\r\n async previewListBlock(body: string, query: BlockPreviewQuery): Promise> {\r\n return await tryExecute(this.#host, BlockPreviewService.previewListBlock({ body, query }));\r\n }\r\n\r\n async previewSingleBlock(body: string, query: BlockPreviewQuery): Promise> {\r\n return await tryExecute(this.#host, BlockPreviewService.previewSingleBlock({ body, query }));\r\n }\r\n\r\n async previewRichTextMarkup(body: string, query: RtePreviewQuery): Promise> {\r\n return await tryExecute(this.#host, BlockPreviewService.previewRichTextMarkup({ body, query }));\r\n }\r\n\r\n async getGridStylesheets(query: StylesheetQuery): Promise> {\r\n return await tryExecute(this.#host, BlockPreviewService.getGridStylesheets({ query }));\r\n }\r\n\r\n async getListStylesheets(query: StylesheetQuery): Promise> {\r\n return await tryExecute(this.#host, BlockPreviewService.getListStylesheets({ query }));\r\n }\r\n\r\n async getSingleBlockStylesheets(query: StylesheetQuery): Promise> {\r\n return await tryExecute(this.#host, BlockPreviewService.getSingleBlockStylesheets({ query }));\r\n }\r\n\r\n async getRteStylesheets(query: StylesheetQuery): Promise> {\r\n return await tryExecute(this.#host, BlockPreviewService.getRteStylesheets({ query }));\r\n }\r\n}\r\n","import { UmbDataSourceResponse } from \"@umbraco-cms/backoffice/repository\";\r\nimport { BlockPreviewService, type BlockPreviewOptions } from \"../api\";\r\nimport { UmbControllerHost } from \"@umbraco-cms/backoffice/controller-api\";\r\nimport { tryExecute } from \"@umbraco-cms/backoffice/resources\";\r\n\r\nexport interface ISettingsDataSource {\r\n getSettings(): Promise>\r\n}\r\n\r\nexport class SettingsDataSource implements ISettingsDataSource {\r\n #host: UmbControllerHost;\r\n\r\n constructor(host: UmbControllerHost) {\r\n this.#host = host;\r\n }\r\n\r\n async getSettings(): Promise> {\r\n return await tryExecute(this.#host, BlockPreviewService.getSettings());\r\n }\r\n}","import { UmbControllerBase } from \"@umbraco-cms/backoffice/class-api\";\r\nimport { SettingsDataSource } from \"./settings.data-source\";\r\nimport { UmbControllerHost } from \"@umbraco-cms/backoffice/controller-api\";\r\n\r\nexport class SettingsRepository extends UmbControllerBase {\r\n #settingsDataSource: SettingsDataSource;\r\n\r\n constructor(host: UmbControllerHost) {\r\n super(host);\r\n this.#settingsDataSource = new SettingsDataSource(host);\r\n }\r\n\r\n async getSettings() {\r\n const settings = await this.#settingsDataSource.getSettings();\r\n\r\n if (settings && settings?.data) {\r\n return settings.data;\r\n }\r\n }\r\n}","import { BlockPreviewBaseElement } from './block-preview-base.element';\r\nimport { BlockGridContext } from './types';\r\nimport { PreviewDataSource } from '../repository';\r\nimport { css, customElement, property } from \"@umbraco-cms/backoffice/external/lit\";\r\nimport { UMB_BLOCK_GRID_ENTRY_CONTEXT, UMB_BLOCK_GRID_MANAGER_CONTEXT, UmbBlockGridLayoutModel, UmbBlockGridValueModel, UmbBlockGridLayoutAreaItemModel } from \"@umbraco-cms/backoffice/block-grid\";\r\nimport { UMB_CONTENT_WORKSPACE_CONTEXT } from \"@umbraco-cms/backoffice/content\";\r\nimport { observeMultiple } from \"@umbraco-cms/backoffice/observable-api\";\r\n\r\nconst elementName = \"block-grid-preview\";\r\n\r\n@customElement(elementName)\r\nexport class BlockGridPreviewCustomView extends BlockPreviewBaseElement {\r\n\r\n #previewDataSource: PreviewDataSource;\r\n\r\n constructor() {\r\n super();\r\n this.#previewDataSource = new PreviewDataSource(this);\r\n }\r\n\r\n protected _blockContext: BlockGridContext = {\r\n unique: \"\",\r\n documentTypeUnique: \"\",\r\n contentUdi: \"\",\r\n settingsUdi: \"\",\r\n blockEditorAlias: \"\",\r\n culture: \"\",\r\n workspaceEditContentPath: \"\",\r\n contentElementTypeAlias: \"\",\r\n contentElementTypeKey: \"\",\r\n areas: [],\r\n layout: undefined,\r\n layoutAreas: undefined,\r\n blockIndex: 0\r\n };\r\n\r\n private _blockGridValue: UmbBlockGridValueModel = {\r\n layout: {},\r\n expose: [],\r\n contentData: [],\r\n settingsData: []\r\n }\r\n\r\n @property({ attribute: false })\r\n public set blockGridValue(value: UmbBlockGridValueModel | undefined) {\r\n const buildUpValue: Partial = value ? { ...value } : {};\r\n buildUpValue.layout ??= {};\r\n buildUpValue.contentData ??= [];\r\n buildUpValue.settingsData ??= [];\r\n buildUpValue.expose ??= [];\r\n this._blockGridValue = buildUpValue as UmbBlockGridValueModel;\r\n }\r\n public get blockGridValue(): UmbBlockGridValueModel {\r\n return this._blockGridValue;\r\n }\r\n\r\n protected async setupContextObservers() {\r\n this.observePropertyDataset();\r\n await this.#observeContentWorkspace();\r\n }\r\n\r\n async #observeContentWorkspace() {\r\n try {\r\n // The content workspace shares its context alias with the block workspace,\r\n // so when this preview is nested inside another block we must pass beyond\r\n // the nearer block workspace match to reach the document content workspace.\r\n await this.getContext(UMB_CONTENT_WORKSPACE_CONTEXT, { passContextAliasMatches: true });\r\n this.consumeContext(UMB_CONTENT_WORKSPACE_CONTEXT, (context) => {\r\n if (!context) return;\r\n\r\n this.observe(\r\n observeMultiple([context.unique, context.structure.contentTypeUniques]),\r\n async ([unique, contentTypeUniques]) => {\r\n await this.handleWorkspaceData(unique?.toString(), contentTypeUniques?.[0]);\r\n }\r\n );\r\n }).passContextAliasMatches();\r\n } catch {\r\n this.observeBlockWorkspaceFallback();\r\n }\r\n }\r\n\r\n protected observeBlockValue() {\r\n this.consumeContext(UMB_BLOCK_GRID_ENTRY_CONTEXT, async (context) => {\r\n if (context) {\r\n this.observe(\r\n observeMultiple([\r\n context.contentKey,\r\n context.settingsKey,\r\n context.workspaceEditContentPath,\r\n context.contentElementTypeAlias,\r\n context.contentElementTypeKey,\r\n context.areas,\r\n context.layout,\r\n context.layoutAreas\r\n ]),\r\n async ([\r\n contentUdi,\r\n settingsUdi,\r\n workspaceEditContentPath,\r\n contentElementTypeAlias,\r\n contentElementTypeKey,\r\n areas,\r\n layout,\r\n layoutAreas\r\n ]) => {\r\n const prevColumnSpan = this._blockContext.layout?.columnSpan;\r\n const prevRowSpan = this._blockContext.layout?.rowSpan;\r\n const prevLayoutAreas = this._blockContext.layoutAreas;\r\n\r\n this._blockContext.contentUdi = contentUdi ?? '';\r\n this._blockContext.settingsUdi = settingsUdi ?? '';\r\n this._blockContext.workspaceEditContentPath = workspaceEditContentPath ?? '';\r\n this._blockContext.contentElementTypeAlias = contentElementTypeAlias ?? '';\r\n this._blockContext.contentElementTypeKey = contentElementTypeKey ?? '';\r\n this._blockContext.areas = areas;\r\n this._blockContext.layout = layout!;\r\n this._blockContext.layoutAreas = layoutAreas;\r\n\r\n if (!this.#managerObserved && this._blockContext.contentUdi) {\r\n this.#managerObserved = true;\r\n await this.#observeBlockPropertyValue();\r\n }\r\n\r\n // Re-render when layoutAreas first arrive for a block with areas.\r\n // Covers both the deferred case (_htmlMarkup empty) and the early-render\r\n // case (_htmlMarkup set from an incomplete render). blockGridValue.layout\r\n // must be rebuilt here so callPreviewApi() sends the updated area data.\r\n if (!prevLayoutAreas && layoutAreas && (areas?.length ?? 0) > 0 && this.#managerObserved && !this._isLoading) {\r\n this.blockGridValue = {\r\n ...this._blockGridValue,\r\n layout: { ['Umbraco.BlockGrid']: this.#filterLayouts() }\r\n };\r\n this.renderBlockPreview();\r\n }\r\n\r\n // Re-render when layout dimensions change (resize)\r\n if (this._htmlMarkup && layout && (\r\n layout.columnSpan !== prevColumnSpan ||\r\n layout.rowSpan !== prevRowSpan\r\n )) {\r\n this.blockGridValue = {\r\n ...this._blockGridValue,\r\n layout: { ['Umbraco.BlockGrid']: this.#filterLayouts() }\r\n };\r\n clearTimeout(this.#layoutResizeTimer);\r\n this.#layoutResizeTimer = setTimeout(() => {\r\n this.renderBlockPreview();\r\n }, 300);\r\n }\r\n }\r\n );\r\n }\r\n });\r\n }\r\n\r\n #managerObserved = false;\r\n #layoutResizeTimer?: ReturnType;\r\n\r\n async #observeBlockPropertyValue() {\r\n this.consumeContext(UMB_BLOCK_GRID_MANAGER_CONTEXT, (context) => {\r\n if (context) {\r\n this.observe(\r\n observeMultiple([\r\n context.contents,\r\n context.settings,\r\n context.exposes,\r\n context.propertyAlias\r\n ]),\r\n async ([contents, settings, exposes, propertyAlias]) => {\r\n this._blockContext.blockEditorAlias = propertyAlias ?? '';\r\n this.blockGridValue = {\r\n contentData: contents ?? [],\r\n settingsData: settings ?? [],\r\n expose: exposes ?? [],\r\n layout: { ['Umbraco.BlockGrid']: this.#filterLayouts() }\r\n };\r\n this._blockContext.blockIndex = (contents ?? []).findIndex(x => x.key === this._blockContext.contentUdi);\r\n if (!this._htmlMarkup && !this._isLoading) {\r\n // Defer render if areas are expected but layoutAreas haven't arrived yet;\r\n // observeBlockValue will trigger the render once layoutAreas are available.\r\n if ((this._blockContext.areas?.length ?? 0) > 0 && !this._blockContext.layoutAreas) {\r\n return;\r\n }\r\n this.renderBlockPreview();\r\n }\r\n }\r\n );\r\n }\r\n });\r\n }\r\n\r\n #filterLayouts(): UmbBlockGridLayoutModel[] {\r\n const areas = this._blockContext.areas.map(area => {\r\n const model: UmbBlockGridLayoutAreaItemModel = {\r\n key: area.key,\r\n items: this._blockContext.layoutAreas?.find(layout => layout.key === area.key)?.items ?? []\r\n }\r\n return model;\r\n });\r\n\r\n const layoutModel: UmbBlockGridLayoutModel[] =\r\n [\r\n {\r\n areas: areas,\r\n columnSpan: this._blockContext.layout?.columnSpan ?? 0,\r\n rowSpan: this._blockContext.layout?.rowSpan ?? 0,\r\n contentKey: this._blockContext.layout?.contentKey ?? '',\r\n settingsKey: this._blockContext.layout?.settingsKey\r\n }\r\n ];\r\n\r\n return layoutModel;\r\n }\r\n\r\n protected async callPreviewApi() {\r\n return await this.#previewDataSource.previewGridBlock(\r\n JSON.stringify(this.blockGridValue),\r\n {\r\n blockEditorAlias: this._blockContext.blockEditorAlias,\r\n nodeKey: this._blockContext.unique,\r\n contentElementAlias: this._blockContext.contentElementTypeAlias,\r\n documentTypeUnique: this._blockContext.documentTypeUnique,\r\n contentUdi: this._blockContext.contentUdi,\r\n settingsUdi: this._blockContext.settingsUdi,\r\n culture: this._blockContext.culture,\r\n blockIndex: this._blockContext.blockIndex\r\n }\r\n );\r\n }\r\n\r\n protected async fetchStylesheets() {\r\n const { data } = await this.#previewDataSource.getGridStylesheets({\r\n documentTypeUnique: this._blockContext.documentTypeUnique,\r\n nodeKey: this._blockContext.unique\r\n });\r\n return data;\r\n }\r\n\r\n protected override validatePreviewData(): boolean {\r\n return super.validatePreviewData() && this._blockContext.contentUdi !== '';\r\n }\r\n\r\n static override styles = [\r\n ...BlockPreviewBaseElement.styles,\r\n css`\r\n :host {\r\n display: block;\r\n height: 100%;\r\n }\r\n\r\n a.block-preview-edit {\r\n height: 100%;\r\n }\r\n `\r\n ]\r\n}\r\n\r\nexport default BlockGridPreviewCustomView;\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n [elementName]: BlockGridPreviewCustomView;\r\n }\r\n}\r\n","import { BlockPreviewBaseElement } from './block-preview-base.element';\r\nimport { BlockListContext } from './types';\r\nimport { PreviewDataSource } from '../repository';\r\nimport { css, customElement, property, state } from \"@umbraco-cms/backoffice/external/lit\";\r\nimport { UMB_BLOCK_LIST_ENTRY_CONTEXT, UMB_BLOCK_LIST_MANAGER_CONTEXT, UmbBlockListValueModel } from \"@umbraco-cms/backoffice/block-list\";\r\nimport { UMB_CONTENT_WORKSPACE_CONTEXT } from \"@umbraco-cms/backoffice/content\";\r\nimport { observeMultiple } from \"@umbraco-cms/backoffice/observable-api\";\r\n\r\nconst elementName = \"block-list-preview\";\r\n\r\n@customElement(elementName)\r\nexport class BlockListPreviewCustomView extends BlockPreviewBaseElement {\r\n\r\n #previewDataSource: PreviewDataSource;\r\n\r\n constructor() {\r\n super();\r\n this.#previewDataSource = new PreviewDataSource(this);\r\n }\r\n\r\n protected _blockContext: BlockListContext = {\r\n unique: '',\r\n documentTypeUnique: '',\r\n contentUdi: '',\r\n settingsUdi: '',\r\n blockEditorAlias: '',\r\n culture: '',\r\n workspaceEditContentPath: '',\r\n contentElementTypeAlias: '',\r\n contentElementTypeKey: '',\r\n blockIndex: 0\r\n };\r\n\r\n @state()\r\n private _blockListValue: UmbBlockListValueModel = {\r\n layout: {},\r\n expose: [],\r\n contentData: [],\r\n settingsData: []\r\n };\r\n\r\n @property({ attribute: false })\r\n public set blockListValue(value: UmbBlockListValueModel | undefined) {\r\n const buildUpValue: Partial = value ? { ...value } : {};\r\n buildUpValue.layout ??= {};\r\n buildUpValue.contentData ??= [];\r\n buildUpValue.settingsData ??= [];\r\n buildUpValue.expose ??= [];\r\n this._blockListValue = buildUpValue as UmbBlockListValueModel;\r\n }\r\n\r\n public get blockListValue(): UmbBlockListValueModel {\r\n return this._blockListValue;\r\n }\r\n\r\n protected async setupContextObservers() {\r\n this.observePropertyDataset();\r\n await this.#observeContentWorkspace();\r\n }\r\n\r\n async #observeContentWorkspace() {\r\n try {\r\n // The content workspace shares its context alias with the block workspace,\r\n // so when this preview is nested inside another block we must pass beyond\r\n // the nearer block workspace match to reach the document content workspace.\r\n await this.getContext(UMB_CONTENT_WORKSPACE_CONTEXT, { passContextAliasMatches: true });\r\n\r\n this.consumeContext(UMB_CONTENT_WORKSPACE_CONTEXT, (context) => {\r\n if (!context) return;\r\n\r\n this.observe(\r\n observeMultiple([context.unique, context.structure.contentTypeUniques]),\r\n async ([unique, contentTypeUniques]) => {\r\n await this.handleWorkspaceData(unique?.toString(), contentTypeUniques?.[0]);\r\n }\r\n );\r\n }).passContextAliasMatches();\r\n } catch {\r\n this.observeBlockWorkspaceFallback();\r\n }\r\n }\r\n\r\n protected observeBlockValue() {\r\n this.consumeContext(UMB_BLOCK_LIST_ENTRY_CONTEXT, (context) => {\r\n if (context) {\r\n this.observe(\r\n observeMultiple([\r\n context.contentKey,\r\n context.settingsKey,\r\n context.workspaceEditContentPath,\r\n context.contentElementTypeAlias,\r\n context.contentElementTypeKey\r\n ]),\r\n async ([\r\n contentUdi,\r\n settingsUdi,\r\n workspaceEditContentPath,\r\n contentElementTypeAlias,\r\n contentElementTypeKey\r\n ]) => {\r\n this._blockContext.contentUdi = contentUdi ?? '';\r\n this._blockContext.settingsUdi = settingsUdi ?? '';\r\n this._blockContext.workspaceEditContentPath = workspaceEditContentPath ?? '';\r\n this._blockContext.contentElementTypeAlias = contentElementTypeAlias ?? '';\r\n this._blockContext.contentElementTypeKey = contentElementTypeKey ?? '';\r\n\r\n // Only subscribe to manager context once contentUdi is known; subscribing with\r\n // an empty key causes the manager to filter contentData to [] on its first emit,\r\n // and the #managerObserved guard then blocks a corrective re-subscription.\r\n if (!this.#managerObserved && this._blockContext.contentUdi) {\r\n this.#managerObserved = true;\r\n await this.#observeBlockPropertyValue();\r\n }\r\n }\r\n );\r\n }\r\n });\r\n }\r\n\r\n #managerObserved = false;\r\n\r\n #observeBlockPropertyValue() {\r\n this.consumeContext(UMB_BLOCK_LIST_MANAGER_CONTEXT, (context) => {\r\n if (context) {\r\n this.observe(\r\n observeMultiple([\r\n context.contents,\r\n context.settings,\r\n context.layouts,\r\n context.exposes,\r\n context.propertyAlias\r\n ]),\r\n async ([\r\n contents,\r\n settings,\r\n layouts,\r\n exposes,\r\n propertyAlias\r\n ]) => {\r\n this._blockContext.blockEditorAlias = propertyAlias ?? '';\r\n\r\n this.blockListValue = {\r\n contentData: contents?.filter(x => x.key === this._blockContext.contentUdi) ?? [],\r\n settingsData: settings?.filter(x => x.key === this._blockContext.settingsUdi) ?? [],\r\n expose: exposes?.filter(x => x.contentKey === this._blockContext.contentUdi) ?? [],\r\n layout: {\r\n ['Umbraco.BlockList']: layouts?.filter(x => x.contentKey === this._blockContext.contentUdi) ?? []\r\n }\r\n };\r\n\r\n this._blockContext.blockIndex = contents?.indexOf(this.blockListValue.contentData[0]);\r\n if (!this._htmlMarkup && !this._isLoading) {\r\n this.renderBlockPreview();\r\n }\r\n }\r\n );\r\n }\r\n });\r\n }\r\n\r\n protected async callPreviewApi() {\r\n return await this.#previewDataSource.previewListBlock(\r\n JSON.stringify(this.blockListValue),\r\n {\r\n blockEditorAlias: this._blockContext.blockEditorAlias,\r\n nodeKey: this._blockContext.unique,\r\n contentElementAlias: this._blockContext.contentElementTypeAlias,\r\n documentTypeUnique: this._blockContext.documentTypeUnique,\r\n contentUdi: this._blockContext.contentUdi,\r\n settingsUdi: this._blockContext.settingsUdi,\r\n culture: this._blockContext.culture,\r\n blockIndex: this._blockContext.blockIndex,\r\n }\r\n );\r\n }\r\n\r\n protected async fetchStylesheets() {\r\n const { data } = await this.#previewDataSource.getListStylesheets({\r\n documentTypeUnique: this._blockContext.documentTypeUnique,\r\n nodeKey: this._blockContext.unique\r\n });\r\n return data;\r\n }\r\n\r\n protected override validatePreviewData(): boolean {\r\n return super.validatePreviewData() && this._blockContext.contentUdi !== '';\r\n }\r\n\r\n static override styles = [\r\n ...BlockPreviewBaseElement.styles,\r\n css`\r\n :host {\r\n display: block;\r\n height: 100%;\r\n }\r\n\r\n a.block-preview-edit {\r\n height: 100%;\r\n }\r\n `\r\n ]\r\n}\r\n\r\nexport default BlockListPreviewCustomView;\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n [elementName]: BlockListPreviewCustomView;\r\n }\r\n}\r\n","import { BlockPreviewBaseElement } from './block-preview-base.element';\r\nimport { BlockContext } from './types';\r\nimport { PreviewDataSource } from '../repository';\r\nimport { css, customElement, property, state } from \"@umbraco-cms/backoffice/external/lit\";\r\nimport { UMB_BLOCK_SINGLE_ENTRY_CONTEXT, UMB_BLOCK_SINGLE_MANAGER_CONTEXT, UmbBlockSingleValueModel } from \"@umbraco-cms/backoffice/block-single\";\r\nimport { UMB_CONTENT_WORKSPACE_CONTEXT } from \"@umbraco-cms/backoffice/content\";\r\nimport { observeMultiple } from \"@umbraco-cms/backoffice/observable-api\";\r\n\r\nconst elementName = \"block-single-preview\";\r\n\r\n@customElement(elementName)\r\nexport class BlockSinglePreviewCustomView extends BlockPreviewBaseElement {\r\n\r\n #previewDataSource: PreviewDataSource;\r\n\r\n constructor() {\r\n super();\r\n this.#previewDataSource = new PreviewDataSource(this);\r\n }\r\n\r\n protected _blockContext: BlockContext = {\r\n unique: '',\r\n documentTypeUnique: '',\r\n contentUdi: '',\r\n settingsUdi: '',\r\n blockEditorAlias: '',\r\n culture: '',\r\n workspaceEditContentPath: '',\r\n contentElementTypeAlias: '',\r\n contentElementTypeKey: '',\r\n blockIndex: 0\r\n };\r\n\r\n @state()\r\n private _blockSingleValue: UmbBlockSingleValueModel = {\r\n layout: {},\r\n expose: [],\r\n contentData: [],\r\n settingsData: []\r\n };\r\n\r\n @property({ attribute: false })\r\n public set blockSingleValue(value: UmbBlockSingleValueModel | undefined) {\r\n const buildUpValue: Partial = value ? { ...value } : {};\r\n buildUpValue.layout ??= {};\r\n buildUpValue.contentData ??= [];\r\n buildUpValue.settingsData ??= [];\r\n buildUpValue.expose ??= [];\r\n this._blockSingleValue = buildUpValue as UmbBlockSingleValueModel;\r\n }\r\n\r\n public get blockSingleValue(): UmbBlockSingleValueModel {\r\n return this._blockSingleValue;\r\n }\r\n\r\n protected async setupContextObservers() {\r\n this.observePropertyDataset();\r\n await this.#observeContentWorkspace();\r\n }\r\n\r\n async #observeContentWorkspace() {\r\n try {\r\n // The content workspace shares its context alias with the block workspace,\r\n // so when this preview is nested inside another block we must pass beyond\r\n // the nearer block workspace match to reach the document content workspace.\r\n await this.getContext(UMB_CONTENT_WORKSPACE_CONTEXT, { passContextAliasMatches: true });\r\n\r\n this.consumeContext(UMB_CONTENT_WORKSPACE_CONTEXT, (context) => {\r\n if (!context) return;\r\n\r\n this.observe(\r\n observeMultiple([context.unique, context.structure.contentTypeUniques]),\r\n async ([unique, contentTypeUniques]) => {\r\n await this.handleWorkspaceData(unique?.toString(), contentTypeUniques?.[0]);\r\n }\r\n );\r\n }).passContextAliasMatches();\r\n } catch {\r\n this.observeBlockWorkspaceFallback();\r\n }\r\n }\r\n\r\n protected observeBlockValue() {\r\n this.consumeContext(UMB_BLOCK_SINGLE_ENTRY_CONTEXT, (context) => {\r\n if (context) {\r\n this.observe(\r\n observeMultiple([\r\n context.contentKey,\r\n context.settingsKey,\r\n context.workspaceEditContentPath,\r\n context.contentElementTypeAlias,\r\n context.contentElementTypeKey\r\n ]),\r\n async ([\r\n contentUdi,\r\n settingsUdi,\r\n workspaceEditContentPath,\r\n contentElementTypeAlias,\r\n contentElementTypeKey\r\n ]) => {\r\n this._blockContext.contentUdi = contentUdi ?? '';\r\n this._blockContext.settingsUdi = settingsUdi ?? '';\r\n this._blockContext.workspaceEditContentPath = workspaceEditContentPath ?? '';\r\n this._blockContext.contentElementTypeAlias = contentElementTypeAlias ?? '';\r\n this._blockContext.contentElementTypeKey = contentElementTypeKey ?? '';\r\n\r\n if (!this.#managerObserved) {\r\n this.#managerObserved = true;\r\n await this.#observeBlockPropertyValue();\r\n }\r\n }\r\n );\r\n }\r\n });\r\n }\r\n\r\n #managerObserved = false;\r\n\r\n #observeBlockPropertyValue() {\r\n this.consumeContext(UMB_BLOCK_SINGLE_MANAGER_CONTEXT, (context) => {\r\n if (context) {\r\n this.observe(\r\n observeMultiple([\r\n context.contents,\r\n context.settings,\r\n context.layouts,\r\n context.exposes,\r\n context.propertyAlias\r\n ]),\r\n async ([\r\n contents,\r\n settings,\r\n layouts,\r\n exposes,\r\n propertyAlias\r\n ]) => {\r\n this._blockContext.blockEditorAlias = propertyAlias ?? '';\r\n\r\n this.blockSingleValue = {\r\n contentData: contents?.filter(x => x.key === this._blockContext.contentUdi) ?? [],\r\n settingsData: settings?.filter(x => x.key === this._blockContext.settingsUdi) ?? [],\r\n expose: exposes?.filter(x => x.contentKey === this._blockContext.contentUdi) ?? [],\r\n layout: {\r\n ['Umbraco.SingleBlock']: layouts?.filter(x => x.contentKey === this._blockContext.contentUdi) ?? []\r\n }\r\n };\r\n\r\n this._blockContext.blockIndex = contents?.indexOf(this.blockSingleValue.contentData[0]);\r\n if (!this._htmlMarkup && !this._isLoading) {\r\n this.renderBlockPreview();\r\n }\r\n }\r\n );\r\n }\r\n });\r\n }\r\n\r\n protected async callPreviewApi() {\r\n return await this.#previewDataSource.previewSingleBlock(\r\n JSON.stringify(this.blockSingleValue),\r\n {\r\n blockEditorAlias: this._blockContext.blockEditorAlias,\r\n nodeKey: this._blockContext.unique,\r\n contentElementAlias: this._blockContext.contentElementTypeAlias,\r\n documentTypeUnique: this._blockContext.documentTypeUnique,\r\n contentUdi: this._blockContext.contentUdi,\r\n settingsUdi: this._blockContext.settingsUdi,\r\n culture: this._blockContext.culture,\r\n blockIndex: this._blockContext.blockIndex,\r\n }\r\n );\r\n }\r\n\r\n protected async fetchStylesheets() {\r\n const { data } = await this.#previewDataSource.getSingleBlockStylesheets({\r\n documentTypeUnique: this._blockContext.documentTypeUnique,\r\n nodeKey: this._blockContext.unique\r\n });\r\n return data;\r\n }\r\n\r\n protected override validatePreviewData(): boolean {\r\n return super.validatePreviewData() && this._blockContext.contentUdi !== '';\r\n }\r\n\r\n static override styles = [\r\n ...BlockPreviewBaseElement.styles,\r\n css`\r\n :host {\r\n display: block;\r\n height: 100%;\r\n }\r\n\r\n a.block-preview-edit {\r\n height: 100%;\r\n }\r\n `\r\n ]\r\n}\r\n\r\nexport default BlockSinglePreviewCustomView;\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n [elementName]: BlockSinglePreviewCustomView;\r\n }\r\n}\r\n","import { BlockPreviewBaseElement } from './block-preview-base.element';\r\nimport { BlockContext } from './types';\r\nimport { PreviewDataSource } from '../repository';\r\nimport { customElement, property, state } from \"@umbraco-cms/backoffice/external/lit\";\r\nimport { UMB_BLOCK_RTE_ENTRY_CONTEXT, UMB_BLOCK_RTE_MANAGER_CONTEXT, UmbBlockRteValueModel } from \"@umbraco-cms/backoffice/block-rte\";\r\nimport { UMB_DOCUMENT_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/document';\r\nimport { observeMultiple } from \"@umbraco-cms/backoffice/observable-api\";\r\n\r\nconst elementName = \"rich-text-preview\";\r\n\r\n@customElement(elementName)\r\nexport class RichTextPreviewCustomView extends BlockPreviewBaseElement {\r\n\r\n #previewDataSource: PreviewDataSource;\r\n\r\n constructor() {\r\n super();\r\n this.#previewDataSource = new PreviewDataSource(this);\r\n }\r\n\r\n protected _blockContext: BlockContext = {\r\n unique: '',\r\n documentTypeUnique: '',\r\n contentUdi: '',\r\n settingsUdi: '',\r\n blockEditorAlias: '',\r\n culture: '',\r\n workspaceEditContentPath: '',\r\n contentElementTypeAlias: '',\r\n contentElementTypeKey: '',\r\n blockIndex: 0\r\n };\r\n\r\n @state()\r\n private _blockRteValue: UmbBlockRteValueModel = {\r\n layout: {},\r\n expose: [],\r\n contentData: [],\r\n settingsData: []\r\n }\r\n\r\n @property({ attribute: false })\r\n public set blockRteValue(value: UmbBlockRteValueModel | undefined) {\r\n const buildUpValue: Partial = value ? { ...value } : {};\r\n buildUpValue.layout ??= {};\r\n buildUpValue.contentData ??= [];\r\n buildUpValue.settingsData ??= [];\r\n buildUpValue.expose ??= [];\r\n this._blockRteValue = buildUpValue as UmbBlockRteValueModel;\r\n }\r\n public get blockRteValue(): UmbBlockRteValueModel {\r\n return this._blockRteValue;\r\n }\r\n\r\n protected setupContextObservers() {\r\n this.observePropertyDataset();\r\n // Observe the block entry/manager contexts independently of the workspace.\r\n // These RTE-specific contexts are always available to the block view, whereas\r\n // UMB_DOCUMENT_WORKSPACE_CONTEXT is absent when the host block is edited inside a\r\n // side-panel modal (e.g. an RTE field on a block nested in a Block Grid/List).\r\n // Gating this behind the document workspace meant the preview never rendered there.\r\n this.observeBlockValue();\r\n this.#observeDocumentWorkspace();\r\n }\r\n\r\n #observeDocumentWorkspace() {\r\n try {\r\n // The document workspace shares its context alias with the block workspace,\r\n // so when this preview is nested inside another block we must pass beyond\r\n // the nearer block workspace match to reach the document workspace.\r\n this.consumeContext(UMB_DOCUMENT_WORKSPACE_CONTEXT, (context) => {\r\n if (context) {\r\n this._workspaceContextResolved = true;\r\n this.observe(\r\n observeMultiple([context.unique, context.contentTypeUnique]),\r\n async ([unique, documentTypeUnique]) => {\r\n await this.handleWorkspaceData(unique?.toString(), documentTypeUnique);\r\n }\r\n );\r\n }\r\n }).passContextAliasMatches();\r\n } catch {\r\n this.observeBlockWorkspaceFallback();\r\n }\r\n }\r\n\r\n #entryObserved = false;\r\n\r\n protected observeBlockValue(): void {\r\n // Set up the entry-context subscription only once; it is now invoked both from\r\n // setupContextObservers and (for the document-level case) from handleWorkspaceData.\r\n if (this.#entryObserved) return;\r\n this.#entryObserved = true;\r\n this.consumeContext(UMB_BLOCK_RTE_ENTRY_CONTEXT, (context) => {\r\n if (context != null) {\r\n this.observe(\r\n observeMultiple([\r\n context.contentKey,\r\n context.settingsKey,\r\n context.workspaceEditContentPath,\r\n context.contentElementTypeAlias,\r\n context.contentElementTypeKey\r\n ]),\r\n async ([\r\n contentUdi,\r\n settingsUdi,\r\n workspaceEditContentPath,\r\n contentElementTypeAlias,\r\n contentElementTypeKey\r\n ]) => {\r\n this._blockContext.contentUdi = contentUdi ?? '';\r\n this._blockContext.settingsUdi = settingsUdi ?? '';\r\n this._blockContext.workspaceEditContentPath = workspaceEditContentPath ?? '';\r\n this._blockContext.contentElementTypeAlias = contentElementTypeAlias ?? '';\r\n this._blockContext.contentElementTypeKey = contentElementTypeKey ?? '';\r\n\r\n // Only subscribe to manager context once contentUdi is known; subscribing with\r\n // an empty key causes the manager to filter contentData to [] on its first emit,\r\n // and the #managerObserved guard then blocks a corrective re-subscription.\r\n if (!this.#managerObserved && this._blockContext.contentUdi) {\r\n this.#managerObserved = true;\r\n await this.#observeBlockPropertyValue();\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n #managerObserved = false;\r\n\r\n #observeBlockPropertyValue(): void {\r\n this.consumeContext(UMB_BLOCK_RTE_MANAGER_CONTEXT, (context) => {\r\n if (context != null) {\r\n this.observe(\r\n observeMultiple([\r\n context.contents,\r\n context.settings,\r\n context.layouts,\r\n context.exposes,\r\n context.propertyAlias\r\n ]),\r\n async ([\r\n contents,\r\n settings,\r\n layouts,\r\n exposes,\r\n propertyAlias\r\n ]) => {\r\n this._blockContext.blockEditorAlias = propertyAlias ?? '';\r\n\r\n this.blockRteValue = {\r\n contentData: contents?.filter(x => x.key === this._blockContext.contentUdi) ?? [],\r\n settingsData: settings?.filter(x => x.key === this._blockContext.settingsUdi) ?? [],\r\n expose: exposes?.filter(x => x.contentKey === this._blockContext.contentUdi) ?? [],\r\n layout: {\r\n ['Umbraco.RichText']: layouts?.filter(x => x.contentKey === this._blockContext.contentUdi) ?? []\r\n }\r\n };\r\n if (!this._htmlMarkup && !this._isLoading) {\r\n this.renderBlockPreview();\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n protected async callPreviewApi() {\r\n return await this.#previewDataSource.previewRichTextMarkup(\r\n JSON.stringify(this.blockRteValue),\r\n {\r\n blockEditorAlias: this._blockContext.blockEditorAlias,\r\n nodeKey: this._blockContext.unique,\r\n contentElementAlias: this._blockContext.contentElementTypeAlias,\r\n documentTypeUnique: this._blockContext.documentTypeUnique,\r\n culture: this._blockContext.culture\r\n }\r\n );\r\n }\r\n\r\n protected async fetchStylesheets() {\r\n const { data } = await this.#previewDataSource.getRteStylesheets({\r\n documentTypeUnique: this._blockContext.documentTypeUnique,\r\n nodeKey: this._blockContext.unique\r\n });\r\n return data;\r\n }\r\n}\r\n\r\nexport default RichTextPreviewCustomView;\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n [elementName]: RichTextPreviewCustomView;\r\n }\r\n}\r\n","/**\r\n * Concurrency-limited request queue for block preview API calls.\r\n *\r\n * When a page has many blocks, all preview elements fire API requests\r\n * simultaneously after their debounce timers expire. This overwhelms\r\n * the server and can cause empty or malformed responses.\r\n *\r\n * Inspired by the CMS `UmbManagementApiItemDataCache.scheduleBatchedFetch`\r\n * pattern, this queue limits concurrent in-flight requests so the server\r\n * processes a manageable number at a time.\r\n */\r\nexport class BlockPreviewRequestQueue {\r\n #maxConcurrent: number;\r\n #activeCount = 0;\r\n #queue: Array<() => void> = [];\r\n\r\n constructor(maxConcurrent: number = 3) {\r\n this.#maxConcurrent = maxConcurrent;\r\n }\r\n\r\n /**\r\n * Enqueue a task to run with concurrency limiting.\r\n * If fewer than `maxConcurrent` tasks are active, the task runs immediately.\r\n * Otherwise it waits until a slot is available.\r\n */\r\n async enqueue(task: () => Promise): Promise {\r\n if (this.#activeCount >= this.#maxConcurrent) {\r\n await new Promise((resolve) => {\r\n this.#queue.push(resolve);\r\n });\r\n }\r\n\r\n this.#activeCount++;\r\n try {\r\n return await task();\r\n } finally {\r\n this.#activeCount--;\r\n if (this.#queue.length > 0) {\r\n const next = this.#queue.shift()!;\r\n next();\r\n }\r\n }\r\n }\r\n}\r\n","import { UmbControllerBase } from \"@umbraco-cms/backoffice/class-api\";\r\nimport { UmbControllerHost } from \"@umbraco-cms/backoffice/controller-api\";\r\nimport { UmbStringState } from \"@umbraco-cms/backoffice/observable-api\";\r\nimport { BlockPreviewRequestQueue } from \"./block-preview-request-queue\";\r\n\r\nexport class BlockPreviewContext extends UmbControllerBase {\r\n\r\n #requestQueue = new BlockPreviewRequestQueue(3);\r\n #stylesheetCache = new Map>();\r\n\r\n /** Shared concurrency-limited queue for preview API requests. */\r\n get requestQueue(): BlockPreviewRequestQueue {\r\n return this.#requestQueue;\r\n }\r\n\r\n // Node key cache used as a fallback when a preview cannot reach its content\r\n // workspace directly (e.g. when nested inside another block, whose workspace\r\n // context shadows the document workspace under the shared 'UmbWorkspaceContext'\r\n // alias).\r\n #unique = new UmbStringState('');\r\n #documentTypeUnique = new UmbStringState('');\r\n\r\n constructor(host: UmbControllerHost) {\r\n super(host);\r\n }\r\n\r\n getUnique(): string {\r\n return this.#unique.getValue();\r\n }\r\n\r\n async setUnique(unique: string) {\r\n if (unique !== '') {\r\n this.#unique.setValue(unique);\r\n }\r\n }\r\n\r\n getDocumentTypeUnique(): string {\r\n return this.#documentTypeUnique.getValue();\r\n }\r\n\r\n async setDocumentTypeUnique(documentTypeUnique: string) {\r\n if (documentTypeUnique !== '') {\r\n this.#documentTypeUnique.setValue(documentTypeUnique);\r\n }\r\n }\r\n\r\n getOrCreateStylesheet(href: string): Promise {\r\n const cached = this.#stylesheetCache.get(href);\r\n if (cached) return cached;\r\n\r\n const promise = fetch(href)\r\n .then(response => response.text())\r\n .then(css => {\r\n const sheet = new CSSStyleSheet();\r\n sheet.replaceSync(css);\r\n return sheet;\r\n });\r\n this.#stylesheetCache.set(href, promise);\r\n return promise;\r\n }\r\n\r\n}\r\n\r\nexport default BlockPreviewContext;\r\n","// ManifestGlobalContext is only available in extension-registry, not extension-api\r\nimport { ManifestGlobalContext } from \"@umbraco-cms/backoffice/extension-registry\";\r\n\r\nconst contexts: Array = [\r\n {\r\n type: 'globalContext',\r\n alias: 'BlockPreview.Context',\r\n name: 'BlockPreview Context',\r\n js: () => import('./block-preview.context.ts')\r\n }\r\n]\r\n\r\nexport const manifests = contexts;\r\n","import type { ManifestLocalization } from '@umbraco-cms/backoffice/localization';\r\n\r\nconst localizations: Array = [\r\n {\r\n type: 'localization',\r\n alias: 'BlockPreview.Localization.En',\r\n name: 'BlockPreview English Localization',\r\n meta: {\r\n culture: 'en',\r\n },\r\n js: () => import('./en.ts'),\r\n },\r\n];\r\n\r\nexport const manifests = localizations;\r\n","import { UMB_AUTH_CONTEXT } from '@umbraco-cms/backoffice/auth';\r\nimport { ManifestBlockEditorCustomView } from '@umbraco-cms/backoffice/block-custom-view';\r\nimport { UmbEntryPointOnInit } from '@umbraco-cms/backoffice/extension-api';\r\n\r\nimport { client } from './api/index.ts';\r\nimport { BlockGridPreviewCustomView, BlockListPreviewCustomView, BlockSinglePreviewCustomView, RichTextPreviewCustomView } from './blockEditor';\r\nimport { BLOCK_PREVIEW_CONTEXT } from './context/block-preview.context-token.ts';\r\nimport BlockPreviewContext from './context/block-preview.context.ts';\r\nimport { manifests as contextManifests } from './context/manifests.ts';\r\nimport { manifests as localizationManifests } from './localization/manifests.ts';\r\nimport { SettingsRepository } from './repository';\r\n\r\nexport * from './blockEditor';\r\nexport * from './repository';\r\n\r\nexport const onInit: UmbEntryPointOnInit = async (host, extensionRegistry) => {\r\n\r\n host.consumeContext(UMB_AUTH_CONTEXT, async (authContext) => {\r\n if (!authContext) return;\r\n\r\n const config = authContext.getOpenApiConfiguration();\r\n\r\n client.setConfig({\r\n baseUrl: config?.base ?? \"\",\r\n auth: config?.token ?? undefined,\r\n credentials: config?.credentials ?? \"same-origin\",\r\n });\r\n\r\n client.interceptors.request.use(async (request, _options) => {\r\n const token = await config.token();\r\n request.headers.set('Authorization', `Bearer ${token}`);\r\n return request;\r\n });\r\n\r\n const settingsRepository = new SettingsRepository(host);\r\n const settings = await settingsRepository.getSettings();\r\n\r\n let customViewManifests: ManifestBlockEditorCustomView[] = [];\r\n\r\n if (settings) {\r\n if (settings.blockGrid.enabled) {\r\n let blockGridManifest: ManifestBlockEditorCustomView = {\r\n type: 'blockEditorCustomView',\r\n alias: 'BlockPreview.GridCustomView',\r\n name: 'BlockPreview Grid Custom View',\r\n element: BlockGridPreviewCustomView,\r\n forBlockEditor: 'block-grid'\r\n };\r\n\r\n if (settings.blockGrid.contentTypes?.length !== 0) {\r\n blockGridManifest.forContentTypeAlias = settings.blockGrid.contentTypes as string[];\r\n }\r\n\r\n customViewManifests.push(blockGridManifest);\r\n }\r\n\r\n if (settings.blockList.enabled) {\r\n let blockListManifest: ManifestBlockEditorCustomView = {\r\n type: 'blockEditorCustomView',\r\n alias: 'BlockPreview.ListCustomView',\r\n name: 'BlockPreview List Custom View',\r\n element: BlockListPreviewCustomView,\r\n forBlockEditor: 'block-list'\r\n };\r\n\r\n if (settings.blockList.contentTypes?.length !== 0) {\r\n blockListManifest.forContentTypeAlias = settings.blockList.contentTypes as string[];\r\n }\r\n\r\n customViewManifests.push(blockListManifest);\r\n }\r\n\r\n if (settings.singleBlock.enabled) {\r\n let singleBlockManifest: ManifestBlockEditorCustomView = {\r\n type: 'blockEditorCustomView',\r\n alias: 'BlockPreview.SingleBlockCustomView',\r\n name: 'BlockPreview Single Block Custom View',\r\n element: BlockSinglePreviewCustomView,\r\n forBlockEditor: 'block-single'\r\n };\r\n\r\n if (settings.singleBlock.contentTypes?.length !== 0) {\r\n singleBlockManifest.forContentTypeAlias = settings.singleBlock.contentTypes as string[];\r\n }\r\n\r\n customViewManifests.push(singleBlockManifest);\r\n }\r\n\r\n if (settings.richText.enabled) {\r\n let richTextManifest: ManifestBlockEditorCustomView = {\r\n type: 'blockEditorCustomView',\r\n alias: 'BlockPreview.RichTextCustomView',\r\n name: 'BlockPreview Rich Text Custom View',\r\n element: RichTextPreviewCustomView,\r\n forBlockEditor: 'block-rte'\r\n };\r\n\r\n if (settings.richText.contentTypes?.length !== 0) {\r\n richTextManifest.forContentTypeAlias = settings.richText.contentTypes as string[];\r\n }\r\n\r\n customViewManifests.push(richTextManifest);\r\n }\r\n }\r\n\r\n extensionRegistry.registerMany([\r\n ...customViewManifests,\r\n ...contextManifests,\r\n ...localizationManifests\r\n ]);\r\n\r\n host.provideContext(BLOCK_PREVIEW_CONTEXT, new BlockPreviewContext(host));\r\n });\r\n};"],"names":["jsonBodySerializer","body","_key","value","createSseClient","onRequest","onSseError","onSseEvent","responseTransformer","responseValidator","sseDefaultRetryDelay","sseMaxRetryAttempts","sseMaxRetryDelay","sseSleepFn","url","options","lastEventId","sleep","ms","resolve","retryDelay","attempt","signal","headers","requestInit","request","response","reader","buffer","abortHandler","done","chunks","chunk","lines","dataLines","eventName","line","parsed","data","parsedJson","rawData","error","backoff","separatorArrayExplode","style","separatorArrayNoExplode","separatorObjectExplode","serializeArrayParam","allowReserved","explode","name","joinedValues","v","separator","serializePrimitiveParam","serializeObjectParam","valueOnly","values","key","PATH_PARAM_RE","defaultPathSerializer","path","_url","matches","match","replaceValue","getUrl","baseUrl","query","querySerializer","pathUrl","search","getValidRequestBody","hasBody","getAuthToken","auth","callback","token","createQuerySerializer","array","object","queryParams","serializedArray","serializedObject","serializedPrimitive","getParseAs","contentType","cleanContent","type","checkForExistence","setAuthParams","security","buildUrl","mergeConfigs","a","b","config","mergeHeaders","headersEntries","entries","mergedHeaders","header","iterator","Interceptors","id","index","fn","createInterceptors","defaultQuerySerializer","defaultHeaders","createConfig","override","createClient","_config","getConfig","setConfig","interceptors","beforeRequest","opts","_fetch","result","parseAs","emptyData","textError","jsonError","finalError","makeMethodFn","method","makeSseFn","init","client","BlockPreviewService","BLOCK_PREVIEW_CONTEXT","UmbContextToken","BlockPreviewBaseElement","UmbLitElement","context","_changedProperties","UMB_PROPERTY_DATASET_CONTEXT","instance","unique","documentTypeUnique","UMB_BLOCK_WORKSPACE_CONTEXT","contentTypeUniques","sheets","href","shadowRoot","requestId","UmbApiError","event","dx","dy","interactiveElements","x","UUIButtonElement","blockPreviewEdit","html","ifDefined","unsafeHTML","nothing","css","__decorateClass","property","val","old","state","PreviewDataSource","#host","host","tryExecute","SettingsDataSource","SettingsRepository","UmbControllerBase","#settingsDataSource","settings","_previewDataSource","_BlockGridPreviewCustomView_instances","observeContentWorkspace_fn","_managerObserved","_layoutResizeTimer","observeBlockPropertyValue_fn","filterLayouts_fn","elementName","BlockGridPreviewCustomView","__privateAdd","__privateSet","buildUpValue","__privateMethod","UMB_BLOCK_GRID_ENTRY_CONTEXT","observeMultiple","contentUdi","settingsUdi","workspaceEditContentPath","contentElementTypeAlias","contentElementTypeKey","areas","layout","layoutAreas","prevColumnSpan","prevRowSpan","prevLayoutAreas","__privateGet","UMB_CONTENT_WORKSPACE_CONTEXT","UMB_BLOCK_GRID_MANAGER_CONTEXT","contents","exposes","propertyAlias","area","customElement","_BlockListPreviewCustomView_instances","BlockListPreviewCustomView","UMB_BLOCK_LIST_ENTRY_CONTEXT","UMB_BLOCK_LIST_MANAGER_CONTEXT","layouts","_BlockSinglePreviewCustomView_instances","BlockSinglePreviewCustomView","UMB_BLOCK_SINGLE_ENTRY_CONTEXT","UMB_BLOCK_SINGLE_MANAGER_CONTEXT","_RichTextPreviewCustomView_instances","observeDocumentWorkspace_fn","_entryObserved","RichTextPreviewCustomView","UMB_BLOCK_RTE_ENTRY_CONTEXT","UMB_DOCUMENT_WORKSPACE_CONTEXT","UMB_BLOCK_RTE_MANAGER_CONTEXT","BlockPreviewRequestQueue","#maxConcurrent","#activeCount","#queue","maxConcurrent","task","BlockPreviewContext","#requestQueue","#stylesheetCache","#unique","UmbStringState","#documentTypeUnique","cached","promise","sheet","contexts","blockPreview_context","manifests","localizations","onInit","extensionRegistry","UMB_AUTH_CONTEXT","authContext","_options","customViewManifests","blockGridManifest","blockListManifest","singleBlockManifest","richTextManifest","contextManifests","localizationManifests"],"mappings":";;;;;;;;;;;;;;;;AAiEO,MAAMA,KAAqB;AAAA,EAChC,gBAAgB,CAAIC,MAClB,KAAK;AAAA,IAAUA;AAAA,IAAM,CAACC,GAAMC,MAC1B,OAAOA,KAAU,WAAWA,EAAM,aAAaA;AAAA,EAAA;AAErD,GCkBaC,KAAkB,CAAkB;AAAA,EAC/C,WAAAC;AAAA,EACA,YAAAC;AAAA,EACA,YAAAC;AAAA,EACA,qBAAAC;AAAA,EACA,mBAAAC;AAAA,EACA,sBAAAC;AAAA,EACA,qBAAAC;AAAA,EACA,kBAAAC;AAAA,EACA,YAAAC;AAAA,EACA,KAAAC;AAAA,EACA,GAAGC;AACL,MAA8D;AAC5D,MAAIC;AAEJ,QAAMC,IACJJ,MACC,CAACK,MAAe,IAAI,QAAQ,CAACC,MAAY,WAAWA,GAASD,CAAE,CAAC;AA6JnE,SAAO,EAAE,QA3JY,mBAAmB;AACtC,QAAIE,IAAqBV,KAAwB,KAC7CW,IAAU;AACd,UAAMC,IAASP,EAAQ,UAAU,IAAI,kBAAkB;AAEvD,WACM,CAAAO,EAAO,WADA;AAGX,MAAAD;AAEA,YAAME,IACJR,EAAQ,mBAAmB,UACvBA,EAAQ,UACR,IAAI,QAAQA,EAAQ,OAA6C;AAEvE,MAAIC,MAAgB,UAClBO,EAAQ,IAAI,iBAAiBP,CAAW;AAG1C,UAAI;AACF,cAAMQ,IAA2B;AAAA,UAC/B,UAAU;AAAA,UACV,GAAGT;AAAA,UACH,MAAMA,EAAQ;AAAA,UACd,SAAAQ;AAAA,UACA,QAAAD;AAAA,QAAA;AAEF,YAAIG,IAAU,IAAI,QAAQX,GAAKU,CAAW;AAC1C,QAAInB,MACFoB,IAAU,MAAMpB,EAAUS,GAAKU,CAAW;AAK5C,cAAME,IAAW,OADFX,EAAQ,SAAS,WAAW,OACbU,CAAO;AAErC,YAAI,CAACC,EAAS;AACZ,gBAAM,IAAI;AAAA,YACR,eAAeA,EAAS,MAAM,IAAIA,EAAS,UAAU;AAAA,UAAA;AAGzD,YAAI,CAACA,EAAS,KAAM,OAAM,IAAI,MAAM,yBAAyB;AAE7D,cAAMC,IAASD,EAAS,KACrB,YAAY,IAAI,kBAAA,CAAmB,EACnC,UAAA;AAEH,YAAIE,KAAS;AAEb,cAAMC,KAAe,MAAM;AACzB,cAAI;AACF,YAAAF,EAAO,OAAA;AAAA,UACT,QAAQ;AAAA,UAER;AAAA,QACF;AAEA,QAAAL,EAAO,iBAAiB,SAASO,EAAY;AAE7C,YAAI;AACF,qBAAa;AACX,kBAAM,EAAE,MAAAC,IAAM,OAAA3B,GAAA,IAAU,MAAMwB,EAAO,KAAA;AACrC,gBAAIG,GAAM;AACV,YAAAF,MAAUzB;AAEV,kBAAM4B,KAASH,GAAO,MAAM;AAAA;AAAA,CAAM;AAClC,YAAAA,KAASG,GAAO,SAAS;AAEzB,uBAAWC,MAASD,IAAQ;AAC1B,oBAAME,KAAQD,GAAM,MAAM;AAAA,CAAI,GACxBE,IAA2B,CAAA;AACjC,kBAAIC;AAEJ,yBAAWC,KAAQH;AACjB,oBAAIG,EAAK,WAAW,OAAO;AACzB,kBAAAF,EAAU,KAAKE,EAAK,QAAQ,aAAa,EAAE,CAAC;AAAA,yBACnCA,EAAK,WAAW,QAAQ;AACjC,kBAAAD,KAAYC,EAAK,QAAQ,cAAc,EAAE;AAAA,yBAChCA,EAAK,WAAW,KAAK;AAC9B,kBAAApB,IAAcoB,EAAK,QAAQ,WAAW,EAAE;AAAA,yBAC/BA,EAAK,WAAW,QAAQ,GAAG;AACpC,wBAAMC,KAAS,OAAO;AAAA,oBACpBD,EAAK,QAAQ,cAAc,EAAE;AAAA,oBAC7B;AAAA,kBAAA;AAEF,kBAAK,OAAO,MAAMC,EAAM,MACtBjB,IAAaiB;AAAA,gBAEjB;AAGF,kBAAIC,GACAC,KAAa;AAEjB,kBAAIL,EAAU,QAAQ;AACpB,sBAAMM,IAAUN,EAAU,KAAK;AAAA,CAAI;AACnC,oBAAI;AACF,kBAAAI,IAAO,KAAK,MAAME,CAAO,GACzBD,KAAa;AAAA,gBACf,QAAQ;AACN,kBAAAD,IAAOE;AAAA,gBACT;AAAA,cACF;AAEA,cAAID,OACE9B,KACF,MAAMA,EAAkB6B,CAAI,GAG1B9B,MACF8B,IAAO,MAAM9B,EAAoB8B,CAAI,KAIzC/B,IAAa;AAAA,gBACX,MAAA+B;AAAA,gBACA,OAAOH;AAAA,gBACP,IAAInB;AAAA,gBACJ,OAAOI;AAAA,cAAA,CACR,GAEGc,EAAU,WACZ,MAAMI;AAAA,YAEV;AAAA,UACF;AAAA,QACF,UAAA;AACE,UAAAhB,EAAO,oBAAoB,SAASO,EAAY,GAChDF,EAAO,YAAA;AAAA,QACT;AAEA;AAAA,MACF,SAASc,GAAO;AAId,YAFAnC,IAAamC,CAAK,GAGhB9B,MAAwB,UACxBU,KAAWV;AAEX;AAIF,cAAM+B,IAAU,KAAK;AAAA,UACnBtB,IAAa,MAAMC,IAAU;AAAA,UAC7BT,KAAoB;AAAA,QAAA;AAEtB,cAAMK,EAAMyB,CAAO;AAAA,MACrB;AAAA,IACF;AAAA,EACF,EAEe,EAEN;AACX,GC1OaC,KAAwB,CAACC,MAA+B;AACnE,UAAQA,GAAA;AAAA,IACN,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EAAA;AAEb,GAEaC,KAA0B,CAACD,MAA+B;AACrE,UAAQA,GAAA;AAAA,IACN,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EAAA;AAEb,GAEaE,KAAyB,CAACF,MAAgC;AACrE,UAAQA,GAAA;AAAA,IACN,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EAAA;AAEb,GAEaG,KAAsB,CAAC;AAAA,EAClC,eAAAC;AAAA,EACA,SAAAC;AAAA,EACA,MAAAC;AAAA,EACA,OAAAN;AAAA,EACA,OAAAzC;AACF,MAEM;AACJ,MAAI,CAAC8C,GAAS;AACZ,UAAME,KACJH,IAAgB7C,IAAQA,EAAM,IAAI,CAACiD,MAAM,mBAAmBA,CAAW,CAAC,GACxE,KAAKP,GAAwBD,CAAK,CAAC;AACrC,YAAQA,GAAA;AAAA,MACN,KAAK;AACH,eAAO,IAAIO,CAAY;AAAA,MACzB,KAAK;AACH,eAAO,IAAID,CAAI,IAAIC,CAAY;AAAA,MACjC,KAAK;AACH,eAAOA;AAAAA,MACT;AACE,eAAO,GAAGD,CAAI,IAAIC,CAAY;AAAA,IAAA;AAAA,EAEpC;AAEA,QAAME,IAAYV,GAAsBC,CAAK,GACvCO,IAAehD,EAClB,IAAI,CAACiD,MACAR,MAAU,WAAWA,MAAU,WAC1BI,IAAgBI,IAAI,mBAAmBA,CAAW,IAGpDE,GAAwB;AAAA,IAC7B,eAAAN;AAAA,IACA,MAAAE;AAAA,IACA,OAAOE;AAAA,EAAA,CACR,CACF,EACA,KAAKC,CAAS;AACjB,SAAOT,MAAU,WAAWA,MAAU,WAClCS,IAAYF,IACZA;AACN,GAEaG,KAA0B,CAAC;AAAA,EACtC,eAAAN;AAAA,EACA,MAAAE;AAAA,EACA,OAAA/C;AACF,MAA+B;AAC7B,MAA2BA,KAAU;AACnC,WAAO;AAGT,MAAI,OAAOA,KAAU;AACnB,UAAM,IAAI;AAAA,MACR;AAAA,IAAA;AAIJ,SAAO,GAAG+C,CAAI,IAAIF,IAAgB7C,IAAQ,mBAAmBA,CAAK,CAAC;AACrE,GAEaoD,KAAuB,CAAC;AAAA,EACnC,eAAAP;AAAA,EACA,SAAAC;AAAA,EACA,MAAAC;AAAA,EACA,OAAAN;AAAA,EACA,OAAAzC;AAAA,EACA,WAAAqD;AACF,MAGM;AACJ,MAAIrD,aAAiB;AACnB,WAAOqD,IAAYrD,EAAM,gBAAgB,GAAG+C,CAAI,IAAI/C,EAAM,YAAA,CAAa;AAGzE,MAAIyC,MAAU,gBAAgB,CAACK,GAAS;AACtC,QAAIQ,IAAmB,CAAA;AACvB,WAAO,QAAQtD,CAAK,EAAE,QAAQ,CAAC,CAACuD,GAAKN,CAAC,MAAM;AAC1C,MAAAK,IAAS;AAAA,QACP,GAAGA;AAAA,QACHC;AAAA,QACAV,IAAiBI,IAAe,mBAAmBA,CAAW;AAAA,MAAA;AAAA,IAElE,CAAC;AACD,UAAMD,IAAeM,EAAO,KAAK,GAAG;AACpC,YAAQb,GAAA;AAAA,MACN,KAAK;AACH,eAAO,GAAGM,CAAI,IAAIC,CAAY;AAAA,MAChC,KAAK;AACH,eAAO,IAAIA,CAAY;AAAA,MACzB,KAAK;AACH,eAAO,IAAID,CAAI,IAAIC,CAAY;AAAA,MACjC;AACE,eAAOA;AAAAA,IAAA;AAAA,EAEb;AAEA,QAAME,IAAYP,GAAuBF,CAAK,GACxCO,IAAe,OAAO,QAAQhD,CAAK,EACtC;AAAA,IAAI,CAAC,CAACuD,GAAKN,CAAC,MACXE,GAAwB;AAAA,MACtB,eAAAN;AAAA,MACA,MAAMJ,MAAU,eAAe,GAAGM,CAAI,IAAIQ,CAAG,MAAMA;AAAA,MACnD,OAAON;AAAA,IAAA,CACR;AAAA,EAAA,EAEF,KAAKC,CAAS;AACjB,SAAOT,MAAU,WAAWA,MAAU,WAClCS,IAAYF,IACZA;AACN,GCrKaQ,KAAgB,eAEhBC,KAAwB,CAAC,EAAE,MAAAC,GAAM,KAAKC,QAA2B;AAC5E,MAAIhD,IAAMgD;AACV,QAAMC,IAAUD,EAAK,MAAMH,EAAa;AACxC,MAAII;AACF,eAAWC,KAASD,GAAS;AAC3B,UAAId,IAAU,IACVC,IAAOc,EAAM,UAAU,GAAGA,EAAM,SAAS,CAAC,GAC1CpB,IAA6B;AAEjC,MAAIM,EAAK,SAAS,GAAG,MACnBD,IAAU,IACVC,IAAOA,EAAK,UAAU,GAAGA,EAAK,SAAS,CAAC,IAGtCA,EAAK,WAAW,GAAG,KACrBA,IAAOA,EAAK,UAAU,CAAC,GACvBN,IAAQ,WACCM,EAAK,WAAW,GAAG,MAC5BA,IAAOA,EAAK,UAAU,CAAC,GACvBN,IAAQ;AAGV,YAAMzC,IAAQ0D,EAAKX,CAAI;AAEvB,UAA2B/C,KAAU;AACnC;AAGF,UAAI,MAAM,QAAQA,CAAK,GAAG;AACxB,QAAAW,IAAMA,EAAI;AAAA,UACRkD;AAAA,UACAjB,GAAoB,EAAE,SAAAE,GAAS,MAAAC,GAAM,OAAAN,GAAO,OAAAzC,GAAO;AAAA,QAAA;AAErD;AAAA,MACF;AAEA,UAAI,OAAOA,KAAU,UAAU;AAC7B,QAAAW,IAAMA,EAAI;AAAA,UACRkD;AAAA,UACAT,GAAqB;AAAA,YACnB,SAAAN;AAAA,YACA,MAAAC;AAAA,YACA,OAAAN;AAAA,YACA,OAAAzC;AAAA,YACA,WAAW;AAAA,UAAA,CACZ;AAAA,QAAA;AAEH;AAAA,MACF;AAEA,UAAIyC,MAAU,UAAU;AACtB,QAAA9B,IAAMA,EAAI;AAAA,UACRkD;AAAA,UACA,IAAIV,GAAwB;AAAA,YAC1B,MAAAJ;AAAA,YACA,OAAA/C;AAAA,UAAA,CACD,CAAC;AAAA,QAAA;AAEJ;AAAA,MACF;AAEA,YAAM8D,IAAe;AAAA,QACnBrB,MAAU,UAAU,IAAIzC,CAAe,KAAMA;AAAA,MAAA;AAE/C,MAAAW,IAAMA,EAAI,QAAQkD,GAAOC,CAAY;AAAA,IACvC;AAEF,SAAOnD;AACT,GAEaoD,KAAS,CAAC;AAAA,EACrB,SAAAC;AAAA,EACA,MAAAN;AAAA,EACA,OAAAO;AAAA,EACA,iBAAAC;AAAA,EACA,KAAKP;AACP,MAMM;AACJ,QAAMQ,IAAUR,EAAK,WAAW,GAAG,IAAIA,IAAO,IAAIA,CAAI;AACtD,MAAIhD,KAAOqD,KAAW,MAAMG;AAC5B,EAAIT,MACF/C,IAAM8C,GAAsB,EAAE,MAAAC,GAAM,KAAA/C,EAAA,CAAK;AAE3C,MAAIyD,IAASH,IAAQC,EAAgBD,CAAK,IAAI;AAC9C,SAAIG,EAAO,WAAW,GAAG,MACvBA,IAASA,EAAO,UAAU,CAAC,IAEzBA,MACFzD,KAAO,IAAIyD,CAAM,KAEZzD;AACT;AAEO,SAAS0D,GAAoBzD,GAIjC;AACD,QAAM0D,IAAU1D,EAAQ,SAAS;AAGjC,MAFyB0D,KAAW1D,EAAQ;AAG1C,WAAI,oBAAoBA,IAEpBA,EAAQ,mBAAmB,UAAaA,EAAQ,mBAAmB,KAE1CA,EAAQ,iBAAiB,OAI/CA,EAAQ,SAAS,KAAKA,EAAQ,OAAO;AAI9C,MAAI0D;AACF,WAAO1D,EAAQ;AAKnB;ACzHO,MAAM2D,KAAe,OAC1BC,GACAC,MACgC;AAChC,QAAMC,IACJ,OAAOD,KAAa,aAAa,MAAMA,EAASD,CAAI,IAAIC;AAE1D,MAAKC;AAIL,WAAIF,EAAK,WAAW,WACX,UAAUE,CAAK,KAGpBF,EAAK,WAAW,UACX,SAAS,KAAKE,CAAK,CAAC,KAGtBA;AACT,GC5BaC,KAAwB,CAAc;AAAA,EACjD,eAAA9B;AAAA,EACA,OAAA+B;AAAA,EACA,QAAAC;AACF,IAA4B,OACF,CAACC,MAAmB;AAC1C,QAAMV,IAAmB,CAAA;AACzB,MAAIU,KAAe,OAAOA,KAAgB;AACxC,eAAW/B,KAAQ+B,GAAa;AAC9B,YAAM9E,IAAQ8E,EAAY/B,CAAI;AAE9B,UAA2B/C,KAAU;AAIrC,YAAI,MAAM,QAAQA,CAAK,GAAG;AACxB,gBAAM+E,IAAkBnC,GAAoB;AAAA,YAC1C,eAAAC;AAAA,YACA,SAAS;AAAA,YACT,MAAAE;AAAA,YACA,OAAO;AAAA,YACP,OAAA/C;AAAA,YACA,GAAG4E;AAAA,UAAA,CACJ;AACD,UAAIG,KAAiBX,EAAO,KAAKW,CAAe;AAAA,QAClD,WAAW,OAAO/E,KAAU,UAAU;AACpC,gBAAMgF,IAAmB5B,GAAqB;AAAA,YAC5C,eAAAP;AAAA,YACA,SAAS;AAAA,YACT,MAAAE;AAAA,YACA,OAAO;AAAA,YACP,OAAA/C;AAAA,YACA,GAAG6E;AAAA,UAAA,CACJ;AACD,UAAIG,KAAkBZ,EAAO,KAAKY,CAAgB;AAAA,QACpD,OAAO;AACL,gBAAMC,IAAsB9B,GAAwB;AAAA,YAClD,eAAAN;AAAA,YACA,MAAAE;AAAA,YACA,OAAA/C;AAAA,UAAA,CACD;AACD,UAAIiF,KAAqBb,EAAO,KAAKa,CAAmB;AAAA,QAC1D;AAAA,IACF;AAEF,SAAOb,EAAO,KAAK,GAAG;AACxB,GAOWc,KAAa,CACxBC,MACuC;AACvC,MAAI,CAACA;AAGH,WAAO;AAGT,QAAMC,IAAeD,EAAY,MAAM,GAAG,EAAE,CAAC,GAAG,KAAA;AAEhD,MAAKC,GAIL;AAAA,QACEA,EAAa,WAAW,kBAAkB,KAC1CA,EAAa,SAAS,OAAO;AAE7B,aAAO;AAGT,QAAIA,MAAiB;AACnB,aAAO;AAGT,QACE,CAAC,gBAAgB,UAAU,UAAU,QAAQ,EAAE;AAAA,MAAK,CAACC,MACnDD,EAAa,WAAWC,CAAI;AAAA,IAAA;AAG9B,aAAO;AAGT,QAAID,EAAa,WAAW,OAAO;AACjC,aAAO;AAAA;AAIX,GAEME,KAAoB,CACxB1E,GAGAmC,MAEKA,IAIH,GAAAnC,EAAQ,QAAQ,IAAImC,CAAI,KACxBnC,EAAQ,QAAQmC,CAAI,KACpBnC,EAAQ,QAAQ,IAAI,QAAQ,GAAG,SAAS,GAAGmC,CAAI,GAAG,KAL3C,IAYEwC,KAAgB,OAAO;AAAA,EAClC,UAAAC;AAAA,EACA,GAAG5E;AACL,MAGQ;AACN,aAAW4D,KAAQgB,GAAU;AAC3B,QAAIF,GAAkB1E,GAAS4D,EAAK,IAAI;AACtC;AAGF,UAAME,IAAQ,MAAMH,GAAaC,GAAM5D,EAAQ,IAAI;AAEnD,QAAI,CAAC8D;AACH;AAGF,UAAM3B,IAAOyB,EAAK,QAAQ;AAE1B,YAAQA,EAAK,IAAA;AAAA,MACX,KAAK;AACH,QAAK5D,EAAQ,UACXA,EAAQ,QAAQ,CAAA,IAElBA,EAAQ,MAAMmC,CAAI,IAAI2B;AACtB;AAAA,MACF,KAAK;AACH,QAAA9D,EAAQ,QAAQ,OAAO,UAAU,GAAGmC,CAAI,IAAI2B,CAAK,EAAE;AACnD;AAAA,MACF,KAAK;AAAA,MACL;AACE,QAAA9D,EAAQ,QAAQ,IAAImC,GAAM2B,CAAK;AAC/B;AAAA,IAAA;AAAA,EAEN;AACF,GAEae,KAA+B,CAAC7E,MAC3CmD,GAAO;AAAA,EACL,SAASnD,EAAQ;AAAA,EACjB,MAAMA,EAAQ;AAAA,EACd,OAAOA,EAAQ;AAAA,EACf,iBACE,OAAOA,EAAQ,mBAAoB,aAC/BA,EAAQ,kBACR+D,GAAsB/D,EAAQ,eAAe;AAAA,EACnD,KAAKA,EAAQ;AACf,CAAC,GAEU8E,KAAe,CAACC,GAAWC,MAAsB;AAC5D,QAAMC,IAAS,EAAE,GAAGF,GAAG,GAAGC,EAAA;AAC1B,SAAIC,EAAO,SAAS,SAAS,GAAG,MAC9BA,EAAO,UAAUA,EAAO,QAAQ,UAAU,GAAGA,EAAO,QAAQ,SAAS,CAAC,IAExEA,EAAO,UAAUC,GAAaH,EAAE,SAASC,EAAE,OAAO,GAC3CC;AACT,GAEME,KAAiB,CAAC3E,MAA8C;AACpE,QAAM4E,IAAmC,CAAA;AACzC,SAAA5E,EAAQ,QAAQ,CAACpB,GAAOuD,MAAQ;AAC9B,IAAAyC,EAAQ,KAAK,CAACzC,GAAKvD,CAAK,CAAC;AAAA,EAC3B,CAAC,GACMgG;AACT,GAEaF,KAAe,IACvB1E,MACS;AACZ,QAAM6E,IAAgB,IAAI,QAAA;AAC1B,aAAWC,KAAU9E,GAAS;AAC5B,QAAI,CAAC8E;AACH;AAGF,UAAMC,IACJD,aAAkB,UACdH,GAAeG,CAAM,IACrB,OAAO,QAAQA,CAAM;AAE3B,eAAW,CAAC3C,GAAKvD,CAAK,KAAKmG;AACzB,UAAInG,MAAU;AACZ,QAAAiG,EAAc,OAAO1C,CAAG;AAAA,eACf,MAAM,QAAQvD,CAAK;AAC5B,mBAAWiD,KAAKjD;AACd,UAAAiG,EAAc,OAAO1C,GAAKN,CAAW;AAAA,UAEzC,CAAWjD,MAAU,UAGnBiG,EAAc;AAAA,QACZ1C;AAAA,QACA,OAAOvD,KAAU,WAAW,KAAK,UAAUA,CAAK,IAAKA;AAAA,MAAA;AAAA,EAI7D;AACA,SAAOiG;AACT;AAoBA,MAAMG,GAA0B;AAAA,EAAhC,cAAA;AACE,SAAA,MAAiC,CAAA;AAAA,EAAC;AAAA,EAElC,QAAc;AACZ,SAAK,MAAM,CAAA;AAAA,EACb;AAAA,EAEA,MAAMC,GAAgC;AACpC,UAAMC,IAAQ,KAAK,oBAAoBD,CAAE;AACzC,IAAI,KAAK,IAAIC,CAAK,MAChB,KAAK,IAAIA,CAAK,IAAI;AAAA,EAEtB;AAAA,EAEA,OAAOD,GAAmC;AACxC,UAAMC,IAAQ,KAAK,oBAAoBD,CAAE;AACzC,WAAO,EAAQ,KAAK,IAAIC,CAAK;AAAA,EAC/B;AAAA,EAEA,oBAAoBD,GAAkC;AACpD,WAAI,OAAOA,KAAO,WACT,KAAK,IAAIA,CAAE,IAAIA,IAAK,KAEtB,KAAK,IAAI,QAAQA,CAAE;AAAA,EAC5B;AAAA,EAEA,OACEA,GACAE,GAC8B;AAC9B,UAAMD,IAAQ,KAAK,oBAAoBD,CAAE;AACzC,WAAI,KAAK,IAAIC,CAAK,KAChB,KAAK,IAAIA,CAAK,IAAIC,GACXF,KAEF;AAAA,EACT;AAAA,EAEA,IAAIE,GAAyB;AAC3B,gBAAK,IAAI,KAAKA,CAAE,GACT,KAAK,IAAI,SAAS;AAAA,EAC3B;AACF;AAQO,MAAMC,KAAqB,OAK5B;AAAA,EACJ,OAAO,IAAIJ,GAAA;AAAA,EACX,SAAS,IAAIA,GAAA;AAAA,EACb,UAAU,IAAIA,GAAA;AAChB,IAEMK,KAAyB9B,GAAsB;AAAA,EACnD,eAAe;AAAA,EACf,OAAO;AAAA,IACL,SAAS;AAAA,IACT,OAAO;AAAA,EAAA;AAAA,EAET,QAAQ;AAAA,IACN,SAAS;AAAA,IACT,OAAO;AAAA,EAAA;AAEX,CAAC,GAEK+B,KAAiB;AAAA,EACrB,gBAAgB;AAClB,GAEaC,KAAe,CAC1BC,IAAqD,QACP;AAAA,EAC9C,GAAG/G;AAAA,EACH,SAAS6G;AAAA,EACT,SAAS;AAAA,EACT,iBAAiBD;AAAA,EACjB,GAAGG;AACL,IChTaC,KAAe,CAAChB,IAAiB,OAAe;AAC3D,MAAIiB,IAAUpB,GAAaiB,GAAA,GAAgBd,CAAM;AAEjD,QAAMkB,IAAY,OAAe,EAAE,GAAGD,MAEhCE,IAAY,CAACnB,OACjBiB,IAAUpB,GAAaoB,GAASjB,CAAM,GAC/BkB,EAAA,IAGHE,IAAeT,GAAA,GAOfU,IAAgB,OAAOtG,MAA4B;AACvD,UAAMuG,IAAO;AAAA,MACX,GAAGL;AAAA,MACH,GAAGlG;AAAA,MACH,OAAOA,EAAQ,SAASkG,EAAQ,SAAS,WAAW;AAAA,MACpD,SAAShB,GAAagB,EAAQ,SAASlG,EAAQ,OAAO;AAAA,MACtD,gBAAgB;AAAA,IAAA;AAGlB,IAAIuG,EAAK,YACP,MAAM5B,GAAc;AAAA,MAClB,GAAG4B;AAAA,MACH,UAAUA,EAAK;AAAA,IAAA,CAChB,GAGCA,EAAK,oBACP,MAAMA,EAAK,iBAAiBA,CAAI,GAG9BA,EAAK,SAAS,UAAaA,EAAK,mBAClCA,EAAK,iBAAiBA,EAAK,eAAeA,EAAK,IAAI,KAIjDA,EAAK,SAAS,UAAaA,EAAK,mBAAmB,OACrDA,EAAK,QAAQ,OAAO,cAAc;AAGpC,UAAMxG,IAAM8E,GAAS0B,CAAI;AAEzB,WAAO,EAAE,MAAAA,GAAM,KAAAxG,EAAA;AAAA,EACjB,GAEMW,IAA6B,OAAOV,MAAY;AAEpD,UAAM,EAAE,MAAAuG,GAAM,KAAAxG,EAAA,IAAQ,MAAMuG,EAActG,CAAO,GAC3CS,IAAuB;AAAA,MAC3B,UAAU;AAAA,MACV,GAAG8F;AAAA,MACH,MAAM9C,GAAoB8C,CAAI;AAAA,IAAA;AAGhC,QAAI7F,IAAU,IAAI,QAAQX,GAAKU,CAAW;AAE1C,eAAWkF,KAAMU,EAAa,QAAQ;AACpC,MAAIV,MACFjF,IAAU,MAAMiF,EAAGjF,GAAS6F,CAAI;AAMpC,UAAMC,IAASD,EAAK;AACpB,QAAI5F,IAAW,MAAM6F,EAAO9F,CAAO;AAEnC,eAAWiF,KAAMU,EAAa,SAAS;AACrC,MAAIV,MACFhF,IAAW,MAAMgF,EAAGhF,GAAUD,GAAS6F,CAAI;AAI/C,UAAME,IAAS;AAAA,MACb,SAAA/F;AAAAA,MACA,UAAAC;AAAA,IAAA;AAGF,QAAIA,EAAS,IAAI;AACf,YAAM+F,KACHH,EAAK,YAAY,SACdjC,GAAW3D,EAAS,QAAQ,IAAI,cAAc,CAAC,IAC/C4F,EAAK,YAAY;AAEvB,UACE5F,EAAS,WAAW,OACpBA,EAAS,QAAQ,IAAI,gBAAgB,MAAM,KAC3C;AACA,YAAIgG;AACJ,gBAAQD,GAAA;AAAA,UACN,KAAK;AAAA,UACL,KAAK;AAAA,UACL,KAAK;AACH,YAAAC,IAAY,MAAMhG,EAAS+F,CAAO,EAAA;AAClC;AAAA,UACF,KAAK;AACH,YAAAC,IAAY,IAAI,SAAA;AAChB;AAAA,UACF,KAAK;AACH,YAAAA,IAAYhG,EAAS;AACrB;AAAA,UACF,KAAK;AAAA,UACL;AACE,YAAAgG,IAAY,CAAA;AACZ;AAAA,QAAA;AAEJ,eAAOJ,EAAK,kBAAkB,SAC1BI,IACA;AAAA,UACE,MAAMA;AAAA,UACN,GAAGF;AAAA,QAAA;AAAA,MAEX;AAEA,UAAIlF;AACJ,cAAQmF,GAAA;AAAA,QACN,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AACH,UAAAnF,IAAO,MAAMZ,EAAS+F,CAAO,EAAA;AAC7B;AAAA,QACF,KAAK;AACH,iBAAOH,EAAK,kBAAkB,SAC1B5F,EAAS,OACT;AAAA,YACE,MAAMA,EAAS;AAAA,YACf,GAAG8F;AAAA,UAAA;AAAA,MACL;AAGR,aAAIC,MAAY,WACVH,EAAK,qBACP,MAAMA,EAAK,kBAAkBhF,CAAI,GAG/BgF,EAAK,wBACPhF,IAAO,MAAMgF,EAAK,oBAAoBhF,CAAI,KAIvCgF,EAAK,kBAAkB,SAC1BhF,IACA;AAAA,QACE,MAAAA;AAAA,QACA,GAAGkF;AAAA,MAAA;AAAA,IAEX;AAEA,UAAMG,IAAY,MAAMjG,EAAS,KAAA;AACjC,QAAIkG;AAEJ,QAAI;AACF,MAAAA,IAAY,KAAK,MAAMD,CAAS;AAAA,IAClC,QAAQ;AAAA,IAER;AAEA,UAAMlF,IAAQmF,KAAaD;AAC3B,QAAIE,IAAapF;AAEjB,eAAWiE,KAAMU,EAAa,MAAM;AAClC,MAAIV,MACFmB,IAAc,MAAMnB,EAAGjE,GAAOf,GAAUD,GAAS6F,CAAI;AAMzD,QAFAO,IAAaA,KAAe,CAAA,GAExBP,EAAK;AACP,YAAMO;AAIR,WAAOP,EAAK,kBAAkB,SAC1B,SACA;AAAA,MACE,OAAOO;AAAA,MACP,GAAGL;AAAA,IAAA;AAAA,EAEX,GAEMM,IACJ,CAACC,MAAkC,CAAChH,MAClCU,EAAQ,EAAE,GAAGV,GAAS,QAAAgH,GAAQ,GAE5BC,IACJ,CAACD,MAAkC,OAAOhH,MAA4B;AACpE,UAAM,EAAE,MAAAuG,GAAM,KAAAxG,EAAA,IAAQ,MAAMuG,EAActG,CAAO;AACjD,WAAOX,GAAgB;AAAA,MACrB,GAAGkH;AAAA,MACH,MAAMA,EAAK;AAAA,MACX,SAASA,EAAK;AAAA,MACd,QAAAS;AAAA,MACA,WAAW,OAAOjH,GAAKmH,MAAS;AAC9B,YAAIxG,IAAU,IAAI,QAAQX,GAAKmH,CAAI;AACnC,mBAAWvB,KAAMU,EAAa,QAAQ;AACpC,UAAIV,MACFjF,IAAU,MAAMiF,EAAGjF,GAAS6F,CAAI;AAGpC,eAAO7F;AAAAA,MACT;AAAA,MACA,KAAAX;AAAA,IAAA,CACD;AAAA,EACH;AAEF,SAAO;AAAA,IACL,UAAA8E;AAAA,IACA,SAASkC,EAAa,SAAS;AAAA,IAC/B,QAAQA,EAAa,QAAQ;AAAA,IAC7B,KAAKA,EAAa,KAAK;AAAA,IACvB,WAAAZ;AAAA,IACA,MAAMY,EAAa,MAAM;AAAA,IACzB,cAAAV;AAAA,IACA,SAASU,EAAa,SAAS;AAAA,IAC/B,OAAOA,EAAa,OAAO;AAAA,IAC3B,MAAMA,EAAa,MAAM;AAAA,IACzB,KAAKA,EAAa,KAAK;AAAA,IACvB,SAAArG;AAAA,IACA,WAAA0F;AAAA,IACA,KAAK;AAAA,MACH,SAASa,EAAU,SAAS;AAAA,MAC5B,QAAQA,EAAU,QAAQ;AAAA,MAC1B,KAAKA,EAAU,KAAK;AAAA,MACpB,MAAMA,EAAU,MAAM;AAAA,MACtB,SAASA,EAAU,SAAS;AAAA,MAC5B,OAAOA,EAAU,OAAO;AAAA,MACxB,MAAMA,EAAU,MAAM;AAAA,MACtB,KAAKA,EAAU,KAAK;AAAA,MACpB,OAAOA,EAAU,OAAO;AAAA,IAAA;AAAA,IAE1B,OAAOF,EAAa,OAAO;AAAA,EAAA;AAE/B,GC5PaI,IAASlB,GAAaF,GAA6B;AAAA,EAC5D,SAAS;AAAA,EACT,cAAc;AAClB,CAAC,CAAC;ACEK,MAAMqB,EAAoB;AAAA,EAC7B,OAAc,iBAAsDpH,GAAuD;AACvH,YAAQA,GAAS,UAAUmH,GAAQ,KAAuD;AAAA,MACtF,KAAK;AAAA,MACL,GAAGnH;AAAA,MACH,SAAS;AAAA,QACL,gBAAgB;AAAA,QAChB,GAAGA,GAAS;AAAA,MAAA;AAAA,IAChB,CACH;AAAA,EACL;AAAA;AAAA;AAAA;AAAA,EAKA,OAAc,kBAAuDA,GAAwD;AACzH,YAAQA,GAAS,UAAUmH,GAAQ,IAAuD;AAAA,MACtF,KAAK;AAAA,MACL,GAAGnH;AAAA,IAAA,CACN;AAAA,EACL;AAAA,EAEA,OAAc,mBAAwDA,GAAyD;AAC3H,YAAQA,GAAS,UAAUmH,GAAQ,IAAwD;AAAA,MACvF,KAAK;AAAA,MACL,GAAGnH;AAAA,IAAA,CACN;AAAA,EACL;AAAA,EAEA,OAAc,iBAAsDA,GAAuD;AACvH,YAAQA,GAAS,UAAUmH,GAAQ,KAAuD;AAAA,MACtF,KAAK;AAAA,MACL,GAAGnH;AAAA,MACH,SAAS;AAAA,QACL,gBAAgB;AAAA,QAChB,GAAGA,GAAS;AAAA,MAAA;AAAA,IAChB,CACH;AAAA,EACL;AAAA;AAAA;AAAA;AAAA,EAKA,OAAc,kBAAuDA,GAAwD;AACzH,YAAQA,GAAS,UAAUmH,GAAQ,IAAuD;AAAA,MACtF,KAAK;AAAA,MACL,GAAGnH;AAAA,IAAA,CACN;AAAA,EACL;AAAA,EAEA,OAAc,mBAAwDA,GAAyD;AAC3H,YAAQA,GAAS,UAAUmH,GAAQ,IAAwD;AAAA,MACvF,KAAK;AAAA,MACL,GAAGnH;AAAA,IAAA,CACN;AAAA,EACL;AAAA,EAEA,OAAc,sBAA2DA,GAA4D;AACjI,YAAQA,GAAS,UAAUmH,GAAQ,KAA4D;AAAA,MAC3F,KAAK;AAAA,MACL,GAAGnH;AAAA,MACH,SAAS;AAAA,QACL,gBAAgB;AAAA,QAChB,GAAGA,GAAS;AAAA,MAAA;AAAA,IAChB,CACH;AAAA,EACL;AAAA;AAAA;AAAA;AAAA,EAKA,OAAc,iBAAsDA,GAAuD;AACvH,YAAQA,GAAS,UAAUmH,GAAQ,IAAsD;AAAA,MACrF,KAAK;AAAA,MACL,GAAGnH;AAAA,IAAA,CACN;AAAA,EACL;AAAA,EAEA,OAAc,kBAAuDA,GAAwD;AACzH,YAAQA,GAAS,UAAUmH,GAAQ,IAAuD;AAAA,MACtF,KAAK;AAAA,MACL,GAAGnH;AAAA,IAAA,CACN;AAAA,EACL;AAAA,EAEA,OAAc,mBAAwDA,GAAyD;AAC3H,YAAQA,GAAS,UAAUmH,GAAQ,KAAyD;AAAA,MACxF,KAAK;AAAA,MACL,GAAGnH;AAAA,MACH,SAAS;AAAA,QACL,gBAAgB;AAAA,QAChB,GAAGA,GAAS;AAAA,MAAA;AAAA,IAChB,CACH;AAAA,EACL;AAAA,EAEA,OAAc,0BAA+DA,GAAgE;AACzI,YAAQA,GAAS,UAAUmH,GAAQ,IAA+D;AAAA,MAC9F,KAAK;AAAA,MACL,GAAGnH;AAAA,IAAA,CACN;AAAA,EACL;AAAA,EAEA,OAAc,YAAiDA,GAAkD;AAC7G,YAAQA,GAAS,UAAUmH,GAAQ,IAAiD;AAAA,MAChF,KAAK;AAAA,MACL,GAAGnH;AAAA,IAAA,CACN;AAAA,EACL;AACJ;AC9HO,MAAMqH,KAAwB,IAAIC,GAAqC,qBAAqB;;;;;;ACc5F,MAAeC,UACVC,GACmC;AAAA,EA2D3C,cAAc;AACV,UAAA,GAzDJ,KAAU,4BAAqC,IAwB/C,KAAU,cAAsB,IAGhC,KAAU,aAAsB,IAGhC,KAAU,SAAwB,MAElC,KAAU,sBAA+B,IAEzC,KAAU,aAAqB,GAE/B,KAAU,eAAwB,IAGlC,KAAQ,mBAAoD,MAmBxD,KAAK,eAAeH,IAAuB,OAAOI,MAAY;AAC1D,WAAK,uBAAuBA,GAC5B,MAAM,KAAK,sBAAA;AAAA,IACf,CAAC;AAAA,EACL;AAAA,EAES,oBAAoB;AACzB,UAAM,kBAAA,GACN,KAAK,eAAe;AAAA,EACxB;AAAA,EAES,uBAAuB;AAC5B,UAAM,qBAAA,GACN,KAAK,eAAe;AAAA,EACxB;AAAA,EAEmB,QAAQC,GAAuE;AAC9F,UAAM,QAAQA,CAAkB,IAC5BA,EAAmB,IAAI,SAAS,KAAKA,EAAmB,IAAI,UAAU,MACtE,KAAK,mBAAA;AAAA,EAEb;AAAA;AAAA,EAIU,yBAAyB;AAC/B,SAAK,eAAeC,IAA8B,CAACC,MAAa;AAC5D,MAAIA,MACA,KAAK,cAAc,UAAUA,EAAS,aAAA,EAAe,WAAW;AAAA,IAExE,CAAC;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAgB,oBAAoBC,GAA4BC,GAAwC;AACpG,IAAI,CAAC,KAAK,gBAAgB,CAACA,MAI3B,KAAK,cAAc,SAASD,GAAQ,SAAA,KAAc,IAClD,KAAK,sBAAsB,UAAU,KAAK,cAAc,MAAM,GAE9D,KAAK,cAAc,qBAAqBC,GACxC,KAAK,sBAAsB,sBAAsB,KAAK,cAAc,kBAAkB,GACtF,KAAK,4BAA4B,IAEjC,KAAK,kBAAA,GACL,MAAM,KAAK,wBAAA;AAAA,EACf;AAAA;AAAA;AAAA;AAAA;AAAA,EAMU,gCAAgC;AACtC,IAAI,KAAK,6BAA6B,CAAC,KAAK,wBAAwB,KAAK,cAAc,WAAW,MAIlG,KAAK,eAAeC,IAA6B,OAAON,MAAY;AAChE,MAAIA,KACA,KAAK,QAAQA,EAAQ,QAAQ,UAAU,oBAAoB,OAAOO,MAAuB;AACrF,cAAMF,IAAqBE,EAAmB,CAAC;AAC/C,QAAI,CAAC,KAAK,gBAAgB,CAACF,MAK3B,KAAK,cAAc,SAAS,KAAK,sBAAsB,eAAe,IAClE,CAAC,KAAK,cAAc,UAAU,KAAK,cAAc,6BACjD,KAAK,cAAc,SAAS,KAAK,+BAA+B,KAAK,cAAc,wBAAwB,IAG/G,KAAK,cAAc,qBAAqBA,GACxC,KAAK,kBAAA,GACL,MAAM,KAAK,wBAAA;AAAA,MACf,CAAC;AAAA,IAET,CAAC;AAAA,EACL;AAAA,EAEA,MAAgB,0BAA0B;AACtC,QAAI,KAAK,uBAAuB,CAAC,KAAK,qBAAsB;AAC5D,UAAMvG,IAAO,MAAM,KAAK,iBAAA;AACxB,QAAIA,KAAQA,EAAK,SAAS,GAAG;AACzB,YAAM0G,IAAS,MAAM,QAAQ;AAAA,QACzB1G,EAAK,IAAI,CAAA2G,MAAQ,KAAK,qBAAsB,sBAAsBA,CAAI,CAAC;AAAA,MAAA,GAErEC,IAAa,KAAK;AACxB,MAAAA,EAAW,qBAAqB,CAAC,GAAGA,EAAW,oBAAoB,GAAGF,CAAM,GAC5E,KAAK,sBAAsB;AAAA,IAC/B;AAAA,EACJ;AAAA;AAAA;AAAA,EAMU,2BAA2B;AACjC,IAAI,KAAK,wBAAwB,QAAQ,KAAK,cAAc,WAAW,OACnE,KAAK,cAAc,SAAS,KAAK,qBAAqB,UAAA,GAClD,CAAC,KAAK,cAAc,UAAU,KAAK,cAAc,6BACjD,KAAK,cAAc,SAAS,KAAK,+BAA+B,KAAK,cAAc,wBAAwB,KAG/G,KAAK,wBAAwB,QAAQ,KAAK,cAAc,uBAAuB,OAC/E,KAAK,cAAc,qBAAqB,KAAK,qBAAqB,sBAAA;AAAA,EAE1E;AAAA,EAEA,MAAgB,qBAAqB;AAOjC,QANI,CAAC,KAAK,iBAIV,KAAK,yBAAA,GAED,CAAC,KAAK;AACN;AAGJ,SAAK,aAAa,IAClB,KAAK,SAAS;AAEd,UAAMG,IAAY,EAAE,KAAK;AAEzB,QAAI;AACA,YAAM,EAAE,MAAA7G,GAAM,OAAAG,EAAA,IAAU,MAAM,KAAK,qBAAsB,aAAa;AAAA,QAAQ,MAC1E,KAAK,eAAA;AAAA,MAAe;AAGxB,UAAI,KAAK,eAAe0G,EAAW;AAEnC,MAAI7G,KAAQ,QACR,KAAK,cAAcA,GACnB,KAAK,aAAa,MAEbG,KACL,KAAK,SAAS2G,GAAY,cAAc3G,CAAK,IAAIA,EAAM,UAAU,KAAK,SAAS,KAAK,0BAA0B,GAC9G,KAAK,aAAa,MAGlB,KAAK,aAAa;AAAA,IAE1B,SAASA,GAAO;AACZ,UAAI,KAAK,eAAe0G,EAAW;AACnC,WAAK,SAAS,KAAK,SAAS,KAAK,2BAA2B,GAC5D,KAAK,aAAa,IAClB,QAAQ,MAAM,wBAAwB1G,CAAK;AAAA,IAC/C;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMU,sBAA+B;AACrC,UAAM+F,IAAU,KAAK;AACrB,WACIA,EAAQ,WAAW,MACnBA,EAAQ,qBAAqB,MAC7BA,EAAQ,4BAA4B;AAAA,EAE5C;AAAA;AAAA;AAAA,EAMU,+BAA+B3E,GAAsB;AAG3D,UAAMG,IAAQH,EAAK,MAAM,+CAA+C;AACxE,WAAOG,IAAQA,EAAM,CAAC,IAAI;AAAA,EAC9B;AAAA,EAEU,mBAAmBqF,GAAqB;AAC9C,SAAK,mBAAmB,EAAE,GAAGA,EAAM,SAAS,GAAGA,EAAM,QAAA;AAAA,EACzD;AAAA,EAEU,aAAaA,GAAqB;AAKxC,SADoB,iBAAiBA,IAASA,EAAuB,cAAc,QAC/D,IAAI;AACpB,UAAI,CAAC,KAAK,kBAAkB;AAGxB,QAAAA,EAAM,eAAA,GACNA,EAAM,gBAAA;AACN;AAAA,MACJ;AACA,YAAMC,IAAK,KAAK,IAAID,EAAM,UAAU,KAAK,iBAAiB,CAAC,GACrDE,IAAK,KAAK,IAAIF,EAAM,UAAU,KAAK,iBAAiB,CAAC;AAE3D,UADA,KAAK,mBAAmB,MACpBC,IAAK,KAAKC,IAAK,GAAG;AAClB,QAAAF,EAAM,eAAA,GACNA,EAAM,gBAAA;AACN;AAAA,MACJ;AAAA,IACJ;AACA,SAAK,mBAAmB;AAExB,UAAMxF,IAAOwF,EAAM,aAAA,GAGbG,IAAsB,CAAC,kBAAkB,yBAAyB;AACxE,QAAI3F,EAAK,KAAK,CAAA4F,MAAKA,aAAa,WAAWD,EAAoB,SAASC,EAAE,OAAO,CAAC,GAAG;AAGjF,UADmB5F,EAAK,KAAK,CAAA4F,MAAKA,aAAaC,MAAoBD,EAAE,MAAM,SAAS,YAAY,CAAC;AAE7F;AAMJ,MAAAJ,EAAM,eAAA,GACNA,EAAM,gBAAA;AACN;AAAA,IACJ;AAIA,QADqBxF,EAAK,OAAO,CAAA4F,MAAKA,aAAa,WAAWA,EAAE,YAAY,OAAOA,EAAE,aAAa,yBAAyB,CAAC,EAC3G,SAAS,GAAG;AACzB,MAAAJ,EAAM,eAAA,GACNA,EAAM,gBAAA;AACN,YAAMM,IAAmB9F,EAAK,KAAK,CAAA4F,MAAKA,aAAa,WAAWA,EAAE,YAAY,OAAOA,EAAE,UAAU,SAAS,oBAAoB,CAAC;AAC/H,MAAIE,aAA4B,UAC5B,OAAO,QAAQ,UAAU,CAAA,GAAI,IAAIA,EAAiB,aAAa,MAAM,CAAC,IAEtE,OAAO,QAAQ,UAAU,CAAA,GAAI,IAAI,KAAK,cAAc,wBAAwB;AAEhF;AAAA,IACJ;AAAA,EAIJ;AAAA;AAAA;AAAA,EAMS,SAAS;AACd,WAAOC;AAAA,cACD,KAAK,aACDA,8JACA,KAAK,SACDA,gEAAmE,KAAK,MAAM,WAC9E,KAAK,cACDA;AAAA,mCACSC,GAAU,KAAK,cAAc,wBAAwB,CAAC;AAAA,2CAC9C,KAAK,kBAAkB;AAAA,qCAC7B,KAAK,YAAY;AAAA,yCACb,KAAK,SAAS,KAAK,wBAAwB,CAAC;AAAA;AAAA,eAEtEA,GAAU,KAAK,cAAc,uBAAuB,CAAC;AAAA,2BACzCC,GAAW,KAAK,WAAW,CAAC,SAC7BC,EAAO;AAAA;AAAA,EAE7B;AAAA,EAIA,OAAA;AAAA,SAAO,SAAS;AAAA,MACZC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA;AAAA,EAqDJ;AACJ;AA/XIC,EAAA;AAAA,EADCC,EAAS,EAAE,WAAW,IAAO,YAAY,CAACC,GAAUC,MAAa,KAAK,UAAUD,CAAG,MAAM,KAAK,UAAUC,CAAG,GAAG;AAAA,GAP7F9B,EAQlB,WAAA,SAAA;AAGA2B,EAAA;AAAA,EADCC,EAAS,EAAE,WAAW,IAAO,YAAY,CAACC,GAAUC,MAAa,KAAK,UAAUD,CAAG,MAAM,KAAK,UAAUC,CAAG,GAAG;AAAA,GAV7F9B,EAWlB,WAAA,UAAA;AAGA2B,EAAA;AAAA,EADCC,EAAS,EAAE,WAAW,GAAA,CAAO;AAAA,GAbZ5B,EAclB,WAAA,YAAA;AAGA2B,EAAA;AAAA,EADCC,EAAS,EAAE,WAAW,GAAA,CAAO;AAAA,GAhBZ5B,EAiBlB,WAAA,QAAA;AAGA2B,EAAA;AAAA,EADCC,EAAS,EAAE,WAAW,GAAA,CAAO;AAAA,GAnBZ5B,EAoBlB,WAAA,aAAA;AAGA2B,EAAA;AAAA,EADCC,EAAS,EAAE,WAAW,GAAA,CAAO;AAAA,GAtBZ5B,EAuBlB,WAAA,MAAA;AAGA2B,EAAA;AAAA,EADCC,EAAS,EAAE,WAAW,GAAA,CAAO;AAAA,GAzBZ5B,EA0BlB,WAAA,OAAA;AAGU2B,EAAA;AAAA,EADTI,EAAA;AAAM,GA5BW/B,EA6BR,WAAA,aAAA;AAGA2B,EAAA;AAAA,EADTI,EAAA;AAAM,GA/BW/B,EAgCR,WAAA,YAAA;AAGA2B,EAAA;AAAA,EADTI,EAAA;AAAM,GAlCW/B,EAmCR,WAAA,QAAA;ACXP,MAAMgC,GAAgD;AAAA,EACzDC;AAAA,EAEA,YAAYC,GAAyB;AACjC,SAAKD,KAAQC;AAAA,EACjB;AAAA,EAEA,MAAM,iBAAiBvK,GAAcmE,GAAkE;AACnG,WAAO,MAAMqG,EAAW,KAAKF,IAAOpC,EAAoB,iBAAiB,EAAE,MAAAlI,GAAM,OAAAmE,EAAA,CAAO,CAAC;AAAA,EAC7F;AAAA,EAEA,MAAM,iBAAiBnE,GAAcmE,GAAkE;AACnG,WAAO,MAAMqG,EAAW,KAAKF,IAAOpC,EAAoB,iBAAiB,EAAE,MAAAlI,GAAM,OAAAmE,EAAA,CAAO,CAAC;AAAA,EAC7F;AAAA,EAEA,MAAM,mBAAmBnE,GAAcmE,GAAkE;AACrG,WAAO,MAAMqG,EAAW,KAAKF,IAAOpC,EAAoB,mBAAmB,EAAE,MAAAlI,GAAM,OAAAmE,EAAA,CAAO,CAAC;AAAA,EAC/F;AAAA,EAEA,MAAM,sBAAsBnE,GAAcmE,GAAgE;AACtG,WAAO,MAAMqG,EAAW,KAAKF,IAAOpC,EAAoB,sBAAsB,EAAE,MAAAlI,GAAM,OAAAmE,EAAA,CAAO,CAAC;AAAA,EAClG;AAAA,EAEA,MAAM,mBAAmBA,GAAkE;AACvF,WAAO,MAAMqG,EAAW,KAAKF,IAAOpC,EAAoB,mBAAmB,EAAE,OAAA/D,EAAA,CAAO,CAAC;AAAA,EACzF;AAAA,EAEA,MAAM,mBAAmBA,GAAkE;AACvF,WAAO,MAAMqG,EAAW,KAAKF,IAAOpC,EAAoB,mBAAmB,EAAE,OAAA/D,EAAA,CAAO,CAAC;AAAA,EACzF;AAAA,EAEA,MAAM,0BAA0BA,GAAkE;AAC9F,WAAO,MAAMqG,EAAW,KAAKF,IAAOpC,EAAoB,0BAA0B,EAAE,OAAA/D,EAAA,CAAO,CAAC;AAAA,EAChG;AAAA,EAEA,MAAM,kBAAkBA,GAAkE;AACtF,WAAO,MAAMqG,EAAW,KAAKF,IAAOpC,EAAoB,kBAAkB,EAAE,OAAA/D,EAAA,CAAO,CAAC;AAAA,EACxF;AACJ;ACtEO,MAAMsG,GAAkD;AAAA,EAC3DH;AAAA,EAEA,YAAYC,GAAyB;AACjC,SAAKD,KAAQC;AAAA,EACjB;AAAA,EAEA,MAAM,cAAmE;AACrE,WAAO,MAAMC,EAAW,KAAKF,IAAOpC,EAAoB,aAAa;AAAA,EACzE;AACJ;ACfO,MAAMwC,WAA2BC,GAAkB;AAAA,EACtDC;AAAA,EAEA,YAAYL,GAAyB;AACjC,UAAMA,CAAI,GACV,KAAKK,KAAsB,IAAIH,GAAmBF,CAAI;AAAA,EAC1D;AAAA,EAEA,MAAM,cAAc;AAChB,UAAMM,IAAW,MAAM,KAAKD,GAAoB,YAAA;AAEhD,QAAIC,KAAYA,GAAU;AACtB,aAAOA,EAAS;AAAA,EAExB;AACJ;;;;;;;+XCnBAC,GAAAC,GAAAC,IAAAC,GAAAC,GAAAC,IAAAC;AAQA,MAAMC,KAAc;AAGb,IAAMC,IAAN,cAAyCjD,EAA0C;AAAA,EAItF,cAAc;AACV,UAAA,GALDkD,EAAA,MAAAR,CAAA,GAEHQ,EAAA,MAAAT,CAAA,GAOA,KAAU,gBAAkC;AAAA,MACxC,QAAQ;AAAA,MACR,oBAAoB;AAAA,MACpB,YAAY;AAAA,MACZ,aAAa;AAAA,MACb,kBAAkB;AAAA,MAClB,SAAS;AAAA,MACT,0BAA0B;AAAA,MAC1B,yBAAyB;AAAA,MACzB,uBAAuB;AAAA,MACvB,OAAO,CAAA;AAAA,MACP,QAAQ;AAAA,MACR,aAAa;AAAA,MACb,YAAY;AAAA,IAAA,GAGhB,KAAQ,kBAA0C;AAAA,MAC9C,QAAQ,CAAA;AAAA,MACR,QAAQ,CAAA;AAAA,MACR,aAAa,CAAA;AAAA,MACb,cAAc,CAAA;AAAA,IAAC,GAoHnBS,EAAA,MAAAN,GAAmB,EAAA,GACnBM,EAAA,MAAAL,CAAA,GA5IIM,GAAA,MAAKV,GAAqB,IAAIT,GAAkB,IAAI,CAAA;AAAA,EACxD;AAAA,EA0BA,IAAW,eAAenK,GAA2C;AACjE,UAAMuL,IAAgDvL,IAAQ,EAAE,GAAGA,EAAA,IAAU,CAAA;AAC7E,IAAAuL,EAAa,WAAW,CAAA,GACxBA,EAAa,gBAAgB,CAAA,GAC7BA,EAAa,iBAAiB,CAAA,GAC9BA,EAAa,WAAW,CAAA,GACxB,KAAK,kBAAkBA;AAAA,EAC3B;AAAA,EACA,IAAW,iBAAyC;AAChD,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,MAAgB,wBAAwB;AACpC,SAAK,uBAAA,GACL,MAAMC,QAAKX,GAAAC,EAAA,EAAL,KAAA,IAAA;AAAA,EACV;AAAA,EAuBU,oBAAoB;AAC1B,SAAK,eAAeW,IAA8B,OAAOpD,MAAY;AACjE,MAAIA,KACA,KAAK;AAAA,QACDqD,EAAgB;AAAA,UACZrD,EAAQ;AAAA,UACRA,EAAQ;AAAA,UACRA,EAAQ;AAAA,UACRA,EAAQ;AAAA,UACRA,EAAQ;AAAA,UACRA,EAAQ;AAAA,UACRA,EAAQ;AAAA,UACRA,EAAQ;AAAA,QAAA,CACX;AAAA,QACD,OAAO;AAAA,UACHsD;AAAA,UACAC;AAAA,UACAC;AAAA,UACAC;AAAA,UACAC;AAAA,UACAC;AAAA,UACAC;AAAA,UACAC;AAAA,QAAA,MACE;AACF,gBAAMC,IAAiB,KAAK,cAAc,QAAQ,YAC5CC,IAAc,KAAK,cAAc,QAAQ,SACzCC,IAAkB,KAAK,cAAc;AAE3C,eAAK,cAAc,aAAaV,KAAc,IAC9C,KAAK,cAAc,cAAcC,KAAe,IAChD,KAAK,cAAc,2BAA2BC,KAA4B,IAC1E,KAAK,cAAc,0BAA0BC,KAA2B,IACxE,KAAK,cAAc,wBAAwBC,KAAyB,IACpE,KAAK,cAAc,QAAQC,GAC3B,KAAK,cAAc,SAASC,GAC5B,KAAK,cAAc,cAAcC,GAE7B,CAACI,EAAA,MAAKvB,CAAA,KAAoB,KAAK,cAAc,eAC7CO,GAAA,MAAKP,GAAmB,EAAA,GACxB,MAAMS,QAAKX,GAAAI,EAAA,EAAL,KAAA,IAAA,IAON,CAACoB,KAAmBH,MAAgBF,GAAO,UAAU,KAAK,KAAKM,EAAA,MAAKvB,CAAA,KAAoB,CAAC,KAAK,eAC9F,KAAK,iBAAiB;AAAA,YAClB,GAAG,KAAK;AAAA,YACR,QAAQ,EAAG,qBAAsBS,EAAA,MAAKX,OAAL,KAAA,IAAA,EAAA;AAAA,UAAsB,GAE3D,KAAK,mBAAA,IAIL,KAAK,eAAeoB,MACpBA,EAAO,eAAeE,KACtBF,EAAO,YAAYG,OAEnB,KAAK,iBAAiB;AAAA,YAClB,GAAG,KAAK;AAAA,YACR,QAAQ,EAAG,qBAAsBZ,EAAA,MAAKX,OAAL,KAAA,IAAA,EAAA;AAAA,UAAsB,GAE3D,aAAayB,QAAKtB,CAAA,CAAkB,GACpCM,GAAA,MAAKN,GAAqB,WAAW,MAAM;AACvC,iBAAK,mBAAA;AAAA,UACT,GAAG,GAAG,CAAA;AAAA,QAEd;AAAA,MAAA;AAAA,IAGZ,CAAC;AAAA,EACL;AAAA,EA6DA,MAAgB,iBAAiB;AAC7B,WAAO,MAAMsB,QAAK1B,CAAA,EAAmB;AAAA,MACjC,KAAK,UAAU,KAAK,cAAc;AAAA,MAClC;AAAA,QACI,kBAAkB,KAAK,cAAc;AAAA,QACrC,SAAS,KAAK,cAAc;AAAA,QAC5B,qBAAqB,KAAK,cAAc;AAAA,QACxC,oBAAoB,KAAK,cAAc;AAAA,QACvC,YAAY,KAAK,cAAc;AAAA,QAC/B,aAAa,KAAK,cAAc;AAAA,QAChC,SAAS,KAAK,cAAc;AAAA,QAC5B,YAAY,KAAK,cAAc;AAAA,MAAA;AAAA,IACnC;AAAA,EAER;AAAA,EAEA,MAAgB,mBAAmB;AAC/B,UAAM,EAAE,MAAAzI,EAAA,IAAS,MAAMmK,EAAA,MAAK1B,GAAmB,mBAAmB;AAAA,MAC9D,oBAAoB,KAAK,cAAc;AAAA,MACvC,SAAS,KAAK,cAAc;AAAA,IAAA,CAC/B;AACD,WAAOzI;AAAA,EACX;AAAA,EAEmB,sBAA+B;AAC9C,WAAO,MAAM,oBAAA,KAAyB,KAAK,cAAc,eAAe;AAAA,EAC5E;AAeJ;AAnPIyI,IAAA,oBAAA,QAAA;AAFGC,IAAA,oBAAA,QAAA;AAkDGC,KAAwB,iBAAG;AAC7B,MAAI;AAIA,UAAM,KAAK,WAAWyB,GAA+B,EAAE,yBAAyB,IAAM,GACtF,KAAK,eAAeA,GAA+B,CAAClE,MAAY;AAC5D,MAAKA,KAEL,KAAK;AAAA,QACDqD,EAAgB,CAACrD,EAAQ,QAAQA,EAAQ,UAAU,kBAAkB,CAAC;AAAA,QACtE,OAAO,CAACI,GAAQG,CAAkB,MAAM;AACpC,gBAAM,KAAK,oBAAoBH,GAAQ,YAAYG,IAAqB,CAAC,CAAC;AAAA,QAC9E;AAAA,MAAA;AAAA,IAER,CAAC,EAAE,wBAAA;AAAA,EACP,QAAQ;AACJ,SAAK,8BAAA;AAAA,EACT;AACJ;AA4EAmC,IAAA,oBAAA,QAAA;AACAC,IAAA,oBAAA,QAAA;AAEMC,KAA0B,iBAAG;AAC/B,OAAK,eAAeuB,IAAgC,CAACnE,MAAY;AAC7D,IAAIA,KACA,KAAK;AAAA,MACDqD,EAAgB;AAAA,QACZrD,EAAQ;AAAA,QACRA,EAAQ;AAAA,QACRA,EAAQ;AAAA,QACRA,EAAQ;AAAA,MAAA,CACX;AAAA,MACD,OAAO,CAACoE,GAAU9B,GAAU+B,GAASC,CAAa,MAAM;AASpD,YARA,KAAK,cAAc,mBAAmBA,KAAiB,IACvD,KAAK,iBAAiB;AAAA,UAClB,aAAaF,KAAY,CAAA;AAAA,UACzB,cAAc9B,KAAY,CAAA;AAAA,UAC1B,QAAQ+B,KAAW,CAAA;AAAA,UACnB,QAAQ,EAAG,qBAAsBlB,EAAA,MAAKX,OAAL,KAAA,IAAA,EAAA;AAAA,QAAsB,GAE3D,KAAK,cAAc,cAAc4B,KAAY,CAAA,GAAI,UAAU,CAAAnD,MAAKA,EAAE,QAAQ,KAAK,cAAc,UAAU,GACnG,CAAC,KAAK,eAAe,CAAC,KAAK,YAAY;AAGvC,eAAK,KAAK,cAAc,OAAO,UAAU,KAAK,KAAK,CAAC,KAAK,cAAc;AACnE;AAEJ,eAAK,mBAAA;AAAA,QACT;AAAA,MACJ;AAAA,IAAA;AAAA,EAGZ,CAAC;AACL;AAEA4B,KAAc,WAA8B;AAoBxC,SAVI;AAAA,IACI;AAAA,MACI,OAXE,KAAK,cAAc,MAAM,IAAI,CAAA0B,OACQ;AAAA,QAC3C,KAAKA,EAAK;AAAA,QACV,OAAO,KAAK,cAAc,aAAa,KAAK,CAAAX,MAAUA,EAAO,QAAQW,EAAK,GAAG,GAAG,SAAS,CAAA;AAAA,MAAC,EAGjG;AAAA,MAMW,YAAY,KAAK,cAAc,QAAQ,cAAc;AAAA,MACrD,SAAS,KAAK,cAAc,QAAQ,WAAW;AAAA,MAC/C,YAAY,KAAK,cAAc,QAAQ,cAAc;AAAA,MACrD,aAAa,KAAK,cAAc,QAAQ;AAAA,IAAA;AAAA,EAC5C;AAIZ;AA1MSxB,EAwOO,SAAS;AAAA,EACrB,GAAGjD,EAAwB;AAAA,EAC3B0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUJ;AAnNWC,GAAA;AAAA,EADVC,EAAS,EAAE,WAAW,GAAA,CAAO;AAAA,GAhCrBqB,EAiCE,WAAA,kBAAA,CAAA;AAjCFA,IAANtB,GAAA;AAAA,EADN+C,GAAc1B,EAAW;AAAA,GACbC,CAAA;;;;;;;kYCXbR,GAAAkC,GAAAhC,IAAAC,IAAAE;AAQA,MAAME,KAAc;AAGb,IAAM4B,IAAN,cAAyC5E,EAA0C;AAAA,EAItF,cAAc;AACV,UAAA,GALDkD,GAAA,MAAAyB,CAAA,GAEHzB,GAAA,MAAAT,CAAA,GAOA,KAAU,gBAAkC;AAAA,MACxC,QAAQ;AAAA,MACR,oBAAoB;AAAA,MACpB,YAAY;AAAA,MACZ,aAAa;AAAA,MACb,kBAAkB;AAAA,MAClB,SAAS;AAAA,MACT,0BAA0B;AAAA,MAC1B,yBAAyB;AAAA,MACzB,uBAAuB;AAAA,MACvB,YAAY;AAAA,IAAA,GAIhB,KAAQ,kBAA0C;AAAA,MAC9C,QAAQ,CAAA;AAAA,MACR,QAAQ,CAAA;AAAA,MACR,aAAa,CAAA;AAAA,MACb,cAAc,CAAA;AAAA,IAAC,GAiFnBS,GAAA,MAAAN,IAAmB,EAAA,GAtGfO,GAAA,MAAKV,GAAqB,IAAIT,GAAkB,IAAI,CAAA;AAAA,EACxD;AAAA,EAwBA,IAAW,eAAenK,GAA2C;AACjE,UAAMuL,IAAgDvL,IAAQ,EAAE,GAAGA,EAAA,IAAU,CAAA;AAC7E,IAAAuL,EAAa,WAAW,CAAA,GACxBA,EAAa,gBAAgB,CAAA,GAC7BA,EAAa,iBAAiB,CAAA,GAC9BA,EAAa,WAAW,CAAA,GACxB,KAAK,kBAAkBA;AAAA,EAC3B;AAAA,EAEA,IAAW,iBAAyC;AAChD,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,MAAgB,wBAAwB;AACpC,SAAK,uBAAA,GACL,MAAMC,SAAKsB,GAAAhC,EAAA,EAAL,KAAA,IAAA;AAAA,EACV;AAAA,EAwBU,oBAAoB;AAC1B,SAAK,eAAekC,IAA8B,CAAC3E,MAAY;AAC3D,MAAIA,KACA,KAAK;AAAA,QACDqD,EAAgB;AAAA,UACZrD,EAAQ;AAAA,UACRA,EAAQ;AAAA,UACRA,EAAQ;AAAA,UACRA,EAAQ;AAAA,UACRA,EAAQ;AAAA,QAAA,CACX;AAAA,QACD,OAAO;AAAA,UACHsD;AAAA,UACAC;AAAA,UACAC;AAAA,UACAC;AAAA,UACAC;AAAA,QAAA,MACE;AACF,eAAK,cAAc,aAAaJ,KAAc,IAC9C,KAAK,cAAc,cAAcC,KAAe,IAChD,KAAK,cAAc,2BAA2BC,KAA4B,IAC1E,KAAK,cAAc,0BAA0BC,KAA2B,IACxE,KAAK,cAAc,wBAAwBC,KAAyB,IAKhE,CAACO,GAAA,MAAKvB,EAAA,KAAoB,KAAK,cAAc,eAC7CO,GAAA,MAAKP,IAAmB,EAAA,GACxB,MAAMS,SAAKsB,GAAA7B,EAAA,EAAL,KAAA,IAAA;AAAA,QAEd;AAAA,MAAA;AAAA,IAGZ,CAAC;AAAA,EACL;AAAA,EA2CA,MAAgB,iBAAiB;AAC7B,WAAO,MAAMqB,SAAK1B,CAAA,EAAmB;AAAA,MACjC,KAAK,UAAU,KAAK,cAAc;AAAA,MAClC;AAAA,QACI,kBAAkB,KAAK,cAAc;AAAA,QACrC,SAAS,KAAK,cAAc;AAAA,QAC5B,qBAAqB,KAAK,cAAc;AAAA,QACxC,oBAAoB,KAAK,cAAc;AAAA,QACvC,YAAY,KAAK,cAAc;AAAA,QAC/B,aAAa,KAAK,cAAc;AAAA,QAChC,SAAS,KAAK,cAAc;AAAA,QAC5B,YAAY,KAAK,cAAc;AAAA,MAAA;AAAA,IACnC;AAAA,EAER;AAAA,EAEA,MAAgB,mBAAmB;AAC/B,UAAM,EAAE,MAAAzI,EAAA,IAAS,MAAMmK,GAAA,MAAK1B,GAAmB,mBAAmB;AAAA,MAC9D,oBAAoB,KAAK,cAAc;AAAA,MACvC,SAAS,KAAK,cAAc;AAAA,IAAA,CAC/B;AACD,WAAOzI;AAAA,EACX;AAAA,EAEmB,sBAA+B;AAC9C,WAAO,MAAM,oBAAA,KAAyB,KAAK,cAAc,eAAe;AAAA,EAC5E;AAeJ;AA5LIyI,IAAA,oBAAA,QAAA;AAFGkC,IAAA,oBAAA,QAAA;AAiDGhC,KAAwB,iBAAG;AAC7B,MAAI;AAIA,UAAM,KAAK,WAAWyB,GAA+B,EAAE,yBAAyB,IAAM,GAEtF,KAAK,eAAeA,GAA+B,CAAClE,MAAY;AAC5D,MAAKA,KAEL,KAAK;AAAA,QACDqD,EAAgB,CAACrD,EAAQ,QAAQA,EAAQ,UAAU,kBAAkB,CAAC;AAAA,QACtE,OAAO,CAACI,GAAQG,CAAkB,MAAM;AACpC,gBAAM,KAAK,oBAAoBH,GAAQ,YAAYG,IAAqB,CAAC,CAAC;AAAA,QAC9E;AAAA,MAAA;AAAA,IAER,CAAC,EAAE,wBAAA;AAAA,EACP,QAAQ;AACJ,SAAK,8BAAA;AAAA,EACT;AACJ;AAuCAmC,KAAA,oBAAA,QAAA;AAEAE,KAA0B,WAAG;AACzB,OAAK,eAAegC,IAAgC,CAAC5E,MAAY;AAC7D,IAAIA,KACA,KAAK;AAAA,MACDqD,EAAgB;AAAA,QACZrD,EAAQ;AAAA,QACRA,EAAQ;AAAA,QACRA,EAAQ;AAAA,QACRA,EAAQ;AAAA,QACRA,EAAQ;AAAA,MAAA,CACX;AAAA,MACD,OAAO;AAAA,QACHoE;AAAA,QACA9B;AAAA,QACAuC;AAAA,QACAR;AAAA,QACAC;AAAA,MAAA,MACE;AACF,aAAK,cAAc,mBAAmBA,KAAiB,IAEvD,KAAK,iBAAiB;AAAA,UAClB,aAAaF,GAAU,OAAO,CAAAnD,MAAKA,EAAE,QAAQ,KAAK,cAAc,UAAU,KAAK,CAAA;AAAA,UAC/E,cAAcqB,GAAU,OAAO,CAAArB,MAAKA,EAAE,QAAQ,KAAK,cAAc,WAAW,KAAK,CAAA;AAAA,UACjF,QAAQoD,GAAS,OAAO,CAAApD,MAAKA,EAAE,eAAe,KAAK,cAAc,UAAU,KAAK,CAAA;AAAA,UAChF,QAAQ;AAAA,YACH,qBAAsB4D,GAAS,OAAO,CAAA5D,MAAKA,EAAE,eAAe,KAAK,cAAc,UAAU,KAAK,CAAA;AAAA,UAAC;AAAA,QACpG,GAGJ,KAAK,cAAc,aAAamD,GAAU,QAAQ,KAAK,eAAe,YAAY,CAAC,CAAC,GAChF,CAAC,KAAK,eAAe,CAAC,KAAK,cAC3B,KAAK,mBAAA;AAAA,MAEb;AAAA,IAAA;AAAA,EAGZ,CAAC;AACL;AAnJSM,EAiLO,SAAS;AAAA,EACrB,GAAG5E,EAAwB;AAAA,EAC3B0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUJ;AAtKQC,GAAA;AAAA,EADPI,EAAA;AAAM,GAtBE6C,EAuBD,WAAA,mBAAA,CAAA;AAQGjD,GAAA;AAAA,EADVC,EAAS,EAAE,WAAW,GAAA,CAAO;AAAA,GA9BrBgD,EA+BE,WAAA,kBAAA,CAAA;AA/BFA,IAANjD,GAAA;AAAA,EADN+C,GAAc1B,EAAW;AAAA,GACb4B,CAAA;;;;;;;kYCXbnC,GAAAuC,IAAArC,IAAAC,IAAAE;AAQA,MAAME,KAAc;AAGb,IAAMiC,IAAN,cAA2CjF,EAAsC;AAAA,EAIpF,cAAc;AACV,UAAA,GALDkD,GAAA,MAAA8B,EAAA,GAEH9B,GAAA,MAAAT,CAAA,GAOA,KAAU,gBAA8B;AAAA,MACpC,QAAQ;AAAA,MACR,oBAAoB;AAAA,MACpB,YAAY;AAAA,MACZ,aAAa;AAAA,MACb,kBAAkB;AAAA,MAClB,SAAS;AAAA,MACT,0BAA0B;AAAA,MAC1B,yBAAyB;AAAA,MACzB,uBAAuB;AAAA,MACvB,YAAY;AAAA,IAAA,GAIhB,KAAQ,oBAA8C;AAAA,MAClD,QAAQ,CAAA;AAAA,MACR,QAAQ,CAAA;AAAA,MACR,aAAa,CAAA;AAAA,MACb,cAAc,CAAA;AAAA,IAAC,GA8EnBS,GAAA,MAAAN,IAAmB,EAAA,GAnGfO,GAAA,MAAKV,GAAqB,IAAIT,GAAkB,IAAI,CAAA;AAAA,EACxD;AAAA,EAwBA,IAAW,iBAAiBnK,GAA6C;AACrE,UAAMuL,IAAkDvL,IAAQ,EAAE,GAAGA,EAAA,IAAU,CAAA;AAC/E,IAAAuL,EAAa,WAAW,CAAA,GACxBA,EAAa,gBAAgB,CAAA,GAC7BA,EAAa,iBAAiB,CAAA,GAC9BA,EAAa,WAAW,CAAA,GACxB,KAAK,oBAAoBA;AAAA,EAC7B;AAAA,EAEA,IAAW,mBAA6C;AACpD,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,MAAgB,wBAAwB;AACpC,SAAK,uBAAA,GACL,MAAMC,SAAK2B,IAAArC,EAAA,EAAL,KAAA,IAAA;AAAA,EACV;AAAA,EAwBU,oBAAoB;AAC1B,SAAK,eAAeuC,IAAgC,CAAChF,MAAY;AAC7D,MAAIA,KACA,KAAK;AAAA,QACDqD,EAAgB;AAAA,UACZrD,EAAQ;AAAA,UACRA,EAAQ;AAAA,UACRA,EAAQ;AAAA,UACRA,EAAQ;AAAA,UACRA,EAAQ;AAAA,QAAA,CACX;AAAA,QACD,OAAO;AAAA,UACHsD;AAAA,UACAC;AAAA,UACAC;AAAA,UACAC;AAAA,UACAC;AAAA,QAAA,MACE;AACF,eAAK,cAAc,aAAaJ,KAAc,IAC9C,KAAK,cAAc,cAAcC,KAAe,IAChD,KAAK,cAAc,2BAA2BC,KAA4B,IAC1E,KAAK,cAAc,0BAA0BC,KAA2B,IACxE,KAAK,cAAc,wBAAwBC,KAAyB,IAE/DO,SAAKvB,EAAA,MACNO,GAAA,MAAKP,IAAmB,EAAA,GACxB,MAAMS,SAAK2B,IAAAlC,EAAA,EAAL,KAAA,IAAA;AAAA,QAEd;AAAA,MAAA;AAAA,IAGZ,CAAC;AAAA,EACL;AAAA,EA2CA,MAAgB,iBAAiB;AAC7B,WAAO,MAAMqB,SAAK1B,CAAA,EAAmB;AAAA,MACjC,KAAK,UAAU,KAAK,gBAAgB;AAAA,MACpC;AAAA,QACI,kBAAkB,KAAK,cAAc;AAAA,QACrC,SAAS,KAAK,cAAc;AAAA,QAC5B,qBAAqB,KAAK,cAAc;AAAA,QACxC,oBAAoB,KAAK,cAAc;AAAA,QACvC,YAAY,KAAK,cAAc;AAAA,QAC/B,aAAa,KAAK,cAAc;AAAA,QAChC,SAAS,KAAK,cAAc;AAAA,QAC5B,YAAY,KAAK,cAAc;AAAA,MAAA;AAAA,IACnC;AAAA,EAER;AAAA,EAEA,MAAgB,mBAAmB;AAC/B,UAAM,EAAE,MAAAzI,EAAA,IAAS,MAAMmK,GAAA,MAAK1B,GAAmB,0BAA0B;AAAA,MACrE,oBAAoB,KAAK,cAAc;AAAA,MACvC,SAAS,KAAK,cAAc;AAAA,IAAA,CAC/B;AACD,WAAOzI;AAAA,EACX;AAAA,EAEmB,sBAA+B;AAC9C,WAAO,MAAM,oBAAA,KAAyB,KAAK,cAAc,eAAe;AAAA,EAC5E;AAeJ;AAzLIyI,IAAA,oBAAA,QAAA;AAFGuC,KAAA,oBAAA,QAAA;AAiDGrC,KAAwB,iBAAG;AAC7B,MAAI;AAIA,UAAM,KAAK,WAAWyB,GAA+B,EAAE,yBAAyB,IAAM,GAEtF,KAAK,eAAeA,GAA+B,CAAClE,MAAY;AAC5D,MAAKA,KAEL,KAAK;AAAA,QACDqD,EAAgB,CAACrD,EAAQ,QAAQA,EAAQ,UAAU,kBAAkB,CAAC;AAAA,QACtE,OAAO,CAACI,GAAQG,CAAkB,MAAM;AACpC,gBAAM,KAAK,oBAAoBH,GAAQ,YAAYG,IAAqB,CAAC,CAAC;AAAA,QAC9E;AAAA,MAAA;AAAA,IAER,CAAC,EAAE,wBAAA;AAAA,EACP,QAAQ;AACJ,SAAK,8BAAA;AAAA,EACT;AACJ;AAoCAmC,KAAA,oBAAA,QAAA;AAEAE,KAA0B,WAAG;AACzB,OAAK,eAAeqC,IAAkC,CAACjF,MAAY;AAC/D,IAAIA,KACA,KAAK;AAAA,MACDqD,EAAgB;AAAA,QACZrD,EAAQ;AAAA,QACRA,EAAQ;AAAA,QACRA,EAAQ;AAAA,QACRA,EAAQ;AAAA,QACRA,EAAQ;AAAA,MAAA,CACX;AAAA,MACD,OAAO;AAAA,QACHoE;AAAA,QACA9B;AAAA,QACAuC;AAAA,QACAR;AAAA,QACAC;AAAA,MAAA,MACE;AACF,aAAK,cAAc,mBAAmBA,KAAiB,IAEvD,KAAK,mBAAmB;AAAA,UACpB,aAAaF,GAAU,OAAO,CAAAnD,MAAKA,EAAE,QAAQ,KAAK,cAAc,UAAU,KAAK,CAAA;AAAA,UAC/E,cAAcqB,GAAU,OAAO,CAAArB,MAAKA,EAAE,QAAQ,KAAK,cAAc,WAAW,KAAK,CAAA;AAAA,UACjF,QAAQoD,GAAS,OAAO,CAAApD,MAAKA,EAAE,eAAe,KAAK,cAAc,UAAU,KAAK,CAAA;AAAA,UAChF,QAAQ;AAAA,YACH,uBAAwB4D,GAAS,OAAO,CAAA5D,MAAKA,EAAE,eAAe,KAAK,cAAc,UAAU,KAAK,CAAA;AAAA,UAAC;AAAA,QACtG,GAGJ,KAAK,cAAc,aAAamD,GAAU,QAAQ,KAAK,iBAAiB,YAAY,CAAC,CAAC,GAClF,CAAC,KAAK,eAAe,CAAC,KAAK,cAC3B,KAAK,mBAAA;AAAA,MAEb;AAAA,IAAA;AAAA,EAGZ,CAAC;AACL;AAhJSW,EA8KO,SAAS;AAAA,EACrB,GAAGjF,EAAwB;AAAA,EAC3B0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUJ;AAnKQC,GAAA;AAAA,EADPI,EAAA;AAAM,GAtBEkD,EAuBD,WAAA,qBAAA,CAAA;AAQGtD,GAAA;AAAA,EADVC,EAAS,EAAE,WAAW,GAAA,CAAO;AAAA,GA9BrBqD,EA+BE,WAAA,oBAAA,CAAA;AA/BFA,IAANtD,GAAA;AAAA,EADN+C,GAAc1B,EAAW;AAAA,GACbiC,CAAA;;;;;;;gYCXbxC,GAAA2C,IAAAC,IAAAC,IAAA1C,IAAAE;AAQA,MAAME,KAAc;AAGb,IAAMuC,IAAN,cAAwCvF,EAAsC;AAAA,EAIjF,cAAc;AACV,UAAA,GALDkD,EAAA,MAAAkC,EAAA,GAEHlC,EAAA,MAAAT,CAAA,GAOA,KAAU,gBAA8B;AAAA,MACpC,QAAQ;AAAA,MACR,oBAAoB;AAAA,MACpB,YAAY;AAAA,MACZ,aAAa;AAAA,MACb,kBAAkB;AAAA,MAClB,SAAS;AAAA,MACT,0BAA0B;AAAA,MAC1B,yBAAyB;AAAA,MACzB,uBAAuB;AAAA,MACvB,YAAY;AAAA,IAAA,GAIhB,KAAQ,iBAAwC;AAAA,MAC5C,QAAQ,CAAA;AAAA,MACR,QAAQ,CAAA;AAAA,MACR,aAAa,CAAA;AAAA,MACb,cAAc,CAAA;AAAA,IAAC,GAgDnBS,EAAA,MAAAoC,IAAiB,EAAA,GA0CjBpC,EAAA,MAAAN,IAAmB,EAAA,GA/GfO,GAAA,MAAKV,GAAqB,IAAIT,GAAkB,IAAI,CAAA;AAAA,EACxD;AAAA,EAwBA,IAAW,cAAcnK,GAA0C;AAC/D,UAAMuL,IAA+CvL,IAAQ,EAAE,GAAGA,EAAA,IAAU,CAAA;AAC5E,IAAAuL,EAAa,WAAW,CAAA,GACxBA,EAAa,gBAAgB,CAAA,GAC7BA,EAAa,iBAAiB,CAAA,GAC9BA,EAAa,WAAW,CAAA,GACxB,KAAK,iBAAiBA;AAAA,EAC1B;AAAA,EACA,IAAW,gBAAuC;AAC9C,WAAO,KAAK;AAAA,EAChB;AAAA,EAEU,wBAAwB;AAC9B,SAAK,uBAAA,GAML,KAAK,kBAAA,GACLC,GAAA,MAAK+B,IAAAC,EAAA,EAAL,KAAA,IAAA;AAAA,EACJ;AAAA,EAyBU,oBAA0B;AAGhC,IAAIlB,QAAKmB,EAAA,MACTnC,GAAA,MAAKmC,IAAiB,EAAA,GACtB,KAAK,eAAeE,IAA6B,CAACtF,MAAY;AAC1D,MAAIA,KAAW,QACX,KAAK;AAAA,QACDqD,EAAgB;AAAA,UACZrD,EAAQ;AAAA,UACRA,EAAQ;AAAA,UACRA,EAAQ;AAAA,UACRA,EAAQ;AAAA,UACRA,EAAQ;AAAA,QAAA,CACX;AAAA,QACD,OAAO;AAAA,UACHsD;AAAA,UACAC;AAAA,UACAC;AAAA,UACAC;AAAA,UACAC;AAAA,QAAA,MACE;AACF,eAAK,cAAc,aAAaJ,KAAc,IAC9C,KAAK,cAAc,cAAcC,KAAe,IAChD,KAAK,cAAc,2BAA2BC,KAA4B,IAC1E,KAAK,cAAc,0BAA0BC,KAA2B,IACxE,KAAK,cAAc,wBAAwBC,KAAyB,IAKhE,CAACO,EAAA,MAAKvB,EAAA,KAAoB,KAAK,cAAc,eAC7CO,GAAA,MAAKP,IAAmB,EAAA,GACxB,MAAMS,SAAK+B,IAAAtC,EAAA,EAAL,KAAA,IAAA;AAAA,QAEd;AAAA,MAAA;AAAA,IAEZ,CAAC;AAAA,EACL;AAAA,EAwCA,MAAgB,iBAAiB;AAC7B,WAAO,MAAMqB,QAAK1B,CAAA,EAAmB;AAAA,MACjC,KAAK,UAAU,KAAK,aAAa;AAAA,MACjC;AAAA,QACI,kBAAkB,KAAK,cAAc;AAAA,QACrC,SAAS,KAAK,cAAc;AAAA,QAC5B,qBAAqB,KAAK,cAAc;AAAA,QACxC,oBAAoB,KAAK,cAAc;AAAA,QACvC,SAAS,KAAK,cAAc;AAAA,MAAA;AAAA,IAChC;AAAA,EAER;AAAA,EAEA,MAAgB,mBAAmB;AAC/B,UAAM,EAAE,MAAAzI,EAAA,IAAS,MAAMmK,EAAA,MAAK1B,GAAmB,kBAAkB;AAAA,MAC7D,oBAAoB,KAAK,cAAc;AAAA,MACvC,SAAS,KAAK,cAAc;AAAA,IAAA,CAC/B;AACD,WAAOzI;AAAA,EACX;AACJ;AA7KIyI,IAAA,oBAAA,QAAA;AAFG2C,KAAA,oBAAA,QAAA;AAsDHC,KAAyB,WAAG;AACxB,MAAI;AAIA,SAAK,eAAeI,IAAgC,CAACvF,MAAY;AAC7D,MAAIA,MACA,KAAK,4BAA4B,IACjC,KAAK;AAAA,QACDqD,EAAgB,CAACrD,EAAQ,QAAQA,EAAQ,iBAAiB,CAAC;AAAA,QAC3D,OAAO,CAACI,GAAQC,CAAkB,MAAM;AACpC,gBAAM,KAAK,oBAAoBD,GAAQ,SAAA,GAAYC,CAAkB;AAAA,QACzE;AAAA,MAAA;AAAA,IAGZ,CAAC,EAAE,wBAAA;AAAA,EACP,QAAQ;AACJ,SAAK,8BAAA;AAAA,EACT;AACJ;AAEA+E,KAAA,oBAAA,QAAA;AA0CA1C,KAAA,oBAAA,QAAA;AAEAE,KAA0B,WAAS;AAC/B,OAAK,eAAe4C,IAA+B,CAACxF,MAAY;AAC5D,IAAIA,KAAW,QACX,KAAK;AAAA,MACDqD,EAAgB;AAAA,QACZrD,EAAQ;AAAA,QACRA,EAAQ;AAAA,QACRA,EAAQ;AAAA,QACRA,EAAQ;AAAA,QACRA,EAAQ;AAAA,MAAA,CACX;AAAA,MACD,OAAO;AAAA,QACHoE;AAAA,QACA9B;AAAA,QACAuC;AAAA,QACAR;AAAA,QACAC;AAAA,MAAA,MACE;AACF,aAAK,cAAc,mBAAmBA,KAAiB,IAEvD,KAAK,gBAAgB;AAAA,UACjB,aAAaF,GAAU,OAAO,CAAAnD,MAAKA,EAAE,QAAQ,KAAK,cAAc,UAAU,KAAK,CAAA;AAAA,UAC/E,cAAcqB,GAAU,OAAO,CAAArB,MAAKA,EAAE,QAAQ,KAAK,cAAc,WAAW,KAAK,CAAA;AAAA,UACjF,QAAQoD,GAAS,OAAO,CAAApD,MAAKA,EAAE,eAAe,KAAK,cAAc,UAAU,KAAK,CAAA;AAAA,UAChF,QAAQ;AAAA,YACH,oBAAqB4D,GAAS,OAAO,CAAA5D,MAAKA,EAAE,eAAe,KAAK,cAAc,UAAU,KAAK,CAAA;AAAA,UAAC;AAAA,QACnG,GAEA,CAAC,KAAK,eAAe,CAAC,KAAK,cAC3B,KAAK,mBAAA;AAAA,MAEb;AAAA,IAAA;AAAA,EAEZ,CAAC;AACL;AAlIQQ,GAAA;AAAA,EADPI,EAAA;AAAM,GAtBEwD,EAuBD,WAAA,kBAAA,CAAA;AAQG5D,GAAA;AAAA,EADVC,EAAS,EAAE,WAAW,GAAA,CAAO;AAAA,GA9BrB2D,EA+BE,WAAA,iBAAA,CAAA;AA/BFA,IAAN5D,GAAA;AAAA,EADN+C,GAAc1B,EAAW;AAAA,GACbuC,CAAA;ACAN,MAAMI,GAAyB;AAAA,EAClCC;AAAA,EACAC,KAAe;AAAA,EACfC,KAA4B,CAAA;AAAA,EAE5B,YAAYC,IAAwB,GAAG;AACnC,SAAKH,KAAiBG;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,QAAWC,GAAoC;AACjD,IAAI,KAAKH,MAAgB,KAAKD,MAC1B,MAAM,IAAI,QAAc,CAAC/M,MAAY;AACjC,WAAKiN,GAAO,KAAKjN,CAAO;AAAA,IAC5B,CAAC,GAGL,KAAKgN;AACL,QAAI;AACA,aAAO,MAAMG,EAAA;AAAA,IACjB,UAAA;AACI,WAAKH,MACD,KAAKC,GAAO,SAAS,KACR,KAAKA,GAAO,MAAA,EACzB;AAAA,IAER;AAAA,EACJ;AACJ;ACtCO,MAAMG,WAA4B3D,GAAkB;AAAA,EAEvD4D,KAAgB,IAAIP,GAAyB,CAAC;AAAA,EAC9CQ,yBAAuB,IAAA;AAAA;AAAA,EAGvB,IAAI,eAAyC;AACzC,WAAO,KAAKD;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMAE,KAAU,IAAIC,GAAe,EAAE;AAAA,EAC/BC,KAAsB,IAAID,GAAe,EAAE;AAAA,EAE3C,YAAYnE,GAAyB;AACjC,UAAMA,CAAI;AAAA,EACd;AAAA,EAEA,YAAoB;AAChB,WAAO,KAAKkE,GAAQ,SAAA;AAAA,EACxB;AAAA,EAEA,MAAM,UAAU9F,GAAgB;AAC5B,IAAIA,MAAW,MACX,KAAK8F,GAAQ,SAAS9F,CAAM;AAAA,EAEpC;AAAA,EAEA,wBAAgC;AAC5B,WAAO,KAAKgG,GAAoB,SAAA;AAAA,EACpC;AAAA,EAEA,MAAM,sBAAsB/F,GAA4B;AACpD,IAAIA,MAAuB,MACvB,KAAK+F,GAAoB,SAAS/F,CAAkB;AAAA,EAE5D;AAAA,EAEA,sBAAsBI,GAAsC;AACxD,UAAM4F,IAAS,KAAKJ,GAAiB,IAAIxF,CAAI;AAC7C,QAAI4F,EAAQ,QAAOA;AAEnB,UAAMC,IAAU,MAAM7F,CAAI,EACrB,KAAK,CAAAvH,MAAYA,EAAS,KAAA,CAAM,EAChC,KAAK,CAAAsI,MAAO;AACT,YAAM+E,IAAQ,IAAI,cAAA;AAClB,aAAAA,EAAM,YAAY/E,CAAG,GACd+E;AAAA,IACX,CAAC;AACL,gBAAKN,GAAiB,IAAIxF,GAAM6F,CAAO,GAChCA;AAAA,EACX;AAEJ;;;;;8CC1DME,KAAyC;AAAA,EAC3C;AAAA,IACI,MAAM;AAAA,IACN,OAAO;AAAA,IACP,MAAM;AAAA,IACN,IAAI,MAAM,QAAA,QAAA,EAAA,KAAA,MAAAC,EAAA;AAAA,EAAmC;AAErD,GAEaC,KAAYF,ICVnBG,KAA6C;AAAA,EAC/C;AAAA,IACI,MAAM;AAAA,IACN,OAAO;AAAA,IACP,MAAM;AAAA,IACN,MAAM;AAAA,MACF,SAAS;AAAA,IAAA;AAAA,IAEb,IAAI,MAAM,OAAO,kBAAS;AAAA,EAAA;AAElC,GAEaD,KAAYC,ICCZC,KAA8B,OAAO5E,GAAM6E,MAAsB;AAE1E,EAAA7E,EAAK,eAAe8E,IAAkB,OAAOC,MAAgB;AACzD,QAAI,CAACA,EAAa;AAElB,UAAMvJ,IAASuJ,EAAY,wBAAA;AAE3B,IAAArH,EAAO,UAAU;AAAA,MACb,SAASlC,GAAQ,QAAQ;AAAA,MACzB,MAAMA,GAAQ,SAAS;AAAA,MACvB,aAAaA,GAAQ,eAAe;AAAA,IAAA,CACvC,GAEDkC,EAAO,aAAa,QAAQ,IAAI,OAAOzG,GAAS+N,MAAa;AACzD,YAAM3K,IAAQ,MAAMmB,EAAO,MAAA;AAC3B,aAAAvE,EAAQ,QAAQ,IAAI,iBAAiB,UAAUoD,CAAK,EAAE,GAC/CpD;AAAA,IACX,CAAC;AAGD,UAAMqJ,IAAW,MADU,IAAIH,GAAmBH,CAAI,EACZ,YAAA;AAE1C,QAAIiF,IAAuD,CAAA;AAE3D,QAAI3E,GAAU;AACV,UAAIA,EAAS,UAAU,SAAS;AAC5B,YAAI4E,IAAmD;AAAA,UACnD,MAAM;AAAA,UACN,OAAO;AAAA,UACP,MAAM;AAAA,UACN,SAASnE;AAAA,UACT,gBAAgB;AAAA,QAAA;AAGpB,QAAIT,EAAS,UAAU,cAAc,WAAW,MAC5C4E,EAAkB,sBAAsB5E,EAAS,UAAU,eAG/D2E,EAAoB,KAAKC,CAAiB;AAAA,MAC9C;AAEA,UAAI5E,EAAS,UAAU,SAAS;AAC5B,YAAI6E,IAAmD;AAAA,UACnD,MAAM;AAAA,UACN,OAAO;AAAA,UACP,MAAM;AAAA,UACN,SAASzC;AAAA,UACT,gBAAgB;AAAA,QAAA;AAGpB,QAAIpC,EAAS,UAAU,cAAc,WAAW,MAC5C6E,EAAkB,sBAAsB7E,EAAS,UAAU,eAG/D2E,EAAoB,KAAKE,CAAiB;AAAA,MAC9C;AAEA,UAAI7E,EAAS,YAAY,SAAS;AAC9B,YAAI8E,IAAqD;AAAA,UACrD,MAAM;AAAA,UACN,OAAO;AAAA,UACP,MAAM;AAAA,UACN,SAASrC;AAAA,UACT,gBAAgB;AAAA,QAAA;AAGpB,QAAIzC,EAAS,YAAY,cAAc,WAAW,MAC9C8E,EAAoB,sBAAsB9E,EAAS,YAAY,eAGnE2E,EAAoB,KAAKG,CAAmB;AAAA,MAChD;AAEA,UAAI9E,EAAS,SAAS,SAAS;AAC3B,YAAI+E,IAAkD;AAAA,UAClD,MAAM;AAAA,UACN,OAAO;AAAA,UACP,MAAM;AAAA,UACN,SAAShC;AAAA,UACT,gBAAgB;AAAA,QAAA;AAGpB,QAAI/C,EAAS,SAAS,cAAc,WAAW,MAC3C+E,EAAiB,sBAAsB/E,EAAS,SAAS,eAG7D2E,EAAoB,KAAKI,CAAgB;AAAA,MAC7C;AAAA,IACJ;AAEA,IAAAR,EAAkB,aAAa;AAAA,MAC3B,GAAGI;AAAA,MACH,GAAGK;AAAAA,MACH,GAAGC;AAAAA,IAAA,CACN,GAEDvF,EAAK,eAAepC,IAAuB,IAAImG,GAAoB/D,CAAI,CAAC;AAAA,EAC5E,CAAC;AACL;"} \ No newline at end of file +{"version":3,"file":"index.js","sources":["../../../../Umbraco.Community.BlockPreview.UI/src/api/core/bodySerializer.gen.ts","../../../../Umbraco.Community.BlockPreview.UI/src/api/core/serverSentEvents.gen.ts","../../../../Umbraco.Community.BlockPreview.UI/src/api/core/pathSerializer.gen.ts","../../../../Umbraco.Community.BlockPreview.UI/src/api/core/utils.gen.ts","../../../../Umbraco.Community.BlockPreview.UI/src/api/core/auth.gen.ts","../../../../Umbraco.Community.BlockPreview.UI/src/api/client/utils.gen.ts","../../../../Umbraco.Community.BlockPreview.UI/src/api/client/client.gen.ts","../../../../Umbraco.Community.BlockPreview.UI/src/api/client.gen.ts","../../../../Umbraco.Community.BlockPreview.UI/src/api/sdk.gen.ts","../../../../Umbraco.Community.BlockPreview.UI/src/context/block-preview.context-token.ts","../../../../Umbraco.Community.BlockPreview.UI/src/blockEditor/block-preview-base.element.ts","../../../../Umbraco.Community.BlockPreview.UI/src/repository/preview.data-source.ts","../../../../Umbraco.Community.BlockPreview.UI/src/repository/settings.data-source.ts","../../../../Umbraco.Community.BlockPreview.UI/src/repository/settings.repository.ts","../../../../Umbraco.Community.BlockPreview.UI/src/blockEditor/block-grid-preview.custom-view.element.ts","../../../../Umbraco.Community.BlockPreview.UI/src/blockEditor/block-list-preview.custom-view.element.ts","../../../../Umbraco.Community.BlockPreview.UI/src/blockEditor/block-single-preview.custom-view.element.ts","../../../../Umbraco.Community.BlockPreview.UI/src/blockEditor/rich-text-preview.custom-view.element.ts","../../../../Umbraco.Community.BlockPreview.UI/src/context/block-preview-request-queue.ts","../../../../Umbraco.Community.BlockPreview.UI/src/context/block-preview.context.ts","../../../../Umbraco.Community.BlockPreview.UI/src/context/manifests.ts","../../../../Umbraco.Community.BlockPreview.UI/src/localization/manifests.ts","../../../../Umbraco.Community.BlockPreview.UI/src/index.ts"],"sourcesContent":["// This file is auto-generated by @hey-api/openapi-ts\r\n\r\nimport type {\r\n ArrayStyle,\r\n ObjectStyle,\r\n SerializerOptions,\r\n} from './pathSerializer.gen';\r\n\r\nexport type QuerySerializer = (query: Record) => string;\r\n\r\nexport type BodySerializer = (body: any) => any;\r\n\r\nexport interface QuerySerializerOptions {\r\n allowReserved?: boolean;\r\n array?: SerializerOptions;\r\n object?: SerializerOptions;\r\n}\r\n\r\nconst serializeFormDataPair = (\r\n data: FormData,\r\n key: string,\r\n value: unknown,\r\n): void => {\r\n if (typeof value === 'string' || value instanceof Blob) {\r\n data.append(key, value);\r\n } else if (value instanceof Date) {\r\n data.append(key, value.toISOString());\r\n } else {\r\n data.append(key, JSON.stringify(value));\r\n }\r\n};\r\n\r\nconst serializeUrlSearchParamsPair = (\r\n data: URLSearchParams,\r\n key: string,\r\n value: unknown,\r\n): void => {\r\n if (typeof value === 'string') {\r\n data.append(key, value);\r\n } else {\r\n data.append(key, JSON.stringify(value));\r\n }\r\n};\r\n\r\nexport const formDataBodySerializer = {\r\n bodySerializer: | Array>>(\r\n body: T,\r\n ): FormData => {\r\n const data = new FormData();\r\n\r\n Object.entries(body).forEach(([key, value]) => {\r\n if (value === undefined || value === null) {\r\n return;\r\n }\r\n if (Array.isArray(value)) {\r\n value.forEach((v) => serializeFormDataPair(data, key, v));\r\n } else {\r\n serializeFormDataPair(data, key, value);\r\n }\r\n });\r\n\r\n return data;\r\n },\r\n};\r\n\r\nexport const jsonBodySerializer = {\r\n bodySerializer: (body: T): string =>\r\n JSON.stringify(body, (_key, value) =>\r\n typeof value === 'bigint' ? value.toString() : value,\r\n ),\r\n};\r\n\r\nexport const urlSearchParamsBodySerializer = {\r\n bodySerializer: | Array>>(\r\n body: T,\r\n ): string => {\r\n const data = new URLSearchParams();\r\n\r\n Object.entries(body).forEach(([key, value]) => {\r\n if (value === undefined || value === null) {\r\n return;\r\n }\r\n if (Array.isArray(value)) {\r\n value.forEach((v) => serializeUrlSearchParamsPair(data, key, v));\r\n } else {\r\n serializeUrlSearchParamsPair(data, key, value);\r\n }\r\n });\r\n\r\n return data.toString();\r\n },\r\n};\r\n","// This file is auto-generated by @hey-api/openapi-ts\r\n\r\nimport type { Config } from './types.gen';\r\n\r\nexport type ServerSentEventsOptions = Omit<\r\n RequestInit,\r\n 'method'\r\n> &\r\n Pick & {\r\n /**\r\n * Fetch API implementation. You can use this option to provide a custom\r\n * fetch instance.\r\n *\r\n * @default globalThis.fetch\r\n */\r\n fetch?: typeof fetch;\r\n /**\r\n * Implementing clients can call request interceptors inside this hook.\r\n */\r\n onRequest?: (url: string, init: RequestInit) => Promise;\r\n /**\r\n * Callback invoked when a network or parsing error occurs during streaming.\r\n *\r\n * This option applies only if the endpoint returns a stream of events.\r\n *\r\n * @param error The error that occurred.\r\n */\r\n onSseError?: (error: unknown) => void;\r\n /**\r\n * Callback invoked when an event is streamed from the server.\r\n *\r\n * This option applies only if the endpoint returns a stream of events.\r\n *\r\n * @param event Event streamed from the server.\r\n * @returns Nothing (void).\r\n */\r\n onSseEvent?: (event: StreamEvent) => void;\r\n serializedBody?: RequestInit['body'];\r\n /**\r\n * Default retry delay in milliseconds.\r\n *\r\n * This option applies only if the endpoint returns a stream of events.\r\n *\r\n * @default 3000\r\n */\r\n sseDefaultRetryDelay?: number;\r\n /**\r\n * Maximum number of retry attempts before giving up.\r\n */\r\n sseMaxRetryAttempts?: number;\r\n /**\r\n * Maximum retry delay in milliseconds.\r\n *\r\n * Applies only when exponential backoff is used.\r\n *\r\n * This option applies only if the endpoint returns a stream of events.\r\n *\r\n * @default 30000\r\n */\r\n sseMaxRetryDelay?: number;\r\n /**\r\n * Optional sleep function for retry backoff.\r\n *\r\n * Defaults to using `setTimeout`.\r\n */\r\n sseSleepFn?: (ms: number) => Promise;\r\n url: string;\r\n };\r\n\r\nexport interface StreamEvent {\r\n data: TData;\r\n event?: string;\r\n id?: string;\r\n retry?: number;\r\n}\r\n\r\nexport type ServerSentEventsResult<\r\n TData = unknown,\r\n TReturn = void,\r\n TNext = unknown,\r\n> = {\r\n stream: AsyncGenerator<\r\n TData extends Record ? TData[keyof TData] : TData,\r\n TReturn,\r\n TNext\r\n >;\r\n};\r\n\r\nexport const createSseClient = ({\r\n onRequest,\r\n onSseError,\r\n onSseEvent,\r\n responseTransformer,\r\n responseValidator,\r\n sseDefaultRetryDelay,\r\n sseMaxRetryAttempts,\r\n sseMaxRetryDelay,\r\n sseSleepFn,\r\n url,\r\n ...options\r\n}: ServerSentEventsOptions): ServerSentEventsResult => {\r\n let lastEventId: string | undefined;\r\n\r\n const sleep =\r\n sseSleepFn ??\r\n ((ms: number) => new Promise((resolve) => setTimeout(resolve, ms)));\r\n\r\n const createStream = async function* () {\r\n let retryDelay: number = sseDefaultRetryDelay ?? 3000;\r\n let attempt = 0;\r\n const signal = options.signal ?? new AbortController().signal;\r\n\r\n while (true) {\r\n if (signal.aborted) break;\r\n\r\n attempt++;\r\n\r\n const headers =\r\n options.headers instanceof Headers\r\n ? options.headers\r\n : new Headers(options.headers as Record | undefined);\r\n\r\n if (lastEventId !== undefined) {\r\n headers.set('Last-Event-ID', lastEventId);\r\n }\r\n\r\n try {\r\n const requestInit: RequestInit = {\r\n redirect: 'follow',\r\n ...options,\r\n body: options.serializedBody,\r\n headers,\r\n signal,\r\n };\r\n let request = new Request(url, requestInit);\r\n if (onRequest) {\r\n request = await onRequest(url, requestInit);\r\n }\r\n // fetch must be assigned here, otherwise it would throw the error:\r\n // TypeError: Failed to execute 'fetch' on 'Window': Illegal invocation\r\n const _fetch = options.fetch ?? globalThis.fetch;\r\n const response = await _fetch(request);\r\n\r\n if (!response.ok)\r\n throw new Error(\r\n `SSE failed: ${response.status} ${response.statusText}`,\r\n );\r\n\r\n if (!response.body) throw new Error('No body in SSE response');\r\n\r\n const reader = response.body\r\n .pipeThrough(new TextDecoderStream())\r\n .getReader();\r\n\r\n let buffer = '';\r\n\r\n const abortHandler = () => {\r\n try {\r\n reader.cancel();\r\n } catch {\r\n // noop\r\n }\r\n };\r\n\r\n signal.addEventListener('abort', abortHandler);\r\n\r\n try {\r\n while (true) {\r\n const { done, value } = await reader.read();\r\n if (done) break;\r\n buffer += value;\r\n\r\n const chunks = buffer.split('\\n\\n');\r\n buffer = chunks.pop() ?? '';\r\n\r\n for (const chunk of chunks) {\r\n const lines = chunk.split('\\n');\r\n const dataLines: Array = [];\r\n let eventName: string | undefined;\r\n\r\n for (const line of lines) {\r\n if (line.startsWith('data:')) {\r\n dataLines.push(line.replace(/^data:\\s*/, ''));\r\n } else if (line.startsWith('event:')) {\r\n eventName = line.replace(/^event:\\s*/, '');\r\n } else if (line.startsWith('id:')) {\r\n lastEventId = line.replace(/^id:\\s*/, '');\r\n } else if (line.startsWith('retry:')) {\r\n const parsed = Number.parseInt(\r\n line.replace(/^retry:\\s*/, ''),\r\n 10,\r\n );\r\n if (!Number.isNaN(parsed)) {\r\n retryDelay = parsed;\r\n }\r\n }\r\n }\r\n\r\n let data: unknown;\r\n let parsedJson = false;\r\n\r\n if (dataLines.length) {\r\n const rawData = dataLines.join('\\n');\r\n try {\r\n data = JSON.parse(rawData);\r\n parsedJson = true;\r\n } catch {\r\n data = rawData;\r\n }\r\n }\r\n\r\n if (parsedJson) {\r\n if (responseValidator) {\r\n await responseValidator(data);\r\n }\r\n\r\n if (responseTransformer) {\r\n data = await responseTransformer(data);\r\n }\r\n }\r\n\r\n onSseEvent?.({\r\n data,\r\n event: eventName,\r\n id: lastEventId,\r\n retry: retryDelay,\r\n });\r\n\r\n if (dataLines.length) {\r\n yield data as any;\r\n }\r\n }\r\n }\r\n } finally {\r\n signal.removeEventListener('abort', abortHandler);\r\n reader.releaseLock();\r\n }\r\n\r\n break; // exit loop on normal completion\r\n } catch (error) {\r\n // connection failed or aborted; retry after delay\r\n onSseError?.(error);\r\n\r\n if (\r\n sseMaxRetryAttempts !== undefined &&\r\n attempt >= sseMaxRetryAttempts\r\n ) {\r\n break; // stop after firing error\r\n }\r\n\r\n // exponential backoff: double retry each attempt, cap at 30s\r\n const backoff = Math.min(\r\n retryDelay * 2 ** (attempt - 1),\r\n sseMaxRetryDelay ?? 30000,\r\n );\r\n await sleep(backoff);\r\n }\r\n }\r\n };\r\n\r\n const stream = createStream();\r\n\r\n return { stream };\r\n};\r\n","// This file is auto-generated by @hey-api/openapi-ts\r\n\r\ninterface SerializeOptions\r\n extends SerializePrimitiveOptions,\r\n SerializerOptions {}\r\n\r\ninterface SerializePrimitiveOptions {\r\n allowReserved?: boolean;\r\n name: string;\r\n}\r\n\r\nexport interface SerializerOptions {\r\n /**\r\n * @default true\r\n */\r\n explode: boolean;\r\n style: T;\r\n}\r\n\r\nexport type ArrayStyle = 'form' | 'spaceDelimited' | 'pipeDelimited';\r\nexport type ArraySeparatorStyle = ArrayStyle | MatrixStyle;\r\ntype MatrixStyle = 'label' | 'matrix' | 'simple';\r\nexport type ObjectStyle = 'form' | 'deepObject';\r\ntype ObjectSeparatorStyle = ObjectStyle | MatrixStyle;\r\n\r\ninterface SerializePrimitiveParam extends SerializePrimitiveOptions {\r\n value: string;\r\n}\r\n\r\nexport const separatorArrayExplode = (style: ArraySeparatorStyle) => {\r\n switch (style) {\r\n case 'label':\r\n return '.';\r\n case 'matrix':\r\n return ';';\r\n case 'simple':\r\n return ',';\r\n default:\r\n return '&';\r\n }\r\n};\r\n\r\nexport const separatorArrayNoExplode = (style: ArraySeparatorStyle) => {\r\n switch (style) {\r\n case 'form':\r\n return ',';\r\n case 'pipeDelimited':\r\n return '|';\r\n case 'spaceDelimited':\r\n return '%20';\r\n default:\r\n return ',';\r\n }\r\n};\r\n\r\nexport const separatorObjectExplode = (style: ObjectSeparatorStyle) => {\r\n switch (style) {\r\n case 'label':\r\n return '.';\r\n case 'matrix':\r\n return ';';\r\n case 'simple':\r\n return ',';\r\n default:\r\n return '&';\r\n }\r\n};\r\n\r\nexport const serializeArrayParam = ({\r\n allowReserved,\r\n explode,\r\n name,\r\n style,\r\n value,\r\n}: SerializeOptions & {\r\n value: unknown[];\r\n}) => {\r\n if (!explode) {\r\n const joinedValues = (\r\n allowReserved ? value : value.map((v) => encodeURIComponent(v as string))\r\n ).join(separatorArrayNoExplode(style));\r\n switch (style) {\r\n case 'label':\r\n return `.${joinedValues}`;\r\n case 'matrix':\r\n return `;${name}=${joinedValues}`;\r\n case 'simple':\r\n return joinedValues;\r\n default:\r\n return `${name}=${joinedValues}`;\r\n }\r\n }\r\n\r\n const separator = separatorArrayExplode(style);\r\n const joinedValues = value\r\n .map((v) => {\r\n if (style === 'label' || style === 'simple') {\r\n return allowReserved ? v : encodeURIComponent(v as string);\r\n }\r\n\r\n return serializePrimitiveParam({\r\n allowReserved,\r\n name,\r\n value: v as string,\r\n });\r\n })\r\n .join(separator);\r\n return style === 'label' || style === 'matrix'\r\n ? separator + joinedValues\r\n : joinedValues;\r\n};\r\n\r\nexport const serializePrimitiveParam = ({\r\n allowReserved,\r\n name,\r\n value,\r\n}: SerializePrimitiveParam) => {\r\n if (value === undefined || value === null) {\r\n return '';\r\n }\r\n\r\n if (typeof value === 'object') {\r\n throw new Error(\r\n 'Deeply-nested arrays/objects aren’t supported. Provide your own `querySerializer()` to handle these.',\r\n );\r\n }\r\n\r\n return `${name}=${allowReserved ? value : encodeURIComponent(value)}`;\r\n};\r\n\r\nexport const serializeObjectParam = ({\r\n allowReserved,\r\n explode,\r\n name,\r\n style,\r\n value,\r\n valueOnly,\r\n}: SerializeOptions & {\r\n value: Record | Date;\r\n valueOnly?: boolean;\r\n}) => {\r\n if (value instanceof Date) {\r\n return valueOnly ? value.toISOString() : `${name}=${value.toISOString()}`;\r\n }\r\n\r\n if (style !== 'deepObject' && !explode) {\r\n let values: string[] = [];\r\n Object.entries(value).forEach(([key, v]) => {\r\n values = [\r\n ...values,\r\n key,\r\n allowReserved ? (v as string) : encodeURIComponent(v as string),\r\n ];\r\n });\r\n const joinedValues = values.join(',');\r\n switch (style) {\r\n case 'form':\r\n return `${name}=${joinedValues}`;\r\n case 'label':\r\n return `.${joinedValues}`;\r\n case 'matrix':\r\n return `;${name}=${joinedValues}`;\r\n default:\r\n return joinedValues;\r\n }\r\n }\r\n\r\n const separator = separatorObjectExplode(style);\r\n const joinedValues = Object.entries(value)\r\n .map(([key, v]) =>\r\n serializePrimitiveParam({\r\n allowReserved,\r\n name: style === 'deepObject' ? `${name}[${key}]` : key,\r\n value: v as string,\r\n }),\r\n )\r\n .join(separator);\r\n return style === 'label' || style === 'matrix'\r\n ? separator + joinedValues\r\n : joinedValues;\r\n};\r\n","// This file is auto-generated by @hey-api/openapi-ts\r\n\r\nimport type { BodySerializer, QuerySerializer } from './bodySerializer.gen';\r\nimport {\r\n type ArraySeparatorStyle,\r\n serializeArrayParam,\r\n serializeObjectParam,\r\n serializePrimitiveParam,\r\n} from './pathSerializer.gen';\r\n\r\nexport interface PathSerializer {\r\n path: Record;\r\n url: string;\r\n}\r\n\r\nexport const PATH_PARAM_RE = /\\{[^{}]+\\}/g;\r\n\r\nexport const defaultPathSerializer = ({ path, url: _url }: PathSerializer) => {\r\n let url = _url;\r\n const matches = _url.match(PATH_PARAM_RE);\r\n if (matches) {\r\n for (const match of matches) {\r\n let explode = false;\r\n let name = match.substring(1, match.length - 1);\r\n let style: ArraySeparatorStyle = 'simple';\r\n\r\n if (name.endsWith('*')) {\r\n explode = true;\r\n name = name.substring(0, name.length - 1);\r\n }\r\n\r\n if (name.startsWith('.')) {\r\n name = name.substring(1);\r\n style = 'label';\r\n } else if (name.startsWith(';')) {\r\n name = name.substring(1);\r\n style = 'matrix';\r\n }\r\n\r\n const value = path[name];\r\n\r\n if (value === undefined || value === null) {\r\n continue;\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n url = url.replace(\r\n match,\r\n serializeArrayParam({ explode, name, style, value }),\r\n );\r\n continue;\r\n }\r\n\r\n if (typeof value === 'object') {\r\n url = url.replace(\r\n match,\r\n serializeObjectParam({\r\n explode,\r\n name,\r\n style,\r\n value: value as Record,\r\n valueOnly: true,\r\n }),\r\n );\r\n continue;\r\n }\r\n\r\n if (style === 'matrix') {\r\n url = url.replace(\r\n match,\r\n `;${serializePrimitiveParam({\r\n name,\r\n value: value as string,\r\n })}`,\r\n );\r\n continue;\r\n }\r\n\r\n const replaceValue = encodeURIComponent(\r\n style === 'label' ? `.${value as string}` : (value as string),\r\n );\r\n url = url.replace(match, replaceValue);\r\n }\r\n }\r\n return url;\r\n};\r\n\r\nexport const getUrl = ({\r\n baseUrl,\r\n path,\r\n query,\r\n querySerializer,\r\n url: _url,\r\n}: {\r\n baseUrl?: string;\r\n path?: Record;\r\n query?: Record;\r\n querySerializer: QuerySerializer;\r\n url: string;\r\n}) => {\r\n const pathUrl = _url.startsWith('/') ? _url : `/${_url}`;\r\n let url = (baseUrl ?? '') + pathUrl;\r\n if (path) {\r\n url = defaultPathSerializer({ path, url });\r\n }\r\n let search = query ? querySerializer(query) : '';\r\n if (search.startsWith('?')) {\r\n search = search.substring(1);\r\n }\r\n if (search) {\r\n url += `?${search}`;\r\n }\r\n return url;\r\n};\r\n\r\nexport function getValidRequestBody(options: {\r\n body?: unknown;\r\n bodySerializer?: BodySerializer | null;\r\n serializedBody?: unknown;\r\n}) {\r\n const hasBody = options.body !== undefined;\r\n const isSerializedBody = hasBody && options.bodySerializer;\r\n\r\n if (isSerializedBody) {\r\n if ('serializedBody' in options) {\r\n const hasSerializedBody =\r\n options.serializedBody !== undefined && options.serializedBody !== '';\r\n\r\n return hasSerializedBody ? options.serializedBody : null;\r\n }\r\n\r\n // not all clients implement a serializedBody property (i.e. client-axios)\r\n return options.body !== '' ? options.body : null;\r\n }\r\n\r\n // plain/text body\r\n if (hasBody) {\r\n return options.body;\r\n }\r\n\r\n // no body was provided\r\n return undefined;\r\n}\r\n","// This file is auto-generated by @hey-api/openapi-ts\r\n\r\nexport type AuthToken = string | undefined;\r\n\r\nexport interface Auth {\r\n /**\r\n * Which part of the request do we use to send the auth?\r\n *\r\n * @default 'header'\r\n */\r\n in?: 'header' | 'query' | 'cookie';\r\n /**\r\n * Header or query parameter name.\r\n *\r\n * @default 'Authorization'\r\n */\r\n name?: string;\r\n scheme?: 'basic' | 'bearer';\r\n type: 'apiKey' | 'http';\r\n}\r\n\r\nexport const getAuthToken = async (\r\n auth: Auth,\r\n callback: ((auth: Auth) => Promise | AuthToken) | AuthToken,\r\n): Promise => {\r\n const token =\r\n typeof callback === 'function' ? await callback(auth) : callback;\r\n\r\n if (!token) {\r\n return;\r\n }\r\n\r\n if (auth.scheme === 'bearer') {\r\n return `Bearer ${token}`;\r\n }\r\n\r\n if (auth.scheme === 'basic') {\r\n return `Basic ${btoa(token)}`;\r\n }\r\n\r\n return token;\r\n};\r\n","// This file is auto-generated by @hey-api/openapi-ts\r\n\r\nimport { getAuthToken } from '../core/auth.gen';\r\nimport type { QuerySerializerOptions } from '../core/bodySerializer.gen';\r\nimport { jsonBodySerializer } from '../core/bodySerializer.gen';\r\nimport {\r\n serializeArrayParam,\r\n serializeObjectParam,\r\n serializePrimitiveParam,\r\n} from '../core/pathSerializer.gen';\r\nimport { getUrl } from '../core/utils.gen';\r\nimport type { Client, ClientOptions, Config, RequestOptions } from './types.gen';\r\n\r\nexport const createQuerySerializer = ({\r\n allowReserved,\r\n array,\r\n object,\r\n}: QuerySerializerOptions = {}) => {\r\n const querySerializer = (queryParams: T) => {\r\n const search: string[] = [];\r\n if (queryParams && typeof queryParams === 'object') {\r\n for (const name in queryParams) {\r\n const value = queryParams[name];\r\n\r\n if (value === undefined || value === null) {\r\n continue;\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n const serializedArray = serializeArrayParam({\r\n allowReserved,\r\n explode: true,\r\n name,\r\n style: 'form',\r\n value,\r\n ...array,\r\n });\r\n if (serializedArray) search.push(serializedArray);\r\n } else if (typeof value === 'object') {\r\n const serializedObject = serializeObjectParam({\r\n allowReserved,\r\n explode: true,\r\n name,\r\n style: 'deepObject',\r\n value: value as Record,\r\n ...object,\r\n });\r\n if (serializedObject) search.push(serializedObject);\r\n } else {\r\n const serializedPrimitive = serializePrimitiveParam({\r\n allowReserved,\r\n name,\r\n value: value as string,\r\n });\r\n if (serializedPrimitive) search.push(serializedPrimitive);\r\n }\r\n }\r\n }\r\n return search.join('&');\r\n };\r\n return querySerializer;\r\n};\r\n\r\n/**\r\n * Infers parseAs value from provided Content-Type header.\r\n */\r\nexport const getParseAs = (\r\n contentType: string | null,\r\n): Exclude => {\r\n if (!contentType) {\r\n // If no Content-Type header is provided, the best we can do is return the raw response body,\r\n // which is effectively the same as the 'stream' option.\r\n return 'stream';\r\n }\r\n\r\n const cleanContent = contentType.split(';')[0]?.trim();\r\n\r\n if (!cleanContent) {\r\n return;\r\n }\r\n\r\n if (\r\n cleanContent.startsWith('application/json') ||\r\n cleanContent.endsWith('+json')\r\n ) {\r\n return 'json';\r\n }\r\n\r\n if (cleanContent === 'multipart/form-data') {\r\n return 'formData';\r\n }\r\n\r\n if (\r\n ['application/', 'audio/', 'image/', 'video/'].some((type) =>\r\n cleanContent.startsWith(type),\r\n )\r\n ) {\r\n return 'blob';\r\n }\r\n\r\n if (cleanContent.startsWith('text/')) {\r\n return 'text';\r\n }\r\n\r\n return;\r\n};\r\n\r\nconst checkForExistence = (\r\n options: Pick & {\r\n headers: Headers;\r\n },\r\n name?: string,\r\n): boolean => {\r\n if (!name) {\r\n return false;\r\n }\r\n if (\r\n options.headers.has(name) ||\r\n options.query?.[name] ||\r\n options.headers.get('Cookie')?.includes(`${name}=`)\r\n ) {\r\n return true;\r\n }\r\n return false;\r\n};\r\n\r\nexport const setAuthParams = async ({\r\n security,\r\n ...options\r\n}: Pick, 'security'> &\r\n Pick & {\r\n headers: Headers;\r\n }) => {\r\n for (const auth of security) {\r\n if (checkForExistence(options, auth.name)) {\r\n continue;\r\n }\r\n\r\n const token = await getAuthToken(auth, options.auth);\r\n\r\n if (!token) {\r\n continue;\r\n }\r\n\r\n const name = auth.name ?? 'Authorization';\r\n\r\n switch (auth.in) {\r\n case 'query':\r\n if (!options.query) {\r\n options.query = {};\r\n }\r\n options.query[name] = token;\r\n break;\r\n case 'cookie':\r\n options.headers.append('Cookie', `${name}=${token}`);\r\n break;\r\n case 'header':\r\n default:\r\n options.headers.set(name, token);\r\n break;\r\n }\r\n }\r\n};\r\n\r\nexport const buildUrl: Client['buildUrl'] = (options) =>\r\n getUrl({\r\n baseUrl: options.baseUrl as string,\r\n path: options.path,\r\n query: options.query,\r\n querySerializer:\r\n typeof options.querySerializer === 'function'\r\n ? options.querySerializer\r\n : createQuerySerializer(options.querySerializer),\r\n url: options.url,\r\n });\r\n\r\nexport const mergeConfigs = (a: Config, b: Config): Config => {\r\n const config = { ...a, ...b };\r\n if (config.baseUrl?.endsWith('/')) {\r\n config.baseUrl = config.baseUrl.substring(0, config.baseUrl.length - 1);\r\n }\r\n config.headers = mergeHeaders(a.headers, b.headers);\r\n return config;\r\n};\r\n\r\nconst headersEntries = (headers: Headers): Array<[string, string]> => {\r\n const entries: Array<[string, string]> = [];\r\n headers.forEach((value, key) => {\r\n entries.push([key, value]);\r\n });\r\n return entries;\r\n};\r\n\r\nexport const mergeHeaders = (\r\n ...headers: Array['headers'] | undefined>\r\n): Headers => {\r\n const mergedHeaders = new Headers();\r\n for (const header of headers) {\r\n if (!header) {\r\n continue;\r\n }\r\n\r\n const iterator =\r\n header instanceof Headers\r\n ? headersEntries(header)\r\n : Object.entries(header);\r\n\r\n for (const [key, value] of iterator) {\r\n if (value === null) {\r\n mergedHeaders.delete(key);\r\n } else if (Array.isArray(value)) {\r\n for (const v of value) {\r\n mergedHeaders.append(key, v as string);\r\n }\r\n } else if (value !== undefined) {\r\n // assume object headers are meant to be JSON stringified, i.e. their\r\n // content value in OpenAPI specification is 'application/json'\r\n mergedHeaders.set(\r\n key,\r\n typeof value === 'object' ? JSON.stringify(value) : (value as string),\r\n );\r\n }\r\n }\r\n }\r\n return mergedHeaders;\r\n};\r\n\r\ntype ErrInterceptor = (\r\n error: Err,\r\n response: Res,\r\n request: Req,\r\n options: Options,\r\n) => Err | Promise;\r\n\r\ntype ReqInterceptor = (\r\n request: Req,\r\n options: Options,\r\n) => Req | Promise;\r\n\r\ntype ResInterceptor = (\r\n response: Res,\r\n request: Req,\r\n options: Options,\r\n) => Res | Promise;\r\n\r\nclass Interceptors {\r\n fns: Array = [];\r\n\r\n clear(): void {\r\n this.fns = [];\r\n }\r\n\r\n eject(id: number | Interceptor): void {\r\n const index = this.getInterceptorIndex(id);\r\n if (this.fns[index]) {\r\n this.fns[index] = null;\r\n }\r\n }\r\n\r\n exists(id: number | Interceptor): boolean {\r\n const index = this.getInterceptorIndex(id);\r\n return Boolean(this.fns[index]);\r\n }\r\n\r\n getInterceptorIndex(id: number | Interceptor): number {\r\n if (typeof id === 'number') {\r\n return this.fns[id] ? id : -1;\r\n }\r\n return this.fns.indexOf(id);\r\n }\r\n\r\n update(\r\n id: number | Interceptor,\r\n fn: Interceptor,\r\n ): number | Interceptor | false {\r\n const index = this.getInterceptorIndex(id);\r\n if (this.fns[index]) {\r\n this.fns[index] = fn;\r\n return id;\r\n }\r\n return false;\r\n }\r\n\r\n use(fn: Interceptor): number {\r\n this.fns.push(fn);\r\n return this.fns.length - 1;\r\n }\r\n}\r\n\r\nexport interface Middleware {\r\n error: Interceptors>;\r\n request: Interceptors>;\r\n response: Interceptors>;\r\n}\r\n\r\nexport const createInterceptors = (): Middleware<\r\n Req,\r\n Res,\r\n Err,\r\n Options\r\n> => ({\r\n error: new Interceptors>(),\r\n request: new Interceptors>(),\r\n response: new Interceptors>(),\r\n});\r\n\r\nconst defaultQuerySerializer = createQuerySerializer({\r\n allowReserved: false,\r\n array: {\r\n explode: true,\r\n style: 'form',\r\n },\r\n object: {\r\n explode: true,\r\n style: 'deepObject',\r\n },\r\n});\r\n\r\nconst defaultHeaders = {\r\n 'Content-Type': 'application/json',\r\n};\r\n\r\nexport const createConfig = (\r\n override: Config & T> = {},\r\n): Config & T> => ({\r\n ...jsonBodySerializer,\r\n headers: defaultHeaders,\r\n parseAs: 'auto',\r\n querySerializer: defaultQuerySerializer,\r\n ...override,\r\n});\r\n","// This file is auto-generated by @hey-api/openapi-ts\r\n\r\nimport { createSseClient } from '../core/serverSentEvents.gen';\r\nimport type { HttpMethod } from '../core/types.gen';\r\nimport { getValidRequestBody } from '../core/utils.gen';\r\nimport type {\r\n Client,\r\n Config,\r\n RequestOptions,\r\n ResolvedRequestOptions,\r\n} from './types.gen';\r\nimport {\r\n buildUrl,\r\n createConfig,\r\n createInterceptors,\r\n getParseAs,\r\n mergeConfigs,\r\n mergeHeaders,\r\n setAuthParams,\r\n} from './utils.gen';\r\n\r\ntype ReqInit = Omit & {\r\n body?: any;\r\n headers: ReturnType;\r\n};\r\n\r\nexport const createClient = (config: Config = {}): Client => {\r\n let _config = mergeConfigs(createConfig(), config);\r\n\r\n const getConfig = (): Config => ({ ..._config });\r\n\r\n const setConfig = (config: Config): Config => {\r\n _config = mergeConfigs(_config, config);\r\n return getConfig();\r\n };\r\n\r\n const interceptors = createInterceptors<\r\n Request,\r\n Response,\r\n unknown,\r\n ResolvedRequestOptions\r\n >();\r\n\r\n const beforeRequest = async (options: RequestOptions) => {\r\n const opts = {\r\n ..._config,\r\n ...options,\r\n fetch: options.fetch ?? _config.fetch ?? globalThis.fetch,\r\n headers: mergeHeaders(_config.headers, options.headers),\r\n serializedBody: undefined,\r\n };\r\n\r\n if (opts.security) {\r\n await setAuthParams({\r\n ...opts,\r\n security: opts.security,\r\n });\r\n }\r\n\r\n if (opts.requestValidator) {\r\n await opts.requestValidator(opts);\r\n }\r\n\r\n if (opts.body !== undefined && opts.bodySerializer) {\r\n opts.serializedBody = opts.bodySerializer(opts.body);\r\n }\r\n\r\n // remove Content-Type header if body is empty to avoid sending invalid requests\r\n if (opts.body === undefined || opts.serializedBody === '') {\r\n opts.headers.delete('Content-Type');\r\n }\r\n\r\n const url = buildUrl(opts);\r\n\r\n return { opts, url };\r\n };\r\n\r\n const request: Client['request'] = async (options) => {\r\n // @ts-expect-error\r\n const { opts, url } = await beforeRequest(options);\r\n const requestInit: ReqInit = {\r\n redirect: 'follow',\r\n ...opts,\r\n body: getValidRequestBody(opts),\r\n };\r\n\r\n let request = new Request(url, requestInit);\r\n\r\n for (const fn of interceptors.request.fns) {\r\n if (fn) {\r\n request = await fn(request, opts);\r\n }\r\n }\r\n\r\n // fetch must be assigned here, otherwise it would throw the error:\r\n // TypeError: Failed to execute 'fetch' on 'Window': Illegal invocation\r\n const _fetch = opts.fetch!;\r\n let response = await _fetch(request);\r\n\r\n for (const fn of interceptors.response.fns) {\r\n if (fn) {\r\n response = await fn(response, request, opts);\r\n }\r\n }\r\n\r\n const result = {\r\n request,\r\n response,\r\n };\r\n\r\n if (response.ok) {\r\n const parseAs =\r\n (opts.parseAs === 'auto'\r\n ? getParseAs(response.headers.get('Content-Type'))\r\n : opts.parseAs) ?? 'json';\r\n\r\n if (\r\n response.status === 204 ||\r\n response.headers.get('Content-Length') === '0'\r\n ) {\r\n let emptyData: any;\r\n switch (parseAs) {\r\n case 'arrayBuffer':\r\n case 'blob':\r\n case 'text':\r\n emptyData = await response[parseAs]();\r\n break;\r\n case 'formData':\r\n emptyData = new FormData();\r\n break;\r\n case 'stream':\r\n emptyData = response.body;\r\n break;\r\n case 'json':\r\n default:\r\n emptyData = {};\r\n break;\r\n }\r\n return opts.responseStyle === 'data'\r\n ? emptyData\r\n : {\r\n data: emptyData,\r\n ...result,\r\n };\r\n }\r\n\r\n let data: any;\r\n switch (parseAs) {\r\n case 'arrayBuffer':\r\n case 'blob':\r\n case 'formData':\r\n case 'json':\r\n case 'text':\r\n data = await response[parseAs]();\r\n break;\r\n case 'stream':\r\n return opts.responseStyle === 'data'\r\n ? response.body\r\n : {\r\n data: response.body,\r\n ...result,\r\n };\r\n }\r\n\r\n if (parseAs === 'json') {\r\n if (opts.responseValidator) {\r\n await opts.responseValidator(data);\r\n }\r\n\r\n if (opts.responseTransformer) {\r\n data = await opts.responseTransformer(data);\r\n }\r\n }\r\n\r\n return opts.responseStyle === 'data'\r\n ? data\r\n : {\r\n data,\r\n ...result,\r\n };\r\n }\r\n\r\n const textError = await response.text();\r\n let jsonError: unknown;\r\n\r\n try {\r\n jsonError = JSON.parse(textError);\r\n } catch {\r\n // noop\r\n }\r\n\r\n const error = jsonError ?? textError;\r\n let finalError = error;\r\n\r\n for (const fn of interceptors.error.fns) {\r\n if (fn) {\r\n finalError = (await fn(error, response, request, opts)) as string;\r\n }\r\n }\r\n\r\n finalError = finalError || ({} as string);\r\n\r\n if (opts.throwOnError) {\r\n throw finalError;\r\n }\r\n\r\n // TODO: we probably want to return error and improve types\r\n return opts.responseStyle === 'data'\r\n ? undefined\r\n : {\r\n error: finalError,\r\n ...result,\r\n };\r\n };\r\n\r\n const makeMethodFn =\r\n (method: Uppercase) => (options: RequestOptions) =>\r\n request({ ...options, method });\r\n\r\n const makeSseFn =\r\n (method: Uppercase) => async (options: RequestOptions) => {\r\n const { opts, url } = await beforeRequest(options);\r\n return createSseClient({\r\n ...opts,\r\n body: opts.body as BodyInit | null | undefined,\r\n headers: opts.headers as unknown as Record,\r\n method,\r\n onRequest: async (url, init) => {\r\n let request = new Request(url, init);\r\n for (const fn of interceptors.request.fns) {\r\n if (fn) {\r\n request = await fn(request, opts);\r\n }\r\n }\r\n return request;\r\n },\r\n url,\r\n });\r\n };\r\n\r\n return {\r\n buildUrl,\r\n connect: makeMethodFn('CONNECT'),\r\n delete: makeMethodFn('DELETE'),\r\n get: makeMethodFn('GET'),\r\n getConfig,\r\n head: makeMethodFn('HEAD'),\r\n interceptors,\r\n options: makeMethodFn('OPTIONS'),\r\n patch: makeMethodFn('PATCH'),\r\n post: makeMethodFn('POST'),\r\n put: makeMethodFn('PUT'),\r\n request,\r\n setConfig,\r\n sse: {\r\n connect: makeSseFn('CONNECT'),\r\n delete: makeSseFn('DELETE'),\r\n get: makeSseFn('GET'),\r\n head: makeSseFn('HEAD'),\r\n options: makeSseFn('OPTIONS'),\r\n patch: makeSseFn('PATCH'),\r\n post: makeSseFn('POST'),\r\n put: makeSseFn('PUT'),\r\n trace: makeSseFn('TRACE'),\r\n },\r\n trace: makeMethodFn('TRACE'),\r\n } as Client;\r\n};\r\n","// This file is auto-generated by @hey-api/openapi-ts\r\n\r\nimport { type ClientOptions, type Config, createClient, createConfig } from './client';\r\nimport type { ClientOptions as ClientOptions2 } from './types.gen';\r\n\r\n/**\r\n * The `createClientConfig()` function will be called on client initialization\r\n * and the returned object will become the client's initial configuration.\r\n *\r\n * You may want to initialize your client this way instead of calling\r\n * `setConfig()`. This is useful for example if you're using Next.js\r\n * to ensure your client always has the correct values.\r\n */\r\nexport type CreateClientConfig = (override?: Config) => Config & T>;\r\n\r\nexport const client = createClient(createConfig({\r\n baseUrl: 'http://localhost:26293',\r\n throwOnError: true\r\n}));\r\n","// This file is auto-generated by @hey-api/openapi-ts\r\n\r\nimport type { Client, Options as Options2, TDataShape } from './client';\r\nimport { client } from './client.gen';\r\nimport type { GetGridStylesheetData, GetGridStylesheetResponses, GetGridStylesheetsData, GetGridStylesheetsResponses, GetListStylesheetData, GetListStylesheetResponses, GetListStylesheetsData, GetListStylesheetsResponses, GetRteStylesheetData, GetRteStylesheetResponses, GetRteStylesheetsData, GetRteStylesheetsResponses, GetSettingsData, GetSettingsResponses, GetSingleBlockStylesheetsData, GetSingleBlockStylesheetsResponses, PreviewGridBlockData, PreviewGridBlockResponses, PreviewListBlockData, PreviewListBlockResponses, PreviewRichTextMarkupData, PreviewRichTextMarkupResponses, PreviewSingleBlockData, PreviewSingleBlockResponses } from './types.gen';\r\n\r\nexport type Options = Options2 & {\r\n /**\r\n * You can provide a client instance returned by `createClient()` instead of\r\n * individual options. This might be also useful if you want to implement a\r\n * custom client.\r\n */\r\n client?: Client;\r\n /**\r\n * You can pass arbitrary values through the `meta` object. This can be\r\n * used to access values that aren't defined as part of the SDK function.\r\n */\r\n meta?: Record;\r\n};\r\n\r\nexport class BlockPreviewService {\r\n public static previewGridBlock(options?: Options) {\r\n return (options?.client ?? client).post({\r\n url: '/umbraco/block-preview/api/v1/preview/grid',\r\n ...options,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n ...options?.headers\r\n }\r\n });\r\n }\r\n \r\n /**\r\n * @deprecated\r\n */\r\n public static getGridStylesheet(options?: Options) {\r\n return (options?.client ?? client).get({\r\n url: '/umbraco/block-preview/api/v1/preview/grid/stylesheet',\r\n ...options\r\n });\r\n }\r\n \r\n public static getGridStylesheets(options?: Options) {\r\n return (options?.client ?? client).get({\r\n url: '/umbraco/block-preview/api/v1/preview/grid/stylesheets',\r\n ...options\r\n });\r\n }\r\n \r\n public static previewListBlock(options?: Options) {\r\n return (options?.client ?? client).post({\r\n url: '/umbraco/block-preview/api/v1/preview/list',\r\n ...options,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n ...options?.headers\r\n }\r\n });\r\n }\r\n \r\n /**\r\n * @deprecated\r\n */\r\n public static getListStylesheet(options?: Options) {\r\n return (options?.client ?? client).get({\r\n url: '/umbraco/block-preview/api/v1/preview/list/stylesheet',\r\n ...options\r\n });\r\n }\r\n \r\n public static getListStylesheets(options?: Options) {\r\n return (options?.client ?? client).get({\r\n url: '/umbraco/block-preview/api/v1/preview/list/stylesheets',\r\n ...options\r\n });\r\n }\r\n \r\n public static previewRichTextMarkup(options?: Options) {\r\n return (options?.client ?? client).post({\r\n url: '/umbraco/block-preview/api/v1/preview/rte',\r\n ...options,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n ...options?.headers\r\n }\r\n });\r\n }\r\n \r\n /**\r\n * @deprecated\r\n */\r\n public static getRteStylesheet(options?: Options) {\r\n return (options?.client ?? client).get({\r\n url: '/umbraco/block-preview/api/v1/preview/rte/stylesheet',\r\n ...options\r\n });\r\n }\r\n \r\n public static getRteStylesheets(options?: Options) {\r\n return (options?.client ?? client).get({\r\n url: '/umbraco/block-preview/api/v1/preview/rte/stylesheets',\r\n ...options\r\n });\r\n }\r\n \r\n public static previewSingleBlock(options?: Options) {\r\n return (options?.client ?? client).post({\r\n url: '/umbraco/block-preview/api/v1/preview/single',\r\n ...options,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n ...options?.headers\r\n }\r\n });\r\n }\r\n \r\n public static getSingleBlockStylesheets(options?: Options) {\r\n return (options?.client ?? client).get({\r\n url: '/umbraco/block-preview/api/v1/preview/single/stylesheets',\r\n ...options\r\n });\r\n }\r\n \r\n public static getSettings(options?: Options) {\r\n return (options?.client ?? client).get({\r\n url: '/umbraco/block-preview/api/v1/settings',\r\n ...options\r\n });\r\n }\r\n}\r\n","import { UmbContextToken } from \"@umbraco-cms/backoffice/context-api\";\r\nimport BlockPreviewContext from \"./block-preview.context\";\r\n\r\nexport const BLOCK_PREVIEW_CONTEXT = new UmbContextToken('BlockPreviewContext');\r\n","import BlockPreviewContext from '../context/block-preview.context';\r\nimport { BLOCK_PREVIEW_CONTEXT } from '../context/block-preview.context-token';\r\nimport { BlockContext } from './types';\r\nimport { css, html, ifDefined, nothing, property, PropertyValueMap, state, unsafeHTML } from '@umbraco-cms/backoffice/external/lit';\r\nimport { UMB_BLOCK_WORKSPACE_CONTEXT, UmbBlockDataType } from '@umbraco-cms/backoffice/block';\r\nimport type { UmbBlockEditorCustomViewConfiguration, UmbBlockEditorCustomViewElement } from '@umbraco-cms/backoffice/block-custom-view';\r\nimport { UmbLitElement } from '@umbraco-cms/backoffice/lit-element';\r\nimport { UMB_PROPERTY_DATASET_CONTEXT } from '@umbraco-cms/backoffice/property';\r\nimport { UmbApiError } from '@umbraco-cms/backoffice/resources';\r\nimport { UUIButtonElement } from '@umbraco-cms/backoffice/external/uui';\r\n\r\n/**\r\n * Abstract base class for block preview custom view elements.\r\n * Extracts shared behavior (lifecycle, rendering, click handling, validation,\r\n * context observation helpers, and CSS) so that block-type-specific subclasses\r\n * only implement the parts that differ.\r\n */\r\nexport abstract class BlockPreviewBaseElement\r\n extends UmbLitElement\r\n implements UmbBlockEditorCustomViewElement {\r\n\r\n protected _blockPreviewContext?: BlockPreviewContext;\r\n protected _workspaceContextResolved: boolean = false;\r\n\r\n @property({ attribute: false, hasChanged: (val: any, old: any) => JSON.stringify(val) !== JSON.stringify(old) })\r\n content?: UmbBlockDataType;\r\n\r\n @property({ attribute: false, hasChanged: (val: any, old: any) => JSON.stringify(val) !== JSON.stringify(old) })\r\n settings?: UmbBlockDataType;\r\n\r\n @property({ attribute: false })\r\n contentKey?: string;\r\n\r\n @property({ attribute: false })\r\n config?: UmbBlockEditorCustomViewConfiguration;\r\n\r\n @property({ attribute: false })\r\n unpublished?: boolean;\r\n\r\n @property({ attribute: false })\r\n icon?: string;\r\n\r\n @property({ attribute: false })\r\n label?: string;\r\n\r\n @state()\r\n protected _htmlMarkup: string = '';\r\n\r\n @state()\r\n protected _isLoading: boolean = false;\r\n\r\n @state()\r\n protected _error: string | null = null;\r\n\r\n protected _stylesheetsAdopted: boolean = false;\r\n\r\n protected _requestId: number = 0;\r\n\r\n protected _isConnected: boolean = false;\r\n\r\n /** Tracks pointerdown position on the tag to distinguish clicks from drags. */\r\n private _pointerStartPos: { x: number; y: number } | null = null;\r\n\r\n /** Subclass provides a concrete block context object with block-type-specific fields. */\r\n protected abstract _blockContext: TContext;\r\n\r\n /** Set up all context observers (sort mode, property dataset, workspace). */\r\n protected abstract setupContextObservers(): Promise | void;\r\n\r\n /** Observe the block entry context for content/settings keys and element type info. */\r\n protected abstract observeBlockValue(): void;\r\n\r\n /** Call the appropriate BlockPreviewService API method and return the result. */\r\n protected abstract callPreviewApi(): Promise<{ data?: string | null; error?: unknown }>;\r\n\r\n /** Fetch stylesheet paths from the appropriate BlockPreviewService endpoint. */\r\n protected abstract fetchStylesheets(): Promise;\r\n\r\n constructor() {\r\n super();\r\n this.consumeContext(BLOCK_PREVIEW_CONTEXT, async (context) => {\r\n this._blockPreviewContext = context;\r\n await this.setupContextObservers();\r\n });\r\n }\r\n\r\n override connectedCallback() {\r\n super.connectedCallback();\r\n this._isConnected = true;\r\n }\r\n\r\n override disconnectedCallback() {\r\n super.disconnectedCallback();\r\n this._isConnected = false;\r\n }\r\n\r\n protected override updated(_changedProperties: PropertyValueMap | Map) {\r\n super.updated(_changedProperties);\r\n if (_changedProperties.has('content') || _changedProperties.has('settings')) {\r\n this.renderBlockPreview();\r\n }\r\n }\r\n\r\n // region Shared context observers\r\n\r\n protected observePropertyDataset() {\r\n this.consumeContext(UMB_PROPERTY_DATASET_CONTEXT, (instance) => {\r\n if (instance) {\r\n this._blockContext.culture = instance.getVariantId().culture ?? '';\r\n }\r\n });\r\n }\r\n\r\n // endregion\r\n\r\n // region Workspace helpers\r\n\r\n /**\r\n * Shared handler called once the workspace context provides a unique + documentTypeUnique.\r\n * Sets up block context, triggers block value observation, and loads stylesheets.\r\n */\r\n protected async handleWorkspaceData(unique: string | undefined, documentTypeUnique: string | undefined) {\r\n if (!this._isConnected || !documentTypeUnique) {\r\n return;\r\n }\r\n\r\n this._blockContext.unique = unique?.toString() ?? '';\r\n this._blockPreviewContext?.setUnique(this._blockContext.unique);\r\n\r\n this._blockContext.documentTypeUnique = documentTypeUnique;\r\n this._blockPreviewContext?.setDocumentTypeUnique(this._blockContext.documentTypeUnique);\r\n this._workspaceContextResolved = true;\r\n\r\n this.observeBlockValue();\r\n await this.fetchAndLoadStylesheets();\r\n }\r\n\r\n /**\r\n * Fallback workspace observation via UMB_BLOCK_WORKSPACE_CONTEXT.\r\n * Used when the primary workspace context is unavailable (e.g. nested block editing).\r\n */\r\n protected observeBlockWorkspaceFallback() {\r\n if (this._workspaceContextResolved || !this._blockPreviewContext || this._blockContext.unique !== '') {\r\n return;\r\n }\r\n\r\n this.consumeContext(UMB_BLOCK_WORKSPACE_CONTEXT, async (context) => {\r\n if (context) {\r\n this.observe(context.content.structure.contentTypeUniques, async (contentTypeUniques) => {\r\n const documentTypeUnique = contentTypeUniques[0];\r\n if (!this._isConnected || !documentTypeUnique) {\r\n return;\r\n }\r\n\r\n // Try to get unique from context, then fallback to extraction\r\n this._blockContext.unique = this._blockPreviewContext?.getUnique() ?? '';\r\n if (!this._blockContext.unique && this._blockContext.workspaceEditContentPath) {\r\n this._blockContext.unique = this.extractUniqueFromWorkspacePath(this._blockContext.workspaceEditContentPath);\r\n }\r\n\r\n this._blockContext.documentTypeUnique = documentTypeUnique;\r\n this.observeBlockValue();\r\n await this.fetchAndLoadStylesheets();\r\n });\r\n }\r\n });\r\n }\r\n\r\n protected async fetchAndLoadStylesheets() {\r\n if (this._stylesheetsAdopted || !this._blockPreviewContext) return;\r\n const data = await this.fetchStylesheets();\r\n if (data && data.length > 0) {\r\n const sheets = await Promise.all(\r\n data.map(href => this._blockPreviewContext!.getOrCreateStylesheet(href))\r\n );\r\n const shadowRoot = this.renderRoot as ShadowRoot;\r\n shadowRoot.adoptedStyleSheets = [...shadowRoot.adoptedStyleSheets, ...sheets];\r\n this._stylesheetsAdopted = true;\r\n }\r\n }\r\n\r\n // endregion\r\n\r\n // region Preview rendering\r\n\r\n protected resolveUniqueFromContext() {\r\n if (this._blockPreviewContext != null && this._blockContext.unique === '') {\r\n this._blockContext.unique = this._blockPreviewContext.getUnique();\r\n if (!this._blockContext.unique && this._blockContext.workspaceEditContentPath) {\r\n this._blockContext.unique = this.extractUniqueFromWorkspacePath(this._blockContext.workspaceEditContentPath);\r\n }\r\n }\r\n if (this._blockPreviewContext != null && this._blockContext.documentTypeUnique === '') {\r\n this._blockContext.documentTypeUnique = this._blockPreviewContext.getDocumentTypeUnique();\r\n }\r\n }\r\n\r\n protected async renderBlockPreview() {\r\n if (!this._isConnected) {\r\n return;\r\n }\r\n\r\n this.resolveUniqueFromContext();\r\n\r\n if (!this.validatePreviewData()) {\r\n return;\r\n }\r\n\r\n this._isLoading = true;\r\n this._error = null;\r\n\r\n const requestId = ++this._requestId;\r\n\r\n try {\r\n const { data, error } = await this._blockPreviewContext!.requestQueue.enqueue(() =>\r\n this.callPreviewApi()\r\n );\r\n\r\n if (this._requestId !== requestId) return;\r\n\r\n if (data != null) {\r\n this._htmlMarkup = data;\r\n this._isLoading = false;\r\n }\r\n else if (error) {\r\n this._error = UmbApiError.isUmbApiError(error) ? error.message : this.localize.term('blockPreview_renderError');\r\n this._isLoading = false;\r\n }\r\n else {\r\n this._isLoading = false;\r\n }\r\n } catch (error) {\r\n if (this._requestId !== requestId) return;\r\n this._error = this.localize.term('blockPreview_renderFailed');\r\n this._isLoading = false;\r\n console.error('Block preview error:', error);\r\n }\r\n }\r\n\r\n /**\r\n * Validates that sufficient data is available for a preview request.\r\n * Subclasses may override to add additional checks (e.g. contentUdi).\r\n */\r\n protected validatePreviewData(): boolean {\r\n const context = this._blockContext;\r\n return !!(\r\n context.unique !== '' &&\r\n context.blockEditorAlias !== '' &&\r\n context.contentElementTypeAlias !== ''\r\n );\r\n }\r\n\r\n // endregion\r\n\r\n // region Utilities\r\n\r\n protected extractUniqueFromWorkspacePath(path: string): string {\r\n // Extract the document unique from the workspace edit path\r\n // Pattern: /workspace/document/edit/{unique}/\r\n const match = path.match(/\\/workspace\\/document\\/edit\\/([a-f0-9-]{36})/i);\r\n return match ? match[1] : '';\r\n }\r\n\r\n protected _handlePointerDown(event: PointerEvent) {\r\n this._pointerStartPos = { x: event.clientX, y: event.clientY };\r\n }\r\n\r\n protected _handleClick(event: PointerEvent) {\r\n // Detect drag/resize interactions: if the pointer moved significantly between\r\n // pointerdown and click, suppress the navigation. This prevents the edit modal\r\n // from opening when the user finishes resizing a grid block.\r\n const pointerType = 'pointerType' in event ? (event as PointerEvent).pointerType : '';\r\n if (pointerType !== '') {\r\n if (!this._pointerStartPos) {\r\n // Pointer click with no corresponding pointerdown on this element —\r\n // likely a resize/drag that ended over our tag.\r\n event.preventDefault();\r\n event.stopPropagation();\r\n return;\r\n }\r\n const dx = Math.abs(event.clientX - this._pointerStartPos.x);\r\n const dy = Math.abs(event.clientY - this._pointerStartPos.y);\r\n this._pointerStartPos = null;\r\n if (dx > 5 || dy > 5) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n return;\r\n }\r\n }\r\n this._pointerStartPos = null;\r\n\r\n const path = event.composedPath();\r\n\r\n // Check for clicks on action bars or resize handlers.\r\n const interactiveElements = ['UUI-ACTION-BAR', 'UMB-BLOCK-SCALE-HANDLER'];\r\n if (path.some(x => x instanceof Element && interactiveElements.includes(x.tagName))) {\r\n // Allow edit button clicks through — the tag handles navigation.\r\n const editButton = path.find(x => x instanceof UUIButtonElement && x.href?.includes('block/edit'));\r\n if (editButton) {\r\n return;\r\n }\r\n\r\n // Block all other action bar clicks (delete, copy, etc.) to prevent\r\n // the parent block's from navigating when interacting with\r\n // child blocks inside areas.\r\n event.preventDefault();\r\n event.stopPropagation();\r\n return;\r\n }\r\n\r\n // Handle custom links within the preview\r\n const containsLink = path.filter(x => x instanceof Element && x.tagName === 'A' && x.hasAttribute('data-block-preview-link')) as Element[];\r\n if (containsLink.length > 0) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n const blockPreviewEdit = path.find(x => x instanceof Element && x.tagName === 'A' && x.classList.contains('block-preview-edit'));\r\n if (blockPreviewEdit instanceof Element) {\r\n window.history.pushState({}, '', blockPreviewEdit.getAttribute('href'));\r\n } else {\r\n window.history.pushState({}, '', this._blockContext.workspaceEditContentPath);\r\n }\r\n return;\r\n }\r\n\r\n // All other clicks fall through to the element's default behavior,\r\n // which navigates to this block's edit workspace.\r\n }\r\n\r\n // endregion\r\n\r\n // region Rendering\r\n\r\n override render() {\r\n return html`\r\n ${this._isLoading\r\n ? html`
Loading preview...
`\r\n : this._error\r\n ? html`
${this._error}
`\r\n : this._htmlMarkup\r\n ? html`${unsafeHTML(this._htmlMarkup)}
`\r\n : nothing}\r\n `;\r\n }\r\n\r\n // endregion\r\n\r\n static styles = [\r\n css`\r\n a.block-preview-edit {\r\n display: block;\r\n color: inherit;\r\n text-decoration: inherit;\r\n border: 1px solid transparent;\r\n border-radius: 2px;\r\n }\r\n\r\n a.block-preview-edit:hover {\r\n border-color: var(--uui-color-interactive-emphasis, #3544b1);\r\n }\r\n\r\n .preview-alert {\r\n background-color: var(--uui-color-danger, #f0ac00);\r\n border: 1px solid transparent;\r\n border-radius: 0;\r\n margin-bottom: 20px;\r\n padding: 8px 35px 8px 14px;\r\n position: relative;\r\n\r\n &, a, h4 {\r\n color: #fff;\r\n }\r\n\r\n pre {\r\n white-space: normal;\r\n }\r\n\r\n uui-loader {\r\n color: #fff;\r\n margin-right: 16px;\r\n }\r\n }\r\n\r\n .preview-alert-warning {\r\n background-color: var(--uui-color-warning, #f0ac00);\r\n border-color: transparent;\r\n color: #000;\r\n }\r\n\r\n .preview-alert-info {\r\n background-color: var(--uui-color-default, #3544b1);\r\n border-color: transparent;\r\n color: #fff;\r\n }\r\n\r\n .preview-alert-danger, .preview-alert-error {\r\n background-color: var(--uui-color-danger, #f0ac00);\r\n border-color: transparent;\r\n color: #fff;\r\n }\r\n `\r\n ]\r\n}\r\n","import { UmbDataSourceResponse } from \"@umbraco-cms/backoffice/repository\";\r\nimport { BlockPreviewService } from \"../api\";\r\nimport { UmbControllerHost } from \"@umbraco-cms/backoffice/controller-api\";\r\nimport { tryExecute } from \"@umbraco-cms/backoffice/resources\";\r\n\r\n// Query type definitions\r\nexport interface BlockPreviewQuery {\r\n blockEditorAlias: string;\r\n nodeKey: string;\r\n contentElementAlias: string;\r\n documentTypeUnique: string;\r\n contentUdi: string;\r\n settingsUdi: string;\r\n culture: string;\r\n blockIndex: number;\r\n}\r\n\r\nexport interface RtePreviewQuery {\r\n blockEditorAlias: string;\r\n nodeKey: string;\r\n contentElementAlias: string;\r\n documentTypeUnique: string;\r\n culture: string;\r\n}\r\n\r\nexport interface StylesheetQuery {\r\n documentTypeUnique: string;\r\n nodeKey: string;\r\n}\r\n\r\nexport interface IPreviewDataSource {\r\n previewGridBlock(body: string, query: BlockPreviewQuery): Promise>;\r\n previewListBlock(body: string, query: BlockPreviewQuery): Promise>;\r\n previewSingleBlock(body: string, query: BlockPreviewQuery): Promise>;\r\n previewRichTextMarkup(body: string, query: RtePreviewQuery): Promise>;\r\n getGridStylesheets(query: StylesheetQuery): Promise>;\r\n getListStylesheets(query: StylesheetQuery): Promise>;\r\n getSingleBlockStylesheets(query: StylesheetQuery): Promise>;\r\n getRteStylesheets(query: StylesheetQuery): Promise>;\r\n}\r\n\r\nexport class PreviewDataSource implements IPreviewDataSource {\r\n #host: UmbControllerHost;\r\n\r\n constructor(host: UmbControllerHost) {\r\n this.#host = host;\r\n }\r\n\r\n async previewGridBlock(body: string, query: BlockPreviewQuery): Promise> {\r\n return await tryExecute(this.#host, BlockPreviewService.previewGridBlock({ body, query }));\r\n }\r\n\r\n async previewListBlock(body: string, query: BlockPreviewQuery): Promise> {\r\n return await tryExecute(this.#host, BlockPreviewService.previewListBlock({ body, query }));\r\n }\r\n\r\n async previewSingleBlock(body: string, query: BlockPreviewQuery): Promise> {\r\n return await tryExecute(this.#host, BlockPreviewService.previewSingleBlock({ body, query }));\r\n }\r\n\r\n async previewRichTextMarkup(body: string, query: RtePreviewQuery): Promise> {\r\n return await tryExecute(this.#host, BlockPreviewService.previewRichTextMarkup({ body, query }));\r\n }\r\n\r\n async getGridStylesheets(query: StylesheetQuery): Promise> {\r\n return await tryExecute(this.#host, BlockPreviewService.getGridStylesheets({ query }));\r\n }\r\n\r\n async getListStylesheets(query: StylesheetQuery): Promise> {\r\n return await tryExecute(this.#host, BlockPreviewService.getListStylesheets({ query }));\r\n }\r\n\r\n async getSingleBlockStylesheets(query: StylesheetQuery): Promise> {\r\n return await tryExecute(this.#host, BlockPreviewService.getSingleBlockStylesheets({ query }));\r\n }\r\n\r\n async getRteStylesheets(query: StylesheetQuery): Promise> {\r\n return await tryExecute(this.#host, BlockPreviewService.getRteStylesheets({ query }));\r\n }\r\n}\r\n","import { UmbDataSourceResponse } from \"@umbraco-cms/backoffice/repository\";\r\nimport { BlockPreviewService, type BlockPreviewOptions } from \"../api\";\r\nimport { UmbControllerHost } from \"@umbraco-cms/backoffice/controller-api\";\r\nimport { tryExecute } from \"@umbraco-cms/backoffice/resources\";\r\n\r\nexport interface ISettingsDataSource {\r\n getSettings(): Promise>\r\n}\r\n\r\nexport class SettingsDataSource implements ISettingsDataSource {\r\n #host: UmbControllerHost;\r\n\r\n constructor(host: UmbControllerHost) {\r\n this.#host = host;\r\n }\r\n\r\n async getSettings(): Promise> {\r\n return await tryExecute(this.#host, BlockPreviewService.getSettings());\r\n }\r\n}","import { UmbControllerBase } from \"@umbraco-cms/backoffice/class-api\";\r\nimport { SettingsDataSource } from \"./settings.data-source\";\r\nimport { UmbControllerHost } from \"@umbraco-cms/backoffice/controller-api\";\r\n\r\nexport class SettingsRepository extends UmbControllerBase {\r\n #settingsDataSource: SettingsDataSource;\r\n\r\n constructor(host: UmbControllerHost) {\r\n super(host);\r\n this.#settingsDataSource = new SettingsDataSource(host);\r\n }\r\n\r\n async getSettings() {\r\n const settings = await this.#settingsDataSource.getSettings();\r\n\r\n if (settings && settings?.data) {\r\n return settings.data;\r\n }\r\n }\r\n}","import { BlockPreviewBaseElement } from './block-preview-base.element';\r\nimport { BlockGridContext } from './types';\r\nimport { PreviewDataSource } from '../repository';\r\nimport { css, customElement, property } from \"@umbraco-cms/backoffice/external/lit\";\r\nimport { UMB_BLOCK_GRID_ENTRY_CONTEXT, UMB_BLOCK_GRID_MANAGER_CONTEXT, UmbBlockGridLayoutModel, UmbBlockGridValueModel, UmbBlockGridLayoutAreaItemModel } from \"@umbraco-cms/backoffice/block-grid\";\r\nimport { UMB_CONTENT_WORKSPACE_CONTEXT } from \"@umbraco-cms/backoffice/content\";\r\nimport { observeMultiple } from \"@umbraco-cms/backoffice/observable-api\";\r\n\r\nconst elementName = \"block-grid-preview\";\r\n\r\n@customElement(elementName)\r\nexport class BlockGridPreviewCustomView extends BlockPreviewBaseElement {\r\n\r\n #previewDataSource: PreviewDataSource;\r\n\r\n constructor() {\r\n super();\r\n this.#previewDataSource = new PreviewDataSource(this);\r\n }\r\n\r\n protected _blockContext: BlockGridContext = {\r\n unique: \"\",\r\n documentTypeUnique: \"\",\r\n contentUdi: \"\",\r\n settingsUdi: \"\",\r\n blockEditorAlias: \"\",\r\n culture: \"\",\r\n workspaceEditContentPath: \"\",\r\n contentElementTypeAlias: \"\",\r\n contentElementTypeKey: \"\",\r\n areas: [],\r\n layout: undefined,\r\n layoutAreas: undefined,\r\n blockIndex: 0\r\n };\r\n\r\n private _blockGridValue: UmbBlockGridValueModel = {\r\n layout: {},\r\n expose: [],\r\n contentData: [],\r\n settingsData: []\r\n }\r\n\r\n @property({ attribute: false })\r\n public set blockGridValue(value: UmbBlockGridValueModel | undefined) {\r\n const buildUpValue: Partial = value ? { ...value } : {};\r\n buildUpValue.layout ??= {};\r\n buildUpValue.contentData ??= [];\r\n buildUpValue.settingsData ??= [];\r\n buildUpValue.expose ??= [];\r\n this._blockGridValue = buildUpValue as UmbBlockGridValueModel;\r\n }\r\n public get blockGridValue(): UmbBlockGridValueModel {\r\n return this._blockGridValue;\r\n }\r\n\r\n protected async setupContextObservers() {\r\n this.observePropertyDataset();\r\n await this.#observeContentWorkspace();\r\n }\r\n\r\n async #observeContentWorkspace() {\r\n try {\r\n // The content workspace shares its context alias with the block workspace,\r\n // so when this preview is nested inside another block we must pass beyond\r\n // the nearer block workspace match to reach the document content workspace.\r\n await this.getContext(UMB_CONTENT_WORKSPACE_CONTEXT, { passContextAliasMatches: true });\r\n this.consumeContext(UMB_CONTENT_WORKSPACE_CONTEXT, (context) => {\r\n if (!context) return;\r\n\r\n this.observe(\r\n observeMultiple([context.unique, context.structure.contentTypeUniques]),\r\n async ([unique, contentTypeUniques]) => {\r\n await this.handleWorkspaceData(unique?.toString(), contentTypeUniques?.[0]);\r\n }\r\n );\r\n }).passContextAliasMatches();\r\n } catch {\r\n this.observeBlockWorkspaceFallback();\r\n }\r\n }\r\n\r\n protected observeBlockValue() {\r\n this.consumeContext(UMB_BLOCK_GRID_ENTRY_CONTEXT, async (context) => {\r\n if (context) {\r\n this.observe(\r\n observeMultiple([\r\n context.contentKey,\r\n context.settingsKey,\r\n context.workspaceEditContentPath,\r\n context.contentElementTypeAlias,\r\n context.contentElementTypeKey,\r\n context.areas,\r\n context.layout,\r\n context.layoutAreas\r\n ]),\r\n async ([\r\n contentUdi,\r\n settingsUdi,\r\n workspaceEditContentPath,\r\n contentElementTypeAlias,\r\n contentElementTypeKey,\r\n areas,\r\n layout,\r\n layoutAreas\r\n ]) => {\r\n const prevColumnSpan = this._blockContext.layout?.columnSpan;\r\n const prevRowSpan = this._blockContext.layout?.rowSpan;\r\n const prevLayoutAreas = this._blockContext.layoutAreas;\r\n\r\n this._blockContext.contentUdi = contentUdi ?? '';\r\n this._blockContext.settingsUdi = settingsUdi ?? '';\r\n this._blockContext.workspaceEditContentPath = workspaceEditContentPath ?? '';\r\n this._blockContext.contentElementTypeAlias = contentElementTypeAlias ?? '';\r\n this._blockContext.contentElementTypeKey = contentElementTypeKey ?? '';\r\n this._blockContext.areas = areas;\r\n this._blockContext.layout = layout!;\r\n this._blockContext.layoutAreas = layoutAreas;\r\n\r\n if (!this.#managerObserved && this._blockContext.contentUdi) {\r\n this.#managerObserved = true;\r\n await this.#observeBlockPropertyValue();\r\n }\r\n\r\n // Re-render when layoutAreas first arrive for a block with areas.\r\n // Covers both the deferred case (_htmlMarkup empty) and the early-render\r\n // case (_htmlMarkup set from an incomplete render). blockGridValue.layout\r\n // must be rebuilt here so callPreviewApi() sends the updated area data.\r\n if (!prevLayoutAreas && layoutAreas && (areas?.length ?? 0) > 0 && this.#managerObserved && !this._isLoading) {\r\n this.blockGridValue = {\r\n ...this._blockGridValue,\r\n layout: { ['Umbraco.BlockGrid']: this.#filterLayouts() }\r\n };\r\n this.renderBlockPreview();\r\n }\r\n\r\n // Re-render when layout dimensions change (resize)\r\n if (this._htmlMarkup && layout && (\r\n layout.columnSpan !== prevColumnSpan ||\r\n layout.rowSpan !== prevRowSpan\r\n )) {\r\n this.blockGridValue = {\r\n ...this._blockGridValue,\r\n layout: { ['Umbraco.BlockGrid']: this.#filterLayouts() }\r\n };\r\n clearTimeout(this.#layoutResizeTimer);\r\n this.#layoutResizeTimer = setTimeout(() => {\r\n this.renderBlockPreview();\r\n }, 300);\r\n }\r\n }\r\n );\r\n }\r\n });\r\n }\r\n\r\n #managerObserved = false;\r\n #layoutResizeTimer?: ReturnType;\r\n\r\n async #observeBlockPropertyValue() {\r\n this.consumeContext(UMB_BLOCK_GRID_MANAGER_CONTEXT, (context) => {\r\n if (context) {\r\n this.observe(\r\n observeMultiple([\r\n context.contents,\r\n context.settings,\r\n context.exposes,\r\n context.propertyAlias\r\n ]),\r\n async ([contents, settings, exposes, propertyAlias]) => {\r\n this._blockContext.blockEditorAlias = propertyAlias ?? '';\r\n this.blockGridValue = {\r\n contentData: contents ?? [],\r\n settingsData: settings ?? [],\r\n expose: exposes ?? [],\r\n layout: { ['Umbraco.BlockGrid']: this.#filterLayouts() }\r\n };\r\n this._blockContext.blockIndex = (contents ?? []).findIndex(x => x.key === this._blockContext.contentUdi);\r\n if (!this._htmlMarkup && !this._isLoading) {\r\n // Defer render if areas are expected but layoutAreas haven't arrived yet;\r\n // observeBlockValue will trigger the render once layoutAreas are available.\r\n if ((this._blockContext.areas?.length ?? 0) > 0 && !this._blockContext.layoutAreas) {\r\n return;\r\n }\r\n this.renderBlockPreview();\r\n }\r\n }\r\n );\r\n }\r\n });\r\n }\r\n\r\n #filterLayouts(): UmbBlockGridLayoutModel[] {\r\n const areas = this._blockContext.areas.map(area => {\r\n const model: UmbBlockGridLayoutAreaItemModel = {\r\n key: area.key,\r\n items: this._blockContext.layoutAreas?.find(layout => layout.key === area.key)?.items ?? []\r\n }\r\n return model;\r\n });\r\n\r\n const layoutModel: UmbBlockGridLayoutModel[] =\r\n [\r\n {\r\n areas: areas,\r\n columnSpan: this._blockContext.layout?.columnSpan ?? 0,\r\n rowSpan: this._blockContext.layout?.rowSpan ?? 0,\r\n contentKey: this._blockContext.layout?.contentKey ?? '',\r\n settingsKey: this._blockContext.layout?.settingsKey\r\n }\r\n ];\r\n\r\n return layoutModel;\r\n }\r\n\r\n protected async callPreviewApi() {\r\n return await this.#previewDataSource.previewGridBlock(\r\n JSON.stringify(this.blockGridValue),\r\n {\r\n blockEditorAlias: this._blockContext.blockEditorAlias,\r\n nodeKey: this._blockContext.unique,\r\n contentElementAlias: this._blockContext.contentElementTypeAlias,\r\n documentTypeUnique: this._blockContext.documentTypeUnique,\r\n contentUdi: this._blockContext.contentUdi,\r\n settingsUdi: this._blockContext.settingsUdi,\r\n culture: this._blockContext.culture,\r\n blockIndex: this._blockContext.blockIndex\r\n }\r\n );\r\n }\r\n\r\n protected async fetchStylesheets() {\r\n const { data } = await this.#previewDataSource.getGridStylesheets({\r\n documentTypeUnique: this._blockContext.documentTypeUnique,\r\n nodeKey: this._blockContext.unique\r\n });\r\n return data;\r\n }\r\n\r\n protected override validatePreviewData(): boolean {\r\n return super.validatePreviewData() && this._blockContext.contentUdi !== '';\r\n }\r\n\r\n static override styles = [\r\n ...BlockPreviewBaseElement.styles,\r\n css`\r\n :host {\r\n display: block;\r\n height: 100%;\r\n }\r\n\r\n a.block-preview-edit {\r\n height: 100%;\r\n }\r\n `\r\n ]\r\n}\r\n\r\nexport default BlockGridPreviewCustomView;\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n [elementName]: BlockGridPreviewCustomView;\r\n }\r\n}\r\n","import { BlockPreviewBaseElement } from './block-preview-base.element';\r\nimport { BlockListContext } from './types';\r\nimport { PreviewDataSource } from '../repository';\r\nimport { css, customElement, property, state } from \"@umbraco-cms/backoffice/external/lit\";\r\nimport { UMB_BLOCK_LIST_ENTRY_CONTEXT, UMB_BLOCK_LIST_MANAGER_CONTEXT, UmbBlockListValueModel } from \"@umbraco-cms/backoffice/block-list\";\r\nimport { UMB_CONTENT_WORKSPACE_CONTEXT } from \"@umbraco-cms/backoffice/content\";\r\nimport { observeMultiple } from \"@umbraco-cms/backoffice/observable-api\";\r\n\r\nconst elementName = \"block-list-preview\";\r\n\r\n@customElement(elementName)\r\nexport class BlockListPreviewCustomView extends BlockPreviewBaseElement {\r\n\r\n #previewDataSource: PreviewDataSource;\r\n\r\n constructor() {\r\n super();\r\n this.#previewDataSource = new PreviewDataSource(this);\r\n }\r\n\r\n protected _blockContext: BlockListContext = {\r\n unique: '',\r\n documentTypeUnique: '',\r\n contentUdi: '',\r\n settingsUdi: '',\r\n blockEditorAlias: '',\r\n culture: '',\r\n workspaceEditContentPath: '',\r\n contentElementTypeAlias: '',\r\n contentElementTypeKey: '',\r\n blockIndex: 0\r\n };\r\n\r\n @state()\r\n private _blockListValue: UmbBlockListValueModel = {\r\n layout: {},\r\n expose: [],\r\n contentData: [],\r\n settingsData: []\r\n };\r\n\r\n @property({ attribute: false })\r\n public set blockListValue(value: UmbBlockListValueModel | undefined) {\r\n const buildUpValue: Partial = value ? { ...value } : {};\r\n buildUpValue.layout ??= {};\r\n buildUpValue.contentData ??= [];\r\n buildUpValue.settingsData ??= [];\r\n buildUpValue.expose ??= [];\r\n this._blockListValue = buildUpValue as UmbBlockListValueModel;\r\n }\r\n\r\n public get blockListValue(): UmbBlockListValueModel {\r\n return this._blockListValue;\r\n }\r\n\r\n protected async setupContextObservers() {\r\n this.observePropertyDataset();\r\n await this.#observeContentWorkspace();\r\n }\r\n\r\n async #observeContentWorkspace() {\r\n try {\r\n // The content workspace shares its context alias with the block workspace,\r\n // so when this preview is nested inside another block we must pass beyond\r\n // the nearer block workspace match to reach the document content workspace.\r\n await this.getContext(UMB_CONTENT_WORKSPACE_CONTEXT, { passContextAliasMatches: true });\r\n\r\n this.consumeContext(UMB_CONTENT_WORKSPACE_CONTEXT, (context) => {\r\n if (!context) return;\r\n\r\n this.observe(\r\n observeMultiple([context.unique, context.structure.contentTypeUniques]),\r\n async ([unique, contentTypeUniques]) => {\r\n await this.handleWorkspaceData(unique?.toString(), contentTypeUniques?.[0]);\r\n }\r\n );\r\n }).passContextAliasMatches();\r\n } catch {\r\n this.observeBlockWorkspaceFallback();\r\n }\r\n }\r\n\r\n protected observeBlockValue() {\r\n this.consumeContext(UMB_BLOCK_LIST_ENTRY_CONTEXT, (context) => {\r\n if (context) {\r\n this.observe(\r\n observeMultiple([\r\n context.contentKey,\r\n context.settingsKey,\r\n context.workspaceEditContentPath,\r\n context.contentElementTypeAlias,\r\n context.contentElementTypeKey\r\n ]),\r\n async ([\r\n contentUdi,\r\n settingsUdi,\r\n workspaceEditContentPath,\r\n contentElementTypeAlias,\r\n contentElementTypeKey\r\n ]) => {\r\n this._blockContext.contentUdi = contentUdi ?? '';\r\n this._blockContext.settingsUdi = settingsUdi ?? '';\r\n this._blockContext.workspaceEditContentPath = workspaceEditContentPath ?? '';\r\n this._blockContext.contentElementTypeAlias = contentElementTypeAlias ?? '';\r\n this._blockContext.contentElementTypeKey = contentElementTypeKey ?? '';\r\n\r\n // Only subscribe to manager context once contentUdi is known; subscribing with\r\n // an empty key causes the manager to filter contentData to [] on its first emit,\r\n // and the #managerObserved guard then blocks a corrective re-subscription.\r\n if (!this.#managerObserved && this._blockContext.contentUdi) {\r\n this.#managerObserved = true;\r\n await this.#observeBlockPropertyValue();\r\n }\r\n }\r\n );\r\n }\r\n });\r\n }\r\n\r\n #managerObserved = false;\r\n\r\n #observeBlockPropertyValue() {\r\n this.consumeContext(UMB_BLOCK_LIST_MANAGER_CONTEXT, (context) => {\r\n if (context) {\r\n this.observe(\r\n observeMultiple([\r\n context.contents,\r\n context.settings,\r\n context.layouts,\r\n context.exposes,\r\n context.propertyAlias\r\n ]),\r\n async ([\r\n contents,\r\n settings,\r\n layouts,\r\n exposes,\r\n propertyAlias\r\n ]) => {\r\n this._blockContext.blockEditorAlias = propertyAlias ?? '';\r\n\r\n this.blockListValue = {\r\n contentData: contents?.filter(x => x.key === this._blockContext.contentUdi) ?? [],\r\n settingsData: settings?.filter(x => x.key === this._blockContext.settingsUdi) ?? [],\r\n expose: exposes?.filter(x => x.contentKey === this._blockContext.contentUdi) ?? [],\r\n layout: {\r\n ['Umbraco.BlockList']: layouts?.filter(x => x.contentKey === this._blockContext.contentUdi) ?? []\r\n }\r\n };\r\n\r\n this._blockContext.blockIndex = contents?.indexOf(this.blockListValue.contentData[0]);\r\n if (!this._htmlMarkup && !this._isLoading) {\r\n this.renderBlockPreview();\r\n }\r\n }\r\n );\r\n }\r\n });\r\n }\r\n\r\n protected async callPreviewApi() {\r\n return await this.#previewDataSource.previewListBlock(\r\n JSON.stringify(this.blockListValue),\r\n {\r\n blockEditorAlias: this._blockContext.blockEditorAlias,\r\n nodeKey: this._blockContext.unique,\r\n contentElementAlias: this._blockContext.contentElementTypeAlias,\r\n documentTypeUnique: this._blockContext.documentTypeUnique,\r\n contentUdi: this._blockContext.contentUdi,\r\n settingsUdi: this._blockContext.settingsUdi,\r\n culture: this._blockContext.culture,\r\n blockIndex: this._blockContext.blockIndex,\r\n }\r\n );\r\n }\r\n\r\n protected async fetchStylesheets() {\r\n const { data } = await this.#previewDataSource.getListStylesheets({\r\n documentTypeUnique: this._blockContext.documentTypeUnique,\r\n nodeKey: this._blockContext.unique\r\n });\r\n return data;\r\n }\r\n\r\n protected override validatePreviewData(): boolean {\r\n return super.validatePreviewData() && this._blockContext.contentUdi !== '';\r\n }\r\n\r\n static override styles = [\r\n ...BlockPreviewBaseElement.styles,\r\n css`\r\n :host {\r\n display: block;\r\n height: 100%;\r\n }\r\n\r\n a.block-preview-edit {\r\n height: 100%;\r\n }\r\n `\r\n ]\r\n}\r\n\r\nexport default BlockListPreviewCustomView;\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n [elementName]: BlockListPreviewCustomView;\r\n }\r\n}\r\n","import { BlockPreviewBaseElement } from './block-preview-base.element';\r\nimport { BlockContext } from './types';\r\nimport { PreviewDataSource } from '../repository';\r\nimport { css, customElement, property, state } from \"@umbraco-cms/backoffice/external/lit\";\r\nimport { UMB_BLOCK_SINGLE_ENTRY_CONTEXT, UMB_BLOCK_SINGLE_MANAGER_CONTEXT, UmbBlockSingleValueModel } from \"@umbraco-cms/backoffice/block-single\";\r\nimport { UMB_CONTENT_WORKSPACE_CONTEXT } from \"@umbraco-cms/backoffice/content\";\r\nimport { observeMultiple } from \"@umbraco-cms/backoffice/observable-api\";\r\n\r\nconst elementName = \"block-single-preview\";\r\n\r\n@customElement(elementName)\r\nexport class BlockSinglePreviewCustomView extends BlockPreviewBaseElement {\r\n\r\n #previewDataSource: PreviewDataSource;\r\n\r\n constructor() {\r\n super();\r\n this.#previewDataSource = new PreviewDataSource(this);\r\n }\r\n\r\n protected _blockContext: BlockContext = {\r\n unique: '',\r\n documentTypeUnique: '',\r\n contentUdi: '',\r\n settingsUdi: '',\r\n blockEditorAlias: '',\r\n culture: '',\r\n workspaceEditContentPath: '',\r\n contentElementTypeAlias: '',\r\n contentElementTypeKey: '',\r\n blockIndex: 0\r\n };\r\n\r\n @state()\r\n private _blockSingleValue: UmbBlockSingleValueModel = {\r\n layout: {},\r\n expose: [],\r\n contentData: [],\r\n settingsData: []\r\n };\r\n\r\n @property({ attribute: false })\r\n public set blockSingleValue(value: UmbBlockSingleValueModel | undefined) {\r\n const buildUpValue: Partial = value ? { ...value } : {};\r\n buildUpValue.layout ??= {};\r\n buildUpValue.contentData ??= [];\r\n buildUpValue.settingsData ??= [];\r\n buildUpValue.expose ??= [];\r\n this._blockSingleValue = buildUpValue as UmbBlockSingleValueModel;\r\n }\r\n\r\n public get blockSingleValue(): UmbBlockSingleValueModel {\r\n return this._blockSingleValue;\r\n }\r\n\r\n protected async setupContextObservers() {\r\n this.observePropertyDataset();\r\n await this.#observeContentWorkspace();\r\n }\r\n\r\n async #observeContentWorkspace() {\r\n try {\r\n // The content workspace shares its context alias with the block workspace,\r\n // so when this preview is nested inside another block we must pass beyond\r\n // the nearer block workspace match to reach the document content workspace.\r\n await this.getContext(UMB_CONTENT_WORKSPACE_CONTEXT, { passContextAliasMatches: true });\r\n\r\n this.consumeContext(UMB_CONTENT_WORKSPACE_CONTEXT, (context) => {\r\n if (!context) return;\r\n\r\n this.observe(\r\n observeMultiple([context.unique, context.structure.contentTypeUniques]),\r\n async ([unique, contentTypeUniques]) => {\r\n await this.handleWorkspaceData(unique?.toString(), contentTypeUniques?.[0]);\r\n }\r\n );\r\n }).passContextAliasMatches();\r\n } catch {\r\n this.observeBlockWorkspaceFallback();\r\n }\r\n }\r\n\r\n protected observeBlockValue() {\r\n this.consumeContext(UMB_BLOCK_SINGLE_ENTRY_CONTEXT, (context) => {\r\n if (context) {\r\n this.observe(\r\n observeMultiple([\r\n context.contentKey,\r\n context.settingsKey,\r\n context.workspaceEditContentPath,\r\n context.contentElementTypeAlias,\r\n context.contentElementTypeKey\r\n ]),\r\n async ([\r\n contentUdi,\r\n settingsUdi,\r\n workspaceEditContentPath,\r\n contentElementTypeAlias,\r\n contentElementTypeKey\r\n ]) => {\r\n this._blockContext.contentUdi = contentUdi ?? '';\r\n this._blockContext.settingsUdi = settingsUdi ?? '';\r\n this._blockContext.workspaceEditContentPath = workspaceEditContentPath ?? '';\r\n this._blockContext.contentElementTypeAlias = contentElementTypeAlias ?? '';\r\n this._blockContext.contentElementTypeKey = contentElementTypeKey ?? '';\r\n\r\n if (!this.#managerObserved) {\r\n this.#managerObserved = true;\r\n await this.#observeBlockPropertyValue();\r\n }\r\n }\r\n );\r\n }\r\n });\r\n }\r\n\r\n #managerObserved = false;\r\n\r\n #observeBlockPropertyValue() {\r\n this.consumeContext(UMB_BLOCK_SINGLE_MANAGER_CONTEXT, (context) => {\r\n if (context) {\r\n this.observe(\r\n observeMultiple([\r\n context.contents,\r\n context.settings,\r\n context.layouts,\r\n context.exposes,\r\n context.propertyAlias\r\n ]),\r\n async ([\r\n contents,\r\n settings,\r\n layouts,\r\n exposes,\r\n propertyAlias\r\n ]) => {\r\n this._blockContext.blockEditorAlias = propertyAlias ?? '';\r\n\r\n this.blockSingleValue = {\r\n contentData: contents?.filter(x => x.key === this._blockContext.contentUdi) ?? [],\r\n settingsData: settings?.filter(x => x.key === this._blockContext.settingsUdi) ?? [],\r\n expose: exposes?.filter(x => x.contentKey === this._blockContext.contentUdi) ?? [],\r\n layout: {\r\n ['Umbraco.SingleBlock']: layouts?.filter(x => x.contentKey === this._blockContext.contentUdi) ?? []\r\n }\r\n };\r\n\r\n this._blockContext.blockIndex = contents?.indexOf(this.blockSingleValue.contentData[0]);\r\n if (!this._htmlMarkup && !this._isLoading) {\r\n this.renderBlockPreview();\r\n }\r\n }\r\n );\r\n }\r\n });\r\n }\r\n\r\n protected async callPreviewApi() {\r\n return await this.#previewDataSource.previewSingleBlock(\r\n JSON.stringify(this.blockSingleValue),\r\n {\r\n blockEditorAlias: this._blockContext.blockEditorAlias,\r\n nodeKey: this._blockContext.unique,\r\n contentElementAlias: this._blockContext.contentElementTypeAlias,\r\n documentTypeUnique: this._blockContext.documentTypeUnique,\r\n contentUdi: this._blockContext.contentUdi,\r\n settingsUdi: this._blockContext.settingsUdi,\r\n culture: this._blockContext.culture,\r\n blockIndex: this._blockContext.blockIndex,\r\n }\r\n );\r\n }\r\n\r\n protected async fetchStylesheets() {\r\n const { data } = await this.#previewDataSource.getSingleBlockStylesheets({\r\n documentTypeUnique: this._blockContext.documentTypeUnique,\r\n nodeKey: this._blockContext.unique\r\n });\r\n return data;\r\n }\r\n\r\n protected override validatePreviewData(): boolean {\r\n return super.validatePreviewData() && this._blockContext.contentUdi !== '';\r\n }\r\n\r\n static override styles = [\r\n ...BlockPreviewBaseElement.styles,\r\n css`\r\n :host {\r\n display: block;\r\n height: 100%;\r\n }\r\n\r\n a.block-preview-edit {\r\n height: 100%;\r\n }\r\n `\r\n ]\r\n}\r\n\r\nexport default BlockSinglePreviewCustomView;\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n [elementName]: BlockSinglePreviewCustomView;\r\n }\r\n}\r\n","import { BlockPreviewBaseElement } from './block-preview-base.element';\r\nimport { BlockContext } from './types';\r\nimport { PreviewDataSource } from '../repository';\r\nimport { customElement, property, state } from \"@umbraco-cms/backoffice/external/lit\";\r\nimport { UMB_BLOCK_RTE_ENTRY_CONTEXT, UMB_BLOCK_RTE_MANAGER_CONTEXT, UmbBlockRteValueModel } from \"@umbraco-cms/backoffice/block-rte\";\r\nimport { UMB_DOCUMENT_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/document';\r\nimport { observeMultiple } from \"@umbraco-cms/backoffice/observable-api\";\r\n\r\nconst elementName = \"rich-text-preview\";\r\n\r\n@customElement(elementName)\r\nexport class RichTextPreviewCustomView extends BlockPreviewBaseElement {\r\n\r\n #previewDataSource: PreviewDataSource;\r\n\r\n constructor() {\r\n super();\r\n this.#previewDataSource = new PreviewDataSource(this);\r\n }\r\n\r\n protected _blockContext: BlockContext = {\r\n unique: '',\r\n documentTypeUnique: '',\r\n contentUdi: '',\r\n settingsUdi: '',\r\n blockEditorAlias: '',\r\n culture: '',\r\n workspaceEditContentPath: '',\r\n contentElementTypeAlias: '',\r\n contentElementTypeKey: '',\r\n blockIndex: 0\r\n };\r\n\r\n @state()\r\n private _blockRteValue: UmbBlockRteValueModel = {\r\n layout: {},\r\n expose: [],\r\n contentData: [],\r\n settingsData: []\r\n }\r\n\r\n @property({ attribute: false })\r\n public set blockRteValue(value: UmbBlockRteValueModel | undefined) {\r\n const buildUpValue: Partial = value ? { ...value } : {};\r\n buildUpValue.layout ??= {};\r\n buildUpValue.contentData ??= [];\r\n buildUpValue.settingsData ??= [];\r\n buildUpValue.expose ??= [];\r\n this._blockRteValue = buildUpValue as UmbBlockRteValueModel;\r\n }\r\n public get blockRteValue(): UmbBlockRteValueModel {\r\n return this._blockRteValue;\r\n }\r\n\r\n protected setupContextObservers() {\r\n this.observePropertyDataset();\r\n // Observe the block entry/manager contexts independently of the workspace.\r\n // These RTE-specific contexts are always available to the block view, whereas\r\n // UMB_DOCUMENT_WORKSPACE_CONTEXT is absent when the host block is edited inside a\r\n // side-panel modal (e.g. an RTE field on a block nested in a Block Grid/List).\r\n // Gating this behind the document workspace meant the preview never rendered there.\r\n this.observeBlockValue();\r\n this.#observeDocumentWorkspace();\r\n }\r\n\r\n #observeDocumentWorkspace() {\r\n try {\r\n // The document workspace shares its context alias with the block workspace,\r\n // so when this preview is nested inside another block we must pass beyond\r\n // the nearer block workspace match to reach the document workspace.\r\n this.consumeContext(UMB_DOCUMENT_WORKSPACE_CONTEXT, (context) => {\r\n if (context) {\r\n this._workspaceContextResolved = true;\r\n this.observe(\r\n observeMultiple([context.unique, context.contentTypeUnique]),\r\n async ([unique, documentTypeUnique]) => {\r\n await this.handleWorkspaceData(unique?.toString(), documentTypeUnique);\r\n }\r\n );\r\n }\r\n }).passContextAliasMatches();\r\n } catch {\r\n this.observeBlockWorkspaceFallback();\r\n }\r\n }\r\n\r\n #entryObserved = false;\r\n\r\n protected observeBlockValue(): void {\r\n // Set up the entry-context subscription only once; it is now invoked both from\r\n // setupContextObservers and (for the document-level case) from handleWorkspaceData.\r\n if (this.#entryObserved) return;\r\n this.#entryObserved = true;\r\n this.consumeContext(UMB_BLOCK_RTE_ENTRY_CONTEXT, (context) => {\r\n if (context != null) {\r\n this.observe(\r\n observeMultiple([\r\n context.contentKey,\r\n context.settingsKey,\r\n context.workspaceEditContentPath,\r\n context.contentElementTypeAlias,\r\n context.contentElementTypeKey\r\n ]),\r\n async ([\r\n contentUdi,\r\n settingsUdi,\r\n workspaceEditContentPath,\r\n contentElementTypeAlias,\r\n contentElementTypeKey\r\n ]) => {\r\n this._blockContext.contentUdi = contentUdi ?? '';\r\n this._blockContext.settingsUdi = settingsUdi ?? '';\r\n this._blockContext.workspaceEditContentPath = workspaceEditContentPath ?? '';\r\n this._blockContext.contentElementTypeAlias = contentElementTypeAlias ?? '';\r\n this._blockContext.contentElementTypeKey = contentElementTypeKey ?? '';\r\n\r\n // Only subscribe to manager context once contentUdi is known; subscribing with\r\n // an empty key causes the manager to filter contentData to [] on its first emit,\r\n // and the #managerObserved guard then blocks a corrective re-subscription.\r\n if (!this.#managerObserved && this._blockContext.contentUdi) {\r\n this.#managerObserved = true;\r\n await this.#observeBlockPropertyValue();\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n #managerObserved = false;\r\n\r\n #observeBlockPropertyValue(): void {\r\n this.consumeContext(UMB_BLOCK_RTE_MANAGER_CONTEXT, (context) => {\r\n if (context != null) {\r\n this.observe(\r\n observeMultiple([\r\n context.contents,\r\n context.settings,\r\n context.layouts,\r\n context.exposes,\r\n context.propertyAlias\r\n ]),\r\n async ([\r\n contents,\r\n settings,\r\n layouts,\r\n exposes,\r\n propertyAlias\r\n ]) => {\r\n this._blockContext.blockEditorAlias = propertyAlias ?? '';\r\n\r\n this.blockRteValue = {\r\n contentData: contents?.filter(x => x.key === this._blockContext.contentUdi) ?? [],\r\n settingsData: settings?.filter(x => x.key === this._blockContext.settingsUdi) ?? [],\r\n expose: exposes?.filter(x => x.contentKey === this._blockContext.contentUdi) ?? [],\r\n layout: {\r\n ['Umbraco.RichText']: layouts?.filter(x => x.contentKey === this._blockContext.contentUdi) ?? []\r\n }\r\n };\r\n if (!this._htmlMarkup && !this._isLoading) {\r\n this.renderBlockPreview();\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n protected async callPreviewApi() {\r\n return await this.#previewDataSource.previewRichTextMarkup(\r\n JSON.stringify(this.blockRteValue),\r\n {\r\n blockEditorAlias: this._blockContext.blockEditorAlias,\r\n nodeKey: this._blockContext.unique,\r\n contentElementAlias: this._blockContext.contentElementTypeAlias,\r\n documentTypeUnique: this._blockContext.documentTypeUnique,\r\n culture: this._blockContext.culture\r\n }\r\n );\r\n }\r\n\r\n protected async fetchStylesheets() {\r\n const { data } = await this.#previewDataSource.getRteStylesheets({\r\n documentTypeUnique: this._blockContext.documentTypeUnique,\r\n nodeKey: this._blockContext.unique\r\n });\r\n return data;\r\n }\r\n}\r\n\r\nexport default RichTextPreviewCustomView;\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n [elementName]: RichTextPreviewCustomView;\r\n }\r\n}\r\n","/**\r\n * Concurrency-limited request queue for block preview API calls.\r\n *\r\n * When a page has many blocks, all preview elements fire API requests\r\n * simultaneously after their debounce timers expire. This overwhelms\r\n * the server and can cause empty or malformed responses.\r\n *\r\n * Inspired by the CMS `UmbManagementApiItemDataCache.scheduleBatchedFetch`\r\n * pattern, this queue limits concurrent in-flight requests so the server\r\n * processes a manageable number at a time.\r\n */\r\nexport class BlockPreviewRequestQueue {\r\n #maxConcurrent: number;\r\n #activeCount = 0;\r\n #queue: Array<() => void> = [];\r\n\r\n constructor(maxConcurrent: number = 3) {\r\n this.#maxConcurrent = maxConcurrent;\r\n }\r\n\r\n /**\r\n * Enqueue a task to run with concurrency limiting.\r\n * If fewer than `maxConcurrent` tasks are active, the task runs immediately.\r\n * Otherwise it waits until a slot is available.\r\n */\r\n async enqueue(task: () => Promise): Promise {\r\n if (this.#activeCount >= this.#maxConcurrent) {\r\n await new Promise((resolve) => {\r\n this.#queue.push(resolve);\r\n });\r\n }\r\n\r\n this.#activeCount++;\r\n try {\r\n return await task();\r\n } finally {\r\n this.#activeCount--;\r\n if (this.#queue.length > 0) {\r\n const next = this.#queue.shift()!;\r\n next();\r\n }\r\n }\r\n }\r\n}\r\n","import { UmbControllerBase } from \"@umbraco-cms/backoffice/class-api\";\r\nimport { UmbControllerHost } from \"@umbraco-cms/backoffice/controller-api\";\r\nimport { UmbStringState } from \"@umbraco-cms/backoffice/observable-api\";\r\nimport { BlockPreviewRequestQueue } from \"./block-preview-request-queue\";\r\n\r\nexport class BlockPreviewContext extends UmbControllerBase {\r\n\r\n #requestQueue = new BlockPreviewRequestQueue(3);\r\n #stylesheetCache = new Map>();\r\n\r\n /** Shared concurrency-limited queue for preview API requests. */\r\n get requestQueue(): BlockPreviewRequestQueue {\r\n return this.#requestQueue;\r\n }\r\n\r\n // Node key cache used as a fallback when a preview cannot reach its content\r\n // workspace directly (e.g. when nested inside another block, whose workspace\r\n // context shadows the document workspace under the shared 'UmbWorkspaceContext'\r\n // alias).\r\n #unique = new UmbStringState('');\r\n #documentTypeUnique = new UmbStringState('');\r\n\r\n constructor(host: UmbControllerHost) {\r\n super(host);\r\n }\r\n\r\n getUnique(): string {\r\n return this.#unique.getValue();\r\n }\r\n\r\n async setUnique(unique: string) {\r\n if (unique !== '') {\r\n this.#unique.setValue(unique);\r\n }\r\n }\r\n\r\n getDocumentTypeUnique(): string {\r\n return this.#documentTypeUnique.getValue();\r\n }\r\n\r\n async setDocumentTypeUnique(documentTypeUnique: string) {\r\n if (documentTypeUnique !== '') {\r\n this.#documentTypeUnique.setValue(documentTypeUnique);\r\n }\r\n }\r\n\r\n getOrCreateStylesheet(href: string): Promise {\r\n const cached = this.#stylesheetCache.get(href);\r\n if (cached) return cached;\r\n\r\n const promise = fetch(href)\r\n .then(response => response.text())\r\n .then(css => {\r\n const sheet = new CSSStyleSheet();\r\n sheet.replaceSync(css);\r\n return sheet;\r\n });\r\n this.#stylesheetCache.set(href, promise);\r\n return promise;\r\n }\r\n\r\n}\r\n\r\nexport default BlockPreviewContext;\r\n","// ManifestGlobalContext is only available in extension-registry, not extension-api\r\nimport { ManifestGlobalContext } from \"@umbraco-cms/backoffice/extension-registry\";\r\n\r\nconst contexts: Array = [\r\n {\r\n type: 'globalContext',\r\n alias: 'BlockPreview.Context',\r\n name: 'BlockPreview Context',\r\n js: () => import('./block-preview.context.ts')\r\n }\r\n]\r\n\r\nexport const manifests = contexts;\r\n","import type { ManifestLocalization } from '@umbraco-cms/backoffice/localization';\r\n\r\nconst localizations: Array = [\r\n {\r\n type: 'localization',\r\n alias: 'BlockPreview.Localization.En',\r\n name: 'BlockPreview English Localization',\r\n meta: {\r\n culture: 'en',\r\n },\r\n js: () => import('./en.ts'),\r\n },\r\n];\r\n\r\nexport const manifests = localizations;\r\n","import { UMB_AUTH_CONTEXT } from '@umbraco-cms/backoffice/auth';\r\nimport { ManifestBlockEditorCustomView } from '@umbraco-cms/backoffice/block-custom-view';\r\nimport { UmbEntryPointOnInit } from '@umbraco-cms/backoffice/extension-api';\r\n\r\nimport { client } from './api/index.ts';\r\nimport { BlockGridPreviewCustomView, BlockListPreviewCustomView, BlockSinglePreviewCustomView, RichTextPreviewCustomView } from './blockEditor';\r\nimport { BLOCK_PREVIEW_CONTEXT } from './context/block-preview.context-token.ts';\r\nimport BlockPreviewContext from './context/block-preview.context.ts';\r\nimport { manifests as contextManifests } from './context/manifests.ts';\r\nimport { manifests as localizationManifests } from './localization/manifests.ts';\r\nimport { SettingsRepository } from './repository';\r\n\r\nexport * from './blockEditor';\r\nexport * from './repository';\r\n\r\nexport const onInit: UmbEntryPointOnInit = async (host, extensionRegistry) => {\r\n\r\n host.consumeContext(UMB_AUTH_CONTEXT, async (authContext) => {\r\n if (!authContext) return;\r\n\r\n const config = authContext.getOpenApiConfiguration();\r\n\r\n client.setConfig({\r\n baseUrl: config?.base ?? \"\",\r\n auth: config?.token ?? undefined,\r\n credentials: config?.credentials ?? \"same-origin\",\r\n });\r\n\r\n client.interceptors.request.use(async (request, _options) => {\r\n const token = await config.token();\r\n request.headers.set('Authorization', `Bearer ${token}`);\r\n return request;\r\n });\r\n\r\n const settingsRepository = new SettingsRepository(host);\r\n const settings = await settingsRepository.getSettings();\r\n\r\n let customViewManifests: ManifestBlockEditorCustomView[] = [];\r\n\r\n if (settings) {\r\n if (settings.blockGrid.enabled) {\r\n let blockGridManifest: ManifestBlockEditorCustomView = {\r\n type: 'blockEditorCustomView',\r\n alias: 'BlockPreview.GridCustomView',\r\n name: 'BlockPreview Grid Custom View',\r\n element: BlockGridPreviewCustomView,\r\n forBlockEditor: 'block-grid'\r\n };\r\n\r\n if (settings.blockGrid.contentTypes?.length !== 0) {\r\n blockGridManifest.forContentTypeAlias = settings.blockGrid.contentTypes as string[];\r\n }\r\n\r\n customViewManifests.push(blockGridManifest);\r\n }\r\n\r\n if (settings.blockList.enabled) {\r\n let blockListManifest: ManifestBlockEditorCustomView = {\r\n type: 'blockEditorCustomView',\r\n alias: 'BlockPreview.ListCustomView',\r\n name: 'BlockPreview List Custom View',\r\n element: BlockListPreviewCustomView,\r\n forBlockEditor: 'block-list'\r\n };\r\n\r\n if (settings.blockList.contentTypes?.length !== 0) {\r\n blockListManifest.forContentTypeAlias = settings.blockList.contentTypes as string[];\r\n }\r\n\r\n customViewManifests.push(blockListManifest);\r\n }\r\n\r\n if (settings.singleBlock.enabled) {\r\n let singleBlockManifest: ManifestBlockEditorCustomView = {\r\n type: 'blockEditorCustomView',\r\n alias: 'BlockPreview.SingleBlockCustomView',\r\n name: 'BlockPreview Single Block Custom View',\r\n element: BlockSinglePreviewCustomView,\r\n forBlockEditor: 'block-single'\r\n };\r\n\r\n if (settings.singleBlock.contentTypes?.length !== 0) {\r\n singleBlockManifest.forContentTypeAlias = settings.singleBlock.contentTypes as string[];\r\n }\r\n\r\n customViewManifests.push(singleBlockManifest);\r\n }\r\n\r\n if (settings.richText.enabled) {\r\n let richTextManifest: ManifestBlockEditorCustomView = {\r\n type: 'blockEditorCustomView',\r\n alias: 'BlockPreview.RichTextCustomView',\r\n name: 'BlockPreview Rich Text Custom View',\r\n element: RichTextPreviewCustomView,\r\n forBlockEditor: 'block-rte'\r\n };\r\n\r\n if (settings.richText.contentTypes?.length !== 0) {\r\n richTextManifest.forContentTypeAlias = settings.richText.contentTypes as string[];\r\n }\r\n\r\n customViewManifests.push(richTextManifest);\r\n }\r\n }\r\n\r\n extensionRegistry.registerMany([\r\n ...customViewManifests,\r\n ...contextManifests,\r\n ...localizationManifests\r\n ]);\r\n\r\n host.provideContext(BLOCK_PREVIEW_CONTEXT, new BlockPreviewContext(host));\r\n });\r\n};"],"names":["jsonBodySerializer","body","_key","value","createSseClient","onRequest","onSseError","onSseEvent","responseTransformer","responseValidator","sseDefaultRetryDelay","sseMaxRetryAttempts","sseMaxRetryDelay","sseSleepFn","url","options","lastEventId","sleep","ms","resolve","retryDelay","attempt","signal","headers","requestInit","request","response","reader","buffer","abortHandler","done","chunks","chunk","lines","dataLines","eventName","line","parsed","data","parsedJson","rawData","error","backoff","separatorArrayExplode","style","separatorArrayNoExplode","separatorObjectExplode","serializeArrayParam","allowReserved","explode","name","joinedValues","v","separator","serializePrimitiveParam","serializeObjectParam","valueOnly","values","key","PATH_PARAM_RE","defaultPathSerializer","path","_url","matches","match","replaceValue","getUrl","baseUrl","query","querySerializer","pathUrl","search","getValidRequestBody","hasBody","getAuthToken","auth","callback","token","createQuerySerializer","array","object","queryParams","serializedArray","serializedObject","serializedPrimitive","getParseAs","contentType","cleanContent","type","checkForExistence","setAuthParams","security","buildUrl","mergeConfigs","a","b","config","mergeHeaders","headersEntries","entries","mergedHeaders","header","iterator","Interceptors","id","index","fn","createInterceptors","defaultQuerySerializer","defaultHeaders","createConfig","override","createClient","_config","getConfig","setConfig","interceptors","beforeRequest","opts","_fetch","result","parseAs","emptyData","textError","jsonError","finalError","makeMethodFn","method","makeSseFn","init","client","BlockPreviewService","BLOCK_PREVIEW_CONTEXT","UmbContextToken","BlockPreviewBaseElement","UmbLitElement","context","_changedProperties","UMB_PROPERTY_DATASET_CONTEXT","instance","unique","documentTypeUnique","UMB_BLOCK_WORKSPACE_CONTEXT","contentTypeUniques","sheets","href","shadowRoot","requestId","UmbApiError","event","dx","dy","interactiveElements","x","UUIButtonElement","blockPreviewEdit","html","ifDefined","unsafeHTML","nothing","css","__decorateClass","property","val","old","state","PreviewDataSource","#host","host","tryExecute","SettingsDataSource","SettingsRepository","UmbControllerBase","#settingsDataSource","settings","_previewDataSource","_BlockGridPreviewCustomView_instances","observeContentWorkspace_fn","_managerObserved","_layoutResizeTimer","observeBlockPropertyValue_fn","filterLayouts_fn","elementName","BlockGridPreviewCustomView","__privateAdd","__privateSet","buildUpValue","__privateMethod","UMB_BLOCK_GRID_ENTRY_CONTEXT","observeMultiple","contentUdi","settingsUdi","workspaceEditContentPath","contentElementTypeAlias","contentElementTypeKey","areas","layout","layoutAreas","prevColumnSpan","prevRowSpan","prevLayoutAreas","__privateGet","UMB_CONTENT_WORKSPACE_CONTEXT","UMB_BLOCK_GRID_MANAGER_CONTEXT","contents","exposes","propertyAlias","area","customElement","_BlockListPreviewCustomView_instances","BlockListPreviewCustomView","UMB_BLOCK_LIST_ENTRY_CONTEXT","UMB_BLOCK_LIST_MANAGER_CONTEXT","layouts","_BlockSinglePreviewCustomView_instances","BlockSinglePreviewCustomView","UMB_BLOCK_SINGLE_ENTRY_CONTEXT","UMB_BLOCK_SINGLE_MANAGER_CONTEXT","_RichTextPreviewCustomView_instances","observeDocumentWorkspace_fn","_entryObserved","RichTextPreviewCustomView","UMB_BLOCK_RTE_ENTRY_CONTEXT","UMB_DOCUMENT_WORKSPACE_CONTEXT","UMB_BLOCK_RTE_MANAGER_CONTEXT","BlockPreviewRequestQueue","#maxConcurrent","#activeCount","#queue","maxConcurrent","task","BlockPreviewContext","#requestQueue","#stylesheetCache","#unique","UmbStringState","#documentTypeUnique","cached","promise","sheet","contexts","blockPreview_context","manifests","localizations","onInit","extensionRegistry","UMB_AUTH_CONTEXT","authContext","_options","customViewManifests","blockGridManifest","blockListManifest","singleBlockManifest","richTextManifest","contextManifests","localizationManifests"],"mappings":"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"} \ No newline at end of file diff --git a/src/Umbraco.Community.BlockPreview/wwwroot/App_Plugins/Umbraco.Community.BlockPreview/umbraco-package.json b/src/Umbraco.Community.BlockPreview/wwwroot/App_Plugins/Umbraco.Community.BlockPreview/umbraco-package.json index f045004..2df5101 100644 --- a/src/Umbraco.Community.BlockPreview/wwwroot/App_Plugins/Umbraco.Community.BlockPreview/umbraco-package.json +++ b/src/Umbraco.Community.BlockPreview/wwwroot/App_Plugins/Umbraco.Community.BlockPreview/umbraco-package.json @@ -2,14 +2,14 @@ "$schema": "../umbraco-package-schema.json", "name": "Umbraco.Community.BlockPreview", "id": "Umbraco.Community.BlockPreview", - "version": "5.4.0", + "version": "5.5.0-alpha", "allowTelemetry": true, "extensions": [ { "name": "Umbraco.Community.BlockPreview.EntryPoint", "alias": "Umbraco.Community.BlockPreview.EntryPoint", "type": "backofficeEntryPoint", - "js": "/App_Plugins/Umbraco.Community.BlockPreview/index.js?v=5.4.0" + "js": "/App_Plugins/Umbraco.Community.BlockPreview/index.js?v=5.5.0-alpha" } ] } \ No newline at end of file