@epic-web/workshop-app 4.27.1 → 4.28.1

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.
@@ -0,0 +1,2 @@
1
+ import{j as e,r as a}from"./index-1cKOJFpX.js";import{u as ae,b as Q,I,c as ie,a as X}from"./misc-Txs7O6JX.js";import{z as t,u as Z}from"./request-info-CEhUGODY.js";import{B as C}from"./button-CQ6cnotS.js";import{L as ee}from"./loading-CF7oQHQf.js";import{s as O}from"./progress-bar-bUuKn1Q8.js";import{u as z}from"./pe-CUZaIcdt.js";import{a as q,b as oe,F as le}from"./components-CME-nGId.js";import{T as ce,a as v,b as E,c as B}from"./tooltip-DTFU8ajx.js";import{u as ue}from"./index-DlJAkutV.js";function de({name:o}){var i;const r=q(),l=z(),c=(i=r.formData)==null?void 0:i.get("intent"),u=c==="stop"?"Stopping App":c==="restart"?"Restarting App":null,m=ae();return e.jsxs(r.Form,{method:"POST",action:"/start",children:[l,O,e.jsx("input",{type:"hidden",name:"name",value:o}),e.jsx("button",{type:"submit",name:"intent",value:m?"restart":"stop",className:"h-full border-r px-3 py-4 font-mono text-xs uppercase leading-none",children:u||(m?"Restart App":"Stop App")})]})}function te({port:o}){const r=q(),l=z();return e.jsxs(r.Form,{method:"POST",action:"/start",children:[l,O,e.jsx("input",{type:"hidden",name:"port",value:o}),e.jsx(C,{varient:"mono",type:"submit",name:"intent",value:"stop-port",children:r.state==="idle"?"Stop Port":"Stopping Port"})]})}function he({name:o}){var c;const r=q(),l=z();return((c=r.data)==null?void 0:c.status)==="app-not-started"?r.data.error==="port-unavailable"?e.jsxs("div",{children:["The port is unavailable. Would you like to stop whatever is running on that port and try again?",e.jsx(te,{port:r.data.port})]}):e.jsx("div",{children:"An unknown error has happened."}):e.jsxs(r.Form,{method:"POST",action:"/start",children:[l,O,e.jsx("input",{type:"hidden",name:"name",value:o}),r.state==="idle"?e.jsx(C,{type:"submit",name:"intent",value:"start",varient:"mono",children:"Start App"}):e.jsx("div",{children:e.jsx(ee,{children:"Starting App"})})]})}const fe=t.intersection(t.object({type:t.literal("epicshop:history-call")}),t.union([t.object({method:t.literal("pushState"),args:t.union([t.tuple([t.object({}).passthrough(),t.unknown()]),t.tuple([t.object({}).passthrough(),t.unknown(),t.string()])])}),t.object({method:t.literal("replaceState"),args:t.union([t.tuple([t.object({}).passthrough(),t.unknown()]),t.tuple([t.object({}).passthrough(),t.unknown(),t.string()])])}),t.object({method:t.literal("go"),args:t.tuple([t.number().optional()])}),t.object({method:t.literal("forward"),args:t.tuple([])}),t.object({method:t.literal("back"),args:t.tuple([])}),t.object({method:t.literal("popstate"),pathname:t.string(),delta:t.number()})])),me=t.object({type:t.literal("epicshop:loaded"),url:t.string()}),pe=t.union([fe,me]);function J(o,r,l){return Math.min(Math.max(o+r,0),l)}const xe=a.forwardRef(ge);function ge({name:o,port:r,portIsAvailable:l,isRunning:c,baseUrl:u,id:m,initialRoute:i},p){const b=Z();return c?e.jsx(je,{baseUrl:u,id:m,name:o,ref:p,initialRoute:i}):l===!1?e.jsxs("div",{className:"flex flex-col items-center justify-center",children:[e.jsxs("p",{className:"max-w-xs pb-5 text-center",role:"status",children:["The port for this app is unavailable. It could be that you're running it ",e.jsx("a",{href:Q({domain:b.domain,port:r}),className:"underline",children:"elsewhere"}),"?"]}),e.jsx(te,{port:r})]}):e.jsx(he,{name:o})}const je=a.forwardRef(we);function we({baseUrl:o,id:r,name:l,initialRoute:c},u){const[m,i]=oe(),p=m.get("pathname")??c,[b,N]=a.useState(0),x=r+b,y=a.useRef("new"),L=a.useRef(null),[g,T]=a.useState({history:[p],index:0}),[H,U]=a.useState(p),A=a.useRef(null),j=new URL(p,o),M=a.useRef(j);a.useEffect(()=>{M.current=j});const[W,_]=a.useState(j),F=a.useRef(r);F.current!==r&&(F.current=r,_(M.current)),a.useEffect(()=>{F.current=r}),a.useEffect(()=>{function n(d){var Y;if(d.source!==((Y=A.current)==null?void 0:Y.contentWindow))return;const P=pe.safeParse(d.data,{path:["messageEvent","data"]});if(!P.success)return;const{data:h}=P;if(h.type==="epicshop:loaded"){T(s=>{const w=S=>J(s.index,S,s.history.length-1);if(y.current==="back")return{...s,index:w(-1)};if(y.current==="forward")return{...s,index:w(1)};if(y.current==="new"){const S=s.history[s.index],f=new URL(h.url),k=f.pathname+f.search;if(S===k)return s;const $=[...s.history.slice(0,s.index+1),k];return{history:$,index:$.length-1}}else throw new Error("Unexpected lastDirectionRef value")});return}const{method:ne}=h;T(s=>{const w=f=>J(s.index,f,s.history.length-1),S=s.history[s.index];switch(ne){case"popstate":return{...s,index:w(h.delta)};case"forward":return{...s,index:w(1)};case"back":return{...s,index:w(-1)};case"pushState":{const f=h.args[2]??S,k=[...s.history.slice(0,s.index+1),f].filter(Boolean);return{...s,history:k,index:k.length-1}}case"replaceState":{const f=h.args[2]??S;return{...s,history:[...s.history.slice(0,s.index),f,...s.history.slice(s.index+1)].filter(Boolean)}}case"go":{const[f=0]=h.args;return{...s,index:w(f)}}}})}return window.addEventListener("message",n),()=>{window.removeEventListener("message",n)}},[]);const K=a.useRef(i);a.useEffect(()=>{K.current=i},[i]);const R=g.history[g.index];a.useEffect(()=>{if(!R)return;U(R);const n=new URLSearchParams(window.location.search);R==="/"?n.delete("pathname"):n.set("pathname",R),`?${n.toString()}`!==window.location.search&&K.current(n,{replace:!0})},[R]);const D=(...n)=>{var P,h;const d=n[0];typeof d=="number"?y.current=d>0?"forward":"back":y.current="new",L.current&&clearTimeout(L.current),L.current=setTimeout(()=>{y.current="new"},100),(h=(P=A.current)==null?void 0:P.contentWindow)==null||h.postMessage({type:"epicshop:navigate-call",params:n},"*")};function G(n=H){U(n);const d=g.history[g.index];D(n,{replace:d===n})}a.useImperativeHandle(u,()=>({handleExtrnalNavigation:G}));const re=g.index===g.history.length-1,se=g.index<=0,V=[];for(const[n,d]of m.entries())n!=="pathname"&&V.push(e.jsx("input",{type:"hidden",name:n,value:d},n));return e.jsx(ce,{children:e.jsxs("div",{className:"flex h-full flex-grow flex-col",children:[e.jsxs("div",{className:"flex items-center justify-between border-b pl-1.5",children:[e.jsxs("div",{className:"mr-2 flex items-center justify-center gap-2 px-1",children:[e.jsxs(v,{children:[e.jsx(E,{asChild:!0,children:e.jsx("button",{type:"button",className:"hidden aspect-square h-full w-full items-center justify-center p-1 transition disabled:opacity-40 sm:flex",disabled:se,onClick:()=>D(-1),children:e.jsx(I,{name:"ArrowLeft","aria-hidden":"true"})})}),e.jsx(B,{children:"Go back"})]}),e.jsxs(v,{children:[e.jsx(E,{asChild:!0,children:e.jsx("button",{type:"button",className:"hidden aspect-square h-full w-full items-center justify-center p-1 transition disabled:opacity-40 sm:flex",disabled:re,onClick:()=>D(1),children:e.jsx(I,{name:"ArrowRight","aria-hidden":"true"})})}),e.jsx(B,{children:"Go forward"})]}),e.jsxs(v,{children:[e.jsx(E,{asChild:!0,children:e.jsx("button",{type:"button",className:"flex aspect-square h-full w-full items-center justify-center p-1 transition disabled:opacity-40",onClick:()=>{_(j),N(b+1),T({history:[j.pathname],index:0})},children:e.jsx(I,{name:"Refresh","aria-hidden":"true"})})}),e.jsx(B,{children:"Refresh"})]})]}),e.jsxs(le,{method:"get",replace:!0,className:"flex flex-1 gap-2",onSubmit:()=>G(),children:[V,e.jsxs("div",{className:"flex flex-1 items-center border-x bg-background p-3 leading-none text-foreground",children:[e.jsx("a",{href:j.toString(),target:"_blank",rel:"noreferrer",children:W.host}),e.jsx("input",{"aria-label":"pathname",className:"w-full flex-1 bg-background focus-visible:outline-none",value:H,name:"pathname",onChange:n=>U(n.currentTarget.value)})]})]}),e.jsx(de,{name:l}),e.jsxs(v,{children:[e.jsx(E,{asChild:!0,children:e.jsx("a",{href:j.toString(),target:"_blank",rel:"noreferrer",className:ie("flex aspect-square items-center justify-center px-3.5"),children:e.jsx(I,{name:"ExternalLink"})})}),e.jsx(B,{children:"Open in new tab"})]})]}),e.jsx("div",{className:"flex h-full w-full flex-grow dark:bg-white",children:e.jsx("iframe",{title:l,ref:A,src:W.toString(),className:"h-full w-full flex-grow bg-white"},x)})]})})}function Le({id:o,appInfo:r,inBrowserBrowserRef:l}){const c=Z(),u=ue();if(!r)return e.jsx("p",{children:"No app here. Sorry."});const{isRunning:m,dev:i,name:p,portIsAvailable:b,title:N}=r;if(ENV.EPICSHOP_DEPLOYED&&r.stackBlitzUrl){const x=new URL(r.stackBlitzUrl);return x.searchParams.set("embed","1"),x.searchParams.set("theme",u),e.jsx(be,{title:N,url:x.toString(),loadingContent:e.jsx(ee,{children:e.jsxs("span",{children:["Loading"," ",e.jsxs("a",{className:"underline",href:r.stackBlitzUrl,children:['"',N,'"']})]})})})}if(i.type==="script"){const x=Q({domain:c.domain,port:i.portNumber});return e.jsx(xe,{ref:l,isRunning:m,id:o??p,name:p,portIsAvailable:b,port:i.portNumber,baseUrl:x,initialRoute:i.initialRoute})}else return i.type==="browser"?e.jsxs("div",{className:"relative h-full flex-grow overflow-y-auto scrollbar-thin scrollbar-thumb-scrollbar",children:[e.jsxs("a",{href:i.pathname,target:"_blank",rel:"noreferrer",className:X("absolute bottom-5 right-5 flex items-center justify-center rounded-full bg-gray-100 p-2.5 transition hover:bg-gray-200 dark:bg-gray-800 hover:dark:bg-gray-600"),children:[e.jsx(I,{name:"ExternalLink","aria-hidden":"true"}),e.jsx("span",{className:"sr-only",children:"Open in New Window"})]}),e.jsx("iframe",{title:N,src:i.pathname,className:"h-full w-full flex-grow bg-white"})]}):e.jsx("div",{className:"flex h-full items-center justify-center text-lg",children:e.jsxs("p",{children:["Preview for dev type of ",e.jsx("code",{children:i.type})," not supported."]})})}function be({url:o,title:r,loadingContent:l}){const[c,u]=a.useState(!1);return e.jsxs("div",{className:"h-full w-full flex-grow",children:[c?null:e.jsx("div",{className:"absolute inset-0 z-10 flex items-center justify-center",children:l}),e.jsx("iframe",{onLoad:()=>u(!0),onError:()=>u(!0),src:o,className:X("h-full w-full flex-grow transition-opacity duration-300",c?"opacity-100":"opacity-0"),title:r,sandbox:"allow-forms allow-scripts allow-same-origin allow-popups allow-popups-to-escape-sandbox"})]})}export{Le as P};
2
+ //# sourceMappingURL=preview-CWCIw-lc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preview-CWCIw-lc.js","sources":["../../../app/routes/start.tsx","../../../app/components/in-browser-browser.tsx","../../../app/routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/__shared/preview.tsx"],"sourcesContent":["import { invariant, invariantResponse } from '@epic-web/invariant'\nimport { getAppByName } from '@epic-web/workshop-utils/apps.server'\nimport {\n\tcloseProcess,\n\trunAppDev,\n\tstopPort,\n\twaitOnApp,\n} from '@epic-web/workshop-utils/process-manager.server'\nimport { json, type ActionFunctionArgs } from '@remix-run/node'\nimport { useFetcher } from '@remix-run/react'\nimport { Button } from '#app/components/button.tsx'\nimport { Loading } from '#app/components/loading.tsx'\nimport { showProgressBarField } from '#app/components/progress-bar.tsx'\nimport { ensureUndeployed, useAltDown } from '#app/utils/misc.tsx'\nimport { jsonWithPE, usePERedirectInput } from '#app/utils/pe.js'\nimport { createToastHeaders } from '#app/utils/toast.server'\n\nexport async function action({ request }: ActionFunctionArgs) {\n\tensureUndeployed()\n\tconst formData = await request.formData()\n\tconst intent = formData.get('intent')\n\tinvariantResponse(typeof intent === 'string', 'intent is required')\n\n\tif (intent === 'start' || intent === 'stop' || intent === 'restart') {\n\t\tconst name = formData.get('name')\n\t\tinvariantResponse(typeof name === 'string', 'name is required')\n\t\tconst app = await getAppByName(name)\n\t\tif (!app) {\n\t\t\tthrow new Response('Not found', { status: 404 })\n\t\t}\n\t\tif (app.dev.type !== 'script') {\n\t\t\tthrow new Response(`App \"${name}\" does not have a server`, {\n\t\t\t\tstatus: 400,\n\t\t\t})\n\t\t}\n\n\t\tasync function startApp() {\n\t\t\tinvariant(app, 'app must be defined')\n\t\t\tconst result = await runAppDev(app)\n\t\t\tif (result.running) {\n\t\t\t\tconst appRunningResult = await waitOnApp(app)\n\t\t\t\tif (appRunningResult?.status === 'success') {\n\t\t\t\t\t// wait another 200ms just in case the build output for assets isn't finished\n\t\t\t\t\tawait new Promise((resolve) => setTimeout(resolve, 200))\n\t\t\t\t\treturn jsonWithPE(formData, { status: 'app-started' } as const)\n\t\t\t\t} else if (app.dev.type === 'script') {\n\t\t\t\t\tconst errorMessage = appRunningResult\n\t\t\t\t\t\t? appRunningResult.error\n\t\t\t\t\t\t: 'Unknown error'\n\t\t\t\t\treturn json(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tstatus: 'app-not-started',\n\t\t\t\t\t\t\terror: errorMessage,\n\t\t\t\t\t\t\tport: app.dev.portNumber,\n\t\t\t\t\t\t} as const,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tstatus: 500,\n\t\t\t\t\t\t\tstatusText: 'App did not start',\n\t\t\t\t\t\t\theaders: await createToastHeaders({\n\t\t\t\t\t\t\t\tdescription: errorMessage,\n\t\t\t\t\t\t\t\ttitle: 'App did not start',\n\t\t\t\t\t\t\t\ttype: 'error',\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t},\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t} else if (result.portNumber) {\n\t\t\t\treturn jsonWithPE(formData, {\n\t\t\t\t\tstatus: 'app-not-started',\n\t\t\t\t\terror: result.status,\n\t\t\t\t\tport: result.portNumber,\n\t\t\t\t} as const)\n\t\t\t} else {\n\t\t\t\tthrow new Response(\n\t\t\t\t\t'Tried starting a server for an app that does not have one',\n\t\t\t\t\t{ status: 400 },\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\n\t\tasync function stopApp() {\n\t\t\tinvariant(app, 'app must be defined')\n\t\t\tawait closeProcess(app.name)\n\t\t\treturn jsonWithPE(formData, { status: 'app-stopped' } as const)\n\t\t}\n\n\t\tswitch (intent) {\n\t\t\tcase 'start': {\n\t\t\t\treturn startApp()\n\t\t\t}\n\t\t\tcase 'stop': {\n\t\t\t\treturn stopApp()\n\t\t\t}\n\t\t\tcase 'restart': {\n\t\t\t\tawait stopApp()\n\t\t\t\treturn startApp()\n\t\t\t}\n\t\t}\n\t}\n\n\tif (intent === 'stop-port') {\n\t\tconst port = formData.get('port')\n\t\tinvariantResponse(typeof port === 'string', 'port is required')\n\t\tawait stopPort(port)\n\t\treturn jsonWithPE(formData, { status: 'port-stopped' } as const)\n\t}\n\tthrow new Error(`Unknown intent: ${intent}`)\n}\n\nexport function AppStopper({ name }: { name: string }) {\n\tconst fetcher = useFetcher<typeof action>()\n\tconst peRedirectInput = usePERedirectInput()\n\tconst inFlightIntent = fetcher.formData?.get('intent')\n\tconst inFlightState =\n\t\tinFlightIntent === 'stop'\n\t\t\t? 'Stopping App'\n\t\t\t: inFlightIntent === 'restart'\n\t\t\t\t? 'Restarting App'\n\t\t\t\t: null\n\tconst altDown = useAltDown()\n\treturn (\n\t\t<fetcher.Form method=\"POST\" action=\"/start\">\n\t\t\t{peRedirectInput}\n\t\t\t{showProgressBarField}\n\t\t\t<input type=\"hidden\" name=\"name\" value={name} />\n\t\t\t<button\n\t\t\t\ttype=\"submit\"\n\t\t\t\tname=\"intent\"\n\t\t\t\tvalue={altDown ? 'restart' : 'stop'}\n\t\t\t\tclassName=\"h-full border-r px-3 py-4 font-mono text-xs uppercase leading-none\"\n\t\t\t>\n\t\t\t\t{inFlightState ? inFlightState : altDown ? 'Restart App' : 'Stop App'}\n\t\t\t</button>\n\t\t</fetcher.Form>\n\t)\n}\n\nexport function PortStopper({ port }: { port: number | string }) {\n\tconst fetcher = useFetcher<typeof action>()\n\tconst peRedirectInput = usePERedirectInput()\n\treturn (\n\t\t<fetcher.Form method=\"POST\" action=\"/start\">\n\t\t\t{peRedirectInput}\n\t\t\t{showProgressBarField}\n\t\t\t<input type=\"hidden\" name=\"port\" value={port} />\n\t\t\t<Button varient=\"mono\" type=\"submit\" name=\"intent\" value=\"stop-port\">\n\t\t\t\t{fetcher.state === 'idle' ? 'Stop Port' : 'Stopping Port'}\n\t\t\t</Button>\n\t\t</fetcher.Form>\n\t)\n}\n\nexport function AppStarter({ name }: { name: string }) {\n\tconst fetcher = useFetcher<typeof action>()\n\tconst peRedirectInput = usePERedirectInput()\n\tif (fetcher.data?.status === 'app-not-started') {\n\t\tif (fetcher.data.error === 'port-unavailable') {\n\t\t\treturn (\n\t\t\t\t<div>\n\t\t\t\t\tThe port is unavailable. Would you like to stop whatever is running on\n\t\t\t\t\tthat port and try again?\n\t\t\t\t\t<PortStopper port={fetcher.data.port} />\n\t\t\t\t</div>\n\t\t\t)\n\t\t} else {\n\t\t\treturn <div>An unknown error has happened.</div>\n\t\t}\n\t}\n\treturn (\n\t\t<fetcher.Form method=\"POST\" action=\"/start\">\n\t\t\t{peRedirectInput}\n\t\t\t{showProgressBarField}\n\t\t\t<input type=\"hidden\" name=\"name\" value={name} />\n\t\t\t{fetcher.state === 'idle' ? (\n\t\t\t\t<Button type=\"submit\" name=\"intent\" value=\"start\" varient=\"mono\">\n\t\t\t\t\tStart App\n\t\t\t\t</Button>\n\t\t\t) : (\n\t\t\t\t<div>\n\t\t\t\t\t<Loading>Starting App</Loading>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</fetcher.Form>\n\t)\n}\n","import { Form, useSearchParams, type NavigateFunction } from '@remix-run/react'\nimport { clsx } from 'clsx'\nimport {\n\tforwardRef,\n\tuseEffect,\n\tuseImperativeHandle,\n\tuseRef,\n\tuseState,\n\ttype ForwardedRef,\n} from 'react'\nimport { z } from 'zod'\nimport { Icon } from '#app/components/icons.tsx'\nimport { AppStarter, AppStopper, PortStopper } from '#app/routes/start.tsx'\nimport { getBaseUrl } from '#app/utils/misc.tsx'\nimport { useRequestInfo } from '#app/utils/request-info.ts'\nimport {\n\tTooltip,\n\tTooltipContent,\n\tTooltipProvider,\n\tTooltipTrigger,\n} from './ui/tooltip.tsx'\n\nconst historyCallDataSchema = z.intersection(\n\tz.object({\n\t\ttype: z.literal('epicshop:history-call'),\n\t}),\n\tz.union([\n\t\tz.object({\n\t\t\tmethod: z.literal('pushState'),\n\t\t\targs: z.union([\n\t\t\t\tz.tuple([z.object({}).passthrough(), z.unknown()]),\n\t\t\t\tz.tuple([z.object({}).passthrough(), z.unknown(), z.string()]),\n\t\t\t]),\n\t\t}),\n\t\tz.object({\n\t\t\tmethod: z.literal('replaceState'),\n\t\t\targs: z.union([\n\t\t\t\tz.tuple([z.object({}).passthrough(), z.unknown()]),\n\t\t\t\tz.tuple([z.object({}).passthrough(), z.unknown(), z.string()]),\n\t\t\t]),\n\t\t}),\n\t\tz.object({\n\t\t\tmethod: z.literal('go'),\n\t\t\targs: z.tuple([z.number().optional()]),\n\t\t}),\n\t\tz.object({ method: z.literal('forward'), args: z.tuple([]) }),\n\t\tz.object({ method: z.literal('back'), args: z.tuple([]) }),\n\t\tz.object({\n\t\t\tmethod: z.literal('popstate'),\n\t\t\tpathname: z.string(),\n\t\t\tdelta: z.number(),\n\t\t}),\n\t]),\n)\n\nconst loadedSchema = z.object({\n\ttype: z.literal('epicshop:loaded'),\n\turl: z.string(),\n})\n\nconst messageSchema = z.union([historyCallDataSchema, loadedSchema])\n\nfunction getNewIndex(prevIndex: number, delta: number, max: number) {\n\t// keep the index bound between 0 and the history length\n\treturn Math.min(Math.max(prevIndex + delta, 0), max)\n}\n\ntype Props = {\n\tid: string\n\tname: string\n\tport: number\n\tportIsAvailable: boolean | null\n\tisRunning: boolean\n\tbaseUrl: string\n\tinitialRoute: string\n}\n\nexport type InBrowserBrowserRef = {\n\thandleExtrnalNavigation: (pathname?: string) => void\n}\n\nexport const InBrowserBrowser = forwardRef<InBrowserBrowserRef, Props>(\n\tInBrowserBrowserImpl,\n)\n\nfunction InBrowserBrowserImpl(\n\t{ name, port, portIsAvailable, isRunning, baseUrl, id, initialRoute }: Props,\n\tref: ForwardedRef<InBrowserBrowserRef>,\n) {\n\tconst requestInfo = useRequestInfo()\n\treturn isRunning ? (\n\t\t<InBrowserBrowserForRealz\n\t\t\tbaseUrl={baseUrl}\n\t\t\tid={id}\n\t\t\tname={name}\n\t\t\tref={ref}\n\t\t\tinitialRoute={initialRoute}\n\t\t/>\n\t) : portIsAvailable === false ? (\n\t\t<div className=\"flex flex-col items-center justify-center\">\n\t\t\t<p className=\"max-w-xs pb-5 text-center\" role=\"status\">\n\t\t\t\t{`The port for this app is unavailable. It could be that you're running it `}\n\t\t\t\t<a\n\t\t\t\t\thref={getBaseUrl({ domain: requestInfo.domain, port })}\n\t\t\t\t\tclassName=\"underline\"\n\t\t\t\t>\n\t\t\t\t\telsewhere\n\t\t\t\t</a>\n\t\t\t\t?\n\t\t\t</p>\n\t\t\t<PortStopper port={port} />\n\t\t</div>\n\t) : (\n\t\t<AppStarter name={name} />\n\t)\n}\ntype RealBrowserProps = {\n\tbaseUrl: string\n\tid: string\n\tname: string\n\tinitialRoute: string\n}\n\nconst InBrowserBrowserForRealz = forwardRef<\n\tInBrowserBrowserRef,\n\tRealBrowserProps\n>(InBrowserBrowserForRealzImpl)\n\n// we're doing this to ensure all of this complex stuff doesn't happen unless\n// the iframe is actually rendered.\nfunction InBrowserBrowserForRealzImpl(\n\t{ baseUrl, id, name, initialRoute }: RealBrowserProps,\n\tref: ForwardedRef<InBrowserBrowserRef>,\n) {\n\tconst [searchParams, setSearchParams] = useSearchParams()\n\tconst searchParamsPathname = searchParams.get('pathname') ?? initialRoute\n\tconst [iframeKeyNumber, setIframeKeyNumber] = useState(0)\n\tconst iframeKey = id + iframeKeyNumber\n\tconst lastDirectionRef = useRef<'forward' | 'back' | 'new'>('new')\n\tconst lastDirectionTimeout = useRef<ReturnType<typeof setTimeout> | null>(\n\t\tnull,\n\t)\n\tconst [iframeContext, setIFrameContext] = useState({\n\t\thistory: [searchParamsPathname],\n\t\tindex: 0,\n\t})\n\tconst [pathnameInputValue, setPathnameInputValue] =\n\t\tuseState(searchParamsPathname)\n\tconst iframeRef = useRef<HTMLIFrameElement>(null)\n\n\tconst appUrl = new URL(searchParamsPathname, baseUrl)\n\tconst currentAppUrl = useRef(appUrl)\n\tuseEffect(() => {\n\t\tcurrentAppUrl.current = appUrl\n\t})\n\n\t/** changing the iframeSrcUrl will trigger a reload of the iframe */\n\tconst [iframeSrcUrl, setIframeSrcUrl] = useState(appUrl)\n\n\tconst currentId = useRef(id)\n\t// if the id changes, then we're going to reload the iframe, but we want to\n\t// make sure to preserve the pathname so we set the src to the current pathname\n\t// this is one of the few side-effects in render that are \"ok\"\n\tif (currentId.current !== id) {\n\t\tcurrentId.current = id\n\t\tsetIframeSrcUrl(currentAppUrl.current)\n\t}\n\tuseEffect(() => {\n\t\tcurrentId.current = id\n\t})\n\n\tuseEffect(() => {\n\t\tfunction handleMessage(messageEvent: MessageEvent) {\n\t\t\tif (messageEvent.source !== iframeRef.current?.contentWindow) return\n\n\t\t\tconst result = messageSchema.safeParse(messageEvent.data, {\n\t\t\t\tpath: ['messageEvent', 'data'],\n\t\t\t})\n\t\t\tif (!result.success) return\n\t\t\tconst { data } = result\n\n\t\t\tif (data.type === 'epicshop:loaded') {\n\t\t\t\tsetIFrameContext((prevContext) => {\n\t\t\t\t\tconst newIndex = (i: number) =>\n\t\t\t\t\t\tgetNewIndex(prevContext.index, i, prevContext.history.length - 1)\n\t\t\t\t\tif (lastDirectionRef.current === 'back') {\n\t\t\t\t\t\treturn { ...prevContext, index: newIndex(-1) }\n\t\t\t\t\t} else if (lastDirectionRef.current === 'forward') {\n\t\t\t\t\t\treturn { ...prevContext, index: newIndex(1) }\n\t\t\t\t\t} else if (lastDirectionRef.current === 'new') {\n\t\t\t\t\t\tconst currentFullPath = prevContext.history[prevContext.index]\n\t\t\t\t\t\tconst newUrl = new URL(data.url)\n\t\t\t\t\t\tconst newFullPath = newUrl.pathname + newUrl.search\n\n\t\t\t\t\t\tif (currentFullPath === newFullPath) return prevContext\n\n\t\t\t\t\t\tconst newHistory = [\n\t\t\t\t\t\t\t...prevContext.history.slice(0, prevContext.index + 1),\n\t\t\t\t\t\t\tnewFullPath,\n\t\t\t\t\t\t]\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\thistory: newHistory,\n\t\t\t\t\t\t\tindex: newHistory.length - 1,\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow new Error('Unexpected lastDirectionRef value')\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst { method } = data\n\t\t\tsetIFrameContext((prevContext) => {\n\t\t\t\tconst newIndex = (i: number) =>\n\t\t\t\t\tgetNewIndex(prevContext.index, i, prevContext.history.length - 1)\n\t\t\t\tconst currentPathname = prevContext.history[prevContext.index]\n\t\t\t\tswitch (method) {\n\t\t\t\t\tcase 'popstate': {\n\t\t\t\t\t\treturn { ...prevContext, index: newIndex(data.delta) }\n\t\t\t\t\t}\n\t\t\t\t\tcase 'forward': {\n\t\t\t\t\t\treturn { ...prevContext, index: newIndex(1) }\n\t\t\t\t\t}\n\t\t\t\t\tcase 'back': {\n\t\t\t\t\t\treturn { ...prevContext, index: newIndex(-1) }\n\t\t\t\t\t}\n\t\t\t\t\tcase 'pushState': {\n\t\t\t\t\t\tconst pathname = data.args[2] ?? currentPathname\n\t\t\t\t\t\tconst newHistory = [\n\t\t\t\t\t\t\t...prevContext.history.slice(0, prevContext.index + 1),\n\t\t\t\t\t\t\tpathname,\n\t\t\t\t\t\t].filter(Boolean)\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t...prevContext,\n\t\t\t\t\t\t\thistory: newHistory,\n\t\t\t\t\t\t\tindex: newHistory.length - 1,\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tcase 'replaceState': {\n\t\t\t\t\t\tconst pathname = data.args[2] ?? currentPathname\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t...prevContext,\n\t\t\t\t\t\t\thistory: [\n\t\t\t\t\t\t\t\t...prevContext.history.slice(0, prevContext.index),\n\t\t\t\t\t\t\t\tpathname,\n\t\t\t\t\t\t\t\t...prevContext.history.slice(prevContext.index + 1),\n\t\t\t\t\t\t\t].filter(Boolean),\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tcase 'go': {\n\t\t\t\t\t\tconst [delta = 0] = data.args\n\t\t\t\t\t\treturn { ...prevContext, index: newIndex(delta) }\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t\twindow.addEventListener('message', handleMessage)\n\t\treturn () => {\n\t\t\twindow.removeEventListener('message', handleMessage)\n\t\t}\n\t}, [])\n\n\t// setSearchParams is unstable\n\t// https://github.com/remix-run/react-router/issues/9991\n\tconst setSearchParamsLatestRef = useRef(setSearchParams)\n\tuseEffect(() => {\n\t\tsetSearchParamsLatestRef.current = setSearchParams\n\t}, [setSearchParams])\n\n\tconst iframePathname = iframeContext.history[iframeContext.index]\n\tuseEffect(() => {\n\t\tif (!iframePathname) return\n\n\t\tsetPathnameInputValue(iframePathname)\n\n\t\tconst newSearchParams = new URLSearchParams(window.location.search)\n\t\tif (iframePathname === '/') {\n\t\t\tnewSearchParams.delete('pathname')\n\t\t} else {\n\t\t\tnewSearchParams.set('pathname', iframePathname)\n\t\t}\n\t\tconst newSearch = newSearchParams.toString()\n\t\tif (`?${newSearch}` !== window.location.search) {\n\t\t\tsetSearchParamsLatestRef.current(newSearchParams, { replace: true })\n\t\t}\n\t}, [iframePathname])\n\n\tconst navigateChild: NavigateFunction = (...params) => {\n\t\tconst to = params[0]\n\t\tif (typeof to === 'number') {\n\t\t\t// this part feels very brittle to me...\n\t\t\tlastDirectionRef.current = to > 0 ? 'forward' : 'back'\n\t\t} else {\n\t\t\tlastDirectionRef.current = 'new'\n\t\t}\n\t\tif (lastDirectionTimeout.current) {\n\t\t\tclearTimeout(lastDirectionTimeout.current)\n\t\t}\n\t\tlastDirectionTimeout.current = setTimeout(() => {\n\t\t\tlastDirectionRef.current = 'new'\n\t\t}, 100)\n\t\tiframeRef.current?.contentWindow?.postMessage(\n\t\t\t{ type: 'epicshop:navigate-call', params },\n\t\t\t'*',\n\t\t)\n\t}\n\n\tfunction handleExtrnalNavigation(\n\t\tnewPathnameInputValue: string = pathnameInputValue,\n\t) {\n\t\tsetPathnameInputValue(newPathnameInputValue)\n\n\t\tconst currentPathname = iframeContext.history[iframeContext.index]\n\t\tnavigateChild(newPathnameInputValue, {\n\t\t\treplace: currentPathname === newPathnameInputValue,\n\t\t})\n\t}\n\n\tuseImperativeHandle(ref, () => ({ handleExtrnalNavigation }))\n\n\tconst atEndOfHistory =\n\t\tiframeContext.index === iframeContext.history.length - 1\n\tconst atStartOfHistory = iframeContext.index <= 0\n\tconst existingSearchParamHiddenInputs: Array<React.ReactElement> = []\n\tfor (const [key, value] of searchParams.entries()) {\n\t\tif (key === 'pathname') continue\n\n\t\texistingSearchParamHiddenInputs.push(\n\t\t\t<input key={key} type=\"hidden\" name={key} value={value} />,\n\t\t)\n\t}\n\n\treturn (\n\t\t<TooltipProvider>\n\t\t\t<div className=\"flex h-full flex-grow flex-col\">\n\t\t\t\t<div className=\"flex items-center justify-between border-b pl-1.5\">\n\t\t\t\t\t<div className=\"mr-2 flex items-center justify-center gap-2 px-1\">\n\t\t\t\t\t\t<Tooltip>\n\t\t\t\t\t\t\t<TooltipTrigger asChild>\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tclassName=\"hidden aspect-square h-full w-full items-center justify-center p-1 transition disabled:opacity-40 sm:flex\"\n\t\t\t\t\t\t\t\t\tdisabled={atStartOfHistory}\n\t\t\t\t\t\t\t\t\tonClick={() => navigateChild(-1)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<Icon name=\"ArrowLeft\" aria-hidden=\"true\" />\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</TooltipTrigger>\n\t\t\t\t\t\t\t<TooltipContent>Go back</TooltipContent>\n\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t<Tooltip>\n\t\t\t\t\t\t\t<TooltipTrigger asChild>\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tclassName=\"hidden aspect-square h-full w-full items-center justify-center p-1 transition disabled:opacity-40 sm:flex\"\n\t\t\t\t\t\t\t\t\tdisabled={atEndOfHistory}\n\t\t\t\t\t\t\t\t\tonClick={() => navigateChild(1)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<Icon name=\"ArrowRight\" aria-hidden=\"true\" />\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</TooltipTrigger>\n\t\t\t\t\t\t\t<TooltipContent>Go forward</TooltipContent>\n\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t<Tooltip>\n\t\t\t\t\t\t\t<TooltipTrigger asChild>\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tclassName=\"flex aspect-square h-full w-full items-center justify-center p-1 transition disabled:opacity-40\"\n\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\tsetIframeSrcUrl(appUrl)\n\t\t\t\t\t\t\t\t\t\tsetIframeKeyNumber(iframeKeyNumber + 1)\n\t\t\t\t\t\t\t\t\t\t// TODO: figure out how we can avoid having to do this...\n\t\t\t\t\t\t\t\t\t\t// I stayed up for hours one night trying and couldn't work out\n\t\t\t\t\t\t\t\t\t\t// why react router wouldn't update the UI when using back/forward\n\t\t\t\t\t\t\t\t\t\t// after a refresh.\n\t\t\t\t\t\t\t\t\t\tsetIFrameContext({\n\t\t\t\t\t\t\t\t\t\t\thistory: [appUrl.pathname],\n\t\t\t\t\t\t\t\t\t\t\tindex: 0,\n\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<Icon name=\"Refresh\" aria-hidden=\"true\" />\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</TooltipTrigger>\n\t\t\t\t\t\t\t<TooltipContent>Refresh</TooltipContent>\n\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t</div>\n\t\t\t\t\t<Form\n\t\t\t\t\t\tmethod=\"get\"\n\t\t\t\t\t\treplace\n\t\t\t\t\t\tclassName=\"flex flex-1 gap-2\"\n\t\t\t\t\t\tonSubmit={() => handleExtrnalNavigation()}\n\t\t\t\t\t>\n\t\t\t\t\t\t{existingSearchParamHiddenInputs}\n\t\t\t\t\t\t<div className=\"flex flex-1 items-center border-x bg-background p-3 leading-none text-foreground\">\n\t\t\t\t\t\t\t<a href={appUrl.toString()} target=\"_blank\" rel=\"noreferrer\">\n\t\t\t\t\t\t\t\t{iframeSrcUrl.host}\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\taria-label=\"pathname\"\n\t\t\t\t\t\t\t\tclassName=\"w-full flex-1 bg-background focus-visible:outline-none\"\n\t\t\t\t\t\t\t\tvalue={pathnameInputValue}\n\t\t\t\t\t\t\t\tname=\"pathname\"\n\t\t\t\t\t\t\t\tonChange={(e) => setPathnameInputValue(e.currentTarget.value)}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t{/* TODO: Reconsider if this is needed as browsers don't usually have a submit button in address bar */}\n\t\t\t\t\t\t{/* <button type=\"submit\">Go</button> */}\n\t\t\t\t\t</Form>\n\t\t\t\t\t<AppStopper name={name} />\n\t\t\t\t\t<Tooltip>\n\t\t\t\t\t\t<TooltipTrigger asChild>\n\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\thref={appUrl.toString()}\n\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\trel=\"noreferrer\"\n\t\t\t\t\t\t\t\tclassName={clsx(\n\t\t\t\t\t\t\t\t\t'flex aspect-square items-center justify-center px-3.5',\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Icon name=\"ExternalLink\" />\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t</TooltipTrigger>\n\t\t\t\t\t\t<TooltipContent>Open in new tab</TooltipContent>\n\t\t\t\t\t</Tooltip>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"flex h-full w-full flex-grow dark:bg-white\">\n\t\t\t\t\t<iframe\n\t\t\t\t\t\ttitle={name}\n\t\t\t\t\t\tkey={iframeKey}\n\t\t\t\t\t\tref={iframeRef}\n\t\t\t\t\t\tsrc={iframeSrcUrl.toString()}\n\t\t\t\t\t\tclassName=\"h-full w-full flex-grow bg-white\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</TooltipProvider>\n\t)\n}\n","import { type BaseExerciseStepApp } from '@epic-web/workshop-utils/apps.server'\nimport { useState } from 'react'\nimport { Icon } from '#app/components/icons'\nimport {\n\tInBrowserBrowser,\n\ttype InBrowserBrowserRef,\n} from '#app/components/in-browser-browser'\nimport { Loading } from '#app/components/loading.js'\nimport { useTheme } from '#app/routes/theme/index.js'\nimport { cn, getBaseUrl } from '#app/utils/misc'\nimport { useRequestInfo } from '#app/utils/request-info'\n\nexport function Preview({\n\tid,\n\tappInfo,\n\tinBrowserBrowserRef,\n}: {\n\tid?: string\n\tappInfo: {\n\t\tisRunning: boolean\n\t\tappName?: string\n\t\tname: string\n\t\ttitle: string\n\t\tportIsAvailable: boolean | null\n\t\ttype: string\n\t\tfullPath: string\n\t\tdev: BaseExerciseStepApp['dev']\n\t\ttest: BaseExerciseStepApp['test']\n\t\tstackBlitzUrl: BaseExerciseStepApp['stackBlitzUrl']\n\t} | null\n\tinBrowserBrowserRef: React.RefObject<InBrowserBrowserRef | null>\n}) {\n\tconst requestInfo = useRequestInfo()\n\tconst theme = useTheme()\n\tif (!appInfo) return <p>No app here. Sorry.</p>\n\tconst { isRunning, dev, name, portIsAvailable, title } = appInfo\n\n\tif (ENV.EPICSHOP_DEPLOYED && appInfo.stackBlitzUrl) {\n\t\tconst url = new URL(appInfo.stackBlitzUrl)\n\t\turl.searchParams.set('embed', '1')\n\t\turl.searchParams.set('theme', theme)\n\n\t\treturn (\n\t\t\t<StackBlitzEmbed\n\t\t\t\ttitle={title}\n\t\t\t\turl={url.toString()}\n\t\t\t\tloadingContent={\n\t\t\t\t\t<Loading>\n\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\tLoading{' '}\n\t\t\t\t\t\t\t<a className=\"underline\" href={appInfo.stackBlitzUrl}>\n\t\t\t\t\t\t\t\t\"{title}\"\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</Loading>\n\t\t\t\t}\n\t\t\t/>\n\t\t)\n\t}\n\n\tif (dev.type === 'script') {\n\t\tconst baseUrl = getBaseUrl({\n\t\t\tdomain: requestInfo.domain,\n\t\t\tport: dev.portNumber,\n\t\t})\n\t\treturn (\n\t\t\t<InBrowserBrowser\n\t\t\t\tref={inBrowserBrowserRef}\n\t\t\t\tisRunning={isRunning}\n\t\t\t\tid={id ?? name}\n\t\t\t\tname={name}\n\t\t\t\tportIsAvailable={portIsAvailable}\n\t\t\t\tport={dev.portNumber}\n\t\t\t\tbaseUrl={baseUrl}\n\t\t\t\tinitialRoute={dev.initialRoute}\n\t\t\t/>\n\t\t)\n\t} else if (dev.type === 'browser') {\n\t\treturn (\n\t\t\t<div className=\"relative h-full flex-grow overflow-y-auto scrollbar-thin scrollbar-thumb-scrollbar\">\n\t\t\t\t<a\n\t\t\t\t\thref={dev.pathname}\n\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\trel=\"noreferrer\"\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t'absolute bottom-5 right-5 flex items-center justify-center rounded-full bg-gray-100 p-2.5 transition hover:bg-gray-200 dark:bg-gray-800 hover:dark:bg-gray-600',\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<Icon name=\"ExternalLink\" aria-hidden=\"true\" />\n\t\t\t\t\t<span className=\"sr-only\">Open in New Window</span>\n\t\t\t\t</a>\n\t\t\t\t<iframe\n\t\t\t\t\ttitle={title}\n\t\t\t\t\tsrc={dev.pathname}\n\t\t\t\t\tclassName=\"h-full w-full flex-grow bg-white\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t)\n\t} else {\n\t\treturn (\n\t\t\t<div className=\"flex h-full items-center justify-center text-lg\">\n\t\t\t\t<p>\n\t\t\t\t\tPreview for dev type of <code>{dev.type}</code> not supported.\n\t\t\t\t</p>\n\t\t\t</div>\n\t\t)\n\t}\n}\n\nexport function StackBlitzEmbed({\n\turl,\n\ttitle,\n\tloadingContent,\n}: {\n\turl: string\n\ttitle?: string\n\tloadingContent: React.ReactNode\n}) {\n\tconst [iframeLoaded, setIframeLoaded] = useState(false)\n\n\treturn (\n\t\t<div className=\"h-full w-full flex-grow\">\n\t\t\t{iframeLoaded ? null : (\n\t\t\t\t<div className=\"absolute inset-0 z-10 flex items-center justify-center\">\n\t\t\t\t\t{loadingContent}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t<iframe\n\t\t\t\tonLoad={() => setIframeLoaded(true)}\n\t\t\t\t// show what would have shown if there is an error\n\t\t\t\tonError={() => setIframeLoaded(true)}\n\t\t\t\tsrc={url}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'h-full w-full flex-grow transition-opacity duration-300',\n\t\t\t\t\tiframeLoaded ? 'opacity-100' : 'opacity-0',\n\t\t\t\t)}\n\t\t\t\ttitle={title}\n\t\t\t\tsandbox=\"allow-forms allow-scripts allow-same-origin allow-popups allow-popups-to-escape-sandbox\"\n\t\t\t/>\n\t\t</div>\n\t)\n}\n"],"names":["AppStopper","name","fetcher","useFetcher","peRedirectInput","usePERedirectInput","inFlightIntent","formData","get","inFlightState","altDown","useAltDown","Form","method","action","children","showProgressBarField","type","value","jsx","className","PortStopper","port","Button","varient","state","AppStarter","data","status","error","Loading","historyCallDataSchema","z","loadedSchema","messageSchema","getNewIndex","prevIndex","delta","max","InBrowserBrowser","forwardRef","InBrowserBrowserImpl","portIsAvailable","isRunning","baseUrl","id","initialRoute","ref","requestInfo","useRequestInfo","InBrowserBrowserForRealz","jsxs","getBaseUrl","InBrowserBrowserForRealzImpl","searchParams","setSearchParams","useSearchParams","searchParamsPathname","iframeKeyNumber","setIframeKeyNumber","useState","iframeKey","lastDirectionRef","useRef","lastDirectionTimeout","iframeContext","setIFrameContext","pathnameInputValue","setPathnameInputValue","iframeRef","appUrl","currentAppUrl","useEffect","iframeSrcUrl","setIframeSrcUrl","currentId","handleMessage","messageEvent","_a","result","prevContext","newIndex","i","currentFullPath","newUrl","newFullPath","newHistory","currentPathname","pathname","setSearchParamsLatestRef","iframePathname","newSearchParams","navigateChild","params","to","_b","handleExtrnalNavigation","newPathnameInputValue","useImperativeHandle","atEndOfHistory","atStartOfHistory","existingSearchParamHiddenInputs","key","TooltipProvider","Tooltip","TooltipTrigger","Icon","TooltipContent","e","clsx","Preview","appInfo","inBrowserBrowserRef","theme","useTheme","dev","title","url","StackBlitzEmbed","cn","loadingContent","iframeLoaded","setIframeLoaded"],"mappings":"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"}
@@ -10099,12 +10099,13 @@ function InBrowserBrowserForRealzImpl({ baseUrl, id, name, initialRoute }, ref)
10099
10099
  } else if (lastDirectionRef.current === "forward") {
10100
10100
  return { ...prevContext, index: newIndex(1) };
10101
10101
  } else if (lastDirectionRef.current === "new") {
10102
- const currentPathname = prevContext.history[prevContext.index];
10103
- const newPathname = new URL(data.url).pathname;
10104
- if (currentPathname === newPathname) return prevContext;
10102
+ const currentFullPath = prevContext.history[prevContext.index];
10103
+ const newUrl = new URL(data.url);
10104
+ const newFullPath = newUrl.pathname + newUrl.search;
10105
+ if (currentFullPath === newFullPath) return prevContext;
10105
10106
  const newHistory = [
10106
10107
  ...prevContext.history.slice(0, prevContext.index + 1),
10107
- newPathname
10108
+ newFullPath
10108
10109
  ];
10109
10110
  return {
10110
10111
  history: newHistory,
@@ -13658,7 +13659,7 @@ const route39 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePrope
13658
13659
  __proto__: null,
13659
13660
  loader
13660
13661
  }, Symbol.toStringTag, { value: "Module" }));
13661
- const serverManifest = { "entry": { "module": "/assets/entry.client-3M2p-8I3.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js"], "css": [] }, "routes": { "root": { "id": "root", "parentId": void 0, "path": "", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/root-CbC_P7jJ.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-Txs7O6JX.js", "/assets/request-info-CEhUGODY.js", "/assets/tooltip-DTFU8ajx.js", "/assets/pe-CUZaIcdt.js", "/assets/error-boundary-CqgVAFiu.js", "/assets/progress-bar-bUuKn1Q8.js", "/assets/index-B-hHvmeV.js", "/assets/index-DlJAkutV.js", "/assets/presence-Cr--lRCr.js", "/assets/seo-pBpFCWsy.js"], "css": [] }, "routes/$": { "id": "routes/$", "parentId": "root", "path": "*", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/_-C82olNpL.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-Txs7O6JX.js", "/assets/error-boundary-CqgVAFiu.js"], "css": [] }, "routes/_app+/_layout": { "id": "routes/_app+/_layout", "parentId": "root", "path": void 0, "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_layout-DkGEbcMk.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-Txs7O6JX.js", "/assets/request-info-CEhUGODY.js", "/assets/tooltip-DTFU8ajx.js", "/assets/pe-CUZaIcdt.js", "/assets/index-DlJAkutV.js", "/assets/workshop-config-CL4F08kr.js", "/assets/product-f8Gd2MQ6.js", "/assets/index-j_VpxCZh.js", "/assets/user-DvujSs-t.js", "/assets/presence-Cr--lRCr.js", "/assets/progress-C7kc6YXZ.js"], "css": [] }, "routes/_app+/account": { "id": "routes/_app+/account", "parentId": "routes/_app+/_layout", "path": "account", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/account-D1DCJCnR.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-Txs7O6JX.js", "/assets/request-info-CEhUGODY.js", "/assets/button-CQ6cnotS.js", "/assets/tooltip-DTFU8ajx.js", "/assets/user-DvujSs-t.js", "/assets/presence-Cr--lRCr.js"], "css": [] }, "routes/_app+/app.$appName+/$": { "id": "routes/_app+/app.$appName+/$", "parentId": "routes/_app+/_layout", "path": "app/:appName/*", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/app.$appName+/api.$": { "id": "routes/_app+/app.$appName+/api.$", "parentId": "routes/_app+/_layout", "path": "app/:appName/api/*", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/api._-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/app.$appName+/epic_ws[.js]": { "id": "routes/_app+/app.$appName+/epic_ws[.js]", "parentId": "routes/_app+/_layout", "path": "app/:appName/epic_ws.js", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/epic_ws_.js_-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/app.$appName+/index": { "id": "routes/_app+/app.$appName+/index", "parentId": "routes/_app+/_layout", "path": "app/:appName/", "index": true, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/index-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/app.$appName+/test.$testName": { "id": "routes/_app+/app.$appName+/test.$testName", "parentId": "routes/_app+/_layout", "path": "app/:appName/test/:testName", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/test._testName-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/app.$appName+/test.epic_ws[.js]": { "id": "routes/_app+/app.$appName+/test.epic_ws[.js]", "parentId": "routes/_app+/_layout", "path": "app/:appName/test/epic_ws.js", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/test.epic_ws_.js_-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/discord": { "id": "routes/_app+/discord", "parentId": "routes/_app+/_layout", "path": "discord", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/discord-BBRM_H3g.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-Txs7O6JX.js", "/assets/user-DvujSs-t.js", "/assets/discord-CgdmSzxV.js"], "css": [] }, "routes/_app+/exercise+/_layout": { "id": "routes/_app+/exercise+/_layout", "parentId": "routes/_app+/_layout", "path": "exercise", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_layout-BUs3av-e.js", "imports": ["/assets/index-1cKOJFpX.js"], "css": [] }, "routes/_app+/exercise+/$exerciseNumber": { "id": "routes/_app+/exercise+/$exerciseNumber", "parentId": "routes/_app+/exercise+/_layout", "path": ":exerciseNumber", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/_exerciseNumber-DeMmiDU5.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-Txs7O6JX.js", "/assets/request-info-CEhUGODY.js", "/assets/tooltip-DTFU8ajx.js", "/assets/pe-CUZaIcdt.js", "/assets/index-DlJAkutV.js", "/assets/loading-CF7oQHQf.js", "/assets/user-DvujSs-t.js", "/assets/workshop-config-CL4F08kr.js", "/assets/epic-video-BFcdejfC.js", "/assets/progress-bar-bUuKn1Q8.js", "/assets/index-Dx5GmdYq.js", "/assets/mdx-DvqHp8UI.js", "/assets/progress-C7kc6YXZ.js", "/assets/seo-pBpFCWsy.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/exercise+/$exerciseNumber_.$stepNumber": { "id": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber", "parentId": "routes/_app+/exercise+/_layout", "path": ":exerciseNumber/:stepNumber", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/_exerciseNumber_._stepNumber-qCtEMlS2.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-Txs7O6JX.js"], "css": [] }, "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout": { "id": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout", "parentId": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber", "path": ":type", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/_layout-5idP3Bqx.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-Txs7O6JX.js", "/assets/request-info-CEhUGODY.js", "/assets/tooltip-DTFU8ajx.js", "/assets/pe-CUZaIcdt.js", "/assets/index-DlJAkutV.js", "/assets/loading-CF7oQHQf.js", "/assets/user-DvujSs-t.js", "/assets/workshop-config-CL4F08kr.js", "/assets/epic-video-BFcdejfC.js", "/assets/progress-bar-bUuKn1Q8.js", "/assets/index-j_VpxCZh.js", "/assets/index-9dWszLxO.js", "/assets/index-Dx5GmdYq.js", "/assets/error-boundary-CqgVAFiu.js", "/assets/nav-chevrons-Cbc1bd_j.js", "/assets/mdx-DvqHp8UI.js", "/assets/progress-C7kc6YXZ.js", "/assets/set-playground-Cr0qL9N9.js", "/assets/seo-pBpFCWsy.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/app": { "id": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/app", "parentId": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout", "path": "app", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/app-C-oFaj2l.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-Txs7O6JX.js", "/assets/request-info-CEhUGODY.js", "/assets/tooltip-DTFU8ajx.js", "/assets/pe-CUZaIcdt.js", "/assets/index-DlJAkutV.js", "/assets/button-CQ6cnotS.js", "/assets/loading-CF7oQHQf.js", "/assets/progress-bar-bUuKn1Q8.js", "/assets/preview-WJ-QYhx8.js"], "css": [] }, "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/index": { "id": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/index", "parentId": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout", "path": void 0, "index": true, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/index-CsPok4Mn.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-Txs7O6JX.js", "/assets/tooltip-DTFU8ajx.js", "/assets/index-j_VpxCZh.js", "/assets/index-9dWszLxO.js", "/assets/request-info-CEhUGODY.js", "/assets/pe-CUZaIcdt.js", "/assets/index-DlJAkutV.js", "/assets/loading-CF7oQHQf.js", "/assets/user-DvujSs-t.js", "/assets/workshop-config-CL4F08kr.js", "/assets/epic-video-BFcdejfC.js", "/assets/progress-bar-bUuKn1Q8.js", "/assets/accordion-CKwXYK9L.js", "/assets/mdx-DvqHp8UI.js", "/assets/use-event-source-A_0lEOPX.js", "/assets/set-playground-Cr0qL9N9.js", "/assets/button-CQ6cnotS.js", "/assets/diff-hoOood-9.js", "/assets/error-boundary-CqgVAFiu.js", "/assets/discord-CgdmSzxV.js", "/assets/index-B-hHvmeV.js", "/assets/tests-DmimqC1q.js", "/assets/preview-WJ-QYhx8.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/test": { "id": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/test", "parentId": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout", "path": "test", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/test-Cy-fo6gv.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-Txs7O6JX.js", "/assets/request-info-CEhUGODY.js", "/assets/tooltip-DTFU8ajx.js", "/assets/pe-CUZaIcdt.js", "/assets/index-DlJAkutV.js", "/assets/loading-CF7oQHQf.js", "/assets/user-DvujSs-t.js", "/assets/workshop-config-CL4F08kr.js", "/assets/index-j_VpxCZh.js", "/assets/index-9dWszLxO.js", "/assets/progress-bar-bUuKn1Q8.js", "/assets/epic-video-BFcdejfC.js", "/assets/accordion-CKwXYK9L.js", "/assets/use-event-source-A_0lEOPX.js", "/assets/set-playground-Cr0qL9N9.js", "/assets/tests-DmimqC1q.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.index": { "id": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.index", "parentId": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber", "path": void 0, "index": true, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_exerciseNumber_._stepNumber.index-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/exercise+/$exerciseNumber_.finished": { "id": "routes/_app+/exercise+/$exerciseNumber_.finished", "parentId": "routes/_app+/exercise+/_layout", "path": ":exerciseNumber/finished", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_exerciseNumber_.finished-DM5HZX6r.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-Txs7O6JX.js", "/assets/request-info-CEhUGODY.js", "/assets/tooltip-DTFU8ajx.js", "/assets/pe-CUZaIcdt.js", "/assets/index-DlJAkutV.js", "/assets/loading-CF7oQHQf.js", "/assets/user-DvujSs-t.js", "/assets/workshop-config-CL4F08kr.js", "/assets/epic-video-BFcdejfC.js", "/assets/progress-bar-bUuKn1Q8.js", "/assets/index-Dx5GmdYq.js", "/assets/nav-chevrons-Cbc1bd_j.js", "/assets/mdx-DvqHp8UI.js", "/assets/progress-C7kc6YXZ.js", "/assets/seo-pBpFCWsy.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/finished": { "id": "routes/_app+/finished", "parentId": "routes/_app+/_layout", "path": "finished", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/finished-C_v7hO19.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-Txs7O6JX.js", "/assets/request-info-CEhUGODY.js", "/assets/tooltip-DTFU8ajx.js", "/assets/pe-CUZaIcdt.js", "/assets/index-DlJAkutV.js", "/assets/loading-CF7oQHQf.js", "/assets/user-DvujSs-t.js", "/assets/workshop-config-CL4F08kr.js", "/assets/epic-video-BFcdejfC.js", "/assets/progress-bar-bUuKn1Q8.js", "/assets/index-Dx5GmdYq.js", "/assets/nav-chevrons-Cbc1bd_j.js", "/assets/mdx-DvqHp8UI.js", "/assets/seo-pBpFCWsy.js", "/assets/progress-C7kc6YXZ.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/index": { "id": "routes/_app+/index", "parentId": "routes/_app+/_layout", "path": void 0, "index": true, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/index-BHeB-0xq.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-Txs7O6JX.js", "/assets/request-info-CEhUGODY.js", "/assets/tooltip-DTFU8ajx.js", "/assets/pe-CUZaIcdt.js", "/assets/index-DlJAkutV.js", "/assets/loading-CF7oQHQf.js", "/assets/user-DvujSs-t.js", "/assets/workshop-config-CL4F08kr.js", "/assets/epic-video-BFcdejfC.js", "/assets/progress-bar-bUuKn1Q8.js", "/assets/index-Dx5GmdYq.js", "/assets/error-boundary-CqgVAFiu.js", "/assets/mdx-DvqHp8UI.js", "/assets/progress-C7kc6YXZ.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/login": { "id": "routes/_app+/login", "parentId": "routes/_app+/_layout", "path": "login", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/login-Ca9EDpZj.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-Txs7O6JX.js", "/assets/request-info-CEhUGODY.js", "/assets/tooltip-DTFU8ajx.js", "/assets/pe-CUZaIcdt.js", "/assets/index-DlJAkutV.js", "/assets/workshop-config-CL4F08kr.js", "/assets/use-event-source-A_0lEOPX.js", "/assets/button-CQ6cnotS.js", "/assets/loading-CF7oQHQf.js", "/assets/product-f8Gd2MQ6.js"], "css": [] }, "routes/_app+/support": { "id": "routes/_app+/support", "parentId": "routes/_app+/_layout", "path": "support", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/support-hcqGIpir.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js"], "css": [] }, "routes/admin+/_layout": { "id": "routes/admin+/_layout", "parentId": "root", "path": "admin", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_layout-DATuycts.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-Txs7O6JX.js", "/assets/pe-CUZaIcdt.js", "/assets/tooltip-DTFU8ajx.js", "/assets/progress-C7kc6YXZ.js"], "css": [] }, "routes/admin+/apps": { "id": "routes/admin+/apps", "parentId": "routes/admin+/_layout", "path": "apps", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/apps-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/admin+/cache": { "id": "routes/admin+/cache", "parentId": "routes/admin+/_layout", "path": "cache", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/cache-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/apps": { "id": "routes/apps", "parentId": "root", "path": "apps", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/apps-DP2rzg_V.js", "imports": [], "css": [] }, "routes/diff": { "id": "routes/diff", "parentId": "root", "path": "diff", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/diff-CU8At1c4.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-Txs7O6JX.js", "/assets/tooltip-DTFU8ajx.js", "/assets/index-j_VpxCZh.js", "/assets/index-9dWszLxO.js", "/assets/request-info-CEhUGODY.js", "/assets/pe-CUZaIcdt.js", "/assets/index-DlJAkutV.js", "/assets/loading-CF7oQHQf.js", "/assets/user-DvujSs-t.js", "/assets/workshop-config-CL4F08kr.js", "/assets/epic-video-BFcdejfC.js", "/assets/progress-bar-bUuKn1Q8.js", "/assets/accordion-CKwXYK9L.js", "/assets/mdx-DvqHp8UI.js", "/assets/diff-hoOood-9.js", "/assets/nav-chevrons-Cbc1bd_j.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/discord.callback": { "id": "routes/discord.callback", "parentId": "root", "path": "discord/callback", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/discord.callback-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/exercises": { "id": "routes/exercises", "parentId": "root", "path": "exercises", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/exercises-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/launch-editor": { "id": "routes/launch-editor", "parentId": "root", "path": "launch-editor", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/launch-editor-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/login-sse": { "id": "routes/login-sse", "parentId": "root", "path": "login-sse", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/login-sse-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/og": { "id": "routes/og", "parentId": "root", "path": "og", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/og-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/onboarding": { "id": "routes/onboarding", "parentId": "root", "path": "onboarding", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/onboarding-Dc2TmI9y.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-Txs7O6JX.js", "/assets/request-info-CEhUGODY.js", "/assets/tooltip-DTFU8ajx.js", "/assets/pe-CUZaIcdt.js", "/assets/index-DlJAkutV.js", "/assets/loading-CF7oQHQf.js", "/assets/user-DvujSs-t.js", "/assets/workshop-config-CL4F08kr.js", "/assets/button-CQ6cnotS.js", "/assets/epic-video-BFcdejfC.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/processes": { "id": "routes/processes", "parentId": "root", "path": "processes", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/processes-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/progress": { "id": "routes/progress", "parentId": "root", "path": "progress", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/progress-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/robots[.]txt": { "id": "routes/robots[.]txt", "parentId": "root", "path": "robots.txt", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/robots_._txt-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/set-playground": { "id": "routes/set-playground", "parentId": "root", "path": "set-playground", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/set-playground-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/sitemap[.]xml": { "id": "routes/sitemap[.]xml", "parentId": "root", "path": "sitemap.xml", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/sitemap_._xml-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/start": { "id": "routes/start", "parentId": "root", "path": "start", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/start-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/test": { "id": "routes/test", "parentId": "root", "path": "test", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/test-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/theme/index": { "id": "routes/theme/index", "parentId": "root", "path": "theme", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/index-DP2rzg_V.js", "imports": [], "css": [] }, "routes/update-mdx-cache": { "id": "routes/update-mdx-cache", "parentId": "root", "path": "update-mdx-cache", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/update-mdx-cache-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/video-player/index": { "id": "routes/video-player/index", "parentId": "root", "path": "video-player", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/index-K6Dvbx-E.js", "imports": [], "css": [] } }, "url": "/assets/manifest-fc42775e.js", "version": "fc42775e" };
13662
+ const serverManifest = { "entry": { "module": "/assets/entry.client-3M2p-8I3.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js"], "css": [] }, "routes": { "root": { "id": "root", "parentId": void 0, "path": "", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/root-CbC_P7jJ.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-Txs7O6JX.js", "/assets/request-info-CEhUGODY.js", "/assets/tooltip-DTFU8ajx.js", "/assets/pe-CUZaIcdt.js", "/assets/error-boundary-CqgVAFiu.js", "/assets/progress-bar-bUuKn1Q8.js", "/assets/index-B-hHvmeV.js", "/assets/index-DlJAkutV.js", "/assets/presence-Cr--lRCr.js", "/assets/seo-pBpFCWsy.js"], "css": [] }, "routes/$": { "id": "routes/$", "parentId": "root", "path": "*", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/_-C82olNpL.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-Txs7O6JX.js", "/assets/error-boundary-CqgVAFiu.js"], "css": [] }, "routes/_app+/_layout": { "id": "routes/_app+/_layout", "parentId": "root", "path": void 0, "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_layout-DkGEbcMk.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-Txs7O6JX.js", "/assets/request-info-CEhUGODY.js", "/assets/tooltip-DTFU8ajx.js", "/assets/pe-CUZaIcdt.js", "/assets/index-DlJAkutV.js", "/assets/workshop-config-CL4F08kr.js", "/assets/product-f8Gd2MQ6.js", "/assets/index-j_VpxCZh.js", "/assets/user-DvujSs-t.js", "/assets/presence-Cr--lRCr.js", "/assets/progress-C7kc6YXZ.js"], "css": [] }, "routes/_app+/account": { "id": "routes/_app+/account", "parentId": "routes/_app+/_layout", "path": "account", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/account-D1DCJCnR.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-Txs7O6JX.js", "/assets/request-info-CEhUGODY.js", "/assets/button-CQ6cnotS.js", "/assets/tooltip-DTFU8ajx.js", "/assets/user-DvujSs-t.js", "/assets/presence-Cr--lRCr.js"], "css": [] }, "routes/_app+/app.$appName+/$": { "id": "routes/_app+/app.$appName+/$", "parentId": "routes/_app+/_layout", "path": "app/:appName/*", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/app.$appName+/api.$": { "id": "routes/_app+/app.$appName+/api.$", "parentId": "routes/_app+/_layout", "path": "app/:appName/api/*", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/api._-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/app.$appName+/epic_ws[.js]": { "id": "routes/_app+/app.$appName+/epic_ws[.js]", "parentId": "routes/_app+/_layout", "path": "app/:appName/epic_ws.js", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/epic_ws_.js_-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/app.$appName+/index": { "id": "routes/_app+/app.$appName+/index", "parentId": "routes/_app+/_layout", "path": "app/:appName/", "index": true, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/index-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/app.$appName+/test.$testName": { "id": "routes/_app+/app.$appName+/test.$testName", "parentId": "routes/_app+/_layout", "path": "app/:appName/test/:testName", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/test._testName-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/app.$appName+/test.epic_ws[.js]": { "id": "routes/_app+/app.$appName+/test.epic_ws[.js]", "parentId": "routes/_app+/_layout", "path": "app/:appName/test/epic_ws.js", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/test.epic_ws_.js_-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/discord": { "id": "routes/_app+/discord", "parentId": "routes/_app+/_layout", "path": "discord", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/discord-BBRM_H3g.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-Txs7O6JX.js", "/assets/user-DvujSs-t.js", "/assets/discord-CgdmSzxV.js"], "css": [] }, "routes/_app+/exercise+/_layout": { "id": "routes/_app+/exercise+/_layout", "parentId": "routes/_app+/_layout", "path": "exercise", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_layout-BUs3av-e.js", "imports": ["/assets/index-1cKOJFpX.js"], "css": [] }, "routes/_app+/exercise+/$exerciseNumber": { "id": "routes/_app+/exercise+/$exerciseNumber", "parentId": "routes/_app+/exercise+/_layout", "path": ":exerciseNumber", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/_exerciseNumber-DeMmiDU5.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-Txs7O6JX.js", "/assets/request-info-CEhUGODY.js", "/assets/tooltip-DTFU8ajx.js", "/assets/pe-CUZaIcdt.js", "/assets/index-DlJAkutV.js", "/assets/loading-CF7oQHQf.js", "/assets/user-DvujSs-t.js", "/assets/workshop-config-CL4F08kr.js", "/assets/epic-video-BFcdejfC.js", "/assets/progress-bar-bUuKn1Q8.js", "/assets/index-Dx5GmdYq.js", "/assets/mdx-DvqHp8UI.js", "/assets/progress-C7kc6YXZ.js", "/assets/seo-pBpFCWsy.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/exercise+/$exerciseNumber_.$stepNumber": { "id": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber", "parentId": "routes/_app+/exercise+/_layout", "path": ":exerciseNumber/:stepNumber", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/_exerciseNumber_._stepNumber-qCtEMlS2.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-Txs7O6JX.js"], "css": [] }, "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout": { "id": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout", "parentId": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber", "path": ":type", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/_layout-5idP3Bqx.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-Txs7O6JX.js", "/assets/request-info-CEhUGODY.js", "/assets/tooltip-DTFU8ajx.js", "/assets/pe-CUZaIcdt.js", "/assets/index-DlJAkutV.js", "/assets/loading-CF7oQHQf.js", "/assets/user-DvujSs-t.js", "/assets/workshop-config-CL4F08kr.js", "/assets/epic-video-BFcdejfC.js", "/assets/progress-bar-bUuKn1Q8.js", "/assets/index-j_VpxCZh.js", "/assets/index-9dWszLxO.js", "/assets/index-Dx5GmdYq.js", "/assets/error-boundary-CqgVAFiu.js", "/assets/nav-chevrons-Cbc1bd_j.js", "/assets/mdx-DvqHp8UI.js", "/assets/progress-C7kc6YXZ.js", "/assets/set-playground-Cr0qL9N9.js", "/assets/seo-pBpFCWsy.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/app": { "id": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/app", "parentId": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout", "path": "app", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/app-B6_qsli7.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-Txs7O6JX.js", "/assets/request-info-CEhUGODY.js", "/assets/tooltip-DTFU8ajx.js", "/assets/pe-CUZaIcdt.js", "/assets/index-DlJAkutV.js", "/assets/button-CQ6cnotS.js", "/assets/loading-CF7oQHQf.js", "/assets/progress-bar-bUuKn1Q8.js", "/assets/preview-CWCIw-lc.js"], "css": [] }, "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/index": { "id": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/index", "parentId": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout", "path": void 0, "index": true, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/index-CoqhTiwT.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-Txs7O6JX.js", "/assets/tooltip-DTFU8ajx.js", "/assets/index-j_VpxCZh.js", "/assets/index-9dWszLxO.js", "/assets/request-info-CEhUGODY.js", "/assets/pe-CUZaIcdt.js", "/assets/index-DlJAkutV.js", "/assets/loading-CF7oQHQf.js", "/assets/user-DvujSs-t.js", "/assets/workshop-config-CL4F08kr.js", "/assets/epic-video-BFcdejfC.js", "/assets/progress-bar-bUuKn1Q8.js", "/assets/accordion-CKwXYK9L.js", "/assets/mdx-DvqHp8UI.js", "/assets/use-event-source-A_0lEOPX.js", "/assets/set-playground-Cr0qL9N9.js", "/assets/button-CQ6cnotS.js", "/assets/diff-hoOood-9.js", "/assets/error-boundary-CqgVAFiu.js", "/assets/discord-CgdmSzxV.js", "/assets/index-B-hHvmeV.js", "/assets/tests-DmimqC1q.js", "/assets/preview-CWCIw-lc.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/test": { "id": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/test", "parentId": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout", "path": "test", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/test-Cy-fo6gv.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-Txs7O6JX.js", "/assets/request-info-CEhUGODY.js", "/assets/tooltip-DTFU8ajx.js", "/assets/pe-CUZaIcdt.js", "/assets/index-DlJAkutV.js", "/assets/loading-CF7oQHQf.js", "/assets/user-DvujSs-t.js", "/assets/workshop-config-CL4F08kr.js", "/assets/index-j_VpxCZh.js", "/assets/index-9dWszLxO.js", "/assets/progress-bar-bUuKn1Q8.js", "/assets/epic-video-BFcdejfC.js", "/assets/accordion-CKwXYK9L.js", "/assets/use-event-source-A_0lEOPX.js", "/assets/set-playground-Cr0qL9N9.js", "/assets/tests-DmimqC1q.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.index": { "id": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.index", "parentId": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber", "path": void 0, "index": true, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_exerciseNumber_._stepNumber.index-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/exercise+/$exerciseNumber_.finished": { "id": "routes/_app+/exercise+/$exerciseNumber_.finished", "parentId": "routes/_app+/exercise+/_layout", "path": ":exerciseNumber/finished", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_exerciseNumber_.finished-DM5HZX6r.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-Txs7O6JX.js", "/assets/request-info-CEhUGODY.js", "/assets/tooltip-DTFU8ajx.js", "/assets/pe-CUZaIcdt.js", "/assets/index-DlJAkutV.js", "/assets/loading-CF7oQHQf.js", "/assets/user-DvujSs-t.js", "/assets/workshop-config-CL4F08kr.js", "/assets/epic-video-BFcdejfC.js", "/assets/progress-bar-bUuKn1Q8.js", "/assets/index-Dx5GmdYq.js", "/assets/nav-chevrons-Cbc1bd_j.js", "/assets/mdx-DvqHp8UI.js", "/assets/progress-C7kc6YXZ.js", "/assets/seo-pBpFCWsy.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/finished": { "id": "routes/_app+/finished", "parentId": "routes/_app+/_layout", "path": "finished", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/finished-C_v7hO19.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-Txs7O6JX.js", "/assets/request-info-CEhUGODY.js", "/assets/tooltip-DTFU8ajx.js", "/assets/pe-CUZaIcdt.js", "/assets/index-DlJAkutV.js", "/assets/loading-CF7oQHQf.js", "/assets/user-DvujSs-t.js", "/assets/workshop-config-CL4F08kr.js", "/assets/epic-video-BFcdejfC.js", "/assets/progress-bar-bUuKn1Q8.js", "/assets/index-Dx5GmdYq.js", "/assets/nav-chevrons-Cbc1bd_j.js", "/assets/mdx-DvqHp8UI.js", "/assets/seo-pBpFCWsy.js", "/assets/progress-C7kc6YXZ.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/index": { "id": "routes/_app+/index", "parentId": "routes/_app+/_layout", "path": void 0, "index": true, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/index-BHeB-0xq.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-Txs7O6JX.js", "/assets/request-info-CEhUGODY.js", "/assets/tooltip-DTFU8ajx.js", "/assets/pe-CUZaIcdt.js", "/assets/index-DlJAkutV.js", "/assets/loading-CF7oQHQf.js", "/assets/user-DvujSs-t.js", "/assets/workshop-config-CL4F08kr.js", "/assets/epic-video-BFcdejfC.js", "/assets/progress-bar-bUuKn1Q8.js", "/assets/index-Dx5GmdYq.js", "/assets/error-boundary-CqgVAFiu.js", "/assets/mdx-DvqHp8UI.js", "/assets/progress-C7kc6YXZ.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/login": { "id": "routes/_app+/login", "parentId": "routes/_app+/_layout", "path": "login", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/login-Ca9EDpZj.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-Txs7O6JX.js", "/assets/request-info-CEhUGODY.js", "/assets/tooltip-DTFU8ajx.js", "/assets/pe-CUZaIcdt.js", "/assets/index-DlJAkutV.js", "/assets/workshop-config-CL4F08kr.js", "/assets/use-event-source-A_0lEOPX.js", "/assets/button-CQ6cnotS.js", "/assets/loading-CF7oQHQf.js", "/assets/product-f8Gd2MQ6.js"], "css": [] }, "routes/_app+/support": { "id": "routes/_app+/support", "parentId": "routes/_app+/_layout", "path": "support", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/support-hcqGIpir.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js"], "css": [] }, "routes/admin+/_layout": { "id": "routes/admin+/_layout", "parentId": "root", "path": "admin", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_layout-DATuycts.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-Txs7O6JX.js", "/assets/pe-CUZaIcdt.js", "/assets/tooltip-DTFU8ajx.js", "/assets/progress-C7kc6YXZ.js"], "css": [] }, "routes/admin+/apps": { "id": "routes/admin+/apps", "parentId": "routes/admin+/_layout", "path": "apps", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/apps-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/admin+/cache": { "id": "routes/admin+/cache", "parentId": "routes/admin+/_layout", "path": "cache", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/cache-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/apps": { "id": "routes/apps", "parentId": "root", "path": "apps", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/apps-DP2rzg_V.js", "imports": [], "css": [] }, "routes/diff": { "id": "routes/diff", "parentId": "root", "path": "diff", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/diff-CU8At1c4.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-Txs7O6JX.js", "/assets/tooltip-DTFU8ajx.js", "/assets/index-j_VpxCZh.js", "/assets/index-9dWszLxO.js", "/assets/request-info-CEhUGODY.js", "/assets/pe-CUZaIcdt.js", "/assets/index-DlJAkutV.js", "/assets/loading-CF7oQHQf.js", "/assets/user-DvujSs-t.js", "/assets/workshop-config-CL4F08kr.js", "/assets/epic-video-BFcdejfC.js", "/assets/progress-bar-bUuKn1Q8.js", "/assets/accordion-CKwXYK9L.js", "/assets/mdx-DvqHp8UI.js", "/assets/diff-hoOood-9.js", "/assets/nav-chevrons-Cbc1bd_j.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/discord.callback": { "id": "routes/discord.callback", "parentId": "root", "path": "discord/callback", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/discord.callback-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/exercises": { "id": "routes/exercises", "parentId": "root", "path": "exercises", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/exercises-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/launch-editor": { "id": "routes/launch-editor", "parentId": "root", "path": "launch-editor", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/launch-editor-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/login-sse": { "id": "routes/login-sse", "parentId": "root", "path": "login-sse", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/login-sse-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/og": { "id": "routes/og", "parentId": "root", "path": "og", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/og-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/onboarding": { "id": "routes/onboarding", "parentId": "root", "path": "onboarding", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/onboarding-Dc2TmI9y.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-Txs7O6JX.js", "/assets/request-info-CEhUGODY.js", "/assets/tooltip-DTFU8ajx.js", "/assets/pe-CUZaIcdt.js", "/assets/index-DlJAkutV.js", "/assets/loading-CF7oQHQf.js", "/assets/user-DvujSs-t.js", "/assets/workshop-config-CL4F08kr.js", "/assets/button-CQ6cnotS.js", "/assets/epic-video-BFcdejfC.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/processes": { "id": "routes/processes", "parentId": "root", "path": "processes", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/processes-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/progress": { "id": "routes/progress", "parentId": "root", "path": "progress", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/progress-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/robots[.]txt": { "id": "routes/robots[.]txt", "parentId": "root", "path": "robots.txt", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/robots_._txt-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/set-playground": { "id": "routes/set-playground", "parentId": "root", "path": "set-playground", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/set-playground-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/sitemap[.]xml": { "id": "routes/sitemap[.]xml", "parentId": "root", "path": "sitemap.xml", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/sitemap_._xml-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/start": { "id": "routes/start", "parentId": "root", "path": "start", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/start-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/test": { "id": "routes/test", "parentId": "root", "path": "test", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/test-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/theme/index": { "id": "routes/theme/index", "parentId": "root", "path": "theme", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/index-DP2rzg_V.js", "imports": [], "css": [] }, "routes/update-mdx-cache": { "id": "routes/update-mdx-cache", "parentId": "root", "path": "update-mdx-cache", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/update-mdx-cache-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/video-player/index": { "id": "routes/video-player/index", "parentId": "root", "path": "video-player", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/index-K6Dvbx-E.js", "imports": [], "css": [] } }, "url": "/assets/manifest-0d2d0a8f.js", "version": "0d2d0a8f" };
13662
13663
  const mode = "production";
13663
13664
  const assetsBuildDirectory = "build/client";
13664
13665
  const basename = "/";