@next-core/runtime 1.54.10 → 1.54.12

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/createRoot.js +2 -16
  2. package/dist/cjs/createRoot.js.map +1 -1
  3. package/dist/cjs/getPageInfo.js +4 -2
  4. package/dist/cjs/getPageInfo.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/createRoot.js +2 -16
  18. package/dist/esm/createRoot.js.map +1 -1
  19. package/dist/esm/getPageInfo.js +4 -2
  20. package/dist/esm/getPageInfo.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":"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":[]}
@@ -25,10 +25,12 @@ export function getPageInfo() {
25
25
  const parentPathname = window.parent.location.pathname;
26
26
  const parentIsNext = parentPathname.startsWith("/next/");
27
27
  misc.isInIframeOfNext = (Number(selfIsNext) ^ Number(parentIsNext)) === 0;
28
- misc.isInIframeOfVisualBuilder = parentPathname.startsWith(`${parentIsNext ? "/next" : ""}/visual-builder/`);
28
+ const prefix = parentIsNext ? "/next" : "";
29
+ // Allow visual-builder-* extension apps.
30
+ misc.isInIframeOfVisualBuilder = parentPathname.startsWith(`${prefix}/visual-builder/`) || parentPathname.startsWith(`${prefix}/visual-builder-`);
29
31
  misc.isInIframeOfLegacyConsole = selfIsNext && !parentIsNext;
30
32
  }
31
- } catch (e) {
33
+ } catch {
32
34
  // do nothing
33
35
  }
34
36
  }
@@ -1 +1 @@
1
- {"version":3,"file":"getPageInfo.js","names":["getBasePath","misc","getPageInfo","isInIframe","isInIframeOfSameSite","isInIframeOfNext","isInIframeOfVisualBuilder","isInIframeOfLegacyConsole","window","parent","origin","selfIsNext","parentPathname","location","pathname","parentIsNext","startsWith","Number","e","Object","freeze"],"sources":["../../src/getPageInfo.ts"],"sourcesContent":["import { getBasePath } from \"./getBasePath.js\";\n\nlet misc: PageInfo;\n\n/** 运行时页面信息。*/\nexport interface PageInfo {\n /** 当前是否处于 iframe 模式。 */\n isInIframe: boolean;\n\n /** 当前是否处于同域的 iframe 模式。 */\n isInIframeOfSameSite: boolean;\n\n /** 当前是否处于新框架下的 iframe 模式。 */\n isInIframeOfNext: boolean;\n\n /** 当前是否处于 Visual Builder 预览的 iframe 模式。 */\n isInIframeOfVisualBuilder: boolean;\n\n /** 当前是否处于老 console 下的 iframe 模式。 */\n isInIframeOfLegacyConsole: boolean;\n}\n\nexport function getPageInfo(): PageInfo {\n if (!misc) {\n misc = {\n isInIframe: false,\n isInIframeOfSameSite: false,\n isInIframeOfNext: false,\n isInIframeOfVisualBuilder: false,\n isInIframeOfLegacyConsole: false,\n };\n\n if (window !== window.parent) {\n misc.isInIframe = true;\n try {\n // Handle:\n // - Previewing in visual builder by iframe.\n // - Nesting next in next.\n // - Nesting console in next.\n if (window.origin === window.parent.origin) {\n misc.isInIframeOfSameSite = true;\n const selfIsNext = getBasePath() === \"/next/\";\n const parentPathname = window.parent.location.pathname;\n const parentIsNext = parentPathname.startsWith(\"/next/\");\n misc.isInIframeOfNext =\n (Number(selfIsNext) ^ Number(parentIsNext)) === 0;\n misc.isInIframeOfVisualBuilder = parentPathname.startsWith(\n `${parentIsNext ? \"/next\" : \"\"}/visual-builder/`\n );\n misc.isInIframeOfLegacyConsole = selfIsNext && !parentIsNext;\n }\n } catch (e) {\n // do nothing\n }\n }\n\n Object.freeze(misc);\n }\n\n return misc;\n}\n"],"mappings":"AAAA,SAASA,WAAW,QAAQ,kBAAkB;AAE9C,IAAIC,IAAc;;AAElB;;AAkBA,OAAO,SAASC,WAAWA,CAAA,EAAa;EACtC,IAAI,CAACD,IAAI,EAAE;IACTA,IAAI,GAAG;MACLE,UAAU,EAAE,KAAK;MACjBC,oBAAoB,EAAE,KAAK;MAC3BC,gBAAgB,EAAE,KAAK;MACvBC,yBAAyB,EAAE,KAAK;MAChCC,yBAAyB,EAAE;IAC7B,CAAC;IAED,IAAIC,MAAM,KAAKA,MAAM,CAACC,MAAM,EAAE;MAC5BR,IAAI,CAACE,UAAU,GAAG,IAAI;MACtB,IAAI;QACF;QACA;QACA;QACA;QACA,IAAIK,MAAM,CAACE,MAAM,KAAKF,MAAM,CAACC,MAAM,CAACC,MAAM,EAAE;UAC1CT,IAAI,CAACG,oBAAoB,GAAG,IAAI;UAChC,MAAMO,UAAU,GAAGX,WAAW,CAAC,CAAC,KAAK,QAAQ;UAC7C,MAAMY,cAAc,GAAGJ,MAAM,CAACC,MAAM,CAACI,QAAQ,CAACC,QAAQ;UACtD,MAAMC,YAAY,GAAGH,cAAc,CAACI,UAAU,CAAC,QAAQ,CAAC;UACxDf,IAAI,CAACI,gBAAgB,GACnB,CAACY,MAAM,CAACN,UAAU,CAAC,GAAGM,MAAM,CAACF,YAAY,CAAC,MAAM,CAAC;UACnDd,IAAI,CAACK,yBAAyB,GAAGM,cAAc,CAACI,UAAU,CACxD,GAAGD,YAAY,GAAG,OAAO,GAAG,EAAE,kBAChC,CAAC;UACDd,IAAI,CAACM,yBAAyB,GAAGI,UAAU,IAAI,CAACI,YAAY;QAC9D;MACF,CAAC,CAAC,OAAOG,CAAC,EAAE;QACV;MAAA;IAEJ;IAEAC,MAAM,CAACC,MAAM,CAACnB,IAAI,CAAC;EACrB;EAEA,OAAOA,IAAI;AACb","ignoreList":[]}
1
+ {"version":3,"file":"getPageInfo.js","names":["getBasePath","misc","getPageInfo","isInIframe","isInIframeOfSameSite","isInIframeOfNext","isInIframeOfVisualBuilder","isInIframeOfLegacyConsole","window","parent","origin","selfIsNext","parentPathname","location","pathname","parentIsNext","startsWith","Number","prefix","Object","freeze"],"sources":["../../src/getPageInfo.ts"],"sourcesContent":["import { getBasePath } from \"./getBasePath.js\";\n\nlet misc: PageInfo;\n\n/** 运行时页面信息。*/\nexport interface PageInfo {\n /** 当前是否处于 iframe 模式。 */\n isInIframe: boolean;\n\n /** 当前是否处于同域的 iframe 模式。 */\n isInIframeOfSameSite: boolean;\n\n /** 当前是否处于新框架下的 iframe 模式。 */\n isInIframeOfNext: boolean;\n\n /** 当前是否处于 Visual Builder 预览的 iframe 模式。 */\n isInIframeOfVisualBuilder: boolean;\n\n /** 当前是否处于老 console 下的 iframe 模式。 */\n isInIframeOfLegacyConsole: boolean;\n}\n\nexport function getPageInfo(): PageInfo {\n if (!misc) {\n misc = {\n isInIframe: false,\n isInIframeOfSameSite: false,\n isInIframeOfNext: false,\n isInIframeOfVisualBuilder: false,\n isInIframeOfLegacyConsole: false,\n };\n\n if (window !== window.parent) {\n misc.isInIframe = true;\n try {\n // Handle:\n // - Previewing in visual builder by iframe.\n // - Nesting next in next.\n // - Nesting console in next.\n if (window.origin === window.parent.origin) {\n misc.isInIframeOfSameSite = true;\n const selfIsNext = getBasePath() === \"/next/\";\n const parentPathname = window.parent.location.pathname;\n const parentIsNext = parentPathname.startsWith(\"/next/\");\n misc.isInIframeOfNext =\n (Number(selfIsNext) ^ Number(parentIsNext)) === 0;\n const prefix = parentIsNext ? \"/next\" : \"\";\n // Allow visual-builder-* extension apps.\n misc.isInIframeOfVisualBuilder =\n parentPathname.startsWith(`${prefix}/visual-builder/`) ||\n parentPathname.startsWith(`${prefix}/visual-builder-`);\n misc.isInIframeOfLegacyConsole = selfIsNext && !parentIsNext;\n }\n } catch {\n // do nothing\n }\n }\n\n Object.freeze(misc);\n }\n\n return misc;\n}\n"],"mappings":"AAAA,SAASA,WAAW,QAAQ,kBAAkB;AAE9C,IAAIC,IAAc;;AAElB;;AAkBA,OAAO,SAASC,WAAWA,CAAA,EAAa;EACtC,IAAI,CAACD,IAAI,EAAE;IACTA,IAAI,GAAG;MACLE,UAAU,EAAE,KAAK;MACjBC,oBAAoB,EAAE,KAAK;MAC3BC,gBAAgB,EAAE,KAAK;MACvBC,yBAAyB,EAAE,KAAK;MAChCC,yBAAyB,EAAE;IAC7B,CAAC;IAED,IAAIC,MAAM,KAAKA,MAAM,CAACC,MAAM,EAAE;MAC5BR,IAAI,CAACE,UAAU,GAAG,IAAI;MACtB,IAAI;QACF;QACA;QACA;QACA;QACA,IAAIK,MAAM,CAACE,MAAM,KAAKF,MAAM,CAACC,MAAM,CAACC,MAAM,EAAE;UAC1CT,IAAI,CAACG,oBAAoB,GAAG,IAAI;UAChC,MAAMO,UAAU,GAAGX,WAAW,CAAC,CAAC,KAAK,QAAQ;UAC7C,MAAMY,cAAc,GAAGJ,MAAM,CAACC,MAAM,CAACI,QAAQ,CAACC,QAAQ;UACtD,MAAMC,YAAY,GAAGH,cAAc,CAACI,UAAU,CAAC,QAAQ,CAAC;UACxDf,IAAI,CAACI,gBAAgB,GACnB,CAACY,MAAM,CAACN,UAAU,CAAC,GAAGM,MAAM,CAACF,YAAY,CAAC,MAAM,CAAC;UACnD,MAAMG,MAAM,GAAGH,YAAY,GAAG,OAAO,GAAG,EAAE;UAC1C;UACAd,IAAI,CAACK,yBAAyB,GAC5BM,cAAc,CAACI,UAAU,CAAC,GAAGE,MAAM,kBAAkB,CAAC,IACtDN,cAAc,CAACI,UAAU,CAAC,GAAGE,MAAM,kBAAkB,CAAC;UACxDjB,IAAI,CAACM,yBAAyB,GAAGI,UAAU,IAAI,CAACI,YAAY;QAC9D;MACF,CAAC,CAAC,MAAM;QACN;MAAA;IAEJ;IAEAI,MAAM,CAACC,MAAM,CAACnB,IAAI,CAAC;EACrB;EAEA,OAAOA,IAAI;AACb","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
  }