{"version":3,"sources":["frontend-routing.ts"],"sourcesContent":["import { Logger } from \"datex-core-legacy/utils/logger.ts\";\nimport { Entrypoint } from \"../providers/entrypoints.ts\";\nimport { Path } from \"../utils/path.ts\";\nimport { ContextBuilder } from \"./context.ts\";\nimport { resolveEntrypointRoute } from \"./rendering.ts\";\nimport { domUtils } from \"../app/dom-context.ts\";\nimport { querySelector } from \"../uix-dom/dom/shadow_dom_selector.ts\";\nimport { Datex } from \"datex-core-legacy/mod.ts\";\nimport { PartialHydration } from \"../hydration/partial-hydration.ts\";\nimport { displayError } from \"../html/errors.tsx\";\nimport { setCookie } from \"../session/cookies.ts\";\nimport { app } from \"../app/app.ts\";\n\nlet navigationAPIPolyfillEnabled = false;\n// navigation api polyfill\nif (!(globalThis as any).navigation) {\n\tconst {applyPolyfill} = await import(\"../lib/navigation-api-polyfill/navigation-api.js\");\n\tapplyPolyfill();\n\tnavigationAPIPolyfillEnabled = true;\n}\n\nconst logger = new Logger(\"frontend router\");\n\ntype MergeStrategy = 'override'|'insert'\n\nconst experimentalViewTransitionsEnabled = app.options?.experimental_features?.includes(\"view-transitions\")\n\nexport class FrontendRouter {\n\n\t#frontendEntrypoint: Entrypoint;\n\t#backendEntrypoint: Entrypoint;\n\n\t#currentContent: unknown;\n\t#currentMergeStrategy?: MergeStrategy;\n\t\n\tsetEntrypoints(frontend?: Entrypoint, backend?: Entrypoint, isHydrating = false, mergeStrategy: MergeStrategy = 'override', requestBackendContent = false) {\n\t\tthis.#frontendEntrypoint = frontend;\n\t\tthis.#backendEntrypoint = backend;\n\n\t\t// no initial ssr content provided, request it from the backend\n\t\tif (requestBackendContent) this.renderRouteContent();\n\t\t// render current route frontend content, backend content is already provided from the HTTP response\n\t\telse this.renderRouteFrontendContent(isHydrating, mergeStrategy);\n\t}\n\n\tasync navigateTo(route: string|URL) {\n\t\tconst routePath = new Path(route, globalThis.location.origin);\n\t\tif (new Path(location.href).toString() === routePath.toString()) {\n\t\t\tlogger.info(\"already on route \" + route + \", skipping navigation\");\n\t\t\treturn;\n\t\t}\n\n\t\t// update current tab url\n\t\thistory.pushState(null, \"\", routePath.routename);\n\t\t// render content\n\t\tawait this.renderRouteContent(routePath);\n\t}\n\n\tasync renderRouteContent(route: string|URL = location.href) {\n\t\tconst routePath = new Path(route, globalThis.location.origin);\n\t\t// render content\n\t\tconst {content: backendContent, status_code } = await this.getBackendContent(route);\n\n\t\t// full reload if status code is 302\n\t\tif (status_code === 302) {\n\t\t\tif (typeof backendContent == \"string\") {\n\t\t\t\t// set uix-cache-token cookie\n\t\t\t\tsetCookie(\"uix-cache-token\", routePath.pathname + \":\" + backendContent);\n\t\t\t}\n\t\t\tglobalThis.location.href = routePath.routename;\n\t\t\treturn;\n\t\t}\n\n\t\tif (backendContent!=null) this.overrideContent(backendContent);\n\n\t\tconst isHydrating = backendContent != null;\n\t\tconst mergeStrategy = isHydrating ? 'insert' : 'override';\n\t\tthis.renderRouteFrontendContent(isHydrating, mergeStrategy, route);\n\t}\n\n\tasync renderRouteFrontendContent(isHydrating: boolean, mergeStrategy: MergeStrategy = 'override', route: string|URL = location.href) {\n\t\t// has backend content?\n\t\tconst hasBackendRenderedContent = isHydrating;\n\n\t\t// no backend content, just render frontend content\n\t\tif (!hasBackendRenderedContent) mergeStrategy = 'override';\n\n\t\tconst {content} = await this.getContentFromEntrypoint(this.#frontendEntrypoint, route);\n\n\t\tif (content == null) {\n\t\t\tif (!hasBackendRenderedContent) displayError(\"UIX Rendering Error\", \"Route not found on backend or frontend\");\n\t\t\tthis.#currentContent = content;\n\t\t\tthis.#currentMergeStrategy = mergeStrategy;\n\t\t\treturn;\n\t\t}\n\n\t\tif (content == this.#currentContent && mergeStrategy == this.#currentMergeStrategy) {\n\t\t\tlogger.info(\"content for \" + route + \" is the same, skipping\");\n\t\t\treturn;\n\t\t}\n\n\t\tlogger.success(\"navigating to \" + route);\n\n\t\tthis.#currentContent = content;\n\t\tthis.#currentMergeStrategy = mergeStrategy;\n\n\t\tif (mergeStrategy == 'override') this.overrideContent(content);\n\t\telse if (mergeStrategy == 'insert') this.insertContent(content);\n\t\telse throw new Error(\"Invalid merge strategy: \" + mergeStrategy);\n\t}\n\n\toverrideContent(content: unknown) {\n\t\tif (content == null) return;\n\n\t\t// partial hydration, no need to set new dom nodes \n\t\telse if (content instanceof PartialHydration) {\n\t\t\treturn;\n\t\t}\n\n\t\telse if (content instanceof Array) {\n\t\t\tdocument.body.innerHTML = \"\";\n\t\t\tdomUtils.append(document.body, content) // add to document\n\t\t}\n\t\t// handle response\n\t\telse if (content instanceof Response) {\n\t\t\tthis.renderResponse(content)\n\t\t}\n\n\t\t// TODO: currently only displayed if type not correctly mapped (TypedValue fallback)\n\t\telse if (!(content instanceof Datex.TypedValue)) { //if (content instanceof Element || content instanceof DocumentFragment) {\n\t\t\tdocument.body.innerHTML = \"\";\n\t\t\t// TODO: handle all content correctly (same behavior as on backend)\n\t\t\tdomUtils.append(document.body, content as any) // add to document\n\t\t}\n\t\telse {\n\t\t\tdisplayError(\"UIX Rendering Error\", \"Cannot render value of type \" + Datex.Type.ofValue(content));\n\t\t}\n\t}\n\n\t/**\n\t * Render a Response on the client side\n\t * @param response \n\t */\n\tasync renderResponse(response: Response) {\n\t\tif (response.body instanceof ReadableStream) {\n\t\t\t// if (isContentType(response, \"text/html\")) {\n\t\t\t// \tif (response.redirected) setCurrentRoute(response.url, true);\n\t\t\t// \ttry {\n\t\t\t// \t\tconst text = await response.text();\n\t\t\t// \t\tdocument.clear()\n\t\t\t// \t\tdocument.write(text);\n\t\t\t// \t}\n\t\t\t// \tcatch (e) {\n\t\t\t// \t\tconsole.error(e)\n\t\t\t// \t}\n\t\t\t// \t// important: insert global style sheet urls from already loaded component classes again\n\t\t\t// \tawait recreateGlobalStyleSheetLinks()\n\t\t\t// \trecreatePersistentListeners()\n\t\t\t// \tdocument.close();\n\t\t\t// }\n\t\t\t// else \n\t\t\tif (this.isContentType(response, \"text/plain\")) {\n\t\t\t\tconst content = await response.text()\n\t\t\t\tdocument.body.innerHTML = '<pre style=\"all:initial;word-wrap: break-word; white-space: pre-wrap;\">'+domUtils.escapeHtml(content)+'</pre>'\n\t\t\t}\n\t\t\telse {\n\t\t\t\tdisplayError(\"UIX Rendering Error\", \"Cannot render value with mime type \\\"\"+response.headers.get(\"content-type\")+\"\\\" on frontend\");\n\t\t\t}\n\t\t}\n\t\telse if (response.status === 302) {\n\t\t\tthis.navigateTo(response.headers.get(\"location\")!);\n\t\t\t// globalThis.location.href = response.headers.get(\"location\")!;\n\t\t}\n\t\telse if (response.body) {\n\t\t\tconsole.warn(\"cannot handle response body on frontend (TODO)\", response)\n\t\t}\n\t\telse {\n\t\t\tconsole.warn(\"cannot handle response on frontend (TODO)\", response)\n\t\t}\n\t}\n\n\tisContentType(response: Response, mimeType: `${string}/${string}`) {\n\t\tconst actualMimeType = response.headers.get(\"content-type\") \n\t\treturn actualMimeType === mimeType || actualMimeType?.startsWith(mimeType + \";\")\n\t}\n\n\tinsertContent(content: unknown) {\n\t\t// get elements list from content\n\t\tconst elements = this.getElementsListFromContent(content);\n\n\t\t// no elements could be extracted\n\t\tif (!elements) {\n\t\t\tif (content instanceof Response) {\n\t\t\t\tlogger.warn(\"Content of type 'Response' cannot be merged with existing content, falling back to override\");\n\t\t\t\tthis.overrideContent(content)\n\t\t\t\treturn;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlogger.warn(\"content is not valid\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\t\n\t\t// insert into existing DOM\n\t\tfor (const el of elements) {\n\t\t\tlet slot:HTMLElement|null = null;\n\t\t\tif (el instanceof HTMLElement && el.hasAttribute(\"slot\")) {\n\t\t\t\tconst name = el.getAttribute(\"slot\")!\n\t\t\t\tslot = querySelector(`frontend-slot[name=\"${domUtils.escapeHtml(name)}\"]`) as HTMLElement;\n\t\t\t\tif (!slot) logger.error(`Could not find a matching <frontend-slot name=\"${name}\"/> for content provided from the frontend entrypoint. Make sure your backend and frontend routes are not unintentionally colliding.`);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tslot = querySelector(\"frontend-slot\") as HTMLElement;\n\t\t\t\tif (!slot) return this.overrideContent(content);\n\t\t\t}\n\n\t\t\tif (slot) {\n\t\t\t\tslot.innerHTML = \"\";\n\t\t\t\tdomUtils.append(slot, el);\n\t\t\t}\n\t\t}\n\n\n\t}\n\n\tprivate getElementsListFromContent(content: unknown) {\n\t\tlet elements = [];\n\t\tif (content instanceof DocumentFragment) elements = [...content.children as unknown as HTMLElement[]]\n\t\telse if (content instanceof Array) elements = content;\n\t\telse if (content instanceof Response) return null;\n\t\telse elements = [content];\n\t\treturn elements;\n\t}\n\n\n\tasync getContentFromEntrypoint(entrypoint: Entrypoint, route: URL|string, probe_no_side_effects = false) {\n\n\t\troute = route instanceof Path ? route : new Path(route, globalThis.location.origin);\n\n\t\t// create new context with fake request\n\t\tconst url = new Path(route, globalThis.location.origin);\n\t\tconst path = route.pathname;\n\t\tconst context = new ContextBuilder()\n\t\t\t.setRequestData(new Request(url), path)\n\t\t\t.build()\n\t\tcontext.path = path;\n\t\tcontext.request = new Request(url)\n\n\t\tconst { content, status_code } = await resolveEntrypointRoute({entrypoint, context, route, probe_no_side_effects});\n\t\treturn { content, status_code };\n\t}\n\n\tgetBackendContent(route: URL|string) {\n\t\treturn this.getContentFromEntrypoint(this.#backendEntrypoint, route);\n\t}\n\n\tenableNavigationInterception() {\n\t\tconst _globalThis = globalThis as any;\n\t\t// disable for now in non-chromium browsers until navigate event is fully supported\n\t\tconst isChromium = !!_globalThis.chrome && (!!_globalThis.chrome.webstore || !!_globalThis.chrome.runtime);\n\t\tif (isChromium && _globalThis.navigation) {\n\t\t\t_globalThis.navigation?.addEventListener(\"navigate\", (e:any)=>{\n\t\t\t\tif (!e.canIntercept || e.downloadRequest || e.formData) return;\n\t\t\t\tif (!navigationAPIPolyfillEnabled && !e.userInitiated) return;\n\t\t\t\t\n\t\t\t\tconst url = new URL(e.destination.url);\n\t\t\t\t// pass links to /@uix/...\n\t\t\t\tif (url.pathname.startsWith(\"/@uix/\")) return;\n\n\t\t\t\tif (url.origin != new URL(globalThis.location.href).origin) return;\n\n\t\t\t\t// TODO: this intercept should be cancelled/not executed when the route is loaded from the server (determined in handleCurrentURLRoute)\n\t\t\t\te.intercept({\n\t\t\t\t\thandler: () => {\n\t\t\t\t\t\t// render content\n\t\t\t\t\t\t// With view transitions\n\t\t\t\t\t\tif (experimentalViewTransitionsEnabled && document.startViewTransition) document.startViewTransition(() => this.renderRouteContent(url));\n\t\t\t\t\t\t// Without view transitions\n\t\t\t\t\t\telse return this.renderRouteContent(url);\n\t\t\t\t\t},\n\t\t\t\t\tfocusReset: 'manual',\n\t\t\t\t\tscroll: 'manual'\n\t\t\t\t})\n\t\t\t})\n\t\t}\n\t}\n\n}\n\nexport const frontendRouter = new FrontendRouter();\n\nfrontendRouter.enableNavigationInterception();\n\nglobalThis.frontendRouter = frontendRouter;"],"names":["Logger","Path","ContextBuilder","resolveEntrypointRoute","domUtils","querySelector","Datex","PartialHydration","displayError","setCookie","app","navigationAPIPolyfillEnabled","globalThis","navigation","applyPolyfill","logger","experimentalViewTransitionsEnabled","options","experimental_features","includes","FrontendRouter","setEntrypoints","frontend","backend","isHydrating","mergeStrategy","requestBackendContent","renderRouteContent","renderRouteFrontendContent","navigateTo","route","routePath","location","origin","href","toString","info","history","pushState","routename","content","backendContent","status_code","getBackendContent","pathname","overrideContent","getContentFromEntrypoint","success","insertContent","Error","Array","document","body","innerHTML","append","Response","renderResponse","TypedValue","Type","ofValue","response","ReadableStream","isContentType","text","escapeHtml","headers","get","status","console","warn","mimeType","actualMimeType","startsWith","elements","getElementsListFromContent","el","slot","HTMLElement","hasAttribute","name","getAttribute","error","DocumentFragment","children","entrypoint","probe_no_side_effects","url","path","context","setRequestData","Request","build","request","enableNavigationInterception","_globalThis","chrome","webstore","runtime","addEventListener","e","canIntercept","downloadRequest","formData","userInitiated","URL","destination","intercept","handler","startViewTransition","focusReset","scroll","frontendRouter"],"mappings":"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","sourceRoot":"/lib/uix-0.4.39/src/routing/","file":"frontend-routing.ts"}