@epic-web/workshop-app 4.21.1 → 4.22.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.
@@ -360,7 +360,9 @@ const AuthInfoSchema = z$1.object({
360
360
  name: z$1.string().nullable().optional()
361
361
  }).transform((d) => ({ ...d, id: md5(d.email) }));
362
362
  const DataSchema = z$1.object({
363
- onboarding: z$1.object({ finishedTourVideo: z$1.boolean() }).optional().default({ finishedTourVideo: false }),
363
+ onboarding: z$1.object({
364
+ tourVideosWatched: z$1.array(z$1.string()).default([])
365
+ }).passthrough().optional().default({ tourVideosWatched: [] }),
364
366
  preferences: z$1.object({
365
367
  player: PlayerPreferencesSchema,
366
368
  presence: PresencePreferencesSchema
@@ -495,11 +497,17 @@ async function readOnboardingData() {
495
497
  const data = await readDb();
496
498
  return (data == null ? void 0 : data.onboarding) ?? null;
497
499
  }
498
- async function updateOnboardingData(onboardingData) {
500
+ async function markOnboardingVideoWatched(videoUrl) {
499
501
  const data = await readDb();
500
502
  const updatedData = {
501
503
  ...data,
502
- onboarding: { ...data == null ? void 0 : data.onboarding, ...onboardingData }
504
+ onboarding: {
505
+ ...data == null ? void 0 : data.onboarding,
506
+ tourVideosWatched: [
507
+ ...(data == null ? void 0 : data.onboarding.tourVideosWatched) ?? [],
508
+ videoUrl
509
+ ].filter(Boolean)
510
+ }
503
511
  };
504
512
  await fsExtra.ensureDir(appDir);
505
513
  await fsExtra.writeJSON(dbPath, updatedData);
@@ -1155,6 +1163,191 @@ async function queuedBundleMDX(...args) {
1155
1163
  const result = await queue.add(() => bundleMDX(...args));
1156
1164
  return result;
1157
1165
  }
1166
+ const workshopRoot$1 = process.env.EPICSHOP_CONTEXT_CWD ?? process.cwd();
1167
+ const StackBlitzConfigSchema = z$1.object({
1168
+ // we default this to `${exerciseTitle} (${type})`
1169
+ title: z$1.string().optional(),
1170
+ // stackblitz defaults this to dev automatically
1171
+ startScript: z$1.string().optional(),
1172
+ // if no value is provided, then stackblitz defaults this to whatever
1173
+ // looks best based on the width of the screen
1174
+ view: z$1.union([z$1.literal("editor"), z$1.literal("preview"), z$1.literal("both")]).optional(),
1175
+ file: z$1.string().optional()
1176
+ });
1177
+ const InstructorSchema = z$1.object({
1178
+ name: z$1.string().optional(),
1179
+ avatar: z$1.string().optional(),
1180
+ "𝕏": z$1.string().optional(),
1181
+ xHandle: z$1.string().optional()
1182
+ });
1183
+ const WorkshopConfigSchema = z$1.object({
1184
+ title: z$1.string(),
1185
+ subtitle: z$1.string().optional(),
1186
+ instructor: InstructorSchema.optional(),
1187
+ epicWorkshopHost: z$1.string().default("www.epicweb.dev"),
1188
+ epicWorkshopSlug: z$1.string().optional(),
1189
+ onboardingVideo: z$1.string().default(
1190
+ "https://www.epicweb.dev/tips/get-started-with-the-epic-workshop-app"
1191
+ ),
1192
+ githubRepo: z$1.string(),
1193
+ githubRoot: z$1.string(),
1194
+ stackBlitzConfig: StackBlitzConfigSchema.optional(),
1195
+ forms: z$1.object({
1196
+ workshop: z$1.string().default(
1197
+ "https://docs.google.com/forms/d/e/1FAIpQLSdRmj9p8-5zyoqRzxp3UpqSbC3aFkweXvvJIKes0a5s894gzg/viewform?hl=en&embedded=true&entry.2123647600={workshopTitle}"
1198
+ ),
1199
+ exercise: z$1.string().default(
1200
+ "https://docs.google.com/forms/d/e/1FAIpQLSf3o9xyjQepTlOTH5Z7ZwkeSTdXh6YWI_RGc9KiyD3oUN0p6w/viewform?hl=en&embedded=true&entry.1836176234={workshopTitle}&entry.428900931={exerciseTitle}"
1201
+ )
1202
+ }).default({}),
1203
+ testTab: z$1.object({
1204
+ enabled: z$1.boolean().default(true)
1205
+ }).default({}),
1206
+ scripts: z$1.object({
1207
+ postupdate: z$1.string().optional()
1208
+ }).optional(),
1209
+ initialRoute: z$1.string().optional().default("/")
1210
+ // Add this line
1211
+ });
1212
+ let cachedConfig = null;
1213
+ function bustWorkshopConfigCache() {
1214
+ cachedConfig = null;
1215
+ }
1216
+ function getWorkshopConfig() {
1217
+ if (cachedConfig) return cachedConfig;
1218
+ const packageJsonPath = path$1.join(workshopRoot$1, "package.json");
1219
+ let packageJson;
1220
+ try {
1221
+ const packageJsonContent = fs.readFileSync(packageJsonPath, "utf8");
1222
+ packageJson = JSON.parse(packageJsonContent);
1223
+ } catch (error) {
1224
+ console.error(`Error reading or parsing package.json:`, error);
1225
+ if (error instanceof Error && error.message.includes("ENOENT")) {
1226
+ throw new Error(
1227
+ `package.json not found at ${packageJsonPath}. Please ensure you're running the command from the correct directory.`
1228
+ );
1229
+ } else if (error instanceof SyntaxError) {
1230
+ throw new Error(
1231
+ `Invalid JSON in package.json at ${packageJsonPath}. Please check the file for syntax errors.`
1232
+ );
1233
+ }
1234
+ throw new Error(
1235
+ `Could not find and parse package.json at ${packageJsonPath}`
1236
+ );
1237
+ }
1238
+ const epicshopConfig = packageJson.epicshop || {};
1239
+ if (epicshopConfig.githubRepo) {
1240
+ epicshopConfig.githubRoot = `${epicshopConfig.githubRepo.replace(/\/$/, "")}/tree/main`;
1241
+ } else if (epicshopConfig.githubRoot) {
1242
+ epicshopConfig.githubRepo = epicshopConfig.githubRoot.replace(
1243
+ /\/(blob|tree)\/.*$/,
1244
+ ""
1245
+ );
1246
+ epicshopConfig.githubRoot = `${epicshopConfig.githubRepo}/tree/main`;
1247
+ } else {
1248
+ throw new Error(
1249
+ "Either githubRepo or githubRoot is required in the epicshop configuration"
1250
+ );
1251
+ }
1252
+ try {
1253
+ const parsedConfig = WorkshopConfigSchema.parse(epicshopConfig);
1254
+ cachedConfig = parsedConfig;
1255
+ return parsedConfig;
1256
+ } catch (error) {
1257
+ if (error instanceof z$1.ZodError) {
1258
+ const flattenedErrors = error.flatten();
1259
+ const errorMessages = Object.entries(flattenedErrors.fieldErrors).map(([field, errors]) => `${field}: ${errors == null ? void 0 : errors.join(", ")}`).concat(flattenedErrors.formErrors);
1260
+ throw new Error(
1261
+ `Invalid epicshop configuration in ${packageJsonPath}:
1262
+ ${errorMessages.join("\n")}`
1263
+ );
1264
+ }
1265
+ throw error;
1266
+ }
1267
+ }
1268
+ async function getStackBlitzUrl({
1269
+ fullPath,
1270
+ title,
1271
+ type
1272
+ }) {
1273
+ var _a2;
1274
+ const workshopConfig = getWorkshopConfig();
1275
+ const appConfig = await getAppConfig(fullPath);
1276
+ if (appConfig.stackBlitzConfig === null) return null;
1277
+ let githubRootUrlString = workshopConfig.githubRepo;
1278
+ const githubRootUrl = new URL(
1279
+ githubRootUrlString.replace(/\/blob\//, "/tree/")
1280
+ );
1281
+ const githubPart = githubRootUrl.pathname;
1282
+ const stackBlitzConfig = {
1283
+ ...appConfig.stackBlitzConfig,
1284
+ title: ((_a2 = appConfig.stackBlitzConfig) == null ? void 0 : _a2.title) ?? `${title} (${type})`
1285
+ };
1286
+ const params = new URLSearchParams(stackBlitzConfig);
1287
+ const relativePath = fullPath.replace(`${workshopRoot$1}${path$1.sep}`, "");
1288
+ const stackBlitzUrl = new URL(
1289
+ `/github${githubPart}/${relativePath}?${params}`,
1290
+ "https://stackblitz.com"
1291
+ );
1292
+ return stackBlitzUrl.toString();
1293
+ }
1294
+ async function getAppConfig(fullPath) {
1295
+ var _a2, _b;
1296
+ const workshopConfig = getWorkshopConfig();
1297
+ let epicshopConfig = {};
1298
+ let scripts = {};
1299
+ const packageJsonPath = path$1.join(fullPath, "package.json");
1300
+ const packageJsonExists = await fs.promises.access(packageJsonPath, fs.constants.F_OK).then(() => true).catch(() => false);
1301
+ if (packageJsonExists) {
1302
+ const pkg = JSON.parse(
1303
+ await fs.promises.readFile(path$1.join(fullPath, "package.json"), "utf8")
1304
+ );
1305
+ epicshopConfig = pkg.epicshop ?? {};
1306
+ scripts = pkg.scripts ?? {};
1307
+ }
1308
+ const AppConfigSchema = z$1.object({
1309
+ stackBlitzConfig: StackBlitzConfigSchema.nullable().optional().transform((appStackBlitzConfig) => {
1310
+ if (!appStackBlitzConfig) return workshopConfig.stackBlitzConfig ?? null;
1311
+ if (!workshopConfig.stackBlitzConfig) return appStackBlitzConfig;
1312
+ return {
1313
+ ...workshopConfig.stackBlitzConfig,
1314
+ ...appStackBlitzConfig
1315
+ };
1316
+ }),
1317
+ testTab: z$1.object({
1318
+ enabled: z$1.boolean().optional().default(((_a2 = workshopConfig.testTab) == null ? void 0 : _a2.enabled) ?? true)
1319
+ }).default({}),
1320
+ scripts: z$1.object({
1321
+ test: z$1.string().optional(),
1322
+ dev: z$1.string().optional()
1323
+ }).default({}),
1324
+ initialRoute: z$1.string().optional().default(workshopConfig.initialRoute)
1325
+ });
1326
+ const appConfig = {
1327
+ stackBlitzConfig: epicshopConfig.stackBlitzConfig,
1328
+ testTab: {
1329
+ enabled: (_b = epicshopConfig.testTab) == null ? void 0 : _b.enabled
1330
+ },
1331
+ scripts: {
1332
+ test: scripts.test,
1333
+ dev: scripts.dev
1334
+ },
1335
+ initialRoute: epicshopConfig.initialRoute
1336
+ };
1337
+ try {
1338
+ return AppConfigSchema.parse(appConfig);
1339
+ } catch (error) {
1340
+ if (error instanceof z$1.ZodError) {
1341
+ const flattenedErrors = error.flatten();
1342
+ const errorMessages = Object.entries(flattenedErrors.fieldErrors).map(([field, errors]) => `${field}: ${errors == null ? void 0 : errors.join(", ")}`).concat(flattenedErrors.formErrors);
1343
+ throw new Error(
1344
+ `Invalid app configuration for ${fullPath}:
1345
+ ${errorMessages.join("\n")}`
1346
+ );
1347
+ }
1348
+ throw error;
1349
+ }
1350
+ }
1158
1351
  const schema = z$1.object({
1159
1352
  NODE_ENV: z$1.enum(["production", "development", "test"]).default("development"),
1160
1353
  EPICSHOP_GITHUB_REPO: z$1.string(),
@@ -1437,43 +1630,8 @@ async function waitForPortToBeAvailable(port2) {
1437
1630
  console.error("Timed out waiting for the port to become available");
1438
1631
  }
1439
1632
  }
1440
- const PkgSchema = z$1.object({}).passthrough();
1441
- async function getPkgProp(fullPath, prop, defaultValue) {
1442
- let pkg;
1443
- try {
1444
- pkg = PkgSchema.parse(
1445
- JSON.parse(
1446
- fs.readFileSync(path$1.join(fullPath, "package.json")).toString()
1447
- )
1448
- );
1449
- } catch (error) {
1450
- throw new Error(`Could not parse package.json of ${fullPath}`, {
1451
- cause: error
1452
- });
1453
- }
1454
- const propPath = prop.split(".");
1455
- let value = pkg;
1456
- for (const p of propPath) {
1457
- value = value[p];
1458
- if (value === void 0) break;
1459
- }
1460
- if (value === void 0 && defaultValue === void 0) {
1461
- throw new Error(
1462
- `Could not find required property ${prop} in package.json of ${fullPath}`
1463
- );
1464
- }
1465
- return value ?? defaultValue;
1466
- }
1467
1633
  let initialized = false;
1468
1634
  const workshopRoot = process.env.EPICSHOP_CONTEXT_CWD = process.env.EPICSHOP_CONTEXT_CWD ?? process.cwd();
1469
- let packageJson;
1470
- try {
1471
- packageJson = JSON.parse(
1472
- fs.readFileSync(path$1.join(workshopRoot, "package.json"), "utf8")
1473
- );
1474
- } catch {
1475
- throw new Error(`Could not find and parse package.json at ${workshopRoot}`);
1476
- }
1477
1635
  const playgroundAppNameInfoPath = path$1.join(
1478
1636
  workshopRoot,
1479
1637
  "node_modules",
@@ -1481,16 +1639,6 @@ const playgroundAppNameInfoPath = path$1.join(
1481
1639
  "epicshop",
1482
1640
  "playground.json"
1483
1641
  );
1484
- const StackBlitzConfigSchema = z$1.object({
1485
- // we default this to `${exerciseTitle} (${type})`
1486
- title: z$1.string().optional(),
1487
- // stackblitz defaults this to dev automatically
1488
- startScript: z$1.string().optional(),
1489
- // if no value is provided, then stackblitz defaults this to whatever
1490
- // looks best based on the width of the screen
1491
- view: z$1.union([z$1.literal("editor"), z$1.literal("preview"), z$1.literal("both")]).optional(),
1492
- file: z$1.string().optional()
1493
- });
1494
1642
  const BaseAppSchema = z$1.object({
1495
1643
  /** a unique identifier for the app */
1496
1644
  name: z$1.string(),
@@ -1618,34 +1766,15 @@ function init() {
1618
1766
  var _a2;
1619
1767
  if (initialized) return;
1620
1768
  initialized = true;
1621
- try {
1622
- const { epicshop } = packageJson;
1623
- let root, repo;
1624
- if (epicshop.githubRepo) {
1625
- repo = epicshop.githubRepo;
1626
- root = `${repo.replace(/\/$/, "")}/tree/main`;
1627
- } else if (epicshop.githubRoot) {
1628
- root = epicshop.githubRoot.replace(/\/$/, "");
1629
- repo = root.replace(/\/(blob|tree)\/.*$/, "");
1630
- } else {
1631
- throw new Error(
1632
- `Please set the URL of your GitHub repo in the "epicshop.githubRepo" property of the package.json.`
1633
- );
1634
- }
1635
- if (!root.includes("/blob/") && !root.includes("/tree/")) {
1636
- root = `${root.replace(/\/$/, "")}/tree/main`;
1637
- }
1638
- process.env.EPICSHOP_GITHUB_REPO = repo;
1639
- process.env.EPICSHOP_GITHUB_ROOT = root;
1640
- } catch (error) {
1641
- throw new Error(
1642
- `Could not set the EPICSHOP_GITHUB_ROOT environment variable. Please set it to the URL of your GitHub repo in the "epicshop.githubRoot" property of the package.json.`,
1643
- { cause: error }
1644
- );
1645
- }
1769
+ const config = getWorkshopConfig();
1770
+ process.env.EPICSHOP_GITHUB_REPO = config.githubRepo;
1771
+ process.env.EPICSHOP_GITHUB_ROOT = config.githubRoot;
1646
1772
  init$1();
1647
1773
  global.ENV = getEnv();
1648
1774
  async function handleFileChanges(event, filePath) {
1775
+ if (filePath === path$1.join(workshopRoot, "package.json")) {
1776
+ bustWorkshopConfigCache();
1777
+ }
1649
1778
  const apps = await getApps();
1650
1779
  for (const app of apps) {
1651
1780
  if (filePath.startsWith(app.fullPath)) {
@@ -1979,16 +2108,11 @@ async function findProblemDir({
1979
2108
  async function getTestInfo({
1980
2109
  fullPath
1981
2110
  }) {
1982
- const hasPkgJson = await exists(path$1.join(fullPath, "package.json"));
1983
- const testsEnabledLocally = hasPkgJson ? await getPkgProp(fullPath, "epicshop.testTab.enabled", true) : true;
1984
- if (testsEnabledLocally === false) return { type: "none" };
1985
- const testsEnabledGlobally = await getPkgProp(
1986
- workshopRoot,
1987
- "epicshop.testTab.enabled",
1988
- true
1989
- );
1990
- if (testsEnabledGlobally === false) return { type: "none" };
1991
- const testScript = hasPkgJson ? await getPkgProp(fullPath, "epicshop.scripts.test", "") : null;
2111
+ const {
2112
+ testTab: { enabled },
2113
+ scripts: { test: testScript }
2114
+ } = await getAppConfig(fullPath);
2115
+ if (enabled === false) return { type: "none" };
1992
2116
  if (testScript) {
1993
2117
  return { type: "script", script: testScript };
1994
2118
  }
@@ -2008,10 +2132,12 @@ async function getDevInfo({
2008
2132
  fullPath,
2009
2133
  portNumber
2010
2134
  }) {
2011
- const hasPkgJson = await exists(path$1.join(fullPath, "package.json"));
2012
- const hasDevScript = hasPkgJson ? Boolean(await getPkgProp(fullPath, "scripts.dev", "")) : false;
2135
+ const {
2136
+ scripts: { dev: devScript },
2137
+ initialRoute
2138
+ } = await getAppConfig(fullPath);
2139
+ const hasDevScript = Boolean(devScript);
2013
2140
  if (hasDevScript) {
2014
- const initialRoute = (hasPkgJson ? await getPkgProp(fullPath, "epicshop.initialRoute", "") : "") || await getPkgProp(workshopRoot, "epicshop.initialRoute", "/");
2015
2141
  return { type: "script", portNumber, initialRoute };
2016
2142
  }
2017
2143
  const indexFiles = (await fsExtra.readdir(fullPath)).filter(
@@ -2023,46 +2149,6 @@ async function getDevInfo({
2023
2149
  return { type: "none" };
2024
2150
  }
2025
2151
  }
2026
- async function getStackBlitzUrl({
2027
- fullPath,
2028
- title,
2029
- type
2030
- }) {
2031
- const Schema = StackBlitzConfigSchema.nullable().optional();
2032
- const appStackBlitzConfig = Schema.parse(
2033
- // if there's no package.json this will throw. If that's the case, we can't use stackblitz
2034
- // https://discord.com/channels/364486390102097930/1260979618240790578
2035
- await getPkgProp(fullPath, "epicshop.stackBlitzConfig", {}).catch(
2036
- () => null
2037
- )
2038
- );
2039
- if (appStackBlitzConfig === null) return null;
2040
- const workshopStackBlitzConfig = Schema.parse(
2041
- await getPkgProp(workshopRoot, "epicshop.stackBlitzConfig", {})
2042
- );
2043
- if (workshopStackBlitzConfig === null) return null;
2044
- let githubRootUrlString = ENV.EPICSHOP_GITHUB_REPO;
2045
- if (!githubRootUrlString) return null;
2046
- if (!githubRootUrlString.includes("/blob/") || !githubRootUrlString.includes("/tree/")) {
2047
- githubRootUrlString = `${githubRootUrlString.replace(/\/$/, "")}/blob/main`;
2048
- }
2049
- const githubRootUrl = new URL(
2050
- githubRootUrlString.replace(/\/blob\//, "/tree/")
2051
- );
2052
- const githubPart = githubRootUrl.pathname;
2053
- const config = {
2054
- ...workshopStackBlitzConfig,
2055
- ...appStackBlitzConfig,
2056
- title: (appStackBlitzConfig == null ? void 0 : appStackBlitzConfig.title) ?? `${title} (${type})`
2057
- };
2058
- const params = new URLSearchParams(config);
2059
- const relativePath = fullPath.replace(`${workshopRoot}${path$1.sep}`, "");
2060
- const stackBlitzUrl = new URL(
2061
- `/github${githubPart}/${relativePath}?${params}`,
2062
- "https://stackblitz.com"
2063
- );
2064
- return stackBlitzUrl.toString();
2065
- }
2066
2152
  async function getPlaygroundApp({
2067
2153
  timings,
2068
2154
  request
@@ -2560,47 +2646,6 @@ function getAppDisplayName(a, allApps) {
2560
2646
  }
2561
2647
  return displayName;
2562
2648
  }
2563
- async function getWorkshopTitle() {
2564
- const title = await getPkgProp(workshopRoot, "epicshop.title");
2565
- if (!title) {
2566
- throw new Error(
2567
- `Workshop title not found. Make sure the root of the workshop has "epicshop" with a "title" property in the package.json. ${workshopRoot}`
2568
- );
2569
- }
2570
- return title;
2571
- }
2572
- async function getWorkshopSubtitle() {
2573
- return await getPkgProp(workshopRoot, "epicshop.subtitle", "");
2574
- }
2575
- async function getWorkshopInstructor() {
2576
- const InstructorSchema = z$1.object({
2577
- name: z$1.string().optional(),
2578
- avatar: z$1.string().optional(),
2579
- "𝕏": z$1.string().optional(),
2580
- // alias because 𝕏 is hard to type 😅
2581
- xHandle: z$1.string().optional()
2582
- }).optional();
2583
- const instructor = InstructorSchema.parse(
2584
- await getPkgProp(workshopRoot, "epicshop.instructor")
2585
- );
2586
- return instructor ? { ...instructor, "𝕏": instructor.xHandle } : void 0;
2587
- }
2588
- async function getEpicWorkshopHost() {
2589
- const epicWorkshopHost = await getPkgProp(
2590
- workshopRoot,
2591
- "epicshop.epicWorkshopHost",
2592
- "www.epicweb.dev"
2593
- );
2594
- return epicWorkshopHost;
2595
- }
2596
- async function getEpicWorkshopSlug() {
2597
- const epicWorkshopSlug = await getPkgProp(
2598
- workshopRoot,
2599
- "epicshop.epicWorkshopSlug",
2600
- ""
2601
- );
2602
- return epicWorkshopSlug || null;
2603
- }
2604
2649
  async function getWorkshopInstructions({
2605
2650
  request
2606
2651
  } = {}) {
@@ -3471,7 +3516,7 @@ async function getEpicProgress({
3471
3516
  } = {}) {
3472
3517
  if (ENV.EPICSHOP_DEPLOYED) return [];
3473
3518
  const authInfo = await getAuthInfo();
3474
- const epicWorkshopHost = await getEpicWorkshopHost();
3519
+ const { epicWorkshopHost } = getWorkshopConfig();
3475
3520
  if (!authInfo) return [];
3476
3521
  const tokenPart = md5(authInfo.tokenSet.access_token);
3477
3522
  const EpicProgressSchema = z$1.array(
@@ -3514,7 +3559,7 @@ async function getProgress({
3514
3559
  if (ENV.EPICSHOP_DEPLOYED) return [];
3515
3560
  const authInfo = await getAuthInfo();
3516
3561
  if (!authInfo) return [];
3517
- const epicWorkshopSlug = await getEpicWorkshopSlug();
3562
+ const { epicWorkshopSlug } = getWorkshopConfig();
3518
3563
  if (!epicWorkshopSlug) return [];
3519
3564
  const [
3520
3565
  workshopData,
@@ -3613,7 +3658,7 @@ async function updateProgress({ lessonSlug, complete }, {
3613
3658
  if (!authInfo) {
3614
3659
  return { status: "error", error: "not authenticated" };
3615
3660
  }
3616
- const epicWorkshopHost = await getEpicWorkshopHost();
3661
+ const { epicWorkshopHost } = getWorkshopConfig();
3617
3662
  const response = await fetch(`https://${epicWorkshopHost}/api/progress`, {
3618
3663
  method: "POST",
3619
3664
  headers: {
@@ -3651,7 +3696,7 @@ async function getWorkshopData(epicWorkshopSlug, {
3651
3696
  if (ENV.EPICSHOP_DEPLOYED) return { sections: [] };
3652
3697
  const authInfo = await getAuthInfo();
3653
3698
  if (!authInfo) return { sections: [] };
3654
- const epicWorkshopHost = await getEpicWorkshopHost();
3699
+ const { epicWorkshopHost } = getWorkshopConfig();
3655
3700
  return cachified({
3656
3701
  key: `epic-workshop-data:${epicWorkshopHost}:${epicWorkshopSlug}`,
3657
3702
  cache: fsCache,
@@ -3901,27 +3946,18 @@ const meta$5 = ({ data }) => {
3901
3946
  };
3902
3947
  async function loader$y({ request }) {
3903
3948
  const timings = makeTimings("rootLoader");
3949
+ const {
3950
+ title: workshopTitle,
3951
+ subtitle: workshopSubtitle,
3952
+ instructor,
3953
+ onboardingVideo
3954
+ } = getWorkshopConfig();
3904
3955
  const onboarding = await readOnboardingData();
3905
- if (!ENV.EPICSHOP_DEPLOYED && !(onboarding == null ? void 0 : onboarding.finishedTourVideo)) {
3956
+ if (!ENV.EPICSHOP_DEPLOYED && !(onboarding == null ? void 0 : onboarding.tourVideosWatched.includes(onboardingVideo))) {
3906
3957
  if (new URL(request.url).pathname !== "/onboarding") {
3907
3958
  throw redirect("/onboarding");
3908
3959
  }
3909
3960
  }
3910
- const workshopTitle = await time(() => getWorkshopTitle(), {
3911
- type: "getWorkshopTitle",
3912
- desc: "getWorkshopTitle in root",
3913
- timings
3914
- });
3915
- const workshopSubtitle = await time(() => getWorkshopSubtitle(), {
3916
- type: "getWorkshopSubtitle",
3917
- desc: "getWorkshopSubtitle in root",
3918
- timings
3919
- });
3920
- const instructor = await time(() => getWorkshopInstructor(), {
3921
- type: "getInstructor",
3922
- desc: "getInstructor in root",
3923
- timings
3924
- });
3925
3961
  const preferences = await getPreferences();
3926
3962
  const progress = await getProgress({ timings }).catch((e) => {
3927
3963
  console.error("Failed to get progress", e);
@@ -4555,9 +4591,9 @@ const route36 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePrope
4555
4591
  async function loader$w({ request }) {
4556
4592
  var _a2;
4557
4593
  const timings = makeTimings("appLayoutLoader");
4558
- const [exercises, workshopTitle, playgroundAppName] = await Promise.all([
4594
+ const { title: workshopTitle } = getWorkshopConfig();
4595
+ const [exercises, playgroundAppName] = await Promise.all([
4559
4596
  getExercises({ request, timings }),
4560
- getWorkshopTitle(),
4561
4597
  getPlaygroundAppName()
4562
4598
  ]);
4563
4599
  const playground = {
@@ -6235,7 +6271,7 @@ async function loader$q({ request, params }) {
6235
6271
  );
6236
6272
  }
6237
6273
  const appTitle = app.title;
6238
- const workshopTitle = await getWorkshopTitle();
6274
+ const { title: workshopTitle } = getWorkshopConfig();
6239
6275
  const baseAppTitle = isExerciseStepApp(baseApp) ? [
6240
6276
  `${baseApp.stepNumber.toString().padStart(2, "0")}. ${baseApp.title}`,
6241
6277
  `${baseApp.exerciseNumber.toString().padStart(2, "0")}. ${((_a2 = await getExercise(baseApp.exerciseNumber, { request, timings })) == null ? void 0 : _a2.title) ?? "Unknown"}`,
@@ -6374,7 +6410,7 @@ ${testScriptTag}`;
6374
6410
  );
6375
6411
  const indexCss = indexFiles.find((file) => file.endsWith("index.css"));
6376
6412
  const appTitle = app.title;
6377
- const workshopTitle = await getWorkshopTitle();
6413
+ const { title: workshopTitle } = getWorkshopConfig();
6378
6414
  const title = (isExerciseStepApp(app) ? [
6379
6415
  isProblemApp(app) ? "🧪💪" : isSolutionApp(app) ? "🧪🏁" : null,
6380
6416
  `${app.stepNumber.toString().padStart(2, "0")}. ${app.title}`,
@@ -8023,18 +8059,12 @@ const meta$4 = ({
8023
8059
  async function loader$n({ request, params }) {
8024
8060
  const timings = makeTimings("exerciseNumberLoader");
8025
8061
  invariantResponse(params.exerciseNumber, "exerciseNumber is required");
8026
- const [exercises, workshopTitle] = await Promise.all([
8027
- time(() => getExercises({ request, timings }), {
8028
- timings,
8029
- type: "getExercises",
8030
- desc: "getExercises in $exerciseNumber.tsx"
8031
- }),
8032
- time(() => getWorkshopTitle(), {
8033
- timings,
8034
- type: "getWorkshopTitle",
8035
- desc: "getWorkshopTitle in $exerciseNumber.tsx"
8036
- })
8037
- ]);
8062
+ const { title: workshopTitle } = getWorkshopConfig();
8063
+ const exercises = await time(() => getExercises({ request, timings }), {
8064
+ timings,
8065
+ type: "getExercises",
8066
+ desc: "getExercises in $exerciseNumber.tsx"
8067
+ });
8038
8068
  const exercise = exercises.find(
8039
8069
  (e) => e.exerciseNumber === Number(params.exerciseNumber)
8040
8070
  );
@@ -8172,10 +8202,8 @@ const route12 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePrope
8172
8202
  async function loader$m({ request, params }) {
8173
8203
  const timings = makeTimings("stepLoader");
8174
8204
  invariantResponse(params.exerciseNumber, "exerciseNumber is required");
8175
- const [exercises, workshopTitle] = await Promise.all([
8176
- getExercises({ request, timings }),
8177
- getWorkshopTitle()
8178
- ]);
8205
+ const exercises = await getExercises({ request, timings });
8206
+ const { title: workshopTitle } = getWorkshopConfig();
8179
8207
  const exercise = exercises.find(
8180
8208
  (e) => e.exerciseNumber === Number(params.exerciseNumber)
8181
8209
  );
@@ -8415,7 +8443,7 @@ async function copyUnignoredFiles(srcDir, destDir, ignoreList) {
8415
8443
  await cachified({
8416
8444
  key,
8417
8445
  cache: diffCodeCache,
8418
- forceFresh: getForceFreshForDir(srcDir, diffCodeCache.get(key)),
8446
+ forceFresh: getForceFreshForDir(diffCodeCache.get(key), srcDir),
8419
8447
  async getFreshValue() {
8420
8448
  const ig = ignore().add(ignoreList);
8421
8449
  await fsExtra.remove(destDir);
@@ -9335,7 +9363,7 @@ async function loader$l({ request, params }) {
9335
9363
  var _a2, _b;
9336
9364
  const timings = makeTimings("exerciseStepTypeLoader");
9337
9365
  const url = new URL(request.url);
9338
- const workshopTitle = await getWorkshopTitle();
9366
+ const { title: workshopTitle } = getWorkshopConfig();
9339
9367
  const cacheOptions = { request, timings };
9340
9368
  const exerciseStepApp = await requireExerciseApp(params, cacheOptions);
9341
9369
  const exercise = await requireExercise(
@@ -11816,13 +11844,9 @@ async function loader$f({ request, params }) {
11816
11844
  if (!exercise) {
11817
11845
  throw new Response("Not found", { status: 404 });
11818
11846
  }
11819
- const workshopTitle = await getWorkshopTitle();
11820
- const exerciseFormTemplate = await getPkgProp(
11821
- workshopRoot,
11822
- "epicshop.forms.exercise",
11823
- `https://docs.google.com/forms/d/e/1FAIpQLSf3o9xyjQepTlOTH5Z7ZwkeSTdXh6YWI_RGc9KiyD3oUN0p6w/viewform?hl=en&embedded=true&entry.1836176234={workshopTitle}&entry.428900931={exerciseTitle}`
11824
- );
11825
- const exerciseFormEmbedUrl = exerciseFormTemplate.replace("{workshopTitle}", encodeURIComponent(workshopTitle)).replace("{exerciseTitle}", encodeURIComponent(exercise.title));
11847
+ const workshopConfig = getWorkshopConfig();
11848
+ const exerciseFormTemplate = workshopConfig.forms.exercise;
11849
+ const exerciseFormEmbedUrl = exerciseFormTemplate.replace("{workshopTitle}", encodeURIComponent(workshopConfig.title)).replace("{exerciseTitle}", encodeURIComponent(exercise.title));
11826
11850
  const nextExercise = await getExercise(exercise.exerciseNumber + 1, {
11827
11851
  timings,
11828
11852
  request
@@ -11836,11 +11860,11 @@ async function loader$f({ request, params }) {
11836
11860
  const apps = await getApps({ request, timings });
11837
11861
  const exerciseApps = apps.filter(isExerciseStepApp).filter((app) => app.exerciseNumber === exercise.exerciseNumber);
11838
11862
  const prevApp = exerciseApps[exerciseApps.length - 1];
11839
- const articleId = `workshop-${slugify(workshopTitle)}-${exercise.exerciseNumber}-finished`;
11863
+ const articleId = `workshop-${slugify(workshopConfig.title)}-${exercise.exerciseNumber}-finished`;
11840
11864
  return defer(
11841
11865
  {
11842
11866
  articleId,
11843
- workshopTitle,
11867
+ workshopTitle: workshopConfig.title,
11844
11868
  exercise,
11845
11869
  exerciseFormEmbedUrl,
11846
11870
  epicVideoInfosPromise: getEpicVideoInfos(
@@ -12001,12 +12025,9 @@ async function loader$e({ request }) {
12001
12025
  desc: "compileMdx in finished"
12002
12026
  });
12003
12027
  const lastExercises = exercises[exercises.length - 1];
12004
- const workshopTitle = await getWorkshopTitle();
12005
- const workshopFormTemplate = await getPkgProp(
12006
- workshopRoot,
12007
- "epicshop.forms.workshop",
12008
- "https://docs.google.com/forms/d/e/1FAIpQLSdRmj9p8-5zyoqRzxp3UpqSbC3aFkweXvvJIKes0a5s894gzg/viewform?hl=en&embedded=true&entry.2123647600={workshopTitle}"
12009
- );
12028
+ const workshopConfig = getWorkshopConfig();
12029
+ const workshopTitle = workshopConfig.title;
12030
+ const workshopFormTemplate = workshopConfig.forms.workshop;
12010
12031
  const workshopFormEmbedUrl = workshopFormTemplate.replace(
12011
12032
  "{workshopTitle}",
12012
12033
  encodeURIComponent(workshopTitle)
@@ -12135,12 +12156,8 @@ const route20 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePrope
12135
12156
  }, Symbol.toStringTag, { value: "Module" }));
12136
12157
  async function loader$d({ request }) {
12137
12158
  const timings = makeTimings("indexLoader");
12138
- const [title, exercises, workshopReadme] = await Promise.all([
12139
- time(() => getWorkshopTitle(), {
12140
- timings,
12141
- type: "getWorkshopTitle",
12142
- desc: "getWorkshopTitle in index"
12143
- }),
12159
+ const { title } = getWorkshopConfig();
12160
+ const [exercises, workshopReadme] = await Promise.all([
12144
12161
  time(() => getExercises({ request, timings }), {
12145
12162
  timings,
12146
12163
  type: "getExercises",
@@ -12273,7 +12290,7 @@ const EVENTS = {
12273
12290
  const authEmitter = remember("authEmitter", () => new EventEmitter());
12274
12291
  authEmitter.removeAllListeners();
12275
12292
  async function registerDevice() {
12276
- const epicWorkshopHost = await getEpicWorkshopHost();
12293
+ const { epicWorkshopHost } = getWorkshopConfig();
12277
12294
  const { ISSUER = `https://${epicWorkshopHost}/oauth` } = process.env;
12278
12295
  const GRANT_TYPE = "urn:ietf:params:oauth:grant-type:device_code";
12279
12296
  try {
@@ -12591,7 +12608,7 @@ const meta = ({
12591
12608
  async function loader$a({ request }) {
12592
12609
  ensureUndeployed();
12593
12610
  const timings = makeTimings("adminLoader");
12594
- const workshopSlug = await getEpicWorkshopSlug() ?? "Unkown";
12611
+ const workshopSlug = getWorkshopConfig().epicWorkshopSlug ?? "Unkown";
12595
12612
  const apps = (await getApps({ request, timings })).filter(
12596
12613
  (a, i, ar) => ar.findIndex((b) => a.name === b.name) === i
12597
12614
  );
@@ -12940,17 +12957,17 @@ const HEIGHT = 630;
12940
12957
  async function loader$4({ request }) {
12941
12958
  const timings = makeTimings("og", "og image loader");
12942
12959
  const url = new URL(request.url);
12943
- const workshopTitle = await getWorkshopTitle();
12944
- const title = url.searchParams.get("title") || workshopTitle;
12945
- const subtitle = url.searchParams.get("subtitle") || await getWorkshopSubtitle();
12960
+ const workshopConfig = getWorkshopConfig();
12961
+ const title = url.searchParams.get("title") || workshopConfig.title;
12962
+ const subtitle = url.searchParams.get("subtitle") || workshopConfig.subtitle;
12946
12963
  const urlPathname = url.searchParams.get("urlPathname") || "";
12947
12964
  const element = /* @__PURE__ */ jsx(
12948
12965
  OgLayout,
12949
12966
  {
12950
12967
  request,
12951
- instructor: await getWorkshopInstructor(),
12968
+ instructor: workshopConfig.instructor,
12952
12969
  urlPathname,
12953
- workshopTitle: workshopTitle === title ? null : workshopTitle,
12970
+ workshopTitle: workshopConfig.title === title ? null : workshopConfig.title,
12954
12971
  children: /* @__PURE__ */ jsxs(
12955
12972
  "div",
12956
12973
  {
@@ -13339,10 +13356,10 @@ const handle = {
13339
13356
  };
13340
13357
  async function loader$3({ request }) {
13341
13358
  const timings = makeTimings("onboarding");
13342
- const tourUrl = "https://www.epicweb.dev/tips/get-started-with-the-epic-workshop-app";
13343
- const videoInfos = getEpicVideoInfos([tourUrl], { request, timings });
13359
+ const { onboardingVideo } = getWorkshopConfig();
13360
+ const videoInfos = getEpicVideoInfos([onboardingVideo], { request, timings });
13344
13361
  return defer(
13345
- { tourUrl, videoInfos },
13362
+ { onboardingVideo, videoInfos },
13346
13363
  { headers: { "Server-Timing": timings.toString() } }
13347
13364
  );
13348
13365
  }
@@ -13356,7 +13373,8 @@ async function action({ request }) {
13356
13373
  const data = await request.formData();
13357
13374
  const intent = data.get("intent");
13358
13375
  invariantResponse(intent === "complete", "Invalid intent");
13359
- await updateOnboardingData({ finishedTourVideo: true });
13376
+ const { onboardingVideo } = getWorkshopConfig();
13377
+ await markOnboardingVideoWatched(onboardingVideo);
13360
13378
  throw redirect("/account");
13361
13379
  }
13362
13380
  function Onboarding() {
@@ -13370,7 +13388,7 @@ function Onboarding() {
13370
13388
  /* @__PURE__ */ jsx("strong", { children: "you must watch the tour video" }),
13371
13389
  "! 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"
13372
13390
  ] }),
13373
- /* @__PURE__ */ jsx("div", { className: "w-[780px] max-w-full", children: /* @__PURE__ */ jsx(EpicVideoInfoProvider, { epicVideoInfosPromise: data.videoInfos, children: /* @__PURE__ */ jsx(DeferredEpicVideo, { url: data.tourUrl }) }) })
13391
+ /* @__PURE__ */ jsx("div", { className: "w-[780px] max-w-full", children: /* @__PURE__ */ jsx(EpicVideoInfoProvider, { epicVideoInfosPromise: data.videoInfos, children: /* @__PURE__ */ jsx(DeferredEpicVideo, { url: data.onboardingVideo }) }) })
13374
13392
  ] }),
13375
13393
  /* @__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!" }) })
13376
13394
  ] });
@@ -13427,7 +13445,7 @@ const route39 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePrope
13427
13445
  __proto__: null,
13428
13446
  loader
13429
13447
  }, Symbol.toStringTag, { value: "Module" }));
13430
- const serverManifest = { "entry": { "module": "/assets/entry.client-3M2p-8I3.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js"], "css": [] }, "routes": { "root": { "id": "root", "parentId": void 0, "path": "", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/root-Tcnfz99O.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/clsx-B-dksMZM.js", "/assets/misc-ENVX3CWf.js", "/assets/request-info-CEhUGODY.js", "/assets/tooltip-BiHTe_7F.js", "/assets/client-hints-DNUUFGmB.js", "/assets/use-hydrated-Citou692.js", "/assets/error-boundary-DDTvdkB4.js", "/assets/progress-bar-CSvo1ZXP.js", "/assets/index-B-hHvmeV.js", "/assets/index-BATSX33w.js", "/assets/presence-Cr--lRCr.js", "/assets/seo-pBpFCWsy.js"], "css": [] }, "routes/$": { "id": "routes/$", "parentId": "root", "path": "*", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/_-DbrWZazo.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/clsx-B-dksMZM.js", "/assets/components-CME-nGId.js", "/assets/misc-ENVX3CWf.js", "/assets/error-boundary-DDTvdkB4.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-AgYGL72C.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/clsx-B-dksMZM.js", "/assets/components-CME-nGId.js", "/assets/misc-ENVX3CWf.js", "/assets/tooltip-BiHTe_7F.js", "/assets/request-info-CEhUGODY.js", "/assets/client-hints-DNUUFGmB.js", "/assets/use-hydrated-Citou692.js", "/assets/index-BXWoOGxB.js", "/assets/user-D6tTg1yS.js", "/assets/presence-Cr--lRCr.js", "/assets/progress-BsY6hGPp.js", "/assets/index-BATSX33w.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-7o6O4ruO.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/clsx-B-dksMZM.js", "/assets/components-CME-nGId.js", "/assets/misc-ENVX3CWf.js", "/assets/request-info-CEhUGODY.js", "/assets/button-BklqyTPS.js", "/assets/tooltip-BiHTe_7F.js", "/assets/user-D6tTg1yS.js", "/assets/presence-Cr--lRCr.js"], "css": [] }, "routes/_app+/app.$appName+/$": { "id": "routes/_app+/app.$appName+/$", "parentId": "routes/_app+/_layout", "path": "app/:appName/*", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/app.$appName+/api.$": { "id": "routes/_app+/app.$appName+/api.$", "parentId": "routes/_app+/_layout", "path": "app/:appName/api/*", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/api._-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/app.$appName+/epic_ws[.js]": { "id": "routes/_app+/app.$appName+/epic_ws[.js]", "parentId": "routes/_app+/_layout", "path": "app/:appName/epic_ws.js", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/epic_ws_.js_-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/app.$appName+/index": { "id": "routes/_app+/app.$appName+/index", "parentId": "routes/_app+/_layout", "path": "app/:appName/", "index": true, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/index-K6Dvbx-E.js", "imports": [], "css": [] }, "routes/_app+/app.$appName+/test.$testName": { "id": "routes/_app+/app.$appName+/test.$testName", "parentId": "routes/_app+/_layout", "path": "app/:appName/test/:testName", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/test._testName-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/app.$appName+/test.epic_ws[.js]": { "id": "routes/_app+/app.$appName+/test.epic_ws[.js]", "parentId": "routes/_app+/_layout", "path": "app/:appName/test/epic_ws.js", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/test.epic_ws_.js_-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/discord": { "id": "routes/_app+/discord", "parentId": "routes/_app+/_layout", "path": "discord", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/discord-CHP4_JLJ.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/clsx-B-dksMZM.js", "/assets/components-CME-nGId.js", "/assets/misc-ENVX3CWf.js", "/assets/user-D6tTg1yS.js", "/assets/discord-Dq4e30wV.js"], "css": [] }, "routes/_app+/exercise+/_layout": { "id": "routes/_app+/exercise+/_layout", "parentId": "routes/_app+/_layout", "path": "exercise", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_layout-BUs3av-e.js", "imports": ["/assets/index-1cKOJFpX.js"], "css": [] }, "routes/_app+/exercise+/$exerciseNumber": { "id": "routes/_app+/exercise+/$exerciseNumber", "parentId": "routes/_app+/exercise+/_layout", "path": ":exerciseNumber", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/_exerciseNumber-Cq0nozYz.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/clsx-B-dksMZM.js", "/assets/misc-ENVX3CWf.js", "/assets/request-info-CEhUGODY.js", "/assets/tooltip-BiHTe_7F.js", "/assets/client-hints-DNUUFGmB.js", "/assets/index-BATSX33w.js", "/assets/loading-C5uX0jJw.js", "/assets/user-D6tTg1yS.js", "/assets/epic-video-iluUs1-s.js", "/assets/progress-bar-CSvo1ZXP.js", "/assets/index-Dx5GmdYq.js", "/assets/mdx-M0kcP-mP.js", "/assets/progress-BsY6hGPp.js", "/assets/seo-pBpFCWsy.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/exercise+/$exerciseNumber_.$stepNumber": { "id": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber", "parentId": "routes/_app+/exercise+/_layout", "path": ":exerciseNumber/:stepNumber", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/_exerciseNumber_._stepNumber-B5pmJ29o.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/clsx-B-dksMZM.js", "/assets/components-CME-nGId.js", "/assets/misc-ENVX3CWf.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-BocZ2xWF.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/clsx-B-dksMZM.js", "/assets/components-CME-nGId.js", "/assets/misc-ENVX3CWf.js", "/assets/request-info-CEhUGODY.js", "/assets/tooltip-BiHTe_7F.js", "/assets/client-hints-DNUUFGmB.js", "/assets/index-BATSX33w.js", "/assets/loading-C5uX0jJw.js", "/assets/user-D6tTg1yS.js", "/assets/epic-video-iluUs1-s.js", "/assets/progress-bar-CSvo1ZXP.js", "/assets/index-BXWoOGxB.js", "/assets/index-hogig2HK.js", "/assets/index-Dx5GmdYq.js", "/assets/error-boundary-DDTvdkB4.js", "/assets/nav-chevrons-B82nbdyj.js", "/assets/mdx-M0kcP-mP.js", "/assets/progress-BsY6hGPp.js", "/assets/set-playground-Cdy8VlVD.js", "/assets/seo-pBpFCWsy.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/app": { "id": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/app", "parentId": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout", "path": "app", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/app-BiWJY58g.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/clsx-B-dksMZM.js", "/assets/components-CME-nGId.js", "/assets/request-info-CEhUGODY.js", "/assets/client-hints-DNUUFGmB.js", "/assets/misc-ENVX3CWf.js", "/assets/tooltip-BiHTe_7F.js", "/assets/button-BklqyTPS.js", "/assets/loading-C5uX0jJw.js", "/assets/progress-bar-CSvo1ZXP.js", "/assets/index-BATSX33w.js", "/assets/preview-CqrRe2BV.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-Dm1ll1kT.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/clsx-B-dksMZM.js", "/assets/components-CME-nGId.js", "/assets/misc-ENVX3CWf.js", "/assets/tooltip-BiHTe_7F.js", "/assets/index-BXWoOGxB.js", "/assets/index-hogig2HK.js", "/assets/request-info-CEhUGODY.js", "/assets/client-hints-DNUUFGmB.js", "/assets/index-BATSX33w.js", "/assets/loading-C5uX0jJw.js", "/assets/user-D6tTg1yS.js", "/assets/epic-video-iluUs1-s.js", "/assets/progress-bar-CSvo1ZXP.js", "/assets/accordion-BroSqIct.js", "/assets/mdx-M0kcP-mP.js", "/assets/use-event-source-A_0lEOPX.js", "/assets/set-playground-Cdy8VlVD.js", "/assets/button-BklqyTPS.js", "/assets/diff-CpFxuKA2.js", "/assets/error-boundary-DDTvdkB4.js", "/assets/discord-Dq4e30wV.js", "/assets/index-B-hHvmeV.js", "/assets/tests-CmNNBElK.js", "/assets/preview-CqrRe2BV.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-D9HsTvpe.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/clsx-B-dksMZM.js", "/assets/components-CME-nGId.js", "/assets/misc-ENVX3CWf.js", "/assets/tooltip-BiHTe_7F.js", "/assets/index-BXWoOGxB.js", "/assets/index-hogig2HK.js", "/assets/request-info-CEhUGODY.js", "/assets/client-hints-DNUUFGmB.js", "/assets/progress-bar-CSvo1ZXP.js", "/assets/accordion-BroSqIct.js", "/assets/index-BATSX33w.js", "/assets/use-event-source-A_0lEOPX.js", "/assets/set-playground-Cdy8VlVD.js", "/assets/tests-CmNNBElK.js"], "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-Q9qnPuZX.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/clsx-B-dksMZM.js", "/assets/misc-ENVX3CWf.js", "/assets/request-info-CEhUGODY.js", "/assets/tooltip-BiHTe_7F.js", "/assets/client-hints-DNUUFGmB.js", "/assets/index-BATSX33w.js", "/assets/loading-C5uX0jJw.js", "/assets/user-D6tTg1yS.js", "/assets/epic-video-iluUs1-s.js", "/assets/progress-bar-CSvo1ZXP.js", "/assets/index-Dx5GmdYq.js", "/assets/nav-chevrons-B82nbdyj.js", "/assets/mdx-M0kcP-mP.js", "/assets/progress-BsY6hGPp.js", "/assets/seo-pBpFCWsy.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/finished": { "id": "routes/_app+/finished", "parentId": "routes/_app+/_layout", "path": "finished", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/finished-Bm-bCUU2.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/clsx-B-dksMZM.js", "/assets/misc-ENVX3CWf.js", "/assets/request-info-CEhUGODY.js", "/assets/tooltip-BiHTe_7F.js", "/assets/client-hints-DNUUFGmB.js", "/assets/index-BATSX33w.js", "/assets/loading-C5uX0jJw.js", "/assets/user-D6tTg1yS.js", "/assets/epic-video-iluUs1-s.js", "/assets/progress-bar-CSvo1ZXP.js", "/assets/index-Dx5GmdYq.js", "/assets/nav-chevrons-B82nbdyj.js", "/assets/mdx-M0kcP-mP.js", "/assets/seo-pBpFCWsy.js", "/assets/progress-BsY6hGPp.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-Tfdnz1AB.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/clsx-B-dksMZM.js", "/assets/misc-ENVX3CWf.js", "/assets/request-info-CEhUGODY.js", "/assets/tooltip-BiHTe_7F.js", "/assets/client-hints-DNUUFGmB.js", "/assets/index-BATSX33w.js", "/assets/loading-C5uX0jJw.js", "/assets/user-D6tTg1yS.js", "/assets/epic-video-iluUs1-s.js", "/assets/progress-bar-CSvo1ZXP.js", "/assets/index-Dx5GmdYq.js", "/assets/error-boundary-DDTvdkB4.js", "/assets/mdx-M0kcP-mP.js", "/assets/progress-BsY6hGPp.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-4cvVFzF8.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/clsx-B-dksMZM.js", "/assets/components-CME-nGId.js", "/assets/request-info-CEhUGODY.js", "/assets/client-hints-DNUUFGmB.js", "/assets/use-event-source-A_0lEOPX.js", "/assets/button-BklqyTPS.js", "/assets/loading-C5uX0jJw.js"], "css": [] }, "routes/_app+/support": { "id": "routes/_app+/support", "parentId": "routes/_app+/_layout", "path": "support", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/support-hcqGIpir.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js"], "css": [] }, "routes/admin+/_layout": { "id": "routes/admin+/_layout", "parentId": "root", "path": "admin", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_layout-C8uU4Hwj.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/clsx-B-dksMZM.js", "/assets/components-CME-nGId.js", "/assets/misc-ENVX3CWf.js", "/assets/tooltip-BiHTe_7F.js", "/assets/progress-BsY6hGPp.js"], "css": [] }, "routes/admin+/apps": { "id": "routes/admin+/apps", "parentId": "routes/admin+/_layout", "path": "apps", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/apps-DP2rzg_V.js", "imports": [], "css": [] }, "routes/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-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/diff": { "id": "routes/diff", "parentId": "root", "path": "diff", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/diff-Cw8ktQ1-.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/clsx-B-dksMZM.js", "/assets/components-CME-nGId.js", "/assets/misc-ENVX3CWf.js", "/assets/tooltip-BiHTe_7F.js", "/assets/index-BXWoOGxB.js", "/assets/index-hogig2HK.js", "/assets/request-info-CEhUGODY.js", "/assets/client-hints-DNUUFGmB.js", "/assets/index-BATSX33w.js", "/assets/loading-C5uX0jJw.js", "/assets/user-D6tTg1yS.js", "/assets/epic-video-iluUs1-s.js", "/assets/progress-bar-CSvo1ZXP.js", "/assets/accordion-BroSqIct.js", "/assets/mdx-M0kcP-mP.js", "/assets/diff-CpFxuKA2.js", "/assets/nav-chevrons-B82nbdyj.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-Bib-wh6d.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/clsx-B-dksMZM.js", "/assets/components-CME-nGId.js", "/assets/misc-ENVX3CWf.js", "/assets/request-info-CEhUGODY.js", "/assets/tooltip-BiHTe_7F.js", "/assets/client-hints-DNUUFGmB.js", "/assets/index-BATSX33w.js", "/assets/loading-C5uX0jJw.js", "/assets/user-D6tTg1yS.js", "/assets/button-BklqyTPS.js", "/assets/epic-video-iluUs1-s.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-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/update-mdx-cache": { "id": "routes/update-mdx-cache", "parentId": "root", "path": "update-mdx-cache", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/update-mdx-cache-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/video-player/index": { "id": "routes/video-player/index", "parentId": "root", "path": "video-player", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/index-DP2rzg_V.js", "imports": [], "css": [] } }, "url": "/assets/manifest-4bde8719.js", "version": "4bde8719" };
13448
+ const serverManifest = { "entry": { "module": "/assets/entry.client-3M2p-8I3.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js"], "css": [] }, "routes": { "root": { "id": "root", "parentId": void 0, "path": "", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/root-Tcnfz99O.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/clsx-B-dksMZM.js", "/assets/misc-ENVX3CWf.js", "/assets/request-info-CEhUGODY.js", "/assets/tooltip-BiHTe_7F.js", "/assets/client-hints-DNUUFGmB.js", "/assets/use-hydrated-Citou692.js", "/assets/error-boundary-DDTvdkB4.js", "/assets/progress-bar-CSvo1ZXP.js", "/assets/index-B-hHvmeV.js", "/assets/index-BATSX33w.js", "/assets/presence-Cr--lRCr.js", "/assets/seo-pBpFCWsy.js"], "css": [] }, "routes/$": { "id": "routes/$", "parentId": "root", "path": "*", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/_-DbrWZazo.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/clsx-B-dksMZM.js", "/assets/components-CME-nGId.js", "/assets/misc-ENVX3CWf.js", "/assets/error-boundary-DDTvdkB4.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-AgYGL72C.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/clsx-B-dksMZM.js", "/assets/components-CME-nGId.js", "/assets/misc-ENVX3CWf.js", "/assets/tooltip-BiHTe_7F.js", "/assets/request-info-CEhUGODY.js", "/assets/client-hints-DNUUFGmB.js", "/assets/use-hydrated-Citou692.js", "/assets/index-BXWoOGxB.js", "/assets/user-D6tTg1yS.js", "/assets/presence-Cr--lRCr.js", "/assets/progress-BsY6hGPp.js", "/assets/index-BATSX33w.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-7o6O4ruO.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/clsx-B-dksMZM.js", "/assets/components-CME-nGId.js", "/assets/misc-ENVX3CWf.js", "/assets/request-info-CEhUGODY.js", "/assets/button-BklqyTPS.js", "/assets/tooltip-BiHTe_7F.js", "/assets/user-D6tTg1yS.js", "/assets/presence-Cr--lRCr.js"], "css": [] }, "routes/_app+/app.$appName+/$": { "id": "routes/_app+/app.$appName+/$", "parentId": "routes/_app+/_layout", "path": "app/:appName/*", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/app.$appName+/api.$": { "id": "routes/_app+/app.$appName+/api.$", "parentId": "routes/_app+/_layout", "path": "app/:appName/api/*", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/api._-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/app.$appName+/epic_ws[.js]": { "id": "routes/_app+/app.$appName+/epic_ws[.js]", "parentId": "routes/_app+/_layout", "path": "app/:appName/epic_ws.js", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/epic_ws_.js_-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/app.$appName+/index": { "id": "routes/_app+/app.$appName+/index", "parentId": "routes/_app+/_layout", "path": "app/:appName/", "index": true, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/index-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/app.$appName+/test.$testName": { "id": "routes/_app+/app.$appName+/test.$testName", "parentId": "routes/_app+/_layout", "path": "app/:appName/test/:testName", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/test._testName-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/app.$appName+/test.epic_ws[.js]": { "id": "routes/_app+/app.$appName+/test.epic_ws[.js]", "parentId": "routes/_app+/_layout", "path": "app/:appName/test/epic_ws.js", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/test.epic_ws_.js_-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/discord": { "id": "routes/_app+/discord", "parentId": "routes/_app+/_layout", "path": "discord", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/discord-CHP4_JLJ.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/clsx-B-dksMZM.js", "/assets/components-CME-nGId.js", "/assets/misc-ENVX3CWf.js", "/assets/user-D6tTg1yS.js", "/assets/discord-Dq4e30wV.js"], "css": [] }, "routes/_app+/exercise+/_layout": { "id": "routes/_app+/exercise+/_layout", "parentId": "routes/_app+/_layout", "path": "exercise", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_layout-BUs3av-e.js", "imports": ["/assets/index-1cKOJFpX.js"], "css": [] }, "routes/_app+/exercise+/$exerciseNumber": { "id": "routes/_app+/exercise+/$exerciseNumber", "parentId": "routes/_app+/exercise+/_layout", "path": ":exerciseNumber", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/_exerciseNumber-Cq0nozYz.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/clsx-B-dksMZM.js", "/assets/misc-ENVX3CWf.js", "/assets/request-info-CEhUGODY.js", "/assets/tooltip-BiHTe_7F.js", "/assets/client-hints-DNUUFGmB.js", "/assets/index-BATSX33w.js", "/assets/loading-C5uX0jJw.js", "/assets/user-D6tTg1yS.js", "/assets/epic-video-iluUs1-s.js", "/assets/progress-bar-CSvo1ZXP.js", "/assets/index-Dx5GmdYq.js", "/assets/mdx-M0kcP-mP.js", "/assets/progress-BsY6hGPp.js", "/assets/seo-pBpFCWsy.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/exercise+/$exerciseNumber_.$stepNumber": { "id": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber", "parentId": "routes/_app+/exercise+/_layout", "path": ":exerciseNumber/:stepNumber", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/_exerciseNumber_._stepNumber-B5pmJ29o.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/clsx-B-dksMZM.js", "/assets/components-CME-nGId.js", "/assets/misc-ENVX3CWf.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-BocZ2xWF.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/clsx-B-dksMZM.js", "/assets/components-CME-nGId.js", "/assets/misc-ENVX3CWf.js", "/assets/request-info-CEhUGODY.js", "/assets/tooltip-BiHTe_7F.js", "/assets/client-hints-DNUUFGmB.js", "/assets/index-BATSX33w.js", "/assets/loading-C5uX0jJw.js", "/assets/user-D6tTg1yS.js", "/assets/epic-video-iluUs1-s.js", "/assets/progress-bar-CSvo1ZXP.js", "/assets/index-BXWoOGxB.js", "/assets/index-hogig2HK.js", "/assets/index-Dx5GmdYq.js", "/assets/error-boundary-DDTvdkB4.js", "/assets/nav-chevrons-B82nbdyj.js", "/assets/mdx-M0kcP-mP.js", "/assets/progress-BsY6hGPp.js", "/assets/set-playground-Cdy8VlVD.js", "/assets/seo-pBpFCWsy.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/app": { "id": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/app", "parentId": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout", "path": "app", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/app-BiWJY58g.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/clsx-B-dksMZM.js", "/assets/components-CME-nGId.js", "/assets/request-info-CEhUGODY.js", "/assets/client-hints-DNUUFGmB.js", "/assets/misc-ENVX3CWf.js", "/assets/tooltip-BiHTe_7F.js", "/assets/button-BklqyTPS.js", "/assets/loading-C5uX0jJw.js", "/assets/progress-bar-CSvo1ZXP.js", "/assets/index-BATSX33w.js", "/assets/preview-CqrRe2BV.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-Dm1ll1kT.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/clsx-B-dksMZM.js", "/assets/components-CME-nGId.js", "/assets/misc-ENVX3CWf.js", "/assets/tooltip-BiHTe_7F.js", "/assets/index-BXWoOGxB.js", "/assets/index-hogig2HK.js", "/assets/request-info-CEhUGODY.js", "/assets/client-hints-DNUUFGmB.js", "/assets/index-BATSX33w.js", "/assets/loading-C5uX0jJw.js", "/assets/user-D6tTg1yS.js", "/assets/epic-video-iluUs1-s.js", "/assets/progress-bar-CSvo1ZXP.js", "/assets/accordion-BroSqIct.js", "/assets/mdx-M0kcP-mP.js", "/assets/use-event-source-A_0lEOPX.js", "/assets/set-playground-Cdy8VlVD.js", "/assets/button-BklqyTPS.js", "/assets/diff-CpFxuKA2.js", "/assets/error-boundary-DDTvdkB4.js", "/assets/discord-Dq4e30wV.js", "/assets/index-B-hHvmeV.js", "/assets/tests-CmNNBElK.js", "/assets/preview-CqrRe2BV.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-D9HsTvpe.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/clsx-B-dksMZM.js", "/assets/components-CME-nGId.js", "/assets/misc-ENVX3CWf.js", "/assets/tooltip-BiHTe_7F.js", "/assets/index-BXWoOGxB.js", "/assets/index-hogig2HK.js", "/assets/request-info-CEhUGODY.js", "/assets/client-hints-DNUUFGmB.js", "/assets/progress-bar-CSvo1ZXP.js", "/assets/accordion-BroSqIct.js", "/assets/index-BATSX33w.js", "/assets/use-event-source-A_0lEOPX.js", "/assets/set-playground-Cdy8VlVD.js", "/assets/tests-CmNNBElK.js"], "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-Q9qnPuZX.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/clsx-B-dksMZM.js", "/assets/misc-ENVX3CWf.js", "/assets/request-info-CEhUGODY.js", "/assets/tooltip-BiHTe_7F.js", "/assets/client-hints-DNUUFGmB.js", "/assets/index-BATSX33w.js", "/assets/loading-C5uX0jJw.js", "/assets/user-D6tTg1yS.js", "/assets/epic-video-iluUs1-s.js", "/assets/progress-bar-CSvo1ZXP.js", "/assets/index-Dx5GmdYq.js", "/assets/nav-chevrons-B82nbdyj.js", "/assets/mdx-M0kcP-mP.js", "/assets/progress-BsY6hGPp.js", "/assets/seo-pBpFCWsy.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/finished": { "id": "routes/_app+/finished", "parentId": "routes/_app+/_layout", "path": "finished", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/finished-Bm-bCUU2.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/clsx-B-dksMZM.js", "/assets/misc-ENVX3CWf.js", "/assets/request-info-CEhUGODY.js", "/assets/tooltip-BiHTe_7F.js", "/assets/client-hints-DNUUFGmB.js", "/assets/index-BATSX33w.js", "/assets/loading-C5uX0jJw.js", "/assets/user-D6tTg1yS.js", "/assets/epic-video-iluUs1-s.js", "/assets/progress-bar-CSvo1ZXP.js", "/assets/index-Dx5GmdYq.js", "/assets/nav-chevrons-B82nbdyj.js", "/assets/mdx-M0kcP-mP.js", "/assets/seo-pBpFCWsy.js", "/assets/progress-BsY6hGPp.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-Tfdnz1AB.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/clsx-B-dksMZM.js", "/assets/misc-ENVX3CWf.js", "/assets/request-info-CEhUGODY.js", "/assets/tooltip-BiHTe_7F.js", "/assets/client-hints-DNUUFGmB.js", "/assets/index-BATSX33w.js", "/assets/loading-C5uX0jJw.js", "/assets/user-D6tTg1yS.js", "/assets/epic-video-iluUs1-s.js", "/assets/progress-bar-CSvo1ZXP.js", "/assets/index-Dx5GmdYq.js", "/assets/error-boundary-DDTvdkB4.js", "/assets/mdx-M0kcP-mP.js", "/assets/progress-BsY6hGPp.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-4cvVFzF8.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/clsx-B-dksMZM.js", "/assets/components-CME-nGId.js", "/assets/request-info-CEhUGODY.js", "/assets/client-hints-DNUUFGmB.js", "/assets/use-event-source-A_0lEOPX.js", "/assets/button-BklqyTPS.js", "/assets/loading-C5uX0jJw.js"], "css": [] }, "routes/_app+/support": { "id": "routes/_app+/support", "parentId": "routes/_app+/_layout", "path": "support", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/support-hcqGIpir.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js"], "css": [] }, "routes/admin+/_layout": { "id": "routes/admin+/_layout", "parentId": "root", "path": "admin", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_layout-C8uU4Hwj.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/clsx-B-dksMZM.js", "/assets/components-CME-nGId.js", "/assets/misc-ENVX3CWf.js", "/assets/tooltip-BiHTe_7F.js", "/assets/progress-BsY6hGPp.js"], "css": [] }, "routes/admin+/apps": { "id": "routes/admin+/apps", "parentId": "routes/admin+/_layout", "path": "apps", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/apps-DP2rzg_V.js", "imports": [], "css": [] }, "routes/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-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/diff": { "id": "routes/diff", "parentId": "root", "path": "diff", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/diff-Cw8ktQ1-.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/clsx-B-dksMZM.js", "/assets/components-CME-nGId.js", "/assets/misc-ENVX3CWf.js", "/assets/tooltip-BiHTe_7F.js", "/assets/index-BXWoOGxB.js", "/assets/index-hogig2HK.js", "/assets/request-info-CEhUGODY.js", "/assets/client-hints-DNUUFGmB.js", "/assets/index-BATSX33w.js", "/assets/loading-C5uX0jJw.js", "/assets/user-D6tTg1yS.js", "/assets/epic-video-iluUs1-s.js", "/assets/progress-bar-CSvo1ZXP.js", "/assets/accordion-BroSqIct.js", "/assets/mdx-M0kcP-mP.js", "/assets/diff-CpFxuKA2.js", "/assets/nav-chevrons-B82nbdyj.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-CnmE4HLR.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/clsx-B-dksMZM.js", "/assets/components-CME-nGId.js", "/assets/misc-ENVX3CWf.js", "/assets/request-info-CEhUGODY.js", "/assets/tooltip-BiHTe_7F.js", "/assets/client-hints-DNUUFGmB.js", "/assets/index-BATSX33w.js", "/assets/loading-C5uX0jJw.js", "/assets/user-D6tTg1yS.js", "/assets/button-BklqyTPS.js", "/assets/epic-video-iluUs1-s.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/update-mdx-cache": { "id": "routes/update-mdx-cache", "parentId": "root", "path": "update-mdx-cache", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/update-mdx-cache-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/video-player/index": { "id": "routes/video-player/index", "parentId": "root", "path": "video-player", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/index-K6Dvbx-E.js", "imports": [], "css": [] } }, "url": "/assets/manifest-4a3cf2ec.js", "version": "4a3cf2ec" };
13431
13449
  const mode = "production";
13432
13450
  const assetsBuildDirectory = "build/client";
13433
13451
  const basename = "/";