@epic-web/workshop-app 5.3.7 → 5.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. package/build/client/assets/{_-CWSCXcBv.js → _-BrkpfnBb.js} +2 -2
  2. package/build/client/assets/{_-CWSCXcBv.js.map → _-BrkpfnBb.js.map} +1 -1
  3. package/build/client/assets/{_exerciseNumber-BnwWTYFw.js → _exerciseNumber-DCSM0NCG.js} +2 -2
  4. package/build/client/assets/{_exerciseNumber-BnwWTYFw.js.map → _exerciseNumber-DCSM0NCG.js.map} +1 -1
  5. package/build/client/assets/{_exerciseNumber_._stepNumber-BA2Xhzqs.js → _exerciseNumber_._stepNumber-BIMJh_sg.js} +2 -2
  6. package/build/client/assets/{_exerciseNumber_._stepNumber-BA2Xhzqs.js.map → _exerciseNumber_._stepNumber-BIMJh_sg.js.map} +1 -1
  7. package/build/client/assets/{_exerciseNumber_.finished-BfeMSie-.js → _exerciseNumber_.finished-nbpk1ToO.js} +2 -2
  8. package/build/client/assets/{_exerciseNumber_.finished-BfeMSie-.js.map → _exerciseNumber_.finished-nbpk1ToO.js.map} +1 -1
  9. package/build/client/assets/{_layout-pUNfVRe2.js → _layout-Cbz7Qt-S.js} +2 -2
  10. package/build/client/assets/{_layout-pUNfVRe2.js.map → _layout-Cbz7Qt-S.js.map} +1 -1
  11. package/build/client/assets/{_layout-Bpho30KN.js → _layout-DTAM9xh5.js} +2 -2
  12. package/build/client/assets/{_layout-Bpho30KN.js.map → _layout-DTAM9xh5.js.map} +1 -1
  13. package/build/client/assets/_layout-Dfmv2zcn.js +2 -0
  14. package/build/client/assets/_layout-Dfmv2zcn.js.map +1 -0
  15. package/build/client/assets/{accordion-DC885Li1.js → accordion-D9-D-n9p.js} +2 -2
  16. package/build/client/assets/{accordion-DC885Li1.js.map → accordion-D9-D-n9p.js.map} +1 -1
  17. package/build/client/assets/account-C4Piztoz.js +2 -0
  18. package/build/client/assets/account-C4Piztoz.js.map +1 -0
  19. package/build/client/assets/app-DgTXXO8s.js +2 -0
  20. package/build/client/assets/{app-CM8yuYni.js.map → app-DgTXXO8s.js.map} +1 -1
  21. package/build/client/assets/{button-DQ001ob0.js → button-_qPvcoqR.js} +2 -2
  22. package/build/client/assets/{button-DQ001ob0.js.map → button-_qPvcoqR.js.map} +1 -1
  23. package/build/client/assets/{components-9EGYHTc_.js → components-Be92gVxW.js} +2 -2
  24. package/build/client/assets/{components-9EGYHTc_.js.map → components-Be92gVxW.js.map} +1 -1
  25. package/build/client/assets/{diff-CyIaJAoJ.js → diff-8nlDkmpc.js} +2 -2
  26. package/build/client/assets/{diff-CyIaJAoJ.js.map → diff-8nlDkmpc.js.map} +1 -1
  27. package/build/client/assets/diff-BhRAIPKc.js +2 -0
  28. package/build/client/assets/{diff-Cnw7IcG5.js.map → diff-BhRAIPKc.js.map} +1 -1
  29. package/build/client/assets/discord-BUWZUTEC.js +2 -0
  30. package/build/client/assets/discord-BUWZUTEC.js.map +1 -0
  31. package/build/client/assets/discord-Bdnx7fu-.js +2 -0
  32. package/build/client/assets/discord-Bdnx7fu-.js.map +1 -0
  33. package/build/client/assets/{entry.client-BTYTUpFV.js → entry.client-DqIWuxf8.js} +2 -2
  34. package/build/client/assets/{entry.client-BTYTUpFV.js.map → entry.client-DqIWuxf8.js.map} +1 -1
  35. package/build/client/assets/{epic-video-1XLXSFCL.js → epic-video-Bp4BOD2R.js} +2 -2
  36. package/build/client/assets/{epic-video-1XLXSFCL.js.map → epic-video-Bp4BOD2R.js.map} +1 -1
  37. package/build/client/assets/{error-boundary-1-dmC941.js → error-boundary-BZA-ffa8.js} +2 -2
  38. package/build/client/assets/{error-boundary-1-dmC941.js.map → error-boundary-BZA-ffa8.js.map} +1 -1
  39. package/build/client/assets/{finished-DjF_kSoF.js → finished-C0cpfAFL.js} +2 -2
  40. package/build/client/assets/{finished-DjF_kSoF.js.map → finished-C0cpfAFL.js.map} +1 -1
  41. package/build/client/assets/{index-BuoaxPEj.js → index-BCTr8uu6.js} +2 -2
  42. package/build/client/assets/{index-BuoaxPEj.js.map → index-BCTr8uu6.js.map} +1 -1
  43. package/build/client/assets/{index-_J-F_Dnc.js → index-Bdg3v8tC.js} +2 -2
  44. package/build/client/assets/{index-_J-F_Dnc.js.map → index-Bdg3v8tC.js.map} +1 -1
  45. package/build/client/assets/index-Bi1TbRTj.js +2 -0
  46. package/build/client/assets/index-Bi1TbRTj.js.map +1 -0
  47. package/build/client/assets/{index-DRH72MzK.js → index-C9Hx0Dey.js} +2 -2
  48. package/build/client/assets/{index-DRH72MzK.js.map → index-C9Hx0Dey.js.map} +1 -1
  49. package/build/client/assets/{index-f5Q6XZEy.js → index-Ca4vBON4.js} +2 -2
  50. package/build/client/assets/{index-f5Q6XZEy.js.map → index-Ca4vBON4.js.map} +1 -1
  51. package/build/client/assets/{index-BuA_RWlU.js → index-DZDhtMuq.js} +2 -2
  52. package/build/client/assets/{index-BuA_RWlU.js.map → index-DZDhtMuq.js.map} +1 -1
  53. package/build/client/assets/index-pkiQppkK.js +2 -0
  54. package/build/client/assets/index-pkiQppkK.js.map +1 -0
  55. package/build/client/assets/{loading-Dk0n07O3.js → loading-XhMtj4mp.js} +2 -2
  56. package/build/client/assets/{loading-Dk0n07O3.js.map → loading-XhMtj4mp.js.map} +1 -1
  57. package/build/client/assets/{login-pZYDEC_l.js → login-C1oOgi98.js} +2 -2
  58. package/build/client/assets/{login-pZYDEC_l.js.map → login-C1oOgi98.js.map} +1 -1
  59. package/build/client/assets/manifest-bc809ee6.js +1 -0
  60. package/build/client/assets/{mdx-DiFCTSLR.js → mdx-CEjzXoEx.js} +2 -2
  61. package/build/client/assets/{mdx-DiFCTSLR.js.map → mdx-CEjzXoEx.js.map} +1 -1
  62. package/build/client/assets/{misc-BJtHv_Jh.js → misc-DUy_whwE.js} +2 -2
  63. package/build/client/assets/{misc-BJtHv_Jh.js.map → misc-DUy_whwE.js.map} +1 -1
  64. package/build/client/assets/{nav-chevrons-CgbSMLeb.js → nav-chevrons-DnR25VLp.js} +2 -2
  65. package/build/client/assets/{nav-chevrons-CgbSMLeb.js.map → nav-chevrons-DnR25VLp.js.map} +1 -1
  66. package/build/client/assets/{onboarding-DXICEaMi.js → onboarding-C2YNq60k.js} +2 -2
  67. package/build/client/assets/{onboarding-DXICEaMi.js.map → onboarding-C2YNq60k.js.map} +1 -1
  68. package/build/client/assets/{presence-DyppfK2V.js → presence-DJGFvdDh.js} +2 -2
  69. package/build/client/assets/{presence-DyppfK2V.js.map → presence-DJGFvdDh.js.map} +1 -1
  70. package/build/client/assets/{preview-CW_12I0i.js → preview-DaZd0wMb.js} +2 -2
  71. package/build/client/assets/{preview-CW_12I0i.js.map → preview-DaZd0wMb.js.map} +1 -1
  72. package/build/client/assets/{product-C1ynnrN_.js → product-DIAmCwmZ.js} +2 -2
  73. package/build/client/assets/{product-C1ynnrN_.js.map → product-DIAmCwmZ.js.map} +1 -1
  74. package/build/client/assets/{progress-DAB3nDa2.js → progress-DQt_Bn9o.js} +2 -2
  75. package/build/client/assets/{progress-DAB3nDa2.js.map → progress-DQt_Bn9o.js.map} +1 -1
  76. package/build/client/assets/{progress-bar-Cj5R4Zk7.js → progress-bar-BaTU3Yx_.js} +2 -2
  77. package/build/client/assets/{progress-bar-Cj5R4Zk7.js.map → progress-bar-BaTU3Yx_.js.map} +1 -1
  78. package/build/client/assets/{request-info-DCIQLE6H.js → request-info-ByUEfOil.js} +2 -2
  79. package/build/client/assets/{request-info-DCIQLE6H.js.map → request-info-ByUEfOil.js.map} +1 -1
  80. package/build/client/assets/{revalidation-ws-DU-PzW-_.js → revalidation-ws-dUa9CAqr.js} +2 -2
  81. package/build/client/assets/{revalidation-ws-DU-PzW-_.js.map → revalidation-ws-dUa9CAqr.js.map} +1 -1
  82. package/build/client/assets/{root-DCfiv1cO.js → root-a3d3Qwip.js} +2 -2
  83. package/build/client/assets/{root-DCfiv1cO.js.map → root-a3d3Qwip.js.map} +1 -1
  84. package/build/client/assets/{set-playground-S_rIwJAa.js → set-playground-CBHBA46B.js} +2 -2
  85. package/build/client/assets/{set-playground-S_rIwJAa.js.map → set-playground-CBHBA46B.js.map} +1 -1
  86. package/build/client/assets/{support-BNS-kEhc.js → support-CIz02V_r.js} +2 -2
  87. package/build/client/assets/{support-BNS-kEhc.js.map → support-CIz02V_r.js.map} +1 -1
  88. package/build/client/assets/test-DoKJvNug.js +2 -0
  89. package/build/client/assets/{test-CvzcNTDp.js.map → test-DoKJvNug.js.map} +1 -1
  90. package/build/client/assets/{tests-Bp85P9FF.js → tests-DbuyD2cI.js} +2 -2
  91. package/build/client/assets/{tests-Bp85P9FF.js.map → tests-DbuyD2cI.js.map} +1 -1
  92. package/build/client/assets/{tooltip-BgynKV2c.js → tooltip-DO9uwurQ.js} +2 -2
  93. package/build/client/assets/{tooltip-BgynKV2c.js.map → tooltip-DO9uwurQ.js.map} +1 -1
  94. package/build/client/assets/user-Bv6wYhQP.js +2 -0
  95. package/build/client/assets/user-Bv6wYhQP.js.map +1 -0
  96. package/build/client/assets/version-CaywAlNQ.js +2 -0
  97. package/build/client/assets/version-CaywAlNQ.js.map +1 -0
  98. package/build/client/assets/{workshop-config-DJY2cXU_.js → workshop-config-WVltG_BV.js} +2 -2
  99. package/build/client/assets/{workshop-config-DJY2cXU_.js.map → workshop-config-WVltG_BV.js.map} +1 -1
  100. package/build/server/index.js +420 -361
  101. package/build/server/index.js.map +1 -1
  102. package/package.json +3 -3
  103. package/start.js +6 -0
  104. package/build/client/assets/_layout-gyrNluke.js +0 -2
  105. package/build/client/assets/_layout-gyrNluke.js.map +0 -1
  106. package/build/client/assets/account-RJjysGnp.js +0 -2
  107. package/build/client/assets/account-RJjysGnp.js.map +0 -1
  108. package/build/client/assets/app-CM8yuYni.js +0 -2
  109. package/build/client/assets/diff-Cnw7IcG5.js +0 -2
  110. package/build/client/assets/discord-DxisvcaU.js +0 -2
  111. package/build/client/assets/discord-DxisvcaU.js.map +0 -1
  112. package/build/client/assets/discord-lXkS53K3.js +0 -2
  113. package/build/client/assets/discord-lXkS53K3.js.map +0 -1
  114. package/build/client/assets/discord.callback-l0sNRNKZ.js +0 -2
  115. package/build/client/assets/discord.callback-l0sNRNKZ.js.map +0 -1
  116. package/build/client/assets/index-DZ0It6pH.js +0 -2
  117. package/build/client/assets/index-DZ0It6pH.js.map +0 -1
  118. package/build/client/assets/manifest-9328c766.js +0 -1
  119. package/build/client/assets/test-CvzcNTDp.js +0 -2
  120. package/build/client/assets/user-DJiL1Lk-.js +0 -2
  121. package/build/client/assets/user-DJiL1Lk-.js.map +0 -1
@@ -6,7 +6,7 @@ import { isbot } from "isbot";
6
6
  import { renderToPipeableStream, renderToStaticMarkup } from "react-dom/server";
7
7
  import path from "node:path";
8
8
  import { makeSingletonCache, cachified, fsCache, deleteCache, compiledCodeCache, diffFilesCache, diffCodeCache, shouldForceFresh, getAllFileCacheEntries, ogCache } from "@epic-web/workshop-utils/cache.server";
9
- import { getPreferences, getAuthInfo, readOnboardingData, getDiscordMember, requireAuthInfo, DiscordMemberSchema, setDiscordMember, deleteDiscordInfo, deleteDb, setPresencePreferences, PlayerPreferencesSchema, setPlayerPreferences, setAuthInfo, markOnboardingVideoWatched } from "@epic-web/workshop-utils/db.server";
9
+ import { getPreferences, getAuthInfo, readOnboardingData, requireAuthInfo, deleteDb, setPresencePreferences, PlayerPreferencesSchema, setPlayerPreferences, setAuthInfo, markOnboardingVideoWatched } from "@epic-web/workshop-utils/db.server";
10
10
  import { z } from "zod";
11
11
  import { getWorkshopInstructions, getWorkshopFinished, getExercises, getApps, getPlaygroundAppName, extractNumbersAndTypeFromAppNameOrPath, getAppFromFile, getAppByName, isProblemApp, isPlaygroundApp, isExerciseStepApp, getExercise, isSolutionApp, isExampleApp, getRelativePath as getRelativePath$1, workshopRoot, modifiedTimes, getForceFreshForDir, setPlayground, requireExerciseApp, requireExercise, getExerciseApp, getAppDisplayName, getNextExerciseApp, getPrevExerciseApp, getAppPageRoute } from "@epic-web/workshop-utils/apps.server";
12
12
  import { getWorkshopConfig } from "@epic-web/workshop-utils/config.server";
@@ -76,6 +76,7 @@ import { EventEmitter } from "events";
76
76
  import { remember } from "@epic-web/remember";
77
77
  import { Issuer } from "openid-client";
78
78
  import inspector from "node:inspector";
79
+ import { getCommitInfo, getLatestWorkshopAppVersion } from "@epic-web/workshop-utils/git.server";
79
80
  import { Resvg } from "@resvg/resvg-js";
80
81
  import satori from "satori";
81
82
  import { generateRobotsTxt, generateSitemap } from "@nasa-gcn/remix-seo";
@@ -557,10 +558,10 @@ function getDomainUrl(request) {
557
558
  function getBaseUrl({
558
559
  request,
559
560
  domain = request ? getDomainUrl(request) : window.location.origin,
560
- port: port2
561
+ port
561
562
  }) {
562
563
  const url = new URL(domain);
563
- url.port = String(port2);
564
+ url.port = String(port);
564
565
  return url.toString();
565
566
  }
566
567
  function combineHeaders(...headers2) {
@@ -877,7 +878,7 @@ function useTheme() {
877
878
  }
878
879
  return requestInfo.session.theme ?? hints.theme;
879
880
  }
880
- const route43 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
881
+ const route44 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
881
882
  __proto__: null,
882
883
  ThemeSwitch,
883
884
  action: action$b,
@@ -1611,7 +1612,7 @@ const links = () => {
1611
1612
  { rel: "icon", type: "image/svg+xml", href: "/favicon.svg" }
1612
1613
  ];
1613
1614
  };
1614
- const meta$5 = ({ data: data2 }) => {
1615
+ const meta$6 = ({ data: data2 }) => {
1615
1616
  if (!data2) return [];
1616
1617
  return getSeoMetaTags({
1617
1618
  instructor: data2.instructor,
@@ -1620,7 +1621,7 @@ const meta$5 = ({ data: data2 }) => {
1620
1621
  requestInfo: data2.requestInfo
1621
1622
  });
1622
1623
  };
1623
- async function loader$y({ request }) {
1624
+ async function loader$x({ request }) {
1624
1625
  const timings = makeTimings("rootLoader");
1625
1626
  const workshopConfig = getWorkshopConfig();
1626
1627
  const {
@@ -1645,7 +1646,6 @@ async function loader$y({ request }) {
1645
1646
  const emptyProgress = [];
1646
1647
  return emptyProgress;
1647
1648
  }),
1648
- discordMember: getDiscordMember(),
1649
1649
  user: getUserInfo(),
1650
1650
  userHasAccess: userHasAccessToWorkshop({ request, timings }),
1651
1651
  apps: getApps({ request, timings })
@@ -1691,7 +1691,7 @@ async function loader$y({ request }) {
1691
1691
  }
1692
1692
  );
1693
1693
  }
1694
- const headers$b = ({ loaderHeaders }) => {
1694
+ const headers$c = ({ loaderHeaders }) => {
1695
1695
  const headers2 = {
1696
1696
  "Cache-Control": loaderHeaders.get("Cache-Control") ?? "",
1697
1697
  "Server-Timing": loaderHeaders.get("Server-Timing") ?? ""
@@ -1765,12 +1765,12 @@ const route0 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProper
1765
1765
  __proto__: null,
1766
1766
  ErrorBoundary: ErrorBoundary$6,
1767
1767
  default: AppWithProviders,
1768
- headers: headers$b,
1768
+ headers: headers$c,
1769
1769
  links,
1770
- loader: loader$y,
1771
- meta: meta$5
1770
+ loader: loader$x,
1771
+ meta: meta$6
1772
1772
  }, Symbol.toStringTag, { value: "Module" }));
1773
- async function loader$x({ params }) {
1773
+ async function loader$w({ params }) {
1774
1774
  const splat = params["*"];
1775
1775
  const segments = (splat == null ? void 0 : splat.split("/")) ?? [];
1776
1776
  if (segments.length > 0 && !isNaN(Number(segments[0]))) {
@@ -1808,7 +1808,7 @@ const route1 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProper
1808
1808
  __proto__: null,
1809
1809
  ErrorBoundary: ErrorBoundary$5,
1810
1810
  default: NotFound,
1811
- loader: loader$x
1811
+ loader: loader$w
1812
1812
  }, Symbol.toStringTag, { value: "Module" }));
1813
1813
  function makeMediaQueryStore(mediaQuery, serverSnapshot) {
1814
1814
  function getSnapshot() {
@@ -1917,8 +1917,8 @@ function useRevalidationWSImpl({ watchPaths }) {
1917
1917
  const socketQuery = socketParams.toString();
1918
1918
  const protocol = requestInfo.protocol === "https:" ? "wss:" : "ws:";
1919
1919
  const host = requestInfo.hostname;
1920
- const port2 = requestInfo.port;
1921
- const socketPath = `${protocol}//${host}:${port2}/__ws?${socketQuery}`;
1920
+ const port = requestInfo.port;
1921
+ const socketPath = `${protocol}//${host}:${port}/__ws?${socketQuery}`;
1922
1922
  useEffect(() => {
1923
1923
  if (!socketQuery) return;
1924
1924
  let ws = null;
@@ -2052,11 +2052,11 @@ function useUser() {
2052
2052
  function useOptionalDiscordMember() {
2053
2053
  var _a;
2054
2054
  const data = useRouteLoaderData("root");
2055
- return (data == null ? void 0 : data.discordMember) ?? (((_a = data == null ? void 0 : data.user) == null ? void 0 : _a.discordProfile) ? {
2055
+ return ((_a = data == null ? void 0 : data.user) == null ? void 0 : _a.discordProfile) ? {
2056
2056
  id: data.user.discordProfile.user.id,
2057
2057
  displayName: data.user.discordProfile.nick ?? data.user.discordProfile.user.global_name,
2058
2058
  avatarUrl: data.user.imageUrlLarge
2059
- } : null);
2059
+ } : null;
2060
2060
  }
2061
2061
  function useUserHasAccess() {
2062
2062
  const data = useRouteLoaderData("root");
@@ -2347,7 +2347,7 @@ function ProgressToggle({
2347
2347
  )
2348
2348
  ] });
2349
2349
  }
2350
- const route37 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
2350
+ const route38 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
2351
2351
  __proto__: null,
2352
2352
  ProgressToggle,
2353
2353
  action: action$a,
@@ -2358,7 +2358,7 @@ const route37 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePrope
2358
2358
  useProgressItemClassName,
2359
2359
  useRequireEpicProgress
2360
2360
  }, Symbol.toStringTag, { value: "Module" }));
2361
- async function loader$w({ request }) {
2361
+ async function loader$v({ request }) {
2362
2362
  var _a;
2363
2363
  const timings = makeTimings("appLayoutLoader");
2364
2364
  const { title: workshopTitle } = getWorkshopConfig();
@@ -2405,7 +2405,7 @@ async function loader$w({ request }) {
2405
2405
  );
2406
2406
  return result;
2407
2407
  }
2408
- const headers$a = ({ loaderHeaders, parentHeaders }) => {
2408
+ const headers$b = ({ loaderHeaders, parentHeaders }) => {
2409
2409
  const headers2 = {
2410
2410
  "Cache-Control": loaderHeaders.get("Cache-Control") ?? "",
2411
2411
  Vary: "Cookie",
@@ -3447,8 +3447,8 @@ function NavToggle({
3447
3447
  const route2 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
3448
3448
  __proto__: null,
3449
3449
  default: App,
3450
- headers: headers$a,
3451
- loader: loader$w
3450
+ headers: headers$b,
3451
+ loader: loader$v
3452
3452
  }, Symbol.toStringTag, { value: "Module" }));
3453
3453
  function PendingState() {
3454
3454
  return /* @__PURE__ */ jsx("span", { className: "inline-block animate-spin", children: "🌀" });
@@ -3514,106 +3514,19 @@ function ButtonLink({
3514
3514
  }
3515
3515
  ) });
3516
3516
  }
3517
- const port = process.env.PORT || "5639";
3518
- const scope = "guilds.join identify messages.read";
3519
- const DiscordApiResponseSchema = z.object({
3520
- status: z.literal("error"),
3521
- error: z.string()
3522
- }).or(
3523
- z.object({
3524
- status: z.literal("success"),
3525
- member: DiscordMemberSchema
3526
- })
3527
- );
3528
- function getDiscordAuthURL() {
3529
- const discordAuthUrl = new URL("https://discord.com/oauth2/authorize");
3530
- discordAuthUrl.searchParams.append("client_id", "738096608440483870");
3531
- discordAuthUrl.searchParams.append(
3532
- "redirect_uri",
3533
- `http://localhost:${port}/discord/callback`
3534
- );
3535
- discordAuthUrl.searchParams.append("response_type", "code");
3536
- discordAuthUrl.searchParams.append("scope", scope);
3537
- return discordAuthUrl.toString();
3538
- }
3539
- async function loader$v({ request }) {
3540
- const authInfo = await requireAuthInfo({ request });
3541
- const discordCode = new URL(request.url).searchParams.get("code");
3542
- invariantResponse(discordCode, "Missing code");
3543
- const result = await fetch(
3544
- // 'http://localhost:3000/resources/connect-epic-web',
3545
- "https://kcd-discord-bot-v2.fly.dev/resources/connect-epic-web",
3546
- {
3547
- method: "POST",
3548
- headers: { "content-type": "application/json" },
3549
- body: JSON.stringify({
3550
- deviceToken: authInfo.tokenSet.access_token,
3551
- discordCode,
3552
- port,
3553
- scope
3554
- })
3555
- }
3556
- );
3557
- if (!result.ok) {
3558
- console.error(`There was an error connecting Discord`);
3559
- try {
3560
- console.error(await result.text());
3561
- } catch {
3562
- }
3563
- return redirectWithToast("/account", {
3564
- type: "error",
3565
- title: "Error",
3566
- description: `There was an error connecting your Discord account (details in terminal output). Please try again.`
3567
- });
3568
- }
3569
- const parseResult = DiscordApiResponseSchema.safeParse(await result.json());
3570
- if (!parseResult.success) {
3571
- console.error(`There was an error connecting Discord`);
3572
- console.error(parseResult.error);
3573
- return redirectWithToast("/account", {
3574
- type: "error",
3575
- title: "Error",
3576
- description: `There was an error connecting your Discord account (details in terminal output). Please try again.`
3577
- });
3578
- }
3579
- if (parseResult.data.status === "error") {
3580
- console.error(`There was an error connecting Discord`);
3581
- console.error(parseResult.data.error);
3582
- return redirect$1("/account?error");
3583
- }
3584
- const member = parseResult.data.member;
3585
- await setDiscordMember(member);
3586
- return redirectWithToast("/account", {
3587
- type: "success",
3588
- title: "Success",
3589
- description: `Your Discord account "${member.displayName}" has been connected!`
3590
- });
3591
- }
3592
- const route30 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
3593
- __proto__: null,
3594
- getDiscordAuthURL,
3595
- loader: loader$v
3596
- }, Symbol.toStringTag, { value: "Module" }));
3597
- const handle$7 = {
3517
+ const handle$9 = {
3598
3518
  getSitemapEntries: () => null
3599
3519
  };
3600
3520
  async function loader$u({ request }) {
3601
3521
  ensureUndeployed();
3602
3522
  await requireAuthInfo({ request });
3603
- return { discordAuthUrl: getDiscordAuthURL() };
3523
+ return {};
3604
3524
  }
3605
3525
  async function action$9({ request }) {
3606
3526
  ensureUndeployed();
3607
3527
  const formData = await request.formData();
3608
3528
  const intent = formData.get("intent");
3609
- if (intent === "disconnect-discord") {
3610
- await deleteDiscordInfo();
3611
- return redirectWithToast("/account", {
3612
- type: "success",
3613
- title: "Disconnected",
3614
- description: "Local discord data has been deleted."
3615
- });
3616
- } else if (intent === "logout") {
3529
+ if (intent === "logout") {
3617
3530
  await deleteDb();
3618
3531
  await deleteCache();
3619
3532
  return redirectWithToast("/login", {
@@ -3632,12 +3545,17 @@ async function action$9({ request }) {
3632
3545
  }
3633
3546
  return redirect$1("/account");
3634
3547
  }
3548
+ function useConnectDiscordURL$1() {
3549
+ const {
3550
+ product: { host }
3551
+ } = useWorkshopConfig();
3552
+ return `https://${host}/discord`;
3553
+ }
3635
3554
  function Account() {
3636
- const data = useLoaderData();
3637
- const disconnectFetcher = useFetcher();
3638
3555
  const user = useUser();
3639
3556
  const discordMember = useOptionalDiscordMember();
3640
3557
  const presencePreferences = usePresencePreferences();
3558
+ const connectDiscordURL = useConnectDiscordURL$1();
3641
3559
  return /* @__PURE__ */ jsxs("main", { className: "container flex h-full w-full max-w-3xl flex-grow flex-col items-center justify-center gap-4", children: [
3642
3560
  user.imageUrlLarge ? /* @__PURE__ */ jsx(
3643
3561
  "img",
@@ -3649,31 +3567,25 @@ function Account() {
3649
3567
  ) : /* @__PURE__ */ jsx(Icon, { name: "User", className: "flex-shrink-0", size: "lg" }),
3650
3568
  /* @__PURE__ */ jsx("h1", { className: "mb-1 text-2xl", children: "Your Account" }),
3651
3569
  /* @__PURE__ */ jsx("p", { className: "text-center text-gray-700 dark:text-gray-300", children: user.name ? `Hi ${(discordMember == null ? void 0 : discordMember.displayName) ?? user.name}, your device is logged in with ${user.email}.` : `Your device is logged in with ${user.email}.` }),
3652
- discordMember ? /* @__PURE__ */ jsxs(Fragment, { children: [
3653
- /* @__PURE__ */ jsxs("p", { className: "text-center text-gray-700 dark:text-gray-300", children: [
3654
- "And you are connected to discord as",
3655
- " ",
3656
- /* @__PURE__ */ jsx(
3657
- "a",
3658
- {
3659
- href: `https://discord.com/users/${discordMember.id}`,
3660
- target: "_blank",
3661
- rel: "noopener noreferrer",
3662
- className: "underline",
3663
- children: discordMember.displayName
3664
- }
3665
- ),
3666
- "."
3667
- ] }),
3668
- /* @__PURE__ */ jsxs("div", { className: "flex justify-center gap-2", children: [
3669
- /* @__PURE__ */ jsx(disconnectFetcher.Form, { method: "post", children: /* @__PURE__ */ jsx(Button, { varient: "mono", name: "intent", value: "disconnect-discord", children: "Disconnect Discord" }) }),
3670
- /* @__PURE__ */ jsx(SimpleTooltip, { content: "Your discord connection gives you access to the exclusive Discord channels for Epic Web", children: /* @__PURE__ */ jsx(Icon, { name: "Question", tabIndex: 0 }) })
3671
- ] })
3672
- ] }) : /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
3570
+ discordMember ? /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsxs("p", { className: "text-center text-gray-700 dark:text-gray-300", children: [
3571
+ "And you are connected to discord as",
3572
+ " ",
3573
+ /* @__PURE__ */ jsx(
3574
+ "a",
3575
+ {
3576
+ href: `https://discord.com/users/${discordMember.id}`,
3577
+ target: "_blank",
3578
+ rel: "noopener noreferrer",
3579
+ className: "underline",
3580
+ children: discordMember.displayName
3581
+ }
3582
+ ),
3583
+ "."
3584
+ ] }) }) : /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
3673
3585
  /* @__PURE__ */ jsxs(
3674
3586
  Link,
3675
3587
  {
3676
- to: data.discordAuthUrl,
3588
+ to: connectDiscordURL,
3677
3589
  className: "inline-flex items-center gap-2 underline",
3678
3590
  children: [
3679
3591
  /* @__PURE__ */ jsx(Icon, { name: "Discord", size: "lg" }),
@@ -3736,7 +3648,7 @@ const route3 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProper
3736
3648
  __proto__: null,
3737
3649
  action: action$9,
3738
3650
  default: Account,
3739
- handle: handle$7,
3651
+ handle: handle$9,
3740
3652
  loader: loader$u
3741
3653
  }, Symbol.toStringTag, { value: "Module" }));
3742
3654
  async function getForceFresh(filePath, cacheEntry) {
@@ -4298,28 +4210,31 @@ const route10 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePrope
4298
4210
  __proto__: null,
4299
4211
  loader: loader$r
4300
4212
  }, Symbol.toStringTag, { value: "Module" }));
4301
- const handle$6 = {
4213
+ const handle$8 = {
4302
4214
  getSitemapEntries: () => null
4303
4215
  };
4304
- async function loader$o() {
4305
- return { discordAuthUrl: getDiscordAuthURL() };
4216
+ function useConnectDiscordURL() {
4217
+ const {
4218
+ product: { host }
4219
+ } = useWorkshopConfig();
4220
+ return `https://${host}/discord`;
4306
4221
  }
4307
- function useDiscordCTALink({
4308
- discordAuthUrl
4309
- }) {
4222
+ function useDiscordCTALink() {
4310
4223
  const user = useOptionalUser();
4311
4224
  const discordMember = useOptionalDiscordMember();
4225
+ const connectDiscordURL = useConnectDiscordURL();
4312
4226
  if (!user) {
4313
4227
  return "/login";
4314
4228
  }
4315
4229
  if (!discordMember) {
4316
- return discordAuthUrl;
4230
+ return connectDiscordURL;
4317
4231
  }
4318
4232
  return "https://discord.com/channels/715220730605731931/1161045224907341972";
4319
4233
  }
4320
- function DiscordCTA({ discordAuthUrl }) {
4234
+ function DiscordCTA() {
4321
4235
  const user = useOptionalUser();
4322
4236
  const discordMember = useOptionalDiscordMember();
4237
+ const connectDiscordURL = useConnectDiscordURL();
4323
4238
  if (!user) {
4324
4239
  return /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center justify-center gap-2 text-xl", children: [
4325
4240
  /* @__PURE__ */ jsxs(Link, { to: "/login", className: "inline-flex items-center gap-2 underline", children: [
@@ -4337,10 +4252,17 @@ function DiscordCTA({ discordAuthUrl }) {
4337
4252
  }
4338
4253
  if (!discordMember) {
4339
4254
  return /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center justify-center gap-2 text-xl", children: [
4340
- /* @__PURE__ */ jsxs(Link, { to: discordAuthUrl, className: "flex items-center gap-2 underline", children: [
4341
- /* @__PURE__ */ jsx(Icon, { name: "Discord", size: "2xl" }),
4342
- "Connect Discord"
4343
- ] }),
4255
+ /* @__PURE__ */ jsxs(
4256
+ Link,
4257
+ {
4258
+ to: connectDiscordURL,
4259
+ className: "flex items-center gap-2 underline",
4260
+ children: [
4261
+ /* @__PURE__ */ jsx(Icon, { name: "Discord", size: "2xl" }),
4262
+ "Connect Discord"
4263
+ ]
4264
+ }
4265
+ ),
4344
4266
  " ",
4345
4267
  /* @__PURE__ */ jsxs("span", { children: [
4346
4268
  "to get access to the exclusive",
@@ -4364,9 +4286,8 @@ function DiscordCTA({ discordAuthUrl }) {
4364
4286
  ] });
4365
4287
  }
4366
4288
  function DiscordRoute() {
4367
- const data = useLoaderData();
4368
4289
  return /* @__PURE__ */ jsxs("div", { className: "container flex h-full max-w-3xl flex-col items-center justify-center gap-4 p-12", children: [
4369
- /* @__PURE__ */ jsx(DiscordCTA, { discordAuthUrl: data.discordAuthUrl }),
4290
+ /* @__PURE__ */ jsx(DiscordCTA, {}),
4370
4291
  /* @__PURE__ */ jsxs("p", { children: [
4371
4292
  "The",
4372
4293
  " ",
@@ -4404,11 +4325,10 @@ const route11 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePrope
4404
4325
  __proto__: null,
4405
4326
  DiscordCTA,
4406
4327
  default: DiscordRoute,
4407
- handle: handle$6,
4408
- loader: loader$o,
4328
+ handle: handle$8,
4409
4329
  useDiscordCTALink
4410
4330
  }, Symbol.toStringTag, { value: "Module" }));
4411
- const handle$5 = {
4331
+ const handle$7 = {
4412
4332
  getSitemapEntries: async (request) => {
4413
4333
  const exercises = await getExercises({
4414
4334
  request
@@ -4431,7 +4351,7 @@ function ExercisesLayout() {
4431
4351
  const route12 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
4432
4352
  __proto__: null,
4433
4353
  default: ExercisesLayout,
4434
- handle: handle$5
4354
+ handle: handle$7
4435
4355
  }, Symbol.toStringTag, { value: "Module" }));
4436
4356
  const PlaybackTimeSchema = z.object({
4437
4357
  time: z.number(),
@@ -4631,7 +4551,7 @@ function isDeepEqual(obj1, obj2) {
4631
4551
  }
4632
4552
  return true;
4633
4553
  }
4634
- const route44 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
4554
+ const route45 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
4635
4555
  __proto__: null,
4636
4556
  MuxPlayer,
4637
4557
  action: action$7,
@@ -5725,7 +5645,7 @@ function EditFileOnGitHub({
5725
5645
  );
5726
5646
  }
5727
5647
  const LaunchEditor = ENV.EPICSHOP_DEPLOYED ? LaunchGitHub : LaunchEditorImpl;
5728
- const route32 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
5648
+ const route33 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
5729
5649
  __proto__: null,
5730
5650
  EditFileOnGitHub,
5731
5651
  LaunchEditor,
@@ -5909,7 +5829,7 @@ function Mdx({
5909
5829
  );
5910
5830
  return /* @__PURE__ */ jsx(Component, { components });
5911
5831
  }
5912
- const meta$4 = ({
5832
+ const meta$5 = ({
5913
5833
  data: data2,
5914
5834
  matches
5915
5835
  }) => {
@@ -5926,7 +5846,7 @@ const meta$4 = ({
5926
5846
  requestInfo: rootData.requestInfo
5927
5847
  });
5928
5848
  };
5929
- async function loader$n({ request, params }) {
5849
+ async function loader$o({ request, params }) {
5930
5850
  const timings = makeTimings("exerciseNumberLoader");
5931
5851
  invariantResponse(params.exerciseNumber, "exerciseNumber is required");
5932
5852
  const { title: workshopTitle } = getWorkshopConfig();
@@ -5974,7 +5894,7 @@ async function loader$n({ request, params }) {
5974
5894
  }
5975
5895
  );
5976
5896
  }
5977
- const headers$9 = ({ loaderHeaders, parentHeaders }) => {
5897
+ const headers$a = ({ loaderHeaders, parentHeaders }) => {
5978
5898
  const headers2 = {
5979
5899
  "Cache-Control": loaderHeaders.get("Cache-Control") ?? "",
5980
5900
  "Server-Timing": combineServerTimings(loaderHeaders, parentHeaders)
@@ -6068,11 +5988,11 @@ const route13 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePrope
6068
5988
  __proto__: null,
6069
5989
  ErrorBoundary: ErrorBoundary$4,
6070
5990
  default: ExerciseNumberRoute,
6071
- headers: headers$9,
6072
- loader: loader$n,
6073
- meta: meta$4
5991
+ headers: headers$a,
5992
+ loader: loader$o,
5993
+ meta: meta$5
6074
5994
  }, Symbol.toStringTag, { value: "Module" }));
6075
- async function loader$m({ request, params }) {
5995
+ async function loader$n({ request, params }) {
6076
5996
  const timings = makeTimings("stepLoader");
6077
5997
  invariantResponse(params.exerciseNumber, "exerciseNumber is required");
6078
5998
  const exercises = await getExercises({ request, timings });
@@ -6101,7 +6021,7 @@ async function loader$m({ request, params }) {
6101
6021
  );
6102
6022
  return result;
6103
6023
  }
6104
- const headers$8 = ({ loaderHeaders, parentHeaders }) => {
6024
+ const headers$9 = ({ loaderHeaders, parentHeaders }) => {
6105
6025
  const headers2 = {
6106
6026
  "Cache-Control": loaderHeaders.get("Cache-Control") ?? "",
6107
6027
  "Server-Timing": combineServerTimings(loaderHeaders, parentHeaders)
@@ -6126,8 +6046,8 @@ const route14 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePrope
6126
6046
  __proto__: null,
6127
6047
  ErrorBoundary: ErrorBoundary$3,
6128
6048
  default: StepRoute,
6129
- headers: headers$8,
6130
- loader: loader$m
6049
+ headers: headers$9,
6050
+ loader: loader$n
6131
6051
  }, Symbol.toStringTag, { value: "Module" }));
6132
6052
  function NavChevrons({
6133
6053
  prev,
@@ -6753,7 +6673,7 @@ function SetAppToPlayground({ appName }) {
6753
6673
  }
6754
6674
  );
6755
6675
  }
6756
- const route39 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
6676
+ const route40 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
6757
6677
  __proto__: null,
6758
6678
  PlaygroundChooser,
6759
6679
  SetAppToPlayground,
@@ -7081,7 +7001,7 @@ function pageTitle(data2, workshopTitle) {
7081
7001
  type: (data2 == null ? void 0 : data2.type) ?? "problem"
7082
7002
  };
7083
7003
  }
7084
- const meta$3 = ({
7004
+ const meta$4 = ({
7085
7005
  data: data2,
7086
7006
  matches,
7087
7007
  params
@@ -7099,7 +7019,7 @@ const meta$3 = ({
7099
7019
  requestInfo: rootData.requestInfo
7100
7020
  });
7101
7021
  };
7102
- async function loader$l({ request, params }) {
7022
+ async function loader$m({ request, params }) {
7103
7023
  var _a, _b;
7104
7024
  const timings = makeTimings("exerciseStepTypeLayoutLoader");
7105
7025
  const url = new URL(request.url);
@@ -7228,7 +7148,7 @@ async function loader$l({ request, params }) {
7228
7148
  }
7229
7149
  );
7230
7150
  }
7231
- const headers$7 = ({ loaderHeaders, parentHeaders }) => {
7151
+ const headers$8 = ({ loaderHeaders, parentHeaders }) => {
7232
7152
  const headers2 = {
7233
7153
  "Server-Timing": combineServerTimings(loaderHeaders, parentHeaders)
7234
7154
  };
@@ -7360,9 +7280,9 @@ const route15 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePrope
7360
7280
  __proto__: null,
7361
7281
  ErrorBoundary: ErrorBoundary$2,
7362
7282
  default: ExercisePartRoute$1,
7363
- headers: headers$7,
7364
- loader: loader$l,
7365
- meta: meta$3
7283
+ headers: headers$8,
7284
+ loader: loader$m,
7285
+ meta: meta$4
7366
7286
  }, Symbol.toStringTag, { value: "Module" }));
7367
7287
  async function action$4({ request }) {
7368
7288
  ensureUndeployed();
@@ -7440,9 +7360,9 @@ async function action$4({ request }) {
7440
7360
  }
7441
7361
  }
7442
7362
  if (intent === "stop-port") {
7443
- const port2 = formData.get("port");
7444
- invariantResponse(typeof port2 === "string", "port is required");
7445
- await stopPort(port2);
7363
+ const port = formData.get("port");
7364
+ invariantResponse(typeof port === "string", "port is required");
7365
+ await stopPort(port);
7446
7366
  return dataWithPE(formData, { status: "port-stopped" });
7447
7367
  }
7448
7368
  throw new Error(`Unknown intent: ${intent}`);
@@ -7470,13 +7390,13 @@ function AppStopper({ name }) {
7470
7390
  )
7471
7391
  ] });
7472
7392
  }
7473
- function PortStopper({ port: port2 }) {
7393
+ function PortStopper({ port }) {
7474
7394
  const fetcher = useFetcher();
7475
7395
  const peRedirectInput = usePERedirectInput();
7476
7396
  return /* @__PURE__ */ jsxs(fetcher.Form, { method: "POST", action: "/start", children: [
7477
7397
  peRedirectInput,
7478
7398
  showProgressBarField,
7479
- /* @__PURE__ */ jsx("input", { type: "hidden", name: "port", value: port2 }),
7399
+ /* @__PURE__ */ jsx("input", { type: "hidden", name: "port", value: port }),
7480
7400
  /* @__PURE__ */ jsx(Button, { varient: "mono", type: "submit", name: "intent", value: "stop-port", children: fetcher.state === "idle" ? "Stop Port" : "Stopping Port" })
7481
7401
  ] });
7482
7402
  }
@@ -7501,7 +7421,7 @@ function AppStarter({ name }) {
7501
7421
  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" }) })
7502
7422
  ] });
7503
7423
  }
7504
- const route41 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
7424
+ const route42 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
7505
7425
  __proto__: null,
7506
7426
  AppStarter,
7507
7427
  AppStopper,
@@ -7551,7 +7471,7 @@ function getNewIndex(prevIndex, delta, max) {
7551
7471
  const InBrowserBrowser = forwardRef(
7552
7472
  InBrowserBrowserImpl
7553
7473
  );
7554
- function InBrowserBrowserImpl({ name, port: port2, portIsAvailable, isRunning, baseUrl, id, initialRoute }, ref) {
7474
+ function InBrowserBrowserImpl({ name, port, portIsAvailable, isRunning, baseUrl, id, initialRoute }, ref) {
7555
7475
  const requestInfo = useRequestInfo();
7556
7476
  return isRunning ? /* @__PURE__ */ jsx(
7557
7477
  InBrowserBrowserForRealz,
@@ -7568,14 +7488,14 @@ function InBrowserBrowserImpl({ name, port: port2, portIsAvailable, isRunning, b
7568
7488
  /* @__PURE__ */ jsx(
7569
7489
  "a",
7570
7490
  {
7571
- href: getBaseUrl({ domain: requestInfo.domain, port: port2 }),
7491
+ href: getBaseUrl({ domain: requestInfo.domain, port }),
7572
7492
  className: "underline",
7573
7493
  children: "elsewhere"
7574
7494
  }
7575
7495
  ),
7576
7496
  "?"
7577
7497
  ] }),
7578
- /* @__PURE__ */ jsx(PortStopper, { port: port2 })
7498
+ /* @__PURE__ */ jsx(PortStopper, { port })
7579
7499
  ] }) : /* @__PURE__ */ jsx(AppStarter, { name });
7580
7500
  }
7581
7501
  const InBrowserBrowserForRealz = forwardRef(InBrowserBrowserForRealzImpl);
@@ -7964,7 +7884,7 @@ async function getAppRunningState(a) {
7964
7884
  const portIsAvailable = isRunning ? null : await isPortAvailable(a.dev.portNumber);
7965
7885
  return { isRunning, portIsAvailable };
7966
7886
  }
7967
- async function loader$k({ request, params }) {
7887
+ async function loader$l({ request, params }) {
7968
7888
  const timings = makeTimings("exercise-step-test");
7969
7889
  const exerciseStepApp = await requireExerciseApp(params, { request, timings });
7970
7890
  const { isRunning, portIsAvailable } = await getAppRunningState(exerciseStepApp);
@@ -7989,7 +7909,7 @@ async function loader$k({ request, params }) {
7989
7909
  }
7990
7910
  );
7991
7911
  }
7992
- const headers$6 = ({ loaderHeaders, parentHeaders }) => {
7912
+ const headers$7 = ({ loaderHeaders, parentHeaders }) => {
7993
7913
  const headers2 = {
7994
7914
  "Server-Timing": combineServerTimings(loaderHeaders, parentHeaders)
7995
7915
  };
@@ -8003,8 +7923,8 @@ function TestsList$1() {
8003
7923
  const route16 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
8004
7924
  __proto__: null,
8005
7925
  default: TestsList$1,
8006
- headers: headers$6,
8007
- loader: loader$k
7926
+ headers: headers$7,
7927
+ loader: loader$l
8008
7928
  }, Symbol.toStringTag, { value: "Module" }));
8009
7929
  const AccordionComponent = ({
8010
7930
  title,
@@ -8427,15 +8347,14 @@ async function fetchDiscordPosts({ request }) {
8427
8347
  }));
8428
8348
  }
8429
8349
  function DiscordChat() {
8430
- const data = useLoaderData();
8431
8350
  return /* @__PURE__ */ jsxs("div", { className: "flex h-full w-full flex-col gap-4 pt-4", children: [
8432
- /* @__PURE__ */ jsx("div", { className: "text-center", children: /* @__PURE__ */ jsx(DiscordCTA, { discordAuthUrl: data.discordAuthUrl }) }),
8351
+ /* @__PURE__ */ jsx("div", { className: "text-center", children: /* @__PURE__ */ jsx(DiscordCTA, {}) }),
8433
8352
  /* @__PURE__ */ jsx("div", { className: "flex-1 overflow-y-scroll bg-accent pb-4 scrollbar-thin scrollbar-thumb-scrollbar", children: /* @__PURE__ */ jsx(DiscordPosts, {}) })
8434
8353
  ] });
8435
8354
  }
8436
8355
  function DiscordPosts() {
8437
8356
  const data = useLoaderData();
8438
- const ctaLink = useDiscordCTALink({ discordAuthUrl: data.discordAuthUrl });
8357
+ const ctaLink = useDiscordCTALink();
8439
8358
  const altDown = useAltDown();
8440
8359
  return /* @__PURE__ */ jsxs("div", { className: "flex h-full flex-col items-center justify-between", children: [
8441
8360
  /* @__PURE__ */ jsx(
@@ -8881,7 +8800,7 @@ const testEventSchema = z.union([
8881
8800
  })
8882
8801
  ]);
8883
8802
  const testEventQueueSchema = z.array(testEventSchema);
8884
- async function loader$j({ request }) {
8803
+ async function loader$k({ request }) {
8885
8804
  ensureUndeployed();
8886
8805
  const url = new URL(request.url);
8887
8806
  const name = url.searchParams.get("name");
@@ -9230,14 +9149,14 @@ function StopTest({
9230
9149
  )
9231
9150
  ] });
9232
9151
  }
9233
- const route42 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
9152
+ const route43 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
9234
9153
  __proto__: null,
9235
9154
  ClearTest,
9236
9155
  StopTest,
9237
9156
  TestOutput,
9238
9157
  TestRunner,
9239
9158
  action: action$3,
9240
- loader: loader$j
9159
+ loader: loader$k
9241
9160
  }, Symbol.toStringTag, { value: "Module" }));
9242
9161
  function Tests({
9243
9162
  appInfo: playgroundAppInfo,
@@ -9304,7 +9223,7 @@ function TestUI({
9304
9223
  }
9305
9224
  return /* @__PURE__ */ jsx("div", { className: "flex h-full items-center justify-center text-lg", children: /* @__PURE__ */ jsx("p", { children: "No tests here 😢 Sorry." }) });
9306
9225
  }
9307
- async function loader$i({ request, params }) {
9226
+ async function loader$j({ request, params }) {
9308
9227
  const timings = makeTimings("exerciseStepTypeIndexLoader");
9309
9228
  const userHasAccess = await userHasAccessToWorkshop({
9310
9229
  request,
@@ -9398,7 +9317,6 @@ async function loader$i({ request, params }) {
9398
9317
  type: params.type,
9399
9318
  exerciseStepApp,
9400
9319
  allApps,
9401
- discordAuthUrl: getDiscordAuthURL(),
9402
9320
  // defer this promise so that we don't block the response from being sent
9403
9321
  discordPostsPromise: fetchDiscordPosts({ request }),
9404
9322
  playground: playgroundApp ? {
@@ -9442,7 +9360,7 @@ async function loader$i({ request, params }) {
9442
9360
  }
9443
9361
  );
9444
9362
  }
9445
- const headers$5 = ({ loaderHeaders, parentHeaders }) => {
9363
+ const headers$6 = ({ loaderHeaders, parentHeaders }) => {
9446
9364
  const headers2 = {
9447
9365
  "Server-Timing": combineServerTimings(loaderHeaders, parentHeaders)
9448
9366
  };
@@ -9624,10 +9542,10 @@ const route17 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePrope
9624
9542
  __proto__: null,
9625
9543
  ErrorBoundary: ErrorBoundary$1,
9626
9544
  default: ExercisePartRoute,
9627
- headers: headers$5,
9628
- loader: loader$i
9545
+ headers: headers$6,
9546
+ loader: loader$j
9629
9547
  }, Symbol.toStringTag, { value: "Module" }));
9630
- async function loader$h({ request, params }) {
9548
+ async function loader$i({ request, params }) {
9631
9549
  const timings = makeTimings("exercise-step-test");
9632
9550
  const exerciseStepApp = await requireExerciseApp(params, { request, timings });
9633
9551
  return unstable_data$1(
@@ -9644,7 +9562,7 @@ async function loader$h({ request, params }) {
9644
9562
  }
9645
9563
  );
9646
9564
  }
9647
- const headers$4 = ({ loaderHeaders, parentHeaders }) => {
9565
+ const headers$5 = ({ loaderHeaders, parentHeaders }) => {
9648
9566
  const headers2 = {
9649
9567
  "Cache-Control": loaderHeaders.get("Cache-Control") ?? "",
9650
9568
  "Server-Timing": combineServerTimings(loaderHeaders, parentHeaders)
@@ -9658,10 +9576,10 @@ function TestsList() {
9658
9576
  const route18 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
9659
9577
  __proto__: null,
9660
9578
  default: TestsList,
9661
- headers: headers$4,
9662
- loader: loader$h
9579
+ headers: headers$5,
9580
+ loader: loader$i
9663
9581
  }, Symbol.toStringTag, { value: "Module" }));
9664
- async function loader$g({ params }) {
9582
+ async function loader$h({ params }) {
9665
9583
  const problemApp = await getExerciseApp({ ...params, type: "problem" }).then(
9666
9584
  (a) => isProblemApp(a) ? a : null
9667
9585
  );
@@ -9683,9 +9601,9 @@ async function loader$g({ params }) {
9683
9601
  }
9684
9602
  const route19 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
9685
9603
  __proto__: null,
9686
- loader: loader$g
9604
+ loader: loader$h
9687
9605
  }, Symbol.toStringTag, { value: "Module" }));
9688
- const meta$2 = ({
9606
+ const meta$3 = ({
9689
9607
  data: data2,
9690
9608
  matches
9691
9609
  }) => {
@@ -9702,7 +9620,7 @@ const meta$2 = ({
9702
9620
  requestInfo: rootData.requestInfo
9703
9621
  });
9704
9622
  };
9705
- async function loader$f({ request, params }) {
9623
+ async function loader$g({ request, params }) {
9706
9624
  const timings = makeTimings("exerciseFinishedLoader");
9707
9625
  invariantResponse(params.exerciseNumber, "exerciseNumber is required");
9708
9626
  const exercise = await getExercise(params.exerciseNumber, {
@@ -9762,7 +9680,7 @@ async function loader$f({ request, params }) {
9762
9680
  }
9763
9681
  );
9764
9682
  }
9765
- const headers$3 = ({ loaderHeaders, parentHeaders }) => {
9683
+ const headers$4 = ({ loaderHeaders, parentHeaders }) => {
9766
9684
  const headers2 = {
9767
9685
  "Cache-Control": loaderHeaders.get("Cache-Control") ?? "",
9768
9686
  "Server-Timing": combineServerTimings(loaderHeaders, parentHeaders)
@@ -9865,14 +9783,14 @@ function Survey$1({
9865
9783
  const route20 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
9866
9784
  __proto__: null,
9867
9785
  default: ExerciseFinished$1,
9868
- headers: headers$3,
9869
- loader: loader$f,
9870
- meta: meta$2
9786
+ headers: headers$4,
9787
+ loader: loader$g,
9788
+ meta: meta$3
9871
9789
  }, Symbol.toStringTag, { value: "Module" }));
9872
- const handle$4 = {
9790
+ const handle$6 = {
9873
9791
  getSitemapEntries: () => [{ route: "/finished" }]
9874
9792
  };
9875
- const meta$1 = ({
9793
+ const meta$2 = ({
9876
9794
  matches
9877
9795
  }) => {
9878
9796
  var _a;
@@ -9887,7 +9805,7 @@ const meta$1 = ({
9887
9805
  requestInfo: rootData.requestInfo
9888
9806
  });
9889
9807
  };
9890
- async function loader$e({ request }) {
9808
+ async function loader$f({ request }) {
9891
9809
  const timings = makeTimings("finishedLoader");
9892
9810
  const exercises = await getExercises({ request, timings });
9893
9811
  const compiledFinished = await time(() => getWorkshopFinished({ request }), {
@@ -9928,7 +9846,7 @@ async function loader$e({ request }) {
9928
9846
  }
9929
9847
  );
9930
9848
  }
9931
- const headers$2 = ({ loaderHeaders, parentHeaders }) => {
9849
+ const headers$3 = ({ loaderHeaders, parentHeaders }) => {
9932
9850
  const headers2 = {
9933
9851
  "Cache-Control": loaderHeaders.get("Cache-Control") ?? "",
9934
9852
  "Server-Timing": combineServerTimings(loaderHeaders, parentHeaders)
@@ -10021,12 +9939,12 @@ function Survey({
10021
9939
  const route21 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
10022
9940
  __proto__: null,
10023
9941
  default: ExerciseFinished,
10024
- handle: handle$4,
10025
- headers: headers$2,
10026
- loader: loader$e,
10027
- meta: meta$1
9942
+ handle: handle$6,
9943
+ headers: headers$3,
9944
+ loader: loader$f,
9945
+ meta: meta$2
10028
9946
  }, Symbol.toStringTag, { value: "Module" }));
10029
- async function loader$d({ request }) {
9947
+ async function loader$e({ request }) {
10030
9948
  const timings = makeTimings("indexLoader");
10031
9949
  const { title } = getWorkshopConfig();
10032
9950
  const [exercises, workshopReadme] = await Promise.all([
@@ -10061,7 +9979,7 @@ async function loader$d({ request }) {
10061
9979
  }
10062
9980
  );
10063
9981
  }
10064
- const headers$1 = ({ loaderHeaders, parentHeaders }) => {
9982
+ const headers$2 = ({ loaderHeaders, parentHeaders }) => {
10065
9983
  const headers2 = {
10066
9984
  "Cache-Control": loaderHeaders.get("Cache-Control") ?? "",
10067
9985
  "Server-Timing": combineServerTimings(loaderHeaders, parentHeaders)
@@ -10151,8 +10069,8 @@ const route22 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePrope
10151
10069
  __proto__: null,
10152
10070
  ErrorBoundary,
10153
10071
  default: Index,
10154
- headers: headers$1,
10155
- loader: loader$d
10072
+ headers: headers$2,
10073
+ loader: loader$e
10156
10074
  }, Symbol.toStringTag, { value: "Module" }));
10157
10075
  const EVENTS = {
10158
10076
  USER_CODE_RECEIVED: "USER_CODE_RECEIVED",
@@ -10217,7 +10135,7 @@ const EventSchema = z.union([
10217
10135
  AuthResolvedEventSchema,
10218
10136
  AuthRejectedEventSchema
10219
10137
  ]);
10220
- async function loader$c({ request }) {
10138
+ async function loader$d({ request }) {
10221
10139
  ensureUndeployed();
10222
10140
  return eventStream(request.signal, function setup(send) {
10223
10141
  function handleCodeReceived(data) {
@@ -10251,15 +10169,15 @@ async function loader$c({ request }) {
10251
10169
  };
10252
10170
  });
10253
10171
  }
10254
- const route33 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
10172
+ const route34 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
10255
10173
  __proto__: null,
10256
10174
  EventSchema,
10257
- loader: loader$c
10175
+ loader: loader$d
10258
10176
  }, Symbol.toStringTag, { value: "Module" }));
10259
- const handle$3 = {
10177
+ const handle$5 = {
10260
10178
  getSitemapEntries: () => null
10261
10179
  };
10262
- async function loader$b() {
10180
+ async function loader$c() {
10263
10181
  ensureUndeployed();
10264
10182
  const isAuthenticated = Boolean(await getAuthInfo());
10265
10183
  if (isAuthenticated) throw redirect$1("/account");
@@ -10378,10 +10296,10 @@ const route23 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePrope
10378
10296
  __proto__: null,
10379
10297
  action: action$2,
10380
10298
  default: Login,
10381
- handle: handle$3,
10382
- loader: loader$b
10299
+ handle: handle$5,
10300
+ loader: loader$c
10383
10301
  }, Symbol.toStringTag, { value: "Module" }));
10384
- const handle$2 = {
10302
+ const handle$4 = {
10385
10303
  getSitemapEntries: () => null
10386
10304
  };
10387
10305
  function Support() {
@@ -10440,9 +10358,56 @@ function Support() {
10440
10358
  const route24 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
10441
10359
  __proto__: null,
10442
10360
  default: Support,
10443
- handle: handle$2
10361
+ handle: handle$4
10362
+ }, Symbol.toStringTag, { value: "Module" }));
10363
+ const handle$3 = {
10364
+ getSitemapEntries: () => null
10365
+ };
10366
+ const meta$1 = ({ matches }) => {
10367
+ var _a;
10368
+ const rootData = (_a = matches.find((m) => m.id === "root")) == null ? void 0 : _a.data;
10369
+ return [{ title: `👷 | ${rootData == null ? void 0 : rootData.workshopTitle}` }];
10370
+ };
10371
+ function AdminLayout$1() {
10372
+ return /* @__PURE__ */ jsxs("main", { className: "container mx-auto mt-8", children: [
10373
+ /* @__PURE__ */ jsx("h1", { className: "text-4xl font-bold", children: "Admin" }),
10374
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-4", children: [
10375
+ /* @__PURE__ */ jsx("nav", { children: /* @__PURE__ */ jsxs("ul", { className: "flex gap-3", children: [
10376
+ /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx(Link, { className: "underline", to: "/", children: "Home" }) }),
10377
+ /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx(Link, { className: "underline", to: "/admin", children: "Admin" }) }),
10378
+ /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx(Link, { className: "underline", to: "/diff", children: "Diff Viewer" }) }),
10379
+ /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx(Link, { className: "underline", to: "version", children: "Version" }) })
10380
+ ] }) }),
10381
+ /* @__PURE__ */ jsx(Outlet, {})
10382
+ ] })
10383
+ ] });
10384
+ }
10385
+ const route25 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
10386
+ __proto__: null,
10387
+ default: AdminLayout$1,
10388
+ handle: handle$3,
10389
+ meta: meta$1
10390
+ }, Symbol.toStringTag, { value: "Module" }));
10391
+ async function loader$b() {
10392
+ ensureUndeployed();
10393
+ const apps = await getApps();
10394
+ return Response.json({ apps });
10395
+ }
10396
+ const route26 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
10397
+ __proto__: null,
10398
+ loader: loader$b
10399
+ }, Symbol.toStringTag, { value: "Module" }));
10400
+ async function loader$a() {
10401
+ ensureUndeployed();
10402
+ const entries = await getAllFileCacheEntries();
10403
+ return Response.json({ entries });
10404
+ }
10405
+ const route27 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
10406
+ __proto__: null,
10407
+ loader: loader$a
10444
10408
  }, Symbol.toStringTag, { value: "Module" }));
10445
10409
  async function clearData() {
10410
+ if (ENV.EPICSHOP_DEPLOYED) return;
10446
10411
  await clearCaches();
10447
10412
  await deleteDb();
10448
10413
  }
@@ -10452,6 +10417,7 @@ async function clearCaches() {
10452
10417
  await deleteCache();
10453
10418
  }
10454
10419
  async function startInspector() {
10420
+ if (ENV.EPICSHOP_DEPLOYED) return;
10455
10421
  if (!global.__inspector_open__) {
10456
10422
  global.__inspector_open__ = true;
10457
10423
  inspector.open();
@@ -10460,6 +10426,7 @@ async function startInspector() {
10460
10426
  }
10461
10427
  }
10462
10428
  async function stopInspector() {
10429
+ if (ENV.EPICSHOP_DEPLOYED) return;
10463
10430
  if (global.__inspector_open__) {
10464
10431
  global.__inspector_open__ = false;
10465
10432
  inspector.close();
@@ -10467,7 +10434,7 @@ async function stopInspector() {
10467
10434
  console.info(`Inspector already stopped.`);
10468
10435
  }
10469
10436
  }
10470
- const handle$1 = {
10437
+ const handle$2 = {
10471
10438
  getSitemapEntries: () => null
10472
10439
  };
10473
10440
  const meta = ({
@@ -10477,7 +10444,7 @@ const meta = ({
10477
10444
  const rootData = (_a = matches.find((m) => m.id === "root")) == null ? void 0 : _a.data;
10478
10445
  return [{ title: `👷 | ${rootData == null ? void 0 : rootData.workshopTitle}` }];
10479
10446
  };
10480
- async function loader$a({ request }) {
10447
+ async function loader$9({ request }) {
10481
10448
  ensureUndeployed();
10482
10449
  const timings = makeTimings("adminLoader");
10483
10450
  const apps = (await getApps({ request, timings })).filter(
@@ -10487,9 +10454,9 @@ async function loader$a({ request }) {
10487
10454
  const testProcesses = {};
10488
10455
  for (const [
10489
10456
  name,
10490
- { port: port2, process: process2, color }
10457
+ { port, process: process2, color }
10491
10458
  ] of getProcesses().devProcesses.entries()) {
10492
- processes[name] = { port: port2, pid: process2.pid, color };
10459
+ processes[name] = { port, pid: process2.pid, color };
10493
10460
  }
10494
10461
  for (const [
10495
10462
  name,
@@ -10567,82 +10534,75 @@ function AdminLayout() {
10567
10534
  completed: "bg-blue-500",
10568
10535
  incomplete: "bg-yellow-500"
10569
10536
  };
10570
- return /* @__PURE__ */ jsxs("main", { className: "container mx-auto mt-8", children: [
10571
- /* @__PURE__ */ jsx("h1", { className: "text-4xl font-bold", children: "Admin" }),
10572
- /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-4", children: [
10573
- /* @__PURE__ */ jsx("nav", { children: /* @__PURE__ */ jsxs("ul", { className: "flex gap-3", children: [
10574
- /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx(Link, { className: "underline", to: "/", children: "Home" }) }),
10575
- /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx(Link, { className: "underline", to: "/diff", children: "Diff Viewer" }) })
10576
- ] }) }),
10577
- /* @__PURE__ */ jsxs("div", { children: [
10578
- /* @__PURE__ */ jsx("h2", { className: "text-lg font-bold", children: "Progress" }),
10579
- epicProgress ? /* @__PURE__ */ jsx("ul", { className: "flex max-h-72 flex-col gap-2 overflow-y-scroll border-2 p-8 scrollbar-thin scrollbar-thumb-scrollbar", children: epicProgress.sort(sortProgress).map((progress) => {
10580
- const status = progress.epicCompletedAt ? "completed" : "incomplete";
10581
- const label = [
10582
- progress.epicLessonSlug,
10583
- progress.epicCompletedAt ? `(${progress.epicCompletedAt})` : null
10584
- ].filter(Boolean).join(" ");
10585
- return /* @__PURE__ */ jsxs(
10586
- "li",
10587
- {
10588
- className: "flex items-center gap-2",
10589
- children: [
10590
- /* @__PURE__ */ jsx(
10591
- "span",
10592
- {
10593
- className: `h-3 w-3 rounded-full ${progressStatus[status]}`,
10594
- title: status
10595
- }
10596
- ),
10597
- progress.type === "unknown" ? /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-1", children: [
10598
- label,
10599
- /* @__PURE__ */ jsx("span", { className: "text-red-500", children: /* @__PURE__ */ jsx(SimpleTooltip, { content: "This video is in the workshop on EpicWeb.dev, but not in the local workshop.", children: /* @__PURE__ */ jsx(Icon, { name: "Close" }) }) })
10600
- ] }) : /* @__PURE__ */ jsx(Link, { to: linkProgress(progress), children: label }),
10601
- /* @__PURE__ */ jsx(Link, { to: progress.epicLessonUrl, children: /* @__PURE__ */ jsx(Icon, { name: "ExternalLink" }) })
10602
- ]
10603
- },
10604
- progress.epicLessonSlug
10605
- );
10606
- }) }) : /* @__PURE__ */ jsx("p", { children: "No progress data" })
10607
- ] }),
10608
- /* @__PURE__ */ jsxs("div", { children: [
10609
- /* @__PURE__ */ jsx("h2", { className: "text-lg font-bold", children: "Commands" }),
10610
- /* @__PURE__ */ jsxs("ul", { className: "max-h-48 overflow-y-scroll border-2 p-8 scrollbar-thin scrollbar-thumb-scrollbar", children: [
10611
- /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx(Form, { method: "POST", children: /* @__PURE__ */ jsx("button", { name: "intent", value: "clear-caches", children: "Clear local caches" }) }) }),
10612
- /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx(Form, { method: "POST", children: /* @__PURE__ */ jsx("button", { name: "intent", value: "clear-data", children: "Clear all local data (including auth data)" }) }) }),
10613
- /* @__PURE__ */ jsx("li", { children: data2.inspectorRunning ? /* @__PURE__ */ jsx(Form, { method: "POST", children: /* @__PURE__ */ jsx("button", { name: "intent", value: "stop-inspect", children: isStartingInspector ? "Stopping inspector..." : "Stop inspector" }) }) : /* @__PURE__ */ jsx(Form, { method: "POST", children: /* @__PURE__ */ jsx("button", { name: "intent", value: "inspect", children: isStoppingInspector ? "Starting inspector..." : "Start inspector" }) }) })
10614
- ] })
10615
- ] }),
10616
- /* @__PURE__ */ jsxs("div", { children: [
10617
- /* @__PURE__ */ jsx("h2", { className: "text-lg font-bold", children: "Apps" }),
10618
- /* @__PURE__ */ jsx("ul", { className: "max-h-48 list-none overflow-y-scroll border-2 p-8 scrollbar-thin scrollbar-thumb-scrollbar", children: data2.apps.map((app) => /* @__PURE__ */ jsxs("li", { className: "flex items-center gap-2 py-1", children: [
10619
- data2.processes[app.name] ? /* @__PURE__ */ jsx(Pinger, { status: "running" }) : /* @__PURE__ */ jsx(Pinger, { status: "stopped" }),
10620
- app.name
10621
- ] }, app.name)) })
10622
- ] }),
10623
- /* @__PURE__ */ jsxs("div", { children: [
10624
- /* @__PURE__ */ jsx("h2", { className: "text-lg font-bold", children: "Processes" }),
10625
- /* @__PURE__ */ jsx("ul", { className: "overflow-y-scroll border-2 p-8 scrollbar-thin scrollbar-thumb-scrollbar", children: Object.entries(data2.processes).map(([key, process2]) => /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsxs("span", { children: [
10626
- key,
10627
- " - Port: ",
10628
- process2.port,
10629
- " - PID ",
10630
- process2.pid,
10631
- " -",
10632
- " ",
10633
- process2.color
10634
- ] }) }, key)) })
10635
- ] }),
10636
- /* @__PURE__ */ jsxs("div", { children: [
10637
- /* @__PURE__ */ jsx("h2", { className: "text-lg font-bold", children: "Test Processes" }),
10638
- /* @__PURE__ */ jsx("ul", { className: "overflow-y-scroll border-2 p-8 scrollbar-thin scrollbar-thumb-scrollbar", children: Object.entries(data2.testProcesses).map(([key, process2]) => /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsxs("span", { children: [
10639
- key,
10640
- " - PID ",
10641
- process2.pid,
10642
- " - Exit code: ",
10643
- process2.exitCode
10644
- ] }) }, key)) })
10537
+ return /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-4", children: [
10538
+ /* @__PURE__ */ jsxs("div", { children: [
10539
+ /* @__PURE__ */ jsx("h2", { className: "text-lg font-bold", children: "Progress" }),
10540
+ epicProgress ? /* @__PURE__ */ jsx("ul", { className: "flex max-h-72 flex-col gap-2 overflow-y-scroll border-2 p-8 scrollbar-thin scrollbar-thumb-scrollbar", children: epicProgress.sort(sortProgress).map((progress) => {
10541
+ const status = progress.epicCompletedAt ? "completed" : "incomplete";
10542
+ const label = [
10543
+ progress.epicLessonSlug,
10544
+ progress.epicCompletedAt ? `(${progress.epicCompletedAt})` : null
10545
+ ].filter(Boolean).join(" ");
10546
+ return /* @__PURE__ */ jsxs(
10547
+ "li",
10548
+ {
10549
+ className: "flex items-center gap-2",
10550
+ children: [
10551
+ /* @__PURE__ */ jsx(
10552
+ "span",
10553
+ {
10554
+ className: `h-3 w-3 rounded-full ${progressStatus[status]}`,
10555
+ title: status
10556
+ }
10557
+ ),
10558
+ progress.type === "unknown" ? /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-1", children: [
10559
+ label,
10560
+ /* @__PURE__ */ jsx("span", { className: "text-red-500", children: /* @__PURE__ */ jsx(SimpleTooltip, { content: "This video is in the workshop on EpicWeb.dev, but not in the local workshop.", children: /* @__PURE__ */ jsx(Icon, { name: "Close" }) }) })
10561
+ ] }) : /* @__PURE__ */ jsx(Link, { to: linkProgress(progress), children: label }),
10562
+ /* @__PURE__ */ jsx(Link, { to: progress.epicLessonUrl, children: /* @__PURE__ */ jsx(Icon, { name: "ExternalLink" }) })
10563
+ ]
10564
+ },
10565
+ progress.epicLessonSlug
10566
+ );
10567
+ }) }) : /* @__PURE__ */ jsx("p", { children: "No progress data" })
10568
+ ] }),
10569
+ /* @__PURE__ */ jsxs("div", { children: [
10570
+ /* @__PURE__ */ jsx("h2", { className: "text-lg font-bold", children: "Commands" }),
10571
+ /* @__PURE__ */ jsxs("ul", { className: "max-h-48 overflow-y-scroll border-2 p-8 scrollbar-thin scrollbar-thumb-scrollbar", children: [
10572
+ /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx(Form, { method: "POST", children: /* @__PURE__ */ jsx("button", { name: "intent", value: "clear-caches", children: "Clear local caches" }) }) }),
10573
+ /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx(Form, { method: "POST", children: /* @__PURE__ */ jsx("button", { name: "intent", value: "clear-data", children: "Clear all local data (including auth data)" }) }) }),
10574
+ /* @__PURE__ */ jsx("li", { children: data2.inspectorRunning ? /* @__PURE__ */ jsx(Form, { method: "POST", children: /* @__PURE__ */ jsx("button", { name: "intent", value: "stop-inspect", children: isStartingInspector ? "Stopping inspector..." : "Stop inspector" }) }) : /* @__PURE__ */ jsx(Form, { method: "POST", children: /* @__PURE__ */ jsx("button", { name: "intent", value: "inspect", children: isStoppingInspector ? "Starting inspector..." : "Start inspector" }) }) })
10645
10575
  ] })
10576
+ ] }),
10577
+ /* @__PURE__ */ jsxs("div", { children: [
10578
+ /* @__PURE__ */ jsx("h2", { className: "text-lg font-bold", children: "Apps" }),
10579
+ /* @__PURE__ */ jsx("ul", { className: "max-h-48 list-none overflow-y-scroll border-2 p-8 scrollbar-thin scrollbar-thumb-scrollbar", children: data2.apps.map((app) => /* @__PURE__ */ jsxs("li", { className: "flex items-center gap-2 py-1", children: [
10580
+ data2.processes[app.name] ? /* @__PURE__ */ jsx(Pinger, { status: "running" }) : /* @__PURE__ */ jsx(Pinger, { status: "stopped" }),
10581
+ app.name
10582
+ ] }, app.name)) })
10583
+ ] }),
10584
+ /* @__PURE__ */ jsxs("div", { children: [
10585
+ /* @__PURE__ */ jsx("h2", { className: "text-lg font-bold", children: "Processes" }),
10586
+ /* @__PURE__ */ jsx("ul", { className: "overflow-y-scroll border-2 p-8 scrollbar-thin scrollbar-thumb-scrollbar", children: Object.entries(data2.processes).map(([key, process2]) => /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsxs("span", { children: [
10587
+ key,
10588
+ " - Port: ",
10589
+ process2.port,
10590
+ " - PID ",
10591
+ process2.pid,
10592
+ " -",
10593
+ " ",
10594
+ process2.color
10595
+ ] }) }, key)) })
10596
+ ] }),
10597
+ /* @__PURE__ */ jsxs("div", { children: [
10598
+ /* @__PURE__ */ jsx("h2", { className: "text-lg font-bold", children: "Test Processes" }),
10599
+ /* @__PURE__ */ jsx("ul", { className: "overflow-y-scroll border-2 p-8 scrollbar-thin scrollbar-thumb-scrollbar", children: Object.entries(data2.testProcesses).map(([key, process2]) => /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsxs("span", { children: [
10600
+ key,
10601
+ " - PID ",
10602
+ process2.pid,
10603
+ " - Exit code: ",
10604
+ process2.exitCode
10605
+ ] }) }, key)) })
10646
10606
  ] })
10647
10607
  ] });
10648
10608
  }
@@ -10681,30 +10641,121 @@ function Pinger({
10681
10641
  )
10682
10642
  ] });
10683
10643
  }
10684
- const route25 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
10644
+ const route28 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
10685
10645
  __proto__: null,
10686
10646
  action: action$1,
10687
10647
  default: AdminLayout,
10688
- handle: handle$1,
10689
- loader: loader$a,
10648
+ handle: handle$2,
10649
+ loader: loader$9,
10690
10650
  meta
10691
10651
  }, Symbol.toStringTag, { value: "Module" }));
10692
- async function loader$9() {
10693
- ensureUndeployed();
10694
- const apps = await getApps();
10695
- return Response.json({ apps });
10696
- }
10697
- const route26 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
10698
- __proto__: null,
10699
- loader: loader$9
10700
- }, Symbol.toStringTag, { value: "Module" }));
10652
+ const handle$1 = {
10653
+ getSitemapEntries: () => null
10654
+ };
10701
10655
  async function loader$8() {
10702
- ensureUndeployed();
10703
- const entries = await getAllFileCacheEntries();
10704
- return Response.json({ entries });
10656
+ const timings = makeTimings("versionLoader");
10657
+ const [commitInfo, latestVersion] = await Promise.all([
10658
+ time(() => getCommitInfo(), { timings, type: "getCommitInfo" }),
10659
+ time(() => getLatestWorkshopAppVersion(), {
10660
+ timings,
10661
+ type: "getLatestWorkshopAppVersion"
10662
+ })
10663
+ ]);
10664
+ const dayjs2 = getDayjs();
10665
+ const uptime = process.uptime() * 1e3;
10666
+ const startDate = new Date(Date.now() - uptime);
10667
+ return unstable_data(
10668
+ {
10669
+ workshopCommit: commitInfo ? {
10670
+ ...commitInfo,
10671
+ dateFormatted: dayjs2(commitInfo.date).format("YYYY-MM-DD HH:mm:ss"),
10672
+ dateFromNow: dayjs2(commitInfo.date).fromNow()
10673
+ } : null,
10674
+ latestWorkshopAppVersion: latestVersion,
10675
+ startTime: startDate.toISOString(),
10676
+ startTimeFormatted: dayjs2(startDate).format("YYYY-MM-DD HH:mm:ss"),
10677
+ startTimeFromNow: dayjs2(startDate).fromNow()
10678
+ },
10679
+ {
10680
+ headers: {
10681
+ "Server-Timing": timings.toString()
10682
+ }
10683
+ }
10684
+ );
10705
10685
  }
10706
- const route27 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
10686
+ const headers$1 = ({ parentHeaders, loaderHeaders }) => {
10687
+ return {
10688
+ "Server-Timing": combineServerTimings(parentHeaders, loaderHeaders)
10689
+ };
10690
+ };
10691
+ function Version() {
10692
+ const data2 = useLoaderData();
10693
+ const workshopConfig = useWorkshopConfig();
10694
+ return /* @__PURE__ */ jsxs("div", { children: [
10695
+ /* @__PURE__ */ jsx("h2", { className: "text-lg font-bold", children: "Workshop Version Information" }),
10696
+ /* @__PURE__ */ jsx("h3", { className: "text-md font-bold", children: "Workshop Commit" }),
10697
+ data2.workshopCommit ? /* @__PURE__ */ jsxs(Fragment, { children: [
10698
+ /* @__PURE__ */ jsxs("p", { children: [
10699
+ "Hash:",
10700
+ " ",
10701
+ /* @__PURE__ */ jsx(
10702
+ "a",
10703
+ {
10704
+ href: `${workshopConfig.githubRepo}/commit/${data2.workshopCommit.hash}`,
10705
+ className: "underline",
10706
+ children: data2.workshopCommit.hash
10707
+ }
10708
+ )
10709
+ ] }),
10710
+ /* @__PURE__ */ jsxs("p", { children: [
10711
+ "Message: ",
10712
+ data2.workshopCommit.message
10713
+ ] }),
10714
+ /* @__PURE__ */ jsxs("p", { children: [
10715
+ "Date: ",
10716
+ data2.workshopCommit.dateFormatted,
10717
+ " (",
10718
+ data2.workshopCommit.dateFromNow,
10719
+ ")"
10720
+ ] })
10721
+ ] }) : /* @__PURE__ */ jsx("p", { children: "No commit information available" }),
10722
+ /* @__PURE__ */ jsx("h3", { className: "text-md font-bold", children: "Workshop App" }),
10723
+ /* @__PURE__ */ jsxs("p", { children: [
10724
+ "Current Version: ",
10725
+ /* @__PURE__ */ jsx(
10726
+ "a",
10727
+ {
10728
+ href: `https://github.com/epicweb-dev/epicshop/releases/tag/v${ENV.EPICSHOP_APP_VERSION}`,
10729
+ className: "underline",
10730
+ children: ENV.EPICSHOP_APP_VERSION
10731
+ }
10732
+ )
10733
+ ] }),
10734
+ /* @__PURE__ */ jsxs("p", { children: [
10735
+ "Latest Version: ",
10736
+ /* @__PURE__ */ jsx(
10737
+ "a",
10738
+ {
10739
+ href: `https://github.com/epicweb-dev/epicshop/releases/tag/v${data2.latestWorkshopAppVersion}`,
10740
+ className: "underline",
10741
+ children: data2.latestWorkshopAppVersion
10742
+ }
10743
+ )
10744
+ ] }),
10745
+ /* @__PURE__ */ jsx("h3", { className: "text-md font-bold", children: "App Start Time" }),
10746
+ /* @__PURE__ */ jsxs("p", { children: [
10747
+ data2.startTimeFormatted,
10748
+ " (",
10749
+ data2.startTimeFromNow,
10750
+ ")"
10751
+ ] })
10752
+ ] });
10753
+ }
10754
+ const route29 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
10707
10755
  __proto__: null,
10756
+ default: Version,
10757
+ handle: handle$1,
10758
+ headers: headers$1,
10708
10759
  loader: loader$8
10709
10760
  }, Symbol.toStringTag, { value: "Module" }));
10710
10761
  async function loader$7({ request }) {
@@ -10715,7 +10766,7 @@ async function loader$7({ request }) {
10715
10766
  { headers: { "Server-Timing": getServerTimeHeader(timings) } }
10716
10767
  );
10717
10768
  }
10718
- const route28 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
10769
+ const route30 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
10719
10770
  __proto__: null,
10720
10771
  loader: loader$7
10721
10772
  }, Symbol.toStringTag, { value: "Module" }));
@@ -10804,7 +10855,7 @@ function DiffViewer() {
10804
10855
  }
10805
10856
  );
10806
10857
  }
10807
- const route29 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
10858
+ const route31 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
10808
10859
  __proto__: null,
10809
10860
  default: DiffViewer,
10810
10861
  loader: loader$6
@@ -10817,7 +10868,7 @@ async function loader$5({ request }) {
10817
10868
  { headers: { "Server-Timing": getServerTimeHeader(timings) } }
10818
10869
  );
10819
10870
  }
10820
- const route31 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
10871
+ const route32 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
10821
10872
  __proto__: null,
10822
10873
  loader: loader$5
10823
10874
  }, Symbol.toStringTag, { value: "Module" }));
@@ -11148,7 +11199,7 @@ function OgLayout({
11148
11199
  }
11149
11200
  );
11150
11201
  }
11151
- const route34 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
11202
+ const route35 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
11152
11203
  __proto__: null,
11153
11204
  loader: loader$4
11154
11205
  }, Symbol.toStringTag, { value: "Module" }));
@@ -11196,7 +11247,7 @@ function Onboarding() {
11196
11247
  /* @__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!" }) })
11197
11248
  ] });
11198
11249
  }
11199
- const route35 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
11250
+ const route36 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
11200
11251
  __proto__: null,
11201
11252
  action,
11202
11253
  default: Onboarding,
@@ -11209,9 +11260,9 @@ async function loader$2() {
11209
11260
  const processes = {};
11210
11261
  for (const [
11211
11262
  name,
11212
- { port: port2, process: process2, color }
11263
+ { port, process: process2, color }
11213
11264
  ] of getProcesses().devProcesses.entries()) {
11214
- processes[name] = { port: port2, pid: process2.pid, color };
11265
+ processes[name] = { port, pid: process2.pid, color };
11215
11266
  }
11216
11267
  const testProcesses = {};
11217
11268
  for (const [
@@ -11222,7 +11273,7 @@ async function loader$2() {
11222
11273
  }
11223
11274
  return Response.json({ processes, testProcesses });
11224
11275
  }
11225
- const route36 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
11276
+ const route37 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
11226
11277
  __proto__: null,
11227
11278
  loader: loader$2
11228
11279
  }, Symbol.toStringTag, { value: "Module" }));
@@ -11231,7 +11282,7 @@ function loader$1({ request }) {
11231
11282
  { type: "sitemap", value: `${getDomainUrl(request)}/sitemap.xml` }
11232
11283
  ]);
11233
11284
  }
11234
- const route38 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
11285
+ const route39 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
11235
11286
  __proto__: null,
11236
11287
  loader: loader$1
11237
11288
  }, Symbol.toStringTag, { value: "Module" }));
@@ -11244,11 +11295,11 @@ async function loader({ request, context }) {
11244
11295
  }
11245
11296
  });
11246
11297
  }
11247
- const route40 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
11298
+ const route41 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
11248
11299
  __proto__: null,
11249
11300
  loader
11250
11301
  }, Symbol.toStringTag, { value: "Module" }));
11251
- const serverManifest = { "entry": { "module": "/assets/entry.client-BTYTUpFV.js", "imports": ["/assets/index-BFGhCX_U.js", "/assets/components-9EGYHTc_.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-DCfiv1cO.js", "imports": ["/assets/index-BFGhCX_U.js", "/assets/components-9EGYHTc_.js", "/assets/misc-BJtHv_Jh.js", "/assets/pe-ChIwTk8v.js", "/assets/error-boundary-1-dmC941.js", "/assets/progress-bar-Cj5R4Zk7.js", "/assets/index-DRH72MzK.js", "/assets/tooltip-BgynKV2c.js", "/assets/index-_J-F_Dnc.js", "/assets/presence-DyppfK2V.js", "/assets/seo-pBpFCWsy.js", "/assets/request-info-DCIQLE6H.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/_-CWSCXcBv.js", "imports": ["/assets/index-BFGhCX_U.js", "/assets/error-boundary-1-dmC941.js", "/assets/misc-BJtHv_Jh.js", "/assets/components-9EGYHTc_.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-pUNfVRe2.js", "imports": ["/assets/index-BFGhCX_U.js", "/assets/misc-BJtHv_Jh.js", "/assets/pe-ChIwTk8v.js", "/assets/product-C1ynnrN_.js", "/assets/revalidation-ws-DU-PzW-_.js", "/assets/tooltip-BgynKV2c.js", "/assets/index-BuoaxPEj.js", "/assets/user-DJiL1Lk-.js", "/assets/workshop-config-DJY2cXU_.js", "/assets/presence-DyppfK2V.js", "/assets/progress-DAB3nDa2.js", "/assets/index-_J-F_Dnc.js", "/assets/components-9EGYHTc_.js", "/assets/request-info-DCIQLE6H.js"], "css": [] }, "routes/_app+/account": { "id": "routes/_app+/account", "parentId": "routes/_app+/_layout", "path": "account", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/account-RJjysGnp.js", "imports": ["/assets/index-BFGhCX_U.js", "/assets/button-DQ001ob0.js", "/assets/misc-BJtHv_Jh.js", "/assets/tooltip-BgynKV2c.js", "/assets/user-DJiL1Lk-.js", "/assets/presence-DyppfK2V.js", "/assets/components-9EGYHTc_.js", "/assets/request-info-DCIQLE6H.js"], "css": [] }, "routes/_app+/app.$appName+/$": { "id": "routes/_app+/app.$appName+/$", "parentId": "routes/_app+/_layout", "path": "app/:appName/*", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/app.$appName+/api.$": { "id": "routes/_app+/app.$appName+/api.$", "parentId": "routes/_app+/_layout", "path": "app/:appName/api/*", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/api._-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/app.$appName+/epic_ws[.js]": { "id": "routes/_app+/app.$appName+/epic_ws[.js]", "parentId": "routes/_app+/_layout", "path": "app/:appName/epic_ws.js", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/epic_ws_.js_-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/app.$appName+/index": { "id": "routes/_app+/app.$appName+/index", "parentId": "routes/_app+/_layout", "path": "app/:appName/", "index": true, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/index-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/app.$appName+/test.$testName": { "id": "routes/_app+/app.$appName+/test.$testName", "parentId": "routes/_app+/_layout", "path": "app/:appName/test/:testName", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/test._testName-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/app.$appName+/test.epic_ws[.js]": { "id": "routes/_app+/app.$appName+/test.epic_ws[.js]", "parentId": "routes/_app+/_layout", "path": "app/:appName/test/epic_ws.js", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/test.epic_ws_.js_-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/app.epic_ws[.js]": { "id": "routes/_app+/app.epic_ws[.js]", "parentId": "routes/_app+/_layout", "path": "app/epic_ws.js", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/app.epic_ws_.js_-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/discord": { "id": "routes/_app+/discord", "parentId": "routes/_app+/_layout", "path": "discord", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/discord-lXkS53K3.js", "imports": ["/assets/discord-DxisvcaU.js", "/assets/index-BFGhCX_U.js", "/assets/misc-BJtHv_Jh.js", "/assets/components-9EGYHTc_.js", "/assets/user-DJiL1Lk-.js"], "css": [] }, "routes/_app+/exercise+/_layout": { "id": "routes/_app+/exercise+/_layout", "parentId": "routes/_app+/_layout", "path": "exercise", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_layout-88n0To1b.js", "imports": ["/assets/index-BFGhCX_U.js"], "css": [] }, "routes/_app+/exercise+/$exerciseNumber": { "id": "routes/_app+/exercise+/$exerciseNumber", "parentId": "routes/_app+/exercise+/_layout", "path": ":exerciseNumber", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/_exerciseNumber-BnwWTYFw.js", "imports": ["/assets/index-BFGhCX_U.js", "/assets/index-BCxBKsqT.js", "/assets/epic-video-1XLXSFCL.js", "/assets/revalidation-ws-DU-PzW-_.js", "/assets/mdx-DiFCTSLR.js", "/assets/progress-DAB3nDa2.js", "/assets/misc-BJtHv_Jh.js", "/assets/seo-pBpFCWsy.js", "/assets/components-9EGYHTc_.js", "/assets/index-_J-F_Dnc.js", "/assets/request-info-DCIQLE6H.js", "/assets/tooltip-BgynKV2c.js", "/assets/pe-ChIwTk8v.js", "/assets/loading-Dk0n07O3.js", "/assets/user-DJiL1Lk-.js", "/assets/workshop-config-DJY2cXU_.js", "/assets/progress-bar-Cj5R4Zk7.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/exercise+/$exerciseNumber_.$stepNumber": { "id": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber", "parentId": "routes/_app+/exercise+/_layout", "path": ":exerciseNumber/:stepNumber", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/_exerciseNumber_._stepNumber-BA2Xhzqs.js", "imports": ["/assets/index-BFGhCX_U.js", "/assets/misc-BJtHv_Jh.js", "/assets/components-9EGYHTc_.js"], "css": [] }, "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout": { "id": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout", "parentId": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber", "path": ":type", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/_layout-Bpho30KN.js", "imports": ["/assets/index-BFGhCX_U.js", "/assets/index-BCxBKsqT.js", "/assets/error-boundary-1-dmC941.js", "/assets/nav-chevrons-CgbSMLeb.js", "/assets/revalidation-ws-DU-PzW-_.js", "/assets/mdx-DiFCTSLR.js", "/assets/progress-DAB3nDa2.js", "/assets/set-playground-S_rIwJAa.js", "/assets/seo-pBpFCWsy.js", "/assets/misc-BJtHv_Jh.js", "/assets/epic-video-1XLXSFCL.js", "/assets/tooltip-BgynKV2c.js", "/assets/request-info-DCIQLE6H.js", "/assets/components-9EGYHTc_.js", "/assets/index-BuoaxPEj.js", "/assets/progress-bar-Cj5R4Zk7.js", "/assets/pe-ChIwTk8v.js", "/assets/index-BuA_RWlU.js", "/assets/index-_J-F_Dnc.js", "/assets/loading-Dk0n07O3.js", "/assets/user-DJiL1Lk-.js", "/assets/workshop-config-DJY2cXU_.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/app": { "id": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/app", "parentId": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout", "path": "app", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/app-CM8yuYni.js", "imports": ["/assets/index-BFGhCX_U.js", "/assets/preview-CW_12I0i.js", "/assets/components-9EGYHTc_.js", "/assets/misc-BJtHv_Jh.js", "/assets/request-info-DCIQLE6H.js", "/assets/button-DQ001ob0.js", "/assets/loading-Dk0n07O3.js", "/assets/index-_J-F_Dnc.js", "/assets/tooltip-BgynKV2c.js", "/assets/pe-ChIwTk8v.js", "/assets/progress-bar-Cj5R4Zk7.js"], "css": [] }, "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/index": { "id": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/index", "parentId": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout", "path": void 0, "index": true, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/index-DZ0It6pH.js", "imports": ["/assets/index-BFGhCX_U.js", "/assets/tooltip-BgynKV2c.js", "/assets/index-BuA_RWlU.js", "/assets/misc-BJtHv_Jh.js", "/assets/diff-CyIaJAoJ.js", "/assets/error-boundary-1-dmC941.js", "/assets/loading-Dk0n07O3.js", "/assets/discord-DxisvcaU.js", "/assets/components-9EGYHTc_.js", "/assets/index-DRH72MzK.js", "/assets/set-playground-S_rIwJAa.js", "/assets/tests-Bp85P9FF.js", "/assets/preview-CW_12I0i.js", "/assets/index-BuoaxPEj.js", "/assets/accordion-DC885Li1.js", "/assets/mdx-DiFCTSLR.js", "/assets/epic-video-1XLXSFCL.js", "/assets/index-_J-F_Dnc.js", "/assets/request-info-DCIQLE6H.js", "/assets/pe-ChIwTk8v.js", "/assets/user-DJiL1Lk-.js", "/assets/workshop-config-DJY2cXU_.js", "/assets/progress-bar-Cj5R4Zk7.js", "/assets/revalidation-ws-DU-PzW-_.js", "/assets/use-event-source-x59d4R2Z.js", "/assets/button-DQ001ob0.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/test": { "id": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/test", "parentId": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout", "path": "test", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/test-CvzcNTDp.js", "imports": ["/assets/index-BFGhCX_U.js", "/assets/tests-Bp85P9FF.js", "/assets/components-9EGYHTc_.js", "/assets/epic-video-1XLXSFCL.js", "/assets/index-_J-F_Dnc.js", "/assets/request-info-DCIQLE6H.js", "/assets/misc-BJtHv_Jh.js", "/assets/tooltip-BgynKV2c.js", "/assets/pe-ChIwTk8v.js", "/assets/loading-Dk0n07O3.js", "/assets/user-DJiL1Lk-.js", "/assets/workshop-config-DJY2cXU_.js", "/assets/accordion-DC885Li1.js", "/assets/index-BuA_RWlU.js", "/assets/index-BuoaxPEj.js", "/assets/use-event-source-x59d4R2Z.js", "/assets/set-playground-S_rIwJAa.js", "/assets/progress-bar-Cj5R4Zk7.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.index": { "id": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.index", "parentId": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber", "path": void 0, "index": true, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_exerciseNumber_._stepNumber.index-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/exercise+/$exerciseNumber_.finished": { "id": "routes/_app+/exercise+/$exerciseNumber_.finished", "parentId": "routes/_app+/exercise+/_layout", "path": ":exerciseNumber/finished", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_exerciseNumber_.finished-BfeMSie-.js", "imports": ["/assets/index-BFGhCX_U.js", "/assets/index-BCxBKsqT.js", "/assets/epic-video-1XLXSFCL.js", "/assets/loading-Dk0n07O3.js", "/assets/nav-chevrons-CgbSMLeb.js", "/assets/revalidation-ws-DU-PzW-_.js", "/assets/mdx-DiFCTSLR.js", "/assets/progress-DAB3nDa2.js", "/assets/misc-BJtHv_Jh.js", "/assets/seo-pBpFCWsy.js", "/assets/components-9EGYHTc_.js", "/assets/index-_J-F_Dnc.js", "/assets/request-info-DCIQLE6H.js", "/assets/tooltip-BgynKV2c.js", "/assets/pe-ChIwTk8v.js", "/assets/user-DJiL1Lk-.js", "/assets/workshop-config-DJY2cXU_.js", "/assets/progress-bar-Cj5R4Zk7.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/finished": { "id": "routes/_app+/finished", "parentId": "routes/_app+/_layout", "path": "finished", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/finished-DjF_kSoF.js", "imports": ["/assets/index-BFGhCX_U.js", "/assets/index-BCxBKsqT.js", "/assets/epic-video-1XLXSFCL.js", "/assets/loading-Dk0n07O3.js", "/assets/nav-chevrons-CgbSMLeb.js", "/assets/revalidation-ws-DU-PzW-_.js", "/assets/mdx-DiFCTSLR.js", "/assets/misc-BJtHv_Jh.js", "/assets/seo-pBpFCWsy.js", "/assets/progress-DAB3nDa2.js", "/assets/components-9EGYHTc_.js", "/assets/index-_J-F_Dnc.js", "/assets/request-info-DCIQLE6H.js", "/assets/tooltip-BgynKV2c.js", "/assets/pe-ChIwTk8v.js", "/assets/user-DJiL1Lk-.js", "/assets/workshop-config-DJY2cXU_.js", "/assets/progress-bar-Cj5R4Zk7.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-f5Q6XZEy.js", "imports": ["/assets/index-BFGhCX_U.js", "/assets/index-BCxBKsqT.js", "/assets/epic-video-1XLXSFCL.js", "/assets/error-boundary-1-dmC941.js", "/assets/mdx-DiFCTSLR.js", "/assets/misc-BJtHv_Jh.js", "/assets/progress-DAB3nDa2.js", "/assets/components-9EGYHTc_.js", "/assets/index-_J-F_Dnc.js", "/assets/request-info-DCIQLE6H.js", "/assets/tooltip-BgynKV2c.js", "/assets/pe-ChIwTk8v.js", "/assets/loading-Dk0n07O3.js", "/assets/user-DJiL1Lk-.js", "/assets/workshop-config-DJY2cXU_.js", "/assets/progress-bar-Cj5R4Zk7.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-pZYDEC_l.js", "imports": ["/assets/index-BFGhCX_U.js", "/assets/use-event-source-x59d4R2Z.js", "/assets/button-DQ001ob0.js", "/assets/loading-Dk0n07O3.js", "/assets/product-C1ynnrN_.js", "/assets/workshop-config-DJY2cXU_.js", "/assets/request-info-DCIQLE6H.js", "/assets/components-9EGYHTc_.js", "/assets/misc-BJtHv_Jh.js", "/assets/index-_J-F_Dnc.js", "/assets/tooltip-BgynKV2c.js", "/assets/pe-ChIwTk8v.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-BNS-kEhc.js", "imports": ["/assets/index-BFGhCX_U.js", "/assets/components-9EGYHTc_.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-gyrNluke.js", "imports": ["/assets/index-BFGhCX_U.js", "/assets/misc-BJtHv_Jh.js", "/assets/tooltip-BgynKV2c.js", "/assets/progress-DAB3nDa2.js", "/assets/components-9EGYHTc_.js", "/assets/pe-ChIwTk8v.js"], "css": [] }, "routes/admin+/apps": { "id": "routes/admin+/apps", "parentId": "routes/admin+/_layout", "path": "apps", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/apps-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/admin+/cache": { "id": "routes/admin+/cache", "parentId": "routes/admin+/_layout", "path": "cache", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/cache-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/apps": { "id": "routes/apps", "parentId": "root", "path": "apps", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/apps-DP2rzg_V.js", "imports": [], "css": [] }, "routes/diff": { "id": "routes/diff", "parentId": "root", "path": "diff", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/diff-Cnw7IcG5.js", "imports": ["/assets/index-BFGhCX_U.js", "/assets/misc-BJtHv_Jh.js", "/assets/diff-CyIaJAoJ.js", "/assets/nav-chevrons-CgbSMLeb.js", "/assets/components-9EGYHTc_.js", "/assets/accordion-DC885Li1.js", "/assets/tooltip-BgynKV2c.js", "/assets/index-BuA_RWlU.js", "/assets/index-BuoaxPEj.js", "/assets/mdx-DiFCTSLR.js", "/assets/epic-video-1XLXSFCL.js", "/assets/index-_J-F_Dnc.js", "/assets/request-info-DCIQLE6H.js", "/assets/pe-ChIwTk8v.js", "/assets/loading-Dk0n07O3.js", "/assets/user-DJiL1Lk-.js", "/assets/workshop-config-DJY2cXU_.js", "/assets/progress-bar-Cj5R4Zk7.js", "/assets/revalidation-ws-DU-PzW-_.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/discord.callback": { "id": "routes/discord.callback", "parentId": "root", "path": "discord/callback", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/discord.callback-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/exercises": { "id": "routes/exercises", "parentId": "root", "path": "exercises", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/exercises-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/launch-editor": { "id": "routes/launch-editor", "parentId": "root", "path": "launch-editor", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/launch-editor-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/login-sse": { "id": "routes/login-sse", "parentId": "root", "path": "login-sse", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/login-sse-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/og": { "id": "routes/og", "parentId": "root", "path": "og", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/og-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/onboarding": { "id": "routes/onboarding", "parentId": "root", "path": "onboarding", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/onboarding-DXICEaMi.js", "imports": ["/assets/index-BFGhCX_U.js", "/assets/button-DQ001ob0.js", "/assets/epic-video-1XLXSFCL.js", "/assets/components-9EGYHTc_.js", "/assets/misc-BJtHv_Jh.js", "/assets/index-_J-F_Dnc.js", "/assets/request-info-DCIQLE6H.js", "/assets/tooltip-BgynKV2c.js", "/assets/pe-ChIwTk8v.js", "/assets/loading-Dk0n07O3.js", "/assets/user-DJiL1Lk-.js", "/assets/workshop-config-DJY2cXU_.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/processes": { "id": "routes/processes", "parentId": "root", "path": "processes", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/processes-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/progress": { "id": "routes/progress", "parentId": "root", "path": "progress", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/progress-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/robots[.]txt": { "id": "routes/robots[.]txt", "parentId": "root", "path": "robots.txt", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/robots_._txt-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/set-playground": { "id": "routes/set-playground", "parentId": "root", "path": "set-playground", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/set-playground-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/sitemap[.]xml": { "id": "routes/sitemap[.]xml", "parentId": "root", "path": "sitemap.xml", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/sitemap_._xml-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/start": { "id": "routes/start", "parentId": "root", "path": "start", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/start-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/test": { "id": "routes/test", "parentId": "root", "path": "test", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/test-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/theme/index": { "id": "routes/theme/index", "parentId": "root", "path": "theme", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/index-DP2rzg_V.js", "imports": [], "css": [] }, "routes/video-player/index": { "id": "routes/video-player/index", "parentId": "root", "path": "video-player", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/index-K6Dvbx-E.js", "imports": [], "css": [] } }, "url": "/assets/manifest-9328c766.js", "version": "9328c766" };
11302
+ const serverManifest = { "entry": { "module": "/assets/entry.client-DqIWuxf8.js", "imports": ["/assets/index-BFGhCX_U.js", "/assets/components-Be92gVxW.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-a3d3Qwip.js", "imports": ["/assets/index-BFGhCX_U.js", "/assets/components-Be92gVxW.js", "/assets/misc-DUy_whwE.js", "/assets/pe-ChIwTk8v.js", "/assets/error-boundary-BZA-ffa8.js", "/assets/progress-bar-BaTU3Yx_.js", "/assets/index-C9Hx0Dey.js", "/assets/tooltip-DO9uwurQ.js", "/assets/index-Bdg3v8tC.js", "/assets/presence-DJGFvdDh.js", "/assets/seo-pBpFCWsy.js", "/assets/request-info-ByUEfOil.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/_-BrkpfnBb.js", "imports": ["/assets/index-BFGhCX_U.js", "/assets/error-boundary-BZA-ffa8.js", "/assets/misc-DUy_whwE.js", "/assets/components-Be92gVxW.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-Cbz7Qt-S.js", "imports": ["/assets/index-BFGhCX_U.js", "/assets/misc-DUy_whwE.js", "/assets/pe-ChIwTk8v.js", "/assets/product-DIAmCwmZ.js", "/assets/revalidation-ws-dUa9CAqr.js", "/assets/tooltip-DO9uwurQ.js", "/assets/index-BCTr8uu6.js", "/assets/user-Bv6wYhQP.js", "/assets/workshop-config-WVltG_BV.js", "/assets/presence-DJGFvdDh.js", "/assets/progress-DQt_Bn9o.js", "/assets/index-Bdg3v8tC.js", "/assets/components-Be92gVxW.js", "/assets/request-info-ByUEfOil.js"], "css": [] }, "routes/_app+/account": { "id": "routes/_app+/account", "parentId": "routes/_app+/_layout", "path": "account", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/account-C4Piztoz.js", "imports": ["/assets/index-BFGhCX_U.js", "/assets/button-_qPvcoqR.js", "/assets/misc-DUy_whwE.js", "/assets/tooltip-DO9uwurQ.js", "/assets/user-Bv6wYhQP.js", "/assets/workshop-config-WVltG_BV.js", "/assets/presence-DJGFvdDh.js", "/assets/components-Be92gVxW.js", "/assets/request-info-ByUEfOil.js"], "css": [] }, "routes/_app+/app.$appName+/$": { "id": "routes/_app+/app.$appName+/$", "parentId": "routes/_app+/_layout", "path": "app/:appName/*", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/app.$appName+/api.$": { "id": "routes/_app+/app.$appName+/api.$", "parentId": "routes/_app+/_layout", "path": "app/:appName/api/*", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/api._-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/app.$appName+/epic_ws[.js]": { "id": "routes/_app+/app.$appName+/epic_ws[.js]", "parentId": "routes/_app+/_layout", "path": "app/:appName/epic_ws.js", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/epic_ws_.js_-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/app.$appName+/index": { "id": "routes/_app+/app.$appName+/index", "parentId": "routes/_app+/_layout", "path": "app/:appName/", "index": true, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/index-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/app.$appName+/test.$testName": { "id": "routes/_app+/app.$appName+/test.$testName", "parentId": "routes/_app+/_layout", "path": "app/:appName/test/:testName", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/test._testName-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/app.$appName+/test.epic_ws[.js]": { "id": "routes/_app+/app.$appName+/test.epic_ws[.js]", "parentId": "routes/_app+/_layout", "path": "app/:appName/test/epic_ws.js", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/test.epic_ws_.js_-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/app.epic_ws[.js]": { "id": "routes/_app+/app.epic_ws[.js]", "parentId": "routes/_app+/_layout", "path": "app/epic_ws.js", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/app.epic_ws_.js_-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/discord": { "id": "routes/_app+/discord", "parentId": "routes/_app+/_layout", "path": "discord", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/discord-Bdnx7fu-.js", "imports": ["/assets/discord-BUWZUTEC.js", "/assets/index-BFGhCX_U.js", "/assets/misc-DUy_whwE.js", "/assets/components-Be92gVxW.js", "/assets/user-Bv6wYhQP.js", "/assets/workshop-config-WVltG_BV.js"], "css": [] }, "routes/_app+/exercise+/_layout": { "id": "routes/_app+/exercise+/_layout", "parentId": "routes/_app+/_layout", "path": "exercise", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_layout-88n0To1b.js", "imports": ["/assets/index-BFGhCX_U.js"], "css": [] }, "routes/_app+/exercise+/$exerciseNumber": { "id": "routes/_app+/exercise+/$exerciseNumber", "parentId": "routes/_app+/exercise+/_layout", "path": ":exerciseNumber", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/_exerciseNumber-DCSM0NCG.js", "imports": ["/assets/index-BFGhCX_U.js", "/assets/index-BCxBKsqT.js", "/assets/epic-video-Bp4BOD2R.js", "/assets/revalidation-ws-dUa9CAqr.js", "/assets/mdx-CEjzXoEx.js", "/assets/progress-DQt_Bn9o.js", "/assets/misc-DUy_whwE.js", "/assets/seo-pBpFCWsy.js", "/assets/components-Be92gVxW.js", "/assets/index-Bdg3v8tC.js", "/assets/request-info-ByUEfOil.js", "/assets/tooltip-DO9uwurQ.js", "/assets/pe-ChIwTk8v.js", "/assets/loading-XhMtj4mp.js", "/assets/user-Bv6wYhQP.js", "/assets/workshop-config-WVltG_BV.js", "/assets/progress-bar-BaTU3Yx_.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/exercise+/$exerciseNumber_.$stepNumber": { "id": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber", "parentId": "routes/_app+/exercise+/_layout", "path": ":exerciseNumber/:stepNumber", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/_exerciseNumber_._stepNumber-BIMJh_sg.js", "imports": ["/assets/index-BFGhCX_U.js", "/assets/misc-DUy_whwE.js", "/assets/components-Be92gVxW.js"], "css": [] }, "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout": { "id": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout", "parentId": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber", "path": ":type", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/_layout-DTAM9xh5.js", "imports": ["/assets/index-BFGhCX_U.js", "/assets/index-BCxBKsqT.js", "/assets/error-boundary-BZA-ffa8.js", "/assets/nav-chevrons-DnR25VLp.js", "/assets/revalidation-ws-dUa9CAqr.js", "/assets/mdx-CEjzXoEx.js", "/assets/progress-DQt_Bn9o.js", "/assets/set-playground-CBHBA46B.js", "/assets/seo-pBpFCWsy.js", "/assets/misc-DUy_whwE.js", "/assets/epic-video-Bp4BOD2R.js", "/assets/tooltip-DO9uwurQ.js", "/assets/request-info-ByUEfOil.js", "/assets/components-Be92gVxW.js", "/assets/index-BCTr8uu6.js", "/assets/progress-bar-BaTU3Yx_.js", "/assets/pe-ChIwTk8v.js", "/assets/index-DZDhtMuq.js", "/assets/index-Bdg3v8tC.js", "/assets/loading-XhMtj4mp.js", "/assets/user-Bv6wYhQP.js", "/assets/workshop-config-WVltG_BV.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/app": { "id": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/app", "parentId": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout", "path": "app", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/app-DgTXXO8s.js", "imports": ["/assets/index-BFGhCX_U.js", "/assets/preview-DaZd0wMb.js", "/assets/components-Be92gVxW.js", "/assets/misc-DUy_whwE.js", "/assets/request-info-ByUEfOil.js", "/assets/button-_qPvcoqR.js", "/assets/loading-XhMtj4mp.js", "/assets/index-Bdg3v8tC.js", "/assets/tooltip-DO9uwurQ.js", "/assets/pe-ChIwTk8v.js", "/assets/progress-bar-BaTU3Yx_.js"], "css": [] }, "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/index": { "id": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/index", "parentId": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout", "path": void 0, "index": true, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/index-Bi1TbRTj.js", "imports": ["/assets/index-BFGhCX_U.js", "/assets/tooltip-DO9uwurQ.js", "/assets/index-DZDhtMuq.js", "/assets/misc-DUy_whwE.js", "/assets/diff-8nlDkmpc.js", "/assets/error-boundary-BZA-ffa8.js", "/assets/loading-XhMtj4mp.js", "/assets/discord-BUWZUTEC.js", "/assets/components-Be92gVxW.js", "/assets/index-C9Hx0Dey.js", "/assets/set-playground-CBHBA46B.js", "/assets/tests-DbuyD2cI.js", "/assets/preview-DaZd0wMb.js", "/assets/index-BCTr8uu6.js", "/assets/accordion-D9-D-n9p.js", "/assets/mdx-CEjzXoEx.js", "/assets/epic-video-Bp4BOD2R.js", "/assets/index-Bdg3v8tC.js", "/assets/request-info-ByUEfOil.js", "/assets/pe-ChIwTk8v.js", "/assets/user-Bv6wYhQP.js", "/assets/workshop-config-WVltG_BV.js", "/assets/progress-bar-BaTU3Yx_.js", "/assets/revalidation-ws-dUa9CAqr.js", "/assets/use-event-source-x59d4R2Z.js", "/assets/button-_qPvcoqR.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/test": { "id": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/test", "parentId": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout", "path": "test", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/test-DoKJvNug.js", "imports": ["/assets/index-BFGhCX_U.js", "/assets/tests-DbuyD2cI.js", "/assets/components-Be92gVxW.js", "/assets/epic-video-Bp4BOD2R.js", "/assets/index-Bdg3v8tC.js", "/assets/request-info-ByUEfOil.js", "/assets/misc-DUy_whwE.js", "/assets/tooltip-DO9uwurQ.js", "/assets/pe-ChIwTk8v.js", "/assets/loading-XhMtj4mp.js", "/assets/user-Bv6wYhQP.js", "/assets/workshop-config-WVltG_BV.js", "/assets/accordion-D9-D-n9p.js", "/assets/index-DZDhtMuq.js", "/assets/index-BCTr8uu6.js", "/assets/use-event-source-x59d4R2Z.js", "/assets/set-playground-CBHBA46B.js", "/assets/progress-bar-BaTU3Yx_.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.index": { "id": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.index", "parentId": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber", "path": void 0, "index": true, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_exerciseNumber_._stepNumber.index-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/exercise+/$exerciseNumber_.finished": { "id": "routes/_app+/exercise+/$exerciseNumber_.finished", "parentId": "routes/_app+/exercise+/_layout", "path": ":exerciseNumber/finished", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_exerciseNumber_.finished-nbpk1ToO.js", "imports": ["/assets/index-BFGhCX_U.js", "/assets/index-BCxBKsqT.js", "/assets/epic-video-Bp4BOD2R.js", "/assets/loading-XhMtj4mp.js", "/assets/nav-chevrons-DnR25VLp.js", "/assets/revalidation-ws-dUa9CAqr.js", "/assets/mdx-CEjzXoEx.js", "/assets/progress-DQt_Bn9o.js", "/assets/misc-DUy_whwE.js", "/assets/seo-pBpFCWsy.js", "/assets/components-Be92gVxW.js", "/assets/index-Bdg3v8tC.js", "/assets/request-info-ByUEfOil.js", "/assets/tooltip-DO9uwurQ.js", "/assets/pe-ChIwTk8v.js", "/assets/user-Bv6wYhQP.js", "/assets/workshop-config-WVltG_BV.js", "/assets/progress-bar-BaTU3Yx_.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/finished": { "id": "routes/_app+/finished", "parentId": "routes/_app+/_layout", "path": "finished", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/finished-C0cpfAFL.js", "imports": ["/assets/index-BFGhCX_U.js", "/assets/index-BCxBKsqT.js", "/assets/epic-video-Bp4BOD2R.js", "/assets/loading-XhMtj4mp.js", "/assets/nav-chevrons-DnR25VLp.js", "/assets/revalidation-ws-dUa9CAqr.js", "/assets/mdx-CEjzXoEx.js", "/assets/misc-DUy_whwE.js", "/assets/seo-pBpFCWsy.js", "/assets/progress-DQt_Bn9o.js", "/assets/components-Be92gVxW.js", "/assets/index-Bdg3v8tC.js", "/assets/request-info-ByUEfOil.js", "/assets/tooltip-DO9uwurQ.js", "/assets/pe-ChIwTk8v.js", "/assets/user-Bv6wYhQP.js", "/assets/workshop-config-WVltG_BV.js", "/assets/progress-bar-BaTU3Yx_.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-Ca4vBON4.js", "imports": ["/assets/index-BFGhCX_U.js", "/assets/index-BCxBKsqT.js", "/assets/epic-video-Bp4BOD2R.js", "/assets/error-boundary-BZA-ffa8.js", "/assets/mdx-CEjzXoEx.js", "/assets/misc-DUy_whwE.js", "/assets/progress-DQt_Bn9o.js", "/assets/components-Be92gVxW.js", "/assets/index-Bdg3v8tC.js", "/assets/request-info-ByUEfOil.js", "/assets/tooltip-DO9uwurQ.js", "/assets/pe-ChIwTk8v.js", "/assets/loading-XhMtj4mp.js", "/assets/user-Bv6wYhQP.js", "/assets/workshop-config-WVltG_BV.js", "/assets/progress-bar-BaTU3Yx_.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-C1oOgi98.js", "imports": ["/assets/index-BFGhCX_U.js", "/assets/use-event-source-x59d4R2Z.js", "/assets/button-_qPvcoqR.js", "/assets/loading-XhMtj4mp.js", "/assets/product-DIAmCwmZ.js", "/assets/workshop-config-WVltG_BV.js", "/assets/request-info-ByUEfOil.js", "/assets/components-Be92gVxW.js", "/assets/misc-DUy_whwE.js", "/assets/index-Bdg3v8tC.js", "/assets/tooltip-DO9uwurQ.js", "/assets/pe-ChIwTk8v.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-CIz02V_r.js", "imports": ["/assets/index-BFGhCX_U.js", "/assets/components-Be92gVxW.js"], "css": [] }, "routes/admin+/_layout": { "id": "routes/admin+/_layout", "parentId": "root", "path": "admin", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_layout-Dfmv2zcn.js", "imports": ["/assets/index-BFGhCX_U.js", "/assets/components-Be92gVxW.js"], "css": [] }, "routes/admin+/apps": { "id": "routes/admin+/apps", "parentId": "routes/admin+/_layout", "path": "apps", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/apps-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/admin+/cache": { "id": "routes/admin+/cache", "parentId": "routes/admin+/_layout", "path": "cache", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/cache-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/admin+/index": { "id": "routes/admin+/index", "parentId": "routes/admin+/_layout", "path": void 0, "index": true, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/index-pkiQppkK.js", "imports": ["/assets/index-BFGhCX_U.js", "/assets/misc-DUy_whwE.js", "/assets/tooltip-DO9uwurQ.js", "/assets/progress-DQt_Bn9o.js", "/assets/components-Be92gVxW.js", "/assets/pe-ChIwTk8v.js"], "css": [] }, "routes/admin+/version": { "id": "routes/admin+/version", "parentId": "routes/admin+/_layout", "path": "version", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/version-CaywAlNQ.js", "imports": ["/assets/index-BFGhCX_U.js", "/assets/workshop-config-WVltG_BV.js", "/assets/components-Be92gVxW.js"], "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-BhRAIPKc.js", "imports": ["/assets/index-BFGhCX_U.js", "/assets/misc-DUy_whwE.js", "/assets/diff-8nlDkmpc.js", "/assets/nav-chevrons-DnR25VLp.js", "/assets/components-Be92gVxW.js", "/assets/accordion-D9-D-n9p.js", "/assets/tooltip-DO9uwurQ.js", "/assets/index-DZDhtMuq.js", "/assets/index-BCTr8uu6.js", "/assets/mdx-CEjzXoEx.js", "/assets/epic-video-Bp4BOD2R.js", "/assets/index-Bdg3v8tC.js", "/assets/request-info-ByUEfOil.js", "/assets/pe-ChIwTk8v.js", "/assets/loading-XhMtj4mp.js", "/assets/user-Bv6wYhQP.js", "/assets/workshop-config-WVltG_BV.js", "/assets/progress-bar-BaTU3Yx_.js", "/assets/revalidation-ws-dUa9CAqr.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/exercises": { "id": "routes/exercises", "parentId": "root", "path": "exercises", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/exercises-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/launch-editor": { "id": "routes/launch-editor", "parentId": "root", "path": "launch-editor", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/launch-editor-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/login-sse": { "id": "routes/login-sse", "parentId": "root", "path": "login-sse", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/login-sse-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/og": { "id": "routes/og", "parentId": "root", "path": "og", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/og-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/onboarding": { "id": "routes/onboarding", "parentId": "root", "path": "onboarding", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/onboarding-C2YNq60k.js", "imports": ["/assets/index-BFGhCX_U.js", "/assets/button-_qPvcoqR.js", "/assets/epic-video-Bp4BOD2R.js", "/assets/components-Be92gVxW.js", "/assets/misc-DUy_whwE.js", "/assets/index-Bdg3v8tC.js", "/assets/request-info-ByUEfOil.js", "/assets/tooltip-DO9uwurQ.js", "/assets/pe-ChIwTk8v.js", "/assets/loading-XhMtj4mp.js", "/assets/user-Bv6wYhQP.js", "/assets/workshop-config-WVltG_BV.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/processes": { "id": "routes/processes", "parentId": "root", "path": "processes", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/processes-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/progress": { "id": "routes/progress", "parentId": "root", "path": "progress", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/progress-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/robots[.]txt": { "id": "routes/robots[.]txt", "parentId": "root", "path": "robots.txt", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/robots_._txt-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/set-playground": { "id": "routes/set-playground", "parentId": "root", "path": "set-playground", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/set-playground-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/sitemap[.]xml": { "id": "routes/sitemap[.]xml", "parentId": "root", "path": "sitemap.xml", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/sitemap_._xml-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/start": { "id": "routes/start", "parentId": "root", "path": "start", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/start-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/test": { "id": "routes/test", "parentId": "root", "path": "test", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/test-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/theme/index": { "id": "routes/theme/index", "parentId": "root", "path": "theme", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/index-DP2rzg_V.js", "imports": [], "css": [] }, "routes/video-player/index": { "id": "routes/video-player/index", "parentId": "root", "path": "video-player", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/index-K6Dvbx-E.js", "imports": [], "css": [] } }, "url": "/assets/manifest-bc809ee6.js", "version": "bc809ee6" };
11252
11303
  const mode = "production";
11253
11304
  const assetsBuildDirectory = "build/client";
11254
11305
  const basename = "/";
@@ -11481,13 +11532,29 @@ const routes = {
11481
11532
  caseSensitive: void 0,
11482
11533
  module: route27
11483
11534
  },
11535
+ "routes/admin+/index": {
11536
+ id: "routes/admin+/index",
11537
+ parentId: "routes/admin+/_layout",
11538
+ path: void 0,
11539
+ index: true,
11540
+ caseSensitive: void 0,
11541
+ module: route28
11542
+ },
11543
+ "routes/admin+/version": {
11544
+ id: "routes/admin+/version",
11545
+ parentId: "routes/admin+/_layout",
11546
+ path: "version",
11547
+ index: void 0,
11548
+ caseSensitive: void 0,
11549
+ module: route29
11550
+ },
11484
11551
  "routes/apps": {
11485
11552
  id: "routes/apps",
11486
11553
  parentId: "root",
11487
11554
  path: "apps",
11488
11555
  index: void 0,
11489
11556
  caseSensitive: void 0,
11490
- module: route28
11557
+ module: route30
11491
11558
  },
11492
11559
  "routes/diff": {
11493
11560
  id: "routes/diff",
@@ -11495,15 +11562,7 @@ const routes = {
11495
11562
  path: "diff",
11496
11563
  index: void 0,
11497
11564
  caseSensitive: void 0,
11498
- module: route29
11499
- },
11500
- "routes/discord.callback": {
11501
- id: "routes/discord.callback",
11502
- parentId: "root",
11503
- path: "discord/callback",
11504
- index: void 0,
11505
- caseSensitive: void 0,
11506
- module: route30
11565
+ module: route31
11507
11566
  },
11508
11567
  "routes/exercises": {
11509
11568
  id: "routes/exercises",
@@ -11511,7 +11570,7 @@ const routes = {
11511
11570
  path: "exercises",
11512
11571
  index: void 0,
11513
11572
  caseSensitive: void 0,
11514
- module: route31
11573
+ module: route32
11515
11574
  },
11516
11575
  "routes/launch-editor": {
11517
11576
  id: "routes/launch-editor",
@@ -11519,7 +11578,7 @@ const routes = {
11519
11578
  path: "launch-editor",
11520
11579
  index: void 0,
11521
11580
  caseSensitive: void 0,
11522
- module: route32
11581
+ module: route33
11523
11582
  },
11524
11583
  "routes/login-sse": {
11525
11584
  id: "routes/login-sse",
@@ -11527,7 +11586,7 @@ const routes = {
11527
11586
  path: "login-sse",
11528
11587
  index: void 0,
11529
11588
  caseSensitive: void 0,
11530
- module: route33
11589
+ module: route34
11531
11590
  },
11532
11591
  "routes/og": {
11533
11592
  id: "routes/og",
@@ -11535,7 +11594,7 @@ const routes = {
11535
11594
  path: "og",
11536
11595
  index: void 0,
11537
11596
  caseSensitive: void 0,
11538
- module: route34
11597
+ module: route35
11539
11598
  },
11540
11599
  "routes/onboarding": {
11541
11600
  id: "routes/onboarding",
@@ -11543,7 +11602,7 @@ const routes = {
11543
11602
  path: "onboarding",
11544
11603
  index: void 0,
11545
11604
  caseSensitive: void 0,
11546
- module: route35
11605
+ module: route36
11547
11606
  },
11548
11607
  "routes/processes": {
11549
11608
  id: "routes/processes",
@@ -11551,7 +11610,7 @@ const routes = {
11551
11610
  path: "processes",
11552
11611
  index: void 0,
11553
11612
  caseSensitive: void 0,
11554
- module: route36
11613
+ module: route37
11555
11614
  },
11556
11615
  "routes/progress": {
11557
11616
  id: "routes/progress",
@@ -11559,7 +11618,7 @@ const routes = {
11559
11618
  path: "progress",
11560
11619
  index: void 0,
11561
11620
  caseSensitive: void 0,
11562
- module: route37
11621
+ module: route38
11563
11622
  },
11564
11623
  "routes/robots[.]txt": {
11565
11624
  id: "routes/robots[.]txt",
@@ -11567,7 +11626,7 @@ const routes = {
11567
11626
  path: "robots.txt",
11568
11627
  index: void 0,
11569
11628
  caseSensitive: void 0,
11570
- module: route38
11629
+ module: route39
11571
11630
  },
11572
11631
  "routes/set-playground": {
11573
11632
  id: "routes/set-playground",
@@ -11575,7 +11634,7 @@ const routes = {
11575
11634
  path: "set-playground",
11576
11635
  index: void 0,
11577
11636
  caseSensitive: void 0,
11578
- module: route39
11637
+ module: route40
11579
11638
  },
11580
11639
  "routes/sitemap[.]xml": {
11581
11640
  id: "routes/sitemap[.]xml",
@@ -11583,7 +11642,7 @@ const routes = {
11583
11642
  path: "sitemap.xml",
11584
11643
  index: void 0,
11585
11644
  caseSensitive: void 0,
11586
- module: route40
11645
+ module: route41
11587
11646
  },
11588
11647
  "routes/start": {
11589
11648
  id: "routes/start",
@@ -11591,7 +11650,7 @@ const routes = {
11591
11650
  path: "start",
11592
11651
  index: void 0,
11593
11652
  caseSensitive: void 0,
11594
- module: route41
11653
+ module: route42
11595
11654
  },
11596
11655
  "routes/test": {
11597
11656
  id: "routes/test",
@@ -11599,7 +11658,7 @@ const routes = {
11599
11658
  path: "test",
11600
11659
  index: void 0,
11601
11660
  caseSensitive: void 0,
11602
- module: route42
11661
+ module: route43
11603
11662
  },
11604
11663
  "routes/theme/index": {
11605
11664
  id: "routes/theme/index",
@@ -11607,7 +11666,7 @@ const routes = {
11607
11666
  path: "theme",
11608
11667
  index: void 0,
11609
11668
  caseSensitive: void 0,
11610
- module: route43
11669
+ module: route44
11611
11670
  },
11612
11671
  "routes/video-player/index": {
11613
11672
  id: "routes/video-player/index",
@@ -11615,7 +11674,7 @@ const routes = {
11615
11674
  path: "video-player",
11616
11675
  index: void 0,
11617
11676
  caseSensitive: void 0,
11618
- module: route44
11677
+ module: route45
11619
11678
  }
11620
11679
  };
11621
11680
  export {