@epic-web/workshop-app 5.0.0 → 5.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/build/client/assets/{_exerciseNumber-j9COGU-R.js → _exerciseNumber-1JworToC.js} +2 -2
  2. package/build/client/assets/{_exerciseNumber-j9COGU-R.js.map → _exerciseNumber-1JworToC.js.map} +1 -1
  3. package/build/client/assets/{_exerciseNumber_.finished-DDNPeo8x.js → _exerciseNumber_.finished-B4D2ZAmj.js} +2 -2
  4. package/build/client/assets/{_exerciseNumber_.finished-DDNPeo8x.js.map → _exerciseNumber_.finished-B4D2ZAmj.js.map} +1 -1
  5. package/build/client/assets/{_layout-DnttUdzs.js → _layout-CKnDy_9Z.js} +2 -2
  6. package/build/client/assets/{_layout-DnttUdzs.js.map → _layout-CKnDy_9Z.js.map} +1 -1
  7. package/build/client/assets/{diff-BEEJhGiC.js → diff-Cvtc-qzL.js} +2 -2
  8. package/build/client/assets/{diff-BEEJhGiC.js.map → diff-Cvtc-qzL.js.map} +1 -1
  9. package/build/client/assets/{diff-BXHLJqTK.js → diff-jgZ_RGra.js} +2 -2
  10. package/build/client/assets/{diff-BXHLJqTK.js.map → diff-jgZ_RGra.js.map} +1 -1
  11. package/build/client/assets/{epic-video-DZzPuXR8.js → epic-video-yrWoJVFy.js} +122 -122
  12. package/build/client/assets/{epic-video-DZzPuXR8.js.map → epic-video-yrWoJVFy.js.map} +1 -1
  13. package/build/client/assets/{finished-Dop_5v80.js → finished-Ct6I1SZV.js} +2 -2
  14. package/build/client/assets/{finished-Dop_5v80.js.map → finished-Ct6I1SZV.js.map} +1 -1
  15. package/build/client/assets/{index-ZZCxObNp.js → index-Ccssehd9.js} +2 -2
  16. package/build/client/assets/{index-ZZCxObNp.js.map → index-Ccssehd9.js.map} +1 -1
  17. package/build/client/assets/{index-D-l_qaLC.js → index-R-sUGQfT.js} +2 -2
  18. package/build/client/assets/{index-D-l_qaLC.js.map → index-R-sUGQfT.js.map} +1 -1
  19. package/build/client/assets/{manifest-e53d022a.js → manifest-f5f44d87.js} +1 -1
  20. package/build/client/assets/{mdx-DwC5Oacq.js → mdx-CpyquP9i.js} +2 -2
  21. package/build/client/assets/{mdx-DwC5Oacq.js.map → mdx-CpyquP9i.js.map} +1 -1
  22. package/build/client/assets/misc-CxCgA-_O.js.map +1 -1
  23. package/build/client/assets/{onboarding-DE9gclYS.js → onboarding-B7TLVi2l.js} +2 -2
  24. package/build/client/assets/{onboarding-DE9gclYS.js.map → onboarding-B7TLVi2l.js.map} +1 -1
  25. package/build/client/assets/set-playground-DW0yVaNn.js.map +1 -1
  26. package/build/client/assets/{test-N2HloCnX.js → test-DbZkv25C.js} +2 -2
  27. package/build/client/assets/{test-N2HloCnX.js.map → test-DbZkv25C.js.map} +1 -1
  28. package/build/client/assets/{tests-DUg6VXec.js → tests-BR7RFlr5.js} +3 -3
  29. package/build/client/assets/tests-BR7RFlr5.js.map +1 -0
  30. package/build/server/index.js +391 -350
  31. package/build/server/index.js.map +1 -1
  32. package/package.json +4 -4
  33. package/build/client/assets/tests-DUg6VXec.js.map +0 -1
@@ -15,14 +15,14 @@ import fsExtra from "fs-extra";
15
15
  import { LRUCache } from "lru-cache";
16
16
  import md5 from "md5-hex";
17
17
  import { z } from "zod";
18
- import fs$1 from "node:fs";
18
+ import fs from "node:fs";
19
19
  import "@total-typescript/ts-reset";
20
20
  import { execa } from "execa";
21
21
  import { glob } from "glob";
22
22
  import { isGitIgnored, globby } from "globby";
23
23
  import chokidar from "chokidar";
24
24
  import closeWithGrace from "close-with-grace";
25
- import fs from "fs";
25
+ import fs$1 from "fs";
26
26
  import { remarkCodeBlocksShiki } from "@kentcdodds/md-temp";
27
27
  import { bundleMDX } from "mdx-bundler";
28
28
  import PQueue from "p-queue";
@@ -598,210 +598,6 @@ function uniqueUsers(users) {
598
598
  return true;
599
599
  });
600
600
  }
601
- let watcher = global.__change_tracker_watcher__;
602
- function getWatcher() {
603
- if (process.env.EPICSHOP_DEPLOYED ?? process.env.EPICSHOP_ENABLE_WATCHER !== "true") {
604
- return null;
605
- }
606
- if (watcher) return watcher;
607
- const workshopRoot2 = process.env.EPICSHOP_CONTEXT_CWD ?? process.cwd();
608
- watcher = chokidar.watch(workshopRoot2, {
609
- ignoreInitial: true,
610
- ignored: [
611
- "**/.git/**",
612
- "**/node_modules/**",
613
- "**/build/**",
614
- "**/public/build/**",
615
- "**/playwright-report/**",
616
- "**/dist/**",
617
- "**/.cache/**"
618
- ]
619
- });
620
- global.__change_tracker_watcher__ = watcher;
621
- return watcher;
622
- }
623
- function getOptionalWatcher() {
624
- return watcher;
625
- }
626
- (_a = global.__change_tracker_close_with_grace_return__) == null ? void 0 : _a.uninstall();
627
- global.__change_tracker_close_with_grace_return__ = closeWithGrace(
628
- () => watcher == null ? void 0 : watcher.close()
629
- );
630
- function trimCodeBlocks() {
631
- return async function transformer(tree) {
632
- visit(tree, "element", (preNode) => {
633
- if (preNode.tagName !== "pre" || !preNode.children.length) {
634
- return;
635
- }
636
- const codeNode = preNode.children[0];
637
- if (!codeNode || codeNode.type !== "element" || codeNode.tagName !== "code") {
638
- return;
639
- }
640
- const [codeStringNode] = codeNode.children;
641
- if (!codeStringNode) return;
642
- if (codeStringNode.type !== "text") {
643
- console.warn(
644
- `trimCodeBlocks: Unexpected: codeStringNode type is not "text": ${codeStringNode.type}`
645
- );
646
- return;
647
- }
648
- codeStringNode.value = codeStringNode.value.trimEnd();
649
- });
650
- };
651
- }
652
- function removePreContainerDivs() {
653
- return async function preContainerDivsTransformer(tree) {
654
- visit(
655
- tree,
656
- { type: "element", tagName: "pre" },
657
- function visitor(node, index, parent) {
658
- if ((parent == null ? void 0 : parent.type) !== "element") return;
659
- if (parent.tagName !== "div") return;
660
- if (parent.children.length !== 1 && index === 0) return;
661
- Object.assign(parent, node);
662
- }
663
- );
664
- };
665
- }
666
- const rehypePlugins = [
667
- trimCodeBlocks,
668
- remarkCodeBlocksShiki,
669
- removePreContainerDivs
670
- ];
671
- const verboseLog = process.env.EPICSHOP_VERBOSE_LOG === "true" ? console.log : () => {
672
- };
673
- async function compileMdx(file, {
674
- request,
675
- timings,
676
- forceFresh
677
- } = {}) {
678
- const stat = await fs.promises.stat(file).catch((error) => ({ error }));
679
- if ("error" in stat) {
680
- throw new Error(`File stat cannot be read: ${stat.error}`);
681
- }
682
- const key = `file:${file}`;
683
- forceFresh = await shouldForceFresh({ forceFresh, request, key });
684
- const existingCacheEntry = await compiledInstructionMarkdownCache.get(key);
685
- if (!forceFresh && existingCacheEntry) {
686
- const compiledTime = existingCacheEntry.metadata.createdTime;
687
- if (stat.mtimeMs <= compiledTime) {
688
- return existingCacheEntry.value;
689
- }
690
- }
691
- return cachified({
692
- key,
693
- cache: compiledInstructionMarkdownCache,
694
- request,
695
- timings,
696
- forceFresh,
697
- getFreshValue: () => compileMdxImpl(file)
698
- });
699
- }
700
- async function compileMdxImpl(file) {
701
- let title = null;
702
- const epicVideoEmbeds = [];
703
- try {
704
- verboseLog(`Compiling ${file}`);
705
- const bundleResult = await queuedBundleMDX({
706
- file,
707
- cwd: path.dirname(file),
708
- mdxOptions(options) {
709
- options.remarkPlugins = [
710
- ...options.remarkPlugins ?? [],
711
- [remarkAutolinkHeadings, { behavior: "wrap" }],
712
- gfm,
713
- () => (tree) => {
714
- visit(tree, "heading", (node) => {
715
- if (title) return;
716
- if (node.depth === 1) {
717
- visit(node, "text", (textNode) => {
718
- title = textNode.value.trim();
719
- });
720
- }
721
- });
722
- title = title ? title.replace(/^\d+\. /, "").trim() : null;
723
- },
724
- () => (tree) => {
725
- visit(tree, "mdxJsxFlowElement", (jsxEl) => {
726
- if (jsxEl.name !== "EpicVideo") return;
727
- const urlAttr = jsxEl.attributes.find(
728
- // @ts-expect-error no idea why this started being an issue suddenly 🤷‍♂️
729
- (a) => a.type === "mdxJsxAttribute" && a.name === "url"
730
- );
731
- if (!urlAttr) return;
732
- let url = urlAttr.value;
733
- if (typeof url !== "string") return;
734
- if (url.endsWith("/")) url = url.slice(0, -1);
735
- epicVideoEmbeds.push(url);
736
- });
737
- },
738
- emoji
739
- ];
740
- options.rehypePlugins = [
741
- ...options.rehypePlugins ?? [],
742
- ...rehypePlugins
743
- ];
744
- options.mdxExtensions = [".mdx", ".md"];
745
- options.format = "mdx";
746
- options.development = false;
747
- return options;
748
- }
749
- });
750
- if (!bundleResult) throw new Error(`Timeout for file: ${file}`);
751
- const result = { code: bundleResult.code, title, epicVideoEmbeds };
752
- return result;
753
- } catch (error) {
754
- console.error(`Compilation error for file: `, file, error);
755
- throw error;
756
- } finally {
757
- verboseLog(`Successfully compiled ${file}`);
758
- }
759
- }
760
- async function compileMarkdownString(markdownString) {
761
- return cachified({
762
- key: markdownString,
763
- cache: compiledMarkdownCache,
764
- ttl: 1e3 * 60 * 60 * 24,
765
- getFreshValue: async () => {
766
- try {
767
- verboseLog(`Compiling string`, markdownString);
768
- const result = await queuedBundleMDX({
769
- source: markdownString,
770
- mdxOptions(options) {
771
- options.rehypePlugins = [
772
- ...options.rehypePlugins ?? [],
773
- ...rehypePlugins
774
- ];
775
- options.development = false;
776
- return options;
777
- }
778
- });
779
- if (!result) throw new Error(`Timed out compiling markdown string`);
780
- return result.code;
781
- } catch (error) {
782
- console.error(`Compilation error for code: `, markdownString, error);
783
- throw error;
784
- } finally {
785
- verboseLog(`Successfully compiled string`, markdownString);
786
- }
787
- }
788
- });
789
- }
790
- let _queue = null;
791
- async function getQueue() {
792
- if (_queue) return _queue;
793
- _queue = new PQueue({
794
- concurrency: 1,
795
- throwOnTimeout: true,
796
- timeout: 1e3 * 60
797
- });
798
- return _queue;
799
- }
800
- async function queuedBundleMDX(...args) {
801
- const queue = await getQueue();
802
- const result = await queue.add(() => bundleMDX(...args));
803
- return result;
804
- }
805
601
  const workshopRoot$1 = process.env.EPICSHOP_CONTEXT_CWD ?? process.cwd();
806
602
  const StackBlitzConfigSchema = z.object({
807
603
  // we default this to `${exerciseTitle} (${type})`
@@ -876,7 +672,7 @@ function getWorkshopConfig() {
876
672
  const packageJsonPath = path$1.join(workshopRoot$1, "package.json");
877
673
  let packageJson;
878
674
  try {
879
- const packageJsonContent = fs$1.readFileSync(packageJsonPath, "utf8");
675
+ const packageJsonContent = fs.readFileSync(packageJsonPath, "utf8");
880
676
  packageJson = JSON.parse(packageJsonContent);
881
677
  } catch (error) {
882
678
  console.error(`Error reading or parsing package.json:`, error);
@@ -955,10 +751,10 @@ async function getAppConfig(fullPath) {
955
751
  let epicshopConfig = {};
956
752
  let scripts = {};
957
753
  const packageJsonPath = path$1.join(fullPath, "package.json");
958
- const packageJsonExists = await fs$1.promises.access(packageJsonPath, fs$1.constants.F_OK).then(() => true).catch(() => false);
754
+ const packageJsonExists = await fs.promises.access(packageJsonPath, fs.constants.F_OK).then(() => true).catch(() => false);
959
755
  if (packageJsonExists) {
960
756
  const pkg = JSON.parse(
961
- await fs$1.promises.readFile(path$1.join(fullPath, "package.json"), "utf8")
757
+ await fs.promises.readFile(path$1.join(fullPath, "package.json"), "utf8")
962
758
  );
963
759
  epicshopConfig = pkg.epicshop ?? {};
964
760
  scripts = pkg.scripts ?? {};
@@ -1005,6 +801,241 @@ ${errorMessages.join("\n")}`
1005
801
  throw error;
1006
802
  }
1007
803
  }
804
+ let watcher = global.__change_tracker_watcher__;
805
+ const dirsToWatch = [
806
+ path.join(workshopRoot$1, "playground"),
807
+ path.join(workshopRoot$1, "exercises"),
808
+ path.join(workshopRoot$1, "examples")
809
+ ];
810
+ const ignoredDirs = [
811
+ "/.git",
812
+ "/node_modules",
813
+ "/build",
814
+ "/server-build",
815
+ "/public/build",
816
+ "/playwright-report",
817
+ "/dist",
818
+ "/.cache"
819
+ ];
820
+ function getWatcher() {
821
+ if (process.env.EPICSHOP_DEPLOYED ?? process.env.EPICSHOP_ENABLE_WATCHER !== "true") {
822
+ return void 0;
823
+ }
824
+ if (watcher) return watcher;
825
+ watcher = chokidar.watch(dirsToWatch, {
826
+ ignoreInitial: true,
827
+ ignored(path2, stat) {
828
+ return (stat == null ? void 0 : stat.isDirectory()) ? ignoredDirs.some((dir) => path2.endsWith(dir)) : false;
829
+ }
830
+ });
831
+ global.__change_tracker_watcher__ = watcher;
832
+ return watcher;
833
+ }
834
+ let currentWithoutWatcher = null;
835
+ async function withoutWatcher(fn) {
836
+ if (!watcher) return fn();
837
+ let thisWithoutWatcher = currentWithoutWatcher = Symbol("withoutWatcher");
838
+ const eventNames = watcher.eventNames();
839
+ const eventNamesToListenersMap = {};
840
+ for (const eventName of eventNames) {
841
+ if (typeof eventName === "string") {
842
+ eventNamesToListenersMap[eventName] = watcher.listeners(eventName);
843
+ }
844
+ }
845
+ watcher.removeAllListeners();
846
+ try {
847
+ const result = await fn();
848
+ return result;
849
+ } finally {
850
+ if (currentWithoutWatcher === thisWithoutWatcher) {
851
+ await new Promise((r) => setTimeout(r, 100));
852
+ for (const eventName of eventNames) {
853
+ if (typeof eventName === "string") {
854
+ const listeners = eventNamesToListenersMap[eventName] || [];
855
+ for (const listener of listeners) {
856
+ watcher.on(eventName, listener);
857
+ }
858
+ }
859
+ }
860
+ }
861
+ }
862
+ }
863
+ (_a = global.__change_tracker_close_with_grace_return__) == null ? void 0 : _a.uninstall();
864
+ global.__change_tracker_close_with_grace_return__ = closeWithGrace(
865
+ () => watcher == null ? void 0 : watcher.close()
866
+ );
867
+ function trimCodeBlocks() {
868
+ return async function transformer(tree) {
869
+ visit(tree, "element", (preNode) => {
870
+ if (preNode.tagName !== "pre" || !preNode.children.length) {
871
+ return;
872
+ }
873
+ const codeNode = preNode.children[0];
874
+ if (!codeNode || codeNode.type !== "element" || codeNode.tagName !== "code") {
875
+ return;
876
+ }
877
+ const [codeStringNode] = codeNode.children;
878
+ if (!codeStringNode) return;
879
+ if (codeStringNode.type !== "text") {
880
+ console.warn(
881
+ `trimCodeBlocks: Unexpected: codeStringNode type is not "text": ${codeStringNode.type}`
882
+ );
883
+ return;
884
+ }
885
+ codeStringNode.value = codeStringNode.value.trimEnd();
886
+ });
887
+ };
888
+ }
889
+ function removePreContainerDivs() {
890
+ return async function preContainerDivsTransformer(tree) {
891
+ visit(
892
+ tree,
893
+ { type: "element", tagName: "pre" },
894
+ function visitor(node, index, parent) {
895
+ if ((parent == null ? void 0 : parent.type) !== "element") return;
896
+ if (parent.tagName !== "div") return;
897
+ if (parent.children.length !== 1 && index === 0) return;
898
+ Object.assign(parent, node);
899
+ }
900
+ );
901
+ };
902
+ }
903
+ const rehypePlugins = [
904
+ trimCodeBlocks,
905
+ remarkCodeBlocksShiki,
906
+ removePreContainerDivs
907
+ ];
908
+ const verboseLog = process.env.EPICSHOP_VERBOSE_LOG === "true" ? console.log : () => {
909
+ };
910
+ async function compileMdx(file, {
911
+ request,
912
+ timings,
913
+ forceFresh
914
+ } = {}) {
915
+ const stat = await fs$1.promises.stat(file).catch((error) => ({ error }));
916
+ if ("error" in stat) {
917
+ throw new Error(`File stat cannot be read: ${stat.error}`);
918
+ }
919
+ const key = `file:${file}`;
920
+ forceFresh = await shouldForceFresh({ forceFresh, request, key });
921
+ const existingCacheEntry = await compiledInstructionMarkdownCache.get(key);
922
+ if (!forceFresh && existingCacheEntry) {
923
+ forceFresh = stat.mtimeMs > existingCacheEntry.metadata.createdTime;
924
+ }
925
+ return cachified({
926
+ key,
927
+ cache: compiledInstructionMarkdownCache,
928
+ request,
929
+ timings,
930
+ forceFresh,
931
+ getFreshValue: () => compileMdxImpl(file)
932
+ });
933
+ }
934
+ async function compileMdxImpl(file) {
935
+ let title = null;
936
+ const epicVideoEmbeds = [];
937
+ try {
938
+ verboseLog(`Compiling ${file}`);
939
+ const bundleResult = await queuedBundleMDX({
940
+ file,
941
+ cwd: path.dirname(file),
942
+ mdxOptions(options) {
943
+ options.remarkPlugins = [
944
+ ...options.remarkPlugins ?? [],
945
+ [remarkAutolinkHeadings, { behavior: "wrap" }],
946
+ gfm,
947
+ () => (tree) => {
948
+ visit(tree, "heading", (node) => {
949
+ if (title) return;
950
+ if (node.depth === 1) {
951
+ visit(node, "text", (textNode) => {
952
+ title = textNode.value.trim();
953
+ });
954
+ }
955
+ });
956
+ title = title ? title.replace(/^\d+\. /, "").trim() : null;
957
+ },
958
+ () => (tree) => {
959
+ visit(tree, "mdxJsxFlowElement", (jsxEl) => {
960
+ if (jsxEl.name !== "EpicVideo") return;
961
+ const urlAttr = jsxEl.attributes.find(
962
+ // @ts-expect-error no idea why this started being an issue suddenly 🤷‍♂️
963
+ (a) => a.type === "mdxJsxAttribute" && a.name === "url"
964
+ );
965
+ if (!urlAttr) return;
966
+ let url = urlAttr.value;
967
+ if (typeof url !== "string") return;
968
+ if (url.endsWith("/")) url = url.slice(0, -1);
969
+ epicVideoEmbeds.push(url);
970
+ });
971
+ },
972
+ emoji
973
+ ];
974
+ options.rehypePlugins = [
975
+ ...options.rehypePlugins ?? [],
976
+ ...rehypePlugins
977
+ ];
978
+ options.mdxExtensions = [".mdx", ".md"];
979
+ options.format = "mdx";
980
+ options.development = false;
981
+ return options;
982
+ }
983
+ });
984
+ if (!bundleResult) throw new Error(`Timeout for file: ${file}`);
985
+ const result = { code: bundleResult.code, title, epicVideoEmbeds };
986
+ return result;
987
+ } catch (error) {
988
+ console.error(`Compilation error for file: `, file, error);
989
+ throw error;
990
+ } finally {
991
+ verboseLog(`Successfully compiled ${file}`);
992
+ }
993
+ }
994
+ async function compileMarkdownString(markdownString) {
995
+ return cachified({
996
+ key: markdownString,
997
+ cache: compiledMarkdownCache,
998
+ ttl: 1e3 * 60 * 60 * 24,
999
+ getFreshValue: async () => {
1000
+ try {
1001
+ verboseLog(`Compiling string`, markdownString);
1002
+ const result = await queuedBundleMDX({
1003
+ source: markdownString,
1004
+ mdxOptions(options) {
1005
+ options.rehypePlugins = [
1006
+ ...options.rehypePlugins ?? [],
1007
+ ...rehypePlugins
1008
+ ];
1009
+ options.development = false;
1010
+ return options;
1011
+ }
1012
+ });
1013
+ if (!result) throw new Error(`Timed out compiling markdown string`);
1014
+ return result.code;
1015
+ } catch (error) {
1016
+ console.error(`Compilation error for code: `, markdownString, error);
1017
+ throw error;
1018
+ } finally {
1019
+ verboseLog(`Successfully compiled string`, markdownString);
1020
+ }
1021
+ }
1022
+ });
1023
+ }
1024
+ let _queue = null;
1025
+ async function getQueue() {
1026
+ if (_queue) return _queue;
1027
+ _queue = new PQueue({
1028
+ concurrency: 1,
1029
+ throwOnTimeout: true,
1030
+ timeout: 1e3 * 60
1031
+ });
1032
+ return _queue;
1033
+ }
1034
+ async function queuedBundleMDX(...args) {
1035
+ const queue = await getQueue();
1036
+ const result = await queue.add(() => bundleMDX(...args));
1037
+ return result;
1038
+ }
1008
1039
  const schema = z.object({
1009
1040
  NODE_ENV: z.enum(["production", "development", "test"]).default("development"),
1010
1041
  EPICSHOP_GITHUB_REPO: z.string(),
@@ -1403,7 +1434,7 @@ function isExerciseStepApp(app) {
1403
1434
  return isProblemApp(app) || isSolutionApp(app);
1404
1435
  }
1405
1436
  function exists(file) {
1406
- return fs$1.promises.access(file, fs$1.constants.F_OK).then(
1437
+ return fs.promises.access(file, fs.constants.F_OK).then(
1407
1438
  () => true,
1408
1439
  () => false
1409
1440
  );
@@ -1426,19 +1457,19 @@ function init() {
1426
1457
  process.env.EPICSHOP_GITHUB_ROOT = config.githubRoot;
1427
1458
  init$1();
1428
1459
  global.ENV = getEnv();
1429
- async function handleFileChanges(event, filePath) {
1430
- if (filePath === path$1.join(workshopRoot, "package.json")) {
1431
- bustWorkshopConfigCache();
1432
- }
1433
- const apps = await getApps();
1434
- for (const app of apps) {
1435
- if (filePath.startsWith(app.fullPath)) {
1436
- modifiedTimes.set(app.fullPath, Date.now());
1437
- break;
1438
- }
1460
+ (_a2 = getWatcher()) == null ? void 0 : _a2.on("all", handleFileChanges);
1461
+ }
1462
+ async function handleFileChanges(event, filePath) {
1463
+ if (filePath === path$1.join(workshopRoot, "package.json")) {
1464
+ bustWorkshopConfigCache();
1465
+ }
1466
+ const apps = await getApps();
1467
+ for (const app of apps) {
1468
+ if (filePath.startsWith(app.fullPath)) {
1469
+ modifiedTimes.set(app.fullPath, Date.now());
1470
+ break;
1439
1471
  }
1440
1472
  }
1441
- (_a2 = getWatcher()) == null ? void 0 : _a2.on("all", handleFileChanges);
1442
1473
  }
1443
1474
  function getForceFresh$1(cacheEntry) {
1444
1475
  if (!cacheEntry) return true;
@@ -1463,7 +1494,7 @@ function getForceFreshForDir(cacheEntry, ...dirs) {
1463
1494
  }
1464
1495
  async function readDir(dir) {
1465
1496
  if (await exists(dir)) {
1466
- return fs$1.promises.readdir(dir);
1497
+ return fs.promises.readdir(dir);
1467
1498
  }
1468
1499
  return [];
1469
1500
  }
@@ -1715,7 +1746,7 @@ async function findSolutionDir({
1715
1746
  const { stepNumber } = info;
1716
1747
  const paddedStepNumber = stepNumber.toString().padStart(2, "0");
1717
1748
  const parentDir = path$1.dirname(fullPath);
1718
- const siblingDirs = await fs$1.promises.readdir(parentDir);
1749
+ const siblingDirs = await fs.promises.readdir(parentDir);
1719
1750
  const solutionDir = siblingDirs.find(
1720
1751
  (dir) => dir.startsWith(`${paddedStepNumber}.solution`)
1721
1752
  );
@@ -1742,7 +1773,7 @@ async function findProblemDir({
1742
1773
  const { stepNumber } = info;
1743
1774
  const paddedStepNumber = stepNumber.toString().padStart(2, "0");
1744
1775
  const parentDir = path$1.dirname(fullPath);
1745
- const siblingDirs = await fs$1.promises.readdir(parentDir);
1776
+ const siblingDirs = await fs.promises.readdir(parentDir);
1746
1777
  const problemDir = siblingDirs.find(
1747
1778
  (dir) => dir.endsWith("problem") && dir.includes(paddedStepNumber)
1748
1779
  );
@@ -1769,7 +1800,7 @@ async function getTestInfo({
1769
1800
  return { type: "script", script: testScript };
1770
1801
  }
1771
1802
  const testAppFullPath = await findSolutionDir({ fullPath }) ?? fullPath;
1772
- const dirList = await fs$1.promises.readdir(testAppFullPath);
1803
+ const dirList = await fs.promises.readdir(testAppFullPath);
1773
1804
  const testFiles = dirList.filter((item) => item.includes(".test."));
1774
1805
  if (testFiles.length) {
1775
1806
  return {
@@ -2149,111 +2180,111 @@ async function getAppFromFile(filePath) {
2149
2180
  return apps.find((app) => filePath.startsWith(app.fullPath));
2150
2181
  }
2151
2182
  async function setPlayground(srcDir, { reset } = {}) {
2152
- var _a2, _b;
2153
- const isIgnored = await isGitIgnored({ cwd: srcDir });
2183
+ var _a2;
2154
2184
  const destDir = path$1.join(workshopRoot, "playground");
2155
- const playgroundFiles = path$1.join(destDir, "**");
2156
- (_a2 = getOptionalWatcher()) == null ? void 0 : _a2.unwatch(playgroundFiles);
2157
- const playgroundApp = await getAppByName("playground");
2158
- const playgroundWasRunning = playgroundApp ? isAppRunning(playgroundApp) : false;
2159
- if (playgroundApp && reset) {
2160
- await closeProcess(playgroundApp.name);
2161
- await fsExtra.remove(destDir);
2162
- }
2163
- const setPlaygroundTimestamp = Date.now();
2164
- const preSetPlaygroundPath = await firstToExist(
2165
- path$1.join(srcDir, "epicshop", "pre-set-playground.js"),
2166
- path$1.join(workshopRoot, "epicshop", "pre-set-playground.js")
2167
- );
2168
- if (preSetPlaygroundPath) {
2169
- await execa("node", [preSetPlaygroundPath], {
2170
- cwd: workshopRoot,
2171
- stdio: "inherit",
2172
- env: {
2173
- EPICSHOP_PLAYGROUND_TIMESTAMP: setPlaygroundTimestamp.toString(),
2174
- EPICSHOP_PLAYGROUND_DEST_DIR: destDir,
2175
- EPICSHOP_PLAYGROUND_SRC_DIR: srcDir,
2176
- EPICSHOP_PLAYGROUND_WAS_RUNNING: playgroundWasRunning.toString()
2185
+ await withoutWatcher(async () => {
2186
+ const isIgnored = await isGitIgnored({ cwd: srcDir });
2187
+ const playgroundApp = await getAppByName("playground");
2188
+ const playgroundWasRunning = playgroundApp ? isAppRunning(playgroundApp) : false;
2189
+ if (playgroundApp && reset) {
2190
+ await closeProcess(playgroundApp.name);
2191
+ await fsExtra.remove(destDir);
2192
+ }
2193
+ const setPlaygroundTimestamp = Date.now();
2194
+ const preSetPlaygroundPath = await firstToExist(
2195
+ path$1.join(srcDir, "epicshop", "pre-set-playground.js"),
2196
+ path$1.join(workshopRoot, "epicshop", "pre-set-playground.js")
2197
+ );
2198
+ if (preSetPlaygroundPath) {
2199
+ await execa("node", [preSetPlaygroundPath], {
2200
+ cwd: workshopRoot,
2201
+ stdio: "inherit",
2202
+ env: {
2203
+ EPICSHOP_PLAYGROUND_TIMESTAMP: setPlaygroundTimestamp.toString(),
2204
+ EPICSHOP_PLAYGROUND_DEST_DIR: destDir,
2205
+ EPICSHOP_PLAYGROUND_SRC_DIR: srcDir,
2206
+ EPICSHOP_PLAYGROUND_WAS_RUNNING: playgroundWasRunning.toString()
2207
+ }
2208
+ });
2209
+ }
2210
+ const basename2 = path$1.basename(srcDir);
2211
+ await fsExtra.remove(path$1.join(destDir, "node_modules"));
2212
+ await fsExtra.copy(srcDir, destDir, {
2213
+ filter: async (srcFile, destFile) => {
2214
+ if (srcFile.includes(`${basename2}${path$1.sep}build`) || srcFile.includes(`${basename2}${path$1.sep}public${path$1.sep}build`)) {
2215
+ return false;
2216
+ }
2217
+ if (srcFile === srcDir) return true;
2218
+ if (srcFile.includes("node_modules")) return true;
2219
+ if (srcFile.endsWith(".env")) return true;
2220
+ if (isIgnored(srcFile)) return false;
2221
+ try {
2222
+ const isDir = (await fsExtra.stat(srcFile)).isDirectory();
2223
+ if (isDir) return true;
2224
+ const destIsDir = (await fsExtra.stat(destFile)).isDirectory();
2225
+ if (destIsDir) return true;
2226
+ const currentContents = await fsExtra.readFile(destFile);
2227
+ const newContents = await fsExtra.readFile(srcFile);
2228
+ if (currentContents.equals(newContents)) return false;
2229
+ return true;
2230
+ } catch {
2231
+ return true;
2232
+ }
2177
2233
  }
2178
2234
  });
2179
- }
2180
- const basename2 = path$1.basename(srcDir);
2181
- await fsExtra.remove(path$1.join(destDir, "node_modules"));
2182
- await fsExtra.copy(srcDir, destDir, {
2183
- filter: async (srcFile, destFile) => {
2184
- if (srcFile.includes(`${basename2}${path$1.sep}build`) || srcFile.includes(`${basename2}${path$1.sep}public${path$1.sep}build`)) {
2185
- return false;
2186
- }
2187
- if (srcFile === srcDir) return true;
2188
- if (srcFile.includes("node_modules")) return true;
2189
- if (srcFile.endsWith(".env")) return true;
2190
- if (isIgnored(srcFile)) return false;
2191
- try {
2192
- const isDir = (await fsExtra.stat(srcFile)).isDirectory();
2193
- if (isDir) return true;
2194
- const destIsDir = (await fsExtra.stat(destFile)).isDirectory();
2195
- if (destIsDir) return true;
2196
- const currentContents = await fsExtra.readFile(destFile);
2197
- const newContents = await fsExtra.readFile(srcFile);
2198
- if (currentContents.equals(newContents)) return false;
2199
- return true;
2200
- } catch {
2201
- return true;
2202
- }
2235
+ async function getFiles(dir) {
2236
+ const dirPath = dir.replace(/\\/g, "/");
2237
+ const files = await globby([`${dirPath}/**/*`, "!**/build/**/*"], {
2238
+ onlyFiles: false,
2239
+ dot: true
2240
+ });
2241
+ return files.map((f) => f.replace(dirPath, ""));
2242
+ }
2243
+ const srcFiles = await getFiles(srcDir);
2244
+ const destFiles = await getFiles(destDir);
2245
+ const filesToDelete = destFiles.filter(
2246
+ (fileName) => !srcFiles.includes(fileName)
2247
+ );
2248
+ for (const fileToDelete of filesToDelete) {
2249
+ await fsExtra.remove(path$1.join(destDir, fileToDelete));
2250
+ }
2251
+ const appName = getAppName(srcDir);
2252
+ await fsExtra.ensureDir(path$1.dirname(playgroundAppNameInfoPath));
2253
+ await fsExtra.writeJSON(playgroundAppNameInfoPath, { appName });
2254
+ const playgroundIsStillRunning = playgroundApp ? isAppRunning(playgroundApp) : false;
2255
+ const restartPlayground = playgroundWasRunning && !playgroundIsStillRunning;
2256
+ const postSetPlaygroundPath = await firstToExist(
2257
+ path$1.join(srcDir, "epicshop", "post-set-playground.js"),
2258
+ path$1.join(workshopRoot, "epicshop", "post-set-playground.js")
2259
+ );
2260
+ if (postSetPlaygroundPath) {
2261
+ await execa("node", [postSetPlaygroundPath], {
2262
+ cwd: workshopRoot,
2263
+ stdio: "inherit",
2264
+ env: {
2265
+ EPICSHOP_PLAYGROUND_TIMESTAMP: setPlaygroundTimestamp.toString(),
2266
+ EPICSHOP_PLAYGROUND_SRC_DIR: srcDir,
2267
+ EPICSHOP_PLAYGROUND_DEST_DIR: destDir,
2268
+ EPICSHOP_PLAYGROUND_WAS_RUNNING: playgroundWasRunning.toString(),
2269
+ EPICSHOP_PLAYGROUND_IS_STILL_RUNNING: playgroundIsStillRunning.toString(),
2270
+ EPICSHOP_PLAYGROUND_RESTART_PLAYGROUND: restartPlayground.toString()
2271
+ }
2272
+ });
2273
+ }
2274
+ modifiedTimes.set(destDir, Date.now());
2275
+ if (playgroundApp && restartPlayground) {
2276
+ await runAppDev(playgroundApp);
2277
+ await waitOnApp(playgroundApp);
2203
2278
  }
2204
2279
  });
2205
- async function getFiles(dir) {
2206
- const dirPath = dir.replace(/\\/g, "/");
2207
- const files = await globby([`${dirPath}/**/*`, "!**/build/**/*"], {
2208
- onlyFiles: false,
2209
- dot: true
2210
- });
2211
- return files.map((f) => f.replace(dirPath, ""));
2212
- }
2213
- const srcFiles = await getFiles(srcDir);
2214
- const destFiles = await getFiles(destDir);
2215
- const filesToDelete = destFiles.filter(
2216
- (fileName) => !srcFiles.includes(fileName)
2217
- );
2218
- for (const fileToDelete of filesToDelete) {
2219
- await fsExtra.remove(path$1.join(destDir, fileToDelete));
2220
- }
2221
- const appName = getAppName(srcDir);
2222
- await fsExtra.ensureDir(path$1.dirname(playgroundAppNameInfoPath));
2223
- await fsExtra.writeJSON(playgroundAppNameInfoPath, { appName });
2224
- const playgroundIsStillRunning = playgroundApp ? isAppRunning(playgroundApp) : false;
2225
- const restartPlayground = playgroundWasRunning && !playgroundIsStillRunning;
2226
- const postSetPlaygroundPath = await firstToExist(
2227
- path$1.join(srcDir, "epicshop", "post-set-playground.js"),
2228
- path$1.join(workshopRoot, "epicshop", "post-set-playground.js")
2229
- );
2230
- if (postSetPlaygroundPath) {
2231
- await execa("node", [postSetPlaygroundPath], {
2232
- cwd: workshopRoot,
2233
- stdio: "inherit",
2234
- env: {
2235
- EPICSHOP_PLAYGROUND_TIMESTAMP: setPlaygroundTimestamp.toString(),
2236
- EPICSHOP_PLAYGROUND_SRC_DIR: srcDir,
2237
- EPICSHOP_PLAYGROUND_DEST_DIR: destDir,
2238
- EPICSHOP_PLAYGROUND_WAS_RUNNING: playgroundWasRunning.toString(),
2239
- EPICSHOP_PLAYGROUND_IS_STILL_RUNNING: playgroundIsStillRunning.toString(),
2240
- EPICSHOP_PLAYGROUND_RESTART_PLAYGROUND: restartPlayground.toString()
2241
- }
2242
- });
2243
- }
2244
- if (playgroundApp && restartPlayground) {
2245
- await runAppDev(playgroundApp);
2246
- await waitOnApp(playgroundApp);
2247
- }
2248
- (_b = getOptionalWatcher()) == null ? void 0 : _b.add(playgroundFiles);
2249
- modifiedTimes.set(destDir, Date.now());
2280
+ (_a2 = getWatcher()) == null ? void 0 : _a2.emit("all", "playground", destDir);
2250
2281
  }
2251
2282
  async function getPlaygroundAppName() {
2252
2283
  if (!await exists(playgroundAppNameInfoPath)) {
2253
2284
  return null;
2254
2285
  }
2255
2286
  try {
2256
- const jsonString = await fs$1.promises.readFile(
2287
+ const jsonString = await fs.promises.readFile(
2257
2288
  playgroundAppNameInfoPath,
2258
2289
  "utf8"
2259
2290
  );
@@ -2266,7 +2297,7 @@ async function getPlaygroundAppName() {
2266
2297
  }
2267
2298
  async function getDirModifiedTime(dir) {
2268
2299
  const isIgnored = await isGitIgnored({ cwd: dir });
2269
- const files = await fs$1.promises.readdir(dir, { withFileTypes: true });
2300
+ const files = await fs.promises.readdir(dir, { withFileTypes: true });
2270
2301
  const modifiedTimes2 = await Promise.all(
2271
2302
  files.map(async (file) => {
2272
2303
  if (isIgnored(file.name)) return 0;
@@ -2275,7 +2306,7 @@ async function getDirModifiedTime(dir) {
2275
2306
  return getDirModifiedTime(filePath);
2276
2307
  } else {
2277
2308
  try {
2278
- const { mtimeMs } = await fs$1.promises.stat(filePath);
2309
+ const { mtimeMs } = await fs.promises.stat(filePath);
2279
2310
  return mtimeMs;
2280
2311
  } catch {
2281
2312
  return 0;
@@ -5805,7 +5836,7 @@ async function compileTs(filePath, fullPath, {
5805
5836
  getFreshValue: async () => {
5806
5837
  const result = await esbuild.build({
5807
5838
  stdin: {
5808
- contents: await fs.promises.readFile(filePath, "utf-8"),
5839
+ contents: await fs$1.promises.readFile(filePath, "utf-8"),
5809
5840
  // NOTE: if the fileAppName is specified, then we're resolving to a different
5810
5841
  // app than the one we're serving the file from. We do this so the tests
5811
5842
  // can live in the solution directory, but be run against the problem
@@ -6475,13 +6506,24 @@ function usePlayerPreferences() {
6475
6506
  return ((_a2 = data == null ? void 0 : data.preferences) == null ? void 0 : _a2.player) ?? null;
6476
6507
  }
6477
6508
  const ignoredInputs = [
6478
- "input",
6479
- "select",
6480
- "button",
6481
- "textarea",
6482
- "mux-player",
6483
- "summary"
6509
+ "INPUT",
6510
+ "SELECT",
6511
+ "BUTTON",
6512
+ "TEXTAREA",
6513
+ "MUX-PLAYER",
6514
+ "SUMMARY"
6484
6515
  ];
6516
+ const ignoredRoles = ["button", "option", "combobox", "tab", "tablist"];
6517
+ function shouldIgnoreHotkey(el) {
6518
+ let current = el;
6519
+ while (current) {
6520
+ if (!(current instanceof HTMLElement)) return false;
6521
+ const isIgnored = ignoredInputs.includes(current.tagName) || ignoredRoles.includes(current.getAttribute("role") || "") || current.isContentEditable;
6522
+ if (isIgnored) return true;
6523
+ current = current.parentElement;
6524
+ }
6525
+ return false;
6526
+ }
6485
6527
  async function action$7({ request }) {
6486
6528
  const result = PlayerPreferencesSchema.safeParse(await request.json());
6487
6529
  if (!result.success) {
@@ -6526,24 +6568,23 @@ function MuxPlayer({
6526
6568
  function handleUserKeyPress(e) {
6527
6569
  if (!muxPlayerRef.current) return;
6528
6570
  const activeElement = document.activeElement;
6529
- const isContentEditable = activeElement instanceof HTMLElement ? activeElement.contentEditable === "true" : false;
6530
- if (activeElement && !ignoredInputs.includes(activeElement.tagName.toLowerCase()) && !isContentEditable) {
6531
- if (e.key === " ") {
6532
- e.preventDefault();
6533
- void (muxPlayerRef.current.paused ? muxPlayerRef.current.play() : muxPlayerRef.current.pause());
6534
- }
6535
- if (e.key === "ArrowRight") {
6536
- e.preventDefault();
6537
- muxPlayerRef.current.currentTime = muxPlayerRef.current.currentTime + (muxPlayerRef.current.forwardSeekOffset || 10);
6538
- }
6539
- if (e.key === "ArrowLeft") {
6540
- e.preventDefault();
6541
- muxPlayerRef.current.currentTime = muxPlayerRef.current.currentTime - (muxPlayerRef.current.forwardSeekOffset || 10);
6542
- }
6543
- if (e.key === "f" && !e.metaKey && !e.ctrlKey) {
6544
- e.preventDefault();
6545
- void (document.fullscreenElement ? document.exitFullscreen() : muxPlayerRef.current.requestFullscreen());
6546
- }
6571
+ if (shouldIgnoreHotkey(activeElement)) return;
6572
+ if (shouldIgnoreHotkey(e.target)) return;
6573
+ if (e.key === " ") {
6574
+ e.preventDefault();
6575
+ void (muxPlayerRef.current.paused ? muxPlayerRef.current.play() : muxPlayerRef.current.pause());
6576
+ }
6577
+ if (e.key === "ArrowRight") {
6578
+ e.preventDefault();
6579
+ muxPlayerRef.current.currentTime = muxPlayerRef.current.currentTime + (muxPlayerRef.current.forwardSeekOffset || 10);
6580
+ }
6581
+ if (e.key === "ArrowLeft") {
6582
+ e.preventDefault();
6583
+ muxPlayerRef.current.currentTime = muxPlayerRef.current.currentTime - (muxPlayerRef.current.forwardSeekOffset || 10);
6584
+ }
6585
+ if (e.key === "f" && !e.metaKey && !e.ctrlKey) {
6586
+ e.preventDefault();
6587
+ void (document.fullscreenElement ? document.exitFullscreen() : muxPlayerRef.current.requestFullscreen());
6547
6588
  }
6548
6589
  }
6549
6590
  window.document.addEventListener("keydown", handleUserKeyPress);
@@ -7390,7 +7431,7 @@ async function launchEditor(pathList, lineNumber = 1, colNumber = 1) {
7390
7431
  )) {
7391
7432
  acc.errorsList.push(fileName);
7392
7433
  } else {
7393
- if (!fs.existsSync(fileName)) {
7434
+ if (!fs$1.existsSync(fileName)) {
7394
7435
  fsExtra.ensureDirSync(path.dirname(fileName));
7395
7436
  fsExtra.writeFileSync(fileName, "", "utf8");
7396
7437
  }
@@ -8631,7 +8672,7 @@ async function action$5({ request }) {
8631
8672
  const apps = await getApps({ forceFresh: true });
8632
8673
  const playground = apps.find(isPlaygroundApp);
8633
8674
  if (playground && converseApp) {
8634
- await getDiffCode(playground, converseApp, { forceFresh: true });
8675
+ void getDiffCode(playground, converseApp, { forceFresh: true });
8635
8676
  }
8636
8677
  return jsonWithPE(formData, { status: "success" });
8637
8678
  }
@@ -10734,7 +10775,7 @@ function InBrowserTestRunner({
10734
10775
  };
10735
10776
  }, []);
10736
10777
  const statusEmoji = {
10737
- pending: /* @__PURE__ */ jsx(AnimatedBars, { "aria-label": "Pending" }),
10778
+ pending: /* @__PURE__ */ jsx(AnimatedBars, { size: 14, "aria-label": "Pending" }),
10738
10779
  pass: /* @__PURE__ */ jsx(
10739
10780
  Icon,
10740
10781
  {
@@ -13226,7 +13267,7 @@ const route39 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePrope
13226
13267
  __proto__: null,
13227
13268
  loader
13228
13269
  }, Symbol.toStringTag, { value: "Module" }));
13229
- const serverManifest = { "entry": { "module": "/assets/entry.client-3M2p-8I3.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js"], "css": [] }, "routes": { "root": { "id": "root", "parentId": void 0, "path": "", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/root-9wVBEzOq.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-CxCgA-_O.js", "/assets/request-info-CEhUGODY.js", "/assets/tooltip-kD4kSf1i.js", "/assets/pe-CUZaIcdt.js", "/assets/error-boundary-COkPRBOZ.js", "/assets/progress-bar-D3kudPcr.js", "/assets/index-B-hHvmeV.js", "/assets/index-YNIH4TH8.js", "/assets/presence-Cr--lRCr.js", "/assets/seo-pBpFCWsy.js"], "css": [] }, "routes/$": { "id": "routes/$", "parentId": "root", "path": "*", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/_-D0Tgngwe.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-CxCgA-_O.js", "/assets/error-boundary-COkPRBOZ.js"], "css": [] }, "routes/_app+/_layout": { "id": "routes/_app+/_layout", "parentId": "root", "path": void 0, "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_layout-BPwIOXxN.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-CxCgA-_O.js", "/assets/request-info-CEhUGODY.js", "/assets/tooltip-kD4kSf1i.js", "/assets/pe-CUZaIcdt.js", "/assets/index-YNIH4TH8.js", "/assets/workshop-config-CL4F08kr.js", "/assets/product-BAWG1Vut.js", "/assets/index-CXyf3Reb.js", "/assets/user-DvujSs-t.js", "/assets/presence-Cr--lRCr.js", "/assets/progress-BFm2U-l5.js"], "css": [] }, "routes/_app+/account": { "id": "routes/_app+/account", "parentId": "routes/_app+/_layout", "path": "account", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/account-BatJhmSV.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-CxCgA-_O.js", "/assets/request-info-CEhUGODY.js", "/assets/button-EE0aPg10.js", "/assets/tooltip-kD4kSf1i.js", "/assets/user-DvujSs-t.js", "/assets/presence-Cr--lRCr.js"], "css": [] }, "routes/_app+/app.$appName+/$": { "id": "routes/_app+/app.$appName+/$", "parentId": "routes/_app+/_layout", "path": "app/:appName/*", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/app.$appName+/api.$": { "id": "routes/_app+/app.$appName+/api.$", "parentId": "routes/_app+/_layout", "path": "app/:appName/api/*", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/api._-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/app.$appName+/epic_ws[.js]": { "id": "routes/_app+/app.$appName+/epic_ws[.js]", "parentId": "routes/_app+/_layout", "path": "app/:appName/epic_ws.js", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/epic_ws_.js_-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/app.$appName+/index": { "id": "routes/_app+/app.$appName+/index", "parentId": "routes/_app+/_layout", "path": "app/:appName/", "index": true, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/index-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/app.$appName+/test.$testName": { "id": "routes/_app+/app.$appName+/test.$testName", "parentId": "routes/_app+/_layout", "path": "app/:appName/test/:testName", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/test._testName-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/app.$appName+/test.epic_ws[.js]": { "id": "routes/_app+/app.$appName+/test.epic_ws[.js]", "parentId": "routes/_app+/_layout", "path": "app/:appName/test/epic_ws.js", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/test.epic_ws_.js_-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/discord": { "id": "routes/_app+/discord", "parentId": "routes/_app+/_layout", "path": "discord", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/discord-BhzUjmbI.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-CxCgA-_O.js", "/assets/user-DvujSs-t.js", "/assets/discord-BRTW4Rnh.js"], "css": [] }, "routes/_app+/exercise+/_layout": { "id": "routes/_app+/exercise+/_layout", "parentId": "routes/_app+/_layout", "path": "exercise", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_layout-BUs3av-e.js", "imports": ["/assets/index-1cKOJFpX.js"], "css": [] }, "routes/_app+/exercise+/$exerciseNumber": { "id": "routes/_app+/exercise+/$exerciseNumber", "parentId": "routes/_app+/exercise+/_layout", "path": ":exerciseNumber", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/_exerciseNumber-j9COGU-R.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-CxCgA-_O.js", "/assets/request-info-CEhUGODY.js", "/assets/tooltip-kD4kSf1i.js", "/assets/pe-CUZaIcdt.js", "/assets/index-YNIH4TH8.js", "/assets/loading-sXkYDMsx.js", "/assets/user-DvujSs-t.js", "/assets/workshop-config-CL4F08kr.js", "/assets/epic-video-DZzPuXR8.js", "/assets/progress-bar-D3kudPcr.js", "/assets/index-Dx5GmdYq.js", "/assets/mdx-DwC5Oacq.js", "/assets/progress-BFm2U-l5.js", "/assets/seo-pBpFCWsy.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/exercise+/$exerciseNumber_.$stepNumber": { "id": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber", "parentId": "routes/_app+/exercise+/_layout", "path": ":exerciseNumber/:stepNumber", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/_exerciseNumber_._stepNumber-7kSd_6hH.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-CxCgA-_O.js"], "css": [] }, "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout": { "id": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout", "parentId": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber", "path": ":type", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/_layout-DnttUdzs.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-CxCgA-_O.js", "/assets/request-info-CEhUGODY.js", "/assets/tooltip-kD4kSf1i.js", "/assets/pe-CUZaIcdt.js", "/assets/index-YNIH4TH8.js", "/assets/loading-sXkYDMsx.js", "/assets/user-DvujSs-t.js", "/assets/workshop-config-CL4F08kr.js", "/assets/epic-video-DZzPuXR8.js", "/assets/progress-bar-D3kudPcr.js", "/assets/index-CXyf3Reb.js", "/assets/index-BwhlO_gF.js", "/assets/index-Dx5GmdYq.js", "/assets/error-boundary-COkPRBOZ.js", "/assets/nav-chevrons-g-C0ilNz.js", "/assets/mdx-DwC5Oacq.js", "/assets/progress-BFm2U-l5.js", "/assets/set-playground-DW0yVaNn.js", "/assets/seo-pBpFCWsy.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/app": { "id": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/app", "parentId": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout", "path": "app", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/app-CJ9ElQg6.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-CxCgA-_O.js", "/assets/request-info-CEhUGODY.js", "/assets/tooltip-kD4kSf1i.js", "/assets/pe-CUZaIcdt.js", "/assets/index-YNIH4TH8.js", "/assets/button-EE0aPg10.js", "/assets/loading-sXkYDMsx.js", "/assets/progress-bar-D3kudPcr.js", "/assets/preview-C7dtR2VR.js"], "css": [] }, "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/index": { "id": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/index", "parentId": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout", "path": void 0, "index": true, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/index-ZZCxObNp.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-CxCgA-_O.js", "/assets/tooltip-kD4kSf1i.js", "/assets/index-CXyf3Reb.js", "/assets/index-BwhlO_gF.js", "/assets/request-info-CEhUGODY.js", "/assets/pe-CUZaIcdt.js", "/assets/index-YNIH4TH8.js", "/assets/loading-sXkYDMsx.js", "/assets/user-DvujSs-t.js", "/assets/workshop-config-CL4F08kr.js", "/assets/epic-video-DZzPuXR8.js", "/assets/progress-bar-D3kudPcr.js", "/assets/accordion-OfO-5m5D.js", "/assets/mdx-DwC5Oacq.js", "/assets/use-event-source-A_0lEOPX.js", "/assets/set-playground-DW0yVaNn.js", "/assets/button-EE0aPg10.js", "/assets/diff-BXHLJqTK.js", "/assets/error-boundary-COkPRBOZ.js", "/assets/discord-BRTW4Rnh.js", "/assets/index-B-hHvmeV.js", "/assets/tests-DUg6VXec.js", "/assets/preview-C7dtR2VR.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/test": { "id": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/test", "parentId": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout", "path": "test", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/test-N2HloCnX.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-CxCgA-_O.js", "/assets/request-info-CEhUGODY.js", "/assets/tooltip-kD4kSf1i.js", "/assets/pe-CUZaIcdt.js", "/assets/index-YNIH4TH8.js", "/assets/loading-sXkYDMsx.js", "/assets/user-DvujSs-t.js", "/assets/workshop-config-CL4F08kr.js", "/assets/index-CXyf3Reb.js", "/assets/index-BwhlO_gF.js", "/assets/progress-bar-D3kudPcr.js", "/assets/epic-video-DZzPuXR8.js", "/assets/accordion-OfO-5m5D.js", "/assets/use-event-source-A_0lEOPX.js", "/assets/set-playground-DW0yVaNn.js", "/assets/tests-DUg6VXec.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.index": { "id": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.index", "parentId": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber", "path": void 0, "index": true, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_exerciseNumber_._stepNumber.index-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/exercise+/$exerciseNumber_.finished": { "id": "routes/_app+/exercise+/$exerciseNumber_.finished", "parentId": "routes/_app+/exercise+/_layout", "path": ":exerciseNumber/finished", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_exerciseNumber_.finished-DDNPeo8x.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-CxCgA-_O.js", "/assets/request-info-CEhUGODY.js", "/assets/tooltip-kD4kSf1i.js", "/assets/pe-CUZaIcdt.js", "/assets/index-YNIH4TH8.js", "/assets/loading-sXkYDMsx.js", "/assets/user-DvujSs-t.js", "/assets/workshop-config-CL4F08kr.js", "/assets/epic-video-DZzPuXR8.js", "/assets/progress-bar-D3kudPcr.js", "/assets/index-Dx5GmdYq.js", "/assets/nav-chevrons-g-C0ilNz.js", "/assets/mdx-DwC5Oacq.js", "/assets/progress-BFm2U-l5.js", "/assets/seo-pBpFCWsy.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/finished": { "id": "routes/_app+/finished", "parentId": "routes/_app+/_layout", "path": "finished", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/finished-Dop_5v80.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-CxCgA-_O.js", "/assets/request-info-CEhUGODY.js", "/assets/tooltip-kD4kSf1i.js", "/assets/pe-CUZaIcdt.js", "/assets/index-YNIH4TH8.js", "/assets/loading-sXkYDMsx.js", "/assets/user-DvujSs-t.js", "/assets/workshop-config-CL4F08kr.js", "/assets/epic-video-DZzPuXR8.js", "/assets/progress-bar-D3kudPcr.js", "/assets/index-Dx5GmdYq.js", "/assets/nav-chevrons-g-C0ilNz.js", "/assets/mdx-DwC5Oacq.js", "/assets/seo-pBpFCWsy.js", "/assets/progress-BFm2U-l5.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/index": { "id": "routes/_app+/index", "parentId": "routes/_app+/_layout", "path": void 0, "index": true, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/index-D-l_qaLC.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-CxCgA-_O.js", "/assets/request-info-CEhUGODY.js", "/assets/tooltip-kD4kSf1i.js", "/assets/pe-CUZaIcdt.js", "/assets/index-YNIH4TH8.js", "/assets/loading-sXkYDMsx.js", "/assets/user-DvujSs-t.js", "/assets/workshop-config-CL4F08kr.js", "/assets/epic-video-DZzPuXR8.js", "/assets/progress-bar-D3kudPcr.js", "/assets/index-Dx5GmdYq.js", "/assets/error-boundary-COkPRBOZ.js", "/assets/mdx-DwC5Oacq.js", "/assets/progress-BFm2U-l5.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/login": { "id": "routes/_app+/login", "parentId": "routes/_app+/_layout", "path": "login", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/login-Cc73KLYm.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-CxCgA-_O.js", "/assets/request-info-CEhUGODY.js", "/assets/tooltip-kD4kSf1i.js", "/assets/pe-CUZaIcdt.js", "/assets/index-YNIH4TH8.js", "/assets/workshop-config-CL4F08kr.js", "/assets/use-event-source-A_0lEOPX.js", "/assets/button-EE0aPg10.js", "/assets/loading-sXkYDMsx.js", "/assets/product-BAWG1Vut.js"], "css": [] }, "routes/_app+/support": { "id": "routes/_app+/support", "parentId": "routes/_app+/_layout", "path": "support", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/support-hcqGIpir.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js"], "css": [] }, "routes/admin+/_layout": { "id": "routes/admin+/_layout", "parentId": "root", "path": "admin", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_layout-BwzhY4NI.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-CxCgA-_O.js", "/assets/pe-CUZaIcdt.js", "/assets/tooltip-kD4kSf1i.js", "/assets/progress-BFm2U-l5.js"], "css": [] }, "routes/admin+/apps": { "id": "routes/admin+/apps", "parentId": "routes/admin+/_layout", "path": "apps", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/apps-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/admin+/cache": { "id": "routes/admin+/cache", "parentId": "routes/admin+/_layout", "path": "cache", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/cache-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/apps": { "id": "routes/apps", "parentId": "root", "path": "apps", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/apps-DP2rzg_V.js", "imports": [], "css": [] }, "routes/diff": { "id": "routes/diff", "parentId": "root", "path": "diff", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/diff-BEEJhGiC.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-CxCgA-_O.js", "/assets/tooltip-kD4kSf1i.js", "/assets/index-CXyf3Reb.js", "/assets/index-BwhlO_gF.js", "/assets/request-info-CEhUGODY.js", "/assets/pe-CUZaIcdt.js", "/assets/index-YNIH4TH8.js", "/assets/loading-sXkYDMsx.js", "/assets/user-DvujSs-t.js", "/assets/workshop-config-CL4F08kr.js", "/assets/epic-video-DZzPuXR8.js", "/assets/progress-bar-D3kudPcr.js", "/assets/accordion-OfO-5m5D.js", "/assets/mdx-DwC5Oacq.js", "/assets/diff-BXHLJqTK.js", "/assets/nav-chevrons-g-C0ilNz.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/discord.callback": { "id": "routes/discord.callback", "parentId": "root", "path": "discord/callback", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/discord.callback-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/exercises": { "id": "routes/exercises", "parentId": "root", "path": "exercises", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/exercises-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/launch-editor": { "id": "routes/launch-editor", "parentId": "root", "path": "launch-editor", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/launch-editor-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/login-sse": { "id": "routes/login-sse", "parentId": "root", "path": "login-sse", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/login-sse-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/og": { "id": "routes/og", "parentId": "root", "path": "og", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/og-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/onboarding": { "id": "routes/onboarding", "parentId": "root", "path": "onboarding", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/onboarding-DE9gclYS.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-CxCgA-_O.js", "/assets/request-info-CEhUGODY.js", "/assets/tooltip-kD4kSf1i.js", "/assets/pe-CUZaIcdt.js", "/assets/index-YNIH4TH8.js", "/assets/loading-sXkYDMsx.js", "/assets/user-DvujSs-t.js", "/assets/workshop-config-CL4F08kr.js", "/assets/button-EE0aPg10.js", "/assets/epic-video-DZzPuXR8.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/processes": { "id": "routes/processes", "parentId": "root", "path": "processes", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/processes-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/progress": { "id": "routes/progress", "parentId": "root", "path": "progress", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/progress-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/robots[.]txt": { "id": "routes/robots[.]txt", "parentId": "root", "path": "robots.txt", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/robots_._txt-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/set-playground": { "id": "routes/set-playground", "parentId": "root", "path": "set-playground", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/set-playground-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/sitemap[.]xml": { "id": "routes/sitemap[.]xml", "parentId": "root", "path": "sitemap.xml", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/sitemap_._xml-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/start": { "id": "routes/start", "parentId": "root", "path": "start", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/start-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/test": { "id": "routes/test", "parentId": "root", "path": "test", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/test-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/theme/index": { "id": "routes/theme/index", "parentId": "root", "path": "theme", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/index-K6Dvbx-E.js", "imports": [], "css": [] }, "routes/video-player/index": { "id": "routes/video-player/index", "parentId": "root", "path": "video-player", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/index-DP2rzg_V.js", "imports": [], "css": [] } }, "url": "/assets/manifest-e53d022a.js", "version": "e53d022a" };
13270
+ const serverManifest = { "entry": { "module": "/assets/entry.client-3M2p-8I3.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js"], "css": [] }, "routes": { "root": { "id": "root", "parentId": void 0, "path": "", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/root-9wVBEzOq.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-CxCgA-_O.js", "/assets/request-info-CEhUGODY.js", "/assets/tooltip-kD4kSf1i.js", "/assets/pe-CUZaIcdt.js", "/assets/error-boundary-COkPRBOZ.js", "/assets/progress-bar-D3kudPcr.js", "/assets/index-B-hHvmeV.js", "/assets/index-YNIH4TH8.js", "/assets/presence-Cr--lRCr.js", "/assets/seo-pBpFCWsy.js"], "css": [] }, "routes/$": { "id": "routes/$", "parentId": "root", "path": "*", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/_-D0Tgngwe.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-CxCgA-_O.js", "/assets/error-boundary-COkPRBOZ.js"], "css": [] }, "routes/_app+/_layout": { "id": "routes/_app+/_layout", "parentId": "root", "path": void 0, "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_layout-BPwIOXxN.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-CxCgA-_O.js", "/assets/request-info-CEhUGODY.js", "/assets/tooltip-kD4kSf1i.js", "/assets/pe-CUZaIcdt.js", "/assets/index-YNIH4TH8.js", "/assets/workshop-config-CL4F08kr.js", "/assets/product-BAWG1Vut.js", "/assets/index-CXyf3Reb.js", "/assets/user-DvujSs-t.js", "/assets/presence-Cr--lRCr.js", "/assets/progress-BFm2U-l5.js"], "css": [] }, "routes/_app+/account": { "id": "routes/_app+/account", "parentId": "routes/_app+/_layout", "path": "account", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/account-BatJhmSV.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-CxCgA-_O.js", "/assets/request-info-CEhUGODY.js", "/assets/button-EE0aPg10.js", "/assets/tooltip-kD4kSf1i.js", "/assets/user-DvujSs-t.js", "/assets/presence-Cr--lRCr.js"], "css": [] }, "routes/_app+/app.$appName+/$": { "id": "routes/_app+/app.$appName+/$", "parentId": "routes/_app+/_layout", "path": "app/:appName/*", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/app.$appName+/api.$": { "id": "routes/_app+/app.$appName+/api.$", "parentId": "routes/_app+/_layout", "path": "app/:appName/api/*", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/api._-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/app.$appName+/epic_ws[.js]": { "id": "routes/_app+/app.$appName+/epic_ws[.js]", "parentId": "routes/_app+/_layout", "path": "app/:appName/epic_ws.js", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/epic_ws_.js_-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/app.$appName+/index": { "id": "routes/_app+/app.$appName+/index", "parentId": "routes/_app+/_layout", "path": "app/:appName/", "index": true, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/index-K6Dvbx-E.js", "imports": [], "css": [] }, "routes/_app+/app.$appName+/test.$testName": { "id": "routes/_app+/app.$appName+/test.$testName", "parentId": "routes/_app+/_layout", "path": "app/:appName/test/:testName", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/test._testName-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/app.$appName+/test.epic_ws[.js]": { "id": "routes/_app+/app.$appName+/test.epic_ws[.js]", "parentId": "routes/_app+/_layout", "path": "app/:appName/test/epic_ws.js", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/test.epic_ws_.js_-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/discord": { "id": "routes/_app+/discord", "parentId": "routes/_app+/_layout", "path": "discord", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/discord-BhzUjmbI.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-CxCgA-_O.js", "/assets/user-DvujSs-t.js", "/assets/discord-BRTW4Rnh.js"], "css": [] }, "routes/_app+/exercise+/_layout": { "id": "routes/_app+/exercise+/_layout", "parentId": "routes/_app+/_layout", "path": "exercise", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_layout-BUs3av-e.js", "imports": ["/assets/index-1cKOJFpX.js"], "css": [] }, "routes/_app+/exercise+/$exerciseNumber": { "id": "routes/_app+/exercise+/$exerciseNumber", "parentId": "routes/_app+/exercise+/_layout", "path": ":exerciseNumber", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/_exerciseNumber-1JworToC.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-CxCgA-_O.js", "/assets/request-info-CEhUGODY.js", "/assets/tooltip-kD4kSf1i.js", "/assets/pe-CUZaIcdt.js", "/assets/index-YNIH4TH8.js", "/assets/loading-sXkYDMsx.js", "/assets/user-DvujSs-t.js", "/assets/workshop-config-CL4F08kr.js", "/assets/epic-video-yrWoJVFy.js", "/assets/progress-bar-D3kudPcr.js", "/assets/index-Dx5GmdYq.js", "/assets/mdx-CpyquP9i.js", "/assets/progress-BFm2U-l5.js", "/assets/seo-pBpFCWsy.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/exercise+/$exerciseNumber_.$stepNumber": { "id": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber", "parentId": "routes/_app+/exercise+/_layout", "path": ":exerciseNumber/:stepNumber", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/_exerciseNumber_._stepNumber-7kSd_6hH.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-CxCgA-_O.js"], "css": [] }, "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout": { "id": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout", "parentId": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber", "path": ":type", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/_layout-CKnDy_9Z.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-CxCgA-_O.js", "/assets/request-info-CEhUGODY.js", "/assets/tooltip-kD4kSf1i.js", "/assets/pe-CUZaIcdt.js", "/assets/index-YNIH4TH8.js", "/assets/loading-sXkYDMsx.js", "/assets/user-DvujSs-t.js", "/assets/workshop-config-CL4F08kr.js", "/assets/epic-video-yrWoJVFy.js", "/assets/progress-bar-D3kudPcr.js", "/assets/index-CXyf3Reb.js", "/assets/index-BwhlO_gF.js", "/assets/index-Dx5GmdYq.js", "/assets/error-boundary-COkPRBOZ.js", "/assets/nav-chevrons-g-C0ilNz.js", "/assets/mdx-CpyquP9i.js", "/assets/progress-BFm2U-l5.js", "/assets/set-playground-DW0yVaNn.js", "/assets/seo-pBpFCWsy.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/app": { "id": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/app", "parentId": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout", "path": "app", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/app-CJ9ElQg6.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-CxCgA-_O.js", "/assets/request-info-CEhUGODY.js", "/assets/tooltip-kD4kSf1i.js", "/assets/pe-CUZaIcdt.js", "/assets/index-YNIH4TH8.js", "/assets/button-EE0aPg10.js", "/assets/loading-sXkYDMsx.js", "/assets/progress-bar-D3kudPcr.js", "/assets/preview-C7dtR2VR.js"], "css": [] }, "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/index": { "id": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/index", "parentId": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout", "path": void 0, "index": true, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/index-Ccssehd9.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-CxCgA-_O.js", "/assets/tooltip-kD4kSf1i.js", "/assets/index-CXyf3Reb.js", "/assets/index-BwhlO_gF.js", "/assets/request-info-CEhUGODY.js", "/assets/pe-CUZaIcdt.js", "/assets/index-YNIH4TH8.js", "/assets/loading-sXkYDMsx.js", "/assets/user-DvujSs-t.js", "/assets/workshop-config-CL4F08kr.js", "/assets/epic-video-yrWoJVFy.js", "/assets/progress-bar-D3kudPcr.js", "/assets/accordion-OfO-5m5D.js", "/assets/mdx-CpyquP9i.js", "/assets/use-event-source-A_0lEOPX.js", "/assets/set-playground-DW0yVaNn.js", "/assets/button-EE0aPg10.js", "/assets/diff-jgZ_RGra.js", "/assets/error-boundary-COkPRBOZ.js", "/assets/discord-BRTW4Rnh.js", "/assets/index-B-hHvmeV.js", "/assets/tests-BR7RFlr5.js", "/assets/preview-C7dtR2VR.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/test": { "id": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/test", "parentId": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout", "path": "test", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/test-DbZkv25C.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-CxCgA-_O.js", "/assets/request-info-CEhUGODY.js", "/assets/tooltip-kD4kSf1i.js", "/assets/pe-CUZaIcdt.js", "/assets/index-YNIH4TH8.js", "/assets/loading-sXkYDMsx.js", "/assets/user-DvujSs-t.js", "/assets/workshop-config-CL4F08kr.js", "/assets/index-CXyf3Reb.js", "/assets/index-BwhlO_gF.js", "/assets/progress-bar-D3kudPcr.js", "/assets/epic-video-yrWoJVFy.js", "/assets/accordion-OfO-5m5D.js", "/assets/use-event-source-A_0lEOPX.js", "/assets/set-playground-DW0yVaNn.js", "/assets/tests-BR7RFlr5.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.index": { "id": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.index", "parentId": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber", "path": void 0, "index": true, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_exerciseNumber_._stepNumber.index-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/exercise+/$exerciseNumber_.finished": { "id": "routes/_app+/exercise+/$exerciseNumber_.finished", "parentId": "routes/_app+/exercise+/_layout", "path": ":exerciseNumber/finished", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_exerciseNumber_.finished-B4D2ZAmj.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-CxCgA-_O.js", "/assets/request-info-CEhUGODY.js", "/assets/tooltip-kD4kSf1i.js", "/assets/pe-CUZaIcdt.js", "/assets/index-YNIH4TH8.js", "/assets/loading-sXkYDMsx.js", "/assets/user-DvujSs-t.js", "/assets/workshop-config-CL4F08kr.js", "/assets/epic-video-yrWoJVFy.js", "/assets/progress-bar-D3kudPcr.js", "/assets/index-Dx5GmdYq.js", "/assets/nav-chevrons-g-C0ilNz.js", "/assets/mdx-CpyquP9i.js", "/assets/progress-BFm2U-l5.js", "/assets/seo-pBpFCWsy.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/finished": { "id": "routes/_app+/finished", "parentId": "routes/_app+/_layout", "path": "finished", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/finished-Ct6I1SZV.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-CxCgA-_O.js", "/assets/request-info-CEhUGODY.js", "/assets/tooltip-kD4kSf1i.js", "/assets/pe-CUZaIcdt.js", "/assets/index-YNIH4TH8.js", "/assets/loading-sXkYDMsx.js", "/assets/user-DvujSs-t.js", "/assets/workshop-config-CL4F08kr.js", "/assets/epic-video-yrWoJVFy.js", "/assets/progress-bar-D3kudPcr.js", "/assets/index-Dx5GmdYq.js", "/assets/nav-chevrons-g-C0ilNz.js", "/assets/mdx-CpyquP9i.js", "/assets/seo-pBpFCWsy.js", "/assets/progress-BFm2U-l5.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/index": { "id": "routes/_app+/index", "parentId": "routes/_app+/_layout", "path": void 0, "index": true, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/index-R-sUGQfT.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-CxCgA-_O.js", "/assets/request-info-CEhUGODY.js", "/assets/tooltip-kD4kSf1i.js", "/assets/pe-CUZaIcdt.js", "/assets/index-YNIH4TH8.js", "/assets/loading-sXkYDMsx.js", "/assets/user-DvujSs-t.js", "/assets/workshop-config-CL4F08kr.js", "/assets/epic-video-yrWoJVFy.js", "/assets/progress-bar-D3kudPcr.js", "/assets/index-Dx5GmdYq.js", "/assets/error-boundary-COkPRBOZ.js", "/assets/mdx-CpyquP9i.js", "/assets/progress-BFm2U-l5.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/login": { "id": "routes/_app+/login", "parentId": "routes/_app+/_layout", "path": "login", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/login-Cc73KLYm.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-CxCgA-_O.js", "/assets/request-info-CEhUGODY.js", "/assets/tooltip-kD4kSf1i.js", "/assets/pe-CUZaIcdt.js", "/assets/index-YNIH4TH8.js", "/assets/workshop-config-CL4F08kr.js", "/assets/use-event-source-A_0lEOPX.js", "/assets/button-EE0aPg10.js", "/assets/loading-sXkYDMsx.js", "/assets/product-BAWG1Vut.js"], "css": [] }, "routes/_app+/support": { "id": "routes/_app+/support", "parentId": "routes/_app+/_layout", "path": "support", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/support-hcqGIpir.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js"], "css": [] }, "routes/admin+/_layout": { "id": "routes/admin+/_layout", "parentId": "root", "path": "admin", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_layout-BwzhY4NI.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-CxCgA-_O.js", "/assets/pe-CUZaIcdt.js", "/assets/tooltip-kD4kSf1i.js", "/assets/progress-BFm2U-l5.js"], "css": [] }, "routes/admin+/apps": { "id": "routes/admin+/apps", "parentId": "routes/admin+/_layout", "path": "apps", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/apps-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/admin+/cache": { "id": "routes/admin+/cache", "parentId": "routes/admin+/_layout", "path": "cache", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/cache-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/apps": { "id": "routes/apps", "parentId": "root", "path": "apps", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/apps-DP2rzg_V.js", "imports": [], "css": [] }, "routes/diff": { "id": "routes/diff", "parentId": "root", "path": "diff", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/diff-Cvtc-qzL.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-CxCgA-_O.js", "/assets/tooltip-kD4kSf1i.js", "/assets/index-CXyf3Reb.js", "/assets/index-BwhlO_gF.js", "/assets/request-info-CEhUGODY.js", "/assets/pe-CUZaIcdt.js", "/assets/index-YNIH4TH8.js", "/assets/loading-sXkYDMsx.js", "/assets/user-DvujSs-t.js", "/assets/workshop-config-CL4F08kr.js", "/assets/epic-video-yrWoJVFy.js", "/assets/progress-bar-D3kudPcr.js", "/assets/accordion-OfO-5m5D.js", "/assets/mdx-CpyquP9i.js", "/assets/diff-jgZ_RGra.js", "/assets/nav-chevrons-g-C0ilNz.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/discord.callback": { "id": "routes/discord.callback", "parentId": "root", "path": "discord/callback", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/discord.callback-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/exercises": { "id": "routes/exercises", "parentId": "root", "path": "exercises", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/exercises-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/launch-editor": { "id": "routes/launch-editor", "parentId": "root", "path": "launch-editor", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/launch-editor-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/login-sse": { "id": "routes/login-sse", "parentId": "root", "path": "login-sse", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/login-sse-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/og": { "id": "routes/og", "parentId": "root", "path": "og", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/og-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/onboarding": { "id": "routes/onboarding", "parentId": "root", "path": "onboarding", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/onboarding-B7TLVi2l.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-CxCgA-_O.js", "/assets/request-info-CEhUGODY.js", "/assets/tooltip-kD4kSf1i.js", "/assets/pe-CUZaIcdt.js", "/assets/index-YNIH4TH8.js", "/assets/loading-sXkYDMsx.js", "/assets/user-DvujSs-t.js", "/assets/workshop-config-CL4F08kr.js", "/assets/button-EE0aPg10.js", "/assets/epic-video-yrWoJVFy.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/processes": { "id": "routes/processes", "parentId": "root", "path": "processes", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/processes-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/progress": { "id": "routes/progress", "parentId": "root", "path": "progress", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/progress-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/robots[.]txt": { "id": "routes/robots[.]txt", "parentId": "root", "path": "robots.txt", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/robots_._txt-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/set-playground": { "id": "routes/set-playground", "parentId": "root", "path": "set-playground", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/set-playground-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/sitemap[.]xml": { "id": "routes/sitemap[.]xml", "parentId": "root", "path": "sitemap.xml", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/sitemap_._xml-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/start": { "id": "routes/start", "parentId": "root", "path": "start", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/start-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/test": { "id": "routes/test", "parentId": "root", "path": "test", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/test-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/theme/index": { "id": "routes/theme/index", "parentId": "root", "path": "theme", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/index-DP2rzg_V.js", "imports": [], "css": [] }, "routes/video-player/index": { "id": "routes/video-player/index", "parentId": "root", "path": "video-player", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/index-l0sNRNKZ.js", "imports": [], "css": [] } }, "url": "/assets/manifest-f5f44d87.js", "version": "f5f44d87" };
13230
13271
  const mode = "production";
13231
13272
  const assetsBuildDirectory = "build/client";
13232
13273
  const basename = "/";