@next-core/runtime 1.54.9 → 1.54.11

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.
Files changed (37) hide show
  1. package/dist/cjs/CustomTemplates.js +1 -1
  2. package/dist/cjs/CustomTemplates.js.map +1 -1
  3. package/dist/cjs/createRoot.js +2 -16
  4. package/dist/cjs/createRoot.js.map +1 -1
  5. package/dist/cjs/internal/ErrorNode.js +148 -0
  6. package/dist/cjs/internal/ErrorNode.js.map +1 -0
  7. package/dist/cjs/internal/Renderer.js +3 -17
  8. package/dist/cjs/internal/Renderer.js.map +1 -1
  9. package/dist/cjs/internal/RendererContext.js +4 -0
  10. package/dist/cjs/internal/RendererContext.js.map +1 -1
  11. package/dist/cjs/internal/Router.js +5 -26
  12. package/dist/cjs/internal/Router.js.map +1 -1
  13. package/dist/cjs/internal/Runtime.js +17 -28
  14. package/dist/cjs/internal/Runtime.js.map +1 -1
  15. package/dist/cjs/internal/i18n.js +23 -2
  16. package/dist/cjs/internal/i18n.js.map +1 -1
  17. package/dist/esm/CustomTemplates.js +1 -1
  18. package/dist/esm/CustomTemplates.js.map +1 -1
  19. package/dist/esm/createRoot.js +2 -16
  20. package/dist/esm/createRoot.js.map +1 -1
  21. package/dist/esm/internal/ErrorNode.js +140 -0
  22. package/dist/esm/internal/ErrorNode.js.map +1 -0
  23. package/dist/esm/internal/Renderer.js +3 -17
  24. package/dist/esm/internal/Renderer.js.map +1 -1
  25. package/dist/esm/internal/RendererContext.js +4 -0
  26. package/dist/esm/internal/RendererContext.js.map +1 -1
  27. package/dist/esm/internal/Router.js +6 -27
  28. package/dist/esm/internal/Router.js.map +1 -1
  29. package/dist/esm/internal/Runtime.js +9 -13
  30. package/dist/esm/internal/Runtime.js.map +1 -1
  31. package/dist/esm/internal/i18n.js +23 -2
  32. package/dist/esm/internal/i18n.js.map +1 -1
  33. package/dist/types/internal/ErrorNode.d.ts +8 -0
  34. package/dist/types/internal/RendererContext.d.ts +8 -4
  35. package/dist/types/internal/Runtime.d.ts +5 -0
  36. package/dist/types/internal/i18n.d.ts +8 -1
  37. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"CustomTemplates.js","names":["uniq","isStrictMode","warnAboutStrictMode","getV2RuntimeFromDll","allowedNativeProps","Set","_registry","WeakMap","CustomTemplateRegistry","constructor","_classPrivateFieldInitSpec","Map","define","tagName","_constructor$proxy","_compatibleConstructo","registered","_classPrivateFieldGet","has","console","warn","customElements","get","strict","proxyProperties","proxy","properties","validProxyProps","legacyTplVariables","key","value","Object","entries","asVariable","push","mergeProperty","refTransform","error","ref","compatibleConstructor","fromEntries","state","map","item","expose","concat","tpl","name","set","exposedStates","getExposedStates","proxyMethods","methods","props","entry","nativeProps","filter","prop","HTMLElement","prototype","length","Error","p","join","TplElement","$$typeof","_dev_only_definedProperties","_dev_only_definedMethods","$$getElementByRef","_this$$$tplStateStore","$$tplStateStore","hostBrick","tplHostMetadata","internalBricksByRef","element","connectedCallback","shadowRoot","attachShadow","mode","fragment","document","createDocumentFragment","style","createElement","textContent","slot","appendChild","disconnectedCallback","propName","some","defineProperty","getValue","_this$$$tplStateStore2","updateValue","enumerable","from","to","refProperty","_this$$$getElementByR","call","refMethod","arguments","getCustomTemplatesV2","v2Kit","freeze","getRuntime","registerCustomTemplate","customTemplates"],"sources":["../../src/CustomTemplates.ts"],"sourcesContent":["import type {\n ContextConf,\n CustomTemplate,\n CustomTemplateConstructor,\n CustomTemplateProxyBasicProperty,\n} from \"@next-core/types\";\nimport { uniq } from \"lodash\";\nimport type { RuntimeBrickElement } from \"./internal/interfaces.js\";\nimport { isStrictMode, warnAboutStrictMode } from \"./isStrictMode.js\";\nimport { getV2RuntimeFromDll } from \"./getV2RuntimeFromDll.js\";\n\n// Note: `prefix` is a native prop on Element, but it's only used in XML documents.\nconst allowedNativeProps = new Set([\"prefix\"]);\n\ninterface LegacyTplPropProxy extends CustomTemplateProxyBasicProperty {\n asVariable?: boolean;\n mergeProperty?: unknown;\n refTransform?: unknown;\n}\n\nclass CustomTemplateRegistry {\n readonly #registry = new Map<string, CustomTemplate>();\n\n define(tagName: string, constructor: CustomTemplateConstructor): void {\n let registered = this.#registry.has(tagName);\n if (registered) {\n // When open launchpad, the storyboard will be updated.\n // However, we can't *undefine* a custom element.\n // Just ignore re-registering custom templates.\n // eslint-disable-next-line no-console\n console.warn(`Custom template of \"${tagName}\" already registered.`);\n } else {\n registered = !!customElements.get(tagName);\n if (registered) {\n // eslint-disable-next-line no-console\n console.warn(\n `Custom template of \"${tagName}\" already defined by customElements.`\n );\n }\n }\n\n // Transform legacy `proxy.properties[].asVariable` as states.\n const strict = isStrictMode();\n const proxyProperties = (constructor.proxy?.properties ?? {}) as {\n [name: string]: LegacyTplPropProxy;\n };\n const validProxyProps: [string, CustomTemplateProxyBasicProperty][] = [];\n const legacyTplVariables: string[] = [];\n for (const [key, value] of Object.entries(proxyProperties)) {\n if (value.asVariable) {\n warnAboutStrictMode(strict, \"Template `asVariable`\", tagName, key);\n // istanbul ignore next\n if (!strict) {\n // For existed TPL usage, treat it as a STATE.\n legacyTplVariables.push(key);\n }\n } else if (value.mergeProperty || value.refTransform) {\n // eslint-disable-next-line no-console\n console.error(\n \"Template `mergeProperty` and `refTransform` are dropped in v3:\",\n tagName,\n key\n );\n } else if (value.ref) {\n validProxyProps.push([key, value]);\n }\n // Else: documentation only, for exposed states.\n }\n\n const compatibleConstructor = {\n ...constructor,\n proxy: {\n ...constructor.proxy,\n properties: Object.fromEntries(validProxyProps),\n },\n state: (constructor.state\n ? strict\n ? constructor.state\n : constructor.state.map((item) => ({\n // Make `expose` defaults to true in non-strict mode.\n expose: true,\n ...item,\n }))\n : []\n ).concat(legacyTplVariables.map((tpl) => ({ name: tpl, expose: true }))),\n };\n\n // Now we allow re-register custom template\n this.#registry.set(tagName, {\n ...compatibleConstructor,\n name: tagName,\n });\n\n const exposedStates = getExposedStates(compatibleConstructor.state);\n const proxyMethods = Object.entries(\n compatibleConstructor.proxy?.methods ?? {}\n );\n\n const props = exposedStates.concat(\n validProxyProps.map((entry) => entry[0])\n );\n const methods = proxyMethods.map((entry) => entry[0]);\n\n const nativeProps = props\n .concat(methods)\n .filter(\n (prop) => prop in HTMLElement.prototype && !allowedNativeProps.has(prop)\n );\n if (nativeProps.length > 0) {\n warnAboutStrictMode(\n strict,\n \"Using native HTMLElement properties as template properties or methods\",\n tagName,\n ...nativeProps\n );\n // istanbul ignore next\n if (strict) {\n throw new Error(\n `In custom template \"${tagName}\", ${nativeProps\n .map((p) => `\"${p}\"`)\n .join(\n \", \"\n )} are native HTMLElement properties, and should be avoid to be used as brick properties or methods.`\n );\n }\n }\n\n if (registered) {\n return;\n }\n\n class TplElement extends HTMLElement {\n get $$typeof() {\n return \"custom-template\" as const;\n }\n\n static get _dev_only_definedProperties(): string[] {\n return props;\n }\n\n static get _dev_only_definedMethods(): string[] {\n return methods;\n }\n\n $$getElementByRef(this: RuntimeBrickElement, ref: string) {\n return this.$$tplStateStore?.hostBrick?.tplHostMetadata?.internalBricksByRef.get(\n ref\n )?.element;\n }\n\n connectedCallback() {\n let shadowRoot = this.shadowRoot;\n if (!shadowRoot) {\n shadowRoot = this.attachShadow({ mode: \"open\" });\n }\n const fragment = document.createDocumentFragment();\n const style = document.createElement(\"style\");\n style.textContent = \":host{display:block}:host([hidden]){display:none}\";\n const slot = document.createElement(\"slot\");\n fragment.appendChild(style);\n fragment.appendChild(slot);\n shadowRoot.appendChild(fragment);\n }\n\n disconnectedCallback() {\n if (this.shadowRoot) {\n this.shadowRoot.textContent = \"\";\n }\n }\n }\n\n for (const propName of exposedStates) {\n if (validProxyProps.some((entry) => entry[0] === propName)) {\n // eslint-disable-next-line no-console\n console.error(\n `Cannot define an exposed state that is also a proxy property: \"${propName}\" in ${tagName}`\n );\n continue;\n }\n Object.defineProperty(TplElement.prototype, propName, {\n get(this: RuntimeBrickElement) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return this.$$tplStateStore!.getValue(propName);\n },\n set(this: RuntimeBrickElement, value: unknown) {\n // 在 mount 过程中,先设置属性,再设置 `$$tplStateStore`,这样,当触发属性设置时,\n // 避免初始化的一次 state update 操作及其 onChange 事件。\n this.$$tplStateStore?.updateValue(propName, value, \"replace\");\n },\n enumerable: true,\n });\n }\n\n for (const [from, to] of validProxyProps) {\n Object.defineProperty(TplElement.prototype, from, {\n get(this: TplElement) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const element = this.$$getElementByRef!(to.ref) as unknown as Record<\n string,\n unknown\n >;\n return element[to.refProperty ?? from];\n },\n set(this: TplElement, value: unknown) {\n // 同上 exposedState.set\n const element = this.$$getElementByRef?.(to.ref) as unknown as Record<\n string,\n unknown\n >;\n if (element) {\n element[to.refProperty ?? from] = value;\n }\n },\n enumerable: true,\n });\n }\n\n for (const [from, to] of proxyMethods) {\n Object.defineProperty(TplElement.prototype, from, {\n value(this: TplElement, ...args: unknown[]) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const element = this.$$getElementByRef!(to.ref) as unknown as Record<\n string,\n Function\n >;\n element[to.refMethod ?? from](...args);\n },\n enumerable: true,\n });\n }\n\n customElements.define(tagName, TplElement);\n }\n\n get(tagName: string) {\n return this.#registry.get(tagName);\n }\n}\n\nfunction getExposedStates(state: ContextConf[] | undefined): string[] {\n // Allow duplicated state names which maybe mutually exclusive.\n return uniq(\n state?.filter((item) => item.expose).map((item) => item.name) ?? []\n );\n}\n\n// istanbul ignore next\nfunction getCustomTemplatesV2() {\n const v2Kit = getV2RuntimeFromDll();\n if (v2Kit) {\n return Object.freeze({\n define(tagName: string, constructor: CustomTemplateConstructor) {\n return v2Kit.getRuntime().registerCustomTemplate(tagName, constructor);\n },\n }) as CustomTemplateRegistry;\n }\n}\n\n// istanbul ignore next\nexport const customTemplates =\n getCustomTemplatesV2() || new CustomTemplateRegistry();\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"CustomTemplates.js","names":["uniq","isStrictMode","warnAboutStrictMode","getV2RuntimeFromDll","allowedNativeProps","Set","_registry","WeakMap","CustomTemplateRegistry","constructor","_classPrivateFieldInitSpec","Map","define","tagName","_constructor$proxy","_compatibleConstructo","registered","_classPrivateFieldGet","has","console","warn","customElements","get","strict","proxyProperties","proxy","properties","validProxyProps","legacyTplVariables","key","value","Object","entries","asVariable","push","mergeProperty","refTransform","error","ref","compatibleConstructor","fromEntries","state","map","item","expose","concat","tpl","name","set","exposedStates","getExposedStates","proxyMethods","methods","props","entry","nativeProps","filter","prop","HTMLElement","prototype","length","Error","p","join","TplElement","$$typeof","_dev_only_definedProperties","_dev_only_definedMethods","$$getElementByRef","_this$$$tplStateStore","$$tplStateStore","hostBrick","tplHostMetadata","internalBricksByRef","element","connectedCallback","shadowRoot","attachShadow","mode","fragment","document","createDocumentFragment","style","createElement","textContent","slot","appendChild","disconnectedCallback","propName","some","defineProperty","getValue","_this$$$tplStateStore2","updateValue","enumerable","from","to","refProperty","_this$$$getElementByR","call","refMethod","arguments","getCustomTemplatesV2","v2Kit","freeze","getRuntime","registerCustomTemplate","customTemplates"],"sources":["../../src/CustomTemplates.ts"],"sourcesContent":["import type {\n ContextConf,\n CustomTemplate,\n CustomTemplateConstructor,\n CustomTemplateProxyBasicProperty,\n} from \"@next-core/types\";\nimport { uniq } from \"lodash\";\nimport type { RuntimeBrickElement } from \"./internal/interfaces.js\";\nimport { isStrictMode, warnAboutStrictMode } from \"./isStrictMode.js\";\nimport { getV2RuntimeFromDll } from \"./getV2RuntimeFromDll.js\";\n\n// Note: `prefix` is a native prop on Element, but it's only used in XML documents.\nconst allowedNativeProps = new Set([\"prefix\"]);\n\ninterface LegacyTplPropProxy extends CustomTemplateProxyBasicProperty {\n asVariable?: boolean;\n mergeProperty?: unknown;\n refTransform?: unknown;\n}\n\nclass CustomTemplateRegistry {\n readonly #registry = new Map<string, CustomTemplate>();\n\n define(tagName: string, constructor: CustomTemplateConstructor): void {\n let registered = this.#registry.has(tagName);\n if (registered) {\n // When open launchpad, the storyboard will be updated.\n // However, we can't *undefine* a custom element.\n // Just ignore re-registering custom templates.\n // eslint-disable-next-line no-console\n console.warn(`Custom template of \"${tagName}\" already registered.`);\n } else {\n registered = !!customElements.get(tagName);\n if (registered) {\n // eslint-disable-next-line no-console\n console.warn(\n `Custom template of \"${tagName}\" already defined by customElements.`\n );\n }\n }\n\n // Transform legacy `proxy.properties[].asVariable` as states.\n const strict = isStrictMode();\n const proxyProperties = (constructor.proxy?.properties ?? {}) as {\n [name: string]: LegacyTplPropProxy;\n };\n const validProxyProps: [string, CustomTemplateProxyBasicProperty][] = [];\n const legacyTplVariables: string[] = [];\n for (const [key, value] of Object.entries(proxyProperties)) {\n if (value.asVariable) {\n warnAboutStrictMode(strict, \"Template `asVariable`\", tagName, key);\n // istanbul ignore next\n if (!strict) {\n // For existed TPL usage, treat it as a STATE.\n legacyTplVariables.push(key);\n }\n } else if (value.mergeProperty || value.refTransform) {\n // eslint-disable-next-line no-console\n console.error(\n \"Template `mergeProperty` and `refTransform` are dropped in v3:\",\n tagName,\n key\n );\n } else if (value.ref) {\n validProxyProps.push([key, value]);\n }\n // Else: documentation only, for exposed states.\n }\n\n const compatibleConstructor = {\n ...constructor,\n proxy: {\n ...constructor.proxy,\n properties: Object.fromEntries(validProxyProps),\n },\n state: (constructor.state\n ? strict\n ? constructor.state\n : constructor.state.map((item) => ({\n // Make `expose` defaults to true in non-strict mode.\n expose: true,\n ...item,\n }))\n : []\n ).concat(legacyTplVariables.map((tpl) => ({ name: tpl, expose: true }))),\n };\n\n // Now we allow re-register custom template\n this.#registry.set(tagName, {\n ...compatibleConstructor,\n name: tagName,\n });\n\n const exposedStates = getExposedStates(compatibleConstructor.state);\n const proxyMethods = Object.entries(\n compatibleConstructor.proxy?.methods ?? {}\n );\n\n const props = exposedStates.concat(\n validProxyProps.map((entry) => entry[0])\n );\n const methods = proxyMethods.map((entry) => entry[0]);\n\n const nativeProps = props\n .concat(methods)\n .filter(\n (prop) => prop in HTMLElement.prototype && !allowedNativeProps.has(prop)\n );\n if (nativeProps.length > 0) {\n warnAboutStrictMode(\n strict,\n \"Using native HTMLElement properties as template properties or methods\",\n tagName,\n ...nativeProps\n );\n // istanbul ignore next\n if (strict) {\n throw new Error(\n `In custom template \"${tagName}\", ${nativeProps\n .map((p) => `\"${p}\"`)\n .join(\n \", \"\n )} are native HTMLElement properties, and should be avoid to be used as brick properties or methods.`\n );\n }\n }\n\n if (registered) {\n return;\n }\n\n class TplElement extends HTMLElement {\n get $$typeof() {\n return \"custom-template\" as const;\n }\n\n static get _dev_only_definedProperties(): string[] {\n return props;\n }\n\n static get _dev_only_definedMethods(): string[] {\n return methods;\n }\n\n $$getElementByRef(this: RuntimeBrickElement, ref: string) {\n return this.$$tplStateStore?.hostBrick?.tplHostMetadata?.internalBricksByRef.get(\n ref\n )?.element;\n }\n\n connectedCallback() {\n let shadowRoot = this.shadowRoot;\n if (!shadowRoot) {\n shadowRoot = this.attachShadow({ mode: \"open\" });\n }\n const fragment = document.createDocumentFragment();\n const style = document.createElement(\"style\");\n style.textContent = \":host{display:block}:host([hidden]){display:none}\";\n const slot = document.createElement(\"slot\");\n fragment.appendChild(style);\n fragment.appendChild(slot);\n shadowRoot.appendChild(fragment);\n }\n\n disconnectedCallback() {\n if (this.shadowRoot) {\n this.shadowRoot.textContent = \"\";\n }\n }\n }\n\n for (const propName of exposedStates) {\n if (validProxyProps.some((entry) => entry[0] === propName)) {\n // eslint-disable-next-line no-console\n console.error(\n `Cannot define an exposed state that is also a proxy property: \"${propName}\" in ${tagName}`\n );\n continue;\n }\n Object.defineProperty(TplElement.prototype, propName, {\n get(this: RuntimeBrickElement) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return this.$$tplStateStore!.getValue(propName);\n },\n set(this: RuntimeBrickElement, value: unknown) {\n // 在 mount 过程中,先设置属性,再设置 `$$tplStateStore`,这样,当触发属性设置时,\n // 避免初始化的一次 state update 操作及其 onChange 事件。\n this.$$tplStateStore?.updateValue(propName, value, \"replace\");\n },\n enumerable: true,\n });\n }\n\n for (const [from, to] of validProxyProps) {\n Object.defineProperty(TplElement.prototype, from, {\n get(this: TplElement) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const element = this.$$getElementByRef!(to.ref) as unknown as Record<\n string,\n unknown\n >;\n return element[to.refProperty ?? from];\n },\n set(this: TplElement, value: unknown) {\n // 同上 exposedState.set\n const element = this.$$getElementByRef?.(to.ref) as unknown as Record<\n string,\n unknown\n >;\n if (element) {\n element[to.refProperty ?? from] = value;\n }\n },\n enumerable: true,\n });\n }\n\n for (const [from, to] of proxyMethods) {\n Object.defineProperty(TplElement.prototype, from, {\n value(this: TplElement, ...args: unknown[]) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const element = this.$$getElementByRef!(to.ref) as unknown as Record<\n string,\n Function\n >;\n return element[to.refMethod ?? from](...args);\n },\n enumerable: true,\n });\n }\n\n customElements.define(tagName, TplElement);\n }\n\n get(tagName: string) {\n return this.#registry.get(tagName);\n }\n}\n\nfunction getExposedStates(state: ContextConf[] | undefined): string[] {\n // Allow duplicated state names which maybe mutually exclusive.\n return uniq(\n state?.filter((item) => item.expose).map((item) => item.name) ?? []\n );\n}\n\n// istanbul ignore next\nfunction getCustomTemplatesV2() {\n const v2Kit = getV2RuntimeFromDll();\n if (v2Kit) {\n return Object.freeze({\n define(tagName: string, constructor: CustomTemplateConstructor) {\n return v2Kit.getRuntime().registerCustomTemplate(tagName, constructor);\n },\n }) as CustomTemplateRegistry;\n }\n}\n\n// istanbul ignore next\nexport const customTemplates =\n getCustomTemplatesV2() || new CustomTemplateRegistry();\n"],"mappings":"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","ignoreList":[]}
@@ -4,13 +4,13 @@ import { getDataStores, postAsyncRender, renderBricks } from "./internal/Rendere
4
4
  import { RendererContext } from "./internal/RendererContext.js";
5
5
  import { DataStore } from "./internal/data/DataStore.js";
6
6
  import { mountTree, unmountTree } from "./internal/mount.js";
7
- import { httpErrorToString } from "./handleHttpError.js";
8
7
  import { applyMode, applyTheme, setMode, setTheme } from "./themeAndMode.js";
9
8
  import { RenderTag } from "./internal/enums.js";
10
9
  import { registerStoryboardFunctions } from "./internal/compute/StoryboardFunctions.js";
11
10
  import { registerAppI18n } from "./internal/registerAppI18n.js";
12
11
  import { registerCustomTemplates } from "./internal/registerCustomTemplates.js";
13
12
  import { setUIVersion } from "./setUIVersion.js";
13
+ import { ErrorNode } from "./internal/ErrorNode.js";
14
14
  export function unstable_createRoot(container) {
15
15
  let {
16
16
  portal: _portal,
@@ -120,21 +120,7 @@ export function unstable_createRoot(container) {
120
120
  } catch (error) {
121
121
  failed = true;
122
122
  output = {
123
- node: {
124
- tag: RenderTag.BRICK,
125
- type: "div",
126
- properties: {
127
- textContent: httpErrorToString(error),
128
- dataset: {
129
- errorBoundary: ""
130
- },
131
- style: {
132
- color: "var(--color-error)"
133
- }
134
- },
135
- return: renderRoot,
136
- runtimeContext: null
137
- },
123
+ node: await ErrorNode(error, renderRoot, scope === "page"),
138
124
  blockingList: []
139
125
  };
140
126
  }
@@ -1 +1 @@
1
- {"version":3,"file":"createRoot.js","names":["i18n","uniqueId","getDataStores","postAsyncRender","renderBricks","RendererContext","DataStore","mountTree","unmountTree","httpErrorToString","applyMode","applyTheme","setMode","setTheme","RenderTag","registerStoryboardFunctions","registerAppI18n","registerCustomTemplates","setUIVersion","unstable_createRoot","container","portal","_portal","scope","unknownBricks","arguments","length","undefined","createPortal","document","createElement","style","position","width","height","body","append","unmounted","rendererContext","clearI18nBundles","render","brick","theme","uiVersion","language","context","functions","templates","i18nData","url","app","Error","bricks","concat","previousRendererContext","renderId","runtimeContext","ctxStore","pendingPermissionsPreCheck","tplStateStoreMap","Map","formStateStoreMap","urlObj","URL","query","searchParams","location","pathname","search","hash","state","renderRoot","tag","ROOT","_clearI18nBundles","changeLanguage","id","homepage","demoStoryboard","meta","customTemplates","define","failed","output","stores","error","node","BRICK","type","properties","textContent","dataset","errorBoundary","color","return","blockingList","child","dispatchOnUnmount","dispose","dispatchBeforePageLoad","window","scrollTo","store","mountAsyncData","dispatchPageLoad","dispatchOnMount","initializeScrollIntoView","initializeMediaChange","initializeMessageDispatcher","unmount","remove"],"sources":["../../src/createRoot.ts"],"sourcesContent":["import type {\n BrickConf,\n ContextConf,\n CustomTemplate,\n MetaI18n,\n MicroApp,\n SiteTheme,\n Storyboard,\n StoryboardFunction,\n} from \"@next-core/types\";\nimport { i18n } from \"@next-core/i18n\";\nimport { uniqueId } from \"lodash\";\nimport {\n RenderOutput,\n getDataStores,\n postAsyncRender,\n renderBricks,\n} from \"./internal/Renderer.js\";\nimport { RendererContext } from \"./internal/RendererContext.js\";\nimport { DataStore } from \"./internal/data/DataStore.js\";\nimport type { RenderRoot, RuntimeContext } from \"./internal/interfaces.js\";\nimport { mountTree, unmountTree } from \"./internal/mount.js\";\nimport { httpErrorToString } from \"./handleHttpError.js\";\nimport { applyMode, applyTheme, setMode, setTheme } from \"./themeAndMode.js\";\nimport { RenderTag } from \"./internal/enums.js\";\nimport { registerStoryboardFunctions } from \"./internal/compute/StoryboardFunctions.js\";\nimport { registerAppI18n } from \"./internal/registerAppI18n.js\";\nimport { registerCustomTemplates } from \"./internal/registerCustomTemplates.js\";\nimport { setUIVersion } from \"./setUIVersion.js\";\n\nexport interface CreateRootOptions {\n portal?: HTMLElement;\n /**\n * Defaults to \"fragment\", only set it to \"page\" when the root is in a standalone iframe.\n * - page: render as whole page, triggering page life cycles, and enable register of functions/templates/i18n.\n * - fragment: render as fragment, not triggering page life cycles, and disable register of functions/templates/i18n.\n */\n scope?: \"page\" | \"fragment\";\n\n /**\n * Whether to throw error when encountering unknown bricks.\n *\n * Defaults to \"throw\".\n */\n unknownBricks?: \"silent\" | \"throw\";\n}\n\nexport interface RenderOptions {\n theme?: SiteTheme;\n uiVersion?: string;\n language?: string;\n context?: ContextConf[];\n functions?: StoryboardFunction[];\n templates?: CustomTemplate[];\n i18n?: MetaI18n;\n url?: string;\n app?: MicroApp;\n}\n\nexport function unstable_createRoot(\n container: HTMLElement | DocumentFragment,\n { portal: _portal, scope = \"fragment\", unknownBricks }: CreateRootOptions = {}\n) {\n let portal = _portal;\n let createPortal: RenderRoot[\"createPortal\"];\n if (_portal) {\n createPortal = _portal;\n } else {\n // Create portal container when necessary.\n createPortal = () => {\n portal = document.createElement(\"div\");\n portal.style.position = \"absolute\";\n portal.style.width = portal.style.height = \"0\";\n document.body.append(portal);\n return portal;\n };\n }\n let unmounted = false;\n let rendererContext: RendererContext | undefined;\n let clearI18nBundles: Function | undefined;\n\n return {\n async render(\n brick: BrickConf | BrickConf[],\n {\n theme,\n uiVersion,\n language,\n context,\n functions,\n templates,\n i18n: i18nData,\n url,\n app,\n }: RenderOptions = {}\n ) {\n if (unmounted) {\n throw new Error(\n \"The root is unmounted and cannot be rendered any more\"\n );\n }\n const bricks = ([] as BrickConf[]).concat(brick);\n\n const previousRendererContext = rendererContext;\n const renderId = uniqueId(\"render-id-\");\n rendererContext = new RendererContext(scope, { unknownBricks, renderId });\n\n const runtimeContext = {\n ctxStore: new DataStore(\"CTX\", undefined, rendererContext),\n pendingPermissionsPreCheck: [],\n tplStateStoreMap: new Map<string, DataStore<\"STATE\">>(),\n formStateStoreMap: new Map<string, DataStore<\"FORM_STATE\">>(),\n } as Partial<RuntimeContext> as RuntimeContext;\n\n if (url) {\n const urlObj = new URL(url);\n runtimeContext.query = urlObj.searchParams;\n runtimeContext.location = {\n pathname: urlObj.pathname,\n search: urlObj.search,\n hash: urlObj.hash,\n state: undefined,\n };\n }\n\n const renderRoot: RenderRoot = {\n tag: RenderTag.ROOT,\n container,\n createPortal,\n };\n\n if (scope === \"page\") {\n setTheme(theme ?? \"light\");\n setMode(\"default\");\n setUIVersion(uiVersion);\n if (language) {\n await i18n.changeLanguage(language);\n }\n\n app ??= {\n id: \"demo\",\n homepage: \"/demo\",\n } as MicroApp;\n runtimeContext.app = app;\n const demoStoryboard = {\n app,\n meta: {\n i18n: i18nData,\n customTemplates: templates,\n },\n } as Storyboard;\n\n // Register i18n.\n clearI18nBundles?.();\n clearI18nBundles = registerAppI18n(demoStoryboard);\n\n // Register custom templates.\n registerCustomTemplates(demoStoryboard);\n\n // Register functions.\n registerStoryboardFunctions(functions, app);\n }\n\n runtimeContext.ctxStore.define(context, runtimeContext);\n\n let failed = false;\n let output: RenderOutput;\n let stores: DataStore<\"CTX\" | \"STATE\" | \"FORM_STATE\">[] = [];\n\n try {\n output = await renderBricks(\n renderRoot,\n bricks,\n runtimeContext,\n rendererContext,\n [],\n {}\n );\n\n stores = getDataStores(runtimeContext);\n await postAsyncRender(output, runtimeContext, stores);\n } catch (error) {\n failed = true;\n output = {\n node: {\n tag: RenderTag.BRICK,\n type: \"div\",\n properties: {\n textContent: httpErrorToString(error),\n dataset: {\n errorBoundary: \"\",\n },\n style: {\n color: \"var(--color-error)\",\n },\n },\n return: renderRoot,\n runtimeContext: null!,\n },\n blockingList: [],\n };\n }\n\n renderRoot.child = output.node;\n\n previousRendererContext?.dispatchOnUnmount();\n previousRendererContext?.dispose();\n unmountTree(container);\n if (portal) {\n unmountTree(portal);\n }\n\n if (scope === \"page\") {\n if (!failed) {\n rendererContext.dispatchBeforePageLoad();\n }\n\n applyTheme();\n applyMode();\n }\n\n mountTree(renderRoot);\n\n if (scope === \"page\") {\n window.scrollTo(0, 0);\n }\n\n if (!failed) {\n for (const store of stores) {\n store.mountAsyncData();\n }\n\n if (scope === \"page\") {\n rendererContext.dispatchPageLoad();\n // rendererContext.dispatchAnchorLoad();\n }\n rendererContext.dispatchOnMount();\n rendererContext.initializeScrollIntoView();\n rendererContext.initializeMediaChange();\n rendererContext.initializeMessageDispatcher();\n }\n },\n unmount() {\n if (unmounted) {\n return;\n }\n unmounted = true;\n unmountTree(container);\n if (portal) {\n unmountTree(portal);\n // Only remove the portal from its parent when it's dynamic created.\n if (!_portal) {\n portal.remove();\n }\n }\n },\n };\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"createRoot.js","names":["i18n","uniqueId","getDataStores","postAsyncRender","renderBricks","RendererContext","DataStore","mountTree","unmountTree","applyMode","applyTheme","setMode","setTheme","RenderTag","registerStoryboardFunctions","registerAppI18n","registerCustomTemplates","setUIVersion","ErrorNode","unstable_createRoot","container","portal","_portal","scope","unknownBricks","arguments","length","undefined","createPortal","document","createElement","style","position","width","height","body","append","unmounted","rendererContext","clearI18nBundles","render","brick","theme","uiVersion","language","context","functions","templates","i18nData","url","app","Error","bricks","concat","previousRendererContext","renderId","runtimeContext","ctxStore","pendingPermissionsPreCheck","tplStateStoreMap","Map","formStateStoreMap","urlObj","URL","query","searchParams","location","pathname","search","hash","state","renderRoot","tag","ROOT","_clearI18nBundles","changeLanguage","id","homepage","demoStoryboard","meta","customTemplates","define","failed","output","stores","error","node","blockingList","child","dispatchOnUnmount","dispose","dispatchBeforePageLoad","window","scrollTo","store","mountAsyncData","dispatchPageLoad","dispatchOnMount","initializeScrollIntoView","initializeMediaChange","initializeMessageDispatcher","unmount","remove"],"sources":["../../src/createRoot.ts"],"sourcesContent":["import type {\n BrickConf,\n ContextConf,\n CustomTemplate,\n MetaI18n,\n MicroApp,\n SiteTheme,\n Storyboard,\n StoryboardFunction,\n} from \"@next-core/types\";\nimport { i18n } from \"@next-core/i18n\";\nimport { uniqueId } from \"lodash\";\nimport {\n RenderOutput,\n getDataStores,\n postAsyncRender,\n renderBricks,\n} from \"./internal/Renderer.js\";\nimport { RendererContext } from \"./internal/RendererContext.js\";\nimport { DataStore } from \"./internal/data/DataStore.js\";\nimport type { RenderRoot, RuntimeContext } from \"./internal/interfaces.js\";\nimport { mountTree, unmountTree } from \"./internal/mount.js\";\nimport { applyMode, applyTheme, setMode, setTheme } from \"./themeAndMode.js\";\nimport { RenderTag } from \"./internal/enums.js\";\nimport { registerStoryboardFunctions } from \"./internal/compute/StoryboardFunctions.js\";\nimport { registerAppI18n } from \"./internal/registerAppI18n.js\";\nimport { registerCustomTemplates } from \"./internal/registerCustomTemplates.js\";\nimport { setUIVersion } from \"./setUIVersion.js\";\nimport { ErrorNode } from \"./internal/ErrorNode.js\";\n\nexport interface CreateRootOptions {\n portal?: HTMLElement;\n /**\n * Defaults to \"fragment\", only set it to \"page\" when the root is in a standalone iframe.\n * - page: render as whole page, triggering page life cycles, and enable register of functions/templates/i18n.\n * - fragment: render as fragment, not triggering page life cycles, and disable register of functions/templates/i18n.\n */\n scope?: \"page\" | \"fragment\";\n\n /**\n * Whether to throw error when encountering unknown bricks.\n *\n * Defaults to \"throw\".\n */\n unknownBricks?: \"silent\" | \"throw\";\n}\n\nexport interface RenderOptions {\n theme?: SiteTheme;\n uiVersion?: string;\n language?: string;\n context?: ContextConf[];\n functions?: StoryboardFunction[];\n templates?: CustomTemplate[];\n i18n?: MetaI18n;\n url?: string;\n app?: MicroApp;\n}\n\nexport function unstable_createRoot(\n container: HTMLElement | DocumentFragment,\n { portal: _portal, scope = \"fragment\", unknownBricks }: CreateRootOptions = {}\n) {\n let portal = _portal;\n let createPortal: RenderRoot[\"createPortal\"];\n if (_portal) {\n createPortal = _portal;\n } else {\n // Create portal container when necessary.\n createPortal = () => {\n portal = document.createElement(\"div\");\n portal.style.position = \"absolute\";\n portal.style.width = portal.style.height = \"0\";\n document.body.append(portal);\n return portal;\n };\n }\n let unmounted = false;\n let rendererContext: RendererContext | undefined;\n let clearI18nBundles: Function | undefined;\n\n return {\n async render(\n brick: BrickConf | BrickConf[],\n {\n theme,\n uiVersion,\n language,\n context,\n functions,\n templates,\n i18n: i18nData,\n url,\n app,\n }: RenderOptions = {}\n ) {\n if (unmounted) {\n throw new Error(\n \"The root is unmounted and cannot be rendered any more\"\n );\n }\n const bricks = ([] as BrickConf[]).concat(brick);\n\n const previousRendererContext = rendererContext;\n const renderId = uniqueId(\"render-id-\");\n rendererContext = new RendererContext(scope, { unknownBricks, renderId });\n\n const runtimeContext = {\n ctxStore: new DataStore(\"CTX\", undefined, rendererContext),\n pendingPermissionsPreCheck: [],\n tplStateStoreMap: new Map<string, DataStore<\"STATE\">>(),\n formStateStoreMap: new Map<string, DataStore<\"FORM_STATE\">>(),\n } as Partial<RuntimeContext> as RuntimeContext;\n\n if (url) {\n const urlObj = new URL(url);\n runtimeContext.query = urlObj.searchParams;\n runtimeContext.location = {\n pathname: urlObj.pathname,\n search: urlObj.search,\n hash: urlObj.hash,\n state: undefined,\n };\n }\n\n const renderRoot: RenderRoot = {\n tag: RenderTag.ROOT,\n container,\n createPortal,\n };\n\n if (scope === \"page\") {\n setTheme(theme ?? \"light\");\n setMode(\"default\");\n setUIVersion(uiVersion);\n if (language) {\n await i18n.changeLanguage(language);\n }\n\n app ??= {\n id: \"demo\",\n homepage: \"/demo\",\n } as MicroApp;\n runtimeContext.app = app;\n const demoStoryboard = {\n app,\n meta: {\n i18n: i18nData,\n customTemplates: templates,\n },\n } as Storyboard;\n\n // Register i18n.\n clearI18nBundles?.();\n clearI18nBundles = registerAppI18n(demoStoryboard);\n\n // Register custom templates.\n registerCustomTemplates(demoStoryboard);\n\n // Register functions.\n registerStoryboardFunctions(functions, app);\n }\n\n runtimeContext.ctxStore.define(context, runtimeContext);\n\n let failed = false;\n let output: RenderOutput;\n let stores: DataStore<\"CTX\" | \"STATE\" | \"FORM_STATE\">[] = [];\n\n try {\n output = await renderBricks(\n renderRoot,\n bricks,\n runtimeContext,\n rendererContext,\n [],\n {}\n );\n\n stores = getDataStores(runtimeContext);\n await postAsyncRender(output, runtimeContext, stores);\n } catch (error) {\n failed = true;\n output = {\n node: await ErrorNode(error, renderRoot, scope === \"page\"),\n blockingList: [],\n };\n }\n\n renderRoot.child = output.node;\n\n previousRendererContext?.dispatchOnUnmount();\n previousRendererContext?.dispose();\n unmountTree(container);\n if (portal) {\n unmountTree(portal);\n }\n\n if (scope === \"page\") {\n if (!failed) {\n rendererContext.dispatchBeforePageLoad();\n }\n\n applyTheme();\n applyMode();\n }\n\n mountTree(renderRoot);\n\n if (scope === \"page\") {\n window.scrollTo(0, 0);\n }\n\n if (!failed) {\n for (const store of stores) {\n store.mountAsyncData();\n }\n\n if (scope === \"page\") {\n rendererContext.dispatchPageLoad();\n // rendererContext.dispatchAnchorLoad();\n }\n rendererContext.dispatchOnMount();\n rendererContext.initializeScrollIntoView();\n rendererContext.initializeMediaChange();\n rendererContext.initializeMessageDispatcher();\n }\n },\n unmount() {\n if (unmounted) {\n return;\n }\n unmounted = true;\n unmountTree(container);\n if (portal) {\n unmountTree(portal);\n // Only remove the portal from its parent when it's dynamic created.\n if (!_portal) {\n portal.remove();\n }\n }\n },\n };\n}\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,140 @@
1
+ import { loadBricksImperatively, BrickLoadError } from "@next-core/loader";
2
+ import { HttpResponseError } from "@next-core/http";
3
+ import { i18n } from "@next-core/i18n";
4
+ import { httpErrorToString } from "../handleHttpError.js";
5
+ import { RenderTag } from "./enums.js";
6
+ import { _internalApiGetPresetBricks, getBrickPackages } from "./Runtime.js";
7
+ import { K, NS } from "./i18n.js";
8
+ export class PageNotFoundError extends Error {
9
+ constructor(message) {
10
+ // Pass remaining arguments (including vendor specific ones) to parent constructor
11
+ super(message);
12
+ this.name = "PageNotFoundError";
13
+
14
+ // Maintains proper stack trace for where our error was thrown (only available on V8)
15
+ // istanbul ignore else
16
+ if (Error.captureStackTrace) {
17
+ Error.captureStackTrace(this, BrickLoadError);
18
+ }
19
+ }
20
+ }
21
+
22
+ /**
23
+ * Will always resolve
24
+ */
25
+ export async function ErrorNode(error, returnNode, pageLevel) {
26
+ const {
27
+ title,
28
+ variant,
29
+ showLink,
30
+ showDescription
31
+ } = getRefinedErrorConf(error);
32
+ if (pageLevel) {
33
+ const presetBricks = _internalApiGetPresetBricks();
34
+ const errorBrick = presetBricks.error ?? "illustrations.error-message";
35
+ if (errorBrick !== false) {
36
+ const linkBrick = "eo-link";
37
+ const bricks = showLink ? [errorBrick, linkBrick] : [errorBrick];
38
+ try {
39
+ await Promise.race([loadBricksImperatively(bricks, getBrickPackages()),
40
+ // Timeout after 3 seconds
41
+ new Promise((_resolve, reject) => setTimeout(() => {
42
+ reject(new Error("timeout"));
43
+ }, 3e3))]);
44
+ const node = {
45
+ tag: RenderTag.BRICK,
46
+ type: errorBrick,
47
+ properties: {
48
+ errorTitle: title,
49
+ description: showDescription ? httpErrorToString(error) : undefined,
50
+ variant,
51
+ dataset: {
52
+ errorBoundary: ""
53
+ }
54
+ },
55
+ runtimeContext: null,
56
+ return: returnNode
57
+ };
58
+ if (showLink) {
59
+ node.child = {
60
+ tag: RenderTag.BRICK,
61
+ type: linkBrick,
62
+ properties: {
63
+ textContent: showLink === "home" ? i18n.t(`${NS}:${K.GO_BACK_HOME}`) : i18n.t(`${NS}:${K.GO_BACK_TO_PREVIOUS_PAGE}`),
64
+ url: showLink === "home" ? "/" : undefined
65
+ },
66
+ events: showLink === "home" ? undefined : {
67
+ click: {
68
+ action: "history.goBack"
69
+ }
70
+ },
71
+ runtimeContext: null,
72
+ return: node
73
+ };
74
+ }
75
+ return node;
76
+ } catch (e) {
77
+ // eslint-disable-next-line no-console
78
+ console.error("Failed to load brick:", bricks.join(", "), e);
79
+ }
80
+ }
81
+ }
82
+ return {
83
+ tag: RenderTag.BRICK,
84
+ type: "div",
85
+ properties: {
86
+ textContent: showDescription ? `${title}: ${httpErrorToString(error)}` : title,
87
+ dataset: {
88
+ errorBoundary: ""
89
+ },
90
+ style: {
91
+ color: "var(--color-error)"
92
+ }
93
+ },
94
+ runtimeContext: null,
95
+ return: returnNode
96
+ };
97
+ }
98
+ function getRefinedErrorConf(error) {
99
+ var _error$response, _error$responseJson;
100
+ if (error instanceof PageNotFoundError) {
101
+ return error.message === "app not found" ? {
102
+ showLink: "home",
103
+ title: i18n.t(`${NS}:${K.APP_NOT_FOUND}`),
104
+ variant: "no-permission"
105
+ } : {
106
+ showLink: "home",
107
+ variant: "not-found",
108
+ title: i18n.t(`${NS}:${K.PAGE_NOT_FOUND}`)
109
+ };
110
+ }
111
+ if (error instanceof BrickLoadError || error instanceof Error && error.name === "ChunkLoadError") {
112
+ return {
113
+ showDescription: true,
114
+ title: i18n.t(`${NS}:${K.NETWORK_ERROR}`),
115
+ variant: "internet-disconnected"
116
+ };
117
+ }
118
+ if (error instanceof HttpResponseError && ((_error$response = error.response) === null || _error$response === void 0 ? void 0 : _error$response.status) === 403) {
119
+ return {
120
+ showLink: "previous",
121
+ showDescription: true,
122
+ title: i18n.t(`${NS}:${K.NO_PERMISSION}`),
123
+ variant: "no-permission"
124
+ };
125
+ }
126
+ if (error instanceof HttpResponseError && ((_error$responseJson = error.responseJson) === null || _error$responseJson === void 0 ? void 0 : _error$responseJson.code) === "200000") {
127
+ return {
128
+ showDescription: true,
129
+ title: i18n.t(`${NS}:${K.LICENSE_EXPIRED}`),
130
+ variant: "license-expired"
131
+ };
132
+ }
133
+ return {
134
+ showLink: "previous",
135
+ showDescription: true,
136
+ title: i18n.t(`${NS}:${K.UNKNOWN_ERROR}`),
137
+ variant: "unknown-error"
138
+ };
139
+ }
140
+ //# sourceMappingURL=ErrorNode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ErrorNode.js","names":["loadBricksImperatively","BrickLoadError","HttpResponseError","i18n","httpErrorToString","RenderTag","_internalApiGetPresetBricks","getBrickPackages","K","NS","PageNotFoundError","Error","constructor","message","name","captureStackTrace","ErrorNode","error","returnNode","pageLevel","title","variant","showLink","showDescription","getRefinedErrorConf","presetBricks","errorBrick","linkBrick","bricks","Promise","race","_resolve","reject","setTimeout","node","tag","BRICK","type","properties","errorTitle","description","undefined","dataset","errorBoundary","runtimeContext","return","child","textContent","t","GO_BACK_HOME","GO_BACK_TO_PREVIOUS_PAGE","url","events","click","action","e","console","join","style","color","_error$response","_error$responseJson","APP_NOT_FOUND","PAGE_NOT_FOUND","NETWORK_ERROR","response","status","NO_PERMISSION","responseJson","code","LICENSE_EXPIRED","UNKNOWN_ERROR"],"sources":["../../../src/internal/ErrorNode.ts"],"sourcesContent":["import { loadBricksImperatively, BrickLoadError } from \"@next-core/loader\";\nimport { HttpResponseError } from \"@next-core/http\";\nimport { i18n } from \"@next-core/i18n\";\nimport { httpErrorToString } from \"../handleHttpError.js\";\nimport { RenderTag } from \"./enums.js\";\nimport type { RenderChildNode, RenderReturnNode } from \"./interfaces.js\";\nimport { _internalApiGetPresetBricks, getBrickPackages } from \"./Runtime.js\";\nimport { K, NS } from \"./i18n.js\";\n\ntype ErrorMessageVariant =\n | \"internet-disconnected\"\n | \"no-permission\"\n | \"license-expired\"\n | \"not-found\"\n | \"unknown-error\";\n\ninterface ErrorMessageConfig {\n title: string;\n variant: ErrorMessageVariant;\n showLink?: \"home\" | \"previous\";\n showDescription?: boolean;\n}\n\nexport class PageNotFoundError extends Error {\n constructor(message: \"page not found\" | \"app not found\") {\n // Pass remaining arguments (including vendor specific ones) to parent constructor\n super(message);\n\n this.name = \"PageNotFoundError\";\n\n // Maintains proper stack trace for where our error was thrown (only available on V8)\n // istanbul ignore else\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, BrickLoadError);\n }\n }\n}\n\n/**\n * Will always resolve\n */\nexport async function ErrorNode(\n error: unknown,\n returnNode: RenderReturnNode,\n pageLevel?: boolean\n): Promise<RenderChildNode> {\n const { title, variant, showLink, showDescription } =\n getRefinedErrorConf(error);\n\n if (pageLevel) {\n const presetBricks = _internalApiGetPresetBricks();\n const errorBrick = presetBricks.error ?? \"illustrations.error-message\";\n if (errorBrick !== false) {\n const linkBrick = \"eo-link\";\n const bricks = showLink ? [errorBrick, linkBrick] : [errorBrick];\n try {\n await Promise.race([\n loadBricksImperatively(bricks, getBrickPackages()),\n // Timeout after 3 seconds\n new Promise<void>((_resolve, reject) =>\n setTimeout(() => {\n reject(new Error(\"timeout\"));\n }, 3e3)\n ),\n ]);\n const node: RenderChildNode = {\n tag: RenderTag.BRICK,\n type: errorBrick,\n properties: {\n errorTitle: title,\n description: showDescription ? httpErrorToString(error) : undefined,\n variant,\n dataset: {\n errorBoundary: \"\",\n },\n },\n runtimeContext: null!,\n return: returnNode,\n };\n\n if (showLink) {\n node.child = {\n tag: RenderTag.BRICK,\n type: linkBrick,\n properties: {\n textContent:\n showLink === \"home\"\n ? i18n.t(`${NS}:${K.GO_BACK_HOME}`)\n : i18n.t(`${NS}:${K.GO_BACK_TO_PREVIOUS_PAGE}`),\n url: showLink === \"home\" ? \"/\" : undefined,\n },\n events:\n showLink === \"home\"\n ? undefined\n : {\n click: {\n action: \"history.goBack\",\n },\n },\n runtimeContext: null!,\n return: node,\n };\n }\n\n return node;\n } catch (e) {\n // eslint-disable-next-line no-console\n console.error(\"Failed to load brick:\", bricks.join(\", \"), e);\n }\n }\n }\n\n return {\n tag: RenderTag.BRICK,\n type: \"div\",\n properties: {\n textContent: showDescription\n ? `${title}: ${httpErrorToString(error)}`\n : title,\n dataset: {\n errorBoundary: \"\",\n },\n style: {\n color: \"var(--color-error)\",\n },\n },\n runtimeContext: null!,\n return: returnNode,\n };\n}\n\nfunction getRefinedErrorConf(error: unknown): ErrorMessageConfig {\n if (error instanceof PageNotFoundError) {\n return error.message === \"app not found\"\n ? {\n showLink: \"home\",\n title: i18n.t(`${NS}:${K.APP_NOT_FOUND}`),\n variant: \"no-permission\",\n }\n : {\n showLink: \"home\",\n variant: \"not-found\",\n title: i18n.t(`${NS}:${K.PAGE_NOT_FOUND}`),\n };\n }\n\n if (\n error instanceof BrickLoadError ||\n (error instanceof Error && error.name === \"ChunkLoadError\")\n ) {\n return {\n showDescription: true,\n title: i18n.t(`${NS}:${K.NETWORK_ERROR}`),\n variant: \"internet-disconnected\",\n };\n }\n\n if (error instanceof HttpResponseError && error.response?.status === 403) {\n return {\n showLink: \"previous\",\n showDescription: true,\n title: i18n.t(`${NS}:${K.NO_PERMISSION}`),\n variant: \"no-permission\",\n };\n }\n\n if (\n error instanceof HttpResponseError &&\n error.responseJson?.code === \"200000\"\n ) {\n return {\n showDescription: true,\n title: i18n.t(`${NS}:${K.LICENSE_EXPIRED}`),\n variant: \"license-expired\",\n };\n }\n\n return {\n showLink: \"previous\",\n showDescription: true,\n title: i18n.t(`${NS}:${K.UNKNOWN_ERROR}`),\n variant: \"unknown-error\",\n };\n}\n"],"mappings":"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","ignoreList":[]}
@@ -25,8 +25,8 @@ import { getPreEvaluatedRaw } from "./compute/evaluate.js";
25
25
  import { matchHomepage } from "./matchStoryboard.js";
26
26
  import { listenerFactory } from "./bindListeners.js";
27
27
  import { setupRootRuntimeContext } from "./setupRootRuntimeContext.js";
28
- import { httpErrorToString } from "../handleHttpError.js";
29
28
  import { setMatchedRoute } from "./routeMatchedMap.js";
29
+ import { ErrorNode } from "./ErrorNode.js";
30
30
  export async function renderRoutes(returnNode, routes, _runtimeContext, rendererContext, parentRoutes, menuRequestReturnNode, slotId, isIncremental) {
31
31
  const matched = await matchRoutes(routes, _runtimeContext);
32
32
  const output = getEmptyRenderOutput();
@@ -131,21 +131,7 @@ export async function renderBrick(returnNode, brickConf, _runtimeContext, render
131
131
  // eslint-disable-next-line no-console
132
132
  console.error("Error caught by error boundary:", error);
133
133
  return {
134
- node: {
135
- tag: RenderTag.BRICK,
136
- type: "div",
137
- properties: {
138
- textContent: httpErrorToString(error),
139
- dataset: {
140
- errorBoundary: ""
141
- },
142
- style: {
143
- color: "var(--color-error)"
144
- }
145
- },
146
- runtimeContext: null,
147
- return: returnNode
148
- },
134
+ node: await ErrorNode(error, returnNode),
149
135
  blockingList: []
150
136
  };
151
137
  } else {
@@ -503,7 +489,7 @@ async function legacyRenderBrick(returnNode, brickConf, _runtimeContext, rendere
503
489
  } catch (error) {
504
490
  // eslint-disable-next-line no-console
505
491
  console.error("Incremental sub-router failed:", error);
506
- const result = rendererContext.reCatch(error, brick);
492
+ const result = await rendererContext.reCatch(error, brick);
507
493
  if (!result) {
508
494
  return true;
509
495
  }