@epic-web/workshop-app 5.1.2 → 5.3.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 (77) hide show
  1. package/build/client/assets/{_exerciseNumber-DarnXgbX.js → _exerciseNumber-Byb05FGg.js} +2 -2
  2. package/build/client/assets/_exerciseNumber-Byb05FGg.js.map +1 -0
  3. package/build/client/assets/_exerciseNumber_._stepNumber-BA2Xhzqs.js.map +1 -1
  4. package/build/client/assets/{_exerciseNumber_.finished-DEzaS_Ji.js → _exerciseNumber_.finished-DUqyxjV2.js} +2 -2
  5. package/build/client/assets/_exerciseNumber_.finished-DUqyxjV2.js.map +1 -0
  6. package/build/client/assets/{_layout-BTrPWpBz.js → _layout-BwDoP7Kv.js} +2 -2
  7. package/build/client/assets/_layout-BwDoP7Kv.js.map +1 -0
  8. package/build/client/assets/_layout-DvQmiuTm.js +6 -0
  9. package/build/client/assets/_layout-DvQmiuTm.js.map +1 -0
  10. package/build/client/assets/_layout-gyrNluke.js.map +1 -1
  11. package/build/client/assets/account-DbdZ0Vhg.js +2 -0
  12. package/build/client/assets/account-DbdZ0Vhg.js.map +1 -0
  13. package/build/client/assets/app-CM8yuYni.js.map +1 -1
  14. package/build/client/assets/{diff-jlCv3hv0.js → diff-Cmd66hnY.js} +2 -2
  15. package/build/client/assets/diff-Cmd66hnY.js.map +1 -0
  16. package/build/client/assets/{diff-assn_bSK.js → diff-CzHloS9Q.js} +2 -2
  17. package/build/client/assets/{diff-assn_bSK.js.map → diff-CzHloS9Q.js.map} +1 -1
  18. package/build/client/assets/{discord-CHsbqaqM.js → discord-DGeGrHNb.js} +2 -2
  19. package/build/client/assets/discord-DGeGrHNb.js.map +1 -0
  20. package/build/client/assets/discord-arMqZKbH.js +2 -0
  21. package/build/client/assets/discord-arMqZKbH.js.map +1 -0
  22. package/build/client/assets/{epic-video-GDpD7_Qt.js → epic-video-Dw5Vkxid.js} +2 -2
  23. package/build/client/assets/{epic-video-GDpD7_Qt.js.map → epic-video-Dw5Vkxid.js.map} +1 -1
  24. package/build/client/assets/{finished-DVV0zwmP.js → finished-DbOxW5dc.js} +2 -2
  25. package/build/client/assets/finished-DbOxW5dc.js.map +1 -0
  26. package/build/client/assets/{index-KgMLc41c.js → index-Bfqa72Xl.js} +2 -2
  27. package/build/client/assets/index-Bfqa72Xl.js.map +1 -0
  28. package/build/client/assets/{index-DJF1fiZI.js → index-D-V8b9oA.js} +2 -2
  29. package/build/client/assets/index-D-V8b9oA.js.map +1 -0
  30. package/build/client/assets/index-_J-F_Dnc.js.map +1 -1
  31. package/build/client/assets/login-pZYDEC_l.js.map +1 -1
  32. package/build/client/assets/{manifest-3338a6ab.js → manifest-0d355395.js} +1 -1
  33. package/build/client/assets/{mdx-hW1uYjc1.js → mdx-C01HZJEv.js} +2 -2
  34. package/build/client/assets/{mdx-hW1uYjc1.js.map → mdx-C01HZJEv.js.map} +1 -1
  35. package/build/client/assets/{onboarding-DCuSqnkZ.js → onboarding-Dk74xvlh.js} +2 -2
  36. package/build/client/assets/onboarding-Dk74xvlh.js.map +1 -0
  37. package/build/client/assets/pe-ChIwTk8v.js.map +1 -1
  38. package/build/client/assets/presence-DyppfK2V.js +28 -0
  39. package/build/client/assets/presence-DyppfK2V.js.map +1 -0
  40. package/build/client/assets/preview-CW_12I0i.js.map +1 -1
  41. package/build/client/assets/progress-DAB3nDa2.js.map +1 -1
  42. package/build/client/assets/{root-DojjHZlY.js → root-DCfiv1cO.js} +2 -2
  43. package/build/client/assets/{root-DojjHZlY.js.map → root-DCfiv1cO.js.map} +1 -1
  44. package/build/client/assets/{set-playground-DgnOJqFN.js → set-playground-S_rIwJAa.js} +2 -2
  45. package/build/client/assets/set-playground-S_rIwJAa.js.map +1 -0
  46. package/build/client/assets/{test-DJ7oeeeg.js → test-D_qZ9Wu9.js} +2 -2
  47. package/build/client/assets/test-D_qZ9Wu9.js.map +1 -0
  48. package/build/client/assets/{tests-Bw1rCopV.js → tests-Cmesc4Yz.js} +2 -2
  49. package/build/client/assets/tests-Cmesc4Yz.js.map +1 -0
  50. package/build/client/assets/user-AF5-S38o.js +2 -0
  51. package/build/client/assets/user-AF5-S38o.js.map +1 -0
  52. package/build/server/index.js +392 -256
  53. package/build/server/index.js.map +1 -1
  54. package/dist/server/index.js +0 -2
  55. package/package.json +4 -4
  56. package/build/client/assets/_exerciseNumber-DarnXgbX.js.map +0 -1
  57. package/build/client/assets/_exerciseNumber_.finished-DEzaS_Ji.js.map +0 -1
  58. package/build/client/assets/_layout-BTrPWpBz.js.map +0 -1
  59. package/build/client/assets/_layout-T2hZtl0D.js +0 -6
  60. package/build/client/assets/_layout-T2hZtl0D.js.map +0 -1
  61. package/build/client/assets/account-CPFwPYf1.js +0 -2
  62. package/build/client/assets/account-CPFwPYf1.js.map +0 -1
  63. package/build/client/assets/diff-jlCv3hv0.js.map +0 -1
  64. package/build/client/assets/discord-CHsbqaqM.js.map +0 -1
  65. package/build/client/assets/discord-DoeazikD.js +0 -2
  66. package/build/client/assets/discord-DoeazikD.js.map +0 -1
  67. package/build/client/assets/finished-DVV0zwmP.js.map +0 -1
  68. package/build/client/assets/index-DJF1fiZI.js.map +0 -1
  69. package/build/client/assets/index-KgMLc41c.js.map +0 -1
  70. package/build/client/assets/onboarding-DCuSqnkZ.js.map +0 -1
  71. package/build/client/assets/presence-CdyMdOKk.js +0 -28
  72. package/build/client/assets/presence-CdyMdOKk.js.map +0 -1
  73. package/build/client/assets/set-playground-DgnOJqFN.js.map +0 -1
  74. package/build/client/assets/test-DJ7oeeeg.js.map +0 -1
  75. package/build/client/assets/tests-Bw1rCopV.js.map +0 -1
  76. package/build/client/assets/user-BBryXlM_.js +0 -2
  77. package/build/client/assets/user-BBryXlM_.js.map +0 -1
@@ -1,12 +1,12 @@
1
1
  import { jsx, jsxs, Fragment } from "react/jsx-runtime";
2
2
  import { PassThrough } from "stream";
3
- import { createReadableStreamFromReadable, json as json$1, createCookieSessionStorage, redirect as redirect$1, defer } from "@remix-run/node";
4
- import { RemixServer, Link, useRouteError, useParams, isRouteErrorResponse, useNavigation, useFetchers, useRouteLoaderData, useRevalidator, useLocation, json, redirect, useFetcher, useLoaderData, Outlet, Meta, Links, ScrollRestoration, Scripts, NavLink, Form, Await, useSearchParams, useSubmit, useNavigate } from "@remix-run/react";
3
+ import { createReadableStreamFromReadable, unstable_data as unstable_data$1, createCookieSessionStorage, redirect as redirect$1 } from "@remix-run/node";
4
+ import { RemixServer, Link, useRouteError, useParams, isRouteErrorResponse, useNavigation, useFetchers, useRouteLoaderData, useRevalidator, useLocation, unstable_data, redirect, useFetcher, useLoaderData, Outlet, Meta, Links, ScrollRestoration, Scripts, NavLink, Form, Await, useSearchParams, useSubmit, useNavigate } from "@remix-run/react";
5
5
  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, getUserInfo, requireAuthInfo, DiscordMemberSchema, setDiscordMember, deleteDiscordInfo, deleteDb, setPresencePreferences, PlayerPreferencesSchema, setPlayerPreferences, setAuthInfo, markOnboardingVideoWatched } from "@epic-web/workshop-utils/db.server";
9
+ import { getPreferences, getAuthInfo, readOnboardingData, getDiscordMember, requireAuthInfo, DiscordMemberSchema, setDiscordMember, deleteDiscordInfo, 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";
@@ -79,7 +79,8 @@ import inspector from "node:inspector";
79
79
  import { Resvg } from "@resvg/resvg-js";
80
80
  import satori from "satori";
81
81
  import { generateRobotsTxt, generateSitemap } from "@nasa-gcn/remix-seo";
82
- const ABORT_DELAY = 15e3;
82
+ const streamTimeout = 15e3;
83
+ const ABORT_DELAY = streamTimeout + 1e3;
83
84
  function handleRequest(request, responseStatusCode, responseHeaders, remixContext) {
84
85
  const callbackName = isbot(request.headers.get("user-agent")) ? "onAllReady" : "onShellReady";
85
86
  return new Promise((resolve, reject) => {
@@ -112,13 +113,18 @@ function handleRequest(request, responseStatusCode, responseHeaders, remixContex
112
113
  }
113
114
  const entryServer = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
114
115
  __proto__: null,
115
- default: handleRequest
116
+ default: handleRequest,
117
+ streamTimeout
116
118
  }, Symbol.toStringTag, { value: "Module" }));
117
119
  const partykitRoom = "epic-web-presence";
118
120
  const partykitBaseUrl = `https://epic-web-presence.kentcdodds.partykit.dev/parties/main/${partykitRoom}`;
119
121
  const UserSchema = z.object({
120
122
  id: z.string(),
123
+ hasAccess: z.boolean().nullable().optional(),
124
+ // TODO: remove the avatarUrl field once people have updated their workshops
121
125
  avatarUrl: z.string().nullable().optional(),
126
+ imageUrlSmall: z.string().nullable().optional(),
127
+ imageUrlLarge: z.string().nullable().optional(),
122
128
  name: z.string().nullable().optional(),
123
129
  location: z.object({
124
130
  workshopTitle: z.string().nullable().optional(),
@@ -777,12 +783,12 @@ function ensureProgressiveEnhancement(formData, responseInit) {
777
783
  throw redirect(safeRedirect(redirectTo), responseInit == null ? void 0 : responseInit());
778
784
  }
779
785
  }
780
- function jsonWithPE(formData, ...args) {
786
+ function dataWithPE(formData, ...args) {
781
787
  ensureProgressiveEnhancement(formData, () => ({
782
788
  statusText: JSON.stringify(args[0]),
783
789
  ...typeof args[1] === "number" ? { status: args[1] } : args[1]
784
790
  }));
785
- return json(...args);
791
+ return unstable_data(...args);
786
792
  }
787
793
  const cookieName$1 = "EpicShop_theme";
788
794
  function getTheme(request) {
@@ -807,7 +813,7 @@ async function action$b({ request }) {
807
813
  schema: ThemeFormSchema
808
814
  });
809
815
  if (submission.status !== "success") {
810
- return json$1(submission.reply(), {
816
+ return unstable_data$1(submission.reply(), {
811
817
  // You can also use the status to determine the HTTP status code
812
818
  status: submission.status === "error" ? 400 : 200
813
819
  });
@@ -816,7 +822,7 @@ async function action$b({ request }) {
816
822
  const responseInit = {
817
823
  headers: { "set-cookie": setTheme(theme) }
818
824
  };
819
- return jsonWithPE(formData, submission.reply(), responseInit);
825
+ return dataWithPE(formData, submission.reply(), responseInit);
820
826
  }
821
827
  function ThemeSwitch() {
822
828
  const requestInfo = useRequestInfo();
@@ -1298,6 +1304,95 @@ async function userHasAccessToWorkshop({
1298
1304
  }
1299
1305
  });
1300
1306
  }
1307
+ const UserInfoSchema = z.object({
1308
+ id: z.string(),
1309
+ name: z.string(),
1310
+ email: z.string().email(),
1311
+ image: z.string().nullable(),
1312
+ discordProfile: z.object({
1313
+ avatar: z.string().nullable(),
1314
+ nick: z.string(),
1315
+ user: z.object({
1316
+ id: z.string(),
1317
+ username: z.string(),
1318
+ avatar: z.string(),
1319
+ discriminator: z.string(),
1320
+ global_name: z.string()
1321
+ })
1322
+ })
1323
+ }).transform((data) => {
1324
+ var _a, _b;
1325
+ return {
1326
+ ...data,
1327
+ imageUrlSmall: resizeImageUrl(data.image, { size: 64 }) ?? resolveDiscordAvatar((_a = data.discordProfile) == null ? void 0 : _a.user, {
1328
+ size: 64
1329
+ }) ?? resolveGravatarUrl(data.email, { size: 64 }),
1330
+ imageUrlLarge: resizeImageUrl(data.image, { size: 512 }) ?? resolveDiscordAvatar((_b = data.discordProfile) == null ? void 0 : _b.user, {
1331
+ size: 512
1332
+ }) ?? resolveGravatarUrl(data.email, { size: 512 })
1333
+ };
1334
+ });
1335
+ function resizeImageUrl(url, { size }) {
1336
+ if (!url) return null;
1337
+ const urlObj = new URL(url);
1338
+ urlObj.searchParams.set("size", size.toString());
1339
+ return urlObj.toString();
1340
+ }
1341
+ function resolveGravatarUrl(email, { size }) {
1342
+ if (!email) return null;
1343
+ const hash = md5(email.toLowerCase());
1344
+ const gravatarOptions = new URLSearchParams({
1345
+ size: size.toString(),
1346
+ default: "identicon"
1347
+ });
1348
+ return `https://www.gravatar.com/avatar/${hash}?${gravatarOptions.toString()}`;
1349
+ }
1350
+ function resolveDiscordAvatar(user, { size }) {
1351
+ if (!user) return null;
1352
+ const { avatar, id: userId } = user;
1353
+ if (!avatar) return null;
1354
+ const isGif = avatar.startsWith("a_");
1355
+ const url = new URL(
1356
+ `/avatars/${userId}/${avatar}.${isGif ? "gif" : "png"}`,
1357
+ "https://cdn.discordapp.com"
1358
+ );
1359
+ url.searchParams.set("size", size.toString());
1360
+ return url.toString();
1361
+ }
1362
+ async function getUserInfo({
1363
+ timings,
1364
+ request,
1365
+ forceFresh
1366
+ } = {}) {
1367
+ const authInfo = await getAuthInfo();
1368
+ if (!authInfo) return null;
1369
+ const { tokenSet } = authInfo;
1370
+ const {
1371
+ product: { host }
1372
+ } = getWorkshopConfig();
1373
+ const accessToken = tokenSet.access_token;
1374
+ const url = `https://${host}/oauth/userinfo`;
1375
+ return cachified({
1376
+ key: `${url}:${md5(accessToken)}`,
1377
+ cache: fsCache,
1378
+ request,
1379
+ forceFresh,
1380
+ timings,
1381
+ ttl: 1e3 * 60 * 1,
1382
+ swr: 1e3 * 60 * 60 * 24 * 365,
1383
+ checkValue: UserInfoSchema,
1384
+ async getFreshValue() {
1385
+ const response = await fetch(url, {
1386
+ headers: { authorization: `Bearer ${accessToken}` }
1387
+ });
1388
+ if (!response.ok) {
1389
+ throw new Error(`Failed to fetch user info: ${response.statusText}`);
1390
+ }
1391
+ const data = await response.json();
1392
+ return UserInfoSchema.parse(data);
1393
+ }
1394
+ });
1395
+ }
1301
1396
  const PresenceContext = createContext(null);
1302
1397
  function usePresencePreferences() {
1303
1398
  var _a;
@@ -1315,6 +1410,7 @@ const ExerciseAppParamsSchema = z.object({
1315
1410
  });
1316
1411
  function usePresenceSocket(user) {
1317
1412
  const workshopTitle = useOptionalWorkshopTitle();
1413
+ const { userHasAccess = false } = useRouteLoaderData("root") ?? {};
1318
1414
  const requestInfo = useRequestInfo();
1319
1415
  const rawParams = useParams();
1320
1416
  const prefs = usePresencePreferences();
@@ -1367,7 +1463,9 @@ function usePresenceSocket(user) {
1367
1463
  payload: {
1368
1464
  id: user.id,
1369
1465
  name: user.name,
1370
- avatarUrl: user.avatarUrl,
1466
+ hasAccess: userHasAccess,
1467
+ imageUrlSmall: user.imageUrlSmall,
1468
+ imageUrlLarge: user.imageUrlLarge,
1371
1469
  location
1372
1470
  }
1373
1471
  };
@@ -1383,7 +1481,10 @@ function scoreUsers(location, users) {
1383
1481
  const scoredUsers = users.map((user) => {
1384
1482
  var _a, _b, _c, _d;
1385
1483
  let score = 0;
1386
- const available = 4;
1484
+ const available = 5;
1485
+ if (user.hasAccess) {
1486
+ score += 1;
1487
+ }
1387
1488
  if ((location == null ? void 0 : location.workshopTitle) === ((_a = user.location) == null ? void 0 : _a.workshopTitle)) {
1388
1489
  score += 1;
1389
1490
  if (((_b = location == null ? void 0 : location.exercise) == null ? void 0 : _b.exerciseNumber) && location.exercise.exerciseNumber === ((_d = (_c = user.location) == null ? void 0 : _c.exercise) == null ? void 0 : _d.exerciseNumber)) {
@@ -1512,13 +1613,13 @@ const links = () => {
1512
1613
  { rel: "icon", type: "image/svg+xml", href: "/favicon.svg" }
1513
1614
  ];
1514
1615
  };
1515
- const meta$5 = ({ data }) => {
1516
- if (!data) return [];
1616
+ const meta$5 = ({ data: data2 }) => {
1617
+ if (!data2) return [];
1517
1618
  return getSeoMetaTags({
1518
- instructor: data.instructor,
1519
- title: data.workshopTitle,
1520
- description: data.workshopSubtitle,
1521
- requestInfo: data.requestInfo
1619
+ instructor: data2.instructor,
1620
+ title: data2.workshopTitle,
1621
+ description: data2.workshopSubtitle,
1622
+ requestInfo: data2.requestInfo
1522
1623
  });
1523
1624
  };
1524
1625
  async function loader$y({ request }) {
@@ -1555,7 +1656,7 @@ async function loader$y({ request }) {
1555
1656
  request,
1556
1657
  timings
1557
1658
  });
1558
- return json$1(
1659
+ return unstable_data$1(
1559
1660
  {
1560
1661
  ...asyncStuff,
1561
1662
  workshopConfig,
@@ -1628,7 +1729,7 @@ function Document({
1628
1729
  ] });
1629
1730
  }
1630
1731
  function App$1() {
1631
- const data = useLoaderData();
1732
+ const data2 = useLoaderData();
1632
1733
  const navigation = useNavigation();
1633
1734
  const showSpinner = useSpinDelay(navigation.state !== "idle", {
1634
1735
  delay: 400,
@@ -1645,11 +1746,11 @@ function App$1() {
1645
1746
  { "cursor-progress": showSpinner },
1646
1747
  altDown ? "alt-down" : null
1647
1748
  ),
1648
- env: data.ENV,
1749
+ env: data2.ENV,
1649
1750
  children: [
1650
1751
  /* @__PURE__ */ jsx(Outlet, {}),
1651
- /* @__PURE__ */ jsx(Confetti, { id: data.confettiId }),
1652
- /* @__PURE__ */ jsx(EpicToaster, { toast: data.toast }),
1752
+ /* @__PURE__ */ jsx(Confetti, { id: data2.confettiId }),
1753
+ /* @__PURE__ */ jsx(EpicToaster, { toast: data2.toast }),
1653
1754
  /* @__PURE__ */ jsx(EpicProgress, {})
1654
1755
  ]
1655
1756
  }
@@ -1951,8 +2052,13 @@ function useUser() {
1951
2052
  return user;
1952
2053
  }
1953
2054
  function useOptionalDiscordMember() {
2055
+ var _a;
1954
2056
  const data = useRouteLoaderData("root");
1955
- return data == null ? void 0 : data.discordMember;
2057
+ return (data == null ? void 0 : data.discordMember) ?? (((_a = data == null ? void 0 : data.user) == null ? void 0 : _a.discordProfile) ? {
2058
+ id: data.user.discordProfile.user.id,
2059
+ displayName: data.user.discordProfile.user.global_name,
2060
+ avatarUrl: data.user.imageUrlLarge
2061
+ } : null);
1956
2062
  }
1957
2063
  function useUserHasAccess() {
1958
2064
  const data = useRouteLoaderData("root");
@@ -2114,7 +2220,7 @@ async function action$a({ request }) {
2114
2220
  return otherAreFinished ? `You completed exercise ${exerciseNumber}!` : null;
2115
2221
  }
2116
2222
  const announcement = getCompletionAnnouncement();
2117
- return jsonWithPE(formData, result, {
2223
+ return dataWithPE(formData, result, {
2118
2224
  headers: combineHeaders(
2119
2225
  announcement ? createConfettiHeaders() : null,
2120
2226
  announcement ? await createToastHeaders({
@@ -2268,7 +2374,7 @@ async function loader$w({ request }) {
2268
2374
  (_a = extractNumbersAndTypeFromAppNameOrPath(playgroundAppName ?? "")) == null ? void 0 : _a.exerciseNumber
2269
2375
  )
2270
2376
  };
2271
- const result = json$1(
2377
+ const result = unstable_data$1(
2272
2378
  {
2273
2379
  workshopTitle,
2274
2380
  exercises: exercises.map((e) => ({
@@ -2362,8 +2468,17 @@ function FacePile({ isMenuOpened }) {
2362
2468
  var _a, _b;
2363
2469
  const scoreClassNames = getScoreClassNames(score);
2364
2470
  const locationLabel = getLocationLabel(user.location);
2471
+ const imageUrl = user.imageUrlSmall || user.avatarUrl;
2472
+ const hasAccess = user.hasAccess;
2473
+ const local = (_b = (_a = user.location) == null ? void 0 : _a.origin) == null ? void 0 : _b.includes("localhost");
2474
+ let doingLabel;
2475
+ if (hasAccess) {
2476
+ doingLabel = local ? "working" : "referencing";
2477
+ } else {
2478
+ doingLabel = local ? "previewing" : "reviewing";
2479
+ }
2365
2480
  return /* @__PURE__ */ jsxs(Tooltip, { children: [
2366
- /* @__PURE__ */ jsx(TooltipTrigger, { asChild: true, children: user.avatarUrl ? /* @__PURE__ */ jsx(
2481
+ /* @__PURE__ */ jsx(TooltipTrigger, { asChild: true, children: imageUrl ? /* @__PURE__ */ jsx(
2367
2482
  "img",
2368
2483
  {
2369
2484
  tabIndex: 0,
@@ -2372,7 +2487,7 @@ function FacePile({ isMenuOpened }) {
2372
2487
  "h-8 w-8 rounded-full border object-cover",
2373
2488
  scoreClassNames
2374
2489
  ),
2375
- src: user.avatarUrl
2490
+ src: imageUrl
2376
2491
  }
2377
2492
  ) : /* @__PURE__ */ jsx(
2378
2493
  "div",
@@ -2390,7 +2505,7 @@ function FacePile({ isMenuOpened }) {
2390
2505
  /* @__PURE__ */ jsxs("span", { children: [
2391
2506
  user.name || `${displayNameShort} Dev`,
2392
2507
  " ",
2393
- locationLabel ? ` is ${((_b = (_a = user.location) == null ? void 0 : _a.origin) == null ? void 0 : _b.includes("localhost")) ? "working" : "learning"} ${score === 1 && (loggedInUser == null ? void 0 : loggedInUser.id) !== user.id ? "with you" : ""} on` : null
2508
+ locationLabel ? ` is ${doingLabel} ${score === 1 && (loggedInUser == null ? void 0 : loggedInUser.id) !== user.id ? "with you" : ""} on` : null
2394
2509
  ] }),
2395
2510
  (locationLabel == null ? void 0 : locationLabel.line1) ? /* @__PURE__ */ jsx("span", { children: locationLabel.line1 }) : null,
2396
2511
  (locationLabel == null ? void 0 : locationLabel.line2) ? /* @__PURE__ */ jsx("span", { children: locationLabel.line2 }) : null
@@ -2653,7 +2768,7 @@ function MobileNavigation({
2653
2768
  isMenuOpened,
2654
2769
  onMenuOpenChange: setMenuOpened
2655
2770
  }) {
2656
- const data = useLoaderData();
2771
+ const data2 = useLoaderData();
2657
2772
  const user = useOptionalUser();
2658
2773
  const nextExerciseRoute = useNextExerciseRoute();
2659
2774
  const params = useParams();
@@ -2682,7 +2797,7 @@ function MobileNavigation({
2682
2797
  /* @__PURE__ */ jsx(
2683
2798
  NavToggle,
2684
2799
  {
2685
- title: data.workshopTitle,
2800
+ title: data2.workshopTitle,
2686
2801
  isMenuOpened,
2687
2802
  setMenuOpened
2688
2803
  }
@@ -2715,9 +2830,9 @@ function MobileNavigation({
2715
2830
  children: "Home"
2716
2831
  }
2717
2832
  ) }),
2718
- data.exercises.map(({ exerciseNumber, title, steps }) => {
2833
+ data2.exercises.map(({ exerciseNumber, title, steps }) => {
2719
2834
  const isActive = Number(params.exerciseNumber) === exerciseNumber;
2720
- const showPlayground = !isActive && data.playground.exerciseNumber === exerciseNumber;
2835
+ const showPlayground = !isActive && data2.playground.exerciseNumber === exerciseNumber;
2721
2836
  const exerciseNum = exerciseNumber.toString().padStart(2, "0");
2722
2837
  return /* @__PURE__ */ jsxs(
2723
2838
  NavigationExerciseListItem,
@@ -2773,7 +2888,7 @@ function MobileNavigation({
2773
2888
  steps.filter(Boolean).map(({ name, stepNumber, title: title2 }) => {
2774
2889
  const isActive2 = Number(params.stepNumber) === stepNumber;
2775
2890
  const step = stepNumber.toString().padStart(2, "0");
2776
- const isPlayground = name === data.playground.appName;
2891
+ const isPlayground = name === data2.playground.appName;
2777
2892
  return /* @__PURE__ */ jsx(
2778
2893
  NavigationExerciseStepListItem,
2779
2894
  {
@@ -2873,11 +2988,11 @@ function MobileNavigation({
2873
2988
  ),
2874
2989
  to: "/account",
2875
2990
  children: [
2876
- user.avatarUrl ? /* @__PURE__ */ jsx(
2991
+ user.imageUrlSmall ? /* @__PURE__ */ jsx(
2877
2992
  "img",
2878
2993
  {
2879
2994
  alt: user.name ?? user.email,
2880
- src: user.avatarUrl,
2995
+ src: user.imageUrlSmall,
2881
2996
  className: "h-full rounded-full"
2882
2997
  }
2883
2998
  ) : /* @__PURE__ */ jsx(Icon, { name: "User", className: "flex-shrink-0", size: "lg" }),
@@ -2944,12 +3059,12 @@ function Navigation({
2944
3059
  isMenuOpened,
2945
3060
  onMenuOpenChange: setMenuOpened
2946
3061
  }) {
2947
- const data = useLoaderData();
3062
+ const data2 = useLoaderData();
2948
3063
  const user = useOptionalUser();
2949
3064
  const nextExerciseRoute = useNextExerciseRoute();
2950
3065
  const params = useParams();
2951
3066
  const { users } = usePresence();
2952
- const exercise = data.exercises.find(
3067
+ const exercise = data2.exercises.find(
2953
3068
  (e) => e.exerciseNumber === Number(params.exerciseNumber)
2954
3069
  );
2955
3070
  const app = params.type === "solution" ? exercise == null ? void 0 : exercise.solutions.find(
@@ -2986,7 +3101,7 @@ function Navigation({
2986
3101
  /* @__PURE__ */ jsx(
2987
3102
  NavToggle,
2988
3103
  {
2989
- title: data.workshopTitle,
3104
+ title: data2.workshopTitle,
2990
3105
  menuControls,
2991
3106
  isMenuOpened,
2992
3107
  setMenuOpened
@@ -3021,9 +3136,9 @@ function Navigation({
3021
3136
  children: "Home"
3022
3137
  }
3023
3138
  ) }),
3024
- data.exercises.map(({ exerciseNumber, title, steps }) => {
3139
+ data2.exercises.map(({ exerciseNumber, title, steps }) => {
3025
3140
  const isActive = Number(params.exerciseNumber) === exerciseNumber;
3026
- const showPlayground = !isActive && data.playground.exerciseNumber === exerciseNumber;
3141
+ const showPlayground = !isActive && data2.playground.exerciseNumber === exerciseNumber;
3027
3142
  const exerciseNum = exerciseNumber.toString().padStart(2, "0");
3028
3143
  return /* @__PURE__ */ jsxs(
3029
3144
  NavigationExerciseListItem,
@@ -3079,7 +3194,7 @@ function Navigation({
3079
3194
  steps.filter(Boolean).map(({ name, stepNumber, title: title2 }) => {
3080
3195
  const isActive2 = Number(params.stepNumber) === stepNumber;
3081
3196
  const step = stepNumber.toString().padStart(2, "0");
3082
- const isPlayground = name === data.playground.appName;
3197
+ const isPlayground = name === data2.playground.appName;
3083
3198
  return /* @__PURE__ */ jsx(
3084
3199
  NavigationExerciseStepListItem,
3085
3200
  {
@@ -3180,11 +3295,11 @@ function Navigation({
3180
3295
  className: "flex h-14 w-full flex-shrink-0 items-center justify-start space-x-3 border-t px-4 py-4 text-center no-underline hover:underline",
3181
3296
  to: "/account",
3182
3297
  children: [
3183
- user.avatarUrl ? /* @__PURE__ */ jsx(
3298
+ user.imageUrlSmall ? /* @__PURE__ */ jsx(
3184
3299
  "img",
3185
3300
  {
3186
3301
  alt: user.name ?? user.email,
3187
- src: user.avatarUrl,
3302
+ src: user.imageUrlSmall,
3188
3303
  className: "h-full rounded-full"
3189
3304
  }
3190
3305
  ) : /* @__PURE__ */ jsx(Icon, { name: "User", className: "flex-shrink-0", size: "lg" }),
@@ -3487,7 +3602,7 @@ const handle$7 = {
3487
3602
  async function loader$u({ request }) {
3488
3603
  ensureUndeployed();
3489
3604
  await requireAuthInfo({ request });
3490
- return json$1({ discordAuthUrl: getDiscordAuthURL() });
3605
+ return { discordAuthUrl: getDiscordAuthURL() };
3491
3606
  }
3492
3607
  async function action$9({ request }) {
3493
3608
  ensureUndeployed();
@@ -3526,23 +3641,31 @@ function Account() {
3526
3641
  const discordMember = useOptionalDiscordMember();
3527
3642
  const presencePreferences = usePresencePreferences();
3528
3643
  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: [
3529
- /* @__PURE__ */ jsx(
3644
+ user.imageUrlLarge ? /* @__PURE__ */ jsx(
3530
3645
  "img",
3531
3646
  {
3532
3647
  className: "h-36 w-36 rounded-full",
3533
3648
  alt: (discordMember == null ? void 0 : discordMember.displayName) ?? user.name ?? user.email,
3534
- src: user.avatarUrl
3649
+ src: user.imageUrlLarge
3535
3650
  }
3536
- ),
3651
+ ) : /* @__PURE__ */ jsx(Icon, { name: "User", className: "flex-shrink-0", size: "lg" }),
3537
3652
  /* @__PURE__ */ jsx("h1", { className: "mb-1 text-2xl", children: "Your Account" }),
3538
3653
  /* @__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}.` }),
3539
3654
  discordMember ? /* @__PURE__ */ jsxs(Fragment, { children: [
3540
3655
  /* @__PURE__ */ jsxs("p", { className: "text-center text-gray-700 dark:text-gray-300", children: [
3541
- "And you are connected to discord as ",
3542
- discordMember.displayName,
3543
- " (",
3544
- discordMember.id,
3545
- ")."
3656
+ "And you are connected to discord as",
3657
+ " ",
3658
+ /* @__PURE__ */ jsx(
3659
+ "a",
3660
+ {
3661
+ href: `https://discord.com/users/${discordMember.id}`,
3662
+ target: "_blank",
3663
+ rel: "noopener noreferrer",
3664
+ className: "underline",
3665
+ children: discordMember.displayName
3666
+ }
3667
+ ),
3668
+ "."
3546
3669
  ] }),
3547
3670
  /* @__PURE__ */ jsxs("div", { className: "flex justify-center gap-2", children: [
3548
3671
  /* @__PURE__ */ jsx(disconnectFetcher.Form, { method: "post", children: /* @__PURE__ */ jsx(Button, { varient: "mono", name: "intent", value: "disconnect-discord", children: "Disconnect Discord" }) }),
@@ -4181,7 +4304,7 @@ const handle$6 = {
4181
4304
  getSitemapEntries: () => null
4182
4305
  };
4183
4306
  async function loader$o() {
4184
- return json$1({ discordAuthUrl: getDiscordAuthURL() });
4307
+ return { discordAuthUrl: getDiscordAuthURL() };
4185
4308
  }
4186
4309
  function useDiscordCTALink({
4187
4310
  discordAuthUrl
@@ -4315,13 +4438,13 @@ const route12 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePrope
4315
4438
  const PlaybackTimeSchema = z.object({
4316
4439
  time: z.number(),
4317
4440
  expiresAt: z.string()
4318
- }).transform((data) => {
4319
- return { time: Number(data.time), expiresAt: new Date(data.expiresAt) };
4441
+ }).transform((data2) => {
4442
+ return { time: Number(data2.time), expiresAt: new Date(data2.expiresAt) };
4320
4443
  });
4321
4444
  function usePlayerPreferences() {
4322
4445
  var _a;
4323
- const data = useRouteLoaderData("root");
4324
- return ((_a = data == null ? void 0 : data.preferences) == null ? void 0 : _a.player) ?? null;
4446
+ const data2 = useRouteLoaderData("root");
4447
+ return ((_a = data2 == null ? void 0 : data2.preferences) == null ? void 0 : _a.player) ?? null;
4325
4448
  }
4326
4449
  const ignoredInputs = [
4327
4450
  "INPUT",
@@ -4345,12 +4468,12 @@ function shouldIgnoreHotkey(el) {
4345
4468
  async function action$7({ request }) {
4346
4469
  const result = PlayerPreferencesSchema.safeParse(await request.json());
4347
4470
  if (!result.success) {
4348
- return json$1({ status: "error", error: result.error.flatten() }, {
4471
+ return unstable_data$1({ status: "error", error: result.error.flatten() }, {
4349
4472
  status: 400
4350
4473
  });
4351
4474
  }
4352
4475
  await setPlayerPreferences(result.data);
4353
- return json$1({ status: "success" });
4476
+ return { status: "success" };
4354
4477
  }
4355
4478
  function useLatest(value) {
4356
4479
  const ref = React.useRef(value);
@@ -5443,13 +5566,13 @@ async function action$6({ request }) {
5443
5566
  results.push(await launchEditor(file.filepath, file.line, file.column));
5444
5567
  }
5445
5568
  if (results.every((r) => r.status === "success")) {
5446
- return jsonWithPE(formData, { status: "success" });
5569
+ return dataWithPE(formData, { status: "success" });
5447
5570
  } else {
5448
5571
  const messages = results.map(
5449
5572
  (r, index, array) => r.status === "error" ? array.length > 1 ? `${index}. ${r.message}` : r.message : null
5450
5573
  ).filter(Boolean).join("\n");
5451
5574
  console.error("Launch editor error:", messages);
5452
- return jsonWithPE(
5575
+ return dataWithPE(
5453
5576
  formData,
5454
5577
  { status: "error", message: messages },
5455
5578
  {
@@ -5791,17 +5914,17 @@ function Mdx({
5791
5914
  return /* @__PURE__ */ jsx(Component, { components });
5792
5915
  }
5793
5916
  const meta$4 = ({
5794
- data,
5917
+ data: data2,
5795
5918
  matches
5796
5919
  }) => {
5797
5920
  var _a;
5798
- const number = data == null ? void 0 : data.exercise.exerciseNumber.toString().padStart(2, "0");
5921
+ const number = data2 == null ? void 0 : data2.exercise.exerciseNumber.toString().padStart(2, "0");
5799
5922
  const rootData = (_a = matches.find((m) => m.id === "root")) == null ? void 0 : _a.data;
5800
- if (!data || !rootData) return [{ title: "🦉 | Error" }];
5923
+ if (!data2 || !rootData) return [{ title: "🦉 | Error" }];
5801
5924
  return getSeoMetaTags({
5802
- title: `📝 | ${number}. ${data.exercise.title} | ${rootData == null ? void 0 : rootData.workshopTitle}`,
5803
- description: `Introduction for ${number}. ${data.exercise.title}`,
5804
- ogTitle: data.exercise.title,
5925
+ title: `📝 | ${number}. ${data2.exercise.title} | ${rootData == null ? void 0 : rootData.workshopTitle}`,
5926
+ description: `Introduction for ${number}. ${data2.exercise.title}`,
5927
+ ogTitle: data2.exercise.title,
5805
5928
  ogDescription: `Introduction for exercise ${Number(number)}`,
5806
5929
  instructor: rootData.instructor,
5807
5930
  requestInfo: rootData.requestInfo
@@ -5830,7 +5953,7 @@ async function loader$n({ request, params }) {
5830
5953
  );
5831
5954
  const firstStep = exercise.steps.find(Boolean);
5832
5955
  const articleId = `workshop-${slugify(workshopTitle)}-${exercise.exerciseNumber}-instructions`;
5833
- return defer(
5956
+ return unstable_data$1(
5834
5957
  {
5835
5958
  articleId,
5836
5959
  exercise,
@@ -5865,11 +5988,11 @@ const headers$9 = ({ loaderHeaders, parentHeaders }) => {
5865
5988
  const mdxComponents$4 = { h1: () => null };
5866
5989
  function ExerciseNumberRoute() {
5867
5990
  var _a;
5868
- const data = useLoaderData();
5991
+ const data2 = useLoaderData();
5869
5992
  useRevalidationWS({
5870
- watchPaths: [data.exerciseReadme.file]
5993
+ watchPaths: [data2.exerciseReadme.file]
5871
5994
  });
5872
- const firstStepNumber = String(((_a = data.firstStep) == null ? void 0 : _a.stepNumber) ?? "01").padStart(
5995
+ const firstStepNumber = String(((_a = data2.firstStep) == null ? void 0 : _a.stepNumber) ?? "01").padStart(
5873
5996
  2,
5874
5997
  "0"
5875
5998
  );
@@ -5877,18 +6000,18 @@ function ExerciseNumberRoute() {
5877
6000
  /* @__PURE__ */ jsxs(
5878
6001
  "article",
5879
6002
  {
5880
- id: data.articleId,
6003
+ id: data2.articleId,
5881
6004
  className: "shadow-on-scrollbox flex w-full flex-1 flex-col gap-12 overflow-y-scroll px-3 py-4 pt-6 scrollbar-thin scrollbar-thumb-scrollbar md:px-10 md:py-12 md:pt-16",
5882
6005
  children: [
5883
- /* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsx("h1", { className: "text-[clamp(3rem,6vw,7.5rem)] font-extrabold leading-none", children: data.exercise.title }) }),
5884
- /* @__PURE__ */ jsx("div", { children: data.exercise.instructionsCode ? /* @__PURE__ */ jsx(
6006
+ /* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsx("h1", { className: "text-[clamp(3rem,6vw,7.5rem)] font-extrabold leading-none", children: data2.exercise.title }) }),
6007
+ /* @__PURE__ */ jsx("div", { children: data2.exercise.instructionsCode ? /* @__PURE__ */ jsx(
5885
6008
  EpicVideoInfoProvider,
5886
6009
  {
5887
- epicVideoInfosPromise: data.epicVideoInfosPromise,
6010
+ epicVideoInfosPromise: data2.epicVideoInfosPromise,
5888
6011
  children: /* @__PURE__ */ jsx("div", { className: "prose dark:prose-invert sm:prose-lg", children: /* @__PURE__ */ jsx(
5889
6012
  Mdx,
5890
6013
  {
5891
- code: data.exercise.instructionsCode,
6014
+ code: data2.exercise.instructionsCode,
5892
6015
  components: mdxComponents$4
5893
6016
  }
5894
6017
  ) })
@@ -5896,20 +6019,20 @@ function ExerciseNumberRoute() {
5896
6019
  ) : "No instructions yet..." })
5897
6020
  ]
5898
6021
  },
5899
- data.articleId
6022
+ data2.articleId
5900
6023
  ),
5901
6024
  /* @__PURE__ */ jsx(
5902
6025
  ElementScrollRestoration,
5903
6026
  {
5904
- elementQuery: `#${data.articleId}`
6027
+ elementQuery: `#${data2.articleId}`
5905
6028
  },
5906
- `scroll-${data.articleId}`
6029
+ `scroll-${data2.articleId}`
5907
6030
  ),
5908
6031
  /* @__PURE__ */ jsx(
5909
6032
  ProgressToggle,
5910
6033
  {
5911
6034
  type: "instructions",
5912
- exerciseNumber: data.exerciseNumber,
6035
+ exerciseNumber: data2.exerciseNumber,
5913
6036
  className: "h-14 border-t px-6"
5914
6037
  }
5915
6038
  ),
@@ -5918,14 +6041,14 @@ function ExerciseNumberRoute() {
5918
6041
  /* @__PURE__ */ jsx(
5919
6042
  EditFileOnGitHub,
5920
6043
  {
5921
- file: data.exerciseReadme.file,
5922
- relativePath: data.exerciseReadme.relativePath
6044
+ file: data2.exerciseReadme.file,
6045
+ relativePath: data2.exerciseReadme.relativePath
5923
6046
  }
5924
6047
  ),
5925
6048
  /* @__PURE__ */ jsx(
5926
6049
  Link,
5927
6050
  {
5928
- to: `${firstStepNumber}/${data.firstType}`,
6051
+ to: `${firstStepNumber}/${data2.firstType}`,
5929
6052
  prefetch: "intent",
5930
6053
  className: "flex h-full items-center justify-center bg-foreground px-7 text-background",
5931
6054
  children: "Start Learning"
@@ -5964,7 +6087,7 @@ async function loader$m({ request, params }) {
5964
6087
  if (!exercise) {
5965
6088
  throw new Response("Not found", { status: 404 });
5966
6089
  }
5967
- const result = json$1(
6090
+ const result = unstable_data$1(
5968
6091
  {
5969
6092
  exerciseNumber: exercise.exerciseNumber,
5970
6093
  exerciseTitle: exercise.title,
@@ -6229,8 +6352,8 @@ async function prepareForDiff(app1, app2) {
6229
6352
  const { name: name2, ...rest2 } = pkg2;
6230
6353
  return JSON.stringify(rest1) === JSON.stringify(rest2);
6231
6354
  };
6232
- const app1PkgJson = app1.dev.type === "script" ? await fsExtra.readJSON(path$1.join(app1.fullPath, "package.json")) : {};
6233
- const app2PkgJson = app1.dev.type === "script" ? await fsExtra.readJSON(path$1.join(app2.fullPath, "package.json")) : {};
6355
+ const app1PkgJson = app1.dev.type === "script" ? await fsExtra.readJSON(path$1.join(app1.fullPath, "package.json")).catch(() => ({})) : {};
6356
+ const app2PkgJson = app1.dev.type === "script" ? await fsExtra.readJSON(path$1.join(app2.fullPath, "package.json")).catch(() => ({})) : {};
6234
6357
  const pkgJsonIgnore = comparePkgJson(app1PkgJson, app2PkgJson) ? ["package.json"] : [];
6235
6358
  const workshopIgnore = [
6236
6359
  ...await getDiffIgnore(path$1.join(workshopRoot, ".gitignore")),
@@ -6468,7 +6591,7 @@ async function action$5({ request }) {
6468
6591
  };
6469
6592
  const result = SetPlaygroundSchema.safeParse(rawData);
6470
6593
  if (!result.success) {
6471
- return jsonWithPE(
6594
+ return dataWithPE(
6472
6595
  formData,
6473
6596
  { status: "error", error: result.error.message },
6474
6597
  { status: 400 }
@@ -6477,7 +6600,7 @@ async function action$5({ request }) {
6477
6600
  const form = result.data;
6478
6601
  const app = await getAppByName(form.appName);
6479
6602
  if (!app) {
6480
- return jsonWithPE(
6603
+ return dataWithPE(
6481
6604
  formData,
6482
6605
  { status: "error", error: `App ${form.appName} not found` },
6483
6606
  { status: 404 }
@@ -6489,7 +6612,7 @@ async function action$5({ request }) {
6489
6612
  } catch (error) {
6490
6613
  const message = getErrorMessage(error);
6491
6614
  console.error("Error setting playground", message);
6492
- return json$1({ status: "error", error: message }, {
6615
+ return unstable_data$1({ status: "error", error: message }, {
6493
6616
  status: 500,
6494
6617
  headers: await createToastHeaders({
6495
6618
  type: "error",
@@ -6503,7 +6626,7 @@ async function action$5({ request }) {
6503
6626
  if (playground && converseApp) {
6504
6627
  void getDiffCode(playground, converseApp, { forceFresh: true });
6505
6628
  }
6506
- return jsonWithPE(formData, { status: "success" });
6629
+ return dataWithPE(formData, { status: "success" });
6507
6630
  }
6508
6631
  function SetPlayground({
6509
6632
  appName,
@@ -6588,14 +6711,14 @@ function PlaygroundChooser({
6588
6711
  align: "start",
6589
6712
  className: "z-20 max-h-[50vh] bg-black text-white lg:max-h-[70vh]",
6590
6713
  children: [
6591
- /* @__PURE__ */ jsx(Select.ScrollUpButton, { className: "flex h-5 cursor-default items-center justify-center ", children: /* @__PURE__ */ jsx(Icon, { name: "ChevronUp" }) }),
6714
+ /* @__PURE__ */ jsx(Select.ScrollUpButton, { className: "flex h-5 cursor-default items-center justify-center", children: /* @__PURE__ */ jsx(Icon, { name: "ChevronUp" }) }),
6592
6715
  /* @__PURE__ */ jsx(Select.Viewport, { className: "p-3", children: /* @__PURE__ */ jsxs(Select.Group, { children: [
6593
6716
  /* @__PURE__ */ jsx(Select.Label, { className: "px-5 pb-3 font-mono uppercase", children: "App" }),
6594
6717
  allApps.filter((app) => app.name !== "playground").map((app) => {
6595
6718
  return /* @__PURE__ */ jsx(SelectItem$1, { value: app.name, children: app.displayName }, app.name);
6596
6719
  })
6597
6720
  ] }) }),
6598
- /* @__PURE__ */ jsx(Select.ScrollDownButton, { className: "flex h-5 cursor-default items-center justify-center ", children: /* @__PURE__ */ jsx(Icon, { name: "ChevronDown" }) })
6721
+ /* @__PURE__ */ jsx(Select.ScrollDownButton, { className: "flex h-5 cursor-default items-center justify-center", children: /* @__PURE__ */ jsx(Icon, { name: "ChevronDown" }) })
6599
6722
  ]
6600
6723
  }
6601
6724
  ) })
@@ -6943,34 +7066,34 @@ function TouchedFiles({
6943
7066
  ) })
6944
7067
  ] }) });
6945
7068
  }
6946
- function pageTitle(data, workshopTitle) {
7069
+ function pageTitle(data2, workshopTitle) {
6947
7070
  var _a;
6948
- const exerciseNumber = (data == null ? void 0 : data.exerciseStepApp.exerciseNumber.toString().padStart(2, "0")) ?? "00";
6949
- const stepNumber = (data == null ? void 0 : data.exerciseStepApp.stepNumber.toString().padStart(2, "0")) ?? "00";
7071
+ const exerciseNumber = (data2 == null ? void 0 : data2.exerciseStepApp.exerciseNumber.toString().padStart(2, "0")) ?? "00";
7072
+ const stepNumber = (data2 == null ? void 0 : data2.exerciseStepApp.stepNumber.toString().padStart(2, "0")) ?? "00";
6950
7073
  const emoji = {
6951
7074
  problem: "💪",
6952
7075
  solution: "🏁"
6953
- }[(data == null ? void 0 : data.type) ?? "problem"];
6954
- const title = ((_a = data == null ? void 0 : data[data.type]) == null ? void 0 : _a.title) ?? "N/A";
7076
+ }[(data2 == null ? void 0 : data2.type) ?? "problem"];
7077
+ const title = ((_a = data2 == null ? void 0 : data2[data2.type]) == null ? void 0 : _a.title) ?? "N/A";
6955
7078
  return {
6956
7079
  emoji,
6957
7080
  stepNumber,
6958
7081
  title,
6959
7082
  exerciseNumber,
6960
- exerciseTitle: (data == null ? void 0 : data.exerciseTitle) ?? "Unknown exercise",
7083
+ exerciseTitle: (data2 == null ? void 0 : data2.exerciseTitle) ?? "Unknown exercise",
6961
7084
  workshopTitle,
6962
- type: (data == null ? void 0 : data.type) ?? "problem"
7085
+ type: (data2 == null ? void 0 : data2.type) ?? "problem"
6963
7086
  };
6964
7087
  }
6965
7088
  const meta$3 = ({
6966
- data,
7089
+ data: data2,
6967
7090
  matches,
6968
7091
  params
6969
7092
  }) => {
6970
7093
  var _a;
6971
7094
  const rootData = (_a = matches.find((m) => m.id === "root")) == null ? void 0 : _a.data;
6972
- if (!data || !rootData) return [{ title: "🦉 | Error" }];
6973
- const { emoji, stepNumber, title, exerciseNumber, exerciseTitle } = pageTitle(data);
7095
+ if (!data2 || !rootData) return [{ title: "🦉 | Error" }];
7096
+ const { emoji, stepNumber, title, exerciseNumber, exerciseTitle } = pageTitle(data2);
6974
7097
  return getSeoMetaTags({
6975
7098
  title: `${emoji} | ${stepNumber}. ${title} | ${exerciseNumber}. ${exerciseTitle} | ${rootData.workshopTitle}`,
6976
7099
  description: `${params.type} step for exercise ${exerciseNumber}. ${exerciseTitle}`,
@@ -7048,7 +7171,7 @@ async function loader$l({ request, params }) {
7048
7171
  const subroute = url.pathname.split(
7049
7172
  `/exercise/${params.exerciseNumber}/${params.stepNumber}/${params.type}/`
7050
7173
  )[1];
7051
- return defer(
7174
+ return unstable_data$1(
7052
7175
  {
7053
7176
  articleId,
7054
7177
  type: params.type,
@@ -7117,11 +7240,11 @@ const headers$7 = ({ loaderHeaders, parentHeaders }) => {
7117
7240
  };
7118
7241
  function ExercisePartRoute$1() {
7119
7242
  var _a;
7120
- const data = useLoaderData();
7243
+ const data2 = useLoaderData();
7121
7244
  const inBrowserBrowserRef = useRef(null);
7122
- const titleBits = pageTitle(data);
7245
+ const titleBits = pageTitle(data2);
7123
7246
  useRevalidationWS({
7124
- watchPaths: [`${data.exerciseStepApp.relativePath}/README.mdx`]
7247
+ watchPaths: [`${data2.exerciseStepApp.relativePath}/README.mdx`]
7125
7248
  });
7126
7249
  return /* @__PURE__ */ jsx("div", { className: "flex max-w-full flex-grow flex-col", children: /* @__PURE__ */ jsxs("main", { className: "flex flex-grow flex-col sm:grid sm:h-full sm:min-h-[800px] sm:grid-cols-1 sm:grid-rows-2 md:min-h-[unset] lg:grid-cols-2 lg:grid-rows-1", children: [
7127
7250
  /* @__PURE__ */ jsxs("div", { className: "relative flex flex-col sm:col-span-1 sm:row-span-1 sm:h-full lg:border-r", children: [
@@ -7151,29 +7274,29 @@ function ExercisePartRoute$1() {
7151
7274
  ")"
7152
7275
  ] })
7153
7276
  ] }),
7154
- data.problem && ((_a = data.playground) == null ? void 0 : _a.appName) !== data.problem.name ? /* @__PURE__ */ jsx("div", { className: "hidden md:block", children: /* @__PURE__ */ jsx(SetAppToPlayground, { appName: data.problem.name }) }) : null
7277
+ data2.problem && ((_a = data2.playground) == null ? void 0 : _a.appName) !== data2.problem.name ? /* @__PURE__ */ jsx("div", { className: "hidden md:block", children: /* @__PURE__ */ jsx(SetAppToPlayground, { appName: data2.problem.name }) }) : null
7155
7278
  ] }) }),
7156
7279
  /* @__PURE__ */ jsxs(
7157
7280
  "article",
7158
7281
  {
7159
- id: data.articleId,
7282
+ id: data2.articleId,
7160
7283
  className: "shadow-on-scrollbox flex h-full w-full max-w-none flex-1 scroll-pt-6 flex-col justify-between space-y-6 overflow-y-auto p-2 scrollbar-thin scrollbar-thumb-scrollbar sm:p-10 sm:pt-8",
7161
7284
  children: [
7162
- data.exerciseStepApp.instructionsCode ? /* @__PURE__ */ jsx(StepMdx, { inBrowserBrowserRef }) : /* @__PURE__ */ jsx("div", { className: "flex h-full items-center justify-center text-lg", children: /* @__PURE__ */ jsx("p", { children: "No instructions yet..." }) }),
7285
+ data2.exerciseStepApp.instructionsCode ? /* @__PURE__ */ jsx(StepMdx, { inBrowserBrowserRef }) : /* @__PURE__ */ jsx("div", { className: "flex h-full items-center justify-center text-lg", children: /* @__PURE__ */ jsx("p", { children: "No instructions yet..." }) }),
7163
7286
  /* @__PURE__ */ jsxs("div", { className: "mt-auto flex justify-between", children: [
7164
- data.prevStepLink ? /* @__PURE__ */ jsx(
7287
+ data2.prevStepLink ? /* @__PURE__ */ jsx(
7165
7288
  Link,
7166
7289
  {
7167
- to: data.prevStepLink.to,
7290
+ to: data2.prevStepLink.to,
7168
7291
  "aria-label": "Previous Step",
7169
7292
  prefetch: "intent",
7170
7293
  children: "← Previous"
7171
7294
  }
7172
7295
  ) : /* @__PURE__ */ jsx("span", {}),
7173
- data.nextStepLink ? /* @__PURE__ */ jsx(
7296
+ data2.nextStepLink ? /* @__PURE__ */ jsx(
7174
7297
  Link,
7175
7298
  {
7176
- to: data.nextStepLink.to,
7299
+ to: data2.nextStepLink.to,
7177
7300
  "aria-label": "Next Step",
7178
7301
  prefetch: "intent",
7179
7302
  children: "Next →"
@@ -7182,42 +7305,42 @@ function ExercisePartRoute$1() {
7182
7305
  ] })
7183
7306
  ]
7184
7307
  },
7185
- data.articleId
7308
+ data2.articleId
7186
7309
  ),
7187
7310
  /* @__PURE__ */ jsx(
7188
7311
  ElementScrollRestoration,
7189
7312
  {
7190
- elementQuery: `#${data.articleId}`
7313
+ elementQuery: `#${data2.articleId}`
7191
7314
  },
7192
- `scroll-${data.articleId}`
7315
+ `scroll-${data2.articleId}`
7193
7316
  ),
7194
- data.type === "solution" ? /* @__PURE__ */ jsx(
7317
+ data2.type === "solution" ? /* @__PURE__ */ jsx(
7195
7318
  ProgressToggle,
7196
7319
  {
7197
7320
  type: "step",
7198
- exerciseNumber: data.exerciseStepApp.exerciseNumber,
7199
- stepNumber: data.exerciseStepApp.stepNumber,
7321
+ exerciseNumber: data2.exerciseStepApp.exerciseNumber,
7322
+ stepNumber: data2.exerciseStepApp.stepNumber,
7200
7323
  className: "h-14 border-t px-6"
7201
7324
  }
7202
7325
  ) : null,
7203
7326
  /* @__PURE__ */ jsxs("div", { className: "flex h-16 justify-between border-b-4 border-t lg:border-b-0", children: [
7204
- /* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsx("div", { className: "h-full", children: /* @__PURE__ */ jsx(TouchedFiles, { diffFilesPromise: data.diffFiles }) }) }),
7327
+ /* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsx("div", { className: "h-full", children: /* @__PURE__ */ jsx(TouchedFiles, { diffFilesPromise: data2.diffFiles }) }) }),
7205
7328
  /* @__PURE__ */ jsx(
7206
7329
  EditFileOnGitHub,
7207
7330
  {
7208
- appName: data.exerciseStepApp.name,
7209
- relativePath: data.exerciseStepApp.relativePath
7331
+ appName: data2.exerciseStepApp.name,
7332
+ relativePath: data2.exerciseStepApp.relativePath
7210
7333
  }
7211
7334
  ),
7212
7335
  /* @__PURE__ */ jsx(
7213
7336
  NavChevrons,
7214
7337
  {
7215
- prev: data.prevStepLink ? {
7216
- to: data.prevStepLink.to,
7338
+ prev: data2.prevStepLink ? {
7339
+ to: data2.prevStepLink.to,
7217
7340
  "aria-label": "Previous Step"
7218
7341
  } : null,
7219
- next: data.nextStepLink ? {
7220
- to: data.nextStepLink.to,
7342
+ next: data2.nextStepLink ? {
7343
+ to: data2.nextStepLink.to,
7221
7344
  "aria-label": "Next Step"
7222
7345
  } : null
7223
7346
  }
@@ -7269,10 +7392,10 @@ async function action$4({ request }) {
7269
7392
  const appRunningResult = await waitOnApp(app);
7270
7393
  if ((appRunningResult == null ? void 0 : appRunningResult.status) === "success") {
7271
7394
  await new Promise((resolve) => setTimeout(resolve, 200));
7272
- return jsonWithPE(formData, { status: "app-started" });
7395
+ return dataWithPE(formData, { status: "app-started" });
7273
7396
  } else if (app.dev.type === "script") {
7274
7397
  const errorMessage = appRunningResult ? appRunningResult.error : "Unknown error";
7275
- return json$1(
7398
+ return unstable_data$1(
7276
7399
  {
7277
7400
  status: "app-not-started",
7278
7401
  error: errorMessage,
@@ -7290,7 +7413,7 @@ async function action$4({ request }) {
7290
7413
  );
7291
7414
  }
7292
7415
  } else if (result.portNumber) {
7293
- return jsonWithPE(formData, {
7416
+ return dataWithPE(formData, {
7294
7417
  status: "app-not-started",
7295
7418
  error: result.status,
7296
7419
  port: result.portNumber
@@ -7305,7 +7428,7 @@ async function action$4({ request }) {
7305
7428
  async function stopApp() {
7306
7429
  invariant(app, "app must be defined");
7307
7430
  await closeProcess(app.name);
7308
- return jsonWithPE(formData, { status: "app-stopped" });
7431
+ return dataWithPE(formData, { status: "app-stopped" });
7309
7432
  }
7310
7433
  switch (intent) {
7311
7434
  case "start": {
@@ -7324,7 +7447,7 @@ async function action$4({ request }) {
7324
7447
  const port2 = formData.get("port");
7325
7448
  invariantResponse(typeof port2 === "string", "port is required");
7326
7449
  await stopPort(port2);
7327
- return jsonWithPE(formData, { status: "port-stopped" });
7450
+ return dataWithPE(formData, { status: "port-stopped" });
7328
7451
  }
7329
7452
  throw new Error(`Unknown intent: ${intent}`);
7330
7453
  }
@@ -7849,23 +7972,29 @@ async function loader$k({ request, params }) {
7849
7972
  const timings = makeTimings("exercise-step-test");
7850
7973
  const exerciseStepApp = await requireExerciseApp(params, { request, timings });
7851
7974
  const { isRunning, portIsAvailable } = await getAppRunningState(exerciseStepApp);
7852
- return json$1({
7853
- appInfo: {
7854
- isRunning,
7855
- name: exerciseStepApp.name,
7856
- title: exerciseStepApp.title,
7857
- portIsAvailable,
7858
- type: exerciseStepApp.type,
7859
- fullPath: exerciseStepApp.fullPath,
7860
- dev: exerciseStepApp.dev,
7861
- test: exerciseStepApp.test,
7862
- stackBlitzUrl: exerciseStepApp.stackBlitzUrl
7975
+ return unstable_data$1(
7976
+ {
7977
+ appInfo: {
7978
+ isRunning,
7979
+ name: exerciseStepApp.name,
7980
+ title: exerciseStepApp.title,
7981
+ portIsAvailable,
7982
+ type: exerciseStepApp.type,
7983
+ fullPath: exerciseStepApp.fullPath,
7984
+ dev: exerciseStepApp.dev,
7985
+ test: exerciseStepApp.test,
7986
+ stackBlitzUrl: exerciseStepApp.stackBlitzUrl
7987
+ }
7988
+ },
7989
+ {
7990
+ headers: {
7991
+ "Server-Timing": timings.toString()
7992
+ }
7863
7993
  }
7864
- });
7994
+ );
7865
7995
  }
7866
7996
  const headers$6 = ({ loaderHeaders, parentHeaders }) => {
7867
7997
  const headers2 = {
7868
- "Cache-Control": loaderHeaders.get("Cache-Control") ?? "",
7869
7998
  "Server-Timing": combineServerTimings(loaderHeaders, parentHeaders)
7870
7999
  };
7871
8000
  return headers2;
@@ -8761,15 +8890,15 @@ async function loader$j({ request }) {
8761
8890
  const url = new URL(request.url);
8762
8891
  const name = url.searchParams.get("name");
8763
8892
  if (!name) {
8764
- return json$1({ error: "Missing name" }, { status: 400 });
8893
+ return unstable_data$1({ error: "Missing name" }, { status: 400 });
8765
8894
  }
8766
8895
  const app = await getAppByName(name);
8767
8896
  if (!app) {
8768
- return json$1({ error: "App not found" }, { status: 404 });
8897
+ return unstable_data$1({ error: "App not found" }, { status: 404 });
8769
8898
  }
8770
8899
  const processEntry = getTestProcessEntry(app);
8771
8900
  if (!processEntry) {
8772
- return json$1({ error: "App is not running tests" }, { status: 404 });
8901
+ return unstable_data$1({ error: "App is not running tests" }, { status: 404 });
8773
8902
  }
8774
8903
  return eventStream(request.signal, function setup(send) {
8775
8904
  var _a, _b;
@@ -8799,17 +8928,17 @@ async function loader$j({ request }) {
8799
8928
  return () => {
8800
8929
  };
8801
8930
  }
8802
- function handleStdOutData(data) {
8931
+ function handleStdOutData(data2) {
8803
8932
  sendEvent({
8804
8933
  type: "stdout",
8805
- data: data.toString("utf-8"),
8934
+ data: data2.toString("utf-8"),
8806
8935
  timestamp: Date.now()
8807
8936
  });
8808
8937
  }
8809
- function handleStdErrData(data) {
8938
+ function handleStdErrData(data2) {
8810
8939
  sendEvent({
8811
8940
  type: "stderr",
8812
- data: data.toString("utf-8"),
8941
+ data: data2.toString("utf-8"),
8813
8942
  timestamp: Date.now()
8814
8943
  });
8815
8944
  }
@@ -8840,7 +8969,7 @@ async function action$3({ request }) {
8840
8969
  request
8841
8970
  });
8842
8971
  if (!userHasAccess) {
8843
- return jsonWithPE(
8972
+ return dataWithPE(
8844
8973
  formData,
8845
8974
  {
8846
8975
  success: false,
@@ -8860,7 +8989,7 @@ async function action$3({ request }) {
8860
8989
  name: formData.get("name")
8861
8990
  });
8862
8991
  if (!result.success) {
8863
- return jsonWithPE(
8992
+ return dataWithPE(
8864
8993
  formData,
8865
8994
  { success: false, error: result.error.flatten() },
8866
8995
  { status: 400 }
@@ -8868,7 +8997,7 @@ async function action$3({ request }) {
8868
8997
  }
8869
8998
  const app = await getAppByName(result.data.name);
8870
8999
  if (!app) {
8871
- return jsonWithPE(
9000
+ return dataWithPE(
8872
9001
  formData,
8873
9002
  { success: false, error: "App not found" },
8874
9003
  { status: 404 }
@@ -8877,18 +9006,18 @@ async function action$3({ request }) {
8877
9006
  switch (result.data.intent) {
8878
9007
  case "run": {
8879
9008
  void runAppTests(app);
8880
- return jsonWithPE(formData, { success: true });
9009
+ return dataWithPE(formData, { success: true });
8881
9010
  }
8882
9011
  case "stop": {
8883
9012
  const processEntry = getTestProcessEntry(app);
8884
9013
  if (processEntry) {
8885
9014
  (_a = processEntry.process) == null ? void 0 : _a.kill();
8886
9015
  }
8887
- return jsonWithPE(formData, { success: true });
9016
+ return dataWithPE(formData, { success: true });
8888
9017
  }
8889
9018
  case "clear": {
8890
9019
  clearTestProcessEntry(app);
8891
- return jsonWithPE(formData, { success: true });
9020
+ return dataWithPE(formData, { success: true });
8892
9021
  }
8893
9022
  }
8894
9023
  }
@@ -9268,7 +9397,7 @@ async function loader$i({ request, params }) {
9268
9397
  diffCode
9269
9398
  };
9270
9399
  }
9271
- return defer(
9400
+ return unstable_data$1(
9272
9401
  {
9273
9402
  type: params.type,
9274
9403
  exerciseStepApp,
@@ -9343,7 +9472,7 @@ function withParam(searchParams, key, value) {
9343
9472
  }
9344
9473
  function ExercisePartRoute() {
9345
9474
  var _a, _b, _c, _d, _e, _f;
9346
- const data = useLoaderData();
9475
+ const data2 = useLoaderData();
9347
9476
  const [searchParams] = useSearchParams();
9348
9477
  const preview = searchParams.get("preview");
9349
9478
  const inBrowserBrowserRef = useRef(null);
@@ -9352,12 +9481,12 @@ function ExercisePartRoute() {
9352
9481
  function shouldHideTab(tab) {
9353
9482
  var _a2, _b2, _c2;
9354
9483
  if (tab === "tests") {
9355
- return ENV.EPICSHOP_DEPLOYED || !data.playground || data.playground.test.type === "none";
9484
+ return ENV.EPICSHOP_DEPLOYED || !data2.playground || data2.playground.test.type === "none";
9356
9485
  }
9357
9486
  if (tab === "problem" || tab === "solution") {
9358
- if (((_a2 = data[tab]) == null ? void 0 : _a2.dev.type) === "none") return true;
9487
+ if (((_a2 = data2[tab]) == null ? void 0 : _a2.dev.type) === "none") return true;
9359
9488
  if (ENV.EPICSHOP_DEPLOYED) {
9360
- return ((_b2 = data[tab]) == null ? void 0 : _b2.dev.type) !== "browser" && !((_c2 = data[tab]) == null ? void 0 : _c2.stackBlitzUrl);
9489
+ return ((_b2 = data2[tab]) == null ? void 0 : _b2.dev.type) !== "browser" && !((_c2 = data2[tab]) == null ? void 0 : _c2.stackBlitzUrl);
9361
9490
  }
9362
9491
  }
9363
9492
  if (tab === "playground" && ENV.EPICSHOP_DEPLOYED) return true;
@@ -9365,8 +9494,8 @@ function ExercisePartRoute() {
9365
9494
  }
9366
9495
  const activeTab = isValidPreview(preview) ? preview : tabs.find((t) => !shouldHideTab(t));
9367
9496
  const altDiffUrl = `/diff?${new URLSearchParams({
9368
- app1: ((_a = data.problem) == null ? void 0 : _a.name) ?? "",
9369
- app2: ((_b = data.solution) == null ? void 0 : _b.name) ?? ""
9497
+ app1: ((_a = data2.problem) == null ? void 0 : _a.name) ?? "",
9498
+ app2: ((_b = data2.solution) == null ? void 0 : _b.name) ?? ""
9370
9499
  })}`;
9371
9500
  function handleDiffTabClick(event) {
9372
9501
  if (event.altKey && !event.ctrlKey && !event.shiftKey && !event.metaKey) {
@@ -9411,11 +9540,11 @@ function ExercisePartRoute() {
9411
9540
  children: /* @__PURE__ */ jsx(
9412
9541
  Playground,
9413
9542
  {
9414
- appInfo: data.playground,
9415
- problemAppName: (_c = data.problem) == null ? void 0 : _c.name,
9543
+ appInfo: data2.playground,
9544
+ problemAppName: (_c = data2.problem) == null ? void 0 : _c.name,
9416
9545
  inBrowserBrowserRef,
9417
- allApps: data.allApps,
9418
- isUpToDate: ((_d = data.playground) == null ? void 0 : _d.isUpToDate) ?? false
9546
+ allApps: data2.allApps,
9547
+ isUpToDate: ((_d = data2.playground) == null ? void 0 : _d.isUpToDate) ?? false
9419
9548
  }
9420
9549
  )
9421
9550
  }
@@ -9428,7 +9557,7 @@ function ExercisePartRoute() {
9428
9557
  children: /* @__PURE__ */ jsx(
9429
9558
  Preview,
9430
9559
  {
9431
- appInfo: data.problem,
9560
+ appInfo: data2.problem,
9432
9561
  inBrowserBrowserRef
9433
9562
  }
9434
9563
  )
@@ -9442,7 +9571,7 @@ function ExercisePartRoute() {
9442
9571
  children: /* @__PURE__ */ jsx(
9443
9572
  Preview,
9444
9573
  {
9445
- appInfo: data.solution,
9574
+ appInfo: data2.solution,
9446
9575
  inBrowserBrowserRef
9447
9576
  }
9448
9577
  )
@@ -9456,10 +9585,10 @@ function ExercisePartRoute() {
9456
9585
  children: /* @__PURE__ */ jsx(
9457
9586
  Tests,
9458
9587
  {
9459
- appInfo: data.playground,
9460
- problemAppName: (_e = data.problem) == null ? void 0 : _e.name,
9461
- allApps: data.allApps,
9462
- isUpToDate: ((_f = data.playground) == null ? void 0 : _f.isUpToDate) ?? false
9588
+ appInfo: data2.playground,
9589
+ problemAppName: (_e = data2.problem) == null ? void 0 : _e.name,
9590
+ allApps: data2.allApps,
9591
+ isUpToDate: ((_f = data2.playground) == null ? void 0 : _f.isUpToDate) ?? false
9463
9592
  }
9464
9593
  )
9465
9594
  }
@@ -9469,7 +9598,7 @@ function ExercisePartRoute() {
9469
9598
  {
9470
9599
  value: "diff",
9471
9600
  className: "flex h-full w-full flex-grow items-start justify-center self-start radix-state-inactive:hidden",
9472
- children: /* @__PURE__ */ jsx(Diff, { diff: data.diff, allApps: data.allApps })
9601
+ children: /* @__PURE__ */ jsx(Diff, { diff: data2.diff, allApps: data2.allApps })
9473
9602
  }
9474
9603
  ),
9475
9604
  /* @__PURE__ */ jsx(
@@ -9505,12 +9634,19 @@ const route17 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePrope
9505
9634
  async function loader$h({ request, params }) {
9506
9635
  const timings = makeTimings("exercise-step-test");
9507
9636
  const exerciseStepApp = await requireExerciseApp(params, { request, timings });
9508
- return json$1({
9509
- appInfo: {
9510
- name: exerciseStepApp == null ? void 0 : exerciseStepApp.name,
9511
- test: exerciseStepApp == null ? void 0 : exerciseStepApp.test
9637
+ return unstable_data$1(
9638
+ {
9639
+ appInfo: {
9640
+ name: exerciseStepApp == null ? void 0 : exerciseStepApp.name,
9641
+ test: exerciseStepApp == null ? void 0 : exerciseStepApp.test
9642
+ }
9643
+ },
9644
+ {
9645
+ headers: {
9646
+ "Server-Timing": timings.toString()
9647
+ }
9512
9648
  }
9513
- });
9649
+ );
9514
9650
  }
9515
9651
  const headers$4 = ({ loaderHeaders, parentHeaders }) => {
9516
9652
  const headers2 = {
@@ -9554,17 +9690,17 @@ const route19 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePrope
9554
9690
  loader: loader$g
9555
9691
  }, Symbol.toStringTag, { value: "Module" }));
9556
9692
  const meta$2 = ({
9557
- data,
9693
+ data: data2,
9558
9694
  matches
9559
9695
  }) => {
9560
9696
  var _a;
9561
- const number = data == null ? void 0 : data.exercise.exerciseNumber.toString().padStart(2, "0");
9697
+ const number = data2 == null ? void 0 : data2.exercise.exerciseNumber.toString().padStart(2, "0");
9562
9698
  const rootData = (_a = matches.find((m) => m.id === "root")) == null ? void 0 : _a.data;
9563
- if (!data || !rootData) return [{ title: "🦉 | Error" }];
9699
+ if (!data2 || !rootData) return [{ title: "🦉 | Error" }];
9564
9700
  return getSeoMetaTags({
9565
- title: `🦉 | ${number}. ${data.exercise.title} | ${rootData == null ? void 0 : rootData.workshopTitle}`,
9566
- description: `Elaboration for ${number}. ${data.exercise.title}`,
9567
- ogTitle: `Finished: ${data.exercise.title}`,
9701
+ title: `🦉 | ${number}. ${data2.exercise.title} | ${rootData == null ? void 0 : rootData.workshopTitle}`,
9702
+ description: `Elaboration for ${number}. ${data2.exercise.title}`,
9703
+ ogTitle: `Finished: ${data2.exercise.title}`,
9568
9704
  ogDescription: `Elaboration for exercise ${Number(number)}`,
9569
9705
  instructor: rootData.instructor,
9570
9706
  requestInfo: rootData.requestInfo
@@ -9597,7 +9733,7 @@ async function loader$f({ request, params }) {
9597
9733
  const exerciseApps = apps.filter(isExerciseStepApp).filter((app) => app.exerciseNumber === exercise.exerciseNumber);
9598
9734
  const prevApp = exerciseApps[exerciseApps.length - 1];
9599
9735
  const articleId = `workshop-${slugify(workshopConfig.title)}-${exercise.exerciseNumber}-finished`;
9600
- return defer(
9736
+ return unstable_data$1(
9601
9737
  {
9602
9738
  articleId,
9603
9739
  workshopTitle: workshopConfig.title,
@@ -9639,15 +9775,15 @@ const headers$3 = ({ loaderHeaders, parentHeaders }) => {
9639
9775
  };
9640
9776
  const mdxComponents$2 = { h1: () => null };
9641
9777
  function ExerciseFinished$1() {
9642
- const data = useLoaderData();
9643
- const exerciseNumber = data.exercise.exerciseNumber.toString().padStart(2, "0");
9778
+ const data2 = useLoaderData();
9779
+ const exerciseNumber = data2.exercise.exerciseNumber.toString().padStart(2, "0");
9644
9780
  useRevalidationWS({
9645
9781
  watchPaths: [`./exercises/${exerciseNumber}/FINISHED.mdx`]
9646
9782
  });
9647
9783
  return /* @__PURE__ */ jsx("div", { className: "flex max-w-full flex-grow flex-col", children: /* @__PURE__ */ jsxs("main", { className: "flex flex-grow flex-col sm:grid sm:h-full sm:min-h-[800px] sm:grid-cols-1 sm:grid-rows-2 md:min-h-[unset] lg:grid-cols-2 lg:grid-rows-1", children: [
9648
9784
  /* @__PURE__ */ jsxs("div", { className: "relative flex flex-col sm:col-span-1 sm:row-span-1 sm:h-full lg:border-r", children: [
9649
9785
  /* @__PURE__ */ jsx("h1", { className: "h-14 border-b pl-10 pr-5 text-sm font-medium leading-tight", children: /* @__PURE__ */ jsx("div", { className: "flex h-14 flex-wrap items-center justify-between gap-x-2 py-2", children: /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-start gap-x-2", children: [
9650
- /* @__PURE__ */ jsx(Link, { to: `/${exerciseNumber}`, className: "hover:underline", children: `${exerciseNumber}. ${data.exercise.title}` }),
9786
+ /* @__PURE__ */ jsx(Link, { to: `/${exerciseNumber}`, className: "hover:underline", children: `${exerciseNumber}. ${data2.exercise.title}` }),
9651
9787
  /* @__PURE__ */ jsx("span", { children: "/" }),
9652
9788
  /* @__PURE__ */ jsx("span", { children: "Elaboration" })
9653
9789
  ] }) }) }),
@@ -9655,15 +9791,15 @@ function ExerciseFinished$1() {
9655
9791
  "article",
9656
9792
  {
9657
9793
  className: "shadow-on-scrollbox h-full w-full max-w-none flex-1 scroll-pt-6 space-y-6 overflow-y-auto p-2 scrollbar-thin scrollbar-thumb-scrollbar sm:p-10 sm:pt-8",
9658
- id: data.articleId,
9659
- children: data.exercise.finishedCode ? /* @__PURE__ */ jsx(
9794
+ id: data2.articleId,
9795
+ children: data2.exercise.finishedCode ? /* @__PURE__ */ jsx(
9660
9796
  EpicVideoInfoProvider,
9661
9797
  {
9662
- epicVideoInfosPromise: data.epicVideoInfosPromise,
9798
+ epicVideoInfosPromise: data2.epicVideoInfosPromise,
9663
9799
  children: /* @__PURE__ */ jsx("div", { className: "prose dark:prose-invert sm:prose-lg", children: /* @__PURE__ */ jsx(
9664
9800
  Mdx,
9665
9801
  {
9666
- code: data.exercise.finishedCode,
9802
+ code: data2.exercise.finishedCode,
9667
9803
  components: mdxComponents$2
9668
9804
  }
9669
9805
  ) })
@@ -9674,12 +9810,12 @@ function ExerciseFinished$1() {
9674
9810
  )
9675
9811
  }
9676
9812
  ),
9677
- /* @__PURE__ */ jsx(ElementScrollRestoration, { elementQuery: `#${data.articleId}` }),
9813
+ /* @__PURE__ */ jsx(ElementScrollRestoration, { elementQuery: `#${data2.articleId}` }),
9678
9814
  /* @__PURE__ */ jsx(
9679
9815
  ProgressToggle,
9680
9816
  {
9681
9817
  type: "finished",
9682
- exerciseNumber: data.exercise.exerciseNumber,
9818
+ exerciseNumber: data2.exercise.exerciseNumber,
9683
9819
  className: "h-14 border-t px-6"
9684
9820
  }
9685
9821
  ),
@@ -9688,18 +9824,18 @@ function ExerciseFinished$1() {
9688
9824
  /* @__PURE__ */ jsx(
9689
9825
  EditFileOnGitHub,
9690
9826
  {
9691
- file: data.exerciseFinished.file,
9692
- relativePath: data.exerciseFinished.relativePath
9827
+ file: data2.exerciseFinished.file,
9828
+ relativePath: data2.exerciseFinished.relativePath
9693
9829
  }
9694
9830
  ),
9695
- /* @__PURE__ */ jsx(NavChevrons, { prev: data.prevStepLink, next: data.nextStepLink })
9831
+ /* @__PURE__ */ jsx(NavChevrons, { prev: data2.prevStepLink, next: data2.nextStepLink })
9696
9832
  ] })
9697
9833
  ] }),
9698
9834
  /* @__PURE__ */ jsx(
9699
9835
  Survey$1,
9700
9836
  {
9701
- exerciseFormEmbedUrl: data.exerciseFormEmbedUrl,
9702
- exerciseTitle: data.exercise.title
9837
+ exerciseFormEmbedUrl: data2.exerciseFormEmbedUrl,
9838
+ exerciseTitle: data2.exercise.title
9703
9839
  }
9704
9840
  )
9705
9841
  ] }) });
@@ -9771,7 +9907,7 @@ async function loader$e({ request }) {
9771
9907
  "{workshopTitle}",
9772
9908
  encodeURIComponent(workshopTitle)
9773
9909
  );
9774
- return defer(
9910
+ return unstable_data$1(
9775
9911
  {
9776
9912
  articleId: `workshop-${slugify(workshopTitle)}-finished`,
9777
9913
  workshopTitle,
@@ -9805,12 +9941,12 @@ const headers$2 = ({ loaderHeaders, parentHeaders }) => {
9805
9941
  };
9806
9942
  const mdxComponents$1 = { h1: () => null };
9807
9943
  function ExerciseFinished() {
9808
- const data = useLoaderData();
9944
+ const data2 = useLoaderData();
9809
9945
  useRevalidationWS({ watchPaths: ["./exercises/FINISHED.mdx"] });
9810
9946
  return /* @__PURE__ */ jsx("div", { className: "flex h-full flex-grow flex-col", children: /* @__PURE__ */ jsxs("main", { className: "grid h-full flex-grow grid-cols-1 grid-rows-2 lg:grid-cols-2 lg:grid-rows-1", children: [
9811
9947
  /* @__PURE__ */ jsxs("div", { className: "relative col-span-1 row-span-1 flex h-full flex-col lg:border-r", children: [
9812
9948
  /* @__PURE__ */ jsx("h1", { className: "h-14 border-b pl-10 pr-5 text-sm font-medium uppercase leading-none", children: /* @__PURE__ */ jsx("div", { className: "flex h-14 flex-wrap items-center justify-between gap-x-2 py-2", children: /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-start gap-x-2", children: [
9813
- /* @__PURE__ */ jsx(Link, { to: "/", className: "hover:underline", children: data.workshopTitle }),
9949
+ /* @__PURE__ */ jsx(Link, { to: "/", className: "hover:underline", children: data2.workshopTitle }),
9814
9950
  /* @__PURE__ */ jsx("span", { children: "/" }),
9815
9951
  /* @__PURE__ */ jsx("span", { children: "Elaboration" })
9816
9952
  ] }) }) }),
@@ -9818,12 +9954,12 @@ function ExerciseFinished() {
9818
9954
  "article",
9819
9955
  {
9820
9956
  className: "shadow-on-scrollbox h-full w-full max-w-none flex-1 scroll-pt-6 space-y-6 overflow-y-auto p-2 scrollbar-thin scrollbar-thumb-scrollbar sm:p-10 sm:pt-8",
9821
- id: data.articleId,
9822
- children: data.finishedCode ? /* @__PURE__ */ jsx(
9957
+ id: data2.articleId,
9958
+ children: data2.finishedCode ? /* @__PURE__ */ jsx(
9823
9959
  EpicVideoInfoProvider,
9824
9960
  {
9825
- epicVideoInfosPromise: data.epicVideoInfosPromise,
9826
- children: /* @__PURE__ */ jsx("div", { className: "prose dark:prose-invert sm:prose-lg", children: /* @__PURE__ */ jsx(Mdx, { code: data.finishedCode, components: mdxComponents$1 }) })
9961
+ epicVideoInfosPromise: data2.epicVideoInfosPromise,
9962
+ children: /* @__PURE__ */ jsx("div", { className: "prose dark:prose-invert sm:prose-lg", children: /* @__PURE__ */ jsx(Mdx, { code: data2.finishedCode, components: mdxComponents$1 }) })
9827
9963
  }
9828
9964
  ) : (
9829
9965
  // TODO: render a random dad joke...
@@ -9831,7 +9967,7 @@ function ExerciseFinished() {
9831
9967
  )
9832
9968
  }
9833
9969
  ),
9834
- /* @__PURE__ */ jsx(ElementScrollRestoration, { elementQuery: `#${data.articleId}` }),
9970
+ /* @__PURE__ */ jsx(ElementScrollRestoration, { elementQuery: `#${data2.articleId}` }),
9835
9971
  /* @__PURE__ */ jsx(
9836
9972
  ProgressToggle,
9837
9973
  {
@@ -9841,21 +9977,21 @@ function ExerciseFinished() {
9841
9977
  ),
9842
9978
  /* @__PURE__ */ jsxs("div", { className: "flex h-16 justify-between border-b-4 border-t lg:border-b-0", children: [
9843
9979
  /* @__PURE__ */ jsx("div", {}),
9844
- data.workshopFinished.status === "success" ? /* @__PURE__ */ jsx(
9980
+ data2.workshopFinished.status === "success" ? /* @__PURE__ */ jsx(
9845
9981
  EditFileOnGitHub,
9846
9982
  {
9847
- file: data.workshopFinished.file,
9848
- relativePath: data.workshopFinished.relativePath
9983
+ file: data2.workshopFinished.file,
9984
+ relativePath: data2.workshopFinished.relativePath
9849
9985
  }
9850
9986
  ) : null,
9851
- /* @__PURE__ */ jsx(NavChevrons, { prev: data.prevStepLink, next: { to: "/" } })
9987
+ /* @__PURE__ */ jsx(NavChevrons, { prev: data2.prevStepLink, next: { to: "/" } })
9852
9988
  ] })
9853
9989
  ] }),
9854
9990
  /* @__PURE__ */ jsx(
9855
9991
  Survey,
9856
9992
  {
9857
- workshopTitle: data.workshopTitle,
9858
- workshopFormEmbedUrl: data.workshopFormEmbedUrl
9993
+ workshopTitle: data2.workshopTitle,
9994
+ workshopFormEmbedUrl: data2.workshopFormEmbedUrl
9859
9995
  }
9860
9996
  )
9861
9997
  ] }) });
@@ -9909,7 +10045,7 @@ async function loader$d({ request }) {
9909
10045
  desc: "compileMdx in index"
9910
10046
  })
9911
10047
  ]);
9912
- return defer(
10048
+ return unstable_data$1(
9913
10049
  {
9914
10050
  articleId: `workshop-${slugify(title)}-instructions`,
9915
10051
  title: workshopReadme.compiled.status === "success" ? workshopReadme.compiled.title : title,
@@ -9959,43 +10095,43 @@ function ExerciseListItem({
9959
10095
  }
9960
10096
  const mdxComponents = { h1: () => null };
9961
10097
  function Index() {
9962
- const data = useLoaderData();
10098
+ const data2 = useLoaderData();
9963
10099
  const exerciseLinks = /* @__PURE__ */ jsxs("ul", { className: "flex flex-col divide-y divide-border dark:divide-border/50", children: [
9964
10100
  /* @__PURE__ */ jsx("strong", { className: "px-10 pb-3 font-mono text-xs uppercase", children: "Exercises" }),
9965
- data.exercises.map((exercise) => /* @__PURE__ */ jsx(ExerciseListItem, { exercise }, exercise.exerciseNumber))
10101
+ data2.exercises.map((exercise) => /* @__PURE__ */ jsx(ExerciseListItem, { exercise }, exercise.exerciseNumber))
9966
10102
  ] });
9967
10103
  return /* @__PURE__ */ jsxs("main", { className: "relative flex h-full w-full max-w-5xl flex-col justify-between border-r md:w-3/4 xl:w-2/3", children: [
9968
10104
  /* @__PURE__ */ jsxs(
9969
10105
  "article",
9970
10106
  {
9971
- id: data.articleId,
10107
+ id: data2.articleId,
9972
10108
  className: "shadow-on-scrollbox flex w-full flex-1 flex-col gap-12 overflow-y-scroll px-3 py-4 pt-6 scrollbar-thin scrollbar-thumb-scrollbar md:px-10 md:py-12 md:pt-16",
9973
10109
  children: [
9974
- /* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsx("h1", { className: "px-10 text-[clamp(3rem,6vw,7.5rem)] font-extrabold leading-none", children: data.title }) }),
10110
+ /* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsx("h1", { className: "px-10 text-[clamp(3rem,6vw,7.5rem)] font-extrabold leading-none", children: data2.title }) }),
9975
10111
  /* @__PURE__ */ jsxs("div", { className: "w-full max-w-none scroll-pt-6 border-t px-3 pt-3 md:px-10 md:pt-8", children: [
9976
10112
  /* @__PURE__ */ jsx("h2", { className: "pb-5 font-mono text-xs font-semibold uppercase", children: "Intro" }),
9977
- data.workshopReadme.compiled.status === "success" && data.workshopReadme.compiled.code ? /* @__PURE__ */ jsx(
10113
+ data2.workshopReadme.compiled.status === "success" && data2.workshopReadme.compiled.code ? /* @__PURE__ */ jsx(
9978
10114
  EpicVideoInfoProvider,
9979
10115
  {
9980
- epicVideoInfosPromise: data.epicVideoInfosPromise,
10116
+ epicVideoInfosPromise: data2.epicVideoInfosPromise,
9981
10117
  children: /* @__PURE__ */ jsx("div", { className: "prose dark:prose-invert sm:prose-lg", children: /* @__PURE__ */ jsx(
9982
10118
  Mdx,
9983
10119
  {
9984
- code: data.workshopReadme.compiled.code,
10120
+ code: data2.workshopReadme.compiled.code,
9985
10121
  components: mdxComponents
9986
10122
  }
9987
10123
  ) })
9988
10124
  }
9989
- ) : data.workshopReadme.compiled.status === "error" ? /* @__PURE__ */ jsxs("div", { className: "text-red-500", children: [
10125
+ ) : data2.workshopReadme.compiled.status === "error" ? /* @__PURE__ */ jsxs("div", { className: "text-red-500", children: [
9990
10126
  "There was an error:",
9991
- /* @__PURE__ */ jsx("pre", { children: data.workshopReadme.compiled.error })
10127
+ /* @__PURE__ */ jsx("pre", { children: data2.workshopReadme.compiled.error })
9992
10128
  ] }) : "No instructions yet..."
9993
10129
  ] }),
9994
- /* @__PURE__ */ jsx("div", { className: "pb-5 pt-10", children: data.workshopReadme.compiled.status === "success" && data.workshopReadme.compiled.code && data.workshopReadme.compiled.code.length > 500 ? exerciseLinks : null })
10130
+ /* @__PURE__ */ jsx("div", { className: "pb-5 pt-10", children: data2.workshopReadme.compiled.status === "success" && data2.workshopReadme.compiled.code && data2.workshopReadme.compiled.code.length > 500 ? exerciseLinks : null })
9995
10131
  ]
9996
10132
  }
9997
10133
  ),
9998
- /* @__PURE__ */ jsx(ElementScrollRestoration, { elementQuery: `#${data.articleId}` }),
10134
+ /* @__PURE__ */ jsx(ElementScrollRestoration, { elementQuery: `#${data2.articleId}` }),
9999
10135
  /* @__PURE__ */ jsx(
10000
10136
  ProgressToggle,
10001
10137
  {
@@ -10006,8 +10142,8 @@ function Index() {
10006
10142
  /* @__PURE__ */ jsx("div", { className: "flex h-16 justify-center border-t", children: /* @__PURE__ */ jsx(
10007
10143
  EditFileOnGitHub,
10008
10144
  {
10009
- file: data.workshopReadme.file,
10010
- relativePath: data.workshopReadme.relativePath
10145
+ file: data2.workshopReadme.file,
10146
+ relativePath: data2.workshopReadme.relativePath
10011
10147
  }
10012
10148
  ) })
10013
10149
  ] });
@@ -10131,12 +10267,12 @@ async function loader$b() {
10131
10267
  ensureUndeployed();
10132
10268
  const isAuthenticated = Boolean(await getAuthInfo());
10133
10269
  if (isAuthenticated) throw redirect$1("/account");
10134
- return json$1({});
10270
+ return {};
10135
10271
  }
10136
10272
  async function action$2() {
10137
10273
  ensureUndeployed();
10138
10274
  void registerDevice();
10139
- return json$1({ status: "pending" });
10275
+ return { status: "pending" };
10140
10276
  }
10141
10277
  function Login() {
10142
10278
  var _a;
@@ -10365,7 +10501,7 @@ async function loader$a({ request }) {
10365
10501
  ] of getProcesses().testProcesses.entries()) {
10366
10502
  testProcesses[name] = { pid: process2 == null ? void 0 : process2.pid, exitCode };
10367
10503
  }
10368
- return json$1(
10504
+ return unstable_data$1(
10369
10505
  {
10370
10506
  apps,
10371
10507
  processes,
@@ -10386,19 +10522,19 @@ async function action$1({ request }) {
10386
10522
  switch (intent) {
10387
10523
  case "clear-data": {
10388
10524
  await clearData();
10389
- return json$1({ success: true });
10525
+ return { success: true };
10390
10526
  }
10391
10527
  case "clear-caches": {
10392
10528
  await clearCaches();
10393
- return json$1({ success: true });
10529
+ return { success: true };
10394
10530
  }
10395
10531
  case "inspect": {
10396
10532
  await startInspector();
10397
- return json$1({ success: true });
10533
+ return { success: true };
10398
10534
  }
10399
10535
  case "stop-inspect": {
10400
10536
  await stopInspector();
10401
- return json$1({ success: true });
10537
+ return { success: true };
10402
10538
  }
10403
10539
  default: {
10404
10540
  throw new Error(`Unknown intent: ${intent}`);
@@ -10426,7 +10562,7 @@ function linkProgress(progress) {
10426
10562
  }
10427
10563
  function AdminLayout() {
10428
10564
  var _a, _b;
10429
- const data = useLoaderData();
10565
+ const data2 = useLoaderData();
10430
10566
  const navigation = useNavigation();
10431
10567
  const epicProgress = useEpicProgress();
10432
10568
  const isStartingInspector = ((_a = navigation.formData) == null ? void 0 : _a.get("intent")) === "inspect";
@@ -10478,19 +10614,19 @@ function AdminLayout() {
10478
10614
  /* @__PURE__ */ jsxs("ul", { className: "max-h-48 overflow-y-scroll border-2 p-8 scrollbar-thin scrollbar-thumb-scrollbar", children: [
10479
10615
  /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx(Form, { method: "POST", children: /* @__PURE__ */ jsx("button", { name: "intent", value: "clear-caches", children: "Clear local caches" }) }) }),
10480
10616
  /* @__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)" }) }) }),
10481
- /* @__PURE__ */ jsx("li", { children: data.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" }) }) })
10617
+ /* @__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" }) }) })
10482
10618
  ] })
10483
10619
  ] }),
10484
10620
  /* @__PURE__ */ jsxs("div", { children: [
10485
10621
  /* @__PURE__ */ jsx("h2", { className: "text-lg font-bold", children: "Apps" }),
10486
- /* @__PURE__ */ jsx("ul", { className: "max-h-48 list-none overflow-y-scroll border-2 p-8 scrollbar-thin scrollbar-thumb-scrollbar", children: data.apps.map((app) => /* @__PURE__ */ jsxs("li", { className: "flex items-center gap-2 py-1", children: [
10487
- data.processes[app.name] ? /* @__PURE__ */ jsx(Pinger, { status: "running" }) : /* @__PURE__ */ jsx(Pinger, { status: "stopped" }),
10622
+ /* @__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: [
10623
+ data2.processes[app.name] ? /* @__PURE__ */ jsx(Pinger, { status: "running" }) : /* @__PURE__ */ jsx(Pinger, { status: "stopped" }),
10488
10624
  app.name
10489
10625
  ] }, app.name)) })
10490
10626
  ] }),
10491
10627
  /* @__PURE__ */ jsxs("div", { children: [
10492
10628
  /* @__PURE__ */ jsx("h2", { className: "text-lg font-bold", children: "Processes" }),
10493
- /* @__PURE__ */ jsx("ul", { className: "overflow-y-scroll border-2 p-8 scrollbar-thin scrollbar-thumb-scrollbar", children: Object.entries(data.processes).map(([key, process2]) => /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsxs("span", { children: [
10629
+ /* @__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: [
10494
10630
  key,
10495
10631
  " - Port: ",
10496
10632
  process2.port,
@@ -10503,7 +10639,7 @@ function AdminLayout() {
10503
10639
  ] }),
10504
10640
  /* @__PURE__ */ jsxs("div", { children: [
10505
10641
  /* @__PURE__ */ jsx("h2", { className: "text-lg font-bold", children: "Test Processes" }),
10506
- /* @__PURE__ */ jsx("ul", { className: "overflow-y-scroll border-2 p-8 scrollbar-thin scrollbar-thumb-scrollbar", children: Object.entries(data.testProcesses).map(([key, process2]) => /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsxs("span", { children: [
10642
+ /* @__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: [
10507
10643
  key,
10508
10644
  " - PID ",
10509
10645
  process2.pid,
@@ -10560,7 +10696,7 @@ const route25 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePrope
10560
10696
  async function loader$9() {
10561
10697
  ensureUndeployed();
10562
10698
  const apps = await getApps();
10563
- return json$1({ apps });
10699
+ return Response.json({ apps });
10564
10700
  }
10565
10701
  const route26 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
10566
10702
  __proto__: null,
@@ -10569,7 +10705,7 @@ const route26 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePrope
10569
10705
  async function loader$8() {
10570
10706
  ensureUndeployed();
10571
10707
  const entries = await getAllFileCacheEntries();
10572
- return json$1({ entries });
10708
+ return Response.json({ entries });
10573
10709
  }
10574
10710
  const route27 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
10575
10711
  __proto__: null,
@@ -10578,7 +10714,7 @@ const route27 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePrope
10578
10714
  async function loader$7({ request }) {
10579
10715
  const timings = makeTimings("appsLoader");
10580
10716
  const apps = await getApps({ request, timings });
10581
- return json$1(
10717
+ return unstable_data$1(
10582
10718
  { apps },
10583
10719
  { headers: { "Server-Timing": getServerTimeHeader(timings) } }
10584
10720
  );
@@ -10642,12 +10778,12 @@ async function loader$6({ request }) {
10642
10778
  const nextSearchParams = new URLSearchParams(reqUrl.searchParams);
10643
10779
  nextSearchParams.set("app1", nextApp1 ?? "");
10644
10780
  nextSearchParams.set("app2", nextApp2 ?? "");
10645
- return defer({
10781
+ return {
10646
10782
  allApps,
10647
10783
  diff,
10648
10784
  prevLink: prevApp1 && prevApp2 ? { to: `/diff?${prevSearchParams}`, "aria-label": "Previous App" } : { to: "/diff" },
10649
10785
  nextLink: nextApp1 && nextApp2 ? { to: `/diff?${nextSearchParams}`, "aria-label": "Next App" } : { to: "/diff" }
10650
- });
10786
+ };
10651
10787
  }
10652
10788
  function DiffViewer() {
10653
10789
  const data = useLoaderData();
@@ -10680,7 +10816,7 @@ const route29 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePrope
10680
10816
  async function loader$5({ request }) {
10681
10817
  const timings = makeTimings("appsLoader");
10682
10818
  const exercises = await getExercises({ request, timings });
10683
- return json$1(
10819
+ return unstable_data$1(
10684
10820
  { exercises },
10685
10821
  { headers: { "Server-Timing": getServerTimeHeader(timings) } }
10686
10822
  );
@@ -11027,7 +11163,7 @@ async function loader$3({ request }) {
11027
11163
  const timings = makeTimings("onboarding");
11028
11164
  const { onboardingVideo } = getWorkshopConfig();
11029
11165
  const videoInfos = getEpicVideoInfos([onboardingVideo], { request, timings });
11030
- return defer(
11166
+ return unstable_data$1(
11031
11167
  { onboardingVideo, videoInfos },
11032
11168
  { headers: { "Server-Timing": timings.toString() } }
11033
11169
  );
@@ -11039,9 +11175,9 @@ const headers = ({ loaderHeaders }) => {
11039
11175
  return headers2;
11040
11176
  };
11041
11177
  async function action({ request }) {
11042
- const data = await request.formData();
11178
+ const data2 = await request.formData();
11043
11179
  const authInfo = await getAuthInfo();
11044
- const intent = data.get("intent");
11180
+ const intent = data2.get("intent");
11045
11181
  invariantResponse(intent === "complete", "Invalid intent");
11046
11182
  const { onboardingVideo } = getWorkshopConfig();
11047
11183
  await markOnboardingVideoWatched(onboardingVideo);
@@ -11049,7 +11185,7 @@ async function action({ request }) {
11049
11185
  else throw redirect$1("/login");
11050
11186
  }
11051
11187
  function Onboarding() {
11052
- const data = useLoaderData();
11188
+ const data2 = useLoaderData();
11053
11189
  return /* @__PURE__ */ jsxs("main", { className: "flex h-full w-full flex-col items-center justify-between gap-4", children: [
11054
11190
  /* @__PURE__ */ jsxs("div", { className: "container flex h-full w-full max-w-5xl flex-1 flex-col items-center gap-4 overflow-y-scroll py-12 scrollbar-thin scrollbar-thumb-scrollbar", children: [
11055
11191
  /* @__PURE__ */ jsx("h1", { className: "text-5xl", children: "Onboarding" }),
@@ -11059,7 +11195,7 @@ function Onboarding() {
11059
11195
  /* @__PURE__ */ jsx("strong", { children: "you must watch the tour video" }),
11060
11196
  "! You're going to be spending a lot of time in here, so it's important you understand how to work effectively in this workshop"
11061
11197
  ] }),
11062
- /* @__PURE__ */ jsx("div", { className: "w-[780px] max-w-full", children: /* @__PURE__ */ jsx(EpicVideoInfoProvider, { epicVideoInfosPromise: data.videoInfos, children: /* @__PURE__ */ jsx(DeferredEpicVideo, { url: data.onboardingVideo }) }) })
11198
+ /* @__PURE__ */ jsx("div", { className: "w-[780px] max-w-full", children: /* @__PURE__ */ jsx(EpicVideoInfoProvider, { epicVideoInfosPromise: data2.videoInfos, children: /* @__PURE__ */ jsx(DeferredEpicVideo, { url: data2.onboardingVideo }) }) })
11063
11199
  ] }),
11064
11200
  /* @__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!" }) })
11065
11201
  ] });
@@ -11088,7 +11224,7 @@ async function loader$2() {
11088
11224
  ] of getProcesses().testProcesses.entries()) {
11089
11225
  testProcesses[name] = { pid: process2 == null ? void 0 : process2.pid, exitCode, output };
11090
11226
  }
11091
- return json$1({ processes, testProcesses });
11227
+ return Response.json({ processes, testProcesses });
11092
11228
  }
11093
11229
  const route36 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
11094
11230
  __proto__: null,
@@ -11116,11 +11252,11 @@ const route40 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePrope
11116
11252
  __proto__: null,
11117
11253
  loader
11118
11254
  }, Symbol.toStringTag, { value: "Module" }));
11119
- 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-DojjHZlY.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-CdyMdOKk.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-T2hZtl0D.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-BBryXlM_.js", "/assets/workshop-config-DJY2cXU_.js", "/assets/presence-CdyMdOKk.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-CPFwPYf1.js", "imports": ["/assets/index-BFGhCX_U.js", "/assets/button-DQ001ob0.js", "/assets/misc-BJtHv_Jh.js", "/assets/tooltip-BgynKV2c.js", "/assets/user-BBryXlM_.js", "/assets/presence-CdyMdOKk.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-DoeazikD.js", "imports": ["/assets/discord-CHsbqaqM.js", "/assets/index-BFGhCX_U.js", "/assets/misc-BJtHv_Jh.js", "/assets/components-9EGYHTc_.js", "/assets/user-BBryXlM_.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-DarnXgbX.js", "imports": ["/assets/index-BFGhCX_U.js", "/assets/index-BCxBKsqT.js", "/assets/epic-video-GDpD7_Qt.js", "/assets/revalidation-ws-DU-PzW-_.js", "/assets/mdx-hW1uYjc1.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-BBryXlM_.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-BTrPWpBz.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-hW1uYjc1.js", "/assets/progress-DAB3nDa2.js", "/assets/set-playground-DgnOJqFN.js", "/assets/seo-pBpFCWsy.js", "/assets/misc-BJtHv_Jh.js", "/assets/epic-video-GDpD7_Qt.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-BBryXlM_.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-DJF1fiZI.js", "imports": ["/assets/index-BFGhCX_U.js", "/assets/tooltip-BgynKV2c.js", "/assets/index-BuA_RWlU.js", "/assets/misc-BJtHv_Jh.js", "/assets/diff-assn_bSK.js", "/assets/error-boundary-1-dmC941.js", "/assets/loading-Dk0n07O3.js", "/assets/discord-CHsbqaqM.js", "/assets/components-9EGYHTc_.js", "/assets/index-DRH72MzK.js", "/assets/set-playground-DgnOJqFN.js", "/assets/tests-Bw1rCopV.js", "/assets/preview-CW_12I0i.js", "/assets/index-BuoaxPEj.js", "/assets/accordion-DC885Li1.js", "/assets/mdx-hW1uYjc1.js", "/assets/epic-video-GDpD7_Qt.js", "/assets/index-_J-F_Dnc.js", "/assets/request-info-DCIQLE6H.js", "/assets/pe-ChIwTk8v.js", "/assets/user-BBryXlM_.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-DJ7oeeeg.js", "imports": ["/assets/index-BFGhCX_U.js", "/assets/tests-Bw1rCopV.js", "/assets/components-9EGYHTc_.js", "/assets/epic-video-GDpD7_Qt.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-BBryXlM_.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-DgnOJqFN.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-DEzaS_Ji.js", "imports": ["/assets/index-BFGhCX_U.js", "/assets/index-BCxBKsqT.js", "/assets/epic-video-GDpD7_Qt.js", "/assets/loading-Dk0n07O3.js", "/assets/nav-chevrons-CgbSMLeb.js", "/assets/revalidation-ws-DU-PzW-_.js", "/assets/mdx-hW1uYjc1.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-BBryXlM_.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-DVV0zwmP.js", "imports": ["/assets/index-BFGhCX_U.js", "/assets/index-BCxBKsqT.js", "/assets/epic-video-GDpD7_Qt.js", "/assets/loading-Dk0n07O3.js", "/assets/nav-chevrons-CgbSMLeb.js", "/assets/revalidation-ws-DU-PzW-_.js", "/assets/mdx-hW1uYjc1.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-BBryXlM_.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-KgMLc41c.js", "imports": ["/assets/index-BFGhCX_U.js", "/assets/index-BCxBKsqT.js", "/assets/epic-video-GDpD7_Qt.js", "/assets/error-boundary-1-dmC941.js", "/assets/mdx-hW1uYjc1.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-BBryXlM_.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-jlCv3hv0.js", "imports": ["/assets/index-BFGhCX_U.js", "/assets/misc-BJtHv_Jh.js", "/assets/diff-assn_bSK.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-hW1uYjc1.js", "/assets/epic-video-GDpD7_Qt.js", "/assets/index-_J-F_Dnc.js", "/assets/request-info-DCIQLE6H.js", "/assets/pe-ChIwTk8v.js", "/assets/loading-Dk0n07O3.js", "/assets/user-BBryXlM_.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-DCuSqnkZ.js", "imports": ["/assets/index-BFGhCX_U.js", "/assets/button-DQ001ob0.js", "/assets/epic-video-GDpD7_Qt.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-BBryXlM_.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-3338a6ab.js", "version": "3338a6ab" };
11255
+ 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-DvQmiuTm.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-AF5-S38o.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-DbdZ0Vhg.js", "imports": ["/assets/index-BFGhCX_U.js", "/assets/button-DQ001ob0.js", "/assets/misc-BJtHv_Jh.js", "/assets/tooltip-BgynKV2c.js", "/assets/user-AF5-S38o.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-arMqZKbH.js", "imports": ["/assets/discord-DGeGrHNb.js", "/assets/index-BFGhCX_U.js", "/assets/misc-BJtHv_Jh.js", "/assets/components-9EGYHTc_.js", "/assets/user-AF5-S38o.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-Byb05FGg.js", "imports": ["/assets/index-BFGhCX_U.js", "/assets/index-BCxBKsqT.js", "/assets/epic-video-Dw5Vkxid.js", "/assets/revalidation-ws-DU-PzW-_.js", "/assets/mdx-C01HZJEv.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-AF5-S38o.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-BwDoP7Kv.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-C01HZJEv.js", "/assets/progress-DAB3nDa2.js", "/assets/set-playground-S_rIwJAa.js", "/assets/seo-pBpFCWsy.js", "/assets/misc-BJtHv_Jh.js", "/assets/epic-video-Dw5Vkxid.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-AF5-S38o.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-D-V8b9oA.js", "imports": ["/assets/index-BFGhCX_U.js", "/assets/tooltip-BgynKV2c.js", "/assets/index-BuA_RWlU.js", "/assets/misc-BJtHv_Jh.js", "/assets/diff-CzHloS9Q.js", "/assets/error-boundary-1-dmC941.js", "/assets/loading-Dk0n07O3.js", "/assets/discord-DGeGrHNb.js", "/assets/components-9EGYHTc_.js", "/assets/index-DRH72MzK.js", "/assets/set-playground-S_rIwJAa.js", "/assets/tests-Cmesc4Yz.js", "/assets/preview-CW_12I0i.js", "/assets/index-BuoaxPEj.js", "/assets/accordion-DC885Li1.js", "/assets/mdx-C01HZJEv.js", "/assets/epic-video-Dw5Vkxid.js", "/assets/index-_J-F_Dnc.js", "/assets/request-info-DCIQLE6H.js", "/assets/pe-ChIwTk8v.js", "/assets/user-AF5-S38o.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-D_qZ9Wu9.js", "imports": ["/assets/index-BFGhCX_U.js", "/assets/tests-Cmesc4Yz.js", "/assets/components-9EGYHTc_.js", "/assets/epic-video-Dw5Vkxid.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-AF5-S38o.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-DUqyxjV2.js", "imports": ["/assets/index-BFGhCX_U.js", "/assets/index-BCxBKsqT.js", "/assets/epic-video-Dw5Vkxid.js", "/assets/loading-Dk0n07O3.js", "/assets/nav-chevrons-CgbSMLeb.js", "/assets/revalidation-ws-DU-PzW-_.js", "/assets/mdx-C01HZJEv.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-AF5-S38o.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-DbOxW5dc.js", "imports": ["/assets/index-BFGhCX_U.js", "/assets/index-BCxBKsqT.js", "/assets/epic-video-Dw5Vkxid.js", "/assets/loading-Dk0n07O3.js", "/assets/nav-chevrons-CgbSMLeb.js", "/assets/revalidation-ws-DU-PzW-_.js", "/assets/mdx-C01HZJEv.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-AF5-S38o.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-Bfqa72Xl.js", "imports": ["/assets/index-BFGhCX_U.js", "/assets/index-BCxBKsqT.js", "/assets/epic-video-Dw5Vkxid.js", "/assets/error-boundary-1-dmC941.js", "/assets/mdx-C01HZJEv.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-AF5-S38o.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-Cmd66hnY.js", "imports": ["/assets/index-BFGhCX_U.js", "/assets/misc-BJtHv_Jh.js", "/assets/diff-CzHloS9Q.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-C01HZJEv.js", "/assets/epic-video-Dw5Vkxid.js", "/assets/index-_J-F_Dnc.js", "/assets/request-info-DCIQLE6H.js", "/assets/pe-ChIwTk8v.js", "/assets/loading-Dk0n07O3.js", "/assets/user-AF5-S38o.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-Dk74xvlh.js", "imports": ["/assets/index-BFGhCX_U.js", "/assets/button-DQ001ob0.js", "/assets/epic-video-Dw5Vkxid.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-AF5-S38o.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-0d355395.js", "version": "0d355395" };
11120
11256
  const mode = "production";
11121
11257
  const assetsBuildDirectory = "build/client";
11122
11258
  const basename = "/";
11123
- const future = { "v3_fetcherPersist": true, "v3_relativeSplatPath": true, "v3_throwAbortReason": true, "unstable_singleFetch": false, "unstable_lazyRouteDiscovery": true, "unstable_optimizeDeps": true };
11259
+ const future = { "v3_fetcherPersist": true, "v3_relativeSplatPath": true, "v3_throwAbortReason": true, "unstable_singleFetch": true, "unstable_lazyRouteDiscovery": true, "unstable_optimizeDeps": true };
11124
11260
  const isSpaMode = false;
11125
11261
  const publicPath = "/";
11126
11262
  const entry = { module: entryServer };