@epic-web/workshop-app 6.77.0 → 6.77.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/client/assets/{_exerciseNumber-C1aZpAWV.js → _exerciseNumber-JuXb6JTN.js} +2 -2
- package/build/client/assets/{_exerciseNumber-C1aZpAWV.js.map → _exerciseNumber-JuXb6JTN.js.map} +1 -1
- package/build/client/assets/{_exerciseNumber_.finished-BICggZV1.js → _exerciseNumber_.finished-DD-1txyR.js} +2 -2
- package/build/client/assets/{_exerciseNumber_.finished-BICggZV1.js.map → _exerciseNumber_.finished-DD-1txyR.js.map} +1 -1
- package/build/client/assets/_extra-BfK-kKBL.js +2 -0
- package/build/client/assets/_extra-BfK-kKBL.js.map +1 -0
- package/build/client/assets/{_layout-BZI3FoQD.js → _layout-BsHVX3B_.js} +2 -2
- package/build/client/assets/{_layout-BZI3FoQD.js.map → _layout-BsHVX3B_.js.map} +1 -1
- package/build/client/assets/{_layout-CunOyAg4.js → _layout-CDyeQVKG.js} +2 -2
- package/build/client/assets/{_layout-CunOyAg4.js.map → _layout-CDyeQVKG.js.map} +1 -1
- package/build/client/assets/_layout-mVyOtxmC.js +2 -0
- package/build/client/assets/_layout-mVyOtxmC.js.map +1 -0
- package/build/client/assets/{account-C96cpeZR.js → account-BKXMYhfO.js} +2 -2
- package/build/client/assets/{account-C96cpeZR.js.map → account-BKXMYhfO.js.map} +1 -1
- package/build/client/assets/{app-CJniokic.js → app-AWsnszeo.js} +2 -2
- package/build/client/assets/{app-CJniokic.js.map → app-AWsnszeo.js.map} +1 -1
- package/build/client/assets/{cache-CAr50MIB.js → cache-CxMFS2A_.js} +2 -2
- package/build/client/assets/{cache-CAr50MIB.js.map → cache-CxMFS2A_.js.map} +1 -1
- package/build/client/assets/{db-DAnX-T3_.js → db-BZ-tFzMp.js} +2 -2
- package/build/client/assets/{db-DAnX-T3_.js.map → db-BZ-tFzMp.js.map} +1 -1
- package/build/client/assets/{diff-D8TUonC2.js → diff-0VO9C_Sf.js} +2 -2
- package/build/client/assets/{diff-D8TUonC2.js.map → diff-0VO9C_Sf.js.map} +1 -1
- package/build/client/assets/{diff-Col_iM3X.js → diff-CC_jaH50.js} +2 -2
- package/build/client/assets/{diff-Col_iM3X.js.map → diff-CC_jaH50.js.map} +1 -1
- package/build/client/assets/discord-BVfxP4Rd.js +2 -0
- package/build/client/assets/discord-BVfxP4Rd.js.map +1 -0
- package/build/client/assets/{discord-BJkw0IrB.js → discord-XhHqPI49.js} +2 -2
- package/build/client/assets/{discord-BJkw0IrB.js.map → discord-XhHqPI49.js.map} +1 -1
- package/build/client/assets/{epic-video-BJW6MU1i.js → epic-video-D4jBdSKs.js} +2 -2
- package/build/client/assets/{epic-video-BJW6MU1i.js.map → epic-video-D4jBdSKs.js.map} +1 -1
- package/build/client/assets/{epic-video-jtxu_0bl.js → epic-video-Ddc9rYLT.js} +2 -2
- package/build/client/assets/{epic-video-jtxu_0bl.js.map → epic-video-Ddc9rYLT.js.map} +1 -1
- package/build/client/assets/{finished-C2jP5uE7.js → finished-BSfM_f4M.js} +2 -2
- package/build/client/assets/{finished-C2jP5uE7.js.map → finished-BSfM_f4M.js.map} +1 -1
- package/build/client/assets/{index-CdzVFL-Z.js → index-BrVvTrwg.js} +2 -2
- package/build/client/assets/{index-CdzVFL-Z.js.map → index-BrVvTrwg.js.map} +1 -1
- package/build/client/assets/{index-Dpyv8N6m.js → index-CfPaTqRT.js} +2 -2
- package/build/client/assets/{index-Dpyv8N6m.js.map → index-CfPaTqRT.js.map} +1 -1
- package/build/client/assets/{index-X8or9u7t.js → index-CuCZuiBp.js} +2 -2
- package/build/client/assets/{index-X8or9u7t.js.map → index-CuCZuiBp.js.map} +1 -1
- package/build/client/assets/{index-KRgoKRWG.js → index-D0vH1MiQ.js} +2 -2
- package/build/client/assets/{index-KRgoKRWG.js.map → index-D0vH1MiQ.js.map} +1 -1
- package/build/client/assets/{index-BCQgVrao.js → index-DTC_5pri.js} +2 -2
- package/build/client/assets/{index-BCQgVrao.js.map → index-DTC_5pri.js.map} +1 -1
- package/build/client/assets/{launch-editor-D2exGfVu.js → launch-editor-0oPpbFQe.js} +2 -2
- package/build/client/assets/{launch-editor-D2exGfVu.js.map → launch-editor-0oPpbFQe.js.map} +1 -1
- package/build/client/assets/{loading-CDNzW5oO.js → loading-CaCCsk9k.js} +2 -2
- package/build/client/assets/{loading-CDNzW5oO.js.map → loading-CaCCsk9k.js.map} +1 -1
- package/build/client/assets/{login-mWjVXGbJ.js → login-w4y7RVYa.js} +2 -2
- package/build/client/assets/{login-mWjVXGbJ.js.map → login-w4y7RVYa.js.map} +1 -1
- package/build/client/assets/{manifest-dd28a0e5.js → manifest-a63db2d2.js} +1 -1
- package/build/client/assets/{mdx-DdpoOTHm.js → mdx-DwvWT4Ou.js} +2 -2
- package/build/client/assets/{mdx-DdpoOTHm.js.map → mdx-DwvWT4Ou.js.map} +1 -1
- package/build/client/assets/{onboarding-indicator-B-XR90_G.js → onboarding-indicator-BkeHYs2C.js} +2 -2
- package/build/client/assets/{onboarding-indicator-B-XR90_G.js.map → onboarding-indicator-BkeHYs2C.js.map} +1 -1
- package/build/client/assets/{online-DiNLkgTC.js → online-DVk-W8Cr.js} +2 -2
- package/build/client/assets/{online-DiNLkgTC.js.map → online-DVk-W8Cr.js.map} +1 -1
- package/build/client/assets/{playground-DmEAkxG1.js → playground-DG4B62WX.js} +2 -2
- package/build/client/assets/{playground-DmEAkxG1.js.map → playground-DG4B62WX.js.map} +1 -1
- package/build/client/assets/{playground-window-x2mQ5o1O.js → playground-window-CF8lTXXI.js} +2 -2
- package/build/client/assets/{playground-window-x2mQ5o1O.js.map → playground-window-CF8lTXXI.js.map} +1 -1
- package/build/client/assets/{preferences-B7ND1VS9.js → preferences-Czy5oqWs.js} +2 -2
- package/build/client/assets/{preferences-B7ND1VS9.js.map → preferences-Czy5oqWs.js.map} +1 -1
- package/build/client/assets/{presence-VCvV2mg7.js → presence-Brtc_BN7.js} +2 -2
- package/build/client/assets/{presence-VCvV2mg7.js.map → presence-Brtc_BN7.js.map} +1 -1
- package/build/client/assets/{preview-fhmjENlm.js → preview-Be-plbPz.js} +2 -2
- package/build/client/assets/{preview-fhmjENlm.js.map → preview-Be-plbPz.js.map} +1 -1
- package/build/client/assets/{product-CvyMpYD_.js → product-D4IgPJN5.js} +2 -2
- package/build/client/assets/{product-CvyMpYD_.js.map → product-D4IgPJN5.js.map} +1 -1
- package/build/client/assets/{progress-Bby-ybMA.js → progress-JDMkfyr3.js} +2 -2
- package/build/client/assets/{progress-Bby-ybMA.js.map → progress-JDMkfyr3.js.map} +1 -1
- package/build/client/assets/{revalidation-ws-BJWJviUX.js → revalidation-ws-iocj9Mrl.js} +2 -2
- package/build/client/assets/{revalidation-ws-BJWJviUX.js.map → revalidation-ws-iocj9Mrl.js.map} +1 -1
- package/build/client/assets/{root-B-MkiU1r.js → root-IJJBVEoj.js} +2 -2
- package/build/client/assets/{root-B-MkiU1r.js.map → root-IJJBVEoj.js.map} +1 -1
- package/build/client/assets/{root-loader-BOzEMapJ.js → root-loader-BmUqzUDN.js} +2 -2
- package/build/client/assets/{root-loader-BOzEMapJ.js.map → root-loader-BmUqzUDN.js.map} +1 -1
- package/build/client/assets/{set-playground-BSGwH9dH.js → set-playground-DO5tJu4h.js} +2 -2
- package/build/client/assets/{set-playground-BSGwH9dH.js.map → set-playground-DO5tJu4h.js.map} +1 -1
- package/build/client/assets/{test-BeEphi7e.js → test-C8NrA0Ls.js} +2 -2
- package/build/client/assets/{test-BeEphi7e.js.map → test-C8NrA0Ls.js.map} +1 -1
- package/build/client/assets/{tests-RWSslYc0.js → tests-Bko6qhsh.js} +2 -2
- package/build/client/assets/{tests-RWSslYc0.js.map → tests-Bko6qhsh.js.map} +1 -1
- package/build/client/assets/{user-BsPobzjB.js → user-CYXKquT7.js} +2 -2
- package/build/client/assets/{user-BsPobzjB.js.map → user-CYXKquT7.js.map} +1 -1
- package/build/client/assets/{version-f8qqYbyU.js → version-CwWSRwe5.js} +2 -2
- package/build/client/assets/{version-f8qqYbyU.js.map → version-CwWSRwe5.js.map} +1 -1
- package/build/client/assets/{workshop-config-Zfc8zU0x.js → workshop-config-BMWaKPZT.js} +2 -2
- package/build/client/assets/{workshop-config-Zfc8zU0x.js.map → workshop-config-BMWaKPZT.js.map} +1 -1
- package/build/server/index.js +7 -3
- package/build/server/index.js.map +1 -1
- package/package.json +3 -3
- package/build/client/assets/_extra-Dki7HdFp.js +0 -2
- package/build/client/assets/_extra-Dki7HdFp.js.map +0 -1
- package/build/client/assets/_layout-DTrIGRDO.js +0 -2
- package/build/client/assets/_layout-DTrIGRDO.js.map +0 -1
- package/build/client/assets/discord-r3m19sUM.js +0 -2
- package/build/client/assets/discord-r3m19sUM.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"launch-editor-D2exGfVu.js","sources":["../../../app/routes/launch-editor.tsx"],"sourcesContent":["import path from 'path'\nimport { getAppByName } from '@epic-web/workshop-utils/apps.server'\nimport { launchEditor } from '@epic-web/workshop-utils/launch-editor.server'\nimport fsExtra from 'fs-extra'\nimport { useEffect } from 'react'\nimport { Link, useFetcher, type ActionFunctionArgs } from 'react-router'\nimport { z, type ZodTypeAny } from 'zod'\nimport { showProgressBarField } from '#app/components/progress-bar.tsx'\nimport { cn, ensureUndeployed } from '#app/utils/misc.tsx'\nimport { dataWithPE, usePERedirectInput } from '#app/utils/pe.tsx'\nimport { useApps, useRequestInfo } from '#app/utils/root-loader.ts'\nimport { createToastHeaders } from '#app/utils/toast.server.ts'\n\nfunction getFileDescriptorSchema<AppFile extends ZodTypeAny>(appFile: AppFile) {\n\treturn z.union([\n\t\tz.object({\n\t\t\ttype: z.literal('file'),\n\t\t\tfile: z.string(),\n\t\t}),\n\t\tz.object({\n\t\t\ttype: z.literal('appFile'),\n\t\t\tappFile,\n\t\t\tappName: z.string(),\n\t\t}),\n\t])\n}\n\nconst LaunchSchema = z.intersection(\n\tz.object({\n\t\tline: z.coerce.number().optional(),\n\t\tcolumn: z.coerce.number().optional(),\n\t\tsyncTo: getFileDescriptorSchema(z.string()).optional(),\n\t}),\n\tgetFileDescriptorSchema(z.array(z.string())),\n)\n\nexport async function action({ request }: ActionFunctionArgs) {\n\tensureUndeployed()\n\tconst formData = await request.formData()\n\tconst syncTo = {\n\t\ttype: formData.get('syncTo.type') ?? undefined,\n\t\tfile: formData.get('syncTo.file') ?? undefined,\n\t\tworkshopFile: formData.get('syncTo.workshopFile') ?? undefined,\n\t\tappFile: formData.getAll('syncTo.appFile'),\n\t\tappName: formData.get('syncTo.appName') ?? undefined,\n\t}\n\tconst syncToIsProvided = Object.values(syncTo).some((v) =>\n\t\tArray.isArray(v) ? v.length : v,\n\t)\n\tconst rawData = {\n\t\ttype: formData.get('type'),\n\t\tfile: formData.get('file'),\n\t\tworkshopFile: formData.get('workshopFile'),\n\t\tappFile: formData.getAll('appFile'),\n\t\tappName: formData.get('appName'),\n\t\tline: formData.get('line') ?? undefined,\n\t\tcolumn: formData.get('column') ?? undefined,\n\t\tsyncTo: syncToIsProvided\n\t\t\t? {\n\t\t\t\t\ttype: formData.get('syncTo.type'),\n\t\t\t\t\tfile: formData.get('syncTo.file'),\n\t\t\t\t\tworkshopFile: formData.get('syncTo.workshopFile'),\n\t\t\t\t\tappFile: formData.getAll('syncTo.appFile'),\n\t\t\t\t\tappName: formData.get('syncTo.appName'),\n\t\t\t\t}\n\t\t\t: undefined,\n\t}\n\tconst form = LaunchSchema.parse(rawData)\n\n\tasync function getFiles(\n\t\tfileDescriptor:\n\t\t\t| ({ line?: number; colum?: number } & {\n\t\t\t\t\ttype: 'file'\n\t\t\t\t\tfile: string\n\t\t\t\t\tappName?: never\n\t\t\t\t\tappFile?: never\n\t\t\t })\n\t\t\t| {\n\t\t\t\t\ttype: 'appFile'\n\t\t\t\t\tfile?: never\n\t\t\t\t\tappName: string\n\t\t\t\t\tappFile: string | Array<string>\n\t\t\t },\n\t): Promise<Array<{ filepath: string; line?: number; column?: number }>> {\n\t\tif (fileDescriptor.type === 'file') {\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tfilepath: fileDescriptor.file,\n\t\t\t\t\tline: fileDescriptor.line,\n\t\t\t\t\tcolumn: fileDescriptor.colum,\n\t\t\t\t},\n\t\t\t]\n\t\t} else {\n\t\t\tconst fileDescriptorApp = await getAppByName(fileDescriptor.appName)\n\t\t\tif (!fileDescriptorApp) {\n\t\t\t\tthrow new Response(`App \"${fileDescriptor.appName}\" Not found`, {\n\t\t\t\t\tstatus: 404,\n\t\t\t\t})\n\t\t\t}\n\t\t\tconst appFile = Array.isArray(fileDescriptor.appFile)\n\t\t\t\t? fileDescriptor.appFile\n\t\t\t\t: [fileDescriptor.appFile]\n\t\t\treturn appFile.map((file) => {\n\t\t\t\tconst [filePath, line = '1', column = '1'] = file.split(',')\n\t\t\t\tif (!filePath) {\n\t\t\t\t\tthrow new Response(\n\t\t\t\t\t\t`appFile missing file path: ${fileDescriptor.appFile}`,\n\t\t\t\t\t\t{ status: 400 },\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tfilepath: path.join(fileDescriptorApp.fullPath, filePath),\n\t\t\t\t\tline: Number(line),\n\t\t\t\t\tcolumn: Number(column),\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t}\n\n\tconst filesToOpen = await getFiles(form)\n\tif ('syncTo' in form && form.syncTo) {\n\t\tconst originFiles = await getFiles(form.syncTo)\n\t\tfor (let index = 0; index < originFiles.length; index++) {\n\t\t\tconst originFile = originFiles[index]\n\t\t\tif (!originFile) continue\n\t\t\tconst destFile = filesToOpen[index]\n\t\t\tif (!destFile) {\n\t\t\t\tthrow new Response(\n\t\t\t\t\t`Trying to sync to a file that does not appear at index ${index}`,\n\t\t\t\t)\n\t\t\t}\n\t\t\tawait fsExtra.ensureDir(path.dirname(destFile.filepath))\n\t\t\tawait fsExtra.promises.copyFile(originFile.filepath, destFile.filepath)\n\t\t}\n\t}\n\tconst results: Array<\n\t\t{ status: 'success' } | { status: 'error'; message: string }\n\t> = []\n\tfor (const file of filesToOpen) {\n\t\tresults.push(await launchEditor(file.filepath, file.line, file.column))\n\t}\n\n\tif (results.every((r) => r.status === 'success')) {\n\t\treturn dataWithPE(request, formData, { status: 'success' } as const)\n\t} else {\n\t\tconst messages = results\n\t\t\t.map((r, index, array) =>\n\t\t\t\tr.status === 'error'\n\t\t\t\t\t? array.length > 1\n\t\t\t\t\t\t? `${index}. ${r.message}`\n\t\t\t\t\t\t: r.message\n\t\t\t\t\t: null,\n\t\t\t)\n\t\t\t.filter(Boolean)\n\t\t\t.join('\\n')\n\t\tconsole.error('Launch editor error:', messages)\n\t\treturn dataWithPE(\n\t\t\trequest,\n\t\t\tformData,\n\t\t\t{ status: 'error', message: messages } as const,\n\t\t\t{\n\t\t\t\theaders: await createToastHeaders({\n\t\t\t\t\ttype: 'error',\n\t\t\t\t\ttitle: 'Launch Editor Error',\n\t\t\t\t\tdescription: messages,\n\t\t\t\t}),\n\t\t\t},\n\t\t)\n\t}\n}\n\ntype FileDescriptorProps<AppFile> =\n\t| {\n\t\t\tfile: string\n\t\t\tappFile?: never\n\t\t\tappName?: never\n\t }\n\t| {\n\t\t\tfile?: never\n\t\t\tappFile: AppFile\n\t\t\tappName: string\n\t }\n\ntype LaunchEditorProps = {\n\tclassName?: string\n\tline?: number\n\tcolumn?: number\n\tsyncTo?: FileDescriptorProps<string>\n\tchildren: React.ReactNode\n\tonUpdate?: (state: string) => void\n} & FileDescriptorProps<string | string[]>\n\nfunction useLaunchFetcher(onUpdate?: ((state: string) => void) | undefined) {\n\tconst fetcher = useFetcher<typeof action>()\n\n\tuseEffect(() => {\n\t\tif (fetcher.state === 'idle' && fetcher.data != null) {\n\t\t\tonUpdate?.('fetcher-done')\n\t\t}\n\t}, [fetcher, onUpdate])\n\n\treturn fetcher\n}\n\nfunction LaunchEditorImpl({\n\tclassName,\n\tfile,\n\tappFile,\n\tappName,\n\tsyncTo,\n\tline,\n\tcolumn,\n\tchildren,\n\tonUpdate,\n}: LaunchEditorProps) {\n\tconst fetcher = useLaunchFetcher(onUpdate)\n\tconst peRedirectInput = usePERedirectInput()\n\n\tif (!file && !appFile) {\n\t\tconsole.error('LaunchEditor: requires either \"file\" or \"appFile\" prop.')\n\t\treturn null\n\t}\n\tconst fileList = typeof appFile === 'string' ? [appFile] : appFile\n\tconst type = file ? 'file' : 'appFile'\n\tconst syncToType = syncTo?.file ? 'file' : syncTo?.appFile ? 'appFile' : ''\n\n\treturn (\n\t\t<fetcher.Form\n\t\t\taction=\"/launch-editor\"\n\t\t\tmethod=\"POST\"\n\t\t\tclassName=\"flex items-center\"\n\t\t>\n\t\t\t{peRedirectInput}\n\t\t\t{showProgressBarField}\n\t\t\t<input\n\t\t\t\ttype=\"hidden\"\n\t\t\t\tname=\"line\"\n\t\t\t\tvalue={typeof line === 'number' ? line : undefined}\n\t\t\t/>\n\t\t\t<input type=\"hidden\" name=\"column\" value={column} />\n\t\t\t<input type=\"hidden\" name=\"type\" value={type} />\n\t\t\t<input type=\"hidden\" name=\"file\" value={file} />\n\t\t\t<input type=\"hidden\" name=\"appName\" value={appName} />\n\t\t\t{fileList?.map((file) => (\n\t\t\t\t<input type=\"hidden\" name=\"appFile\" key={file} value={file} />\n\t\t\t))}\n\t\t\t{syncTo ? (\n\t\t\t\t<>\n\t\t\t\t\t<input type=\"hidden\" name=\"syncTo.type\" value={syncToType} />\n\t\t\t\t\t<input type=\"hidden\" name=\"syncTo.file\" value={syncTo.file} />\n\t\t\t\t\t<input type=\"hidden\" name=\"syncTo.appName\" value={syncTo.appName} />\n\t\t\t\t\t<input type=\"hidden\" name=\"syncTo.appFile\" value={syncTo.appFile} />\n\t\t\t\t</>\n\t\t\t) : null}\n\t\t\t<button\n\t\t\t\ttype=\"submit\"\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'launch_button',\n\t\t\t\t\tfetcher.state === 'idle' ? null : 'cursor-progress',\n\t\t\t\t\tfetcher.data?.status === 'error' ? 'cursor-not-allowed' : null,\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</button>\n\t\t</fetcher.Form>\n\t)\n}\n\nfunction LaunchGitHub({\n\tclassName,\n\tfile,\n\tappFile,\n\tappName,\n\tline,\n\tchildren,\n}: LaunchEditorProps) {\n\tconst apps = useApps()\n\tconst requestInfo = useRequestInfo()\n\tif (Array.isArray(appFile)) {\n\t\treturn <div>Cannot open more than one file</div>\n\t}\n\tif (file) {\n\t\tconst safePath = (s: string) => s.replace(/\\\\/g, '/')\n\t\t// Convert tree to blob for individual files\n\t\tconst githubFileRoot = ENV.EPICSHOP_GITHUB_ROOT.replace('/tree/', '/blob/')\n\t\treturn (\n\t\t\t<a\n\t\t\t\tclassName=\"launch_button !no-underline\"\n\t\t\t\thref={\n\t\t\t\t\tsafePath(file).replace(\n\t\t\t\t\t\tsafePath(ENV.EPICSHOP_CONTEXT_CWD),\n\t\t\t\t\t\tgithubFileRoot,\n\t\t\t\t\t) + (line ? `#L${line}` : '')\n\t\t\t\t}\n\t\t\t\trel=\"noreferrer\"\n\t\t\t\ttarget=\"_blank\"\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</a>\n\t\t)\n\t}\n\tconst app = apps.find((a) => a.name === appName)\n\t// Convert tree to blob for individual files\n\tconst githubFileRoot = ENV.EPICSHOP_GITHUB_ROOT.replace('/tree/', '/blob/')\n\n\t// Parse appFile to extract filename and line number (format: \"filename,line,column\")\n\tconst [filename, appFileLine] = appFile ? appFile.split(',') : ['', '']\n\tconst lineNumber = line || (appFileLine ? Number(appFileLine) : undefined)\n\n\tconst path = [\n\t\t...(app?.relativePath.split(requestInfo.separator) ?? []),\n\t\tfilename,\n\t].join('/')\n\treturn (\n\t\t<a\n\t\t\tclassName={cn('launch_button !no-underline', className)}\n\t\t\thref={`${githubFileRoot}/${path}${lineNumber ? `#L${lineNumber}` : ''}`}\n\t\t\trel=\"noreferrer\"\n\t\t\ttarget=\"_blank\"\n\t\t>\n\t\t\t{children}\n\t\t</a>\n\t)\n}\n\nexport function EditFileOnGitHub({\n\tappFile = 'README.mdx',\n\tappName,\n\tfile,\n\trelativePath,\n}: {\n\tappFile?: string\n\trelativePath: string\n} & (\n\t| {\n\t\t\tfile: string\n\t\t\tappName?: never\n\t }\n\t| {\n\t\t\tfile?: never\n\t\t\tappName: string\n\t }\n)) {\n\tconst fetcher = useLaunchFetcher()\n\n\tconst handleClick = (e: React.MouseEvent<HTMLAnchorElement>) => {\n\t\tif (!e.altKey || ENV.EPICSHOP_DEPLOYED) return\n\t\te.preventDefault()\n\t\tconst formData = new FormData()\n\t\tconst type = file ? 'file' : 'appFile'\n\t\tformData.append(type, file ?? appFile)\n\t\tformData.append('type', type)\n\t\tif (appName) {\n\t\t\tformData.append('appName', appName)\n\t\t}\n\t\tvoid fetcher.submit(formData, { method: 'POST', action: '/launch-editor' })\n\t}\n\n\tconst githubPath = ENV.EPICSHOP_GITHUB_ROOT.replace(\n\t\t/\\/tree\\/|\\/blob\\//,\n\t\t'/edit/',\n\t)\n\n\treturn (\n\t\t<Link\n\t\t\tclassName=\"self-center font-mono text-sm\"\n\t\t\tonClick={handleClick}\n\t\t\ttarget=\"_blank\"\n\t\t\tto={`${githubPath}/${relativePath}`.replace(/\\\\/g, '/')}\n\t\t>\n\t\t\t<span className=\"@min-[720px]:hidden\">Edit</span>\n\t\t\t<span className=\"hidden @min-[720px]:block @min-[900px]:hidden\">\n\t\t\t\tEdit on GitHub\n\t\t\t</span>\n\t\t\t<span className=\"hidden @min-[900px]:block\">\n\t\t\t\tEdit this page on GitHub\n\t\t\t</span>\n\t\t</Link>\n\t)\n}\n\nexport const LaunchEditor = ENV.EPICSHOP_DEPLOYED\n\t? LaunchGitHub\n\t: LaunchEditorImpl\n"],"names":["useLaunchFetcher","onUpdate","fetcher","useFetcher","useEffect","state","data","LaunchEditorImpl","className","file","appFile","appName","syncTo","line","column","children","peRedirectInput","usePERedirectInput","console","error","fileList","type","syncToType","jsxs","Form","action","method","showProgressBarField","jsx","name","value","map","Fragment","cn","status","LaunchGitHub","apps","useApps","requestInfo","useRequestInfo","Array","isArray","safePath","s","replace","githubFileRoot","ENV","EPICSHOP_GITHUB_ROOT","href","EPICSHOP_CONTEXT_CWD","rel","target","app","find","a","filename","appFileLine","split","lineNumber","Number","path","relativePath","separator","join","EditFileOnGitHub","handleClick","e","altKey","EPICSHOP_DEPLOYED","preventDefault","formData","FormData","append","submit","githubPath","Link","onClick","to","LaunchEditor"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"launch-editor-0oPpbFQe.js","sources":["../../../app/routes/launch-editor.tsx"],"sourcesContent":["import path from 'path'\nimport { getAppByName } from '@epic-web/workshop-utils/apps.server'\nimport { launchEditor } from '@epic-web/workshop-utils/launch-editor.server'\nimport fsExtra from 'fs-extra'\nimport { useEffect } from 'react'\nimport { Link, useFetcher, type ActionFunctionArgs } from 'react-router'\nimport { z, type ZodTypeAny } from 'zod'\nimport { showProgressBarField } from '#app/components/progress-bar.tsx'\nimport { cn, ensureUndeployed } from '#app/utils/misc.tsx'\nimport { dataWithPE, usePERedirectInput } from '#app/utils/pe.tsx'\nimport { useApps, useRequestInfo } from '#app/utils/root-loader.ts'\nimport { createToastHeaders } from '#app/utils/toast.server.ts'\n\nfunction getFileDescriptorSchema<AppFile extends ZodTypeAny>(appFile: AppFile) {\n\treturn z.union([\n\t\tz.object({\n\t\t\ttype: z.literal('file'),\n\t\t\tfile: z.string(),\n\t\t}),\n\t\tz.object({\n\t\t\ttype: z.literal('appFile'),\n\t\t\tappFile,\n\t\t\tappName: z.string(),\n\t\t}),\n\t])\n}\n\nconst LaunchSchema = z.intersection(\n\tz.object({\n\t\tline: z.coerce.number().optional(),\n\t\tcolumn: z.coerce.number().optional(),\n\t\tsyncTo: getFileDescriptorSchema(z.string()).optional(),\n\t}),\n\tgetFileDescriptorSchema(z.array(z.string())),\n)\n\nexport async function action({ request }: ActionFunctionArgs) {\n\tensureUndeployed()\n\tconst formData = await request.formData()\n\tconst syncTo = {\n\t\ttype: formData.get('syncTo.type') ?? undefined,\n\t\tfile: formData.get('syncTo.file') ?? undefined,\n\t\tworkshopFile: formData.get('syncTo.workshopFile') ?? undefined,\n\t\tappFile: formData.getAll('syncTo.appFile'),\n\t\tappName: formData.get('syncTo.appName') ?? undefined,\n\t}\n\tconst syncToIsProvided = Object.values(syncTo).some((v) =>\n\t\tArray.isArray(v) ? v.length : v,\n\t)\n\tconst rawData = {\n\t\ttype: formData.get('type'),\n\t\tfile: formData.get('file'),\n\t\tworkshopFile: formData.get('workshopFile'),\n\t\tappFile: formData.getAll('appFile'),\n\t\tappName: formData.get('appName'),\n\t\tline: formData.get('line') ?? undefined,\n\t\tcolumn: formData.get('column') ?? undefined,\n\t\tsyncTo: syncToIsProvided\n\t\t\t? {\n\t\t\t\t\ttype: formData.get('syncTo.type'),\n\t\t\t\t\tfile: formData.get('syncTo.file'),\n\t\t\t\t\tworkshopFile: formData.get('syncTo.workshopFile'),\n\t\t\t\t\tappFile: formData.getAll('syncTo.appFile'),\n\t\t\t\t\tappName: formData.get('syncTo.appName'),\n\t\t\t\t}\n\t\t\t: undefined,\n\t}\n\tconst form = LaunchSchema.parse(rawData)\n\n\tasync function getFiles(\n\t\tfileDescriptor:\n\t\t\t| ({ line?: number; colum?: number } & {\n\t\t\t\t\ttype: 'file'\n\t\t\t\t\tfile: string\n\t\t\t\t\tappName?: never\n\t\t\t\t\tappFile?: never\n\t\t\t })\n\t\t\t| {\n\t\t\t\t\ttype: 'appFile'\n\t\t\t\t\tfile?: never\n\t\t\t\t\tappName: string\n\t\t\t\t\tappFile: string | Array<string>\n\t\t\t },\n\t): Promise<Array<{ filepath: string; line?: number; column?: number }>> {\n\t\tif (fileDescriptor.type === 'file') {\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tfilepath: fileDescriptor.file,\n\t\t\t\t\tline: fileDescriptor.line,\n\t\t\t\t\tcolumn: fileDescriptor.colum,\n\t\t\t\t},\n\t\t\t]\n\t\t} else {\n\t\t\tconst fileDescriptorApp = await getAppByName(fileDescriptor.appName)\n\t\t\tif (!fileDescriptorApp) {\n\t\t\t\tthrow new Response(`App \"${fileDescriptor.appName}\" Not found`, {\n\t\t\t\t\tstatus: 404,\n\t\t\t\t})\n\t\t\t}\n\t\t\tconst appFile = Array.isArray(fileDescriptor.appFile)\n\t\t\t\t? fileDescriptor.appFile\n\t\t\t\t: [fileDescriptor.appFile]\n\t\t\treturn appFile.map((file) => {\n\t\t\t\tconst [filePath, line = '1', column = '1'] = file.split(',')\n\t\t\t\tif (!filePath) {\n\t\t\t\t\tthrow new Response(\n\t\t\t\t\t\t`appFile missing file path: ${fileDescriptor.appFile}`,\n\t\t\t\t\t\t{ status: 400 },\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tfilepath: path.join(fileDescriptorApp.fullPath, filePath),\n\t\t\t\t\tline: Number(line),\n\t\t\t\t\tcolumn: Number(column),\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t}\n\n\tconst filesToOpen = await getFiles(form)\n\tif ('syncTo' in form && form.syncTo) {\n\t\tconst originFiles = await getFiles(form.syncTo)\n\t\tfor (let index = 0; index < originFiles.length; index++) {\n\t\t\tconst originFile = originFiles[index]\n\t\t\tif (!originFile) continue\n\t\t\tconst destFile = filesToOpen[index]\n\t\t\tif (!destFile) {\n\t\t\t\tthrow new Response(\n\t\t\t\t\t`Trying to sync to a file that does not appear at index ${index}`,\n\t\t\t\t)\n\t\t\t}\n\t\t\tawait fsExtra.ensureDir(path.dirname(destFile.filepath))\n\t\t\tawait fsExtra.promises.copyFile(originFile.filepath, destFile.filepath)\n\t\t}\n\t}\n\tconst results: Array<\n\t\t{ status: 'success' } | { status: 'error'; message: string }\n\t> = []\n\tfor (const file of filesToOpen) {\n\t\tresults.push(await launchEditor(file.filepath, file.line, file.column))\n\t}\n\n\tif (results.every((r) => r.status === 'success')) {\n\t\treturn dataWithPE(request, formData, { status: 'success' } as const)\n\t} else {\n\t\tconst messages = results\n\t\t\t.map((r, index, array) =>\n\t\t\t\tr.status === 'error'\n\t\t\t\t\t? array.length > 1\n\t\t\t\t\t\t? `${index}. ${r.message}`\n\t\t\t\t\t\t: r.message\n\t\t\t\t\t: null,\n\t\t\t)\n\t\t\t.filter(Boolean)\n\t\t\t.join('\\n')\n\t\tconsole.error('Launch editor error:', messages)\n\t\treturn dataWithPE(\n\t\t\trequest,\n\t\t\tformData,\n\t\t\t{ status: 'error', message: messages } as const,\n\t\t\t{\n\t\t\t\theaders: await createToastHeaders({\n\t\t\t\t\ttype: 'error',\n\t\t\t\t\ttitle: 'Launch Editor Error',\n\t\t\t\t\tdescription: messages,\n\t\t\t\t}),\n\t\t\t},\n\t\t)\n\t}\n}\n\ntype FileDescriptorProps<AppFile> =\n\t| {\n\t\t\tfile: string\n\t\t\tappFile?: never\n\t\t\tappName?: never\n\t }\n\t| {\n\t\t\tfile?: never\n\t\t\tappFile: AppFile\n\t\t\tappName: string\n\t }\n\ntype LaunchEditorProps = {\n\tclassName?: string\n\tline?: number\n\tcolumn?: number\n\tsyncTo?: FileDescriptorProps<string>\n\tchildren: React.ReactNode\n\tonUpdate?: (state: string) => void\n} & FileDescriptorProps<string | string[]>\n\nfunction useLaunchFetcher(onUpdate?: ((state: string) => void) | undefined) {\n\tconst fetcher = useFetcher<typeof action>()\n\n\tuseEffect(() => {\n\t\tif (fetcher.state === 'idle' && fetcher.data != null) {\n\t\t\tonUpdate?.('fetcher-done')\n\t\t}\n\t}, [fetcher, onUpdate])\n\n\treturn fetcher\n}\n\nfunction LaunchEditorImpl({\n\tclassName,\n\tfile,\n\tappFile,\n\tappName,\n\tsyncTo,\n\tline,\n\tcolumn,\n\tchildren,\n\tonUpdate,\n}: LaunchEditorProps) {\n\tconst fetcher = useLaunchFetcher(onUpdate)\n\tconst peRedirectInput = usePERedirectInput()\n\n\tif (!file && !appFile) {\n\t\tconsole.error('LaunchEditor: requires either \"file\" or \"appFile\" prop.')\n\t\treturn null\n\t}\n\tconst fileList = typeof appFile === 'string' ? [appFile] : appFile\n\tconst type = file ? 'file' : 'appFile'\n\tconst syncToType = syncTo?.file ? 'file' : syncTo?.appFile ? 'appFile' : ''\n\n\treturn (\n\t\t<fetcher.Form\n\t\t\taction=\"/launch-editor\"\n\t\t\tmethod=\"POST\"\n\t\t\tclassName=\"flex items-center\"\n\t\t>\n\t\t\t{peRedirectInput}\n\t\t\t{showProgressBarField}\n\t\t\t<input\n\t\t\t\ttype=\"hidden\"\n\t\t\t\tname=\"line\"\n\t\t\t\tvalue={typeof line === 'number' ? line : undefined}\n\t\t\t/>\n\t\t\t<input type=\"hidden\" name=\"column\" value={column} />\n\t\t\t<input type=\"hidden\" name=\"type\" value={type} />\n\t\t\t<input type=\"hidden\" name=\"file\" value={file} />\n\t\t\t<input type=\"hidden\" name=\"appName\" value={appName} />\n\t\t\t{fileList?.map((file) => (\n\t\t\t\t<input type=\"hidden\" name=\"appFile\" key={file} value={file} />\n\t\t\t))}\n\t\t\t{syncTo ? (\n\t\t\t\t<>\n\t\t\t\t\t<input type=\"hidden\" name=\"syncTo.type\" value={syncToType} />\n\t\t\t\t\t<input type=\"hidden\" name=\"syncTo.file\" value={syncTo.file} />\n\t\t\t\t\t<input type=\"hidden\" name=\"syncTo.appName\" value={syncTo.appName} />\n\t\t\t\t\t<input type=\"hidden\" name=\"syncTo.appFile\" value={syncTo.appFile} />\n\t\t\t\t</>\n\t\t\t) : null}\n\t\t\t<button\n\t\t\t\ttype=\"submit\"\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'launch_button',\n\t\t\t\t\tfetcher.state === 'idle' ? null : 'cursor-progress',\n\t\t\t\t\tfetcher.data?.status === 'error' ? 'cursor-not-allowed' : null,\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</button>\n\t\t</fetcher.Form>\n\t)\n}\n\nfunction LaunchGitHub({\n\tclassName,\n\tfile,\n\tappFile,\n\tappName,\n\tline,\n\tchildren,\n}: LaunchEditorProps) {\n\tconst apps = useApps()\n\tconst requestInfo = useRequestInfo()\n\tif (Array.isArray(appFile)) {\n\t\treturn <div>Cannot open more than one file</div>\n\t}\n\tif (file) {\n\t\tconst safePath = (s: string) => s.replace(/\\\\/g, '/')\n\t\t// Convert tree to blob for individual files\n\t\tconst githubFileRoot = ENV.EPICSHOP_GITHUB_ROOT.replace('/tree/', '/blob/')\n\t\treturn (\n\t\t\t<a\n\t\t\t\tclassName=\"launch_button !no-underline\"\n\t\t\t\thref={\n\t\t\t\t\tsafePath(file).replace(\n\t\t\t\t\t\tsafePath(ENV.EPICSHOP_CONTEXT_CWD),\n\t\t\t\t\t\tgithubFileRoot,\n\t\t\t\t\t) + (line ? `#L${line}` : '')\n\t\t\t\t}\n\t\t\t\trel=\"noreferrer\"\n\t\t\t\ttarget=\"_blank\"\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</a>\n\t\t)\n\t}\n\tconst app = apps.find((a) => a.name === appName)\n\t// Convert tree to blob for individual files\n\tconst githubFileRoot = ENV.EPICSHOP_GITHUB_ROOT.replace('/tree/', '/blob/')\n\n\t// Parse appFile to extract filename and line number (format: \"filename,line,column\")\n\tconst [filename, appFileLine] = appFile ? appFile.split(',') : ['', '']\n\tconst lineNumber = line || (appFileLine ? Number(appFileLine) : undefined)\n\n\tconst path = [\n\t\t...(app?.relativePath.split(requestInfo.separator) ?? []),\n\t\tfilename,\n\t].join('/')\n\treturn (\n\t\t<a\n\t\t\tclassName={cn('launch_button !no-underline', className)}\n\t\t\thref={`${githubFileRoot}/${path}${lineNumber ? `#L${lineNumber}` : ''}`}\n\t\t\trel=\"noreferrer\"\n\t\t\ttarget=\"_blank\"\n\t\t>\n\t\t\t{children}\n\t\t</a>\n\t)\n}\n\nexport function EditFileOnGitHub({\n\tappFile = 'README.mdx',\n\tappName,\n\tfile,\n\trelativePath,\n}: {\n\tappFile?: string\n\trelativePath: string\n} & (\n\t| {\n\t\t\tfile: string\n\t\t\tappName?: never\n\t }\n\t| {\n\t\t\tfile?: never\n\t\t\tappName: string\n\t }\n)) {\n\tconst fetcher = useLaunchFetcher()\n\n\tconst handleClick = (e: React.MouseEvent<HTMLAnchorElement>) => {\n\t\tif (!e.altKey || ENV.EPICSHOP_DEPLOYED) return\n\t\te.preventDefault()\n\t\tconst formData = new FormData()\n\t\tconst type = file ? 'file' : 'appFile'\n\t\tformData.append(type, file ?? appFile)\n\t\tformData.append('type', type)\n\t\tif (appName) {\n\t\t\tformData.append('appName', appName)\n\t\t}\n\t\tvoid fetcher.submit(formData, { method: 'POST', action: '/launch-editor' })\n\t}\n\n\tconst githubPath = ENV.EPICSHOP_GITHUB_ROOT.replace(\n\t\t/\\/tree\\/|\\/blob\\//,\n\t\t'/edit/',\n\t)\n\n\treturn (\n\t\t<Link\n\t\t\tclassName=\"self-center font-mono text-sm\"\n\t\t\tonClick={handleClick}\n\t\t\ttarget=\"_blank\"\n\t\t\tto={`${githubPath}/${relativePath}`.replace(/\\\\/g, '/')}\n\t\t>\n\t\t\t<span className=\"@min-[720px]:hidden\">Edit</span>\n\t\t\t<span className=\"hidden @min-[720px]:block @min-[900px]:hidden\">\n\t\t\t\tEdit on GitHub\n\t\t\t</span>\n\t\t\t<span className=\"hidden @min-[900px]:block\">\n\t\t\t\tEdit this page on GitHub\n\t\t\t</span>\n\t\t</Link>\n\t)\n}\n\nexport const LaunchEditor = ENV.EPICSHOP_DEPLOYED\n\t? LaunchGitHub\n\t: LaunchEditorImpl\n"],"names":["useLaunchFetcher","onUpdate","fetcher","useFetcher","useEffect","state","data","LaunchEditorImpl","className","file","appFile","appName","syncTo","line","column","children","peRedirectInput","usePERedirectInput","console","error","fileList","type","syncToType","jsxs","Form","action","method","showProgressBarField","jsx","name","value","map","Fragment","cn","status","LaunchGitHub","apps","useApps","requestInfo","useRequestInfo","Array","isArray","safePath","s","replace","githubFileRoot","ENV","EPICSHOP_GITHUB_ROOT","href","EPICSHOP_CONTEXT_CWD","rel","target","app","find","a","filename","appFileLine","split","lineNumber","Number","path","relativePath","separator","join","EditFileOnGitHub","handleClick","e","altKey","EPICSHOP_DEPLOYED","preventDefault","formData","FormData","append","submit","githubPath","Link","onClick","to","LaunchEditor"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{j as e}from"./jsx-runtime-C5WNSv3b.js";import{r as n}from"./index-CqIc3cxq.js";import{a as d}from"./index-
|
|
2
|
-
//# sourceMappingURL=loading-
|
|
1
|
+
import{j as e}from"./jsx-runtime-C5WNSv3b.js";import{r as n}from"./index-CqIc3cxq.js";import{a as d}from"./index-BrVvTrwg.js";import{c as f}from"./misc-W4055b-0.js";function j({className:r,children:t="Loading"}){const{reducedMotion:s}=d();return s==="reduce"?e.jsx("div",{className:"animate-pulse",children:t}):e.jsxs("div",{className:f("flex items-center gap-2 font-mono text-sm font-medium uppercase",r),role:"status",children:[e.jsx("div",{"aria-hidden":"true",children:e.jsx(i,{})}),t,e.jsx("div",{"aria-hidden":"true",children:e.jsx(i,{})})]})}const a="█<▓█ ▒░/▒░ █░>▒▓/ █▒▒ ▓▒▓/█<░▒ ▓/░>",c=()=>a[Math.floor(Math.random()*a.length)];function i(){const[r,t]=n.useState(a[0]),[s,o]=n.useState(a[1]);return m(()=>{t(c()),o(c())},80),e.jsxs("span",{children:[r,s]})}function m(r,t=1e3){const s=n.useRef(null);n.useEffect(()=>{s.current=r},[r]),n.useEffect(()=>{function o(){s.current?.()}if(t!==null){const u=setInterval(o,t);return()=>clearInterval(u)}},[t])}export{j as L};
|
|
2
|
+
//# sourceMappingURL=loading-CaCCsk9k.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loading-
|
|
1
|
+
{"version":3,"file":"loading-CaCCsk9k.js","sources":["../../../app/components/loading.tsx"],"sourcesContent":["// originally this was based on baffle-react, but it was unnecessarily bloated\n// and very out-dated. I've replaced it with a simple Characters component that\n// does the same thing we were using baffle-react for\nimport { useEffect, useRef, useState } from 'react'\nimport { useHints } from '#app/utils/client-hints.tsx'\nimport { cn } from '#app/utils/misc.tsx'\n\nexport function Loading({\n\tclassName,\n\tchildren = 'Loading',\n}: {\n\tclassName?: string\n\tchildren?: React.ReactNode\n}) {\n\tconst { reducedMotion } = useHints()\n\tif (reducedMotion === 'reduce') {\n\t\treturn <div className=\"animate-pulse\">{children}</div>\n\t}\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t'flex items-center gap-2 font-mono text-sm font-medium uppercase',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\trole=\"status\"\n\t\t>\n\t\t\t<div aria-hidden=\"true\">\n\t\t\t\t<Characters />\n\t\t\t</div>\n\t\t\t{children}\n\t\t\t<div aria-hidden=\"true\">\n\t\t\t\t<Characters />\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n\nconst characters = '█<▓█ ▒░/▒░ █░>▒▓/ █▒▒ ▓▒▓/█<░▒ ▓/░>'\nconst randomCharacter = () =>\n\tcharacters[Math.floor(Math.random() * characters.length)]\nexport function Characters() {\n\tconst [char1, setChar1] = useState(characters[0])\n\tconst [char2, setChar2] = useState(characters[1])\n\n\tuseInterval(() => {\n\t\tsetChar1(randomCharacter())\n\t\tsetChar2(randomCharacter())\n\t}, 80)\n\n\treturn (\n\t\t<span>\n\t\t\t{char1}\n\t\t\t{char2}\n\t\t</span>\n\t)\n}\n\nfunction useInterval(callback: () => void, delay: number | null = 1000) {\n\tconst savedCallback = useRef<() => void>(null)\n\n\t// Remember the latest function.\n\tuseEffect(() => {\n\t\tsavedCallback.current = callback\n\t}, [callback])\n\n\t// Set up the interval.\n\tuseEffect(() => {\n\t\tfunction tick() {\n\t\t\tsavedCallback.current?.()\n\t\t}\n\t\tif (delay !== null) {\n\t\t\tconst id = setInterval(tick, delay)\n\t\t\treturn () => clearInterval(id)\n\t\t}\n\t}, [delay])\n}\n"],"names":["Loading","className","children","reducedMotion","useHints","jsx","jsxs","cn","Characters","characters","randomCharacter","char1","setChar1","useState","char2","setChar2","useInterval","callback","delay","savedCallback","useRef","useEffect","tick","id"],"mappings":"qKAOO,SAASA,EAAQ,CACvB,UAAAC,EACA,SAAAC,EAAW,SACZ,EAGG,CACF,KAAM,CAAE,cAAAC,CAAA,EAAkBC,EAAA,EAC1B,OAAID,IAAkB,SACdE,EAAAA,IAAC,MAAA,CAAI,UAAU,gBAAiB,SAAAH,CAAA,CAAS,EAIhDI,EAAAA,KAAC,MAAA,CACA,UAAWC,EACV,kEACAN,CAAA,EAED,KAAK,SAEL,SAAA,CAAAI,MAAC,MAAA,CAAI,cAAY,OAChB,SAAAA,MAACG,IAAW,EACb,EACCN,QACA,MAAA,CAAI,cAAY,OAChB,SAAAG,EAAAA,IAACG,IAAW,CAAA,CACb,CAAA,CAAA,CAAA,CAGH,CAEA,MAAMC,EAAa,sCACbC,EAAkB,IACvBD,EAAW,KAAK,MAAM,KAAK,OAAA,EAAWA,EAAW,MAAM,CAAC,EAClD,SAASD,GAAa,CAC5B,KAAM,CAACG,EAAOC,CAAQ,EAAIC,EAAAA,SAASJ,EAAW,CAAC,CAAC,EAC1C,CAACK,EAAOC,CAAQ,EAAIF,EAAAA,SAASJ,EAAW,CAAC,CAAC,EAEhD,OAAAO,EAAY,IAAM,CACjBJ,EAASF,GAAiB,EAC1BK,EAASL,GAAiB,CAC3B,EAAG,EAAE,SAGH,OAAA,CACC,SAAA,CAAAC,EACAG,CAAA,EACF,CAEF,CAEA,SAASE,EAAYC,EAAsBC,EAAuB,IAAM,CACvE,MAAMC,EAAgBC,EAAAA,OAAmB,IAAI,EAG7CC,EAAAA,UAAU,IAAM,CACfF,EAAc,QAAUF,CACzB,EAAG,CAACA,CAAQ,CAAC,EAGbI,EAAAA,UAAU,IAAM,CACf,SAASC,GAAO,CACfH,EAAc,UAAA,CACf,CACA,GAAID,IAAU,KAAM,CACnB,MAAMK,EAAK,YAAYD,EAAMJ,CAAK,EAClC,MAAO,IAAM,cAAcK,CAAE,CAC9B,CACD,EAAG,CAACL,CAAK,CAAC,CACX"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{w as g,f as j,e as y,l as C,L as N}from"./chunk-EPOLDU6W-BCLmut3y.js";import{j as e}from"./jsx-runtime-C5WNSv3b.js";import{r as a}from"./index-CqIc3cxq.js";import{u as R}from"./use-event-source-BuD4_2SF.js";import{a as S,B as b}from"./button-Cd-ekki5.js";import{L as w}from"./loading-
|
|
2
|
-
//# sourceMappingURL=login-
|
|
1
|
+
import{w as g,f as j,e as y,l as C,L as N}from"./chunk-EPOLDU6W-BCLmut3y.js";import{j as e}from"./jsx-runtime-C5WNSv3b.js";import{r as a}from"./index-CqIc3cxq.js";import{u as R}from"./use-event-source-BuD4_2SF.js";import{a as S,B as b}from"./button-Cd-ekki5.js";import{L as w}from"./loading-CaCCsk9k.js";import{L as _}from"./product-D4IgPJN5.js";import{u as k}from"./workshop-config-BMWaKPZT.js";import{u as D,o as c,s as l,l as d}from"./schemas-Uj5SZtvt.js";import"./misc-W4055b-0.js";import"./index-BrVvTrwg.js";import"./tooltip-Tlsyx2YO.js";import"./index-vDCSPjrM.js";import"./root-loader-BmUqzUDN.js";import"./pe-CIZUOJMr.js";const t={USER_CODE_RECEIVED:"USER_CODE_RECEIVED",AUTH_RESOLVED:"AUTH_RESOLVED",AUTH_REJECTED:"AUTH_REJECTED"},L=c({type:d(t.USER_CODE_RECEIVED),code:l(),url:l()}),T=c({type:d(t.AUTH_RESOLVED)}),A=c({type:d(t.AUTH_REJECTED),error:l().optional().default("Unknown error")}),U=D([L,T,A]),X={getSitemapEntries:()=>null},Z=g(function(){const{product:{displayName:r}}=k(),i=j(),[p,x]=a.useState(!1),[u,h]=a.useState(null),[o,E]=a.useState(null),m=y(),f=C(),n=R("/login-sse");return a.useEffect(()=>{if(!n)return;const v=JSON.parse(n),s=U.safeParse(v);if(!s.success){console.error(s.error.flatten());return}switch(s.data.type){case t.USER_CODE_RECEIVED:{E(s.data);break}case t.AUTH_RESOLVED:{f.revalidate().then(()=>m("/"));break}case t.AUTH_REJECTED:{h(s.data.error);break}}},[n,m,f]),e.jsx("main",{className:"flex h-full w-full grow flex-col items-center justify-center p-10",children:e.jsxs("div",{className:"flex flex-col items-center",children:[e.jsx(_,{className:"h-16 w-16"}),e.jsxs("h1",{className:"pt-5 text-2xl font-semibold md:text-3xl",children:["Login to ",r]}),e.jsxs("div",{className:"flex w-full flex-col items-center pt-5",children:[o?e.jsxs("div",{className:"flex w-full max-w-md flex-col items-center gap-3",children:[e.jsxs("div",{className:"my-2 flex w-full flex-col items-center gap-2",children:[e.jsx("p",{className:"text-lg",children:"Your verification code is: "}),e.jsx("div",{className:"bg-muted mb-3 w-full px-5 py-3 text-center text-lg font-bold",children:e.jsx("code",{children:o.code})}),e.jsxs("p",{className:"text-base",children:["You'll use this to verify your device on ",r,". Click verify code below to open the verification page."]})]}),e.jsx(S,{varient:"primary",to:o.url,target:"_blank",rel:"noreferrer",onClick:()=>x(!0),children:"Verify Auth Code"}),p?e.jsxs("div",{className:"justify-center pt-5 text-center opacity-60",children:[e.jsx(w,{className:"justify-center",children:"Waiting for confirmation"}),e.jsxs("p",{className:"pt-2",children:["Please open"," ",e.jsx("a",{href:o.url,target:"_blank",className:"underline",children:"your auth page"})," ","in a new tab to continue."]})]}):null]}):e.jsxs("div",{className:"flex flex-col items-center gap-8",children:[e.jsxs("div",{className:"text-muted-foreground flex max-w-lg flex-col gap-3 pt-3 text-base",children:[e.jsxs("p",{children:["If you have access to this workshop on ",r,", you'll be able to watch videos, track progress, run tests, view the diffs, and more!"]}),e.jsxs("p",{children:["First you need to authenticate your device by requesting an access code and verifying on ",r,"."]})]}),e.jsx(i.Form,{method:"POST",children:e.jsx(b,{varient:"primary",type:"submit",children:i.state==="idle"&&i.data?.status!=="pending"?"Retrieve Auth Code":"Retrieving Auth Code..."})})]}),u?e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"text-foreground-destructive mt-4",children:["There was an error: ",e.jsx("pre",{children:u})]}),e.jsxs("div",{className:"text-foreground-destructive mt-4",children:["Please try again or"," ",e.jsx(N,{to:"/support",className:"underline",children:"contact support"})," ","if the problem persists."]})]}):null]})]})})});export{Z as default,X as handle};
|
|
2
|
+
//# sourceMappingURL=login-w4y7RVYa.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login-mWjVXGbJ.js","sources":["../../../app/utils/auth-events.ts","../../../app/routes/login-sse.tsx","../../../app/routes/_app+/login.tsx"],"sourcesContent":["export const EVENTS = {\n\tUSER_CODE_RECEIVED: 'USER_CODE_RECEIVED',\n\tAUTH_RESOLVED: 'AUTH_RESOLVED',\n\tAUTH_REJECTED: 'AUTH_REJECTED',\n} as const\nexport type EventTypes = keyof typeof EVENTS\n","import { type LoaderFunctionArgs } from 'react-router'\nimport { eventStream } from 'remix-utils/sse/server'\nimport { z } from 'zod'\nimport { EVENTS } from '#app/utils/auth-events.ts'\nimport { authEmitter } from '#app/utils/auth.server.ts'\nimport { ensureUndeployed } from '#app/utils/misc.tsx'\n\nconst CodeReceivedEventSchema = z.object({\n\ttype: z.literal(EVENTS.USER_CODE_RECEIVED),\n\tcode: z.string(),\n\turl: z.string(),\n})\nconst AuthResolvedEventSchema = z.object({\n\ttype: z.literal(EVENTS.AUTH_RESOLVED),\n})\nconst AuthRejectedEventSchema = z.object({\n\ttype: z.literal(EVENTS.AUTH_REJECTED),\n\terror: z.string().optional().default('Unknown error'),\n})\nexport const EventSchema = z.union([\n\tCodeReceivedEventSchema,\n\tAuthResolvedEventSchema,\n\tAuthRejectedEventSchema,\n])\n\nexport async function loader({ request }: LoaderFunctionArgs) {\n\tensureUndeployed()\n\treturn eventStream(request.signal, function setup(send) {\n\t\tfunction handleCodeReceived(data: any) {\n\t\t\tsend({\n\t\t\t\tdata: JSON.stringify(\n\t\t\t\t\tCodeReceivedEventSchema.parse({\n\t\t\t\t\t\ttype: EVENTS.USER_CODE_RECEIVED,\n\t\t\t\t\t\t...data,\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t})\n\t\t}\n\t\tfunction handleAuthResolved() {\n\t\t\tsend({ data: JSON.stringify({ type: EVENTS.AUTH_RESOLVED }) })\n\t\t}\n\t\tfunction handleAuthRejected(data: any) {\n\t\t\tconst result = AuthRejectedEventSchema.safeParse({\n\t\t\t\ttype: EVENTS.AUTH_REJECTED,\n\t\t\t\t...data,\n\t\t\t})\n\t\t\tif (result.success) {\n\t\t\t\tsend({ data: JSON.stringify(result.data) })\n\t\t\t} else {\n\t\t\t\tconsole.error('Error parsing auth rejected event', result.error, data)\n\t\t\t}\n\t\t}\n\t\tauthEmitter.on(EVENTS.USER_CODE_RECEIVED, handleCodeReceived)\n\t\tauthEmitter.on(EVENTS.AUTH_RESOLVED, handleAuthResolved)\n\t\tauthEmitter.on(EVENTS.AUTH_REJECTED, handleAuthRejected)\n\t\treturn () => {\n\t\t\tauthEmitter.off(EVENTS.USER_CODE_RECEIVED, handleCodeReceived)\n\t\t\tauthEmitter.off(EVENTS.AUTH_RESOLVED, handleAuthResolved)\n\t\t\tauthEmitter.off(EVENTS.AUTH_REJECTED, handleAuthRejected)\n\t\t}\n\t})\n}\n","import { getAuthInfo } from '@epic-web/workshop-utils/db.server'\nimport { type SEOHandle } from '@nasa-gcn/remix-seo'\nimport { useEffect, useState } from 'react'\nimport {\n\tredirect,\n\tLink,\n\tuseFetcher,\n\tuseNavigate,\n\tuseRevalidator,\n} from 'react-router'\nimport { useEventSource } from 'remix-utils/sse/react'\nimport { Button, ButtonLink } from '#app/components/button.tsx'\nimport { Loading } from '#app/components/loading.tsx'\nimport { Logo } from '#app/components/product.tsx'\nimport { useWorkshopConfig } from '#app/components/workshop-config.tsx'\nimport { EVENTS } from '#app/utils/auth-events.ts'\nimport { registerDevice } from '#app/utils/auth.server.ts'\nimport { ensureUndeployed } from '#app/utils/misc.tsx'\nimport { EventSchema } from '../login-sse.tsx'\n\nexport const handle: SEOHandle = {\n\tgetSitemapEntries: () => null,\n}\n\nexport async function loader() {\n\tensureUndeployed()\n\tconst isAuthenticated = Boolean(await getAuthInfo())\n\tif (isAuthenticated) throw redirect('/account')\n\treturn {}\n}\n\nexport async function action() {\n\tensureUndeployed()\n\tvoid registerDevice()\n\treturn { status: 'pending' } as const\n}\n\nexport default function Login() {\n\tconst {\n\t\tproduct: { displayName },\n\t} = useWorkshopConfig()\n\tconst loginFetcher = useFetcher<typeof action>()\n\tconst [clickedVerificationLink, setClickedVerificationLink] = useState(false)\n\tconst [authError, setAuthError] = useState<null | string>(null)\n\tconst [userCodeInfo, setUserCodeInfo] = useState<null | {\n\t\tcode: string\n\t\turl: string\n\t}>(null)\n\tconst navigate = useNavigate()\n\tconst revalidator = useRevalidator()\n\tconst lastMessage = useEventSource(`/login-sse`)\n\tuseEffect(() => {\n\t\tif (!lastMessage) return\n\n\t\tconst parsed = JSON.parse(lastMessage)\n\t\tconst result = EventSchema.safeParse(parsed)\n\t\tif (!result.success) {\n\t\t\tconsole.error(result.error.flatten())\n\t\t\treturn\n\t\t}\n\t\tswitch (result.data.type) {\n\t\t\tcase EVENTS.USER_CODE_RECEIVED: {\n\t\t\t\tsetUserCodeInfo(result.data)\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcase EVENTS.AUTH_RESOLVED: {\n\t\t\t\tvoid revalidator.revalidate().then(() => navigate('/'))\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcase EVENTS.AUTH_REJECTED: {\n\t\t\t\tsetAuthError(result.data.error)\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}, [lastMessage, navigate, revalidator])\n\n\treturn (\n\t\t<main className=\"flex h-full w-full grow flex-col items-center justify-center p-10\">\n\t\t\t<div className=\"flex flex-col items-center\">\n\t\t\t\t<Logo className=\"h-16 w-16\" />\n\t\t\t\t<h1 className=\"pt-5 text-2xl font-semibold md:text-3xl\">\n\t\t\t\t\tLogin to {displayName}\n\t\t\t\t</h1>\n\t\t\t\t<div className=\"flex w-full flex-col items-center pt-5\">\n\t\t\t\t\t{userCodeInfo ? (\n\t\t\t\t\t\t<div className=\"flex w-full max-w-md flex-col items-center gap-3\">\n\t\t\t\t\t\t\t<div className=\"my-2 flex w-full flex-col items-center gap-2\">\n\t\t\t\t\t\t\t\t<p className=\"text-lg\">Your verification code is: </p>\n\t\t\t\t\t\t\t\t<div className=\"bg-muted mb-3 w-full px-5 py-3 text-center text-lg font-bold\">\n\t\t\t\t\t\t\t\t\t<code>{userCodeInfo.code}</code>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<p className=\"text-base\">\n\t\t\t\t\t\t\t\t\tYou'll use this to verify your device on {displayName}. Click\n\t\t\t\t\t\t\t\t\tverify code below to open the verification page.\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<ButtonLink\n\t\t\t\t\t\t\t\tvarient=\"primary\"\n\t\t\t\t\t\t\t\tto={userCodeInfo.url}\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\tonClick={() => setClickedVerificationLink(true)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\tVerify Auth Code\n\t\t\t\t\t\t\t</ButtonLink>\n\t\t\t\t\t\t\t{clickedVerificationLink ? (\n\t\t\t\t\t\t\t\t<div className=\"justify-center pt-5 text-center opacity-60\">\n\t\t\t\t\t\t\t\t\t<Loading className=\"justify-center\">\n\t\t\t\t\t\t\t\t\t\tWaiting for confirmation\n\t\t\t\t\t\t\t\t\t</Loading>\n\t\t\t\t\t\t\t\t\t<p className=\"pt-2\">\n\t\t\t\t\t\t\t\t\t\tPlease open{' '}\n\t\t\t\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\t\t\t\thref={userCodeInfo.url}\n\t\t\t\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"underline\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\tyour auth page\n\t\t\t\t\t\t\t\t\t\t</a>{' '}\n\t\t\t\t\t\t\t\t\t\tin a new tab to continue.\n\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<div className=\"flex flex-col items-center gap-8\">\n\t\t\t\t\t\t\t<div className=\"text-muted-foreground flex max-w-lg flex-col gap-3 pt-3 text-base\">\n\t\t\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\t\t\tIf you have access to this workshop on {displayName}, you'll\n\t\t\t\t\t\t\t\t\tbe able to watch videos, track progress, run tests, view the\n\t\t\t\t\t\t\t\t\tdiffs, and more!\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\t\t\tFirst you need to authenticate your device by requesting an\n\t\t\t\t\t\t\t\t\taccess code and verifying on {displayName}.\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<loginFetcher.Form method=\"POST\">\n\t\t\t\t\t\t\t\t<Button varient=\"primary\" type=\"submit\">\n\t\t\t\t\t\t\t\t\t{loginFetcher.state === 'idle' &&\n\t\t\t\t\t\t\t\t\tloginFetcher.data?.status !== 'pending'\n\t\t\t\t\t\t\t\t\t\t? `Retrieve Auth Code`\n\t\t\t\t\t\t\t\t\t\t: `Retrieving Auth Code...`}\n\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t</loginFetcher.Form>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t\t{authError ? (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<div className=\"text-foreground-destructive mt-4\">\n\t\t\t\t\t\t\t\tThere was an error: <pre>{authError}</pre>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div className=\"text-foreground-destructive mt-4\">\n\t\t\t\t\t\t\t\tPlease try again or{' '}\n\t\t\t\t\t\t\t\t<Link to=\"/support\" className=\"underline\">\n\t\t\t\t\t\t\t\t\tcontact support\n\t\t\t\t\t\t\t\t</Link>{' '}\n\t\t\t\t\t\t\t\tif the problem persists.\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</>\n\t\t\t\t\t) : null}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</main>\n\t)\n}\n"],"names":["EVENTS","CodeReceivedEventSchema","z","type","USER_CODE_RECEIVED","code","url","AuthResolvedEventSchema","AUTH_RESOLVED","AuthRejectedEventSchema","AUTH_REJECTED","error","optional","default","EventSchema","handle","getSitemapEntries","login","_UNSAFE_withComponentProps","product","displayName","useWorkshopConfig","loginFetcher","useFetcher","clickedVerificationLink","setClickedVerificationLink","useState","authError","setAuthError","userCodeInfo","setUserCodeInfo","navigate","useNavigate","revalidator","useRevalidator","lastMessage","useEventSource","useEffect","parsed","JSON","parse","result","safeParse","success","console","flatten","data","revalidate","then","className","children","jsxs","jsx","Logo","ButtonLink","varient","to","target","rel","onClick","Loading","href","Form","method","Button","state","status","Fragment","Link"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"login-w4y7RVYa.js","sources":["../../../app/utils/auth-events.ts","../../../app/routes/login-sse.tsx","../../../app/routes/_app+/login.tsx"],"sourcesContent":["export const EVENTS = {\n\tUSER_CODE_RECEIVED: 'USER_CODE_RECEIVED',\n\tAUTH_RESOLVED: 'AUTH_RESOLVED',\n\tAUTH_REJECTED: 'AUTH_REJECTED',\n} as const\nexport type EventTypes = keyof typeof EVENTS\n","import { type LoaderFunctionArgs } from 'react-router'\nimport { eventStream } from 'remix-utils/sse/server'\nimport { z } from 'zod'\nimport { EVENTS } from '#app/utils/auth-events.ts'\nimport { authEmitter } from '#app/utils/auth.server.ts'\nimport { ensureUndeployed } from '#app/utils/misc.tsx'\n\nconst CodeReceivedEventSchema = z.object({\n\ttype: z.literal(EVENTS.USER_CODE_RECEIVED),\n\tcode: z.string(),\n\turl: z.string(),\n})\nconst AuthResolvedEventSchema = z.object({\n\ttype: z.literal(EVENTS.AUTH_RESOLVED),\n})\nconst AuthRejectedEventSchema = z.object({\n\ttype: z.literal(EVENTS.AUTH_REJECTED),\n\terror: z.string().optional().default('Unknown error'),\n})\nexport const EventSchema = z.union([\n\tCodeReceivedEventSchema,\n\tAuthResolvedEventSchema,\n\tAuthRejectedEventSchema,\n])\n\nexport async function loader({ request }: LoaderFunctionArgs) {\n\tensureUndeployed()\n\treturn eventStream(request.signal, function setup(send) {\n\t\tfunction handleCodeReceived(data: any) {\n\t\t\tsend({\n\t\t\t\tdata: JSON.stringify(\n\t\t\t\t\tCodeReceivedEventSchema.parse({\n\t\t\t\t\t\ttype: EVENTS.USER_CODE_RECEIVED,\n\t\t\t\t\t\t...data,\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t})\n\t\t}\n\t\tfunction handleAuthResolved() {\n\t\t\tsend({ data: JSON.stringify({ type: EVENTS.AUTH_RESOLVED }) })\n\t\t}\n\t\tfunction handleAuthRejected(data: any) {\n\t\t\tconst result = AuthRejectedEventSchema.safeParse({\n\t\t\t\ttype: EVENTS.AUTH_REJECTED,\n\t\t\t\t...data,\n\t\t\t})\n\t\t\tif (result.success) {\n\t\t\t\tsend({ data: JSON.stringify(result.data) })\n\t\t\t} else {\n\t\t\t\tconsole.error('Error parsing auth rejected event', result.error, data)\n\t\t\t}\n\t\t}\n\t\tauthEmitter.on(EVENTS.USER_CODE_RECEIVED, handleCodeReceived)\n\t\tauthEmitter.on(EVENTS.AUTH_RESOLVED, handleAuthResolved)\n\t\tauthEmitter.on(EVENTS.AUTH_REJECTED, handleAuthRejected)\n\t\treturn () => {\n\t\t\tauthEmitter.off(EVENTS.USER_CODE_RECEIVED, handleCodeReceived)\n\t\t\tauthEmitter.off(EVENTS.AUTH_RESOLVED, handleAuthResolved)\n\t\t\tauthEmitter.off(EVENTS.AUTH_REJECTED, handleAuthRejected)\n\t\t}\n\t})\n}\n","import { getAuthInfo } from '@epic-web/workshop-utils/db.server'\nimport { type SEOHandle } from '@nasa-gcn/remix-seo'\nimport { useEffect, useState } from 'react'\nimport {\n\tredirect,\n\tLink,\n\tuseFetcher,\n\tuseNavigate,\n\tuseRevalidator,\n} from 'react-router'\nimport { useEventSource } from 'remix-utils/sse/react'\nimport { Button, ButtonLink } from '#app/components/button.tsx'\nimport { Loading } from '#app/components/loading.tsx'\nimport { Logo } from '#app/components/product.tsx'\nimport { useWorkshopConfig } from '#app/components/workshop-config.tsx'\nimport { EVENTS } from '#app/utils/auth-events.ts'\nimport { registerDevice } from '#app/utils/auth.server.ts'\nimport { ensureUndeployed } from '#app/utils/misc.tsx'\nimport { EventSchema } from '../login-sse.tsx'\n\nexport const handle: SEOHandle = {\n\tgetSitemapEntries: () => null,\n}\n\nexport async function loader() {\n\tensureUndeployed()\n\tconst isAuthenticated = Boolean(await getAuthInfo())\n\tif (isAuthenticated) throw redirect('/account')\n\treturn {}\n}\n\nexport async function action() {\n\tensureUndeployed()\n\tvoid registerDevice()\n\treturn { status: 'pending' } as const\n}\n\nexport default function Login() {\n\tconst {\n\t\tproduct: { displayName },\n\t} = useWorkshopConfig()\n\tconst loginFetcher = useFetcher<typeof action>()\n\tconst [clickedVerificationLink, setClickedVerificationLink] = useState(false)\n\tconst [authError, setAuthError] = useState<null | string>(null)\n\tconst [userCodeInfo, setUserCodeInfo] = useState<null | {\n\t\tcode: string\n\t\turl: string\n\t}>(null)\n\tconst navigate = useNavigate()\n\tconst revalidator = useRevalidator()\n\tconst lastMessage = useEventSource(`/login-sse`)\n\tuseEffect(() => {\n\t\tif (!lastMessage) return\n\n\t\tconst parsed = JSON.parse(lastMessage)\n\t\tconst result = EventSchema.safeParse(parsed)\n\t\tif (!result.success) {\n\t\t\tconsole.error(result.error.flatten())\n\t\t\treturn\n\t\t}\n\t\tswitch (result.data.type) {\n\t\t\tcase EVENTS.USER_CODE_RECEIVED: {\n\t\t\t\tsetUserCodeInfo(result.data)\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcase EVENTS.AUTH_RESOLVED: {\n\t\t\t\tvoid revalidator.revalidate().then(() => navigate('/'))\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcase EVENTS.AUTH_REJECTED: {\n\t\t\t\tsetAuthError(result.data.error)\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}, [lastMessage, navigate, revalidator])\n\n\treturn (\n\t\t<main className=\"flex h-full w-full grow flex-col items-center justify-center p-10\">\n\t\t\t<div className=\"flex flex-col items-center\">\n\t\t\t\t<Logo className=\"h-16 w-16\" />\n\t\t\t\t<h1 className=\"pt-5 text-2xl font-semibold md:text-3xl\">\n\t\t\t\t\tLogin to {displayName}\n\t\t\t\t</h1>\n\t\t\t\t<div className=\"flex w-full flex-col items-center pt-5\">\n\t\t\t\t\t{userCodeInfo ? (\n\t\t\t\t\t\t<div className=\"flex w-full max-w-md flex-col items-center gap-3\">\n\t\t\t\t\t\t\t<div className=\"my-2 flex w-full flex-col items-center gap-2\">\n\t\t\t\t\t\t\t\t<p className=\"text-lg\">Your verification code is: </p>\n\t\t\t\t\t\t\t\t<div className=\"bg-muted mb-3 w-full px-5 py-3 text-center text-lg font-bold\">\n\t\t\t\t\t\t\t\t\t<code>{userCodeInfo.code}</code>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<p className=\"text-base\">\n\t\t\t\t\t\t\t\t\tYou'll use this to verify your device on {displayName}. Click\n\t\t\t\t\t\t\t\t\tverify code below to open the verification page.\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<ButtonLink\n\t\t\t\t\t\t\t\tvarient=\"primary\"\n\t\t\t\t\t\t\t\tto={userCodeInfo.url}\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\tonClick={() => setClickedVerificationLink(true)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\tVerify Auth Code\n\t\t\t\t\t\t\t</ButtonLink>\n\t\t\t\t\t\t\t{clickedVerificationLink ? (\n\t\t\t\t\t\t\t\t<div className=\"justify-center pt-5 text-center opacity-60\">\n\t\t\t\t\t\t\t\t\t<Loading className=\"justify-center\">\n\t\t\t\t\t\t\t\t\t\tWaiting for confirmation\n\t\t\t\t\t\t\t\t\t</Loading>\n\t\t\t\t\t\t\t\t\t<p className=\"pt-2\">\n\t\t\t\t\t\t\t\t\t\tPlease open{' '}\n\t\t\t\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\t\t\t\thref={userCodeInfo.url}\n\t\t\t\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"underline\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\tyour auth page\n\t\t\t\t\t\t\t\t\t\t</a>{' '}\n\t\t\t\t\t\t\t\t\t\tin a new tab to continue.\n\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<div className=\"flex flex-col items-center gap-8\">\n\t\t\t\t\t\t\t<div className=\"text-muted-foreground flex max-w-lg flex-col gap-3 pt-3 text-base\">\n\t\t\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\t\t\tIf you have access to this workshop on {displayName}, you'll\n\t\t\t\t\t\t\t\t\tbe able to watch videos, track progress, run tests, view the\n\t\t\t\t\t\t\t\t\tdiffs, and more!\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\t\t\tFirst you need to authenticate your device by requesting an\n\t\t\t\t\t\t\t\t\taccess code and verifying on {displayName}.\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<loginFetcher.Form method=\"POST\">\n\t\t\t\t\t\t\t\t<Button varient=\"primary\" type=\"submit\">\n\t\t\t\t\t\t\t\t\t{loginFetcher.state === 'idle' &&\n\t\t\t\t\t\t\t\t\tloginFetcher.data?.status !== 'pending'\n\t\t\t\t\t\t\t\t\t\t? `Retrieve Auth Code`\n\t\t\t\t\t\t\t\t\t\t: `Retrieving Auth Code...`}\n\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t</loginFetcher.Form>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t\t{authError ? (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<div className=\"text-foreground-destructive mt-4\">\n\t\t\t\t\t\t\t\tThere was an error: <pre>{authError}</pre>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div className=\"text-foreground-destructive mt-4\">\n\t\t\t\t\t\t\t\tPlease try again or{' '}\n\t\t\t\t\t\t\t\t<Link to=\"/support\" className=\"underline\">\n\t\t\t\t\t\t\t\t\tcontact support\n\t\t\t\t\t\t\t\t</Link>{' '}\n\t\t\t\t\t\t\t\tif the problem persists.\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</>\n\t\t\t\t\t) : null}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</main>\n\t)\n}\n"],"names":["EVENTS","CodeReceivedEventSchema","z","type","USER_CODE_RECEIVED","code","url","AuthResolvedEventSchema","AUTH_RESOLVED","AuthRejectedEventSchema","AUTH_REJECTED","error","optional","default","EventSchema","handle","getSitemapEntries","login","_UNSAFE_withComponentProps","product","displayName","useWorkshopConfig","loginFetcher","useFetcher","clickedVerificationLink","setClickedVerificationLink","useState","authError","setAuthError","userCodeInfo","setUserCodeInfo","navigate","useNavigate","revalidator","useRevalidator","lastMessage","useEventSource","useEffect","parsed","JSON","parse","result","safeParse","success","console","flatten","data","revalidate","then","className","children","jsxs","jsx","Logo","ButtonLink","varient","to","target","rel","onClick","Loading","href","Form","method","Button","state","status","Fragment","Link"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
window.__reactRouterManifest={"entry":{"module":"/assets/entry.client-irhpqxQ2.js","imports":["/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CqIc3cxq.js","/assets/index-vDCSPjrM.js","/assets/chunk-FNSCYPCZ-BHgC5cdx.js","/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/preload-helper-BXl3LOEh.js"],"css":[]},"routes":{"root":{"id":"root","path":"","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":true,"module":"/assets/root-B-MkiU1r.js","imports":["/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CqIc3cxq.js","/assets/index-vDCSPjrM.js","/assets/chunk-FNSCYPCZ-BHgC5cdx.js","/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/preload-helper-BXl3LOEh.js","/assets/misc-W4055b-0.js","/assets/client-only-BeMV-Wuv.js","/assets/error-boundary-DxHqAEHX.js","/assets/dialog-CzO65Z5w.js","/assets/progress-bar-DpWhcyhC.js","/assets/index-DzdDahau.js","/assets/tooltip-Tlsyx2YO.js","/assets/schemas-Uj5SZtvt.js","/assets/index-CdzVFL-Z.js","/assets/presence-VCvV2mg7.js","/assets/seo-t5J-DRxw.js","/assets/pe-CIZUOJMr.js","/assets/index-ynYvVAOK.js","/assets/root-loader-BOzEMapJ.js","/assets/online-DiNLkgTC.js","/assets/coerce-CkHW0SMv.js"],"css":[]},"routes/$":{"id":"routes/$","parentId":"root","path":"*","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":true,"module":"/assets/_-C4AWl_1u.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/error-boundary-DxHqAEHX.js","/assets/misc-W4055b-0.js","/assets/index-CqIc3cxq.js","/assets/preload-helper-BXl3LOEh.js"],"css":[]},"routes/_app+/_layout":{"id":"routes/_app+/_layout","parentId":"root","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/_layout-BZI3FoQD.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/misc-W4055b-0.js","/assets/index-CqIc3cxq.js","/assets/pe-CIZUOJMr.js","/assets/onboarding-indicator-B-XR90_G.js","/assets/product-CvyMpYD_.js","/assets/revalidation-ws-BJWJviUX.js","/assets/status-indicator-C6DiLYL5.js","/assets/dialog-CzO65Z5w.js","/assets/index-CmflCPTU.js","/assets/tooltip-Tlsyx2YO.js","/assets/user-BsPobzjB.js","/assets/workshop-config-Zfc8zU0x.js","/assets/online-DiNLkgTC.js","/assets/presence-VCvV2mg7.js","/assets/root-loader-BOzEMapJ.js","/assets/progress-Bby-ybMA.js","/assets/index-CdzVFL-Z.js","/assets/schemas-Uj5SZtvt.js","/assets/index-ynYvVAOK.js","/assets/index-vDCSPjrM.js","/assets/coerce-CkHW0SMv.js"],"css":[]},"routes/_app+/account":{"id":"routes/_app+/account","parentId":"routes/_app+/_layout","path":"account","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/account-C96cpeZR.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/button-Cd-ekki5.js","/assets/misc-W4055b-0.js","/assets/onboarding-indicator-B-XR90_G.js","/assets/tooltip-Tlsyx2YO.js","/assets/user-BsPobzjB.js","/assets/workshop-config-Zfc8zU0x.js","/assets/index-CqIc3cxq.js","/assets/root-loader-BOzEMapJ.js","/assets/index-vDCSPjrM.js"],"css":[]},"routes/_app+/app.$appName+/$":{"id":"routes/_app+/app.$appName+/$","parentId":"routes/_app+/_layout","path":"app/:appName/*","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":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/*","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":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","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":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,"hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":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","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":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","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/test.epic_ws_.js_-l0sNRNKZ.js","imports":[],"css":[]},"routes/_app+/app.epic_ws[.js]":{"id":"routes/_app+/app.epic_ws[.js]","parentId":"routes/_app+/_layout","path":"app/epic_ws.js","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/app.epic_ws_.js_-l0sNRNKZ.js","imports":[],"css":[]},"routes/_app+/discord":{"id":"routes/_app+/discord","parentId":"routes/_app+/_layout","path":"discord","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/discord-r3m19sUM.js","imports":["/assets/discord-BJkw0IrB.js","/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/index-CqIc3cxq.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/misc-W4055b-0.js","/assets/user-BsPobzjB.js","/assets/root-loader-BOzEMapJ.js","/assets/workshop-config-Zfc8zU0x.js"],"css":[]},"routes/_app+/exercise+/_layout":{"id":"routes/_app+/exercise+/_layout","parentId":"routes/_app+/_layout","path":"exercise","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/_layout-BvtJxESE.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CqIc3cxq.js"],"css":[]},"routes/_app+/exercise+/$exerciseNumber":{"id":"routes/_app+/exercise+/$exerciseNumber","parentId":"routes/_app+/exercise+/_layout","path":":exerciseNumber","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":true,"module":"/assets/_exerciseNumber-C1aZpAWV.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CEVyDj51.js","/assets/epic-video-BJW6MU1i.js","/assets/error-boundary-DxHqAEHX.js","/assets/revalidation-ws-BJWJviUX.js","/assets/launch-editor-D2exGfVu.js","/assets/progress-Bby-ybMA.js","/assets/mdx-DdpoOTHm.js","/assets/root-loader-BOzEMapJ.js","/assets/seo-t5J-DRxw.js","/assets/error-boundary-BDqWjIFP.js","/assets/index-CqIc3cxq.js","/assets/use-event-source-BuD4_2SF.js","/assets/index-DzdDahau.js","/assets/index-vDCSPjrM.js","/assets/index-CdzVFL-Z.js","/assets/misc-W4055b-0.js","/assets/tooltip-Tlsyx2YO.js","/assets/pe-CIZUOJMr.js","/assets/schemas-Uj5SZtvt.js","/assets/online-DiNLkgTC.js","/assets/loading-CDNzW5oO.js","/assets/format-CZ5n8p10.js","/assets/user-BsPobzjB.js","/assets/workshop-config-Zfc8zU0x.js","/assets/preload-helper-BXl3LOEh.js","/assets/progress-bar-DpWhcyhC.js","/assets/chunk-FNSCYPCZ-BHgC5cdx.js","/assets/coerce-CkHW0SMv.js"],"css":["/assets/epic-video-irT-uesJ.css"]},"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout":{"id":"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout","parentId":"routes/_app+/exercise+/_layout","path":":exerciseNumber/:stepNumber/:type","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":true,"module":"/assets/_layout-DTrIGRDO.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CEVyDj51.js","/assets/index-CqIc3cxq.js","/assets/error-boundary-DxHqAEHX.js","/assets/nav-chevrons-Dk4GtZwQ.js","/assets/revalidation-ws-BJWJviUX.js","/assets/launch-editor-D2exGfVu.js","/assets/progress-Bby-ybMA.js","/assets/set-playground-BSGwH9dH.js","/assets/misc-W4055b-0.js","/assets/root-loader-BOzEMapJ.js","/assets/seo-t5J-DRxw.js","/assets/split-layout-DnRER1bP.js","/assets/error-boundary-BDqWjIFP.js","/assets/epic-video-BJW6MU1i.js","/assets/tooltip-Tlsyx2YO.js","/assets/mdx-DdpoOTHm.js","/assets/index-CmflCPTU.js","/assets/onboarding-indicator-B-XR90_G.js","/assets/preload-helper-BXl3LOEh.js","/assets/schemas-Uj5SZtvt.js","/assets/progress-bar-DpWhcyhC.js","/assets/pe-CIZUOJMr.js","/assets/index-CJDOQ1bl.js","/assets/index-vDCSPjrM.js","/assets/index-ynYvVAOK.js","/assets/button-Cd-ekki5.js","/assets/dialog-CzO65Z5w.js","/assets/chunk-FNSCYPCZ-BHgC5cdx.js","/assets/coerce-CkHW0SMv.js","/assets/use-event-source-BuD4_2SF.js","/assets/index-DzdDahau.js","/assets/index-CdzVFL-Z.js","/assets/online-DiNLkgTC.js","/assets/loading-CDNzW5oO.js","/assets/format-CZ5n8p10.js","/assets/user-BsPobzjB.js","/assets/workshop-config-Zfc8zU0x.js"],"css":["/assets/epic-video-irT-uesJ.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","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/app-CJniokic.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CqIc3cxq.js","/assets/preview-fhmjENlm.js","/assets/misc-W4055b-0.js","/assets/button-Cd-ekki5.js","/assets/loading-CDNzW5oO.js","/assets/index-CdzVFL-Z.js","/assets/tooltip-Tlsyx2YO.js","/assets/index-vDCSPjrM.js","/assets/root-loader-BOzEMapJ.js","/assets/pe-CIZUOJMr.js","/assets/schemas-Uj5SZtvt.js","/assets/progress-bar-DpWhcyhC.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","index":true,"hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":true,"module":"/assets/index-BCQgVrao.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/playground-DmEAkxG1.js","/assets/diff-Col_iM3X.js","/assets/error-boundary-DxHqAEHX.js","/assets/workshop-config-Zfc8zU0x.js","/assets/misc-W4055b-0.js","/assets/preview-fhmjENlm.js","/assets/tests-RWSslYc0.js","/assets/index-CqIc3cxq.js","/assets/loading-CDNzW5oO.js","/assets/index-CdzVFL-Z.js","/assets/tooltip-Tlsyx2YO.js","/assets/index-vDCSPjrM.js","/assets/root-loader-BOzEMapJ.js","/assets/pe-CIZUOJMr.js","/assets/schemas-Uj5SZtvt.js","/assets/discord-BJkw0IrB.js","/assets/user-BsPobzjB.js","/assets/online-DiNLkgTC.js","/assets/index-CJDOQ1bl.js","/assets/index-ynYvVAOK.js","/assets/status-indicator-C6DiLYL5.js","/assets/index-DzdDahau.js","/assets/set-playground-BSGwH9dH.js","/assets/button-Cd-ekki5.js","/assets/onboarding-indicator-B-XR90_G.js","/assets/progress-bar-DpWhcyhC.js","/assets/dialog-CzO65Z5w.js","/assets/playground-window-x2mQ5o1O.js","/assets/accordion-CQ7oujC6.js","/assets/mdx-DdpoOTHm.js","/assets/epic-video-BJW6MU1i.js","/assets/use-event-source-BuD4_2SF.js","/assets/format-CZ5n8p10.js","/assets/preload-helper-BXl3LOEh.js","/assets/launch-editor-D2exGfVu.js","/assets/revalidation-ws-BJWJviUX.js"],"css":["/assets/epic-video-irT-uesJ.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","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/test-BeEphi7e.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/tests-RWSslYc0.js","/assets/index-CqIc3cxq.js","/assets/accordion-CQ7oujC6.js","/assets/tooltip-Tlsyx2YO.js","/assets/index-vDCSPjrM.js","/assets/misc-W4055b-0.js","/assets/index-CJDOQ1bl.js","/assets/index-ynYvVAOK.js","/assets/epic-video-BJW6MU1i.js","/assets/use-event-source-BuD4_2SF.js","/assets/index-DzdDahau.js","/assets/index-CdzVFL-Z.js","/assets/root-loader-BOzEMapJ.js","/assets/pe-CIZUOJMr.js","/assets/schemas-Uj5SZtvt.js","/assets/online-DiNLkgTC.js","/assets/loading-CDNzW5oO.js","/assets/format-CZ5n8p10.js","/assets/user-BsPobzjB.js","/assets/workshop-config-Zfc8zU0x.js","/assets/playground-window-x2mQ5o1O.js","/assets/set-playground-BSGwH9dH.js","/assets/button-Cd-ekki5.js","/assets/onboarding-indicator-B-XR90_G.js","/assets/progress-bar-DpWhcyhC.js","/assets/dialog-CzO65Z5w.js"],"css":["/assets/epic-video-irT-uesJ.css"]},"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.index":{"id":"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.index","parentId":"routes/_app+/exercise+/_layout","path":":exerciseNumber/:stepNumber","index":true,"hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":true,"module":"/assets/_exerciseNumber_._stepNumber.index-BPqMtmN8.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/error-boundary-DxHqAEHX.js","/assets/error-boundary-BDqWjIFP.js","/assets/index-CqIc3cxq.js","/assets/preload-helper-BXl3LOEh.js","/assets/misc-W4055b-0.js","/assets/chunk-FNSCYPCZ-BHgC5cdx.js","/assets/schemas-Uj5SZtvt.js","/assets/coerce-CkHW0SMv.js"],"css":[]},"routes/_app+/exercise+/$exerciseNumber_.finished":{"id":"routes/_app+/exercise+/$exerciseNumber_.finished","parentId":"routes/_app+/exercise+/_layout","path":":exerciseNumber/finished","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/_exerciseNumber_.finished-BICggZV1.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CEVyDj51.js","/assets/index-CqIc3cxq.js","/assets/epic-video-BJW6MU1i.js","/assets/misc-W4055b-0.js","/assets/loading-CDNzW5oO.js","/assets/nav-chevrons-Dk4GtZwQ.js","/assets/retrieval-practice-BOku32wW.js","/assets/revalidation-ws-BJWJviUX.js","/assets/launch-editor-D2exGfVu.js","/assets/progress-Bby-ybMA.js","/assets/index-CdzVFL-Z.js","/assets/mdx-DdpoOTHm.js","/assets/online-DiNLkgTC.js","/assets/root-loader-BOzEMapJ.js","/assets/seo-t5J-DRxw.js","/assets/use-event-source-BuD4_2SF.js","/assets/index-DzdDahau.js","/assets/index-vDCSPjrM.js","/assets/schemas-Uj5SZtvt.js","/assets/tooltip-Tlsyx2YO.js","/assets/format-CZ5n8p10.js","/assets/user-BsPobzjB.js","/assets/workshop-config-Zfc8zU0x.js","/assets/progress-bar-DpWhcyhC.js","/assets/pe-CIZUOJMr.js","/assets/preload-helper-BXl3LOEh.js"],"css":["/assets/epic-video-irT-uesJ.css"]},"routes/_app+/extra+/_layout":{"id":"routes/_app+/extra+/_layout","parentId":"routes/_app+/_layout","path":"extra","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/_layout-jJ6TnDJF.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CqIc3cxq.js"],"css":[]},"routes/_app+/extra+/$extra":{"id":"routes/_app+/extra+/$extra","parentId":"routes/_app+/extra+/_layout","path":":extra","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":true,"module":"/assets/_extra-Dki7HdFp.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CEVyDj51.js","/assets/playground-DmEAkxG1.js","/assets/index-CqIc3cxq.js","/assets/diff-Col_iM3X.js","/assets/epic-video-BJW6MU1i.js","/assets/error-boundary-DxHqAEHX.js","/assets/nav-chevrons-Dk4GtZwQ.js","/assets/revalidation-ws-BJWJviUX.js","/assets/workshop-config-Zfc8zU0x.js","/assets/preview-fhmjENlm.js","/assets/launch-editor-D2exGfVu.js","/assets/set-playground-BSGwH9dH.js","/assets/mdx-DdpoOTHm.js","/assets/root-loader-BOzEMapJ.js","/assets/seo-t5J-DRxw.js","/assets/split-layout-DnRER1bP.js","/assets/misc-W4055b-0.js","/assets/loading-CDNzW5oO.js","/assets/index-CdzVFL-Z.js","/assets/tooltip-Tlsyx2YO.js","/assets/index-vDCSPjrM.js","/assets/pe-CIZUOJMr.js","/assets/schemas-Uj5SZtvt.js","/assets/discord-BJkw0IrB.js","/assets/user-BsPobzjB.js","/assets/online-DiNLkgTC.js","/assets/index-CJDOQ1bl.js","/assets/index-ynYvVAOK.js","/assets/status-indicator-C6DiLYL5.js","/assets/index-DzdDahau.js","/assets/playground-window-x2mQ5o1O.js","/assets/accordion-CQ7oujC6.js","/assets/use-event-source-BuD4_2SF.js","/assets/format-CZ5n8p10.js","/assets/preload-helper-BXl3LOEh.js","/assets/button-Cd-ekki5.js","/assets/progress-bar-DpWhcyhC.js","/assets/onboarding-indicator-B-XR90_G.js","/assets/dialog-CzO65Z5w.js"],"css":["/assets/epic-video-irT-uesJ.css"]},"routes/_app+/extra+/index":{"id":"routes/_app+/extra+/index","parentId":"routes/_app+/extra+/_layout","index":true,"hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":true,"module":"/assets/index-KRgoKRWG.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CEVyDj51.js","/assets/epic-video-BJW6MU1i.js","/assets/error-boundary-DxHqAEHX.js","/assets/revalidation-ws-BJWJviUX.js","/assets/launch-editor-D2exGfVu.js","/assets/mdx-DdpoOTHm.js","/assets/misc-W4055b-0.js","/assets/root-loader-BOzEMapJ.js","/assets/seo-t5J-DRxw.js","/assets/index-CqIc3cxq.js","/assets/use-event-source-BuD4_2SF.js","/assets/index-DzdDahau.js","/assets/index-vDCSPjrM.js","/assets/index-CdzVFL-Z.js","/assets/tooltip-Tlsyx2YO.js","/assets/pe-CIZUOJMr.js","/assets/schemas-Uj5SZtvt.js","/assets/online-DiNLkgTC.js","/assets/loading-CDNzW5oO.js","/assets/format-CZ5n8p10.js","/assets/user-BsPobzjB.js","/assets/workshop-config-Zfc8zU0x.js","/assets/preload-helper-BXl3LOEh.js","/assets/progress-bar-DpWhcyhC.js"],"css":["/assets/epic-video-irT-uesJ.css"]},"routes/_app+/finished":{"id":"routes/_app+/finished","parentId":"routes/_app+/_layout","path":"finished","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/finished-C2jP5uE7.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CEVyDj51.js","/assets/index-CqIc3cxq.js","/assets/epic-video-BJW6MU1i.js","/assets/misc-W4055b-0.js","/assets/loading-CDNzW5oO.js","/assets/nav-chevrons-Dk4GtZwQ.js","/assets/retrieval-practice-BOku32wW.js","/assets/revalidation-ws-BJWJviUX.js","/assets/mdx-DdpoOTHm.js","/assets/online-DiNLkgTC.js","/assets/root-loader-BOzEMapJ.js","/assets/seo-t5J-DRxw.js","/assets/launch-editor-D2exGfVu.js","/assets/progress-Bby-ybMA.js","/assets/index-CdzVFL-Z.js","/assets/use-event-source-BuD4_2SF.js","/assets/index-DzdDahau.js","/assets/index-vDCSPjrM.js","/assets/schemas-Uj5SZtvt.js","/assets/tooltip-Tlsyx2YO.js","/assets/format-CZ5n8p10.js","/assets/user-BsPobzjB.js","/assets/workshop-config-Zfc8zU0x.js","/assets/preload-helper-BXl3LOEh.js","/assets/progress-bar-DpWhcyhC.js","/assets/pe-CIZUOJMr.js"],"css":["/assets/epic-video-irT-uesJ.css"]},"routes/_app+/guide":{"id":"routes/_app+/guide","parentId":"routes/_app+/_layout","path":"guide","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/guide-Cinib8Ji.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CqIc3cxq.js"],"css":[]},"routes/_app+/index":{"id":"routes/_app+/index","parentId":"routes/_app+/_layout","index":true,"hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":true,"module":"/assets/index-X8or9u7t.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CEVyDj51.js","/assets/epic-video-BJW6MU1i.js","/assets/error-boundary-DxHqAEHX.js","/assets/launch-editor-D2exGfVu.js","/assets/mdx-DdpoOTHm.js","/assets/misc-W4055b-0.js","/assets/progress-Bby-ybMA.js","/assets/index-CqIc3cxq.js","/assets/use-event-source-BuD4_2SF.js","/assets/index-DzdDahau.js","/assets/index-vDCSPjrM.js","/assets/index-CdzVFL-Z.js","/assets/tooltip-Tlsyx2YO.js","/assets/root-loader-BOzEMapJ.js","/assets/pe-CIZUOJMr.js","/assets/schemas-Uj5SZtvt.js","/assets/online-DiNLkgTC.js","/assets/loading-CDNzW5oO.js","/assets/format-CZ5n8p10.js","/assets/user-BsPobzjB.js","/assets/workshop-config-Zfc8zU0x.js","/assets/preload-helper-BXl3LOEh.js","/assets/progress-bar-DpWhcyhC.js"],"css":["/assets/epic-video-irT-uesJ.css"]},"routes/_app+/l":{"id":"routes/_app+/l","parentId":"routes/_app+/_layout","path":"l","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/l-BWU2-fsj.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/index-CqIc3cxq.js"],"css":[]},"routes/_app+/login":{"id":"routes/_app+/login","parentId":"routes/_app+/_layout","path":"login","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/login-mWjVXGbJ.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CqIc3cxq.js","/assets/use-event-source-BuD4_2SF.js","/assets/button-Cd-ekki5.js","/assets/loading-CDNzW5oO.js","/assets/product-CvyMpYD_.js","/assets/workshop-config-Zfc8zU0x.js","/assets/schemas-Uj5SZtvt.js","/assets/misc-W4055b-0.js","/assets/index-CdzVFL-Z.js","/assets/tooltip-Tlsyx2YO.js","/assets/index-vDCSPjrM.js","/assets/root-loader-BOzEMapJ.js","/assets/pe-CIZUOJMr.js"],"css":[]},"routes/_app+/preferences":{"id":"routes/_app+/preferences","parentId":"routes/_app+/_layout","path":"preferences","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/preferences-B7ND1VS9.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/button-Cd-ekki5.js","/assets/misc-W4055b-0.js","/assets/tooltip-Tlsyx2YO.js","/assets/format-CZ5n8p10.js","/assets/root-loader-BOzEMapJ.js","/assets/index-CqIc3cxq.js","/assets/index-vDCSPjrM.js"],"css":[]},"routes/_app+/support":{"id":"routes/_app+/support","parentId":"routes/_app+/_layout","path":"support","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/support-D5mDQ-c-.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CqIc3cxq.js"],"css":[]},"routes/_app+/workspace-structure":{"id":"routes/_app+/workspace-structure","parentId":"routes/_app+/_layout","path":"workspace-structure","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/workspace-structure-B6Rpl-B2.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/button-Cd-ekki5.js","/assets/index-CqIc3cxq.js","/assets/misc-W4055b-0.js"],"css":[]},"routes/admin+/_layout":{"id":"routes/admin+/_layout","parentId":"root","path":"admin","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/_layout-CunOyAg4.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/root-loader-BOzEMapJ.js","/assets/index-CqIc3cxq.js"],"css":[]},"routes/admin+/apps":{"id":"routes/admin+/apps","parentId":"routes/admin+/_layout","path":"apps","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/apps-l0sNRNKZ.js","imports":[],"css":[]},"routes/admin+/cache":{"id":"routes/admin+/cache","parentId":"routes/admin+/_layout","path":"cache","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/cache-CAr50MIB.js","imports":["/assets/chunk-FNSCYPCZ-BHgC5cdx.js","/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CqIc3cxq.js","/assets/client-only-BeMV-Wuv.js","/assets/button-Cd-ekki5.js","/assets/misc-W4055b-0.js","/assets/launch-editor-D2exGfVu.js","/assets/pe-CIZUOJMr.js","/assets/progress-bar-DpWhcyhC.js","/assets/root-loader-BOzEMapJ.js"],"css":[]},"routes/admin+/cache.$":{"id":"routes/admin+/cache.$","parentId":"routes/admin+/cache","path":"*","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/cache._-l0sNRNKZ.js","imports":[],"css":[]},"routes/admin+/db":{"id":"routes/admin+/db","parentId":"routes/admin+/_layout","path":"db","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/db-DAnX-T3_.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/misc-W4055b-0.js","/assets/tooltip-Tlsyx2YO.js","/assets/launch-editor-D2exGfVu.js","/assets/index-CqIc3cxq.js","/assets/index-vDCSPjrM.js","/assets/progress-bar-DpWhcyhC.js","/assets/pe-CIZUOJMr.js","/assets/root-loader-BOzEMapJ.js"],"css":[]},"routes/admin+/index":{"id":"routes/admin+/index","parentId":"routes/admin+/_layout","index":true,"hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/index-Dpyv8N6m.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/misc-W4055b-0.js","/assets/index-CqIc3cxq.js","/assets/tooltip-Tlsyx2YO.js","/assets/progress-Bby-ybMA.js","/assets/root-loader-BOzEMapJ.js","/assets/index-vDCSPjrM.js","/assets/pe-CIZUOJMr.js"],"css":[]},"routes/admin+/notifications":{"id":"routes/admin+/notifications","parentId":"routes/admin+/_layout","path":"notifications","hasAction":true,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/notifications-l0sNRNKZ.js","imports":[],"css":[]},"routes/admin+/offline-videos":{"id":"routes/admin+/offline-videos","parentId":"routes/admin+/_layout","path":"offline-videos","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/offline-videos-DAsuWMco.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/format-CZ5n8p10.js","/assets/misc-W4055b-0.js","/assets/index-CqIc3cxq.js"],"css":[]},"routes/admin+/version":{"id":"routes/admin+/version","parentId":"routes/admin+/_layout","path":"version","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/version-f8qqYbyU.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/workshop-config-Zfc8zU0x.js","/assets/index-CqIc3cxq.js","/assets/root-loader-BOzEMapJ.js"],"css":[]},"routes/admin+/version[.json]":{"id":"routes/admin+/version[.json]","parentId":"routes/admin+/_layout","path":"version.json","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/version_.json_-l0sNRNKZ.js","imports":[],"css":[]},"routes/apps":{"id":"routes/apps","parentId":"root","path":"apps","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/apps-DP2rzg_V.js","imports":[],"css":[]},"routes/diff":{"id":"routes/diff","parentId":"root","path":"diff","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/diff-D8TUonC2.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/misc-W4055b-0.js","/assets/diff-Col_iM3X.js","/assets/nav-chevrons-Dk4GtZwQ.js","/assets/index-CqIc3cxq.js","/assets/accordion-CQ7oujC6.js","/assets/tooltip-Tlsyx2YO.js","/assets/index-vDCSPjrM.js","/assets/index-CJDOQ1bl.js","/assets/index-ynYvVAOK.js","/assets/mdx-DdpoOTHm.js","/assets/index-DzdDahau.js","/assets/epic-video-BJW6MU1i.js","/assets/use-event-source-BuD4_2SF.js","/assets/index-CdzVFL-Z.js","/assets/root-loader-BOzEMapJ.js","/assets/pe-CIZUOJMr.js","/assets/schemas-Uj5SZtvt.js","/assets/online-DiNLkgTC.js","/assets/loading-CDNzW5oO.js","/assets/format-CZ5n8p10.js","/assets/user-BsPobzjB.js","/assets/workshop-config-Zfc8zU0x.js","/assets/preload-helper-BXl3LOEh.js","/assets/launch-editor-D2exGfVu.js","/assets/progress-bar-DpWhcyhC.js","/assets/revalidation-ws-BJWJviUX.js"],"css":["/assets/epic-video-irT-uesJ.css"]},"routes/diff.$shortcut":{"id":"routes/diff.$shortcut","parentId":"routes/diff","path":":shortcut","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/diff._shortcut-l0sNRNKZ.js","imports":[],"css":[]},"routes/exercises":{"id":"routes/exercises","parentId":"root","path":"exercises","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/exercises-l0sNRNKZ.js","imports":[],"css":[]},"routes/launch-editor":{"id":"routes/launch-editor","parentId":"root","path":"launch-editor","hasAction":true,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/launch-editor-l0sNRNKZ.js","imports":[],"css":[]},"routes/login-sse":{"id":"routes/login-sse","parentId":"root","path":"login-sse","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/login-sse-l0sNRNKZ.js","imports":[],"css":[]},"routes/mark-onboarding-complete":{"id":"routes/mark-onboarding-complete","parentId":"root","path":"mark-onboarding-complete","hasAction":true,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/mark-onboarding-complete-l0sNRNKZ.js","imports":[],"css":[]},"routes/mcp-ui+/epic-video":{"id":"routes/mcp-ui+/epic-video","parentId":"root","path":"mcp-ui/epic-video","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/epic-video-jtxu_0bl.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CqIc3cxq.js","/assets/epic-video-BJW6MU1i.js","/assets/use-event-source-BuD4_2SF.js","/assets/index-DzdDahau.js","/assets/index-vDCSPjrM.js","/assets/index-CdzVFL-Z.js","/assets/misc-W4055b-0.js","/assets/tooltip-Tlsyx2YO.js","/assets/root-loader-BOzEMapJ.js","/assets/pe-CIZUOJMr.js","/assets/schemas-Uj5SZtvt.js","/assets/online-DiNLkgTC.js","/assets/loading-CDNzW5oO.js","/assets/format-CZ5n8p10.js","/assets/user-BsPobzjB.js","/assets/workshop-config-Zfc8zU0x.js"],"css":["/assets/epic-video-irT-uesJ.css"]},"routes/og":{"id":"routes/og","parentId":"root","path":"og","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/og-l0sNRNKZ.js","imports":[],"css":[]},"routes/persist-playground":{"id":"routes/persist-playground","parentId":"root","path":"persist-playground","hasAction":true,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/persist-playground-l0sNRNKZ.js","imports":[],"css":[]},"routes/processes":{"id":"routes/processes","parentId":"root","path":"processes","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/processes-l0sNRNKZ.js","imports":[],"css":[]},"routes/progress":{"id":"routes/progress","parentId":"root","path":"progress","hasAction":true,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/progress-l0sNRNKZ.js","imports":[],"css":[]},"routes/resources+/healthcheck":{"id":"routes/resources+/healthcheck","parentId":"root","path":"resources/healthcheck","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/healthcheck-l0sNRNKZ.js","imports":[],"css":[]},"routes/resources+/lookout":{"id":"routes/resources+/lookout","parentId":"root","path":"resources/lookout","hasAction":true,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/lookout-l0sNRNKZ.js","imports":[],"css":[]},"routes/resources+/offline-video-progress.$playbackId":{"id":"routes/resources+/offline-video-progress.$playbackId","parentId":"root","path":"resources/offline-video-progress/:playbackId","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/offline-video-progress._playbackId-l0sNRNKZ.js","imports":[],"css":[]},"routes/resources+/offline-videos":{"id":"routes/resources+/offline-videos","parentId":"root","path":"resources/offline-videos","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/offline-videos-l0sNRNKZ.js","imports":[],"css":[]},"routes/resources+/offline-videos.$playbackId":{"id":"routes/resources+/offline-videos.$playbackId","parentId":"routes/resources+/offline-videos","path":":playbackId","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/offline-videos._playbackId-l0sNRNKZ.js","imports":[],"css":[]},"routes/robots[.]txt":{"id":"routes/robots[.]txt","parentId":"root","path":"robots.txt","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/robots_._txt-l0sNRNKZ.js","imports":[],"css":[]},"routes/saved-playgrounds":{"id":"routes/saved-playgrounds","parentId":"root","path":"saved-playgrounds","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/saved-playgrounds-l0sNRNKZ.js","imports":[],"css":[]},"routes/set-playground":{"id":"routes/set-playground","parentId":"root","path":"set-playground","hasAction":true,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/set-playground-l0sNRNKZ.js","imports":[],"css":[]},"routes/sitemap[.]xml":{"id":"routes/sitemap[.]xml","parentId":"root","path":"sitemap.xml","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/sitemap_._xml-l0sNRNKZ.js","imports":[],"css":[]},"routes/start":{"id":"routes/start","parentId":"root","path":"start","hasAction":true,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/start-l0sNRNKZ.js","imports":[],"css":[]},"routes/test":{"id":"routes/test","parentId":"root","path":"test","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/test-l0sNRNKZ.js","imports":[],"css":[]},"routes/theme/index":{"id":"routes/theme/index","parentId":"root","path":"theme","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/index-DP2rzg_V.js","imports":[],"css":[]},"routes/video-player/index":{"id":"routes/video-player/index","parentId":"root","path":"video-player","hasAction":true,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/index-K6Dvbx-E.js","imports":[],"css":[]}},"url":"/assets/manifest-dd28a0e5.js","version":"dd28a0e5"};
|
|
1
|
+
window.__reactRouterManifest={"entry":{"module":"/assets/entry.client-irhpqxQ2.js","imports":["/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CqIc3cxq.js","/assets/index-vDCSPjrM.js","/assets/chunk-FNSCYPCZ-BHgC5cdx.js","/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/preload-helper-BXl3LOEh.js"],"css":[]},"routes":{"root":{"id":"root","path":"","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":true,"module":"/assets/root-IJJBVEoj.js","imports":["/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CqIc3cxq.js","/assets/index-vDCSPjrM.js","/assets/chunk-FNSCYPCZ-BHgC5cdx.js","/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/preload-helper-BXl3LOEh.js","/assets/misc-W4055b-0.js","/assets/client-only-BeMV-Wuv.js","/assets/error-boundary-DxHqAEHX.js","/assets/dialog-CzO65Z5w.js","/assets/progress-bar-DpWhcyhC.js","/assets/index-DzdDahau.js","/assets/tooltip-Tlsyx2YO.js","/assets/schemas-Uj5SZtvt.js","/assets/index-BrVvTrwg.js","/assets/presence-Brtc_BN7.js","/assets/seo-t5J-DRxw.js","/assets/pe-CIZUOJMr.js","/assets/index-ynYvVAOK.js","/assets/root-loader-BmUqzUDN.js","/assets/online-DVk-W8Cr.js","/assets/coerce-CkHW0SMv.js"],"css":[]},"routes/$":{"id":"routes/$","parentId":"root","path":"*","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":true,"module":"/assets/_-C4AWl_1u.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/error-boundary-DxHqAEHX.js","/assets/misc-W4055b-0.js","/assets/index-CqIc3cxq.js","/assets/preload-helper-BXl3LOEh.js"],"css":[]},"routes/_app+/_layout":{"id":"routes/_app+/_layout","parentId":"root","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/_layout-BsHVX3B_.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/misc-W4055b-0.js","/assets/index-CqIc3cxq.js","/assets/pe-CIZUOJMr.js","/assets/onboarding-indicator-BkeHYs2C.js","/assets/product-D4IgPJN5.js","/assets/revalidation-ws-iocj9Mrl.js","/assets/status-indicator-C6DiLYL5.js","/assets/dialog-CzO65Z5w.js","/assets/index-CmflCPTU.js","/assets/tooltip-Tlsyx2YO.js","/assets/user-CYXKquT7.js","/assets/workshop-config-BMWaKPZT.js","/assets/online-DVk-W8Cr.js","/assets/presence-Brtc_BN7.js","/assets/root-loader-BmUqzUDN.js","/assets/progress-JDMkfyr3.js","/assets/index-BrVvTrwg.js","/assets/schemas-Uj5SZtvt.js","/assets/index-ynYvVAOK.js","/assets/index-vDCSPjrM.js","/assets/coerce-CkHW0SMv.js"],"css":[]},"routes/_app+/account":{"id":"routes/_app+/account","parentId":"routes/_app+/_layout","path":"account","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/account-BKXMYhfO.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/button-Cd-ekki5.js","/assets/misc-W4055b-0.js","/assets/onboarding-indicator-BkeHYs2C.js","/assets/tooltip-Tlsyx2YO.js","/assets/user-CYXKquT7.js","/assets/workshop-config-BMWaKPZT.js","/assets/index-CqIc3cxq.js","/assets/root-loader-BmUqzUDN.js","/assets/index-vDCSPjrM.js"],"css":[]},"routes/_app+/app.$appName+/$":{"id":"routes/_app+/app.$appName+/$","parentId":"routes/_app+/_layout","path":"app/:appName/*","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":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/*","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":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","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":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,"hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":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","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":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","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/test.epic_ws_.js_-l0sNRNKZ.js","imports":[],"css":[]},"routes/_app+/app.epic_ws[.js]":{"id":"routes/_app+/app.epic_ws[.js]","parentId":"routes/_app+/_layout","path":"app/epic_ws.js","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/app.epic_ws_.js_-l0sNRNKZ.js","imports":[],"css":[]},"routes/_app+/discord":{"id":"routes/_app+/discord","parentId":"routes/_app+/_layout","path":"discord","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/discord-BVfxP4Rd.js","imports":["/assets/discord-XhHqPI49.js","/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/index-CqIc3cxq.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/misc-W4055b-0.js","/assets/user-CYXKquT7.js","/assets/root-loader-BmUqzUDN.js","/assets/workshop-config-BMWaKPZT.js"],"css":[]},"routes/_app+/exercise+/_layout":{"id":"routes/_app+/exercise+/_layout","parentId":"routes/_app+/_layout","path":"exercise","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/_layout-BvtJxESE.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CqIc3cxq.js"],"css":[]},"routes/_app+/exercise+/$exerciseNumber":{"id":"routes/_app+/exercise+/$exerciseNumber","parentId":"routes/_app+/exercise+/_layout","path":":exerciseNumber","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":true,"module":"/assets/_exerciseNumber-JuXb6JTN.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CEVyDj51.js","/assets/epic-video-D4jBdSKs.js","/assets/error-boundary-DxHqAEHX.js","/assets/revalidation-ws-iocj9Mrl.js","/assets/launch-editor-0oPpbFQe.js","/assets/progress-JDMkfyr3.js","/assets/mdx-DwvWT4Ou.js","/assets/root-loader-BmUqzUDN.js","/assets/seo-t5J-DRxw.js","/assets/error-boundary-BDqWjIFP.js","/assets/index-CqIc3cxq.js","/assets/use-event-source-BuD4_2SF.js","/assets/index-DzdDahau.js","/assets/index-vDCSPjrM.js","/assets/index-BrVvTrwg.js","/assets/misc-W4055b-0.js","/assets/tooltip-Tlsyx2YO.js","/assets/pe-CIZUOJMr.js","/assets/schemas-Uj5SZtvt.js","/assets/online-DVk-W8Cr.js","/assets/loading-CaCCsk9k.js","/assets/format-CZ5n8p10.js","/assets/user-CYXKquT7.js","/assets/workshop-config-BMWaKPZT.js","/assets/preload-helper-BXl3LOEh.js","/assets/progress-bar-DpWhcyhC.js","/assets/chunk-FNSCYPCZ-BHgC5cdx.js","/assets/coerce-CkHW0SMv.js"],"css":["/assets/epic-video-irT-uesJ.css"]},"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout":{"id":"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout","parentId":"routes/_app+/exercise+/_layout","path":":exerciseNumber/:stepNumber/:type","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":true,"module":"/assets/_layout-mVyOtxmC.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CEVyDj51.js","/assets/index-CqIc3cxq.js","/assets/error-boundary-DxHqAEHX.js","/assets/nav-chevrons-Dk4GtZwQ.js","/assets/revalidation-ws-iocj9Mrl.js","/assets/launch-editor-0oPpbFQe.js","/assets/progress-JDMkfyr3.js","/assets/set-playground-DO5tJu4h.js","/assets/misc-W4055b-0.js","/assets/root-loader-BmUqzUDN.js","/assets/seo-t5J-DRxw.js","/assets/split-layout-DnRER1bP.js","/assets/error-boundary-BDqWjIFP.js","/assets/epic-video-D4jBdSKs.js","/assets/tooltip-Tlsyx2YO.js","/assets/mdx-DwvWT4Ou.js","/assets/index-CmflCPTU.js","/assets/onboarding-indicator-BkeHYs2C.js","/assets/preload-helper-BXl3LOEh.js","/assets/schemas-Uj5SZtvt.js","/assets/progress-bar-DpWhcyhC.js","/assets/pe-CIZUOJMr.js","/assets/index-CJDOQ1bl.js","/assets/index-vDCSPjrM.js","/assets/index-ynYvVAOK.js","/assets/button-Cd-ekki5.js","/assets/dialog-CzO65Z5w.js","/assets/chunk-FNSCYPCZ-BHgC5cdx.js","/assets/coerce-CkHW0SMv.js","/assets/use-event-source-BuD4_2SF.js","/assets/index-DzdDahau.js","/assets/index-BrVvTrwg.js","/assets/online-DVk-W8Cr.js","/assets/loading-CaCCsk9k.js","/assets/format-CZ5n8p10.js","/assets/user-CYXKquT7.js","/assets/workshop-config-BMWaKPZT.js"],"css":["/assets/epic-video-irT-uesJ.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","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/app-AWsnszeo.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CqIc3cxq.js","/assets/preview-Be-plbPz.js","/assets/misc-W4055b-0.js","/assets/button-Cd-ekki5.js","/assets/loading-CaCCsk9k.js","/assets/index-BrVvTrwg.js","/assets/tooltip-Tlsyx2YO.js","/assets/index-vDCSPjrM.js","/assets/root-loader-BmUqzUDN.js","/assets/pe-CIZUOJMr.js","/assets/schemas-Uj5SZtvt.js","/assets/progress-bar-DpWhcyhC.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","index":true,"hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":true,"module":"/assets/index-DTC_5pri.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/playground-DG4B62WX.js","/assets/diff-CC_jaH50.js","/assets/error-boundary-DxHqAEHX.js","/assets/workshop-config-BMWaKPZT.js","/assets/misc-W4055b-0.js","/assets/preview-Be-plbPz.js","/assets/tests-Bko6qhsh.js","/assets/index-CqIc3cxq.js","/assets/loading-CaCCsk9k.js","/assets/index-BrVvTrwg.js","/assets/tooltip-Tlsyx2YO.js","/assets/index-vDCSPjrM.js","/assets/root-loader-BmUqzUDN.js","/assets/pe-CIZUOJMr.js","/assets/schemas-Uj5SZtvt.js","/assets/discord-XhHqPI49.js","/assets/user-CYXKquT7.js","/assets/online-DVk-W8Cr.js","/assets/index-CJDOQ1bl.js","/assets/index-ynYvVAOK.js","/assets/status-indicator-C6DiLYL5.js","/assets/index-DzdDahau.js","/assets/set-playground-DO5tJu4h.js","/assets/button-Cd-ekki5.js","/assets/onboarding-indicator-BkeHYs2C.js","/assets/progress-bar-DpWhcyhC.js","/assets/dialog-CzO65Z5w.js","/assets/playground-window-CF8lTXXI.js","/assets/accordion-CQ7oujC6.js","/assets/mdx-DwvWT4Ou.js","/assets/epic-video-D4jBdSKs.js","/assets/use-event-source-BuD4_2SF.js","/assets/format-CZ5n8p10.js","/assets/preload-helper-BXl3LOEh.js","/assets/launch-editor-0oPpbFQe.js","/assets/revalidation-ws-iocj9Mrl.js"],"css":["/assets/epic-video-irT-uesJ.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","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/test-C8NrA0Ls.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/tests-Bko6qhsh.js","/assets/index-CqIc3cxq.js","/assets/accordion-CQ7oujC6.js","/assets/tooltip-Tlsyx2YO.js","/assets/index-vDCSPjrM.js","/assets/misc-W4055b-0.js","/assets/index-CJDOQ1bl.js","/assets/index-ynYvVAOK.js","/assets/epic-video-D4jBdSKs.js","/assets/use-event-source-BuD4_2SF.js","/assets/index-DzdDahau.js","/assets/index-BrVvTrwg.js","/assets/root-loader-BmUqzUDN.js","/assets/pe-CIZUOJMr.js","/assets/schemas-Uj5SZtvt.js","/assets/online-DVk-W8Cr.js","/assets/loading-CaCCsk9k.js","/assets/format-CZ5n8p10.js","/assets/user-CYXKquT7.js","/assets/workshop-config-BMWaKPZT.js","/assets/playground-window-CF8lTXXI.js","/assets/set-playground-DO5tJu4h.js","/assets/button-Cd-ekki5.js","/assets/onboarding-indicator-BkeHYs2C.js","/assets/progress-bar-DpWhcyhC.js","/assets/dialog-CzO65Z5w.js"],"css":["/assets/epic-video-irT-uesJ.css"]},"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.index":{"id":"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.index","parentId":"routes/_app+/exercise+/_layout","path":":exerciseNumber/:stepNumber","index":true,"hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":true,"module":"/assets/_exerciseNumber_._stepNumber.index-BPqMtmN8.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/error-boundary-DxHqAEHX.js","/assets/error-boundary-BDqWjIFP.js","/assets/index-CqIc3cxq.js","/assets/preload-helper-BXl3LOEh.js","/assets/misc-W4055b-0.js","/assets/chunk-FNSCYPCZ-BHgC5cdx.js","/assets/schemas-Uj5SZtvt.js","/assets/coerce-CkHW0SMv.js"],"css":[]},"routes/_app+/exercise+/$exerciseNumber_.finished":{"id":"routes/_app+/exercise+/$exerciseNumber_.finished","parentId":"routes/_app+/exercise+/_layout","path":":exerciseNumber/finished","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/_exerciseNumber_.finished-DD-1txyR.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CEVyDj51.js","/assets/index-CqIc3cxq.js","/assets/epic-video-D4jBdSKs.js","/assets/misc-W4055b-0.js","/assets/loading-CaCCsk9k.js","/assets/nav-chevrons-Dk4GtZwQ.js","/assets/retrieval-practice-BOku32wW.js","/assets/revalidation-ws-iocj9Mrl.js","/assets/launch-editor-0oPpbFQe.js","/assets/progress-JDMkfyr3.js","/assets/index-BrVvTrwg.js","/assets/mdx-DwvWT4Ou.js","/assets/online-DVk-W8Cr.js","/assets/root-loader-BmUqzUDN.js","/assets/seo-t5J-DRxw.js","/assets/use-event-source-BuD4_2SF.js","/assets/index-DzdDahau.js","/assets/index-vDCSPjrM.js","/assets/schemas-Uj5SZtvt.js","/assets/tooltip-Tlsyx2YO.js","/assets/format-CZ5n8p10.js","/assets/user-CYXKquT7.js","/assets/workshop-config-BMWaKPZT.js","/assets/progress-bar-DpWhcyhC.js","/assets/pe-CIZUOJMr.js","/assets/preload-helper-BXl3LOEh.js"],"css":["/assets/epic-video-irT-uesJ.css"]},"routes/_app+/extra+/_layout":{"id":"routes/_app+/extra+/_layout","parentId":"routes/_app+/_layout","path":"extra","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/_layout-jJ6TnDJF.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CqIc3cxq.js"],"css":[]},"routes/_app+/extra+/$extra":{"id":"routes/_app+/extra+/$extra","parentId":"routes/_app+/extra+/_layout","path":":extra","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":true,"module":"/assets/_extra-BfK-kKBL.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CEVyDj51.js","/assets/playground-DG4B62WX.js","/assets/index-CqIc3cxq.js","/assets/diff-CC_jaH50.js","/assets/epic-video-D4jBdSKs.js","/assets/error-boundary-DxHqAEHX.js","/assets/nav-chevrons-Dk4GtZwQ.js","/assets/revalidation-ws-iocj9Mrl.js","/assets/workshop-config-BMWaKPZT.js","/assets/preview-Be-plbPz.js","/assets/launch-editor-0oPpbFQe.js","/assets/set-playground-DO5tJu4h.js","/assets/mdx-DwvWT4Ou.js","/assets/root-loader-BmUqzUDN.js","/assets/seo-t5J-DRxw.js","/assets/split-layout-DnRER1bP.js","/assets/misc-W4055b-0.js","/assets/loading-CaCCsk9k.js","/assets/index-BrVvTrwg.js","/assets/tooltip-Tlsyx2YO.js","/assets/index-vDCSPjrM.js","/assets/pe-CIZUOJMr.js","/assets/schemas-Uj5SZtvt.js","/assets/discord-XhHqPI49.js","/assets/user-CYXKquT7.js","/assets/online-DVk-W8Cr.js","/assets/index-CJDOQ1bl.js","/assets/index-ynYvVAOK.js","/assets/status-indicator-C6DiLYL5.js","/assets/index-DzdDahau.js","/assets/playground-window-CF8lTXXI.js","/assets/accordion-CQ7oujC6.js","/assets/use-event-source-BuD4_2SF.js","/assets/format-CZ5n8p10.js","/assets/preload-helper-BXl3LOEh.js","/assets/button-Cd-ekki5.js","/assets/progress-bar-DpWhcyhC.js","/assets/onboarding-indicator-BkeHYs2C.js","/assets/dialog-CzO65Z5w.js"],"css":["/assets/epic-video-irT-uesJ.css"]},"routes/_app+/extra+/index":{"id":"routes/_app+/extra+/index","parentId":"routes/_app+/extra+/_layout","index":true,"hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":true,"module":"/assets/index-D0vH1MiQ.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CEVyDj51.js","/assets/epic-video-D4jBdSKs.js","/assets/error-boundary-DxHqAEHX.js","/assets/revalidation-ws-iocj9Mrl.js","/assets/launch-editor-0oPpbFQe.js","/assets/mdx-DwvWT4Ou.js","/assets/misc-W4055b-0.js","/assets/root-loader-BmUqzUDN.js","/assets/seo-t5J-DRxw.js","/assets/index-CqIc3cxq.js","/assets/use-event-source-BuD4_2SF.js","/assets/index-DzdDahau.js","/assets/index-vDCSPjrM.js","/assets/index-BrVvTrwg.js","/assets/tooltip-Tlsyx2YO.js","/assets/pe-CIZUOJMr.js","/assets/schemas-Uj5SZtvt.js","/assets/online-DVk-W8Cr.js","/assets/loading-CaCCsk9k.js","/assets/format-CZ5n8p10.js","/assets/user-CYXKquT7.js","/assets/workshop-config-BMWaKPZT.js","/assets/preload-helper-BXl3LOEh.js","/assets/progress-bar-DpWhcyhC.js"],"css":["/assets/epic-video-irT-uesJ.css"]},"routes/_app+/finished":{"id":"routes/_app+/finished","parentId":"routes/_app+/_layout","path":"finished","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/finished-BSfM_f4M.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CEVyDj51.js","/assets/index-CqIc3cxq.js","/assets/epic-video-D4jBdSKs.js","/assets/misc-W4055b-0.js","/assets/loading-CaCCsk9k.js","/assets/nav-chevrons-Dk4GtZwQ.js","/assets/retrieval-practice-BOku32wW.js","/assets/revalidation-ws-iocj9Mrl.js","/assets/mdx-DwvWT4Ou.js","/assets/online-DVk-W8Cr.js","/assets/root-loader-BmUqzUDN.js","/assets/seo-t5J-DRxw.js","/assets/launch-editor-0oPpbFQe.js","/assets/progress-JDMkfyr3.js","/assets/index-BrVvTrwg.js","/assets/use-event-source-BuD4_2SF.js","/assets/index-DzdDahau.js","/assets/index-vDCSPjrM.js","/assets/schemas-Uj5SZtvt.js","/assets/tooltip-Tlsyx2YO.js","/assets/format-CZ5n8p10.js","/assets/user-CYXKquT7.js","/assets/workshop-config-BMWaKPZT.js","/assets/preload-helper-BXl3LOEh.js","/assets/progress-bar-DpWhcyhC.js","/assets/pe-CIZUOJMr.js"],"css":["/assets/epic-video-irT-uesJ.css"]},"routes/_app+/guide":{"id":"routes/_app+/guide","parentId":"routes/_app+/_layout","path":"guide","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/guide-Cinib8Ji.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CqIc3cxq.js"],"css":[]},"routes/_app+/index":{"id":"routes/_app+/index","parentId":"routes/_app+/_layout","index":true,"hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":true,"module":"/assets/index-CuCZuiBp.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CEVyDj51.js","/assets/epic-video-D4jBdSKs.js","/assets/error-boundary-DxHqAEHX.js","/assets/launch-editor-0oPpbFQe.js","/assets/mdx-DwvWT4Ou.js","/assets/misc-W4055b-0.js","/assets/progress-JDMkfyr3.js","/assets/index-CqIc3cxq.js","/assets/use-event-source-BuD4_2SF.js","/assets/index-DzdDahau.js","/assets/index-vDCSPjrM.js","/assets/index-BrVvTrwg.js","/assets/tooltip-Tlsyx2YO.js","/assets/root-loader-BmUqzUDN.js","/assets/pe-CIZUOJMr.js","/assets/schemas-Uj5SZtvt.js","/assets/online-DVk-W8Cr.js","/assets/loading-CaCCsk9k.js","/assets/format-CZ5n8p10.js","/assets/user-CYXKquT7.js","/assets/workshop-config-BMWaKPZT.js","/assets/preload-helper-BXl3LOEh.js","/assets/progress-bar-DpWhcyhC.js"],"css":["/assets/epic-video-irT-uesJ.css"]},"routes/_app+/l":{"id":"routes/_app+/l","parentId":"routes/_app+/_layout","path":"l","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/l-BWU2-fsj.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/index-CqIc3cxq.js"],"css":[]},"routes/_app+/login":{"id":"routes/_app+/login","parentId":"routes/_app+/_layout","path":"login","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/login-w4y7RVYa.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CqIc3cxq.js","/assets/use-event-source-BuD4_2SF.js","/assets/button-Cd-ekki5.js","/assets/loading-CaCCsk9k.js","/assets/product-D4IgPJN5.js","/assets/workshop-config-BMWaKPZT.js","/assets/schemas-Uj5SZtvt.js","/assets/misc-W4055b-0.js","/assets/index-BrVvTrwg.js","/assets/tooltip-Tlsyx2YO.js","/assets/index-vDCSPjrM.js","/assets/root-loader-BmUqzUDN.js","/assets/pe-CIZUOJMr.js"],"css":[]},"routes/_app+/preferences":{"id":"routes/_app+/preferences","parentId":"routes/_app+/_layout","path":"preferences","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/preferences-Czy5oqWs.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/button-Cd-ekki5.js","/assets/misc-W4055b-0.js","/assets/tooltip-Tlsyx2YO.js","/assets/format-CZ5n8p10.js","/assets/root-loader-BmUqzUDN.js","/assets/index-CqIc3cxq.js","/assets/index-vDCSPjrM.js"],"css":[]},"routes/_app+/support":{"id":"routes/_app+/support","parentId":"routes/_app+/_layout","path":"support","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/support-D5mDQ-c-.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CqIc3cxq.js"],"css":[]},"routes/_app+/workspace-structure":{"id":"routes/_app+/workspace-structure","parentId":"routes/_app+/_layout","path":"workspace-structure","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/workspace-structure-B6Rpl-B2.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/button-Cd-ekki5.js","/assets/index-CqIc3cxq.js","/assets/misc-W4055b-0.js"],"css":[]},"routes/admin+/_layout":{"id":"routes/admin+/_layout","parentId":"root","path":"admin","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/_layout-CDyeQVKG.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/root-loader-BmUqzUDN.js","/assets/index-CqIc3cxq.js"],"css":[]},"routes/admin+/apps":{"id":"routes/admin+/apps","parentId":"routes/admin+/_layout","path":"apps","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/apps-l0sNRNKZ.js","imports":[],"css":[]},"routes/admin+/cache":{"id":"routes/admin+/cache","parentId":"routes/admin+/_layout","path":"cache","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/cache-CxMFS2A_.js","imports":["/assets/chunk-FNSCYPCZ-BHgC5cdx.js","/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CqIc3cxq.js","/assets/client-only-BeMV-Wuv.js","/assets/button-Cd-ekki5.js","/assets/misc-W4055b-0.js","/assets/launch-editor-0oPpbFQe.js","/assets/pe-CIZUOJMr.js","/assets/progress-bar-DpWhcyhC.js","/assets/root-loader-BmUqzUDN.js"],"css":[]},"routes/admin+/cache.$":{"id":"routes/admin+/cache.$","parentId":"routes/admin+/cache","path":"*","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/cache._-l0sNRNKZ.js","imports":[],"css":[]},"routes/admin+/db":{"id":"routes/admin+/db","parentId":"routes/admin+/_layout","path":"db","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/db-BZ-tFzMp.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/misc-W4055b-0.js","/assets/tooltip-Tlsyx2YO.js","/assets/launch-editor-0oPpbFQe.js","/assets/index-CqIc3cxq.js","/assets/index-vDCSPjrM.js","/assets/progress-bar-DpWhcyhC.js","/assets/pe-CIZUOJMr.js","/assets/root-loader-BmUqzUDN.js"],"css":[]},"routes/admin+/index":{"id":"routes/admin+/index","parentId":"routes/admin+/_layout","index":true,"hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/index-CfPaTqRT.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/misc-W4055b-0.js","/assets/index-CqIc3cxq.js","/assets/tooltip-Tlsyx2YO.js","/assets/progress-JDMkfyr3.js","/assets/root-loader-BmUqzUDN.js","/assets/index-vDCSPjrM.js","/assets/pe-CIZUOJMr.js"],"css":[]},"routes/admin+/notifications":{"id":"routes/admin+/notifications","parentId":"routes/admin+/_layout","path":"notifications","hasAction":true,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/notifications-l0sNRNKZ.js","imports":[],"css":[]},"routes/admin+/offline-videos":{"id":"routes/admin+/offline-videos","parentId":"routes/admin+/_layout","path":"offline-videos","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/offline-videos-DAsuWMco.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/format-CZ5n8p10.js","/assets/misc-W4055b-0.js","/assets/index-CqIc3cxq.js"],"css":[]},"routes/admin+/version":{"id":"routes/admin+/version","parentId":"routes/admin+/_layout","path":"version","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/version-CwWSRwe5.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/workshop-config-BMWaKPZT.js","/assets/index-CqIc3cxq.js","/assets/root-loader-BmUqzUDN.js"],"css":[]},"routes/admin+/version[.json]":{"id":"routes/admin+/version[.json]","parentId":"routes/admin+/_layout","path":"version.json","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/version_.json_-l0sNRNKZ.js","imports":[],"css":[]},"routes/apps":{"id":"routes/apps","parentId":"root","path":"apps","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/apps-DP2rzg_V.js","imports":[],"css":[]},"routes/diff":{"id":"routes/diff","parentId":"root","path":"diff","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/diff-0VO9C_Sf.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/misc-W4055b-0.js","/assets/diff-CC_jaH50.js","/assets/nav-chevrons-Dk4GtZwQ.js","/assets/index-CqIc3cxq.js","/assets/accordion-CQ7oujC6.js","/assets/tooltip-Tlsyx2YO.js","/assets/index-vDCSPjrM.js","/assets/index-CJDOQ1bl.js","/assets/index-ynYvVAOK.js","/assets/mdx-DwvWT4Ou.js","/assets/index-DzdDahau.js","/assets/epic-video-D4jBdSKs.js","/assets/use-event-source-BuD4_2SF.js","/assets/index-BrVvTrwg.js","/assets/root-loader-BmUqzUDN.js","/assets/pe-CIZUOJMr.js","/assets/schemas-Uj5SZtvt.js","/assets/online-DVk-W8Cr.js","/assets/loading-CaCCsk9k.js","/assets/format-CZ5n8p10.js","/assets/user-CYXKquT7.js","/assets/workshop-config-BMWaKPZT.js","/assets/preload-helper-BXl3LOEh.js","/assets/launch-editor-0oPpbFQe.js","/assets/progress-bar-DpWhcyhC.js","/assets/revalidation-ws-iocj9Mrl.js"],"css":["/assets/epic-video-irT-uesJ.css"]},"routes/diff.$shortcut":{"id":"routes/diff.$shortcut","parentId":"routes/diff","path":":shortcut","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/diff._shortcut-l0sNRNKZ.js","imports":[],"css":[]},"routes/exercises":{"id":"routes/exercises","parentId":"root","path":"exercises","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/exercises-l0sNRNKZ.js","imports":[],"css":[]},"routes/launch-editor":{"id":"routes/launch-editor","parentId":"root","path":"launch-editor","hasAction":true,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/launch-editor-l0sNRNKZ.js","imports":[],"css":[]},"routes/login-sse":{"id":"routes/login-sse","parentId":"root","path":"login-sse","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/login-sse-l0sNRNKZ.js","imports":[],"css":[]},"routes/mark-onboarding-complete":{"id":"routes/mark-onboarding-complete","parentId":"root","path":"mark-onboarding-complete","hasAction":true,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/mark-onboarding-complete-l0sNRNKZ.js","imports":[],"css":[]},"routes/mcp-ui+/epic-video":{"id":"routes/mcp-ui+/epic-video","parentId":"root","path":"mcp-ui/epic-video","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/epic-video-Ddc9rYLT.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CqIc3cxq.js","/assets/epic-video-D4jBdSKs.js","/assets/use-event-source-BuD4_2SF.js","/assets/index-DzdDahau.js","/assets/index-vDCSPjrM.js","/assets/index-BrVvTrwg.js","/assets/misc-W4055b-0.js","/assets/tooltip-Tlsyx2YO.js","/assets/root-loader-BmUqzUDN.js","/assets/pe-CIZUOJMr.js","/assets/schemas-Uj5SZtvt.js","/assets/online-DVk-W8Cr.js","/assets/loading-CaCCsk9k.js","/assets/format-CZ5n8p10.js","/assets/user-CYXKquT7.js","/assets/workshop-config-BMWaKPZT.js"],"css":["/assets/epic-video-irT-uesJ.css"]},"routes/og":{"id":"routes/og","parentId":"root","path":"og","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/og-l0sNRNKZ.js","imports":[],"css":[]},"routes/persist-playground":{"id":"routes/persist-playground","parentId":"root","path":"persist-playground","hasAction":true,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/persist-playground-l0sNRNKZ.js","imports":[],"css":[]},"routes/processes":{"id":"routes/processes","parentId":"root","path":"processes","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/processes-l0sNRNKZ.js","imports":[],"css":[]},"routes/progress":{"id":"routes/progress","parentId":"root","path":"progress","hasAction":true,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/progress-l0sNRNKZ.js","imports":[],"css":[]},"routes/resources+/healthcheck":{"id":"routes/resources+/healthcheck","parentId":"root","path":"resources/healthcheck","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/healthcheck-l0sNRNKZ.js","imports":[],"css":[]},"routes/resources+/lookout":{"id":"routes/resources+/lookout","parentId":"root","path":"resources/lookout","hasAction":true,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/lookout-l0sNRNKZ.js","imports":[],"css":[]},"routes/resources+/offline-video-progress.$playbackId":{"id":"routes/resources+/offline-video-progress.$playbackId","parentId":"root","path":"resources/offline-video-progress/:playbackId","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/offline-video-progress._playbackId-l0sNRNKZ.js","imports":[],"css":[]},"routes/resources+/offline-videos":{"id":"routes/resources+/offline-videos","parentId":"root","path":"resources/offline-videos","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/offline-videos-l0sNRNKZ.js","imports":[],"css":[]},"routes/resources+/offline-videos.$playbackId":{"id":"routes/resources+/offline-videos.$playbackId","parentId":"routes/resources+/offline-videos","path":":playbackId","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/offline-videos._playbackId-l0sNRNKZ.js","imports":[],"css":[]},"routes/robots[.]txt":{"id":"routes/robots[.]txt","parentId":"root","path":"robots.txt","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/robots_._txt-l0sNRNKZ.js","imports":[],"css":[]},"routes/saved-playgrounds":{"id":"routes/saved-playgrounds","parentId":"root","path":"saved-playgrounds","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/saved-playgrounds-l0sNRNKZ.js","imports":[],"css":[]},"routes/set-playground":{"id":"routes/set-playground","parentId":"root","path":"set-playground","hasAction":true,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/set-playground-l0sNRNKZ.js","imports":[],"css":[]},"routes/sitemap[.]xml":{"id":"routes/sitemap[.]xml","parentId":"root","path":"sitemap.xml","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/sitemap_._xml-l0sNRNKZ.js","imports":[],"css":[]},"routes/start":{"id":"routes/start","parentId":"root","path":"start","hasAction":true,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/start-l0sNRNKZ.js","imports":[],"css":[]},"routes/test":{"id":"routes/test","parentId":"root","path":"test","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/test-l0sNRNKZ.js","imports":[],"css":[]},"routes/theme/index":{"id":"routes/theme/index","parentId":"root","path":"theme","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/index-DP2rzg_V.js","imports":[],"css":[]},"routes/video-player/index":{"id":"routes/video-player/index","parentId":"root","path":"video-player","hasAction":true,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/index-K6Dvbx-E.js","imports":[],"css":[]}},"url":"/assets/manifest-a63db2d2.js","version":"a63db2d2"};
|