@next-core/runtime 1.54.10 → 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.
- package/dist/cjs/createRoot.js +2 -16
- package/dist/cjs/createRoot.js.map +1 -1
- package/dist/cjs/internal/ErrorNode.js +148 -0
- package/dist/cjs/internal/ErrorNode.js.map +1 -0
- package/dist/cjs/internal/Renderer.js +3 -17
- package/dist/cjs/internal/Renderer.js.map +1 -1
- package/dist/cjs/internal/RendererContext.js +4 -0
- package/dist/cjs/internal/RendererContext.js.map +1 -1
- package/dist/cjs/internal/Router.js +5 -26
- package/dist/cjs/internal/Router.js.map +1 -1
- package/dist/cjs/internal/Runtime.js +17 -28
- package/dist/cjs/internal/Runtime.js.map +1 -1
- package/dist/cjs/internal/i18n.js +23 -2
- package/dist/cjs/internal/i18n.js.map +1 -1
- package/dist/esm/createRoot.js +2 -16
- package/dist/esm/createRoot.js.map +1 -1
- package/dist/esm/internal/ErrorNode.js +140 -0
- package/dist/esm/internal/ErrorNode.js.map +1 -0
- package/dist/esm/internal/Renderer.js +3 -17
- package/dist/esm/internal/Renderer.js.map +1 -1
- package/dist/esm/internal/RendererContext.js +4 -0
- package/dist/esm/internal/RendererContext.js.map +1 -1
- package/dist/esm/internal/Router.js +6 -27
- package/dist/esm/internal/Router.js.map +1 -1
- package/dist/esm/internal/Runtime.js +9 -13
- package/dist/esm/internal/Runtime.js.map +1 -1
- package/dist/esm/internal/i18n.js +23 -2
- package/dist/esm/internal/i18n.js.map +1 -1
- package/dist/types/internal/ErrorNode.d.ts +8 -0
- package/dist/types/internal/RendererContext.d.ts +8 -4
- package/dist/types/internal/Runtime.d.ts +5 -0
- package/dist/types/internal/i18n.d.ts +8 -1
- package/package.json +3 -3
package/dist/cjs/createRoot.js
CHANGED
|
@@ -10,13 +10,13 @@ var _Renderer = require("./internal/Renderer.js");
|
|
|
10
10
|
var _RendererContext = require("./internal/RendererContext.js");
|
|
11
11
|
var _DataStore = require("./internal/data/DataStore.js");
|
|
12
12
|
var _mount = require("./internal/mount.js");
|
|
13
|
-
var _handleHttpError = require("./handleHttpError.js");
|
|
14
13
|
var _themeAndMode = require("./themeAndMode.js");
|
|
15
14
|
var _enums = require("./internal/enums.js");
|
|
16
15
|
var _StoryboardFunctions = require("./internal/compute/StoryboardFunctions.js");
|
|
17
16
|
var _registerAppI18n = require("./internal/registerAppI18n.js");
|
|
18
17
|
var _registerCustomTemplates = require("./internal/registerCustomTemplates.js");
|
|
19
18
|
var _setUIVersion = require("./setUIVersion.js");
|
|
19
|
+
var _ErrorNode = require("./internal/ErrorNode.js");
|
|
20
20
|
function unstable_createRoot(container, {
|
|
21
21
|
portal: _portal,
|
|
22
22
|
scope = "fragment",
|
|
@@ -124,21 +124,7 @@ function unstable_createRoot(container, {
|
|
|
124
124
|
} catch (error) {
|
|
125
125
|
failed = true;
|
|
126
126
|
output = {
|
|
127
|
-
node:
|
|
128
|
-
tag: _enums.RenderTag.BRICK,
|
|
129
|
-
type: "div",
|
|
130
|
-
properties: {
|
|
131
|
-
textContent: (0, _handleHttpError.httpErrorToString)(error),
|
|
132
|
-
dataset: {
|
|
133
|
-
errorBoundary: ""
|
|
134
|
-
},
|
|
135
|
-
style: {
|
|
136
|
-
color: "var(--color-error)"
|
|
137
|
-
}
|
|
138
|
-
},
|
|
139
|
-
return: renderRoot,
|
|
140
|
-
runtimeContext: null
|
|
141
|
-
},
|
|
127
|
+
node: await (0, _ErrorNode.ErrorNode)(error, renderRoot, scope === "page"),
|
|
142
128
|
blockingList: []
|
|
143
129
|
};
|
|
144
130
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createRoot.js","names":["_i18n","require","_lodash","_Renderer","_RendererContext","_DataStore","_mount","_handleHttpError","_themeAndMode","_enums","_StoryboardFunctions","_registerAppI18n","_registerCustomTemplates","_setUIVersion","unstable_createRoot","container","portal","_portal","scope","unknownBricks","createPortal","document","createElement","style","position","width","height","body","append","unmounted","rendererContext","clearI18nBundles","render","brick","theme","uiVersion","language","context","functions","templates","i18n","i18nData","url","app","Error","bricks","concat","previousRendererContext","renderId","uniqueId","RendererContext","runtimeContext","ctxStore","DataStore","undefined","pendingPermissionsPreCheck","tplStateStoreMap","Map","formStateStoreMap","urlObj","URL","query","searchParams","location","pathname","search","hash","state","renderRoot","tag","RenderTag","ROOT","_clearI18nBundles","setTheme","setMode","setUIVersion","changeLanguage","id","homepage","demoStoryboard","meta","customTemplates","registerAppI18n","registerCustomTemplates","registerStoryboardFunctions","define","failed","output","stores","renderBricks","getDataStores","postAsyncRender","error","node","BRICK","type","properties","textContent","httpErrorToString","dataset","errorBoundary","color","return","blockingList","child","dispatchOnUnmount","dispose","unmountTree","dispatchBeforePageLoad","applyTheme","applyMode","mountTree","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","require","_lodash","_Renderer","_RendererContext","_DataStore","_mount","_themeAndMode","_enums","_StoryboardFunctions","_registerAppI18n","_registerCustomTemplates","_setUIVersion","_ErrorNode","unstable_createRoot","container","portal","_portal","scope","unknownBricks","createPortal","document","createElement","style","position","width","height","body","append","unmounted","rendererContext","clearI18nBundles","render","brick","theme","uiVersion","language","context","functions","templates","i18n","i18nData","url","app","Error","bricks","concat","previousRendererContext","renderId","uniqueId","RendererContext","runtimeContext","ctxStore","DataStore","undefined","pendingPermissionsPreCheck","tplStateStoreMap","Map","formStateStoreMap","urlObj","URL","query","searchParams","location","pathname","search","hash","state","renderRoot","tag","RenderTag","ROOT","_clearI18nBundles","setTheme","setMode","setUIVersion","changeLanguage","id","homepage","demoStoryboard","meta","customTemplates","registerAppI18n","registerCustomTemplates","registerStoryboardFunctions","define","failed","output","stores","renderBricks","getDataStores","postAsyncRender","error","node","ErrorNode","blockingList","child","dispatchOnUnmount","dispose","unmountTree","dispatchBeforePageLoad","applyTheme","applyMode","mountTree","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,148 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.ErrorNode = ErrorNode;
|
|
7
|
+
exports.PageNotFoundError = void 0;
|
|
8
|
+
var _loader = require("@next-core/loader");
|
|
9
|
+
var _http = require("@next-core/http");
|
|
10
|
+
var _i18n = require("@next-core/i18n");
|
|
11
|
+
var _handleHttpError = require("../handleHttpError.js");
|
|
12
|
+
var _enums = require("./enums.js");
|
|
13
|
+
var _Runtime = require("./Runtime.js");
|
|
14
|
+
var _i18n2 = require("./i18n.js");
|
|
15
|
+
class PageNotFoundError extends Error {
|
|
16
|
+
constructor(message) {
|
|
17
|
+
// Pass remaining arguments (including vendor specific ones) to parent constructor
|
|
18
|
+
super(message);
|
|
19
|
+
this.name = "PageNotFoundError";
|
|
20
|
+
|
|
21
|
+
// Maintains proper stack trace for where our error was thrown (only available on V8)
|
|
22
|
+
// istanbul ignore else
|
|
23
|
+
if (Error.captureStackTrace) {
|
|
24
|
+
Error.captureStackTrace(this, _loader.BrickLoadError);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Will always resolve
|
|
31
|
+
*/
|
|
32
|
+
exports.PageNotFoundError = PageNotFoundError;
|
|
33
|
+
async function ErrorNode(error, returnNode, pageLevel) {
|
|
34
|
+
const {
|
|
35
|
+
title,
|
|
36
|
+
variant,
|
|
37
|
+
showLink,
|
|
38
|
+
showDescription
|
|
39
|
+
} = getRefinedErrorConf(error);
|
|
40
|
+
if (pageLevel) {
|
|
41
|
+
const presetBricks = (0, _Runtime._internalApiGetPresetBricks)();
|
|
42
|
+
const errorBrick = presetBricks.error ?? "illustrations.error-message";
|
|
43
|
+
if (errorBrick !== false) {
|
|
44
|
+
const linkBrick = "eo-link";
|
|
45
|
+
const bricks = showLink ? [errorBrick, linkBrick] : [errorBrick];
|
|
46
|
+
try {
|
|
47
|
+
await Promise.race([(0, _loader.loadBricksImperatively)(bricks, (0, _Runtime.getBrickPackages)()),
|
|
48
|
+
// Timeout after 3 seconds
|
|
49
|
+
new Promise((_resolve, reject) => setTimeout(() => {
|
|
50
|
+
reject(new Error("timeout"));
|
|
51
|
+
}, 3e3))]);
|
|
52
|
+
const node = {
|
|
53
|
+
tag: _enums.RenderTag.BRICK,
|
|
54
|
+
type: errorBrick,
|
|
55
|
+
properties: {
|
|
56
|
+
errorTitle: title,
|
|
57
|
+
description: showDescription ? (0, _handleHttpError.httpErrorToString)(error) : undefined,
|
|
58
|
+
variant,
|
|
59
|
+
dataset: {
|
|
60
|
+
errorBoundary: ""
|
|
61
|
+
}
|
|
62
|
+
},
|
|
63
|
+
runtimeContext: null,
|
|
64
|
+
return: returnNode
|
|
65
|
+
};
|
|
66
|
+
if (showLink) {
|
|
67
|
+
node.child = {
|
|
68
|
+
tag: _enums.RenderTag.BRICK,
|
|
69
|
+
type: linkBrick,
|
|
70
|
+
properties: {
|
|
71
|
+
textContent: showLink === "home" ? _i18n.i18n.t(`${_i18n2.NS}:${_i18n2.K.GO_BACK_HOME}`) : _i18n.i18n.t(`${_i18n2.NS}:${_i18n2.K.GO_BACK_TO_PREVIOUS_PAGE}`),
|
|
72
|
+
url: showLink === "home" ? "/" : undefined
|
|
73
|
+
},
|
|
74
|
+
events: showLink === "home" ? undefined : {
|
|
75
|
+
click: {
|
|
76
|
+
action: "history.goBack"
|
|
77
|
+
}
|
|
78
|
+
},
|
|
79
|
+
runtimeContext: null,
|
|
80
|
+
return: node
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
return node;
|
|
84
|
+
} catch (e) {
|
|
85
|
+
// eslint-disable-next-line no-console
|
|
86
|
+
console.error("Failed to load brick:", bricks.join(", "), e);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return {
|
|
91
|
+
tag: _enums.RenderTag.BRICK,
|
|
92
|
+
type: "div",
|
|
93
|
+
properties: {
|
|
94
|
+
textContent: showDescription ? `${title}: ${(0, _handleHttpError.httpErrorToString)(error)}` : title,
|
|
95
|
+
dataset: {
|
|
96
|
+
errorBoundary: ""
|
|
97
|
+
},
|
|
98
|
+
style: {
|
|
99
|
+
color: "var(--color-error)"
|
|
100
|
+
}
|
|
101
|
+
},
|
|
102
|
+
runtimeContext: null,
|
|
103
|
+
return: returnNode
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
function getRefinedErrorConf(error) {
|
|
107
|
+
var _error$response, _error$responseJson;
|
|
108
|
+
if (error instanceof PageNotFoundError) {
|
|
109
|
+
return error.message === "app not found" ? {
|
|
110
|
+
showLink: "home",
|
|
111
|
+
title: _i18n.i18n.t(`${_i18n2.NS}:${_i18n2.K.APP_NOT_FOUND}`),
|
|
112
|
+
variant: "no-permission"
|
|
113
|
+
} : {
|
|
114
|
+
showLink: "home",
|
|
115
|
+
variant: "not-found",
|
|
116
|
+
title: _i18n.i18n.t(`${_i18n2.NS}:${_i18n2.K.PAGE_NOT_FOUND}`)
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
if (error instanceof _loader.BrickLoadError || error instanceof Error && error.name === "ChunkLoadError") {
|
|
120
|
+
return {
|
|
121
|
+
showDescription: true,
|
|
122
|
+
title: _i18n.i18n.t(`${_i18n2.NS}:${_i18n2.K.NETWORK_ERROR}`),
|
|
123
|
+
variant: "internet-disconnected"
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
if (error instanceof _http.HttpResponseError && ((_error$response = error.response) === null || _error$response === void 0 ? void 0 : _error$response.status) === 403) {
|
|
127
|
+
return {
|
|
128
|
+
showLink: "previous",
|
|
129
|
+
showDescription: true,
|
|
130
|
+
title: _i18n.i18n.t(`${_i18n2.NS}:${_i18n2.K.NO_PERMISSION}`),
|
|
131
|
+
variant: "no-permission"
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
if (error instanceof _http.HttpResponseError && ((_error$responseJson = error.responseJson) === null || _error$responseJson === void 0 ? void 0 : _error$responseJson.code) === "200000") {
|
|
135
|
+
return {
|
|
136
|
+
showDescription: true,
|
|
137
|
+
title: _i18n.i18n.t(`${_i18n2.NS}:${_i18n2.K.LICENSE_EXPIRED}`),
|
|
138
|
+
variant: "license-expired"
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
return {
|
|
142
|
+
showLink: "previous",
|
|
143
|
+
showDescription: true,
|
|
144
|
+
title: _i18n.i18n.t(`${_i18n2.NS}:${_i18n2.K.UNKNOWN_ERROR}`),
|
|
145
|
+
variant: "unknown-error"
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=ErrorNode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ErrorNode.js","names":["_loader","require","_http","_i18n","_handleHttpError","_enums","_Runtime","_i18n2","PageNotFoundError","Error","constructor","message","name","captureStackTrace","BrickLoadError","exports","ErrorNode","error","returnNode","pageLevel","title","variant","showLink","showDescription","getRefinedErrorConf","presetBricks","_internalApiGetPresetBricks","errorBrick","linkBrick","bricks","Promise","race","loadBricksImperatively","getBrickPackages","_resolve","reject","setTimeout","node","tag","RenderTag","BRICK","type","properties","errorTitle","description","httpErrorToString","undefined","dataset","errorBoundary","runtimeContext","return","child","textContent","i18n","t","NS","K","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","HttpResponseError","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":[]}
|
|
@@ -36,8 +36,8 @@ var _evaluate = require("./compute/evaluate.js");
|
|
|
36
36
|
var _matchStoryboard = require("./matchStoryboard.js");
|
|
37
37
|
var _bindListeners = require("./bindListeners.js");
|
|
38
38
|
var _setupRootRuntimeContext = require("./setupRootRuntimeContext.js");
|
|
39
|
-
var _handleHttpError = require("../handleHttpError.js");
|
|
40
39
|
var _routeMatchedMap = require("./routeMatchedMap.js");
|
|
40
|
+
var _ErrorNode = require("./ErrorNode.js");
|
|
41
41
|
async function renderRoutes(returnNode, routes, _runtimeContext, rendererContext, parentRoutes, menuRequestReturnNode, slotId, isIncremental) {
|
|
42
42
|
const matched = await (0, _matchRoutes.matchRoutes)(routes, _runtimeContext);
|
|
43
43
|
const output = getEmptyRenderOutput();
|
|
@@ -140,21 +140,7 @@ async function renderBrick(returnNode, brickConf, _runtimeContext, rendererConte
|
|
|
140
140
|
// eslint-disable-next-line no-console
|
|
141
141
|
console.error("Error caught by error boundary:", error);
|
|
142
142
|
return {
|
|
143
|
-
node:
|
|
144
|
-
tag: _enums.RenderTag.BRICK,
|
|
145
|
-
type: "div",
|
|
146
|
-
properties: {
|
|
147
|
-
textContent: (0, _handleHttpError.httpErrorToString)(error),
|
|
148
|
-
dataset: {
|
|
149
|
-
errorBoundary: ""
|
|
150
|
-
},
|
|
151
|
-
style: {
|
|
152
|
-
color: "var(--color-error)"
|
|
153
|
-
}
|
|
154
|
-
},
|
|
155
|
-
runtimeContext: null,
|
|
156
|
-
return: returnNode
|
|
157
|
-
},
|
|
143
|
+
node: await (0, _ErrorNode.ErrorNode)(error, returnNode),
|
|
158
144
|
blockingList: []
|
|
159
145
|
};
|
|
160
146
|
} else {
|
|
@@ -511,7 +497,7 @@ async function legacyRenderBrick(returnNode, brickConf, _runtimeContext, rendere
|
|
|
511
497
|
} catch (error) {
|
|
512
498
|
// eslint-disable-next-line no-console
|
|
513
499
|
console.error("Incremental sub-router failed:", error);
|
|
514
|
-
const result = rendererContext.reCatch(error, brick);
|
|
500
|
+
const result = await rendererContext.reCatch(error, brick);
|
|
515
501
|
if (!result) {
|
|
516
502
|
return true;
|
|
517
503
|
}
|