@nordcraft/runtime 1.0.76 → 1.0.77

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../node_modules/.bun/fast-deep-equal@3.1.3/node_modules/fast-deep-equal/index.js", "../../lib/actions.ts", "../../lib/actions/deleteFromSessionStorage/handler.ts", "../../lib/actions/saveToLocalStorage/handler.ts", "../../lib/actions/interval/handler.ts", "../../core/src/utils/util.ts", "../../lib/actions/deleteFromLocalStorage/handler.ts", "../../lib/actions/setSessionCookies/handler.ts", "../../lib/actions/clearLocalStorage/handler.ts", "../../lib/actions/clearSessionStorage/handler.ts", "../../lib/actions/logToConsole/handler.ts", "../../lib/actions/setHttpOnlyCookie/handler.ts", "../../lib/actions/saveToSessionStorage/handler.ts", "../../lib/actions/copyToClipboard/handler.ts", "../../lib/actions/stopPropagation/handler.ts", "../../lib/actions/setCookie/handler.ts", "../../lib/actions/focus/handler.ts", "../../lib/actions/preventDefault/handler.ts", "../../lib/actions/share/handler.ts", "../../lib/actions/sleep/handler.ts", "../../lib/actions/gotToURL/handler.ts", "../../lib/formulas.ts", "../../lib/formulas/string/handler.ts", "../../lib/formulas/languages/handler.ts", "../../lib/formulas/matches/handler.ts", "../../lib/formulas/decodeURIComponent/handler.ts", "../../lib/formulas/logarithm/handler.ts", "../../lib/formulas/boolean/handler.ts", "../../lib/formulas/capitalize/handler.ts", "../../lib/formulas/power/handler.ts", "../../lib/formulas/encodeURIComponent/handler.ts", "../../lib/formulas/encodeBase64/handler.ts", "../../lib/formulas/encodeJSON/handler.ts", "../../lib/formulas/takeLast/handler.ts", "../../lib/formulas/dateFromTimestamp/handler.ts", "../../lib/formulas/join/handler.ts", "../../lib/formulas/clamp/handler.ts", "../../lib/formulas/roundDown/handler.ts", "../../lib/formulas/minus/handler.ts", "../../lib/formulas/sort_by/handler.ts", "../../lib/formulas/map/handler.ts", "../../lib/formulas/every/handler.ts", "../../lib/formulas/sum/handler.ts", "../../lib/formulas/randomNumber/handler.ts", "../../lib/formulas/squareRoot/handler.ts", "../../lib/formulas/formatDate/handler.ts", "../../lib/formulas/modulo/handler.ts", "../../lib/formulas/now/handler.ts", "../../lib/formulas/prepend/handler.ts", "../../lib/formulas/groupBy/handler.ts", "../../lib/formulas/last/handler.ts", "../../lib/formulas/parseJSON/handler.ts", "../../core/src/utils/json.ts", "../../lib/formulas/uppercase/handler.ts", "../../lib/formulas/round/handler.ts", "../../lib/formulas/dropLast/handler.ts", "../../lib/formulas/canShare/handler.ts", "../../lib/formulas/fromEntries/handler.ts", "../../lib/formulas/greaterThan/handler.ts", "../../lib/formulas/includes/handler.ts", "../../lib/formulas/absolute/handler.ts", "../../lib/formulas/isServer/handler.ts", "../../lib/formulas/parseURL/handler.ts", "../../lib/formulas/lessOrEqual/handler.ts", "../../lib/formulas/typeOf/handler.ts", "../../lib/formulas/findLast/handler.ts", "../../lib/formulas/lessThan/handler.ts", "../../lib/formulas/append/handler.ts", "../../lib/formulas/getFromSessionStorage/handler.ts", "../../lib/formulas/unique/handler.ts", "../../lib/formulas/concatenate/handler.ts", "../../lib/formulas/take/handler.ts", "../../lib/formulas/get/handler.ts", "../../lib/formulas/lowercase/handler.ts", "../../lib/formulas/equals/handler.ts", "../../lib/formulas/first/handler.ts", "../../lib/formulas/json/handler.ts", "../../lib/formulas/max/handler.ts", "../../lib/formulas/dateFromString/handler.ts", "../../lib/formulas/deleteKey/handler.ts", "../../lib/formulas/min/handler.ts", "../../lib/formulas/reverse/handler.ts", "../../lib/formulas/branchName/handler.ts", "../../lib/formulas/greaterOrEqueal/handler.ts", "../../lib/formulas/size/handler.ts", "../../lib/formulas/reduce/handler.ts", "../../lib/formulas/set/handler.ts", "../../lib/formulas/some/handler.ts", "../../lib/formulas/entries/handler.ts", "../../lib/formulas/flatten/handler.ts", "../../lib/formulas/drop/handler.ts", "../../lib/formulas/divide/handler.ts", "../../lib/formulas/find/handler.ts", "../../lib/formulas/filter/handler.ts", "../../lib/formulas/getFromLocalStorage/handler.ts", "../../lib/formulas/number/handler.ts", "../../lib/formulas/shuffle/handler.ts", "../../lib/formulas/add/handler.ts", "../../lib/formulas/defaultTo/handler.ts", "../../lib/formulas/roundUp/handler.ts", "../../lib/formulas/lastIndexOf/handler.ts", "../../lib/formulas/timestamp/handler.ts", "../../lib/formulas/getCookie/handler.ts", "../../lib/formulas/indexOf/handler.ts", "../../lib/formulas/currentURL/handler.ts", "../../lib/formulas/replaceAll/handler.ts", "../../lib/formulas/getElementById/handler.ts", "../../lib/formulas/userAgent/handler.ts", "../../lib/formulas/startsWith/handler.ts", "../../lib/formulas/getHttpOnlyCookie/handler.ts", "../../core/src/api/template.ts", "../../lib/formulas/multiply/handler.ts", "../../lib/formulas/findIndex/handler.ts", "../../lib/formulas/range/handler.ts", "../../lib/formulas/trim/handler.ts", "../../lib/formulas/not/handler.ts", "../../lib/formulas/formatNumber/handler.ts", "../../lib/formulas/notEqual/handler.ts", "../../lib/formulas/keyBy/handler.ts", "../../lib/formulas/decodeBase64/handler.ts", "../../lib/formulas/split/handler.ts", "../src/custom-element.main.ts", "../../core/src/utils/customElements.ts", "../../core/src/formula/formula.ts", "../../core/src/utils/collections.ts", "../../core/src/utils/hash.ts", "../../core/src/api/apiTypes.ts", "../../core/src/api/headers.ts", "../../core/src/formula/formulaUtils.ts", "../../core/src/api/LegacyToddleApi.ts", "../../core/src/component/actionUtils.ts", "../../core/src/api/ToddleApiV2.ts", "../../core/src/api/api.ts", "../../core/src/styling/hash.ts", "../../core/src/styling/className.ts", "../../core/src/styling/customProperty.ts", "../../core/src/styling/theme.const.ts", "../../core/src/styling/theme.ts", "../../core/src/styling/variantSelector.ts", "../../core/src/styling/style.css.ts", "../src/api/apiUtils.ts", "../src/events/handleAction.ts", "../../../node_modules/.bun/path-to-regexp@6.3.0/node_modules/path-to-regexp/src/index.ts", "../src/utils/url.ts", "../src/api/createAPI.ts", "../../core/src/utils/url.ts", "../src/api/createAPIv2.ts", "../src/components/renderComponent.ts", "../src/utils/BatchQueue.ts", "../src/signal/signal.ts", "../src/utils/nodes.ts", "../../core/src/utils/getNodeSelector.ts", "../src/context/isContextProvider.ts", "../src/context/subscribeToContext.ts", "../src/debug/logState.ts", "../src/utils/createFormulaCache.ts", "../src/styles/CustomPropertyStyleSheet.ts", "../src/utils/subscribeCustomProperty.ts", "../src/components/createComponent.ts", "../src/utils/getDragData.ts", "../src/utils/getElementTagName.ts", "../src/utils/setAttribute.ts", "../src/components/createElement.ts", "../src/components/createSlot.ts", "../src/components/createText.ts", "../src/components/createNode.ts", "../src/custom-element/ToddleComponent.ts", "../src/custom-element/defineComponents.ts"],
4
- "sourcesContent": ["'use strict';\n\n// do not edit .js files directly - edit src/index.jst\n\n\n\nmodule.exports = function equal(a, b) {\n if (a === b) return true;\n\n if (a && b && typeof a == 'object' && typeof b == 'object') {\n if (a.constructor !== b.constructor) return false;\n\n var length, i, keys;\n if (Array.isArray(a)) {\n length = a.length;\n if (length != b.length) return false;\n for (i = length; i-- !== 0;)\n if (!equal(a[i], b[i])) return false;\n return true;\n }\n\n\n\n if (a.constructor === RegExp) return a.source === b.source && a.flags === b.flags;\n if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf();\n if (a.toString !== Object.prototype.toString) return a.toString() === b.toString();\n\n keys = Object.keys(a);\n length = keys.length;\n if (length !== Object.keys(b).length) return false;\n\n for (i = length; i-- !== 0;)\n if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false;\n\n for (i = length; i-- !== 0;) {\n var key = keys[i];\n\n if (!equal(a[key], b[key])) return false;\n }\n\n return true;\n }\n\n // true if both NaN, false otherwise\n return a!==a && b!==b;\n};\n", "import * as deleteFromSessionStorage from \"./actions/deleteFromSessionStorage/handler\"\nimport * as saveToLocalStorage from \"./actions/saveToLocalStorage/handler\"\nimport * as interval from \"./actions/interval/handler\"\nimport * as deleteFromLocalStorage from \"./actions/deleteFromLocalStorage/handler\"\nimport * as setSessionCookies from \"./actions/setSessionCookies/handler\"\nimport * as clearLocalStorage from \"./actions/clearLocalStorage/handler\"\nimport * as clearSessionStorage from \"./actions/clearSessionStorage/handler\"\nimport * as logToConsole from \"./actions/logToConsole/handler\"\nimport * as setHttpOnlyCookie from \"./actions/setHttpOnlyCookie/handler\"\nimport * as saveToSessionStorage from \"./actions/saveToSessionStorage/handler\"\nimport * as copyToClipboard from \"./actions/copyToClipboard/handler\"\nimport * as stopPropagation from \"./actions/stopPropagation/handler\"\nimport * as setCookie from \"./actions/setCookie/handler\"\nimport * as focus from \"./actions/focus/handler\"\nimport * as preventDefault from \"./actions/preventDefault/handler\"\nimport * as share from \"./actions/share/handler\"\nimport * as sleep from \"./actions/sleep/handler\"\nimport * as gotToURL from \"./actions/gotToURL/handler\"\n\nexport {\n deleteFromSessionStorage,\n saveToLocalStorage,\n interval,\n deleteFromLocalStorage,\n setSessionCookies,\n clearLocalStorage,\n clearSessionStorage,\n logToConsole,\n setHttpOnlyCookie,\n saveToSessionStorage,\n copyToClipboard,\n stopPropagation,\n setCookie,\n focus,\n preventDefault,\n share,\n sleep,\n gotToURL\n}\n ", "import type { ActionHandler } from '@nordcraft/core/dist/types'\n\nconst handler: ActionHandler = async function ([key]) {\n if (typeof key !== 'string' || key.length === 0) {\n throw new Error(`Invalid key: ${key}`)\n }\n window.sessionStorage.removeItem(key)\n}\n\nexport default handler\n", "import type { ActionHandler } from '@nordcraft/core/dist/types'\n\nconst handler: ActionHandler = async function ([key, value]) {\n if (typeof key !== 'string' || key.length === 0) {\n throw new Error(`Invalid key: ${key}`)\n }\n window.localStorage.setItem(key, JSON.stringify(value))\n}\n\nexport default handler\n", "import type { ActionHandler } from '@nordcraft/core/dist/types'\nimport { isDefined } from '@nordcraft/core/dist/utils/util'\n\nconst handler: ActionHandler = ([delay], ctx) => {\n // We'll cast delay in case it's passed as a string\n const delayNumber = Number(delay)\n if (!isDefined(delay) || Number.isNaN(delay)) {\n throw new Error('Invalid delay value')\n }\n const interval = setInterval(\n () => ctx.triggerActionEvent('tick', null),\n delayNumber,\n )\n ctx.abortSignal.addEventListener('abort', () => {\n clearInterval(interval)\n })\n}\n\nexport default handler\n", "export const isDefined = <T>(value: T | undefined | null): value is T =>\n value !== null && value !== undefined\n\nexport const isObject = (input: any): input is Record<string, any> =>\n typeof input === 'object' && input !== null\n\nexport const toBoolean = (value: any) =>\n value !== false && value !== undefined && value !== null\n", "import type { ActionHandler } from '@nordcraft/core/dist/types'\n\nconst handler: ActionHandler = async function ([key]) {\n if (typeof key !== 'string' || key.length === 0) {\n throw new Error(`Invalid key: ${key}`)\n }\n window.localStorage.removeItem(key)\n}\n\nexport default handler\n", "import type { ActionHandler } from '@nordcraft/core/dist/types'\n\nconst handler: ActionHandler = async function ([access_token, ttl], ctx) {\n const query = [\n typeof access_token === 'string'\n ? `name=access_token&value=${encodeURIComponent(access_token)}`\n : undefined,\n isNaN(Number(ttl)) ? undefined : `ttl=${ttl}`,\n ]\n .filter((a) => a)\n .join('&')\n const res = await fetch(`/.toddle/cookies/set-session-cookie?${query}`)\n if (res.ok) {\n ctx.triggerActionEvent('Success', undefined)\n } else {\n ctx.triggerActionEvent('Error', new Error(await res.text()))\n }\n}\n\nexport default handler\n", "import type { ActionHandler } from '@nordcraft/core/dist/types'\n\nconst handler: ActionHandler = async function () {\n window.localStorage.clear()\n}\n\nexport default handler\n", "import type { ActionHandler } from '@nordcraft/core/dist/types'\n\nconst handler: ActionHandler = async function () {\n window.sessionStorage.clear()\n}\n\nexport default handler\n", "import type { ActionHandler } from '@nordcraft/core/dist/types'\n\nconst handler: ActionHandler = ([label, data]: unknown[]) => {\n // eslint-disable-next-line no-console\n console.log(label, data)\n}\n\nexport default handler\n", "import type { ActionHandler } from '@nordcraft/core/dist/types'\n\nconst handler: ActionHandler = async function (\n [name, value, ttl, _sameSite, _path, _includeSubdomains],\n ctx,\n) {\n const error = (message: string) =>\n ctx.triggerActionEvent('Error', new Error(message))\n\n if (typeof name !== 'string') {\n error('The \"Name\" argument must be a string')\n return\n }\n if (typeof value !== 'string') {\n error('The \"Value\" argument must be a string')\n return\n }\n const sameSite = _sameSite ?? 'Lax' // Default value\n if (\n typeof sameSite !== 'string' ||\n !['lax', 'strict', 'none'].includes(sameSite.toLocaleLowerCase())\n ) {\n error('The \"SameSite\" argument must be \"Lax\", \"Strict\" or \"None\"')\n return\n }\n const path = _path ?? '/' // Default value\n if (typeof path !== 'string' || !path.startsWith('/')) {\n error('The \"Path\" argument must be a string and start with /')\n return\n }\n if (\n ttl !== undefined &&\n ttl !== null &&\n (typeof ttl !== 'number' || isNaN(ttl))\n ) {\n error('The \"Expires in\" argument must be a number')\n return\n }\n const includeSubdomains = _includeSubdomains ?? true // Default value\n if (typeof includeSubdomains !== 'boolean') {\n error('The \"Include Subdomains\" argument must be a boolean')\n return\n }\n const params = new URLSearchParams()\n params.set('name', name)\n params.set('value', value)\n params.set('sameSite', sameSite)\n params.set('path', path)\n params.set('includeSubdomains', String(includeSubdomains))\n if (typeof ttl === 'number') {\n params.set('ttl', String(ttl))\n }\n try {\n const res = await fetch(\n `/.nordcraft/cookies/set-cookie?${params.toString()}`,\n )\n if (res.ok) {\n ctx.triggerActionEvent('Success', undefined)\n } else {\n error(await res.text())\n }\n } catch (err) {\n error(err instanceof Error ? err.message : 'An unexpected error occurred')\n }\n}\n\nexport default handler\n", "import type { ActionHandler } from '@nordcraft/core/dist/types'\n\nconst handler: ActionHandler = async function ([key, value]) {\n if (typeof key !== 'string' || key.length === 0) {\n throw new Error(`Invalid key: ${key}`)\n }\n window.sessionStorage.setItem(key, JSON.stringify(value))\n}\n\nexport default handler\n", "import type { ActionHandler } from '@nordcraft/core/dist/types'\n\nconst handler: ActionHandler = ([value]) => {\n if (typeof value !== 'string') {\n throw new Error(`Input value must be a string`)\n }\n return navigator.clipboard.writeText(value)\n}\n\nexport default handler\n", "import type { ActionHandler } from '@nordcraft/core/dist/types'\n\nconst handler: ActionHandler = (_, _ctx, event) => {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n event?.stopPropagation?.()\n}\n\nexport default handler\n", "import type { ActionHandler } from '@nordcraft/core/dist/types'\n\nconst handler: ActionHandler = async function (\n [name, value, ttl, _sameSite, _path, _includeSubdomains],\n ctx,\n) {\n const error = (message: string) =>\n ctx.triggerActionEvent('Error', new Error(message))\n if (typeof name !== 'string') {\n error('The \"Name\" argument must be a string')\n return\n }\n if (typeof value !== 'string') {\n error('The \"Value\" argument must be a string')\n return\n }\n const sameSite = _sameSite ?? 'Lax' // Default value\n if (\n typeof sameSite !== 'string' ||\n !['lax', 'strict', 'none'].includes(sameSite.toLocaleLowerCase())\n ) {\n error('The \"SameSite\" argument must be \"Lax\", \"Strict\" or \"None\"')\n return\n }\n const path = _path ?? '/' // Default value\n if (typeof path !== 'string' || !path.startsWith('/')) {\n error('The \"Path\" argument must be a string and start with /')\n return\n }\n if (\n ttl !== undefined &&\n ttl !== null &&\n (typeof ttl !== 'number' || isNaN(ttl))\n ) {\n error('The \"Expires in\" argument must be a number')\n return\n }\n const includeSubdomains = _includeSubdomains ?? true // Default value\n if (typeof includeSubdomains !== 'boolean') {\n error('The \"Include Subdomains\" argument must be a boolean')\n return\n }\n // The cookie will always be set to Secure. Anything else can be configured\n let cookie = `${name}=${value}; SameSite=${sameSite}; Path=${path}`\n // If no ttl is set, the cookie will be a session cookie\n if (typeof ttl === 'number') {\n const date = new Date(Date.now() + ttl * 1000)\n cookie += `; Expires=${date.toUTCString()}`\n }\n if (includeSubdomains) {\n // When the domain is set, the cookie is also available to subdomains - otherwise\n // it is only available on the current domain\n cookie += `; Domain=${window.location.hostname}`\n }\n document.cookie = cookie\n ctx.triggerActionEvent('Success', undefined)\n}\n\nexport default handler\n", "import type { ActionHandler } from '@nordcraft/core/dist/types'\n\nconst handler: ActionHandler = ([elem]) => {\n if (elem instanceof HTMLElement) {\n elem.focus()\n }\n}\n\nexport default handler\n", "import type { ActionHandler } from '@nordcraft/core/dist/types'\n\nconst handler: ActionHandler = (_, _ctx, event) => {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n event?.preventDefault?.()\n}\n\nexport default handler\n", "import type { ActionHandler } from '@nordcraft/core/dist/types'\nimport { isDefined } from '@nordcraft/core/dist/utils/util'\n\nconst handler: ActionHandler = ([url, title, text]) => {\n const validInput = (value: any): value is string =>\n isDefined(value) && typeof value === 'string'\n if (!validInput(url) && !validInput(title) && !validInput(text)) {\n throw new Error(`Either url, text or title must be provided`)\n }\n const data: ShareData = {}\n if (validInput(title)) {\n data.title = title\n }\n if (validInput(text)) {\n data.text = text\n }\n if (validInput(url)) {\n data.url = url\n }\n // Later we can add support for data.files as well\n if (isDefined(navigator.share) && navigator.canShare(data)) {\n return navigator.share(data)\n }\n}\n\nexport default handler\n", "import type { ActionHandler } from '@nordcraft/core/dist/types'\nimport { isDefined } from '@nordcraft/core/dist/utils/util'\n\nconst handler: ActionHandler = ([delay], ctx) => {\n // We'll cast delay in case it's passed as a string\n const delayNumber = Number(delay)\n if (!isDefined(delay) || Number.isNaN(delay)) {\n throw new Error('Invalid delay value')\n }\n const timeout = setTimeout(\n () => ctx.triggerActionEvent('tick', null),\n delayNumber,\n )\n ctx.abortSignal.addEventListener('abort', () => {\n clearTimeout(timeout)\n })\n}\n\nexport default handler\n", "import type { ActionHandler } from '@nordcraft/core/dist/types'\n\nconst handler: ActionHandler = ([url], ctx) => {\n if (typeof url === 'string') {\n if (ctx.env.runtime === 'preview') {\n // Attempt to notify the parent about the failed navigation attempt\n window.parent?.postMessage({ type: 'blockedNavigation', url }, '*')\n } else {\n window.location.href = url\n }\n }\n}\n\nexport default handler\n", "import * as string from \"./formulas/string/handler\"\nimport * as languages from \"./formulas/languages/handler\"\nimport * as matches from \"./formulas/matches/handler\"\nimport * as decodeURIComponent from \"./formulas/decodeURIComponent/handler\"\nimport * as logarithm from \"./formulas/logarithm/handler\"\nimport * as boolean from \"./formulas/boolean/handler\"\nimport * as capitalize from \"./formulas/capitalize/handler\"\nimport * as power from \"./formulas/power/handler\"\nimport * as encodeURIComponent from \"./formulas/encodeURIComponent/handler\"\nimport * as encodeBase64 from \"./formulas/encodeBase64/handler\"\nimport * as encodeJSON from \"./formulas/encodeJSON/handler\"\nimport * as takeLast from \"./formulas/takeLast/handler\"\nimport * as dateFromTimestamp from \"./formulas/dateFromTimestamp/handler\"\nimport * as join from \"./formulas/join/handler\"\nimport * as clamp from \"./formulas/clamp/handler\"\nimport * as roundDown from \"./formulas/roundDown/handler\"\nimport * as minus from \"./formulas/minus/handler\"\nimport * as sort_by from \"./formulas/sort_by/handler\"\nimport * as map from \"./formulas/map/handler\"\nimport * as every from \"./formulas/every/handler\"\nimport * as sum from \"./formulas/sum/handler\"\nimport * as randomNumber from \"./formulas/randomNumber/handler\"\nimport * as squareRoot from \"./formulas/squareRoot/handler\"\nimport * as formatDate from \"./formulas/formatDate/handler\"\nimport * as modulo from \"./formulas/modulo/handler\"\nimport * as now from \"./formulas/now/handler\"\nimport * as prepend from \"./formulas/prepend/handler\"\nimport * as groupBy from \"./formulas/groupBy/handler\"\nimport * as last from \"./formulas/last/handler\"\nimport * as parseJSON from \"./formulas/parseJSON/handler\"\nimport * as uppercase from \"./formulas/uppercase/handler\"\nimport * as round from \"./formulas/round/handler\"\nimport * as dropLast from \"./formulas/dropLast/handler\"\nimport * as canShare from \"./formulas/canShare/handler\"\nimport * as fromEntries from \"./formulas/fromEntries/handler\"\nimport * as greaterThan from \"./formulas/greaterThan/handler\"\nimport * as includes from \"./formulas/includes/handler\"\nimport * as absolute from \"./formulas/absolute/handler\"\nimport * as isServer from \"./formulas/isServer/handler\"\nimport * as parseURL from \"./formulas/parseURL/handler\"\nimport * as lessOrEqual from \"./formulas/lessOrEqual/handler\"\nimport * as typeOf from \"./formulas/typeOf/handler\"\nimport * as findLast from \"./formulas/findLast/handler\"\nimport * as lessThan from \"./formulas/lessThan/handler\"\nimport * as append from \"./formulas/append/handler\"\nimport * as getFromSessionStorage from \"./formulas/getFromSessionStorage/handler\"\nimport * as unique from \"./formulas/unique/handler\"\nimport * as concatenate from \"./formulas/concatenate/handler\"\nimport * as take from \"./formulas/take/handler\"\nimport * as get from \"./formulas/get/handler\"\nimport * as lowercase from \"./formulas/lowercase/handler\"\nimport * as equals from \"./formulas/equals/handler\"\nimport * as first from \"./formulas/first/handler\"\nimport * as json from \"./formulas/json/handler\"\nimport * as max from \"./formulas/max/handler\"\nimport * as dateFromString from \"./formulas/dateFromString/handler\"\nimport * as deleteKey from \"./formulas/deleteKey/handler\"\nimport * as min from \"./formulas/min/handler\"\nimport * as reverse from \"./formulas/reverse/handler\"\nimport * as branchName from \"./formulas/branchName/handler\"\nimport * as greaterOrEqueal from \"./formulas/greaterOrEqueal/handler\"\nimport * as size from \"./formulas/size/handler\"\nimport * as reduce from \"./formulas/reduce/handler\"\nimport * as set from \"./formulas/set/handler\"\nimport * as some from \"./formulas/some/handler\"\nimport * as entries from \"./formulas/entries/handler\"\nimport * as flatten from \"./formulas/flatten/handler\"\nimport * as drop from \"./formulas/drop/handler\"\nimport * as divide from \"./formulas/divide/handler\"\nimport * as find from \"./formulas/find/handler\"\nimport * as filter from \"./formulas/filter/handler\"\nimport * as getFromLocalStorage from \"./formulas/getFromLocalStorage/handler\"\nimport * as number from \"./formulas/number/handler\"\nimport * as shuffle from \"./formulas/shuffle/handler\"\nimport * as add from \"./formulas/add/handler\"\nimport * as defaultTo from \"./formulas/defaultTo/handler\"\nimport * as roundUp from \"./formulas/roundUp/handler\"\nimport * as lastIndexOf from \"./formulas/lastIndexOf/handler\"\nimport * as timestamp from \"./formulas/timestamp/handler\"\nimport * as getCookie from \"./formulas/getCookie/handler\"\nimport * as indexOf from \"./formulas/indexOf/handler\"\nimport * as currentURL from \"./formulas/currentURL/handler\"\nimport * as replaceAll from \"./formulas/replaceAll/handler\"\nimport * as getElementById from \"./formulas/getElementById/handler\"\nimport * as userAgent from \"./formulas/userAgent/handler\"\nimport * as startsWith from \"./formulas/startsWith/handler\"\nimport * as getHttpOnlyCookie from \"./formulas/getHttpOnlyCookie/handler\"\nimport * as multiply from \"./formulas/multiply/handler\"\nimport * as findIndex from \"./formulas/findIndex/handler\"\nimport * as range from \"./formulas/range/handler\"\nimport * as trim from \"./formulas/trim/handler\"\nimport * as not from \"./formulas/not/handler\"\nimport * as formatNumber from \"./formulas/formatNumber/handler\"\nimport * as notEqual from \"./formulas/notEqual/handler\"\nimport * as keyBy from \"./formulas/keyBy/handler\"\nimport * as decodeBase64 from \"./formulas/decodeBase64/handler\"\nimport * as split from \"./formulas/split/handler\"\n\nexport {\n string,\n languages,\n matches,\n decodeURIComponent,\n logarithm,\n boolean,\n capitalize,\n power,\n encodeURIComponent,\n encodeBase64,\n encodeJSON,\n takeLast,\n dateFromTimestamp,\n join,\n clamp,\n roundDown,\n minus,\n sort_by,\n map,\n every,\n sum,\n randomNumber,\n squareRoot,\n formatDate,\n modulo,\n now,\n prepend,\n groupBy,\n last,\n parseJSON,\n uppercase,\n round,\n dropLast,\n canShare,\n fromEntries,\n greaterThan,\n includes,\n absolute,\n isServer,\n parseURL,\n lessOrEqual,\n typeOf,\n findLast,\n lessThan,\n append,\n getFromSessionStorage,\n unique,\n concatenate,\n take,\n get,\n lowercase,\n equals,\n first,\n json,\n max,\n dateFromString,\n deleteKey,\n min,\n reverse,\n branchName,\n greaterOrEqueal,\n size,\n reduce,\n set,\n some,\n entries,\n flatten,\n drop,\n divide,\n find,\n filter,\n getFromLocalStorage,\n number,\n shuffle,\n add,\n defaultTo,\n roundUp,\n lastIndexOf,\n timestamp,\n getCookie,\n indexOf,\n currentURL,\n replaceAll,\n getElementById,\n userAgent,\n startsWith,\n getHttpOnlyCookie,\n multiply,\n findIndex,\n range,\n trim,\n not,\n formatNumber,\n notEqual,\n keyBy,\n decodeBase64,\n split\n}\n ", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\n/**\n * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String\n */\nconst handler: FormulaHandler<string> = ([input]) => String(input)\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<readonly string[]> = (_, { env }) => {\n if (!env.isServer) {\n // See https://developer.mozilla.org/en-US/docs/Web/API/Navigator/languages\n return window.navigator.languages\n } else {\n return (\n // See https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Accept-Language\n env.request?.headers['accept-language']\n ?.split(',')\n .map((lang) => lang.split(';')[0] ?? '') ?? []\n )\n }\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\nimport { toBoolean } from '@nordcraft/core/dist/utils/util'\n\nconst handler: FormulaHandler<Array<string>> = ([\n inputString,\n regex,\n globalFlag,\n ignoreCaseFlag,\n multiLineFlag,\n]) => {\n if (typeof inputString !== 'string' || typeof regex !== 'string') {\n return []\n }\n const flags = [\n toBoolean(globalFlag) ? 'g' : '',\n toBoolean(ignoreCaseFlag) ? 'i' : '',\n toBoolean(multiLineFlag) ? 'm' : '',\n ].join('')\n\n const re = new RegExp(regex, flags)\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/match\n return inputString.match(re) ?? []\n}\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<string> = ([URIComponent]) => {\n if (typeof URIComponent !== 'string') {\n return null\n }\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent\n return decodeURIComponent(URIComponent)\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<number> = ([a]) => {\n // Check if input is not a number or is null\n if (typeof a !== 'number' || Number.isNaN(a)) {\n return null\n }\n // Number must be greater than or equal to 0\n if (a < 0) {\n return null\n }\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/log\n return Math.log(a)\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\nimport { toBoolean } from '@nordcraft/core/dist/utils/util'\n\nconst handler: FormulaHandler<boolean> = ([input]) => {\n return toBoolean(input)\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<string> = ([input]) => {\n if (typeof input !== 'string') {\n return null\n }\n const firstChar = input.at(0)\n\n if (input.length === 0 || typeof firstChar !== 'string') {\n return input\n }\n return firstChar.toLocaleUpperCase() + input.substring(1).toLocaleLowerCase()\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<number> = ([a, b]) => {\n if (isNaN(Number(a)) || isNaN(Number(b))) {\n return null\n }\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/pow\n return Number(a) ** Number(b)\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<string> = ([URIComponent]) => {\n if (typeof URIComponent !== 'string') {\n return null\n }\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent\n return encodeURIComponent(URIComponent)\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<string> = ([input]) => {\n if (typeof input !== 'string') {\n return null\n }\n // See https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/btoa\n return btoa(input)\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\nconst handler: FormulaHandler<string> = ([data, indent]) => {\n if (typeof indent !== 'number') {\n return null\n }\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify\n return JSON.stringify(data, null, indent)\n}\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<Array<unknown> | string> = ([list, count]) => {\n if (typeof count !== 'number') {\n return null\n }\n if (Array.isArray(list)) {\n return list.slice(list.length - count)\n }\n if (typeof list === 'string') {\n return list.substring(list.length - count)\n }\n return null\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<Date> = ([timestamp]) => {\n if (typeof timestamp === 'number') {\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/Date\n return new Date(timestamp)\n } else {\n return null\n }\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<string> = ([list, separator]) => {\n if (Array.isArray(list)) {\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/join\n return list.join(String(separator))\n }\n return null\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<number> = ([value, min, max]) => {\n if (typeof value !== 'number') {\n return null\n }\n if (typeof min !== 'number') {\n return null\n }\n if (typeof max !== 'number') {\n return null\n }\n return Math.min(Math.max(value, min), max)\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<number> = ([input, decimals]) => {\n if (typeof input !== 'number') {\n return null\n }\n if (typeof decimals !== 'number') {\n return null\n }\n const multiplier = Math.max(1, Math.pow(10, decimals))\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/floor\n return Math.floor(input * multiplier) / multiplier\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<number> = ([a, b]) => {\n const first = Number(a)\n const second = Number(b)\n if (isNaN(first) || isNaN(second)) {\n return null\n }\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Subtraction\n return first - second\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<Array<unknown>> = ([\n array,\n formula,\n ascending,\n]) => {\n if (!Array.isArray(array)) {\n return null\n }\n if (typeof formula !== 'function') {\n return null\n }\n if (typeof ascending !== 'boolean') {\n return null\n }\n const ascendingModifier = ascending ? 1 : -1\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort\n return [...array].sort((a: any, b: any) => {\n const keyA = formula({ item: a })\n const keyB = formula({ item: b })\n if (Array.isArray(keyA) && Array.isArray(keyB)) {\n for (const i in keyA) {\n if (keyA[i] === keyB[i]) {\n continue\n }\n return (keyA[i] > keyB[i] ? 1 : -1) * ascendingModifier\n }\n return 0\n }\n\n if (keyA === keyB) {\n return 0\n }\n return (keyA > keyB ? 1 : -1) * ascendingModifier\n })\n}\n\nexport default handler\n\nexport const getArgumentInputData = (\n [items]: unknown[],\n argIndex: number,\n input: any,\n) => {\n if (argIndex === 1 && Array.isArray(items)) {\n return { ...input, Args: { item: items[0] } }\n }\n\n return input\n}\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\n/**\n * Similar to https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map\n * but also works for objects\n */\nconst handler: FormulaHandler<Array<unknown> | Record<string, unknown>> = ([\n items,\n fx,\n]) => {\n if (typeof fx !== 'function') {\n return null\n }\n if (Array.isArray(items)) {\n return items.map((item, index) => fx({ item, index }))\n }\n if (items && typeof items === 'object') {\n return Object.fromEntries(\n Object.entries(items).map<any>(([key, value]) => {\n const res = fx({ key, value })\n if ('key' in res && 'value' in res) {\n return [res.key, res.value]\n }\n return null\n }),\n )\n }\n return null\n}\n\nexport const getArgumentInputData = (\n [items]: unknown[],\n argIndex: number,\n input: any,\n) => {\n if (argIndex === 0) {\n return input\n }\n if (Array.isArray(items)) {\n return { ...input, Args: { item: items[0], index: 0 } }\n }\n if (items && typeof items === 'object') {\n const [first] = Object.entries(items)\n if (first) {\n return { ...input, Args: { key: first[0], value: first[1] } }\n }\n }\n return input\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\n/**\n * Similar to https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/every\n * but also works with objects\n */\nexport const handler: FormulaHandler<boolean> = ([items, fx]: unknown[]) => {\n if (typeof fx !== 'function') {\n return null\n }\n if (Array.isArray(items)) {\n return items.every((item, index) => fx({ item, index }))\n }\n if (items && typeof items === 'object') {\n return Object.entries(items).every(([key, value]) => fx({ key, value }))\n }\n return null\n}\n\nexport default handler\n\nexport const getArgumentInputData = (\n [items]: unknown[],\n argIndex: number,\n input: any,\n) => {\n if (argIndex === 0) {\n return input\n }\n\n if (Array.isArray(items)) {\n return { ...input, Args: { item: items[0], index: 0 } }\n }\n if (items && typeof items === 'object') {\n const [first] = Object.entries(items)\n if (first) {\n return { ...input, Args: { key: first[0], value: first[1] } }\n }\n }\n return input\n}\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<number> = ([list]) => {\n if (Array.isArray(list)) {\n let sum = 0\n for (const n of list) {\n if (isNaN(n) || typeof n !== 'number') {\n return null\n }\n sum += n\n }\n return sum\n }\n return null\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<number> = () => {\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random\n return Math.random()\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<number> = ([n]) => {\n if (typeof n !== 'number') {\n return null\n }\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sqrt\n return Math.sqrt(n)\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\n/**\n * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat/DateTimeFormat\n */\nconst handler: FormulaHandler<string> = ([date, loc, opt]) => {\n if (!date || !(date instanceof Date)) {\n return null\n }\n const locales =\n typeof loc === 'string' && loc.length > 0\n ? loc\n : Array.isArray(loc) && loc.every((l) => typeof l === 'string')\n ? (loc as string[])\n : undefined\n if (!opt || typeof opt !== 'object') {\n return Intl.DateTimeFormat(locales).format(date)\n }\n const validateString = <T = string>(\n value: unknown,\n allowedValues?: string[],\n ): T | undefined =>\n typeof value === 'string' && (allowedValues?.includes(value) ?? true)\n ? (value as T)\n : undefined\n\n const options: Partial<\n Intl.DateTimeFormatOptions & { locale: string | string[] }\n > = opt\n const dateStyle = validateString<Intl.DateTimeFormatOptions['dateStyle']>(\n options.dateStyle,\n ['full', 'long', 'medium', 'short'],\n )\n const timeStyle = validateString<Intl.DateTimeFormatOptions['timeStyle']>(\n options.timeStyle,\n ['full', 'long', 'medium', 'short'],\n )\n const calendar = validateString(options.calendar)\n const weekday = validateString<Intl.DateTimeFormatOptions['weekday']>(\n options.weekday,\n ['long', 'short', 'narrow'],\n )\n const era = validateString<Intl.DateTimeFormatOptions['era']>(options.era, [\n 'long',\n 'short',\n 'narrow',\n ])\n const year = validateString<Intl.DateTimeFormatOptions['year']>(\n options.year,\n ['numeric', '2-digit'],\n )\n const month = validateString<Intl.DateTimeFormatOptions['month']>(\n options.month,\n ['long', 'short', 'narrow', 'numeric', '2-digit'],\n )\n const day = validateString<Intl.DateTimeFormatOptions['day']>(options.day, [\n 'numeric',\n '2-digit',\n ])\n const hour = validateString<Intl.DateTimeFormatOptions['hour']>(\n options.hour,\n ['numeric', '2-digit'],\n )\n const minute = validateString<Intl.DateTimeFormatOptions['minute']>(\n options.minute,\n ['numeric', '2-digit'],\n )\n const second = validateString<Intl.DateTimeFormatOptions['second']>(\n options.second,\n ['numeric', '2-digit'],\n )\n const timeZoneName = validateString<\n Intl.DateTimeFormatOptions['timeZoneName']\n >(options.timeZoneName, [\n 'long',\n 'short',\n 'shortOffset',\n 'longOffset',\n 'shortGeneric',\n 'longGeneric',\n ])\n const timeZone = validateString<Intl.DateTimeFormatOptions['timeZone']>(\n options.timeZone,\n )\n const hour12 =\n options.hour12 === true\n ? true\n : options.hour12 === false\n ? false\n : undefined\n\n return Intl.DateTimeFormat(locales, {\n dateStyle,\n timeStyle,\n calendar,\n weekday,\n era,\n year,\n month,\n day,\n hour,\n minute,\n second,\n timeZoneName,\n timeZone,\n hour12,\n }).format(date)\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<number> = ([a, b]) => {\n if (isNaN(Number(a)) || isNaN(Number(b))) {\n return null\n }\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Remainder\n return Number(a) % Number(b)\n}\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<Date> = () => {\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date\n return new Date()\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<Array<unknown>> = ([list, value]) => {\n if (!Array.isArray(list)) {\n return null\n }\n return [value, ...list]\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\n/**\n * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/groupBy\n */\nexport const handler: FormulaHandler<Record<string, Array<unknown>>> = ([\n items,\n func,\n]) => {\n if (typeof func !== 'function') {\n return null\n }\n if (!items || typeof items !== 'object' || !Array.isArray(items)) {\n return null\n }\n\n const res: Record<string, any> = {}\n for (const index in items) {\n const item = items[index]\n const key = String(func({ item, index }))\n res[key] = res[key] ?? []\n res[key].push(item)\n }\n return res\n}\n\nexport default handler\n\nexport const getArgumentInputData = (\n [items]: unknown[],\n argIndex: number,\n input: any,\n) => {\n if (argIndex === 1 && Array.isArray(items)) {\n return { ...input, Args: { item: items[0], index: 0 } }\n }\n return input\n}\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<unknown> = ([list]) => {\n if (typeof list === 'string' || Array.isArray(list)) {\n return list[list.length - 1]\n }\n return null\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\nimport { parseJSONWithDate } from '@nordcraft/core/dist/utils/json'\n\nconst handler: FormulaHandler<unknown> = ([data]) => {\n if (typeof data !== 'string') {\n return null\n }\n try {\n // Similar to https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse\n return parseJSONWithDate(data)\n } catch {\n return null\n }\n}\nexport default handler\n", "const iso8601Regex = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:.\\d{1,3})?Z$/\n\n/**\n * This function is much slower than JSON parse without reviver and is a major\n * bottleneck in the runtime performance. Especially during startup.\n */\nexport function parseJSONWithDate(input: string) {\n return JSON.parse(input, (_, value) => {\n if (\n typeof value === 'string' &&\n value.length === 24 &&\n iso8601Regex.test(value)\n ) {\n return new Date(value)\n }\n return value\n })\n}\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<string> = ([input]) => {\n if (typeof input !== 'string') {\n return null\n }\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toLocaleUpperCase\n return input.toLocaleUpperCase()\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<number> = ([input, decimals]) => {\n if (typeof input !== 'number') {\n return null\n }\n if (typeof decimals !== 'number') {\n return null\n }\n const multiplier = Math.max(1, Math.pow(10, decimals))\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/round\n return Math.round(input * multiplier) / multiplier\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<Array<unknown> | string> = ([list, count]) => {\n if (typeof count !== 'number' || isNaN(count)) {\n return null\n }\n if (Array.isArray(list)) {\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/slice\n return list.slice(0, list.length - count)\n }\n if (typeof list === 'string') {\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/substring\n return list.substring(0, list.length - count)\n }\n return null\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\nimport { isDefined } from '@nordcraft/core/dist/utils/util'\n\nconst handler: FormulaHandler<boolean> = ([url, title, text]) => {\n if (!isDefined(navigator.canShare)) {\n return false\n }\n const validInput = (value: any): value is string =>\n isDefined(value) && typeof value === 'string'\n if (!validInput(url) && !validInput(title) && !validInput(text)) {\n return false\n }\n const data: ShareData = {}\n if (validInput(title)) {\n data.title = title\n }\n if (validInput(text)) {\n data.text = text\n }\n if (validInput(url)) {\n data.url = url\n }\n // Later we can add support for data.files as well\n // See https://developer.mozilla.org/en-US/docs/Web/API/Navigator/canShare\n return navigator.canShare(data)\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\n/**\n * Similar to https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/fromEntries\n * but requires the input to be an array of objects with `key` and `value` properties named as `key` and `value` respectively\n */\nconst handler: FormulaHandler<Record<string, unknown>> = ([list]) => {\n if (Array.isArray(list)) {\n const object: Record<string, any> = {}\n for (const { key, value } of list) {\n object[key] = value\n }\n return object\n }\n return null\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<boolean> = ([first, second]: any[]) => {\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Greater_than\n return first > second\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\n/**\n * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/includes\n * and https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/includes\n */\nconst handler: FormulaHandler<boolean> = ([collection, item]) => {\n if (typeof collection === 'string' && typeof item === 'string') {\n return collection.includes(item)\n }\n if (Array.isArray(collection)) {\n return collection.some((collectionItem) =>\n (globalThis as any).toddle.isEqual(collectionItem, item),\n )\n }\n return null\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<number> = ([a]) => {\n if (typeof a !== 'number') {\n return null\n }\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/abs\n return Math.abs(a)\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<boolean> = (_, ctx) => {\n return ctx.env.isServer\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\n/**\n * Create a simplified URL object similar to the native URL\n * while retaining the original URL object's toString method.\n */\nclass NCURL {\n hostname: string\n searchParams: {\n [k: string]: string\n }\n path: string[]\n hash: string\n href: string\n protocol: string\n port: string\n origin: string\n\n constructor(url: URL) {\n this.hostname = url.hostname\n this.searchParams = Object.fromEntries(url.searchParams)\n this.path = url.pathname.split('/').filter((p, i) => i !== 0 || p !== '')\n this.hash = url.hash.replace('#', '')\n this.href = url.href\n this.protocol = url.protocol\n this.port = url.port\n this.origin = url.origin\n }\n\n toString() {\n // This is the same functionality as URL.prototype.toString (https://developer.mozilla.org/en-US/docs/Web/API/URL#instance_methods)\n return this.href\n }\n}\n\n/**\n * Similar to https://developer.mozilla.org/en-US/docs/Web/API/URL/URL\n * but returns searchParams as an object and path as an array without leading empty string\n */\nconst handler: FormulaHandler<{\n hostname: string\n searchParams: {\n [k: string]: string\n }\n path: string[]\n hash: string\n href: string\n protocol: string\n port: string\n origin: string\n}> = ([url, base]) => {\n if (typeof url !== 'string') {\n return null\n }\n try {\n return new NCURL(new URL(url, typeof base === 'string' ? base : undefined))\n } catch {\n // Invalid url\n return null\n }\n}\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<boolean> = ([first, second]: any[]) => {\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Less_than_or_equal\n return first <= second\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\n/**\n * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/typeof\n */\nconst handler: FormulaHandler<string> = ([value]) => {\n switch (typeof value) {\n case 'number':\n if (isNaN(value)) {\n return null\n }\n return 'Number'\n case 'string':\n return 'String'\n case 'boolean':\n return 'Boolean'\n case 'object':\n return Array.isArray(value) ? 'Array' : value === null ? 'Null' : 'Object'\n case 'undefined':\n return 'Null'\n default:\n return null\n }\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nexport const handler: FormulaHandler<unknown> = ([items, fx]) => {\n if (typeof fx !== 'function') {\n return null\n }\n if (Array.isArray(items)) {\n return items.findLast((item, index) => fx({ item, index }))\n }\n if (items && typeof items === 'object') {\n return Object.entries(items).findLast(([key, value]) =>\n fx({ key, value }),\n )?.[1]\n }\n return null\n}\n\nexport default handler\n\nexport const getArgumentInputData = (\n [items]: unknown[],\n argIndex: number,\n input: any,\n) => {\n if (argIndex === 0) {\n return input\n }\n\n if (Array.isArray(items)) {\n return { ...input, Args: { item: items[0], index: 0 } }\n }\n if (items && typeof items === 'object') {\n const [first] = Object.entries(items)\n if (first) {\n return { ...input, Args: { key: first[0], value: first[1] } }\n }\n }\n return input\n}\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<boolean> = ([first, second]: any[]) => {\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Less_than\n return first < second\n}\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<Array<unknown>> = ([list, value]) => {\n if (!Array.isArray(list)) {\n return null\n }\n // Similar to https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/push\n return [...list, value]\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<unknown> = ([key]) => {\n if (typeof key !== 'string' || key.length === 0) {\n return null\n }\n if (typeof window === 'undefined') {\n return null\n }\n // See https://developer.mozilla.org/en-US/docs/Web/API/Window/sessionStorage\n const value = window.sessionStorage.getItem(key)\n if (value === null) {\n return value\n }\n try {\n return JSON.parse(value)\n } catch {\n return value\n }\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<Array<unknown>> = ([list]) => {\n if (!Array.isArray(list)) {\n return null\n }\n const set = new Set()\n return list.filter((item) => {\n const key = typeof item === 'object' ? JSON.stringify(item) : item\n if (set.has(key)) {\n return false\n }\n set.add(key)\n return true\n })\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\nimport { isObject } from '@nordcraft/core/dist/utils/util'\n\nconst handler: FormulaHandler<\n string | Array<unknown> | Record<string, unknown>\n> = (items) => {\n if (items.every(Array.isArray)) {\n const result = []\n for (const item of items) {\n // Similar to https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/concat\n result.push(...item)\n }\n return result\n }\n if (items.every(isObject)) {\n return Object.assign({}, ...items)\n }\n return items.join('')\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<Array<unknown> | string> = ([list, count]) => {\n if (typeof count !== 'number') {\n return null\n }\n if (Array.isArray(list)) {\n return list.slice(0, count)\n }\n if (typeof list === 'string') {\n return list.substring(0, count)\n }\n return null\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<unknown> = ([collection, key]) => {\n if (typeof collection === 'string') {\n return collection[Number(key)]\n }\n const resolve = (collection: any, path: unknown[]): unknown => {\n if (path.length === 0) {\n return collection\n }\n const [head, ...rest] = path\n return resolve(collection?.[String(head)], rest)\n }\n return resolve(collection, Array.isArray(key) ? key : [key])\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<string> = ([input]) => {\n if (typeof input !== 'string') {\n return null\n }\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toLocaleLowerCase\n return input.toLocaleLowerCase()\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\nconst handler: FormulaHandler<boolean> = ([a, b]) => {\n return (globalThis as any).toddle.isEqual(a, b)\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<unknown> = ([list]) => {\n if (typeof list === 'string' || Array.isArray(list)) {\n return list[0]\n }\n return null\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<string> = ([data, indentation]) => {\n const indent = isNaN(Number(indentation)) ? 0 : Number(indentation)\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify\n return JSON.stringify(data, null, indent)\n}\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<number> = (args) => {\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/max\n return Math.max(...args.map(Number))\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<Date> = ([date]) => {\n if (typeof date === 'string') {\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/Date\n return new Date(date)\n } else {\n return null\n }\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\nimport { isObject } from '@nordcraft/core/dist/utils/util'\n\nconst handler: FormulaHandler<Array<unknown> | Record<string, unknown>> = ([\n collection,\n key,\n]) => {\n if (typeof collection !== 'object' || collection === null) {\n return null\n }\n if (\n !Array.isArray(key) &&\n typeof key !== 'string' &&\n typeof key !== 'number'\n ) {\n return null\n }\n\n const run = (\n collection: any,\n [key, ...path]: string[],\n ): Record<string, any> | null => {\n if (Array.isArray(collection)) {\n const index = Number(key)\n if (Number.isNaN(index)) {\n return collection\n }\n if (path.length === 0) {\n return collection.filter((_, i) => i !== Number(key))\n }\n return collection.map((e, i) =>\n i === index ? run(collection[index], path) : e,\n )\n }\n if (isObject(collection)) {\n if (path.length === 0) {\n return Object.fromEntries(\n Object.entries(collection).filter(([k]) => k !== key),\n )\n }\n if (typeof key !== 'string' && typeof key !== 'number') {\n return { ...collection }\n } else {\n return {\n ...collection,\n [key]: run(collection[key], path),\n }\n }\n }\n\n return null\n }\n const path = Array.isArray(key) ? key : [key]\n return run(collection, path)\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<number> = (args) => {\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/min\n return Math.min(...args.map(Number))\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<Array<unknown>> = ([list]) => {\n if (Array.isArray(list)) {\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reverse\n return [...list].reverse()\n }\n return null\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<string> = (_, ctx) => {\n return ctx.env.branchName\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<boolean> = ([first, second]: any[]) => {\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Greater_than_or_equal\n return first >= second\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\nimport { isObject } from '@nordcraft/core/dist/utils/util'\n\nconst handler: FormulaHandler<number> = ([collection]) => {\n if (Array.isArray(collection)) {\n return collection.length\n }\n if (isObject(collection)) {\n return Object.keys(collection).length\n }\n if (typeof collection === 'string') {\n return collection.length\n }\n return null\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\n/**\n * Similar to https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce\n * but also works with objects\n */\nconst handler: FormulaHandler<unknown> = ([items, fx, init]) => {\n if (typeof fx !== 'function') {\n return null\n }\n if (Array.isArray(items)) {\n return items.reduce(\n (result, item, index) => fx({ result, item, index }),\n init,\n )\n }\n if (items && typeof items === 'object') {\n return Object.entries(items).reduce(\n (result, [key, value]) => fx({ result, key, value }),\n init,\n )\n }\n return null\n}\nexport default handler\n\nexport const getArgumentInputData = (\n [items, _, result]: unknown[],\n argIndex: number,\n input: any,\n) => {\n if (argIndex !== 1) {\n return input\n }\n if (Array.isArray(items)) {\n return {\n ...input,\n Args: {\n item: items[0],\n index: 0,\n result,\n },\n }\n }\n if (items && typeof items === 'object') {\n const [first] = Object.entries(items)\n if (first) {\n return {\n ...input,\n Args: {\n key: first[0],\n value: first[1],\n result,\n },\n }\n }\n }\n return input\n}\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\nimport { isObject } from '@nordcraft/core/dist/utils/util'\n\nconst handler: FormulaHandler<Array<unknown> | Record<string, unknown>> = (\n [collection, key, value],\n ctx,\n): any => {\n if (\n typeof key !== 'string' &&\n typeof key !== 'number' &&\n !Array.isArray(key)\n ) {\n return null\n }\n const [head, ...rest] = Array.isArray(key) ? key : [key]\n if (isObject(collection)) {\n const clone: Record<string, any> = Array.isArray(collection)\n ? [...collection]\n : { ...collection }\n clone[head] =\n rest.length === 0 ? value : handler([clone[head], rest, value], ctx)\n return clone\n }\n return null\n}\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\n/**\n * Similar to https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/some\n * but also works with objects\n */\nexport const handler: FormulaHandler<boolean> = ([items, fx]: unknown[]) => {\n if (typeof fx !== 'function') {\n return null\n }\n if (Array.isArray(items)) {\n return items.some((item, index) => fx({ item, index }))\n }\n if (items && typeof items === 'object') {\n return Object.entries(items).some(([key, value]) => fx({ key, value }))\n }\n return null\n}\n\nexport default handler\n\nexport const getArgumentInputData = (\n [items]: unknown[],\n argIndex: number,\n input: any,\n) => {\n if (argIndex === 0) {\n return input\n }\n\n if (Array.isArray(items)) {\n return { ...input, Args: { item: items[0], index: 0 } }\n }\n if (items && typeof items === 'object') {\n const [first] = Object.entries(items)\n if (first) {\n return { ...input, Args: { key: first[0], value: first[1] } }\n }\n }\n return input\n}\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<Array<{ key: string; value: unknown }>> = ([\n object,\n]) => {\n if (typeof object === 'object' && object !== null) {\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/entries\n return Object.entries(object).map(([key, value]) => ({ key, value }))\n }\n return null\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<Array<unknown>> = ([items]) => {\n if (Array.isArray(items)) {\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/flat\n return items.flat()\n }\n return null\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<Array<unknown> | string> = ([list, count]) => {\n if (typeof count !== 'number' || isNaN(count)) {\n return null\n }\n if (Array.isArray(list)) {\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/slice\n return list.slice(count)\n }\n if (typeof list === 'string') {\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/substring\n return list.substring(count)\n }\n return null\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<number> = ([a, b]) => {\n if (isNaN(Number(a)) || isNaN(Number(b))) {\n return null\n }\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Division\n return Number(a) / Number(b)\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\n/**\n * Similar to https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find\n * but this implementation also supports objects\n */\nexport const handler: FormulaHandler<unknown> = ([items, fx]) => {\n if (typeof fx !== 'function') {\n return null\n }\n if (Array.isArray(items)) {\n return items.find((item, index) => fx({ item, index }))\n }\n if (items && typeof items === 'object') {\n return Object.entries(items).find(([key, value]) => fx({ key, value }))?.[1]\n }\n return null\n}\n\nexport default handler\n\nexport const getArgumentInputData = (\n [items]: unknown[],\n argIndex: number,\n input: any,\n) => {\n if (argIndex === 0) {\n return input\n }\n\n if (Array.isArray(items)) {\n return { ...input, Args: { item: items[0], index: 0 } }\n }\n if (items && typeof items === 'object') {\n const [first] = Object.entries(items)\n if (first) {\n return { ...input, Args: { key: first[0], value: first[1] } }\n }\n }\n return input\n}\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\n/**\n * Similar to https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter\n * but this implementation also supports objects\n */\nexport const handler: FormulaHandler<\n Array<unknown> | Record<string, unknown>\n> = ([items, func]) => {\n if (typeof func !== 'function') {\n return null\n }\n if (Array.isArray(items)) {\n return items.filter((item, index) => func({ item, index }))\n }\n if (items && typeof items === 'object') {\n return Object.fromEntries(\n Object.entries(items).filter(([key, value]) => func({ key, value })),\n )\n }\n if (Array.isArray(items)) {\n return items.filter((item, index) => func({ item, index }))\n }\n return null\n}\n\nexport default handler\n\nexport const getArgumentInputData = (\n [items]: unknown[],\n argIndex: number,\n input: any,\n) => {\n if (argIndex === 0) {\n return input\n }\n\n if (Array.isArray(items)) {\n return { ...input, Args: { item: items[0], index: 0 } }\n }\n if (items && typeof items === 'object') {\n const [first] = Object.entries(items)\n if (first) {\n return { ...input, Args: { value: first[1], key: first[0] } }\n }\n }\n return input\n}\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<unknown> = ([key]) => {\n if (typeof key !== 'string' || key.length === 0) {\n return null\n }\n if (typeof window === 'undefined') {\n return null\n }\n // See https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage\n const value = window.localStorage.getItem(key)\n if (value === null) {\n return value\n }\n try {\n return JSON.parse(value)\n } catch {\n return value\n }\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\n/**\n * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number\n */\nconst handler: FormulaHandler<number> = ([a]) => Number(a)\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<Array<unknown> | string> = ([list]) => {\n if (Array.isArray(list)) {\n return shuffle(list)\n }\n if (typeof list === 'string') {\n return shuffle(list.split('')).join('')\n }\n return null\n}\n\nfunction shuffle(input: Array<any>) {\n const array = [...input]\n for (let i = array.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1)) // random index from 0 to i\n\n // swap elements array[i] and array[j]\n // we use \"destructuring assignment\" syntax to achieve that\n // you'll find more details about that syntax in later chapters\n // same can be written as:\n // let t = array[i]; array[i] = array[j]; array[j] = t\n ;[array[i], array[j]] = [array[j], array[i]]\n }\n return array\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<number> = (numbers) => {\n if (\n !Array.isArray(numbers) ||\n numbers.some((n) => n === null || typeof n !== 'number')\n ) {\n return null\n }\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Addition\n return numbers.reduce((result: number, n: any) => {\n return result + Number(n)\n }, 0)\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\nimport { toBoolean } from '@nordcraft/core/dist/utils/util'\n\nconst handler: FormulaHandler<unknown> = (values) => {\n for (const value of values) {\n if (toBoolean(value)) {\n return value\n }\n }\n return null\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<number> = ([input, decimals]) => {\n if (typeof input !== 'number') {\n return null\n }\n if (typeof decimals !== 'number') {\n return null\n }\n\n const multiplier = Math.max(1, Math.pow(10, decimals))\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/ceil\n return Math.ceil(input * multiplier) / multiplier\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<number> = ([collection, item]) => {\n if (typeof collection === 'string') {\n return collection.lastIndexOf(item as any)\n }\n\n if (Array.isArray(collection)) {\n // Short-circuit for primitive types and references\n const fastIndex = collection.lastIndexOf(item)\n if (fastIndex !== -1) {\n return fastIndex\n }\n\n return collection.findLastIndex((i) =>\n (globalThis as any).toddle.isEqual(i, item),\n )\n }\n return null\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<number> = ([date]) => {\n if (!date || !(date instanceof Date)) {\n return null\n }\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getTime\n return date.getTime()\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<string> = ([name], { env, root }) => {\n if (!name || typeof name !== 'string') {\n return null\n }\n if (!env.isServer) {\n if (root instanceof ShadowRoot) {\n return null\n }\n return (\n // See https://developer.mozilla.org/en-US/docs/Web/API/Document/cookie\n root.cookie\n .split('; ')\n ?.find((row) => row.startsWith(`${name}=`))\n ?.split('=')[1] ?? null\n )\n } else {\n return env.request.cookies[name] ?? null\n }\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\n/**\n * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/indexOf\n * and https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf\n */\nconst handler: FormulaHandler<number> = ([collection, item]) => {\n if (typeof collection === 'string') {\n return collection.indexOf(item as any)\n }\n\n if (Array.isArray(collection)) {\n // Short-circuit for primitive types and references\n const fastIndex = collection.indexOf(item)\n if (fastIndex !== -1) {\n return fastIndex\n }\n\n return collection.findIndex((i) =>\n (globalThis as any).toddle.isEqual(i, item),\n )\n }\n return null\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<string> = (_, { env }) => {\n if (env.isServer) {\n return env.request.url\n } else {\n // See https://developer.mozilla.org/en-US/docs/Web/API/Window/location\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n return window?.location.href ?? null\n }\n}\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<string> = ([\n input,\n searchValue,\n replaceValue,\n]) => {\n if (typeof input !== 'string') {\n return null\n }\n if (typeof searchValue !== 'string') {\n return null\n }\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replaceAll\n return input.replaceAll(searchValue, String(replaceValue))\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<HTMLElement> = ([id], { root }) => {\n if (typeof id !== 'string') {\n return null\n }\n // See https://developer.mozilla.org/en-US/docs/Web/API/Document/getElementById\n return root.getElementById(id)\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<string> = (_, { env }) => {\n if (!env.isServer) {\n // See https://developer.mozilla.org/en-US/docs/Web/API/Navigator/userAgent\n return window.navigator.userAgent\n } else {\n // See https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/User-Agent\n return env.request?.headers['user-agent'] ?? null\n }\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<boolean> = ([collection, prefix]) => {\n if (typeof collection !== 'string') {\n return null\n }\n if (typeof prefix !== 'string') {\n return null\n }\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith\n return collection.startsWith(prefix)\n}\n\nexport default handler\n", "import { STRING_TEMPLATE } from '@nordcraft/core/dist/api/template'\nimport type { FormulaHandler } from '@nordcraft/core/dist/types'\n\n/**\n * Nordcraft uses a custom string template to replace HttpOnly cookies server-side.\n * Learn more about cookies here https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies\n */\nconst handler: FormulaHandler<string> = ([name]) => {\n if (!name || typeof name !== 'string') {\n return null\n }\n return STRING_TEMPLATE('cookies', name)\n}\n\nexport default handler\n", "export const STRING_TEMPLATE = (\n type: keyof typeof templateTypes,\n name: string,\n) => {\n return `{{ ${templateTypes[type]}.${name} }}`\n}\n\nconst templateTypes = {\n cookies: 'cookies',\n}\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<number> = (numbers) => {\n if (numbers.some((n) => isNaN(Number(n)))) {\n return null\n }\n return (numbers as number[]).reduce<number>(\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Multiplication\n (product, num) => product * num,\n 1,\n )\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\n/**\n * Similar to https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/findIndex\n * but this implementation also supports objects\n */\nexport const handler: FormulaHandler<number> = ([items, fx]: unknown[]) => {\n if (typeof fx !== 'function') {\n return null\n }\n if (Array.isArray(items)) {\n return items.findIndex((item, index) => fx({ item, index }))\n }\n if (items && typeof items === 'object') {\n return Object.entries(items).findIndex(([key, value]) => fx({ key, value }))\n }\n return null\n}\n\nexport default handler\n\nexport const getArgumentInputData = (\n [items]: unknown[],\n argIndex: number,\n input: any,\n) => {\n if (argIndex === 0) {\n return input\n }\n\n if (Array.isArray(items)) {\n return { ...input, Args: { item: items[0], index: 0 } }\n }\n if (items && typeof items === 'object') {\n const [first] = Object.entries(items)\n if (first) {\n return { ...input, Args: { key: first[0], value: first[1] } }\n }\n }\n return input\n}\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<Array<number>> = ([min, max]) => {\n if (typeof min !== 'number') {\n return null\n }\n if (typeof max !== 'number') {\n return null\n }\n if (min > max) {\n return []\n }\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/from\n return Array.from({ length: max - min + 1 }, (_, i) => i + min)\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<string> = ([str]) => {\n if (typeof str !== 'string') {\n return null\n }\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/trim\n return str.trim()\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\nimport { toBoolean } from '@nordcraft/core/dist/utils/util'\n\nconst handler: FormulaHandler<boolean> = ([a]) => !toBoolean(a)\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\n/**\n * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat\n */\nconst handler: FormulaHandler<string> = ([input, loc, opt]) => {\n if (typeof input !== 'number' || Number.isNaN(input)) {\n return null\n }\n const locales =\n typeof loc === 'string' && loc.length > 0\n ? loc\n : Array.isArray(loc) && loc.every((l) => typeof l === 'string')\n ? (loc as string[])\n : undefined\n if (!opt || typeof opt !== 'object') {\n return Intl.NumberFormat(locales).format(input)\n }\n const validateString = <T = string>(\n value: unknown,\n allowedValues?: string[],\n ): T | undefined =>\n typeof value === 'string' && (allowedValues?.includes(value) ?? true)\n ? (value as T)\n : undefined\n\n const options: Partial<\n Intl.NumberFormatOptions & { locale: string | string[] }\n > = opt\n const style = validateString<Intl.NumberFormatOptions['style']>(\n options.style,\n ['decimal', 'currency', 'percent', 'unit'],\n )\n const currency =\n typeof options.currency === 'string' && options.currency.length === 3\n ? options.currency\n : undefined\n if (style === 'currency' && typeof currency !== 'string') {\n // currency must be provided when style is currency\n return null\n }\n const currencyDisplay = validateString<\n Intl.NumberFormatOptions['currencyDisplay']\n >(options.currencyDisplay, ['code', 'symbol', 'narrowSymbol', 'name'])\n const unit = typeof options.unit === 'string' ? options.unit : undefined\n if (style === 'unit' && typeof unit !== 'string') {\n // unit must be provided when style is unit\n return null\n }\n const unitDisplay = validateString<Intl.NumberFormatOptions['unitDisplay']>(\n options.unitDisplay,\n ['short', 'narrow', 'long'],\n )\n const minimumIntegerDigits =\n typeof options.minimumIntegerDigits === 'number' &&\n options.minimumIntegerDigits >= 1 &&\n options.minimumIntegerDigits <= 21\n ? options.minimumIntegerDigits\n : undefined\n const minimumFractionDigits =\n typeof options.minimumFractionDigits === 'number' &&\n options.minimumFractionDigits >= 0 &&\n options.minimumFractionDigits <= 100\n ? options.minimumFractionDigits\n : undefined\n const maximumFractionDigits =\n typeof options.maximumFractionDigits === 'number' &&\n options.maximumFractionDigits >= 0 &&\n options.maximumFractionDigits <= 100\n ? options.maximumFractionDigits\n : undefined\n const minimumSignificantDigits =\n typeof options.minimumSignificantDigits === 'number' &&\n options.minimumSignificantDigits >= 1 &&\n options.minimumSignificantDigits <= 21\n ? options.minimumSignificantDigits\n : undefined\n const maximumSignificantDigits =\n typeof options.maximumSignificantDigits === 'number' &&\n options.maximumSignificantDigits >= 1 &&\n options.maximumSignificantDigits <= 21\n ? options.maximumSignificantDigits\n : undefined\n const notation = validateString<Intl.NumberFormatOptions['notation']>(\n options.notation,\n ['standard', 'scientific', 'engineering', 'compact'],\n )\n const compactDisplay = validateString<\n Intl.NumberFormatOptions['compactDisplay']\n >(options.compactDisplay, ['short', 'long'])\n\n // useGrouping can be a boolean, 'always', 'auto', or 'min2'\n const validGroupingValues: Array<\n keyof Intl.NumberFormatOptionsUseGroupingRegistry\n > = ['always', 'auto', 'min2']\n const useGrouping: Intl.NumberFormatOptions['useGrouping'] =\n typeof options.useGrouping === 'boolean'\n ? options.useGrouping\n : validateString<keyof Intl.NumberFormatOptionsUseGroupingRegistry>(\n options.useGrouping,\n validGroupingValues,\n )\n\n return new Intl.NumberFormat(locales, {\n style,\n currency,\n currencyDisplay,\n unit,\n unitDisplay,\n minimumIntegerDigits,\n minimumFractionDigits,\n maximumFractionDigits,\n minimumSignificantDigits,\n maximumSignificantDigits,\n notation,\n compactDisplay,\n useGrouping,\n }).format(input)\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\nconst handler: FormulaHandler<boolean> = ([a, b]) => {\n return !(globalThis as any).toddle.isEqual(a, b)\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nexport const handler: FormulaHandler<Record<string, Array<unknown>>> = ([\n items,\n func,\n]) => {\n if (typeof func !== 'function') {\n return null\n }\n if (!items || typeof items !== 'object') {\n return null\n }\n\n const list = Array.isArray(items) ? items : Object.entries(items)\n\n const res: Record<string, any> = {}\n for (let i = 0; i < list.length; i++) {\n const item = list[i]\n const key = String(func({ item, i }))\n res[key] = item\n }\n return res\n}\n\nexport default handler\n\nexport const getArgumentInputData = (\n [items]: unknown[],\n argIndex: number,\n input: any,\n) => {\n if (argIndex === 0) {\n return input\n }\n\n if (Array.isArray(items)) {\n return { ...input, Args: { item: items[0], index: 0 } }\n }\n if (items && typeof items === 'object') {\n const [first] = Object.entries(items)\n if (first) {\n return { ...input, Args: { value: first[1], key: first[0] } }\n }\n }\n return input\n}\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<string> = ([input]) => {\n if (typeof input !== 'string') {\n return null\n }\n // See https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/atob\n return atob(input)\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<Array<unknown>> = ([inputString, delimiter]) => {\n if (typeof inputString !== 'string') {\n return null\n }\n if (typeof delimiter !== 'string') {\n return null\n }\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/split\n return inputString.split(delimiter)\n}\nexport default handler\n", "import * as libActions from '@nordcraft/std-lib/dist/actions'\nimport * as libFormulas from '@nordcraft/std-lib/dist/formulas'\nimport fastDeepEqual from 'fast-deep-equal'\nimport { defineComponents } from './custom-element/defineComponents'\n\nconst loadCorePlugins = (toddle = window.toddle) => {\n toddle.isEqual = fastDeepEqual\n\n // load default formulas and actions\n Object.entries(libFormulas).forEach(([name, module]) =>\n toddle.registerFormula(\n '@toddle/' + name,\n module.default as any,\n 'getArgumentInputData' in module\n ? module.getArgumentInputData\n : undefined,\n ),\n )\n Object.entries(libActions).forEach(([name, module]) =>\n toddle.registerAction('@toddle/' + name, module.default),\n )\n}\n\nexport { defineComponents, loadCorePlugins }\n", "/**\n * Convert a component name to a valid HTML tag name according to the custom-element specs\n *\n * https://html.spec.whatwg.org/multipage/custom-elements.html#custom-element\n */\nexport const safeCustomElementName = (name: string) => {\n // Remove any white spaces from the name\n const tag = name.toLocaleLowerCase().replaceAll(' ', '')\n\n // Add \"toddle-\" prefix if needed\n if (!tag.includes('-')) {\n return `toddle-${tag}`\n }\n\n return tag\n}\n", "/* eslint-disable no-console */\nimport type { Component, ComponentData } from '../component/component.types'\nimport type {\n CustomFormulaHandler,\n FormulaHandler,\n FormulaLookup,\n NordcraftMetadata,\n Nullable,\n Runtime,\n Toddle,\n} from '../types'\nimport { isDefined, toBoolean } from '../utils/util'\nimport { type PluginFormula, type ToddleFormula } from './formulaTypes'\n\n// Define the some objects types as union of ServerSide and ClientSide runtime types as applyFormula is used in both\ndeclare const document: Document | undefined\ntype ShadowRoot = DocumentFragment\n\ninterface BaseOperation extends NordcraftMetadata {\n label?: Nullable<string>\n}\n\nexport interface PathOperation extends BaseOperation {\n type: 'path'\n path: string[]\n}\n\nexport interface FunctionArgument {\n name?: Nullable<string>\n isFunction?: Nullable<boolean>\n formula: Formula\n type?: Nullable<any>\n testValue?: Nullable<any>\n}\n\nexport interface FunctionOperation extends BaseOperation {\n type: 'function'\n name: string\n display_name?: Nullable<string>\n package?: Nullable<string>\n arguments: FunctionArgument[]\n variableArguments?: Nullable<boolean>\n}\n\nexport interface RecordOperation extends BaseOperation {\n type: 'record'\n entries: FunctionArgument[]\n}\n\nexport interface ObjectOperation extends BaseOperation {\n type: 'object'\n arguments?: Nullable<FunctionArgument[]>\n}\n\nexport interface ArrayOperation extends BaseOperation {\n type: 'array'\n arguments: Array<{ formula: Formula }>\n}\n\nexport interface OrOperation extends BaseOperation {\n type: 'or'\n arguments: Array<{ formula: Formula }>\n}\n\nexport interface AndOperation extends BaseOperation {\n type: 'and'\n arguments: Array<{ formula: Formula }>\n}\n\nexport interface ApplyOperation extends BaseOperation {\n type: 'apply'\n name: string\n arguments: FunctionArgument[]\n}\n\nexport interface ValueOperation extends BaseOperation {\n type: 'value'\n value: ValueOperationValue\n}\n\nexport type ValueOperationValue = string | number | boolean | null | object\n\nexport interface SwitchOperation extends BaseOperation {\n type: 'switch'\n cases: Array<{\n condition: Formula\n formula: Formula\n }>\n default: Formula\n}\n\nexport type Formula =\n | FunctionOperation\n | RecordOperation\n | ObjectOperation\n | ArrayOperation\n | PathOperation\n | SwitchOperation\n | OrOperation\n | AndOperation\n | ValueOperation\n | ApplyOperation\n\nexport type FormulaContext = {\n component: Component | undefined\n formulaCache?: Nullable<\n Record<\n string,\n {\n get: (data: ComponentData) => any\n set: (data: ComponentData, result: any) => void\n }\n >\n >\n data: ComponentData\n root?: Nullable<Document | ShadowRoot>\n package: Nullable<string>\n toddle: {\n getFormula: FormulaLookup\n getCustomFormula: CustomFormulaHandler\n errors: Error[]\n }\n env: ToddleEnv | undefined\n}\n\nexport type ToddleServerEnv = {\n branchName: string\n // isServer will be true for SSR + proxied requests\n isServer: true\n request: {\n headers: Record<string, string>\n cookies: Record<string, string>\n url: string\n }\n runtime: never\n logErrors: boolean\n}\n\nexport type ToddleEnv =\n | ToddleServerEnv\n | {\n branchName: string\n // isServer will be false for client-side\n isServer: false\n request: undefined\n runtime: Runtime\n logErrors: boolean\n }\n\nexport function isFormula(f: any): f is Formula {\n return (\n f &&\n typeof f === 'object' &&\n typeof f.type === 'string' &&\n (\n [\n 'path',\n 'function',\n 'record',\n 'object',\n 'array',\n 'or',\n 'and',\n 'apply',\n 'value',\n 'switch',\n ] as Formula['type'][]\n ).includes(f.type)\n )\n}\nexport function isFormulaApplyOperation(\n formula: Formula,\n): formula is ApplyOperation {\n return formula.type === 'apply'\n}\n\nexport const isToddleFormula = <Handler>(\n formula: PluginFormula<Handler>,\n): formula is ToddleFormula =>\n Object.hasOwn(formula, 'formula') &&\n isDefined((formula as ToddleFormula).formula)\n\nexport function applyFormula(\n formula: Formula | string | number | undefined | null | boolean,\n ctx: FormulaContext,\n): any {\n if (!isFormula(formula)) {\n return formula\n }\n try {\n switch (formula.type) {\n case 'value':\n return formula.value\n case 'path': {\n let input: any = ctx.data\n for (const key of formula.path) {\n if (input && typeof input === 'object') {\n input = input[key]\n } else {\n return null\n }\n }\n\n return input\n }\n case 'switch': {\n for (const branch of formula.cases) {\n if (toBoolean(applyFormula(branch.condition, ctx))) {\n return applyFormula(branch.formula, ctx)\n }\n }\n return applyFormula(formula.default, ctx)\n }\n case 'or': {\n for (const entry of formula.arguments) {\n if (toBoolean(applyFormula(entry.formula, ctx))) {\n return true\n }\n }\n return false\n }\n case 'and': {\n for (const entry of formula.arguments) {\n if (!toBoolean(applyFormula(entry.formula, ctx))) {\n return false\n }\n }\n return true\n }\n case 'function': {\n const packageName = formula.package ?? ctx.package ?? undefined\n const newFunc = (\n ctx.toddle ??\n ((globalThis as any).toddle as Toddle<unknown, unknown> | undefined)\n )?.getCustomFormula(formula.name, packageName)\n if (isDefined(newFunc)) {\n ctx.package = packageName\n const args = formula.arguments.reduce<Record<string, unknown>>(\n (args, arg, i) => ({\n ...args,\n [arg.name ?? `${i}`]: arg.isFunction\n ? (Args: any) =>\n applyFormula(arg.formula, {\n ...ctx,\n data: {\n ...ctx.data,\n Args: ctx.data.Args\n ? { ...Args, '@toddle.parent': ctx.data.Args }\n : Args,\n },\n })\n : applyFormula(arg.formula, ctx),\n }),\n {},\n )\n try {\n if (isToddleFormula(newFunc)) {\n return applyFormula(newFunc.formula, {\n ...ctx,\n data: { ...ctx.data, Args: args },\n })\n } else {\n return newFunc.handler(args, {\n root: ctx.root ?? document,\n env: ctx.env,\n } as any)\n }\n } catch (e) {\n ctx.toddle.errors.push(e as Error)\n if (ctx.env?.logErrors) {\n console.error(e)\n }\n return null\n }\n } else {\n // Lookup legacy formula\n const legacyFunc: FormulaHandler | undefined = (\n ctx.toddle ??\n ((globalThis as any).toddle as Toddle<unknown, unknown>)\n ).getFormula(formula.name)\n if (typeof legacyFunc === 'function') {\n const args = (formula.arguments ?? []).map((arg) =>\n arg.isFunction\n ? (Args: any) =>\n applyFormula(arg.formula, {\n ...ctx,\n data: {\n ...ctx.data,\n Args: ctx.data.Args\n ? { ...Args, '@toddle.parent': ctx.data.Args }\n : Args,\n },\n })\n : applyFormula(arg.formula, ctx),\n )\n try {\n return legacyFunc(args, ctx as any)\n } catch (e) {\n ctx.toddle.errors.push(e as Error)\n if (ctx.env?.logErrors) {\n console.error(e)\n }\n return null\n }\n }\n }\n if (ctx.env?.logErrors) {\n console.error(\n `Could not find formula ${formula.name} in package ${\n packageName ?? ''\n }`,\n formula,\n )\n }\n return null\n }\n case 'object':\n return Object.fromEntries(\n formula.arguments?.map((entry) => [\n entry.name,\n applyFormula(entry.formula, ctx),\n ]) ?? [],\n )\n case 'record': // object used to be called record, there are still examples in the wild.\n return Object.fromEntries(\n formula.entries.map((entry) => [\n entry.name,\n applyFormula(entry.formula, ctx),\n ]),\n )\n case 'array':\n return formula.arguments.map((entry) =>\n applyFormula(entry.formula, ctx),\n )\n case 'apply': {\n const componentFormula = ctx.component?.formulas?.[formula.name]\n if (!componentFormula) {\n if (ctx.env?.logErrors) {\n console.log(\n 'Component does not have a formula with the name ',\n formula.name,\n )\n }\n return null\n }\n const Input = Object.fromEntries(\n formula.arguments.map((arg) =>\n arg.isFunction\n ? [\n arg.name,\n (Args: any) =>\n applyFormula(arg.formula, {\n ...ctx,\n data: {\n ...ctx.data,\n Args: ctx.data.Args\n ? { ...Args, '@toddle.parent': ctx.data.Args }\n : Args,\n },\n }),\n ]\n : [arg.name, applyFormula(arg.formula, ctx)],\n ),\n )\n const data = {\n ...ctx.data,\n Args: ctx.data.Args\n ? { ...Input, '@toddle.parent': ctx.data.Args }\n : Input,\n }\n const cache = ctx.formulaCache?.[formula.name]?.get(data)\n\n if (cache?.hit) {\n return cache.data\n } else {\n const result = applyFormula(componentFormula.formula, {\n ...ctx,\n data,\n })\n ctx.formulaCache?.[formula.name]?.set(data, result)\n return result\n }\n }\n\n default:\n if (ctx.env?.logErrors) {\n console.error('Could not recognize formula', formula)\n }\n }\n } catch (e) {\n if (ctx.env?.logErrors) {\n console.error(e)\n }\n return null\n }\n}\n", "import type { Nullable } from '../types'\nimport { isDefined } from './util'\n\nexport const isObject = (input: any): input is Record<string, any> =>\n typeof input === 'object' && input !== null\n\nexport const mapObject = <T, T2>(\n object: Record<string, T>,\n f: (kv: [string, T]) => [string, T2],\n): Record<string, T2> => Object.fromEntries(Object.entries(object).map(f))\n\nexport const mapValues = <T, T2>(\n object: Record<string, T>,\n f: (value: T) => T2,\n): Record<string, T2> => mapObject(object, ([key, value]) => [key, f(value)])\n\n/**\n * Deletes potentially nested keys from an object\n * @param collection Array or Object\n * @param path Path to the key to delete. For instance ['foo', 0, 'bar']\n * @returns The updated object/array\n */\nexport const omit = <T = object>(\n collection: T,\n [key, ...rest]: Array<string | number>,\n): T => {\n if (rest.length > 0) {\n const clone: any = Array.isArray(collection)\n ? [...collection]\n : { ...collection }\n if (isDefined(key)) {\n clone[key] = omit(clone[key], rest)\n }\n return clone\n }\n\n if (Array.isArray(collection)) {\n return collection.toSpliced(Number(key), 1) as T\n }\n\n const clone: any = { ...collection }\n if (isDefined(key)) {\n delete clone[key]\n }\n return clone\n}\n\nexport const omitKeys = <T extends Record<string, any>>(\n object: T,\n keys: Array<keyof T>,\n): T =>\n Object.fromEntries(\n Object.entries(object).filter(([k]) => !keys.includes(k)),\n ) as T\n\nexport const omitPaths = (object: Record<string, any>, keys: string[][]) =>\n keys.reduce((acc, key) => omit(acc, key), { ...object })\n\nexport const groupBy = <T>(items: T[], f: (t: T) => string) =>\n items.reduce<Record<string, T[]>>((acc, item) => {\n const key = f(item)\n acc[key] = acc[key] ?? []\n acc[key].push(item)\n return acc\n }, {})\n\nexport const filterObject = <T>(\n object: Record<string, T>,\n f: (kv: [string, T]) => boolean,\n): Record<string, T> => Object.fromEntries(Object.entries(object).filter(f))\n\nexport function get<T = any>(collection: T, [head, ...rest]: string[]): any {\n const headItem = isDefined(head) ? (collection as any)?.[head] : undefined\n if (rest.length === 0) {\n return headItem\n }\n return get(headItem, rest)\n}\n\nexport const set = <T = unknown>(\n collection: T,\n key: Array<string | number>,\n value: any,\n): T => {\n const [head, ...rest] = key\n\n const clone: any = Array.isArray(collection)\n ? [...collection]\n : isObject(collection)\n ? { ...collection }\n : {}\n\n // Cast to any, since it's actually possible to set a property with an undefined key on an object in Javascript\n // and we don't want to introduce a breaking change\n clone[head as any] =\n rest.length === 0 ? value : set(clone[head as any], rest, value)\n return clone as T\n}\n\nexport const sortObjectEntries = <T>(\n object: Record<string, T>,\n f: (kv: [string, T]) => string | number | boolean,\n ascending = true,\n): [string, T][] => easySort(Object.entries(object), f, ascending)\n\nexport const easySort = <T>(\n collection: T[],\n f: (item: T) => string | number | boolean,\n ascending = true,\n) =>\n [...collection].sort((a, b) => {\n const keyA = f(a)\n const keyB = f(b)\n if (keyA === keyB) {\n return 0\n }\n return (keyA > keyB ? 1 : -1) * (ascending ? 1 : -1)\n })\n\nexport const deepSortObject = (\n obj: any,\n): Nullable<Record<string, any> | Array<any>> => {\n if (!isDefined(obj)) {\n return obj\n }\n if (Array.isArray(obj)) {\n return obj.map((val) => deepSortObject(val))\n } else if (typeof obj === 'object' && Object.keys(obj).length > 0) {\n return [...Object.keys(obj)].sort().reduce<any>((acc, key) => {\n acc[key] = deepSortObject(obj[key])\n return acc\n }, {})\n }\n return obj\n}\n", "// Based on https://stackoverflow.com/questions/7616461/generate-a-hash-from-string-in-javascript/52171480#52171480\n// This is a simple hash function for strings. It's not secure, but it's fast.\n// It's not suitable for cryptographic purposes, but it's great for hash tables.\nexport const hash = (data: string, seed = 0) => {\n let h1 = 0xdeadbeef ^ seed,\n h2 = 0x41c6ce57 ^ seed\n for (let i = 0, ch; i < data.length; i++) {\n ch = data.charCodeAt(i)\n h1 = Math.imul(h1 ^ ch, 2654435761)\n h2 = Math.imul(h2 ^ ch, 1597334677)\n }\n h1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507)\n h1 ^= Math.imul(h2 ^ (h2 >>> 13), 3266489909)\n h2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507)\n h2 ^= Math.imul(h1 ^ (h1 >>> 13), 3266489909)\n\n return 4294967296 * (2097151 & h2) + (h1 >>> 0)\n}\n", "import type { EventModel } from '../component/component.types'\nimport type { Formula } from '../formula/formula'\nimport type { NordcraftMetadata, Nullable } from '../types'\n\nexport type ComponentAPI = LegacyComponentAPI | ApiRequest\n\nexport interface LegacyComponentAPI {\n name: string\n type: 'REST'\n autoFetch?: Nullable<Formula>\n url?: Nullable<Formula>\n path?: Nullable<{ formula: Formula }[]>\n proxy?: Nullable<boolean>\n queryParams?: Nullable<Record<string, { name: string; formula: Formula }>>\n headers?: Nullable<Record<string, Formula> | Formula>\n method?: Nullable<'GET' | 'POST' | 'DELETE' | 'PUT'>\n body?: Nullable<Formula>\n auth?: Nullable<{\n type: 'Bearer id_token' | 'Bearer access_token'\n }>\n throttle?: Nullable<number>\n debounce?: Nullable<number>\n onCompleted?: Nullable<EventModel>\n onFailed?: Nullable<EventModel>\n version?: never\n}\n\nexport interface LegacyApiStatus {\n data: unknown\n isLoading: boolean\n error: unknown\n response?: never\n}\n\nexport enum ApiMethod {\n GET = 'GET',\n POST = 'POST',\n DELETE = 'DELETE',\n PUT = 'PUT',\n PATCH = 'PATCH',\n HEAD = 'HEAD',\n OPTIONS = 'OPTIONS',\n}\n\nexport type RedirectStatusCode = 300 | 301 | 302 | 303 | 304 | 307 | 308\n\nexport type ApiParserMode =\n | 'auto'\n | 'text'\n | 'json'\n | 'event-stream'\n | 'json-stream'\n | 'blob'\n\nexport interface ApiBase extends NordcraftMetadata {\n url?: Nullable<Formula>\n path?: Nullable<Record<string, { formula: Formula; index: number }>>\n queryParams?: Nullable<\n Record<\n string,\n // The enabled formula is used to determine if the query parameter should be included in the request or not\n { formula: Formula; enabled?: Nullable<Formula> }\n >\n >\n // hash is relevant for redirects and rewrites, but not for API calls\n hash?: Nullable<{ formula: Formula }>\n}\n\nexport interface ApiRequest extends ApiBase {\n version: 2\n name: string\n type: 'http' | 'ws' // The structure for web sockets might look different\n autoFetch?: Nullable<Formula>\n headers?: Nullable<\n Record<string, { formula: Formula; enabled?: Nullable<Formula> }>\n >\n method?: Nullable<ApiMethod>\n body?: Nullable<Formula>\n // inputs for an API request\n inputs: Record<string, { formula: Nullable<Formula> }>\n service?: Nullable<string>\n servicePath?: Nullable<string>\n server?: Nullable<{\n // We should only accept server side proxy requests if proxy is defined\n proxy?: Nullable<{\n enabled: { formula: Formula }\n // Allow replacing template values in the body of a proxied request\n // This is useful for cases where the body should include an http only cookie for instance\n useTemplatesInBody?: Nullable<{ formula: Formula }>\n }>\n ssr?: Nullable<{\n // We should only fetch a request server side during SSR if this is true\n // it should probably be true by default for autofetch APIs\n // During SSR we will only fetch autoFetch requests\n enabled?: Nullable<{ formula: Formula }>\n }>\n }>\n client?: Nullable<{\n debounce?: Nullable<{ formula: Formula }>\n onCompleted?: Nullable<EventModel>\n onFailed?: Nullable<EventModel>\n onMessage?: Nullable<EventModel>\n // parserMode is used to determine how the response should be handled\n // auto: The response will be handled based on the content type of the response\n // stream: The response will be handled as a stream\n parserMode: ApiParserMode\n // Whether to include credentials (cookies) in the request or not. Default is 'same-origin'\n credentials?: Nullable<'include' | 'same-origin' | 'omit'>\n }>\n // Shared logic for client/server \uD83D\uDC47\n // The user could distinguish using an environment\n // variable e.g. IS_SERVER when they declare the formula\n\n // Rules for redirecting the user to a different page\n // These rules will run both on server+client - mostly used for 401 response -> 302 redirect\n // We allow multiple rules since it makes it easier to setup multiple conditions/redirect locations\n redirectRules?: Nullable<\n Record<\n string,\n {\n // The formula will receive the response from the server including a status code\n // A redirect response will be returned if the formula returns a valid url\n formula: Formula\n // The status code used in the redirect response. Only relevant server side\n statusCode?: Nullable<RedirectStatusCode>\n index: number\n }\n >\n >\n // Formula for determining whether the response is an error or not. Receives the API response + status code/headers as input\n // The response is considered an error if the formula returns true\n // Default behavior is to check if the status code is 400 or higher\n isError?: Nullable<{ formula: Formula }>\n // Formula for determining when the request should time out\n timeout?: Nullable<{ formula: Formula }>\n}\n\nexport interface ApiStatus {\n data: unknown\n isLoading: boolean\n error: unknown\n response?: Nullable<{\n status?: Nullable<number>\n headers?: Nullable<Record<string, string>>\n performance?: Nullable<ApiPerformance>\n debug?: Nullable<unknown>\n }>\n}\n\nexport interface ApiPerformance {\n requestStart?: Nullable<number>\n responseStart?: Nullable<number>\n responseEnd?: Nullable<number>\n}\n\nexport interface ToddleRequestInit extends RequestInit {\n headers: Headers\n}\n", "import type { Nullable } from '../types'\n\n/**\n * Checks if a header is a json (content-type) header\n * Also supports edge cases like application/vnd.api+json and application/vnd.contentful.delivery.v1+json\n * See https://jsonapi.org/#mime-types\n */\nexport const isJsonHeader = (header?: Nullable<string>) => {\n if (typeof header !== 'string') {\n return false\n }\n return /^application\\/(json|.*\\+json)/.test(header)\n}\n\nexport const isTextHeader = (header?: Nullable<string>) => {\n if (typeof header !== 'string') {\n return false\n }\n return /^(text\\/|application\\/x-www-form-urlencoded|application\\/(xml|.*\\+xml))/.test(\n header,\n )\n}\n\nexport const isEventStreamHeader = (header?: Nullable<string>) => {\n if (typeof header !== 'string') {\n return false\n }\n return /^text\\/event-stream/.test(header)\n}\n\nexport const isJsonStreamHeader = (header?: Nullable<string>) => {\n if (typeof header !== 'string') {\n return false\n }\n return /^(application\\/stream\\+json|application\\/x-ndjson)/.test(header)\n}\n\nexport const isImageHeader = (header?: Nullable<string>) => {\n if (typeof header !== 'string') {\n return false\n }\n return /^image\\//.test(header)\n}\n\n/**\n * Returns an object with headers from a Headers object\n * Duplicate header values (set-cookie for instance) are encoded as a comma-separated string\n */\nexport const mapHeadersToObject = (headers: Headers) => {\n const headersObject: Record<string, string> = {}\n for (const [key, value] of headers.entries()) {\n if (headersObject[key]) {\n headersObject[key] += `, ${value}`\n } else {\n headersObject[key] = value\n }\n }\n return headersObject\n}\n", "import type { ActionModel } from '../component/component.types'\nimport type { Nullable } from '../types'\nimport { isDefined } from '../utils/util'\nimport type {\n Formula,\n FunctionOperation,\n PathOperation,\n ValueOperation,\n} from './formula'\nimport { isFormula, isToddleFormula } from './formula'\nimport type { GlobalFormulas } from './formulaTypes'\n\nexport const valueFormula = (\n value: string | number | boolean | null | object,\n): ValueOperation => ({\n type: 'value',\n value,\n})\n\nexport const pathFormula = (path: string[]): PathOperation => ({\n type: 'path',\n path,\n})\n\nexport const functionFormula = (\n name: string,\n formula?: Omit<Partial<FunctionOperation>, 'type' | 'name'>,\n): FunctionOperation => ({\n type: 'function',\n name,\n package: formula?.package,\n arguments: formula?.arguments ?? [],\n variableArguments: formula?.variableArguments,\n})\n\nexport function* getFormulasInFormula<Handler>({\n formula,\n globalFormulas,\n path: _path,\n visitedFormulas: _visitedFormulas,\n packageName: _packageName,\n}: {\n formula: Nullable<Formula>\n globalFormulas: GlobalFormulas<Handler>\n path?: Nullable<(string | number)[]>\n visitedFormulas?: Nullable<Set<string>>\n packageName?: Nullable<string>\n}): Generator<{\n path: (string | number)[]\n formula: Formula\n packageName?: string\n}> {\n if (!isDefined(formula)) {\n return\n }\n const path = _path ?? []\n let packageName = _packageName ?? undefined\n const visitedFormulas = _visitedFormulas ?? new Set<string>()\n\n yield {\n path,\n formula,\n packageName,\n }\n switch (formula.type) {\n case 'path':\n case 'value':\n break\n case 'record':\n for (const [key, entry] of formula.entries.entries()) {\n yield* getFormulasInFormula({\n formula: entry.formula,\n globalFormulas,\n path: [...path, 'entries', key, 'formula'],\n visitedFormulas,\n packageName,\n })\n }\n break\n case 'function': {\n packageName = formula.package ?? packageName\n const formulaKey = [packageName, formula.name].filter(isDefined).join('/')\n const shouldVisitFormula = !visitedFormulas.has(formulaKey)\n visitedFormulas.add(formulaKey)\n const globalFormula = packageName\n ? globalFormulas.packages?.[packageName]?.formulas?.[formula.name]\n : globalFormulas.formulas?.[formula.name]\n for (const [key, arg] of (\n (formula.arguments as typeof formula.arguments | undefined) ?? []\n ).entries()) {\n yield* getFormulasInFormula({\n formula: arg.formula,\n globalFormulas,\n path: [...path, 'arguments', key, 'formula'],\n visitedFormulas,\n packageName,\n })\n }\n // Lookup the actual function and traverse its potential formula references\n // if this formula wasn't already visited\n if (\n globalFormula &&\n isToddleFormula(globalFormula) &&\n shouldVisitFormula\n ) {\n yield* getFormulasInFormula({\n formula: globalFormula.formula,\n globalFormulas,\n path: [...path, 'formula'],\n visitedFormulas,\n packageName,\n })\n }\n break\n }\n case 'array':\n case 'or':\n case 'and':\n case 'object':\n for (const [key, arg] of (\n (formula.arguments as typeof formula.arguments | undefined) ?? []\n ).entries()) {\n yield* getFormulasInFormula({\n formula: arg.formula,\n globalFormulas,\n path: [...path, 'arguments', key, 'formula'],\n visitedFormulas,\n packageName,\n })\n }\n break\n case 'apply':\n for (const [key, arg] of (\n (formula.arguments as typeof formula.arguments | undefined) ?? []\n ).entries()) {\n yield* getFormulasInFormula({\n formula: arg.formula,\n globalFormulas,\n path: [...path, 'arguments', key, 'formula'],\n visitedFormulas,\n packageName,\n })\n }\n break\n case 'switch':\n for (const [key, c] of formula.cases.entries()) {\n yield* getFormulasInFormula({\n formula: c.condition,\n globalFormulas,\n path: [...path, 'cases', key, 'condition'],\n visitedFormulas,\n packageName,\n })\n yield* getFormulasInFormula({\n formula: c.formula,\n globalFormulas,\n path: [...path, 'cases', key, 'formula'],\n visitedFormulas,\n packageName,\n })\n }\n yield* getFormulasInFormula({\n formula: formula.default,\n globalFormulas,\n path: [...path, 'default'],\n visitedFormulas,\n packageName,\n })\n break\n }\n}\nexport function* getFormulasInAction<Handler>({\n action,\n globalFormulas,\n path: _path,\n visitedFormulas = new Set<string>(),\n packageName: _packageName,\n}: {\n action: Nullable<ActionModel>\n globalFormulas: GlobalFormulas<Handler>\n path?: Nullable<(string | number)[]>\n visitedFormulas?: Nullable<Set<string>>\n packageName?: Nullable<string>\n}): Generator<{\n path: (string | number)[]\n formula: Formula\n packageName?: string\n}> {\n if (!isDefined(action)) {\n return\n }\n const path = _path ?? []\n let packageName = _packageName ?? undefined\n\n switch (action.type) {\n case 'Fetch':\n for (const [inputKey, input] of Object.entries(action.inputs ?? {})) {\n yield* getFormulasInFormula({\n formula: input.formula,\n globalFormulas,\n path: [...path, 'input', inputKey, 'formula'],\n visitedFormulas,\n packageName,\n })\n }\n for (const [key, a] of Object.entries(action.onSuccess?.actions ?? {})) {\n yield* getFormulasInAction({\n action: a,\n globalFormulas,\n path: [...path, 'onSuccess', 'actions', key],\n visitedFormulas,\n packageName,\n })\n }\n for (const [key, a] of Object.entries(action.onError?.actions ?? {})) {\n yield* getFormulasInAction({\n action: a,\n globalFormulas,\n path: [...path, 'onError', 'actions', key],\n visitedFormulas,\n packageName,\n })\n }\n for (const [key, a] of Object.entries(action.onMessage?.actions ?? {})) {\n yield* getFormulasInAction({\n action: a,\n globalFormulas,\n path: [...path, 'onMessage', 'actions', key],\n visitedFormulas,\n packageName,\n })\n }\n break\n case 'Custom':\n case undefined:\n case null:\n packageName = action.package ?? packageName\n if (isFormula(action.data)) {\n yield* getFormulasInFormula({\n formula: action.data,\n globalFormulas,\n path: [...path, 'data'],\n visitedFormulas,\n packageName,\n })\n }\n for (const [key, a] of Object.entries(action.arguments ?? {})) {\n if (a) {\n yield* getFormulasInFormula({\n formula: a.formula,\n globalFormulas,\n path: [...path, 'arguments', key, 'formula'],\n visitedFormulas,\n packageName,\n })\n }\n }\n\n for (const [eventKey, event] of Object.entries(action.events ?? {})) {\n for (const [key, a] of Object.entries(event.actions ?? {})) {\n yield* getFormulasInAction({\n action: a,\n globalFormulas,\n path: [...path, 'events', eventKey, 'actions', key],\n visitedFormulas,\n packageName,\n })\n }\n }\n break\n case 'SetVariable':\n case 'TriggerEvent':\n case 'TriggerWorkflowCallback':\n yield* getFormulasInFormula({\n formula: action.data,\n globalFormulas,\n path: [...path, 'data'],\n visitedFormulas,\n packageName,\n })\n break\n case 'SetURLParameter':\n yield* getFormulasInFormula({\n formula: action.data,\n globalFormulas,\n path: [...path, 'data'],\n visitedFormulas,\n })\n break\n case 'SetURLParameters':\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n for (const [key, formula] of Object.entries(action.parameters ?? {})) {\n yield* getFormulasInFormula({\n formula,\n globalFormulas,\n path: [...path, 'parameters', key],\n visitedFormulas,\n })\n }\n break\n case 'TriggerWorkflow':\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n for (const [key, a] of Object.entries(action.parameters ?? {})) {\n if (isDefined(a.formula)) {\n yield* getFormulasInFormula({\n formula: a.formula,\n globalFormulas,\n path: [...path, 'parameters', key, 'formula'],\n visitedFormulas,\n packageName,\n })\n }\n }\n break\n case 'Switch':\n if (isDefined(action.data) && isFormula(action.data)) {\n yield* getFormulasInFormula({\n formula: action.data,\n globalFormulas,\n path: [...path, 'data'],\n visitedFormulas,\n packageName,\n })\n }\n for (const [key, c] of action.cases.entries()) {\n yield* getFormulasInFormula({\n formula: c.condition,\n globalFormulas,\n path: [...path, 'cases', key, 'condition'],\n visitedFormulas,\n packageName,\n })\n for (const [actionKey, a] of Object.entries(c.actions)) {\n yield* getFormulasInAction({\n action: a,\n globalFormulas,\n path: [...path, 'cases', key, 'actions', actionKey],\n visitedFormulas,\n packageName,\n })\n }\n }\n for (const [actionKey, a] of Object.entries(action.default.actions)) {\n yield* getFormulasInAction({\n action: a,\n globalFormulas,\n path: [...path, 'default', 'actions', actionKey],\n visitedFormulas,\n packageName,\n })\n }\n break\n }\n}\n", "import { isFormula, type Formula } from '../formula/formula'\nimport type { GlobalFormulas } from '../formula/formulaTypes'\nimport {\n getFormulasInAction,\n getFormulasInFormula,\n} from '../formula/formulaUtils'\nimport type { Nullable } from '../types'\nimport { isDefined } from '../utils/util'\nimport { type LegacyComponentAPI } from './apiTypes'\n\nexport class LegacyToddleApi<Handler> {\n private api: LegacyComponentAPI\n private key: string\n private globalFormulas: GlobalFormulas<Handler>\n private _apiReferences?: Set<string>\n\n constructor(\n api: LegacyComponentAPI,\n key: string,\n globalFormulas: GlobalFormulas<Handler>,\n ) {\n this.api = api\n this.key = key\n this.globalFormulas = globalFormulas\n }\n\n get apiReferences(): Set<string> {\n if (this._apiReferences) {\n // Only compute apiReferences once\n return this._apiReferences\n }\n const apis = new Set<string>()\n const visitFormulaReference = (formula?: Nullable<Formula>) => {\n if (!isDefined(formula)) {\n return\n }\n switch (formula.type) {\n case 'path':\n if (formula.path[0] === 'Apis') {\n const apiName = formula.path[1]\n if (typeof apiName === 'string') {\n apis.add(apiName)\n }\n }\n break\n case 'value':\n break\n case 'record':\n formula.entries.forEach((entry) =>\n visitFormulaReference(entry.formula),\n )\n break\n case 'function':\n case 'array':\n case 'or':\n case 'and':\n case 'apply':\n case 'object':\n formula.arguments?.forEach((arg) =>\n visitFormulaReference(arg.formula),\n )\n break\n case 'switch':\n formula.cases.forEach((c) => {\n visitFormulaReference(c.condition)\n visitFormulaReference(c.formula)\n })\n break\n }\n }\n visitFormulaReference(this.api.autoFetch)\n visitFormulaReference(this.api.url)\n Object.values(this.api.path ?? {}).forEach((p) =>\n visitFormulaReference(p.formula),\n )\n Object.values(this.api.queryParams ?? {}).forEach((q) =>\n visitFormulaReference(q.formula),\n )\n\n // this is supporting a few legacy cases where the whole header object was set as a formula. This is no longer possible\n if (isFormula(this.api.headers)) {\n visitFormulaReference(this.api.headers)\n } else {\n Object.values(this.api.headers ?? {}).forEach((h) => {\n visitFormulaReference(h)\n })\n }\n visitFormulaReference(this.api.body)\n this._apiReferences = apis\n return apis\n }\n\n get name() {\n return this.api.name\n }\n get type() {\n return this.api.type\n }\n get autoFetch() {\n return this.api.autoFetch\n }\n get url() {\n return this.api.url\n }\n get path() {\n return this.api.path\n }\n get proxy() {\n return this.api.proxy\n }\n get queryParams() {\n return this.api.queryParams\n }\n get headers() {\n return this.api.headers\n }\n get method() {\n return this.api.method\n }\n get body() {\n return this.api.body\n }\n get auth() {\n return this.api.auth\n }\n get throttle() {\n return this.api.throttle\n }\n get debounce() {\n return this.api.debounce\n }\n get onCompleted() {\n return this.api.onCompleted\n }\n get onFailed() {\n return this.api.onFailed\n }\n *formulasInApi(): Generator<{\n path: (string | number)[]\n formula: Formula\n packageName?: string\n }> {\n const api = this.api\n const apiKey = this.key\n yield* getFormulasInFormula({\n formula: api.autoFetch,\n globalFormulas: this.globalFormulas,\n path: ['apis', apiKey, 'autoFetch'],\n })\n yield* getFormulasInFormula({\n formula: api.url,\n globalFormulas: this.globalFormulas,\n path: ['apis', apiKey, 'url'],\n })\n for (const [pathKey, path] of Object.entries(api.path ?? {})) {\n yield* getFormulasInFormula({\n formula: path.formula,\n globalFormulas: this.globalFormulas,\n path: ['apis', apiKey, 'path', pathKey, 'formula'],\n })\n }\n for (const [queryParamKey, queryParam] of Object.entries(\n api.queryParams ?? {},\n )) {\n yield* getFormulasInFormula({\n formula: queryParam.formula,\n globalFormulas: this.globalFormulas,\n path: ['apis', apiKey, 'queryParams', queryParamKey, 'formula'],\n })\n }\n\n // this is supporting a few legacy cases where the whole header object was set as a formula. This is no longer possible\n if (isFormula(api.headers)) {\n yield* getFormulasInFormula({\n formula: api.headers,\n globalFormulas: this.globalFormulas,\n path: ['apis', apiKey, 'headers'],\n })\n } else {\n for (const [headerKey, header] of Object.entries(api.headers ?? {})) {\n yield* getFormulasInFormula({\n formula: header,\n globalFormulas: this.globalFormulas,\n path: ['apis', apiKey, 'headers', headerKey],\n })\n }\n }\n\n yield* getFormulasInFormula({\n formula: api.body,\n globalFormulas: this.globalFormulas,\n path: ['apis', apiKey, 'body'],\n })\n for (const [actionKey, action] of Object.entries(\n api.onCompleted?.actions ?? {},\n )) {\n yield* getFormulasInAction({\n action,\n globalFormulas: this.globalFormulas,\n path: ['apis', apiKey, 'onCompleted', 'actions', actionKey],\n })\n }\n for (const [actionKey, action] of Object.entries(\n api.onFailed?.actions ?? {},\n )) {\n yield* getFormulasInAction({\n action,\n globalFormulas: this.globalFormulas,\n path: ['apis', apiKey, 'onFailed', 'actions', actionKey],\n })\n }\n }\n}\n", "import type { LegacyPluginAction, Nullable, PluginActionV2 } from '../types'\nimport { isDefined } from '../utils/util'\nimport type { ActionModel } from './component.types'\n\nexport function* getActionsInAction(\n action: Nullable<ActionModel>,\n path: (string | number)[] = [],\n): Generator<[(string | number)[], ActionModel]> {\n if (!isDefined(action)) {\n return\n }\n\n yield [path, action]\n switch (action.type) {\n case 'SetVariable':\n case 'SetURLParameter':\n case 'SetURLParameters':\n case 'TriggerEvent':\n case 'TriggerWorkflow':\n case 'TriggerWorkflowCallback':\n break\n case 'Fetch':\n for (const [key, a] of Object.entries(action.onSuccess?.actions ?? {})) {\n yield* getActionsInAction(a, [...path, 'onSuccess', 'actions', key])\n }\n for (const [key, a] of Object.entries(action.onError?.actions ?? {})) {\n yield* getActionsInAction(a, [...path, 'onError', 'actions', key])\n }\n for (const [key, a] of Object.entries(action.onMessage?.actions ?? {})) {\n yield* getActionsInAction(a, [...path, 'onMessage', 'actions', key])\n }\n break\n case 'Custom':\n case undefined:\n case null:\n for (const [eventKey, event] of Object.entries(action.events ?? {})) {\n for (const [key, a] of Object.entries(event?.actions ?? {})) {\n yield* getActionsInAction(a, [\n ...path,\n 'events',\n eventKey,\n 'actions',\n key,\n ])\n }\n }\n break\n case 'Switch':\n for (const [key, c] of action.cases.entries()) {\n for (const [actionKey, a] of Object.entries(c?.actions ?? {})) {\n yield* getActionsInAction(a, [\n ...path,\n 'cases',\n key,\n 'actions',\n actionKey,\n ])\n }\n }\n for (const [actionKey, a] of Object.entries(action.default.actions)) {\n yield* getActionsInAction(a, [...path, 'default', 'actions', actionKey])\n }\n break\n }\n}\n\nexport const isLegacyPluginAction = (\n action: LegacyPluginAction | PluginActionV2,\n): action is LegacyPluginAction => {\n return !('version' in action)\n}\n", "import { getActionsInAction } from '../component/actionUtils'\nimport type { ActionModel } from '../component/component.types'\nimport { type Formula } from '../formula/formula'\nimport type { GlobalFormulas } from '../formula/formulaTypes'\nimport {\n getFormulasInAction,\n getFormulasInFormula,\n} from '../formula/formulaUtils'\nimport type { Nullable } from '../types'\nimport { isDefined } from '../utils/util'\nimport { HttpMethodsWithAllowedBody } from './api'\nimport { type ApiRequest } from './apiTypes'\n\nexport class ToddleApiV2<Handler> implements ApiRequest {\n private api: ApiRequest\n private _apiReferences?: Set<string>\n private key: string\n private globalFormulas: GlobalFormulas<Handler>\n\n constructor(\n api: ApiRequest,\n apiKey: string,\n globalFormulas: GlobalFormulas<Handler>,\n ) {\n this.api = api\n this.key = apiKey\n this.globalFormulas = globalFormulas\n }\n\n get apiReferences(): Set<string> {\n if (this._apiReferences) {\n // Only compute apiReferences once\n return this._apiReferences\n }\n const apis = new Set<string>()\n const visitFormulaReference = (formula?: Nullable<Formula>) => {\n if (!isDefined(formula)) {\n return\n }\n switch (formula.type) {\n case 'path':\n if (formula.path[0] === 'Apis') {\n const apiName = formula.path[1]\n if (typeof apiName === 'string') {\n apis.add(apiName)\n }\n }\n break\n case 'value':\n break\n case 'record':\n formula.entries.forEach((entry) =>\n visitFormulaReference(entry.formula),\n )\n break\n case 'function':\n case 'array':\n case 'or':\n case 'and':\n case 'apply':\n case 'object':\n formula.arguments?.forEach((arg) =>\n visitFormulaReference(arg.formula),\n )\n break\n case 'switch':\n formula.cases.forEach((c) => {\n visitFormulaReference(c.condition)\n visitFormulaReference(c.formula)\n })\n break\n }\n }\n visitFormulaReference(this.api.autoFetch)\n visitFormulaReference(this.api.url)\n Object.values(this.api.path ?? {}).forEach((p) =>\n visitFormulaReference(p.formula),\n )\n Object.values(this.api.headers ?? {}).forEach((h) =>\n visitFormulaReference(h.formula),\n )\n visitFormulaReference(this.api.body)\n Object.values(this.api.inputs).forEach((arg) =>\n visitFormulaReference(arg.formula),\n )\n Object.values(this.api.queryParams ?? {}).forEach((q) => {\n visitFormulaReference(q.formula)\n })\n visitFormulaReference(this.api.server?.proxy?.enabled?.formula)\n visitFormulaReference(this.api.server?.ssr?.enabled?.formula)\n visitFormulaReference(this.api.client?.debounce?.formula)\n Object.values(this.api.redirectRules ?? {}).forEach((rule) => {\n visitFormulaReference(rule.formula)\n })\n visitFormulaReference(this.api.isError?.formula)\n visitFormulaReference(this.api.timeout?.formula)\n // Ensure self references are not included - for instance if an API references its\n // own response in a redirect rule\n apis.delete(this.key)\n\n this._apiReferences = apis\n return apis\n }\n\n get version() {\n return this.api.version\n }\n\n get name() {\n return this.api.name\n }\n\n get type() {\n return this.api.type\n }\n\n get autoFetch() {\n return this.api.autoFetch\n }\n\n get url() {\n return this.api.url\n }\n\n get path() {\n return this.api.path\n }\n\n get headers() {\n return this.api.headers\n }\n\n set headers(headers) {\n this.api.headers = headers\n }\n\n get method() {\n return this.api.method\n }\n\n get body() {\n return this.api.body\n }\n\n get inputs() {\n return this.api.inputs\n }\n\n get queryParams() {\n return this.api.queryParams\n }\n\n get server() {\n return this.api.server\n }\n\n get client() {\n return this.api.client\n }\n\n get redirectRules() {\n return this.api.redirectRules\n }\n\n get isError() {\n return this.api.isError\n }\n\n get timeout() {\n return this.api.timeout\n }\n\n get '@nordcraft/metadata'() {\n return this.api['@nordcraft/metadata']\n }\n\n *formulasInApi(): Generator<{\n path: (string | number)[]\n formula: Formula\n packageName?: string\n }> {\n const api = this.api\n const apiKey = this.key\n for (const [input, value] of Object.entries(this.api.inputs)) {\n yield* getFormulasInFormula({\n formula: value.formula,\n globalFormulas: this.globalFormulas,\n path: ['apis', apiKey, 'inputs', input, 'formula'],\n })\n }\n yield* getFormulasInFormula({\n formula: api.autoFetch,\n globalFormulas: this.globalFormulas,\n path: ['apis', apiKey, 'autoFetch'],\n })\n yield* getFormulasInFormula({\n formula: api.url,\n globalFormulas: this.globalFormulas,\n path: ['apis', apiKey, 'url'],\n })\n for (const [pathKey, path] of Object.entries(api.path ?? {})) {\n yield* getFormulasInFormula({\n formula: path.formula,\n globalFormulas: this.globalFormulas,\n path: ['apis', apiKey, 'path', pathKey, 'formula'],\n })\n }\n for (const [queryParamKey, queryParam] of Object.entries(\n api.queryParams ?? {},\n )) {\n yield* getFormulasInFormula({\n formula: queryParam.formula,\n globalFormulas: this.globalFormulas,\n path: ['apis', apiKey, 'queryParams', queryParamKey, 'formula'],\n })\n yield* getFormulasInFormula({\n formula: queryParam.enabled,\n globalFormulas: this.globalFormulas,\n path: ['apis', apiKey, 'queryParams', queryParamKey, 'enabled'],\n })\n }\n\n for (const [headerKey, header] of Object.entries(api.headers ?? {})) {\n yield* getFormulasInFormula({\n formula: header.formula,\n globalFormulas: this.globalFormulas,\n path: ['apis', apiKey, 'headers', headerKey, 'formula'],\n })\n yield* getFormulasInFormula({\n formula: header.enabled,\n globalFormulas: this.globalFormulas,\n path: ['apis', apiKey, 'headers', headerKey, 'enabled'],\n })\n }\n\n // Only visit the body definition if the method supports having a body\n if (api.method && HttpMethodsWithAllowedBody.includes(api.method)) {\n yield* getFormulasInFormula({\n formula: api.body,\n globalFormulas: this.globalFormulas,\n path: ['apis', apiKey, 'body'],\n })\n }\n for (const [actionKey, action] of Object.entries(\n api.client?.onCompleted?.actions ?? {},\n )) {\n yield* getFormulasInAction({\n action,\n globalFormulas: this.globalFormulas,\n path: ['apis', apiKey, 'client', 'onCompleted', 'actions', actionKey],\n })\n }\n for (const [actionKey, action] of Object.entries(\n api.client?.onFailed?.actions ?? {},\n )) {\n yield* getFormulasInAction({\n action,\n globalFormulas: this.globalFormulas,\n path: ['apis', apiKey, 'client', 'onFailed', 'actions', actionKey],\n })\n }\n yield* getFormulasInFormula({\n formula: api.client?.debounce?.formula,\n globalFormulas: this.globalFormulas,\n path: ['apis', apiKey, 'client', 'debounce', 'formula'],\n })\n for (const [actionKey, action] of Object.entries(\n api.client?.onMessage?.actions ?? {},\n )) {\n yield* getFormulasInAction({\n action,\n globalFormulas: this.globalFormulas,\n path: ['apis', apiKey, 'client', 'onMessage', 'actions', actionKey],\n })\n }\n for (const [rule, value] of Object.entries(api.redirectRules ?? {})) {\n yield* getFormulasInFormula({\n formula: value.formula,\n globalFormulas: this.globalFormulas,\n path: ['apis', apiKey, 'redirectRules', rule, 'formula'],\n })\n }\n yield* getFormulasInFormula({\n formula: api.isError?.formula,\n globalFormulas: this.globalFormulas,\n path: ['apis', apiKey, 'isError', 'formula'],\n })\n yield* getFormulasInFormula({\n formula: api.timeout?.formula,\n globalFormulas: this.globalFormulas,\n path: ['apis', apiKey, 'timeout', 'formula'],\n })\n yield* getFormulasInFormula({\n formula: api.server?.proxy?.enabled.formula,\n globalFormulas: this.globalFormulas,\n path: ['apis', apiKey, 'server', 'proxy', 'enabled', 'formula'],\n })\n yield* getFormulasInFormula({\n formula: api.server?.proxy?.useTemplatesInBody?.formula,\n globalFormulas: this.globalFormulas,\n path: [\n 'apis',\n apiKey,\n 'server',\n 'proxy',\n 'useTemplatesInBody',\n 'formula',\n ],\n })\n yield* getFormulasInFormula({\n formula: api.server?.ssr?.enabled?.formula,\n globalFormulas: this.globalFormulas,\n path: ['apis', apiKey, 'server', 'ssr', 'enabled', 'formula'],\n })\n }\n\n *actionModelsInApi(): Generator<[(string | number)[], ActionModel]> {\n for (const [actionKey, action] of Object.entries(\n this.api.client?.onCompleted?.actions ?? {},\n )) {\n yield* getActionsInAction(action, [\n 'apis',\n this.key,\n 'client',\n 'onCompleted',\n 'actions',\n actionKey,\n ])\n }\n for (const [actionKey, action] of Object.entries(\n this.api.client?.onFailed?.actions ?? {},\n )) {\n yield* getActionsInAction(action, [\n 'apis',\n this.key,\n 'client',\n 'onFailed',\n 'actions',\n actionKey,\n ])\n }\n for (const [actionKey, action] of Object.entries(\n this.api.client?.onMessage?.actions ?? {},\n )) {\n yield* getActionsInAction(action, [\n 'apis',\n this.key,\n 'client',\n 'onData',\n 'actions',\n actionKey,\n ])\n }\n }\n}\n", "import type { Formula, FormulaContext } from '../formula/formula'\nimport { applyFormula } from '../formula/formula'\nimport type { Nullable } from '../types'\nimport { omitKeys, sortObjectEntries } from '../utils/collections'\nimport { hash } from '../utils/hash'\nimport { isDefined, isObject, toBoolean } from '../utils/util'\nimport type {\n ApiBase,\n ApiPerformance,\n ApiRequest,\n ComponentAPI,\n LegacyComponentAPI,\n ToddleRequestInit,\n} from './apiTypes'\nimport { ApiMethod } from './apiTypes'\nimport { isJsonHeader } from './headers'\nimport { LegacyToddleApi } from './LegacyToddleApi'\nimport { ToddleApiV2 } from './ToddleApiV2'\n\nexport const NON_BODY_RESPONSE_CODES = [101, 204, 205, 304]\n\nexport const isLegacyApi = <Handler>(\n api: ComponentAPI | LegacyToddleApi<Handler> | ToddleApiV2<Handler>,\n): api is LegacyComponentAPI | LegacyToddleApi<Handler> =>\n api instanceof LegacyToddleApi ? true : !('version' in api)\n\nexport const createApiRequest = <Handler>({\n api,\n formulaContext,\n baseUrl,\n defaultHeaders,\n}: {\n api: ApiRequest | ToddleApiV2<Handler>\n formulaContext: FormulaContext\n baseUrl?: Nullable<string>\n defaultHeaders: Headers | undefined\n}) => {\n const url = getUrl(api, formulaContext, baseUrl)\n const requestSettings = getRequestSettings({\n api,\n formulaContext,\n defaultHeaders,\n })\n\n return { url, requestSettings }\n}\n\nexport const getUrl = (\n api: ApiBase,\n formulaContext: FormulaContext,\n baseUrl?: Nullable<string>,\n): URL => {\n let urlPathname = ''\n let urlQueryParams = new URLSearchParams()\n let parsedUrl: URL | undefined\n const url = applyFormula(api.url, formulaContext)\n if (['string', 'number'].includes(typeof url)) {\n const urlInput = typeof url === 'number' ? String(url) : url\n try {\n // Try to parse the URL to extract potential path and query parameters\n parsedUrl = new URL(urlInput, baseUrl ?? undefined)\n urlPathname = parsedUrl.pathname\n urlQueryParams = parsedUrl.searchParams\n // eslint-disable-next-line no-empty\n } catch {}\n }\n const pathParams = getRequestPath(api.path, formulaContext)\n // Combine potential path parameters from the url declaration with the actual path parameters\n const path = `${urlPathname}${pathParams.length > 0 && !urlPathname.endsWith('/') ? '/' : ''}${pathParams}`\n // Combine potential query parameters from the url declaration with the actual query parameters\n const queryParams = new URLSearchParams([\n ...urlQueryParams,\n ...getRequestQueryParams(api.queryParams, formulaContext),\n ])\n const queryString =\n [...queryParams.entries()].length > 0 ? `?${queryParams.toString()}` : ''\n const hash = applyFormula(api.hash?.formula, formulaContext)\n const hashString =\n typeof hash === 'string' && hash.length > 0 ? `#${hash}` : ''\n if (parsedUrl) {\n const combinedUrl = new URL(parsedUrl.origin, baseUrl ?? undefined)\n combinedUrl.pathname = path\n combinedUrl.search = queryParams.toString()\n combinedUrl.hash = hashString\n return combinedUrl\n } else {\n return new URL(`${path}${queryString}${hashString}`, baseUrl ?? undefined)\n }\n}\n\nexport const HttpMethodsWithAllowedBody: ApiMethod[] = [\n ApiMethod.POST,\n ApiMethod.DELETE,\n ApiMethod.PUT,\n ApiMethod.PATCH,\n ApiMethod.OPTIONS,\n]\n\nexport const applyAbortSignal = (\n api: ApiRequest,\n requestSettings: RequestInit,\n formulaContext: FormulaContext,\n) => {\n if (api.timeout) {\n const timeout = applyFormula(api.timeout.formula, formulaContext)\n if (typeof timeout === 'number' && !Number.isNaN(timeout) && timeout > 0) {\n requestSettings.signal = AbortSignal.timeout(timeout)\n }\n }\n}\n\nconst getRequestSettings = ({\n api,\n formulaContext,\n defaultHeaders,\n}: {\n api: ApiRequest\n formulaContext: FormulaContext\n defaultHeaders: Headers | undefined\n}): ToddleRequestInit => {\n const method = Object.values(ApiMethod).includes(api.method as ApiMethod)\n ? (api.method as ApiMethod)\n : ApiMethod.GET\n const headers = getRequestHeaders({\n apiHeaders: api.headers,\n formulaContext,\n defaultHeaders,\n })\n const body = getRequestBody({ api, formulaContext, headers, method })\n if (headers.get('content-type') === 'multipart/form-data') {\n headers.delete('content-type')\n }\n\n const requestSettings: ToddleRequestInit = {\n method,\n headers,\n body,\n }\n\n applyAbortSignal(api, requestSettings, formulaContext)\n\n return requestSettings\n}\n\nexport const getRequestPath = (\n path: ApiRequest['path'],\n formulaContext: FormulaContext,\n): string =>\n sortObjectEntries(path ?? {}, ([_, p]) => p.index)\n .map(([_, p]) => applyFormula(p.formula, formulaContext))\n .join('/')\n\nexport const getRequestQueryParams = (\n params: ApiRequest['queryParams'],\n formulaContext: FormulaContext,\n): URLSearchParams => {\n const queryParams = new URLSearchParams()\n Object.entries(params ?? {}).forEach(([key, param]) => {\n const enabled = isDefined(param.enabled)\n ? applyFormula(param.enabled, formulaContext)\n : true\n if (!enabled) {\n return\n }\n\n const value = applyFormula(param.formula, formulaContext)\n if (!isDefined(value)) {\n // Ignore null/undefined values\n return\n }\n if (Array.isArray(value)) {\n // Support encoding 1-dimensional arrays\n value.forEach((v) => queryParams.append(key, String(v)))\n } else if (isObject(value)) {\n // Support encoding (nested) objects, but cast any non-object to a String\n const encodeObject = (obj: Record<string, any>, prefix: string) => {\n Object.entries(obj).forEach(([key, val]) => {\n if (!Array.isArray(val) && isObject(val)) {\n return encodeObject(val, `${prefix}[${key}]`)\n } else {\n queryParams.set(`${prefix}[${key}]`, String(val))\n }\n })\n }\n encodeObject(value, key)\n } else {\n queryParams.set(key, String(value))\n }\n })\n return queryParams\n}\n\nexport const getRequestHeaders = ({\n apiHeaders,\n formulaContext,\n defaultHeaders,\n}: {\n apiHeaders: ApiRequest['headers']\n formulaContext: FormulaContext\n defaultHeaders: Headers | undefined\n}) => {\n const headers = new Headers(defaultHeaders)\n Object.entries(apiHeaders ?? {}).forEach(([key, param]) => {\n const enabled = isDefined(param.enabled)\n ? applyFormula(param.enabled, formulaContext)\n : true\n if (enabled) {\n const value = applyFormula(param.formula, formulaContext)\n if (isDefined(value)) {\n try {\n headers.set(\n key.trim(),\n (typeof value === 'string' ? value : String(value)).trim(),\n )\n // eslint-disable-next-line no-empty\n } catch {}\n }\n }\n })\n return headers\n}\n\nexport const getBaseUrl = ({\n origin,\n url,\n}: {\n origin: string\n url?: Nullable<string>\n}) =>\n !isDefined(url) || url === '' || url.startsWith('/') ? origin + url : url\n\n/**\n * Calculate the hash of a Request object based on its properties\n */\nexport const requestHash = (url: URL, request: RequestInit) =>\n hash(\n JSON.stringify({\n url: url.href,\n method: request.method,\n headers: omitKeys(\n Object.fromEntries(Object.entries(request.headers ?? {})),\n ['host', 'cookie'],\n ),\n body: request.body ?? null,\n }),\n )\n\nexport const isApiError = ({\n apiName,\n response,\n formulaContext,\n errorFormula,\n performance,\n}: {\n apiName: string\n response: {\n ok: boolean\n status?: Nullable<number>\n headers?: Nullable<Record<string, string>>\n body: unknown\n }\n formulaContext: FormulaContext\n performance: ApiPerformance\n errorFormula?: Nullable<{ formula: Formula }>\n}) => {\n const errorFormulaRes = errorFormula\n ? applyFormula(errorFormula.formula, {\n component: formulaContext.component,\n package: formulaContext.package,\n toddle: formulaContext.toddle,\n data: {\n Attributes: {},\n Args: formulaContext.data.Args,\n Apis: {\n // The errorFormula will only have access to the data of the current API\n [apiName]: {\n isLoading: false,\n data: response.body,\n error: null,\n response: {\n status: response.status,\n headers: response.headers,\n performance,\n },\n },\n },\n },\n env: formulaContext.env,\n })\n : null\n\n if (errorFormulaRes === null || errorFormulaRes === undefined) {\n return !response.ok\n }\n return toBoolean(errorFormulaRes)\n}\n\nexport const getRequestBody = ({\n api,\n formulaContext,\n headers,\n method,\n}: {\n api: ApiRequest\n formulaContext: FormulaContext\n headers: Headers\n method: ApiMethod\n}): FormData | string | undefined => {\n if (!api.body || !HttpMethodsWithAllowedBody.includes(method)) {\n return\n }\n\n const body = applyFormula(api.body, formulaContext)\n if (!body) {\n return\n }\n const contentType = headers.get('content-type')\n if (!isDefined(contentType) || isJsonHeader(contentType)) {\n // JSON.stringify the body if the content type is JSON or has not been set\n return JSON.stringify(body)\n }\n switch (contentType) {\n case 'application/x-www-form-urlencoded': {\n if (typeof body === 'object' && body !== null) {\n return Object.entries(body)\n .map(([key, value]) => {\n if (Array.isArray(value)) {\n return value\n .map(\n (v) => `${encodeURIComponent(key)}=${encodeURIComponent(v)}`,\n )\n .join('&')\n } else {\n return `${encodeURIComponent(key)}=${encodeURIComponent(\n String(value),\n )}`\n }\n })\n .join('&')\n }\n return ''\n }\n case 'multipart/form-data': {\n const formData = new FormData()\n if (typeof body === 'object' && body !== null) {\n Object.entries(body).forEach(([key, value]) => {\n formData.set(key, value as string | Blob)\n })\n }\n return formData\n }\n case 'text/plain':\n return String(body)\n default:\n // For other content types, we return the body as is\n return body\n }\n}\n\nexport const createApiEvent = (\n eventName: 'message' | 'success' | 'failed',\n detail: any,\n) => {\n return new CustomEvent(eventName, {\n detail,\n })\n}\n\nconst compareApiDependencies = <Handler>(\n a: LegacyToddleApi<Handler> | ToddleApiV2<Handler>,\n b: LegacyToddleApi<Handler> | ToddleApiV2<Handler>,\n) => {\n const isADependentOnB = a.apiReferences.has(b.name)\n const isBDependentOnA = b.apiReferences.has(a.name)\n if (isADependentOnB === isBDependentOnA) {\n return 0\n }\n // 1 means A goes last - hence B is evaluated before A\n return isADependentOnB ? 1 : -1\n}\n\nexport const sortApiObjects = <Handler>(\n apis: Array<[string, ComponentAPI]>,\n) => {\n const apiMap = new Map<\n string,\n LegacyToddleApi<Handler> | ToddleApiV2<Handler>\n >()\n const getApi = (apiObj: ComponentAPI, key: string) => {\n let api = apiMap.get(key)\n if (!api) {\n api =\n apiObj.version === 2\n ? new ToddleApiV2<Handler>(\n apiObj,\n key,\n // global formulas are not required for sorting\n {\n formulas: {},\n packages: {},\n },\n )\n : new LegacyToddleApi<Handler>(\n apiObj,\n key,\n // global formulas are not required for sorting\n {\n formulas: {},\n packages: {},\n },\n )\n apiMap.set(key, api)\n }\n return api\n }\n\n return [...apis].sort(([aKey, aObj], [bKey, bObj]) => {\n const a = getApi(aObj, aKey)\n const b = getApi(bObj, bKey)\n return compareApiDependencies(a, b)\n })\n}\n\nexport const sortApiEntries = <Handler>(\n apis: Array<[string, LegacyToddleApi<Handler> | ToddleApiV2<Handler>]>,\n) => [...apis].sort(([_, a], [__, b]) => compareApiDependencies(a, b))\n", "// cSpell: ignore phash\nconst SEED = 5381\n\n// When we have separate strings it's useful to run a progressive\n// version of djb2 where we pretend that we're still looping over\n// the same string\nconst phash = (h: number, x: string) => {\n let i = x.length\n\n while (i) {\n h = (h * 33) ^ x.charCodeAt(--i)\n }\n\n return h\n}\n\n// This is a djb2 hashing function\nexport const hash = (x: string) => {\n return phash(SEED, x)\n}\n\nconst AD_REPLACER_R = /(a)(d)/gi\n\n/* This is the \"capacity\" of our alphabet i.e. 2x26 for all letters plus their capitalized\n * counterparts */\nconst charsLength = 52\n\n/* start at 75 for 'a' until 'z' (25) and then start at 65 for capitalized letters */\nconst getAlphabeticChar = (code: number) =>\n String.fromCharCode(code + (code > 25 ? 39 : 97))\n\n/* input a number, usually a hash and convert it to base-52 */\nexport function generateAlphabeticName(code: number) {\n let name = ''\n let x\n\n /* get a char and divide by alphabet-length */\n for (x = Math.abs(code); x > charsLength; x = (x / charsLength) | 0) {\n name = getAlphabeticChar(x % charsLength) + name\n }\n\n return (getAlphabeticChar(x % charsLength) + name).replace(\n AD_REPLACER_R,\n '$1-$2',\n )\n}\n", "import { generateAlphabeticName, hash } from './hash'\n\nexport const getClassName = (object: any) => {\n return generateAlphabeticName(hash(JSON.stringify(object)))\n}\n\nexport const toValidClassName = (\n input: string,\n escapeSpecialCharacters = false,\n) => {\n // Replace invalid characters with hyphens\n let className = input\n // Remove leading and trailing whitespace\n .trim()\n // Replace whitespace with hyphens\n .replace(/\\s+/g, '-')\n\n if (escapeSpecialCharacters) {\n className = className.replace(/[^a-zA-Z0-9-_]/g, (match) => `\\\\${match}`)\n }\n\n // Ensure the class name doesn't start with a number or special character\n if (/^[^a-zA-Z]/.test(className)) {\n className = `_${className}`\n }\n\n return className\n}\n", "import type { CustomPropertyName } from '../component/component.types'\nimport type { Nullable } from '../types'\nimport { isDefined } from '../utils/util'\nimport type { CustomPropertyDefinition, Theme } from './theme'\n\n// See https://developer.mozilla.org/en-US/docs/Web/CSS/@property/syntax\nexport type CssSyntax =\n | 'angle'\n | 'color'\n | 'custom-ident'\n | 'image'\n | 'integer'\n | 'length'\n | 'length-percentage'\n | 'number'\n | 'percentage'\n | 'resolution'\n | 'string'\n | 'time'\n | 'transform-function'\n | 'transform-list'\n | 'url'\n | '*'\n\nexport type CssSyntaxNode =\n | {\n type: 'primitive'\n name: CssSyntax\n }\n | {\n type: 'keyword'\n keywords: string[]\n }\n\nexport function stringifySyntaxNode(node: CssSyntaxNode): string {\n switch (node.type) {\n case 'primitive':\n if (node.name === '*') {\n return node.name\n }\n\n return `<${node.name}>`\n case 'keyword':\n return node.keywords.join(' | ')\n default:\n throw new Error(`Unknown syntax node type: ${(node as any).type}`)\n }\n}\n\nexport function renderSyntaxDefinition(\n key: CustomPropertyName,\n { syntax, inherits, initialValue }: CustomPropertyDefinition,\n theme: Theme,\n): string {\n let value = initialValue\n if (initialValue?.includes('var(--')) {\n value = solveVarRecursively(initialValue, theme)\n }\n\n // Fallback in-case of no reference\n if (!isDefined(value) && syntax.type === 'primitive') {\n value = FALLBACK_VALUES[syntax.name]\n }\n\n return `@property ${key} {\n syntax: \"${stringifySyntaxNode(syntax)}\";\n inherits: ${String(inherits)};\n initial-value: ${value};\n}`\n}\n\nfunction solveVarRecursively(initialValue: string, theme: Theme, depth = 0) {\n // This makes a crazy assumption that no person would create a web of style-variable referencing deeper than 256\n if (depth > 2 ** 8) {\n return null\n }\n\n const VAR_REGEX = /var\\((--[a-zA-Z0-9-_]+)\\)/g\n\n let match\n while ((match = VAR_REGEX.exec(initialValue))) {\n const varName = match[1]\n const def = theme.propertyDefinitions?.[varName as CustomPropertyName]\n if (!isDefined(def)) {\n return null\n }\n\n const value = def.initialValue\n const returnValue = initialValue.replace(match[0], String(value))\n if (returnValue.includes('var(--')) {\n return solveVarRecursively(returnValue, theme, depth + 1)\n }\n\n return returnValue\n }\n\n return null\n}\n\nconst FALLBACK_VALUES: Record<CssSyntax, string> = {\n color: 'transparent',\n length: '0px',\n 'length-percentage': '0px',\n percentage: '0%',\n number: '0',\n angle: '0deg',\n time: '0s',\n resolution: '0dpi',\n 'custom-ident': 'none',\n string: '\"\"',\n image: 'none',\n url: 'none',\n 'transform-function': 'none',\n 'transform-list': 'none',\n '*': 'initial',\n integer: '0',\n}\n\nexport const appendUnit = (value: any, unit: Nullable<string>) =>\n isDefined(value) && isDefined(unit) && !String(value).endsWith(unit)\n ? `${value}${unit}`\n : value\n", "import type { OldTheme } from './theme'\n\nexport const CUSTOM_PROPERTIES_STYLESHEET_ID = 'nc-custom-properties'\n\nexport const RESET_STYLES = `\n@layer reset {\n html {\n height:100%;\n }\n\n #App {\n height:100%;\n display:flex;\n flex-direction:column;\n }\n\n body {\n height:100%;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n margin:0;\n }\n\n [data-node-id]:not([data-unset-toddle-styles],[data-node-type=\"text\"],noscript,br,script,style,math,math *,link,template,meta,title,base), [data-node-id]:not([data-unset-toddle-styles],noscript)::before, [data-node-id]:not([data-unset-toddle-styles],noscript)::after {\n display: flex;\n flex-direction: column;\n flex-grow: 0;\n flex-shrink: 0;\n\n position: relative;\n box-sizing: border-box;\n padding: 0;\n margin: 0;\n\n font-size: var(--text-base);\n font-family: var(--font-sans);\n font-weight: var(--font-weight-normal);\n\n background: transparent;\n color: inherit;\n border: none;\n box-shadow: none;\n }\n\n [data-node-id]:not([data-unset-toddle-styles]):is(p, h1, h2, h3, h4, h5, h6, label, span, strong, b, i, address, caption, code, cite, dt, dd, em, figcaption, legend, blockquote, abbr, pre, bdo, bdi) {\n display: inline-block;\n overflow-wrap: break-word;\n color: inherit;\n }\n\n [data-node-id]:not([data-unset-toddle-styles]):is(input, button, textarea, select) {\n outline: none;\n }\n\n [data-node-id]:not([data-unset-toddle-styles]):is(a) {\n color: inherit;\n text-decoration: none;\n }\n\n [data-node-id]:not([data-unset-toddle-styles]):is(ul, ol, li) {\n list-style: none;\n }\n\n [data-node-id]:not([data-unset-toddle-styles]):is(span[data-node-type=\"text\"]) {\n font: inherit;\n display: inline;\n flex-direction: column;\n flex-grow: 0;\n flex-shrink: 0;\n box-sizing: border-box;\n }\n\n [popover]:not(:popover-open):not(dialog[open]) {\n display: revert;\n }\n}`\nexport const theme: OldTheme = {\n colors: {\n grey: {\n order: 0,\n variants: {\n '50': { order: 0, value: '#FAFAFA' },\n '100': { order: 1, value: '#F5F5F5' },\n '200': { order: 2, value: '#E5E5E5' },\n '300': { order: 3, value: '#D4D4D4' },\n '400': { order: 4, value: '#A3A3A3' },\n '500': { order: 5, value: '#737373' },\n '600': { order: 6, value: '#525252' },\n '700': { order: 7, value: '#404040' },\n '800': { order: 8, value: '#262626' },\n '900': { order: 9, value: '#171717' },\n },\n },\n red: {\n order: 1,\n variants: {\n '50': { order: 0, value: '#FEF2F2' },\n '100': { order: 1, value: '#FEE2E2' },\n '200': { order: 2, value: '#FECACA' },\n '300': { order: 3, value: '#FCA5A5' },\n '400': { order: 4, value: '#F87171' },\n '500': { order: 5, value: '#EF4444' },\n '600': { order: 6, value: '#DC2626' },\n '700': { order: 7, value: '#B91C1C' },\n '800': { order: 8, value: '#991B1B' },\n '900': { order: 9, value: '#7F1D1D' },\n },\n },\n rose: {\n order: 3,\n variants: {\n '50': { order: 0, value: '#FFF1F2' },\n '100': { order: 1, value: '#FFE4E6' },\n '200': { order: 2, value: '#FECDD3' },\n '300': { order: 3, value: '#FDA4AF' },\n '400': { order: 4, value: '#FB7185' },\n '500': { order: 5, value: '#F43F5E' },\n '600': { order: 6, value: '#E11D48' },\n '700': { order: 7, value: '#BE123C' },\n '800': { order: 8, value: '#9F1239' },\n '900': { order: 9, value: '#881337' },\n },\n },\n pink: {\n order: 4,\n variants: {\n '50': { order: 0, value: '#FDF2F8' },\n '100': { order: 1, value: '#FCE7F3' },\n '200': { order: 2, value: '#FBCFE8' },\n '300': { order: 3, value: '#F9A8D4' },\n '400': { order: 4, value: '#F472B6' },\n '500': { order: 5, value: '#EC4899' },\n '600': { order: 6, value: '#DB2777' },\n '700': { order: 7, value: '#BE185D' },\n '800': { order: 8, value: '#9D174D' },\n '900': { order: 9, value: '#831843' },\n },\n },\n amber: {\n order: 5,\n variants: {\n '50': { order: 0, value: '#FFFBEB' },\n '100': { order: 1, value: '#FEF3C7' },\n '200': { order: 2, value: '#FDE68A' },\n '300': { order: 3, value: '#FCD34D' },\n '400': { order: 4, value: '#FBBF24' },\n '500': { order: 5, value: '#F59E0B' },\n '600': { order: 6, value: '#D97706' },\n '700': { order: 7, value: '#B45309' },\n '800': { order: 8, value: '#92400E' },\n '900': { order: 9, value: '#78350F' },\n },\n },\n orange: {\n order: 6,\n variants: {\n '50': { order: 0, value: '#FFF7ED' },\n '100': { order: 1, value: '#FFEDD5' },\n '200': { order: 2, value: '#FED7AA' },\n '300': { order: 3, value: '#FDBA74' },\n '400': { order: 4, value: '#FB923C' },\n '500': { order: 5, value: '#F97316' },\n '600': { order: 6, value: '#EA580C' },\n '700': { order: 7, value: '#C2410C' },\n '800': { order: 8, value: '#9A3412' },\n '900': { order: 9, value: '#7C2D12' },\n },\n },\n yellow: {\n order: 7,\n variants: {\n '50': { order: 0, value: '#FFFBEB' },\n '100': { order: 1, value: '#FEF3C7' },\n '200': { order: 2, value: '#FDE68A' },\n '300': { order: 3, value: '#FCD34D' },\n '400': { order: 4, value: '#FBBF24' },\n '500': { order: 5, value: '#F59E0B' },\n '600': { order: 6, value: '#D97706' },\n '700': { order: 7, value: '#B45309' },\n '800': { order: 8, value: '#92400E' },\n '900': { order: 9, value: '#78350F' },\n },\n },\n lime: {\n order: 8,\n variants: {\n '50': { order: 0, value: '#F7FEE7' },\n '100': { order: 1, value: '#ECFCCB' },\n '200': { order: 2, value: '#D9F99D' },\n '300': { order: 3, value: '#BEF264' },\n '400': { order: 4, value: '#A3E635' },\n '500': { order: 5, value: '#84CC16' },\n '600': { order: 6, value: '#65A30D' },\n '700': { order: 7, value: '#4D7C0F' },\n '800': { order: 8, value: '#3F6212' },\n '900': { order: 9, value: '#365314' },\n },\n },\n green: {\n order: 9,\n variants: {\n '50': { order: 0, value: '#ECFDF5' },\n '100': { order: 1, value: '#D1FAE5' },\n '200': { order: 2, value: '#A7F3D0' },\n '300': { order: 3, value: '#6EE7B7' },\n '400': { order: 4, value: '#34D399' },\n '500': { order: 5, value: '#10B981' },\n '600': { order: 6, value: '#059669' },\n '700': { order: 7, value: '#047857' },\n '800': { order: 8, value: '#065F46' },\n '900': { order: 9, value: '#064E3B' },\n },\n },\n emerald: {\n order: 10,\n variants: {\n '50': { order: 0, value: '#ECFDF5' },\n '100': { order: 1, value: '#D1FAE5' },\n '200': { order: 2, value: '#A7F3D0' },\n '300': { order: 3, value: '#6EE7B7' },\n '400': { order: 4, value: '#34D399' },\n '500': { order: 5, value: '#10B981' },\n '600': { order: 6, value: '#059669' },\n '700': { order: 7, value: '#047857' },\n '800': { order: 8, value: '#065F46' },\n '900': { order: 9, value: '#064E3B' },\n },\n },\n teal: {\n order: 11,\n variants: {\n '50': { order: 0, value: '#F0FDFA' },\n '100': { order: 1, value: '#CCFBF1' },\n '200': { order: 2, value: '#99F6E4' },\n '300': { order: 3, value: '#5EEAD4' },\n '400': { order: 4, value: '#2DD4BF' },\n '500': { order: 5, value: '#14B8A6' },\n '600': { order: 6, value: '#0D9488' },\n '700': { order: 7, value: '#0F766E' },\n '800': { order: 8, value: '#115E59' },\n '900': { order: 9, value: '#134E4A' },\n },\n },\n cyan: {\n order: 12,\n variants: {\n '50': { order: 0, value: '#ECFEFF' },\n '100': { order: 1, value: '#CFFAFE' },\n '200': { order: 2, value: '#A5F3FC' },\n '300': { order: 3, value: '#67E8F9' },\n '400': { order: 4, value: '#22D3EE' },\n '500': { order: 5, value: '#06B6D4' },\n '600': { order: 6, value: '#0891B2' },\n '700': { order: 7, value: '#0E7490' },\n '800': { order: 8, value: '#155E75' },\n '900': { order: 9, value: '#164E63' },\n },\n },\n sky: {\n order: 13,\n variants: {\n '50': { order: 0, value: '#F0F9FF' },\n '100': { order: 1, value: '#E0F2FE' },\n '200': { order: 2, value: '#BAE6FD' },\n '300': { order: 3, value: '#7DD3FC' },\n '400': { order: 4, value: '#38BDF8' },\n '500': { order: 5, value: '#0EA5E9' },\n '600': { order: 6, value: '#0284C7' },\n '700': { order: 7, value: '#0369A1' },\n '800': { order: 8, value: '#075985' },\n '900': { order: 9, value: '#0C4A6E' },\n },\n },\n blue: {\n order: 14,\n variants: {\n '50': { order: 0, value: '#EFF6FF' },\n '100': { order: 1, value: '#DBEAFE' },\n '200': { order: 2, value: '#BFDBFE' },\n '300': { order: 3, value: '#93C5FD' },\n '400': { order: 4, value: '#60A5FA' },\n '500': { order: 5, value: '#3B82F6' },\n '600': { order: 6, value: '#2563EB' },\n '700': { order: 7, value: '#1D4ED8' },\n '800': { order: 8, value: '#1E40AF' },\n '900': { order: 9, value: '#1E3A8A' },\n },\n },\n\n indigo: {\n order: 15,\n variants: {\n '50': { order: 0, value: '#EEF2FF' },\n '100': { order: 1, value: '#E0E7FF' },\n '200': { order: 2, value: '#C7D2FE' },\n '300': { order: 3, value: '#A5B4FC' },\n '400': { order: 4, value: '#818CF8' },\n '500': { order: 5, value: '#6366F1' },\n '600': { order: 6, value: '#4F46E5' },\n '700': { order: 7, value: '#4338CA' },\n '800': { order: 8, value: '#3730A3' },\n '900': { order: 9, value: '#312E81' },\n },\n },\n\n purple: {\n order: 16,\n variants: {\n '50': { order: 0, value: '#F5F3FF' },\n '100': { order: 1, value: '#EDE9FE' },\n '200': { order: 2, value: '#DDD6FE' },\n '300': { order: 3, value: '#C4B5FD' },\n '400': { order: 4, value: '#A78BFA' },\n '500': { order: 5, value: '#8B5CF6' },\n '600': { order: 6, value: '#7C3AED' },\n '700': { order: 7, value: '#6D28D9' },\n '800': { order: 8, value: '#5B21B6' },\n '900': { order: 9, value: '#4C1D95' },\n },\n },\n\n fuchsia: {\n order: 17,\n variants: {\n '50': { order: 0, value: '#FDF4FF' },\n '100': { order: 1, value: '#FAE8FF' },\n '200': { order: 2, value: '#F5D0FE' },\n '300': { order: 3, value: '#F0ABFC' },\n '400': { order: 4, value: '#E879F9' },\n '500': { order: 5, value: '#D946EF' },\n '600': { order: 6, value: '#C026D3' },\n '700': { order: 7, value: '#A21CAF' },\n '800': { order: 8, value: '#86198F' },\n '900': { order: 9, value: '#701A75' },\n },\n },\n },\n\n shadow: {\n sm: { order: 0, value: '0 1px 2px 0 rgba(0, 0, 0, 0.25)' },\n base: {\n order: 1,\n value: '0 1px 3px 0 rgba(0, 0, 0, 0.25), 0 1px 2px 0 rgba(0, 0, 0, 0.25)',\n },\n md: {\n order: 2,\n value:\n '0 4px 6px -1px rgba(0, 0, 0, 0.25), 0 2px 4px -1px rgba(0, 0, 0, 0.25)',\n },\n lg: {\n order: 3,\n value:\n '0 10px 15px -3px rgba(0, 0, 0, 0.25), 0 4px 6px -2px rgba(0, 0, 0, 0.25)',\n },\n xl: {\n order: 4,\n value:\n '0 20px 25px -5px rgba(0, 0, 0, 0.25), 0 10px 10px -5px rgba(0, 0, 0, 0.25)',\n },\n '2xl': { order: 5, value: '0 25px 50px -12px rgba(0, 0, 0, 0.25)' },\n },\n\n spacing: 0.25,\n fontSize: {\n lg: { order: 0, value: '1.125rem' },\n sm: { order: 1, value: '0.875rem' },\n xl: { order: 2, value: '1.25rem' },\n xs: { order: 3, value: '0.75rem' },\n '2xl': { order: 4, value: '1.5rem' },\n '3xl': { order: 5, value: '1.875rem' },\n '4xl': { order: 6, value: '2.25rem' },\n '5xl': { order: 7, value: '3rem' },\n xxs: { order: 8, value: '0.625rem' },\n base: { order: 9, value: '1rem', default: true },\n },\n fontFamily: {\n mono: { order: 0, value: ['Fira Code', 'monospace'] },\n sans: { order: 1, value: ['Inter', 'sans-serif'], default: true },\n },\n fontWeight: {\n bold: { order: 0, value: '700' },\n bolder: { order: 1, value: '800' },\n normal: { order: 2, value: '500', default: true },\n regular: { order: 3, value: '400' },\n 'semi-bold': { order: 4, value: '600' },\n },\n breakpoints: {\n large: { order: 2, value: 1440 },\n small: { order: 0, value: 576 },\n medium: { order: 1, value: 960 },\n },\n}\n", "import type { CustomPropertyName } from '../component/component.types'\nimport type { Nullable } from '../types'\nimport { isDefined } from '../utils/util'\nimport { renderSyntaxDefinition, type CssSyntaxNode } from './customProperty'\nimport { RESET_STYLES } from './theme.const'\n\nexport interface ThemeOptions {\n includeResetStyle: boolean\n createFontFaces: boolean\n}\n\nexport type StyleToken = {\n name: string\n type: 'value' | 'variable'\n value: string\n}\n\nexport type StyleTokenGroup = {\n name: string\n tokens: StyleToken[]\n}\n\nexport type StyleTokenCategory =\n | 'spacing'\n | 'color'\n | 'font-size'\n | 'font-weight'\n | 'z-index'\n | 'border-radius'\n | 'shadow'\n\nexport type FontFamily = {\n name: string\n family: string\n provider: 'google' | 'upload'\n type: 'serif' | 'sans-serif' | 'monospace' | 'cursive'\n variants: Array<{\n name: string\n weight:\n | '100'\n | '200'\n | '300'\n | '400'\n | '500'\n | '600'\n | '700'\n | '800'\n | '900'\n\n italic: boolean\n url: string\n }>\n}\n\nexport type OldTheme = {\n spacing: number\n colors: Record<\n string,\n {\n order: number\n variants: Record<string, { value: string; order: number }>\n }\n >\n fontFamily: Record<\n string,\n { value: string[]; order: number; default?: boolean }\n >\n fontWeight: Record<\n string,\n { value: string; order: number; default?: boolean }\n >\n fontSize: Record<string, { value: string; order: number; default?: boolean }>\n shadow: Record<string, { value: string; order: number }>\n breakpoints: Record<string, { value: number; order: number }>\n}\n\nexport type Theme = {\n default?: string\n defaultDark?: string\n defaultLight?: string\n propertyDefinitions?: Record<CustomPropertyName, CustomPropertyDefinition>\n themes?: Record<\n string,\n {\n order?: number\n }\n >\n // Legacy support\n scheme?: 'dark' | 'light'\n color?: StyleTokenGroup[]\n fonts: FontFamily[]\n 'font-size'?: StyleTokenGroup[]\n 'font-weight'?: StyleTokenGroup[]\n spacing?: StyleTokenGroup[]\n 'border-radius'?: StyleTokenGroup[]\n shadow?: StyleTokenGroup[]\n 'z-index'?: StyleTokenGroup[]\n}\n\nexport type CustomPropertyDefinition = {\n syntax: CssSyntaxNode\n inherits: boolean\n initialValue: Nullable<string> // Required by CSS specs for default-theme, but we can do a fallback so null is allowed\n description: string\n // Values mapped to theme names.\n // Values are not required, if left out, the default theme value will be used. If no default theme value exists, initialValue will be used.\n values: Record<string, Nullable<string>>\n}\n\nexport const getThemeCss = (\n themes: Record<string, OldTheme | Theme>,\n options: ThemeOptions,\n) => {\n const [themesV1, themesV2] = Object.entries(themes).reduce(\n ([legacy, modern], [key, value]) => {\n if ('breakpoints' in value) {\n legacy[key] = value\n } else {\n modern[key] = value\n }\n return [legacy, modern]\n },\n [{}, {}] as [Record<string, OldTheme>, Record<string, Theme>],\n )\n\n return `\n ${Object.values(themesV1)\n .map((t) => getOldThemeCss(t))\n .join('\\n')}\n\n ${Object.values(themesV2)\n .map((themeV2) => {\n return `\n ${Object.entries(themeV2.propertyDefinitions ?? {})\n .map(([propertyName, property]) =>\n renderSyntaxDefinition(\n propertyName as CustomPropertyName,\n property,\n themeV2,\n ),\n )\n .join('\\n')}\n\n ${renderThemeValues(':host, :root', getThemeEntries(themeV2, themeV2.default))}\n ${renderThemeValues(':host, :root', getThemeEntries(themeV2, themeV2.defaultDark), '@media (prefers-color-scheme: dark)')}\n ${renderThemeValues(':host, :root', getThemeEntries(themeV2, themeV2.defaultLight), '@media (prefers-color-scheme: light)')}\n ${Object.entries(themeV2.themes ?? {})\n .map(([key, _t]) =>\n renderThemeValues(\n `[data-theme~=\"${key}\"]`,\n getThemeEntries(themeV2, key),\n ),\n )\n .join('\\n')}\n `\n })\n .join('\\n')}\n\n${options.includeResetStyle ? RESET_STYLES : ''}\n@layer base {\n ${\n options.createFontFaces\n ? Object.values(themesV2)\n .map(({ fonts }) => fonts)\n .flat()\n .map(\n (font) => `\n ${font.variants\n .map(\n (variant) => `\n @font-face {\n font-family: \"${font.family}\";\n font-style: ${variant.italic ? 'italic' : 'normal'};\n font-weight: ${variant.weight};\n font-display: auto;\n src: local(\"${variant.url.substring(\n variant.url.lastIndexOf('/') + 1,\n )}\"), url(\"${variant.url.replace(\n 'https://fonts.gstatic.com',\n '/.toddle/fonts/font',\n )}\") format(\"woff2\");\n }\n `,\n )\n .join('\\n')}\n `,\n )\n .join('\\n')\n : ''\n }\n body, :host {\n /* Color */\n ${Object.values(themesV2)\n .map(({ color }) => color ?? [])\n .flat()\n .flatMap((group) =>\n group.tokens.map((color) => `--${color.name}: ${color.value};`),\n )\n .join('\\n')}\n /* Fonts */\n ${Object.values(themesV2)\n .map(({ fonts }) => fonts)\n .flat()\n .map((font) => `--font-${font.name}: '${font.family}',${font.type};`)\n .join('\\n')}\n\n /* Font size */\n ${Object.values(themesV2)\n .map(({ 'font-size': fontSize }) => fontSize ?? [])\n .flat()\n .flatMap((group) =>\n group.tokens.map(\n (variable) =>\n `--${variable.name}: ${\n variable.type === 'variable'\n ? `var(--${variable.value})`\n : variable.value\n };`,\n ),\n )\n .join('\\n')}\n /* Font weight */\n ${Object.values(themesV2)\n .map(({ 'font-weight': fontWeight }) => fontWeight ?? [])\n .flat()\n .flatMap((group) => {\n return group.tokens.map(\n (variable) =>\n `--${variable.name}: ${\n variable.type === 'variable'\n ? `var(--${variable.value})`\n : variable.value\n };`,\n )\n })\n .join('\\n')}\n /* Shadows */\n ${Object.values(themesV2)\n .map(({ shadow }) => shadow ?? [])\n .flat()\n .flatMap((group) => {\n return group.tokens.map(\n (variable) =>\n `--${variable.name}: ${\n variable.type === 'variable'\n ? `var(--${variable.value})`\n : variable.value\n };`,\n )\n })\n .join('\\n')}\n /* Border radius */\n ${Object.values(themesV2)\n .map(({ 'border-radius': borderRadius }) => borderRadius ?? [])\n .flat()\n .flatMap((group) => {\n return group.tokens.map(\n (token) =>\n `--${token.name}: ${\n token.type === 'variable' ? `var(--${token.value})` : token.value\n };`,\n )\n })\n .join('\\n')}\n /* Spacing */\n ${Object.values(themesV2)\n .map(({ spacing }) => spacing ?? [])\n .flat()\n .map((group) => {\n return group.tokens\n .map(\n (token) =>\n `--${token.name}: ${\n token.type === 'variable'\n ? `var(--${token.value})`\n : token.value\n };`,\n )\n .join('\\n')\n })\n .join('\\n')}\n /* Z-index */\n ${Object.values(themesV2)\n .map(({ 'z-index': zIndex }) => zIndex ?? [])\n .flat()\n .map((group) => {\n return group.tokens\n .map(\n (token) =>\n `--${token.name}: ${\n token.type === 'variable'\n ? `var(--${token.value})`\n : token.value\n };`,\n )\n .join('\\n')\n })\n .join('\\n')}\n }\n @keyframes animation-spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n }\n @keyframes animation-fade-in {\n from {\n opacity:0;\n }\n to {\n opacity:1;\n }\n }\n @keyframes animation-fade-out {\n from {\n opacity:1;\n }\n to {\n opacity:0;\n }\n }\n}\n`\n}\n\nexport const getOldThemeCss = (theme: OldTheme) => {\n const colorVars = Object.entries(theme.colors).flatMap(\n ([color, { variants }]) =>\n Object.entries(variants).map(\n ([variant, { value }]) => `--${color}-${variant}:${value}`,\n ),\n )\n return `\nbody, :host {\n ${Object.entries(theme.fontFamily)\n .map(\n ([\n name,\n {\n value: [family, ...fallback],\n },\n ]) => `--font-${name}: '${family}',${fallback.join(',')};`,\n )\n .join('\\n')}\n\n ${Object.entries(theme.fontWeight)\n .map(([name, { value }]) => `--font-weight-${name}: ${value};`)\n .join('\\n')}\n\n ${Object.entries(theme.fontSize)\n .map(([name, { value }]) => `--font-size-${name}: ${value};`)\n .join('\\n')}\n\n --spacing:${theme.spacing}rem;\n ${colorVars.join(';\\n')};\n\n --text-xxs:0.625rem;\n --line-height-xxs:0.9rem;\n\n --text-xs:0.75rem;\n --line-height-xs:1rem;\n\n --text-sm:0.875rem;\n --line-height-sm:1.25rem;\n\n --text-base:1rem;\n --line-height-base:1.5rem;\n\n --text-lg:1.125rem;\n --line-height-lg:1.75rem;\n\n --text-xl:1.25rem;\n --line-height-xl:1.75rem;\n\n --text-2xl:1.5rem;\n --line-height-2xl:2rem;\n\n --text-3xl:1.875rem;\n --line-height-3xl:2.25rem;\n\n --text-4xl:2.25rem;\n --line-height-4xl:2.5rem;\n\n --text-5xl:3rem;\n --line-height-5xl:3rem;\n\n ${Object.entries(theme.shadow)\n .map(([name, { value }]) => `--shadow-${name}:${value};`)\n .join('\\n')}\n}\n\n${RESET_STYLES}\n\n@keyframes animation-spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n@keyframes animation-fade-in {\n from {\n opacity:0;\n }\n to {\n opacity:1;\n }\n}\n@keyframes animation-fade-out {\n from {\n opacity:1;\n }\n to {\n opacity:0;\n }\n}`\n}\n\nexport function renderThemeValues(\n selector: string,\n entries: Record<string, string>,\n mediaQuery?: string,\n) {\n if (Object.entries(entries).length === 0) {\n return ''\n }\n\n const css = `${selector} {\n ${Object.entries(entries)\n .map(([propertyName, value]) => `${propertyName}: ${value};`)\n .join('\\n ')}\n}`\n\n if (mediaQuery) {\n return `${mediaQuery} {\n ${css}\n }`\n }\n\n return css\n}\n\nexport function getThemeEntries(\n theme: Theme,\n themeName: string | undefined,\n): Record<string, string> {\n const entries: Record<string, string> = {}\n if (!themeName) {\n return entries\n }\n\n for (const [propertyName, definition] of Object.entries(\n theme.propertyDefinitions ?? {},\n )) {\n const value = definition.values?.[themeName]\n if (!isDefined(value)) {\n continue\n }\n\n entries[propertyName] = value\n }\n\n return entries\n}\n", "import type {\n CustomProperty,\n CustomPropertyName,\n NodeStyleModel,\n} from '../component/component.types'\nimport type { Nullable } from '../types'\n\nexport type Shadow = {\n x: number\n y: number\n blur: number\n spread: number\n color: string\n inset: boolean\n}\n\nexport type Filter =\n | {\n name: 'Blur'\n radius: number\n }\n | {\n name: 'Opacity'\n percent: number\n }\n\ntype MediaQuery = {\n 'min-width'?: Nullable<string>\n 'max-width'?: Nullable<string>\n 'min-height'?: Nullable<string>\n 'max-height'?: Nullable<string>\n}\n\nexport interface StyleVariant {\n 'even-child'?: Nullable<boolean>\n 'first-child'?: Nullable<boolean>\n 'first-of-type'?: Nullable<boolean>\n 'focus-visible'?: Nullable<boolean>\n 'focus-within'?: Nullable<boolean>\n 'last-child'?: Nullable<boolean>\n 'last-of-type'?: Nullable<boolean>\n 'nth-child(even)'?: Nullable<boolean>\n 'popover-open'?: Nullable<boolean>\n active?: Nullable<boolean>\n autofill?: Nullable<boolean>\n breakpoint?: Nullable<'small' | 'medium' | 'large'>\n checked?: Nullable<boolean>\n class?: Nullable<string>\n className?: Nullable<string>\n customProperties?: Nullable<Record<CustomPropertyName, CustomProperty>>\n disabled?: Nullable<boolean>\n empty?: Nullable<boolean>\n evenChild?: Nullable<boolean>\n firstChild?: Nullable<boolean>\n focus?: Nullable<boolean>\n focusWithin?: Nullable<boolean>\n hover?: Nullable<boolean>\n id?: Nullable<string>\n invalid?: Nullable<boolean>\n lastChild?: Nullable<boolean>\n link?: Nullable<boolean>\n mediaQuery?: Nullable<MediaQuery>\n pseudoElement?: Nullable<string>\n startingStyle?: Nullable<boolean>\n style: NodeStyleModel\n visited?: Nullable<boolean>\n}\n\nexport const variantSelector = (variant: StyleVariant) =>\n [\n (variant.className ?? variant['class']) && `.${variant.className}`,\n (variant.evenChild ??\n variant['even-child'] ??\n variant['nth-child(even)']) &&\n ':nth-child(even)',\n (variant.firstChild ?? variant['first-child']) && ':first-child',\n (variant.focusWithin ?? variant['focus-within']) && ':focus-within',\n (variant.lastChild ?? variant['last-child']) && ':last-child',\n variant.active && ':active',\n variant.autofill && ':is(:-webkit-autofill, :autofill)',\n variant.checked && ':checked',\n variant.disabled && ':disabled',\n variant.empty && ':empty',\n variant.focus && ':focus',\n variant.hover && ':hover',\n variant.invalid && ':invalid',\n variant.link && ':link',\n variant.visited && ':visited',\n variant['first-of-type'] && ':first-of-type',\n variant['focus-visible'] && ':focus-visible',\n variant['last-of-type'] && ':last-of-type',\n variant['popover-open'] && ':popover-open',\n variant.pseudoElement && `::${variant.pseudoElement}`,\n ]\n .filter(Boolean)\n .join('')\n", "// cSpell:ignore thinn, ABCDEFGHIJKLMNOPQRSTYVWXYZ\nimport type {\n Component,\n ComponentNodeModel,\n ElementNodeModel,\n NodeStyleModel,\n} from '../component/component.types'\nimport type { Nullable } from '../types'\nimport { omitKeys } from '../utils/collections'\nimport { isDefined } from '../utils/util'\nimport { getClassName, toValidClassName } from './className'\nimport type { OldTheme, Theme, ThemeOptions } from './theme'\nimport { getThemeCss } from './theme'\nimport { variantSelector, type StyleVariant } from './variantSelector'\n\nconst LEGACY_BREAKPOINTS = {\n large: 1440,\n small: 576,\n medium: 960,\n}\n\nexport function kebabCase(string: string) {\n return string\n .split('')\n .map((char) => {\n return 'ABCDEFGHIJKLMNOPQRSTYVWXYZ'.includes(char)\n ? '-' + char.toLocaleLowerCase()\n : char\n })\n .join('')\n}\n\nconst SIZE_PROPERTIES = new Set([\n 'width',\n 'min-width',\n 'max-width',\n 'height',\n 'min-height',\n 'max-height',\n 'margin',\n 'margin-top',\n 'margin-left',\n 'margin-bottom',\n 'margin-right',\n 'padding',\n 'padding-top',\n 'padding-left',\n 'padding-bottom',\n 'padding-right',\n 'gap',\n 'gap-x',\n 'gap-y',\n 'border-radius',\n 'border-bottom-left-radius',\n 'border-bottom-right-radius',\n 'border-top-left-radius',\n 'border-top-right-radius',\n 'border-width',\n 'border-top-width',\n 'border-left-width',\n 'border-bottom-width',\n 'border-right-width',\n 'font-size',\n 'top',\n 'right',\n 'bottom',\n 'left',\n 'outline-width',\n])\n\nexport const createStylesheet = (\n root: Component,\n components: Component[],\n themes: Record<string, OldTheme | Theme>,\n options: ThemeOptions,\n // eslint-disable-next-line max-params\n) => {\n const hashes = new Set<string>()\n const animationHashes = new Set<string>()\n\n // Get fonts used on the page\n const fonts = getAllFonts(components)\n\n //Exclude fonts that are not used on this page.\n let stylesheet = getThemeCss(\n Object.fromEntries(\n Object.entries(themes).map(([key, theme]) =>\n 'breakpoints' in theme\n ? [\n key,\n {\n ...theme,\n fontFamily: Object.fromEntries(\n Object.entries(theme.fontFamily).filter(\n ([key, value]) =>\n value.default ?? fonts.has('--font-' + key),\n ),\n ),\n },\n ]\n : [\n key,\n {\n ...theme,\n fonts: theme.fonts,\n },\n ],\n ),\n ),\n options,\n )\n const styleToCss = (style: NodeStyleModel) => {\n return Object.entries(style)\n .map(([property, value]) => {\n if (!isDefined(value)) {\n // ignore undefined/null values\n return\n }\n const propertyName = kebabCase(property)\n const propertyValue =\n String(Number(value)) === String(value) &&\n SIZE_PROPERTIES.has(propertyName)\n ? `${Number(value) * 4}px`\n : value\n return `${propertyName}:${propertyValue};`\n })\n .filter(Boolean)\n .join('\\n ')\n }\n const getNodeStyles = (\n node: ElementNodeModel | ComponentNodeModel,\n classHash: string,\n ) => {\n try {\n const style = omitKeys(node.style ?? {}, [\n 'variants',\n 'breakpoints',\n 'shadows',\n ])\n const styleVariants =\n node.variants ??\n // Support for old style variants stored inside style object\n // Once we have better versioning options, this should be removed\n (node.style?.variants as any as StyleVariant[])\n const renderVariant = (\n selector: string,\n style: NodeStyleModel,\n options?: Nullable<{ startingStyle?: Nullable<boolean> }>,\n ) => {\n const scrollbarStyles = Object.entries(style).filter(\n ([key]) => key === 'scrollbar-width',\n )\n // If selectorCss is empty, we don't need to render the selector\n let styles = styleToCss(style)\n if (options?.startingStyle) {\n styles = `@starting-style {\n ${styles}\n }`\n }\n\n return `\n ${\n styles.length > 0\n ? `${selector} {\n ${styles}\n }`\n : ''\n }\n ${\n scrollbarStyles.length > 0\n ? `\n${selector}::-webkit-scrollbar {\n ${scrollbarStyles\n .map(([_, value]) => {\n switch (value) {\n case 'none':\n return 'width: 0;'\n case 'thinn':\n case 'thin':\n return 'width: 4px;'\n default:\n return ''\n }\n })\n .join('\\n')}\n}\n`\n : ''\n }\n`\n }\n\n return `\n ${renderVariant('.' + classHash, style)}\n ${(styleVariants ?? [])\n .map((variant) => {\n const renderedVariant = renderVariant(\n `.${classHash}${variantSelector(variant)}`,\n variant.style,\n {\n startingStyle: variant.startingStyle,\n },\n )\n\n if (variant.mediaQuery) {\n return `\n @media (${Object.entries(variant.mediaQuery)\n .map(([key, value]) => `${key}: ${value}`)\n .filter(Boolean)\n .join(') and (')}) {\n ${renderedVariant}\n }\n `\n }\n\n if (variant.breakpoint) {\n return `\n @media (min-width: ${LEGACY_BREAKPOINTS[variant.breakpoint]}px) {\n ${renderedVariant}\n }\n `\n }\n\n return renderedVariant\n })\n .join('\\n')}\n ${\n node.animations\n ? Object.entries(node.animations)\n .map(([animationName, keyframes]) => {\n // Animation names are stored by their hash, so no need to render them more than once.\n if (animationHashes.has(animationName)) {\n return ''\n }\n animationHashes.add(animationName)\n return `\n @keyframes ${animationName} {\n ${Object.values(keyframes)\n .sort((a, b) => a.position - b.position)\n .map(({ key, position, value }) => {\n return `\n ${position * 100}% {\n ${key}: ${value};\n }\n `\n })\n .join('\\n')}\n }\n `\n })\n .join('\\n')\n : ''\n }\n `\n } catch (e) {\n // eslint-disable-next-line no-console\n console.error(e)\n return ''\n }\n }\n\n // Make sure that CSS for dependencies are rendered first so that instance styles can override\n const visitedComponents = new Set<string>()\n function insertComponentStyles(\n component: Component,\n package_name?: string,\n ): string | undefined {\n if (visitedComponents.has(component.name)) {\n return\n }\n visitedComponents.add(component.name)\n if (!component.nodes) {\n // eslint-disable-next-line no-console\n console.warn('Unable to find nodes for component', component.name)\n return\n }\n Object.entries(component.nodes).forEach(([id, node]) => {\n if (node.type === 'component') {\n const childComponent = components.find(\n (c) =>\n c.name ===\n [node.package ?? package_name, node.name]\n .filter((c) => c)\n .join('/'),\n )\n if (childComponent) {\n insertComponentStyles(childComponent, node.package ?? package_name)\n stylesheet += getNodeStyles(\n node as any,\n toValidClassName(`${component.name}:${id}`, true),\n )\n\n return\n }\n }\n if (node.type !== 'element') {\n return\n }\n const classHash = getClassName([node.style, node.variants])\n if (hashes.has(classHash)) {\n return ''\n }\n hashes.add(classHash)\n stylesheet += getNodeStyles(node as any, classHash)\n })\n }\n insertComponentStyles(root)\n\n return stylesheet\n}\n\nexport const getAllFonts = (components: Component[]) => {\n return new Set(\n components\n .flatMap((component) => {\n return Object.values(component.nodes ?? {}).flatMap((node) => {\n if (node.type === 'element') {\n return [\n node.style?.fontFamily,\n node.style?.['font-family'],\n ...(node.variants?.map(\n (v) => v.style.fontFamily ?? v.style['font-family'],\n ) ?? []),\n ].filter(isDefined)\n }\n return []\n })\n })\n .map((f) =>\n String(f).replace('var(', '').replace(')', '').replaceAll(\"'\", ''),\n ),\n )\n}\n", "import type { ContextApi, ContextApiV2 } from '../types'\n\nexport const isContextApiV2 = (api: ContextApi): api is ContextApiV2 =>\n 'triggerActions' in api\n", "/* eslint-disable no-console */\nimport type {\n ActionModel,\n ComponentData,\n SetMultiUrlParameterAction,\n SetURLParameterAction,\n} from '@nordcraft/core/dist/component/component.types'\nimport { applyFormula } from '@nordcraft/core/dist/formula/formula'\nimport { mapValues, omitKeys } from '@nordcraft/core/dist/utils/collections'\nimport { isDefined, toBoolean } from '@nordcraft/core/dist/utils/util'\nimport fastDeepEqual from 'fast-deep-equal'\nimport { isContextApiV2 } from '../api/apiUtils'\nimport type { ComponentContext, Location } from '../types'\nimport { getLocationUrl } from '../utils/url'\n\n// eslint-disable-next-line max-params\nexport function handleAction(\n action: ActionModel,\n data: ComponentData,\n ctx: ComponentContext,\n event?: Event,\n workflowCallback?: (event: string, data: unknown) => void,\n) {\n try {\n if (!action) {\n throw new Error('Action does not exist')\n }\n switch (action.type) {\n case 'Switch': {\n // find the first case that resolves to true.\n // Only one case in a switch will be executed.\n const actionList =\n action.cases.find(({ condition }) =>\n toBoolean(\n applyFormula(condition, {\n data,\n component: ctx.component,\n formulaCache: ctx.formulaCache,\n root: ctx.root,\n package: ctx.package,\n toddle: ctx.toddle,\n env: ctx.env,\n }),\n ),\n ) ?? action.default\n if (!actionList) {\n return\n }\n // handle all actions for the case\n for (const action of actionList.actions) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n handleAction(\n action,\n { ...data, ...ctx.dataSignal.get() },\n ctx,\n event,\n workflowCallback,\n )\n }\n break\n }\n case 'SetVariable': {\n const value = applyFormula(action.data, {\n data,\n component: ctx.component,\n formulaCache: ctx.formulaCache,\n root: ctx.root,\n package: ctx.package,\n toddle: ctx.toddle,\n env: ctx.env,\n })\n ctx.dataSignal.update((data) => {\n return {\n ...data,\n Variables: {\n ...data.Variables,\n [action.variable]: value,\n },\n }\n })\n break\n }\n case 'TriggerEvent': {\n const payload = applyFormula(action.data, {\n data,\n component: ctx.component,\n formulaCache: ctx.formulaCache,\n root: ctx.root,\n package: ctx.package,\n toddle: ctx.toddle,\n env: ctx.env,\n })\n ctx.triggerEvent(action.event, payload)\n break\n }\n case 'TriggerWorkflowCallback': {\n const payload = applyFormula(action.data, {\n data,\n component: ctx.component,\n formulaCache: ctx.formulaCache,\n root: ctx.root,\n package: ctx.package,\n toddle: ctx.toddle,\n env: ctx.env,\n })\n workflowCallback?.(action.event, payload)\n break\n }\n case 'SetURLParameter': {\n ctx.toddle.locationSignal.update((current) => {\n const value = applyFormula(action.data, {\n data,\n component: ctx.component,\n formulaCache: ctx.formulaCache,\n root: ctx.root,\n package: ctx.package,\n toddle: ctx.toddle,\n env: ctx.env,\n })\n // historyMode was previously not declared explicitly, and we default\n // to push for state changes and replace for query changes\n let historyMode: SetURLParameterAction['historyMode'] | undefined\n let newLocation: Location | undefined\n // We should only match on p.type === 'param', but\n // that would technically be a breaking change\n if (current.route?.path.some((p) => p.name === action.parameter)) {\n historyMode = 'push'\n newLocation = {\n ...current,\n params: {\n ...omitKeys(current.params, [action.parameter]),\n [action.parameter]: value,\n },\n }\n }\n // We should check if the query parameter exists in the route\n // but that would technically be a breaking change\n // else if (Object.values(current.route?.query ?? {}).some((q) => q.name === action.parameter))\n else {\n historyMode = 'replace'\n newLocation = {\n ...current,\n query: {\n ...omitKeys(current.query, [action.parameter]),\n ...(isDefined(value) ? { [action.parameter]: value } : null),\n },\n }\n }\n if (!historyMode) {\n // No path/query parameter matched\n return current\n }\n\n const currentUrl = getLocationUrl(current)\n const historyUrl = getLocationUrl(newLocation)\n if (historyUrl !== currentUrl) {\n // Default to the historyMode from the action, and fallback\n // to the default (push for path change, replace for query change)\n historyMode = action.historyMode ?? historyMode\n // Update the window's history state\n if (historyMode === 'push') {\n window.history.pushState({}, '', historyUrl)\n } else {\n window.history.replaceState({}, '', historyUrl)\n }\n }\n return newLocation\n })\n break\n }\n case 'SetURLParameters': {\n const parameters = Object.entries(action.parameters ?? {})\n if (parameters.length === 0) {\n return\n }\n ctx.toddle.locationSignal.update((current) => {\n if (!current.route) {\n // A route must exist for us to update/validate against it\n return current\n }\n // We default to push for state changes and replace for query changes\n let historyMode: SetMultiUrlParameterAction['historyMode'] = 'replace'\n const queryUpdates: Record<string, string> = {}\n const pathUpdates: Record<string, string> = {}\n const urlParameterCtx = {\n data,\n component: ctx.component,\n formulaCache: ctx.formulaCache,\n root: ctx.root,\n package: ctx.package,\n toddle: ctx.toddle,\n env: ctx.env,\n }\n // Only match on p.type === 'param'\n const isValidPathParameter = (param: string) =>\n current.route?.path.some(\n (p) => p.name === param && p.type === 'param',\n )\n const isValidQueryParameter = (param: string) =>\n Object.values(current.route?.query ?? {}).some(\n (q) => q.name === param,\n )\n\n for (const [parameter, formula] of parameters) {\n const value = applyFormula(formula, urlParameterCtx) ?? null\n if (isValidPathParameter(parameter)) {\n historyMode = 'push'\n pathUpdates[parameter] = value as string\n } else if (isValidQueryParameter(parameter)) {\n queryUpdates[parameter] = value as string\n }\n }\n if (\n Object.keys(pathUpdates).length === 0 &&\n Object.keys(queryUpdates).length === 0\n ) {\n // No path/query parameter matched\n // We'll exit early to avoid deep equal below\n return current\n }\n\n const newLocation = {\n ...current,\n params: {\n ...omitKeys(current.params, Object.keys(pathUpdates)),\n ...pathUpdates,\n },\n query: {\n ...omitKeys(current.query, Object.keys(queryUpdates)),\n ...queryUpdates,\n },\n }\n if (fastDeepEqual(newLocation, current)) {\n // No path/query parameter matched\n return current\n }\n\n const currentUrl = getLocationUrl(current)\n const historyUrl = getLocationUrl(newLocation)\n if (historyUrl !== currentUrl) {\n // Default to the historyMode from the action, and fallback\n // to the default (push for path change, replace for query change)\n historyMode = action.historyMode ?? historyMode\n // Update the window's history state\n if (historyMode === 'push') {\n window.history.pushState({}, '', historyUrl)\n } else {\n window.history.replaceState({}, '', historyUrl)\n }\n }\n return newLocation\n })\n break\n }\n case 'Fetch': {\n const api = ctx.apis[action.api]\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (!api) {\n console.error('The api ', action.api, 'does not exist')\n return\n }\n\n if (isContextApiV2(api)) {\n // Evaluate potential inputs here to make sure the api have the right values\n // This is needed if the inputs are formulas referencing workflow parameters\n const actionInputs = mapValues(action.inputs ?? {}, (input) =>\n applyFormula(input.formula, {\n data,\n component: ctx.component,\n formulaCache: ctx.formulaCache,\n root: ctx.root,\n package: ctx.package,\n toddle: ctx.toddle,\n env: ctx.env,\n }),\n )\n const actionModels = {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n onCompleted: action.onSuccess?.actions ?? [],\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n onFailed: action.onError?.actions ?? [],\n onMessage: action.onMessage?.actions ?? [],\n }\n void api.fetch({\n actionInputs,\n actionModels,\n componentData: data,\n workflowCallback,\n })\n } else {\n const triggerActions = (actions: ActionModel[]) => {\n for (const subAction of actions) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n handleAction(\n subAction,\n { ...data, ...ctx.dataSignal.get() },\n ctx,\n event,\n workflowCallback,\n )\n }\n }\n api.fetch().then(\n () => {\n triggerActions(action.onSuccess.actions)\n },\n () => {\n triggerActions(action.onError.actions)\n },\n )\n }\n\n break\n }\n case 'TriggerWorkflow': {\n const parameters = mapValues(action.parameters ?? {}, (parameter) =>\n applyFormula(parameter.formula, {\n data,\n component: ctx.component,\n formulaCache: ctx.formulaCache,\n root: ctx.root,\n package: ctx.package,\n toddle: ctx.toddle,\n env: ctx.env,\n }),\n )\n const callbacks = action.callbacks\n if (action.contextProvider) {\n const provider =\n ctx.providers[\n [ctx.package, action.contextProvider].filter(isDefined).join('/')\n ] ?? ctx.providers[action.contextProvider]\n const workflow = provider?.component.workflows?.[action.workflow]\n if (!workflow) {\n if (provider) {\n console.warn(\n `Cannot find workflow \"${action.workflow}\" on component \"${action.contextProvider}\". It has likely been removed or modified.`,\n )\n }\n return\n }\n\n workflow.actions.forEach((action) =>\n handleAction(\n action,\n {\n ...data,\n ...provider.ctx.dataSignal.get(),\n Parameters: parameters,\n },\n provider.ctx,\n event,\n (callbackName, callbackData) => {\n const callback = callbacks?.[callbackName]\n callback?.actions?.forEach((action) =>\n handleAction(\n action,\n {\n ...data,\n ...ctx.dataSignal.get(),\n Parameters: parameters,\n Event: callbackData,\n },\n ctx,\n event,\n workflowCallback,\n ),\n )\n },\n ),\n )\n return\n }\n\n const workflow = ctx.component.workflows?.[action.workflow]\n if (!workflow) {\n console.warn(\n `Workflow ${action.workflow} does not exist on component ${ctx.component.name}`,\n )\n return\n }\n\n workflow.actions.forEach((action) =>\n handleAction(\n action,\n {\n ...data,\n ...ctx.dataSignal.get(),\n Parameters: parameters,\n },\n ctx,\n event,\n (callbackName, callbackData) => {\n const callback = callbacks?.[callbackName]\n callback?.actions?.forEach((action) =>\n handleAction(\n action,\n {\n ...data,\n ...ctx.dataSignal.get(),\n Parameters: parameters,\n Event: callbackData,\n },\n ctx,\n event,\n workflowCallback,\n ),\n )\n },\n ),\n )\n break\n }\n default: {\n try {\n // create a handler for actions triggering events\n const triggerActionEvent = (trigger: string, eventData: any) => {\n const subEvent = action.events?.[trigger]\n if (subEvent) {\n subEvent.actions.forEach((action) =>\n handleAction(\n action,\n eventData\n ? { ...data, ...ctx.dataSignal.get(), Event: eventData }\n : { ...data, ...ctx.dataSignal.get() },\n ctx,\n eventData ?? event,\n workflowCallback,\n ),\n )\n }\n }\n const newAction =\n action.version === 2\n ? (ctx.toddle.getCustomAction ?? ctx.toddle.getCustomAction)(\n action.name,\n action.package ?? ctx.package,\n )\n : undefined\n if (newAction) {\n // First evaluate any arguments (input) to the action\n const args = (action.arguments ?? []).reduce<\n Record<string, unknown>\n >(\n (args, arg) =>\n arg\n ? {\n ...args,\n [arg.name]: applyFormula(arg.formula, {\n data,\n component: ctx.component,\n formulaCache: ctx.formulaCache,\n root: ctx.root,\n package: ctx.package,\n toddle: ctx.toddle,\n env: ctx.env,\n }),\n }\n : args,\n {},\n )\n const result = newAction.handler?.(\n args,\n {\n root: ctx.root,\n triggerActionEvent,\n },\n event,\n )\n // If the result is a function, then it should behave as a cleanup function, that runs, usually when the component is unmounted.\n // Useful for removeEventListeners, clearTimeout, etc.\n if (\n result &&\n (typeof result === 'function' || result instanceof Promise)\n ) {\n ctx.dataSignal.subscribe((data) => data, {\n destroy: () => {\n if (result instanceof Promise) {\n result\n .then((cleanup) => {\n if (typeof cleanup === 'function') {\n cleanup()\n }\n })\n .catch((err) => console.error(err))\n } else {\n result()\n }\n },\n })\n }\n\n return result\n } else {\n const legacyHandler = ctx.toddle.getAction(action.name)\n if (!legacyHandler) {\n console.error('Missing custom action', action.name)\n return\n }\n // First evaluate any arguments (input) to the action\n const args = action.arguments?.map((arg) =>\n applyFormula(arg?.formula, {\n data,\n component: ctx.component,\n formulaCache: ctx.formulaCache,\n root: ctx.root,\n package: ctx.package,\n toddle: ctx.toddle,\n env: ctx.env,\n }),\n ) ?? [\n applyFormula(action.data, {\n data,\n component: ctx.component,\n formulaCache: ctx.formulaCache,\n root: ctx.root,\n package: ctx.package,\n toddle: ctx.toddle,\n env: ctx.env,\n }),\n ] // action.data is a fallback to handle an older version of the action spec.\n return legacyHandler(args, { ...ctx, triggerActionEvent }, event)\n }\n } catch (err) {\n console.error('Error in Custom Action', err)\n }\n }\n }\n } catch (e) {\n console.error(e)\n return null\n }\n}\n", "/**\n * Tokenizer results.\n */\ninterface LexToken {\n type:\n | \"OPEN\"\n | \"CLOSE\"\n | \"PATTERN\"\n | \"NAME\"\n | \"CHAR\"\n | \"ESCAPED_CHAR\"\n | \"MODIFIER\"\n | \"END\";\n index: number;\n value: string;\n}\n\n/**\n * Tokenize input string.\n */\nfunction lexer(str: string): LexToken[] {\n const tokens: LexToken[] = [];\n let i = 0;\n\n while (i < str.length) {\n const char = str[i];\n\n if (char === \"*\" || char === \"+\" || char === \"?\") {\n tokens.push({ type: \"MODIFIER\", index: i, value: str[i++] });\n continue;\n }\n\n if (char === \"\\\\\") {\n tokens.push({ type: \"ESCAPED_CHAR\", index: i++, value: str[i++] });\n continue;\n }\n\n if (char === \"{\") {\n tokens.push({ type: \"OPEN\", index: i, value: str[i++] });\n continue;\n }\n\n if (char === \"}\") {\n tokens.push({ type: \"CLOSE\", index: i, value: str[i++] });\n continue;\n }\n\n if (char === \":\") {\n let name = \"\";\n let j = i + 1;\n\n while (j < str.length) {\n const code = str.charCodeAt(j);\n\n if (\n // `0-9`\n (code >= 48 && code <= 57) ||\n // `A-Z`\n (code >= 65 && code <= 90) ||\n // `a-z`\n (code >= 97 && code <= 122) ||\n // `_`\n code === 95\n ) {\n name += str[j++];\n continue;\n }\n\n break;\n }\n\n if (!name) throw new TypeError(`Missing parameter name at ${i}`);\n\n tokens.push({ type: \"NAME\", index: i, value: name });\n i = j;\n continue;\n }\n\n if (char === \"(\") {\n let count = 1;\n let pattern = \"\";\n let j = i + 1;\n\n if (str[j] === \"?\") {\n throw new TypeError(`Pattern cannot start with \"?\" at ${j}`);\n }\n\n while (j < str.length) {\n if (str[j] === \"\\\\\") {\n pattern += str[j++] + str[j++];\n continue;\n }\n\n if (str[j] === \")\") {\n count--;\n if (count === 0) {\n j++;\n break;\n }\n } else if (str[j] === \"(\") {\n count++;\n if (str[j + 1] !== \"?\") {\n throw new TypeError(`Capturing groups are not allowed at ${j}`);\n }\n }\n\n pattern += str[j++];\n }\n\n if (count) throw new TypeError(`Unbalanced pattern at ${i}`);\n if (!pattern) throw new TypeError(`Missing pattern at ${i}`);\n\n tokens.push({ type: \"PATTERN\", index: i, value: pattern });\n i = j;\n continue;\n }\n\n tokens.push({ type: \"CHAR\", index: i, value: str[i++] });\n }\n\n tokens.push({ type: \"END\", index: i, value: \"\" });\n\n return tokens;\n}\n\nexport interface ParseOptions {\n /**\n * Set the default delimiter for repeat parameters. (default: `'/'`)\n */\n delimiter?: string;\n /**\n * List of characters to automatically consider prefixes when parsing.\n */\n prefixes?: string;\n}\n\n/**\n * Parse a string for the raw tokens.\n */\nexport function parse(str: string, options: ParseOptions = {}): Token[] {\n const tokens = lexer(str);\n const { prefixes = \"./\", delimiter = \"/#?\" } = options;\n const result: Token[] = [];\n let key = 0;\n let i = 0;\n let path = \"\";\n\n const tryConsume = (type: LexToken[\"type\"]): string | undefined => {\n if (i < tokens.length && tokens[i].type === type) return tokens[i++].value;\n };\n\n const mustConsume = (type: LexToken[\"type\"]): string => {\n const value = tryConsume(type);\n if (value !== undefined) return value;\n const { type: nextType, index } = tokens[i];\n throw new TypeError(`Unexpected ${nextType} at ${index}, expected ${type}`);\n };\n\n const consumeText = (): string => {\n let result = \"\";\n let value: string | undefined;\n while ((value = tryConsume(\"CHAR\") || tryConsume(\"ESCAPED_CHAR\"))) {\n result += value;\n }\n return result;\n };\n\n const isSafe = (value: string): boolean => {\n for (const char of delimiter) if (value.indexOf(char) > -1) return true;\n return false;\n };\n\n const safePattern = (prefix: string) => {\n const prev = result[result.length - 1];\n const prevText = prefix || (prev && typeof prev === \"string\" ? prev : \"\");\n\n if (prev && !prevText) {\n throw new TypeError(\n `Must have text between two parameters, missing text after \"${(prev as Key).name}\"`,\n );\n }\n\n if (!prevText || isSafe(prevText)) return `[^${escapeString(delimiter)}]+?`;\n return `(?:(?!${escapeString(prevText)})[^${escapeString(delimiter)}])+?`;\n };\n\n while (i < tokens.length) {\n const char = tryConsume(\"CHAR\");\n const name = tryConsume(\"NAME\");\n const pattern = tryConsume(\"PATTERN\");\n\n if (name || pattern) {\n let prefix = char || \"\";\n\n if (prefixes.indexOf(prefix) === -1) {\n path += prefix;\n prefix = \"\";\n }\n\n if (path) {\n result.push(path);\n path = \"\";\n }\n\n result.push({\n name: name || key++,\n prefix,\n suffix: \"\",\n pattern: pattern || safePattern(prefix),\n modifier: tryConsume(\"MODIFIER\") || \"\",\n });\n continue;\n }\n\n const value = char || tryConsume(\"ESCAPED_CHAR\");\n if (value) {\n path += value;\n continue;\n }\n\n if (path) {\n result.push(path);\n path = \"\";\n }\n\n const open = tryConsume(\"OPEN\");\n if (open) {\n const prefix = consumeText();\n const name = tryConsume(\"NAME\") || \"\";\n const pattern = tryConsume(\"PATTERN\") || \"\";\n const suffix = consumeText();\n\n mustConsume(\"CLOSE\");\n\n result.push({\n name: name || (pattern ? key++ : \"\"),\n pattern: name && !pattern ? safePattern(prefix) : pattern,\n prefix,\n suffix,\n modifier: tryConsume(\"MODIFIER\") || \"\",\n });\n continue;\n }\n\n mustConsume(\"END\");\n }\n\n return result;\n}\n\nexport interface TokensToFunctionOptions {\n /**\n * When `true` the regexp will be case sensitive. (default: `false`)\n */\n sensitive?: boolean;\n /**\n * Function for encoding input strings for output.\n */\n encode?: (value: string, token: Key) => string;\n /**\n * When `false` the function can produce an invalid (unmatched) path. (default: `true`)\n */\n validate?: boolean;\n}\n\n/**\n * Compile a string to a template function for the path.\n */\nexport function compile<P extends object = object>(\n str: string,\n options?: ParseOptions & TokensToFunctionOptions,\n) {\n return tokensToFunction<P>(parse(str, options), options);\n}\n\nexport type PathFunction<P extends object = object> = (data?: P) => string;\n\n/**\n * Expose a method for transforming tokens into the path function.\n */\nexport function tokensToFunction<P extends object = object>(\n tokens: Token[],\n options: TokensToFunctionOptions = {},\n): PathFunction<P> {\n const reFlags = flags(options);\n const { encode = (x: string) => x, validate = true } = options;\n\n // Compile all the tokens into regexps.\n const matches = tokens.map((token) => {\n if (typeof token === \"object\") {\n return new RegExp(`^(?:${token.pattern})$`, reFlags);\n }\n });\n\n return (data: Record<string, any> | null | undefined) => {\n let path = \"\";\n\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i];\n\n if (typeof token === \"string\") {\n path += token;\n continue;\n }\n\n const value = data ? data[token.name] : undefined;\n const optional = token.modifier === \"?\" || token.modifier === \"*\";\n const repeat = token.modifier === \"*\" || token.modifier === \"+\";\n\n if (Array.isArray(value)) {\n if (!repeat) {\n throw new TypeError(\n `Expected \"${token.name}\" to not repeat, but got an array`,\n );\n }\n\n if (value.length === 0) {\n if (optional) continue;\n\n throw new TypeError(`Expected \"${token.name}\" to not be empty`);\n }\n\n for (let j = 0; j < value.length; j++) {\n const segment = encode(value[j], token);\n\n if (validate && !(matches[i] as RegExp).test(segment)) {\n throw new TypeError(\n `Expected all \"${token.name}\" to match \"${token.pattern}\", but got \"${segment}\"`,\n );\n }\n\n path += token.prefix + segment + token.suffix;\n }\n\n continue;\n }\n\n if (typeof value === \"string\" || typeof value === \"number\") {\n const segment = encode(String(value), token);\n\n if (validate && !(matches[i] as RegExp).test(segment)) {\n throw new TypeError(\n `Expected \"${token.name}\" to match \"${token.pattern}\", but got \"${segment}\"`,\n );\n }\n\n path += token.prefix + segment + token.suffix;\n continue;\n }\n\n if (optional) continue;\n\n const typeOfMessage = repeat ? \"an array\" : \"a string\";\n throw new TypeError(`Expected \"${token.name}\" to be ${typeOfMessage}`);\n }\n\n return path;\n };\n}\n\nexport interface RegexpToFunctionOptions {\n /**\n * Function for decoding strings for params.\n */\n decode?: (value: string, token: Key) => string;\n}\n\n/**\n * A match result contains data about the path match.\n */\nexport interface MatchResult<P extends object = object> {\n path: string;\n index: number;\n params: P;\n}\n\n/**\n * A match is either `false` (no match) or a match result.\n */\nexport type Match<P extends object = object> = false | MatchResult<P>;\n\n/**\n * The match function takes a string and returns whether it matched the path.\n */\nexport type MatchFunction<P extends object = object> = (\n path: string,\n) => Match<P>;\n\n/**\n * Create path match function from `path-to-regexp` spec.\n */\nexport function match<P extends object = object>(\n str: Path,\n options?: ParseOptions & TokensToRegexpOptions & RegexpToFunctionOptions,\n) {\n const keys: Key[] = [];\n const re = pathToRegexp(str, keys, options);\n return regexpToFunction<P>(re, keys, options);\n}\n\n/**\n * Create a path match function from `path-to-regexp` output.\n */\nexport function regexpToFunction<P extends object = object>(\n re: RegExp,\n keys: Key[],\n options: RegexpToFunctionOptions = {},\n): MatchFunction<P> {\n const { decode = (x: string) => x } = options;\n\n return function (pathname: string) {\n const m = re.exec(pathname);\n if (!m) return false;\n\n const { 0: path, index } = m;\n const params = Object.create(null);\n\n for (let i = 1; i < m.length; i++) {\n if (m[i] === undefined) continue;\n\n const key = keys[i - 1];\n\n if (key.modifier === \"*\" || key.modifier === \"+\") {\n params[key.name] = m[i].split(key.prefix + key.suffix).map((value) => {\n return decode(value, key);\n });\n } else {\n params[key.name] = decode(m[i], key);\n }\n }\n\n return { path, index, params };\n };\n}\n\n/**\n * Escape a regular expression string.\n */\nfunction escapeString(str: string) {\n return str.replace(/([.+*?=^!:${}()[\\]|/\\\\])/g, \"\\\\$1\");\n}\n\n/**\n * Get the flags for a regexp from the options.\n */\nfunction flags(options?: { sensitive?: boolean }) {\n return options && options.sensitive ? \"\" : \"i\";\n}\n\n/**\n * Metadata about a key.\n */\nexport interface Key {\n name: string | number;\n prefix: string;\n suffix: string;\n pattern: string;\n modifier: string;\n}\n\n/**\n * A token is a string (nothing special) or key metadata (capture group).\n */\nexport type Token = string | Key;\n\n/**\n * Pull out keys from a regexp.\n */\nfunction regexpToRegexp(path: RegExp, keys?: Key[]): RegExp {\n if (!keys) return path;\n\n const groupsRegex = /\\((?:\\?<(.*?)>)?(?!\\?)/g;\n\n let index = 0;\n let execResult = groupsRegex.exec(path.source);\n while (execResult) {\n keys.push({\n // Use parenthesized substring match if available, index otherwise\n name: execResult[1] || index++,\n prefix: \"\",\n suffix: \"\",\n modifier: \"\",\n pattern: \"\",\n });\n execResult = groupsRegex.exec(path.source);\n }\n\n return path;\n}\n\n/**\n * Transform an array into a regexp.\n */\nfunction arrayToRegexp(\n paths: Array<string | RegExp>,\n keys?: Key[],\n options?: TokensToRegexpOptions & ParseOptions,\n): RegExp {\n const parts = paths.map((path) => pathToRegexp(path, keys, options).source);\n return new RegExp(`(?:${parts.join(\"|\")})`, flags(options));\n}\n\n/**\n * Create a path regexp from string input.\n */\nfunction stringToRegexp(\n path: string,\n keys?: Key[],\n options?: TokensToRegexpOptions & ParseOptions,\n) {\n return tokensToRegexp(parse(path, options), keys, options);\n}\n\nexport interface TokensToRegexpOptions {\n /**\n * When `true` the regexp will be case sensitive. (default: `false`)\n */\n sensitive?: boolean;\n /**\n * When `true` the regexp won't allow an optional trailing delimiter to match. (default: `false`)\n */\n strict?: boolean;\n /**\n * When `true` the regexp will match to the end of the string. (default: `true`)\n */\n end?: boolean;\n /**\n * When `true` the regexp will match from the beginning of the string. (default: `true`)\n */\n start?: boolean;\n /**\n * Sets the final character for non-ending optimistic matches. (default: `/`)\n */\n delimiter?: string;\n /**\n * List of characters that can also be \"end\" characters.\n */\n endsWith?: string;\n /**\n * Encode path tokens for use in the `RegExp`.\n */\n encode?: (value: string) => string;\n}\n\n/**\n * Expose a function for taking tokens and returning a RegExp.\n */\nexport function tokensToRegexp(\n tokens: Token[],\n keys?: Key[],\n options: TokensToRegexpOptions = {},\n) {\n const {\n strict = false,\n start = true,\n end = true,\n encode = (x: string) => x,\n delimiter = \"/#?\",\n endsWith = \"\",\n } = options;\n const endsWithRe = `[${escapeString(endsWith)}]|$`;\n const delimiterRe = `[${escapeString(delimiter)}]`;\n let route = start ? \"^\" : \"\";\n\n // Iterate over the tokens and create our regexp string.\n for (const token of tokens) {\n if (typeof token === \"string\") {\n route += escapeString(encode(token));\n } else {\n const prefix = escapeString(encode(token.prefix));\n const suffix = escapeString(encode(token.suffix));\n\n if (token.pattern) {\n if (keys) keys.push(token);\n\n if (prefix || suffix) {\n if (token.modifier === \"+\" || token.modifier === \"*\") {\n const mod = token.modifier === \"*\" ? \"?\" : \"\";\n route += `(?:${prefix}((?:${token.pattern})(?:${suffix}${prefix}(?:${token.pattern}))*)${suffix})${mod}`;\n } else {\n route += `(?:${prefix}(${token.pattern})${suffix})${token.modifier}`;\n }\n } else {\n if (token.modifier === \"+\" || token.modifier === \"*\") {\n throw new TypeError(\n `Can not repeat \"${token.name}\" without a prefix and suffix`,\n );\n }\n\n route += `(${token.pattern})${token.modifier}`;\n }\n } else {\n route += `(?:${prefix}${suffix})${token.modifier}`;\n }\n }\n }\n\n if (end) {\n if (!strict) route += `${delimiterRe}?`;\n\n route += !options.endsWith ? \"$\" : `(?=${endsWithRe})`;\n } else {\n const endToken = tokens[tokens.length - 1];\n const isEndDelimited =\n typeof endToken === \"string\"\n ? delimiterRe.indexOf(endToken[endToken.length - 1]) > -1\n : endToken === undefined;\n\n if (!strict) {\n route += `(?:${delimiterRe}(?=${endsWithRe}))?`;\n }\n\n if (!isEndDelimited) {\n route += `(?=${delimiterRe}|${endsWithRe})`;\n }\n }\n\n return new RegExp(route, flags(options));\n}\n\n/**\n * Supported `path-to-regexp` input types.\n */\nexport type Path = string | RegExp | Array<string | RegExp>;\n\n/**\n * Normalize the given path string, returning a regular expression.\n *\n * An empty array can be passed in for the keys, which will hold the\n * placeholder key descriptions. For example, using `/user/:id`, `keys` will\n * contain `[{ name: 'id', delimiter: '/', optional: false, repeat: false }]`.\n */\nexport function pathToRegexp(\n path: Path,\n keys?: Key[],\n options?: TokensToRegexpOptions & ParseOptions,\n) {\n if (path instanceof RegExp) return regexpToRegexp(path, keys);\n if (Array.isArray(path)) return arrayToRegexp(path, keys, options);\n return stringToRegexp(path, keys, options);\n}\n", "import { isDefined } from '@nordcraft/core/dist/utils/util'\nimport { compile } from 'path-to-regexp'\nimport type { Location } from '../types'\n\nexport const getLocationUrl = ({\n query,\n page,\n route,\n params,\n hash,\n}: Location) => {\n let path: string\n if (route) {\n const pathSegments: string[] = []\n for (const segment of route.path) {\n if (segment.type === 'static') {\n pathSegments.push(segment.name)\n } else {\n const segmentValue = params[segment.name]\n if (isDefined(segmentValue)) {\n pathSegments.push(segmentValue)\n } else {\n // If a param is missing, we can't build the rest of the path\n break\n }\n }\n }\n path = '/' + pathSegments.join('/')\n } else {\n path = compile(page as string, { encode: encodeURIComponent })(params)\n }\n const hashString = hash === undefined || hash === '' ? '' : '#' + hash\n const queryString = Object.entries(query)\n .filter(([_, q]) => q !== null)\n .map(([key, value]) => {\n return `${encodeURIComponent(\n route?.query[key]?.name ?? key,\n )}=${encodeURIComponent(String(value))}`\n })\n .join('&')\n\n return `${path}${hashString}${\n queryString.length > 0 ? '?' + queryString : ''\n }`\n}\n", "/* eslint-disable @typescript-eslint/no-floating-promises */\nimport type { LegacyComponentAPI } from '@nordcraft/core/dist/api/apiTypes'\nimport { mapHeadersToObject } from '@nordcraft/core/dist/api/headers'\nimport type { ComponentData } from '@nordcraft/core/dist/component/component.types'\nimport { applyFormula, isFormula } from '@nordcraft/core/dist/formula/formula'\nimport type { Nullable } from '@nordcraft/core/dist/types'\nimport { mapValues } from '@nordcraft/core/dist/utils/collections'\nimport { parseJSONWithDate } from '@nordcraft/core/dist/utils/json'\nimport { handleAction } from '../events/handleAction'\nimport type { Signal } from '../signal/signal'\nimport type { ComponentContext } from '../types'\n\nexport type ApiRequest = {\n url: string\n method: 'GET' | 'POST' | 'DELETE' | 'PUT' | 'OPTION' | 'HEAD'\n auth: Nullable<{ type: string }>\n headers: Record<string, string>\n body: any\n}\n\n/**\n * Set up an api for a component.\n * API requests are either proxied through toddle's back-end\n * or sent directly to the api endpoint (when api.proxy === false)\n */\nexport function createLegacyAPI(\n api: LegacyComponentAPI,\n ctx: ComponentContext,\n) {\n let timer: any = null\n\n // Create the payload we send to toddle's back-end\n // This includes url, headers, and content, sent in the body of a post request to /_query/<ComponentName>.<QueryName>\n function constructPayload(\n api: LegacyComponentAPI,\n data: ComponentData,\n ): ApiRequest {\n const formulaContext = {\n data,\n component: ctx.component,\n formulaCache: ctx.formulaCache,\n root: ctx.root,\n package: ctx.package,\n toddle: ctx.toddle,\n env: ctx.env,\n }\n\n // construct the url\n const baseUrl = applyFormula(api.url, formulaContext) ?? ''\n const urlPath =\n api.path && api.path.length > 0\n ? '/' +\n api.path.map((p) => applyFormula(p.formula, formulaContext)).join('/')\n : ''\n\n // build querystring\n const queryParams = Object.values(api.queryParams ?? {})\n const queryString =\n queryParams.length > 0\n ? '?' +\n queryParams\n .map(\n (param) =>\n `${param.name}=${encodeURIComponent(\n applyFormula(param.formula, formulaContext),\n )}`,\n )\n .join('&')\n : ''\n const headers = isFormula(api.headers) // this is supporting a few legacy cases where the whole header object was set as a formula. This is no longer possible\n ? applyFormula(api.headers, {\n data,\n component: ctx.component,\n formulaCache: ctx.formulaCache,\n root: ctx.root,\n package: ctx.package,\n toddle: ctx.toddle,\n env: ctx.env,\n })\n : mapValues(api.headers ?? {}, (value) =>\n applyFormula(value, {\n data,\n component: ctx.component,\n formulaCache: ctx.formulaCache,\n root: ctx.root,\n package: ctx.package,\n toddle: ctx.toddle,\n env: ctx.env,\n }),\n )\n const contentType = String(\n Object.entries(headers).find(\n ([key]) => key.toLocaleLowerCase() === 'content-type',\n )?.[1],\n )\n const method = api.method ?? 'GET'\n const body =\n api.body && ['POST', 'PUT', 'PATCH', 'DELETE'].includes(method)\n ? encodeBody(\n applyFormula(api.body, {\n data,\n component: ctx.component,\n formulaCache: ctx.formulaCache,\n root: ctx.root,\n package: ctx.package,\n toddle: ctx.toddle,\n env: ctx.env,\n }),\n contentType,\n )\n : undefined\n return {\n url: baseUrl + urlPath + queryString,\n method,\n auth: api.auth,\n headers,\n body,\n }\n }\n\n // extract the response body\n async function getBody(res: Response) {\n const textBody = await res.text()\n try {\n return parseJSONWithDate(textBody)\n } catch {\n return textBody\n }\n }\n\n function encodeBody(body: any, contentType?: string): FormData | string {\n switch (contentType) {\n case 'application/x-www-form-urlencoded': {\n if (typeof body === 'object' && body !== null) {\n return Object.entries(body)\n .map(([key, value]) => {\n if (Array.isArray(value)) {\n return value\n .map(\n (v) =>\n `${encodeURIComponent(key)}=${encodeURIComponent(v)}`,\n )\n .join('&')\n } else {\n return `${encodeURIComponent(key)}=${encodeURIComponent(\n String(value),\n )}`\n }\n })\n .join('&')\n }\n return ''\n }\n case 'multipart/form-data': {\n const formData = new FormData()\n if (typeof body === 'object' && body !== null) {\n Object.entries(body).forEach(([key, value]) => {\n formData.set(key, value as string | Blob)\n })\n }\n return formData\n }\n case 'text/plain':\n return String(body)\n default:\n return JSON.stringify(body)\n }\n }\n\n function apiSuccess(data: any) {\n ctx.dataSignal.set({\n ...ctx.dataSignal.get(),\n Apis: {\n ...ctx.dataSignal.get().Apis,\n [api.name]: {\n data,\n error: null,\n isLoading: false,\n },\n },\n })\n api.onCompleted?.actions?.forEach((action) => {\n handleAction(action, ctx.dataSignal.get(), ctx)\n })\n }\n\n function apiError(error: any) {\n ctx.dataSignal.set({\n ...ctx.dataSignal.get(),\n Apis: {\n ...ctx.dataSignal.get().Apis,\n [api.name]: {\n data: null,\n isLoading: false,\n error: error,\n },\n },\n })\n api.onFailed?.actions?.forEach((action) => {\n handleAction(action, ctx.dataSignal.get(), ctx)\n })\n }\n\n // Execute the request to the cloudflare Query proxy\n async function execute(payload: ApiRequest) {\n ctx.dataSignal.set({\n ...ctx.dataSignal.get(),\n Apis: {\n ...ctx.dataSignal.get().Apis,\n [api.name]: {\n data: ctx.dataSignal.get().Apis?.[api.name]?.data ?? null,\n isLoading: true,\n error: null,\n },\n },\n })\n let response\n\n try {\n if (api.proxy === false) {\n response = await fetch(payload.url, {\n method: payload.method,\n headers: payload.headers,\n body: payload.body,\n })\n } else {\n response = await fetch(\n `/_query/${encodeURIComponent(\n ctx.component.name,\n )}.${encodeURIComponent(api.name)}`,\n {\n method: 'POST',\n body: JSON.stringify(payload),\n signal: ctx.abortSignal,\n headers: {\n 'Content-Type': 'application/json',\n },\n },\n )\n }\n const data = await getBody(response)\n if (response.ok) {\n apiSuccess(data)\n } else {\n throw data\n }\n } catch (error: any) {\n apiError(error)\n return Promise.reject(error)\n }\n }\n\n // Handles throttle and debounce if set.\n function trigger(body: ApiRequest) {\n if (typeof api.debounce === 'number') {\n return new Promise((resolve, reject) => {\n if (typeof timer === 'number') {\n clearTimeout(timer)\n }\n timer = setTimeout(() => {\n execute(body).then(resolve, reject)\n }, api.debounce as number)\n })\n } else if (typeof api.throttle === 'number') {\n if (typeof timer === 'number') {\n return new Promise(() => {})\n }\n timer = setTimeout(() => {\n if (typeof timer === 'number') {\n clearTimeout(timer)\n }\n }, api.throttle)\n return execute(body)\n } else {\n return execute(body)\n }\n }\n\n let payloadSignal: Signal<ApiRequest> | undefined\n ctx.dataSignal.update((data) => {\n return {\n ...data,\n Apis: {\n ...(data.Apis ?? {}),\n [api.name]: data.Apis?.[api.name] ?? {\n data: null,\n isLoading:\n api.autoFetch &&\n applyFormula(api.autoFetch, {\n data: ctx.dataSignal.get(),\n component: ctx.component,\n formulaCache: ctx.formulaCache,\n root: ctx.root,\n package: ctx.package,\n toddle: ctx.toddle,\n env: ctx.env,\n })\n ? true\n : false,\n error: null,\n },\n },\n }\n })\n if (api.autoFetch) {\n payloadSignal = ctx.dataSignal.map((data) => constructPayload(api, data))\n let firstRun = true\n payloadSignal.subscribe((body) => {\n if (\n api.autoFetch &&\n applyFormula(api.autoFetch, {\n data: ctx.dataSignal.get(),\n component: ctx.component,\n formulaCache: ctx.formulaCache,\n root: ctx.root,\n package: ctx.package,\n toddle: ctx.toddle,\n env: ctx.env,\n })\n ) {\n // We should only lookup cached data for pages since\n // we don't fetch data for component APIs during SSR\n if (firstRun && ctx.isRootComponent) {\n firstRun = false\n const cached = ctx.toddle?.pageState?.Apis?.[api.name]\n if (cached && cached.data) {\n if (typeof cached.data === 'string') {\n // Mimic the behavior from getBody and parse\n // the response to JSON if possible\n apiSuccess(parseJSONWithDate(cached.data))\n } else {\n apiSuccess(cached.data)\n }\n } else {\n trigger(body)\n }\n } else {\n trigger(body)\n }\n }\n })\n }\n return {\n fetch: (request?: ApiRequest) => {\n const apiPayload = constructPayload(api, ctx.dataSignal.get())\n let body = apiPayload.body\n // Use a Headers object since it's case insensitive\n const headers = new Headers({\n ...apiPayload.headers,\n ...(request?.headers ?? {}),\n })\n if (request?.body) {\n body = encodeBody(\n request.body,\n headers.get('Content-Type') ?? undefined,\n )\n }\n if (body instanceof FormData) {\n // Remove content type header if body is a FormData object\n // Otherwise fetch won't do its magic when sending the request\n headers.delete('Content-Type')\n }\n const payload: ApiRequest = {\n url: request?.url ?? apiPayload.url,\n method: request?.method ?? apiPayload.method,\n auth: request?.auth ?? apiPayload.auth,\n headers: mapHeadersToObject(headers),\n body,\n }\n return trigger(payload)\n },\n destroy: () => payloadSignal?.destroy(),\n }\n}\n", "const LOCALHOSTS = ['http://localhost:54404', 'http://preview.localhost:54404']\n\nexport const isLocalhostUrl = (hrefOrOrigin: string) =>\n LOCALHOSTS.some((host) => hrefOrOrigin.startsWith(host))\n\nexport const isLocalhostHostname = (hostname: string) =>\n hostname === 'localhost' || hostname === '127.0.0.1'\n\nexport const validateUrl = ({\n path,\n origin,\n}: {\n path: string | null | undefined\n origin: string | undefined\n}) => {\n if (typeof path !== 'string') {\n return false\n }\n try {\n const urlObject = new URL(path, origin)\n // Creating a new URL object will not correctly encode the search params\n // So we need to iterate over them to make sure they are encoded as that happens when setting them explicitly\n const searchCopy = new URLSearchParams(urlObject.searchParams)\n searchCopy.forEach((value, key) => {\n urlObject.searchParams.delete(key, value)\n })\n searchCopy.forEach((value, key) => {\n urlObject.searchParams.append(key, value)\n })\n return urlObject\n } catch {\n return false\n }\n}\n\nexport const PROXY_URL_HEADER = 'x-nordcraft-url'\n\nexport const PROXY_TEMPLATES_IN_BODY = 'x-nordcraft-templates-in-body'\n\nexport const REWRITE_HEADER = 'x-nordcraft-rewrite'\n", "/* eslint-disable @typescript-eslint/no-floating-promises */\nimport {\n createApiEvent,\n createApiRequest,\n isApiError,\n requestHash,\n} from '@nordcraft/core/dist/api/api'\nimport type {\n ApiPerformance,\n ApiRequest,\n ApiStatus,\n ToddleRequestInit,\n} from '@nordcraft/core/dist/api/apiTypes'\nimport {\n isEventStreamHeader,\n isImageHeader,\n isJsonHeader,\n isJsonStreamHeader,\n isTextHeader,\n mapHeadersToObject,\n} from '@nordcraft/core/dist/api/headers'\nimport type { ComponentData } from '@nordcraft/core/dist/component/component.types'\nimport type {\n Formula,\n FormulaContext,\n} from '@nordcraft/core/dist/formula/formula'\nimport { applyFormula } from '@nordcraft/core/dist/formula/formula'\nimport type { NestedOmit, Nullable } from '@nordcraft/core/dist/types'\nimport {\n omitPaths,\n sortObjectEntries,\n} from '@nordcraft/core/dist/utils/collections'\nimport {\n PROXY_TEMPLATES_IN_BODY,\n PROXY_URL_HEADER,\n validateUrl,\n} from '@nordcraft/core/dist/utils/url'\nimport { isDefined, toBoolean } from '@nordcraft/core/dist/utils/util'\nimport { handleAction } from '../events/handleAction'\nimport type { Signal } from '../signal/signal'\nimport type { ComponentContext, ContextApiV2 } from '../types'\n\n/**\n * Set up an api v2 for a component.\n */\nexport function createAPI({\n apiRequest,\n componentData: initialComponentData,\n ctx,\n}: {\n apiRequest: ApiRequest\n componentData: ComponentData\n ctx: ComponentContext\n}): ContextApiV2 {\n // If `__toddle` isn't found it is in a web component context. We behave as if the page isn't loaded.\n let timer: any = null\n let api = { ...apiRequest }\n\n function constructRequest(\n api: ApiRequest,\n componentData: ComponentData,\n ): ReturnType<typeof createApiRequest> {\n // Get baseUrl and validate it. (It wont be in web component context)\n let baseUrl: string | undefined = window.origin\n try {\n new URL(baseUrl)\n } catch {\n baseUrl = undefined\n }\n\n const request = createApiRequest({\n api,\n formulaContext: getFormulaContext(api, componentData),\n baseUrl,\n defaultHeaders: undefined,\n })\n return {\n ...request,\n requestSettings: {\n ...request.requestSettings,\n // credentials is a browser specific setting and cannot be set in the\n // createApiRequest function directly as it's shared between server and client\n credentials:\n api.client?.credentials &&\n ['include', 'same-origin', 'omit'].includes(api.client.credentials)\n ? api.client.credentials\n : // Default to same-origin\n undefined,\n },\n }\n }\n\n // Create the formula context for the api\n function getFormulaContext(\n api: ApiRequest,\n componentData: ComponentData | undefined,\n ): FormulaContext {\n // Use the general formula context to evaluate the arguments of the api\n const formulaContext = {\n data: ctx.dataSignal.get(),\n component: ctx.component,\n formulaCache: ctx.formulaCache,\n root: ctx.root,\n package: ctx.package,\n toddle: ctx.toddle,\n env: ctx.env,\n }\n\n // Make sure inputs are also available in the formula context\n const evaluatedInputs = Object.entries(api.inputs).reduce<\n Record<string, unknown>\n >((acc, [key, value]) => {\n acc[key] = applyFormula(value.formula, formulaContext)\n return acc\n }, {})\n\n const data = {\n ...componentData,\n ...formulaContext.data,\n ApiInputs: {\n ...evaluatedInputs,\n },\n }\n\n return {\n component: ctx.component,\n formulaCache: ctx.formulaCache,\n root: ctx.root,\n package: ctx.package,\n data,\n toddle: ctx.toddle,\n env: ctx.env,\n }\n }\n\n function handleRedirectRules(api: ApiRequest, componentData: ComponentData) {\n for (const [ruleName, rule] of sortObjectEntries(\n api.redirectRules ?? {},\n ([_, rule]) => rule.index,\n )) {\n const formulaContext = getFormulaContext(api, componentData)\n const location = applyFormula(rule.formula, {\n ...formulaContext,\n data: {\n ...formulaContext.data,\n Apis: {\n [api.name]: ctx.dataSignal.get().Apis?.[api.name] as ApiStatus,\n },\n },\n })\n if (typeof location === 'string') {\n const url = validateUrl({\n path: location,\n origin: window.location.origin,\n })\n if (url) {\n if (ctx.env.runtime === 'preview') {\n // Attempt to notify the parent about the failed navigation attempt\n window.parent?.postMessage(\n { type: 'blockedNavigation', url: url.href },\n '*',\n )\n return { name: ruleName, index: rule.index, url }\n } else {\n window.location.replace(url.href)\n }\n }\n }\n }\n }\n\n function triggerActions({\n eventName,\n api,\n data,\n componentData,\n workflowCallback,\n }: {\n eventName: 'message' | 'success' | 'failed'\n api: ApiRequest\n data: {\n body: unknown\n status?: Nullable<number>\n headers?: Nullable<Record<string, string>>\n }\n componentData: ComponentData\n workflowCallback?: (event: string, data: unknown) => void\n }) {\n switch (eventName) {\n case 'message': {\n const event = createApiEvent('message', data.body)\n api.client?.onMessage?.actions?.forEach((action) => {\n handleAction(\n action,\n {\n ...getFormulaContext(api, componentData).data,\n Event: event,\n },\n ctx,\n event,\n workflowCallback,\n )\n })\n break\n }\n case 'success': {\n const event = createApiEvent('success', data.body)\n api.client?.onCompleted?.actions?.forEach((action) => {\n handleAction(\n action,\n {\n ...getFormulaContext(api, componentData).data,\n Event: event,\n },\n ctx,\n event,\n workflowCallback,\n )\n })\n break\n }\n case 'failed': {\n const event = createApiEvent('failed', {\n error: data.body,\n status: data.status,\n })\n api.client?.onFailed?.actions?.forEach((action) => {\n handleAction(\n action,\n {\n ...getFormulaContext(api, componentData).data,\n Event: event,\n },\n ctx,\n event,\n workflowCallback,\n )\n })\n break\n }\n }\n }\n\n function apiSuccess({\n api,\n componentData,\n data,\n performance,\n }: {\n api: ApiRequest\n componentData: ComponentData\n data: {\n body: unknown\n status?: Nullable<number>\n headers?: Nullable<Record<string, string>>\n }\n performance: ApiPerformance\n }) {\n const latestRequestStart =\n ctx.dataSignal.get().Apis?.[api.name]?.response?.performance?.requestStart\n if (\n typeof latestRequestStart === 'number' &&\n latestRequestStart > (performance.requestStart ?? 0)\n ) {\n return\n }\n\n ctx.dataSignal.set({\n ...ctx.dataSignal.get(),\n Apis: {\n ...ctx.dataSignal.get().Apis,\n [api.name]: {\n isLoading: false,\n data: data.body,\n error: null,\n response: {\n status: data.status,\n headers: data.headers,\n performance,\n },\n },\n },\n })\n const appliedRedirectRule = handleRedirectRules(api, componentData)\n if (appliedRedirectRule) {\n ctx.dataSignal.set({\n ...ctx.dataSignal.get(),\n Apis: {\n ...ctx.dataSignal.get().Apis,\n [api.name]: {\n isLoading: false,\n data: data.body,\n error: null,\n response: {\n status: data.status,\n headers: data.headers,\n performance,\n ...(ctx.env.runtime === 'preview'\n ? { debug: { appliedRedirectRule } }\n : {}),\n },\n },\n },\n })\n }\n }\n\n function apiError({\n api,\n componentData,\n data,\n performance,\n }: {\n api: ApiRequest\n componentData: ComponentData\n data: {\n body: unknown\n status?: Nullable<number>\n headers?: Nullable<Record<string, string>>\n }\n performance: ApiPerformance\n }) {\n const latestRequestStart =\n ctx.dataSignal.get().Apis?.[api.name]?.response?.performance?.requestStart\n if (\n typeof latestRequestStart === 'number' &&\n latestRequestStart > (performance.requestStart ?? 0)\n ) {\n return\n }\n ctx.dataSignal.set({\n ...ctx.dataSignal.get(),\n Apis: {\n ...ctx.dataSignal.get().Apis,\n [api.name]: {\n isLoading: false,\n data: null,\n error: data.body,\n response: {\n status: data.status,\n headers: data.headers,\n performance,\n },\n },\n },\n })\n const appliedRedirectRule = handleRedirectRules(api, componentData)\n if (appliedRedirectRule) {\n ctx.dataSignal.set({\n ...ctx.dataSignal.get(),\n Apis: {\n ...ctx.dataSignal.get().Apis,\n [api.name]: {\n isLoading: false,\n data: null,\n error: data.body,\n response: {\n status: data.status,\n headers: data.headers,\n performance,\n ...(ctx.env.runtime === 'preview'\n ? { debug: { appliedRedirectRule } }\n : {}),\n },\n },\n },\n })\n }\n }\n\n // Execute the request - potentially to the cloudflare Query proxy\n async function execute({\n api,\n url,\n requestSettings,\n componentData,\n workflowCallback,\n }: {\n api: ApiRequest\n url: URL\n requestSettings: ToddleRequestInit\n componentData: ComponentData\n workflowCallback?: (event: string, data: unknown) => void\n }) {\n const run = async () => {\n const performance: ApiPerformance = {\n requestStart: Date.now(),\n responseStart: null,\n responseEnd: null,\n }\n ctx.dataSignal.set({\n ...ctx.dataSignal.get(),\n Apis: {\n ...ctx.dataSignal.get().Apis,\n [api.name]: {\n isLoading: true,\n data: ctx.dataSignal.get().Apis?.[api.name]?.data ?? null,\n error: null,\n },\n },\n })\n let response\n\n try {\n const proxy = api.server?.proxy\n ? (applyFormula(\n api.server.proxy.enabled.formula,\n getFormulaContext(api, componentData),\n ) ?? false)\n : false\n\n if (proxy === false) {\n response = await fetch(url, requestSettings)\n } else {\n const proxyUrl = `/.toddle/omvej/components/${encodeURIComponent(\n ctx.component.name,\n )}/apis/${encodeURIComponent(\n ctx.component.name,\n )}:${encodeURIComponent(api.name)}`\n const headers = new Headers(requestSettings.headers)\n headers.set(\n PROXY_URL_HEADER,\n decodeURIComponent(url.href.replace(/\\+/g, ' ')),\n )\n const allowBodyTemplateValues = toBoolean(\n applyFormula(\n api.server?.proxy?.useTemplatesInBody?.formula,\n getFormulaContext(api, componentData),\n ),\n )\n if (allowBodyTemplateValues) {\n headers.set(PROXY_TEMPLATES_IN_BODY, 'true')\n }\n requestSettings.headers = headers\n response = await fetch(proxyUrl, requestSettings)\n }\n\n performance.responseStart = Date.now()\n await handleResponse({\n api,\n componentData,\n res: response,\n performance,\n workflowCallback,\n })\n return\n } catch (error: any) {\n const body = error.cause\n ? { message: error.message, data: error.cause }\n : error.message\n apiError({\n api,\n componentData,\n data: { body },\n performance: { ...performance, responseEnd: Date.now() },\n })\n triggerActions({\n eventName: 'failed',\n api,\n data: { body },\n componentData,\n workflowCallback,\n })\n return Promise.reject(error)\n }\n }\n\n // Debounce the request if needed\n if (api.client?.debounce?.formula) {\n return new Promise((resolve, reject) => {\n if (typeof timer === 'number') {\n clearTimeout(timer)\n }\n timer = setTimeout(\n () => {\n run().then(resolve, reject)\n },\n applyFormula(\n api.client?.debounce?.formula,\n getFormulaContext(api, componentData),\n ),\n )\n })\n }\n\n return run()\n }\n\n function handleResponse({\n api,\n componentData,\n res,\n performance,\n workflowCallback,\n }: {\n api: ApiRequest\n componentData: ComponentData\n res: Response\n performance: ApiPerformance\n workflowCallback?: (event: string, data: unknown) => void\n }) {\n let parserMode = api.client?.parserMode ?? 'auto'\n\n if (parserMode === 'auto') {\n const contentType = res.headers.get('content-type')\n if (isEventStreamHeader(contentType)) {\n parserMode = 'event-stream'\n } else if (isJsonHeader(contentType)) {\n parserMode = 'json'\n } else if (isTextHeader(contentType)) {\n parserMode = 'text'\n } else if (isJsonStreamHeader(contentType)) {\n parserMode = 'json-stream'\n } else if (isImageHeader(contentType)) {\n parserMode = 'blob'\n } else {\n parserMode = 'text'\n }\n }\n\n switch (parserMode) {\n case 'text':\n return textStreamResponse({\n api,\n componentData,\n res,\n performance,\n workflowCallback,\n })\n case 'json':\n return jsonResponse({\n api,\n componentData,\n res,\n performance,\n workflowCallback,\n })\n case 'event-stream':\n return eventStreamingResponse({\n api,\n componentData,\n res,\n performance,\n workflowCallback,\n })\n case 'json-stream':\n return jsonStreamResponse({\n api,\n componentData,\n res,\n performance,\n workflowCallback,\n })\n case 'blob':\n return blobResponse({\n api,\n componentData,\n res,\n performance,\n workflowCallback,\n })\n default:\n return textStreamResponse({\n api,\n componentData,\n res,\n performance,\n workflowCallback,\n })\n }\n }\n\n function textStreamResponse({\n api,\n res,\n performance,\n componentData,\n workflowCallback,\n }: {\n api: ApiRequest\n res: Response\n performance: ApiPerformance\n componentData: ComponentData\n workflowCallback?: (event: string, data: unknown) => void\n }) {\n return handleStreaming({\n api,\n res,\n performance,\n streamType: 'text',\n useTextDecoder: true,\n parseChunk: (chunk) => chunk,\n parseChunksForData: (chunks) => chunks.join(''),\n componentData,\n workflowCallback,\n })\n }\n\n function jsonStreamResponse({\n api,\n res,\n performance,\n componentData,\n workflowCallback,\n }: {\n api: ApiRequest\n res: Response\n performance: ApiPerformance\n componentData: ComponentData\n workflowCallback?: (event: string, data: unknown) => void\n }) {\n const parseChunk = (chunk: any) => {\n let parsedData = chunk\n try {\n parsedData = JSON.parse(chunk)\n } catch {\n throw new Error('Error occurred while parsing the json chunk.', {\n cause: parsedData,\n })\n }\n return parsedData\n }\n\n return handleStreaming({\n api,\n res,\n performance,\n streamType: 'json',\n useTextDecoder: true,\n parseChunk,\n parseChunksForData: (chunks) => [...chunks],\n delimiters: ['\\r\\n', '\\n'],\n componentData,\n workflowCallback,\n })\n }\n\n async function jsonResponse({\n api,\n componentData,\n res,\n performance,\n workflowCallback,\n }: {\n api: ApiRequest\n componentData: ComponentData\n res: Response\n performance: ApiPerformance\n workflowCallback?: (event: string, data: unknown) => void\n }) {\n const body = await res.json()\n\n const status: ApiStatus = {\n data: body,\n isLoading: false,\n error: null,\n response: {\n status: res.status,\n headers: mapHeadersToObject(res.headers),\n },\n }\n return endResponse({\n api,\n apiStatus: status,\n componentData,\n performance,\n workflowCallback,\n })\n }\n\n async function blobResponse({\n api,\n componentData,\n res,\n performance,\n workflowCallback,\n }: {\n api: ApiRequest\n componentData: ComponentData\n res: Response\n performance: ApiPerformance\n workflowCallback?: (event: string, data: unknown) => void\n }) {\n const blob = await res.blob()\n\n const status: ApiStatus = {\n isLoading: false,\n data: URL.createObjectURL(blob),\n error: null,\n response: {\n status: res.status,\n headers: mapHeadersToObject(res.headers),\n },\n }\n return endResponse({\n api,\n apiStatus: status,\n componentData,\n performance,\n workflowCallback,\n })\n }\n\n function eventStreamingResponse({\n api,\n res,\n performance,\n componentData,\n workflowCallback,\n }: {\n api: ApiRequest\n res: Response\n performance: ApiPerformance\n componentData: ComponentData\n workflowCallback?: (event: string, data: unknown) => void\n }) {\n const parseChunk = (chunk: string) => {\n const event = chunk.match(/event: (.*)/)?.[1] ?? 'message'\n const data = chunk.match(/data: (.*)/)?.[1] ?? ''\n const id = chunk.match(/id: (.*)/)?.[1]\n const retry = chunk.match(/retry: (.*)/)?.[1]\n\n let parsedData = data\n try {\n parsedData = JSON.parse(data ?? '')\n // eslint-disable-next-line no-empty\n } catch {}\n const returnData = {\n event,\n data: parsedData,\n ...(id ? { id } : {}),\n ...(retry ? { retry } : {}),\n }\n return returnData\n }\n return handleStreaming({\n api,\n res,\n performance,\n streamType: 'event',\n useTextDecoder: true,\n parseChunk,\n parseChunksForData: (chunks) => [...chunks],\n delimiters: ['\\n\\n', '\\r\\n\\r\\n'],\n componentData,\n workflowCallback,\n })\n }\n\n async function handleStreaming({\n api,\n res,\n performance,\n streamType,\n useTextDecoder,\n parseChunk,\n parseChunksForData,\n delimiters, // There can be various delimiters for the same stream. SSE might use both \\n\\n and \\r\\n\\r\\n,\n componentData,\n workflowCallback,\n }: {\n api: ApiRequest\n res: Response\n performance: ApiPerformance\n streamType: 'json' | 'text' | 'event'\n useTextDecoder: boolean\n parseChunk: (chunk: any) => any\n parseChunksForData: (chunks: any[]) => any\n delimiters?: string[]\n componentData: ComponentData\n workflowCallback?: (event: string, data: unknown) => void\n }) {\n const chunks: {\n chunks: any[]\n currentChunk: string\n add(chunk: string | Uint8Array): void\n processChunk(chunk: string | Uint8Array): void\n } = {\n chunks: [],\n currentChunk: '',\n // Function to add a chunk to the chunks array and emits the data to the onMessage event\n add(chunk: string | Uint8Array) {\n const parsedChunk = parseChunk(chunk)\n this.chunks.push(parsedChunk)\n // Only emit the data if there are any listeners\n if (parsedChunk) {\n ctx.dataSignal.set({\n ...ctx.dataSignal.get(),\n Apis: {\n ...ctx.dataSignal.get().Apis,\n [api.name]: {\n isLoading: true,\n data: parseChunksForData(this.chunks),\n error: null,\n response: {\n headers: mapHeadersToObject(res.headers),\n },\n },\n },\n })\n if ((api.client?.onMessage?.actions ?? []).length > 0) {\n triggerActions({\n eventName: 'message',\n api,\n data: { body: parsedChunk },\n componentData,\n workflowCallback,\n })\n }\n }\n },\n\n // Function to process a chunk and split it by the delimiter.\n processChunk(chunk: any) {\n const delimiter = delimiters?.find((d) => chunk.includes(d))\n const concatenated = this.currentChunk + chunk\n const split = delimiter ? concatenated.split(delimiter) : [concatenated]\n this.currentChunk = split.pop() ?? ''\n split.forEach((c) => this.add(c))\n },\n }\n\n const reader = useTextDecoder\n ? res.body?.pipeThrough(new TextDecoderStream()).getReader()\n : res.body?.getReader()\n\n while (reader) {\n const { done, value } = await reader.read()\n if (done) {\n break\n }\n\n if (delimiters) {\n chunks.processChunk(value)\n } else {\n chunks.add(value)\n }\n }\n\n // First make sure theres no remaining chunk\n if (chunks.currentChunk) {\n chunks.add(chunks.currentChunk)\n }\n\n const status: ApiStatus = {\n isLoading: false,\n data: chunks.chunks,\n error: null,\n response: {\n status: res.status,\n headers: mapHeadersToObject(res.headers),\n },\n }\n\n try {\n if (streamType === 'json') {\n const parsed = JSON.parse(chunks.chunks.join(''))\n status.data = parsed\n } else if (streamType === 'text') {\n status.data = chunks.chunks.join('')\n }\n } catch {\n throw new Error('Error occurred while parsing the json chunk.', {\n cause: chunks.chunks.join(''),\n })\n }\n return endResponse({\n api,\n apiStatus: status,\n componentData,\n performance,\n workflowCallback,\n })\n }\n\n function endResponse({\n api,\n apiStatus,\n componentData,\n performance,\n workflowCallback,\n }: {\n api: ApiRequest\n apiStatus: ApiStatus\n componentData: ComponentData\n performance: ApiPerformance\n workflowCallback?: (event: string, data: unknown) => void\n }) {\n performance.responseEnd = Date.now()\n\n const data = {\n body: apiStatus.data,\n status: apiStatus.response?.status,\n headers: apiStatus.response?.headers ?? undefined,\n }\n\n const isError = isApiError({\n apiName: api.name,\n response: {\n body: data.body,\n ok: Boolean(\n !apiStatus.error &&\n apiStatus.response?.status &&\n apiStatus.response.status < 400,\n ),\n status: data.status,\n headers: data.headers,\n },\n formulaContext: getFormulaContext(api, componentData),\n errorFormula: api.isError,\n performance,\n })\n\n if (isError) {\n if (!data.body && apiStatus.error) {\n data.body = apiStatus.error\n }\n\n apiError({ api, componentData, data, performance })\n triggerActions({\n eventName: 'failed',\n api,\n componentData,\n data,\n workflowCallback,\n })\n } else {\n apiSuccess({ api, componentData, data, performance })\n triggerActions({\n eventName: 'success',\n api,\n componentData,\n data,\n workflowCallback,\n })\n }\n }\n\n function getApiForComparison(api: ApiRequest) {\n return omitPaths(api, [\n ['client', 'onCompleted'],\n ['client', 'onFailed'],\n ['client', 'onMessage'],\n ['service'],\n ['server', 'ssr'],\n ]) as NestedOmit<\n ApiRequest,\n | 'client.onCompleted'\n | 'client.onFailed'\n | 'client.onMessage'\n | 'service'\n | 'server.ssr'\n >\n }\n\n let payloadSignal:\n | Signal<{\n request: ReturnType<typeof constructRequest>\n api: ReturnType<typeof getApiForComparison>\n headers: Array<[string, string]>\n // if the evaluated value of autoFetch changes from false -> true, we need to refetch the api\n autoFetch: boolean\n // currently, the proxy setting is always controlled by a \"value formula\", but in case we later\n // open up for controlling it with a dynamic formula, we should also include it here\n proxy: boolean\n }>\n | undefined\n\n // eslint-disable-next-line prefer-const\n payloadSignal = ctx.dataSignal.map((data) => {\n const payloadContext = getFormulaContext(api, data)\n const request = constructRequest(api, data)\n return {\n request,\n api: getApiForComparison(api),\n // Serialize the Headers object to be able to compare changes\n headers: Array.from(request.requestSettings.headers.entries()),\n autoFetch: api.autoFetch\n ? applyFormula(api.autoFetch, payloadContext)\n : false,\n proxy: applyFormula(api.server?.proxy?.enabled.formula, payloadContext),\n }\n })\n payloadSignal.subscribe(async (apiData) => {\n const { url, requestSettings } = apiData.request\n // Ensure we only use caching if the page is currently loading\n const cacheMatch =\n // We lookup the API from cache as long as autofetch is defined (and not statically falsy)\n // since the autofetch formula could've evaluated to true during SSR\n isDefined(api.autoFetch) &&\n (api.autoFetch.type !== 'value' || api.autoFetch.value === true) &&\n (window?.__toddle?.isPageLoaded ?? false) === false\n ? (ctx.toddle.pageState.Apis?.[\n requestHash(url, requestSettings)\n ] as ApiStatus)\n : undefined\n\n if (cacheMatch) {\n if (cacheMatch.error) {\n apiError({\n api,\n data: {\n body: cacheMatch.error,\n status: cacheMatch.response?.status,\n headers: cacheMatch.response?.headers ?? undefined,\n },\n performance: {\n requestStart:\n cacheMatch.response?.performance?.requestStart ?? null,\n responseStart:\n cacheMatch.response?.performance?.responseStart ?? null,\n responseEnd: cacheMatch.response?.performance?.responseEnd ?? null,\n },\n componentData: initialComponentData,\n })\n } else {\n apiSuccess({\n api,\n data: {\n body: cacheMatch.data,\n status: cacheMatch.response?.status,\n headers: cacheMatch.response?.headers ?? undefined,\n },\n performance: {\n requestStart:\n cacheMatch.response?.performance?.requestStart ?? null,\n responseStart:\n cacheMatch.response?.performance?.responseStart ?? null,\n responseEnd: cacheMatch.response?.performance?.responseEnd ?? null,\n },\n componentData: initialComponentData,\n })\n }\n } else {\n if (\n applyFormula(\n api.autoFetch,\n getFormulaContext(api, initialComponentData),\n )\n ) {\n // Execute will set the initial status of the api in the dataSignal\n await execute({\n api,\n url,\n requestSettings,\n componentData: initialComponentData,\n })\n } else if (!ctx.dataSignal.get().Apis?.[api.name]) {\n // If the api is not set in the dataSignal, we need to initialize it.\n // If it is set and autoFetch is false, we do not want to reset it.\n ctx.dataSignal.update((data) => {\n return {\n ...data,\n Apis: {\n ...(data.Apis ?? {}),\n [api.name]: {\n isLoading: false,\n data: null,\n error: null,\n },\n },\n }\n })\n }\n }\n })\n\n return {\n fetch: ({\n actionInputs,\n actionModels,\n componentData,\n workflowCallback,\n }) => {\n // Inputs might already be evaluated. If they are we add them as a value formula to be evaluated later.\n const inputs = Object.entries(actionInputs ?? {}).reduce<\n Record<\n string,\n {\n formula: Formula\n }\n >\n >((acc, [inputName, input]) => {\n if (input !== null && typeof input === 'object' && 'formula' in input) {\n acc[inputName] = input as {\n formula: Formula\n }\n } else {\n acc[inputName] = {\n formula: { type: 'value', value: input },\n }\n }\n return acc\n }, {})\n\n const apiWithInputsAndActions: ApiRequest = {\n ...api,\n inputs: { ...api.inputs, ...inputs },\n client: {\n ...api.client,\n parserMode: api.client?.parserMode ?? 'auto',\n onCompleted: {\n trigger: api.client?.onCompleted?.trigger ?? 'success',\n actions: [\n ...(api.client?.onCompleted?.actions ?? []),\n ...(actionModels?.onCompleted ?? []),\n ],\n },\n onFailed: {\n trigger: api.client?.onFailed?.trigger ?? 'failed',\n actions: [\n ...(api.client?.onFailed?.actions ?? []),\n ...(actionModels?.onFailed ?? []),\n ],\n },\n onMessage: {\n trigger: api.client?.onMessage?.trigger ?? 'message',\n actions: [\n ...(api.client?.onMessage?.actions ?? []),\n ...(actionModels?.onMessage ?? []),\n ],\n },\n },\n }\n\n const { url, requestSettings } = constructRequest(\n apiWithInputsAndActions,\n componentData,\n )\n\n return execute({\n api: apiWithInputsAndActions,\n url,\n requestSettings,\n componentData,\n workflowCallback,\n })\n },\n update: (newApi, componentData) => {\n api = newApi\n const updateContext = getFormulaContext(api, componentData)\n const autoFetch =\n api.autoFetch && applyFormula(api.autoFetch, updateContext)\n if (autoFetch) {\n const request = constructRequest(newApi, componentData)\n payloadSignal?.set({\n request,\n api: getApiForComparison(newApi),\n autoFetch,\n proxy: applyFormula(\n newApi.server?.proxy?.enabled.formula,\n updateContext,\n ),\n // Serialize the Headers object to be able to compare changes\n headers: Array.from(request.requestSettings.headers.entries()),\n })\n }\n },\n triggerActions: (componentData) => {\n const apiData = ctx.dataSignal.get().Apis?.[api.name]\n if (\n apiData === undefined ||\n (apiData.data === null && apiData.error === null)\n ) {\n return\n }\n if (apiData.error) {\n triggerActions({\n eventName: 'failed',\n api,\n data: {\n body: apiData.error,\n status: apiData.response?.status,\n },\n componentData,\n })\n } else {\n triggerActions({\n eventName: 'success',\n api,\n data: {\n body: apiData.data,\n },\n componentData,\n })\n }\n },\n destroy: () => payloadSignal?.destroy(),\n }\n}\n", "import type {\n Component,\n ComponentData,\n SupportedNamespaces,\n} from '@nordcraft/core/dist/component/component.types'\nimport type { ToddleEnv } from '@nordcraft/core/dist/formula/formula'\nimport type { Toddle } from '@nordcraft/core/dist/types'\nimport fastDeepEqual from 'fast-deep-equal'\nimport { handleAction } from '../events/handleAction'\nimport type { Signal } from '../signal/signal'\nimport type {\n ComponentChild,\n ComponentContext,\n ContextApi,\n FormulaCache,\n LocationSignal,\n PreviewShowSignal,\n} from '../types'\nimport { BatchQueue } from '../utils/BatchQueue'\nimport { createNode } from './createNode'\n\ninterface RenderComponentProps {\n component: Component\n components: Component[]\n dataSignal: Signal<ComponentData>\n apis: Record<string, ContextApi>\n abortSignal: AbortSignal\n onEvent: (event: string, data: unknown) => void\n isRootComponent: boolean\n formulaCache: FormulaCache\n path: string\n children: Record<string, Array<ComponentChild>>\n root: Document | ShadowRoot\n providers: Record<\n string,\n {\n component: Component\n formulaDataSignals: Record<string, Signal<ComponentData>>\n ctx: ComponentContext\n }\n >\n package: string | undefined\n parentElement: Element | ShadowRoot\n instance: Record<string, string>\n toddle: Toddle<LocationSignal, PreviewShowSignal>\n namespace?: SupportedNamespaces\n env: ToddleEnv\n}\n\nconst BATCH_QUEUE = new BatchQueue()\n\nexport function renderComponent({\n component,\n dataSignal,\n onEvent,\n isRootComponent,\n path,\n children,\n formulaCache,\n components,\n apis,\n abortSignal,\n root,\n providers,\n package: packageName,\n parentElement,\n instance,\n toddle,\n namespace,\n env,\n}: RenderComponentProps): ReadonlyArray<Element | Text> {\n const ctx: ComponentContext = {\n triggerEvent: onEvent,\n component,\n components,\n dataSignal,\n isRootComponent,\n apis,\n formulaCache,\n children,\n abortSignal,\n root,\n providers,\n package: packageName,\n toddle,\n env,\n }\n\n const rootElem = createNode({\n id: 'root',\n path,\n dataSignal,\n ctx,\n parentElement,\n namespace,\n instance,\n })\n BATCH_QUEUE.add(() => {\n let prev: Record<string, any> | undefined\n if (\n component.onAttributeChange?.actions &&\n component.onAttributeChange.actions.length > 0\n ) {\n dataSignal\n .map((data) => data.Attributes)\n .subscribe((props) => {\n if (prev) {\n component.onAttributeChange?.actions?.forEach((action) => {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n handleAction(\n action,\n dataSignal.get(),\n ctx,\n new CustomEvent('attribute-change', {\n detail: Object.entries(props).reduce(\n (\n changes: Record<string, { current: any; new: any }>,\n [key, value],\n ) => {\n if (\n fastDeepEqual(value, prev![key]) === false &&\n component.attributes?.[key]?.name\n ) {\n changes[component.attributes?.[key]?.name] = {\n current: prev![key],\n new: value,\n }\n }\n return changes\n },\n {},\n ),\n }),\n )\n })\n }\n prev = props\n })\n }\n component.onLoad?.actions?.forEach((action) => {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n handleAction(action, dataSignal.get(), ctx)\n })\n })\n return rootElem\n}\n", "/**\n * A helper class to batch multiple callbacks and process them in a single update step just before the next frame render, but after the current stack.\n * This is more efficient than processing each callback in a separate requestAnimationFrame due to the overhead.\n */\nexport class BatchQueue {\n private batchQueue: Array<() => void> = []\n private isProcessing = false\n private processBatch() {\n if (this.isProcessing) return\n this.isProcessing = true\n\n requestAnimationFrame(() => {\n while (this.batchQueue.length > 0) {\n const callback = this.batchQueue.shift()\n callback?.()\n }\n this.isProcessing = false\n })\n }\n public add(callback: () => void) {\n this.batchQueue.push(callback)\n this.processBatch()\n }\n}\n", "import fastDeepEqual from 'fast-deep-equal'\n\nexport class Signal<T> {\n value: T\n subscribers: Set<{\n notify: (value: T) => void\n destroy?: () => void\n }>\n subscriptions: Array<() => void>\n destroying = false\n\n constructor(value: T) {\n this.value = value\n this.subscribers = new Set()\n this.subscriptions = []\n }\n get() {\n return this.value\n }\n set(value: T) {\n // Short circuit and skip expensive `deepEqual` if there are not currently any subscribers\n if (this.subscribers.size === 0) {\n this.value = value\n return\n }\n\n if (fastDeepEqual(value, this.value) === false) {\n this.value = value\n for (const subscriber of this.subscribers) {\n subscriber.notify(this.value)\n }\n }\n }\n\n update(f: (current: T) => T) {\n this.set(f(this.value))\n }\n subscribe(notify: (value: T) => void, config?: { destroy?: () => void }) {\n const subscriber = { notify, destroy: config?.destroy }\n this.subscribers.add(subscriber)\n notify(this.value)\n return () => {\n this.subscribers.delete(subscriber)\n }\n }\n destroy() {\n // Prevent re-entrancy\n if (this.destroying) {\n return\n }\n\n this.destroying = true\n for (const subscriber of this.subscribers) {\n subscriber.destroy?.()\n }\n this.subscribers.clear()\n for (const subscription of this.subscriptions) {\n subscription()\n }\n this.subscriptions.splice(0, this.subscriptions.length)\n this.destroying = false\n }\n cleanSubscribers() {\n for (const subscriber of this.subscribers) {\n subscriber.destroy?.()\n }\n this.subscribers.clear()\n }\n map<T2>(f: (value: T) => T2): Signal<T2> {\n const signal2 = signal(f(this.value))\n signal2.subscriptions.push(\n this.subscribe((value) => signal2.set(f(value)), {\n destroy: () => signal2.destroy(),\n }),\n )\n return signal2\n }\n}\n\nexport function signal<T>(value: T) {\n return new Signal(value)\n}\n\nif (typeof window !== 'undefined') {\n ;(window as any).signal = signal\n ;(window as any).deepEqual = fastDeepEqual\n}\n", "import type {\n Component,\n NodeModel,\n} from '@nordcraft/core/dist/component/component.types'\n\ntype NodeWithNodeId = NodeModel & { nodeId: string }\n\ninterface NodeAndAncestorLookup {\n node: NodeWithNodeId\n ancestors: NodeWithNodeId[]\n}\n\nexport const getNodeAndAncestors = (\n component: Component,\n root: NodeModel,\n id: unknown,\n): NodeAndAncestorLookup | undefined => {\n if (typeof id !== 'string' || id.length === 0) {\n return undefined\n }\n const path = id.split('.')\n const pathParsed = path.map((n) => parseInt(n))\n const ancestors: NodeWithNodeId[] = []\n // nodePath skips the root element as it's selected as the initial\n // value in the reduce below\n const nodePath = pathParsed.slice(1)\n const node = nodePath.reduce((node: NodeModel | undefined, childIndex, i) => {\n switch (node?.type) {\n // 'text' elements don't have any children\n case 'element':\n case 'component':\n case 'slot':\n // Ancestors are elements before the target node\n if (i <= nodePath.length - 1) {\n ancestors.push({\n ...node,\n // Use the original path as origin to get correct nodeIds\n nodeId: path.slice(0, i + 1).join('.'),\n })\n }\n return component.nodes?.[node.children[childIndex]]\n default:\n return undefined\n }\n }, root)\n if (node === undefined) {\n return undefined\n }\n return { node: { ...node, nodeId: id }, ancestors }\n}\n\nexport const isNodeOrAncestorConditional = (\n nodeLookup?: NodeAndAncestorLookup,\n): nodeLookup is NodeAndAncestorLookup =>\n nodeLookup?.node?.condition !== undefined ||\n nodeLookup?.ancestors.some((a) => a.condition !== undefined) === true\n\n/**\n * @returns The next sibling element or null if this is the last element. A nc sibling is a sibling with a higher index or the same index but a higher repeat index.\n */\nexport const getNextSiblingElement = (\n path: string,\n parentElement: Element | ShadowRoot,\n) => {\n const pathParts = path.split('.')\n const lastPathPart = pathParts.slice(-1)[0]\n const index = parseInt(lastPathPart)\n const repeatIndex = parseInt(String(lastPathPart.split('(')[1]))\n\n // Find the first child that either has a higher index or a similar index, but higher repeat index\n for (const child of parentElement.children) {\n const childPath = child.getAttribute('data-id')\n const lastChildPathPart = childPath?.split('.').slice(-1)[0]\n const childIndex = parseInt(String(lastChildPathPart))\n if (\n childIndex === index &&\n parseInt(String(lastChildPathPart?.split('(')[1])) > repeatIndex\n ) {\n return child\n }\n\n if (childIndex > index) {\n return child\n }\n }\n\n return null\n}\n\n/**\n * This function efficiently ensures that:\n * 1. New items are added in the correct position.\n * 2. Existing items are not moved if they are already in the correct order.\n */\nexport function ensureEfficientOrdering(\n parentElement: Element | ShadowRoot,\n items: ReadonlyArray<Element | Text>,\n nextElement: Element | Text | null = null,\n) {\n // Identify the starting point for comparisons.\n let insertBeforeElement = nextElement // If insertBeforeElement is null, items will be appended at the end.\n\n // To track the current position in the DOM, we'll use a marker that advances through the sibling elements.\n let currentMarker = insertBeforeElement\n ? insertBeforeElement.previousSibling\n : parentElement.lastChild\n\n // We'll process the items array in reverse order to minimize the number of DOM operations.\n for (let i = items.length - 1; i >= 0; i--) {\n const item = items[i]\n\n // Check if the item is already in the correct position by comparing it with the currentMarker.\n if (item === currentMarker) {\n // The item is in the correct position, move the marker to the previous sibling.\n currentMarker = item.previousSibling\n } else {\n // The item is either not in the DOM or not in the correct position.\n // Insert the item before the insertBeforeElement (or append it if insertBeforeElement is null).\n parentElement.insertBefore(item, insertBeforeElement)\n }\n\n // Update insertBeforeElement to the current item for the next iteration, as we need to insert subsequent items before this one.\n insertBeforeElement = item\n }\n}\n", "import { variantSelector, type StyleVariant } from '../styling/variantSelector'\nimport type { Nullable } from '../types'\n\ntype NodeSelectorOptions =\n | {\n componentName: string\n nodeId: Nullable<string>\n variant?: Nullable<StyleVariant>\n }\n | {\n componentName?: never\n nodeId?: never\n variant?: Nullable<StyleVariant>\n }\n\nexport function getNodeSelector(\n path: string,\n { componentName, nodeId, variant }: NodeSelectorOptions = {},\n): string {\n let selector = `[data-id=\"${path}\"]`\n if (componentName) {\n selector += `.${componentName}`\n }\n if (nodeId) {\n selector += `\\\\:${nodeId}`\n }\n if (variant) {\n selector += variantSelector(variant)\n }\n\n return selector\n}\n", "/* eslint-disable @typescript-eslint/prefer-nullish-coalescing */\nimport type { Component } from '@nordcraft/core/dist/component/component.types'\n\nexport const isContextProvider = (component: Component) =>\n (component.formulas &&\n Object.values(component.formulas).some(\n ({ exposeInContext }) => exposeInContext,\n )) ||\n (component.workflows &&\n Object.values(component.workflows).some(\n ({ exposeInContext }) => exposeInContext,\n ))\n", "import type {\n Component,\n ComponentData,\n} from '@nordcraft/core/dist/component/component.types'\nimport type { FormulaContext } from '@nordcraft/core/dist/formula/formula'\nimport { applyFormula } from '@nordcraft/core/dist/formula/formula'\nimport { mapObject } from '@nordcraft/core/dist/utils/collections'\nimport { isDefined } from '@nordcraft/core/dist/utils/util'\nimport type { Signal } from '../signal/signal'\nimport type { ComponentContext } from '../types'\n\nexport function subscribeToContext(\n componentDataSignal: Signal<ComponentData>,\n component: Component,\n ctx: ComponentContext,\n) {\n Object.entries(component.contexts ?? {}).forEach(\n ([providerName, context]) => {\n const provider =\n ctx.providers[[ctx.package, providerName].filter(isDefined).join('/')]\n\n if (provider) {\n context.formulas.forEach((formulaName) => {\n const formulaDataSignal = provider.formulaDataSignals[formulaName]\n if (!formulaDataSignal) {\n // eslint-disable-next-line no-console\n console.warn(\n `Component error(${component.name}): Provider ${providerName} does not expose a formula named \"${formulaName}\". Available formulas are: [\"${Object.keys(\n provider.formulaDataSignals,\n ).join('\", \"')}\"]`,\n )\n return\n }\n\n formulaDataSignal.subscribe((value) => {\n componentDataSignal.update((data) => ({\n ...data,\n Contexts: {\n ...data.Contexts,\n [providerName]: {\n ...data.Contexts?.[providerName],\n [formulaName]: value,\n },\n },\n }))\n })\n })\n }\n\n // In preview and absence of a real provider, we fake providers with their testData values. This is useful for testing components in isolation.\n // This is for preview mode only, and should preferably be stripped from the page and custom-elements runtime.\n else if (\n !provider &&\n ctx.env.runtime === 'preview' &&\n ctx.toddle._preview\n ) {\n const testProvider = ctx.components?.find(\n (comp) =>\n comp.name ===\n [ctx.package, providerName].filter(isDefined).join('/'),\n )\n\n if (!testProvider) {\n // eslint-disable-next-line no-console\n console.error(\n `Component error(${component.name}): Could not find provider \"${providerName}\". No such component exist.`,\n )\n return\n }\n\n // Derive the package name from the provider name as we do not have a real component to work with\n const [, testProviderPackage] = providerName.split('/').reverse()\n const formulaContext: FormulaContext = {\n data: {\n Attributes: mapObject(\n testProvider.attributes ?? {},\n ([name, attr]) => [name, attr.testValue],\n ),\n },\n component: testProvider,\n root: ctx?.root,\n formulaCache: {},\n package: testProviderPackage ?? ctx?.package,\n toddle: ctx.toddle,\n env: ctx.env,\n }\n\n if (testProvider.route) {\n formulaContext.data['URL parameters'] = {\n ...Object.fromEntries(\n testProvider.route.path\n .filter((p) => p.type === 'param')\n .map((p) => [p.name, p.testValue]),\n ),\n ...mapObject(testProvider.route.query, ([name, { testValue }]) => [\n name,\n testValue,\n ]),\n }\n }\n formulaContext.data.Variables = mapObject(\n testProvider.variables ?? {},\n ([name, variable]) => [\n name,\n applyFormula(variable.initialValue, formulaContext),\n ],\n )\n\n componentDataSignal.update((data) => ({\n ...data,\n Contexts: {\n ...data.Contexts,\n [providerName]: Object.fromEntries(\n context.formulas.map((formulaName) => {\n const formula = testProvider.formulas?.[formulaName]\n if (!formula) {\n // eslint-disable-next-line no-console\n console.warn(\n `Component error(${component.name}): Could not find formula \"${formulaName}\" in provider \"${providerName}\"`,\n )\n return [formulaName, null]\n }\n\n return [\n formulaName,\n applyFormula(formula.formula, formulaContext),\n ]\n }),\n ),\n },\n }))\n }\n },\n )\n}\n", "import type {\n Component,\n ComponentData,\n} from '@nordcraft/core/dist/component/component.types'\nimport type { Signal } from '../signal/signal'\n\nexport function initLogState() {\n ;(window as any).logState = () => {\n // eslint-disable-next-line no-console\n console.table(\n Object.entries(window.__components ?? {}).map(([name, sig]) => {\n return {\n name,\n ...(sig as any).get(),\n }\n }),\n )\n }\n}\n\nexport function registerComponentToLogState(\n component: Component,\n dataSignal: Signal<ComponentData>,\n) {\n if (!window.__components) {\n window.__components = {}\n }\n\n window.__components[component.name] = dataSignal\n}\n", "import type {\n Component,\n ComponentData,\n} from '@nordcraft/core/dist/component/component.types'\nimport type {\n Formula,\n FunctionOperation,\n} from '@nordcraft/core/dist/formula/formula'\nimport { get, mapObject } from '@nordcraft/core/dist/utils/collections'\nimport { isDefined } from '@nordcraft/core/dist/utils/util'\nimport type { FormulaCache } from '../types'\n\nexport function createFormulaCache(component: Component): FormulaCache {\n if (!isDefined(component.formulas)) {\n return {}\n }\n return mapObject(component.formulas, ([name, f]) => {\n const { canCache, keys } = f.memoize\n ? getFormulaCacheConfig(f.formula, component)\n : { canCache: false, keys: [] }\n let cacheInput: any\n let cacheData: any\n\n return [\n name,\n {\n get: (data: ComponentData) => {\n if (\n canCache &&\n cacheInput &&\n keys.every((key) => {\n return get(data, key) === get(cacheInput, key)\n })\n ) {\n return { hit: true, data: cacheData }\n }\n return { hit: false }\n },\n set: (data: ComponentData, result: any) => {\n if (canCache) {\n cacheInput = data\n cacheData = result\n }\n },\n },\n ]\n })\n}\n\nfunction getFormulaCacheConfig(formula: Formula, component: Component) {\n const paths: string[][] = []\n function visitOperation(op: Formula) {\n if (!op) {\n return\n }\n if (op.type === 'path' && op.path[0] !== 'Args') {\n paths.push(op.path)\n }\n if (Array.isArray((op as any)?.arguments)) {\n ;(op as FunctionOperation)?.arguments.forEach((arg) =>\n visitOperation(arg.formula),\n )\n }\n if (op.type === 'record' && Array.isArray(op.entries)) {\n op.entries.forEach((arg) => visitOperation(arg.formula))\n }\n\n if (op.type === 'apply') {\n if (!component.formulas?.[op.name]?.memoize) {\n throw new Error('Cannot memoize')\n }\n visitOperation(component.formulas?.[op.name]?.formula)\n }\n }\n try {\n visitOperation(formula)\n } catch {\n return {\n canCache: false,\n keys: [],\n }\n }\n\n const keys: string[][] = []\n paths\n .sort((a, b) => a.length - b.length)\n .forEach((path) => {\n if (!keys.some((key) => key.every((k, i) => k === path[i]))) {\n keys.push(path)\n }\n })\n return {\n canCache: true,\n keys,\n }\n}\n", "import type { MediaQuery } from '@nordcraft/core/dist/component/component.types'\nimport type { Nullable } from '@nordcraft/core/dist/types'\n\n/**\n * CustomPropertyStyleSheet is a utility class that manages CSS custom properties\n * (variables) in a dedicated CSSStyleSheet. It allows for efficient registration,\n * updating, and removal of style properties as fast as setting style properties.\n *\n * It abstracts the complexity of managing CSS rules via. indexing and\n * provides a simple API to register and unregister style properties for specific\n * selectors.\n */\nexport class CustomPropertyStyleSheet {\n private styleSheet: CSSStyleSheet\n\n // Selector to rule index mapping\n private ruleMap: Map<string, CSSStyleRule | CSSNestedDeclarations> | undefined\n\n constructor(\n root: Document | ShadowRoot,\n styleSheet?: Nullable<CSSStyleSheet>,\n ) {\n if (styleSheet) {\n this.styleSheet = styleSheet\n } else {\n this.styleSheet = new CSSStyleSheet()\n root.adoptedStyleSheets.push(this.getStyleSheet())\n }\n }\n\n /**\n * @returns A function to update the property value efficiently.\n */\n public registerProperty(\n selector: string,\n name: string,\n options?: Nullable<{\n mediaQuery?: Nullable<MediaQuery>\n startingStyle?: Nullable<boolean>\n }>,\n ): (newValue: string) => void {\n this.ruleMap ??= this.hydrateFromBase()\n const fullSelector = CustomPropertyStyleSheet.getFullSelector(\n selector,\n options,\n )\n\n // Check if the selector already exists\n let rule = this.ruleMap.get(fullSelector)\n if (!rule) {\n const ruleIndex = this.styleSheet.insertRule(\n fullSelector,\n this.styleSheet.cssRules.length,\n )\n let newRule = this.styleSheet.cssRules[ruleIndex]\n\n // We are only interested in the dynamic style, so get the actual style rule, not media or other nested rules. Loop until we are at the bottom most rule.\n while (\n (newRule as any).cssRules &&\n (newRule as CSSGroupingRule).cssRules.length > 0\n ) {\n newRule = (newRule as CSSGroupingRule).cssRules[0]\n }\n rule = newRule as CSSStyleRule | CSSNestedDeclarations\n this.ruleMap.set(fullSelector, rule)\n }\n\n return (value: string) => {\n rule.style.setProperty(name, value)\n }\n }\n\n public unregisterProperty(\n selector: string,\n name: string,\n options?: Nullable<{\n mediaQuery?: Nullable<MediaQuery>\n startingStyle?: Nullable<boolean>\n deepClean?: Nullable<boolean>\n }>,\n ): void {\n if (!this.ruleMap) {\n return\n }\n\n const fullSelector = CustomPropertyStyleSheet.getFullSelector(\n selector,\n options,\n )\n\n const rule = this.ruleMap.get(fullSelector)\n if (!rule) {\n return\n }\n\n rule.style.removeProperty(name)\n\n // Cleaning up empty selectors is probably not necessary in production and may have performance implications.\n // However, it is required for the editor-preview as it is a dynamic environment and things may get reordered and canvas reused.\n if (options?.deepClean && rule.style.length === 0) {\n this.styleSheet.deleteRule(\n Array.from(this.ruleMap.keys()).indexOf(fullSelector),\n )\n this.ruleMap.delete(fullSelector)\n }\n }\n\n public getStyleSheet(): CSSStyleSheet {\n return this.styleSheet\n }\n\n /**\n * Maps all selectors to their rule index. This is used to map the initial\n * SSR style variable values to their selectors.\n */\n private hydrateFromBase() {\n const ruleIndex: Map<string, CSSStyleRule> = new Map()\n for (let i = 0; i < this.styleSheet.cssRules.length; i++) {\n let rule = this.styleSheet.cssRules[i]\n const selector = CustomPropertyStyleSheet.selectorFromCSSRule(rule)\n // Get last part of the selector, which is the actual selector we are interested in\n while (\n (rule as CSSGroupingRule).cssRules &&\n (rule as CSSGroupingRule).cssRules.length > 0\n ) {\n rule = (rule as CSSGroupingRule).cssRules[0]\n }\n\n ruleIndex.set(selector, rule as CSSStyleRule)\n }\n return ruleIndex\n }\n\n private static selectorFromCSSRule(rule: CSSRule): string {\n switch (rule.constructor.name) {\n case 'CSSStyleRule':\n // For these rules, we just return (potentially with subrules if any cssRules exist)\n return `${(rule as CSSStyleRule).selectorText} { ${Array.from(\n (rule as CSSStyleRule).cssRules,\n )\n .map(CustomPropertyStyleSheet.selectorFromCSSRule)\n .join(', ')}}`\n case 'CSSStartingStyleRule':\n return `@starting-style { ${Array.from(\n (rule as CSSStartingStyleRule).cssRules,\n )\n .map(CustomPropertyStyleSheet.selectorFromCSSRule)\n .join(', ')}}`\n case 'CSSMediaRule':\n return `@media ${(rule as CSSMediaRule).media.mediaText} { ${Array.from(\n (rule as CSSMediaRule).cssRules,\n )\n .map(CustomPropertyStyleSheet.selectorFromCSSRule)\n .join(', ')}}`\n case 'CSSNestedDeclarations':\n return ''\n default:\n // eslint-disable-next-line no-console\n console.warn(\n `Unsupported CSS rule type: ${rule.constructor.name}. Returning empty selector.`,\n )\n return ''\n }\n }\n\n private static getFullSelector(\n selector: string,\n options?: Nullable<{\n mediaQuery?: Nullable<MediaQuery>\n startingStyle?: Nullable<boolean>\n }>,\n ) {\n let result =\n selector + (options?.startingStyle ? ' { @starting-style { }}' : ' { }')\n if (options?.mediaQuery) {\n result = `@media (${Object.entries(options.mediaQuery)\n .map(([key, value]) => `${key}: ${value}`)\n .filter(Boolean)\n .join(') and (')}) { ${result}}`\n }\n\n return result\n }\n}\n", "import type { Signal } from '../signal/signal'\n\nimport { CUSTOM_PROPERTIES_STYLESHEET_ID } from '@nordcraft/core/dist/styling/theme.const'\nimport type { StyleVariant } from '@nordcraft/core/dist/styling/variantSelector'\nimport type { Runtime } from '@nordcraft/core/dist/types'\nimport { CustomPropertyStyleSheet } from '../styles/CustomPropertyStyleSheet'\n\nlet customPropertiesStylesheet: CustomPropertyStyleSheet | undefined\n\nexport function subscribeCustomProperty({\n selector,\n customPropertyName,\n signal,\n variant,\n root,\n runtime,\n}: {\n selector: string\n customPropertyName: string\n signal: Signal<string>\n variant?: StyleVariant\n root: Document | ShadowRoot\n runtime: Runtime\n}) {\n customPropertiesStylesheet ??= new CustomPropertyStyleSheet(\n root,\n (\n root.getElementById(CUSTOM_PROPERTIES_STYLESHEET_ID) as\n | HTMLStyleElement\n | undefined\n )?.sheet,\n )\n\n signal.subscribe(\n customPropertiesStylesheet.registerProperty(\n selector,\n customPropertyName,\n variant,\n ),\n {\n destroy: () => {\n customPropertiesStylesheet?.unregisterProperty(\n selector,\n customPropertyName,\n {\n deepClean: runtime === 'preview',\n mediaQuery: variant?.mediaQuery,\n startingStyle: variant?.startingStyle,\n },\n )\n },\n },\n )\n}\n", "import { isLegacyApi, sortApiObjects } from '@nordcraft/core/dist/api/api'\nimport type {\n ComponentData,\n ComponentNodeModel,\n SupportedNamespaces,\n} from '@nordcraft/core/dist/component/component.types'\nimport { applyFormula } from '@nordcraft/core/dist/formula/formula'\nimport { appendUnit } from '@nordcraft/core/dist/styling/customProperty'\nimport { mapObject } from '@nordcraft/core/dist/utils/collections'\nimport { getNodeSelector } from '@nordcraft/core/dist/utils/getNodeSelector'\nimport { isDefined } from '@nordcraft/core/dist/utils/util'\nimport { isContextApiV2 } from '../api/apiUtils'\nimport { createLegacyAPI } from '../api/createAPI'\nimport { createAPI } from '../api/createAPIv2'\nimport { isContextProvider } from '../context/isContextProvider'\nimport { subscribeToContext } from '../context/subscribeToContext'\nimport { registerComponentToLogState } from '../debug/logState'\nimport { handleAction } from '../events/handleAction'\nimport type { Signal } from '../signal/signal'\nimport { signal } from '../signal/signal'\nimport type { ComponentChild, ComponentContext, ContextApi } from '../types'\nimport { createFormulaCache } from '../utils/createFormulaCache'\nimport { subscribeCustomProperty } from '../utils/subscribeCustomProperty'\nimport { renderComponent } from './renderComponent'\n\nexport type RenderComponentNodeProps = {\n path: string\n node: ComponentNodeModel\n dataSignal: Signal<ComponentData>\n ctx: ComponentContext\n parentElement: Element | ShadowRoot\n instance: Record<string, string>\n namespace?: SupportedNamespaces\n}\n\nexport function createComponent({\n node,\n path,\n dataSignal,\n ctx,\n parentElement,\n instance,\n namespace,\n}: RenderComponentNodeProps): ReadonlyArray<Element | Text> {\n const nodeLookupKey = [ctx.package, node.name].filter(isDefined).join('/')\n const component = ctx.components?.find((comp) => comp.name === nodeLookupKey)\n if (!component) {\n // eslint-disable-next-line no-console\n console.warn(\n `Could not find component \"${nodeLookupKey}\" for component \"${\n ctx.component.name\n }\". Available components are: [\"${ctx.components\n .map((c) => c.name)\n .join('\", \"')}\"]`,\n )\n return []\n }\n const attributesSignal = dataSignal.map((data) => {\n return mapObject(node.attrs, ([attr, value]) => [\n attr,\n value?.type !== 'value'\n ? applyFormula(value, {\n data,\n component: ctx.component,\n formulaCache: ctx.formulaCache,\n root: ctx.root,\n package: ctx.package,\n toddle: ctx.toddle,\n env: ctx.env,\n })\n : value?.value,\n ])\n })\n Object.entries(node.customProperties ?? {}).forEach(\n ([customPropertyName, customProperty]) =>\n subscribeCustomProperty({\n selector: getNodeSelector(path, {\n componentName: ctx.component.name,\n nodeId: node.id,\n }),\n signal: dataSignal.map((data) =>\n appendUnit(\n applyFormula(customProperty.formula, {\n data,\n component: ctx.component,\n formulaCache: ctx.formulaCache,\n root: ctx.root,\n package: ctx.package,\n toddle: ctx.toddle,\n env: ctx.env,\n }),\n customProperty.unit,\n ),\n ),\n customPropertyName,\n root: ctx.root,\n runtime: ctx.env.runtime,\n }),\n )\n node.variants?.forEach((variant) => {\n Object.entries(variant.customProperties ?? {}).forEach(\n ([customPropertyName, customProperty]) =>\n subscribeCustomProperty({\n selector: getNodeSelector(path, {\n componentName: ctx.component.name,\n nodeId: node.id,\n variant,\n }),\n signal: dataSignal.map((data) =>\n appendUnit(\n applyFormula(customProperty.formula, {\n data,\n component: ctx.component,\n formulaCache: ctx.formulaCache,\n root: ctx.root,\n package: ctx.package,\n toddle: ctx.toddle,\n env: ctx.env,\n }),\n customProperty.unit,\n ),\n ),\n customPropertyName,\n variant,\n root: ctx.root,\n runtime: ctx.env.runtime,\n }),\n )\n })\n\n const componentDataSignal = signal<ComponentData>({\n Location: dataSignal.get().Location,\n Attributes: attributesSignal.get(),\n Apis: mapObject(component.apis ?? {}, ([name, api]) => [\n name,\n {\n data: null,\n isLoading:\n api.autoFetch &&\n applyFormula(api.autoFetch, {\n data: dataSignal.get(),\n component,\n formulaCache: ctx.formulaCache,\n root: ctx.root,\n package: ctx.package,\n toddle: ctx.toddle,\n env: ctx.env,\n })\n ? true\n : false,\n error: null,\n },\n ]),\n })\n // Subscribe context before calculating variable initial values to ensure they can reference context values\n subscribeToContext(componentDataSignal, component, ctx)\n componentDataSignal.update((data) => ({\n ...data,\n Variables: mapObject(component.variables ?? {}, ([name, variable]) => [\n name,\n applyFormula(variable.initialValue, {\n // Initial value\n data: componentDataSignal.get(),\n component,\n formulaCache: ctx.formulaCache,\n root: ctx.root,\n package: ctx.package,\n toddle: ctx.toddle,\n env: ctx.env,\n }),\n ]),\n }))\n registerComponentToLogState(component, componentDataSignal)\n\n // Call the abort signal if the component's datasignal is destroyed (component unmounted) to cancel any pending requests\n const abortController = new AbortController()\n componentDataSignal.subscribe(() => {}, {\n destroy: () =>\n abortController.abort(`Component ${component.name} unmounted`),\n })\n const formulaCache = createFormulaCache(component)\n\n // Note: this function must run procedurally to ensure apis (which are in correct order) can reference each other\n const apis: Record<string, ContextApi> = {}\n sortApiObjects(Object.entries(component.apis ?? {})).forEach(\n ([name, api]) => {\n if (isLegacyApi(api)) {\n apis[name] = createLegacyAPI(api, {\n ...ctx,\n apis,\n component,\n dataSignal: componentDataSignal,\n abortSignal: abortController.signal,\n isRootComponent: false,\n formulaCache,\n package: node.package ?? ctx.package,\n triggerEvent: (eventTrigger, data) => {\n const eventHandler = Object.values(node.events).find(\n (e) => e.trigger === eventTrigger,\n )\n if (eventHandler) {\n eventHandler.actions?.forEach((action) =>\n handleAction(action, { ...dataSignal.get(), Event: data }, ctx),\n )\n }\n },\n })\n } else {\n apis[name] = createAPI({\n apiRequest: api,\n ctx: {\n ...ctx,\n apis,\n component,\n dataSignal: componentDataSignal,\n abortSignal: abortController.signal,\n isRootComponent: false,\n formulaCache,\n package: node.package ?? ctx.package,\n triggerEvent: (eventTrigger, data) => {\n const eventHandler = Object.values(node.events).find(\n (e) => e.trigger === eventTrigger,\n )\n if (eventHandler) {\n eventHandler.actions?.forEach((action) =>\n handleAction(\n action,\n { ...dataSignal.get(), Event: data },\n ctx,\n ),\n )\n }\n },\n },\n componentData: componentDataSignal.get(),\n })\n }\n },\n )\n Object.values(apis)\n .filter(isContextApiV2)\n .forEach((api) => {\n api.triggerActions(componentDataSignal.get())\n })\n\n const onEvent = (eventTrigger: string, data: any) => {\n const eventHandler = Object.values(node.events).find(\n (e) => e.trigger === eventTrigger,\n )\n if (eventHandler) {\n eventHandler.actions?.forEach((action) =>\n handleAction(action, { ...dataSignal.get(), Event: data }, ctx),\n )\n }\n }\n\n let providers = ctx.providers\n if (isContextProvider(component)) {\n // Subscribe to exposed formulas and update the component's data signal\n const formulaDataSignals = Object.fromEntries(\n Object.entries(component.formulas ?? {})\n .filter(([, formula]) => formula.exposeInContext)\n .map(([name, formula]) => [\n name,\n componentDataSignal.map((data) =>\n applyFormula(formula.formula, {\n data,\n component,\n formulaCache: ctx.formulaCache,\n root: ctx.root,\n package: ctx.package,\n toddle: ctx.toddle,\n env: ctx.env,\n }),\n ),\n ]),\n )\n\n providers = {\n ...providers,\n [component.name]: {\n component,\n formulaDataSignals,\n ctx: {\n ...ctx,\n apis,\n component,\n dataSignal: componentDataSignal,\n abortSignal: abortController.signal,\n triggerEvent: onEvent,\n },\n },\n }\n }\n\n const children: Record<string, Array<ComponentChild>> = {}\n for (let i = 0; i < node.children.length; i++) {\n const childId = node.children[i]\n const childNode = ctx.component.nodes?.[childId]\n const slotName = childNode?.slot ?? 'default'\n children[slotName] = children[slotName] ?? []\n children[slotName].push({\n id: childId,\n path: `${path}.${i}[${slotName}]`,\n dataSignal,\n ctx: {\n ...ctx,\n package: node.package ?? ctx.package,\n },\n })\n }\n\n attributesSignal.subscribe(\n (Attributes) =>\n componentDataSignal.update((data) => ({\n ...data,\n Attributes,\n })),\n { destroy: () => componentDataSignal.destroy() },\n )\n\n return renderComponent({\n dataSignal: componentDataSignal,\n component,\n components: ctx.components,\n path,\n root: ctx.root,\n isRootComponent: false,\n children,\n formulaCache,\n providers,\n apis,\n abortSignal: abortController.signal,\n package: node.package ?? ctx.package,\n parentElement,\n onEvent,\n toddle: ctx.toddle,\n env: ctx.env,\n namespace,\n // If the root node is another component, then append and forward previous instance\n instance:\n node.id === 'root'\n ? { ...instance, [ctx.component.name]: 'root' }\n : { [ctx.component.name]: node.id ?? '' },\n })\n}\n", "export function getDragData(event: Event) {\n if (event instanceof DragEvent) {\n return Array.from(event.dataTransfer?.items ?? []).reduce<\n Record<string, any>\n >((dragData, item) => {\n dragData[item.type] = event.dataTransfer?.getData(item.type)\n return dragData\n }, {})\n }\n return\n}\n", "import type { ElementNodeModel } from '@nordcraft/core/dist/component/component.types'\nimport type { ComponentContext } from '../types'\n\nexport function getElementTagName(\n node: ElementNodeModel,\n ctx: ComponentContext,\n id: string,\n) {\n if (ctx.component.version === 2 && id === 'root') {\n return `${ctx.package ?? ctx.toddle.project}-${node.tag}`\n }\n\n return node.tag\n}\n", "import { isDefined, toBoolean } from '@nordcraft/core/dist/utils/util'\n\n/**\n * Some attributes need special handling.\n */\nexport function setAttribute(\n elem: HTMLElement | SVGElement | MathMLElement,\n attr: string,\n value: any,\n) {\n switch (attr) {\n case 'srcObject':\n case 'src':\n if (elem instanceof HTMLMediaElement) {\n ;(elem as any)[attr] = value\n } else {\n elem.setAttribute(attr, String(value))\n }\n break\n case 'value':\n case 'type': {\n if (elem instanceof SVGElement) {\n // The type attribute on SVG elements should just be added as an attribute\n // See https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/type\n if (toBoolean(value)) {\n elem.setAttribute(attr, String(value))\n }\n } else {\n let val = value\n if (elem instanceof HTMLProgressElement) {\n // An HTMLProgressElement will break other elements in our editor if the value is not a (finite) number\n // See docs here https://developer.mozilla.org/en-US/docs/Web/HTML/Element/progress#value\n // and original issue here https://discord.com/channels/972416966683926538/1317827591230722048\n if (!isDefined(value) || !Number.isFinite(Number(value))) {\n val = 0\n }\n }\n ;(elem as any)[attr] = toBoolean(val) ? String(val) : undefined\n }\n break\n }\n case 'muted':\n case 'autoplay':\n if (elem instanceof HTMLMediaElement) {\n ;(elem as any)[attr] = toBoolean(value)\n } else {\n elem.setAttribute(attr, String(value))\n }\n break\n default:\n if (toBoolean(value)) {\n elem.setAttribute(attr, String(value))\n if (\n // autofocus often does not work in the editor\n attr === 'autofocus' &&\n document.body.getAttribute('data-mode') !== 'design'\n ) {\n setTimeout(() => elem.focus(), 100)\n }\n } else {\n elem.removeAttribute(attr)\n }\n }\n}\n", "import type {\n ElementNodeModel,\n NodeModel,\n SupportedNamespaces,\n} from '@nordcraft/core/dist/component/component.types'\nimport { applyFormula } from '@nordcraft/core/dist/formula/formula'\nimport {\n getClassName,\n toValidClassName,\n} from '@nordcraft/core/dist/styling/className'\nimport { appendUnit } from '@nordcraft/core/dist/styling/customProperty'\nimport { getNodeSelector } from '@nordcraft/core/dist/utils/getNodeSelector'\nimport { isDefined, toBoolean } from '@nordcraft/core/dist/utils/util'\nimport type { ComponentData } from '@nordcraft/core/src/component/component.types'\nimport { handleAction } from '../events/handleAction'\nimport type { Signal } from '../signal/signal'\nimport type { ComponentContext } from '../types'\nimport { getDragData } from '../utils/getDragData'\nimport { getElementTagName } from '../utils/getElementTagName'\nimport { setAttribute } from '../utils/setAttribute'\nimport { subscribeCustomProperty } from '../utils/subscribeCustomProperty'\nimport type { NodeRenderer } from './createNode'\nimport { createNode } from './createNode'\n\nexport function createElement({\n node,\n dataSignal,\n id,\n path,\n ctx,\n namespace,\n instance,\n}: NodeRenderer<ElementNodeModel>): Element {\n const tag = getElementTagName(node, ctx, id)\n switch (tag) {\n case 'svg': {\n namespace = 'http://www.w3.org/2000/svg'\n break\n }\n case 'math': {\n namespace = 'http://www.w3.org/1998/Math/MathML'\n break\n }\n }\n\n // Explicitly setting a namespace has precedence over inferring it from the tag\n if (node.attrs['xmlns']?.type === 'value') {\n namespace = String(node.attrs['xmlns'].value) as SupportedNamespaces\n }\n\n const elem = namespace\n ? (document.createElementNS(namespace, tag) as SVGElement | MathMLElement)\n : document.createElement(tag)\n\n elem.setAttribute('data-node-id', id)\n if (path) {\n elem.setAttribute('data-id', path)\n }\n if (ctx.isRootComponent === false && id !== 'root') {\n elem.setAttribute('data-component', ctx.component.name)\n }\n const classHash = getClassName([node.style, node.variants])\n elem.classList.add(classHash)\n if (instance && id === 'root') {\n Object.entries(instance).forEach(([key, value]) => {\n elem.classList.add(toValidClassName(`${key}:${value}`))\n })\n }\n if (node.classes) {\n Object.entries(node.classes)?.forEach(([className, { formula }]) => {\n if (formula) {\n const classSignal = dataSignal.map((data) =>\n toBoolean(\n applyFormula(formula, {\n data,\n component: ctx.component,\n formulaCache: ctx.formulaCache,\n root: ctx.root,\n package: ctx.package,\n toddle: ctx.toddle,\n env: ctx.env,\n }),\n ),\n )\n classSignal.subscribe((show) =>\n show\n ? elem.classList.add(className)\n : elem.classList.remove(className),\n )\n } else {\n elem.classList.add(className)\n }\n })\n }\n\n Object.entries(node.attrs).forEach(([attr, value]) => {\n if (!isDefined(value)) {\n return\n }\n let o: Signal<any> | undefined\n const setupAttribute = () => {\n if (value.type === 'value') {\n setAttribute(elem, attr, value?.value)\n } else {\n o = dataSignal.map((data) =>\n applyFormula(value, {\n data,\n component: ctx.component,\n formulaCache: ctx.formulaCache,\n root: ctx.root,\n package: ctx.package,\n toddle: ctx.toddle,\n env: ctx.env,\n }),\n )\n o.subscribe((val) => {\n setAttribute(elem, attr, val)\n })\n }\n }\n if (\n attr === 'autofocus' &&\n ctx.env.runtime === 'preview' &&\n ctx.toddle._preview\n ) {\n ctx.toddle._preview.showSignal.subscribe(({ testMode }) => {\n if (testMode) {\n setupAttribute()\n } else {\n o?.destroy()\n elem.removeAttribute(attr)\n }\n })\n } else {\n setupAttribute()\n }\n })\n node['style-variables']?.forEach((styleVariable) => {\n const { name, formula, unit } = styleVariable\n const signal = dataSignal.map((data) => {\n const value = applyFormula(formula, {\n data,\n component: ctx.component,\n formulaCache: ctx.formulaCache,\n root: ctx.root,\n package: ctx.package,\n toddle: ctx.toddle,\n env: ctx.env,\n })\n return unit ? value + unit : value\n })\n\n signal.subscribe((value) => elem.style.setProperty(`--${name}`, value))\n })\n\n Object.entries(node.customProperties ?? {}).forEach(\n ([customPropertyName, { formula, unit }]) =>\n subscribeCustomProperty({\n customPropertyName,\n selector:\n ctx.env.runtime === 'custom-element' &&\n ctx.isRootComponent &&\n path === '0'\n ? `${getNodeSelector(path)}, :host`\n : getNodeSelector(path),\n signal: dataSignal.map((data) =>\n appendUnit(\n applyFormula(formula, {\n data,\n component: ctx.component,\n formulaCache: ctx.formulaCache,\n root: ctx.root,\n package: ctx.package,\n toddle: ctx.toddle,\n env: ctx.env,\n }),\n unit,\n ),\n ),\n root: ctx.root,\n runtime: ctx.env.runtime,\n }),\n )\n\n node.variants?.forEach((variant) => {\n Object.entries(variant.customProperties ?? {}).forEach(\n ([customPropertyName, { formula, unit }]) => {\n subscribeCustomProperty({\n customPropertyName,\n selector: getNodeSelector(path, {\n variant,\n }),\n variant,\n signal: dataSignal.map((data) =>\n appendUnit(\n applyFormula(formula, {\n data,\n component: ctx.component,\n formulaCache: ctx.formulaCache,\n root: ctx.root,\n package: ctx.package,\n toddle: ctx.toddle,\n env: ctx.env,\n }),\n unit,\n ),\n ),\n root: ctx.root,\n runtime: ctx.env.runtime,\n })\n },\n )\n })\n\n const eventHandlers: [string, (e: Event) => boolean][] = []\n Object.values(node.events).forEach((event) => {\n if (!event) {\n return\n }\n\n eventHandlers.push([\n event.trigger,\n getEventHandler({ event, dataSignal, ctx }),\n ])\n })\n\n eventHandlers.forEach(([eventName, handler]) => {\n elem.addEventListener(eventName, handler)\n })\n\n // for script, style & SVG<text> tags we only render text child.\n // this can be removed once we fix the editor to handle raw text nodes without wrapping <span>\n const nodeTag = node.tag.toLocaleLowerCase()\n if (nodeTag === 'script' || nodeTag === 'style') {\n const textValues: Array<Signal<string> | string> = []\n node.children\n .map<NodeModel | undefined>((child) => ctx.component.nodes?.[child])\n .filter((node) => node?.type === 'text')\n .forEach((node) => {\n if (node.value.type === 'value') {\n textValues.push(String(node.value.value))\n } else {\n const textSignal = dataSignal.map((data) => {\n return String(\n applyFormula(node.value, {\n data,\n component: ctx.component,\n formulaCache: ctx.formulaCache,\n root: ctx.root,\n package: ctx.package,\n toddle: ctx.toddle,\n env: ctx.env,\n }),\n )\n })\n textValues.push(textSignal)\n }\n })\n\n // if all values are string, we can directly set textContent\n if (textValues.every((value) => typeof value === 'string')) {\n elem.textContent = textValues.join('')\n }\n\n // for each signal, we subscribe and rewrite the entire textContent from all text nodes\n textValues\n .filter((value) => typeof value !== 'string')\n .forEach((valueSignal) => {\n valueSignal.subscribe(() => {\n elem.textContent = textValues\n .map((value) => (typeof value === 'string' ? value : value.get()))\n .join('')\n })\n })\n } else {\n const childNodes: (Element | Text)[] = []\n node.children.forEach((child, i) => {\n childNodes.push(\n ...createNode({\n parentElement: elem,\n id: child,\n path: path + '.' + i,\n dataSignal,\n ctx,\n namespace,\n instance,\n }),\n )\n })\n elem.append(...childNodes)\n }\n dataSignal.subscribe(() => {}, {\n destroy: () => {\n // TODO: Clean up event listeners, but after destruction of child signals (Maybe we need a \"afterDestroy\" hook on signals?)\n elem.parentNode?.removeChild(elem)\n },\n })\n\n return elem\n}\n\nconst getEventHandler =\n ({\n event,\n dataSignal,\n ctx,\n }: {\n event: ElementNodeModel['events'][string]\n dataSignal: Signal<ComponentData>\n ctx: ComponentContext\n }) =>\n (e: Event) => {\n event?.actions?.forEach((action) => {\n if (e instanceof DragEvent) {\n ;(e as any).data = getDragData(e)\n }\n if (e instanceof ClipboardEvent) {\n try {\n ;(e as any).data = Array.from(e.clipboardData?.items ?? []).reduce<\n Record<string, any>\n >((dragData, item) => {\n try {\n dragData[item.type] = JSON.parse(\n e.clipboardData?.getData(item.type) as any,\n )\n } catch {\n dragData[item.type] = e.clipboardData?.getData(item.type)\n }\n return dragData\n }, {})\n } catch (e) {\n // eslint-disable-next-line no-console\n console.error('Could not get paste data', e)\n }\n }\n void handleAction(action, { ...dataSignal.get(), Event: e }, ctx, e)\n })\n return false\n }\n", "import type { SlotNodeModel } from '@nordcraft/core/dist/component/component.types'\nimport type { NodeRenderer } from './createNode'\nimport { createNode } from './createNode'\n\nexport function createSlot({\n path,\n node,\n dataSignal,\n ctx,\n parentElement,\n instance,\n namespace,\n}: NodeRenderer<SlotNodeModel>): ReadonlyArray<Element | Text> {\n const slotName = node.name ?? 'default'\n let children: Array<Element | Text> = []\n // Is slotted content provided?\n if (ctx.children[slotName]) {\n children = ctx.children[slotName].flatMap((child) => {\n const childDataSignal = child.dataSignal.map((data) => data)\n dataSignal.subscribe((data) => data, {\n destroy: () => childDataSignal.destroy(),\n })\n return createNode({\n ...child,\n dataSignal: childDataSignal,\n parentElement,\n ctx: {\n ...child.ctx,\n providers: ctx.providers,\n },\n instance,\n namespace,\n })\n })\n } else {\n // Otherwise, return placeholder content\n children = node.children.flatMap((child, i) => {\n return createNode({\n id: child,\n path: path + '.' + i,\n dataSignal,\n ctx,\n parentElement,\n instance,\n namespace,\n })\n })\n }\n\n if (ctx.env.runtime === 'custom-element' && ctx.isRootComponent) {\n const webComponentSlot = document.createElement('slot')\n webComponentSlot.setAttribute('name', slotName)\n children.forEach((child) => {\n webComponentSlot.appendChild(child)\n })\n\n return [webComponentSlot]\n }\n\n return children\n}\n", "import type {\n ComponentData,\n SupportedNamespaces,\n TextNodeModel,\n} from '@nordcraft/core/dist/component/component.types'\nimport { applyFormula } from '@nordcraft/core/dist/formula/formula'\nimport type { Signal } from '../signal/signal'\nimport type { ComponentContext } from '../types'\n\nexport type RenderTextProps = {\n node: TextNodeModel\n dataSignal: Signal<ComponentData>\n id: string\n path: string\n namespace?: SupportedNamespaces\n ctx: ComponentContext\n}\n\n/**\n * Create a text node\n *\n * Note: We wrap the text in a <span> to make it easier to select/highlight the text node in the preview.\n * We should find a better way to do this without wrapping the node, and instead use `createTextNode`.\n */\nexport function createText({\n node,\n id,\n path,\n dataSignal,\n namespace,\n ctx,\n}: RenderTextProps): HTMLSpanElement | Text {\n // Span element is not valid outside of the default namespace\n if (namespace && namespace !== 'http://www.w3.org/1999/xhtml') {\n return createTextNS({ node, dataSignal, ctx })\n }\n\n const { value } = node\n const elem = document.createElement('span')\n elem.setAttribute('data-node-id', id)\n if (typeof id === 'string') {\n elem.setAttribute('data-id', path)\n }\n if (ctx.isRootComponent === false) {\n elem.setAttribute('data-component', ctx.component.name)\n }\n elem.setAttribute('data-node-type', 'text')\n if (value.type !== 'value') {\n const sig = dataSignal.map((data) =>\n String(\n applyFormula(value, {\n data,\n component: ctx.component,\n formulaCache: ctx.formulaCache,\n root: ctx.root,\n package: ctx.package,\n toddle: ctx.toddle,\n env: ctx.env,\n }),\n ),\n )\n sig.subscribe((value) => {\n elem.innerText = value\n })\n } else {\n elem.innerText = String(value.value)\n }\n return elem\n}\n\n/**\n * This function is technically more performant than `createText` because it doesn't create a wrapping <span> element.\n * We would like to use this everywhere eventually, but we need to handle raw text selection in the editor (possibly by utilizing text ranges).\n */\nexport function createTextNS({\n node,\n dataSignal,\n ctx,\n}: Pick<RenderTextProps, 'node' | 'dataSignal' | 'ctx'>): Text {\n const { value } = node\n const textNode = document.createTextNode('')\n if (value.type !== 'value') {\n const sig = dataSignal.map((data) =>\n String(\n applyFormula(value, {\n data,\n component: ctx.component,\n formulaCache: ctx.formulaCache,\n root: ctx.root,\n package: ctx.package,\n toddle: ctx.toddle,\n env: ctx.env,\n }),\n ),\n )\n sig.subscribe((value) => {\n textNode.nodeValue = value\n })\n } else {\n textNode.nodeValue = String(value.value)\n }\n\n return textNode\n}\n", "/* eslint-disable no-console */\nimport type {\n ComponentData,\n NodeModel,\n SupportedNamespaces,\n} from '@nordcraft/core/dist/component/component.types'\nimport { applyFormula } from '@nordcraft/core/dist/formula/formula'\nimport { toBoolean } from '@nordcraft/core/dist/utils/util'\nimport type { Signal } from '../signal/signal'\nimport { signal } from '../signal/signal'\nimport type { ComponentContext } from '../types'\nimport { ensureEfficientOrdering, getNextSiblingElement } from '../utils/nodes'\nimport { createComponent } from './createComponent'\nimport { createElement } from './createElement'\nimport { createSlot } from './createSlot'\nimport { createText } from './createText'\n\nexport function createNode({\n id,\n dataSignal,\n path,\n ctx,\n namespace,\n parentElement,\n instance,\n}: {\n id: string\n dataSignal: Signal<ComponentData>\n path: string\n ctx: ComponentContext\n namespace?: SupportedNamespaces\n parentElement: Element | ShadowRoot\n instance: Record<string, string>\n}): ReadonlyArray<Element | Text> {\n const node = ctx.component.nodes?.[id]\n if (!node) {\n return []\n }\n const create = ({\n node,\n ...props\n }: NodeRenderer<NodeModel>): ReadonlyArray<Element | Text> => {\n switch (node.type) {\n case 'element':\n return [\n createElement({\n node,\n ...props,\n }),\n ]\n case 'component':\n // eslint-disable-next-line no-case-declarations\n const isLocalComponent = ctx.components.some(\n (c) => c.name === node.name,\n )\n return createComponent({\n node: { ...node, id }, // we need the node id for instance classes\n ...props,\n ctx: {\n ...ctx,\n package:\n node.package ?? (isLocalComponent ? undefined : ctx.package),\n },\n parentElement,\n })\n case 'text':\n return [createText({ ...props, node })]\n case 'slot':\n return createSlot({ ...props, node })\n }\n }\n\n function conditional({\n node,\n dataSignal,\n id,\n path,\n ctx,\n namespace,\n parentElement,\n instance,\n }: NodeRenderer<NodeModel>): ReadonlyArray<Element | Text> {\n let firstRun = true\n let childDataSignal: Signal<ComponentData> | null = null\n const showSignal = dataSignal.map((data) =>\n toBoolean(\n applyFormula(node.condition, {\n data,\n component: ctx.component,\n formulaCache: ctx.formulaCache,\n root: ctx.root,\n package: ctx.package,\n toddle: ctx.toddle,\n env: ctx.env,\n }),\n ),\n )\n\n const elements: Array<Element | Text> = []\n const toggle = (show: boolean) => {\n if (show && elements.length === 0) {\n childDataSignal?.destroy()\n childDataSignal = dataSignal.map((data) => data)\n elements.push(\n ...create({\n node,\n dataSignal: childDataSignal,\n path,\n id,\n ctx,\n namespace,\n parentElement,\n instance,\n }),\n )\n\n // No reason to continue if we are on first run, as the render phase has not yet been reached\n if (firstRun) {\n return\n }\n\n if (!parentElement || ctx.root.contains(parentElement) === false) {\n console.error(\n `Conditional: Parent element does not exist for \"${path}\" This is likely due to the DOM being modified outside of Nordcraft.`,\n )\n return\n }\n\n if (parentElement.querySelector(`[data-id=\"${path}\"]`)) {\n console.warn(\n `Conditional: Element with data-id=\"${path}\" already exists. This is likely due to the DOM being modified outside of Nordcraft`,\n )\n return\n }\n\n const nextPathElement = getNextSiblingElement(path, parentElement)\n for (const element of elements) {\n parentElement.insertBefore(element, nextPathElement)\n }\n } else if (!show) {\n childDataSignal?.destroy()\n elements.forEach((elem) => elem.remove())\n elements.splice(0, elements.length)\n }\n }\n\n showSignal.subscribe(toggle, {\n destroy: () => {\n childDataSignal?.destroy()\n },\n })\n if (ctx.env.runtime === 'preview' && ctx.toddle._preview) {\n ctx.toddle._preview.showSignal.subscribe(\n ({ displayedNodes, testMode }) => {\n if (displayedNodes.includes(path) && !testMode) {\n // only override the default show if we are in design mode (not test mode)\n toggle(true)\n } else {\n toggle(showSignal.get())\n }\n },\n )\n }\n\n firstRun = false\n return elements\n }\n\n function repeat(): ReadonlyArray<Element | Text> {\n let firstRun = true\n let repeatItems = new Map<\n string | number,\n {\n dataSignal: Signal<ComponentData>\n cleanup: () => void\n elements: ReadonlyArray<Element | Text>\n }\n >()\n const repeatSignal = dataSignal.map((data) => {\n const list = applyFormula(node?.repeat, {\n data,\n component: ctx.component,\n formulaCache: ctx.formulaCache,\n root: ctx.root,\n package: ctx.package,\n toddle: ctx.toddle,\n env: ctx.env,\n })\n if (typeof list !== 'object') {\n return []\n }\n return Object.entries(list ?? {})\n })\n\n repeatSignal.subscribe(\n (list) => {\n const newRepeatItems = new Map<\n string | number,\n {\n dataSignal: Signal<ComponentData>\n cleanup: () => void\n elements: ReadonlyArray<Element | Text>\n }\n >()\n\n for (let i = 0; i < list.length; i++) {\n const [Key, Item] = list[i]\n const childData = {\n ...dataSignal.get(),\n ListItem: {\n ...(dataSignal.get().ListItem\n ? { Parent: dataSignal.get().ListItem }\n : {}),\n Item,\n Index: Number(i),\n Key,\n },\n }\n let childKey = node?.repeatKey\n ? applyFormula(node.repeatKey, {\n data: childData,\n component: ctx.component,\n formulaCache: ctx.formulaCache,\n root: ctx.root,\n package: ctx.package,\n toddle: ctx.toddle,\n env: ctx.env,\n })\n : Key\n\n // Can't we just use the Item reference as key as we have fine-grained reactivity at this point?\n // That way we won't need repeatKey at all as everything will be optimized by reference?!?\n // https://github.com/solidjs/solid/discussions/366#discussioncomment-1220239\n // childKey = Item\n // Do fallback to Key(index) if repeatKey has duplicate values.\n // This will essentially disable the optimization for repeatKey and will always re-render the children on every change.\n if (newRepeatItems.has(childKey)) {\n console.warn(\n `Duplicate key \"${childKey}\" found in repeat. Fallback to index as key. This will cause a re-render of the duplicated children on every change.`,\n )\n childKey = Key\n }\n\n const existingItem = repeatItems.get(childKey)\n if (existingItem) {\n newRepeatItems.set(childKey, existingItem)\n existingItem.dataSignal.update((data) => {\n return {\n ...data,\n ListItem: {\n ...(dataSignal.get().ListItem\n ? { Parent: dataSignal.get().ListItem }\n : {}),\n Item,\n Index: Number(i),\n Key,\n },\n }\n })\n } else {\n const childDataSignal = signal<ComponentData>(childData)\n const cleanup = dataSignal.subscribe(\n (data) => {\n if (firstRun) {\n return\n }\n\n childDataSignal.update(({ ListItem }) => {\n return {\n ...data,\n ListItem,\n }\n })\n },\n {\n destroy: () => childDataSignal.destroy(),\n },\n )\n\n const args = {\n node: node!,\n id,\n dataSignal: childDataSignal,\n path: Key === '0' ? path : `${path}(${Key})`,\n ctx,\n namespace,\n parentElement,\n instance,\n }\n const elements = node!.condition ? conditional(args) : create(args)\n newRepeatItems.set(childKey, {\n dataSignal: childDataSignal,\n cleanup,\n elements,\n })\n }\n }\n\n // Cleanup removed items' data\n Array.from(repeatItems.entries()).forEach(([key, item]) => {\n if (!newRepeatItems.has(key)) {\n item.cleanup()\n item.dataSignal.destroy()\n item.elements.forEach((e) => e.remove())\n }\n })\n repeatItems = newRepeatItems\n\n // No reason to continue if we are on first run, as the render-phase for the parent\n // has not yet been reached, or if there are no items to render\n if (firstRun || repeatItems.size === 0) {\n return\n }\n\n if (!parentElement || ctx.root.contains(parentElement) === false) {\n console.error(\n `Repeat: Parent element does not exist for ${path}. This is likely due to the DOM being modified outside of Nordcraft.`,\n )\n return\n }\n\n ensureEfficientOrdering(\n parentElement,\n Array.from(repeatItems.values()).flatMap((e) => e.elements),\n getNextSiblingElement(path, parentElement),\n )\n },\n {\n destroy: () =>\n Array.from(repeatItems.values()).forEach((e) => {\n e.cleanup()\n e.dataSignal.destroy()\n e.elements.forEach((e) => e.remove())\n }),\n },\n )\n\n // We utilize that the signal subscription runs synchronously above,\n // so we already have a populated repeatItems map to return initially.\n // Note: `repeatItems.values()` is okay here, as maps' iterator is ordered by insertion.\n firstRun = false\n return Array.from(repeatItems.values()).flatMap((e) => e.elements)\n }\n\n if (node.repeat) {\n return repeat()\n }\n if (node.condition) {\n return conditional({\n node,\n dataSignal,\n ctx,\n id,\n path,\n namespace,\n parentElement,\n instance,\n })\n }\n return create({\n node,\n dataSignal,\n ctx,\n id,\n path,\n namespace,\n parentElement,\n instance,\n })\n}\nexport type NodeRenderer<NodeType> = {\n node: NodeType\n dataSignal: Signal<ComponentData>\n id: string\n path: string\n ctx: ComponentContext\n namespace?: SupportedNamespaces\n parentElement: Element | ShadowRoot\n instance: Record<string, string>\n}\n", "import { isLegacyApi, sortApiObjects } from '@nordcraft/core/dist/api/api'\nimport type {\n Component,\n ComponentData,\n} from '@nordcraft/core/dist/component/component.types'\nimport type { ToddleEnv } from '@nordcraft/core/dist/formula/formula'\nimport { applyFormula } from '@nordcraft/core/dist/formula/formula'\nimport { createStylesheet } from '@nordcraft/core/dist/styling/style.css'\nimport type { Theme } from '@nordcraft/core/dist/styling/theme'\nimport { theme as defaultTheme } from '@nordcraft/core/dist/styling/theme.const'\nimport type { Toddle } from '@nordcraft/core/dist/types'\nimport { mapObject } from '@nordcraft/core/dist/utils/collections'\nimport { isContextApiV2 } from '../api/apiUtils'\nimport { createLegacyAPI } from '../api/createAPI'\nimport { createAPI } from '../api/createAPIv2'\nimport { renderComponent } from '../components/renderComponent'\nimport { isContextProvider } from '../context/isContextProvider'\nimport type { Signal } from '../signal/signal'\nimport { signal } from '../signal/signal'\nimport type { ComponentContext, LocationSignal } from '../types'\n\n/**\n * Base class for all toddle components\n */\nexport class ToddleComponent extends HTMLElement {\n /**\n * Public reference to the toddle instance for debugging purposes. `el.toddle.errors` can be used to check for non-verbose errors.\n */\n toddle: Toddle<LocationSignal, never>\n #component: Component\n #ctx: ComponentContext\n #shadowRoot: ShadowRoot\n #signal: Signal<ComponentData>\n #files: { themes: Record<string, Theme> }\n\n constructor(\n component: Component,\n options: { components: Component[]; themes: Record<string, Theme> },\n toddle: Toddle<LocationSignal, never>,\n ) {\n super()\n this.toddle = toddle\n const internals = this.attachInternals()\n if (internals.shadowRoot) {\n // Not used yet, but can be used to hydrate rather than render the shadow dom\n this.#shadowRoot = internals.shadowRoot\n } else {\n this.#shadowRoot = this.attachShadow({ mode: 'open' })\n }\n\n const env: ToddleEnv = {\n branchName: toddle.branch || 'main',\n isServer: false,\n request: undefined,\n runtime: 'custom-element',\n logErrors: true,\n }\n\n this.#component = component\n this.#signal = createSignal({\n component,\n root: this.#shadowRoot,\n toddle,\n env,\n })\n this.#files = {\n themes: options.themes,\n }\n\n // Call the abort signal if the component's datasignal is destroyed (component unmounted) to cancel any pending requests\n const abortController = new AbortController()\n this.#signal.subscribe(() => {}, {\n destroy: () =>\n abortController.abort(`Component ${component.name} unmounted`),\n })\n\n this.#ctx = {\n triggerEvent: this.dispatch.bind(this),\n root: this.#shadowRoot,\n isRootComponent: true,\n components: options.components,\n component: this.#component,\n dataSignal: this.#signal,\n formulaCache: {},\n apis: {},\n abortSignal: abortController.signal,\n children: {},\n providers: {},\n package: undefined,\n toddle,\n env,\n }\n }\n\n connectedCallback() {\n sortApiObjects(Object.entries(this.#component.apis ?? {})).forEach(\n ([name, api]) => {\n if (isLegacyApi(api)) {\n this.#ctx.apis[name] = createLegacyAPI(api, this.#ctx)\n } else {\n this.#ctx.apis[name] = createAPI({\n apiRequest: api,\n ctx: this.#ctx,\n componentData: this.#signal.get(),\n })\n }\n },\n )\n Object.values(this.#ctx.apis)\n .filter(isContextApiV2)\n .forEach((api) => {\n api.triggerActions(this.#signal.get())\n })\n\n let providers = this.#ctx.providers\n if (isContextProvider(this.#component)) {\n // Subscribe to exposed formulas and update the component's data signal\n const formulaDataSignals = Object.fromEntries(\n Object.entries(this.#component.formulas ?? {})\n .filter(([, formula]) => formula.exposeInContext)\n .map(([name, formula]) => [\n name,\n this.#signal.map((data) =>\n applyFormula(formula.formula, {\n data,\n component: this.#component,\n formulaCache: this.#ctx.formulaCache,\n root: this.#ctx.root,\n package: this.#ctx.package,\n toddle: this.#ctx.toddle,\n env: this.#ctx.env,\n }),\n ),\n ]),\n )\n\n providers = {\n ...providers,\n [this.#component.name]: {\n component: this.#component,\n formulaDataSignals,\n ctx: this.#ctx,\n },\n }\n }\n\n this.#ctx.providers = providers\n this.render()\n }\n\n disconnectedCallback() {\n this.#signal.destroy()\n }\n\n dispatch(eventName: string, data: any) {\n this.dispatchEvent(\n new CustomEvent(eventName, {\n detail: data,\n bubbles: true,\n composed: true,\n }),\n )\n }\n\n render() {\n const elements = renderComponent({\n ...this.#ctx,\n path: '0',\n onEvent: this.dispatch.bind(this),\n parentElement: this.#shadowRoot,\n instance: { [this.#component.name]: 'root' },\n })\n\n this.#shadowRoot.innerHTML = ''\n const styles = createStylesheet(\n this.#ctx.component,\n this.#ctx.components,\n Object.entries(this.#files.themes ?? {}).length > 0\n ? this.#files.themes\n : { defaultTheme },\n { includeResetStyle: true, createFontFaces: false },\n )\n const stylesElem = document.createElement('style')\n stylesElem.appendChild(document.createTextNode(styles))\n this.#shadowRoot.appendChild(stylesElem)\n const rootElement = elements[0] as Element | null\n if (rootElement) {\n this.#shadowRoot.appendChild(rootElement)\n }\n }\n\n // Overload the setAttribute method to allow setting complex attributes\n setAttribute(name: string, value: unknown) {\n switch (typeof value) {\n case 'number':\n super.setAttribute(name, String(value))\n break\n case 'string':\n super.setAttribute(name, value)\n // Return early, as signal is updated through attributeChangedCallback on string values\n return this\n default:\n super.setAttribute(name, `[Object ${typeof value}]`)\n break\n }\n\n // Update the signal with complex value\n this.#signal.set({\n ...this.#signal.get(),\n Attributes: {\n ...this.#signal.get().Attributes,\n [name]: value,\n },\n })\n\n return this\n }\n\n // Overload the getAttribute method to point to source of truth (the signal)\n getAttribute<T>(name: string) {\n return (\n (this.#signal.get().Attributes[name] as T) || super.getAttribute(name)\n )\n }\n\n attributeChangedCallback(name: string, oldValue: never, newValue: string) {\n const attributeName = this.getAttributeCaseInsensitive(name)\n const currentRawValue = this.getAttribute(attributeName)\n // Is this is a complex value that has already been set by `setAttribute`\n if (newValue === '[Object object]') {\n return\n }\n\n //Has this just been set by `setAttribute` as a number\n if (parseFloat(newValue) === currentRawValue) {\n return\n }\n\n this.#signal.set({\n ...this.#signal.get(),\n Attributes: {\n ...this.#signal.get().Attributes,\n [attributeName]: newValue,\n },\n })\n }\n\n private getAttributeCaseInsensitive(name: string) {\n const attributeName = Object.keys(this.#signal.get().Attributes).find(\n (key) => key.toLowerCase() === name.toLowerCase(),\n )\n\n // This should never happen (TM) as we only observe attributes that are defined on the component\n if (!attributeName) {\n throw new Error(\n `Unable to find attribute ${name} on component ${this.#component.name}`,\n )\n }\n\n return attributeName\n }\n\n // Debugging purposes\n get __component() {\n return this.#component\n }\n\n get __ctx() {\n return this.#ctx\n }\n\n get __signal() {\n return this.#signal\n }\n}\n\nexport const createSignal = ({\n component,\n root,\n toddle,\n env,\n}: {\n component: Component\n root: ShadowRoot\n toddle: Toddle<LocationSignal, never>\n env: ToddleEnv\n}) => {\n return signal<ComponentData>({\n // Pages are not supported as custom elements, so no need to add location signal\n Location: undefined,\n Variables: mapObject(\n component.variables ?? {},\n ([name, { initialValue }]) => {\n if (!component) {\n throw new Error(`Component not found`)\n }\n return [\n name,\n applyFormula(initialValue, {\n data: {\n Attributes: {},\n },\n component: component,\n root,\n package: undefined,\n toddle,\n env,\n }),\n ]\n },\n ),\n Attributes: mapObject(component.attributes ?? {}, ([name]) => [\n name,\n // TODO: Perhaps we can get it from the DOM already and set initial attributes already?\n undefined,\n ]),\n Apis: mapObject(component.apis ?? {}, ([name]) => [\n name,\n { data: null, isLoading: false, error: null },\n ]),\n })\n}\n", "import type { Component } from '@nordcraft/core/dist/component/component.types'\nimport type { Theme } from '@nordcraft/core/dist/styling/theme'\nimport type { Toddle } from '@nordcraft/core/dist/types'\nimport { safeCustomElementName } from '@nordcraft/core/dist/utils/customElements'\nimport type { LocationSignal } from '../types'\nimport { ToddleComponent } from './ToddleComponent'\n\n/**\n * Define each component as a new web component\n *\n * Use them like: `<toddle-test my-attr=\"test\" style=\"--my-color: rebeccapurple\"></toddle-test>`\n *\n * You can access the component and `addEventListener` to it like:\n *\n * ```js\n * const component = document.querySelector('toddle-test')\n * component.addEventListener('my-event', (e) => {\n * console.log(e.detail)\n * })\n * ```\n *\n * @param componentNames - The names of the components to define. These should be the names of the components in the app context\n * @param options - A subset of the app context. This holds a list of all the components needed to define the components in `componentNames`\n * @param toddle - Also available at `window.toddle`. However, multiple instances of toddle can exist on the same page, so we pass a reference here. We should ultimately remove the global scope reference as polite web components should be self-contained.\n */\nexport const defineComponents = (\n componentNames: string[],\n options: {\n components: Component[]\n themes: Record<string, Theme>\n },\n toddle: Toddle<LocationSignal, never>,\n) => {\n componentNames\n .map<Component>(\n (name) =>\n options.components.find(\n (component) => component.name === name,\n ) as Component,\n )\n .forEach((component) => {\n const tag = safeCustomElementName(component.name)\n if (customElements.get(tag)) {\n // eslint-disable-next-line no-console\n console.warn(`Component ${tag} already defined`)\n return\n }\n\n customElements.define(\n tag,\n class extends ToddleComponent {\n constructor() {\n super(component, options, toddle)\n }\n\n // When read from DOM, all attributes are lower case, so we must observe them as such\n static get observedAttributes() {\n return Object.keys(component.attributes ?? {}).map((key) =>\n key.toLowerCase(),\n )\n }\n },\n )\n })\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["'use strict';\n\n// do not edit .js files directly - edit src/index.jst\n\n\n\nmodule.exports = function equal(a, b) {\n if (a === b) return true;\n\n if (a && b && typeof a == 'object' && typeof b == 'object') {\n if (a.constructor !== b.constructor) return false;\n\n var length, i, keys;\n if (Array.isArray(a)) {\n length = a.length;\n if (length != b.length) return false;\n for (i = length; i-- !== 0;)\n if (!equal(a[i], b[i])) return false;\n return true;\n }\n\n\n\n if (a.constructor === RegExp) return a.source === b.source && a.flags === b.flags;\n if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf();\n if (a.toString !== Object.prototype.toString) return a.toString() === b.toString();\n\n keys = Object.keys(a);\n length = keys.length;\n if (length !== Object.keys(b).length) return false;\n\n for (i = length; i-- !== 0;)\n if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false;\n\n for (i = length; i-- !== 0;) {\n var key = keys[i];\n\n if (!equal(a[key], b[key])) return false;\n }\n\n return true;\n }\n\n // true if both NaN, false otherwise\n return a!==a && b!==b;\n};\n", "import * as deleteFromSessionStorage from \"./actions/deleteFromSessionStorage/handler\"\nimport * as saveToLocalStorage from \"./actions/saveToLocalStorage/handler\"\nimport * as interval from \"./actions/interval/handler\"\nimport * as deleteFromLocalStorage from \"./actions/deleteFromLocalStorage/handler\"\nimport * as setSessionCookies from \"./actions/setSessionCookies/handler\"\nimport * as clearLocalStorage from \"./actions/clearLocalStorage/handler\"\nimport * as clearSessionStorage from \"./actions/clearSessionStorage/handler\"\nimport * as logToConsole from \"./actions/logToConsole/handler\"\nimport * as setHttpOnlyCookie from \"./actions/setHttpOnlyCookie/handler\"\nimport * as saveToSessionStorage from \"./actions/saveToSessionStorage/handler\"\nimport * as copyToClipboard from \"./actions/copyToClipboard/handler\"\nimport * as stopPropagation from \"./actions/stopPropagation/handler\"\nimport * as setCookie from \"./actions/setCookie/handler\"\nimport * as focus from \"./actions/focus/handler\"\nimport * as preventDefault from \"./actions/preventDefault/handler\"\nimport * as share from \"./actions/share/handler\"\nimport * as sleep from \"./actions/sleep/handler\"\nimport * as gotToURL from \"./actions/gotToURL/handler\"\n\nexport {\n deleteFromSessionStorage,\n saveToLocalStorage,\n interval,\n deleteFromLocalStorage,\n setSessionCookies,\n clearLocalStorage,\n clearSessionStorage,\n logToConsole,\n setHttpOnlyCookie,\n saveToSessionStorage,\n copyToClipboard,\n stopPropagation,\n setCookie,\n focus,\n preventDefault,\n share,\n sleep,\n gotToURL\n}\n ", "import type { ActionHandler } from '@nordcraft/core/dist/types'\n\nconst handler: ActionHandler = async function ([key]) {\n if (typeof key !== 'string' || key.length === 0) {\n throw new Error(`Invalid key: ${key}`)\n }\n window.sessionStorage.removeItem(key)\n}\n\nexport default handler\n", "import type { ActionHandler } from '@nordcraft/core/dist/types'\n\nconst handler: ActionHandler = async function ([key, value]) {\n if (typeof key !== 'string' || key.length === 0) {\n throw new Error(`Invalid key: ${key}`)\n }\n window.localStorage.setItem(key, JSON.stringify(value))\n}\n\nexport default handler\n", "import type { ActionHandler } from '@nordcraft/core/dist/types'\nimport { isDefined } from '@nordcraft/core/dist/utils/util'\n\nconst handler: ActionHandler = ([delay], ctx) => {\n // We'll cast delay in case it's passed as a string\n const delayNumber = Number(delay)\n if (!isDefined(delay) || Number.isNaN(delay)) {\n throw new Error('Invalid delay value')\n }\n const interval = setInterval(\n () => ctx.triggerActionEvent('tick', null),\n delayNumber,\n )\n ctx.abortSignal.addEventListener('abort', () => {\n clearInterval(interval)\n })\n}\n\nexport default handler\n", "export const isDefined = <T>(value: T | undefined | null): value is T =>\n value !== null && value !== undefined\n\nexport const isObject = (input: any): input is Record<string, any> =>\n typeof input === 'object' && input !== null\n\nexport const toBoolean = (value: any) =>\n value !== false && value !== undefined && value !== null\n", "import type { ActionHandler } from '@nordcraft/core/dist/types'\n\nconst handler: ActionHandler = async function ([key]) {\n if (typeof key !== 'string' || key.length === 0) {\n throw new Error(`Invalid key: ${key}`)\n }\n window.localStorage.removeItem(key)\n}\n\nexport default handler\n", "import type { ActionHandler } from '@nordcraft/core/dist/types'\n\nconst handler: ActionHandler = async function ([access_token, ttl], ctx) {\n const query = [\n typeof access_token === 'string'\n ? `name=access_token&value=${encodeURIComponent(access_token)}`\n : undefined,\n isNaN(Number(ttl)) ? undefined : `ttl=${ttl}`,\n ]\n .filter((a) => a)\n .join('&')\n const res = await fetch(`/.toddle/cookies/set-session-cookie?${query}`)\n if (res.ok) {\n ctx.triggerActionEvent('Success', undefined)\n } else {\n ctx.triggerActionEvent('Error', new Error(await res.text()))\n }\n}\n\nexport default handler\n", "import type { ActionHandler } from '@nordcraft/core/dist/types'\n\nconst handler: ActionHandler = async function () {\n window.localStorage.clear()\n}\n\nexport default handler\n", "import type { ActionHandler } from '@nordcraft/core/dist/types'\n\nconst handler: ActionHandler = async function () {\n window.sessionStorage.clear()\n}\n\nexport default handler\n", "import type { ActionHandler } from '@nordcraft/core/dist/types'\n\nconst handler: ActionHandler = ([label, data]: unknown[]) => {\n // eslint-disable-next-line no-console\n console.log(label, data)\n}\n\nexport default handler\n", "import type { ActionHandler } from '@nordcraft/core/dist/types'\n\nconst handler: ActionHandler = async function (\n [name, value, ttl, _sameSite, _path, _includeSubdomains],\n ctx,\n) {\n const error = (message: string) =>\n ctx.triggerActionEvent('Error', new Error(message))\n\n if (typeof name !== 'string') {\n error('The \"Name\" argument must be a string')\n return\n }\n if (typeof value !== 'string') {\n error('The \"Value\" argument must be a string')\n return\n }\n const sameSite = _sameSite ?? 'Lax' // Default value\n if (\n typeof sameSite !== 'string' ||\n !['lax', 'strict', 'none'].includes(sameSite.toLocaleLowerCase())\n ) {\n error('The \"SameSite\" argument must be \"Lax\", \"Strict\" or \"None\"')\n return\n }\n const path = _path ?? '/' // Default value\n if (typeof path !== 'string' || !path.startsWith('/')) {\n error('The \"Path\" argument must be a string and start with /')\n return\n }\n if (\n ttl !== undefined &&\n ttl !== null &&\n (typeof ttl !== 'number' || isNaN(ttl))\n ) {\n error('The \"Expires in\" argument must be a number')\n return\n }\n const includeSubdomains = _includeSubdomains ?? true // Default value\n if (typeof includeSubdomains !== 'boolean') {\n error('The \"Include Subdomains\" argument must be a boolean')\n return\n }\n const params = new URLSearchParams()\n params.set('name', name)\n params.set('value', value)\n params.set('sameSite', sameSite)\n params.set('path', path)\n params.set('includeSubdomains', String(includeSubdomains))\n if (typeof ttl === 'number') {\n params.set('ttl', String(ttl))\n }\n try {\n const res = await fetch(\n `/.nordcraft/cookies/set-cookie?${params.toString()}`,\n )\n if (res.ok) {\n ctx.triggerActionEvent('Success', undefined)\n } else {\n error(await res.text())\n }\n } catch (err) {\n error(err instanceof Error ? err.message : 'An unexpected error occurred')\n }\n}\n\nexport default handler\n", "import type { ActionHandler } from '@nordcraft/core/dist/types'\n\nconst handler: ActionHandler = async function ([key, value]) {\n if (typeof key !== 'string' || key.length === 0) {\n throw new Error(`Invalid key: ${key}`)\n }\n window.sessionStorage.setItem(key, JSON.stringify(value))\n}\n\nexport default handler\n", "import type { ActionHandler } from '@nordcraft/core/dist/types'\n\nconst handler: ActionHandler = ([value]) => {\n if (typeof value !== 'string') {\n throw new Error(`Input value must be a string`)\n }\n return navigator.clipboard.writeText(value)\n}\n\nexport default handler\n", "import type { ActionHandler } from '@nordcraft/core/dist/types'\n\nconst handler: ActionHandler = (_, _ctx, event) => {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n event?.stopPropagation?.()\n}\n\nexport default handler\n", "import type { ActionHandler } from '@nordcraft/core/dist/types'\n\nconst handler: ActionHandler = async function (\n [name, value, ttl, _sameSite, _path, _includeSubdomains],\n ctx,\n) {\n const error = (message: string) =>\n ctx.triggerActionEvent('Error', new Error(message))\n if (typeof name !== 'string') {\n error('The \"Name\" argument must be a string')\n return\n }\n if (typeof value !== 'string') {\n error('The \"Value\" argument must be a string')\n return\n }\n const sameSite = _sameSite ?? 'Lax' // Default value\n if (\n typeof sameSite !== 'string' ||\n !['lax', 'strict', 'none'].includes(sameSite.toLocaleLowerCase())\n ) {\n error('The \"SameSite\" argument must be \"Lax\", \"Strict\" or \"None\"')\n return\n }\n const path = _path ?? '/' // Default value\n if (typeof path !== 'string' || !path.startsWith('/')) {\n error('The \"Path\" argument must be a string and start with /')\n return\n }\n if (\n ttl !== undefined &&\n ttl !== null &&\n (typeof ttl !== 'number' || isNaN(ttl))\n ) {\n error('The \"Expires in\" argument must be a number')\n return\n }\n const includeSubdomains = _includeSubdomains ?? true // Default value\n if (typeof includeSubdomains !== 'boolean') {\n error('The \"Include Subdomains\" argument must be a boolean')\n return\n }\n // The cookie will always be set to Secure. Anything else can be configured\n let cookie = `${name}=${value}; SameSite=${sameSite}; Path=${path}`\n // If no ttl is set, the cookie will be a session cookie\n if (typeof ttl === 'number') {\n const date = new Date(Date.now() + ttl * 1000)\n cookie += `; Expires=${date.toUTCString()}`\n }\n if (includeSubdomains) {\n // When the domain is set, the cookie is also available to subdomains - otherwise\n // it is only available on the current domain\n cookie += `; Domain=${window.location.hostname}`\n }\n document.cookie = cookie\n ctx.triggerActionEvent('Success', undefined)\n}\n\nexport default handler\n", "import type { ActionHandler } from '@nordcraft/core/dist/types'\n\nconst handler: ActionHandler = ([elem]) => {\n if (elem instanceof HTMLElement) {\n elem.focus()\n }\n}\n\nexport default handler\n", "import type { ActionHandler } from '@nordcraft/core/dist/types'\n\nconst handler: ActionHandler = (_, _ctx, event) => {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n event?.preventDefault?.()\n}\n\nexport default handler\n", "import type { ActionHandler } from '@nordcraft/core/dist/types'\nimport { isDefined } from '@nordcraft/core/dist/utils/util'\n\nconst handler: ActionHandler = ([url, title, text]) => {\n const validInput = (value: any): value is string =>\n isDefined(value) && typeof value === 'string'\n if (!validInput(url) && !validInput(title) && !validInput(text)) {\n throw new Error(`Either url, text or title must be provided`)\n }\n const data: ShareData = {}\n if (validInput(title)) {\n data.title = title\n }\n if (validInput(text)) {\n data.text = text\n }\n if (validInput(url)) {\n data.url = url\n }\n // Later we can add support for data.files as well\n if (isDefined(navigator.share) && navigator.canShare(data)) {\n return navigator.share(data)\n }\n}\n\nexport default handler\n", "import type { ActionHandler } from '@nordcraft/core/dist/types'\nimport { isDefined } from '@nordcraft/core/dist/utils/util'\n\nconst handler: ActionHandler = ([delay], ctx) => {\n // We'll cast delay in case it's passed as a string\n const delayNumber = Number(delay)\n if (!isDefined(delay) || Number.isNaN(delay)) {\n throw new Error('Invalid delay value')\n }\n const timeout = setTimeout(\n () => ctx.triggerActionEvent('tick', null),\n delayNumber,\n )\n ctx.abortSignal.addEventListener('abort', () => {\n clearTimeout(timeout)\n })\n}\n\nexport default handler\n", "import type { ActionHandler } from '@nordcraft/core/dist/types'\n\nconst handler: ActionHandler = ([url], ctx) => {\n if (typeof url === 'string') {\n if (ctx.env.runtime === 'preview') {\n // Attempt to notify the parent about the failed navigation attempt\n window.parent?.postMessage({ type: 'blockedNavigation', url }, '*')\n } else {\n window.location.href = url\n }\n }\n}\n\nexport default handler\n", "import * as string from \"./formulas/string/handler\"\nimport * as languages from \"./formulas/languages/handler\"\nimport * as matches from \"./formulas/matches/handler\"\nimport * as decodeURIComponent from \"./formulas/decodeURIComponent/handler\"\nimport * as logarithm from \"./formulas/logarithm/handler\"\nimport * as boolean from \"./formulas/boolean/handler\"\nimport * as capitalize from \"./formulas/capitalize/handler\"\nimport * as power from \"./formulas/power/handler\"\nimport * as encodeURIComponent from \"./formulas/encodeURIComponent/handler\"\nimport * as encodeBase64 from \"./formulas/encodeBase64/handler\"\nimport * as encodeJSON from \"./formulas/encodeJSON/handler\"\nimport * as takeLast from \"./formulas/takeLast/handler\"\nimport * as dateFromTimestamp from \"./formulas/dateFromTimestamp/handler\"\nimport * as join from \"./formulas/join/handler\"\nimport * as clamp from \"./formulas/clamp/handler\"\nimport * as roundDown from \"./formulas/roundDown/handler\"\nimport * as minus from \"./formulas/minus/handler\"\nimport * as sort_by from \"./formulas/sort_by/handler\"\nimport * as map from \"./formulas/map/handler\"\nimport * as every from \"./formulas/every/handler\"\nimport * as sum from \"./formulas/sum/handler\"\nimport * as randomNumber from \"./formulas/randomNumber/handler\"\nimport * as squareRoot from \"./formulas/squareRoot/handler\"\nimport * as formatDate from \"./formulas/formatDate/handler\"\nimport * as modulo from \"./formulas/modulo/handler\"\nimport * as now from \"./formulas/now/handler\"\nimport * as prepend from \"./formulas/prepend/handler\"\nimport * as groupBy from \"./formulas/groupBy/handler\"\nimport * as last from \"./formulas/last/handler\"\nimport * as parseJSON from \"./formulas/parseJSON/handler\"\nimport * as uppercase from \"./formulas/uppercase/handler\"\nimport * as round from \"./formulas/round/handler\"\nimport * as dropLast from \"./formulas/dropLast/handler\"\nimport * as canShare from \"./formulas/canShare/handler\"\nimport * as fromEntries from \"./formulas/fromEntries/handler\"\nimport * as greaterThan from \"./formulas/greaterThan/handler\"\nimport * as includes from \"./formulas/includes/handler\"\nimport * as absolute from \"./formulas/absolute/handler\"\nimport * as isServer from \"./formulas/isServer/handler\"\nimport * as parseURL from \"./formulas/parseURL/handler\"\nimport * as lessOrEqual from \"./formulas/lessOrEqual/handler\"\nimport * as typeOf from \"./formulas/typeOf/handler\"\nimport * as findLast from \"./formulas/findLast/handler\"\nimport * as lessThan from \"./formulas/lessThan/handler\"\nimport * as append from \"./formulas/append/handler\"\nimport * as getFromSessionStorage from \"./formulas/getFromSessionStorage/handler\"\nimport * as unique from \"./formulas/unique/handler\"\nimport * as concatenate from \"./formulas/concatenate/handler\"\nimport * as take from \"./formulas/take/handler\"\nimport * as get from \"./formulas/get/handler\"\nimport * as lowercase from \"./formulas/lowercase/handler\"\nimport * as equals from \"./formulas/equals/handler\"\nimport * as first from \"./formulas/first/handler\"\nimport * as json from \"./formulas/json/handler\"\nimport * as max from \"./formulas/max/handler\"\nimport * as dateFromString from \"./formulas/dateFromString/handler\"\nimport * as deleteKey from \"./formulas/deleteKey/handler\"\nimport * as min from \"./formulas/min/handler\"\nimport * as reverse from \"./formulas/reverse/handler\"\nimport * as branchName from \"./formulas/branchName/handler\"\nimport * as greaterOrEqueal from \"./formulas/greaterOrEqueal/handler\"\nimport * as size from \"./formulas/size/handler\"\nimport * as reduce from \"./formulas/reduce/handler\"\nimport * as set from \"./formulas/set/handler\"\nimport * as some from \"./formulas/some/handler\"\nimport * as entries from \"./formulas/entries/handler\"\nimport * as flatten from \"./formulas/flatten/handler\"\nimport * as drop from \"./formulas/drop/handler\"\nimport * as divide from \"./formulas/divide/handler\"\nimport * as find from \"./formulas/find/handler\"\nimport * as filter from \"./formulas/filter/handler\"\nimport * as getFromLocalStorage from \"./formulas/getFromLocalStorage/handler\"\nimport * as number from \"./formulas/number/handler\"\nimport * as shuffle from \"./formulas/shuffle/handler\"\nimport * as add from \"./formulas/add/handler\"\nimport * as defaultTo from \"./formulas/defaultTo/handler\"\nimport * as roundUp from \"./formulas/roundUp/handler\"\nimport * as lastIndexOf from \"./formulas/lastIndexOf/handler\"\nimport * as timestamp from \"./formulas/timestamp/handler\"\nimport * as getCookie from \"./formulas/getCookie/handler\"\nimport * as indexOf from \"./formulas/indexOf/handler\"\nimport * as currentURL from \"./formulas/currentURL/handler\"\nimport * as replaceAll from \"./formulas/replaceAll/handler\"\nimport * as getElementById from \"./formulas/getElementById/handler\"\nimport * as userAgent from \"./formulas/userAgent/handler\"\nimport * as startsWith from \"./formulas/startsWith/handler\"\nimport * as getHttpOnlyCookie from \"./formulas/getHttpOnlyCookie/handler\"\nimport * as multiply from \"./formulas/multiply/handler\"\nimport * as findIndex from \"./formulas/findIndex/handler\"\nimport * as range from \"./formulas/range/handler\"\nimport * as trim from \"./formulas/trim/handler\"\nimport * as not from \"./formulas/not/handler\"\nimport * as formatNumber from \"./formulas/formatNumber/handler\"\nimport * as notEqual from \"./formulas/notEqual/handler\"\nimport * as keyBy from \"./formulas/keyBy/handler\"\nimport * as decodeBase64 from \"./formulas/decodeBase64/handler\"\nimport * as split from \"./formulas/split/handler\"\n\nexport {\n string,\n languages,\n matches,\n decodeURIComponent,\n logarithm,\n boolean,\n capitalize,\n power,\n encodeURIComponent,\n encodeBase64,\n encodeJSON,\n takeLast,\n dateFromTimestamp,\n join,\n clamp,\n roundDown,\n minus,\n sort_by,\n map,\n every,\n sum,\n randomNumber,\n squareRoot,\n formatDate,\n modulo,\n now,\n prepend,\n groupBy,\n last,\n parseJSON,\n uppercase,\n round,\n dropLast,\n canShare,\n fromEntries,\n greaterThan,\n includes,\n absolute,\n isServer,\n parseURL,\n lessOrEqual,\n typeOf,\n findLast,\n lessThan,\n append,\n getFromSessionStorage,\n unique,\n concatenate,\n take,\n get,\n lowercase,\n equals,\n first,\n json,\n max,\n dateFromString,\n deleteKey,\n min,\n reverse,\n branchName,\n greaterOrEqueal,\n size,\n reduce,\n set,\n some,\n entries,\n flatten,\n drop,\n divide,\n find,\n filter,\n getFromLocalStorage,\n number,\n shuffle,\n add,\n defaultTo,\n roundUp,\n lastIndexOf,\n timestamp,\n getCookie,\n indexOf,\n currentURL,\n replaceAll,\n getElementById,\n userAgent,\n startsWith,\n getHttpOnlyCookie,\n multiply,\n findIndex,\n range,\n trim,\n not,\n formatNumber,\n notEqual,\n keyBy,\n decodeBase64,\n split\n}\n ", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\n/**\n * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String\n */\nconst handler: FormulaHandler<string> = ([input]) => String(input)\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<readonly string[]> = (_, { env }) => {\n if (!env.isServer) {\n // See https://developer.mozilla.org/en-US/docs/Web/API/Navigator/languages\n return window.navigator.languages\n } else {\n return (\n // See https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Accept-Language\n env.request?.headers['accept-language']\n ?.split(',')\n .map((lang) => lang.split(';')[0] ?? '') ?? []\n )\n }\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\nimport { toBoolean } from '@nordcraft/core/dist/utils/util'\n\nconst handler: FormulaHandler<Array<string>> = ([\n inputString,\n regex,\n globalFlag,\n ignoreCaseFlag,\n multiLineFlag,\n]) => {\n if (typeof inputString !== 'string' || typeof regex !== 'string') {\n return []\n }\n const flags = [\n toBoolean(globalFlag) ? 'g' : '',\n toBoolean(ignoreCaseFlag) ? 'i' : '',\n toBoolean(multiLineFlag) ? 'm' : '',\n ].join('')\n\n const re = new RegExp(regex, flags)\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/match\n return inputString.match(re) ?? []\n}\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<string> = ([URIComponent]) => {\n if (typeof URIComponent !== 'string') {\n return null\n }\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent\n return decodeURIComponent(URIComponent)\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<number> = ([a]) => {\n // Check if input is not a number or is null\n if (typeof a !== 'number' || Number.isNaN(a)) {\n return null\n }\n // Number must be greater than or equal to 0\n if (a < 0) {\n return null\n }\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/log\n return Math.log(a)\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\nimport { toBoolean } from '@nordcraft/core/dist/utils/util'\n\nconst handler: FormulaHandler<boolean> = ([input]) => {\n return toBoolean(input)\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<string> = ([input]) => {\n if (typeof input !== 'string') {\n return null\n }\n const firstChar = input.at(0)\n\n if (input.length === 0 || typeof firstChar !== 'string') {\n return input\n }\n return firstChar.toLocaleUpperCase() + input.substring(1).toLocaleLowerCase()\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<number> = ([a, b]) => {\n if (isNaN(Number(a)) || isNaN(Number(b))) {\n return null\n }\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/pow\n return Number(a) ** Number(b)\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<string> = ([URIComponent]) => {\n if (typeof URIComponent !== 'string') {\n return null\n }\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent\n return encodeURIComponent(URIComponent)\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<string> = ([input]) => {\n if (typeof input !== 'string') {\n return null\n }\n // See https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/btoa\n return btoa(input)\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\nconst handler: FormulaHandler<string> = ([data, indent]) => {\n if (typeof indent !== 'number') {\n return null\n }\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify\n return JSON.stringify(data, null, indent)\n}\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<Array<unknown> | string> = ([list, count]) => {\n if (typeof count !== 'number') {\n return null\n }\n if (Array.isArray(list)) {\n return list.slice(list.length - count)\n }\n if (typeof list === 'string') {\n return list.substring(list.length - count)\n }\n return null\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<Date> = ([timestamp]) => {\n if (typeof timestamp === 'number') {\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/Date\n return new Date(timestamp)\n } else {\n return null\n }\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<string> = ([list, separator]) => {\n if (Array.isArray(list)) {\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/join\n return list.join(String(separator))\n }\n return null\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<number> = ([value, min, max]) => {\n if (typeof value !== 'number') {\n return null\n }\n if (typeof min !== 'number') {\n return null\n }\n if (typeof max !== 'number') {\n return null\n }\n return Math.min(Math.max(value, min), max)\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<number> = ([input, decimals]) => {\n if (typeof input !== 'number') {\n return null\n }\n if (typeof decimals !== 'number') {\n return null\n }\n const multiplier = Math.max(1, Math.pow(10, decimals))\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/floor\n return Math.floor(input * multiplier) / multiplier\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<number> = ([a, b]) => {\n const first = Number(a)\n const second = Number(b)\n if (isNaN(first) || isNaN(second)) {\n return null\n }\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Subtraction\n return first - second\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<Array<unknown>> = ([\n array,\n formula,\n ascending,\n]) => {\n if (!Array.isArray(array)) {\n return null\n }\n if (typeof formula !== 'function') {\n return null\n }\n if (typeof ascending !== 'boolean') {\n return null\n }\n const ascendingModifier = ascending ? 1 : -1\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort\n return [...array].sort((a: any, b: any) => {\n const keyA = formula({ item: a })\n const keyB = formula({ item: b })\n if (Array.isArray(keyA) && Array.isArray(keyB)) {\n for (const i in keyA) {\n if (keyA[i] === keyB[i]) {\n continue\n }\n return (keyA[i] > keyB[i] ? 1 : -1) * ascendingModifier\n }\n return 0\n }\n\n if (keyA === keyB) {\n return 0\n }\n return (keyA > keyB ? 1 : -1) * ascendingModifier\n })\n}\n\nexport default handler\n\nexport const getArgumentInputData = (\n [items]: unknown[],\n argIndex: number,\n input: any,\n) => {\n if (argIndex === 1 && Array.isArray(items)) {\n return { ...input, Args: { item: items[0] } }\n }\n\n return input\n}\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\n/**\n * Similar to https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map\n * but also works for objects\n */\nconst handler: FormulaHandler<Array<unknown> | Record<string, unknown>> = ([\n items,\n fx,\n]) => {\n if (typeof fx !== 'function') {\n return null\n }\n if (Array.isArray(items)) {\n return items.map((item, index) => fx({ item, index }))\n }\n if (items && typeof items === 'object') {\n return Object.fromEntries(\n Object.entries(items).map<any>(([key, value]) => {\n const res = fx({ key, value })\n if ('key' in res && 'value' in res) {\n return [res.key, res.value]\n }\n return null\n }),\n )\n }\n return null\n}\n\nexport const getArgumentInputData = (\n [items]: unknown[],\n argIndex: number,\n input: any,\n) => {\n if (argIndex === 0) {\n return input\n }\n if (Array.isArray(items)) {\n return { ...input, Args: { item: items[0], index: 0 } }\n }\n if (items && typeof items === 'object') {\n const [first] = Object.entries(items)\n if (first) {\n return { ...input, Args: { key: first[0], value: first[1] } }\n }\n }\n return input\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\n/**\n * Similar to https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/every\n * but also works with objects\n */\nexport const handler: FormulaHandler<boolean> = ([items, fx]: unknown[]) => {\n if (typeof fx !== 'function') {\n return null\n }\n if (Array.isArray(items)) {\n return items.every((item, index) => fx({ item, index }))\n }\n if (items && typeof items === 'object') {\n return Object.entries(items).every(([key, value]) => fx({ key, value }))\n }\n return null\n}\n\nexport default handler\n\nexport const getArgumentInputData = (\n [items]: unknown[],\n argIndex: number,\n input: any,\n) => {\n if (argIndex === 0) {\n return input\n }\n\n if (Array.isArray(items)) {\n return { ...input, Args: { item: items[0], index: 0 } }\n }\n if (items && typeof items === 'object') {\n const [first] = Object.entries(items)\n if (first) {\n return { ...input, Args: { key: first[0], value: first[1] } }\n }\n }\n return input\n}\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<number> = ([list]) => {\n if (Array.isArray(list)) {\n let sum = 0\n for (const n of list) {\n if (isNaN(n) || typeof n !== 'number') {\n return null\n }\n sum += n\n }\n return sum\n }\n return null\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<number> = () => {\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random\n return Math.random()\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<number> = ([n]) => {\n if (typeof n !== 'number') {\n return null\n }\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sqrt\n return Math.sqrt(n)\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\n/**\n * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat/DateTimeFormat\n */\nconst handler: FormulaHandler<string> = ([date, loc, opt]) => {\n if (!date || !(date instanceof Date)) {\n return null\n }\n const locales =\n typeof loc === 'string' && loc.length > 0\n ? loc\n : Array.isArray(loc) && loc.every((l) => typeof l === 'string')\n ? (loc as string[])\n : undefined\n if (!opt || typeof opt !== 'object') {\n return Intl.DateTimeFormat(locales).format(date)\n }\n const validateString = <T = string>(\n value: unknown,\n allowedValues?: string[],\n ): T | undefined =>\n typeof value === 'string' && (allowedValues?.includes(value) ?? true)\n ? (value as T)\n : undefined\n\n const options: Partial<\n Intl.DateTimeFormatOptions & { locale: string | string[] }\n > = opt\n const dateStyle = validateString<Intl.DateTimeFormatOptions['dateStyle']>(\n options.dateStyle,\n ['full', 'long', 'medium', 'short'],\n )\n const timeStyle = validateString<Intl.DateTimeFormatOptions['timeStyle']>(\n options.timeStyle,\n ['full', 'long', 'medium', 'short'],\n )\n const calendar = validateString(options.calendar)\n const weekday = validateString<Intl.DateTimeFormatOptions['weekday']>(\n options.weekday,\n ['long', 'short', 'narrow'],\n )\n const era = validateString<Intl.DateTimeFormatOptions['era']>(options.era, [\n 'long',\n 'short',\n 'narrow',\n ])\n const year = validateString<Intl.DateTimeFormatOptions['year']>(\n options.year,\n ['numeric', '2-digit'],\n )\n const month = validateString<Intl.DateTimeFormatOptions['month']>(\n options.month,\n ['long', 'short', 'narrow', 'numeric', '2-digit'],\n )\n const day = validateString<Intl.DateTimeFormatOptions['day']>(options.day, [\n 'numeric',\n '2-digit',\n ])\n const hour = validateString<Intl.DateTimeFormatOptions['hour']>(\n options.hour,\n ['numeric', '2-digit'],\n )\n const minute = validateString<Intl.DateTimeFormatOptions['minute']>(\n options.minute,\n ['numeric', '2-digit'],\n )\n const second = validateString<Intl.DateTimeFormatOptions['second']>(\n options.second,\n ['numeric', '2-digit'],\n )\n const timeZoneName = validateString<\n Intl.DateTimeFormatOptions['timeZoneName']\n >(options.timeZoneName, [\n 'long',\n 'short',\n 'shortOffset',\n 'longOffset',\n 'shortGeneric',\n 'longGeneric',\n ])\n const timeZone = validateString<Intl.DateTimeFormatOptions['timeZone']>(\n options.timeZone,\n )\n const hour12 =\n options.hour12 === true\n ? true\n : options.hour12 === false\n ? false\n : undefined\n\n return Intl.DateTimeFormat(locales, {\n dateStyle,\n timeStyle,\n calendar,\n weekday,\n era,\n year,\n month,\n day,\n hour,\n minute,\n second,\n timeZoneName,\n timeZone,\n hour12,\n }).format(date)\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<number> = ([a, b]) => {\n if (isNaN(Number(a)) || isNaN(Number(b))) {\n return null\n }\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Remainder\n return Number(a) % Number(b)\n}\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<Date> = () => {\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date\n return new Date()\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<Array<unknown>> = ([list, value]) => {\n if (!Array.isArray(list)) {\n return null\n }\n return [value, ...list]\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\n/**\n * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/groupBy\n */\nexport const handler: FormulaHandler<Record<string, Array<unknown>>> = ([\n items,\n func,\n]) => {\n if (typeof func !== 'function') {\n return null\n }\n if (!items || typeof items !== 'object' || !Array.isArray(items)) {\n return null\n }\n\n const res: Record<string, any> = {}\n for (const index in items) {\n const item = items[index]\n const key = String(func({ item, index }))\n res[key] = res[key] ?? []\n res[key].push(item)\n }\n return res\n}\n\nexport default handler\n\nexport const getArgumentInputData = (\n [items]: unknown[],\n argIndex: number,\n input: any,\n) => {\n if (argIndex === 1 && Array.isArray(items)) {\n return { ...input, Args: { item: items[0], index: 0 } }\n }\n return input\n}\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<unknown> = ([list]) => {\n if (typeof list === 'string' || Array.isArray(list)) {\n return list[list.length - 1]\n }\n return null\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\nimport { parseJSONWithDate } from '@nordcraft/core/dist/utils/json'\n\nconst handler: FormulaHandler<unknown> = ([data]) => {\n if (typeof data !== 'string') {\n return null\n }\n try {\n // Similar to https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse\n return parseJSONWithDate(data)\n } catch {\n return null\n }\n}\nexport default handler\n", "const iso8601Regex = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:.\\d{1,3})?Z$/\n\n/**\n * This function is much slower than JSON parse without reviver and is a major\n * bottleneck in the runtime performance. Especially during startup.\n */\nexport function parseJSONWithDate(input: string) {\n return JSON.parse(input, (_, value) => {\n if (\n typeof value === 'string' &&\n value.length === 24 &&\n iso8601Regex.test(value)\n ) {\n return new Date(value)\n }\n return value\n })\n}\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<string> = ([input]) => {\n if (typeof input !== 'string') {\n return null\n }\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toLocaleUpperCase\n return input.toLocaleUpperCase()\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<number> = ([input, decimals]) => {\n if (typeof input !== 'number') {\n return null\n }\n if (typeof decimals !== 'number') {\n return null\n }\n const multiplier = Math.max(1, Math.pow(10, decimals))\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/round\n return Math.round(input * multiplier) / multiplier\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<Array<unknown> | string> = ([list, count]) => {\n if (typeof count !== 'number' || isNaN(count)) {\n return null\n }\n if (Array.isArray(list)) {\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/slice\n return list.slice(0, list.length - count)\n }\n if (typeof list === 'string') {\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/substring\n return list.substring(0, list.length - count)\n }\n return null\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\nimport { isDefined } from '@nordcraft/core/dist/utils/util'\n\nconst handler: FormulaHandler<boolean> = ([url, title, text]) => {\n if (!isDefined(navigator.canShare)) {\n return false\n }\n const validInput = (value: any): value is string =>\n isDefined(value) && typeof value === 'string'\n if (!validInput(url) && !validInput(title) && !validInput(text)) {\n return false\n }\n const data: ShareData = {}\n if (validInput(title)) {\n data.title = title\n }\n if (validInput(text)) {\n data.text = text\n }\n if (validInput(url)) {\n data.url = url\n }\n // Later we can add support for data.files as well\n // See https://developer.mozilla.org/en-US/docs/Web/API/Navigator/canShare\n return navigator.canShare(data)\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\n/**\n * Similar to https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/fromEntries\n * but requires the input to be an array of objects with `key` and `value` properties named as `key` and `value` respectively\n */\nconst handler: FormulaHandler<Record<string, unknown>> = ([list]) => {\n if (Array.isArray(list)) {\n const object: Record<string, any> = {}\n for (const { key, value } of list) {\n object[key] = value\n }\n return object\n }\n return null\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<boolean> = ([first, second]: any[]) => {\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Greater_than\n return first > second\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\n/**\n * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/includes\n * and https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/includes\n */\nconst handler: FormulaHandler<boolean> = ([collection, item]) => {\n if (typeof collection === 'string' && typeof item === 'string') {\n return collection.includes(item)\n }\n if (Array.isArray(collection)) {\n return collection.some((collectionItem) =>\n (globalThis as any).toddle.isEqual(collectionItem, item),\n )\n }\n return null\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<number> = ([a]) => {\n if (typeof a !== 'number') {\n return null\n }\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/abs\n return Math.abs(a)\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<boolean> = (_, ctx) => {\n return ctx.env.isServer\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\n/**\n * Create a simplified URL object similar to the native URL\n * while retaining the original URL object's toString method.\n */\nclass NCURL {\n hostname: string\n searchParams: {\n [k: string]: string\n }\n path: string[]\n hash: string\n href: string\n protocol: string\n port: string\n origin: string\n\n constructor(url: URL) {\n this.hostname = url.hostname\n this.searchParams = Object.fromEntries(url.searchParams)\n this.path = url.pathname.split('/').filter((p, i) => i !== 0 || p !== '')\n this.hash = url.hash.replace('#', '')\n this.href = url.href\n this.protocol = url.protocol\n this.port = url.port\n this.origin = url.origin\n }\n\n toString() {\n // This is the same functionality as URL.prototype.toString (https://developer.mozilla.org/en-US/docs/Web/API/URL#instance_methods)\n return this.href\n }\n}\n\n/**\n * Similar to https://developer.mozilla.org/en-US/docs/Web/API/URL/URL\n * but returns searchParams as an object and path as an array without leading empty string\n */\nconst handler: FormulaHandler<{\n hostname: string\n searchParams: {\n [k: string]: string\n }\n path: string[]\n hash: string\n href: string\n protocol: string\n port: string\n origin: string\n}> = ([url, base]) => {\n if (typeof url !== 'string') {\n return null\n }\n try {\n return new NCURL(new URL(url, typeof base === 'string' ? base : undefined))\n } catch {\n // Invalid url\n return null\n }\n}\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<boolean> = ([first, second]: any[]) => {\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Less_than_or_equal\n return first <= second\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\n/**\n * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/typeof\n */\nconst handler: FormulaHandler<string> = ([value]) => {\n switch (typeof value) {\n case 'number':\n if (isNaN(value)) {\n return null\n }\n return 'Number'\n case 'string':\n return 'String'\n case 'boolean':\n return 'Boolean'\n case 'object':\n return Array.isArray(value) ? 'Array' : value === null ? 'Null' : 'Object'\n case 'undefined':\n return 'Null'\n default:\n return null\n }\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nexport const handler: FormulaHandler<unknown> = ([items, fx]) => {\n if (typeof fx !== 'function') {\n return null\n }\n if (Array.isArray(items)) {\n return items.findLast((item, index) => fx({ item, index }))\n }\n if (items && typeof items === 'object') {\n return Object.entries(items).findLast(([key, value]) =>\n fx({ key, value }),\n )?.[1]\n }\n return null\n}\n\nexport default handler\n\nexport const getArgumentInputData = (\n [items]: unknown[],\n argIndex: number,\n input: any,\n) => {\n if (argIndex === 0) {\n return input\n }\n\n if (Array.isArray(items)) {\n return { ...input, Args: { item: items[0], index: 0 } }\n }\n if (items && typeof items === 'object') {\n const [first] = Object.entries(items)\n if (first) {\n return { ...input, Args: { key: first[0], value: first[1] } }\n }\n }\n return input\n}\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<boolean> = ([first, second]: any[]) => {\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Less_than\n return first < second\n}\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<Array<unknown>> = ([list, value]) => {\n if (!Array.isArray(list)) {\n return null\n }\n // Similar to https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/push\n return [...list, value]\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<unknown> = ([key]) => {\n if (typeof key !== 'string' || key.length === 0) {\n return null\n }\n if (typeof window === 'undefined') {\n return null\n }\n // See https://developer.mozilla.org/en-US/docs/Web/API/Window/sessionStorage\n const value = window.sessionStorage.getItem(key)\n if (value === null) {\n return value\n }\n try {\n return JSON.parse(value)\n } catch {\n return value\n }\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<Array<unknown>> = ([list]) => {\n if (!Array.isArray(list)) {\n return null\n }\n const set = new Set()\n return list.filter((item) => {\n const key = typeof item === 'object' ? JSON.stringify(item) : item\n if (set.has(key)) {\n return false\n }\n set.add(key)\n return true\n })\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\nimport { isObject } from '@nordcraft/core/dist/utils/util'\n\nconst handler: FormulaHandler<\n string | Array<unknown> | Record<string, unknown>\n> = (items) => {\n if (items.every(Array.isArray)) {\n const result = []\n for (const item of items) {\n // Similar to https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/concat\n result.push(...item)\n }\n return result\n }\n if (items.every(isObject)) {\n return Object.assign({}, ...items)\n }\n return items.join('')\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<Array<unknown> | string> = ([list, count]) => {\n if (typeof count !== 'number') {\n return null\n }\n if (Array.isArray(list)) {\n return list.slice(0, count)\n }\n if (typeof list === 'string') {\n return list.substring(0, count)\n }\n return null\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<unknown> = ([collection, key]) => {\n if (typeof collection === 'string') {\n return collection[Number(key)]\n }\n const resolve = (collection: any, path: unknown[]): unknown => {\n if (path.length === 0) {\n return collection\n }\n const [head, ...rest] = path\n return resolve(collection?.[String(head)], rest)\n }\n return resolve(collection, Array.isArray(key) ? key : [key])\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<string> = ([input]) => {\n if (typeof input !== 'string') {\n return null\n }\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toLocaleLowerCase\n return input.toLocaleLowerCase()\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\nconst handler: FormulaHandler<boolean> = ([a, b]) => {\n return (globalThis as any).toddle.isEqual(a, b)\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<unknown> = ([list]) => {\n if (typeof list === 'string' || Array.isArray(list)) {\n return list[0]\n }\n return null\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<string> = ([data, indentation]) => {\n const indent = isNaN(Number(indentation)) ? 0 : Number(indentation)\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify\n return JSON.stringify(data, null, indent)\n}\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<number> = (args) => {\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/max\n return Math.max(...args.map(Number))\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<Date> = ([date]) => {\n if (typeof date === 'string') {\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/Date\n return new Date(date)\n } else {\n return null\n }\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\nimport { isObject } from '@nordcraft/core/dist/utils/util'\n\nconst handler: FormulaHandler<Array<unknown> | Record<string, unknown>> = ([\n collection,\n key,\n]) => {\n if (typeof collection !== 'object' || collection === null) {\n return null\n }\n if (\n !Array.isArray(key) &&\n typeof key !== 'string' &&\n typeof key !== 'number'\n ) {\n return null\n }\n\n const run = (\n collection: any,\n [key, ...path]: string[],\n ): Record<string, any> | null => {\n if (Array.isArray(collection)) {\n const index = Number(key)\n if (Number.isNaN(index)) {\n return collection\n }\n if (path.length === 0) {\n return collection.filter((_, i) => i !== Number(key))\n }\n return collection.map((e, i) =>\n i === index ? run(collection[index], path) : e,\n )\n }\n if (isObject(collection)) {\n if (path.length === 0) {\n return Object.fromEntries(\n Object.entries(collection).filter(([k]) => k !== key),\n )\n }\n if (typeof key !== 'string' && typeof key !== 'number') {\n return { ...collection }\n } else {\n return {\n ...collection,\n [key]: run(collection[key], path),\n }\n }\n }\n\n return null\n }\n const path = Array.isArray(key) ? key : [key]\n return run(collection, path)\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<number> = (args) => {\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/min\n return Math.min(...args.map(Number))\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<Array<unknown>> = ([list]) => {\n if (Array.isArray(list)) {\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reverse\n return [...list].reverse()\n }\n return null\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<string> = (_, ctx) => {\n return ctx.env.branchName\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<boolean> = ([first, second]: any[]) => {\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Greater_than_or_equal\n return first >= second\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\nimport { isObject } from '@nordcraft/core/dist/utils/util'\n\nconst handler: FormulaHandler<number> = ([collection]) => {\n if (Array.isArray(collection)) {\n return collection.length\n }\n if (isObject(collection)) {\n return Object.keys(collection).length\n }\n if (typeof collection === 'string') {\n return collection.length\n }\n return null\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\n/**\n * Similar to https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce\n * but also works with objects\n */\nconst handler: FormulaHandler<unknown> = ([items, fx, init]) => {\n if (typeof fx !== 'function') {\n return null\n }\n if (Array.isArray(items)) {\n return items.reduce(\n (result, item, index) => fx({ result, item, index }),\n init,\n )\n }\n if (items && typeof items === 'object') {\n return Object.entries(items).reduce(\n (result, [key, value]) => fx({ result, key, value }),\n init,\n )\n }\n return null\n}\nexport default handler\n\nexport const getArgumentInputData = (\n [items, _, result]: unknown[],\n argIndex: number,\n input: any,\n) => {\n if (argIndex !== 1) {\n return input\n }\n if (Array.isArray(items)) {\n return {\n ...input,\n Args: {\n item: items[0],\n index: 0,\n result,\n },\n }\n }\n if (items && typeof items === 'object') {\n const [first] = Object.entries(items)\n if (first) {\n return {\n ...input,\n Args: {\n key: first[0],\n value: first[1],\n result,\n },\n }\n }\n }\n return input\n}\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\nimport { isObject } from '@nordcraft/core/dist/utils/util'\n\nconst handler: FormulaHandler<Array<unknown> | Record<string, unknown>> = (\n [collection, key, value],\n ctx,\n): any => {\n if (\n typeof key !== 'string' &&\n typeof key !== 'number' &&\n !Array.isArray(key)\n ) {\n return null\n }\n const [head, ...rest] = Array.isArray(key) ? key : [key]\n if (isObject(collection)) {\n const clone: Record<string, any> = Array.isArray(collection)\n ? [...collection]\n : { ...collection }\n clone[head] =\n rest.length === 0 ? value : handler([clone[head], rest, value], ctx)\n return clone\n }\n return null\n}\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\n/**\n * Similar to https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/some\n * but also works with objects\n */\nexport const handler: FormulaHandler<boolean> = ([items, fx]: unknown[]) => {\n if (typeof fx !== 'function') {\n return null\n }\n if (Array.isArray(items)) {\n return items.some((item, index) => fx({ item, index }))\n }\n if (items && typeof items === 'object') {\n return Object.entries(items).some(([key, value]) => fx({ key, value }))\n }\n return null\n}\n\nexport default handler\n\nexport const getArgumentInputData = (\n [items]: unknown[],\n argIndex: number,\n input: any,\n) => {\n if (argIndex === 0) {\n return input\n }\n\n if (Array.isArray(items)) {\n return { ...input, Args: { item: items[0], index: 0 } }\n }\n if (items && typeof items === 'object') {\n const [first] = Object.entries(items)\n if (first) {\n return { ...input, Args: { key: first[0], value: first[1] } }\n }\n }\n return input\n}\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<Array<{ key: string; value: unknown }>> = ([\n object,\n]) => {\n if (typeof object === 'object' && object !== null) {\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/entries\n return Object.entries(object).map(([key, value]) => ({ key, value }))\n }\n return null\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<Array<unknown>> = ([items]) => {\n if (Array.isArray(items)) {\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/flat\n return items.flat()\n }\n return null\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<Array<unknown> | string> = ([list, count]) => {\n if (typeof count !== 'number' || isNaN(count)) {\n return null\n }\n if (Array.isArray(list)) {\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/slice\n return list.slice(count)\n }\n if (typeof list === 'string') {\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/substring\n return list.substring(count)\n }\n return null\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<number> = ([a, b]) => {\n if (isNaN(Number(a)) || isNaN(Number(b))) {\n return null\n }\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Division\n return Number(a) / Number(b)\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\n/**\n * Similar to https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find\n * but this implementation also supports objects\n */\nexport const handler: FormulaHandler<unknown> = ([items, fx]) => {\n if (typeof fx !== 'function') {\n return null\n }\n if (Array.isArray(items)) {\n return items.find((item, index) => fx({ item, index }))\n }\n if (items && typeof items === 'object') {\n return Object.entries(items).find(([key, value]) => fx({ key, value }))?.[1]\n }\n return null\n}\n\nexport default handler\n\nexport const getArgumentInputData = (\n [items]: unknown[],\n argIndex: number,\n input: any,\n) => {\n if (argIndex === 0) {\n return input\n }\n\n if (Array.isArray(items)) {\n return { ...input, Args: { item: items[0], index: 0 } }\n }\n if (items && typeof items === 'object') {\n const [first] = Object.entries(items)\n if (first) {\n return { ...input, Args: { key: first[0], value: first[1] } }\n }\n }\n return input\n}\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\n/**\n * Similar to https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter\n * but this implementation also supports objects\n */\nexport const handler: FormulaHandler<\n Array<unknown> | Record<string, unknown>\n> = ([items, func]) => {\n if (typeof func !== 'function') {\n return null\n }\n if (Array.isArray(items)) {\n return items.filter((item, index) => func({ item, index }))\n }\n if (items && typeof items === 'object') {\n return Object.fromEntries(\n Object.entries(items).filter(([key, value]) => func({ key, value })),\n )\n }\n if (Array.isArray(items)) {\n return items.filter((item, index) => func({ item, index }))\n }\n return null\n}\n\nexport default handler\n\nexport const getArgumentInputData = (\n [items]: unknown[],\n argIndex: number,\n input: any,\n) => {\n if (argIndex === 0) {\n return input\n }\n\n if (Array.isArray(items)) {\n return { ...input, Args: { item: items[0], index: 0 } }\n }\n if (items && typeof items === 'object') {\n const [first] = Object.entries(items)\n if (first) {\n return { ...input, Args: { value: first[1], key: first[0] } }\n }\n }\n return input\n}\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<unknown> = ([key]) => {\n if (typeof key !== 'string' || key.length === 0) {\n return null\n }\n if (typeof window === 'undefined') {\n return null\n }\n // See https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage\n const value = window.localStorage.getItem(key)\n if (value === null) {\n return value\n }\n try {\n return JSON.parse(value)\n } catch {\n return value\n }\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\n/**\n * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number\n */\nconst handler: FormulaHandler<number> = ([a]) => Number(a)\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<Array<unknown> | string> = ([list]) => {\n if (Array.isArray(list)) {\n return shuffle(list)\n }\n if (typeof list === 'string') {\n return shuffle(list.split('')).join('')\n }\n return null\n}\n\nfunction shuffle(input: Array<any>) {\n const array = [...input]\n for (let i = array.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1)) // random index from 0 to i\n\n // swap elements array[i] and array[j]\n // we use \"destructuring assignment\" syntax to achieve that\n // you'll find more details about that syntax in later chapters\n // same can be written as:\n // let t = array[i]; array[i] = array[j]; array[j] = t\n ;[array[i], array[j]] = [array[j], array[i]]\n }\n return array\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<number> = (numbers) => {\n if (\n !Array.isArray(numbers) ||\n numbers.some((n) => n === null || typeof n !== 'number')\n ) {\n return null\n }\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Addition\n return numbers.reduce((result: number, n: any) => {\n return result + Number(n)\n }, 0)\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\nimport { toBoolean } from '@nordcraft/core/dist/utils/util'\n\nconst handler: FormulaHandler<unknown> = (values) => {\n for (const value of values) {\n if (toBoolean(value)) {\n return value\n }\n }\n return null\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<number> = ([input, decimals]) => {\n if (typeof input !== 'number') {\n return null\n }\n if (typeof decimals !== 'number') {\n return null\n }\n\n const multiplier = Math.max(1, Math.pow(10, decimals))\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/ceil\n return Math.ceil(input * multiplier) / multiplier\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<number> = ([collection, item]) => {\n if (typeof collection === 'string') {\n return collection.lastIndexOf(item as any)\n }\n\n if (Array.isArray(collection)) {\n // Short-circuit for primitive types and references\n const fastIndex = collection.lastIndexOf(item)\n if (fastIndex !== -1) {\n return fastIndex\n }\n\n return collection.findLastIndex((i) =>\n (globalThis as any).toddle.isEqual(i, item),\n )\n }\n return null\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<number> = ([date]) => {\n if (!date || !(date instanceof Date)) {\n return null\n }\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getTime\n return date.getTime()\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<string> = ([name], { env, root }) => {\n if (!name || typeof name !== 'string') {\n return null\n }\n if (!env.isServer) {\n if (root instanceof ShadowRoot) {\n return null\n }\n return (\n // See https://developer.mozilla.org/en-US/docs/Web/API/Document/cookie\n root.cookie\n .split('; ')\n ?.find((row) => row.startsWith(`${name}=`))\n ?.split('=')[1] ?? null\n )\n } else {\n return env.request.cookies[name] ?? null\n }\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\n/**\n * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/indexOf\n * and https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf\n */\nconst handler: FormulaHandler<number> = ([collection, item]) => {\n if (typeof collection === 'string') {\n return collection.indexOf(item as any)\n }\n\n if (Array.isArray(collection)) {\n // Short-circuit for primitive types and references\n const fastIndex = collection.indexOf(item)\n if (fastIndex !== -1) {\n return fastIndex\n }\n\n return collection.findIndex((i) =>\n (globalThis as any).toddle.isEqual(i, item),\n )\n }\n return null\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<string> = (_, { env }) => {\n if (env.isServer) {\n return env.request.url\n } else {\n // See https://developer.mozilla.org/en-US/docs/Web/API/Window/location\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n return window?.location.href ?? null\n }\n}\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<string> = ([\n input,\n searchValue,\n replaceValue,\n]) => {\n if (typeof input !== 'string') {\n return null\n }\n if (typeof searchValue !== 'string') {\n return null\n }\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replaceAll\n return input.replaceAll(searchValue, String(replaceValue))\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<HTMLElement> = ([id], { root }) => {\n if (typeof id !== 'string') {\n return null\n }\n // See https://developer.mozilla.org/en-US/docs/Web/API/Document/getElementById\n return root.getElementById(id)\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<string> = (_, { env }) => {\n if (!env.isServer) {\n // See https://developer.mozilla.org/en-US/docs/Web/API/Navigator/userAgent\n return window.navigator.userAgent\n } else {\n // See https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/User-Agent\n return env.request?.headers['user-agent'] ?? null\n }\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<boolean> = ([collection, prefix]) => {\n if (typeof collection !== 'string') {\n return null\n }\n if (typeof prefix !== 'string') {\n return null\n }\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith\n return collection.startsWith(prefix)\n}\n\nexport default handler\n", "import { STRING_TEMPLATE } from '@nordcraft/core/dist/api/template'\nimport type { FormulaHandler } from '@nordcraft/core/dist/types'\n\n/**\n * Nordcraft uses a custom string template to replace HttpOnly cookies server-side.\n * Learn more about cookies here https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies\n */\nconst handler: FormulaHandler<string> = ([name]) => {\n if (!name || typeof name !== 'string') {\n return null\n }\n return STRING_TEMPLATE('cookies', name)\n}\n\nexport default handler\n", "export const STRING_TEMPLATE = (\n type: keyof typeof templateTypes,\n name: string,\n) => {\n return `{{ ${templateTypes[type]}.${name} }}`\n}\n\nconst templateTypes = {\n cookies: 'cookies',\n}\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<number> = (numbers) => {\n if (numbers.some((n) => isNaN(Number(n)))) {\n return null\n }\n return (numbers as number[]).reduce<number>(\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Multiplication\n (product, num) => product * num,\n 1,\n )\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\n/**\n * Similar to https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/findIndex\n * but this implementation also supports objects\n */\nexport const handler: FormulaHandler<number> = ([items, fx]: unknown[]) => {\n if (typeof fx !== 'function') {\n return null\n }\n if (Array.isArray(items)) {\n return items.findIndex((item, index) => fx({ item, index }))\n }\n if (items && typeof items === 'object') {\n return Object.entries(items).findIndex(([key, value]) => fx({ key, value }))\n }\n return null\n}\n\nexport default handler\n\nexport const getArgumentInputData = (\n [items]: unknown[],\n argIndex: number,\n input: any,\n) => {\n if (argIndex === 0) {\n return input\n }\n\n if (Array.isArray(items)) {\n return { ...input, Args: { item: items[0], index: 0 } }\n }\n if (items && typeof items === 'object') {\n const [first] = Object.entries(items)\n if (first) {\n return { ...input, Args: { key: first[0], value: first[1] } }\n }\n }\n return input\n}\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<Array<number>> = ([min, max]) => {\n if (typeof min !== 'number') {\n return null\n }\n if (typeof max !== 'number') {\n return null\n }\n if (min > max) {\n return []\n }\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/from\n return Array.from({ length: max - min + 1 }, (_, i) => i + min)\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<string> = ([str]) => {\n if (typeof str !== 'string') {\n return null\n }\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/trim\n return str.trim()\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\nimport { toBoolean } from '@nordcraft/core/dist/utils/util'\n\nconst handler: FormulaHandler<boolean> = ([a]) => !toBoolean(a)\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\n/**\n * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat\n */\nconst handler: FormulaHandler<string> = ([input, loc, opt]) => {\n if (typeof input !== 'number' || Number.isNaN(input)) {\n return null\n }\n const locales =\n typeof loc === 'string' && loc.length > 0\n ? loc\n : Array.isArray(loc) && loc.every((l) => typeof l === 'string')\n ? (loc as string[])\n : undefined\n if (!opt || typeof opt !== 'object') {\n return Intl.NumberFormat(locales).format(input)\n }\n const validateString = <T = string>(\n value: unknown,\n allowedValues?: string[],\n ): T | undefined =>\n typeof value === 'string' && (allowedValues?.includes(value) ?? true)\n ? (value as T)\n : undefined\n\n const options: Partial<\n Intl.NumberFormatOptions & { locale: string | string[] }\n > = opt\n const style = validateString<Intl.NumberFormatOptions['style']>(\n options.style,\n ['decimal', 'currency', 'percent', 'unit'],\n )\n const currency =\n typeof options.currency === 'string' && options.currency.length === 3\n ? options.currency\n : undefined\n if (style === 'currency' && typeof currency !== 'string') {\n // currency must be provided when style is currency\n return null\n }\n const currencyDisplay = validateString<\n Intl.NumberFormatOptions['currencyDisplay']\n >(options.currencyDisplay, ['code', 'symbol', 'narrowSymbol', 'name'])\n const unit = typeof options.unit === 'string' ? options.unit : undefined\n if (style === 'unit' && typeof unit !== 'string') {\n // unit must be provided when style is unit\n return null\n }\n const unitDisplay = validateString<Intl.NumberFormatOptions['unitDisplay']>(\n options.unitDisplay,\n ['short', 'narrow', 'long'],\n )\n const minimumIntegerDigits =\n typeof options.minimumIntegerDigits === 'number' &&\n options.minimumIntegerDigits >= 1 &&\n options.minimumIntegerDigits <= 21\n ? options.minimumIntegerDigits\n : undefined\n const minimumFractionDigits =\n typeof options.minimumFractionDigits === 'number' &&\n options.minimumFractionDigits >= 0 &&\n options.minimumFractionDigits <= 100\n ? options.minimumFractionDigits\n : undefined\n const maximumFractionDigits =\n typeof options.maximumFractionDigits === 'number' &&\n options.maximumFractionDigits >= 0 &&\n options.maximumFractionDigits <= 100\n ? options.maximumFractionDigits\n : undefined\n const minimumSignificantDigits =\n typeof options.minimumSignificantDigits === 'number' &&\n options.minimumSignificantDigits >= 1 &&\n options.minimumSignificantDigits <= 21\n ? options.minimumSignificantDigits\n : undefined\n const maximumSignificantDigits =\n typeof options.maximumSignificantDigits === 'number' &&\n options.maximumSignificantDigits >= 1 &&\n options.maximumSignificantDigits <= 21\n ? options.maximumSignificantDigits\n : undefined\n const notation = validateString<Intl.NumberFormatOptions['notation']>(\n options.notation,\n ['standard', 'scientific', 'engineering', 'compact'],\n )\n const compactDisplay = validateString<\n Intl.NumberFormatOptions['compactDisplay']\n >(options.compactDisplay, ['short', 'long'])\n\n // useGrouping can be a boolean, 'always', 'auto', or 'min2'\n const validGroupingValues: Array<\n keyof Intl.NumberFormatOptionsUseGroupingRegistry\n > = ['always', 'auto', 'min2']\n const useGrouping: Intl.NumberFormatOptions['useGrouping'] =\n typeof options.useGrouping === 'boolean'\n ? options.useGrouping\n : validateString<keyof Intl.NumberFormatOptionsUseGroupingRegistry>(\n options.useGrouping,\n validGroupingValues,\n )\n\n return new Intl.NumberFormat(locales, {\n style,\n currency,\n currencyDisplay,\n unit,\n unitDisplay,\n minimumIntegerDigits,\n minimumFractionDigits,\n maximumFractionDigits,\n minimumSignificantDigits,\n maximumSignificantDigits,\n notation,\n compactDisplay,\n useGrouping,\n }).format(input)\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\nconst handler: FormulaHandler<boolean> = ([a, b]) => {\n return !(globalThis as any).toddle.isEqual(a, b)\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nexport const handler: FormulaHandler<Record<string, Array<unknown>>> = ([\n items,\n func,\n]) => {\n if (typeof func !== 'function') {\n return null\n }\n if (!items || typeof items !== 'object') {\n return null\n }\n\n const list = Array.isArray(items) ? items : Object.entries(items)\n\n const res: Record<string, any> = {}\n for (let i = 0; i < list.length; i++) {\n const item = list[i]\n const key = String(func({ item, i }))\n res[key] = item\n }\n return res\n}\n\nexport default handler\n\nexport const getArgumentInputData = (\n [items]: unknown[],\n argIndex: number,\n input: any,\n) => {\n if (argIndex === 0) {\n return input\n }\n\n if (Array.isArray(items)) {\n return { ...input, Args: { item: items[0], index: 0 } }\n }\n if (items && typeof items === 'object') {\n const [first] = Object.entries(items)\n if (first) {\n return { ...input, Args: { value: first[1], key: first[0] } }\n }\n }\n return input\n}\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<string> = ([input]) => {\n if (typeof input !== 'string') {\n return null\n }\n // See https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/atob\n return atob(input)\n}\n\nexport default handler\n", "import type { FormulaHandler } from '@nordcraft/core/dist/types'\n\nconst handler: FormulaHandler<Array<unknown>> = ([inputString, delimiter]) => {\n if (typeof inputString !== 'string') {\n return null\n }\n if (typeof delimiter !== 'string') {\n return null\n }\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/split\n return inputString.split(delimiter)\n}\nexport default handler\n", "import * as libActions from '@nordcraft/std-lib/dist/actions'\nimport * as libFormulas from '@nordcraft/std-lib/dist/formulas'\nimport fastDeepEqual from 'fast-deep-equal'\nimport { defineComponents } from './custom-element/defineComponents'\n\nconst loadCorePlugins = (toddle = window.toddle) => {\n toddle.isEqual = fastDeepEqual\n\n // load default formulas and actions\n Object.entries(libFormulas).forEach(([name, module]) =>\n toddle.registerFormula(\n '@toddle/' + name,\n module.default as any,\n 'getArgumentInputData' in module\n ? module.getArgumentInputData\n : undefined,\n ),\n )\n Object.entries(libActions).forEach(([name, module]) =>\n toddle.registerAction('@toddle/' + name, module.default),\n )\n}\n\nexport { defineComponents, loadCorePlugins }\n", "/**\n * Convert a component name to a valid HTML tag name according to the custom-element specs\n *\n * https://html.spec.whatwg.org/multipage/custom-elements.html#custom-element\n */\nexport const safeCustomElementName = (name: string) => {\n // Remove any white spaces from the name\n const tag = name.toLocaleLowerCase().replaceAll(' ', '')\n\n // Add \"toddle-\" prefix if needed\n if (!tag.includes('-')) {\n return `toddle-${tag}`\n }\n\n return tag\n}\n", "/* eslint-disable no-console */\nimport type { Component, ComponentData } from '../component/component.types'\nimport type {\n CustomFormulaHandler,\n FormulaHandler,\n FormulaLookup,\n NordcraftMetadata,\n Nullable,\n Runtime,\n Toddle,\n} from '../types'\nimport { isDefined, toBoolean } from '../utils/util'\nimport { type PluginFormula, type ToddleFormula } from './formulaTypes'\n\n// Define the some objects types as union of ServerSide and ClientSide runtime types as applyFormula is used in both\ndeclare const document: Document | undefined\ntype ShadowRoot = DocumentFragment\n\ninterface BaseOperation extends NordcraftMetadata {\n label?: Nullable<string>\n}\n\nexport interface PathOperation extends BaseOperation {\n type: 'path'\n path: string[]\n}\n\nexport interface FunctionArgument {\n name?: Nullable<string>\n isFunction?: Nullable<boolean>\n formula: Formula\n type?: Nullable<any>\n testValue?: Nullable<any>\n}\n\nexport interface FunctionOperation extends BaseOperation {\n type: 'function'\n name: string\n display_name?: Nullable<string>\n package?: Nullable<string>\n arguments: FunctionArgument[]\n variableArguments?: Nullable<boolean>\n}\n\nexport interface RecordOperation extends BaseOperation {\n type: 'record'\n entries: FunctionArgument[]\n}\n\nexport interface ObjectOperation extends BaseOperation {\n type: 'object'\n arguments?: Nullable<FunctionArgument[]>\n}\n\nexport interface ArrayOperation extends BaseOperation {\n type: 'array'\n arguments: Array<{ formula: Formula }>\n}\n\nexport interface OrOperation extends BaseOperation {\n type: 'or'\n arguments: Array<{ formula: Formula }>\n}\n\nexport interface AndOperation extends BaseOperation {\n type: 'and'\n arguments: Array<{ formula: Formula }>\n}\n\nexport interface ApplyOperation extends BaseOperation {\n type: 'apply'\n name: string\n arguments: FunctionArgument[]\n}\n\nexport interface ValueOperation extends BaseOperation {\n type: 'value'\n value: ValueOperationValue\n}\n\nexport type ValueOperationValue = string | number | boolean | null | object\n\nexport interface SwitchOperation extends BaseOperation {\n type: 'switch'\n cases: Array<{\n condition: Formula\n formula: Formula\n }>\n default: Formula\n}\n\nexport type Formula =\n | FunctionOperation\n | RecordOperation\n | ObjectOperation\n | ArrayOperation\n | PathOperation\n | SwitchOperation\n | OrOperation\n | AndOperation\n | ValueOperation\n | ApplyOperation\n\nexport type FormulaContext = {\n component: Component | undefined\n formulaCache?: Nullable<\n Record<\n string,\n {\n get: (data: ComponentData) => any\n set: (data: ComponentData, result: any) => void\n }\n >\n >\n data: ComponentData\n root?: Nullable<Document | ShadowRoot>\n package: Nullable<string>\n toddle: {\n getFormula: FormulaLookup\n getCustomFormula: CustomFormulaHandler\n errors: Error[]\n }\n env: ToddleEnv | undefined\n}\n\nexport type ToddleServerEnv = {\n branchName: string\n // isServer will be true for SSR + proxied requests\n isServer: true\n request: {\n headers: Record<string, string>\n cookies: Record<string, string>\n url: string\n }\n runtime: never\n logErrors: boolean\n}\n\nexport type ToddleEnv =\n | ToddleServerEnv\n | {\n branchName: string\n // isServer will be false for client-side\n isServer: false\n request: undefined\n runtime: Runtime\n logErrors: boolean\n }\n\nexport function isFormula(f: any): f is Formula {\n return (\n f &&\n typeof f === 'object' &&\n typeof f.type === 'string' &&\n (\n [\n 'path',\n 'function',\n 'record',\n 'object',\n 'array',\n 'or',\n 'and',\n 'apply',\n 'value',\n 'switch',\n ] as Formula['type'][]\n ).includes(f.type)\n )\n}\nexport function isFormulaApplyOperation(\n formula: Formula,\n): formula is ApplyOperation {\n return formula.type === 'apply'\n}\n\nexport const isToddleFormula = <Handler>(\n formula: PluginFormula<Handler>,\n): formula is ToddleFormula =>\n Object.hasOwn(formula, 'formula') &&\n isDefined((formula as ToddleFormula).formula)\n\nexport function applyFormula(\n formula: Formula | string | number | undefined | null | boolean,\n ctx: FormulaContext,\n): any {\n if (!isFormula(formula)) {\n return formula\n }\n try {\n switch (formula.type) {\n case 'value':\n return formula.value\n case 'path': {\n let input: any = ctx.data\n for (const key of formula.path) {\n if (input && typeof input === 'object') {\n input = input[key]\n } else {\n return null\n }\n }\n\n return input\n }\n case 'switch': {\n for (const branch of formula.cases) {\n if (toBoolean(applyFormula(branch.condition, ctx))) {\n return applyFormula(branch.formula, ctx)\n }\n }\n return applyFormula(formula.default, ctx)\n }\n case 'or': {\n for (const entry of formula.arguments) {\n if (toBoolean(applyFormula(entry.formula, ctx))) {\n return true\n }\n }\n return false\n }\n case 'and': {\n for (const entry of formula.arguments) {\n if (!toBoolean(applyFormula(entry.formula, ctx))) {\n return false\n }\n }\n return true\n }\n case 'function': {\n const packageName = formula.package ?? ctx.package ?? undefined\n const newFunc = (\n ctx.toddle ??\n ((globalThis as any).toddle as Toddle<unknown, unknown> | undefined)\n )?.getCustomFormula(formula.name, packageName)\n if (isDefined(newFunc)) {\n ctx.package = packageName\n const args = formula.arguments.reduce<Record<string, unknown>>(\n (args, arg, i) => ({\n ...args,\n [arg.name ?? `${i}`]: arg.isFunction\n ? (Args: any) =>\n applyFormula(arg.formula, {\n ...ctx,\n data: {\n ...ctx.data,\n Args: ctx.data.Args\n ? { ...Args, '@toddle.parent': ctx.data.Args }\n : Args,\n },\n })\n : applyFormula(arg.formula, ctx),\n }),\n {},\n )\n try {\n if (isToddleFormula(newFunc)) {\n return applyFormula(newFunc.formula, {\n ...ctx,\n data: { ...ctx.data, Args: args },\n })\n } else {\n return newFunc.handler(args, {\n root: ctx.root ?? document,\n env: ctx.env,\n } as any)\n }\n } catch (e) {\n ctx.toddle.errors.push(e as Error)\n if (ctx.env?.logErrors) {\n console.error(e)\n }\n return null\n }\n } else {\n // Lookup legacy formula\n const legacyFunc: FormulaHandler | undefined = (\n ctx.toddle ??\n ((globalThis as any).toddle as Toddle<unknown, unknown>)\n ).getFormula(formula.name)\n if (typeof legacyFunc === 'function') {\n const args = (formula.arguments ?? []).map((arg) =>\n arg.isFunction\n ? (Args: any) =>\n applyFormula(arg.formula, {\n ...ctx,\n data: {\n ...ctx.data,\n Args: ctx.data.Args\n ? { ...Args, '@toddle.parent': ctx.data.Args }\n : Args,\n },\n })\n : applyFormula(arg.formula, ctx),\n )\n try {\n return legacyFunc(args, ctx as any)\n } catch (e) {\n ctx.toddle.errors.push(e as Error)\n if (ctx.env?.logErrors) {\n console.error(e)\n }\n return null\n }\n }\n }\n if (ctx.env?.logErrors) {\n console.error(\n `Could not find formula ${formula.name} in package ${\n packageName ?? ''\n }`,\n formula,\n )\n }\n return null\n }\n case 'object':\n return Object.fromEntries(\n formula.arguments?.map((entry) => [\n entry.name,\n applyFormula(entry.formula, ctx),\n ]) ?? [],\n )\n case 'record': // object used to be called record, there are still examples in the wild.\n return Object.fromEntries(\n formula.entries.map((entry) => [\n entry.name,\n applyFormula(entry.formula, ctx),\n ]),\n )\n case 'array':\n return formula.arguments.map((entry) =>\n applyFormula(entry.formula, ctx),\n )\n case 'apply': {\n const componentFormula = ctx.component?.formulas?.[formula.name]\n if (!componentFormula) {\n if (ctx.env?.logErrors) {\n console.log(\n 'Component does not have a formula with the name ',\n formula.name,\n )\n }\n return null\n }\n const Input = Object.fromEntries(\n formula.arguments.map((arg) =>\n arg.isFunction\n ? [\n arg.name,\n (Args: any) =>\n applyFormula(arg.formula, {\n ...ctx,\n data: {\n ...ctx.data,\n Args: ctx.data.Args\n ? { ...Args, '@toddle.parent': ctx.data.Args }\n : Args,\n },\n }),\n ]\n : [arg.name, applyFormula(arg.formula, ctx)],\n ),\n )\n const data = {\n ...ctx.data,\n Args: ctx.data.Args\n ? { ...Input, '@toddle.parent': ctx.data.Args }\n : Input,\n }\n const cache = ctx.formulaCache?.[formula.name]?.get(data)\n\n if (cache?.hit) {\n return cache.data\n } else {\n const result = applyFormula(componentFormula.formula, {\n ...ctx,\n data,\n })\n ctx.formulaCache?.[formula.name]?.set(data, result)\n return result\n }\n }\n\n default:\n if (ctx.env?.logErrors) {\n console.error('Could not recognize formula', formula)\n }\n }\n } catch (e) {\n if (ctx.env?.logErrors) {\n console.error(e)\n }\n return null\n }\n}\n", "import type { Nullable } from '../types'\nimport { isDefined } from './util'\n\nexport const isObject = (input: any): input is Record<string, any> =>\n typeof input === 'object' && input !== null\n\nexport const mapObject = <T, T2>(\n object: Record<string, T>,\n f: (kv: [string, T]) => [string, T2],\n): Record<string, T2> => Object.fromEntries(Object.entries(object).map(f))\n\nexport const mapValues = <T, T2>(\n object: Record<string, T>,\n f: (value: T) => T2,\n): Record<string, T2> => mapObject(object, ([key, value]) => [key, f(value)])\n\n/**\n * Deletes potentially nested keys from an object\n * @param collection Array or Object\n * @param path Path to the key to delete. For instance ['foo', 0, 'bar']\n * @returns The updated object/array\n */\nexport const omit = <T = object>(\n collection: T,\n [key, ...rest]: Array<string | number>,\n): T => {\n if (rest.length > 0) {\n const clone: any = Array.isArray(collection)\n ? [...collection]\n : { ...collection }\n if (isDefined(key)) {\n clone[key] = omit(clone[key], rest)\n }\n return clone\n }\n\n if (Array.isArray(collection)) {\n return collection.toSpliced(Number(key), 1) as T\n }\n\n const clone: any = { ...collection }\n if (isDefined(key)) {\n delete clone[key]\n }\n return clone\n}\n\nexport const omitKeys = <T extends Record<string, any>>(\n object: T,\n keys: Array<keyof T>,\n): T =>\n Object.fromEntries(\n Object.entries(object).filter(([k]) => !keys.includes(k)),\n ) as T\n\nexport const omitPaths = (object: Record<string, any>, keys: string[][]) =>\n keys.reduce((acc, key) => omit(acc, key), { ...object })\n\nexport const groupBy = <T>(items: T[], f: (t: T) => string) =>\n items.reduce<Record<string, T[]>>((acc, item) => {\n const key = f(item)\n acc[key] = acc[key] ?? []\n acc[key].push(item)\n return acc\n }, {})\n\nexport const filterObject = <T>(\n object: Record<string, T>,\n f: (kv: [string, T]) => boolean,\n): Record<string, T> => Object.fromEntries(Object.entries(object).filter(f))\n\nexport function get<T = any>(collection: T, [head, ...rest]: string[]): any {\n const headItem = isDefined(head) ? (collection as any)?.[head] : undefined\n if (rest.length === 0) {\n return headItem\n }\n return get(headItem, rest)\n}\n\nexport const set = <T = unknown>(\n collection: T,\n key: Array<string | number>,\n value: any,\n): T => {\n const [head, ...rest] = key\n\n const clone: any = Array.isArray(collection)\n ? [...collection]\n : isObject(collection)\n ? { ...collection }\n : {}\n\n // Cast to any, since it's actually possible to set a property with an undefined key on an object in Javascript\n // and we don't want to introduce a breaking change\n clone[head as any] =\n rest.length === 0 ? value : set(clone[head as any], rest, value)\n return clone as T\n}\n\nexport const sortObjectEntries = <T>(\n object: Record<string, T>,\n f: (kv: [string, T]) => string | number | boolean,\n ascending = true,\n): [string, T][] => easySort(Object.entries(object), f, ascending)\n\nexport const easySort = <T>(\n collection: T[],\n f: (item: T) => string | number | boolean,\n ascending = true,\n) =>\n [...collection].sort((a, b) => {\n const keyA = f(a)\n const keyB = f(b)\n if (keyA === keyB) {\n return 0\n }\n return (keyA > keyB ? 1 : -1) * (ascending ? 1 : -1)\n })\n\nexport const deepSortObject = (\n obj: any,\n): Nullable<Record<string, any> | Array<any>> => {\n if (!isDefined(obj)) {\n return obj\n }\n if (Array.isArray(obj)) {\n return obj.map((val) => deepSortObject(val))\n } else if (typeof obj === 'object' && Object.keys(obj).length > 0) {\n return [...Object.keys(obj)].sort().reduce<any>((acc, key) => {\n acc[key] = deepSortObject(obj[key])\n return acc\n }, {})\n }\n return obj\n}\n", "// Based on https://stackoverflow.com/questions/7616461/generate-a-hash-from-string-in-javascript/52171480#52171480\n// This is a simple hash function for strings. It's not secure, but it's fast.\n// It's not suitable for cryptographic purposes, but it's great for hash tables.\nexport const hash = (data: string, seed = 0) => {\n let h1 = 0xdeadbeef ^ seed,\n h2 = 0x41c6ce57 ^ seed\n for (let i = 0, ch; i < data.length; i++) {\n ch = data.charCodeAt(i)\n h1 = Math.imul(h1 ^ ch, 2654435761)\n h2 = Math.imul(h2 ^ ch, 1597334677)\n }\n h1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507)\n h1 ^= Math.imul(h2 ^ (h2 >>> 13), 3266489909)\n h2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507)\n h2 ^= Math.imul(h1 ^ (h1 >>> 13), 3266489909)\n\n return 4294967296 * (2097151 & h2) + (h1 >>> 0)\n}\n", "import type { EventModel } from '../component/component.types'\nimport type { Formula } from '../formula/formula'\nimport type { NordcraftMetadata, Nullable } from '../types'\n\nexport type ComponentAPI = LegacyComponentAPI | ApiRequest\n\nexport interface LegacyComponentAPI {\n name: string\n type: 'REST'\n autoFetch?: Nullable<Formula>\n url?: Nullable<Formula>\n path?: Nullable<{ formula: Formula }[]>\n proxy?: Nullable<boolean>\n queryParams?: Nullable<Record<string, { name: string; formula: Formula }>>\n headers?: Nullable<Record<string, Formula> | Formula>\n method?: Nullable<'GET' | 'POST' | 'DELETE' | 'PUT'>\n body?: Nullable<Formula>\n auth?: Nullable<{\n type: 'Bearer id_token' | 'Bearer access_token'\n }>\n throttle?: Nullable<number>\n debounce?: Nullable<number>\n onCompleted?: Nullable<EventModel>\n onFailed?: Nullable<EventModel>\n version?: never\n}\n\nexport interface LegacyApiStatus {\n data: unknown\n isLoading: boolean\n error: unknown\n response?: never\n}\n\nexport enum ApiMethod {\n GET = 'GET',\n POST = 'POST',\n DELETE = 'DELETE',\n PUT = 'PUT',\n PATCH = 'PATCH',\n HEAD = 'HEAD',\n OPTIONS = 'OPTIONS',\n}\n\nexport type RedirectStatusCode = 300 | 301 | 302 | 303 | 304 | 307 | 308\n\nexport type ApiParserMode =\n | 'auto'\n | 'text'\n | 'json'\n | 'event-stream'\n | 'json-stream'\n | 'blob'\n\nexport interface ApiBase extends NordcraftMetadata {\n url?: Nullable<Formula>\n path?: Nullable<Record<string, { formula: Formula; index: number }>>\n queryParams?: Nullable<\n Record<\n string,\n // The enabled formula is used to determine if the query parameter should be included in the request or not\n { formula: Formula; enabled?: Nullable<Formula> }\n >\n >\n // hash is relevant for redirects and rewrites, but not for API calls\n hash?: Nullable<{ formula: Formula }>\n}\n\nexport interface ApiRequest extends ApiBase {\n version: 2\n name: string\n type: 'http' | 'ws' // The structure for web sockets might look different\n autoFetch?: Nullable<Formula>\n headers?: Nullable<\n Record<string, { formula: Formula; enabled?: Nullable<Formula> }>\n >\n method?: Nullable<ApiMethod>\n body?: Nullable<Formula>\n // inputs for an API request\n inputs: Record<string, { formula: Nullable<Formula> }>\n service?: Nullable<string>\n servicePath?: Nullable<string>\n server?: Nullable<{\n // We should only accept server side proxy requests if proxy is defined\n proxy?: Nullable<{\n enabled: { formula: Formula }\n // Allow replacing template values in the body of a proxied request\n // This is useful for cases where the body should include an http only cookie for instance\n useTemplatesInBody?: Nullable<{ formula: Formula }>\n }>\n ssr?: Nullable<{\n // We should only fetch a request server side during SSR if this is true\n // it should probably be true by default for autofetch APIs\n // During SSR we will only fetch autoFetch requests\n enabled?: Nullable<{ formula: Formula }>\n }>\n }>\n client?: Nullable<{\n debounce?: Nullable<{ formula: Formula }>\n onCompleted?: Nullable<EventModel>\n onFailed?: Nullable<EventModel>\n onMessage?: Nullable<EventModel>\n // parserMode is used to determine how the response should be handled\n // auto: The response will be handled based on the content type of the response\n // stream: The response will be handled as a stream\n parserMode: ApiParserMode\n // Whether to include credentials (cookies) in the request or not. Default is 'same-origin'\n credentials?: Nullable<'include' | 'same-origin' | 'omit'>\n }>\n // Shared logic for client/server \uD83D\uDC47\n // The user could distinguish using an environment\n // variable e.g. IS_SERVER when they declare the formula\n\n // Rules for redirecting the user to a different page\n // These rules will run both on server+client - mostly used for 401 response -> 302 redirect\n // We allow multiple rules since it makes it easier to setup multiple conditions/redirect locations\n redirectRules?: Nullable<\n Record<\n string,\n {\n // The formula will receive the response from the server including a status code\n // A redirect response will be returned if the formula returns a valid url\n formula: Formula\n // The status code used in the redirect response. Only relevant server side\n statusCode?: Nullable<RedirectStatusCode>\n index: number\n }\n >\n >\n // Formula for determining whether the response is an error or not. Receives the API response + status code/headers as input\n // The response is considered an error if the formula returns true\n // Default behavior is to check if the status code is 400 or higher\n isError?: Nullable<{ formula: Formula }>\n // Formula for determining when the request should time out\n timeout?: Nullable<{ formula: Formula }>\n}\n\nexport interface ApiStatus {\n data: unknown\n isLoading: boolean\n error: unknown\n response?: Nullable<{\n status?: Nullable<number>\n headers?: Nullable<Record<string, string>>\n performance?: Nullable<ApiPerformance>\n debug?: Nullable<unknown>\n }>\n}\n\nexport interface ApiPerformance {\n requestStart?: Nullable<number>\n responseStart?: Nullable<number>\n responseEnd?: Nullable<number>\n}\n\nexport interface ToddleRequestInit extends RequestInit {\n headers: Headers\n}\n", "import type { Nullable } from '../types'\n\n/**\n * Checks if a header is a json (content-type) header\n * Also supports edge cases like application/vnd.api+json and application/vnd.contentful.delivery.v1+json\n * See https://jsonapi.org/#mime-types\n */\nexport const isJsonHeader = (header?: Nullable<string>) => {\n if (typeof header !== 'string') {\n return false\n }\n return /^application\\/(json|.*\\+json)/.test(header)\n}\n\nexport const isTextHeader = (header?: Nullable<string>) => {\n if (typeof header !== 'string') {\n return false\n }\n return /^(text\\/|application\\/x-www-form-urlencoded|application\\/(xml|.*\\+xml))/.test(\n header,\n )\n}\n\nexport const isEventStreamHeader = (header?: Nullable<string>) => {\n if (typeof header !== 'string') {\n return false\n }\n return /^text\\/event-stream/.test(header)\n}\n\nexport const isJsonStreamHeader = (header?: Nullable<string>) => {\n if (typeof header !== 'string') {\n return false\n }\n return /^(application\\/stream\\+json|application\\/x-ndjson)/.test(header)\n}\n\nexport const isImageHeader = (header?: Nullable<string>) => {\n if (typeof header !== 'string') {\n return false\n }\n return /^image\\//.test(header)\n}\n\n/**\n * Returns an object with headers from a Headers object\n * Duplicate header values (set-cookie for instance) are encoded as a comma-separated string\n */\nexport const mapHeadersToObject = (headers: Headers) => {\n const headersObject: Record<string, string> = {}\n for (const [key, value] of headers.entries()) {\n if (headersObject[key]) {\n headersObject[key] += `, ${value}`\n } else {\n headersObject[key] = value\n }\n }\n return headersObject\n}\n", "import type { ActionModel } from '../component/component.types'\nimport type { Nullable } from '../types'\nimport { isDefined } from '../utils/util'\nimport type {\n Formula,\n FunctionOperation,\n PathOperation,\n ValueOperation,\n} from './formula'\nimport { isFormula, isToddleFormula } from './formula'\nimport type { GlobalFormulas } from './formulaTypes'\n\nexport const valueFormula = (\n value: string | number | boolean | null | object,\n): ValueOperation => ({\n type: 'value',\n value,\n})\n\nexport const pathFormula = (path: string[]): PathOperation => ({\n type: 'path',\n path,\n})\n\nexport const functionFormula = (\n name: string,\n formula?: Omit<Partial<FunctionOperation>, 'type' | 'name'>,\n): FunctionOperation => ({\n type: 'function',\n name,\n package: formula?.package,\n arguments: formula?.arguments ?? [],\n variableArguments: formula?.variableArguments,\n})\n\nexport function* getFormulasInFormula<Handler>({\n formula,\n globalFormulas,\n path: _path,\n visitedFormulas: _visitedFormulas,\n packageName: _packageName,\n}: {\n formula: Nullable<Formula>\n globalFormulas: GlobalFormulas<Handler>\n path?: Nullable<(string | number)[]>\n visitedFormulas?: Nullable<Set<string>>\n packageName?: Nullable<string>\n}): Generator<{\n path: (string | number)[]\n formula: Formula\n packageName?: string\n}> {\n if (!isDefined(formula)) {\n return\n }\n const path = _path ?? []\n let packageName = _packageName ?? undefined\n const visitedFormulas = _visitedFormulas ?? new Set<string>()\n\n yield {\n path,\n formula,\n packageName,\n }\n switch (formula.type) {\n case 'path':\n case 'value':\n break\n case 'record':\n for (const [key, entry] of formula.entries.entries()) {\n yield* getFormulasInFormula({\n formula: entry.formula,\n globalFormulas,\n path: [...path, 'entries', key, 'formula'],\n visitedFormulas,\n packageName,\n })\n }\n break\n case 'function': {\n packageName = formula.package ?? packageName\n const formulaKey = [packageName, formula.name].filter(isDefined).join('/')\n const shouldVisitFormula = !visitedFormulas.has(formulaKey)\n visitedFormulas.add(formulaKey)\n const globalFormula = packageName\n ? globalFormulas.packages?.[packageName]?.formulas?.[formula.name]\n : globalFormulas.formulas?.[formula.name]\n for (const [key, arg] of (\n (formula.arguments as typeof formula.arguments | undefined) ?? []\n ).entries()) {\n yield* getFormulasInFormula({\n formula: arg.formula,\n globalFormulas,\n path: [...path, 'arguments', key, 'formula'],\n visitedFormulas,\n packageName,\n })\n }\n // Lookup the actual function and traverse its potential formula references\n // if this formula wasn't already visited\n if (\n globalFormula &&\n isToddleFormula(globalFormula) &&\n shouldVisitFormula\n ) {\n yield* getFormulasInFormula({\n formula: globalFormula.formula,\n globalFormulas,\n path: [...path, 'formula'],\n visitedFormulas,\n packageName,\n })\n }\n break\n }\n case 'array':\n case 'or':\n case 'and':\n case 'object':\n for (const [key, arg] of (\n (formula.arguments as typeof formula.arguments | undefined) ?? []\n ).entries()) {\n yield* getFormulasInFormula({\n formula: arg.formula,\n globalFormulas,\n path: [...path, 'arguments', key, 'formula'],\n visitedFormulas,\n packageName,\n })\n }\n break\n case 'apply':\n for (const [key, arg] of (\n (formula.arguments as typeof formula.arguments | undefined) ?? []\n ).entries()) {\n yield* getFormulasInFormula({\n formula: arg.formula,\n globalFormulas,\n path: [...path, 'arguments', key, 'formula'],\n visitedFormulas,\n packageName,\n })\n }\n break\n case 'switch':\n for (const [key, c] of formula.cases.entries()) {\n yield* getFormulasInFormula({\n formula: c.condition,\n globalFormulas,\n path: [...path, 'cases', key, 'condition'],\n visitedFormulas,\n packageName,\n })\n yield* getFormulasInFormula({\n formula: c.formula,\n globalFormulas,\n path: [...path, 'cases', key, 'formula'],\n visitedFormulas,\n packageName,\n })\n }\n yield* getFormulasInFormula({\n formula: formula.default,\n globalFormulas,\n path: [...path, 'default'],\n visitedFormulas,\n packageName,\n })\n break\n }\n}\nexport function* getFormulasInAction<Handler>({\n action,\n globalFormulas,\n path: _path,\n visitedFormulas = new Set<string>(),\n packageName: _packageName,\n}: {\n action: Nullable<ActionModel>\n globalFormulas: GlobalFormulas<Handler>\n path?: Nullable<(string | number)[]>\n visitedFormulas?: Nullable<Set<string>>\n packageName?: Nullable<string>\n}): Generator<{\n path: (string | number)[]\n formula: Formula\n packageName?: string\n}> {\n if (!isDefined(action)) {\n return\n }\n const path = _path ?? []\n let packageName = _packageName ?? undefined\n\n switch (action.type) {\n case 'Fetch':\n for (const [inputKey, input] of Object.entries(action.inputs ?? {})) {\n yield* getFormulasInFormula({\n formula: input.formula,\n globalFormulas,\n path: [...path, 'input', inputKey, 'formula'],\n visitedFormulas,\n packageName,\n })\n }\n for (const [key, a] of Object.entries(action.onSuccess?.actions ?? {})) {\n yield* getFormulasInAction({\n action: a,\n globalFormulas,\n path: [...path, 'onSuccess', 'actions', key],\n visitedFormulas,\n packageName,\n })\n }\n for (const [key, a] of Object.entries(action.onError?.actions ?? {})) {\n yield* getFormulasInAction({\n action: a,\n globalFormulas,\n path: [...path, 'onError', 'actions', key],\n visitedFormulas,\n packageName,\n })\n }\n for (const [key, a] of Object.entries(action.onMessage?.actions ?? {})) {\n yield* getFormulasInAction({\n action: a,\n globalFormulas,\n path: [...path, 'onMessage', 'actions', key],\n visitedFormulas,\n packageName,\n })\n }\n break\n case 'Custom':\n case undefined:\n case null:\n packageName = action.package ?? packageName\n if (isFormula(action.data)) {\n yield* getFormulasInFormula({\n formula: action.data,\n globalFormulas,\n path: [...path, 'data'],\n visitedFormulas,\n packageName,\n })\n }\n for (const [key, a] of Object.entries(action.arguments ?? {})) {\n if (a) {\n yield* getFormulasInFormula({\n formula: a.formula,\n globalFormulas,\n path: [...path, 'arguments', key, 'formula'],\n visitedFormulas,\n packageName,\n })\n }\n }\n\n for (const [eventKey, event] of Object.entries(action.events ?? {})) {\n for (const [key, a] of Object.entries(event.actions ?? {})) {\n yield* getFormulasInAction({\n action: a,\n globalFormulas,\n path: [...path, 'events', eventKey, 'actions', key],\n visitedFormulas,\n packageName,\n })\n }\n }\n break\n case 'SetVariable':\n case 'TriggerEvent':\n case 'TriggerWorkflowCallback':\n yield* getFormulasInFormula({\n formula: action.data,\n globalFormulas,\n path: [...path, 'data'],\n visitedFormulas,\n packageName,\n })\n break\n case 'SetURLParameter':\n yield* getFormulasInFormula({\n formula: action.data,\n globalFormulas,\n path: [...path, 'data'],\n visitedFormulas,\n })\n break\n case 'SetURLParameters':\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n for (const [key, formula] of Object.entries(action.parameters ?? {})) {\n yield* getFormulasInFormula({\n formula,\n globalFormulas,\n path: [...path, 'parameters', key],\n visitedFormulas,\n })\n }\n break\n case 'TriggerWorkflow':\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n for (const [key, a] of Object.entries(action.parameters ?? {})) {\n if (isDefined(a.formula)) {\n yield* getFormulasInFormula({\n formula: a.formula,\n globalFormulas,\n path: [...path, 'parameters', key, 'formula'],\n visitedFormulas,\n packageName,\n })\n }\n }\n break\n case 'Switch':\n if (isDefined(action.data) && isFormula(action.data)) {\n yield* getFormulasInFormula({\n formula: action.data,\n globalFormulas,\n path: [...path, 'data'],\n visitedFormulas,\n packageName,\n })\n }\n for (const [key, c] of action.cases.entries()) {\n yield* getFormulasInFormula({\n formula: c.condition,\n globalFormulas,\n path: [...path, 'cases', key, 'condition'],\n visitedFormulas,\n packageName,\n })\n for (const [actionKey, a] of Object.entries(c.actions)) {\n yield* getFormulasInAction({\n action: a,\n globalFormulas,\n path: [...path, 'cases', key, 'actions', actionKey],\n visitedFormulas,\n packageName,\n })\n }\n }\n for (const [actionKey, a] of Object.entries(action.default.actions)) {\n yield* getFormulasInAction({\n action: a,\n globalFormulas,\n path: [...path, 'default', 'actions', actionKey],\n visitedFormulas,\n packageName,\n })\n }\n break\n }\n}\n", "import { isFormula, type Formula } from '../formula/formula'\nimport type { GlobalFormulas } from '../formula/formulaTypes'\nimport {\n getFormulasInAction,\n getFormulasInFormula,\n} from '../formula/formulaUtils'\nimport type { Nullable } from '../types'\nimport { isDefined } from '../utils/util'\nimport { type LegacyComponentAPI } from './apiTypes'\n\nexport class LegacyToddleApi<Handler> {\n private api: LegacyComponentAPI\n private key: string\n private globalFormulas: GlobalFormulas<Handler>\n private _apiReferences?: Set<string>\n\n constructor(\n api: LegacyComponentAPI,\n key: string,\n globalFormulas: GlobalFormulas<Handler>,\n ) {\n this.api = api\n this.key = key\n this.globalFormulas = globalFormulas\n }\n\n get apiReferences(): Set<string> {\n if (this._apiReferences) {\n // Only compute apiReferences once\n return this._apiReferences\n }\n const apis = new Set<string>()\n const visitFormulaReference = (formula?: Nullable<Formula>) => {\n if (!isDefined(formula)) {\n return\n }\n switch (formula.type) {\n case 'path':\n if (formula.path[0] === 'Apis') {\n const apiName = formula.path[1]\n if (typeof apiName === 'string') {\n apis.add(apiName)\n }\n }\n break\n case 'value':\n break\n case 'record':\n formula.entries.forEach((entry) =>\n visitFormulaReference(entry.formula),\n )\n break\n case 'function':\n case 'array':\n case 'or':\n case 'and':\n case 'apply':\n case 'object':\n formula.arguments?.forEach((arg) =>\n visitFormulaReference(arg.formula),\n )\n break\n case 'switch':\n formula.cases.forEach((c) => {\n visitFormulaReference(c.condition)\n visitFormulaReference(c.formula)\n })\n break\n }\n }\n visitFormulaReference(this.api.autoFetch)\n visitFormulaReference(this.api.url)\n Object.values(this.api.path ?? {}).forEach((p) =>\n visitFormulaReference(p.formula),\n )\n Object.values(this.api.queryParams ?? {}).forEach((q) =>\n visitFormulaReference(q.formula),\n )\n\n // this is supporting a few legacy cases where the whole header object was set as a formula. This is no longer possible\n if (isFormula(this.api.headers)) {\n visitFormulaReference(this.api.headers)\n } else {\n Object.values(this.api.headers ?? {}).forEach((h) => {\n visitFormulaReference(h)\n })\n }\n visitFormulaReference(this.api.body)\n this._apiReferences = apis\n return apis\n }\n\n get name() {\n return this.api.name\n }\n get type() {\n return this.api.type\n }\n get autoFetch() {\n return this.api.autoFetch\n }\n get url() {\n return this.api.url\n }\n get path() {\n return this.api.path\n }\n get proxy() {\n return this.api.proxy\n }\n get queryParams() {\n return this.api.queryParams\n }\n get headers() {\n return this.api.headers\n }\n get method() {\n return this.api.method\n }\n get body() {\n return this.api.body\n }\n get auth() {\n return this.api.auth\n }\n get throttle() {\n return this.api.throttle\n }\n get debounce() {\n return this.api.debounce\n }\n get onCompleted() {\n return this.api.onCompleted\n }\n get onFailed() {\n return this.api.onFailed\n }\n *formulasInApi(): Generator<{\n path: (string | number)[]\n formula: Formula\n packageName?: string\n }> {\n const api = this.api\n const apiKey = this.key\n yield* getFormulasInFormula({\n formula: api.autoFetch,\n globalFormulas: this.globalFormulas,\n path: ['apis', apiKey, 'autoFetch'],\n })\n yield* getFormulasInFormula({\n formula: api.url,\n globalFormulas: this.globalFormulas,\n path: ['apis', apiKey, 'url'],\n })\n for (const [pathKey, path] of Object.entries(api.path ?? {})) {\n yield* getFormulasInFormula({\n formula: path.formula,\n globalFormulas: this.globalFormulas,\n path: ['apis', apiKey, 'path', pathKey, 'formula'],\n })\n }\n for (const [queryParamKey, queryParam] of Object.entries(\n api.queryParams ?? {},\n )) {\n yield* getFormulasInFormula({\n formula: queryParam.formula,\n globalFormulas: this.globalFormulas,\n path: ['apis', apiKey, 'queryParams', queryParamKey, 'formula'],\n })\n }\n\n // this is supporting a few legacy cases where the whole header object was set as a formula. This is no longer possible\n if (isFormula(api.headers)) {\n yield* getFormulasInFormula({\n formula: api.headers,\n globalFormulas: this.globalFormulas,\n path: ['apis', apiKey, 'headers'],\n })\n } else {\n for (const [headerKey, header] of Object.entries(api.headers ?? {})) {\n yield* getFormulasInFormula({\n formula: header,\n globalFormulas: this.globalFormulas,\n path: ['apis', apiKey, 'headers', headerKey],\n })\n }\n }\n\n yield* getFormulasInFormula({\n formula: api.body,\n globalFormulas: this.globalFormulas,\n path: ['apis', apiKey, 'body'],\n })\n for (const [actionKey, action] of Object.entries(\n api.onCompleted?.actions ?? {},\n )) {\n yield* getFormulasInAction({\n action,\n globalFormulas: this.globalFormulas,\n path: ['apis', apiKey, 'onCompleted', 'actions', actionKey],\n })\n }\n for (const [actionKey, action] of Object.entries(\n api.onFailed?.actions ?? {},\n )) {\n yield* getFormulasInAction({\n action,\n globalFormulas: this.globalFormulas,\n path: ['apis', apiKey, 'onFailed', 'actions', actionKey],\n })\n }\n }\n}\n", "import type { LegacyPluginAction, Nullable, PluginActionV2 } from '../types'\nimport { isDefined } from '../utils/util'\nimport type { ActionModel } from './component.types'\n\nexport function* getActionsInAction(\n action: Nullable<ActionModel>,\n path: (string | number)[] = [],\n): Generator<[(string | number)[], ActionModel]> {\n if (!isDefined(action)) {\n return\n }\n\n yield [path, action]\n switch (action.type) {\n case 'SetVariable':\n case 'SetURLParameter':\n case 'SetURLParameters':\n case 'TriggerEvent':\n case 'TriggerWorkflow':\n case 'TriggerWorkflowCallback':\n break\n case 'Fetch':\n for (const [key, a] of Object.entries(action.onSuccess?.actions ?? {})) {\n yield* getActionsInAction(a, [...path, 'onSuccess', 'actions', key])\n }\n for (const [key, a] of Object.entries(action.onError?.actions ?? {})) {\n yield* getActionsInAction(a, [...path, 'onError', 'actions', key])\n }\n for (const [key, a] of Object.entries(action.onMessage?.actions ?? {})) {\n yield* getActionsInAction(a, [...path, 'onMessage', 'actions', key])\n }\n break\n case 'Custom':\n case undefined:\n case null:\n for (const [eventKey, event] of Object.entries(action.events ?? {})) {\n for (const [key, a] of Object.entries(event?.actions ?? {})) {\n yield* getActionsInAction(a, [\n ...path,\n 'events',\n eventKey,\n 'actions',\n key,\n ])\n }\n }\n break\n case 'Switch':\n for (const [key, c] of action.cases.entries()) {\n for (const [actionKey, a] of Object.entries(c?.actions ?? {})) {\n yield* getActionsInAction(a, [\n ...path,\n 'cases',\n key,\n 'actions',\n actionKey,\n ])\n }\n }\n for (const [actionKey, a] of Object.entries(action.default.actions)) {\n yield* getActionsInAction(a, [...path, 'default', 'actions', actionKey])\n }\n break\n }\n}\n\nexport const isLegacyPluginAction = (\n action: LegacyPluginAction | PluginActionV2,\n): action is LegacyPluginAction => {\n return !('version' in action)\n}\n", "import { getActionsInAction } from '../component/actionUtils'\nimport type { ActionModel } from '../component/component.types'\nimport { type Formula } from '../formula/formula'\nimport type { GlobalFormulas } from '../formula/formulaTypes'\nimport {\n getFormulasInAction,\n getFormulasInFormula,\n} from '../formula/formulaUtils'\nimport type { Nullable } from '../types'\nimport { isDefined } from '../utils/util'\nimport { HttpMethodsWithAllowedBody } from './api'\nimport { type ApiRequest } from './apiTypes'\n\nexport class ToddleApiV2<Handler> implements ApiRequest {\n private api: ApiRequest\n private _apiReferences?: Set<string>\n private key: string\n private globalFormulas: GlobalFormulas<Handler>\n\n constructor(\n api: ApiRequest,\n apiKey: string,\n globalFormulas: GlobalFormulas<Handler>,\n ) {\n this.api = api\n this.key = apiKey\n this.globalFormulas = globalFormulas\n }\n\n get apiReferences(): Set<string> {\n if (this._apiReferences) {\n // Only compute apiReferences once\n return this._apiReferences\n }\n const apis = new Set<string>()\n const visitFormulaReference = (formula?: Nullable<Formula>) => {\n if (!isDefined(formula)) {\n return\n }\n switch (formula.type) {\n case 'path':\n if (formula.path[0] === 'Apis') {\n const apiName = formula.path[1]\n if (typeof apiName === 'string') {\n apis.add(apiName)\n }\n }\n break\n case 'value':\n break\n case 'record':\n formula.entries.forEach((entry) =>\n visitFormulaReference(entry.formula),\n )\n break\n case 'function':\n case 'array':\n case 'or':\n case 'and':\n case 'apply':\n case 'object':\n formula.arguments?.forEach((arg) =>\n visitFormulaReference(arg.formula),\n )\n break\n case 'switch':\n formula.cases.forEach((c) => {\n visitFormulaReference(c.condition)\n visitFormulaReference(c.formula)\n })\n break\n }\n }\n visitFormulaReference(this.api.autoFetch)\n visitFormulaReference(this.api.url)\n Object.values(this.api.path ?? {}).forEach((p) =>\n visitFormulaReference(p.formula),\n )\n Object.values(this.api.headers ?? {}).forEach((h) =>\n visitFormulaReference(h.formula),\n )\n visitFormulaReference(this.api.body)\n Object.values(this.api.inputs).forEach((arg) =>\n visitFormulaReference(arg.formula),\n )\n Object.values(this.api.queryParams ?? {}).forEach((q) => {\n visitFormulaReference(q.formula)\n })\n visitFormulaReference(this.api.server?.proxy?.enabled?.formula)\n visitFormulaReference(this.api.server?.ssr?.enabled?.formula)\n visitFormulaReference(this.api.client?.debounce?.formula)\n Object.values(this.api.redirectRules ?? {}).forEach((rule) => {\n visitFormulaReference(rule.formula)\n })\n visitFormulaReference(this.api.isError?.formula)\n visitFormulaReference(this.api.timeout?.formula)\n // Ensure self references are not included - for instance if an API references its\n // own response in a redirect rule\n apis.delete(this.key)\n\n this._apiReferences = apis\n return apis\n }\n\n get version() {\n return this.api.version\n }\n\n get name() {\n return this.api.name\n }\n\n get type() {\n return this.api.type\n }\n\n get autoFetch() {\n return this.api.autoFetch\n }\n\n get url() {\n return this.api.url\n }\n\n get path() {\n return this.api.path\n }\n\n get headers() {\n return this.api.headers\n }\n\n set headers(headers) {\n this.api.headers = headers\n }\n\n get method() {\n return this.api.method\n }\n\n get body() {\n return this.api.body\n }\n\n get inputs() {\n return this.api.inputs\n }\n\n get queryParams() {\n return this.api.queryParams\n }\n\n get server() {\n return this.api.server\n }\n\n get client() {\n return this.api.client\n }\n\n get redirectRules() {\n return this.api.redirectRules\n }\n\n get isError() {\n return this.api.isError\n }\n\n get timeout() {\n return this.api.timeout\n }\n\n get '@nordcraft/metadata'() {\n return this.api['@nordcraft/metadata']\n }\n\n *formulasInApi(): Generator<{\n path: (string | number)[]\n formula: Formula\n packageName?: string\n }> {\n const api = this.api\n const apiKey = this.key\n for (const [input, value] of Object.entries(this.api.inputs)) {\n yield* getFormulasInFormula({\n formula: value.formula,\n globalFormulas: this.globalFormulas,\n path: ['apis', apiKey, 'inputs', input, 'formula'],\n })\n }\n yield* getFormulasInFormula({\n formula: api.autoFetch,\n globalFormulas: this.globalFormulas,\n path: ['apis', apiKey, 'autoFetch'],\n })\n yield* getFormulasInFormula({\n formula: api.url,\n globalFormulas: this.globalFormulas,\n path: ['apis', apiKey, 'url'],\n })\n for (const [pathKey, path] of Object.entries(api.path ?? {})) {\n yield* getFormulasInFormula({\n formula: path.formula,\n globalFormulas: this.globalFormulas,\n path: ['apis', apiKey, 'path', pathKey, 'formula'],\n })\n }\n for (const [queryParamKey, queryParam] of Object.entries(\n api.queryParams ?? {},\n )) {\n yield* getFormulasInFormula({\n formula: queryParam.formula,\n globalFormulas: this.globalFormulas,\n path: ['apis', apiKey, 'queryParams', queryParamKey, 'formula'],\n })\n yield* getFormulasInFormula({\n formula: queryParam.enabled,\n globalFormulas: this.globalFormulas,\n path: ['apis', apiKey, 'queryParams', queryParamKey, 'enabled'],\n })\n }\n\n for (const [headerKey, header] of Object.entries(api.headers ?? {})) {\n yield* getFormulasInFormula({\n formula: header.formula,\n globalFormulas: this.globalFormulas,\n path: ['apis', apiKey, 'headers', headerKey, 'formula'],\n })\n yield* getFormulasInFormula({\n formula: header.enabled,\n globalFormulas: this.globalFormulas,\n path: ['apis', apiKey, 'headers', headerKey, 'enabled'],\n })\n }\n\n // Only visit the body definition if the method supports having a body\n if (api.method && HttpMethodsWithAllowedBody.includes(api.method)) {\n yield* getFormulasInFormula({\n formula: api.body,\n globalFormulas: this.globalFormulas,\n path: ['apis', apiKey, 'body'],\n })\n }\n for (const [actionKey, action] of Object.entries(\n api.client?.onCompleted?.actions ?? {},\n )) {\n yield* getFormulasInAction({\n action,\n globalFormulas: this.globalFormulas,\n path: ['apis', apiKey, 'client', 'onCompleted', 'actions', actionKey],\n })\n }\n for (const [actionKey, action] of Object.entries(\n api.client?.onFailed?.actions ?? {},\n )) {\n yield* getFormulasInAction({\n action,\n globalFormulas: this.globalFormulas,\n path: ['apis', apiKey, 'client', 'onFailed', 'actions', actionKey],\n })\n }\n yield* getFormulasInFormula({\n formula: api.client?.debounce?.formula,\n globalFormulas: this.globalFormulas,\n path: ['apis', apiKey, 'client', 'debounce', 'formula'],\n })\n for (const [actionKey, action] of Object.entries(\n api.client?.onMessage?.actions ?? {},\n )) {\n yield* getFormulasInAction({\n action,\n globalFormulas: this.globalFormulas,\n path: ['apis', apiKey, 'client', 'onMessage', 'actions', actionKey],\n })\n }\n for (const [rule, value] of Object.entries(api.redirectRules ?? {})) {\n yield* getFormulasInFormula({\n formula: value.formula,\n globalFormulas: this.globalFormulas,\n path: ['apis', apiKey, 'redirectRules', rule, 'formula'],\n })\n }\n yield* getFormulasInFormula({\n formula: api.isError?.formula,\n globalFormulas: this.globalFormulas,\n path: ['apis', apiKey, 'isError', 'formula'],\n })\n yield* getFormulasInFormula({\n formula: api.timeout?.formula,\n globalFormulas: this.globalFormulas,\n path: ['apis', apiKey, 'timeout', 'formula'],\n })\n yield* getFormulasInFormula({\n formula: api.server?.proxy?.enabled.formula,\n globalFormulas: this.globalFormulas,\n path: ['apis', apiKey, 'server', 'proxy', 'enabled', 'formula'],\n })\n yield* getFormulasInFormula({\n formula: api.server?.proxy?.useTemplatesInBody?.formula,\n globalFormulas: this.globalFormulas,\n path: [\n 'apis',\n apiKey,\n 'server',\n 'proxy',\n 'useTemplatesInBody',\n 'formula',\n ],\n })\n yield* getFormulasInFormula({\n formula: api.server?.ssr?.enabled?.formula,\n globalFormulas: this.globalFormulas,\n path: ['apis', apiKey, 'server', 'ssr', 'enabled', 'formula'],\n })\n }\n\n *actionModelsInApi(): Generator<[(string | number)[], ActionModel]> {\n for (const [actionKey, action] of Object.entries(\n this.api.client?.onCompleted?.actions ?? {},\n )) {\n yield* getActionsInAction(action, [\n 'apis',\n this.key,\n 'client',\n 'onCompleted',\n 'actions',\n actionKey,\n ])\n }\n for (const [actionKey, action] of Object.entries(\n this.api.client?.onFailed?.actions ?? {},\n )) {\n yield* getActionsInAction(action, [\n 'apis',\n this.key,\n 'client',\n 'onFailed',\n 'actions',\n actionKey,\n ])\n }\n for (const [actionKey, action] of Object.entries(\n this.api.client?.onMessage?.actions ?? {},\n )) {\n yield* getActionsInAction(action, [\n 'apis',\n this.key,\n 'client',\n 'onData',\n 'actions',\n actionKey,\n ])\n }\n }\n}\n", "import type { Formula, FormulaContext } from '../formula/formula'\nimport { applyFormula } from '../formula/formula'\nimport type { Nullable } from '../types'\nimport { omitKeys, sortObjectEntries } from '../utils/collections'\nimport { hash } from '../utils/hash'\nimport { isDefined, isObject, toBoolean } from '../utils/util'\nimport type {\n ApiBase,\n ApiPerformance,\n ApiRequest,\n ComponentAPI,\n LegacyComponentAPI,\n ToddleRequestInit,\n} from './apiTypes'\nimport { ApiMethod } from './apiTypes'\nimport { isJsonHeader } from './headers'\nimport { LegacyToddleApi } from './LegacyToddleApi'\nimport { ToddleApiV2 } from './ToddleApiV2'\n\nexport const NON_BODY_RESPONSE_CODES = [101, 204, 205, 304]\n\nexport const isLegacyApi = <Handler>(\n api: ComponentAPI | LegacyToddleApi<Handler> | ToddleApiV2<Handler>,\n): api is LegacyComponentAPI | LegacyToddleApi<Handler> =>\n api instanceof LegacyToddleApi ? true : !('version' in api)\n\nexport const createApiRequest = <Handler>({\n api,\n formulaContext,\n baseUrl,\n defaultHeaders,\n}: {\n api: ApiRequest | ToddleApiV2<Handler>\n formulaContext: FormulaContext\n baseUrl?: Nullable<string>\n defaultHeaders: Headers | undefined\n}) => {\n const url = getUrl(api, formulaContext, baseUrl)\n const requestSettings = getRequestSettings({\n api,\n formulaContext,\n defaultHeaders,\n })\n\n return { url, requestSettings }\n}\n\nexport const getUrl = (\n api: ApiBase,\n formulaContext: FormulaContext,\n baseUrl?: Nullable<string>,\n): URL => {\n let urlPathname = ''\n let urlQueryParams = new URLSearchParams()\n let parsedUrl: URL | undefined\n const url = applyFormula(api.url, formulaContext)\n if (['string', 'number'].includes(typeof url)) {\n const urlInput = typeof url === 'number' ? String(url) : url\n try {\n // Try to parse the URL to extract potential path and query parameters\n parsedUrl = new URL(urlInput, baseUrl ?? undefined)\n urlPathname = parsedUrl.pathname\n urlQueryParams = parsedUrl.searchParams\n // eslint-disable-next-line no-empty\n } catch {}\n }\n const pathParams = getRequestPath(api.path, formulaContext)\n // Combine potential path parameters from the url declaration with the actual path parameters\n const path = `${urlPathname}${pathParams.length > 0 && !urlPathname.endsWith('/') ? '/' : ''}${pathParams}`\n // Combine potential query parameters from the url declaration with the actual query parameters\n const queryParams = new URLSearchParams([\n ...urlQueryParams,\n ...getRequestQueryParams(api.queryParams, formulaContext),\n ])\n const queryString =\n [...queryParams.entries()].length > 0 ? `?${queryParams.toString()}` : ''\n const hash = applyFormula(api.hash?.formula, formulaContext)\n const hashString =\n typeof hash === 'string' && hash.length > 0 ? `#${hash}` : ''\n if (parsedUrl) {\n const combinedUrl = new URL(parsedUrl.origin, baseUrl ?? undefined)\n combinedUrl.pathname = path\n combinedUrl.search = queryParams.toString()\n combinedUrl.hash = hashString\n return combinedUrl\n } else {\n return new URL(`${path}${queryString}${hashString}`, baseUrl ?? undefined)\n }\n}\n\nexport const HttpMethodsWithAllowedBody: ApiMethod[] = [\n ApiMethod.POST,\n ApiMethod.DELETE,\n ApiMethod.PUT,\n ApiMethod.PATCH,\n ApiMethod.OPTIONS,\n]\n\nexport const applyAbortSignal = (\n api: ApiRequest,\n requestSettings: RequestInit,\n formulaContext: FormulaContext,\n) => {\n if (api.timeout) {\n const timeout = applyFormula(api.timeout.formula, formulaContext)\n if (typeof timeout === 'number' && !Number.isNaN(timeout) && timeout > 0) {\n requestSettings.signal = AbortSignal.timeout(timeout)\n }\n }\n}\n\nconst getRequestSettings = ({\n api,\n formulaContext,\n defaultHeaders,\n}: {\n api: ApiRequest\n formulaContext: FormulaContext\n defaultHeaders: Headers | undefined\n}): ToddleRequestInit => {\n const method = Object.values(ApiMethod).includes(api.method as ApiMethod)\n ? (api.method as ApiMethod)\n : ApiMethod.GET\n const headers = getRequestHeaders({\n apiHeaders: api.headers,\n formulaContext,\n defaultHeaders,\n })\n const body = getRequestBody({ api, formulaContext, headers, method })\n if (headers.get('content-type') === 'multipart/form-data') {\n headers.delete('content-type')\n }\n\n const requestSettings: ToddleRequestInit = {\n method,\n headers,\n body,\n }\n\n applyAbortSignal(api, requestSettings, formulaContext)\n\n return requestSettings\n}\n\nexport const getRequestPath = (\n path: ApiRequest['path'],\n formulaContext: FormulaContext,\n): string =>\n sortObjectEntries(path ?? {}, ([_, p]) => p.index)\n .map(([_, p]) => applyFormula(p.formula, formulaContext))\n .join('/')\n\nexport const getRequestQueryParams = (\n params: ApiRequest['queryParams'],\n formulaContext: FormulaContext,\n): URLSearchParams => {\n const queryParams = new URLSearchParams()\n Object.entries(params ?? {}).forEach(([key, param]) => {\n const enabled = isDefined(param.enabled)\n ? applyFormula(param.enabled, formulaContext)\n : true\n if (!enabled) {\n return\n }\n\n const value = applyFormula(param.formula, formulaContext)\n if (!isDefined(value)) {\n // Ignore null/undefined values\n return\n }\n if (Array.isArray(value)) {\n // Support encoding 1-dimensional arrays\n value.forEach((v) => queryParams.append(key, String(v)))\n } else if (isObject(value)) {\n // Support encoding (nested) objects, but cast any non-object to a String\n const encodeObject = (obj: Record<string, any>, prefix: string) => {\n Object.entries(obj).forEach(([key, val]) => {\n if (!Array.isArray(val) && isObject(val)) {\n return encodeObject(val, `${prefix}[${key}]`)\n } else {\n queryParams.set(`${prefix}[${key}]`, String(val))\n }\n })\n }\n encodeObject(value, key)\n } else {\n queryParams.set(key, String(value))\n }\n })\n return queryParams\n}\n\nexport const getRequestHeaders = ({\n apiHeaders,\n formulaContext,\n defaultHeaders,\n}: {\n apiHeaders: ApiRequest['headers']\n formulaContext: FormulaContext\n defaultHeaders: Headers | undefined\n}) => {\n const headers = new Headers(defaultHeaders)\n Object.entries(apiHeaders ?? {}).forEach(([key, param]) => {\n const enabled = isDefined(param.enabled)\n ? applyFormula(param.enabled, formulaContext)\n : true\n if (enabled) {\n const value = applyFormula(param.formula, formulaContext)\n if (isDefined(value)) {\n try {\n headers.set(\n key.trim(),\n (typeof value === 'string' ? value : String(value)).trim(),\n )\n // eslint-disable-next-line no-empty\n } catch {}\n }\n }\n })\n return headers\n}\n\nexport const getBaseUrl = ({\n origin,\n url,\n}: {\n origin: string\n url?: Nullable<string>\n}) =>\n !isDefined(url) || url === '' || url.startsWith('/') ? origin + url : url\n\n/**\n * Calculate the hash of a Request object based on its properties\n */\nexport const requestHash = (url: URL, request: RequestInit) =>\n hash(\n JSON.stringify({\n url: url.href,\n method: request.method,\n headers: omitKeys(\n Object.fromEntries(Object.entries(request.headers ?? {})),\n ['host', 'cookie'],\n ),\n body: request.body ?? null,\n }),\n )\n\nexport const isApiError = ({\n apiName,\n response,\n formulaContext,\n errorFormula,\n performance,\n}: {\n apiName: string\n response: {\n ok: boolean\n status?: Nullable<number>\n headers?: Nullable<Record<string, string>>\n body: unknown\n }\n formulaContext: FormulaContext\n performance: ApiPerformance\n errorFormula?: Nullable<{ formula: Formula }>\n}) => {\n const errorFormulaRes = errorFormula\n ? applyFormula(errorFormula.formula, {\n component: formulaContext.component,\n package: formulaContext.package,\n toddle: formulaContext.toddle,\n data: {\n Attributes: {},\n Args: formulaContext.data.Args,\n Apis: {\n // The errorFormula will only have access to the data of the current API\n [apiName]: {\n isLoading: false,\n data: response.body,\n error: null,\n response: {\n status: response.status,\n headers: response.headers,\n performance,\n },\n },\n },\n },\n env: formulaContext.env,\n })\n : null\n\n if (errorFormulaRes === null || errorFormulaRes === undefined) {\n return !response.ok\n }\n return toBoolean(errorFormulaRes)\n}\n\nexport const getRequestBody = ({\n api,\n formulaContext,\n headers,\n method,\n}: {\n api: ApiRequest\n formulaContext: FormulaContext\n headers: Headers\n method: ApiMethod\n}): FormData | string | undefined => {\n if (!api.body || !HttpMethodsWithAllowedBody.includes(method)) {\n return\n }\n\n const body = applyFormula(api.body, formulaContext)\n if (!body) {\n return\n }\n const contentType = headers.get('content-type')\n if (!isDefined(contentType) || isJsonHeader(contentType)) {\n // JSON.stringify the body if the content type is JSON or has not been set\n return JSON.stringify(body)\n }\n switch (contentType) {\n case 'application/x-www-form-urlencoded': {\n if (typeof body === 'object' && body !== null) {\n return Object.entries(body)\n .map(([key, value]) => {\n if (Array.isArray(value)) {\n return value\n .map(\n (v) => `${encodeURIComponent(key)}=${encodeURIComponent(v)}`,\n )\n .join('&')\n } else {\n return `${encodeURIComponent(key)}=${encodeURIComponent(\n String(value),\n )}`\n }\n })\n .join('&')\n }\n return ''\n }\n case 'multipart/form-data': {\n const formData = new FormData()\n if (typeof body === 'object' && body !== null) {\n Object.entries(body).forEach(([key, value]) => {\n formData.set(key, value as string | Blob)\n })\n }\n return formData\n }\n case 'text/plain':\n return String(body)\n default:\n // For other content types, we return the body as is\n return body\n }\n}\n\nexport const createApiEvent = (\n eventName: 'message' | 'success' | 'failed',\n detail: any,\n) => {\n return new CustomEvent(eventName, {\n detail,\n })\n}\n\nconst compareApiDependencies = <Handler>(\n a: LegacyToddleApi<Handler> | ToddleApiV2<Handler>,\n b: LegacyToddleApi<Handler> | ToddleApiV2<Handler>,\n) => {\n const isADependentOnB = a.apiReferences.has(b.name)\n const isBDependentOnA = b.apiReferences.has(a.name)\n if (isADependentOnB === isBDependentOnA) {\n return 0\n }\n // 1 means A goes last - hence B is evaluated before A\n return isADependentOnB ? 1 : -1\n}\n\nexport const sortApiObjects = <Handler>(\n apis: Array<[string, ComponentAPI]>,\n) => {\n const apiMap = new Map<\n string,\n LegacyToddleApi<Handler> | ToddleApiV2<Handler>\n >()\n const getApi = (apiObj: ComponentAPI, key: string) => {\n let api = apiMap.get(key)\n if (!api) {\n api =\n apiObj.version === 2\n ? new ToddleApiV2<Handler>(\n apiObj,\n key,\n // global formulas are not required for sorting\n {\n formulas: {},\n packages: {},\n },\n )\n : new LegacyToddleApi<Handler>(\n apiObj,\n key,\n // global formulas are not required for sorting\n {\n formulas: {},\n packages: {},\n },\n )\n apiMap.set(key, api)\n }\n return api\n }\n\n return [...apis].sort(([aKey, aObj], [bKey, bObj]) => {\n const a = getApi(aObj, aKey)\n const b = getApi(bObj, bKey)\n return compareApiDependencies(a, b)\n })\n}\n\nexport const sortApiEntries = <Handler>(\n apis: Array<[string, LegacyToddleApi<Handler> | ToddleApiV2<Handler>]>,\n) => [...apis].sort(([_, a], [__, b]) => compareApiDependencies(a, b))\n", "// cSpell: ignore phash\nconst SEED = 5381\n\n// When we have separate strings it's useful to run a progressive\n// version of djb2 where we pretend that we're still looping over\n// the same string\nconst phash = (h: number, x: string) => {\n let i = x.length\n\n while (i) {\n h = (h * 33) ^ x.charCodeAt(--i)\n }\n\n return h\n}\n\n// This is a djb2 hashing function\nexport const hash = (x: string) => {\n return phash(SEED, x)\n}\n\nconst AD_REPLACER_R = /(a)(d)/gi\n\n/* This is the \"capacity\" of our alphabet i.e. 2x26 for all letters plus their capitalized\n * counterparts */\nconst charsLength = 52\n\n/* start at 75 for 'a' until 'z' (25) and then start at 65 for capitalized letters */\nconst getAlphabeticChar = (code: number) =>\n String.fromCharCode(code + (code > 25 ? 39 : 97))\n\n/* input a number, usually a hash and convert it to base-52 */\nexport function generateAlphabeticName(code: number) {\n let name = ''\n let x\n\n /* get a char and divide by alphabet-length */\n for (x = Math.abs(code); x > charsLength; x = (x / charsLength) | 0) {\n name = getAlphabeticChar(x % charsLength) + name\n }\n\n return (getAlphabeticChar(x % charsLength) + name).replace(\n AD_REPLACER_R,\n '$1-$2',\n )\n}\n", "import { generateAlphabeticName, hash } from './hash'\n\nexport const getClassName = (object: any) => {\n return generateAlphabeticName(hash(JSON.stringify(object)))\n}\n\nexport const toValidClassName = (\n input: string,\n escapeSpecialCharacters = false,\n) => {\n // Replace invalid characters with hyphens\n let className = input\n // Remove leading and trailing whitespace\n .trim()\n // Replace whitespace with hyphens\n .replace(/\\s+/g, '-')\n\n if (escapeSpecialCharacters) {\n className = className.replace(/[^a-zA-Z0-9-_]/g, (match) => `\\\\${match}`)\n }\n\n // Ensure the class name doesn't start with a number or special character\n if (/^[^a-zA-Z]/.test(className)) {\n className = `_${className}`\n }\n\n return className\n}\n", "import type { CustomPropertyName } from '../component/component.types'\nimport type { Nullable } from '../types'\nimport { isDefined } from '../utils/util'\nimport type { CustomPropertyDefinition, Theme } from './theme'\n\n// See https://developer.mozilla.org/en-US/docs/Web/CSS/@property/syntax\n// Note: Not all CSS syntaxes are necessarily supported logically\nexport type CssSyntax =\n | 'angle'\n | 'color'\n | 'custom-ident'\n | 'image'\n | 'integer'\n | 'length'\n | 'length-percentage'\n | 'number'\n | 'percentage'\n | 'resolution'\n | 'string'\n | 'time'\n | 'transform-function'\n | 'transform-list'\n | 'url'\n | '*'\n\n// Custom syntaxes that cannot be represented by a single primitive or keyword list\nexport type CssCustomSyntax = 'font-family' // <custom-ident> | <string>\n// | 'timing-function'\n// | 'box-shadow'\n// | 'box-shadow-list'\n// | 'filter'\n// | etc.\n\nexport type CssSyntaxNode =\n | {\n type: 'primitive'\n name: CssSyntax\n }\n | {\n type: 'custom'\n name: CssCustomSyntax\n }\n | {\n type: 'keyword'\n keywords: string[]\n }\n\nexport function stringifySyntaxNode(node: CssSyntaxNode): string {\n switch (node.type) {\n case 'primitive':\n switch (node.name) {\n case '*':\n return node.name\n default:\n return `<${node.name}>`\n }\n case 'custom':\n return (\n {\n 'font-family': '<custom-ident> | <string>',\n } as { [key in CssCustomSyntax]: string }\n )[node.name]\n case 'keyword':\n return node.keywords.join(' | ')\n default:\n throw new Error(`Unknown syntax node type: ${(node as any).type}`)\n }\n}\n\nexport function renderSyntaxDefinition(\n key: CustomPropertyName,\n { syntax, inherits, initialValue }: CustomPropertyDefinition,\n theme: Theme,\n): string {\n let value = initialValue\n if (initialValue?.includes('var(--')) {\n value = solveVarRecursively(initialValue, theme)\n }\n\n // Fallback in-case of no reference\n if (\n !isDefined(value) &&\n (syntax.type === 'primitive' || syntax.type === 'custom')\n ) {\n value = FALLBACK_VALUES[syntax.name]\n }\n\n return `@property ${key} {\n syntax: \"${stringifySyntaxNode(syntax)}\";\n inherits: ${String(inherits)};\n initial-value: ${value};\n}`\n}\n\nfunction solveVarRecursively(initialValue: string, theme: Theme, depth = 0) {\n // This makes a crazy assumption that no person would create a web of style-variable referencing deeper than 256\n if (depth > 2 ** 8) {\n return null\n }\n\n const VAR_REGEX = /var\\((--[a-zA-Z0-9-_]+)\\)/g\n\n let match\n while ((match = VAR_REGEX.exec(initialValue))) {\n const varName = match[1]\n const def = theme.propertyDefinitions?.[varName as CustomPropertyName]\n if (!isDefined(def)) {\n return null\n }\n\n const value = def.initialValue\n const returnValue = initialValue.replace(match[0], String(value))\n if (returnValue.includes('var(--')) {\n return solveVarRecursively(returnValue, theme, depth + 1)\n }\n\n return returnValue\n }\n\n return null\n}\n\nconst FALLBACK_VALUES: Record<CssSyntax | CssCustomSyntax, string> = {\n color: 'transparent',\n length: '0px',\n 'length-percentage': '0px',\n percentage: '0%',\n number: '0',\n angle: '0deg',\n time: '0s',\n resolution: '0dpi',\n 'custom-ident': 'none',\n string: '\"\"',\n image: 'none',\n url: 'none',\n 'transform-function': 'none',\n 'transform-list': 'none',\n integer: '0',\n 'font-family': 'initial',\n '*': 'initial',\n}\n\nexport const appendUnit = (value: any, unit: Nullable<string>) =>\n isDefined(value) && isDefined(unit) && !String(value).endsWith(unit)\n ? `${value}${unit}`\n : value\n", "import type { OldTheme } from './theme'\n\nexport const CUSTOM_PROPERTIES_STYLESHEET_ID = 'nc-custom-properties'\n\nexport const RESET_STYLES = `\n@layer reset {\n html {\n height:100%;\n }\n\n #App {\n height:100%;\n display:flex;\n flex-direction:column;\n }\n\n body {\n height:100%;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n margin:0;\n }\n\n [data-node-id]:not([data-unset-toddle-styles],[data-node-type=\"text\"],noscript,br,script,style,math,math *,link,template,meta,title,base), [data-node-id]:not([data-unset-toddle-styles],noscript)::before, [data-node-id]:not([data-unset-toddle-styles],noscript)::after {\n display: flex;\n flex-direction: column;\n flex-grow: 0;\n flex-shrink: 0;\n\n position: relative;\n box-sizing: border-box;\n padding: 0;\n margin: 0;\n\n font-size: var(--text-base);\n font-family: var(--font-sans);\n font-weight: var(--font-weight-normal);\n\n background: transparent;\n color: inherit;\n border: none;\n box-shadow: none;\n }\n\n [data-node-id]:not([data-unset-toddle-styles]):is(p, h1, h2, h3, h4, h5, h6, label, span, strong, b, i, address, caption, code, cite, dt, dd, em, figcaption, legend, blockquote, abbr, pre, bdo, bdi) {\n display: inline-block;\n overflow-wrap: break-word;\n color: inherit;\n }\n\n [data-node-id]:not([data-unset-toddle-styles]):is(input, button, textarea, select) {\n outline: none;\n }\n\n [data-node-id]:not([data-unset-toddle-styles]):is(a) {\n color: inherit;\n text-decoration: none;\n }\n\n [data-node-id]:not([data-unset-toddle-styles]):is(ul, ol, li) {\n list-style: none;\n }\n\n [data-node-id]:not([data-unset-toddle-styles]):is(span[data-node-type=\"text\"]) {\n font: inherit;\n display: inline;\n flex-direction: column;\n flex-grow: 0;\n flex-shrink: 0;\n box-sizing: border-box;\n }\n\n [popover]:not(:popover-open):not(dialog[open]) {\n display: revert;\n }\n}`\nexport const theme: OldTheme = {\n colors: {\n grey: {\n order: 0,\n variants: {\n '50': { order: 0, value: '#FAFAFA' },\n '100': { order: 1, value: '#F5F5F5' },\n '200': { order: 2, value: '#E5E5E5' },\n '300': { order: 3, value: '#D4D4D4' },\n '400': { order: 4, value: '#A3A3A3' },\n '500': { order: 5, value: '#737373' },\n '600': { order: 6, value: '#525252' },\n '700': { order: 7, value: '#404040' },\n '800': { order: 8, value: '#262626' },\n '900': { order: 9, value: '#171717' },\n },\n },\n red: {\n order: 1,\n variants: {\n '50': { order: 0, value: '#FEF2F2' },\n '100': { order: 1, value: '#FEE2E2' },\n '200': { order: 2, value: '#FECACA' },\n '300': { order: 3, value: '#FCA5A5' },\n '400': { order: 4, value: '#F87171' },\n '500': { order: 5, value: '#EF4444' },\n '600': { order: 6, value: '#DC2626' },\n '700': { order: 7, value: '#B91C1C' },\n '800': { order: 8, value: '#991B1B' },\n '900': { order: 9, value: '#7F1D1D' },\n },\n },\n rose: {\n order: 3,\n variants: {\n '50': { order: 0, value: '#FFF1F2' },\n '100': { order: 1, value: '#FFE4E6' },\n '200': { order: 2, value: '#FECDD3' },\n '300': { order: 3, value: '#FDA4AF' },\n '400': { order: 4, value: '#FB7185' },\n '500': { order: 5, value: '#F43F5E' },\n '600': { order: 6, value: '#E11D48' },\n '700': { order: 7, value: '#BE123C' },\n '800': { order: 8, value: '#9F1239' },\n '900': { order: 9, value: '#881337' },\n },\n },\n pink: {\n order: 4,\n variants: {\n '50': { order: 0, value: '#FDF2F8' },\n '100': { order: 1, value: '#FCE7F3' },\n '200': { order: 2, value: '#FBCFE8' },\n '300': { order: 3, value: '#F9A8D4' },\n '400': { order: 4, value: '#F472B6' },\n '500': { order: 5, value: '#EC4899' },\n '600': { order: 6, value: '#DB2777' },\n '700': { order: 7, value: '#BE185D' },\n '800': { order: 8, value: '#9D174D' },\n '900': { order: 9, value: '#831843' },\n },\n },\n amber: {\n order: 5,\n variants: {\n '50': { order: 0, value: '#FFFBEB' },\n '100': { order: 1, value: '#FEF3C7' },\n '200': { order: 2, value: '#FDE68A' },\n '300': { order: 3, value: '#FCD34D' },\n '400': { order: 4, value: '#FBBF24' },\n '500': { order: 5, value: '#F59E0B' },\n '600': { order: 6, value: '#D97706' },\n '700': { order: 7, value: '#B45309' },\n '800': { order: 8, value: '#92400E' },\n '900': { order: 9, value: '#78350F' },\n },\n },\n orange: {\n order: 6,\n variants: {\n '50': { order: 0, value: '#FFF7ED' },\n '100': { order: 1, value: '#FFEDD5' },\n '200': { order: 2, value: '#FED7AA' },\n '300': { order: 3, value: '#FDBA74' },\n '400': { order: 4, value: '#FB923C' },\n '500': { order: 5, value: '#F97316' },\n '600': { order: 6, value: '#EA580C' },\n '700': { order: 7, value: '#C2410C' },\n '800': { order: 8, value: '#9A3412' },\n '900': { order: 9, value: '#7C2D12' },\n },\n },\n yellow: {\n order: 7,\n variants: {\n '50': { order: 0, value: '#FFFBEB' },\n '100': { order: 1, value: '#FEF3C7' },\n '200': { order: 2, value: '#FDE68A' },\n '300': { order: 3, value: '#FCD34D' },\n '400': { order: 4, value: '#FBBF24' },\n '500': { order: 5, value: '#F59E0B' },\n '600': { order: 6, value: '#D97706' },\n '700': { order: 7, value: '#B45309' },\n '800': { order: 8, value: '#92400E' },\n '900': { order: 9, value: '#78350F' },\n },\n },\n lime: {\n order: 8,\n variants: {\n '50': { order: 0, value: '#F7FEE7' },\n '100': { order: 1, value: '#ECFCCB' },\n '200': { order: 2, value: '#D9F99D' },\n '300': { order: 3, value: '#BEF264' },\n '400': { order: 4, value: '#A3E635' },\n '500': { order: 5, value: '#84CC16' },\n '600': { order: 6, value: '#65A30D' },\n '700': { order: 7, value: '#4D7C0F' },\n '800': { order: 8, value: '#3F6212' },\n '900': { order: 9, value: '#365314' },\n },\n },\n green: {\n order: 9,\n variants: {\n '50': { order: 0, value: '#ECFDF5' },\n '100': { order: 1, value: '#D1FAE5' },\n '200': { order: 2, value: '#A7F3D0' },\n '300': { order: 3, value: '#6EE7B7' },\n '400': { order: 4, value: '#34D399' },\n '500': { order: 5, value: '#10B981' },\n '600': { order: 6, value: '#059669' },\n '700': { order: 7, value: '#047857' },\n '800': { order: 8, value: '#065F46' },\n '900': { order: 9, value: '#064E3B' },\n },\n },\n emerald: {\n order: 10,\n variants: {\n '50': { order: 0, value: '#ECFDF5' },\n '100': { order: 1, value: '#D1FAE5' },\n '200': { order: 2, value: '#A7F3D0' },\n '300': { order: 3, value: '#6EE7B7' },\n '400': { order: 4, value: '#34D399' },\n '500': { order: 5, value: '#10B981' },\n '600': { order: 6, value: '#059669' },\n '700': { order: 7, value: '#047857' },\n '800': { order: 8, value: '#065F46' },\n '900': { order: 9, value: '#064E3B' },\n },\n },\n teal: {\n order: 11,\n variants: {\n '50': { order: 0, value: '#F0FDFA' },\n '100': { order: 1, value: '#CCFBF1' },\n '200': { order: 2, value: '#99F6E4' },\n '300': { order: 3, value: '#5EEAD4' },\n '400': { order: 4, value: '#2DD4BF' },\n '500': { order: 5, value: '#14B8A6' },\n '600': { order: 6, value: '#0D9488' },\n '700': { order: 7, value: '#0F766E' },\n '800': { order: 8, value: '#115E59' },\n '900': { order: 9, value: '#134E4A' },\n },\n },\n cyan: {\n order: 12,\n variants: {\n '50': { order: 0, value: '#ECFEFF' },\n '100': { order: 1, value: '#CFFAFE' },\n '200': { order: 2, value: '#A5F3FC' },\n '300': { order: 3, value: '#67E8F9' },\n '400': { order: 4, value: '#22D3EE' },\n '500': { order: 5, value: '#06B6D4' },\n '600': { order: 6, value: '#0891B2' },\n '700': { order: 7, value: '#0E7490' },\n '800': { order: 8, value: '#155E75' },\n '900': { order: 9, value: '#164E63' },\n },\n },\n sky: {\n order: 13,\n variants: {\n '50': { order: 0, value: '#F0F9FF' },\n '100': { order: 1, value: '#E0F2FE' },\n '200': { order: 2, value: '#BAE6FD' },\n '300': { order: 3, value: '#7DD3FC' },\n '400': { order: 4, value: '#38BDF8' },\n '500': { order: 5, value: '#0EA5E9' },\n '600': { order: 6, value: '#0284C7' },\n '700': { order: 7, value: '#0369A1' },\n '800': { order: 8, value: '#075985' },\n '900': { order: 9, value: '#0C4A6E' },\n },\n },\n blue: {\n order: 14,\n variants: {\n '50': { order: 0, value: '#EFF6FF' },\n '100': { order: 1, value: '#DBEAFE' },\n '200': { order: 2, value: '#BFDBFE' },\n '300': { order: 3, value: '#93C5FD' },\n '400': { order: 4, value: '#60A5FA' },\n '500': { order: 5, value: '#3B82F6' },\n '600': { order: 6, value: '#2563EB' },\n '700': { order: 7, value: '#1D4ED8' },\n '800': { order: 8, value: '#1E40AF' },\n '900': { order: 9, value: '#1E3A8A' },\n },\n },\n\n indigo: {\n order: 15,\n variants: {\n '50': { order: 0, value: '#EEF2FF' },\n '100': { order: 1, value: '#E0E7FF' },\n '200': { order: 2, value: '#C7D2FE' },\n '300': { order: 3, value: '#A5B4FC' },\n '400': { order: 4, value: '#818CF8' },\n '500': { order: 5, value: '#6366F1' },\n '600': { order: 6, value: '#4F46E5' },\n '700': { order: 7, value: '#4338CA' },\n '800': { order: 8, value: '#3730A3' },\n '900': { order: 9, value: '#312E81' },\n },\n },\n\n purple: {\n order: 16,\n variants: {\n '50': { order: 0, value: '#F5F3FF' },\n '100': { order: 1, value: '#EDE9FE' },\n '200': { order: 2, value: '#DDD6FE' },\n '300': { order: 3, value: '#C4B5FD' },\n '400': { order: 4, value: '#A78BFA' },\n '500': { order: 5, value: '#8B5CF6' },\n '600': { order: 6, value: '#7C3AED' },\n '700': { order: 7, value: '#6D28D9' },\n '800': { order: 8, value: '#5B21B6' },\n '900': { order: 9, value: '#4C1D95' },\n },\n },\n\n fuchsia: {\n order: 17,\n variants: {\n '50': { order: 0, value: '#FDF4FF' },\n '100': { order: 1, value: '#FAE8FF' },\n '200': { order: 2, value: '#F5D0FE' },\n '300': { order: 3, value: '#F0ABFC' },\n '400': { order: 4, value: '#E879F9' },\n '500': { order: 5, value: '#D946EF' },\n '600': { order: 6, value: '#C026D3' },\n '700': { order: 7, value: '#A21CAF' },\n '800': { order: 8, value: '#86198F' },\n '900': { order: 9, value: '#701A75' },\n },\n },\n },\n\n shadow: {\n sm: { order: 0, value: '0 1px 2px 0 rgba(0, 0, 0, 0.25)' },\n base: {\n order: 1,\n value: '0 1px 3px 0 rgba(0, 0, 0, 0.25), 0 1px 2px 0 rgba(0, 0, 0, 0.25)',\n },\n md: {\n order: 2,\n value:\n '0 4px 6px -1px rgba(0, 0, 0, 0.25), 0 2px 4px -1px rgba(0, 0, 0, 0.25)',\n },\n lg: {\n order: 3,\n value:\n '0 10px 15px -3px rgba(0, 0, 0, 0.25), 0 4px 6px -2px rgba(0, 0, 0, 0.25)',\n },\n xl: {\n order: 4,\n value:\n '0 20px 25px -5px rgba(0, 0, 0, 0.25), 0 10px 10px -5px rgba(0, 0, 0, 0.25)',\n },\n '2xl': { order: 5, value: '0 25px 50px -12px rgba(0, 0, 0, 0.25)' },\n },\n\n spacing: 0.25,\n fontSize: {\n lg: { order: 0, value: '1.125rem' },\n sm: { order: 1, value: '0.875rem' },\n xl: { order: 2, value: '1.25rem' },\n xs: { order: 3, value: '0.75rem' },\n '2xl': { order: 4, value: '1.5rem' },\n '3xl': { order: 5, value: '1.875rem' },\n '4xl': { order: 6, value: '2.25rem' },\n '5xl': { order: 7, value: '3rem' },\n xxs: { order: 8, value: '0.625rem' },\n base: { order: 9, value: '1rem', default: true },\n },\n fontFamily: {\n mono: { order: 0, value: ['Fira Code', 'monospace'] },\n sans: { order: 1, value: ['Inter', 'sans-serif'], default: true },\n },\n fontWeight: {\n bold: { order: 0, value: '700' },\n bolder: { order: 1, value: '800' },\n normal: { order: 2, value: '500', default: true },\n regular: { order: 3, value: '400' },\n 'semi-bold': { order: 4, value: '600' },\n },\n breakpoints: {\n large: { order: 2, value: 1440 },\n small: { order: 0, value: 576 },\n medium: { order: 1, value: 960 },\n },\n}\n", "import type { CustomPropertyName } from '../component/component.types'\nimport type { Nullable } from '../types'\nimport { isDefined } from '../utils/util'\nimport { renderSyntaxDefinition, type CssSyntaxNode } from './customProperty'\nimport { RESET_STYLES } from './theme.const'\n\nexport interface ThemeOptions {\n includeResetStyle: boolean\n createFontFaces: boolean\n}\n\nexport type StyleToken = {\n name: string\n type: 'value' | 'variable'\n value: string\n}\n\nexport type StyleTokenGroup = {\n name: string\n tokens: StyleToken[]\n}\n\nexport type StyleTokenCategory =\n | 'spacing'\n | 'color'\n | 'font-size'\n | 'font-weight'\n | 'z-index'\n | 'border-radius'\n | 'shadow'\n\nexport type FontFamily = {\n name: string\n family: string\n provider: 'google' | 'upload'\n type: 'serif' | 'sans-serif' | 'monospace' | 'cursive'\n variants?: Array<{\n name: string\n weight:\n | '100'\n | '200'\n | '300'\n | '400'\n | '500'\n | '600'\n | '700'\n | '800'\n | '900'\n\n italic: boolean\n url: string\n }>\n}\n\nexport type OldTheme = {\n spacing: number\n colors: Record<\n string,\n {\n order: number\n variants: Record<string, { value: string; order: number }>\n }\n >\n fontFamily: Record<\n string,\n { value: string[]; order: number; default?: boolean }\n >\n fontWeight: Record<\n string,\n { value: string; order: number; default?: boolean }\n >\n fontSize: Record<string, { value: string; order: number; default?: boolean }>\n shadow: Record<string, { value: string; order: number }>\n breakpoints: Record<string, { value: number; order: number }>\n}\n\nexport type Theme = {\n default?: string\n defaultDark?: string\n defaultLight?: string\n propertyDefinitions?: Record<CustomPropertyName, CustomPropertyDefinition>\n themes?: Record<\n string,\n {\n order?: number\n }\n >\n // Legacy support\n scheme?: 'dark' | 'light'\n color?: StyleTokenGroup[]\n fonts: FontFamily[]\n 'font-size'?: StyleTokenGroup[]\n 'font-weight'?: StyleTokenGroup[]\n spacing?: StyleTokenGroup[]\n 'border-radius'?: StyleTokenGroup[]\n shadow?: StyleTokenGroup[]\n 'z-index'?: StyleTokenGroup[]\n}\n\nexport type CustomPropertyDefinition = {\n syntax: CssSyntaxNode\n inherits: boolean\n initialValue: Nullable<string> // Required by CSS specs for default-theme, but we can do a fallback so null is allowed\n description: string\n // Values mapped to theme names.\n // Values are not required, if left out, the default theme value will be used. If no default theme value exists, initialValue will be used.\n values: Record<string, Nullable<string>>\n}\n\nexport const getThemeCss = (\n themes: Record<string, OldTheme | Theme>,\n options: ThemeOptions,\n) => {\n const [themesV1, themesV2] = Object.entries(themes).reduce(\n ([legacy, modern], [key, value]) => {\n if ('breakpoints' in value) {\n legacy[key] = value\n } else {\n modern[key] = value\n }\n return [legacy, modern]\n },\n [{}, {}] as [Record<string, OldTheme>, Record<string, Theme>],\n )\n\n return `\n ${Object.values(themesV1)\n .map((t) => getOldThemeCss(t))\n .join('\\n')}\n\n ${Object.values(themesV2)\n .map((themeV2) => {\n return `\n ${Object.entries(themeV2.propertyDefinitions ?? {})\n .map(([propertyName, property]) =>\n renderSyntaxDefinition(\n propertyName as CustomPropertyName,\n property,\n themeV2,\n ),\n )\n .join('\\n')}\n\n ${renderThemeValues(':host, :root', getThemeEntries(themeV2, themeV2.default))}\n ${renderThemeValues(':host, :root', getThemeEntries(themeV2, themeV2.defaultDark), '@media (prefers-color-scheme: dark)')}\n ${renderThemeValues(':host, :root', getThemeEntries(themeV2, themeV2.defaultLight), '@media (prefers-color-scheme: light)')}\n ${Object.entries(themeV2.themes ?? {})\n .map(([key, _t]) =>\n renderThemeValues(\n `[data-theme~=\"${key}\"]`,\n getThemeEntries(themeV2, key),\n ),\n )\n .join('\\n')}\n `\n })\n .join('\\n')}\n\n${options.includeResetStyle ? RESET_STYLES : ''}\n@layer base {\n ${\n options.createFontFaces\n ? Object.values(themesV2)\n .map(({ fonts }) => fonts)\n .flat()\n .map(\n (font) => `\n ${(font.variants ?? [])\n .map(\n (variant) => `\n @font-face {\n font-family: \"${font.family}\";\n font-style: ${variant.italic ? 'italic' : 'normal'};\n font-weight: ${variant.weight};\n font-display: auto;\n src: local(\"${variant.url.substring(\n variant.url.lastIndexOf('/') + 1,\n )}\"), url(\"${variant.url.replace(\n 'https://fonts.gstatic.com',\n '/.toddle/fonts/font',\n )}\") format(\"woff2\");\n }\n `,\n )\n .join('\\n')}\n `,\n )\n .join('\\n')\n : ''\n }\n body, :host {\n /* Color */\n ${Object.values(themesV2)\n .map(({ color }) => color ?? [])\n .flat()\n .flatMap((group) =>\n group.tokens.map((color) => `--${color.name}: ${color.value};`),\n )\n .join('\\n')}\n /* Fonts */\n ${Object.values(themesV2)\n .map(({ fonts }) => fonts)\n .flat()\n .map((font) => `--font-${font.name}: '${font.family}',${font.type};`)\n .join('\\n')}\n\n /* Font size */\n ${Object.values(themesV2)\n .map(({ 'font-size': fontSize }) => fontSize ?? [])\n .flat()\n .flatMap((group) =>\n group.tokens.map(\n (variable) =>\n `--${variable.name}: ${\n variable.type === 'variable'\n ? `var(--${variable.value})`\n : variable.value\n };`,\n ),\n )\n .join('\\n')}\n /* Font weight */\n ${Object.values(themesV2)\n .map(({ 'font-weight': fontWeight }) => fontWeight ?? [])\n .flat()\n .flatMap((group) => {\n return group.tokens.map(\n (variable) =>\n `--${variable.name}: ${\n variable.type === 'variable'\n ? `var(--${variable.value})`\n : variable.value\n };`,\n )\n })\n .join('\\n')}\n /* Shadows */\n ${Object.values(themesV2)\n .map(({ shadow }) => shadow ?? [])\n .flat()\n .flatMap((group) => {\n return group.tokens.map(\n (variable) =>\n `--${variable.name}: ${\n variable.type === 'variable'\n ? `var(--${variable.value})`\n : variable.value\n };`,\n )\n })\n .join('\\n')}\n /* Border radius */\n ${Object.values(themesV2)\n .map(({ 'border-radius': borderRadius }) => borderRadius ?? [])\n .flat()\n .flatMap((group) => {\n return group.tokens.map(\n (token) =>\n `--${token.name}: ${\n token.type === 'variable' ? `var(--${token.value})` : token.value\n };`,\n )\n })\n .join('\\n')}\n /* Spacing */\n ${Object.values(themesV2)\n .map(({ spacing }) => spacing ?? [])\n .flat()\n .map((group) => {\n return group.tokens\n .map(\n (token) =>\n `--${token.name}: ${\n token.type === 'variable'\n ? `var(--${token.value})`\n : token.value\n };`,\n )\n .join('\\n')\n })\n .join('\\n')}\n /* Z-index */\n ${Object.values(themesV2)\n .map(({ 'z-index': zIndex }) => zIndex ?? [])\n .flat()\n .map((group) => {\n return group.tokens\n .map(\n (token) =>\n `--${token.name}: ${\n token.type === 'variable'\n ? `var(--${token.value})`\n : token.value\n };`,\n )\n .join('\\n')\n })\n .join('\\n')}\n }\n @keyframes animation-spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n }\n @keyframes animation-fade-in {\n from {\n opacity:0;\n }\n to {\n opacity:1;\n }\n }\n @keyframes animation-fade-out {\n from {\n opacity:1;\n }\n to {\n opacity:0;\n }\n }\n}\n`\n}\n\nexport const getOldThemeCss = (theme: OldTheme) => {\n const colorVars = Object.entries(theme.colors).flatMap(\n ([color, { variants }]) =>\n Object.entries(variants).map(\n ([variant, { value }]) => `--${color}-${variant}:${value}`,\n ),\n )\n return `\nbody, :host {\n ${Object.entries(theme.fontFamily)\n .map(\n ([\n name,\n {\n value: [family, ...fallback],\n },\n ]) => `--font-${name}: '${family}',${fallback.join(',')};`,\n )\n .join('\\n')}\n\n ${Object.entries(theme.fontWeight)\n .map(([name, { value }]) => `--font-weight-${name}: ${value};`)\n .join('\\n')}\n\n ${Object.entries(theme.fontSize)\n .map(([name, { value }]) => `--font-size-${name}: ${value};`)\n .join('\\n')}\n\n --spacing:${theme.spacing}rem;\n ${colorVars.join(';\\n')};\n\n --text-xxs:0.625rem;\n --line-height-xxs:0.9rem;\n\n --text-xs:0.75rem;\n --line-height-xs:1rem;\n\n --text-sm:0.875rem;\n --line-height-sm:1.25rem;\n\n --text-base:1rem;\n --line-height-base:1.5rem;\n\n --text-lg:1.125rem;\n --line-height-lg:1.75rem;\n\n --text-xl:1.25rem;\n --line-height-xl:1.75rem;\n\n --text-2xl:1.5rem;\n --line-height-2xl:2rem;\n\n --text-3xl:1.875rem;\n --line-height-3xl:2.25rem;\n\n --text-4xl:2.25rem;\n --line-height-4xl:2.5rem;\n\n --text-5xl:3rem;\n --line-height-5xl:3rem;\n\n ${Object.entries(theme.shadow)\n .map(([name, { value }]) => `--shadow-${name}:${value};`)\n .join('\\n')}\n}\n\n${RESET_STYLES}\n\n@keyframes animation-spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n@keyframes animation-fade-in {\n from {\n opacity:0;\n }\n to {\n opacity:1;\n }\n}\n@keyframes animation-fade-out {\n from {\n opacity:1;\n }\n to {\n opacity:0;\n }\n}`\n}\n\nexport function renderThemeValues(\n selector: string,\n entries: Record<string, string>,\n mediaQuery?: string,\n) {\n if (Object.entries(entries).length === 0) {\n return ''\n }\n\n const css = `${selector} {\n ${Object.entries(entries)\n .map(([propertyName, value]) => `${propertyName}: ${value};`)\n .join('\\n ')}\n}`\n\n if (mediaQuery) {\n return `${mediaQuery} {\n ${css}\n }`\n }\n\n return css\n}\n\nexport function getThemeEntries(\n theme: Theme,\n themeName: string | undefined,\n): Record<string, string> {\n const entries: Record<string, string> = {}\n if (!themeName) {\n return entries\n }\n\n for (const [propertyName, definition] of Object.entries(\n theme.propertyDefinitions ?? {},\n )) {\n const value = definition.values?.[themeName]\n if (!isDefined(value)) {\n continue\n }\n\n entries[propertyName] = value\n }\n\n return entries\n}\n", "import type {\n CustomProperty,\n CustomPropertyName,\n NodeStyleModel,\n} from '../component/component.types'\nimport type { Nullable } from '../types'\n\nexport type Shadow = {\n x: number\n y: number\n blur: number\n spread: number\n color: string\n inset: boolean\n}\n\nexport type Filter =\n | {\n name: 'Blur'\n radius: number\n }\n | {\n name: 'Opacity'\n percent: number\n }\n\ntype MediaQuery = {\n 'min-width'?: Nullable<string>\n 'max-width'?: Nullable<string>\n 'min-height'?: Nullable<string>\n 'max-height'?: Nullable<string>\n}\n\nexport interface StyleVariant {\n 'even-child'?: Nullable<boolean>\n 'first-child'?: Nullable<boolean>\n 'first-of-type'?: Nullable<boolean>\n 'focus-visible'?: Nullable<boolean>\n 'focus-within'?: Nullable<boolean>\n 'last-child'?: Nullable<boolean>\n 'last-of-type'?: Nullable<boolean>\n 'nth-child(even)'?: Nullable<boolean>\n 'popover-open'?: Nullable<boolean>\n active?: Nullable<boolean>\n autofill?: Nullable<boolean>\n breakpoint?: Nullable<'small' | 'medium' | 'large'>\n checked?: Nullable<boolean>\n class?: Nullable<string>\n className?: Nullable<string>\n customProperties?: Nullable<Record<CustomPropertyName, CustomProperty>>\n disabled?: Nullable<boolean>\n empty?: Nullable<boolean>\n evenChild?: Nullable<boolean>\n firstChild?: Nullable<boolean>\n focus?: Nullable<boolean>\n focusWithin?: Nullable<boolean>\n hover?: Nullable<boolean>\n id?: Nullable<string>\n invalid?: Nullable<boolean>\n lastChild?: Nullable<boolean>\n link?: Nullable<boolean>\n mediaQuery?: Nullable<MediaQuery>\n pseudoElement?: Nullable<string>\n startingStyle?: Nullable<boolean>\n style: NodeStyleModel\n visited?: Nullable<boolean>\n}\n\nexport const variantSelector = (variant: StyleVariant) =>\n [\n (variant.className ?? variant['class']) && `.${variant.className}`,\n (variant.evenChild ??\n variant['even-child'] ??\n variant['nth-child(even)']) &&\n ':nth-child(even)',\n (variant.firstChild ?? variant['first-child']) && ':first-child',\n (variant.focusWithin ?? variant['focus-within']) && ':focus-within',\n (variant.lastChild ?? variant['last-child']) && ':last-child',\n variant.active && ':active',\n variant.autofill && ':is(:-webkit-autofill, :autofill)',\n variant.checked && ':checked',\n variant.disabled && ':disabled',\n variant.empty && ':empty',\n variant.focus && ':focus',\n variant.hover && ':hover',\n variant.invalid && ':invalid',\n variant.link && ':link',\n variant.visited && ':visited',\n variant['first-of-type'] && ':first-of-type',\n variant['focus-visible'] && ':focus-visible',\n variant['last-of-type'] && ':last-of-type',\n variant['popover-open'] && ':popover-open',\n variant.pseudoElement && `::${variant.pseudoElement}`,\n ]\n .filter(Boolean)\n .join('')\n", "// cSpell:ignore thinn, ABCDEFGHIJKLMNOPQRSTYVWXYZ\nimport type {\n Component,\n ComponentNodeModel,\n ElementNodeModel,\n NodeStyleModel,\n} from '../component/component.types'\nimport type { Nullable } from '../types'\nimport { omitKeys } from '../utils/collections'\nimport { isDefined } from '../utils/util'\nimport { getClassName, toValidClassName } from './className'\nimport type { OldTheme, Theme, ThemeOptions } from './theme'\nimport { getThemeCss } from './theme'\nimport { variantSelector, type StyleVariant } from './variantSelector'\n\nconst LEGACY_BREAKPOINTS = {\n large: 1440,\n small: 576,\n medium: 960,\n}\n\nexport function kebabCase(string: string) {\n return string\n .split('')\n .map((char) => {\n return 'ABCDEFGHIJKLMNOPQRSTYVWXYZ'.includes(char)\n ? '-' + char.toLocaleLowerCase()\n : char\n })\n .join('')\n}\n\nconst SIZE_PROPERTIES = new Set([\n 'width',\n 'min-width',\n 'max-width',\n 'height',\n 'min-height',\n 'max-height',\n 'margin',\n 'margin-top',\n 'margin-left',\n 'margin-bottom',\n 'margin-right',\n 'padding',\n 'padding-top',\n 'padding-left',\n 'padding-bottom',\n 'padding-right',\n 'gap',\n 'gap-x',\n 'gap-y',\n 'border-radius',\n 'border-bottom-left-radius',\n 'border-bottom-right-radius',\n 'border-top-left-radius',\n 'border-top-right-radius',\n 'border-width',\n 'border-top-width',\n 'border-left-width',\n 'border-bottom-width',\n 'border-right-width',\n 'font-size',\n 'top',\n 'right',\n 'bottom',\n 'left',\n 'outline-width',\n])\n\nexport const createStylesheet = (\n root: Component,\n components: Component[],\n themes: Record<string, OldTheme | Theme>,\n options: ThemeOptions,\n // eslint-disable-next-line max-params\n) => {\n const hashes = new Set<string>()\n const animationHashes = new Set<string>()\n\n // Get fonts used on the page\n const fonts = getAllFonts(components)\n\n //Exclude fonts that are not used on this page.\n let stylesheet = getThemeCss(\n Object.fromEntries(\n Object.entries(themes).map(([key, theme]) =>\n 'breakpoints' in theme\n ? [\n key,\n {\n ...theme,\n fontFamily: Object.fromEntries(\n Object.entries(theme.fontFamily).filter(\n ([key, value]) =>\n value.default ?? fonts.has('--font-' + key),\n ),\n ),\n },\n ]\n : [\n key,\n {\n ...theme,\n fonts: theme.fonts,\n },\n ],\n ),\n ),\n options,\n )\n const styleToCss = (style: NodeStyleModel) => {\n return Object.entries(style)\n .map(([property, value]) => {\n if (!isDefined(value)) {\n // ignore undefined/null values\n return\n }\n const propertyName = kebabCase(property)\n const propertyValue =\n String(Number(value)) === String(value) &&\n SIZE_PROPERTIES.has(propertyName)\n ? `${Number(value) * 4}px`\n : value\n return `${propertyName}:${propertyValue};`\n })\n .filter(Boolean)\n .join('\\n ')\n }\n const getNodeStyles = (\n node: ElementNodeModel | ComponentNodeModel,\n classHash: string,\n ) => {\n try {\n const style = omitKeys(node.style ?? {}, [\n 'variants',\n 'breakpoints',\n 'shadows',\n ])\n const styleVariants =\n node.variants ??\n // Support for old style variants stored inside style object\n // Once we have better versioning options, this should be removed\n (node.style?.variants as any as StyleVariant[])\n const renderVariant = (\n selector: string,\n style: NodeStyleModel,\n options?: Nullable<{ startingStyle?: Nullable<boolean> }>,\n ) => {\n const scrollbarStyles = Object.entries(style).filter(\n ([key]) => key === 'scrollbar-width',\n )\n // If selectorCss is empty, we don't need to render the selector\n let styles = styleToCss(style)\n if (options?.startingStyle) {\n styles = `@starting-style {\n ${styles}\n }`\n }\n\n return `\n ${\n styles.length > 0\n ? `${selector} {\n ${styles}\n }`\n : ''\n }\n ${\n scrollbarStyles.length > 0\n ? `\n${selector}::-webkit-scrollbar {\n ${scrollbarStyles\n .map(([_, value]) => {\n switch (value) {\n case 'none':\n return 'width: 0;'\n case 'thinn':\n case 'thin':\n return 'width: 4px;'\n default:\n return ''\n }\n })\n .join('\\n')}\n}\n`\n : ''\n }\n`\n }\n\n return `\n ${renderVariant('.' + classHash, style)}\n ${(styleVariants ?? [])\n .map((variant) => {\n const renderedVariant = renderVariant(\n `.${classHash}${variantSelector(variant)}`,\n variant.style,\n {\n startingStyle: variant.startingStyle,\n },\n )\n\n if (variant.mediaQuery) {\n return `\n @media (${Object.entries(variant.mediaQuery)\n .map(([key, value]) => `${key}: ${value}`)\n .filter(Boolean)\n .join(') and (')}) {\n ${renderedVariant}\n }\n `\n }\n\n if (variant.breakpoint) {\n return `\n @media (min-width: ${LEGACY_BREAKPOINTS[variant.breakpoint]}px) {\n ${renderedVariant}\n }\n `\n }\n\n return renderedVariant\n })\n .join('\\n')}\n ${\n node.animations\n ? Object.entries(node.animations)\n .map(([animationName, keyframes]) => {\n // Animation names are stored by their hash, so no need to render them more than once.\n if (animationHashes.has(animationName)) {\n return ''\n }\n animationHashes.add(animationName)\n return `\n @keyframes ${animationName} {\n ${Object.values(keyframes)\n .sort((a, b) => a.position - b.position)\n .map(({ key, position, value }) => {\n return `\n ${position * 100}% {\n ${key}: ${value};\n }\n `\n })\n .join('\\n')}\n }\n `\n })\n .join('\\n')\n : ''\n }\n `\n } catch (e) {\n // eslint-disable-next-line no-console\n console.error(e)\n return ''\n }\n }\n\n // Make sure that CSS for dependencies are rendered first so that instance styles can override\n const visitedComponents = new Set<string>()\n function insertComponentStyles(\n component: Component,\n package_name?: string,\n ): string | undefined {\n if (visitedComponents.has(component.name)) {\n return\n }\n visitedComponents.add(component.name)\n if (!component.nodes) {\n // eslint-disable-next-line no-console\n console.warn('Unable to find nodes for component', component.name)\n return\n }\n Object.entries(component.nodes).forEach(([id, node]) => {\n if (node.type === 'component') {\n const childComponent = components.find(\n (c) =>\n c.name ===\n [node.package ?? package_name, node.name]\n .filter((c) => c)\n .join('/'),\n )\n if (childComponent) {\n insertComponentStyles(childComponent, node.package ?? package_name)\n stylesheet += getNodeStyles(\n node as any,\n toValidClassName(`${component.name}:${id}`, true),\n )\n\n return\n }\n }\n if (node.type !== 'element') {\n return\n }\n const classHash = getClassName([node.style, node.variants])\n if (hashes.has(classHash)) {\n return ''\n }\n hashes.add(classHash)\n stylesheet += getNodeStyles(node as any, classHash)\n })\n }\n insertComponentStyles(root)\n\n return stylesheet\n}\n\nexport const getAllFonts = (components: Component[]) => {\n return new Set(\n components\n .flatMap((component) => {\n return Object.values(component.nodes ?? {}).flatMap((node) => {\n if (node.type === 'element') {\n return [\n node.style?.fontFamily,\n node.style?.['font-family'],\n ...(node.variants?.map(\n (v) => v.style.fontFamily ?? v.style['font-family'],\n ) ?? []),\n ].filter(isDefined)\n }\n return []\n })\n })\n .map((f) =>\n String(f).replace('var(', '').replace(')', '').replaceAll(\"'\", ''),\n ),\n )\n}\n", "import type { ContextApi, ContextApiV2 } from '../types'\n\nexport const isContextApiV2 = (api: ContextApi): api is ContextApiV2 =>\n 'triggerActions' in api\n", "/* eslint-disable no-console */\nimport type {\n ActionModel,\n ComponentData,\n SetMultiUrlParameterAction,\n SetURLParameterAction,\n} from '@nordcraft/core/dist/component/component.types'\nimport { applyFormula } from '@nordcraft/core/dist/formula/formula'\nimport { mapValues, omitKeys } from '@nordcraft/core/dist/utils/collections'\nimport { isDefined, toBoolean } from '@nordcraft/core/dist/utils/util'\nimport fastDeepEqual from 'fast-deep-equal'\nimport { isContextApiV2 } from '../api/apiUtils'\nimport type { ComponentContext, Location } from '../types'\nimport { getLocationUrl } from '../utils/url'\n\n// eslint-disable-next-line max-params\nexport function handleAction(\n action: ActionModel,\n data: ComponentData,\n ctx: ComponentContext,\n event?: Event,\n workflowCallback?: (event: string, data: unknown) => void,\n) {\n try {\n if (!action) {\n throw new Error('Action does not exist')\n }\n switch (action.type) {\n case 'Switch': {\n // find the first case that resolves to true.\n // Only one case in a switch will be executed.\n const actionList =\n action.cases.find(({ condition }) =>\n toBoolean(\n applyFormula(condition, {\n data,\n component: ctx.component,\n formulaCache: ctx.formulaCache,\n root: ctx.root,\n package: ctx.package,\n toddle: ctx.toddle,\n env: ctx.env,\n }),\n ),\n ) ?? action.default\n if (!actionList) {\n return\n }\n // handle all actions for the case\n for (const action of actionList.actions) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n handleAction(\n action,\n { ...data, ...ctx.dataSignal.get() },\n ctx,\n event,\n workflowCallback,\n )\n }\n break\n }\n case 'SetVariable': {\n const value = applyFormula(action.data, {\n data,\n component: ctx.component,\n formulaCache: ctx.formulaCache,\n root: ctx.root,\n package: ctx.package,\n toddle: ctx.toddle,\n env: ctx.env,\n })\n ctx.dataSignal.update((data) => {\n return {\n ...data,\n Variables: {\n ...data.Variables,\n [action.variable]: value,\n },\n }\n })\n break\n }\n case 'TriggerEvent': {\n const payload = applyFormula(action.data, {\n data,\n component: ctx.component,\n formulaCache: ctx.formulaCache,\n root: ctx.root,\n package: ctx.package,\n toddle: ctx.toddle,\n env: ctx.env,\n })\n ctx.triggerEvent(action.event, payload)\n break\n }\n case 'TriggerWorkflowCallback': {\n const payload = applyFormula(action.data, {\n data,\n component: ctx.component,\n formulaCache: ctx.formulaCache,\n root: ctx.root,\n package: ctx.package,\n toddle: ctx.toddle,\n env: ctx.env,\n })\n workflowCallback?.(action.event, payload)\n break\n }\n case 'SetURLParameter': {\n ctx.toddle.locationSignal.update((current) => {\n const value = applyFormula(action.data, {\n data,\n component: ctx.component,\n formulaCache: ctx.formulaCache,\n root: ctx.root,\n package: ctx.package,\n toddle: ctx.toddle,\n env: ctx.env,\n })\n // historyMode was previously not declared explicitly, and we default\n // to push for state changes and replace for query changes\n let historyMode: SetURLParameterAction['historyMode'] | undefined\n let newLocation: Location | undefined\n // We should only match on p.type === 'param', but\n // that would technically be a breaking change\n if (current.route?.path.some((p) => p.name === action.parameter)) {\n historyMode = 'push'\n newLocation = {\n ...current,\n params: {\n ...omitKeys(current.params, [action.parameter]),\n [action.parameter]: value,\n },\n }\n }\n // We should check if the query parameter exists in the route\n // but that would technically be a breaking change\n // else if (Object.values(current.route?.query ?? {}).some((q) => q.name === action.parameter))\n else {\n historyMode = 'replace'\n newLocation = {\n ...current,\n query: {\n ...omitKeys(current.query, [action.parameter]),\n ...(isDefined(value) ? { [action.parameter]: value } : null),\n },\n }\n }\n if (!historyMode) {\n // No path/query parameter matched\n return current\n }\n\n const currentUrl = getLocationUrl(current)\n const historyUrl = getLocationUrl(newLocation)\n if (historyUrl !== currentUrl) {\n // Default to the historyMode from the action, and fallback\n // to the default (push for path change, replace for query change)\n historyMode = action.historyMode ?? historyMode\n // Update the window's history state\n if (historyMode === 'push') {\n window.history.pushState({}, '', historyUrl)\n } else {\n window.history.replaceState({}, '', historyUrl)\n }\n }\n return newLocation\n })\n break\n }\n case 'SetURLParameters': {\n const parameters = Object.entries(action.parameters ?? {})\n if (parameters.length === 0) {\n return\n }\n ctx.toddle.locationSignal.update((current) => {\n if (!current.route) {\n // A route must exist for us to update/validate against it\n return current\n }\n // We default to push for state changes and replace for query changes\n let historyMode: SetMultiUrlParameterAction['historyMode'] = 'replace'\n const queryUpdates: Record<string, string> = {}\n const pathUpdates: Record<string, string> = {}\n const urlParameterCtx = {\n data,\n component: ctx.component,\n formulaCache: ctx.formulaCache,\n root: ctx.root,\n package: ctx.package,\n toddle: ctx.toddle,\n env: ctx.env,\n }\n // Only match on p.type === 'param'\n const isValidPathParameter = (param: string) =>\n current.route?.path.some(\n (p) => p.name === param && p.type === 'param',\n )\n const isValidQueryParameter = (param: string) =>\n Object.values(current.route?.query ?? {}).some(\n (q) => q.name === param,\n )\n\n for (const [parameter, formula] of parameters) {\n const value = applyFormula(formula, urlParameterCtx) ?? null\n if (isValidPathParameter(parameter)) {\n historyMode = 'push'\n pathUpdates[parameter] = value as string\n } else if (isValidQueryParameter(parameter)) {\n queryUpdates[parameter] = value as string\n }\n }\n if (\n Object.keys(pathUpdates).length === 0 &&\n Object.keys(queryUpdates).length === 0\n ) {\n // No path/query parameter matched\n // We'll exit early to avoid deep equal below\n return current\n }\n\n const newLocation = {\n ...current,\n params: {\n ...omitKeys(current.params, Object.keys(pathUpdates)),\n ...pathUpdates,\n },\n query: {\n ...omitKeys(current.query, Object.keys(queryUpdates)),\n ...queryUpdates,\n },\n }\n if (fastDeepEqual(newLocation, current)) {\n // No path/query parameter matched\n return current\n }\n\n const currentUrl = getLocationUrl(current)\n const historyUrl = getLocationUrl(newLocation)\n if (historyUrl !== currentUrl) {\n // Default to the historyMode from the action, and fallback\n // to the default (push for path change, replace for query change)\n historyMode = action.historyMode ?? historyMode\n // Update the window's history state\n if (historyMode === 'push') {\n window.history.pushState({}, '', historyUrl)\n } else {\n window.history.replaceState({}, '', historyUrl)\n }\n }\n return newLocation\n })\n break\n }\n case 'Fetch': {\n const api = ctx.apis[action.api]\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (!api) {\n console.error('The api ', action.api, 'does not exist')\n return\n }\n\n if (isContextApiV2(api)) {\n // Evaluate potential inputs here to make sure the api have the right values\n // This is needed if the inputs are formulas referencing workflow parameters\n const actionInputs = mapValues(action.inputs ?? {}, (input) =>\n applyFormula(input.formula, {\n data,\n component: ctx.component,\n formulaCache: ctx.formulaCache,\n root: ctx.root,\n package: ctx.package,\n toddle: ctx.toddle,\n env: ctx.env,\n }),\n )\n const actionModels = {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n onCompleted: action.onSuccess?.actions ?? [],\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n onFailed: action.onError?.actions ?? [],\n onMessage: action.onMessage?.actions ?? [],\n }\n void api.fetch({\n actionInputs,\n actionModels,\n componentData: data,\n workflowCallback,\n })\n } else {\n const triggerActions = (actions: ActionModel[]) => {\n for (const subAction of actions) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n handleAction(\n subAction,\n { ...data, ...ctx.dataSignal.get() },\n ctx,\n event,\n workflowCallback,\n )\n }\n }\n api.fetch().then(\n () => {\n triggerActions(action.onSuccess.actions)\n },\n () => {\n triggerActions(action.onError.actions)\n },\n )\n }\n\n break\n }\n case 'TriggerWorkflow': {\n const parameters = mapValues(action.parameters ?? {}, (parameter) =>\n applyFormula(parameter.formula, {\n data,\n component: ctx.component,\n formulaCache: ctx.formulaCache,\n root: ctx.root,\n package: ctx.package,\n toddle: ctx.toddle,\n env: ctx.env,\n }),\n )\n const callbacks = action.callbacks\n if (action.contextProvider) {\n const provider =\n ctx.providers[\n [ctx.package, action.contextProvider].filter(isDefined).join('/')\n ] ?? ctx.providers[action.contextProvider]\n const workflow = provider?.component.workflows?.[action.workflow]\n if (!workflow) {\n if (provider) {\n console.warn(\n `Cannot find workflow \"${action.workflow}\" on component \"${action.contextProvider}\". It has likely been removed or modified.`,\n )\n }\n return\n }\n\n workflow.actions.forEach((action) =>\n handleAction(\n action,\n {\n ...data,\n ...provider.ctx.dataSignal.get(),\n Parameters: parameters,\n },\n provider.ctx,\n event,\n (callbackName, callbackData) => {\n const callback = callbacks?.[callbackName]\n callback?.actions?.forEach((action) =>\n handleAction(\n action,\n {\n ...data,\n ...ctx.dataSignal.get(),\n Parameters: parameters,\n Event: callbackData,\n },\n ctx,\n event,\n workflowCallback,\n ),\n )\n },\n ),\n )\n return\n }\n\n const workflow = ctx.component.workflows?.[action.workflow]\n if (!workflow) {\n console.warn(\n `Workflow ${action.workflow} does not exist on component ${ctx.component.name}`,\n )\n return\n }\n\n workflow.actions.forEach((action) =>\n handleAction(\n action,\n {\n ...data,\n ...ctx.dataSignal.get(),\n Parameters: parameters,\n },\n ctx,\n event,\n (callbackName, callbackData) => {\n const callback = callbacks?.[callbackName]\n callback?.actions?.forEach((action) =>\n handleAction(\n action,\n {\n ...data,\n ...ctx.dataSignal.get(),\n Parameters: parameters,\n Event: callbackData,\n },\n ctx,\n event,\n workflowCallback,\n ),\n )\n },\n ),\n )\n break\n }\n default: {\n try {\n // create a handler for actions triggering events\n const triggerActionEvent = (trigger: string, eventData: any) => {\n const subEvent = action.events?.[trigger]\n if (subEvent) {\n subEvent.actions.forEach((action) =>\n handleAction(\n action,\n eventData\n ? { ...data, ...ctx.dataSignal.get(), Event: eventData }\n : { ...data, ...ctx.dataSignal.get() },\n ctx,\n eventData ?? event,\n workflowCallback,\n ),\n )\n }\n }\n const newAction =\n action.version === 2\n ? (ctx.toddle.getCustomAction ?? ctx.toddle.getCustomAction)(\n action.name,\n action.package ?? ctx.package,\n )\n : undefined\n if (newAction) {\n // First evaluate any arguments (input) to the action\n const args = (action.arguments ?? []).reduce<\n Record<string, unknown>\n >(\n (args, arg) =>\n arg\n ? {\n ...args,\n [arg.name]: applyFormula(arg.formula, {\n data,\n component: ctx.component,\n formulaCache: ctx.formulaCache,\n root: ctx.root,\n package: ctx.package,\n toddle: ctx.toddle,\n env: ctx.env,\n }),\n }\n : args,\n {},\n )\n const result = newAction.handler?.(\n args,\n {\n root: ctx.root,\n triggerActionEvent,\n },\n event,\n )\n // If the result is a function, then it should behave as a cleanup function, that runs, usually when the component is unmounted.\n // Useful for removeEventListeners, clearTimeout, etc.\n if (\n result &&\n (typeof result === 'function' || result instanceof Promise)\n ) {\n ctx.dataSignal.subscribe((data) => data, {\n destroy: () => {\n if (result instanceof Promise) {\n result\n .then((cleanup) => {\n if (typeof cleanup === 'function') {\n cleanup()\n }\n })\n .catch((err) => console.error(err))\n } else {\n result()\n }\n },\n })\n }\n\n return result\n } else {\n const legacyHandler = ctx.toddle.getAction(action.name)\n if (!legacyHandler) {\n console.error('Missing custom action', action.name)\n return\n }\n // First evaluate any arguments (input) to the action\n const args = action.arguments?.map((arg) =>\n applyFormula(arg?.formula, {\n data,\n component: ctx.component,\n formulaCache: ctx.formulaCache,\n root: ctx.root,\n package: ctx.package,\n toddle: ctx.toddle,\n env: ctx.env,\n }),\n ) ?? [\n applyFormula(action.data, {\n data,\n component: ctx.component,\n formulaCache: ctx.formulaCache,\n root: ctx.root,\n package: ctx.package,\n toddle: ctx.toddle,\n env: ctx.env,\n }),\n ] // action.data is a fallback to handle an older version of the action spec.\n return legacyHandler(args, { ...ctx, triggerActionEvent }, event)\n }\n } catch (err) {\n console.error('Error in Custom Action', err)\n }\n }\n }\n } catch (e) {\n console.error(e)\n return null\n }\n}\n", "/**\n * Tokenizer results.\n */\ninterface LexToken {\n type:\n | \"OPEN\"\n | \"CLOSE\"\n | \"PATTERN\"\n | \"NAME\"\n | \"CHAR\"\n | \"ESCAPED_CHAR\"\n | \"MODIFIER\"\n | \"END\";\n index: number;\n value: string;\n}\n\n/**\n * Tokenize input string.\n */\nfunction lexer(str: string): LexToken[] {\n const tokens: LexToken[] = [];\n let i = 0;\n\n while (i < str.length) {\n const char = str[i];\n\n if (char === \"*\" || char === \"+\" || char === \"?\") {\n tokens.push({ type: \"MODIFIER\", index: i, value: str[i++] });\n continue;\n }\n\n if (char === \"\\\\\") {\n tokens.push({ type: \"ESCAPED_CHAR\", index: i++, value: str[i++] });\n continue;\n }\n\n if (char === \"{\") {\n tokens.push({ type: \"OPEN\", index: i, value: str[i++] });\n continue;\n }\n\n if (char === \"}\") {\n tokens.push({ type: \"CLOSE\", index: i, value: str[i++] });\n continue;\n }\n\n if (char === \":\") {\n let name = \"\";\n let j = i + 1;\n\n while (j < str.length) {\n const code = str.charCodeAt(j);\n\n if (\n // `0-9`\n (code >= 48 && code <= 57) ||\n // `A-Z`\n (code >= 65 && code <= 90) ||\n // `a-z`\n (code >= 97 && code <= 122) ||\n // `_`\n code === 95\n ) {\n name += str[j++];\n continue;\n }\n\n break;\n }\n\n if (!name) throw new TypeError(`Missing parameter name at ${i}`);\n\n tokens.push({ type: \"NAME\", index: i, value: name });\n i = j;\n continue;\n }\n\n if (char === \"(\") {\n let count = 1;\n let pattern = \"\";\n let j = i + 1;\n\n if (str[j] === \"?\") {\n throw new TypeError(`Pattern cannot start with \"?\" at ${j}`);\n }\n\n while (j < str.length) {\n if (str[j] === \"\\\\\") {\n pattern += str[j++] + str[j++];\n continue;\n }\n\n if (str[j] === \")\") {\n count--;\n if (count === 0) {\n j++;\n break;\n }\n } else if (str[j] === \"(\") {\n count++;\n if (str[j + 1] !== \"?\") {\n throw new TypeError(`Capturing groups are not allowed at ${j}`);\n }\n }\n\n pattern += str[j++];\n }\n\n if (count) throw new TypeError(`Unbalanced pattern at ${i}`);\n if (!pattern) throw new TypeError(`Missing pattern at ${i}`);\n\n tokens.push({ type: \"PATTERN\", index: i, value: pattern });\n i = j;\n continue;\n }\n\n tokens.push({ type: \"CHAR\", index: i, value: str[i++] });\n }\n\n tokens.push({ type: \"END\", index: i, value: \"\" });\n\n return tokens;\n}\n\nexport interface ParseOptions {\n /**\n * Set the default delimiter for repeat parameters. (default: `'/'`)\n */\n delimiter?: string;\n /**\n * List of characters to automatically consider prefixes when parsing.\n */\n prefixes?: string;\n}\n\n/**\n * Parse a string for the raw tokens.\n */\nexport function parse(str: string, options: ParseOptions = {}): Token[] {\n const tokens = lexer(str);\n const { prefixes = \"./\", delimiter = \"/#?\" } = options;\n const result: Token[] = [];\n let key = 0;\n let i = 0;\n let path = \"\";\n\n const tryConsume = (type: LexToken[\"type\"]): string | undefined => {\n if (i < tokens.length && tokens[i].type === type) return tokens[i++].value;\n };\n\n const mustConsume = (type: LexToken[\"type\"]): string => {\n const value = tryConsume(type);\n if (value !== undefined) return value;\n const { type: nextType, index } = tokens[i];\n throw new TypeError(`Unexpected ${nextType} at ${index}, expected ${type}`);\n };\n\n const consumeText = (): string => {\n let result = \"\";\n let value: string | undefined;\n while ((value = tryConsume(\"CHAR\") || tryConsume(\"ESCAPED_CHAR\"))) {\n result += value;\n }\n return result;\n };\n\n const isSafe = (value: string): boolean => {\n for (const char of delimiter) if (value.indexOf(char) > -1) return true;\n return false;\n };\n\n const safePattern = (prefix: string) => {\n const prev = result[result.length - 1];\n const prevText = prefix || (prev && typeof prev === \"string\" ? prev : \"\");\n\n if (prev && !prevText) {\n throw new TypeError(\n `Must have text between two parameters, missing text after \"${(prev as Key).name}\"`,\n );\n }\n\n if (!prevText || isSafe(prevText)) return `[^${escapeString(delimiter)}]+?`;\n return `(?:(?!${escapeString(prevText)})[^${escapeString(delimiter)}])+?`;\n };\n\n while (i < tokens.length) {\n const char = tryConsume(\"CHAR\");\n const name = tryConsume(\"NAME\");\n const pattern = tryConsume(\"PATTERN\");\n\n if (name || pattern) {\n let prefix = char || \"\";\n\n if (prefixes.indexOf(prefix) === -1) {\n path += prefix;\n prefix = \"\";\n }\n\n if (path) {\n result.push(path);\n path = \"\";\n }\n\n result.push({\n name: name || key++,\n prefix,\n suffix: \"\",\n pattern: pattern || safePattern(prefix),\n modifier: tryConsume(\"MODIFIER\") || \"\",\n });\n continue;\n }\n\n const value = char || tryConsume(\"ESCAPED_CHAR\");\n if (value) {\n path += value;\n continue;\n }\n\n if (path) {\n result.push(path);\n path = \"\";\n }\n\n const open = tryConsume(\"OPEN\");\n if (open) {\n const prefix = consumeText();\n const name = tryConsume(\"NAME\") || \"\";\n const pattern = tryConsume(\"PATTERN\") || \"\";\n const suffix = consumeText();\n\n mustConsume(\"CLOSE\");\n\n result.push({\n name: name || (pattern ? key++ : \"\"),\n pattern: name && !pattern ? safePattern(prefix) : pattern,\n prefix,\n suffix,\n modifier: tryConsume(\"MODIFIER\") || \"\",\n });\n continue;\n }\n\n mustConsume(\"END\");\n }\n\n return result;\n}\n\nexport interface TokensToFunctionOptions {\n /**\n * When `true` the regexp will be case sensitive. (default: `false`)\n */\n sensitive?: boolean;\n /**\n * Function for encoding input strings for output.\n */\n encode?: (value: string, token: Key) => string;\n /**\n * When `false` the function can produce an invalid (unmatched) path. (default: `true`)\n */\n validate?: boolean;\n}\n\n/**\n * Compile a string to a template function for the path.\n */\nexport function compile<P extends object = object>(\n str: string,\n options?: ParseOptions & TokensToFunctionOptions,\n) {\n return tokensToFunction<P>(parse(str, options), options);\n}\n\nexport type PathFunction<P extends object = object> = (data?: P) => string;\n\n/**\n * Expose a method for transforming tokens into the path function.\n */\nexport function tokensToFunction<P extends object = object>(\n tokens: Token[],\n options: TokensToFunctionOptions = {},\n): PathFunction<P> {\n const reFlags = flags(options);\n const { encode = (x: string) => x, validate = true } = options;\n\n // Compile all the tokens into regexps.\n const matches = tokens.map((token) => {\n if (typeof token === \"object\") {\n return new RegExp(`^(?:${token.pattern})$`, reFlags);\n }\n });\n\n return (data: Record<string, any> | null | undefined) => {\n let path = \"\";\n\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i];\n\n if (typeof token === \"string\") {\n path += token;\n continue;\n }\n\n const value = data ? data[token.name] : undefined;\n const optional = token.modifier === \"?\" || token.modifier === \"*\";\n const repeat = token.modifier === \"*\" || token.modifier === \"+\";\n\n if (Array.isArray(value)) {\n if (!repeat) {\n throw new TypeError(\n `Expected \"${token.name}\" to not repeat, but got an array`,\n );\n }\n\n if (value.length === 0) {\n if (optional) continue;\n\n throw new TypeError(`Expected \"${token.name}\" to not be empty`);\n }\n\n for (let j = 0; j < value.length; j++) {\n const segment = encode(value[j], token);\n\n if (validate && !(matches[i] as RegExp).test(segment)) {\n throw new TypeError(\n `Expected all \"${token.name}\" to match \"${token.pattern}\", but got \"${segment}\"`,\n );\n }\n\n path += token.prefix + segment + token.suffix;\n }\n\n continue;\n }\n\n if (typeof value === \"string\" || typeof value === \"number\") {\n const segment = encode(String(value), token);\n\n if (validate && !(matches[i] as RegExp).test(segment)) {\n throw new TypeError(\n `Expected \"${token.name}\" to match \"${token.pattern}\", but got \"${segment}\"`,\n );\n }\n\n path += token.prefix + segment + token.suffix;\n continue;\n }\n\n if (optional) continue;\n\n const typeOfMessage = repeat ? \"an array\" : \"a string\";\n throw new TypeError(`Expected \"${token.name}\" to be ${typeOfMessage}`);\n }\n\n return path;\n };\n}\n\nexport interface RegexpToFunctionOptions {\n /**\n * Function for decoding strings for params.\n */\n decode?: (value: string, token: Key) => string;\n}\n\n/**\n * A match result contains data about the path match.\n */\nexport interface MatchResult<P extends object = object> {\n path: string;\n index: number;\n params: P;\n}\n\n/**\n * A match is either `false` (no match) or a match result.\n */\nexport type Match<P extends object = object> = false | MatchResult<P>;\n\n/**\n * The match function takes a string and returns whether it matched the path.\n */\nexport type MatchFunction<P extends object = object> = (\n path: string,\n) => Match<P>;\n\n/**\n * Create path match function from `path-to-regexp` spec.\n */\nexport function match<P extends object = object>(\n str: Path,\n options?: ParseOptions & TokensToRegexpOptions & RegexpToFunctionOptions,\n) {\n const keys: Key[] = [];\n const re = pathToRegexp(str, keys, options);\n return regexpToFunction<P>(re, keys, options);\n}\n\n/**\n * Create a path match function from `path-to-regexp` output.\n */\nexport function regexpToFunction<P extends object = object>(\n re: RegExp,\n keys: Key[],\n options: RegexpToFunctionOptions = {},\n): MatchFunction<P> {\n const { decode = (x: string) => x } = options;\n\n return function (pathname: string) {\n const m = re.exec(pathname);\n if (!m) return false;\n\n const { 0: path, index } = m;\n const params = Object.create(null);\n\n for (let i = 1; i < m.length; i++) {\n if (m[i] === undefined) continue;\n\n const key = keys[i - 1];\n\n if (key.modifier === \"*\" || key.modifier === \"+\") {\n params[key.name] = m[i].split(key.prefix + key.suffix).map((value) => {\n return decode(value, key);\n });\n } else {\n params[key.name] = decode(m[i], key);\n }\n }\n\n return { path, index, params };\n };\n}\n\n/**\n * Escape a regular expression string.\n */\nfunction escapeString(str: string) {\n return str.replace(/([.+*?=^!:${}()[\\]|/\\\\])/g, \"\\\\$1\");\n}\n\n/**\n * Get the flags for a regexp from the options.\n */\nfunction flags(options?: { sensitive?: boolean }) {\n return options && options.sensitive ? \"\" : \"i\";\n}\n\n/**\n * Metadata about a key.\n */\nexport interface Key {\n name: string | number;\n prefix: string;\n suffix: string;\n pattern: string;\n modifier: string;\n}\n\n/**\n * A token is a string (nothing special) or key metadata (capture group).\n */\nexport type Token = string | Key;\n\n/**\n * Pull out keys from a regexp.\n */\nfunction regexpToRegexp(path: RegExp, keys?: Key[]): RegExp {\n if (!keys) return path;\n\n const groupsRegex = /\\((?:\\?<(.*?)>)?(?!\\?)/g;\n\n let index = 0;\n let execResult = groupsRegex.exec(path.source);\n while (execResult) {\n keys.push({\n // Use parenthesized substring match if available, index otherwise\n name: execResult[1] || index++,\n prefix: \"\",\n suffix: \"\",\n modifier: \"\",\n pattern: \"\",\n });\n execResult = groupsRegex.exec(path.source);\n }\n\n return path;\n}\n\n/**\n * Transform an array into a regexp.\n */\nfunction arrayToRegexp(\n paths: Array<string | RegExp>,\n keys?: Key[],\n options?: TokensToRegexpOptions & ParseOptions,\n): RegExp {\n const parts = paths.map((path) => pathToRegexp(path, keys, options).source);\n return new RegExp(`(?:${parts.join(\"|\")})`, flags(options));\n}\n\n/**\n * Create a path regexp from string input.\n */\nfunction stringToRegexp(\n path: string,\n keys?: Key[],\n options?: TokensToRegexpOptions & ParseOptions,\n) {\n return tokensToRegexp(parse(path, options), keys, options);\n}\n\nexport interface TokensToRegexpOptions {\n /**\n * When `true` the regexp will be case sensitive. (default: `false`)\n */\n sensitive?: boolean;\n /**\n * When `true` the regexp won't allow an optional trailing delimiter to match. (default: `false`)\n */\n strict?: boolean;\n /**\n * When `true` the regexp will match to the end of the string. (default: `true`)\n */\n end?: boolean;\n /**\n * When `true` the regexp will match from the beginning of the string. (default: `true`)\n */\n start?: boolean;\n /**\n * Sets the final character for non-ending optimistic matches. (default: `/`)\n */\n delimiter?: string;\n /**\n * List of characters that can also be \"end\" characters.\n */\n endsWith?: string;\n /**\n * Encode path tokens for use in the `RegExp`.\n */\n encode?: (value: string) => string;\n}\n\n/**\n * Expose a function for taking tokens and returning a RegExp.\n */\nexport function tokensToRegexp(\n tokens: Token[],\n keys?: Key[],\n options: TokensToRegexpOptions = {},\n) {\n const {\n strict = false,\n start = true,\n end = true,\n encode = (x: string) => x,\n delimiter = \"/#?\",\n endsWith = \"\",\n } = options;\n const endsWithRe = `[${escapeString(endsWith)}]|$`;\n const delimiterRe = `[${escapeString(delimiter)}]`;\n let route = start ? \"^\" : \"\";\n\n // Iterate over the tokens and create our regexp string.\n for (const token of tokens) {\n if (typeof token === \"string\") {\n route += escapeString(encode(token));\n } else {\n const prefix = escapeString(encode(token.prefix));\n const suffix = escapeString(encode(token.suffix));\n\n if (token.pattern) {\n if (keys) keys.push(token);\n\n if (prefix || suffix) {\n if (token.modifier === \"+\" || token.modifier === \"*\") {\n const mod = token.modifier === \"*\" ? \"?\" : \"\";\n route += `(?:${prefix}((?:${token.pattern})(?:${suffix}${prefix}(?:${token.pattern}))*)${suffix})${mod}`;\n } else {\n route += `(?:${prefix}(${token.pattern})${suffix})${token.modifier}`;\n }\n } else {\n if (token.modifier === \"+\" || token.modifier === \"*\") {\n throw new TypeError(\n `Can not repeat \"${token.name}\" without a prefix and suffix`,\n );\n }\n\n route += `(${token.pattern})${token.modifier}`;\n }\n } else {\n route += `(?:${prefix}${suffix})${token.modifier}`;\n }\n }\n }\n\n if (end) {\n if (!strict) route += `${delimiterRe}?`;\n\n route += !options.endsWith ? \"$\" : `(?=${endsWithRe})`;\n } else {\n const endToken = tokens[tokens.length - 1];\n const isEndDelimited =\n typeof endToken === \"string\"\n ? delimiterRe.indexOf(endToken[endToken.length - 1]) > -1\n : endToken === undefined;\n\n if (!strict) {\n route += `(?:${delimiterRe}(?=${endsWithRe}))?`;\n }\n\n if (!isEndDelimited) {\n route += `(?=${delimiterRe}|${endsWithRe})`;\n }\n }\n\n return new RegExp(route, flags(options));\n}\n\n/**\n * Supported `path-to-regexp` input types.\n */\nexport type Path = string | RegExp | Array<string | RegExp>;\n\n/**\n * Normalize the given path string, returning a regular expression.\n *\n * An empty array can be passed in for the keys, which will hold the\n * placeholder key descriptions. For example, using `/user/:id`, `keys` will\n * contain `[{ name: 'id', delimiter: '/', optional: false, repeat: false }]`.\n */\nexport function pathToRegexp(\n path: Path,\n keys?: Key[],\n options?: TokensToRegexpOptions & ParseOptions,\n) {\n if (path instanceof RegExp) return regexpToRegexp(path, keys);\n if (Array.isArray(path)) return arrayToRegexp(path, keys, options);\n return stringToRegexp(path, keys, options);\n}\n", "import { isDefined } from '@nordcraft/core/dist/utils/util'\nimport { compile } from 'path-to-regexp'\nimport type { Location } from '../types'\n\nexport const getLocationUrl = ({\n query,\n page,\n route,\n params,\n hash,\n}: Location) => {\n let path: string\n if (route) {\n const pathSegments: string[] = []\n for (const segment of route.path) {\n if (segment.type === 'static') {\n pathSegments.push(segment.name)\n } else {\n const segmentValue = params[segment.name]\n if (isDefined(segmentValue)) {\n pathSegments.push(segmentValue)\n } else {\n // If a param is missing, we can't build the rest of the path\n break\n }\n }\n }\n path = '/' + pathSegments.join('/')\n } else {\n path = compile(page as string, { encode: encodeURIComponent })(params)\n }\n const hashString = hash === undefined || hash === '' ? '' : '#' + hash\n const queryString = Object.entries(query)\n .filter(([_, q]) => q !== null)\n .map(([key, value]) => {\n return `${encodeURIComponent(\n route?.query[key]?.name ?? key,\n )}=${encodeURIComponent(String(value))}`\n })\n .join('&')\n\n return `${path}${hashString}${\n queryString.length > 0 ? '?' + queryString : ''\n }`\n}\n", "/* eslint-disable @typescript-eslint/no-floating-promises */\nimport type { LegacyComponentAPI } from '@nordcraft/core/dist/api/apiTypes'\nimport { mapHeadersToObject } from '@nordcraft/core/dist/api/headers'\nimport type { ComponentData } from '@nordcraft/core/dist/component/component.types'\nimport { applyFormula, isFormula } from '@nordcraft/core/dist/formula/formula'\nimport type { Nullable } from '@nordcraft/core/dist/types'\nimport { mapValues } from '@nordcraft/core/dist/utils/collections'\nimport { parseJSONWithDate } from '@nordcraft/core/dist/utils/json'\nimport { handleAction } from '../events/handleAction'\nimport type { Signal } from '../signal/signal'\nimport type { ComponentContext } from '../types'\n\nexport type ApiRequest = {\n url: string\n method: 'GET' | 'POST' | 'DELETE' | 'PUT' | 'OPTION' | 'HEAD'\n auth: Nullable<{ type: string }>\n headers: Record<string, string>\n body: any\n}\n\n/**\n * Set up an api for a component.\n * API requests are either proxied through toddle's back-end\n * or sent directly to the api endpoint (when api.proxy === false)\n */\nexport function createLegacyAPI(\n api: LegacyComponentAPI,\n ctx: ComponentContext,\n) {\n let timer: any = null\n\n // Create the payload we send to toddle's back-end\n // This includes url, headers, and content, sent in the body of a post request to /_query/<ComponentName>.<QueryName>\n function constructPayload(\n api: LegacyComponentAPI,\n data: ComponentData,\n ): ApiRequest {\n const formulaContext = {\n data,\n component: ctx.component,\n formulaCache: ctx.formulaCache,\n root: ctx.root,\n package: ctx.package,\n toddle: ctx.toddle,\n env: ctx.env,\n }\n\n // construct the url\n const baseUrl = applyFormula(api.url, formulaContext) ?? ''\n const urlPath =\n api.path && api.path.length > 0\n ? '/' +\n api.path.map((p) => applyFormula(p.formula, formulaContext)).join('/')\n : ''\n\n // build querystring\n const queryParams = Object.values(api.queryParams ?? {})\n const queryString =\n queryParams.length > 0\n ? '?' +\n queryParams\n .map(\n (param) =>\n `${param.name}=${encodeURIComponent(\n applyFormula(param.formula, formulaContext),\n )}`,\n )\n .join('&')\n : ''\n const headers = isFormula(api.headers) // this is supporting a few legacy cases where the whole header object was set as a formula. This is no longer possible\n ? applyFormula(api.headers, {\n data,\n component: ctx.component,\n formulaCache: ctx.formulaCache,\n root: ctx.root,\n package: ctx.package,\n toddle: ctx.toddle,\n env: ctx.env,\n })\n : mapValues(api.headers ?? {}, (value) =>\n applyFormula(value, {\n data,\n component: ctx.component,\n formulaCache: ctx.formulaCache,\n root: ctx.root,\n package: ctx.package,\n toddle: ctx.toddle,\n env: ctx.env,\n }),\n )\n const contentType = String(\n Object.entries(headers).find(\n ([key]) => key.toLocaleLowerCase() === 'content-type',\n )?.[1],\n )\n const method = api.method ?? 'GET'\n const body =\n api.body && ['POST', 'PUT', 'PATCH', 'DELETE'].includes(method)\n ? encodeBody(\n applyFormula(api.body, {\n data,\n component: ctx.component,\n formulaCache: ctx.formulaCache,\n root: ctx.root,\n package: ctx.package,\n toddle: ctx.toddle,\n env: ctx.env,\n }),\n contentType,\n )\n : undefined\n return {\n url: baseUrl + urlPath + queryString,\n method,\n auth: api.auth,\n headers,\n body,\n }\n }\n\n // extract the response body\n async function getBody(res: Response) {\n const textBody = await res.text()\n try {\n return parseJSONWithDate(textBody)\n } catch {\n return textBody\n }\n }\n\n function encodeBody(body: any, contentType?: string): FormData | string {\n switch (contentType) {\n case 'application/x-www-form-urlencoded': {\n if (typeof body === 'object' && body !== null) {\n return Object.entries(body)\n .map(([key, value]) => {\n if (Array.isArray(value)) {\n return value\n .map(\n (v) =>\n `${encodeURIComponent(key)}=${encodeURIComponent(v)}`,\n )\n .join('&')\n } else {\n return `${encodeURIComponent(key)}=${encodeURIComponent(\n String(value),\n )}`\n }\n })\n .join('&')\n }\n return ''\n }\n case 'multipart/form-data': {\n const formData = new FormData()\n if (typeof body === 'object' && body !== null) {\n Object.entries(body).forEach(([key, value]) => {\n formData.set(key, value as string | Blob)\n })\n }\n return formData\n }\n case 'text/plain':\n return String(body)\n default:\n return JSON.stringify(body)\n }\n }\n\n function apiSuccess(data: any) {\n ctx.dataSignal.set({\n ...ctx.dataSignal.get(),\n Apis: {\n ...ctx.dataSignal.get().Apis,\n [api.name]: {\n data,\n error: null,\n isLoading: false,\n },\n },\n })\n api.onCompleted?.actions?.forEach((action) => {\n handleAction(action, ctx.dataSignal.get(), ctx)\n })\n }\n\n function apiError(error: any) {\n ctx.dataSignal.set({\n ...ctx.dataSignal.get(),\n Apis: {\n ...ctx.dataSignal.get().Apis,\n [api.name]: {\n data: null,\n isLoading: false,\n error: error,\n },\n },\n })\n api.onFailed?.actions?.forEach((action) => {\n handleAction(action, ctx.dataSignal.get(), ctx)\n })\n }\n\n // Execute the request to the cloudflare Query proxy\n async function execute(payload: ApiRequest) {\n ctx.dataSignal.set({\n ...ctx.dataSignal.get(),\n Apis: {\n ...ctx.dataSignal.get().Apis,\n [api.name]: {\n data: ctx.dataSignal.get().Apis?.[api.name]?.data ?? null,\n isLoading: true,\n error: null,\n },\n },\n })\n let response\n\n try {\n if (api.proxy === false) {\n response = await fetch(payload.url, {\n method: payload.method,\n headers: payload.headers,\n body: payload.body,\n })\n } else {\n response = await fetch(\n `/_query/${encodeURIComponent(\n ctx.component.name,\n )}.${encodeURIComponent(api.name)}`,\n {\n method: 'POST',\n body: JSON.stringify(payload),\n signal: ctx.abortSignal,\n headers: {\n 'Content-Type': 'application/json',\n },\n },\n )\n }\n const data = await getBody(response)\n if (response.ok) {\n apiSuccess(data)\n } else {\n throw data\n }\n } catch (error: any) {\n apiError(error)\n return Promise.reject(error)\n }\n }\n\n // Handles throttle and debounce if set.\n function trigger(body: ApiRequest) {\n if (typeof api.debounce === 'number') {\n return new Promise((resolve, reject) => {\n if (typeof timer === 'number') {\n clearTimeout(timer)\n }\n timer = setTimeout(() => {\n execute(body).then(resolve, reject)\n }, api.debounce as number)\n })\n } else if (typeof api.throttle === 'number') {\n if (typeof timer === 'number') {\n return new Promise(() => {})\n }\n timer = setTimeout(() => {\n if (typeof timer === 'number') {\n clearTimeout(timer)\n }\n }, api.throttle)\n return execute(body)\n } else {\n return execute(body)\n }\n }\n\n let payloadSignal: Signal<ApiRequest> | undefined\n ctx.dataSignal.update((data) => {\n return {\n ...data,\n Apis: {\n ...(data.Apis ?? {}),\n [api.name]: data.Apis?.[api.name] ?? {\n data: null,\n isLoading:\n api.autoFetch &&\n applyFormula(api.autoFetch, {\n data: ctx.dataSignal.get(),\n component: ctx.component,\n formulaCache: ctx.formulaCache,\n root: ctx.root,\n package: ctx.package,\n toddle: ctx.toddle,\n env: ctx.env,\n })\n ? true\n : false,\n error: null,\n },\n },\n }\n })\n if (api.autoFetch) {\n payloadSignal = ctx.dataSignal.map((data) => constructPayload(api, data))\n let firstRun = true\n payloadSignal.subscribe((body) => {\n if (\n api.autoFetch &&\n applyFormula(api.autoFetch, {\n data: ctx.dataSignal.get(),\n component: ctx.component,\n formulaCache: ctx.formulaCache,\n root: ctx.root,\n package: ctx.package,\n toddle: ctx.toddle,\n env: ctx.env,\n })\n ) {\n // We should only lookup cached data for pages since\n // we don't fetch data for component APIs during SSR\n if (firstRun && ctx.isRootComponent) {\n firstRun = false\n const cached = ctx.toddle?.pageState?.Apis?.[api.name]\n if (cached && cached.data) {\n if (typeof cached.data === 'string') {\n // Mimic the behavior from getBody and parse\n // the response to JSON if possible\n apiSuccess(parseJSONWithDate(cached.data))\n } else {\n apiSuccess(cached.data)\n }\n } else {\n trigger(body)\n }\n } else {\n trigger(body)\n }\n }\n })\n }\n return {\n fetch: (request?: ApiRequest) => {\n const apiPayload = constructPayload(api, ctx.dataSignal.get())\n let body = apiPayload.body\n // Use a Headers object since it's case insensitive\n const headers = new Headers({\n ...apiPayload.headers,\n ...(request?.headers ?? {}),\n })\n if (request?.body) {\n body = encodeBody(\n request.body,\n headers.get('Content-Type') ?? undefined,\n )\n }\n if (body instanceof FormData) {\n // Remove content type header if body is a FormData object\n // Otherwise fetch won't do its magic when sending the request\n headers.delete('Content-Type')\n }\n const payload: ApiRequest = {\n url: request?.url ?? apiPayload.url,\n method: request?.method ?? apiPayload.method,\n auth: request?.auth ?? apiPayload.auth,\n headers: mapHeadersToObject(headers),\n body,\n }\n return trigger(payload)\n },\n destroy: () => payloadSignal?.destroy(),\n }\n}\n", "const LOCALHOSTS = ['http://localhost:54404', 'http://preview.localhost:54404']\n\nexport const isLocalhostUrl = (hrefOrOrigin: string) =>\n LOCALHOSTS.some((host) => hrefOrOrigin.startsWith(host))\n\nexport const isLocalhostHostname = (hostname: string) =>\n hostname === 'localhost' || hostname === '127.0.0.1'\n\nexport const validateUrl = ({\n path,\n origin,\n}: {\n path: string | null | undefined\n origin: string | undefined\n}) => {\n if (typeof path !== 'string') {\n return false\n }\n try {\n const urlObject = new URL(path, origin)\n // Creating a new URL object will not correctly encode the search params\n // So we need to iterate over them to make sure they are encoded as that happens when setting them explicitly\n const searchCopy = new URLSearchParams(urlObject.searchParams)\n searchCopy.forEach((value, key) => {\n urlObject.searchParams.delete(key, value)\n })\n searchCopy.forEach((value, key) => {\n urlObject.searchParams.append(key, value)\n })\n return urlObject\n } catch {\n return false\n }\n}\n\nexport const PROXY_URL_HEADER = 'x-nordcraft-url'\n\nexport const PROXY_TEMPLATES_IN_BODY = 'x-nordcraft-templates-in-body'\n\nexport const REWRITE_HEADER = 'x-nordcraft-rewrite'\n", "/* eslint-disable @typescript-eslint/no-floating-promises */\nimport {\n createApiEvent,\n createApiRequest,\n isApiError,\n requestHash,\n} from '@nordcraft/core/dist/api/api'\nimport type {\n ApiPerformance,\n ApiRequest,\n ApiStatus,\n ToddleRequestInit,\n} from '@nordcraft/core/dist/api/apiTypes'\nimport {\n isEventStreamHeader,\n isImageHeader,\n isJsonHeader,\n isJsonStreamHeader,\n isTextHeader,\n mapHeadersToObject,\n} from '@nordcraft/core/dist/api/headers'\nimport type { ComponentData } from '@nordcraft/core/dist/component/component.types'\nimport type {\n Formula,\n FormulaContext,\n} from '@nordcraft/core/dist/formula/formula'\nimport { applyFormula } from '@nordcraft/core/dist/formula/formula'\nimport type { NestedOmit, Nullable } from '@nordcraft/core/dist/types'\nimport {\n omitPaths,\n sortObjectEntries,\n} from '@nordcraft/core/dist/utils/collections'\nimport {\n PROXY_TEMPLATES_IN_BODY,\n PROXY_URL_HEADER,\n validateUrl,\n} from '@nordcraft/core/dist/utils/url'\nimport { isDefined, toBoolean } from '@nordcraft/core/dist/utils/util'\nimport { handleAction } from '../events/handleAction'\nimport type { Signal } from '../signal/signal'\nimport type { ComponentContext, ContextApiV2 } from '../types'\n\n/**\n * Set up an api v2 for a component.\n */\nexport function createAPI({\n apiRequest,\n componentData: initialComponentData,\n ctx,\n}: {\n apiRequest: ApiRequest\n componentData: ComponentData\n ctx: ComponentContext\n}): ContextApiV2 {\n // If `__toddle` isn't found it is in a web component context. We behave as if the page isn't loaded.\n let timer: any = null\n let api = { ...apiRequest }\n\n function constructRequest(\n api: ApiRequest,\n componentData: ComponentData,\n ): ReturnType<typeof createApiRequest> {\n // Get baseUrl and validate it. (It wont be in web component context)\n let baseUrl: string | undefined = window.origin\n try {\n new URL(baseUrl)\n } catch {\n baseUrl = undefined\n }\n\n const request = createApiRequest({\n api,\n formulaContext: getFormulaContext(api, componentData),\n baseUrl,\n defaultHeaders: undefined,\n })\n return {\n ...request,\n requestSettings: {\n ...request.requestSettings,\n // credentials is a browser specific setting and cannot be set in the\n // createApiRequest function directly as it's shared between server and client\n credentials:\n api.client?.credentials &&\n ['include', 'same-origin', 'omit'].includes(api.client.credentials)\n ? api.client.credentials\n : // Default to same-origin\n undefined,\n },\n }\n }\n\n // Create the formula context for the api\n function getFormulaContext(\n api: ApiRequest,\n componentData: ComponentData | undefined,\n ): FormulaContext {\n // Use the general formula context to evaluate the arguments of the api\n const formulaContext = {\n data: ctx.dataSignal.get(),\n component: ctx.component,\n formulaCache: ctx.formulaCache,\n root: ctx.root,\n package: ctx.package,\n toddle: ctx.toddle,\n env: ctx.env,\n }\n\n // Make sure inputs are also available in the formula context\n const evaluatedInputs = Object.entries(api.inputs).reduce<\n Record<string, unknown>\n >((acc, [key, value]) => {\n acc[key] = applyFormula(value.formula, formulaContext)\n return acc\n }, {})\n\n const data = {\n ...componentData,\n ...formulaContext.data,\n ApiInputs: {\n ...evaluatedInputs,\n },\n }\n\n return {\n component: ctx.component,\n formulaCache: ctx.formulaCache,\n root: ctx.root,\n package: ctx.package,\n data,\n toddle: ctx.toddle,\n env: ctx.env,\n }\n }\n\n function handleRedirectRules(api: ApiRequest, componentData: ComponentData) {\n for (const [ruleName, rule] of sortObjectEntries(\n api.redirectRules ?? {},\n ([_, rule]) => rule.index,\n )) {\n const formulaContext = getFormulaContext(api, componentData)\n const location = applyFormula(rule.formula, {\n ...formulaContext,\n data: {\n ...formulaContext.data,\n Apis: {\n [api.name]: ctx.dataSignal.get().Apis?.[api.name] as ApiStatus,\n },\n },\n })\n if (typeof location === 'string') {\n const url = validateUrl({\n path: location,\n origin: window.location.origin,\n })\n if (url) {\n if (ctx.env.runtime === 'preview') {\n // Attempt to notify the parent about the failed navigation attempt\n window.parent?.postMessage(\n { type: 'blockedNavigation', url: url.href },\n '*',\n )\n return { name: ruleName, index: rule.index, url }\n } else {\n window.location.replace(url.href)\n }\n }\n }\n }\n }\n\n function triggerActions({\n eventName,\n api,\n data,\n componentData,\n workflowCallback,\n }: {\n eventName: 'message' | 'success' | 'failed'\n api: ApiRequest\n data: {\n body: unknown\n status?: Nullable<number>\n headers?: Nullable<Record<string, string>>\n }\n componentData: ComponentData\n workflowCallback?: (event: string, data: unknown) => void\n }) {\n switch (eventName) {\n case 'message': {\n const event = createApiEvent('message', data.body)\n api.client?.onMessage?.actions?.forEach((action) => {\n handleAction(\n action,\n {\n ...getFormulaContext(api, componentData).data,\n Event: event,\n },\n ctx,\n event,\n workflowCallback,\n )\n })\n break\n }\n case 'success': {\n const event = createApiEvent('success', data.body)\n api.client?.onCompleted?.actions?.forEach((action) => {\n handleAction(\n action,\n {\n ...getFormulaContext(api, componentData).data,\n Event: event,\n },\n ctx,\n event,\n workflowCallback,\n )\n })\n break\n }\n case 'failed': {\n const event = createApiEvent('failed', {\n error: data.body,\n status: data.status,\n })\n api.client?.onFailed?.actions?.forEach((action) => {\n handleAction(\n action,\n {\n ...getFormulaContext(api, componentData).data,\n Event: event,\n },\n ctx,\n event,\n workflowCallback,\n )\n })\n break\n }\n }\n }\n\n function apiSuccess({\n api,\n componentData,\n data,\n performance,\n }: {\n api: ApiRequest\n componentData: ComponentData\n data: {\n body: unknown\n status?: Nullable<number>\n headers?: Nullable<Record<string, string>>\n }\n performance: ApiPerformance\n }) {\n const latestRequestStart =\n ctx.dataSignal.get().Apis?.[api.name]?.response?.performance?.requestStart\n if (\n typeof latestRequestStart === 'number' &&\n latestRequestStart > (performance.requestStart ?? 0)\n ) {\n return\n }\n\n ctx.dataSignal.set({\n ...ctx.dataSignal.get(),\n Apis: {\n ...ctx.dataSignal.get().Apis,\n [api.name]: {\n isLoading: false,\n data: data.body,\n error: null,\n response: {\n status: data.status,\n headers: data.headers,\n performance,\n },\n },\n },\n })\n const appliedRedirectRule = handleRedirectRules(api, componentData)\n if (appliedRedirectRule) {\n ctx.dataSignal.set({\n ...ctx.dataSignal.get(),\n Apis: {\n ...ctx.dataSignal.get().Apis,\n [api.name]: {\n isLoading: false,\n data: data.body,\n error: null,\n response: {\n status: data.status,\n headers: data.headers,\n performance,\n ...(ctx.env.runtime === 'preview'\n ? { debug: { appliedRedirectRule } }\n : {}),\n },\n },\n },\n })\n }\n }\n\n function apiError({\n api,\n componentData,\n data,\n performance,\n }: {\n api: ApiRequest\n componentData: ComponentData\n data: {\n body: unknown\n status?: Nullable<number>\n headers?: Nullable<Record<string, string>>\n }\n performance: ApiPerformance\n }) {\n const latestRequestStart =\n ctx.dataSignal.get().Apis?.[api.name]?.response?.performance?.requestStart\n if (\n typeof latestRequestStart === 'number' &&\n latestRequestStart > (performance.requestStart ?? 0)\n ) {\n return\n }\n ctx.dataSignal.set({\n ...ctx.dataSignal.get(),\n Apis: {\n ...ctx.dataSignal.get().Apis,\n [api.name]: {\n isLoading: false,\n data: null,\n error: data.body,\n response: {\n status: data.status,\n headers: data.headers,\n performance,\n },\n },\n },\n })\n const appliedRedirectRule = handleRedirectRules(api, componentData)\n if (appliedRedirectRule) {\n ctx.dataSignal.set({\n ...ctx.dataSignal.get(),\n Apis: {\n ...ctx.dataSignal.get().Apis,\n [api.name]: {\n isLoading: false,\n data: null,\n error: data.body,\n response: {\n status: data.status,\n headers: data.headers,\n performance,\n ...(ctx.env.runtime === 'preview'\n ? { debug: { appliedRedirectRule } }\n : {}),\n },\n },\n },\n })\n }\n }\n\n // Execute the request - potentially to the cloudflare Query proxy\n async function execute({\n api,\n url,\n requestSettings,\n componentData,\n workflowCallback,\n }: {\n api: ApiRequest\n url: URL\n requestSettings: ToddleRequestInit\n componentData: ComponentData\n workflowCallback?: (event: string, data: unknown) => void\n }) {\n const run = async () => {\n const performance: ApiPerformance = {\n requestStart: Date.now(),\n responseStart: null,\n responseEnd: null,\n }\n ctx.dataSignal.set({\n ...ctx.dataSignal.get(),\n Apis: {\n ...ctx.dataSignal.get().Apis,\n [api.name]: {\n isLoading: true,\n data: ctx.dataSignal.get().Apis?.[api.name]?.data ?? null,\n error: null,\n },\n },\n })\n let response\n\n try {\n const proxy = api.server?.proxy\n ? (applyFormula(\n api.server.proxy.enabled.formula,\n getFormulaContext(api, componentData),\n ) ?? false)\n : false\n\n if (proxy === false) {\n response = await fetch(url, requestSettings)\n } else {\n const proxyUrl = `/.toddle/omvej/components/${encodeURIComponent(\n ctx.component.name,\n )}/apis/${encodeURIComponent(\n ctx.component.name,\n )}:${encodeURIComponent(api.name)}`\n const headers = new Headers(requestSettings.headers)\n headers.set(\n PROXY_URL_HEADER,\n decodeURIComponent(url.href.replace(/\\+/g, ' ')),\n )\n const allowBodyTemplateValues = toBoolean(\n applyFormula(\n api.server?.proxy?.useTemplatesInBody?.formula,\n getFormulaContext(api, componentData),\n ),\n )\n if (allowBodyTemplateValues) {\n headers.set(PROXY_TEMPLATES_IN_BODY, 'true')\n }\n requestSettings.headers = headers\n response = await fetch(proxyUrl, requestSettings)\n }\n\n performance.responseStart = Date.now()\n await handleResponse({\n api,\n componentData,\n res: response,\n performance,\n workflowCallback,\n })\n return\n } catch (error: any) {\n const body = error.cause\n ? { message: error.message, data: error.cause }\n : error.message\n apiError({\n api,\n componentData,\n data: { body },\n performance: { ...performance, responseEnd: Date.now() },\n })\n triggerActions({\n eventName: 'failed',\n api,\n data: { body },\n componentData,\n workflowCallback,\n })\n return Promise.reject(error)\n }\n }\n\n // Debounce the request if needed\n if (api.client?.debounce?.formula) {\n return new Promise((resolve, reject) => {\n if (typeof timer === 'number') {\n clearTimeout(timer)\n }\n timer = setTimeout(\n () => {\n run().then(resolve, reject)\n },\n applyFormula(\n api.client?.debounce?.formula,\n getFormulaContext(api, componentData),\n ),\n )\n })\n }\n\n return run()\n }\n\n function handleResponse({\n api,\n componentData,\n res,\n performance,\n workflowCallback,\n }: {\n api: ApiRequest\n componentData: ComponentData\n res: Response\n performance: ApiPerformance\n workflowCallback?: (event: string, data: unknown) => void\n }) {\n let parserMode = api.client?.parserMode ?? 'auto'\n\n if (parserMode === 'auto') {\n const contentType = res.headers.get('content-type')\n if (isEventStreamHeader(contentType)) {\n parserMode = 'event-stream'\n } else if (isJsonHeader(contentType)) {\n parserMode = 'json'\n } else if (isTextHeader(contentType)) {\n parserMode = 'text'\n } else if (isJsonStreamHeader(contentType)) {\n parserMode = 'json-stream'\n } else if (isImageHeader(contentType)) {\n parserMode = 'blob'\n } else {\n parserMode = 'text'\n }\n }\n\n switch (parserMode) {\n case 'text':\n return textStreamResponse({\n api,\n componentData,\n res,\n performance,\n workflowCallback,\n })\n case 'json':\n return jsonResponse({\n api,\n componentData,\n res,\n performance,\n workflowCallback,\n })\n case 'event-stream':\n return eventStreamingResponse({\n api,\n componentData,\n res,\n performance,\n workflowCallback,\n })\n case 'json-stream':\n return jsonStreamResponse({\n api,\n componentData,\n res,\n performance,\n workflowCallback,\n })\n case 'blob':\n return blobResponse({\n api,\n componentData,\n res,\n performance,\n workflowCallback,\n })\n default:\n return textStreamResponse({\n api,\n componentData,\n res,\n performance,\n workflowCallback,\n })\n }\n }\n\n function textStreamResponse({\n api,\n res,\n performance,\n componentData,\n workflowCallback,\n }: {\n api: ApiRequest\n res: Response\n performance: ApiPerformance\n componentData: ComponentData\n workflowCallback?: (event: string, data: unknown) => void\n }) {\n return handleStreaming({\n api,\n res,\n performance,\n streamType: 'text',\n useTextDecoder: true,\n parseChunk: (chunk) => chunk,\n parseChunksForData: (chunks) => chunks.join(''),\n componentData,\n workflowCallback,\n })\n }\n\n function jsonStreamResponse({\n api,\n res,\n performance,\n componentData,\n workflowCallback,\n }: {\n api: ApiRequest\n res: Response\n performance: ApiPerformance\n componentData: ComponentData\n workflowCallback?: (event: string, data: unknown) => void\n }) {\n const parseChunk = (chunk: any) => {\n let parsedData = chunk\n try {\n parsedData = JSON.parse(chunk)\n } catch {\n throw new Error('Error occurred while parsing the json chunk.', {\n cause: parsedData,\n })\n }\n return parsedData\n }\n\n return handleStreaming({\n api,\n res,\n performance,\n streamType: 'json',\n useTextDecoder: true,\n parseChunk,\n parseChunksForData: (chunks) => [...chunks],\n delimiters: ['\\r\\n', '\\n'],\n componentData,\n workflowCallback,\n })\n }\n\n async function jsonResponse({\n api,\n componentData,\n res,\n performance,\n workflowCallback,\n }: {\n api: ApiRequest\n componentData: ComponentData\n res: Response\n performance: ApiPerformance\n workflowCallback?: (event: string, data: unknown) => void\n }) {\n const body = await res.json()\n\n const status: ApiStatus = {\n data: body,\n isLoading: false,\n error: null,\n response: {\n status: res.status,\n headers: mapHeadersToObject(res.headers),\n },\n }\n return endResponse({\n api,\n apiStatus: status,\n componentData,\n performance,\n workflowCallback,\n })\n }\n\n async function blobResponse({\n api,\n componentData,\n res,\n performance,\n workflowCallback,\n }: {\n api: ApiRequest\n componentData: ComponentData\n res: Response\n performance: ApiPerformance\n workflowCallback?: (event: string, data: unknown) => void\n }) {\n const blob = await res.blob()\n\n const status: ApiStatus = {\n isLoading: false,\n data: URL.createObjectURL(blob),\n error: null,\n response: {\n status: res.status,\n headers: mapHeadersToObject(res.headers),\n },\n }\n return endResponse({\n api,\n apiStatus: status,\n componentData,\n performance,\n workflowCallback,\n })\n }\n\n function eventStreamingResponse({\n api,\n res,\n performance,\n componentData,\n workflowCallback,\n }: {\n api: ApiRequest\n res: Response\n performance: ApiPerformance\n componentData: ComponentData\n workflowCallback?: (event: string, data: unknown) => void\n }) {\n const parseChunk = (chunk: string) => {\n const event = chunk.match(/event: (.*)/)?.[1] ?? 'message'\n const data = chunk.match(/data: (.*)/)?.[1] ?? ''\n const id = chunk.match(/id: (.*)/)?.[1]\n const retry = chunk.match(/retry: (.*)/)?.[1]\n\n let parsedData = data\n try {\n parsedData = JSON.parse(data ?? '')\n // eslint-disable-next-line no-empty\n } catch {}\n const returnData = {\n event,\n data: parsedData,\n ...(id ? { id } : {}),\n ...(retry ? { retry } : {}),\n }\n return returnData\n }\n return handleStreaming({\n api,\n res,\n performance,\n streamType: 'event',\n useTextDecoder: true,\n parseChunk,\n parseChunksForData: (chunks) => [...chunks],\n delimiters: ['\\n\\n', '\\r\\n\\r\\n'],\n componentData,\n workflowCallback,\n })\n }\n\n async function handleStreaming({\n api,\n res,\n performance,\n streamType,\n useTextDecoder,\n parseChunk,\n parseChunksForData,\n delimiters, // There can be various delimiters for the same stream. SSE might use both \\n\\n and \\r\\n\\r\\n,\n componentData,\n workflowCallback,\n }: {\n api: ApiRequest\n res: Response\n performance: ApiPerformance\n streamType: 'json' | 'text' | 'event'\n useTextDecoder: boolean\n parseChunk: (chunk: any) => any\n parseChunksForData: (chunks: any[]) => any\n delimiters?: string[]\n componentData: ComponentData\n workflowCallback?: (event: string, data: unknown) => void\n }) {\n const chunks: {\n chunks: any[]\n currentChunk: string\n add(chunk: string | Uint8Array): void\n processChunk(chunk: string | Uint8Array): void\n } = {\n chunks: [],\n currentChunk: '',\n // Function to add a chunk to the chunks array and emits the data to the onMessage event\n add(chunk: string | Uint8Array) {\n const parsedChunk = parseChunk(chunk)\n this.chunks.push(parsedChunk)\n // Only emit the data if there are any listeners\n if (parsedChunk) {\n ctx.dataSignal.set({\n ...ctx.dataSignal.get(),\n Apis: {\n ...ctx.dataSignal.get().Apis,\n [api.name]: {\n isLoading: true,\n data: parseChunksForData(this.chunks),\n error: null,\n response: {\n headers: mapHeadersToObject(res.headers),\n },\n },\n },\n })\n if ((api.client?.onMessage?.actions ?? []).length > 0) {\n triggerActions({\n eventName: 'message',\n api,\n data: { body: parsedChunk },\n componentData,\n workflowCallback,\n })\n }\n }\n },\n\n // Function to process a chunk and split it by the delimiter.\n processChunk(chunk: any) {\n const delimiter = delimiters?.find((d) => chunk.includes(d))\n const concatenated = this.currentChunk + chunk\n const split = delimiter ? concatenated.split(delimiter) : [concatenated]\n this.currentChunk = split.pop() ?? ''\n split.forEach((c) => this.add(c))\n },\n }\n\n const reader = useTextDecoder\n ? res.body?.pipeThrough(new TextDecoderStream()).getReader()\n : res.body?.getReader()\n\n while (reader) {\n const { done, value } = await reader.read()\n if (done) {\n break\n }\n\n if (delimiters) {\n chunks.processChunk(value)\n } else {\n chunks.add(value)\n }\n }\n\n // First make sure theres no remaining chunk\n if (chunks.currentChunk) {\n chunks.add(chunks.currentChunk)\n }\n\n const status: ApiStatus = {\n isLoading: false,\n data: chunks.chunks,\n error: null,\n response: {\n status: res.status,\n headers: mapHeadersToObject(res.headers),\n },\n }\n\n try {\n if (streamType === 'json') {\n const parsed = JSON.parse(chunks.chunks.join(''))\n status.data = parsed\n } else if (streamType === 'text') {\n status.data = chunks.chunks.join('')\n }\n } catch {\n throw new Error('Error occurred while parsing the json chunk.', {\n cause: chunks.chunks.join(''),\n })\n }\n return endResponse({\n api,\n apiStatus: status,\n componentData,\n performance,\n workflowCallback,\n })\n }\n\n function endResponse({\n api,\n apiStatus,\n componentData,\n performance,\n workflowCallback,\n }: {\n api: ApiRequest\n apiStatus: ApiStatus\n componentData: ComponentData\n performance: ApiPerformance\n workflowCallback?: (event: string, data: unknown) => void\n }) {\n performance.responseEnd = Date.now()\n\n const data = {\n body: apiStatus.data,\n status: apiStatus.response?.status,\n headers: apiStatus.response?.headers ?? undefined,\n }\n\n const isError = isApiError({\n apiName: api.name,\n response: {\n body: data.body,\n ok: Boolean(\n !apiStatus.error &&\n apiStatus.response?.status &&\n apiStatus.response.status < 400,\n ),\n status: data.status,\n headers: data.headers,\n },\n formulaContext: getFormulaContext(api, componentData),\n errorFormula: api.isError,\n performance,\n })\n\n if (isError) {\n if (!data.body && apiStatus.error) {\n data.body = apiStatus.error\n }\n\n apiError({ api, componentData, data, performance })\n triggerActions({\n eventName: 'failed',\n api,\n componentData,\n data,\n workflowCallback,\n })\n } else {\n apiSuccess({ api, componentData, data, performance })\n triggerActions({\n eventName: 'success',\n api,\n componentData,\n data,\n workflowCallback,\n })\n }\n }\n\n function getApiForComparison(api: ApiRequest) {\n return omitPaths(api, [\n ['client', 'onCompleted'],\n ['client', 'onFailed'],\n ['client', 'onMessage'],\n ['service'],\n ['server', 'ssr'],\n ]) as NestedOmit<\n ApiRequest,\n | 'client.onCompleted'\n | 'client.onFailed'\n | 'client.onMessage'\n | 'service'\n | 'server.ssr'\n >\n }\n\n let payloadSignal:\n | Signal<{\n request: ReturnType<typeof constructRequest>\n api: ReturnType<typeof getApiForComparison>\n headers: Array<[string, string]>\n // if the evaluated value of autoFetch changes from false -> true, we need to refetch the api\n autoFetch: boolean\n // currently, the proxy setting is always controlled by a \"value formula\", but in case we later\n // open up for controlling it with a dynamic formula, we should also include it here\n proxy: boolean\n }>\n | undefined\n\n // eslint-disable-next-line prefer-const\n payloadSignal = ctx.dataSignal.map((data) => {\n const payloadContext = getFormulaContext(api, data)\n const request = constructRequest(api, data)\n return {\n request,\n api: getApiForComparison(api),\n // Serialize the Headers object to be able to compare changes\n headers: Array.from(request.requestSettings.headers.entries()),\n autoFetch: api.autoFetch\n ? applyFormula(api.autoFetch, payloadContext)\n : false,\n proxy: applyFormula(api.server?.proxy?.enabled.formula, payloadContext),\n }\n })\n payloadSignal.subscribe(async (apiData) => {\n const { url, requestSettings } = apiData.request\n // Ensure we only use caching if the page is currently loading\n const cacheMatch =\n // We lookup the API from cache as long as autofetch is defined (and not statically falsy)\n // since the autofetch formula could've evaluated to true during SSR\n isDefined(api.autoFetch) &&\n (api.autoFetch.type !== 'value' || api.autoFetch.value === true) &&\n (window?.__toddle?.isPageLoaded ?? false) === false\n ? (ctx.toddle.pageState.Apis?.[\n requestHash(url, requestSettings)\n ] as ApiStatus)\n : undefined\n\n if (cacheMatch) {\n if (cacheMatch.error) {\n apiError({\n api,\n data: {\n body: cacheMatch.error,\n status: cacheMatch.response?.status,\n headers: cacheMatch.response?.headers ?? undefined,\n },\n performance: {\n requestStart:\n cacheMatch.response?.performance?.requestStart ?? null,\n responseStart:\n cacheMatch.response?.performance?.responseStart ?? null,\n responseEnd: cacheMatch.response?.performance?.responseEnd ?? null,\n },\n componentData: initialComponentData,\n })\n } else {\n apiSuccess({\n api,\n data: {\n body: cacheMatch.data,\n status: cacheMatch.response?.status,\n headers: cacheMatch.response?.headers ?? undefined,\n },\n performance: {\n requestStart:\n cacheMatch.response?.performance?.requestStart ?? null,\n responseStart:\n cacheMatch.response?.performance?.responseStart ?? null,\n responseEnd: cacheMatch.response?.performance?.responseEnd ?? null,\n },\n componentData: initialComponentData,\n })\n }\n } else {\n if (\n applyFormula(\n api.autoFetch,\n getFormulaContext(api, initialComponentData),\n )\n ) {\n // Execute will set the initial status of the api in the dataSignal\n await execute({\n api,\n url,\n requestSettings,\n componentData: initialComponentData,\n })\n } else if (!ctx.dataSignal.get().Apis?.[api.name]) {\n // If the api is not set in the dataSignal, we need to initialize it.\n // If it is set and autoFetch is false, we do not want to reset it.\n ctx.dataSignal.update((data) => {\n return {\n ...data,\n Apis: {\n ...(data.Apis ?? {}),\n [api.name]: {\n isLoading: false,\n data: null,\n error: null,\n },\n },\n }\n })\n }\n }\n })\n\n return {\n fetch: ({\n actionInputs,\n actionModels,\n componentData,\n workflowCallback,\n }) => {\n // Inputs might already be evaluated. If they are we add them as a value formula to be evaluated later.\n const inputs = Object.entries(actionInputs ?? {}).reduce<\n Record<\n string,\n {\n formula: Formula\n }\n >\n >((acc, [inputName, input]) => {\n if (input !== null && typeof input === 'object' && 'formula' in input) {\n acc[inputName] = input as {\n formula: Formula\n }\n } else {\n acc[inputName] = {\n formula: { type: 'value', value: input },\n }\n }\n return acc\n }, {})\n\n const apiWithInputsAndActions: ApiRequest = {\n ...api,\n inputs: { ...api.inputs, ...inputs },\n client: {\n ...api.client,\n parserMode: api.client?.parserMode ?? 'auto',\n onCompleted: {\n trigger: api.client?.onCompleted?.trigger ?? 'success',\n actions: [\n ...(api.client?.onCompleted?.actions ?? []),\n ...(actionModels?.onCompleted ?? []),\n ],\n },\n onFailed: {\n trigger: api.client?.onFailed?.trigger ?? 'failed',\n actions: [\n ...(api.client?.onFailed?.actions ?? []),\n ...(actionModels?.onFailed ?? []),\n ],\n },\n onMessage: {\n trigger: api.client?.onMessage?.trigger ?? 'message',\n actions: [\n ...(api.client?.onMessage?.actions ?? []),\n ...(actionModels?.onMessage ?? []),\n ],\n },\n },\n }\n\n const { url, requestSettings } = constructRequest(\n apiWithInputsAndActions,\n componentData,\n )\n\n return execute({\n api: apiWithInputsAndActions,\n url,\n requestSettings,\n componentData,\n workflowCallback,\n })\n },\n update: (newApi, componentData) => {\n api = newApi\n const updateContext = getFormulaContext(api, componentData)\n const autoFetch =\n api.autoFetch && applyFormula(api.autoFetch, updateContext)\n if (autoFetch) {\n const request = constructRequest(newApi, componentData)\n payloadSignal?.set({\n request,\n api: getApiForComparison(newApi),\n autoFetch,\n proxy: applyFormula(\n newApi.server?.proxy?.enabled.formula,\n updateContext,\n ),\n // Serialize the Headers object to be able to compare changes\n headers: Array.from(request.requestSettings.headers.entries()),\n })\n }\n },\n triggerActions: (componentData) => {\n const apiData = ctx.dataSignal.get().Apis?.[api.name]\n if (\n apiData === undefined ||\n (apiData.data === null && apiData.error === null)\n ) {\n return\n }\n if (apiData.error) {\n triggerActions({\n eventName: 'failed',\n api,\n data: {\n body: apiData.error,\n status: apiData.response?.status,\n },\n componentData,\n })\n } else {\n triggerActions({\n eventName: 'success',\n api,\n data: {\n body: apiData.data,\n },\n componentData,\n })\n }\n },\n destroy: () => payloadSignal?.destroy(),\n }\n}\n", "import type {\n Component,\n ComponentData,\n SupportedNamespaces,\n} from '@nordcraft/core/dist/component/component.types'\nimport type { ToddleEnv } from '@nordcraft/core/dist/formula/formula'\nimport type { Toddle } from '@nordcraft/core/dist/types'\nimport fastDeepEqual from 'fast-deep-equal'\nimport { handleAction } from '../events/handleAction'\nimport type { Signal } from '../signal/signal'\nimport type {\n ComponentChild,\n ComponentContext,\n ContextApi,\n FormulaCache,\n LocationSignal,\n PreviewShowSignal,\n} from '../types'\nimport { BatchQueue } from '../utils/BatchQueue'\nimport { createNode } from './createNode'\n\ninterface RenderComponentProps {\n component: Component\n components: Component[]\n dataSignal: Signal<ComponentData>\n apis: Record<string, ContextApi>\n abortSignal: AbortSignal\n onEvent: (event: string, data: unknown) => void\n isRootComponent: boolean\n formulaCache: FormulaCache\n path: string\n children: Record<string, Array<ComponentChild>>\n root: Document | ShadowRoot\n providers: Record<\n string,\n {\n component: Component\n formulaDataSignals: Record<string, Signal<ComponentData>>\n ctx: ComponentContext\n }\n >\n package: string | undefined\n parentElement: Element | ShadowRoot\n instance: Record<string, string>\n toddle: Toddle<LocationSignal, PreviewShowSignal>\n namespace?: SupportedNamespaces\n env: ToddleEnv\n}\n\nconst BATCH_QUEUE = new BatchQueue()\n\nexport function renderComponent({\n component,\n dataSignal,\n onEvent,\n isRootComponent,\n path,\n children,\n formulaCache,\n components,\n apis,\n abortSignal,\n root,\n providers,\n package: packageName,\n parentElement,\n instance,\n toddle,\n namespace,\n env,\n}: RenderComponentProps): ReadonlyArray<Element | Text> {\n const ctx: ComponentContext = {\n triggerEvent: onEvent,\n component,\n components,\n dataSignal,\n isRootComponent,\n apis,\n formulaCache,\n children,\n abortSignal,\n root,\n providers,\n package: packageName,\n toddle,\n env,\n }\n\n const rootElem = createNode({\n id: 'root',\n path,\n dataSignal,\n ctx,\n parentElement,\n namespace,\n instance,\n })\n BATCH_QUEUE.add(() => {\n let prev: Record<string, any> | undefined\n if (\n component.onAttributeChange?.actions &&\n component.onAttributeChange.actions.length > 0\n ) {\n dataSignal\n .map((data) => data.Attributes)\n .subscribe((props) => {\n if (prev) {\n component.onAttributeChange?.actions?.forEach((action) => {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n handleAction(\n action,\n dataSignal.get(),\n ctx,\n new CustomEvent('attribute-change', {\n detail: Object.entries(props).reduce(\n (\n changes: Record<string, { current: any; new: any }>,\n [key, value],\n ) => {\n if (\n fastDeepEqual(value, prev![key]) === false &&\n component.attributes?.[key]?.name\n ) {\n changes[component.attributes?.[key]?.name] = {\n current: prev![key],\n new: value,\n }\n }\n return changes\n },\n {},\n ),\n }),\n )\n })\n }\n prev = props\n })\n }\n component.onLoad?.actions?.forEach((action) => {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n handleAction(action, dataSignal.get(), ctx)\n })\n })\n return rootElem\n}\n", "/**\n * A helper class to batch multiple callbacks and process them in a single update step just before the next frame render, but after the current stack.\n * This is more efficient than processing each callback in a separate requestAnimationFrame due to the overhead.\n */\nexport class BatchQueue {\n private batchQueue: Array<() => void> = []\n private isProcessing = false\n private processBatch() {\n if (this.isProcessing) return\n this.isProcessing = true\n\n requestAnimationFrame(() => {\n while (this.batchQueue.length > 0) {\n const callback = this.batchQueue.shift()\n callback?.()\n }\n this.isProcessing = false\n })\n }\n public add(callback: () => void) {\n this.batchQueue.push(callback)\n this.processBatch()\n }\n}\n", "import fastDeepEqual from 'fast-deep-equal'\n\nexport class Signal<T> {\n value: T\n subscribers: Set<{\n notify: (value: T) => void\n destroy?: () => void\n }>\n subscriptions: Array<() => void>\n destroying = false\n\n constructor(value: T) {\n this.value = value\n this.subscribers = new Set()\n this.subscriptions = []\n }\n get() {\n return this.value\n }\n set(value: T) {\n // Short circuit and skip expensive `deepEqual` if there are not currently any subscribers\n if (this.subscribers.size === 0) {\n this.value = value\n return\n }\n\n if (fastDeepEqual(value, this.value) === false) {\n this.value = value\n for (const subscriber of this.subscribers) {\n subscriber.notify(this.value)\n }\n }\n }\n\n update(f: (current: T) => T) {\n this.set(f(this.value))\n }\n subscribe(notify: (value: T) => void, config?: { destroy?: () => void }) {\n const subscriber = { notify, destroy: config?.destroy }\n this.subscribers.add(subscriber)\n notify(this.value)\n return () => {\n this.subscribers.delete(subscriber)\n }\n }\n destroy() {\n // Prevent re-entrancy\n if (this.destroying) {\n return\n }\n\n this.destroying = true\n for (const subscriber of this.subscribers) {\n subscriber.destroy?.()\n }\n this.subscribers.clear()\n for (const subscription of this.subscriptions) {\n subscription()\n }\n this.subscriptions.splice(0, this.subscriptions.length)\n this.destroying = false\n }\n cleanSubscribers() {\n for (const subscriber of this.subscribers) {\n subscriber.destroy?.()\n }\n this.subscribers.clear()\n }\n map<T2>(f: (value: T) => T2): Signal<T2> {\n const signal2 = signal(f(this.value))\n signal2.subscriptions.push(\n this.subscribe((value) => signal2.set(f(value)), {\n destroy: () => signal2.destroy(),\n }),\n )\n return signal2\n }\n}\n\nexport function signal<T>(value: T) {\n return new Signal(value)\n}\n\nif (typeof window !== 'undefined') {\n ;(window as any).signal = signal\n ;(window as any).deepEqual = fastDeepEqual\n}\n", "import type {\n Component,\n NodeModel,\n} from '@nordcraft/core/dist/component/component.types'\n\ntype NodeWithNodeId = NodeModel & { nodeId: string }\n\ninterface NodeAndAncestorLookup {\n node: NodeWithNodeId\n ancestors: NodeWithNodeId[]\n}\n\nexport const getNodeAndAncestors = (\n component: Component,\n root: NodeModel,\n id: unknown,\n): NodeAndAncestorLookup | undefined => {\n if (typeof id !== 'string' || id.length === 0) {\n return undefined\n }\n const path = id.split('.')\n const pathParsed = path.map((n) => parseInt(n))\n const ancestors: NodeWithNodeId[] = []\n // nodePath skips the root element as it's selected as the initial\n // value in the reduce below\n const nodePath = pathParsed.slice(1)\n const node = nodePath.reduce((node: NodeModel | undefined, childIndex, i) => {\n switch (node?.type) {\n // 'text' elements don't have any children\n case 'element':\n case 'component':\n case 'slot':\n // Ancestors are elements before the target node\n if (i <= nodePath.length - 1) {\n ancestors.push({\n ...node,\n // Use the original path as origin to get correct nodeIds\n nodeId: path.slice(0, i + 1).join('.'),\n })\n }\n return component.nodes?.[node.children[childIndex]]\n default:\n return undefined\n }\n }, root)\n if (node === undefined) {\n return undefined\n }\n return { node: { ...node, nodeId: id }, ancestors }\n}\n\nexport const isNodeOrAncestorConditional = (\n nodeLookup?: NodeAndAncestorLookup,\n): nodeLookup is NodeAndAncestorLookup =>\n nodeLookup?.node?.condition !== undefined ||\n nodeLookup?.ancestors.some((a) => a.condition !== undefined) === true\n\n/**\n * @returns The next sibling element or null if this is the last element. A nc sibling is a sibling with a higher index or the same index but a higher repeat index.\n */\nexport const getNextSiblingElement = (\n path: string,\n parentElement: Element | ShadowRoot,\n) => {\n const pathParts = path.split('.')\n const lastPathPart = pathParts.slice(-1)[0]\n const index = parseInt(lastPathPart)\n const repeatIndex = parseInt(String(lastPathPart.split('(')[1]))\n\n // Find the first child that either has a higher index or a similar index, but higher repeat index\n for (const child of parentElement.children) {\n const childPath = child.getAttribute('data-id')\n const lastChildPathPart = childPath?.split('.').slice(-1)[0]\n const childIndex = parseInt(String(lastChildPathPart))\n if (\n childIndex === index &&\n parseInt(String(lastChildPathPart?.split('(')[1])) > repeatIndex\n ) {\n return child\n }\n\n if (childIndex > index) {\n return child\n }\n }\n\n return null\n}\n\n/**\n * This function efficiently ensures that:\n * 1. New items are added in the correct position.\n * 2. Existing items are not moved if they are already in the correct order.\n */\nexport function ensureEfficientOrdering(\n parentElement: Element | ShadowRoot,\n items: ReadonlyArray<Element | Text>,\n nextElement: Element | Text | null = null,\n) {\n // Identify the starting point for comparisons.\n let insertBeforeElement = nextElement // If insertBeforeElement is null, items will be appended at the end.\n\n // To track the current position in the DOM, we'll use a marker that advances through the sibling elements.\n let currentMarker = insertBeforeElement\n ? insertBeforeElement.previousSibling\n : parentElement.lastChild\n\n // We'll process the items array in reverse order to minimize the number of DOM operations.\n for (let i = items.length - 1; i >= 0; i--) {\n const item = items[i]\n\n // Check if the item is already in the correct position by comparing it with the currentMarker.\n if (item === currentMarker) {\n // The item is in the correct position, move the marker to the previous sibling.\n currentMarker = item.previousSibling\n } else {\n // The item is either not in the DOM or not in the correct position.\n // Insert the item before the insertBeforeElement (or append it if insertBeforeElement is null).\n parentElement.insertBefore(item, insertBeforeElement)\n }\n\n // Update insertBeforeElement to the current item for the next iteration, as we need to insert subsequent items before this one.\n insertBeforeElement = item\n }\n}\n", "import { variantSelector, type StyleVariant } from '../styling/variantSelector'\nimport type { Nullable } from '../types'\n\ntype NodeSelectorOptions =\n | {\n componentName: string\n nodeId: Nullable<string>\n variant?: Nullable<StyleVariant>\n }\n | {\n componentName?: never\n nodeId?: never\n variant?: Nullable<StyleVariant>\n }\n\nexport function getNodeSelector(\n path: string,\n { componentName, nodeId, variant }: NodeSelectorOptions = {},\n): string {\n let selector = `[data-id=\"${path}\"]`\n if (componentName) {\n selector += `.${componentName}`\n }\n if (nodeId) {\n selector += `\\\\:${nodeId}`\n }\n if (variant) {\n selector += variantSelector(variant)\n }\n\n return selector\n}\n", "/* eslint-disable @typescript-eslint/prefer-nullish-coalescing */\nimport type { Component } from '@nordcraft/core/dist/component/component.types'\n\nexport const isContextProvider = (component: Component) =>\n (component.formulas &&\n Object.values(component.formulas).some(\n ({ exposeInContext }) => exposeInContext,\n )) ||\n (component.workflows &&\n Object.values(component.workflows).some(\n ({ exposeInContext }) => exposeInContext,\n ))\n", "import type {\n Component,\n ComponentData,\n} from '@nordcraft/core/dist/component/component.types'\nimport type { FormulaContext } from '@nordcraft/core/dist/formula/formula'\nimport { applyFormula } from '@nordcraft/core/dist/formula/formula'\nimport { mapObject } from '@nordcraft/core/dist/utils/collections'\nimport { isDefined } from '@nordcraft/core/dist/utils/util'\nimport type { Signal } from '../signal/signal'\nimport type { ComponentContext } from '../types'\n\nexport function subscribeToContext(\n componentDataSignal: Signal<ComponentData>,\n component: Component,\n ctx: ComponentContext,\n) {\n Object.entries(component.contexts ?? {}).forEach(\n ([providerName, context]) => {\n const provider =\n ctx.providers[[ctx.package, providerName].filter(isDefined).join('/')]\n\n if (provider) {\n context.formulas.forEach((formulaName) => {\n const formulaDataSignal = provider.formulaDataSignals[formulaName]\n if (!formulaDataSignal) {\n // eslint-disable-next-line no-console\n console.warn(\n `Component error(${component.name}): Provider ${providerName} does not expose a formula named \"${formulaName}\". Available formulas are: [\"${Object.keys(\n provider.formulaDataSignals,\n ).join('\", \"')}\"]`,\n )\n return\n }\n\n formulaDataSignal.subscribe((value) => {\n componentDataSignal.update((data) => ({\n ...data,\n Contexts: {\n ...data.Contexts,\n [providerName]: {\n ...data.Contexts?.[providerName],\n [formulaName]: value,\n },\n },\n }))\n })\n })\n }\n\n // In preview and absence of a real provider, we fake providers with their testData values. This is useful for testing components in isolation.\n // This is for preview mode only, and should preferably be stripped from the page and custom-elements runtime.\n else if (\n !provider &&\n ctx.env.runtime === 'preview' &&\n ctx.toddle._preview\n ) {\n const testProvider = ctx.components?.find(\n (comp) =>\n comp.name ===\n [ctx.package, providerName].filter(isDefined).join('/'),\n )\n\n if (!testProvider) {\n // eslint-disable-next-line no-console\n console.error(\n `Component error(${component.name}): Could not find provider \"${providerName}\". No such component exist.`,\n )\n return\n }\n\n // Derive the package name from the provider name as we do not have a real component to work with\n const [, testProviderPackage] = providerName.split('/').reverse()\n const formulaContext: FormulaContext = {\n data: {\n Attributes: mapObject(\n testProvider.attributes ?? {},\n ([name, attr]) => [name, attr.testValue],\n ),\n },\n component: testProvider,\n root: ctx?.root,\n formulaCache: {},\n package: testProviderPackage ?? ctx?.package,\n toddle: ctx.toddle,\n env: ctx.env,\n }\n\n if (testProvider.route) {\n formulaContext.data['URL parameters'] = {\n ...Object.fromEntries(\n testProvider.route.path\n .filter((p) => p.type === 'param')\n .map((p) => [p.name, p.testValue]),\n ),\n ...mapObject(testProvider.route.query, ([name, { testValue }]) => [\n name,\n testValue,\n ]),\n }\n }\n formulaContext.data.Variables = mapObject(\n testProvider.variables ?? {},\n ([name, variable]) => [\n name,\n applyFormula(variable.initialValue, formulaContext),\n ],\n )\n\n componentDataSignal.update((data) => ({\n ...data,\n Contexts: {\n ...data.Contexts,\n [providerName]: Object.fromEntries(\n context.formulas.map((formulaName) => {\n const formula = testProvider.formulas?.[formulaName]\n if (!formula) {\n // eslint-disable-next-line no-console\n console.warn(\n `Component error(${component.name}): Could not find formula \"${formulaName}\" in provider \"${providerName}\"`,\n )\n return [formulaName, null]\n }\n\n return [\n formulaName,\n applyFormula(formula.formula, formulaContext),\n ]\n }),\n ),\n },\n }))\n }\n },\n )\n}\n", "import type {\n Component,\n ComponentData,\n} from '@nordcraft/core/dist/component/component.types'\nimport type { Signal } from '../signal/signal'\n\nexport function initLogState() {\n ;(window as any).logState = () => {\n // eslint-disable-next-line no-console\n console.table(\n Object.entries(window.__components ?? {}).map(([name, sig]) => {\n return {\n name,\n ...(sig as any).get(),\n }\n }),\n )\n }\n}\n\nexport function registerComponentToLogState(\n component: Component,\n dataSignal: Signal<ComponentData>,\n) {\n if (!window.__components) {\n window.__components = {}\n }\n\n window.__components[component.name] = dataSignal\n}\n", "import type {\n Component,\n ComponentData,\n} from '@nordcraft/core/dist/component/component.types'\nimport type {\n Formula,\n FunctionOperation,\n} from '@nordcraft/core/dist/formula/formula'\nimport { get, mapObject } from '@nordcraft/core/dist/utils/collections'\nimport { isDefined } from '@nordcraft/core/dist/utils/util'\nimport type { FormulaCache } from '../types'\n\nexport function createFormulaCache(component: Component): FormulaCache {\n if (!isDefined(component.formulas)) {\n return {}\n }\n return mapObject(component.formulas, ([name, f]) => {\n const { canCache, keys } = f.memoize\n ? getFormulaCacheConfig(f.formula, component)\n : { canCache: false, keys: [] }\n let cacheInput: any\n let cacheData: any\n\n return [\n name,\n {\n get: (data: ComponentData) => {\n if (\n canCache &&\n cacheInput &&\n keys.every((key) => {\n return get(data, key) === get(cacheInput, key)\n })\n ) {\n return { hit: true, data: cacheData }\n }\n return { hit: false }\n },\n set: (data: ComponentData, result: any) => {\n if (canCache) {\n cacheInput = data\n cacheData = result\n }\n },\n },\n ]\n })\n}\n\nfunction getFormulaCacheConfig(formula: Formula, component: Component) {\n const paths: string[][] = []\n function visitOperation(op: Formula) {\n if (!op) {\n return\n }\n if (op.type === 'path' && op.path[0] !== 'Args') {\n paths.push(op.path)\n }\n if (Array.isArray((op as any)?.arguments)) {\n ;(op as FunctionOperation)?.arguments.forEach((arg) =>\n visitOperation(arg.formula),\n )\n }\n if (op.type === 'record' && Array.isArray(op.entries)) {\n op.entries.forEach((arg) => visitOperation(arg.formula))\n }\n\n if (op.type === 'apply') {\n if (!component.formulas?.[op.name]?.memoize) {\n throw new Error('Cannot memoize')\n }\n visitOperation(component.formulas?.[op.name]?.formula)\n }\n }\n try {\n visitOperation(formula)\n } catch {\n return {\n canCache: false,\n keys: [],\n }\n }\n\n const keys: string[][] = []\n paths\n .sort((a, b) => a.length - b.length)\n .forEach((path) => {\n if (!keys.some((key) => key.every((k, i) => k === path[i]))) {\n keys.push(path)\n }\n })\n return {\n canCache: true,\n keys,\n }\n}\n", "import type { MediaQuery } from '@nordcraft/core/dist/component/component.types'\nimport type { Nullable } from '@nordcraft/core/dist/types'\n\n/**\n * CustomPropertyStyleSheet is a utility class that manages CSS custom properties\n * (variables) in a dedicated CSSStyleSheet. It allows for efficient registration,\n * updating, and removal of style properties as fast as setting style properties.\n *\n * It abstracts the complexity of managing CSS rules via. indexing and\n * provides a simple API to register and unregister style properties for specific\n * selectors.\n */\nexport class CustomPropertyStyleSheet {\n private styleSheet: CSSStyleSheet\n\n // Selector to rule index mapping\n private ruleMap: Map<string, CSSStyleRule | CSSNestedDeclarations> | undefined\n\n constructor(\n root: Document | ShadowRoot,\n styleSheet?: Nullable<CSSStyleSheet>,\n ) {\n if (styleSheet) {\n this.styleSheet = styleSheet\n } else {\n this.styleSheet = new CSSStyleSheet()\n root.adoptedStyleSheets.push(this.getStyleSheet())\n }\n }\n\n /**\n * @returns A function to update the property value efficiently.\n */\n public registerProperty(\n selector: string,\n name: string,\n options?: Nullable<{\n mediaQuery?: Nullable<MediaQuery>\n startingStyle?: Nullable<boolean>\n }>,\n ): (newValue: string) => void {\n this.ruleMap ??= this.hydrateFromBase()\n const fullSelector = CustomPropertyStyleSheet.getFullSelector(\n selector,\n options,\n )\n\n // Check if the selector already exists\n let rule = this.ruleMap.get(fullSelector)\n if (!rule) {\n const ruleIndex = this.styleSheet.insertRule(\n fullSelector,\n this.styleSheet.cssRules.length,\n )\n let newRule = this.styleSheet.cssRules[ruleIndex]\n\n // We are only interested in the dynamic style, so get the actual style rule, not media or other nested rules. Loop until we are at the bottom most rule.\n while (\n (newRule as any).cssRules &&\n (newRule as CSSGroupingRule).cssRules.length > 0\n ) {\n newRule = (newRule as CSSGroupingRule).cssRules[0]\n }\n rule = newRule as CSSStyleRule | CSSNestedDeclarations\n this.ruleMap.set(fullSelector, rule)\n }\n\n return (value: string) => {\n rule.style.setProperty(name, value)\n }\n }\n\n public unregisterProperty(\n selector: string,\n name: string,\n options?: Nullable<{\n mediaQuery?: Nullable<MediaQuery>\n startingStyle?: Nullable<boolean>\n deepClean?: Nullable<boolean>\n }>,\n ): void {\n if (!this.ruleMap) {\n return\n }\n\n const fullSelector = CustomPropertyStyleSheet.getFullSelector(\n selector,\n options,\n )\n\n const rule = this.ruleMap.get(fullSelector)\n if (!rule) {\n return\n }\n\n rule.style.removeProperty(name)\n\n // Cleaning up empty selectors is probably not necessary in production and may have performance implications.\n // However, it is required for the editor-preview as it is a dynamic environment and things may get reordered and canvas reused.\n if (options?.deepClean && rule.style.length === 0) {\n this.styleSheet.deleteRule(\n Array.from(this.ruleMap.keys()).indexOf(fullSelector),\n )\n this.ruleMap.delete(fullSelector)\n }\n }\n\n public getStyleSheet(): CSSStyleSheet {\n return this.styleSheet\n }\n\n /**\n * Maps all selectors to their rule index. This is used to map the initial\n * SSR style variable values to their selectors.\n */\n private hydrateFromBase() {\n const ruleIndex: Map<string, CSSStyleRule> = new Map()\n for (let i = 0; i < this.styleSheet.cssRules.length; i++) {\n let rule = this.styleSheet.cssRules[i]\n const selector = CustomPropertyStyleSheet.selectorFromCSSRule(rule)\n // Get last part of the selector, which is the actual selector we are interested in\n while (\n (rule as CSSGroupingRule).cssRules &&\n (rule as CSSGroupingRule).cssRules.length > 0\n ) {\n rule = (rule as CSSGroupingRule).cssRules[0]\n }\n\n ruleIndex.set(selector, rule as CSSStyleRule)\n }\n return ruleIndex\n }\n\n private static selectorFromCSSRule(rule: CSSRule): string {\n switch (rule.constructor.name) {\n case 'CSSStyleRule':\n // For these rules, we just return (potentially with subrules if any cssRules exist)\n return `${(rule as CSSStyleRule).selectorText} { ${Array.from(\n (rule as CSSStyleRule).cssRules,\n )\n .map(CustomPropertyStyleSheet.selectorFromCSSRule)\n .join(', ')}}`\n case 'CSSStartingStyleRule':\n return `@starting-style { ${Array.from(\n (rule as CSSStartingStyleRule).cssRules,\n )\n .map(CustomPropertyStyleSheet.selectorFromCSSRule)\n .join(', ')}}`\n case 'CSSMediaRule':\n return `@media ${(rule as CSSMediaRule).media.mediaText} { ${Array.from(\n (rule as CSSMediaRule).cssRules,\n )\n .map(CustomPropertyStyleSheet.selectorFromCSSRule)\n .join(', ')}}`\n case 'CSSNestedDeclarations':\n return ''\n default:\n // eslint-disable-next-line no-console\n console.warn(\n `Unsupported CSS rule type: ${rule.constructor.name}. Returning empty selector.`,\n )\n return ''\n }\n }\n\n private static getFullSelector(\n selector: string,\n options?: Nullable<{\n mediaQuery?: Nullable<MediaQuery>\n startingStyle?: Nullable<boolean>\n }>,\n ) {\n let result =\n selector + (options?.startingStyle ? ' { @starting-style { }}' : ' { }')\n if (options?.mediaQuery) {\n result = `@media (${Object.entries(options.mediaQuery)\n .map(([key, value]) => `${key}: ${value}`)\n .filter(Boolean)\n .join(') and (')}) { ${result}}`\n }\n\n return result\n }\n}\n", "import type { Signal } from '../signal/signal'\n\nimport { CUSTOM_PROPERTIES_STYLESHEET_ID } from '@nordcraft/core/dist/styling/theme.const'\nimport type { StyleVariant } from '@nordcraft/core/dist/styling/variantSelector'\nimport type { Runtime } from '@nordcraft/core/dist/types'\nimport { CustomPropertyStyleSheet } from '../styles/CustomPropertyStyleSheet'\n\nlet customPropertiesStylesheet: CustomPropertyStyleSheet | undefined\n\nexport function subscribeCustomProperty({\n selector,\n customPropertyName,\n signal,\n variant,\n root,\n runtime,\n}: {\n selector: string\n customPropertyName: string\n signal: Signal<string>\n variant?: StyleVariant\n root: Document | ShadowRoot\n runtime: Runtime\n}) {\n customPropertiesStylesheet ??= new CustomPropertyStyleSheet(\n root,\n (\n root.getElementById(CUSTOM_PROPERTIES_STYLESHEET_ID) as\n | HTMLStyleElement\n | undefined\n )?.sheet,\n )\n\n signal.subscribe(\n customPropertiesStylesheet.registerProperty(\n selector,\n customPropertyName,\n variant,\n ),\n {\n destroy: () => {\n customPropertiesStylesheet?.unregisterProperty(\n selector,\n customPropertyName,\n {\n deepClean: runtime === 'preview',\n mediaQuery: variant?.mediaQuery,\n startingStyle: variant?.startingStyle,\n },\n )\n },\n },\n )\n}\n", "import { isLegacyApi, sortApiObjects } from '@nordcraft/core/dist/api/api'\nimport type {\n ComponentData,\n ComponentNodeModel,\n SupportedNamespaces,\n} from '@nordcraft/core/dist/component/component.types'\nimport { applyFormula } from '@nordcraft/core/dist/formula/formula'\nimport { appendUnit } from '@nordcraft/core/dist/styling/customProperty'\nimport { mapObject } from '@nordcraft/core/dist/utils/collections'\nimport { getNodeSelector } from '@nordcraft/core/dist/utils/getNodeSelector'\nimport { isDefined } from '@nordcraft/core/dist/utils/util'\nimport { isContextApiV2 } from '../api/apiUtils'\nimport { createLegacyAPI } from '../api/createAPI'\nimport { createAPI } from '../api/createAPIv2'\nimport { isContextProvider } from '../context/isContextProvider'\nimport { subscribeToContext } from '../context/subscribeToContext'\nimport { registerComponentToLogState } from '../debug/logState'\nimport { handleAction } from '../events/handleAction'\nimport type { Signal } from '../signal/signal'\nimport { signal } from '../signal/signal'\nimport type { ComponentChild, ComponentContext, ContextApi } from '../types'\nimport { createFormulaCache } from '../utils/createFormulaCache'\nimport { subscribeCustomProperty } from '../utils/subscribeCustomProperty'\nimport { renderComponent } from './renderComponent'\n\nexport type RenderComponentNodeProps = {\n path: string\n node: ComponentNodeModel\n dataSignal: Signal<ComponentData>\n ctx: ComponentContext\n parentElement: Element | ShadowRoot\n instance: Record<string, string>\n namespace?: SupportedNamespaces\n}\n\nexport function createComponent({\n node,\n path,\n dataSignal,\n ctx,\n parentElement,\n instance,\n namespace,\n}: RenderComponentNodeProps): ReadonlyArray<Element | Text> {\n const nodeLookupKey = [ctx.package, node.name].filter(isDefined).join('/')\n const component = ctx.components?.find((comp) => comp.name === nodeLookupKey)\n if (!component) {\n // eslint-disable-next-line no-console\n console.warn(\n `Could not find component \"${nodeLookupKey}\" for component \"${\n ctx.component.name\n }\". Available components are: [\"${ctx.components\n .map((c) => c.name)\n .join('\", \"')}\"]`,\n )\n return []\n }\n const attributesSignal = dataSignal.map((data) => {\n return mapObject(node.attrs, ([attr, value]) => [\n attr,\n value?.type !== 'value'\n ? applyFormula(value, {\n data,\n component: ctx.component,\n formulaCache: ctx.formulaCache,\n root: ctx.root,\n package: ctx.package,\n toddle: ctx.toddle,\n env: ctx.env,\n })\n : value?.value,\n ])\n })\n Object.entries(node.customProperties ?? {}).forEach(\n ([customPropertyName, customProperty]) =>\n subscribeCustomProperty({\n selector: getNodeSelector(path, {\n componentName: ctx.component.name,\n nodeId: node.id,\n }),\n signal: dataSignal.map((data) =>\n appendUnit(\n applyFormula(customProperty.formula, {\n data,\n component: ctx.component,\n formulaCache: ctx.formulaCache,\n root: ctx.root,\n package: ctx.package,\n toddle: ctx.toddle,\n env: ctx.env,\n }),\n customProperty.unit,\n ),\n ),\n customPropertyName,\n root: ctx.root,\n runtime: ctx.env.runtime,\n }),\n )\n node.variants?.forEach((variant) => {\n Object.entries(variant.customProperties ?? {}).forEach(\n ([customPropertyName, customProperty]) =>\n subscribeCustomProperty({\n selector: getNodeSelector(path, {\n componentName: ctx.component.name,\n nodeId: node.id,\n variant,\n }),\n signal: dataSignal.map((data) =>\n appendUnit(\n applyFormula(customProperty.formula, {\n data,\n component: ctx.component,\n formulaCache: ctx.formulaCache,\n root: ctx.root,\n package: ctx.package,\n toddle: ctx.toddle,\n env: ctx.env,\n }),\n customProperty.unit,\n ),\n ),\n customPropertyName,\n variant,\n root: ctx.root,\n runtime: ctx.env.runtime,\n }),\n )\n })\n\n const componentDataSignal = signal<ComponentData>({\n Location: dataSignal.get().Location,\n Attributes: attributesSignal.get(),\n Apis: mapObject(component.apis ?? {}, ([name, api]) => [\n name,\n {\n data: null,\n isLoading:\n api.autoFetch &&\n applyFormula(api.autoFetch, {\n data: dataSignal.get(),\n component,\n formulaCache: ctx.formulaCache,\n root: ctx.root,\n package: ctx.package,\n toddle: ctx.toddle,\n env: ctx.env,\n })\n ? true\n : false,\n error: null,\n },\n ]),\n })\n // Subscribe context before calculating variable initial values to ensure they can reference context values\n subscribeToContext(componentDataSignal, component, ctx)\n componentDataSignal.update((data) => ({\n ...data,\n Variables: mapObject(component.variables ?? {}, ([name, variable]) => [\n name,\n applyFormula(variable.initialValue, {\n // Initial value\n data: componentDataSignal.get(),\n component,\n formulaCache: ctx.formulaCache,\n root: ctx.root,\n package: ctx.package,\n toddle: ctx.toddle,\n env: ctx.env,\n }),\n ]),\n }))\n registerComponentToLogState(component, componentDataSignal)\n\n // Call the abort signal if the component's datasignal is destroyed (component unmounted) to cancel any pending requests\n const abortController = new AbortController()\n componentDataSignal.subscribe(() => {}, {\n destroy: () =>\n abortController.abort(`Component ${component.name} unmounted`),\n })\n const formulaCache = createFormulaCache(component)\n\n // Note: this function must run procedurally to ensure apis (which are in correct order) can reference each other\n const apis: Record<string, ContextApi> = {}\n sortApiObjects(Object.entries(component.apis ?? {})).forEach(\n ([name, api]) => {\n if (isLegacyApi(api)) {\n apis[name] = createLegacyAPI(api, {\n ...ctx,\n apis,\n component,\n dataSignal: componentDataSignal,\n abortSignal: abortController.signal,\n isRootComponent: false,\n formulaCache,\n package: node.package ?? ctx.package,\n triggerEvent: (eventTrigger, data) => {\n const eventHandler = Object.values(node.events).find(\n (e) => e.trigger === eventTrigger,\n )\n if (eventHandler) {\n eventHandler.actions?.forEach((action) =>\n handleAction(action, { ...dataSignal.get(), Event: data }, ctx),\n )\n }\n },\n })\n } else {\n apis[name] = createAPI({\n apiRequest: api,\n ctx: {\n ...ctx,\n apis,\n component,\n dataSignal: componentDataSignal,\n abortSignal: abortController.signal,\n isRootComponent: false,\n formulaCache,\n package: node.package ?? ctx.package,\n triggerEvent: (eventTrigger, data) => {\n const eventHandler = Object.values(node.events).find(\n (e) => e.trigger === eventTrigger,\n )\n if (eventHandler) {\n eventHandler.actions?.forEach((action) =>\n handleAction(\n action,\n { ...dataSignal.get(), Event: data },\n ctx,\n ),\n )\n }\n },\n },\n componentData: componentDataSignal.get(),\n })\n }\n },\n )\n Object.values(apis)\n .filter(isContextApiV2)\n .forEach((api) => {\n api.triggerActions(componentDataSignal.get())\n })\n\n const onEvent = (eventTrigger: string, data: any) => {\n const eventHandler = Object.values(node.events).find(\n (e) => e.trigger === eventTrigger,\n )\n if (eventHandler) {\n eventHandler.actions?.forEach((action) =>\n handleAction(action, { ...dataSignal.get(), Event: data }, ctx),\n )\n }\n }\n\n let providers = ctx.providers\n if (isContextProvider(component)) {\n // Subscribe to exposed formulas and update the component's data signal\n const formulaDataSignals = Object.fromEntries(\n Object.entries(component.formulas ?? {})\n .filter(([, formula]) => formula.exposeInContext)\n .map(([name, formula]) => [\n name,\n componentDataSignal.map((data) =>\n applyFormula(formula.formula, {\n data,\n component,\n formulaCache: ctx.formulaCache,\n root: ctx.root,\n package: ctx.package,\n toddle: ctx.toddle,\n env: ctx.env,\n }),\n ),\n ]),\n )\n\n providers = {\n ...providers,\n [component.name]: {\n component,\n formulaDataSignals,\n ctx: {\n ...ctx,\n apis,\n component,\n dataSignal: componentDataSignal,\n abortSignal: abortController.signal,\n triggerEvent: onEvent,\n },\n },\n }\n }\n\n const children: Record<string, Array<ComponentChild>> = {}\n for (let i = 0; i < node.children.length; i++) {\n const childId = node.children[i]\n const childNode = ctx.component.nodes?.[childId]\n const slotName = childNode?.slot ?? 'default'\n children[slotName] = children[slotName] ?? []\n children[slotName].push({\n id: childId,\n path: `${path}.${i}[${slotName}]`,\n dataSignal,\n ctx: {\n ...ctx,\n package: node.package ?? ctx.package,\n },\n })\n }\n\n attributesSignal.subscribe(\n (Attributes) =>\n componentDataSignal.update((data) => ({\n ...data,\n Attributes,\n })),\n { destroy: () => componentDataSignal.destroy() },\n )\n\n return renderComponent({\n dataSignal: componentDataSignal,\n component,\n components: ctx.components,\n path,\n root: ctx.root,\n isRootComponent: false,\n children,\n formulaCache,\n providers,\n apis,\n abortSignal: abortController.signal,\n package: node.package ?? ctx.package,\n parentElement,\n onEvent,\n toddle: ctx.toddle,\n env: ctx.env,\n namespace,\n // If the root node is another component, then append and forward previous instance\n instance:\n node.id === 'root'\n ? { ...instance, [ctx.component.name]: 'root' }\n : { [ctx.component.name]: node.id ?? '' },\n })\n}\n", "export function getDragData(event: Event) {\n if (event instanceof DragEvent) {\n return Array.from(event.dataTransfer?.items ?? []).reduce<\n Record<string, any>\n >((dragData, item) => {\n dragData[item.type] = event.dataTransfer?.getData(item.type)\n return dragData\n }, {})\n }\n return\n}\n", "import type { ElementNodeModel } from '@nordcraft/core/dist/component/component.types'\nimport type { ComponentContext } from '../types'\n\nexport function getElementTagName(\n node: ElementNodeModel,\n ctx: ComponentContext,\n id: string,\n) {\n if (ctx.component.version === 2 && id === 'root') {\n return `${ctx.package ?? ctx.toddle.project}-${node.tag}`\n }\n\n return node.tag\n}\n", "import { isDefined, toBoolean } from '@nordcraft/core/dist/utils/util'\n\n/**\n * Some attributes need special handling.\n */\nexport function setAttribute(\n elem: HTMLElement | SVGElement | MathMLElement,\n attr: string,\n value: any,\n) {\n switch (attr) {\n case 'srcObject':\n case 'src':\n if (elem instanceof HTMLMediaElement) {\n ;(elem as any)[attr] = value\n } else {\n elem.setAttribute(attr, String(value))\n }\n break\n case 'value':\n case 'type': {\n if (elem instanceof SVGElement) {\n // The type attribute on SVG elements should just be added as an attribute\n // See https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/type\n if (toBoolean(value)) {\n elem.setAttribute(attr, String(value))\n }\n } else {\n let val = value\n if (elem instanceof HTMLProgressElement) {\n // An HTMLProgressElement will break other elements in our editor if the value is not a (finite) number\n // See docs here https://developer.mozilla.org/en-US/docs/Web/HTML/Element/progress#value\n // and original issue here https://discord.com/channels/972416966683926538/1317827591230722048\n if (!isDefined(value) || !Number.isFinite(Number(value))) {\n val = 0\n }\n }\n ;(elem as any)[attr] = toBoolean(val) ? String(val) : undefined\n }\n break\n }\n case 'muted':\n case 'autoplay':\n if (elem instanceof HTMLMediaElement) {\n ;(elem as any)[attr] = toBoolean(value)\n } else {\n elem.setAttribute(attr, String(value))\n }\n break\n default:\n if (toBoolean(value)) {\n elem.setAttribute(attr, String(value))\n if (\n // autofocus often does not work in the editor\n attr === 'autofocus' &&\n document.body.getAttribute('data-mode') !== 'design'\n ) {\n setTimeout(() => elem.focus(), 100)\n }\n } else {\n elem.removeAttribute(attr)\n }\n }\n}\n", "import type {\n ElementNodeModel,\n NodeModel,\n SupportedNamespaces,\n} from '@nordcraft/core/dist/component/component.types'\nimport { applyFormula } from '@nordcraft/core/dist/formula/formula'\nimport {\n getClassName,\n toValidClassName,\n} from '@nordcraft/core/dist/styling/className'\nimport { appendUnit } from '@nordcraft/core/dist/styling/customProperty'\nimport { getNodeSelector } from '@nordcraft/core/dist/utils/getNodeSelector'\nimport { isDefined, toBoolean } from '@nordcraft/core/dist/utils/util'\nimport type { ComponentData } from '@nordcraft/core/src/component/component.types'\nimport { handleAction } from '../events/handleAction'\nimport type { Signal } from '../signal/signal'\nimport type { ComponentContext } from '../types'\nimport { getDragData } from '../utils/getDragData'\nimport { getElementTagName } from '../utils/getElementTagName'\nimport { setAttribute } from '../utils/setAttribute'\nimport { subscribeCustomProperty } from '../utils/subscribeCustomProperty'\nimport type { NodeRenderer } from './createNode'\nimport { createNode } from './createNode'\n\nexport function createElement({\n node,\n dataSignal,\n id,\n path,\n ctx,\n namespace,\n instance,\n}: NodeRenderer<ElementNodeModel>): Element {\n const tag = getElementTagName(node, ctx, id)\n switch (tag) {\n case 'svg': {\n namespace = 'http://www.w3.org/2000/svg'\n break\n }\n case 'math': {\n namespace = 'http://www.w3.org/1998/Math/MathML'\n break\n }\n }\n\n // Explicitly setting a namespace has precedence over inferring it from the tag\n if (node.attrs['xmlns']?.type === 'value') {\n namespace = String(node.attrs['xmlns'].value) as SupportedNamespaces\n }\n\n const elem = namespace\n ? (document.createElementNS(namespace, tag) as SVGElement | MathMLElement)\n : document.createElement(tag)\n\n elem.setAttribute('data-node-id', id)\n if (path) {\n elem.setAttribute('data-id', path)\n }\n if (ctx.isRootComponent === false && id !== 'root') {\n elem.setAttribute('data-component', ctx.component.name)\n }\n const classHash = getClassName([node.style, node.variants])\n elem.classList.add(classHash)\n if (instance && id === 'root') {\n Object.entries(instance).forEach(([key, value]) => {\n elem.classList.add(toValidClassName(`${key}:${value}`))\n })\n }\n if (node.classes) {\n Object.entries(node.classes)?.forEach(([className, { formula }]) => {\n if (formula) {\n const classSignal = dataSignal.map((data) =>\n toBoolean(\n applyFormula(formula, {\n data,\n component: ctx.component,\n formulaCache: ctx.formulaCache,\n root: ctx.root,\n package: ctx.package,\n toddle: ctx.toddle,\n env: ctx.env,\n }),\n ),\n )\n classSignal.subscribe((show) =>\n show\n ? elem.classList.add(className)\n : elem.classList.remove(className),\n )\n } else {\n elem.classList.add(className)\n }\n })\n }\n\n Object.entries(node.attrs).forEach(([attr, value]) => {\n if (!isDefined(value)) {\n return\n }\n let o: Signal<any> | undefined\n const setupAttribute = () => {\n if (value.type === 'value') {\n setAttribute(elem, attr, value?.value)\n } else {\n o = dataSignal.map((data) =>\n applyFormula(value, {\n data,\n component: ctx.component,\n formulaCache: ctx.formulaCache,\n root: ctx.root,\n package: ctx.package,\n toddle: ctx.toddle,\n env: ctx.env,\n }),\n )\n o.subscribe((val) => {\n setAttribute(elem, attr, val)\n })\n }\n }\n if (\n attr === 'autofocus' &&\n ctx.env.runtime === 'preview' &&\n ctx.toddle._preview\n ) {\n ctx.toddle._preview.showSignal.subscribe(({ testMode }) => {\n if (testMode) {\n setupAttribute()\n } else {\n o?.destroy()\n elem.removeAttribute(attr)\n }\n })\n } else {\n setupAttribute()\n }\n })\n node['style-variables']?.forEach((styleVariable) => {\n const { name, formula, unit } = styleVariable\n const signal = dataSignal.map((data) => {\n const value = applyFormula(formula, {\n data,\n component: ctx.component,\n formulaCache: ctx.formulaCache,\n root: ctx.root,\n package: ctx.package,\n toddle: ctx.toddle,\n env: ctx.env,\n })\n return unit ? value + unit : value\n })\n\n signal.subscribe((value) => elem.style.setProperty(`--${name}`, value))\n })\n\n Object.entries(node.customProperties ?? {}).forEach(\n ([customPropertyName, { formula, unit }]) =>\n subscribeCustomProperty({\n customPropertyName,\n selector:\n ctx.env.runtime === 'custom-element' &&\n ctx.isRootComponent &&\n path === '0'\n ? `${getNodeSelector(path)}, :host`\n : getNodeSelector(path),\n signal: dataSignal.map((data) =>\n appendUnit(\n applyFormula(formula, {\n data,\n component: ctx.component,\n formulaCache: ctx.formulaCache,\n root: ctx.root,\n package: ctx.package,\n toddle: ctx.toddle,\n env: ctx.env,\n }),\n unit,\n ),\n ),\n root: ctx.root,\n runtime: ctx.env.runtime,\n }),\n )\n\n node.variants?.forEach((variant) => {\n Object.entries(variant.customProperties ?? {}).forEach(\n ([customPropertyName, { formula, unit }]) => {\n subscribeCustomProperty({\n customPropertyName,\n selector: getNodeSelector(path, {\n variant,\n }),\n variant,\n signal: dataSignal.map((data) =>\n appendUnit(\n applyFormula(formula, {\n data,\n component: ctx.component,\n formulaCache: ctx.formulaCache,\n root: ctx.root,\n package: ctx.package,\n toddle: ctx.toddle,\n env: ctx.env,\n }),\n unit,\n ),\n ),\n root: ctx.root,\n runtime: ctx.env.runtime,\n })\n },\n )\n })\n\n const eventHandlers: [string, (e: Event) => boolean][] = []\n Object.values(node.events).forEach((event) => {\n if (!event) {\n return\n }\n\n eventHandlers.push([\n event.trigger,\n getEventHandler({ event, dataSignal, ctx }),\n ])\n })\n\n eventHandlers.forEach(([eventName, handler]) => {\n elem.addEventListener(eventName, handler, { signal: ctx.abortSignal })\n })\n\n // for script, style & SVG<text> tags we only render text child.\n // this can be removed once we fix the editor to handle raw text nodes without wrapping <span>\n const nodeTag = node.tag.toLocaleLowerCase()\n if (nodeTag === 'script' || nodeTag === 'style') {\n const textValues: Array<Signal<string> | string> = []\n node.children\n .map<NodeModel | undefined>((child) => ctx.component.nodes?.[child])\n .filter((node) => node?.type === 'text')\n .forEach((node) => {\n if (node.value.type === 'value') {\n textValues.push(String(node.value.value))\n } else {\n const textSignal = dataSignal.map((data) => {\n return String(\n applyFormula(node.value, {\n data,\n component: ctx.component,\n formulaCache: ctx.formulaCache,\n root: ctx.root,\n package: ctx.package,\n toddle: ctx.toddle,\n env: ctx.env,\n }),\n )\n })\n textValues.push(textSignal)\n }\n })\n\n // if all values are string, we can directly set textContent\n if (textValues.every((value) => typeof value === 'string')) {\n elem.textContent = textValues.join('')\n }\n\n // for each signal, we subscribe and rewrite the entire textContent from all text nodes\n textValues\n .filter((value) => typeof value !== 'string')\n .forEach((valueSignal) => {\n valueSignal.subscribe(() => {\n elem.textContent = textValues\n .map((value) => (typeof value === 'string' ? value : value.get()))\n .join('')\n })\n })\n } else {\n const childNodes: (Element | Text)[] = []\n node.children.forEach((child, i) => {\n childNodes.push(\n ...createNode({\n parentElement: elem,\n id: child,\n path: path + '.' + i,\n dataSignal,\n ctx,\n namespace,\n instance,\n }),\n )\n })\n elem.append(...childNodes)\n }\n dataSignal.subscribe(() => {}, {\n destroy: () => {\n // TODO: Clean up event listeners, but after destruction of child signals (Maybe we need a \"afterDestroy\" hook on signals?)\n elem.parentNode?.removeChild(elem)\n },\n })\n\n return elem\n}\n\nconst getEventHandler =\n ({\n event,\n dataSignal,\n ctx,\n }: {\n event: ElementNodeModel['events'][string]\n dataSignal: Signal<ComponentData>\n ctx: ComponentContext\n }) =>\n (e: Event) => {\n event?.actions?.forEach((action) => {\n if (e instanceof DragEvent) {\n ;(e as any).data = getDragData(e)\n }\n if (e instanceof ClipboardEvent) {\n try {\n ;(e as any).data = Array.from(e.clipboardData?.items ?? []).reduce<\n Record<string, any>\n >((dragData, item) => {\n try {\n dragData[item.type] = JSON.parse(\n e.clipboardData?.getData(item.type) as any,\n )\n } catch {\n dragData[item.type] = e.clipboardData?.getData(item.type)\n }\n return dragData\n }, {})\n } catch (e) {\n // eslint-disable-next-line no-console\n console.error('Could not get paste data', e)\n }\n }\n void handleAction(action, { ...dataSignal.get(), Event: e }, ctx, e)\n })\n return false\n }\n", "import type { SlotNodeModel } from '@nordcraft/core/dist/component/component.types'\nimport type { NodeRenderer } from './createNode'\nimport { createNode } from './createNode'\n\nexport function createSlot({\n path,\n node,\n dataSignal,\n ctx,\n parentElement,\n instance,\n namespace,\n}: NodeRenderer<SlotNodeModel>): ReadonlyArray<Element | Text> {\n const slotName = node.name ?? 'default'\n let children: Array<Element | Text> = []\n // Is slotted content provided?\n if (ctx.children[slotName]) {\n children = ctx.children[slotName].flatMap((child) => {\n const childDataSignal = child.dataSignal.map((data) => data)\n dataSignal.subscribe((data) => data, {\n destroy: () => childDataSignal.destroy(),\n })\n return createNode({\n ...child,\n dataSignal: childDataSignal,\n parentElement,\n ctx: {\n ...child.ctx,\n providers: ctx.providers,\n },\n instance,\n namespace,\n })\n })\n } else {\n // Otherwise, return placeholder content\n children = node.children.flatMap((child, i) => {\n return createNode({\n id: child,\n path: path + '.' + i,\n dataSignal,\n ctx,\n parentElement,\n instance,\n namespace,\n })\n })\n }\n\n if (ctx.env.runtime === 'custom-element' && ctx.isRootComponent) {\n const webComponentSlot = document.createElement('slot')\n webComponentSlot.setAttribute('name', slotName)\n children.forEach((child) => {\n webComponentSlot.appendChild(child)\n })\n\n return [webComponentSlot]\n }\n\n return children\n}\n", "import type {\n ComponentData,\n SupportedNamespaces,\n TextNodeModel,\n} from '@nordcraft/core/dist/component/component.types'\nimport { applyFormula } from '@nordcraft/core/dist/formula/formula'\nimport type { Signal } from '../signal/signal'\nimport type { ComponentContext } from '../types'\n\nexport type RenderTextProps = {\n node: TextNodeModel\n dataSignal: Signal<ComponentData>\n id: string\n path: string\n namespace?: SupportedNamespaces\n ctx: ComponentContext\n}\n\n/**\n * Create a text node\n *\n * Note: We wrap the text in a <span> to make it easier to select/highlight the text node in the preview.\n * We should find a better way to do this without wrapping the node, and instead use `createTextNode`.\n */\nexport function createText({\n node,\n id,\n path,\n dataSignal,\n namespace,\n ctx,\n}: RenderTextProps): HTMLSpanElement | Text {\n // Span element is not valid outside of the default namespace\n if (namespace && namespace !== 'http://www.w3.org/1999/xhtml') {\n return createTextNS({ node, dataSignal, ctx })\n }\n\n const { value } = node\n const elem = document.createElement('span')\n elem.setAttribute('data-node-id', id)\n if (typeof id === 'string') {\n elem.setAttribute('data-id', path)\n }\n if (ctx.isRootComponent === false) {\n elem.setAttribute('data-component', ctx.component.name)\n }\n elem.setAttribute('data-node-type', 'text')\n if (value.type !== 'value') {\n const sig = dataSignal.map((data) =>\n String(\n applyFormula(value, {\n data,\n component: ctx.component,\n formulaCache: ctx.formulaCache,\n root: ctx.root,\n package: ctx.package,\n toddle: ctx.toddle,\n env: ctx.env,\n }),\n ),\n )\n sig.subscribe((value) => {\n elem.innerText = value\n })\n } else {\n elem.innerText = String(value.value)\n }\n return elem\n}\n\n/**\n * This function is technically more performant than `createText` because it doesn't create a wrapping <span> element.\n * We would like to use this everywhere eventually, but we need to handle raw text selection in the editor (possibly by utilizing text ranges).\n */\nexport function createTextNS({\n node,\n dataSignal,\n ctx,\n}: Pick<RenderTextProps, 'node' | 'dataSignal' | 'ctx'>): Text {\n const { value } = node\n const textNode = document.createTextNode('')\n if (value.type !== 'value') {\n const sig = dataSignal.map((data) =>\n String(\n applyFormula(value, {\n data,\n component: ctx.component,\n formulaCache: ctx.formulaCache,\n root: ctx.root,\n package: ctx.package,\n toddle: ctx.toddle,\n env: ctx.env,\n }),\n ),\n )\n sig.subscribe((value) => {\n textNode.nodeValue = value\n })\n } else {\n textNode.nodeValue = String(value.value)\n }\n\n return textNode\n}\n", "/* eslint-disable no-console */\nimport type {\n ComponentData,\n NodeModel,\n SupportedNamespaces,\n} from '@nordcraft/core/dist/component/component.types'\nimport { applyFormula } from '@nordcraft/core/dist/formula/formula'\nimport { toBoolean } from '@nordcraft/core/dist/utils/util'\nimport type { Signal } from '../signal/signal'\nimport { signal } from '../signal/signal'\nimport type { ComponentContext } from '../types'\nimport { ensureEfficientOrdering, getNextSiblingElement } from '../utils/nodes'\nimport { createComponent } from './createComponent'\nimport { createElement } from './createElement'\nimport { createSlot } from './createSlot'\nimport { createText } from './createText'\n\nexport function createNode({\n id,\n dataSignal,\n path,\n ctx,\n namespace,\n parentElement,\n instance,\n}: {\n id: string\n dataSignal: Signal<ComponentData>\n path: string\n ctx: ComponentContext\n namespace?: SupportedNamespaces\n parentElement: Element | ShadowRoot\n instance: Record<string, string>\n}): ReadonlyArray<Element | Text> {\n const node = ctx.component.nodes?.[id]\n if (!node) {\n return []\n }\n const create = ({\n node,\n ...props\n }: NodeRenderer<NodeModel>): ReadonlyArray<Element | Text> => {\n switch (node.type) {\n case 'element':\n return [\n createElement({\n node,\n ...props,\n }),\n ]\n case 'component':\n // eslint-disable-next-line no-case-declarations\n const isLocalComponent = ctx.components.some(\n (c) => c.name === node.name,\n )\n return createComponent({\n node: { ...node, id }, // we need the node id for instance classes\n ...props,\n ctx: {\n ...ctx,\n package:\n node.package ?? (isLocalComponent ? undefined : ctx.package),\n },\n parentElement,\n })\n case 'text':\n return [createText({ ...props, node })]\n case 'slot':\n return createSlot({ ...props, node })\n }\n }\n\n function conditional({\n node,\n dataSignal,\n id,\n path,\n ctx,\n namespace,\n parentElement,\n instance,\n }: NodeRenderer<NodeModel>): ReadonlyArray<Element | Text> {\n let firstRun = true\n let childDataSignal: Signal<ComponentData> | null = null\n const showSignal = dataSignal.map((data) =>\n toBoolean(\n applyFormula(node.condition, {\n data,\n component: ctx.component,\n formulaCache: ctx.formulaCache,\n root: ctx.root,\n package: ctx.package,\n toddle: ctx.toddle,\n env: ctx.env,\n }),\n ),\n )\n\n const elements: Array<Element | Text> = []\n const toggle = (show: boolean) => {\n if (show && elements.length === 0) {\n childDataSignal?.destroy()\n childDataSignal = dataSignal.map((data) => data)\n elements.push(\n ...create({\n node,\n dataSignal: childDataSignal,\n path,\n id,\n ctx,\n namespace,\n parentElement,\n instance,\n }),\n )\n\n // No reason to continue if we are on first run, as the render phase has not yet been reached\n if (firstRun) {\n return\n }\n\n if (!parentElement || ctx.root.contains(parentElement) === false) {\n console.error(\n `Conditional: Parent element does not exist for \"${path}\" This is likely due to the DOM being modified outside of Nordcraft.`,\n )\n return\n }\n\n if (parentElement.querySelector(`[data-id=\"${path}\"]`)) {\n console.warn(\n `Conditional: Element with data-id=\"${path}\" already exists. This is likely due to the DOM being modified outside of Nordcraft`,\n )\n return\n }\n\n const nextPathElement = getNextSiblingElement(path, parentElement)\n for (const element of elements) {\n parentElement.insertBefore(element, nextPathElement)\n }\n } else if (!show) {\n childDataSignal?.destroy()\n elements.forEach((elem) => elem.remove())\n elements.splice(0, elements.length)\n }\n }\n\n showSignal.subscribe(toggle, {\n destroy: () => {\n childDataSignal?.destroy()\n },\n })\n if (ctx.env.runtime === 'preview' && ctx.toddle._preview) {\n ctx.toddle._preview.showSignal.subscribe(\n ({ displayedNodes, testMode }) => {\n if (displayedNodes.includes(path) && !testMode) {\n // only override the default show if we are in design mode (not test mode)\n toggle(true)\n } else {\n toggle(showSignal.get())\n }\n },\n )\n }\n\n firstRun = false\n return elements\n }\n\n function repeat(): ReadonlyArray<Element | Text> {\n let firstRun = true\n let repeatItems = new Map<\n string | number,\n {\n dataSignal: Signal<ComponentData>\n cleanup: () => void\n elements: ReadonlyArray<Element | Text>\n }\n >()\n const repeatSignal = dataSignal.map((data) => {\n const list = applyFormula(node?.repeat, {\n data,\n component: ctx.component,\n formulaCache: ctx.formulaCache,\n root: ctx.root,\n package: ctx.package,\n toddle: ctx.toddle,\n env: ctx.env,\n })\n if (typeof list !== 'object') {\n return []\n }\n return Object.entries(list ?? {})\n })\n\n repeatSignal.subscribe(\n (list) => {\n const newRepeatItems = new Map<\n string | number,\n {\n dataSignal: Signal<ComponentData>\n cleanup: () => void\n elements: ReadonlyArray<Element | Text>\n }\n >()\n\n for (let i = 0; i < list.length; i++) {\n const [Key, Item] = list[i]\n const childData = {\n ...dataSignal.get(),\n ListItem: {\n ...(dataSignal.get().ListItem\n ? { Parent: dataSignal.get().ListItem }\n : {}),\n Item,\n Index: Number(i),\n Key,\n },\n }\n let childKey = node?.repeatKey\n ? applyFormula(node.repeatKey, {\n data: childData,\n component: ctx.component,\n formulaCache: ctx.formulaCache,\n root: ctx.root,\n package: ctx.package,\n toddle: ctx.toddle,\n env: ctx.env,\n })\n : Key\n\n // Can't we just use the Item reference as key as we have fine-grained reactivity at this point?\n // That way we won't need repeatKey at all as everything will be optimized by reference?!?\n // https://github.com/solidjs/solid/discussions/366#discussioncomment-1220239\n // childKey = Item\n // Do fallback to Key(index) if repeatKey has duplicate values.\n // This will essentially disable the optimization for repeatKey and will always re-render the children on every change.\n if (newRepeatItems.has(childKey)) {\n console.warn(\n `Duplicate key \"${childKey}\" found in repeat. Fallback to index as key. This will cause a re-render of the duplicated children on every change.`,\n )\n childKey = Key\n }\n\n const existingItem = repeatItems.get(childKey)\n if (existingItem) {\n newRepeatItems.set(childKey, existingItem)\n existingItem.dataSignal.update((data) => {\n return {\n ...data,\n ListItem: {\n ...(dataSignal.get().ListItem\n ? { Parent: dataSignal.get().ListItem }\n : {}),\n Item,\n Index: Number(i),\n Key,\n },\n }\n })\n } else {\n const childDataSignal = signal<ComponentData>(childData)\n const cleanup = dataSignal.subscribe(\n (data) => {\n if (firstRun) {\n return\n }\n\n childDataSignal.update(({ ListItem }) => {\n return {\n ...data,\n ListItem,\n }\n })\n },\n {\n destroy: () => childDataSignal.destroy(),\n },\n )\n\n const args = {\n node: node!,\n id,\n dataSignal: childDataSignal,\n path: Key === '0' ? path : `${path}(${Key})`,\n ctx,\n namespace,\n parentElement,\n instance,\n }\n const elements = node!.condition ? conditional(args) : create(args)\n newRepeatItems.set(childKey, {\n dataSignal: childDataSignal,\n cleanup,\n elements,\n })\n }\n }\n\n // Cleanup removed items' data\n Array.from(repeatItems.entries()).forEach(([key, item]) => {\n if (!newRepeatItems.has(key)) {\n item.cleanup()\n item.dataSignal.destroy()\n item.elements.forEach((e) => e.remove())\n }\n })\n repeatItems = newRepeatItems\n\n // No reason to continue if we are on first run, as the render-phase for the parent\n // has not yet been reached, or if there are no items to render\n if (firstRun || repeatItems.size === 0) {\n return\n }\n\n if (!parentElement || ctx.root.contains(parentElement) === false) {\n console.error(\n `Repeat: Parent element does not exist for ${path}. This is likely due to the DOM being modified outside of Nordcraft.`,\n )\n return\n }\n\n ensureEfficientOrdering(\n parentElement,\n Array.from(repeatItems.values()).flatMap((e) => e.elements),\n getNextSiblingElement(path, parentElement),\n )\n },\n {\n destroy: () =>\n Array.from(repeatItems.values()).forEach((e) => {\n e.cleanup()\n e.dataSignal.destroy()\n e.elements.forEach((e) => e.remove())\n }),\n },\n )\n\n // We utilize that the signal subscription runs synchronously above,\n // so we already have a populated repeatItems map to return initially.\n // Note: `repeatItems.values()` is okay here, as maps' iterator is ordered by insertion.\n firstRun = false\n return Array.from(repeatItems.values()).flatMap((e) => e.elements)\n }\n\n if (node.repeat) {\n return repeat()\n }\n if (node.condition) {\n return conditional({\n node,\n dataSignal,\n ctx,\n id,\n path,\n namespace,\n parentElement,\n instance,\n })\n }\n return create({\n node,\n dataSignal,\n ctx,\n id,\n path,\n namespace,\n parentElement,\n instance,\n })\n}\nexport type NodeRenderer<NodeType> = {\n node: NodeType\n dataSignal: Signal<ComponentData>\n id: string\n path: string\n ctx: ComponentContext\n namespace?: SupportedNamespaces\n parentElement: Element | ShadowRoot\n instance: Record<string, string>\n}\n", "import { isLegacyApi, sortApiObjects } from '@nordcraft/core/dist/api/api'\nimport type {\n Component,\n ComponentData,\n} from '@nordcraft/core/dist/component/component.types'\nimport type { ToddleEnv } from '@nordcraft/core/dist/formula/formula'\nimport { applyFormula } from '@nordcraft/core/dist/formula/formula'\nimport { createStylesheet } from '@nordcraft/core/dist/styling/style.css'\nimport type { Theme } from '@nordcraft/core/dist/styling/theme'\nimport { theme as defaultTheme } from '@nordcraft/core/dist/styling/theme.const'\nimport type { Toddle } from '@nordcraft/core/dist/types'\nimport { mapObject } from '@nordcraft/core/dist/utils/collections'\nimport { isContextApiV2 } from '../api/apiUtils'\nimport { createLegacyAPI } from '../api/createAPI'\nimport { createAPI } from '../api/createAPIv2'\nimport { renderComponent } from '../components/renderComponent'\nimport { isContextProvider } from '../context/isContextProvider'\nimport type { Signal } from '../signal/signal'\nimport { signal } from '../signal/signal'\nimport type { ComponentContext, LocationSignal } from '../types'\n\n/**\n * Base class for all toddle components\n */\nexport class ToddleComponent extends HTMLElement {\n /**\n * Public reference to the toddle instance for debugging purposes. `el.toddle.errors` can be used to check for non-verbose errors.\n */\n toddle: Toddle<LocationSignal, never>\n #component: Component\n #ctx: ComponentContext\n #shadowRoot: ShadowRoot\n #signal: Signal<ComponentData>\n #files: { themes: Record<string, Theme> }\n\n constructor(\n component: Component,\n options: { components: Component[]; themes: Record<string, Theme> },\n toddle: Toddle<LocationSignal, never>,\n ) {\n super()\n this.toddle = toddle\n const internals = this.attachInternals()\n if (internals.shadowRoot) {\n // Not used yet, but can be used to hydrate rather than render the shadow dom\n this.#shadowRoot = internals.shadowRoot\n } else {\n this.#shadowRoot = this.attachShadow({ mode: 'open' })\n }\n\n const env: ToddleEnv = {\n branchName: toddle.branch || 'main',\n isServer: false,\n request: undefined,\n runtime: 'custom-element',\n logErrors: true,\n }\n\n this.#component = component\n this.#signal = createSignal({\n component,\n root: this.#shadowRoot,\n toddle,\n env,\n })\n this.#files = {\n themes: options.themes,\n }\n\n // Call the abort signal if the component's datasignal is destroyed (component unmounted) to cancel any pending requests\n const abortController = new AbortController()\n this.#signal.subscribe(() => {}, {\n destroy: () =>\n abortController.abort(`Component ${component.name} unmounted`),\n })\n\n this.#ctx = {\n triggerEvent: this.dispatch.bind(this),\n root: this.#shadowRoot,\n isRootComponent: true,\n components: options.components,\n component: this.#component,\n dataSignal: this.#signal,\n formulaCache: {},\n apis: {},\n abortSignal: abortController.signal,\n children: {},\n providers: {},\n package: undefined,\n toddle,\n env,\n }\n }\n\n connectedCallback() {\n sortApiObjects(Object.entries(this.#component.apis ?? {})).forEach(\n ([name, api]) => {\n if (isLegacyApi(api)) {\n this.#ctx.apis[name] = createLegacyAPI(api, this.#ctx)\n } else {\n this.#ctx.apis[name] = createAPI({\n apiRequest: api,\n ctx: this.#ctx,\n componentData: this.#signal.get(),\n })\n }\n },\n )\n Object.values(this.#ctx.apis)\n .filter(isContextApiV2)\n .forEach((api) => {\n api.triggerActions(this.#signal.get())\n })\n\n let providers = this.#ctx.providers\n if (isContextProvider(this.#component)) {\n // Subscribe to exposed formulas and update the component's data signal\n const formulaDataSignals = Object.fromEntries(\n Object.entries(this.#component.formulas ?? {})\n .filter(([, formula]) => formula.exposeInContext)\n .map(([name, formula]) => [\n name,\n this.#signal.map((data) =>\n applyFormula(formula.formula, {\n data,\n component: this.#component,\n formulaCache: this.#ctx.formulaCache,\n root: this.#ctx.root,\n package: this.#ctx.package,\n toddle: this.#ctx.toddle,\n env: this.#ctx.env,\n }),\n ),\n ]),\n )\n\n providers = {\n ...providers,\n [this.#component.name]: {\n component: this.#component,\n formulaDataSignals,\n ctx: this.#ctx,\n },\n }\n }\n\n this.#ctx.providers = providers\n this.render()\n }\n\n disconnectedCallback() {\n this.#signal.destroy()\n }\n\n dispatch(eventName: string, data: any) {\n this.dispatchEvent(\n new CustomEvent(eventName, {\n detail: data,\n bubbles: true,\n composed: true,\n }),\n )\n }\n\n render() {\n const elements = renderComponent({\n ...this.#ctx,\n path: '0',\n onEvent: this.dispatch.bind(this),\n parentElement: this.#shadowRoot,\n instance: { [this.#component.name]: 'root' },\n })\n\n this.#shadowRoot.innerHTML = ''\n const styles = createStylesheet(\n this.#ctx.component,\n this.#ctx.components,\n Object.entries(this.#files.themes ?? {}).length > 0\n ? this.#files.themes\n : { defaultTheme },\n { includeResetStyle: true, createFontFaces: false },\n )\n const stylesElem = document.createElement('style')\n stylesElem.appendChild(document.createTextNode(styles))\n this.#shadowRoot.appendChild(stylesElem)\n const rootElement = elements[0] as Element | null\n if (rootElement) {\n this.#shadowRoot.appendChild(rootElement)\n }\n }\n\n // Overload the setAttribute method to allow setting complex attributes\n setAttribute(name: string, value: unknown) {\n switch (typeof value) {\n case 'number':\n super.setAttribute(name, String(value))\n break\n case 'string':\n super.setAttribute(name, value)\n // Return early, as signal is updated through attributeChangedCallback on string values\n return this\n default:\n super.setAttribute(name, `[Object ${typeof value}]`)\n break\n }\n\n // Update the signal with complex value\n this.#signal.set({\n ...this.#signal.get(),\n Attributes: {\n ...this.#signal.get().Attributes,\n [name]: value,\n },\n })\n\n return this\n }\n\n // Overload the getAttribute method to point to source of truth (the signal)\n getAttribute<T>(name: string) {\n return (\n (this.#signal.get().Attributes[name] as T) || super.getAttribute(name)\n )\n }\n\n attributeChangedCallback(name: string, oldValue: never, newValue: string) {\n const attributeName = this.getAttributeCaseInsensitive(name)\n const currentRawValue = this.getAttribute(attributeName)\n // Is this is a complex value that has already been set by `setAttribute`\n if (newValue === '[Object object]') {\n return\n }\n\n //Has this just been set by `setAttribute` as a number\n if (parseFloat(newValue) === currentRawValue) {\n return\n }\n\n this.#signal.set({\n ...this.#signal.get(),\n Attributes: {\n ...this.#signal.get().Attributes,\n [attributeName]: newValue,\n },\n })\n }\n\n private getAttributeCaseInsensitive(name: string) {\n const attributeName = Object.keys(this.#signal.get().Attributes).find(\n (key) => key.toLowerCase() === name.toLowerCase(),\n )\n\n // This should never happen (TM) as we only observe attributes that are defined on the component\n if (!attributeName) {\n throw new Error(\n `Unable to find attribute ${name} on component ${this.#component.name}`,\n )\n }\n\n return attributeName\n }\n\n // Debugging purposes\n get __component() {\n return this.#component\n }\n\n get __ctx() {\n return this.#ctx\n }\n\n get __signal() {\n return this.#signal\n }\n}\n\nexport const createSignal = ({\n component,\n root,\n toddle,\n env,\n}: {\n component: Component\n root: ShadowRoot\n toddle: Toddle<LocationSignal, never>\n env: ToddleEnv\n}) => {\n return signal<ComponentData>({\n // Pages are not supported as custom elements, so no need to add location signal\n Location: undefined,\n Variables: mapObject(\n component.variables ?? {},\n ([name, { initialValue }]) => {\n if (!component) {\n throw new Error(`Component not found`)\n }\n return [\n name,\n applyFormula(initialValue, {\n data: {\n Attributes: {},\n },\n component: component,\n root,\n package: undefined,\n toddle,\n env,\n }),\n ]\n },\n ),\n Attributes: mapObject(component.attributes ?? {}, ([name]) => [\n name,\n // TODO: Perhaps we can get it from the DOM already and set initial attributes already?\n undefined,\n ]),\n Apis: mapObject(component.apis ?? {}, ([name]) => [\n name,\n { data: null, isLoading: false, error: null },\n ]),\n })\n}\n", "import type { Component } from '@nordcraft/core/dist/component/component.types'\nimport type { Theme } from '@nordcraft/core/dist/styling/theme'\nimport type { Toddle } from '@nordcraft/core/dist/types'\nimport { safeCustomElementName } from '@nordcraft/core/dist/utils/customElements'\nimport type { LocationSignal } from '../types'\nimport { ToddleComponent } from './ToddleComponent'\n\n/**\n * Define each component as a new web component\n *\n * Use them like: `<toddle-test my-attr=\"test\" style=\"--my-color: rebeccapurple\"></toddle-test>`\n *\n * You can access the component and `addEventListener` to it like:\n *\n * ```js\n * const component = document.querySelector('toddle-test')\n * component.addEventListener('my-event', (e) => {\n * console.log(e.detail)\n * })\n * ```\n *\n * @param componentNames - The names of the components to define. These should be the names of the components in the app context\n * @param options - A subset of the app context. This holds a list of all the components needed to define the components in `componentNames`\n * @param toddle - Also available at `window.toddle`. However, multiple instances of toddle can exist on the same page, so we pass a reference here. We should ultimately remove the global scope reference as polite web components should be self-contained.\n */\nexport const defineComponents = (\n componentNames: string[],\n options: {\n components: Component[]\n themes: Record<string, Theme>\n },\n toddle: Toddle<LocationSignal, never>,\n) => {\n componentNames\n .map<Component>(\n (name) =>\n options.components.find(\n (component) => component.name === name,\n ) as Component,\n )\n .forEach((component) => {\n const tag = safeCustomElementName(component.name)\n if (customElements.get(tag)) {\n // eslint-disable-next-line no-console\n console.warn(`Component ${tag} already defined`)\n return\n }\n\n customElements.define(\n tag,\n class extends ToddleComponent {\n constructor() {\n super(component, options, toddle)\n }\n\n // When read from DOM, all attributes are lower case, so we must observe them as such\n static get observedAttributes() {\n return Object.keys(component.attributes ?? {}).map((key) =>\n key.toLowerCase(),\n )\n }\n },\n )\n })\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["require_fast_deep_equal", "__commonJSMin", "exports", "module", "equal", "a", "b", "length", "i", "keys", "key", "actions_exports", "__export", "handler_exports", "handler_exports", "__export", "handler_default", "handler", "key", "handler_exports", "__export", "handler_default", "handler", "key", "value", "handler_exports", "__export", "handler_default", "isDefined", "value", "isObject", "input", "toBoolean", "handler", "delay", "ctx", "delayNumber", "isDefined", "interval", "handler_default", "handler_exports", "__export", "handler_default", "handler", "key", "handler_exports", "__export", "handler_default", "handler", "access_token", "ttl", "ctx", "query", "res", "handler_exports", "__export", "handler_default", "handler", "handler_exports", "__export", "handler_default", "handler", "handler_exports", "__export", "handler_default", "handler", "label", "data", "handler_exports", "__export", "handler_default", "handler", "name", "value", "ttl", "_sameSite", "_path", "_includeSubdomains", "ctx", "error", "message", "sameSite", "path", "includeSubdomains", "params", "res", "err", "handler_exports", "__export", "handler_default", "handler", "key", "value", "handler_exports", "__export", "handler_default", "handler", "value", "handler_exports", "__export", "handler_default", "handler", "_", "_ctx", "event", "handler_exports", "__export", "handler_default", "handler", "name", "value", "ttl", "_sameSite", "_path", "_includeSubdomains", "ctx", "error", "message", "sameSite", "path", "includeSubdomains", "cookie", "date", "handler_exports", "__export", "handler_default", "handler", "elem", "handler_exports", "__export", "handler_default", "handler", "_", "_ctx", "event", "handler_exports", "__export", "handler_default", "handler", "url", "title", "text", "validInput", "value", "isDefined", "data", "handler_default", "handler_exports", "__export", "handler_default", "handler", "delay", "ctx", "delayNumber", "isDefined", "timeout", "handler_default", "handler_exports", "__export", "handler_default", "handler", "url", "ctx", "formulas_exports", "__export", "handler_exports", "handler_exports", "__export", "handler_default", "handler", "input", "handler_exports", "__export", "handler_default", "handler", "_", "env", "lang", "handler_exports", "__export", "handler_default", "handler", "inputString", "regex", "globalFlag", "ignoreCaseFlag", "multiLineFlag", "flags", "toBoolean", "re", "handler_default", "handler_exports", "__export", "handler_default", "handler", "URIComponent", "handler_exports", "__export", "handler_default", "handler", "a", "handler_exports", "__export", "handler_default", "handler", "input", "toBoolean", "handler_default", "handler_exports", "__export", "handler_default", "handler", "input", "firstChar", "handler_exports", "__export", "handler_default", "handler", "a", "b", "handler_exports", "__export", "handler_default", "handler", "URIComponent", "handler_exports", "__export", "handler_default", "handler", "input", "handler_exports", "__export", "handler_default", "handler", "data", "indent", "handler_exports", "__export", "handler_default", "handler", "list", "count", "handler_exports", "__export", "handler_default", "handler", "timestamp", "handler_exports", "__export", "handler_default", "handler", "list", "separator", "handler_exports", "__export", "handler_default", "handler", "value", "min", "max", "handler_exports", "__export", "handler_default", "handler", "input", "decimals", "multiplier", "handler_exports", "__export", "handler_default", "handler", "a", "b", "first", "second", "handler_exports", "__export", "handler_default", "getArgumentInputData", "handler", "array", "formula", "ascending", "ascendingModifier", "a", "b", "keyA", "keyB", "items", "argIndex", "input", "handler_exports", "__export", "handler_default", "getArgumentInputData", "handler", "items", "fx", "item", "index", "key", "value", "res", "argIndex", "input", "first", "handler_exports", "__export", "handler_default", "getArgumentInputData", "handler", "items", "fx", "item", "index", "key", "value", "argIndex", "input", "first", "handler_exports", "__export", "handler_default", "handler", "list", "sum", "n", "handler_exports", "__export", "handler_default", "handler", "handler_exports", "__export", "handler_default", "handler", "n", "handler_exports", "__export", "handler_default", "handler", "date", "loc", "opt", "locales", "l", "validateString", "value", "allowedValues", "options", "dateStyle", "timeStyle", "calendar", "weekday", "era", "year", "month", "day", "hour", "minute", "second", "timeZoneName", "timeZone", "hour12", "handler_exports", "__export", "handler_default", "handler", "a", "b", "handler_exports", "__export", "handler_default", "handler", "handler_exports", "__export", "handler_default", "handler", "list", "value", "handler_exports", "__export", "handler_default", "getArgumentInputData", "handler", "items", "func", "res", "index", "item", "key", "argIndex", "input", "handler_exports", "__export", "handler_default", "handler", "list", "handler_exports", "__export", "handler_default", "iso8601Regex", "parseJSONWithDate", "input", "_", "value", "handler", "data", "parseJSONWithDate", "handler_default", "handler_exports", "__export", "handler_default", "handler", "input", "handler_exports", "__export", "handler_default", "handler", "input", "decimals", "multiplier", "handler_exports", "__export", "handler_default", "handler", "list", "count", "handler_exports", "__export", "handler_default", "handler", "url", "title", "text", "isDefined", "validInput", "value", "data", "handler_default", "handler_exports", "__export", "handler_default", "handler", "list", "object", "key", "value", "handler_exports", "__export", "handler_default", "handler", "first", "second", "handler_exports", "__export", "handler_default", "handler", "collection", "item", "collectionItem", "handler_exports", "__export", "handler_default", "handler", "a", "handler_exports", "__export", "handler_default", "handler", "_", "ctx", "handler_exports", "__export", "handler_default", "NCURL", "url", "p", "i", "handler", "base", "handler_exports", "__export", "handler_default", "handler", "first", "second", "handler_exports", "__export", "handler_default", "handler", "value", "handler_exports", "__export", "handler_default", "getArgumentInputData", "handler", "items", "fx", "item", "index", "key", "value", "argIndex", "input", "first", "handler_exports", "__export", "handler_default", "handler", "first", "second", "handler_exports", "__export", "handler_default", "handler", "list", "value", "handler_exports", "__export", "handler_default", "handler", "key", "value", "handler_exports", "__export", "handler_default", "handler", "list", "set", "item", "key", "handler_exports", "__export", "handler_default", "handler", "items", "result", "item", "isObject", "handler_default", "handler_exports", "__export", "handler_default", "handler", "list", "count", "handler_exports", "__export", "handler_default", "handler", "collection", "key", "resolve", "path", "head", "rest", "handler_exports", "__export", "handler_default", "handler", "input", "handler_exports", "__export", "handler_default", "handler", "a", "b", "handler_exports", "__export", "handler_default", "handler", "list", "handler_exports", "__export", "handler_default", "handler", "data", "indentation", "indent", "handler_exports", "__export", "handler_default", "handler", "args", "handler_exports", "__export", "handler_default", "handler", "date", "handler_exports", "__export", "handler_default", "handler", "collection", "key", "run", "path", "index", "_", "i", "e", "isObject", "k", "handler_default", "handler_exports", "__export", "handler_default", "handler", "args", "handler_exports", "__export", "handler_default", "handler", "list", "handler_exports", "__export", "handler_default", "handler", "_", "ctx", "handler_exports", "__export", "handler_default", "handler", "first", "second", "handler_exports", "__export", "handler_default", "handler", "collection", "isObject", "handler_default", "handler_exports", "__export", "handler_default", "getArgumentInputData", "handler", "items", "fx", "init", "result", "item", "index", "key", "value", "_", "argIndex", "input", "first", "handler_exports", "__export", "handler_default", "handler", "collection", "key", "value", "ctx", "head", "rest", "isObject", "clone", "handler_default", "handler_exports", "__export", "handler_default", "getArgumentInputData", "handler", "items", "fx", "item", "index", "key", "value", "argIndex", "input", "first", "handler_exports", "__export", "handler_default", "handler", "object", "key", "value", "handler_exports", "__export", "handler_default", "handler", "items", "handler_exports", "__export", "handler_default", "handler", "list", "count", "handler_exports", "__export", "handler_default", "handler", "a", "b", "handler_exports", "__export", "handler_default", "getArgumentInputData", "handler", "items", "fx", "item", "index", "key", "value", "argIndex", "input", "first", "handler_exports", "__export", "handler_default", "getArgumentInputData", "handler", "items", "func", "item", "index", "key", "value", "argIndex", "input", "first", "handler_exports", "__export", "handler_default", "handler", "key", "value", "handler_exports", "__export", "handler_default", "handler", "a", "handler_exports", "__export", "handler_default", "handler", "list", "shuffle", "input", "array", "i", "j", "handler_exports", "__export", "handler_default", "handler", "numbers", "n", "result", "handler_exports", "__export", "handler_default", "handler", "values", "value", "toBoolean", "handler_default", "handler_exports", "__export", "handler_default", "handler", "input", "decimals", "multiplier", "handler_exports", "__export", "handler_default", "handler", "collection", "item", "fastIndex", "i", "handler_exports", "__export", "handler_default", "handler", "date", "handler_exports", "__export", "handler_default", "handler", "name", "env", "root", "row", "handler_exports", "__export", "handler_default", "handler", "collection", "item", "fastIndex", "i", "handler_exports", "__export", "handler_default", "handler", "_", "env", "handler_exports", "__export", "handler_default", "handler", "input", "searchValue", "replaceValue", "handler_exports", "__export", "handler_default", "handler", "id", "root", "handler_exports", "__export", "handler_default", "handler", "_", "env", "handler_exports", "__export", "handler_default", "handler", "collection", "prefix", "handler_exports", "__export", "handler_default", "STRING_TEMPLATE", "type", "name", "templateTypes", "handler", "name", "STRING_TEMPLATE", "handler_default", "handler_exports", "__export", "handler_default", "handler", "numbers", "n", "product", "num", "handler_exports", "__export", "handler_default", "getArgumentInputData", "handler", "items", "fx", "item", "index", "key", "value", "argIndex", "input", "first", "handler_exports", "__export", "handler_default", "handler", "min", "max", "_", "i", "handler_exports", "__export", "handler_default", "handler", "str", "handler_exports", "__export", "handler_default", "handler", "a", "toBoolean", "handler_default", "handler_exports", "__export", "handler_default", "handler", "input", "loc", "opt", "locales", "l", "validateString", "value", "allowedValues", "options", "style", "currency", "currencyDisplay", "unit", "unitDisplay", "minimumIntegerDigits", "minimumFractionDigits", "maximumFractionDigits", "minimumSignificantDigits", "maximumSignificantDigits", "notation", "compactDisplay", "validGroupingValues", "useGrouping", "handler_exports", "__export", "handler_default", "handler", "a", "b", "handler_exports", "__export", "handler_default", "getArgumentInputData", "handler", "items", "func", "list", "res", "i", "item", "key", "argIndex", "input", "first", "handler_exports", "__export", "handler_default", "handler", "input", "handler_exports", "__export", "handler_default", "handler", "inputString", "delimiter", "import_fast_deep_equal", "safeCustomElementName", "name", "tag", "isFormula", "f", "isToddleFormula", "formula", "isDefined", "applyFormula", "ctx", "isFormula", "input", "key", "branch", "toBoolean", "entry", "packageName", "newFunc", "args", "arg", "i", "Args", "e", "legacyFunc", "componentFormula", "Input", "data", "cache", "result", "mapObject", "object", "f", "mapValues", "key", "value", "omit", "collection", "rest", "clone", "isDefined", "omitKeys", "keys", "k", "omitPaths", "acc", "get", "collection", "head", "rest", "headItem", "isDefined", "sortObjectEntries", "object", "f", "ascending", "easySort", "collection", "a", "b", "keyA", "keyB", "hash", "data", "seed", "h1", "h2", "i", "ch", "ApiMethod", "isJsonHeader", "header", "isTextHeader", "isEventStreamHeader", "isJsonStreamHeader", "isImageHeader", "mapHeadersToObject", "headers", "headersObject", "key", "value", "getFormulasInFormula", "formula", "globalFormulas", "_path", "_visitedFormulas", "_packageName", "isDefined", "path", "packageName", "visitedFormulas", "key", "entry", "formulaKey", "shouldVisitFormula", "globalFormula", "arg", "isToddleFormula", "c", "getFormulasInAction", "action", "inputKey", "input", "a", "isFormula", "eventKey", "event", "actionKey", "LegacyToddleApi", "api", "key", "globalFormulas", "apis", "visitFormulaReference", "formula", "isDefined", "apiName", "entry", "arg", "c", "p", "q", "isFormula", "h", "apiKey", "getFormulasInFormula", "pathKey", "path", "queryParamKey", "queryParam", "headerKey", "header", "actionKey", "action", "getFormulasInAction", "getActionsInAction", "action", "path", "isDefined", "key", "a", "eventKey", "event", "c", "actionKey", "ToddleApiV2", "api", "apiKey", "globalFormulas", "apis", "visitFormulaReference", "formula", "isDefined", "apiName", "entry", "arg", "c", "p", "h", "q", "rule", "headers", "input", "value", "getFormulasInFormula", "pathKey", "path", "queryParamKey", "queryParam", "headerKey", "header", "HttpMethodsWithAllowedBody", "actionKey", "action", "getFormulasInAction", "getActionsInAction", "isLegacyApi", "api", "LegacyToddleApi", "createApiRequest", "formulaContext", "baseUrl", "defaultHeaders", "url", "getUrl", "requestSettings", "getRequestSettings", "urlPathname", "urlQueryParams", "parsedUrl", "applyFormula", "urlInput", "pathParams", "getRequestPath", "path", "queryParams", "getRequestQueryParams", "queryString", "hash", "hashString", "combinedUrl", "HttpMethodsWithAllowedBody", "ApiMethod", "applyAbortSignal", "timeout", "method", "headers", "getRequestHeaders", "body", "getRequestBody", "sortObjectEntries", "_", "p", "params", "key", "param", "isDefined", "value", "v", "isObject", "encodeObject", "obj", "prefix", "val", "apiHeaders", "requestHash", "url", "request", "hash", "omitKeys", "isApiError", "apiName", "response", "formulaContext", "errorFormula", "performance", "errorFormulaRes", "applyFormula", "toBoolean", "getRequestBody", "api", "headers", "method", "HttpMethodsWithAllowedBody", "body", "contentType", "isDefined", "isJsonHeader", "key", "value", "v", "formData", "createApiEvent", "eventName", "detail", "compareApiDependencies", "a", "b", "isADependentOnB", "isBDependentOnA", "sortApiObjects", "apis", "apiMap", "getApi", "apiObj", "ToddleApiV2", "LegacyToddleApi", "aKey", "aObj", "bKey", "bObj", "phash", "h", "x", "i", "hash", "AD_REPLACER_R", "getAlphabeticChar", "code", "generateAlphabeticName", "name", "x", "AD_REPLACER_R", "getClassName", "object", "generateAlphabeticName", "hash", "toValidClassName", "input", "escapeSpecialCharacters", "className", "match", "stringifySyntaxNode", "node", "renderSyntaxDefinition", "key", "syntax", "inherits", "initialValue", "theme", "value", "solveVarRecursively", "isDefined", "FALLBACK_VALUES", "depth", "VAR_REGEX", "match", "varName", "def", "returnValue", "appendUnit", "unit", "CUSTOM_PROPERTIES_STYLESHEET_ID", "RESET_STYLES", "theme", "getThemeCss", "themes", "options", "themesV1", "themesV2", "legacy", "modern", "key", "value", "t", "getOldThemeCss", "themeV2", "propertyName", "property", "renderSyntaxDefinition", "renderThemeValues", "getThemeEntries", "_t", "RESET_STYLES", "fonts", "font", "variant", "color", "group", "fontSize", "variable", "fontWeight", "shadow", "borderRadius", "token", "spacing", "zIndex", "theme", "colorVars", "variants", "name", "family", "fallback", "selector", "entries", "mediaQuery", "css", "themeName", "definition", "isDefined", "variantSelector", "variant", "LEGACY_BREAKPOINTS", "kebabCase", "string", "char", "SIZE_PROPERTIES", "createStylesheet", "root", "components", "themes", "options", "hashes", "animationHashes", "fonts", "getAllFonts", "stylesheet", "getThemeCss", "key", "theme", "value", "styleToCss", "style", "property", "isDefined", "propertyName", "propertyValue", "getNodeStyles", "node", "classHash", "omitKeys", "styleVariants", "renderVariant", "selector", "scrollbarStyles", "styles", "_", "variant", "renderedVariant", "variantSelector", "animationName", "keyframes", "a", "b", "position", "e", "visitedComponents", "insertComponentStyles", "component", "package_name", "id", "childComponent", "c", "toValidClassName", "getClassName", "v", "f", "isContextApiV2", "api", "import_fast_deep_equal", "lexer", "str", "tokens", "i", "char", "name", "j", "code", "count", "pattern", "parse", "options", "_a", "prefixes", "_b", "delimiter", "result", "key", "path", "tryConsume", "type", "mustConsume", "value", "nextType", "index", "consumeText", "isSafe", "_i", "delimiter_1", "safePattern", "prefix", "prev", "prevText", "escapeString", "open", "name_1", "pattern_1", "suffix", "compile", "tokensToFunction", "reFlags", "flags", "encode", "x", "validate", "matches", "token", "data", "optional", "repeat", "segment", "typeOfMessage", "escapeString", "str", "flags", "options", "getLocationUrl", "query", "page", "route", "params", "hash", "path", "pathSegments", "segment", "segmentValue", "isDefined", "compile", "hashString", "queryString", "_", "q", "key", "value", "handleAction", "action", "data", "ctx", "event", "workflowCallback", "actionList", "condition", "toBoolean", "applyFormula", "value", "payload", "current", "historyMode", "newLocation", "p", "omitKeys", "isDefined", "currentUrl", "getLocationUrl", "historyUrl", "parameters", "queryUpdates", "pathUpdates", "urlParameterCtx", "isValidPathParameter", "param", "isValidQueryParameter", "q", "parameter", "formula", "fastDeepEqual", "api", "isContextApiV2", "actionInputs", "mapValues", "input", "actionModels", "triggerActions", "actions", "subAction", "callbacks", "provider", "workflow", "callbackName", "callbackData", "triggerActionEvent", "trigger", "eventData", "subEvent", "newAction", "args", "arg", "result", "cleanup", "err", "legacyHandler", "e", "createLegacyAPI", "api", "ctx", "timer", "constructPayload", "data", "formulaContext", "baseUrl", "applyFormula", "urlPath", "p", "queryParams", "queryString", "param", "headers", "isFormula", "mapValues", "value", "contentType", "key", "method", "body", "encodeBody", "getBody", "res", "textBody", "parseJSONWithDate", "v", "formData", "apiSuccess", "action", "handleAction", "apiError", "error", "execute", "payload", "response", "trigger", "resolve", "reject", "payloadSignal", "firstRun", "cached", "request", "apiPayload", "mapHeadersToObject", "validateUrl", "path", "origin", "urlObject", "searchCopy", "value", "key", "PROXY_URL_HEADER", "PROXY_TEMPLATES_IN_BODY", "createAPI", "apiRequest", "initialComponentData", "ctx", "timer", "api", "constructRequest", "componentData", "baseUrl", "request", "createApiRequest", "getFormulaContext", "formulaContext", "evaluatedInputs", "acc", "key", "value", "applyFormula", "data", "handleRedirectRules", "ruleName", "rule", "sortObjectEntries", "_", "location", "url", "validateUrl", "triggerActions", "eventName", "workflowCallback", "event", "createApiEvent", "action", "handleAction", "apiSuccess", "performance", "latestRequestStart", "appliedRedirectRule", "apiError", "execute", "requestSettings", "run", "response", "proxyUrl", "headers", "PROXY_URL_HEADER", "toBoolean", "PROXY_TEMPLATES_IN_BODY", "handleResponse", "error", "body", "resolve", "reject", "res", "parserMode", "contentType", "isEventStreamHeader", "isJsonHeader", "isTextHeader", "isJsonStreamHeader", "isImageHeader", "textStreamResponse", "jsonResponse", "eventStreamingResponse", "jsonStreamResponse", "blobResponse", "handleStreaming", "chunk", "chunks", "parsedData", "status", "mapHeadersToObject", "endResponse", "blob", "id", "retry", "streamType", "useTextDecoder", "parseChunk", "parseChunksForData", "delimiters", "parsedChunk", "delimiter", "d", "concatenated", "split", "c", "reader", "done", "parsed", "apiStatus", "isApiError", "getApiForComparison", "omitPaths", "payloadSignal", "payloadContext", "apiData", "cacheMatch", "isDefined", "requestHash", "actionInputs", "actionModels", "inputs", "inputName", "input", "apiWithInputsAndActions", "newApi", "updateContext", "autoFetch", "import_fast_deep_equal", "BatchQueue", "callback", "import_fast_deep_equal", "Signal", "value", "fastDeepEqual", "subscriber", "f", "notify", "config", "subscription", "signal2", "signal", "getNextSiblingElement", "path", "parentElement", "lastPathPart", "index", "repeatIndex", "child", "lastChildPathPart", "childIndex", "ensureEfficientOrdering", "items", "nextElement", "insertBeforeElement", "currentMarker", "i", "item", "getNodeSelector", "path", "componentName", "nodeId", "variant", "selector", "variantSelector", "isContextProvider", "component", "exposeInContext", "subscribeToContext", "componentDataSignal", "component", "ctx", "providerName", "context", "provider", "isDefined", "formulaName", "formulaDataSignal", "value", "data", "testProvider", "comp", "testProviderPackage", "formulaContext", "mapObject", "name", "attr", "testValue", "variable", "applyFormula", "formula", "registerComponentToLogState", "component", "dataSignal", "createFormulaCache", "component", "isDefined", "mapObject", "name", "f", "canCache", "keys", "getFormulaCacheConfig", "cacheInput", "cacheData", "data", "key", "get", "result", "formula", "paths", "visitOperation", "op", "arg", "b", "path", "k", "CustomPropertyStyleSheet", "_CustomPropertyStyleSheet", "root", "styleSheet", "selector", "name", "options", "fullSelector", "rule", "ruleIndex", "newRule", "value", "i", "result", "key", "customPropertiesStylesheet", "subscribeCustomProperty", "selector", "customPropertyName", "signal", "variant", "root", "runtime", "CustomPropertyStyleSheet", "CUSTOM_PROPERTIES_STYLESHEET_ID", "createComponent", "node", "path", "dataSignal", "ctx", "parentElement", "instance", "namespace", "nodeLookupKey", "isDefined", "component", "comp", "c", "attributesSignal", "data", "mapObject", "attr", "value", "applyFormula", "customPropertyName", "customProperty", "subscribeCustomProperty", "getNodeSelector", "appendUnit", "variant", "componentDataSignal", "signal", "name", "api", "subscribeToContext", "variable", "registerComponentToLogState", "abortController", "formulaCache", "createFormulaCache", "apis", "sortApiObjects", "isLegacyApi", "createLegacyAPI", "eventTrigger", "eventHandler", "e", "action", "handleAction", "createAPI", "isContextApiV2", "onEvent", "providers", "isContextProvider", "formulaDataSignals", "formula", "children", "i", "childId", "slotName", "Attributes", "renderComponent", "getDragData", "event", "dragData", "item", "getElementTagName", "node", "ctx", "id", "setAttribute", "elem", "attr", "value", "toBoolean", "val", "isDefined", "createElement", "node", "dataSignal", "id", "path", "ctx", "namespace", "instance", "tag", "getElementTagName", "elem", "classHash", "getClassName", "key", "value", "toValidClassName", "className", "formula", "data", "toBoolean", "applyFormula", "show", "attr", "isDefined", "o", "setupAttribute", "setAttribute", "val", "testMode", "styleVariable", "name", "unit", "customPropertyName", "subscribeCustomProperty", "getNodeSelector", "appendUnit", "variant", "eventHandlers", "event", "getEventHandler", "eventName", "handler", "nodeTag", "textValues", "child", "textSignal", "valueSignal", "childNodes", "i", "createNode", "e", "action", "getDragData", "dragData", "item", "handleAction", "createSlot", "path", "node", "dataSignal", "ctx", "parentElement", "instance", "namespace", "slotName", "children", "child", "childDataSignal", "data", "createNode", "i", "webComponentSlot", "createText", "node", "id", "path", "dataSignal", "namespace", "ctx", "createTextNS", "value", "elem", "data", "applyFormula", "textNode", "createNode", "id", "dataSignal", "path", "ctx", "namespace", "parentElement", "instance", "node", "create", "props", "createElement", "isLocalComponent", "c", "createComponent", "createText", "createSlot", "conditional", "firstRun", "childDataSignal", "showSignal", "data", "toBoolean", "applyFormula", "elements", "toggle", "show", "nextPathElement", "getNextSiblingElement", "element", "elem", "displayedNodes", "testMode", "repeat", "repeatItems", "list", "newRepeatItems", "i", "Key", "Item", "childData", "childKey", "existingItem", "signal", "cleanup", "ListItem", "args", "key", "item", "e", "ensureEfficientOrdering", "BATCH_QUEUE", "BatchQueue", "renderComponent", "component", "dataSignal", "onEvent", "isRootComponent", "path", "children", "formulaCache", "components", "apis", "abortSignal", "root", "providers", "packageName", "parentElement", "instance", "toddle", "namespace", "env", "ctx", "rootElem", "createNode", "prev", "data", "props", "action", "handleAction", "changes", "key", "value", "fastDeepEqual", "ToddleComponent", "#component", "#ctx", "#shadowRoot", "#signal", "#files", "component", "options", "toddle", "internals", "env", "createSignal", "abortController", "sortApiObjects", "name", "api", "isLegacyApi", "createLegacyAPI", "createAPI", "isContextApiV2", "providers", "isContextProvider", "formulaDataSignals", "formula", "data", "applyFormula", "eventName", "elements", "renderComponent", "styles", "createStylesheet", "theme", "stylesElem", "rootElement", "value", "oldValue", "newValue", "attributeName", "currentRawValue", "key", "root", "signal", "mapObject", "initialValue", "defineComponents", "componentNames", "options", "toddle", "name", "component", "tag", "safeCustomElementName", "ToddleComponent", "key", "loadCorePlugins", "toddle", "fastDeepEqual", "formulas_exports", "name", "module", "actions_exports"]
7
7
  }