@epic-web/workshop-app 4.2.7 → 4.2.9

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.
@@ -3163,7 +3163,7 @@ const ThemeFormSchema = z$1.object({
3163
3163
  redirectTo: z$1.string().optional(),
3164
3164
  theme: z$1.enum(["system", "light", "dark"])
3165
3165
  });
3166
- async function action$d({ request }) {
3166
+ async function action$c({ request }) {
3167
3167
  const formData = await request.formData();
3168
3168
  const submission = parseWithZod(formData, {
3169
3169
  schema: ThemeFormSchema
@@ -3242,10 +3242,10 @@ function useTheme() {
3242
3242
  }
3243
3243
  return requestInfo.session.theme ?? hints.theme;
3244
3244
  }
3245
- const route39 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
3245
+ const route34 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
3246
3246
  __proto__: null,
3247
3247
  ThemeSwitch,
3248
- action: action$d,
3248
+ action: action$c,
3249
3249
  useTheme
3250
3250
  }, Symbol.toStringTag, { value: "Module" }));
3251
3251
  const appStylesheetUrl = "/assets/app-B0HiIPBO.css";
@@ -3799,7 +3799,7 @@ const links = () => {
3799
3799
  const meta$5 = ({ data }) => {
3800
3800
  return [{ title: data == null ? void 0 : data.workshopTitle }];
3801
3801
  };
3802
- async function loader$w({ request }) {
3802
+ async function loader$r({ request }) {
3803
3803
  const timings = makeTimings("rootLoader");
3804
3804
  const onboarding = await readOnboardingData();
3805
3805
  if (!ENV.EPICSHOP_DEPLOYED && !(onboarding == null ? void 0 : onboarding.finishedTourVideo)) {
@@ -4004,10 +4004,10 @@ const route0 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProper
4004
4004
  default: AppWithProviders,
4005
4005
  headers: headers$8,
4006
4006
  links,
4007
- loader: loader$w,
4007
+ loader: loader$r,
4008
4008
  meta: meta$5
4009
4009
  }, Symbol.toStringTag, { value: "Module" }));
4010
- async function loader$v() {
4010
+ async function loader$q() {
4011
4011
  throw new Response("Not found", { status: 404 });
4012
4012
  }
4013
4013
  function NotFound() {
@@ -4034,7 +4034,7 @@ const route1 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProper
4034
4034
  __proto__: null,
4035
4035
  ErrorBoundary: ErrorBoundary$4,
4036
4036
  default: NotFound,
4037
- loader: loader$v
4037
+ loader: loader$q
4038
4038
  }, Symbol.toStringTag, { value: "Module" }));
4039
4039
  function useEpicProgress() {
4040
4040
  const data = useRouteLoaderData("root");
@@ -4165,7 +4165,7 @@ function useProgressItem({
4165
4165
  }
4166
4166
  return null;
4167
4167
  }
4168
- async function action$c({ request }) {
4168
+ async function action$b({ request }) {
4169
4169
  ensureUndeployed();
4170
4170
  await requireAuthInfo({ request });
4171
4171
  const formData = await request.formData();
@@ -4327,10 +4327,10 @@ function ProgressToggle({
4327
4327
  )
4328
4328
  ] });
4329
4329
  }
4330
- const route35 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
4330
+ const route30 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
4331
4331
  __proto__: null,
4332
4332
  ProgressToggle,
4333
- action: action$c,
4333
+ action: action$b,
4334
4334
  useEpicProgress,
4335
4335
  useExerciseProgressClassName,
4336
4336
  useNextExerciseRoute,
@@ -4355,7 +4355,7 @@ function useOptionalDiscordMember() {
4355
4355
  const data = useRouteLoaderData("root");
4356
4356
  return data == null ? void 0 : data.discordMember;
4357
4357
  }
4358
- async function loader$u({ request }) {
4358
+ async function loader$p({ request }) {
4359
4359
  var _a2;
4360
4360
  const timings = makeTimings("stepLoader");
4361
4361
  const [exercises, workshopTitle, playgroundAppName] = await Promise.all([
@@ -5052,7 +5052,7 @@ const route2 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProper
5052
5052
  __proto__: null,
5053
5053
  default: App,
5054
5054
  headers: headers$7,
5055
- loader: loader$u
5055
+ loader: loader$p
5056
5056
  }, Symbol.toStringTag, { value: "Module" }));
5057
5057
  function ExercisesLayout() {
5058
5058
  return /* @__PURE__ */ jsx("div", { className: "flex h-full flex-grow", children: /* @__PURE__ */ jsx(Outlet, {}) });
@@ -5130,7 +5130,7 @@ const ignoredInputs = [
5130
5130
  "mux-player",
5131
5131
  "summary"
5132
5132
  ];
5133
- async function action$b({ request }) {
5133
+ async function action$a({ request }) {
5134
5134
  const result = PlayerPreferencesSchema.safeParse(await request.json());
5135
5135
  if (!result.success) {
5136
5136
  return json({ status: "error", error: result.error.flatten() }, {
@@ -5316,10 +5316,10 @@ function isDeepEqual(obj1, obj2) {
5316
5316
  }
5317
5317
  return true;
5318
5318
  }
5319
- const route41 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
5319
+ const route36 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
5320
5320
  __proto__: null,
5321
5321
  MuxPlayer,
5322
- action: action$b,
5322
+ action: action$a,
5323
5323
  usePlayerPreferences
5324
5324
  }, Symbol.toStringTag, { value: "Module" }));
5325
5325
  const EpicVideoInfoContext = React.createContext(null);
@@ -6106,7 +6106,7 @@ const LaunchSchema = z$1.intersection(
6106
6106
  }),
6107
6107
  getFileDescriptorSchema(z$1.array(z$1.string()))
6108
6108
  );
6109
- async function action$a({ request }) {
6109
+ async function action$9({ request }) {
6110
6110
  ensureUndeployed();
6111
6111
  const formData = await request.formData();
6112
6112
  const syncTo = {
@@ -6349,11 +6349,11 @@ function EditFileOnGitHub({
6349
6349
  );
6350
6350
  }
6351
6351
  const LaunchEditor = ENV.EPICSHOP_DEPLOYED ? ENV.EPICSHOP_GITHUB_ROOT ? LaunchGitHub : ({ children }) => /* @__PURE__ */ jsx(SimpleTooltip, { content: "Cannot open files in deployed app", children: /* @__PURE__ */ jsx("button", { className: "launch_button cursor-not-allowed", children }) }) : LaunchEditorImpl;
6352
- const route31 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
6352
+ const route26 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
6353
6353
  __proto__: null,
6354
6354
  EditFileOnGitHub,
6355
6355
  LaunchEditor,
6356
- action: action$a
6356
+ action: action$9
6357
6357
  }, Symbol.toStringTag, { value: "Module" }));
6358
6358
  const safePath = (s) => s.replace(/\\/g, "/");
6359
6359
  function getRelativePath(file, separator, type) {
@@ -6552,7 +6552,7 @@ const meta$4 = ({
6552
6552
  }
6553
6553
  ];
6554
6554
  };
6555
- async function loader$t({ request, params }) {
6555
+ async function loader$o({ request, params }) {
6556
6556
  const timings = makeTimings("exerciseNumberLoader");
6557
6557
  invariantResponse(params.exerciseNumber, "exerciseNumber is required");
6558
6558
  const [exercises, workshopTitle] = await Promise.all([
@@ -6696,10 +6696,10 @@ const route4 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProper
6696
6696
  ErrorBoundary: ErrorBoundary$3,
6697
6697
  default: ExerciseNumberRoute,
6698
6698
  headers: headers$6,
6699
- loader: loader$t,
6699
+ loader: loader$o,
6700
6700
  meta: meta$4
6701
6701
  }, Symbol.toStringTag, { value: "Module" }));
6702
- async function loader$s({ request, params }) {
6702
+ async function loader$n({ request, params }) {
6703
6703
  const timings = makeTimings("stepLoader");
6704
6704
  invariantResponse(params.exerciseNumber, "exerciseNumber is required");
6705
6705
  const [exercises, workshopTitle] = await Promise.all([
@@ -6756,7 +6756,7 @@ const route5 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProper
6756
6756
  ErrorBoundary: ErrorBoundary$2,
6757
6757
  default: StepRoute,
6758
6758
  headers: headers$5,
6759
- loader: loader$s
6759
+ loader: loader$n
6760
6760
  }, Symbol.toStringTag, { value: "Module" }));
6761
6761
  const EmojiDataSchema = z$1.union([
6762
6762
  z$1.object({
@@ -6873,7 +6873,7 @@ function getDiscordAuthURL() {
6873
6873
  discordAuthUrl.searchParams.append("scope", scope);
6874
6874
  return discordAuthUrl.toString();
6875
6875
  }
6876
- async function loader$r({ request }) {
6876
+ async function loader$m({ request }) {
6877
6877
  const authInfo = await requireAuthInfo({ request });
6878
6878
  const discordCode = new URL(request.url).searchParams.get("code");
6879
6879
  invariantResponse(discordCode, "Missing code");
@@ -6926,12 +6926,12 @@ async function loader$r({ request }) {
6926
6926
  description: `Your Discord account "${member.displayName}" has been connected!`
6927
6927
  });
6928
6928
  }
6929
- const route29 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
6929
+ const route24 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
6930
6930
  __proto__: null,
6931
6931
  getDiscordAuthURL,
6932
- loader: loader$r
6932
+ loader: loader$m
6933
6933
  }, Symbol.toStringTag, { value: "Module" }));
6934
- async function loader$q() {
6934
+ async function loader$l() {
6935
6935
  return json({ discordAuthUrl: getDiscordAuthURL() });
6936
6936
  }
6937
6937
  function useDiscordCTALink({
@@ -7030,11 +7030,11 @@ function DiscordRoute() {
7030
7030
  ] }) })
7031
7031
  ] });
7032
7032
  }
7033
- const route20 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
7033
+ const route15 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
7034
7034
  __proto__: null,
7035
7035
  DiscordCTA,
7036
7036
  default: DiscordRoute,
7037
- loader: loader$q,
7037
+ loader: loader$l,
7038
7038
  useDiscordCTALink
7039
7039
  }, Symbol.toStringTag, { value: "Module" }));
7040
7040
  function DiscordChat() {
@@ -7574,7 +7574,7 @@ const SetPlaygroundSchema = z$1.object({
7574
7574
  appName: z$1.string(),
7575
7575
  reset: z$1.string().nullable().optional().transform((v) => v === "true")
7576
7576
  });
7577
- async function action$9({ request }) {
7577
+ async function action$8({ request }) {
7578
7578
  ensureUndeployed();
7579
7579
  const formData = await request.formData();
7580
7580
  const rawData = {
@@ -7744,12 +7744,12 @@ function SetAppToPlayground({ appName }) {
7744
7744
  }
7745
7745
  );
7746
7746
  }
7747
- const route36 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
7747
+ const route31 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
7748
7748
  __proto__: null,
7749
7749
  PlaygroundChooser,
7750
7750
  SetAppToPlayground,
7751
7751
  SetPlayground,
7752
- action: action$9
7752
+ action: action$8
7753
7753
  }, Symbol.toStringTag, { value: "Module" }));
7754
7754
  function PlaygroundWindow({
7755
7755
  playgroundAppName,
@@ -7868,7 +7868,7 @@ function ButtonLink({
7868
7868
  }
7869
7869
  ) });
7870
7870
  }
7871
- async function action$8({ request }) {
7871
+ async function action$7({ request }) {
7872
7872
  ensureUndeployed();
7873
7873
  const formData = await request.formData();
7874
7874
  const intent = formData.get("intent");
@@ -7997,12 +7997,12 @@ function AppStarter({ name }) {
7997
7997
  fetcher.state === "idle" ? /* @__PURE__ */ jsx(Button, { type: "submit", name: "intent", value: "start", varient: "mono", children: "Start App" }) : /* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsx(Loading, { children: "Starting App" }) })
7998
7998
  ] });
7999
7999
  }
8000
- const route37 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
8000
+ const route32 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
8001
8001
  __proto__: null,
8002
8002
  AppStarter,
8003
8003
  AppStopper,
8004
8004
  PortStopper,
8005
- action: action$8
8005
+ action: action$7
8006
8006
  }, Symbol.toStringTag, { value: "Module" }));
8007
8007
  const historyCallDataSchema = z$1.intersection(
8008
8008
  z$1.object({
@@ -8474,7 +8474,7 @@ function checkFileExists(file) {
8474
8474
  () => false
8475
8475
  );
8476
8476
  }
8477
- async function action$7({ request }) {
8477
+ async function action$6({ request }) {
8478
8478
  var _a2, _b2;
8479
8479
  ensureUndeployed();
8480
8480
  const formData = await request.formData();
@@ -8537,10 +8537,10 @@ function UpdateMdxCache({
8537
8537
  )
8538
8538
  ] });
8539
8539
  }
8540
- const route40 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
8540
+ const route35 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
8541
8541
  __proto__: null,
8542
8542
  UpdateMdxCache,
8543
- action: action$7
8543
+ action: action$6
8544
8544
  }, Symbol.toStringTag, { value: "Module" }));
8545
8545
  const StepContext = React.createContext(null);
8546
8546
  function useStepContext() {
@@ -9125,7 +9125,7 @@ const testEventSchema = z$1.union([
9125
9125
  })
9126
9126
  ]);
9127
9127
  const testEventQueueSchema = z$1.array(testEventSchema);
9128
- async function loader$p({ request }) {
9128
+ async function loader$k({ request }) {
9129
9129
  ensureUndeployed();
9130
9130
  const url = new URL(request.url);
9131
9131
  const name = url.searchParams.get("name");
@@ -9202,7 +9202,7 @@ async function loader$p({ request }) {
9202
9202
  };
9203
9203
  });
9204
9204
  }
9205
- async function action$6({ request }) {
9205
+ async function action$5({ request }) {
9206
9206
  var _a2;
9207
9207
  ensureUndeployed();
9208
9208
  const formData = await request.formData();
@@ -9445,14 +9445,14 @@ function StopTest({
9445
9445
  )
9446
9446
  ] });
9447
9447
  }
9448
- const route38 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
9448
+ const route33 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
9449
9449
  __proto__: null,
9450
9450
  ClearTest,
9451
9451
  StopTest,
9452
9452
  TestOutput,
9453
9453
  TestRunner,
9454
- action: action$6,
9455
- loader: loader$p
9454
+ action: action$5,
9455
+ loader: loader$k
9456
9456
  }, Symbol.toStringTag, { value: "Module" }));
9457
9457
  function Tests({
9458
9458
  appInfo: playgroundAppInfo,
@@ -9849,7 +9849,7 @@ const meta$3 = ({
9849
9849
  }
9850
9850
  ];
9851
9851
  };
9852
- async function loader$o({ request, params }) {
9852
+ async function loader$j({ request, params }) {
9853
9853
  var _a2, _b2;
9854
9854
  const timings = makeTimings("exerciseStepTypeLoader");
9855
9855
  const workshopTitle = await getWorkshopTitle();
@@ -10283,10 +10283,10 @@ const route6 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProper
10283
10283
  ErrorBoundary: ErrorBoundary$1,
10284
10284
  default: ExercisePartRoute,
10285
10285
  headers: headers$4,
10286
- loader: loader$o,
10286
+ loader: loader$j,
10287
10287
  meta: meta$3
10288
10288
  }, Symbol.toStringTag, { value: "Module" }));
10289
- async function loader$n({ params }) {
10289
+ async function loader$i({ params }) {
10290
10290
  const problemApp = await getExerciseApp({ ...params, type: "problem" }).then(
10291
10291
  (a) => isProblemApp(a) ? a : null
10292
10292
  );
@@ -10304,7 +10304,7 @@ async function loader$n({ params }) {
10304
10304
  }
10305
10305
  const route7 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
10306
10306
  __proto__: null,
10307
- loader: loader$n
10307
+ loader: loader$i
10308
10308
  }, Symbol.toStringTag, { value: "Module" }));
10309
10309
  const meta$2 = ({
10310
10310
  data,
@@ -10322,7 +10322,7 @@ const meta$2 = ({
10322
10322
  }
10323
10323
  ];
10324
10324
  };
10325
- async function loader$m({ request, params }) {
10325
+ async function loader$h({ request, params }) {
10326
10326
  const timings = makeTimings("exerciseFinishedLoader");
10327
10327
  invariantResponse(params.exerciseNumber, "exerciseNumber is required");
10328
10328
  const exercise = await getExercise(params.exerciseNumber, {
@@ -10487,15 +10487,15 @@ const route8 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProper
10487
10487
  __proto__: null,
10488
10488
  default: ExerciseFinished$1,
10489
10489
  headers: headers$3,
10490
- loader: loader$m,
10490
+ loader: loader$h,
10491
10491
  meta: meta$2
10492
10492
  }, Symbol.toStringTag, { value: "Module" }));
10493
- async function loader$l({ request }) {
10493
+ async function loader$g({ request }) {
10494
10494
  ensureUndeployed();
10495
10495
  await requireAuthInfo({ request });
10496
10496
  return json({ discordAuthUrl: getDiscordAuthURL() });
10497
10497
  }
10498
- async function action$5({ request }) {
10498
+ async function action$4({ request }) {
10499
10499
  ensureUndeployed();
10500
10500
  const formData = await request.formData();
10501
10501
  const intent = formData.get("intent");
@@ -10600,9 +10600,9 @@ function Account() {
10600
10600
  }
10601
10601
  const route9 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
10602
10602
  __proto__: null,
10603
- action: action$5,
10603
+ action: action$4,
10604
10604
  default: Account,
10605
- loader: loader$l
10605
+ loader: loader$g
10606
10606
  }, Symbol.toStringTag, { value: "Module" }));
10607
10607
  async function resolveApps({
10608
10608
  request,
@@ -10672,7 +10672,7 @@ async function compileTs(filePath, fullPath, {
10672
10672
  }
10673
10673
  });
10674
10674
  }
10675
- async function loader$k({ request, params }) {
10675
+ async function loader$f({ request, params }) {
10676
10676
  const timings = makeTimings("app-file");
10677
10677
  const { fileApp, app } = await resolveApps({ request, params, timings });
10678
10678
  if (!fileApp || !app) {
@@ -10728,10 +10728,10 @@ async function loader$k({ request, params }) {
10728
10728
  }
10729
10729
  const route10 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
10730
10730
  __proto__: null,
10731
- loader: loader$k
10731
+ loader: loader$f
10732
10732
  }, Symbol.toStringTag, { value: "Module" }));
10733
- async function loader$j(args) {
10734
- const api = await getApiModule$1(args);
10733
+ async function loader$e(args) {
10734
+ const api = await getApiModule(args);
10735
10735
  invariantResponse(
10736
10736
  api.mod.loader,
10737
10737
  "Attempted to make a GET request to the api endpoint but the api module does not export a loader function",
@@ -10744,8 +10744,8 @@ async function loader$j(args) {
10744
10744
  api.cleanupError(error);
10745
10745
  }
10746
10746
  }
10747
- async function action$4(args) {
10748
- const api = await getApiModule$1(args);
10747
+ async function action$3(args) {
10748
+ const api = await getApiModule(args);
10749
10749
  invariantResponse(
10750
10750
  api.mod.action,
10751
10751
  "Attempted to make a non-GET request to the api endpoint but the api module does not export an action function",
@@ -10758,11 +10758,11 @@ async function action$4(args) {
10758
10758
  api.cleanupError(error);
10759
10759
  }
10760
10760
  }
10761
- const ApiModuleSchema$1 = z$1.object({
10761
+ const ApiModuleSchema = z$1.object({
10762
10762
  loader: z$1.function().optional(),
10763
10763
  action: z$1.function().optional()
10764
10764
  });
10765
- async function getApiModule$1({ request, params }) {
10765
+ async function getApiModule({ request, params }) {
10766
10766
  const timings = makeTimings("app-api");
10767
10767
  const { fileApp, app } = await resolveApps({ request, params, timings });
10768
10768
  if (!fileApp || !app) {
@@ -10788,6 +10788,10 @@ async function getApiModule$1({ request, params }) {
10788
10788
  const { outputFiles, errors } = await compileTs(apiFile, app.fullPath, {
10789
10789
  esbuildOptions: {
10790
10790
  platform: "node",
10791
+ // packages external causes issues in Node 20 because Node tries to resolve the package.json from the data URL 🤷‍♂️
10792
+ // packages: 'external', // figure out how to turn this on in the future...
10793
+ // just adds noise to errors and doesn't appear to help with debugging
10794
+ sourcemap: false,
10791
10795
  // remove the process.env define
10792
10796
  define: {}
10793
10797
  },
@@ -10808,7 +10812,7 @@ async function getApiModule$1({ request, params }) {
10808
10812
  /* @vite-ignore */
10809
10813
  dataUrl
10810
10814
  ).catch(cleanupError);
10811
- const apiModule = ApiModuleSchema$1.safeParse(mod);
10815
+ const apiModule = ApiModuleSchema.safeParse(mod);
10812
10816
  if (!apiModule.success) {
10813
10817
  throw new Response(
10814
10818
  `Invalid api module. It should export a loader and/or action: ${apiModule.error.message}`,
@@ -10828,10 +10832,78 @@ async function getApiModule$1({ request, params }) {
10828
10832
  }
10829
10833
  const route11 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
10830
10834
  __proto__: null,
10831
- action: action$4,
10832
- loader: loader$j
10835
+ action: action$3,
10836
+ loader: loader$e
10837
+ }, Symbol.toStringTag, { value: "Module" }));
10838
+ async function loader$d({ request, params }) {
10839
+ const timings = makeTimings("epic_ws script");
10840
+ const { fileApp, app } = await resolveApps({ request, params, timings });
10841
+ if (!fileApp || !app) {
10842
+ throw new Response(`Apps not found`, { status: 404 });
10843
+ }
10844
+ if (app.dev.type === "script") {
10845
+ return redirect(getBaseUrl({ request, port: app.dev.portNumber }));
10846
+ }
10847
+ const relevantPaths = Array.from(/* @__PURE__ */ new Set([app.fullPath, fileApp.fullPath]));
10848
+ const js = (
10849
+ /* javascript */
10850
+ `
10851
+ function epicLiveReloadConnect(config) {
10852
+ const protocol = location.protocol === "https:" ? "wss:" : "ws:";
10853
+ const host = location.hostname;
10854
+ const port = location.port;
10855
+ const socketPath = protocol + "//" + host + ":" + port + "/__ws";
10856
+ const ws = new WebSocket(socketPath);
10857
+ ws.onmessage = (message) => {
10858
+ const event = JSON.parse(message.data);
10859
+ if (event.type !== 'epicshop:file-change') return;
10860
+ const { filePaths } = event.data;
10861
+ if (${JSON.stringify(relevantPaths)}.some(p => filePaths.some(filePath => filePath.startsWith(p)))) {
10862
+ console.log(
10863
+ ['🐨 Reloading', window.frameElement?.getAttribute('title')]
10864
+ .filter(Boolean)
10865
+ .join(' '),
10866
+ );
10867
+ window.location.reload();
10868
+ }
10869
+ };
10870
+ ws.onopen = () => {
10871
+ if (config && typeof config.onOpen === "function") {
10872
+ config.onOpen();
10873
+ }
10874
+ };
10875
+ ws.onclose = (event) => {
10876
+ if (event.code === 1006) {
10877
+ console.log("Epic Web dev server web socket closed. Reconnecting...");
10878
+ setTimeout(
10879
+ () =>
10880
+ epicLiveReloadConnect({
10881
+ onOpen: () => window.location.reload(),
10882
+ }),
10883
+ 1000
10884
+ );
10885
+ }
10886
+ };
10887
+ ws.onerror = (error) => {
10888
+ console.log("Epic Web dev server web socket error:");
10889
+ console.error(error);
10890
+ };
10891
+ }
10892
+ epicLiveReloadConnect();
10893
+ `
10894
+ );
10895
+ return new Response(js, {
10896
+ headers: {
10897
+ "Content-Length": Buffer.byteLength(js).toString(),
10898
+ "Content-Type": "text/javascript"
10899
+ }
10900
+ });
10901
+ }
10902
+ const route12 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
10903
+ __proto__: null,
10904
+ loader: loader$d
10833
10905
  }, Symbol.toStringTag, { value: "Module" }));
10834
- async function loader$i({ request, params }) {
10906
+ async function loader$c({ request, params }) {
10835
10907
  var _a2;
10836
10908
  const timings = makeTimings("app");
10837
10909
  const { fileApp, app } = await resolveApps({ request, params, timings });
@@ -10915,79 +10987,11 @@ async function loader$i({ request, params }) {
10915
10987
  }
10916
10988
  });
10917
10989
  }
10918
- const route12 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
10919
- __proto__: null,
10920
- loader: loader$i
10921
- }, Symbol.toStringTag, { value: "Module" }));
10922
- async function loader$h({ request, params }) {
10923
- const timings = makeTimings("epic_ws script");
10924
- const { fileApp, app } = await resolveApps({ request, params, timings });
10925
- if (!fileApp || !app) {
10926
- throw new Response(`Apps not found`, { status: 404 });
10927
- }
10928
- if (app.dev.type === "script") {
10929
- return redirect(getBaseUrl({ request, port: app.dev.portNumber }));
10930
- }
10931
- const relevantPaths = Array.from(/* @__PURE__ */ new Set([app.fullPath, fileApp.fullPath]));
10932
- const js = (
10933
- /* javascript */
10934
- `
10935
- function epicLiveReloadConnect(config) {
10936
- const protocol = location.protocol === "https:" ? "wss:" : "ws:";
10937
- const host = location.hostname;
10938
- const port = location.port;
10939
- const socketPath = protocol + "//" + host + ":" + port + "/__ws";
10940
- const ws = new WebSocket(socketPath);
10941
- ws.onmessage = (message) => {
10942
- const event = JSON.parse(message.data);
10943
- if (event.type !== 'epicshop:file-change') return;
10944
- const { filePaths } = event.data;
10945
- if (${JSON.stringify(relevantPaths)}.some(p => filePaths.some(filePath => filePath.startsWith(p)))) {
10946
- console.log(
10947
- ['🐨 Reloading', window.frameElement?.getAttribute('title')]
10948
- .filter(Boolean)
10949
- .join(' '),
10950
- );
10951
- window.location.reload();
10952
- }
10953
- };
10954
- ws.onopen = () => {
10955
- if (config && typeof config.onOpen === "function") {
10956
- config.onOpen();
10957
- }
10958
- };
10959
- ws.onclose = (event) => {
10960
- if (event.code === 1006) {
10961
- console.log("Epic Web dev server web socket closed. Reconnecting...");
10962
- setTimeout(
10963
- () =>
10964
- epicLiveReloadConnect({
10965
- onOpen: () => window.location.reload(),
10966
- }),
10967
- 1000
10968
- );
10969
- }
10970
- };
10971
- ws.onerror = (error) => {
10972
- console.log("Epic Web dev server web socket error:");
10973
- console.error(error);
10974
- };
10975
- }
10976
- epicLiveReloadConnect();
10977
- `
10978
- );
10979
- return new Response(js, {
10980
- headers: {
10981
- "Content-Length": Buffer.byteLength(js).toString(),
10982
- "Content-Type": "text/javascript"
10983
- }
10984
- });
10985
- }
10986
10990
  const route13 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
10987
10991
  __proto__: null,
10988
- loader: loader$h
10992
+ loader: loader$c
10989
10993
  }, Symbol.toStringTag, { value: "Module" }));
10990
- async function loader$g({ request, params }) {
10994
+ async function loader$b({ request, params }) {
10991
10995
  var _a2;
10992
10996
  const timings = makeTimings("app_test_loader");
10993
10997
  const { testName } = params;
@@ -11127,499 +11131,11 @@ import(${JSON.stringify(testScriptPath)}).then(
11127
11131
  }
11128
11132
  const route14 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
11129
11133
  __proto__: null,
11130
- loader: loader$g
11134
+ loader: loader$b
11131
11135
  }, Symbol.toStringTag, { value: "Module" }));
11132
- async function loader$f({ request, params }) {
11133
- var _a2;
11134
- const timings = makeTimings("app");
11135
- const { id: appId } = params;
11136
- invariantResponse(appId, "App id is required");
11137
- const app = await getAppByName(appId, { request, timings });
11138
- const baseApp = isPlaygroundApp(app) ? await getAppByName(app.appName) : app;
11139
- if (!app) {
11140
- throw new Response(`App "${appId}" not found`, {
11141
- status: 404,
11142
- headers: { "Server-Timing": getServerTimeHeader(timings) }
11143
- });
11144
- }
11145
- if (app.dev.type === "script") {
11146
- return redirect(getBaseUrl({ request, port: app.dev.portNumber }), {
11147
- headers: { "Server-Timing": getServerTimeHeader(timings) }
11148
- });
11149
- }
11150
- if (app.dev.type !== "browser") {
11151
- throw new Response(
11152
- `App "${appId}" is not a browser app, its dev type is: "${app.dev.type}"`,
11153
- { status: 400 }
11154
- );
11155
- }
11156
- const htmlFile = path.join(app.fullPath, "index.html");
11157
- const hasHtml = await fsExtra.pathExists(htmlFile);
11158
- if (hasHtml) {
11159
- const html2 = await fsExtra.readFile(htmlFile);
11160
- return new Response(html2, {
11161
- headers: {
11162
- "Content-Length": Buffer.byteLength(html2).toString(),
11163
- "Content-Type": "text/html",
11164
- "Server-Timing": getServerTimeHeader(timings)
11165
- }
11166
- });
11167
- }
11168
- const indexFiles = (await fsExtra.readdir(app.fullPath)).filter(
11169
- (file) => file.startsWith("index.")
11170
- );
11171
- const indexCss = indexFiles.find((file) => file.endsWith("index.css"));
11172
- const indexJs = indexFiles.find((file) => file.endsWith("index.js"));
11173
- const indexTs = indexFiles.find((file) => file.endsWith("index.ts"));
11174
- const indexTsx = indexFiles.find((file) => file.endsWith("index.tsx"));
11175
- const scripts = [indexJs, indexTs, indexTsx].filter(Boolean);
11176
- if (scripts.length > 1) {
11177
- throw new Response(
11178
- `Only one index.(js|ts|tsx) file is allowed, found ${scripts.join(", ")}`,
11179
- { status: 400 }
11180
- );
11181
- }
11182
- const appTitle = app.title;
11183
- const workshopTitle = await getWorkshopTitle();
11184
- const baseAppTitle = isExerciseStepApp(baseApp) ? [
11185
- `${baseApp.stepNumber.toString().padStart(2, "0")}. ${baseApp.title}`,
11186
- `${baseApp.exerciseNumber.toString().padStart(2, "0")}. ${((_a2 = await getExercise(baseApp.exerciseNumber, { request, timings })) == null ? void 0 : _a2.title) ?? "Unknown"}`,
11187
- workshopTitle
11188
- ] : [(baseApp == null ? void 0 : baseApp.title) ?? "N/A"];
11189
- const title = (isExerciseStepApp(app) ? [
11190
- isProblemApp(app) ? "💪" : isSolutionApp(app) ? "🏁" : null,
11191
- ...baseAppTitle
11192
- ] : isPlaygroundApp(app) ? ["🛝", ...baseAppTitle] : [appTitle]).filter(Boolean).join(" | ");
11193
- const html = (
11194
- /* html */
11195
- `
11196
- <!DOCTYPE html>
11197
- <html>
11198
- <head>
11199
- <base href="${app.dev.pathname}" />
11200
- <meta charset="utf-8">
11201
- <meta name="viewport" content="width=device-width, initial-scale=1">
11202
- <title>${title}</title>
11203
- <link rel="stylesheet" href="/app-default.css">
11204
- ${indexCss ? `<link rel="stylesheet" href="${indexCss}">` : ""}
11205
- </head>
11206
- <body>
11207
- ${scripts.map((script) => `<script type="module" src="${script}"><\/script>`).join("\n")}
11208
- <script type="module" src="epic_ws.js"><\/script>
11209
- </body>
11210
- </html>
11211
- `
11212
- );
11213
- return new Response(html, {
11214
- headers: {
11215
- "Content-Length": Buffer.byteLength(html).toString(),
11216
- "Content-Type": "text/html",
11217
- "Server-Timing": getServerTimeHeader(timings)
11218
- }
11219
- });
11220
- }
11221
- const route15 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
11222
- __proto__: null,
11223
- loader: loader$f
11224
- }, Symbol.toStringTag, { value: "Module" }));
11225
- async function loader$e({ request, params }) {
11226
- const timings = makeTimings("app-file");
11227
- const { id: appId, "*": splat } = params;
11228
- const url = new URL(request.url);
11229
- const fileAppName = url.searchParams.get("fileAppName");
11230
- invariantResponse(appId, "App id is required");
11231
- invariantResponse(splat, "Splat is required");
11232
- const app = await getAppByName(appId);
11233
- const fileApp = fileAppName ? await getAppByName(fileAppName) : app;
11234
- if (!fileApp || !app) {
11235
- throw new Response(
11236
- `Apps with ids "${fileAppName}" (resolveDir) and "${appId}" (app) for resource "${splat}" not found`,
11237
- { status: 404 }
11238
- );
11239
- }
11240
- if (app.dev.type === "script") {
11241
- return redirect(getBaseUrl({ request, port: app.dev.portNumber }));
11242
- }
11243
- const filePath = path.join(fileApp.fullPath, splat);
11244
- const fileExists = await fsExtra.pathExists(filePath);
11245
- if (!fileExists) {
11246
- throw new Response("File not found", { status: 404 });
11247
- }
11248
- if (filePath.endsWith(".ts") || filePath.endsWith(".tsx")) {
11249
- const { outputFiles, errors } = await compileTs(filePath, app.fullPath, {
11250
- request,
11251
- timings
11252
- });
11253
- if (errors.length) {
11254
- console.error(`Failed to compile file "${filePath}"`);
11255
- console.error(errors);
11256
- throw new Response(errors.join("\n"), { status: 500 });
11257
- }
11258
- if (!(outputFiles == null ? void 0 : outputFiles[0])) {
11259
- throw new Response("Failed to compile file", { status: 500 });
11260
- }
11261
- const file = outputFiles[0].text;
11262
- return getFileResponse(file, { "Content-Type": "text/javascript" });
11263
- } else {
11264
- const file = await fsExtra.readFile(filePath);
11265
- const mimeType = mimeTypes.lookup(filePath) || "text/plain";
11266
- return getFileResponse(file, { "Content-Type": mimeType });
11267
- }
11268
- function getFileResponse(file, headers2 = {}) {
11269
- const etagValue = etag(file);
11270
- const ifNoneMatch = request.headers.get("if-none-match");
11271
- if (ifNoneMatch === etagValue) {
11272
- return new Response(null, { status: 304 });
11273
- }
11274
- return new Response(file, {
11275
- headers: combineHeaders(
11276
- {
11277
- "Content-Length": Buffer.byteLength(file).toString(),
11278
- "Server-Timing": timings.toString(),
11279
- ETag: etagValue
11280
- },
11281
- headers2
11282
- )
11283
- });
11284
- }
11285
- }
11286
- const route16 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
11287
- __proto__: null,
11288
- loader: loader$e
11289
- }, Symbol.toStringTag, { value: "Module" }));
11290
- async function loader$d(args) {
11291
- const api = await getApiModule(args);
11292
- invariantResponse(
11293
- api.mod.loader,
11294
- "Attempted to make a GET request to the api endpoint but the api module does not export a loader function",
11295
- { status: 405 }
11296
- );
11297
- try {
11298
- const result = await api.mod.loader(args);
11299
- return result;
11300
- } catch (error) {
11301
- api.cleanupError(error);
11302
- }
11303
- }
11304
- async function action$3(args) {
11305
- const api = await getApiModule(args);
11306
- invariantResponse(
11307
- api.mod.action,
11308
- "Attempted to make a non-GET request to the api endpoint but the api module does not export an action function",
11309
- { status: 405 }
11310
- );
11311
- try {
11312
- const result = await api.mod.action(args);
11313
- return result;
11314
- } catch (error) {
11315
- api.cleanupError(error);
11316
- }
11317
- }
11318
- const ApiModuleSchema = z$1.object({
11319
- loader: z$1.function().optional(),
11320
- action: z$1.function().optional()
11321
- });
11322
- async function getApiModule({ request, params }) {
11323
- const timings = makeTimings("app-api");
11324
- const { id: appId } = params;
11325
- const url = new URL(request.url);
11326
- const fileAppName = url.searchParams.get("fileAppName");
11327
- invariantResponse(appId, "App id is required");
11328
- const app = await getAppByName(appId);
11329
- const fileApp = fileAppName ? await getAppByName(fileAppName) : app;
11330
- if (!fileApp || !app) {
11331
- throw new Response(
11332
- `Apps with ids "${fileAppName}" (resolveDir) and "${appId}" (app) for api not found`,
11333
- { status: 404 }
11334
- );
11335
- }
11336
- if (app.dev.type === "script") {
11337
- throw redirect(getBaseUrl({ request, port: app.dev.portNumber }));
11338
- }
11339
- const apiFiles = (await fsExtra.readdir(app.fullPath)).filter((file) => /^api\.server\.(ts|tsx|js|jsx)$/.test(file)).map((f) => path$1.join(app.fullPath, f));
11340
- const apiFile = apiFiles[0];
11341
- if (!apiFile) {
11342
- throw new Response(
11343
- `No api.server.(ts|tsx|js|jsx) file found in "${app.fullPath}"`,
11344
- { status: 404 }
11345
- );
11346
- }
11347
- if (apiFiles.length > 1) {
11348
- throw new Response(
11349
- `Only one api.server.(ts|tsx|js|jsx) file is allowed, found ${apiFiles.join(", ")}`,
11350
- { status: 400 }
11351
- );
11352
- }
11353
- const { outputFiles, errors } = await compileTs(apiFile, app.fullPath, {
11354
- esbuildOptions: {
11355
- platform: "node",
11356
- // remove the process.env define
11357
- define: {}
11358
- },
11359
- request,
11360
- timings
11361
- });
11362
- if (errors.length) {
11363
- console.error(`Failed to compile file "${apiFile}"`);
11364
- console.error(errors);
11365
- throw new Response(errors.join("\n"), { status: 500 });
11366
- }
11367
- if (!(outputFiles == null ? void 0 : outputFiles[0])) {
11368
- throw new Response(`Failed to compile file "${apiFile}"`, { status: 500 });
11369
- }
11370
- const apiCode = outputFiles[0].text;
11371
- const dataUrl = `data:text/javascript;base64,${Buffer.from(apiCode).toString("base64")}`;
11372
- const mod = await import(
11373
- /* @vite-ignore */
11374
- dataUrl
11375
- ).catch(cleanupError);
11376
- const apiModule = ApiModuleSchema.safeParse(mod);
11377
- if (!apiModule.success) {
11378
- throw new Response(
11379
- `Invalid api module. It should export a loader and/or action: ${apiModule.error.message}`,
11380
- { status: 500 }
11381
- );
11382
- }
11383
- return {
11384
- mod: apiModule.data,
11385
- cleanupError
11386
- };
11387
- function cleanupError(error) {
11388
- if (apiFile && error instanceof Error && error.stack) {
11389
- error.stack = error.stack.replace(dataUrl, apiFile);
11390
- }
11391
- throw error;
11392
- }
11393
- }
11394
- const route17 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
11395
- __proto__: null,
11396
- action: action$3,
11397
- loader: loader$d
11398
- }, Symbol.toStringTag, { value: "Module" }));
11399
- async function loader$c({ request, params }) {
11400
- const { id: appId } = params;
11401
- const url = new URL(request.url);
11402
- const fileAppName = url.searchParams.get("fileAppName");
11403
- invariantResponse(appId, "App id is required");
11404
- const app = await getAppByName(appId);
11405
- const fileApp = fileAppName ? await getAppByName(fileAppName) : app;
11406
- if (!app || !fileApp) {
11407
- throw new Response(
11408
- `Apps with ids "${fileAppName}" (resolveDir) or "${appId}" (app) not found`,
11409
- { status: 404 }
11410
- );
11411
- }
11412
- if (app.dev.type === "script") {
11413
- return redirect(getBaseUrl({ request, port: app.dev.portNumber }));
11414
- }
11415
- const relevantPaths = Array.from(/* @__PURE__ */ new Set([app.fullPath, fileApp.fullPath]));
11416
- const js = (
11417
- /* javascript */
11418
- `
11419
- function epicLiveReloadConnect(config) {
11420
- const protocol = location.protocol === "https:" ? "wss:" : "ws:";
11421
- const host = location.hostname;
11422
- const port = location.port;
11423
- const socketPath = protocol + "//" + host + ":" + port + "/__ws";
11424
- const ws = new WebSocket(socketPath);
11425
- ws.onmessage = (message) => {
11426
- const event = JSON.parse(message.data);
11427
- if (event.type !== 'epicshop:file-change') return;
11428
- const { filePaths } = event.data;
11429
- if (${JSON.stringify(relevantPaths)}.some(p => filePaths.some(filePath => filePath.startsWith(p)))) {
11430
- console.log(
11431
- ['🐨 Reloading', window.frameElement?.getAttribute('title')]
11432
- .filter(Boolean)
11433
- .join(' '),
11434
- );
11435
- window.location.reload();
11436
- }
11437
- };
11438
- ws.onopen = () => {
11439
- if (config && typeof config.onOpen === "function") {
11440
- config.onOpen();
11441
- }
11442
- };
11443
- ws.onclose = (event) => {
11444
- if (event.code === 1006) {
11445
- console.log("Epic Web dev server web socket closed. Reconnecting...");
11446
- setTimeout(
11447
- () =>
11448
- epicLiveReloadConnect({
11449
- onOpen: () => window.location.reload(),
11450
- }),
11451
- 1000
11452
- );
11453
- }
11454
- };
11455
- ws.onerror = (error) => {
11456
- console.log("Epic Web dev server web socket error:");
11457
- console.error(error);
11458
- };
11459
- }
11460
- epicLiveReloadConnect();
11461
- `
11462
- );
11463
- return new Response(js, {
11464
- headers: {
11465
- "Content-Length": Buffer.byteLength(js).toString(),
11466
- "Content-Type": "text/javascript"
11467
- }
11468
- });
11469
- }
11470
- const route18 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
11471
- __proto__: null,
11472
- loader: loader$c
11473
- }, Symbol.toStringTag, { value: "Module" }));
11474
- async function loader$b({ request, params }) {
11475
- var _a2;
11476
- const timings = makeTimings("app_test_loader");
11477
- const { id: appId, testName } = params;
11478
- invariantResponse(appId, "App id is required");
11479
- invariantResponse(testName, "Test name is required");
11480
- const app = await getAppByName(appId, { request, timings });
11481
- if (!app) {
11482
- throw new Response(`App "${appId}" not found`, {
11483
- status: 404,
11484
- headers: { "Server-Timing": getServerTimeHeader(timings) }
11485
- });
11486
- }
11487
- if (app.test.type !== "browser" || app.dev.type !== "browser") {
11488
- return redirectWithToast(
11489
- "/",
11490
- {
11491
- type: "error",
11492
- title: "Unsupported",
11493
- description: `Cannot load this app's tests in the browser`
11494
- },
11495
- { headers: { "Server-Timing": getServerTimeHeader(timings) } }
11496
- );
11497
- }
11498
- const testFile = app.test.testFiles.find((file) => file === testName);
11499
- if (!testFile) {
11500
- throw new Response(`Test "${testName}" not found`, {
11501
- status: 404,
11502
- headers: { "Server-Timing": getServerTimeHeader(timings) }
11503
- });
11504
- }
11505
- if (!/(js|ts|tsx)$/.test(testFile)) {
11506
- throw new Response(`Test "${testName}" is not a script`, {
11507
- status: 400,
11508
- headers: { "Server-Timing": getServerTimeHeader(timings) }
11509
- });
11510
- }
11511
- let testFileAppName = app.name;
11512
- if (isProblemApp(app)) {
11513
- testFileAppName = isProblemApp(app) ? app.solutionName : null;
11514
- }
11515
- if (isPlaygroundApp(app)) {
11516
- const appBasis = await getAppByName(app.appName);
11517
- testFileAppName = isProblemApp(appBasis) ? appBasis.solutionName : null;
11518
- }
11519
- const testFileQueryString = testFileAppName ? `?fileAppName=${encodeURIComponent(testFileAppName)}` : "";
11520
- const testScriptPath = `${app.dev.pathname}${testFile}${testFileQueryString}`;
11521
- const testScriptSrc = (
11522
- /* javascript */
11523
- `
11524
- function logStatus(message) {
11525
- if (window.parent !== window) {
11526
- window.parent.postMessage(
11527
- { type: 'epicshop:test-status-update', ...message },
11528
- '*',
11529
- )
11530
- } else {
11531
- if (message.status === 'fail') {
11532
- console.error(message)
11533
- } else if (message.status === 'pending') {
11534
- console.info(message)
11535
- } else if (message.status === 'pass') {
11536
- console.log(message)
11537
- }
11538
- }
11539
- }
11540
- const testFile = ${JSON.stringify(testFile)}
11541
- logStatus({status: 'pending', timestamp: Date.now()})
11542
- import(${JSON.stringify(testScriptPath)}).then(
11543
- () => {
11544
- logStatus({ status: 'pass', timestamp: Date.now() })
11545
- },
11546
- error => {
11547
- logStatus({
11548
- status: 'fail',
11549
- error:
11550
- typeof error === 'string'
11551
- ? error
11552
- : typeof error === 'object' && error && 'message' in error
11553
- ? error.message
11554
- : 'unknown error',
11555
- timestamp: Date.now(),
11556
- })
11557
- throw error
11558
- },
11559
- )
11560
- `
11561
- );
11562
- const testScriptTag = `<script type="module">${testScriptSrc}<\/script>`;
11563
- const htmlFile = path.join(app.fullPath, "index.html");
11564
- const hasHtml = await fsExtra.pathExists(htmlFile);
11565
- if (hasHtml) {
11566
- const html2 = await fsExtra.readFile(htmlFile);
11567
- const testableHtml = html2.toString().replace(`</body>`, `${testScriptTag}</body>`);
11568
- return new Response(testableHtml, {
11569
- headers: {
11570
- "Content-Length": Buffer.byteLength(testableHtml).toString(),
11571
- "Content-Type": "text/html",
11572
- "Server-Timing": getServerTimeHeader(timings)
11573
- }
11574
- });
11575
- }
11576
- const indexFiles = (await fsExtra.readdir(app.fullPath)).filter(
11577
- (file) => file.startsWith("index.")
11578
- );
11579
- const indexCss = indexFiles.find((file) => file.endsWith("index.css"));
11580
- const appTitle = app.title;
11581
- const workshopTitle = await getWorkshopTitle();
11582
- const title = (isExerciseStepApp(app) ? [
11583
- isProblemApp(app) ? "🧪💪" : isSolutionApp(app) ? "🧪🏁" : null,
11584
- `${app.stepNumber.toString().padStart(2, "0")}. ${app.title}`,
11585
- `${app.exerciseNumber.toString().padStart(2, "0")}. ${((_a2 = await getExercise(app.exerciseNumber, { request, timings })) == null ? void 0 : _a2.title) ?? "Unknown"}`,
11586
- workshopTitle
11587
- ] : ["🧪", appTitle]).filter(Boolean).join(" | ");
11588
- const html = (
11589
- /* html */
11590
- `
11591
- <!DOCTYPE html>
11592
- <html>
11593
- <head>
11594
- <base href="${app.dev.pathname}" />
11595
- <meta charset="utf-8">
11596
- <meta name="viewport" content="width=device-width, initial-scale=1">
11597
- <title>${title}</title>
11598
- <link rel="stylesheet" href="/app-default.css">
11599
- ${indexCss ? `<link rel="stylesheet" href="${indexCss}">` : ""}
11600
- </head>
11601
- <body>
11602
- ${testScriptTag}
11603
- <script type="module" src="epic_ws.js${testFileQueryString}"><\/script>
11604
- </body>
11605
- </html>
11606
- `
11607
- );
11608
- return new Response(html, {
11609
- headers: {
11610
- "Content-Length": Buffer.byteLength(html).toString(),
11611
- "Content-Type": "text/html",
11612
- "Server-Timing": getServerTimeHeader(timings)
11613
- }
11614
- });
11615
- }
11616
- const route19 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
11617
- __proto__: null,
11618
- loader: loader$b
11619
- }, Symbol.toStringTag, { value: "Module" }));
11620
- const meta$1 = ({
11621
- matches
11622
- }) => {
11136
+ const meta$1 = ({
11137
+ matches
11138
+ }) => {
11623
11139
  var _a2;
11624
11140
  const rootData = (_a2 = matches.find((m) => m.id === "root")) == null ? void 0 : _a2.data;
11625
11141
  return [{ title: `🎉 ${rootData == null ? void 0 : rootData.workshopTitle}` }];
@@ -11757,7 +11273,7 @@ function Survey({
11757
11273
  )
11758
11274
  ] });
11759
11275
  }
11760
- const route21 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
11276
+ const route16 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
11761
11277
  __proto__: null,
11762
11278
  default: ExerciseFinished,
11763
11279
  headers: headers$2,
@@ -11889,7 +11405,7 @@ function Index() {
11889
11405
  function ErrorBoundary() {
11890
11406
  return /* @__PURE__ */ jsx(GeneralErrorBoundary, {});
11891
11407
  }
11892
- const route22 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
11408
+ const route17 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
11893
11409
  __proto__: null,
11894
11410
  ErrorBoundary,
11895
11411
  default: Index,
@@ -11990,7 +11506,7 @@ async function loader$8({ request }) {
11990
11506
  };
11991
11507
  });
11992
11508
  }
11993
- const route32 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
11509
+ const route27 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
11994
11510
  __proto__: null,
11995
11511
  EventSchema,
11996
11512
  loader: loader$8
@@ -12114,7 +11630,7 @@ function Logo({ className = "" }) {
12114
11630
  }
12115
11631
  );
12116
11632
  }
12117
- const route23 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
11633
+ const route18 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
12118
11634
  __proto__: null,
12119
11635
  action: action$2,
12120
11636
  default: Login,
@@ -12173,7 +11689,7 @@ function Support() {
12173
11689
  ] })
12174
11690
  ] });
12175
11691
  }
12176
- const route24 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
11692
+ const route19 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
12177
11693
  __proto__: null,
12178
11694
  default: Support
12179
11695
  }, Symbol.toStringTag, { value: "Module" }));
@@ -12418,7 +11934,7 @@ function Pinger({
12418
11934
  )
12419
11935
  ] });
12420
11936
  }
12421
- const route25 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
11937
+ const route20 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
12422
11938
  __proto__: null,
12423
11939
  action: action$1,
12424
11940
  default: AdminLayout,
@@ -12429,7 +11945,7 @@ async function loader$5() {
12429
11945
  const apps = await getApps();
12430
11946
  return json({ apps });
12431
11947
  }
12432
- const route26 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
11948
+ const route21 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
12433
11949
  __proto__: null,
12434
11950
  loader: loader$5
12435
11951
  }, Symbol.toStringTag, { value: "Module" }));
@@ -12441,7 +11957,7 @@ async function loader$4({ request }) {
12441
11957
  { headers: { "Server-Timing": getServerTimeHeader(timings) } }
12442
11958
  );
12443
11959
  }
12444
- const route27 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
11960
+ const route22 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
12445
11961
  __proto__: null,
12446
11962
  loader: loader$4
12447
11963
  }, Symbol.toStringTag, { value: "Module" }));
@@ -12530,7 +12046,7 @@ function DiffViewer() {
12530
12046
  }
12531
12047
  );
12532
12048
  }
12533
- const route28 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
12049
+ const route23 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
12534
12050
  __proto__: null,
12535
12051
  default: DiffViewer,
12536
12052
  loader: loader$3
@@ -12543,7 +12059,7 @@ async function loader$2({ request }) {
12543
12059
  { headers: { "Server-Timing": getServerTimeHeader(timings) } }
12544
12060
  );
12545
12061
  }
12546
- const route30 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
12062
+ const route25 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
12547
12063
  __proto__: null,
12548
12064
  loader: loader$2
12549
12065
  }, Symbol.toStringTag, { value: "Module" }));
@@ -12585,7 +12101,7 @@ function Onboarding() {
12585
12101
  /* @__PURE__ */ jsx(Form, { method: "post", className: "pb-4", children: /* @__PURE__ */ jsx(Button, { name: "intent", value: "complete", varient: "primary", children: "I've watched it. Let's go!" }) })
12586
12102
  ] });
12587
12103
  }
12588
- const route33 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
12104
+ const route28 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
12589
12105
  __proto__: null,
12590
12106
  action,
12591
12107
  default: Onboarding,
@@ -12610,11 +12126,11 @@ async function loader() {
12610
12126
  }
12611
12127
  return json({ processes, testProcesses: testProcesses2 });
12612
12128
  }
12613
- const route34 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
12129
+ const route29 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
12614
12130
  __proto__: null,
12615
12131
  loader
12616
12132
  }, Symbol.toStringTag, { value: "Module" }));
12617
- const serverManifest = { "entry": { "module": "/assets/entry.client-DBBrAxtJ.js", "imports": ["/assets/index-D1WEsmVZ.js", "/assets/components-Dj3sm47B.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-B02acrJe.js", "imports": ["/assets/index-D1WEsmVZ.js", "/assets/components-Dj3sm47B.js", "/assets/clsx-B-dksMZM.js", "/assets/misc-CXGQ7VS9.js", "/assets/index-B8k-Gd1G.js", "/assets/tooltip-CVFWPOu0.js", "/assets/client-hints-KnbHFIgn.js", "/assets/error-boundary-Bg54_knF.js", "/assets/progress-bar-DX6yYES2.js", "/assets/index-BL4aE6WC.js", "/assets/index-CLnz0tXz.js", "/assets/presence-u-05JV3Z.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/_-ByTWgb53.js", "imports": ["/assets/index-D1WEsmVZ.js", "/assets/clsx-B-dksMZM.js", "/assets/components-Dj3sm47B.js", "/assets/misc-CXGQ7VS9.js", "/assets/error-boundary-Bg54_knF.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-D7Qo_r0X.js", "imports": ["/assets/index-D1WEsmVZ.js", "/assets/clsx-B-dksMZM.js", "/assets/components-Dj3sm47B.js", "/assets/misc-CXGQ7VS9.js", "/assets/index-B8k-Gd1G.js", "/assets/tooltip-CVFWPOu0.js", "/assets/client-hints-KnbHFIgn.js", "/assets/progress-CBZt2pmu.js", "/assets/index-CLnz0tXz.js", "/assets/user-DiGtbaa7.js", "/assets/presence-u-05JV3Z.js"], "css": [] }, "routes/_app+/_exercises+/_layout": { "id": "routes/_app+/_exercises+/_layout", "parentId": "routes/_app+/_layout", "path": void 0, "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_layout-Bj9PyQQD.js", "imports": ["/assets/index-D1WEsmVZ.js"], "css": [] }, "routes/_app+/_exercises+/$exerciseNumber": { "id": "routes/_app+/_exercises+/$exerciseNumber", "parentId": "routes/_app+/_exercises+/_layout", "path": ":exerciseNumber", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/_exerciseNumber-s_qbmGEJ.js", "imports": ["/assets/index-D1WEsmVZ.js", "/assets/components-Dj3sm47B.js", "/assets/clsx-B-dksMZM.js", "/assets/client-hints-KnbHFIgn.js", "/assets/misc-CXGQ7VS9.js", "/assets/index-B8k-Gd1G.js", "/assets/tooltip-CVFWPOu0.js", "/assets/loading-D-DClzm1.js", "/assets/index-CLnz0tXz.js", "/assets/epic-video-Df7qGSN7.js", "/assets/progress-bar-DX6yYES2.js", "/assets/index-BfoHqrT5.js", "/assets/mdx-ytg-y2nh.js", "/assets/progress-CBZt2pmu.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/_exercises+/$exerciseNumber_.$stepNumber": { "id": "routes/_app+/_exercises+/$exerciseNumber_.$stepNumber", "parentId": "routes/_app+/_exercises+/_layout", "path": ":exerciseNumber/:stepNumber", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/_exerciseNumber_._stepNumber-D1wwEMQx.js", "imports": ["/assets/index-D1WEsmVZ.js", "/assets/clsx-B-dksMZM.js", "/assets/components-Dj3sm47B.js", "/assets/misc-CXGQ7VS9.js"], "css": [] }, "routes/_app+/_exercises+/$exerciseNumber_.$stepNumber.$type+/_layout": { "id": "routes/_app+/_exercises+/$exerciseNumber_.$stepNumber.$type+/_layout", "parentId": "routes/_app+/_exercises+/$exerciseNumber_.$stepNumber", "path": ":type", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/_layout-49l6Rvwp.js", "imports": ["/assets/index-D1WEsmVZ.js", "/assets/components-Dj3sm47B.js", "/assets/clsx-B-dksMZM.js", "/assets/misc-CXGQ7VS9.js", "/assets/client-hints-KnbHFIgn.js", "/assets/index-B8k-Gd1G.js", "/assets/tooltip-CVFWPOu0.js", "/assets/loading-D-DClzm1.js", "/assets/index-CLnz0tXz.js", "/assets/epic-video-Df7qGSN7.js", "/assets/progress-bar-DX6yYES2.js", "/assets/mdx-ytg-y2nh.js", "/assets/user-DiGtbaa7.js", "/assets/index-BfoHqrT5.js", "/assets/diff-CT3-9rtW.js", "/assets/discord-CsluX01E.js", "/assets/index-BL4aE6WC.js", "/assets/button-DnQOyJAN.js", "/assets/use-event-source-DXlRuRq2.js", "/assets/error-boundary-Bg54_knF.js", "/assets/nav-chevrons-D8c9lJW6.js", "/assets/progress-CBZt2pmu.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/_exercises+/$exerciseNumber_.$stepNumber.index": { "id": "routes/_app+/_exercises+/$exerciseNumber_.$stepNumber.index", "parentId": "routes/_app+/_exercises+/$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+/_exercises+/$exerciseNumber_.finished": { "id": "routes/_app+/_exercises+/$exerciseNumber_.finished", "parentId": "routes/_app+/_exercises+/_layout", "path": ":exerciseNumber/finished", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_exerciseNumber_.finished-DJgT9oaU.js", "imports": ["/assets/index-D1WEsmVZ.js", "/assets/components-Dj3sm47B.js", "/assets/clsx-B-dksMZM.js", "/assets/client-hints-KnbHFIgn.js", "/assets/misc-CXGQ7VS9.js", "/assets/index-B8k-Gd1G.js", "/assets/tooltip-CVFWPOu0.js", "/assets/loading-D-DClzm1.js", "/assets/index-CLnz0tXz.js", "/assets/epic-video-Df7qGSN7.js", "/assets/progress-bar-DX6yYES2.js", "/assets/index-BfoHqrT5.js", "/assets/nav-chevrons-D8c9lJW6.js", "/assets/mdx-ytg-y2nh.js", "/assets/progress-CBZt2pmu.js"], "css": ["/assets/epic-video-DUnRvy1A.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-Bk4o4AzZ.js", "imports": ["/assets/index-D1WEsmVZ.js", "/assets/clsx-B-dksMZM.js", "/assets/components-Dj3sm47B.js", "/assets/index-B8k-Gd1G.js", "/assets/button-DnQOyJAN.js", "/assets/misc-CXGQ7VS9.js", "/assets/user-DiGtbaa7.js", "/assets/presence-u-05JV3Z.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+/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+/kcd_ws[.js]": { "id": "routes/_app+/app.$appName+/kcd_ws[.js]", "parentId": "routes/_app+/_layout", "path": "app/:appName/kcd_ws.js", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/kcd_ws_.js_-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.$id": { "id": "routes/_app+/app.$id", "parentId": "routes/_app+/_layout", "path": "app/:id", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/app._id-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/app.$id.$": { "id": "routes/_app+/app.$id.$", "parentId": "routes/_app+/app.$id", "path": "*", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/app._id._-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/app.$id.api.$": { "id": "routes/_app+/app.$id.api.$", "parentId": "routes/_app+/app.$id", "path": "api/*", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/app._id.api._-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/app.$id.epic_ws[.js]": { "id": "routes/_app+/app.$id.epic_ws[.js]", "parentId": "routes/_app+/app.$id", "path": "epic_ws.js", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/app._id.epic_ws_.js_-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/app.$id.test.$testName": { "id": "routes/_app+/app.$id.test.$testName", "parentId": "routes/_app+/app.$id", "path": "test/:testName", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/app._id.test._testName-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-CK7yz4w6.js", "imports": ["/assets/index-D1WEsmVZ.js", "/assets/clsx-B-dksMZM.js", "/assets/components-Dj3sm47B.js", "/assets/misc-CXGQ7VS9.js", "/assets/user-DiGtbaa7.js", "/assets/discord-CsluX01E.js"], "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-Dw3SJA8A.js", "imports": ["/assets/index-D1WEsmVZ.js", "/assets/components-Dj3sm47B.js", "/assets/clsx-B-dksMZM.js", "/assets/client-hints-KnbHFIgn.js", "/assets/misc-CXGQ7VS9.js", "/assets/index-B8k-Gd1G.js", "/assets/tooltip-CVFWPOu0.js", "/assets/loading-D-DClzm1.js", "/assets/index-CLnz0tXz.js", "/assets/epic-video-Df7qGSN7.js", "/assets/progress-bar-DX6yYES2.js", "/assets/index-BfoHqrT5.js", "/assets/mdx-ytg-y2nh.js", "/assets/progress-CBZt2pmu.js", "/assets/nav-chevrons-D8c9lJW6.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-YgRENgjt.js", "imports": ["/assets/index-D1WEsmVZ.js", "/assets/components-Dj3sm47B.js", "/assets/clsx-B-dksMZM.js", "/assets/client-hints-KnbHFIgn.js", "/assets/misc-CXGQ7VS9.js", "/assets/index-B8k-Gd1G.js", "/assets/tooltip-CVFWPOu0.js", "/assets/loading-D-DClzm1.js", "/assets/index-CLnz0tXz.js", "/assets/epic-video-Df7qGSN7.js", "/assets/progress-bar-DX6yYES2.js", "/assets/index-BfoHqrT5.js", "/assets/progress-CBZt2pmu.js", "/assets/error-boundary-Bg54_knF.js", "/assets/mdx-ytg-y2nh.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-CjvZj820.js", "imports": ["/assets/index-D1WEsmVZ.js", "/assets/clsx-B-dksMZM.js", "/assets/components-Dj3sm47B.js", "/assets/client-hints-KnbHFIgn.js", "/assets/use-event-source-DXlRuRq2.js", "/assets/index-B8k-Gd1G.js", "/assets/button-DnQOyJAN.js", "/assets/loading-D-DClzm1.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-QTdmLyE7.js", "imports": ["/assets/index-D1WEsmVZ.js", "/assets/components-Dj3sm47B.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-BaPtC79F.js", "imports": ["/assets/index-D1WEsmVZ.js", "/assets/clsx-B-dksMZM.js", "/assets/components-Dj3sm47B.js", "/assets/misc-CXGQ7VS9.js", "/assets/tooltip-CVFWPOu0.js", "/assets/progress-CBZt2pmu.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-DP2rzg_V.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-l0sNRNKZ.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-CLRdJhCn.js", "imports": ["/assets/index-D1WEsmVZ.js", "/assets/clsx-B-dksMZM.js", "/assets/components-Dj3sm47B.js", "/assets/misc-CXGQ7VS9.js", "/assets/client-hints-KnbHFIgn.js", "/assets/index-B8k-Gd1G.js", "/assets/tooltip-CVFWPOu0.js", "/assets/loading-D-DClzm1.js", "/assets/index-CLnz0tXz.js", "/assets/epic-video-Df7qGSN7.js", "/assets/progress-bar-DX6yYES2.js", "/assets/mdx-ytg-y2nh.js", "/assets/diff-CT3-9rtW.js", "/assets/nav-chevrons-D8c9lJW6.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/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-BxcIdiGj.js", "imports": ["/assets/index-D1WEsmVZ.js", "/assets/clsx-B-dksMZM.js", "/assets/components-Dj3sm47B.js", "/assets/client-hints-KnbHFIgn.js", "/assets/misc-CXGQ7VS9.js", "/assets/index-B8k-Gd1G.js", "/assets/tooltip-CVFWPOu0.js", "/assets/loading-D-DClzm1.js", "/assets/index-CLnz0tXz.js", "/assets/button-DnQOyJAN.js", "/assets/epic-video-Df7qGSN7.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/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/start": { "id": "routes/start", "parentId": "root", "path": "start", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/start-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/test": { "id": "routes/test", "parentId": "root", "path": "test", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/test-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/theme/index": { "id": "routes/theme/index", "parentId": "root", "path": "theme", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/index-DP2rzg_V.js", "imports": [], "css": [] }, "routes/update-mdx-cache": { "id": "routes/update-mdx-cache", "parentId": "root", "path": "update-mdx-cache", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/update-mdx-cache-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/video-player/index": { "id": "routes/video-player/index", "parentId": "root", "path": "video-player", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/index-K6Dvbx-E.js", "imports": [], "css": [] } }, "url": "/assets/manifest-ca420c07.js", "version": "ca420c07" };
12133
+ const serverManifest = { "entry": { "module": "/assets/entry.client-DBBrAxtJ.js", "imports": ["/assets/index-D1WEsmVZ.js", "/assets/components-Dj3sm47B.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-B02acrJe.js", "imports": ["/assets/index-D1WEsmVZ.js", "/assets/components-Dj3sm47B.js", "/assets/clsx-B-dksMZM.js", "/assets/misc-CXGQ7VS9.js", "/assets/index-B8k-Gd1G.js", "/assets/tooltip-CVFWPOu0.js", "/assets/client-hints-KnbHFIgn.js", "/assets/error-boundary-Bg54_knF.js", "/assets/progress-bar-DX6yYES2.js", "/assets/index-BL4aE6WC.js", "/assets/index-CLnz0tXz.js", "/assets/presence-u-05JV3Z.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/_-ByTWgb53.js", "imports": ["/assets/index-D1WEsmVZ.js", "/assets/clsx-B-dksMZM.js", "/assets/components-Dj3sm47B.js", "/assets/misc-CXGQ7VS9.js", "/assets/error-boundary-Bg54_knF.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-D7Qo_r0X.js", "imports": ["/assets/index-D1WEsmVZ.js", "/assets/clsx-B-dksMZM.js", "/assets/components-Dj3sm47B.js", "/assets/misc-CXGQ7VS9.js", "/assets/index-B8k-Gd1G.js", "/assets/tooltip-CVFWPOu0.js", "/assets/client-hints-KnbHFIgn.js", "/assets/progress-CBZt2pmu.js", "/assets/index-CLnz0tXz.js", "/assets/user-DiGtbaa7.js", "/assets/presence-u-05JV3Z.js"], "css": [] }, "routes/_app+/_exercises+/_layout": { "id": "routes/_app+/_exercises+/_layout", "parentId": "routes/_app+/_layout", "path": void 0, "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_layout-Bj9PyQQD.js", "imports": ["/assets/index-D1WEsmVZ.js"], "css": [] }, "routes/_app+/_exercises+/$exerciseNumber": { "id": "routes/_app+/_exercises+/$exerciseNumber", "parentId": "routes/_app+/_exercises+/_layout", "path": ":exerciseNumber", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/_exerciseNumber-s_qbmGEJ.js", "imports": ["/assets/index-D1WEsmVZ.js", "/assets/components-Dj3sm47B.js", "/assets/clsx-B-dksMZM.js", "/assets/client-hints-KnbHFIgn.js", "/assets/misc-CXGQ7VS9.js", "/assets/index-B8k-Gd1G.js", "/assets/tooltip-CVFWPOu0.js", "/assets/loading-D-DClzm1.js", "/assets/index-CLnz0tXz.js", "/assets/epic-video-Df7qGSN7.js", "/assets/progress-bar-DX6yYES2.js", "/assets/index-BfoHqrT5.js", "/assets/mdx-ytg-y2nh.js", "/assets/progress-CBZt2pmu.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/_exercises+/$exerciseNumber_.$stepNumber": { "id": "routes/_app+/_exercises+/$exerciseNumber_.$stepNumber", "parentId": "routes/_app+/_exercises+/_layout", "path": ":exerciseNumber/:stepNumber", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/_exerciseNumber_._stepNumber-D1wwEMQx.js", "imports": ["/assets/index-D1WEsmVZ.js", "/assets/clsx-B-dksMZM.js", "/assets/components-Dj3sm47B.js", "/assets/misc-CXGQ7VS9.js"], "css": [] }, "routes/_app+/_exercises+/$exerciseNumber_.$stepNumber.$type+/_layout": { "id": "routes/_app+/_exercises+/$exerciseNumber_.$stepNumber.$type+/_layout", "parentId": "routes/_app+/_exercises+/$exerciseNumber_.$stepNumber", "path": ":type", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/_layout-49l6Rvwp.js", "imports": ["/assets/index-D1WEsmVZ.js", "/assets/components-Dj3sm47B.js", "/assets/clsx-B-dksMZM.js", "/assets/misc-CXGQ7VS9.js", "/assets/client-hints-KnbHFIgn.js", "/assets/index-B8k-Gd1G.js", "/assets/tooltip-CVFWPOu0.js", "/assets/loading-D-DClzm1.js", "/assets/index-CLnz0tXz.js", "/assets/epic-video-Df7qGSN7.js", "/assets/progress-bar-DX6yYES2.js", "/assets/mdx-ytg-y2nh.js", "/assets/user-DiGtbaa7.js", "/assets/index-BfoHqrT5.js", "/assets/diff-CT3-9rtW.js", "/assets/discord-CsluX01E.js", "/assets/index-BL4aE6WC.js", "/assets/button-DnQOyJAN.js", "/assets/use-event-source-DXlRuRq2.js", "/assets/error-boundary-Bg54_knF.js", "/assets/nav-chevrons-D8c9lJW6.js", "/assets/progress-CBZt2pmu.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/_exercises+/$exerciseNumber_.$stepNumber.index": { "id": "routes/_app+/_exercises+/$exerciseNumber_.$stepNumber.index", "parentId": "routes/_app+/_exercises+/$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+/_exercises+/$exerciseNumber_.finished": { "id": "routes/_app+/_exercises+/$exerciseNumber_.finished", "parentId": "routes/_app+/_exercises+/_layout", "path": ":exerciseNumber/finished", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_exerciseNumber_.finished-DJgT9oaU.js", "imports": ["/assets/index-D1WEsmVZ.js", "/assets/components-Dj3sm47B.js", "/assets/clsx-B-dksMZM.js", "/assets/client-hints-KnbHFIgn.js", "/assets/misc-CXGQ7VS9.js", "/assets/index-B8k-Gd1G.js", "/assets/tooltip-CVFWPOu0.js", "/assets/loading-D-DClzm1.js", "/assets/index-CLnz0tXz.js", "/assets/epic-video-Df7qGSN7.js", "/assets/progress-bar-DX6yYES2.js", "/assets/index-BfoHqrT5.js", "/assets/nav-chevrons-D8c9lJW6.js", "/assets/mdx-ytg-y2nh.js", "/assets/progress-CBZt2pmu.js"], "css": ["/assets/epic-video-DUnRvy1A.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-Bk4o4AzZ.js", "imports": ["/assets/index-D1WEsmVZ.js", "/assets/clsx-B-dksMZM.js", "/assets/components-Dj3sm47B.js", "/assets/index-B8k-Gd1G.js", "/assets/button-DnQOyJAN.js", "/assets/misc-CXGQ7VS9.js", "/assets/user-DiGtbaa7.js", "/assets/presence-u-05JV3Z.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-DP2rzg_V.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+/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-CK7yz4w6.js", "imports": ["/assets/index-D1WEsmVZ.js", "/assets/clsx-B-dksMZM.js", "/assets/components-Dj3sm47B.js", "/assets/misc-CXGQ7VS9.js", "/assets/user-DiGtbaa7.js", "/assets/discord-CsluX01E.js"], "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-Dw3SJA8A.js", "imports": ["/assets/index-D1WEsmVZ.js", "/assets/components-Dj3sm47B.js", "/assets/clsx-B-dksMZM.js", "/assets/client-hints-KnbHFIgn.js", "/assets/misc-CXGQ7VS9.js", "/assets/index-B8k-Gd1G.js", "/assets/tooltip-CVFWPOu0.js", "/assets/loading-D-DClzm1.js", "/assets/index-CLnz0tXz.js", "/assets/epic-video-Df7qGSN7.js", "/assets/progress-bar-DX6yYES2.js", "/assets/index-BfoHqrT5.js", "/assets/mdx-ytg-y2nh.js", "/assets/progress-CBZt2pmu.js", "/assets/nav-chevrons-D8c9lJW6.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-YgRENgjt.js", "imports": ["/assets/index-D1WEsmVZ.js", "/assets/components-Dj3sm47B.js", "/assets/clsx-B-dksMZM.js", "/assets/client-hints-KnbHFIgn.js", "/assets/misc-CXGQ7VS9.js", "/assets/index-B8k-Gd1G.js", "/assets/tooltip-CVFWPOu0.js", "/assets/loading-D-DClzm1.js", "/assets/index-CLnz0tXz.js", "/assets/epic-video-Df7qGSN7.js", "/assets/progress-bar-DX6yYES2.js", "/assets/index-BfoHqrT5.js", "/assets/progress-CBZt2pmu.js", "/assets/error-boundary-Bg54_knF.js", "/assets/mdx-ytg-y2nh.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-CjvZj820.js", "imports": ["/assets/index-D1WEsmVZ.js", "/assets/clsx-B-dksMZM.js", "/assets/components-Dj3sm47B.js", "/assets/client-hints-KnbHFIgn.js", "/assets/use-event-source-DXlRuRq2.js", "/assets/index-B8k-Gd1G.js", "/assets/button-DnQOyJAN.js", "/assets/loading-D-DClzm1.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-QTdmLyE7.js", "imports": ["/assets/index-D1WEsmVZ.js", "/assets/components-Dj3sm47B.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-BaPtC79F.js", "imports": ["/assets/index-D1WEsmVZ.js", "/assets/clsx-B-dksMZM.js", "/assets/components-Dj3sm47B.js", "/assets/misc-CXGQ7VS9.js", "/assets/tooltip-CVFWPOu0.js", "/assets/progress-CBZt2pmu.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/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-CLRdJhCn.js", "imports": ["/assets/index-D1WEsmVZ.js", "/assets/clsx-B-dksMZM.js", "/assets/components-Dj3sm47B.js", "/assets/misc-CXGQ7VS9.js", "/assets/client-hints-KnbHFIgn.js", "/assets/index-B8k-Gd1G.js", "/assets/tooltip-CVFWPOu0.js", "/assets/loading-D-DClzm1.js", "/assets/index-CLnz0tXz.js", "/assets/epic-video-Df7qGSN7.js", "/assets/progress-bar-DX6yYES2.js", "/assets/mdx-ytg-y2nh.js", "/assets/diff-CT3-9rtW.js", "/assets/nav-chevrons-D8c9lJW6.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/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-BxcIdiGj.js", "imports": ["/assets/index-D1WEsmVZ.js", "/assets/clsx-B-dksMZM.js", "/assets/components-Dj3sm47B.js", "/assets/client-hints-KnbHFIgn.js", "/assets/misc-CXGQ7VS9.js", "/assets/index-B8k-Gd1G.js", "/assets/tooltip-CVFWPOu0.js", "/assets/loading-D-DClzm1.js", "/assets/index-CLnz0tXz.js", "/assets/button-DnQOyJAN.js", "/assets/epic-video-Df7qGSN7.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/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/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/update-mdx-cache": { "id": "routes/update-mdx-cache", "parentId": "root", "path": "update-mdx-cache", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/update-mdx-cache-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/video-player/index": { "id": "routes/video-player/index", "parentId": "root", "path": "video-player", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/index-l0sNRNKZ.js", "imports": [], "css": [] } }, "url": "/assets/manifest-db6261a7.js", "version": "db6261a7" };
12618
12134
  const mode = "production";
12619
12135
  const assetsBuildDirectory = "build/client";
12620
12136
  const basename = "/";
@@ -12719,19 +12235,19 @@ const routes = {
12719
12235
  caseSensitive: void 0,
12720
12236
  module: route11
12721
12237
  },
12722
- "routes/_app+/app.$appName+/index": {
12723
- id: "routes/_app+/app.$appName+/index",
12238
+ "routes/_app+/app.$appName+/epic_ws[.js]": {
12239
+ id: "routes/_app+/app.$appName+/epic_ws[.js]",
12724
12240
  parentId: "routes/_app+/_layout",
12725
- path: "app/:appName/",
12726
- index: true,
12241
+ path: "app/:appName/epic_ws.js",
12242
+ index: void 0,
12727
12243
  caseSensitive: void 0,
12728
12244
  module: route12
12729
12245
  },
12730
- "routes/_app+/app.$appName+/kcd_ws[.js]": {
12731
- id: "routes/_app+/app.$appName+/kcd_ws[.js]",
12246
+ "routes/_app+/app.$appName+/index": {
12247
+ id: "routes/_app+/app.$appName+/index",
12732
12248
  parentId: "routes/_app+/_layout",
12733
- path: "app/:appName/kcd_ws.js",
12734
- index: void 0,
12249
+ path: "app/:appName/",
12250
+ index: true,
12735
12251
  caseSensitive: void 0,
12736
12252
  module: route13
12737
12253
  },
@@ -12743,53 +12259,13 @@ const routes = {
12743
12259
  caseSensitive: void 0,
12744
12260
  module: route14
12745
12261
  },
12746
- "routes/_app+/app.$id": {
12747
- id: "routes/_app+/app.$id",
12748
- parentId: "routes/_app+/_layout",
12749
- path: "app/:id",
12750
- index: void 0,
12751
- caseSensitive: void 0,
12752
- module: route15
12753
- },
12754
- "routes/_app+/app.$id.$": {
12755
- id: "routes/_app+/app.$id.$",
12756
- parentId: "routes/_app+/app.$id",
12757
- path: "*",
12758
- index: void 0,
12759
- caseSensitive: void 0,
12760
- module: route16
12761
- },
12762
- "routes/_app+/app.$id.api.$": {
12763
- id: "routes/_app+/app.$id.api.$",
12764
- parentId: "routes/_app+/app.$id",
12765
- path: "api/*",
12766
- index: void 0,
12767
- caseSensitive: void 0,
12768
- module: route17
12769
- },
12770
- "routes/_app+/app.$id.epic_ws[.js]": {
12771
- id: "routes/_app+/app.$id.epic_ws[.js]",
12772
- parentId: "routes/_app+/app.$id",
12773
- path: "epic_ws.js",
12774
- index: void 0,
12775
- caseSensitive: void 0,
12776
- module: route18
12777
- },
12778
- "routes/_app+/app.$id.test.$testName": {
12779
- id: "routes/_app+/app.$id.test.$testName",
12780
- parentId: "routes/_app+/app.$id",
12781
- path: "test/:testName",
12782
- index: void 0,
12783
- caseSensitive: void 0,
12784
- module: route19
12785
- },
12786
12262
  "routes/_app+/discord": {
12787
12263
  id: "routes/_app+/discord",
12788
12264
  parentId: "routes/_app+/_layout",
12789
12265
  path: "discord",
12790
12266
  index: void 0,
12791
12267
  caseSensitive: void 0,
12792
- module: route20
12268
+ module: route15
12793
12269
  },
12794
12270
  "routes/_app+/finished": {
12795
12271
  id: "routes/_app+/finished",
@@ -12797,7 +12273,7 @@ const routes = {
12797
12273
  path: "finished",
12798
12274
  index: void 0,
12799
12275
  caseSensitive: void 0,
12800
- module: route21
12276
+ module: route16
12801
12277
  },
12802
12278
  "routes/_app+/index": {
12803
12279
  id: "routes/_app+/index",
@@ -12805,7 +12281,7 @@ const routes = {
12805
12281
  path: void 0,
12806
12282
  index: true,
12807
12283
  caseSensitive: void 0,
12808
- module: route22
12284
+ module: route17
12809
12285
  },
12810
12286
  "routes/_app+/login": {
12811
12287
  id: "routes/_app+/login",
@@ -12813,7 +12289,7 @@ const routes = {
12813
12289
  path: "login",
12814
12290
  index: void 0,
12815
12291
  caseSensitive: void 0,
12816
- module: route23
12292
+ module: route18
12817
12293
  },
12818
12294
  "routes/_app+/support": {
12819
12295
  id: "routes/_app+/support",
@@ -12821,7 +12297,7 @@ const routes = {
12821
12297
  path: "support",
12822
12298
  index: void 0,
12823
12299
  caseSensitive: void 0,
12824
- module: route24
12300
+ module: route19
12825
12301
  },
12826
12302
  "routes/admin+/_layout": {
12827
12303
  id: "routes/admin+/_layout",
@@ -12829,7 +12305,7 @@ const routes = {
12829
12305
  path: "admin",
12830
12306
  index: void 0,
12831
12307
  caseSensitive: void 0,
12832
- module: route25
12308
+ module: route20
12833
12309
  },
12834
12310
  "routes/admin+/apps": {
12835
12311
  id: "routes/admin+/apps",
@@ -12837,7 +12313,7 @@ const routes = {
12837
12313
  path: "apps",
12838
12314
  index: void 0,
12839
12315
  caseSensitive: void 0,
12840
- module: route26
12316
+ module: route21
12841
12317
  },
12842
12318
  "routes/apps": {
12843
12319
  id: "routes/apps",
@@ -12845,7 +12321,7 @@ const routes = {
12845
12321
  path: "apps",
12846
12322
  index: void 0,
12847
12323
  caseSensitive: void 0,
12848
- module: route27
12324
+ module: route22
12849
12325
  },
12850
12326
  "routes/diff": {
12851
12327
  id: "routes/diff",
@@ -12853,7 +12329,7 @@ const routes = {
12853
12329
  path: "diff",
12854
12330
  index: void 0,
12855
12331
  caseSensitive: void 0,
12856
- module: route28
12332
+ module: route23
12857
12333
  },
12858
12334
  "routes/discord.callback": {
12859
12335
  id: "routes/discord.callback",
@@ -12861,7 +12337,7 @@ const routes = {
12861
12337
  path: "discord/callback",
12862
12338
  index: void 0,
12863
12339
  caseSensitive: void 0,
12864
- module: route29
12340
+ module: route24
12865
12341
  },
12866
12342
  "routes/exercises": {
12867
12343
  id: "routes/exercises",
@@ -12869,7 +12345,7 @@ const routes = {
12869
12345
  path: "exercises",
12870
12346
  index: void 0,
12871
12347
  caseSensitive: void 0,
12872
- module: route30
12348
+ module: route25
12873
12349
  },
12874
12350
  "routes/launch-editor": {
12875
12351
  id: "routes/launch-editor",
@@ -12877,7 +12353,7 @@ const routes = {
12877
12353
  path: "launch-editor",
12878
12354
  index: void 0,
12879
12355
  caseSensitive: void 0,
12880
- module: route31
12356
+ module: route26
12881
12357
  },
12882
12358
  "routes/login-sse": {
12883
12359
  id: "routes/login-sse",
@@ -12885,7 +12361,7 @@ const routes = {
12885
12361
  path: "login-sse",
12886
12362
  index: void 0,
12887
12363
  caseSensitive: void 0,
12888
- module: route32
12364
+ module: route27
12889
12365
  },
12890
12366
  "routes/onboarding": {
12891
12367
  id: "routes/onboarding",
@@ -12893,7 +12369,7 @@ const routes = {
12893
12369
  path: "onboarding",
12894
12370
  index: void 0,
12895
12371
  caseSensitive: void 0,
12896
- module: route33
12372
+ module: route28
12897
12373
  },
12898
12374
  "routes/processes": {
12899
12375
  id: "routes/processes",
@@ -12901,7 +12377,7 @@ const routes = {
12901
12377
  path: "processes",
12902
12378
  index: void 0,
12903
12379
  caseSensitive: void 0,
12904
- module: route34
12380
+ module: route29
12905
12381
  },
12906
12382
  "routes/progress": {
12907
12383
  id: "routes/progress",
@@ -12909,7 +12385,7 @@ const routes = {
12909
12385
  path: "progress",
12910
12386
  index: void 0,
12911
12387
  caseSensitive: void 0,
12912
- module: route35
12388
+ module: route30
12913
12389
  },
12914
12390
  "routes/set-playground": {
12915
12391
  id: "routes/set-playground",
@@ -12917,7 +12393,7 @@ const routes = {
12917
12393
  path: "set-playground",
12918
12394
  index: void 0,
12919
12395
  caseSensitive: void 0,
12920
- module: route36
12396
+ module: route31
12921
12397
  },
12922
12398
  "routes/start": {
12923
12399
  id: "routes/start",
@@ -12925,7 +12401,7 @@ const routes = {
12925
12401
  path: "start",
12926
12402
  index: void 0,
12927
12403
  caseSensitive: void 0,
12928
- module: route37
12404
+ module: route32
12929
12405
  },
12930
12406
  "routes/test": {
12931
12407
  id: "routes/test",
@@ -12933,7 +12409,7 @@ const routes = {
12933
12409
  path: "test",
12934
12410
  index: void 0,
12935
12411
  caseSensitive: void 0,
12936
- module: route38
12412
+ module: route33
12937
12413
  },
12938
12414
  "routes/theme/index": {
12939
12415
  id: "routes/theme/index",
@@ -12941,7 +12417,7 @@ const routes = {
12941
12417
  path: "theme",
12942
12418
  index: void 0,
12943
12419
  caseSensitive: void 0,
12944
- module: route39
12420
+ module: route34
12945
12421
  },
12946
12422
  "routes/update-mdx-cache": {
12947
12423
  id: "routes/update-mdx-cache",
@@ -12949,7 +12425,7 @@ const routes = {
12949
12425
  path: "update-mdx-cache",
12950
12426
  index: void 0,
12951
12427
  caseSensitive: void 0,
12952
- module: route40
12428
+ module: route35
12953
12429
  },
12954
12430
  "routes/video-player/index": {
12955
12431
  id: "routes/video-player/index",
@@ -12957,7 +12433,7 @@ const routes = {
12957
12433
  path: "video-player",
12958
12434
  index: void 0,
12959
12435
  caseSensitive: void 0,
12960
- module: route41
12436
+ module: route36
12961
12437
  }
12962
12438
  };
12963
12439
  export {