@epic-web/workshop-app 4.28.6 → 5.0.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.
@@ -9,21 +9,20 @@ import path$1 from "node:path";
9
9
  import os from "os";
10
10
  import path from "path";
11
11
  import * as C from "@epic-web/cachified";
12
- import { verboseReporter, cachified as cachified$1 } from "@epic-web/cachified";
12
+ import { verboseReporter } from "@epic-web/cachified";
13
13
  import { remember } from "@epic-web/remember";
14
14
  import fsExtra from "fs-extra";
15
15
  import { LRUCache } from "lru-cache";
16
16
  import md5 from "md5-hex";
17
- import * as z from "zod";
18
- import { z as z$1 } from "zod";
19
- import fs from "node:fs";
17
+ import { z } from "zod";
18
+ import fs$1 from "node:fs";
20
19
  import "@total-typescript/ts-reset";
21
20
  import { execa } from "execa";
22
21
  import { glob } from "glob";
23
22
  import { isGitIgnored, globby } from "globby";
24
23
  import chokidar from "chokidar";
25
24
  import closeWithGrace from "close-with-grace";
26
- import fs$1 from "fs";
25
+ import fs from "fs";
27
26
  import { remarkCodeBlocksShiki } from "@kentcdodds/md-temp";
28
27
  import { bundleMDX } from "mdx-bundler";
29
28
  import PQueue from "p-queue";
@@ -31,8 +30,6 @@ import remarkAutolinkHeadings from "remark-autolink-headings";
31
30
  import emoji from "remark-emoji";
32
31
  import gfm from "remark-gfm";
33
32
  import { visit } from "unist-util-visit";
34
- import { createProcessor } from "@mdx-js/mdx";
35
- import { removePosition } from "unist-util-remove-position";
36
33
  import child_process, { spawn } from "child_process";
37
34
  import net from "node:net";
38
35
  import chalk from "chalk";
@@ -219,40 +216,16 @@ const diffFilesCache = makeSingletonCache("DiffFilesCache");
219
216
  const compiledMarkdownCache = makeSingletonCache(
220
217
  "CompiledMarkdownCache"
221
218
  );
222
- const embeddedFilesCache = makeSingletonCache("EmbeddedFilesCache");
223
219
  const compiledCodeCache = makeSingletonCache("CompiledCodeCache");
224
220
  const ogCache = makeSingletonCache("OgCache");
225
- const cacheDir$1 = path.join(os.homedir(), ".epicshop", "cache");
226
- const fsCache = {
227
- name: "Filesystem cache",
228
- async get(key) {
229
- try {
230
- const filePath = path.join(cacheDir$1, md5(key));
231
- const data = await fsExtra.readJSON(filePath);
232
- if (data.entry) return data.entry;
233
- return null;
234
- } catch (error) {
235
- if (error instanceof Error && "code" in error && error.code === "ENOENT") {
236
- return null;
237
- }
238
- throw error;
239
- }
240
- },
241
- async set(key, entry2) {
242
- const filePath = path.join(cacheDir$1, md5(key));
243
- await fsExtra.ensureDir(path.dirname(filePath));
244
- await fsExtra.writeJSON(filePath, { key, entry: entry2 });
245
- },
246
- async delete(key) {
247
- const filePath = path.join(cacheDir$1, md5(key));
248
- await fsExtra.remove(filePath);
249
- }
250
- };
221
+ const compiledInstructionMarkdownCache = makeSingletonFsCache("CompiledInstructionMarkdownCache");
222
+ const cacheDir = path.join(os.homedir(), ".epicshop", "cache");
223
+ const fsCache = makeSingletonFsCache("FsCache");
251
224
  async function getAllFileCacheEntries() {
252
- const files = await fsExtra.readdir(cacheDir$1);
225
+ const files = await fsExtra.readdir(cacheDir);
253
226
  const entries = await Promise.all(
254
227
  files.map(async (file) => {
255
- const filePath = path.join(cacheDir$1, file);
228
+ const filePath = path.join(cacheDir, file);
256
229
  const data = await fsExtra.readJSON(filePath);
257
230
  return data;
258
231
  }).filter(Boolean)
@@ -262,11 +235,11 @@ async function getAllFileCacheEntries() {
262
235
  async function deleteCache() {
263
236
  if (process.env.EPICSHOP_DEPLOYED) return null;
264
237
  try {
265
- if (await fsExtra.exists(cacheDir$1)) {
266
- await fsExtra.remove(cacheDir$1);
238
+ if (await fsExtra.exists(cacheDir)) {
239
+ await fsExtra.remove(cacheDir);
267
240
  }
268
241
  } catch (error) {
269
- console.error(`Error deleting the cache in ${cacheDir$1}`, error);
242
+ console.error(`Error deleting the cache in ${cacheDir}`, error);
270
243
  }
271
244
  }
272
245
  function makeSingletonCache(name) {
@@ -290,6 +263,37 @@ function makeSingletonCache(name) {
290
263
  return lru;
291
264
  });
292
265
  }
266
+ function makeSingletonFsCache(name) {
267
+ return remember(name, () => {
268
+ const cacheDir2 = path.join(os.homedir(), ".epicshop", "cache", name);
269
+ const fsCache2 = {
270
+ name: `Filesystem cache (${name})`,
271
+ async get(key) {
272
+ try {
273
+ const filePath = path.join(cacheDir2, md5(key));
274
+ const data = await fsExtra.readJSON(filePath);
275
+ if (data.entry) return data.entry;
276
+ return null;
277
+ } catch (error) {
278
+ if (error instanceof Error && "code" in error && error.code === "ENOENT") {
279
+ return null;
280
+ }
281
+ throw error;
282
+ }
283
+ },
284
+ async set(key, entry2) {
285
+ const filePath = path.join(cacheDir2, md5(key));
286
+ await fsExtra.ensureDir(path.dirname(filePath));
287
+ await fsExtra.writeJSON(filePath, { key, entry: entry2 });
288
+ },
289
+ async delete(key) {
290
+ const filePath = path.join(cacheDir2, md5(key));
291
+ await fsExtra.remove(filePath);
292
+ }
293
+ };
294
+ return fsCache2;
295
+ });
296
+ }
293
297
  async function cachified({
294
298
  request,
295
299
  timings,
@@ -330,42 +334,42 @@ async function shouldForceFresh({
330
334
  if (!key) return false;
331
335
  return fresh.split(",").includes(key);
332
336
  }
333
- const DiscordMemberSchema = z$1.object({
334
- avatarURL: z$1.string().nullable().optional(),
335
- displayName: z$1.string(),
336
- id: z$1.string()
337
+ const DiscordMemberSchema = z.object({
338
+ avatarURL: z.string().nullable().optional(),
339
+ displayName: z.string(),
340
+ id: z.string()
337
341
  });
338
- const TokenSetSchema = z$1.object({
339
- access_token: z$1.string(),
340
- token_type: z$1.string(),
341
- scope: z$1.string()
342
+ const TokenSetSchema = z.object({
343
+ access_token: z.string(),
344
+ token_type: z.string(),
345
+ scope: z.string()
342
346
  });
343
- const PlayerPreferencesSchema = z$1.object({
344
- volumeRate: z$1.number().optional(),
345
- playbackRate: z$1.number().optional(),
346
- autoplay: z$1.boolean().optional(),
347
- subtitle: z$1.object({
348
- id: z$1.string().nullable().default(null),
349
- mode: z$1.literal("disabled").or(z$1.literal("hidden")).or(z$1.literal("showing")).nullable().default("disabled")
347
+ const PlayerPreferencesSchema = z.object({
348
+ volumeRate: z.number().optional(),
349
+ playbackRate: z.number().optional(),
350
+ autoplay: z.boolean().optional(),
351
+ subtitle: z.object({
352
+ id: z.string().nullable().default(null),
353
+ mode: z.literal("disabled").or(z.literal("hidden")).or(z.literal("showing")).nullable().default("disabled")
350
354
  }).optional().default({}),
351
- muted: z$1.boolean().optional(),
352
- theater: z$1.boolean().optional(),
353
- defaultView: z$1.string().optional(),
354
- activeSidebarTab: z$1.number().optional()
355
+ muted: z.boolean().optional(),
356
+ theater: z.boolean().optional(),
357
+ defaultView: z.string().optional(),
358
+ activeSidebarTab: z.number().optional()
355
359
  }).optional().default({});
356
- const PresencePreferencesSchema = z$1.object({
357
- optOut: z$1.boolean()
360
+ const PresencePreferencesSchema = z.object({
361
+ optOut: z.boolean()
358
362
  }).optional().default({ optOut: false });
359
- const AuthInfoSchema = z$1.object({
363
+ const AuthInfoSchema = z.object({
360
364
  tokenSet: TokenSetSchema,
361
- email: z$1.string(),
362
- name: z$1.string().nullable().optional()
365
+ email: z.string(),
366
+ name: z.string().nullable().optional()
363
367
  }).transform((d) => ({ ...d, id: md5(d.email) }));
364
- const DataSchema = z$1.object({
365
- onboarding: z$1.object({
366
- tourVideosWatched: z$1.array(z$1.string()).default([])
368
+ const DataSchema = z.object({
369
+ onboarding: z.object({
370
+ tourVideosWatched: z.array(z.string()).default([])
367
371
  }).passthrough().optional().default({ tourVideosWatched: [] }),
368
- preferences: z$1.object({
372
+ preferences: z.object({
369
373
  player: PlayerPreferencesSchema,
370
374
  presence: PresencePreferencesSchema
371
375
  }).optional().default({}),
@@ -517,30 +521,30 @@ async function markOnboardingVideoWatched(videoUrl) {
517
521
  }
518
522
  const partykitRoom = "epic-web-presence";
519
523
  const partykitBaseUrl = `https://epic-web-presence.kentcdodds.partykit.dev/parties/main/${partykitRoom}`;
520
- const UserSchema = z$1.object({
521
- id: z$1.string(),
522
- avatarUrl: z$1.string().nullable().optional(),
523
- name: z$1.string().nullable().optional(),
524
- location: z$1.object({
525
- workshopTitle: z$1.string().nullable().optional(),
526
- origin: z$1.string().nullable().optional(),
527
- exercise: z$1.object({
528
- type: z$1.union([z$1.literal("problem"), z$1.literal("solution")]).nullable().optional(),
529
- exerciseNumber: z$1.number().nullable().optional(),
530
- stepNumber: z$1.number().nullable().optional()
524
+ const UserSchema = z.object({
525
+ id: z.string(),
526
+ avatarUrl: z.string().nullable().optional(),
527
+ name: z.string().nullable().optional(),
528
+ location: z.object({
529
+ workshopTitle: z.string().nullable().optional(),
530
+ origin: z.string().nullable().optional(),
531
+ exercise: z.object({
532
+ type: z.union([z.literal("problem"), z.literal("solution")]).nullable().optional(),
533
+ exerciseNumber: z.number().nullable().optional(),
534
+ stepNumber: z.number().nullable().optional()
531
535
  }).nullable().optional()
532
536
  }).nullable().optional()
533
537
  });
534
- const MessageSchema = z$1.object({
535
- type: z$1.literal("remove-user"),
536
- payload: z$1.object({ id: z$1.string() })
537
- }).or(z$1.object({ type: z$1.literal("add-user"), payload: UserSchema })).or(
538
- z$1.object({
539
- type: z$1.literal("presence"),
540
- payload: z$1.object({ users: z$1.array(UserSchema) })
538
+ const MessageSchema = z.object({
539
+ type: z.literal("remove-user"),
540
+ payload: z.object({ id: z.string() })
541
+ }).or(z.object({ type: z.literal("add-user"), payload: UserSchema })).or(
542
+ z.object({
543
+ type: z.literal("presence"),
544
+ payload: z.object({ users: z.array(UserSchema) })
541
545
  })
542
546
  );
543
- const PresenceSchema = z$1.object({ users: z$1.array(UserSchema) });
547
+ const PresenceSchema = z.object({ users: z.array(UserSchema) });
544
548
  const presenceCache = makeSingletonCache("PresenceCache");
545
549
  async function getPresentUsers(user, { timings, request } = {}) {
546
550
  return cachified({
@@ -550,7 +554,7 @@ async function getPresentUsers(user, { timings, request } = {}) {
550
554
  request,
551
555
  ttl: 1e3 * 60 * 5,
552
556
  swr: 1e3 * 60 * 60 * 24,
553
- checkValue: z$1.array(UserSchema),
557
+ checkValue: z.array(UserSchema),
554
558
  async getFreshValue(context) {
555
559
  try {
556
560
  const response = await Promise.race([
@@ -623,269 +627,6 @@ function getOptionalWatcher() {
623
627
  global.__change_tracker_close_with_grace_return__ = closeWithGrace(
624
628
  () => watcher == null ? void 0 : watcher.close()
625
629
  );
626
- const APP_TYPES = ["problem", "solution", "playground"];
627
- const safePath$1 = (s) => s.replace(/\\/g, "/");
628
- const REG_EXP = /^(?:\d+(?:-\d+)?,)*\d+(?:-\d+)?$/;
629
- const isValidRangeFormat = (value) => value ? REG_EXP.test(value) : true;
630
- const transformRange = (value) => value == null ? void 0 : value.split(",").map((range) => {
631
- const [start, end] = range.split("-").map(Number);
632
- return [start, end ?? start];
633
- });
634
- const isRangeBounded = (range, ctx, lines) => {
635
- if (!lines || !Array.isArray(range)) return;
636
- if (range.flat().some((r) => r < 1 || r > lines)) {
637
- ctx.addIssue({
638
- code: z.ZodIssueCode.custom,
639
- message: `Range must be between 1 and ${lines}`
640
- });
641
- }
642
- };
643
- const isRangeInOrder = (range) => Array.isArray(range) ? range.every(([a, b]) => !isNaN(Number(a)) && !isNaN(Number(b)) && b >= a) : true;
644
- const isRangesNonOverlapping = (range) => {
645
- if (!Array.isArray(range)) return true;
646
- return range.every(([a], i) => {
647
- var _a2;
648
- return i === 0 || (((_a2 = range[i - 1]) == null ? void 0 : _a2[1]) ?? 0) < a;
649
- });
650
- };
651
- let fileContentCache = /* @__PURE__ */ new Map();
652
- async function getFileContent(filePath) {
653
- if (fileContentCache.has(filePath)) {
654
- return fileContentCache.get(filePath);
655
- }
656
- try {
657
- const content = await fs.promises.readFile(filePath, "utf-8");
658
- const fileContent = content.split("\n");
659
- fileContentCache.set(filePath, fileContent);
660
- return fileContent;
661
- } catch {
662
- console.warn(
663
- `@epic-web/workshop-app - invalid CodeFile.
664
- Could not read file: ${filePath}
665
- `
666
- );
667
- }
668
- }
669
- async function validateProps(props, appDir2) {
670
- let validRange;
671
- let linesCount = 0;
672
- const BooleanSchema = z.nullable(z.string()).optional().refine(
673
- (v) => ["true", "false", null, void 0].includes(v),
674
- 'optional boolean key can be "true", "false", null or undefined'
675
- ).transform((v) => v === null || Boolean(v));
676
- const RangeSchema = z.string().optional().refine(isValidRangeFormat, "Invalid range format").transform(transformRange).superRefine((val, ctx) => isRangeBounded(val, ctx, linesCount)).refine(isRangeInOrder, "Range must be in order low-high");
677
- const inputSchema = z.object({
678
- file: z.string().nonempty().transform(async (file, ctx) => {
679
- const fullPath = path$1.join(appDir2, file);
680
- const content = await getFileContent(fullPath);
681
- if (!content) {
682
- ctx.addIssue({
683
- code: z.ZodIssueCode.custom,
684
- message: `Could not read file`,
685
- fatal: true
686
- });
687
- return z.NEVER;
688
- }
689
- linesCount = content.length;
690
- return {
691
- fullPath: safePath$1(fullPath),
692
- filePath: safePath$1(file),
693
- content
694
- };
695
- }),
696
- range: RangeSchema.refine((range) => {
697
- const isValid = isRangesNonOverlapping(range);
698
- validRange = isValid ? range : void 0;
699
- return isValid;
700
- }, "Ranges must not overlap"),
701
- highlight: RangeSchema.refine((highlight) => {
702
- if (!Array.isArray(highlight) || !Array.isArray(validRange)) {
703
- return z.NEVER;
704
- }
705
- return highlight.every(
706
- ([hStart, hEnd]) => validRange == null ? void 0 : validRange.some(
707
- ([rStart, rEnd]) => hStart >= rStart && hEnd <= rEnd
708
- )
709
- );
710
- }, "Highlight range must be within defined range").transform(() => props.highlight).optional(),
711
- nonumber: BooleanSchema,
712
- nocopy: BooleanSchema,
713
- buttons: z.string().optional().transform(
714
- (str) => str ? str.split(",") : []
715
- ).refine((arr) => arr.every((item) => APP_TYPES.includes(item)), {
716
- message: `Buttons can only be any of ${APP_TYPES.join(",")}`
717
- })
718
- }).strict();
719
- return inputSchema.safeParseAsync(props);
720
- }
721
- async function createErrorNotification(node, errors, mdxFile, appType) {
722
- var _a2, _b;
723
- const filename = path$1.basename(mdxFile);
724
- const startLine = (_a2 = node.position) == null ? void 0 : _a2.start.line;
725
- const endLine = (_b = node.position) == null ? void 0 : _b.end.line;
726
- const codeFence = async () => {
727
- if (startLine && endLine) {
728
- const contentStr = await getFileContent(mdxFile);
729
- const content = contentStr == null ? void 0 : contentStr.slice(startLine - 1, endLine).join("\n");
730
- if (content) {
731
- return `
732
- \`\`\`tsx filename=${filename} start=${startLine} nocopy
733
- ${content}
734
- \`\`\``.trim();
735
- }
736
- }
737
- return "";
738
- };
739
- const mdxSource = `
740
- <CodeFileNotification variant="error" file="${filename}" line="${startLine}" type="${appType}">
741
- <callout-danger class="notification">
742
- <div className="title">CodeFile Error: invalid input</div>
743
- ${errors.map((error) => `<div>${error}</div>`).join("")}
744
- ${await codeFence()}
745
- </callout-danger>
746
- </CodeFileNotification>`;
747
- return mdxToMdast(mdxSource);
748
- }
749
- function stripIndent(string) {
750
- const match = string.match(/^[ \t]*(?=\S)/gm);
751
- const indent = (match == null ? void 0 : match.reduce((r, a) => Math.min(r, a.length), Infinity)) ?? 0;
752
- if (indent === 0) {
753
- return string;
754
- }
755
- const regex = new RegExp(`^[ \\t]{${indent}}`, "gm");
756
- return string.replace(regex, "");
757
- }
758
- function mdxToMdast(mdx) {
759
- const processor = createProcessor();
760
- const mdast = processor.parse(mdx.trim());
761
- removePosition(mdast, { force: true });
762
- return mdast.type === "root" ? mdast.children : [mdast];
763
- }
764
- function remarkCodeFile(data) {
765
- fileContentCache = /* @__PURE__ */ new Map();
766
- const mdxFile = data.mdxFile;
767
- const appDir2 = path$1.dirname(mdxFile);
768
- const appType = mdxFile.includes("problem") ? "problem" : mdxFile.includes("solution") ? "solution" : "other";
769
- async function replaceCodeFileNode({
770
- node,
771
- parent
772
- }) {
773
- var _a2, _b;
774
- if (!parent) {
775
- console.warn(
776
- "Unexpected error: replaceCodeFileNode called without a Parent"
777
- );
778
- return;
779
- }
780
- const index = parent.children.indexOf(node);
781
- if (index === -1) {
782
- console.warn(
783
- "Unexpected error: replaceCodeFileNode could not find node index in Parent"
784
- );
785
- return;
786
- }
787
- const attributes = node.attributes;
788
- const props = {};
789
- for (const { name, value } of attributes) {
790
- props[name] = value;
791
- }
792
- const result = await validateProps(props, appDir2);
793
- if (!result.success) {
794
- const errors = result.error.issues.map(
795
- ({ message, path: path2 }) => path2[0] ? `${message}: ${path2[0]}="${props[path2[0]]}"` : message
796
- );
797
- const notification = await createErrorNotification(
798
- node,
799
- errors,
800
- mdxFile,
801
- appType
802
- );
803
- parent.children.splice(index, 1, ...notification);
804
- data.embeddedFiles.set("invalid input", {
805
- error: true,
806
- file: props.file,
807
- hash: "",
808
- line: ((_a2 = node.position) == null ? void 0 : _a2.start.line) ?? 1
809
- });
810
- return;
811
- }
812
- const {
813
- file: { content, filePath, fullPath },
814
- highlight,
815
- range
816
- } = result.data;
817
- const language = path$1.extname(filePath).substring(1);
818
- const meta2 = [`filename=${filePath}`];
819
- Object.entries(result.data).forEach(
820
- ([key, val]) => typeof val === "boolean" && val && meta2.push(`${key}=true`)
821
- );
822
- if (result.data.buttons) {
823
- meta2.push(`buttons=${result.data.buttons.join(",")}`);
824
- meta2.push(`type=${appType}`);
825
- meta2.push(`fullpath=${fullPath}`);
826
- meta2.push(`sep=${path$1.sep}`);
827
- }
828
- if (highlight == null ? void 0 : highlight.length) {
829
- meta2.push(`lines=${highlight}`);
830
- }
831
- const fileSections = (range == null ? void 0 : range.length) ? range : [[1, content.length]];
832
- const rangesContent = [];
833
- const preNodes = [];
834
- for (const [start, end] of fileSections) {
835
- const rangeContent = stripIndent(
836
- content.slice(start ? start - 1 : 0, end).join("\n")
837
- );
838
- rangesContent.push(rangeContent);
839
- const mdxSource = `
840
- \`\`\`${language} ${meta2.concat(`start=${start}`).join(" ")}
841
- ${rangeContent}
842
- \`\`\``;
843
- preNodes.push(...mdxToMdast(mdxSource));
844
- }
845
- const embeddedKey = md5(fullPath + JSON.stringify(range));
846
- const contentHash = md5(rangesContent.join(","));
847
- const newData = {
848
- file: fullPath,
849
- hash: contentHash
850
- };
851
- const cachedData = data.cachedEmbeddedFiles.get(embeddedKey);
852
- if (cachedData && // If a warning existed previously and its hash matched the current hash,
853
- // then the changes were reverted and the warning will be remove
854
- ((cachedData.warning && cachedData.warning !== contentHash) ?? (!cachedData.warning && cachedData.hash !== contentHash))) {
855
- newData.warning = cachedData.warning ?? cachedData.hash;
856
- const startLine = ((_b = node.position) == null ? void 0 : _b.start.line) ?? 1;
857
- newData.line = startLine;
858
- const mdxFilename = path$1.basename(mdxFile);
859
- const filename = path$1.basename(filePath);
860
- const warning = `
861
- <CodeFileNotification variant="warning" file="${mdxFilename}" line="${startLine}" type="${appType}"
862
- cacheLocation="${data.cacheLocation}" embeddedKey="${embeddedKey}">
863
- <callout-warning class="notification">
864
- <div className="title">CodeFile Warning:</div>
865
- <div>file ${filename} content was changed, review 'range' and 'highlight' inputs</div>
866
- </callout-warning>
867
- </CodeFileNotification>`;
868
- preNodes.unshift(...mdxToMdast(warning));
869
- }
870
- data.embeddedFiles.set(embeddedKey, newData);
871
- parent.children.splice(index, 1, ...preNodes);
872
- }
873
- return async function codeFileTransformer(tree) {
874
- const codeFiles = [];
875
- const filter = { type: "mdxJsxFlowElement", name: "CodeFile" };
876
- visit(tree, filter, (node, _index, parent) => {
877
- codeFiles.push({ node, parent });
878
- });
879
- for (const props of codeFiles) {
880
- await replaceCodeFileNode(props);
881
- }
882
- fileContentCache = /* @__PURE__ */ new Map();
883
- };
884
- }
885
- const cacheDir = path.join(
886
- process.env.EPICSHOP_CONTEXT_CWD ?? process.cwd(),
887
- "./node_modules/.cache/compile-mdx"
888
- );
889
630
  function trimCodeBlocks() {
890
631
  return async function transformer(tree) {
891
632
  visit(tree, "element", (preNode) => {
@@ -927,68 +668,38 @@ const rehypePlugins = [
927
668
  remarkCodeBlocksShiki,
928
669
  removePreContainerDivs
929
670
  ];
930
- function checkFileExists$1(file) {
931
- return fs$1.promises.access(file, fs$1.constants.F_OK).then(
932
- () => true,
933
- () => false
934
- );
935
- }
936
671
  const verboseLog = process.env.EPICSHOP_VERBOSE_LOG === "true" ? console.log : () => {
937
672
  };
938
- function validateEmbeddedFiles(embeddedFiles, lastCompiledTime) {
939
- if (process.env.NODE_ENV !== "development") return Promise.resolve(true);
940
- return Promise.all(
941
- Array.from(embeddedFiles).map(async ({ file }) => {
942
- const stat = await fs$1.promises.stat(file).catch(() => ({ mtimeMs: 0 }));
943
- return lastCompiledTime > stat.mtimeMs || Promise.reject();
944
- })
945
- ).then(
946
- () => true,
947
- () => false
948
- );
949
- }
950
- async function compileMdx(file, { request, forceFresh } = {}) {
951
- var _a2;
952
- if (!await checkFileExists$1(file)) {
953
- throw new Error(`File does not exist: ${file}`);
673
+ async function compileMdx(file, {
674
+ request,
675
+ timings,
676
+ forceFresh
677
+ } = {}) {
678
+ const stat = await fs.promises.stat(file).catch((error) => ({ error }));
679
+ if ("error" in stat) {
680
+ throw new Error(`File stat cannot be read: ${stat.error}`);
954
681
  }
955
- let cachedEmbeddedFiles = /* @__PURE__ */ new Map();
956
- const stat = await fs$1.promises.stat(file);
957
- const cacheLocation = path.join(cacheDir, `${md5(file)}.json`);
958
- const requireFresh = await shouldForceFresh({
959
- forceFresh,
960
- request,
961
- key: cacheLocation
962
- });
963
- if (!requireFresh && await checkFileExists$1(cacheLocation)) {
964
- try {
965
- const cached = JSON.parse(
966
- await fs$1.promises.readFile(cacheLocation, "utf-8")
967
- );
968
- cachedEmbeddedFiles = new Map(
969
- Object.entries(cached.value.embeddedFiles ?? {})
970
- );
971
- const compiledTime = cached.value.compiledTime ?? 0;
972
- const warningCancled = process.env.NODE_ENV === "development" ? ((_a2 = cached == null ? void 0 : cached.value) == null ? void 0 : _a2.warningCancled) ?? false : false;
973
- if (compiledTime > stat.mtimeMs && !warningCancled && await validateEmbeddedFiles(
974
- cachedEmbeddedFiles.values(),
975
- compiledTime
976
- )) {
977
- return cached.value;
978
- }
979
- } catch (error) {
980
- console.error(`Error reading cached file: ${cacheLocation}`, error);
981
- void fs$1.promises.unlink(cacheLocation);
682
+ const key = `file:${file}`;
683
+ forceFresh = await shouldForceFresh({ forceFresh, request, key });
684
+ const existingCacheEntry = await compiledInstructionMarkdownCache.get(key);
685
+ if (!forceFresh && existingCacheEntry) {
686
+ const compiledTime = existingCacheEntry.metadata.createdTime;
687
+ if (stat.mtimeMs <= compiledTime) {
688
+ return existingCacheEntry.value;
982
689
  }
983
690
  }
691
+ return cachified({
692
+ key,
693
+ cache: compiledInstructionMarkdownCache,
694
+ request,
695
+ timings,
696
+ forceFresh,
697
+ getFreshValue: () => compileMdxImpl(file)
698
+ });
699
+ }
700
+ async function compileMdxImpl(file) {
984
701
  let title = null;
985
702
  const epicVideoEmbeds = [];
986
- const codeFileData = {
987
- mdxFile: file,
988
- cacheLocation,
989
- cachedEmbeddedFiles,
990
- embeddedFiles: /* @__PURE__ */ new Map()
991
- };
992
703
  try {
993
704
  verboseLog(`Compiling ${file}`);
994
705
  const bundleResult = await queuedBundleMDX({
@@ -1014,6 +725,7 @@ async function compileMdx(file, { request, forceFresh } = {}) {
1014
725
  visit(tree, "mdxJsxFlowElement", (jsxEl) => {
1015
726
  if (jsxEl.name !== "EpicVideo") return;
1016
727
  const urlAttr = jsxEl.attributes.find(
728
+ // @ts-expect-error no idea why this started being an issue suddenly 🤷‍♂️
1017
729
  (a) => a.type === "mdxJsxAttribute" && a.name === "url"
1018
730
  );
1019
731
  if (!urlAttr) return;
@@ -1023,7 +735,6 @@ async function compileMdx(file, { request, forceFresh } = {}) {
1023
735
  epicVideoEmbeds.push(url);
1024
736
  });
1025
737
  },
1026
- () => remarkCodeFile(codeFileData),
1027
738
  emoji
1028
739
  ];
1029
740
  options.rehypePlugins = [
@@ -1038,18 +749,6 @@ async function compileMdx(file, { request, forceFresh } = {}) {
1038
749
  });
1039
750
  if (!bundleResult) throw new Error(`Timeout for file: ${file}`);
1040
751
  const result = { code: bundleResult.code, title, epicVideoEmbeds };
1041
- await fsExtra.ensureDir(cacheDir);
1042
- await fs$1.promises.writeFile(
1043
- cacheLocation,
1044
- JSON.stringify({
1045
- value: {
1046
- ...result,
1047
- compiledTime: Date.now(),
1048
- embeddedFiles: codeFileData.embeddedFiles.size ? Object.fromEntries(codeFileData.embeddedFiles) : void 0
1049
- }
1050
- })
1051
- );
1052
- await updateEmbeddedFilesCache(codeFileData);
1053
752
  return result;
1054
753
  } catch (error) {
1055
754
  console.error(`Compilation error for file: `, file, error);
@@ -1059,7 +758,7 @@ async function compileMdx(file, { request, forceFresh } = {}) {
1059
758
  }
1060
759
  }
1061
760
  async function compileMarkdownString(markdownString) {
1062
- return cachified$1({
761
+ return cachified({
1063
762
  key: markdownString,
1064
763
  cache: compiledMarkdownCache,
1065
764
  ttl: 1e3 * 60 * 60 * 24,
@@ -1088,76 +787,6 @@ async function compileMarkdownString(markdownString) {
1088
787
  }
1089
788
  });
1090
789
  }
1091
- const modifiedEmbeddedFilesTime = remember(
1092
- "modified_embedded_files_time",
1093
- () => /* @__PURE__ */ new Map()
1094
- );
1095
- const EMBEDDED_FILES_CACHE_KEY = "embeddedFilesCache";
1096
- async function updateEmbeddedFilesCache({
1097
- mdxFile,
1098
- embeddedFiles
1099
- }) {
1100
- var _a2;
1101
- if (mdxFile.includes("playground")) return;
1102
- let cachedList = await getEmbeddedFilesCache();
1103
- const hash = cachedList ? md5(JSON.stringify(cachedList)) : null;
1104
- if (cachedList) {
1105
- for (const [key, value] of Object.entries(cachedList)) {
1106
- cachedList[key] = value.filter((item) => item !== mdxFile);
1107
- if (((_a2 = cachedList[key]) == null ? void 0 : _a2.length) === 0) {
1108
- delete cachedList[key];
1109
- }
1110
- }
1111
- }
1112
- if (embeddedFiles.size) {
1113
- if (!cachedList) {
1114
- cachedList = {};
1115
- }
1116
- const files = Array.from(
1117
- new Set(Array.from(embeddedFiles.values()).map(({ file }) => file))
1118
- ).sort();
1119
- for (const file of files) {
1120
- cachedList[file] = [...cachedList[file] ?? [], mdxFile];
1121
- }
1122
- }
1123
- if (cachedList && hash !== md5(JSON.stringify(cachedList))) {
1124
- await fsExtra.ensureDir(cacheDir);
1125
- const embeddedFilesLocation = path.join(cacheDir, "embeddedFiles.json");
1126
- modifiedEmbeddedFilesTime.set(EMBEDDED_FILES_CACHE_KEY, Date.now());
1127
- await fs$1.promises.writeFile(
1128
- embeddedFilesLocation,
1129
- JSON.stringify({ ...cachedList })
1130
- );
1131
- }
1132
- }
1133
- async function getEmbeddedFilesCache() {
1134
- const key = EMBEDDED_FILES_CACHE_KEY;
1135
- function getForceFresh2(cacheEntry) {
1136
- if (!cacheEntry) return true;
1137
- const latestModifiedTime = modifiedEmbeddedFilesTime.get(key);
1138
- if (!latestModifiedTime) return void 0;
1139
- return latestModifiedTime > cacheEntry.metadata.createdTime ? true : void 0;
1140
- }
1141
- return cachified$1({
1142
- key,
1143
- cache: embeddedFilesCache,
1144
- ttl: 1e3 * 60 * 60 * 24,
1145
- forceFresh: getForceFresh2(embeddedFilesCache.get(key)),
1146
- getFreshValue: async () => {
1147
- try {
1148
- const embeddedFilesLocation = path.join(cacheDir, "embeddedFiles.json");
1149
- if (await checkFileExists$1(embeddedFilesLocation)) {
1150
- return JSON.parse(
1151
- await fs$1.promises.readFile(embeddedFilesLocation, "utf-8")
1152
- );
1153
- }
1154
- } catch {
1155
- console.error(`Unable to read 'embeddedFiles.json' from: `, cacheDir);
1156
- }
1157
- return void 0;
1158
- }
1159
- });
1160
- }
1161
790
  let _queue = null;
1162
791
  async function getQueue() {
1163
792
  if (_queue) return _queue;
@@ -1174,58 +803,58 @@ async function queuedBundleMDX(...args) {
1174
803
  return result;
1175
804
  }
1176
805
  const workshopRoot$1 = process.env.EPICSHOP_CONTEXT_CWD ?? process.cwd();
1177
- const StackBlitzConfigSchema = z$1.object({
806
+ const StackBlitzConfigSchema = z.object({
1178
807
  // we default this to `${exerciseTitle} (${type})`
1179
- title: z$1.string().optional(),
808
+ title: z.string().optional(),
1180
809
  // stackblitz defaults this to dev automatically
1181
- startScript: z$1.string().optional(),
810
+ startScript: z.string().optional(),
1182
811
  // if no value is provided, then stackblitz defaults this to whatever
1183
812
  // looks best based on the width of the screen
1184
- view: z$1.union([z$1.literal("editor"), z$1.literal("preview"), z$1.literal("both")]).optional(),
1185
- file: z$1.string().optional()
813
+ view: z.union([z.literal("editor"), z.literal("preview"), z.literal("both")]).optional(),
814
+ file: z.string().optional()
1186
815
  });
1187
- const InstructorSchema = z$1.object({
1188
- name: z$1.string().optional(),
1189
- avatar: z$1.string().optional(),
1190
- "𝕏": z$1.string().optional(),
1191
- xHandle: z$1.string().optional()
816
+ const InstructorSchema = z.object({
817
+ name: z.string().optional(),
818
+ avatar: z.string().optional(),
819
+ "𝕏": z.string().optional(),
820
+ xHandle: z.string().optional()
1192
821
  });
1193
- const WorkshopConfigSchema = z$1.object({
1194
- title: z$1.string(),
1195
- subtitle: z$1.string().optional(),
822
+ const WorkshopConfigSchema = z.object({
823
+ title: z.string(),
824
+ subtitle: z.string().optional(),
1196
825
  instructor: InstructorSchema.optional(),
1197
- epicWorkshopHost: z$1.string().optional(),
1198
- epicWorkshopSlug: z$1.string().optional(),
1199
- product: z$1.object({
1200
- host: z$1.string().default("www.epicweb.dev"),
1201
- displayName: z$1.string().default("EpicWeb.dev"),
1202
- displayNameShort: z$1.string().default("Epic Web"),
1203
- logo: z$1.string().default("/logo.svg"),
1204
- slug: z$1.string().optional(),
1205
- discordChannelId: z$1.string().default("1161045224907341972"),
1206
- discordTags: z$1.array(z$1.string()).optional()
826
+ epicWorkshopHost: z.string().optional(),
827
+ epicWorkshopSlug: z.string().optional(),
828
+ product: z.object({
829
+ host: z.string().default("www.epicweb.dev"),
830
+ displayName: z.string().default("EpicWeb.dev"),
831
+ displayNameShort: z.string().default("Epic Web"),
832
+ logo: z.string().default("/logo.svg"),
833
+ slug: z.string().optional(),
834
+ discordChannelId: z.string().default("1161045224907341972"),
835
+ discordTags: z.array(z.string()).optional()
1207
836
  }).default({}),
1208
- onboardingVideo: z$1.string().default(
837
+ onboardingVideo: z.string().default(
1209
838
  "https://www.epicweb.dev/tips/get-started-with-the-epic-workshop-app"
1210
839
  ),
1211
- githubRepo: z$1.string(),
1212
- githubRoot: z$1.string(),
840
+ githubRepo: z.string(),
841
+ githubRoot: z.string(),
1213
842
  stackBlitzConfig: StackBlitzConfigSchema.optional(),
1214
- forms: z$1.object({
1215
- workshop: z$1.string().default(
843
+ forms: z.object({
844
+ workshop: z.string().default(
1216
845
  "https://docs.google.com/forms/d/e/1FAIpQLSdRmj9p8-5zyoqRzxp3UpqSbC3aFkweXvvJIKes0a5s894gzg/viewform?hl=en&embedded=true&entry.2123647600={workshopTitle}"
1217
846
  ),
1218
- exercise: z$1.string().default(
847
+ exercise: z.string().default(
1219
848
  "https://docs.google.com/forms/d/e/1FAIpQLSf3o9xyjQepTlOTH5Z7ZwkeSTdXh6YWI_RGc9KiyD3oUN0p6w/viewform?hl=en&embedded=true&entry.1836176234={workshopTitle}&entry.428900931={exerciseTitle}"
1220
849
  )
1221
850
  }).default({}),
1222
- testTab: z$1.object({
1223
- enabled: z$1.boolean().default(true)
851
+ testTab: z.object({
852
+ enabled: z.boolean().default(true)
1224
853
  }).default({}),
1225
- scripts: z$1.object({
1226
- postupdate: z$1.string().optional()
854
+ scripts: z.object({
855
+ postupdate: z.string().optional()
1227
856
  }).optional(),
1228
- initialRoute: z$1.string().optional().default("/")
857
+ initialRoute: z.string().optional().default("/")
1229
858
  }).transform((data) => {
1230
859
  return {
1231
860
  ...data,
@@ -1247,7 +876,7 @@ function getWorkshopConfig() {
1247
876
  const packageJsonPath = path$1.join(workshopRoot$1, "package.json");
1248
877
  let packageJson;
1249
878
  try {
1250
- const packageJsonContent = fs.readFileSync(packageJsonPath, "utf8");
879
+ const packageJsonContent = fs$1.readFileSync(packageJsonPath, "utf8");
1251
880
  packageJson = JSON.parse(packageJsonContent);
1252
881
  } catch (error) {
1253
882
  console.error(`Error reading or parsing package.json:`, error);
@@ -1283,7 +912,7 @@ function getWorkshopConfig() {
1283
912
  cachedConfig = parsedConfig;
1284
913
  return parsedConfig;
1285
914
  } catch (error) {
1286
- if (error instanceof z$1.ZodError) {
915
+ if (error instanceof z.ZodError) {
1287
916
  const flattenedErrors = error.flatten();
1288
917
  const errorMessages = Object.entries(flattenedErrors.fieldErrors).map(([field, errors]) => `${field}: ${errors == null ? void 0 : errors.join(", ")}`).concat(flattenedErrors.formErrors);
1289
918
  throw new Error(
@@ -1326,15 +955,15 @@ async function getAppConfig(fullPath) {
1326
955
  let epicshopConfig = {};
1327
956
  let scripts = {};
1328
957
  const packageJsonPath = path$1.join(fullPath, "package.json");
1329
- const packageJsonExists = await fs.promises.access(packageJsonPath, fs.constants.F_OK).then(() => true).catch(() => false);
958
+ const packageJsonExists = await fs$1.promises.access(packageJsonPath, fs$1.constants.F_OK).then(() => true).catch(() => false);
1330
959
  if (packageJsonExists) {
1331
960
  const pkg = JSON.parse(
1332
- await fs.promises.readFile(path$1.join(fullPath, "package.json"), "utf8")
961
+ await fs$1.promises.readFile(path$1.join(fullPath, "package.json"), "utf8")
1333
962
  );
1334
963
  epicshopConfig = pkg.epicshop ?? {};
1335
964
  scripts = pkg.scripts ?? {};
1336
965
  }
1337
- const AppConfigSchema = z$1.object({
966
+ const AppConfigSchema = z.object({
1338
967
  stackBlitzConfig: StackBlitzConfigSchema.nullable().optional().transform((appStackBlitzConfig) => {
1339
968
  if (appStackBlitzConfig === null) return null;
1340
969
  return {
@@ -1342,14 +971,14 @@ async function getAppConfig(fullPath) {
1342
971
  ...appStackBlitzConfig
1343
972
  };
1344
973
  }),
1345
- testTab: z$1.object({
1346
- enabled: z$1.boolean().optional().default(((_a2 = workshopConfig.testTab) == null ? void 0 : _a2.enabled) ?? true)
974
+ testTab: z.object({
975
+ enabled: z.boolean().optional().default(((_a2 = workshopConfig.testTab) == null ? void 0 : _a2.enabled) ?? true)
1347
976
  }).default({}),
1348
- scripts: z$1.object({
1349
- test: z$1.string().optional(),
1350
- dev: z$1.string().optional()
977
+ scripts: z.object({
978
+ test: z.string().optional(),
979
+ dev: z.string().optional()
1351
980
  }).default({}),
1352
- initialRoute: z$1.string().optional().default(workshopConfig.initialRoute)
981
+ initialRoute: z.string().optional().default(workshopConfig.initialRoute)
1353
982
  });
1354
983
  const appConfig = {
1355
984
  stackBlitzConfig: epicshopConfig.stackBlitzConfig,
@@ -1365,7 +994,7 @@ async function getAppConfig(fullPath) {
1365
994
  try {
1366
995
  return AppConfigSchema.parse(appConfig);
1367
996
  } catch (error) {
1368
- if (error instanceof z$1.ZodError) {
997
+ if (error instanceof z.ZodError) {
1369
998
  const flattenedErrors = error.flatten();
1370
999
  const errorMessages = Object.entries(flattenedErrors.fieldErrors).map(([field, errors]) => `${field}: ${errors == null ? void 0 : errors.join(", ")}`).concat(flattenedErrors.formErrors);
1371
1000
  throw new Error(
@@ -1376,11 +1005,11 @@ ${errorMessages.join("\n")}`
1376
1005
  throw error;
1377
1006
  }
1378
1007
  }
1379
- const schema = z$1.object({
1380
- NODE_ENV: z$1.enum(["production", "development", "test"]).default("development"),
1381
- EPICSHOP_GITHUB_REPO: z$1.string(),
1382
- EPICSHOP_GITHUB_ROOT: z$1.string(),
1383
- EPICSHOP_CONTEXT_CWD: z$1.string()
1008
+ const schema = z.object({
1009
+ NODE_ENV: z.enum(["production", "development", "test"]).default("development"),
1010
+ EPICSHOP_GITHUB_REPO: z.string(),
1011
+ EPICSHOP_GITHUB_ROOT: z.string(),
1012
+ EPICSHOP_CONTEXT_CWD: z.string()
1384
1013
  });
1385
1014
  function init$1() {
1386
1015
  const parsed = schema.safeParse(process.env);
@@ -1665,92 +1294,92 @@ const playgroundAppNameInfoPath = path$1.join(
1665
1294
  "epicshop",
1666
1295
  "playground.json"
1667
1296
  );
1668
- const BaseAppSchema = z$1.object({
1297
+ const BaseAppSchema = z.object({
1669
1298
  /** a unique identifier for the app */
1670
- name: z$1.string(),
1299
+ name: z.string(),
1671
1300
  /** the title of the app used for display (comes from the package.json title prop) */
1672
- title: z$1.string(),
1301
+ title: z.string(),
1673
1302
  /** used when displaying the list of files to match the list of apps in the file system (comes the name of the directory of the app) */
1674
- dirName: z$1.string(),
1675
- fullPath: z$1.string(),
1676
- relativePath: z$1.string(),
1677
- instructionsCode: z$1.string().optional(),
1678
- epicVideoEmbeds: z$1.array(z$1.string()).optional(),
1679
- test: z$1.union([
1680
- z$1.object({
1681
- type: z$1.literal("browser"),
1682
- pathname: z$1.string(),
1683
- testFiles: z$1.array(z$1.string())
1303
+ dirName: z.string(),
1304
+ fullPath: z.string(),
1305
+ relativePath: z.string(),
1306
+ instructionsCode: z.string().optional(),
1307
+ epicVideoEmbeds: z.array(z.string()).optional(),
1308
+ test: z.union([
1309
+ z.object({
1310
+ type: z.literal("browser"),
1311
+ pathname: z.string(),
1312
+ testFiles: z.array(z.string())
1684
1313
  }),
1685
- z$1.object({ type: z$1.literal("script"), script: z$1.string() }),
1686
- z$1.object({ type: z$1.literal("none") })
1314
+ z.object({ type: z.literal("script"), script: z.string() }),
1315
+ z.object({ type: z.literal("none") })
1687
1316
  ]),
1688
- dev: z$1.union([
1689
- z$1.object({ type: z$1.literal("browser"), pathname: z$1.string() }),
1690
- z$1.object({
1691
- type: z$1.literal("script"),
1692
- portNumber: z$1.number(),
1693
- initialRoute: z$1.string()
1317
+ dev: z.union([
1318
+ z.object({ type: z.literal("browser"), pathname: z.string() }),
1319
+ z.object({
1320
+ type: z.literal("script"),
1321
+ portNumber: z.number(),
1322
+ initialRoute: z.string()
1694
1323
  }),
1695
- z$1.object({ type: z$1.literal("none") })
1324
+ z.object({ type: z.literal("none") })
1696
1325
  ]),
1697
- stackBlitzUrl: z$1.string().nullable()
1326
+ stackBlitzUrl: z.string().nullable()
1698
1327
  });
1699
1328
  const BaseExerciseStepAppSchema = BaseAppSchema.extend({
1700
- exerciseNumber: z$1.number(),
1701
- stepNumber: z$1.number()
1329
+ exerciseNumber: z.number(),
1330
+ stepNumber: z.number()
1702
1331
  });
1703
1332
  const ProblemAppSchema = BaseExerciseStepAppSchema.extend({
1704
- type: z$1.literal("problem"),
1705
- solutionName: z$1.string().nullable()
1333
+ type: z.literal("problem"),
1334
+ solutionName: z.string().nullable()
1706
1335
  });
1707
1336
  const SolutionAppSchema = BaseExerciseStepAppSchema.extend({
1708
- type: z$1.literal("solution"),
1709
- problemName: z$1.string().nullable()
1337
+ type: z.literal("solution"),
1338
+ problemName: z.string().nullable()
1710
1339
  });
1711
1340
  const ExampleAppSchema = BaseAppSchema.extend({
1712
- type: z$1.literal("example")
1341
+ type: z.literal("example")
1713
1342
  });
1714
1343
  const PlaygroundAppSchema = BaseAppSchema.extend({
1715
- type: z$1.literal("playground"),
1716
- appName: z$1.string(),
1717
- isUpToDate: z$1.boolean()
1344
+ type: z.literal("playground"),
1345
+ appName: z.string(),
1346
+ isUpToDate: z.boolean()
1718
1347
  });
1719
- z$1.object({
1348
+ z.object({
1720
1349
  /** a unique identifier for the exercise */
1721
- exerciseNumber: z$1.number(),
1350
+ exerciseNumber: z.number(),
1722
1351
  /** used when displaying the list of files to match the list of apps in the file system (comes the name of the directory of the app) */
1723
- dirName: z$1.string(),
1352
+ dirName: z.string(),
1724
1353
  /** the title of the app used for display (comes from the first h1 in the README) */
1725
- title: z$1.string(),
1726
- instructionsCode: z$1.string().optional(),
1727
- finishedCode: z$1.string().optional(),
1728
- instructionsEpicVideoEmbeds: z$1.array(z$1.string()).optional(),
1729
- finishedEpicVideoEmbeds: z$1.array(z$1.string()).optional(),
1730
- steps: z$1.array(
1731
- z$1.union([
1732
- z$1.object({
1733
- stepNumber: z$1.number(),
1354
+ title: z.string(),
1355
+ instructionsCode: z.string().optional(),
1356
+ finishedCode: z.string().optional(),
1357
+ instructionsEpicVideoEmbeds: z.array(z.string()).optional(),
1358
+ finishedEpicVideoEmbeds: z.array(z.string()).optional(),
1359
+ steps: z.array(
1360
+ z.union([
1361
+ z.object({
1362
+ stepNumber: z.number(),
1734
1363
  problem: ProblemAppSchema,
1735
1364
  solution: SolutionAppSchema
1736
1365
  }),
1737
- z$1.object({
1738
- stepNumber: z$1.number(),
1366
+ z.object({
1367
+ stepNumber: z.number(),
1739
1368
  problem: ProblemAppSchema,
1740
- solution: z$1.never().optional()
1369
+ solution: z.never().optional()
1741
1370
  }),
1742
- z$1.object({
1743
- stepNumber: z$1.number(),
1744
- problem: z$1.never().optional(),
1371
+ z.object({
1372
+ stepNumber: z.number(),
1373
+ problem: z.never().optional(),
1745
1374
  solution: SolutionAppSchema
1746
1375
  })
1747
1376
  ])
1748
1377
  ),
1749
- problems: z$1.array(ProblemAppSchema),
1750
- solutions: z$1.array(SolutionAppSchema)
1378
+ problems: z.array(ProblemAppSchema),
1379
+ solutions: z.array(SolutionAppSchema)
1751
1380
  });
1752
- const ExerciseStepAppSchema = z$1.union([ProblemAppSchema, SolutionAppSchema]);
1753
- const AppSchema = z$1.union([
1381
+ const ExerciseStepAppSchema = z.union([ProblemAppSchema, SolutionAppSchema]);
1382
+ const AppSchema = z.union([
1754
1383
  ExerciseStepAppSchema,
1755
1384
  PlaygroundAppSchema,
1756
1385
  ExampleAppSchema
@@ -1774,7 +1403,7 @@ function isExerciseStepApp(app) {
1774
1403
  return isProblemApp(app) || isSolutionApp(app);
1775
1404
  }
1776
1405
  function exists(file) {
1777
- return fs.promises.access(file, fs.constants.F_OK).then(
1406
+ return fs$1.promises.access(file, fs$1.constants.F_OK).then(
1778
1407
  () => true,
1779
1408
  () => false
1780
1409
  );
@@ -1817,9 +1446,6 @@ function getForceFresh$1(cacheEntry) {
1817
1446
  if (!latestModifiedTime) return void 0;
1818
1447
  return latestModifiedTime > cacheEntry.metadata.createdTime ? true : void 0;
1819
1448
  }
1820
- function setModifiedTimesForDir(dir) {
1821
- modifiedTimes.set(dir, Date.now());
1822
- }
1823
1449
  function getForceFreshForDir(cacheEntry, ...dirs) {
1824
1450
  const truthyDirs = dirs.filter(Boolean);
1825
1451
  for (const d of truthyDirs) {
@@ -1837,7 +1463,7 @@ function getForceFreshForDir(cacheEntry, ...dirs) {
1837
1463
  }
1838
1464
  async function readDir(dir) {
1839
1465
  if (await exists(dir)) {
1840
- return fs.promises.readdir(dir);
1466
+ return fs$1.promises.readdir(dir);
1841
1467
  }
1842
1468
  return [];
1843
1469
  }
@@ -1991,10 +1617,10 @@ async function getApps({
1991
1617
  });
1992
1618
  return apps;
1993
1619
  }
1994
- const AppIdInfoSchema = z$1.object({
1995
- exerciseNumber: z$1.string(),
1996
- stepNumber: z$1.string(),
1997
- type: z$1.union([z$1.literal("problem"), z$1.literal("solution")])
1620
+ const AppIdInfoSchema = z.object({
1621
+ exerciseNumber: z.string(),
1622
+ stepNumber: z.string(),
1623
+ type: z.union([z.literal("problem"), z.literal("solution")])
1998
1624
  });
1999
1625
  function extractNumbersAndTypeFromAppNameOrPath(fullPathOrAppName) {
2000
1626
  var _a2;
@@ -2089,7 +1715,7 @@ async function findSolutionDir({
2089
1715
  const { stepNumber } = info;
2090
1716
  const paddedStepNumber = stepNumber.toString().padStart(2, "0");
2091
1717
  const parentDir = path$1.dirname(fullPath);
2092
- const siblingDirs = await fs.promises.readdir(parentDir);
1718
+ const siblingDirs = await fs$1.promises.readdir(parentDir);
2093
1719
  const solutionDir = siblingDirs.find(
2094
1720
  (dir) => dir.startsWith(`${paddedStepNumber}.solution`)
2095
1721
  );
@@ -2116,7 +1742,7 @@ async function findProblemDir({
2116
1742
  const { stepNumber } = info;
2117
1743
  const paddedStepNumber = stepNumber.toString().padStart(2, "0");
2118
1744
  const parentDir = path$1.dirname(fullPath);
2119
- const siblingDirs = await fs.promises.readdir(parentDir);
1745
+ const siblingDirs = await fs$1.promises.readdir(parentDir);
2120
1746
  const problemDir = siblingDirs.find(
2121
1747
  (dir) => dir.endsWith("problem") && dir.includes(paddedStepNumber)
2122
1748
  );
@@ -2143,7 +1769,7 @@ async function getTestInfo({
2143
1769
  return { type: "script", script: testScript };
2144
1770
  }
2145
1771
  const testAppFullPath = await findSolutionDir({ fullPath }) ?? fullPath;
2146
- const dirList = await fs.promises.readdir(testAppFullPath);
1772
+ const dirList = await fs$1.promises.readdir(testAppFullPath);
2147
1773
  const testFiles = dirList.filter((item) => item.includes(".test."));
2148
1774
  if (testFiles.length) {
2149
1775
  return {
@@ -2460,10 +2086,10 @@ async function requireExerciseApp(params, { request, timings } = {}) {
2460
2086
  }
2461
2087
  return app;
2462
2088
  }
2463
- const ExerciseAppParamsSchema$1 = z$1.object({
2464
- type: z$1.union([z$1.literal("problem"), z$1.literal("solution")]),
2465
- exerciseNumber: z$1.coerce.number().finite(),
2466
- stepNumber: z$1.coerce.number().finite()
2089
+ const ExerciseAppParamsSchema$1 = z.object({
2090
+ type: z.union([z.literal("problem"), z.literal("solution")]),
2091
+ exerciseNumber: z.coerce.number().finite(),
2092
+ stepNumber: z.coerce.number().finite()
2467
2093
  });
2468
2094
  async function getExerciseApp(params, { request, timings } = {}) {
2469
2095
  const result = ExerciseAppParamsSchema$1.safeParse(params);
@@ -2627,7 +2253,7 @@ async function getPlaygroundAppName() {
2627
2253
  return null;
2628
2254
  }
2629
2255
  try {
2630
- const jsonString = await fs.promises.readFile(
2256
+ const jsonString = await fs$1.promises.readFile(
2631
2257
  playgroundAppNameInfoPath,
2632
2258
  "utf8"
2633
2259
  );
@@ -2640,7 +2266,7 @@ async function getPlaygroundAppName() {
2640
2266
  }
2641
2267
  async function getDirModifiedTime(dir) {
2642
2268
  const isIgnored = await isGitIgnored({ cwd: dir });
2643
- const files = await fs.promises.readdir(dir, { withFileTypes: true });
2269
+ const files = await fs$1.promises.readdir(dir, { withFileTypes: true });
2644
2270
  const modifiedTimes2 = await Promise.all(
2645
2271
  files.map(async (file) => {
2646
2272
  if (isIgnored(file.name)) return 0;
@@ -2649,7 +2275,7 @@ async function getDirModifiedTime(dir) {
2649
2275
  return getDirModifiedTime(filePath);
2650
2276
  } else {
2651
2277
  try {
2652
- const { mtimeMs } = await fs.promises.stat(filePath);
2278
+ const { mtimeMs } = await fs$1.promises.stat(filePath);
2653
2279
  return mtimeMs;
2654
2280
  } catch {
2655
2281
  return 0;
@@ -3327,10 +2953,10 @@ function setTheme(theme) {
3327
2953
  });
3328
2954
  }
3329
2955
  const ROUTE_PATH = "/theme";
3330
- const ThemeFormSchema = z$1.object({
3331
- theme: z$1.enum(["system", "light", "dark"])
2956
+ const ThemeFormSchema = z.object({
2957
+ theme: z.enum(["system", "light", "dark"])
3332
2958
  });
3333
- async function action$c({ request }) {
2959
+ async function action$b({ request }) {
3334
2960
  const formData = await request.formData();
3335
2961
  const submission = parseWithZod(formData, {
3336
2962
  schema: ThemeFormSchema
@@ -3403,11 +3029,11 @@ function useTheme() {
3403
3029
  const route42 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
3404
3030
  __proto__: null,
3405
3031
  ThemeSwitch,
3406
- action: action$c,
3032
+ action: action$b,
3407
3033
  useTheme
3408
3034
  }, Symbol.toStringTag, { value: "Module" }));
3409
3035
  const appStylesheetUrl = "/assets/app-b7uXHF5m.css";
3410
- const tailwindStylesheetUrl = "/assets/tailwind-CFrdHbaR.css";
3036
+ const tailwindStylesheetUrl = "/assets/tailwind-B9pSujyx.css";
3411
3037
  const cookieName = "EpicShop_confetti";
3412
3038
  function getConfetti(request) {
3413
3039
  const cookieHeader = request.headers.get("cookie");
@@ -3425,39 +3051,39 @@ function createConfettiHeaders(value = String(Date.now())) {
3425
3051
  })
3426
3052
  });
3427
3053
  }
3428
- const Transcript = z$1.string().nullable().optional().transform((s) => s ?? "Transcripts not available");
3429
- const EpicVideoInfoSchema = z$1.object({
3054
+ const Transcript = z.string().nullable().optional().transform((s) => s ?? "Transcripts not available");
3055
+ const EpicVideoInfoSchema = z.object({
3430
3056
  transcript: Transcript,
3431
- muxPlaybackId: z$1.string()
3057
+ muxPlaybackId: z.string()
3432
3058
  });
3433
- const EpicVideoRegionRestrictedErrorSchema = z$1.object({
3434
- requestCountry: z$1.string(),
3435
- restrictedCountry: z$1.string(),
3436
- isRegionRestricted: z$1.literal(true)
3059
+ const EpicVideoRegionRestrictedErrorSchema = z.object({
3060
+ requestCountry: z.string(),
3061
+ restrictedCountry: z.string(),
3062
+ isRegionRestricted: z.literal(true)
3437
3063
  });
3438
- const CachedEpicVideoInfoSchema = z$1.object({
3064
+ const CachedEpicVideoInfoSchema = z.object({
3439
3065
  transcript: Transcript,
3440
- muxPlaybackId: z$1.string(),
3441
- status: z$1.literal("success"),
3442
- statusCode: z$1.number(),
3443
- statusText: z$1.string()
3066
+ muxPlaybackId: z.string(),
3067
+ status: z.literal("success"),
3068
+ statusCode: z.number(),
3069
+ statusText: z.string()
3444
3070
  }).or(
3445
- z$1.object({
3446
- status: z$1.literal("error"),
3447
- statusCode: z$1.number(),
3448
- statusText: z$1.string(),
3449
- type: z$1.literal("unknown")
3071
+ z.object({
3072
+ status: z.literal("error"),
3073
+ statusCode: z.number(),
3074
+ statusText: z.string(),
3075
+ type: z.literal("unknown")
3450
3076
  })
3451
3077
  ).or(
3452
- z$1.object({
3453
- status: z$1.literal("error"),
3454
- statusCode: z$1.number(),
3455
- statusText: z$1.string(),
3456
- type: z$1.literal("region-restricted"),
3457
- requestCountry: z$1.string(),
3458
- restrictedCountry: z$1.string()
3078
+ z.object({
3079
+ status: z.literal("error"),
3080
+ statusCode: z.number(),
3081
+ statusText: z.string(),
3082
+ type: z.literal("region-restricted"),
3083
+ requestCountry: z.string(),
3084
+ restrictedCountry: z.string()
3459
3085
  })
3460
- ).or(z$1.null());
3086
+ ).or(z.null());
3461
3087
  async function getEpicVideoInfos(epicWebUrls, { request, timings } = {}) {
3462
3088
  if (!epicWebUrls) return {};
3463
3089
  const authInfo = await getAuthInfo();
@@ -3571,10 +3197,10 @@ async function getEpicProgress({
3571
3197
  } = getWorkshopConfig();
3572
3198
  if (!authInfo) return [];
3573
3199
  const tokenPart = md5(authInfo.tokenSet.access_token);
3574
- const EpicProgressSchema = z$1.array(
3575
- z$1.object({
3576
- lessonId: z$1.string(),
3577
- completedAt: z$1.string().nullable()
3200
+ const EpicProgressSchema = z.array(
3201
+ z.object({
3202
+ lessonId: z.string(),
3203
+ completedAt: z.string().nullable()
3578
3204
  })
3579
3205
  );
3580
3206
  return cachified({
@@ -3735,17 +3361,17 @@ async function updateProgress({ lessonSlug, complete }, {
3735
3361
  }
3736
3362
  return { status: "success" };
3737
3363
  }
3738
- const ModuleSchema = z$1.object({
3739
- resources: z$1.array(
3740
- z$1.union([
3741
- z$1.object({
3742
- _type: z$1.literal("lesson"),
3743
- _id: z$1.string(),
3744
- slug: z$1.string()
3364
+ const ModuleSchema = z.object({
3365
+ resources: z.array(
3366
+ z.union([
3367
+ z.object({
3368
+ _type: z.literal("lesson"),
3369
+ _id: z.string(),
3370
+ slug: z.string()
3745
3371
  }),
3746
- z$1.object({
3747
- _type: z$1.literal("section"),
3748
- lessons: z$1.array(z$1.object({ _id: z$1.string(), slug: z$1.string() }))
3372
+ z.object({
3373
+ _type: z.literal("section"),
3374
+ lessons: z.array(z.object({ _id: z.string(), slug: z.string() }))
3749
3375
  })
3750
3376
  ])
3751
3377
  )
@@ -3808,7 +3434,7 @@ async function userHasAccessToWorkshop({
3808
3434
  forceFresh,
3809
3435
  timings,
3810
3436
  ttl: 1e3 * 5,
3811
- checkValue: z$1.boolean(),
3437
+ checkValue: z.boolean(),
3812
3438
  async getFreshValue(context) {
3813
3439
  const response = await fetch(
3814
3440
  `https://${host}/api/workshops/${encodeURIComponent(slug)}/access`,
@@ -3837,10 +3463,10 @@ function useOptionalWorkshopTitle() {
3837
3463
  const data = useRouteLoaderData("root");
3838
3464
  return (data == null ? void 0 : data.workshopTitle) ?? null;
3839
3465
  }
3840
- const ExerciseAppParamsSchema = z$1.object({
3841
- type: z$1.union([z$1.literal("problem"), z$1.literal("solution")]).optional(),
3842
- exerciseNumber: z$1.coerce.number().finite(),
3843
- stepNumber: z$1.coerce.number().finite().optional()
3466
+ const ExerciseAppParamsSchema = z.object({
3467
+ type: z.union([z.literal("problem"), z.literal("solution")]).optional(),
3468
+ exerciseNumber: z.coerce.number().finite(),
3469
+ stepNumber: z.coerce.number().finite().optional()
3844
3470
  });
3845
3471
  function usePresenceSocket(user) {
3846
3472
  const workshopTitle = useOptionalWorkshopTitle();
@@ -3980,11 +3606,11 @@ function getSeoMetaTags({
3980
3606
  ].filter(Boolean);
3981
3607
  }
3982
3608
  const toastKey = "toast";
3983
- const TypeSchema = z$1.enum(["message", "success", "error"]);
3984
- const ToastSchema = z$1.object({
3985
- description: z$1.string(),
3986
- id: z$1.string().default(() => createId()),
3987
- title: z$1.string().optional(),
3609
+ const TypeSchema = z.enum(["message", "success", "error"]);
3610
+ const ToastSchema = z.object({
3611
+ description: z.string(),
3612
+ id: z.string().default(() => createId()),
3613
+ title: z.string().optional(),
3988
3614
  type: TypeSchema.default("message")
3989
3615
  });
3990
3616
  const toastSessionStorage = createCookieSessionStorage({
@@ -4613,7 +4239,7 @@ function useProgressItem({
4613
4239
  }
4614
4240
  return null;
4615
4241
  }
4616
- async function action$b({ request }) {
4242
+ async function action$a({ request }) {
4617
4243
  ensureUndeployed();
4618
4244
  await requireAuthInfo({ request });
4619
4245
  const formData = await request.formData();
@@ -4784,7 +4410,7 @@ function ProgressToggle({
4784
4410
  const route36 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
4785
4411
  __proto__: null,
4786
4412
  ProgressToggle,
4787
- action: action$b,
4413
+ action: action$a,
4788
4414
  useEpicProgress,
4789
4415
  useExerciseProgressClassName,
4790
4416
  useNextExerciseRoute,
@@ -5940,12 +5566,12 @@ function ButtonLink({
5940
5566
  }
5941
5567
  const port = process.env.PORT || "5639";
5942
5568
  const scope = "guilds.join identify messages.read";
5943
- const DiscordApiResponseSchema = z$1.object({
5944
- status: z$1.literal("error"),
5945
- error: z$1.string()
5569
+ const DiscordApiResponseSchema = z.object({
5570
+ status: z.literal("error"),
5571
+ error: z.string()
5946
5572
  }).or(
5947
- z$1.object({
5948
- status: z$1.literal("success"),
5573
+ z.object({
5574
+ status: z.literal("success"),
5949
5575
  member: DiscordMemberSchema
5950
5576
  })
5951
5577
  );
@@ -6026,7 +5652,7 @@ async function loader$u({ request }) {
6026
5652
  await requireAuthInfo({ request });
6027
5653
  return json$1({ discordAuthUrl: getDiscordAuthURL() });
6028
5654
  }
6029
- async function action$a({ request }) {
5655
+ async function action$9({ request }) {
6030
5656
  ensureUndeployed();
6031
5657
  const formData = await request.formData();
6032
5658
  const intent = formData.get("intent");
@@ -6150,7 +5776,7 @@ function Account() {
6150
5776
  }
6151
5777
  const route3 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
6152
5778
  __proto__: null,
6153
- action: action$a,
5779
+ action: action$9,
6154
5780
  default: Account,
6155
5781
  handle: handle$7,
6156
5782
  loader: loader$u
@@ -6179,7 +5805,7 @@ async function compileTs(filePath, fullPath, {
6179
5805
  getFreshValue: async () => {
6180
5806
  const result = await esbuild.build({
6181
5807
  stdin: {
6182
- contents: await fs$1.promises.readFile(filePath, "utf-8"),
5808
+ contents: await fs.promises.readFile(filePath, "utf-8"),
6183
5809
  // NOTE: if the fileAppName is specified, then we're resolving to a different
6184
5810
  // app than the one we're serving the file from. We do this so the tests
6185
5811
  // can live in the solution directory, but be run against the problem
@@ -6312,7 +5938,7 @@ async function loader$s(args) {
6312
5938
  api.cleanupError(error);
6313
5939
  }
6314
5940
  }
6315
- async function action$9(args) {
5941
+ async function action$8(args) {
6316
5942
  const api = await getApiModule(args);
6317
5943
  invariantResponse(
6318
5944
  api.mod.action,
@@ -6326,9 +5952,9 @@ async function action$9(args) {
6326
5952
  api.cleanupError(error);
6327
5953
  }
6328
5954
  }
6329
- const ApiModuleSchema = z$1.object({
6330
- loader: z$1.function().optional(),
6331
- action: z$1.function().optional()
5955
+ const ApiModuleSchema = z.object({
5956
+ loader: z.function().optional(),
5957
+ action: z.function().optional()
6332
5958
  });
6333
5959
  async function getApiModule({ request, params }) {
6334
5960
  const timings = makeTimings("app-api");
@@ -6400,7 +6026,7 @@ async function getApiModule({ request, params }) {
6400
6026
  }
6401
6027
  const route5 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
6402
6028
  __proto__: null,
6403
- action: action$9,
6029
+ action: action$8,
6404
6030
  loader: loader$s
6405
6031
  }, Symbol.toStringTag, { value: "Module" }));
6406
6032
  async function loader$r({ request, params }) {
@@ -6837,9 +6463,9 @@ const route11 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePrope
6837
6463
  default: ExercisesLayout,
6838
6464
  handle: handle$5
6839
6465
  }, Symbol.toStringTag, { value: "Module" }));
6840
- const PlaybackTimeSchema = z$1.object({
6841
- time: z$1.number(),
6842
- expiresAt: z$1.string()
6466
+ const PlaybackTimeSchema = z.object({
6467
+ time: z.number(),
6468
+ expiresAt: z.string()
6843
6469
  }).transform((data) => {
6844
6470
  return { time: Number(data.time), expiresAt: new Date(data.expiresAt) };
6845
6471
  });
@@ -6856,7 +6482,7 @@ const ignoredInputs = [
6856
6482
  "mux-player",
6857
6483
  "summary"
6858
6484
  ];
6859
- async function action$8({ request }) {
6485
+ async function action$7({ request }) {
6860
6486
  const result = PlayerPreferencesSchema.safeParse(await request.json());
6861
6487
  if (!result.success) {
6862
6488
  return json$1({ status: "error", error: result.error.flatten() }, {
@@ -7025,10 +6651,10 @@ function isDeepEqual(obj1, obj2) {
7025
6651
  }
7026
6652
  return true;
7027
6653
  }
7028
- const route44 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
6654
+ const route43 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
7029
6655
  __proto__: null,
7030
6656
  MuxPlayer,
7031
- action: action$8,
6657
+ action: action$7,
7032
6658
  usePlayerPreferences
7033
6659
  }, Symbol.toStringTag, { value: "Module" }));
7034
6660
  function Loading({
@@ -7764,7 +7390,7 @@ async function launchEditor(pathList, lineNumber = 1, colNumber = 1) {
7764
7390
  )) {
7765
7391
  acc.errorsList.push(fileName);
7766
7392
  } else {
7767
- if (!fs$1.existsSync(fileName)) {
7393
+ if (!fs.existsSync(fileName)) {
7768
7394
  fsExtra.ensureDirSync(path.dirname(fileName));
7769
7395
  fsExtra.writeFileSync(fileName, "", "utf8");
7770
7396
  }
@@ -7854,27 +7480,27 @@ The editor process exited with an error code (${errorCode}).`
7854
7480
  });
7855
7481
  }
7856
7482
  function getFileDescriptorSchema(appFile) {
7857
- return z$1.union([
7858
- z$1.object({
7859
- type: z$1.literal("file"),
7860
- file: z$1.string()
7483
+ return z.union([
7484
+ z.object({
7485
+ type: z.literal("file"),
7486
+ file: z.string()
7861
7487
  }),
7862
- z$1.object({
7863
- type: z$1.literal("appFile"),
7488
+ z.object({
7489
+ type: z.literal("appFile"),
7864
7490
  appFile,
7865
- appName: z$1.string()
7491
+ appName: z.string()
7866
7492
  })
7867
7493
  ]);
7868
7494
  }
7869
- const LaunchSchema = z$1.intersection(
7870
- z$1.object({
7871
- line: z$1.coerce.number().optional(),
7872
- column: z$1.coerce.number().optional(),
7873
- syncTo: getFileDescriptorSchema(z$1.string()).optional()
7495
+ const LaunchSchema = z.intersection(
7496
+ z.object({
7497
+ line: z.coerce.number().optional(),
7498
+ column: z.coerce.number().optional(),
7499
+ syncTo: getFileDescriptorSchema(z.string()).optional()
7874
7500
  }),
7875
- getFileDescriptorSchema(z$1.array(z$1.string()))
7501
+ getFileDescriptorSchema(z.array(z.string()))
7876
7502
  );
7877
- async function action$7({ request }) {
7503
+ async function action$6({ request }) {
7878
7504
  ensureUndeployed();
7879
7505
  const formData = await request.formData();
7880
7506
  const syncTo = {
@@ -8125,7 +7751,7 @@ const route31 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePrope
8125
7751
  __proto__: null,
8126
7752
  EditFileOnGitHub,
8127
7753
  LaunchEditor,
8128
- action: action$7
7754
+ action: action$6
8129
7755
  }, Symbol.toStringTag, { value: "Module" }));
8130
7756
  const safePath = (s) => s.replace(/\\/g, "/");
8131
7757
  function getRelativePath(file, separator, type) {
@@ -8959,11 +8585,11 @@ ${getFileCodeblocks(file, filePathApp1, filePathApp2, file.type).join("\n")}
8959
8585
  const code = await compileMarkdownString(markdownLines.join("\n"));
8960
8586
  return code;
8961
8587
  }
8962
- const SetPlaygroundSchema = z$1.object({
8963
- appName: z$1.string(),
8964
- reset: z$1.string().nullable().optional().transform((v) => v === "true")
8588
+ const SetPlaygroundSchema = z.object({
8589
+ appName: z.string(),
8590
+ reset: z.string().nullable().optional().transform((v) => v === "true")
8965
8591
  });
8966
- async function action$6({ request }) {
8592
+ async function action$5({ request }) {
8967
8593
  ensureUndeployed();
8968
8594
  const formData = await request.formData();
8969
8595
  const rawData = {
@@ -9143,86 +8769,6 @@ const route38 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePrope
9143
8769
  PlaygroundChooser,
9144
8770
  SetAppToPlayground,
9145
8771
  SetPlayground,
9146
- action: action$6
9147
- }, Symbol.toStringTag, { value: "Module" }));
9148
- const cacheSchema = z$1.object({
9149
- cacheLocation: z$1.string(),
9150
- embeddedKey: z$1.string(),
9151
- appFullPath: z$1.string()
9152
- });
9153
- function checkFileExists(file) {
9154
- return fs.promises.access(file, fs.constants.F_OK).then(
9155
- () => true,
9156
- () => false
9157
- );
9158
- }
9159
- async function action$5({ request }) {
9160
- var _a2, _b;
9161
- ensureUndeployed();
9162
- const formData = await request.formData();
9163
- const rawData = {
9164
- cacheLocation: formData.get("cacheLocation"),
9165
- embeddedKey: formData.get("embeddedKey"),
9166
- appFullPath: formData.get("appFullPath")
9167
- };
9168
- const { cacheLocation, embeddedKey, appFullPath } = cacheSchema.parse(rawData);
9169
- if (!await checkFileExists(cacheLocation)) {
9170
- console.log(`file ${cacheLocation} not found`);
9171
- return json$1({ success: true });
9172
- }
9173
- const cached = JSON.parse(
9174
- await fs.promises.readFile(cacheLocation, "utf-8")
9175
- );
9176
- const cachedEmbeddedFiles = new Map(
9177
- Object.entries(((_a2 = cached == null ? void 0 : cached.value) == null ? void 0 : _a2.embeddedFiles) ?? {})
9178
- );
9179
- if (cachedEmbeddedFiles.has(embeddedKey)) {
9180
- (_b = cachedEmbeddedFiles.get(embeddedKey)) == null ? true : delete _b.warning;
9181
- cached.value.embeddedFiles = Object.fromEntries(cachedEmbeddedFiles);
9182
- }
9183
- try {
9184
- cached.value.warningCancled = true;
9185
- await fs.promises.writeFile(cacheLocation, JSON.stringify(cached));
9186
- } catch (error) {
9187
- console.log(
9188
- `Error when trying to write cache file at ${cacheLocation}`,
9189
- error
9190
- );
9191
- }
9192
- setModifiedTimesForDir(appFullPath);
9193
- return jsonWithPE(formData, { success: true });
9194
- }
9195
- function UpdateMdxCache({
9196
- handleClick,
9197
- cacheLocation,
9198
- embeddedKey,
9199
- appFullPath
9200
- }) {
9201
- const fetcher = useFetcher();
9202
- const peRedirectInput = usePERedirectInput();
9203
- return /* @__PURE__ */ jsxs(fetcher.Form, { action: "/update-mdx-cache", method: "POST", children: [
9204
- peRedirectInput,
9205
- showProgressBarField,
9206
- /* @__PURE__ */ jsx("input", { type: "hidden", name: "cacheLocation", value: cacheLocation }),
9207
- /* @__PURE__ */ jsx("input", { type: "hidden", name: "embeddedKey", value: embeddedKey }),
9208
- /* @__PURE__ */ jsx("input", { type: "hidden", name: "appFullPath", value: appFullPath }),
9209
- /* @__PURE__ */ jsx(
9210
- "button",
9211
- {
9212
- type: "submit",
9213
- onClick: handleClick,
9214
- className: clsx(
9215
- "launch_button",
9216
- fetcher.state === "idle" ? null : "cursor-progress"
9217
- ),
9218
- children: "Cancel Warning"
9219
- }
9220
- )
9221
- ] });
9222
- }
9223
- const route43 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
9224
- __proto__: null,
9225
- UpdateMdxCache,
9226
8772
  action: action$5
9227
8773
  }, Symbol.toStringTag, { value: "Module" }));
9228
8774
  const StepContext = React.createContext(null);
@@ -9240,8 +8786,6 @@ function StepContextProvider({
9240
8786
  return /* @__PURE__ */ jsx(StepContext.Provider, { value: { inBrowserBrowserRef }, children });
9241
8787
  }
9242
8788
  const stepMdxComponents = {
9243
- CodeFile,
9244
- CodeFileNotification,
9245
8789
  DiffLink,
9246
8790
  PrevDiffLink,
9247
8791
  NextDiffLink,
@@ -9356,73 +8900,6 @@ function DiffLink({
9356
8900
  }
9357
8901
  return /* @__PURE__ */ jsx(Link, { to: pathToDiff, children });
9358
8902
  }
9359
- function CodeFile({ file }) {
9360
- return /* @__PURE__ */ jsxs("div", { className: "border-4 border-[#ff4545] bg-[#ff454519] p-4 text-lg", children: [
9361
- "Something went wrong compiling ",
9362
- /* @__PURE__ */ jsx("b", { children: "CodeFile" }),
9363
- " for file: ",
9364
- /* @__PURE__ */ jsx("u", { children: file }),
9365
- " to markdown"
9366
- ] });
9367
- }
9368
- function CodeFileNotification({
9369
- file,
9370
- type = "problem",
9371
- children,
9372
- variant,
9373
- cacheLocation,
9374
- embeddedKey,
9375
- ...props
9376
- }) {
9377
- const [visibility, setVisibility] = useState("visible");
9378
- const data = useLoaderData();
9379
- const app = data[type];
9380
- const handleClick = () => {
9381
- if (visibility !== "visible") return;
9382
- setVisibility("collapse");
9383
- setTimeout(() => {
9384
- setVisibility("none");
9385
- }, 400);
9386
- };
9387
- const className = clsx(
9388
- "rounded px-4 py-1 font-mono text-sm font-semibold outline-none transition duration-300 ease-in-out",
9389
- {
9390
- "bg-amber-300/70 hover:bg-amber-300/40 active:bg-amber-300/50": variant === "warning",
9391
- "bg-red-300/70 hover:bg-red-300/40 active:bg-red-300/50": variant === "error"
9392
- }
9393
- );
9394
- return /* @__PURE__ */ jsxs(
9395
- "div",
9396
- {
9397
- className: clsx("notification important h-15 relative", {
9398
- "duration-400 !my-0 !h-0 !py-0 !opacity-0 transition-all ease-out": visibility !== "visible",
9399
- hidden: visibility === "none"
9400
- }),
9401
- children: [
9402
- /* @__PURE__ */ jsxs("div", { className: "absolute right-3 top-3 z-50 flex gap-4", children: [
9403
- app ? /* @__PURE__ */ jsx("div", { className, title: `Edit ${file}`, children: /* @__PURE__ */ jsx(LaunchEditor, { appFile: file, appName: app.name, ...props, children: "Edit this File" }) }) : null,
9404
- app && variant === "warning" ? /* @__PURE__ */ jsx(
9405
- "div",
9406
- {
9407
- className,
9408
- title: `Remove the warning from here and from ${file} cache file`,
9409
- children: /* @__PURE__ */ jsx(
9410
- UpdateMdxCache,
9411
- {
9412
- handleClick,
9413
- cacheLocation,
9414
- embeddedKey,
9415
- appFullPath: app.fullPath
9416
- }
9417
- )
9418
- }
9419
- ) : null
9420
- ] }),
9421
- children
9422
- ]
9423
- }
9424
- );
9425
- }
9426
8903
  function InlineFile({
9427
8904
  file,
9428
8905
  type = "playground",
@@ -10039,43 +9516,43 @@ const route40 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePrope
10039
9516
  PortStopper,
10040
9517
  action: action$4
10041
9518
  }, Symbol.toStringTag, { value: "Module" }));
10042
- const historyCallDataSchema = z$1.intersection(
10043
- z$1.object({
10044
- type: z$1.literal("epicshop:history-call")
9519
+ const historyCallDataSchema = z.intersection(
9520
+ z.object({
9521
+ type: z.literal("epicshop:history-call")
10045
9522
  }),
10046
- z$1.union([
10047
- z$1.object({
10048
- method: z$1.literal("pushState"),
10049
- args: z$1.union([
10050
- z$1.tuple([z$1.object({}).passthrough(), z$1.unknown()]),
10051
- z$1.tuple([z$1.object({}).passthrough(), z$1.unknown(), z$1.string()])
9523
+ z.union([
9524
+ z.object({
9525
+ method: z.literal("pushState"),
9526
+ args: z.union([
9527
+ z.tuple([z.object({}).passthrough(), z.unknown()]),
9528
+ z.tuple([z.object({}).passthrough(), z.unknown(), z.string()])
10052
9529
  ])
10053
9530
  }),
10054
- z$1.object({
10055
- method: z$1.literal("replaceState"),
10056
- args: z$1.union([
10057
- z$1.tuple([z$1.object({}).passthrough(), z$1.unknown()]),
10058
- z$1.tuple([z$1.object({}).passthrough(), z$1.unknown(), z$1.string()])
9531
+ z.object({
9532
+ method: z.literal("replaceState"),
9533
+ args: z.union([
9534
+ z.tuple([z.object({}).passthrough(), z.unknown()]),
9535
+ z.tuple([z.object({}).passthrough(), z.unknown(), z.string()])
10059
9536
  ])
10060
9537
  }),
10061
- z$1.object({
10062
- method: z$1.literal("go"),
10063
- args: z$1.tuple([z$1.number().optional()])
9538
+ z.object({
9539
+ method: z.literal("go"),
9540
+ args: z.tuple([z.number().optional()])
10064
9541
  }),
10065
- z$1.object({ method: z$1.literal("forward"), args: z$1.tuple([]) }),
10066
- z$1.object({ method: z$1.literal("back"), args: z$1.tuple([]) }),
10067
- z$1.object({
10068
- method: z$1.literal("popstate"),
10069
- pathname: z$1.string(),
10070
- delta: z$1.number()
9542
+ z.object({ method: z.literal("forward"), args: z.tuple([]) }),
9543
+ z.object({ method: z.literal("back"), args: z.tuple([]) }),
9544
+ z.object({
9545
+ method: z.literal("popstate"),
9546
+ pathname: z.string(),
9547
+ delta: z.number()
10071
9548
  })
10072
9549
  ])
10073
9550
  );
10074
- const loadedSchema = z$1.object({
10075
- type: z$1.literal("epicshop:loaded"),
10076
- url: z$1.string()
9551
+ const loadedSchema = z.object({
9552
+ type: z.literal("epicshop:loaded"),
9553
+ url: z.string()
10077
9554
  });
10078
- const messageSchema = z$1.union([historyCallDataSchema, loadedSchema]);
9555
+ const messageSchema = z.union([historyCallDataSchema, loadedSchema]);
10079
9556
  function getNewIndex(prevIndex, delta, max) {
10080
9557
  return Math.min(Math.max(prevIndex + delta, 0), max);
10081
9558
  }
@@ -10835,49 +10312,49 @@ function getDayjs() {
10835
10312
  initialized = true;
10836
10313
  return dayjs;
10837
10314
  }
10838
- const EmojiDataSchema = z$1.union([
10839
- z$1.object({
10840
- emojiName: z$1.never().optional(),
10841
- emojiUrl: z$1.string()
10315
+ const EmojiDataSchema = z.union([
10316
+ z.object({
10317
+ emojiName: z.never().optional(),
10318
+ emojiUrl: z.string()
10842
10319
  }),
10843
- z$1.object({
10844
- emojiName: z$1.string(),
10845
- emojiUrl: z$1.never().optional()
10320
+ z.object({
10321
+ emojiName: z.string(),
10322
+ emojiUrl: z.never().optional()
10846
10323
  }),
10847
- z$1.object({
10848
- emojiName: z$1.never().optional(),
10849
- emojiUrl: z$1.never().optional()
10324
+ z.object({
10325
+ emojiName: z.never().optional(),
10326
+ emojiUrl: z.never().optional()
10850
10327
  })
10851
10328
  ]);
10852
- const ThreadItemSchema = z$1.object({
10853
- id: z$1.string(),
10854
- tags: z$1.array(
10855
- z$1.object({
10856
- name: z$1.string()
10329
+ const ThreadItemSchema = z.object({
10330
+ id: z.string(),
10331
+ tags: z.array(
10332
+ z.object({
10333
+ name: z.string()
10857
10334
  }).and(EmojiDataSchema)
10858
10335
  ),
10859
- name: z$1.string(),
10860
- link: z$1.string(),
10861
- authorDisplayName: z$1.string(),
10862
- authorHexAccentColor: z$1.string().nullable().optional(),
10863
- authorAvatarUrl: z$1.string().nullable(),
10864
- messagePreview: z$1.string(),
10865
- messageCount: z$1.number(),
10866
- lastUpdated: z$1.string(),
10867
- previewImageUrl: z$1.string().nullable(),
10868
- reactions: z$1.array(
10869
- z$1.object({
10870
- count: z$1.number()
10336
+ name: z.string(),
10337
+ link: z.string(),
10338
+ authorDisplayName: z.string(),
10339
+ authorHexAccentColor: z.string().nullable().optional(),
10340
+ authorAvatarUrl: z.string().nullable(),
10341
+ messagePreview: z.string(),
10342
+ messageCount: z.number(),
10343
+ lastUpdated: z.string(),
10344
+ previewImageUrl: z.string().nullable(),
10345
+ reactions: z.array(
10346
+ z.object({
10347
+ count: z.number()
10871
10348
  }).and(EmojiDataSchema)
10872
10349
  )
10873
10350
  });
10874
- const ThreadDataSchema = z$1.array(ThreadItemSchema);
10875
- const EpicForumResponseSchema = z$1.object({
10876
- status: z$1.literal("error"),
10877
- error: z$1.string()
10351
+ const ThreadDataSchema = z.array(ThreadItemSchema);
10352
+ const EpicForumResponseSchema = z.object({
10353
+ status: z.literal("error"),
10354
+ error: z.string()
10878
10355
  }).or(
10879
- z$1.object({
10880
- status: z$1.literal("success"),
10356
+ z.object({
10357
+ status: z.literal("success"),
10881
10358
  threadData: ThreadDataSchema
10882
10359
  })
10883
10360
  );
@@ -11195,24 +10672,24 @@ function useAnsiToHtml() {
11195
10672
  function stripCursorMovements(data) {
11196
10673
  return data.replace(/\u001b\[\d+A/g, "").replace(/\u001b\[\d+K/g, "");
11197
10674
  }
11198
- const testRunnerStatusDataSchema = z$1.intersection(
11199
- z$1.object({
11200
- type: z$1.literal("epicshop:test-status-update"),
11201
- timestamp: z$1.number()
10675
+ const testRunnerStatusDataSchema = z.intersection(
10676
+ z.object({
10677
+ type: z.literal("epicshop:test-status-update"),
10678
+ timestamp: z.number()
11202
10679
  }),
11203
- z$1.union([
11204
- z$1.object({ status: z$1.literal("pending") }),
11205
- z$1.object({ status: z$1.literal("pass") }),
11206
- z$1.object({ status: z$1.literal("fail"), error: z$1.string() })
10680
+ z.union([
10681
+ z.object({ status: z.literal("pending") }),
10682
+ z.object({ status: z.literal("pass") }),
10683
+ z.object({ status: z.literal("fail"), error: z.string() })
11207
10684
  ])
11208
10685
  );
11209
- const testRunnerTestStepDataSchema = z$1.object({
11210
- type: z$1.literal("epicshop:test-step-update"),
11211
- status: z$1.literal("pass"),
11212
- title: z$1.string(),
11213
- timestamp: z$1.number()
10686
+ const testRunnerTestStepDataSchema = z.object({
10687
+ type: z.literal("epicshop:test-step-update"),
10688
+ status: z.literal("pass"),
10689
+ title: z.string(),
10690
+ timestamp: z.number()
11214
10691
  });
11215
- const testRunnerDataSchema = z$1.union([
10692
+ const testRunnerDataSchema = z.union([
11216
10693
  testRunnerTestStepDataSchema,
11217
10694
  testRunnerStatusDataSchema
11218
10695
  ]);
@@ -11354,45 +10831,45 @@ function InBrowserTestRunner({
11354
10831
  }
11355
10832
  ) }) });
11356
10833
  }
11357
- const testActionSchema = z$1.union([
11358
- z$1.object({
11359
- intent: z$1.literal("run"),
11360
- name: z$1.string()
10834
+ const testActionSchema = z.union([
10835
+ z.object({
10836
+ intent: z.literal("run"),
10837
+ name: z.string()
11361
10838
  }),
11362
- z$1.object({
11363
- intent: z$1.literal("stop"),
11364
- name: z$1.string()
10839
+ z.object({
10840
+ intent: z.literal("stop"),
10841
+ name: z.string()
11365
10842
  }),
11366
- z$1.object({
11367
- intent: z$1.literal("clear"),
11368
- name: z$1.string()
10843
+ z.object({
10844
+ intent: z.literal("clear"),
10845
+ name: z.string()
11369
10846
  })
11370
10847
  ]);
11371
- const testEventSchema = z$1.union([
11372
- z$1.object({
11373
- type: z$1.literal("init"),
11374
- exitCode: z$1.number().nullable().optional(),
11375
- isRunning: z$1.boolean(),
11376
- output: z$1.array(
11377
- z$1.object({
11378
- type: z$1.union([z$1.literal("stdout"), z$1.literal("stderr")]),
11379
- content: z$1.string(),
11380
- timestamp: z$1.number()
10848
+ const testEventSchema = z.union([
10849
+ z.object({
10850
+ type: z.literal("init"),
10851
+ exitCode: z.number().nullable().optional(),
10852
+ isRunning: z.boolean(),
10853
+ output: z.array(
10854
+ z.object({
10855
+ type: z.union([z.literal("stdout"), z.literal("stderr")]),
10856
+ content: z.string(),
10857
+ timestamp: z.number()
11381
10858
  })
11382
10859
  )
11383
10860
  }),
11384
- z$1.object({
11385
- type: z$1.union([z$1.literal("stdout"), z$1.literal("stderr")]),
11386
- data: z$1.string(),
11387
- timestamp: z$1.number()
10861
+ z.object({
10862
+ type: z.union([z.literal("stdout"), z.literal("stderr")]),
10863
+ data: z.string(),
10864
+ timestamp: z.number()
11388
10865
  }),
11389
- z$1.object({
11390
- type: z$1.literal("exit"),
11391
- isRunning: z$1.literal(false),
11392
- code: z$1.number().nullable()
10866
+ z.object({
10867
+ type: z.literal("exit"),
10868
+ isRunning: z.literal(false),
10869
+ code: z.number().nullable()
11393
10870
  })
11394
10871
  ]);
11395
- const testEventQueueSchema = z$1.array(testEventSchema);
10872
+ const testEventQueueSchema = z.array(testEventSchema);
11396
10873
  async function loader$j({ request }) {
11397
10874
  ensureUndeployed();
11398
10875
  const url = new URL(request.url);
@@ -12701,19 +12178,19 @@ async function registerDevice() {
12701
12178
  });
12702
12179
  }
12703
12180
  }
12704
- const CodeReceivedEventSchema = z$1.object({
12705
- type: z$1.literal(EVENTS.USER_CODE_RECEIVED),
12706
- code: z$1.string(),
12707
- url: z$1.string()
12181
+ const CodeReceivedEventSchema = z.object({
12182
+ type: z.literal(EVENTS.USER_CODE_RECEIVED),
12183
+ code: z.string(),
12184
+ url: z.string()
12708
12185
  });
12709
- const AuthResolvedEventSchema = z$1.object({
12710
- type: z$1.literal(EVENTS.AUTH_RESOLVED)
12186
+ const AuthResolvedEventSchema = z.object({
12187
+ type: z.literal(EVENTS.AUTH_RESOLVED)
12711
12188
  });
12712
- const AuthRejectedEventSchema = z$1.object({
12713
- type: z$1.literal(EVENTS.AUTH_REJECTED),
12714
- error: z$1.string().optional().default("Unknown error")
12189
+ const AuthRejectedEventSchema = z.object({
12190
+ type: z.literal(EVENTS.AUTH_REJECTED),
12191
+ error: z.string().optional().default("Unknown error")
12715
12192
  });
12716
- const EventSchema = z$1.union([
12193
+ const EventSchema = z.union([
12717
12194
  CodeReceivedEventSchema,
12718
12195
  AuthResolvedEventSchema,
12719
12196
  AuthRejectedEventSchema
@@ -13749,7 +13226,7 @@ const route39 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePrope
13749
13226
  __proto__: null,
13750
13227
  loader
13751
13228
  }, Symbol.toStringTag, { value: "Module" }));
13752
- 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-BOrI36ez.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-CxCgA-_O.js", "/assets/request-info-CEhUGODY.js", "/assets/tooltip-kD4kSf1i.js", "/assets/pe-CUZaIcdt.js", "/assets/error-boundary-COkPRBOZ.js", "/assets/progress-bar-D3kudPcr.js", "/assets/index-B-hHvmeV.js", "/assets/index-YNIH4TH8.js", "/assets/presence-Cr--lRCr.js", "/assets/seo-pBpFCWsy.js"], "css": [] }, "routes/$": { "id": "routes/$", "parentId": "root", "path": "*", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/_-D0Tgngwe.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-CxCgA-_O.js", "/assets/error-boundary-COkPRBOZ.js"], "css": [] }, "routes/_app+/_layout": { "id": "routes/_app+/_layout", "parentId": "root", "path": void 0, "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_layout-BPwIOXxN.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-CxCgA-_O.js", "/assets/request-info-CEhUGODY.js", "/assets/tooltip-kD4kSf1i.js", "/assets/pe-CUZaIcdt.js", "/assets/index-YNIH4TH8.js", "/assets/workshop-config-CL4F08kr.js", "/assets/product-BAWG1Vut.js", "/assets/index-CXyf3Reb.js", "/assets/user-DvujSs-t.js", "/assets/presence-Cr--lRCr.js", "/assets/progress-BFm2U-l5.js"], "css": [] }, "routes/_app+/account": { "id": "routes/_app+/account", "parentId": "routes/_app+/_layout", "path": "account", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/account-BatJhmSV.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-CxCgA-_O.js", "/assets/request-info-CEhUGODY.js", "/assets/button-EE0aPg10.js", "/assets/tooltip-kD4kSf1i.js", "/assets/user-DvujSs-t.js", "/assets/presence-Cr--lRCr.js"], "css": [] }, "routes/_app+/app.$appName+/$": { "id": "routes/_app+/app.$appName+/$", "parentId": "routes/_app+/_layout", "path": "app/:appName/*", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/app.$appName+/api.$": { "id": "routes/_app+/app.$appName+/api.$", "parentId": "routes/_app+/_layout", "path": "app/:appName/api/*", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/api._-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/app.$appName+/epic_ws[.js]": { "id": "routes/_app+/app.$appName+/epic_ws[.js]", "parentId": "routes/_app+/_layout", "path": "app/:appName/epic_ws.js", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/epic_ws_.js_-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/app.$appName+/index": { "id": "routes/_app+/app.$appName+/index", "parentId": "routes/_app+/_layout", "path": "app/:appName/", "index": true, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/index-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/app.$appName+/test.$testName": { "id": "routes/_app+/app.$appName+/test.$testName", "parentId": "routes/_app+/_layout", "path": "app/:appName/test/:testName", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/test._testName-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/app.$appName+/test.epic_ws[.js]": { "id": "routes/_app+/app.$appName+/test.epic_ws[.js]", "parentId": "routes/_app+/_layout", "path": "app/:appName/test/epic_ws.js", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/test.epic_ws_.js_-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/discord": { "id": "routes/_app+/discord", "parentId": "routes/_app+/_layout", "path": "discord", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/discord-BhzUjmbI.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-CxCgA-_O.js", "/assets/user-DvujSs-t.js", "/assets/discord-BRTW4Rnh.js"], "css": [] }, "routes/_app+/exercise+/_layout": { "id": "routes/_app+/exercise+/_layout", "parentId": "routes/_app+/_layout", "path": "exercise", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_layout-BUs3av-e.js", "imports": ["/assets/index-1cKOJFpX.js"], "css": [] }, "routes/_app+/exercise+/$exerciseNumber": { "id": "routes/_app+/exercise+/$exerciseNumber", "parentId": "routes/_app+/exercise+/_layout", "path": ":exerciseNumber", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/_exerciseNumber-j9COGU-R.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-CxCgA-_O.js", "/assets/request-info-CEhUGODY.js", "/assets/tooltip-kD4kSf1i.js", "/assets/pe-CUZaIcdt.js", "/assets/index-YNIH4TH8.js", "/assets/loading-sXkYDMsx.js", "/assets/user-DvujSs-t.js", "/assets/workshop-config-CL4F08kr.js", "/assets/epic-video-DZzPuXR8.js", "/assets/progress-bar-D3kudPcr.js", "/assets/index-Dx5GmdYq.js", "/assets/mdx-DwC5Oacq.js", "/assets/progress-BFm2U-l5.js", "/assets/seo-pBpFCWsy.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/exercise+/$exerciseNumber_.$stepNumber": { "id": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber", "parentId": "routes/_app+/exercise+/_layout", "path": ":exerciseNumber/:stepNumber", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/_exerciseNumber_._stepNumber-7kSd_6hH.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-CxCgA-_O.js"], "css": [] }, "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout": { "id": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout", "parentId": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber", "path": ":type", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/_layout-DZWGV4Uf.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-CxCgA-_O.js", "/assets/request-info-CEhUGODY.js", "/assets/tooltip-kD4kSf1i.js", "/assets/pe-CUZaIcdt.js", "/assets/index-YNIH4TH8.js", "/assets/loading-sXkYDMsx.js", "/assets/user-DvujSs-t.js", "/assets/workshop-config-CL4F08kr.js", "/assets/epic-video-DZzPuXR8.js", "/assets/progress-bar-D3kudPcr.js", "/assets/index-CXyf3Reb.js", "/assets/index-BwhlO_gF.js", "/assets/index-Dx5GmdYq.js", "/assets/error-boundary-COkPRBOZ.js", "/assets/nav-chevrons-g-C0ilNz.js", "/assets/mdx-DwC5Oacq.js", "/assets/progress-BFm2U-l5.js", "/assets/set-playground-DW0yVaNn.js", "/assets/seo-pBpFCWsy.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/app": { "id": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/app", "parentId": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout", "path": "app", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/app-CJ9ElQg6.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-CxCgA-_O.js", "/assets/request-info-CEhUGODY.js", "/assets/tooltip-kD4kSf1i.js", "/assets/pe-CUZaIcdt.js", "/assets/index-YNIH4TH8.js", "/assets/button-EE0aPg10.js", "/assets/loading-sXkYDMsx.js", "/assets/progress-bar-D3kudPcr.js", "/assets/preview-C7dtR2VR.js"], "css": [] }, "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/index": { "id": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/index", "parentId": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout", "path": void 0, "index": true, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/index-ZZCxObNp.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-CxCgA-_O.js", "/assets/tooltip-kD4kSf1i.js", "/assets/index-CXyf3Reb.js", "/assets/index-BwhlO_gF.js", "/assets/request-info-CEhUGODY.js", "/assets/pe-CUZaIcdt.js", "/assets/index-YNIH4TH8.js", "/assets/loading-sXkYDMsx.js", "/assets/user-DvujSs-t.js", "/assets/workshop-config-CL4F08kr.js", "/assets/epic-video-DZzPuXR8.js", "/assets/progress-bar-D3kudPcr.js", "/assets/accordion-OfO-5m5D.js", "/assets/mdx-DwC5Oacq.js", "/assets/use-event-source-A_0lEOPX.js", "/assets/set-playground-DW0yVaNn.js", "/assets/button-EE0aPg10.js", "/assets/diff-BXHLJqTK.js", "/assets/error-boundary-COkPRBOZ.js", "/assets/discord-BRTW4Rnh.js", "/assets/index-B-hHvmeV.js", "/assets/tests-DUg6VXec.js", "/assets/preview-C7dtR2VR.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/test": { "id": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/test", "parentId": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout", "path": "test", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/test-N2HloCnX.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-CxCgA-_O.js", "/assets/request-info-CEhUGODY.js", "/assets/tooltip-kD4kSf1i.js", "/assets/pe-CUZaIcdt.js", "/assets/index-YNIH4TH8.js", "/assets/loading-sXkYDMsx.js", "/assets/user-DvujSs-t.js", "/assets/workshop-config-CL4F08kr.js", "/assets/index-CXyf3Reb.js", "/assets/index-BwhlO_gF.js", "/assets/progress-bar-D3kudPcr.js", "/assets/epic-video-DZzPuXR8.js", "/assets/accordion-OfO-5m5D.js", "/assets/use-event-source-A_0lEOPX.js", "/assets/set-playground-DW0yVaNn.js", "/assets/tests-DUg6VXec.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.index": { "id": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.index", "parentId": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber", "path": void 0, "index": true, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_exerciseNumber_._stepNumber.index-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/exercise+/$exerciseNumber_.finished": { "id": "routes/_app+/exercise+/$exerciseNumber_.finished", "parentId": "routes/_app+/exercise+/_layout", "path": ":exerciseNumber/finished", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_exerciseNumber_.finished-DDNPeo8x.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-CxCgA-_O.js", "/assets/request-info-CEhUGODY.js", "/assets/tooltip-kD4kSf1i.js", "/assets/pe-CUZaIcdt.js", "/assets/index-YNIH4TH8.js", "/assets/loading-sXkYDMsx.js", "/assets/user-DvujSs-t.js", "/assets/workshop-config-CL4F08kr.js", "/assets/epic-video-DZzPuXR8.js", "/assets/progress-bar-D3kudPcr.js", "/assets/index-Dx5GmdYq.js", "/assets/nav-chevrons-g-C0ilNz.js", "/assets/mdx-DwC5Oacq.js", "/assets/progress-BFm2U-l5.js", "/assets/seo-pBpFCWsy.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/finished": { "id": "routes/_app+/finished", "parentId": "routes/_app+/_layout", "path": "finished", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/finished-Dop_5v80.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-CxCgA-_O.js", "/assets/request-info-CEhUGODY.js", "/assets/tooltip-kD4kSf1i.js", "/assets/pe-CUZaIcdt.js", "/assets/index-YNIH4TH8.js", "/assets/loading-sXkYDMsx.js", "/assets/user-DvujSs-t.js", "/assets/workshop-config-CL4F08kr.js", "/assets/epic-video-DZzPuXR8.js", "/assets/progress-bar-D3kudPcr.js", "/assets/index-Dx5GmdYq.js", "/assets/nav-chevrons-g-C0ilNz.js", "/assets/mdx-DwC5Oacq.js", "/assets/seo-pBpFCWsy.js", "/assets/progress-BFm2U-l5.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/index": { "id": "routes/_app+/index", "parentId": "routes/_app+/_layout", "path": void 0, "index": true, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/index-D-l_qaLC.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-CxCgA-_O.js", "/assets/request-info-CEhUGODY.js", "/assets/tooltip-kD4kSf1i.js", "/assets/pe-CUZaIcdt.js", "/assets/index-YNIH4TH8.js", "/assets/loading-sXkYDMsx.js", "/assets/user-DvujSs-t.js", "/assets/workshop-config-CL4F08kr.js", "/assets/epic-video-DZzPuXR8.js", "/assets/progress-bar-D3kudPcr.js", "/assets/index-Dx5GmdYq.js", "/assets/error-boundary-COkPRBOZ.js", "/assets/mdx-DwC5Oacq.js", "/assets/progress-BFm2U-l5.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/login": { "id": "routes/_app+/login", "parentId": "routes/_app+/_layout", "path": "login", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/login-Cc73KLYm.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-CxCgA-_O.js", "/assets/request-info-CEhUGODY.js", "/assets/tooltip-kD4kSf1i.js", "/assets/pe-CUZaIcdt.js", "/assets/index-YNIH4TH8.js", "/assets/workshop-config-CL4F08kr.js", "/assets/use-event-source-A_0lEOPX.js", "/assets/button-EE0aPg10.js", "/assets/loading-sXkYDMsx.js", "/assets/product-BAWG1Vut.js"], "css": [] }, "routes/_app+/support": { "id": "routes/_app+/support", "parentId": "routes/_app+/_layout", "path": "support", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/support-hcqGIpir.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js"], "css": [] }, "routes/admin+/_layout": { "id": "routes/admin+/_layout", "parentId": "root", "path": "admin", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_layout-BwzhY4NI.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-CxCgA-_O.js", "/assets/pe-CUZaIcdt.js", "/assets/tooltip-kD4kSf1i.js", "/assets/progress-BFm2U-l5.js"], "css": [] }, "routes/admin+/apps": { "id": "routes/admin+/apps", "parentId": "routes/admin+/_layout", "path": "apps", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/apps-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/admin+/cache": { "id": "routes/admin+/cache", "parentId": "routes/admin+/_layout", "path": "cache", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/cache-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/apps": { "id": "routes/apps", "parentId": "root", "path": "apps", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/apps-DP2rzg_V.js", "imports": [], "css": [] }, "routes/diff": { "id": "routes/diff", "parentId": "root", "path": "diff", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/diff-BEEJhGiC.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-CxCgA-_O.js", "/assets/tooltip-kD4kSf1i.js", "/assets/index-CXyf3Reb.js", "/assets/index-BwhlO_gF.js", "/assets/request-info-CEhUGODY.js", "/assets/pe-CUZaIcdt.js", "/assets/index-YNIH4TH8.js", "/assets/loading-sXkYDMsx.js", "/assets/user-DvujSs-t.js", "/assets/workshop-config-CL4F08kr.js", "/assets/epic-video-DZzPuXR8.js", "/assets/progress-bar-D3kudPcr.js", "/assets/accordion-OfO-5m5D.js", "/assets/mdx-DwC5Oacq.js", "/assets/diff-BXHLJqTK.js", "/assets/nav-chevrons-g-C0ilNz.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/discord.callback": { "id": "routes/discord.callback", "parentId": "root", "path": "discord/callback", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/discord.callback-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/exercises": { "id": "routes/exercises", "parentId": "root", "path": "exercises", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/exercises-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/launch-editor": { "id": "routes/launch-editor", "parentId": "root", "path": "launch-editor", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/launch-editor-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/login-sse": { "id": "routes/login-sse", "parentId": "root", "path": "login-sse", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/login-sse-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/og": { "id": "routes/og", "parentId": "root", "path": "og", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/og-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/onboarding": { "id": "routes/onboarding", "parentId": "root", "path": "onboarding", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/onboarding-DE9gclYS.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-CxCgA-_O.js", "/assets/request-info-CEhUGODY.js", "/assets/tooltip-kD4kSf1i.js", "/assets/pe-CUZaIcdt.js", "/assets/index-YNIH4TH8.js", "/assets/loading-sXkYDMsx.js", "/assets/user-DvujSs-t.js", "/assets/workshop-config-CL4F08kr.js", "/assets/button-EE0aPg10.js", "/assets/epic-video-DZzPuXR8.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/processes": { "id": "routes/processes", "parentId": "root", "path": "processes", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/processes-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/progress": { "id": "routes/progress", "parentId": "root", "path": "progress", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/progress-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/robots[.]txt": { "id": "routes/robots[.]txt", "parentId": "root", "path": "robots.txt", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/robots_._txt-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/set-playground": { "id": "routes/set-playground", "parentId": "root", "path": "set-playground", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/set-playground-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/sitemap[.]xml": { "id": "routes/sitemap[.]xml", "parentId": "root", "path": "sitemap.xml", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/sitemap_._xml-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/start": { "id": "routes/start", "parentId": "root", "path": "start", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/start-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/test": { "id": "routes/test", "parentId": "root", "path": "test", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/test-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/theme/index": { "id": "routes/theme/index", "parentId": "root", "path": "theme", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/index-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-1d60a768.js", "version": "1d60a768" };
13229
+ const serverManifest = { "entry": { "module": "/assets/entry.client-3M2p-8I3.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js"], "css": [] }, "routes": { "root": { "id": "root", "parentId": void 0, "path": "", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/root-9wVBEzOq.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-CxCgA-_O.js", "/assets/request-info-CEhUGODY.js", "/assets/tooltip-kD4kSf1i.js", "/assets/pe-CUZaIcdt.js", "/assets/error-boundary-COkPRBOZ.js", "/assets/progress-bar-D3kudPcr.js", "/assets/index-B-hHvmeV.js", "/assets/index-YNIH4TH8.js", "/assets/presence-Cr--lRCr.js", "/assets/seo-pBpFCWsy.js"], "css": [] }, "routes/$": { "id": "routes/$", "parentId": "root", "path": "*", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/_-D0Tgngwe.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-CxCgA-_O.js", "/assets/error-boundary-COkPRBOZ.js"], "css": [] }, "routes/_app+/_layout": { "id": "routes/_app+/_layout", "parentId": "root", "path": void 0, "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_layout-BPwIOXxN.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-CxCgA-_O.js", "/assets/request-info-CEhUGODY.js", "/assets/tooltip-kD4kSf1i.js", "/assets/pe-CUZaIcdt.js", "/assets/index-YNIH4TH8.js", "/assets/workshop-config-CL4F08kr.js", "/assets/product-BAWG1Vut.js", "/assets/index-CXyf3Reb.js", "/assets/user-DvujSs-t.js", "/assets/presence-Cr--lRCr.js", "/assets/progress-BFm2U-l5.js"], "css": [] }, "routes/_app+/account": { "id": "routes/_app+/account", "parentId": "routes/_app+/_layout", "path": "account", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/account-BatJhmSV.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-CxCgA-_O.js", "/assets/request-info-CEhUGODY.js", "/assets/button-EE0aPg10.js", "/assets/tooltip-kD4kSf1i.js", "/assets/user-DvujSs-t.js", "/assets/presence-Cr--lRCr.js"], "css": [] }, "routes/_app+/app.$appName+/$": { "id": "routes/_app+/app.$appName+/$", "parentId": "routes/_app+/_layout", "path": "app/:appName/*", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/app.$appName+/api.$": { "id": "routes/_app+/app.$appName+/api.$", "parentId": "routes/_app+/_layout", "path": "app/:appName/api/*", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/api._-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/app.$appName+/epic_ws[.js]": { "id": "routes/_app+/app.$appName+/epic_ws[.js]", "parentId": "routes/_app+/_layout", "path": "app/:appName/epic_ws.js", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/epic_ws_.js_-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/app.$appName+/index": { "id": "routes/_app+/app.$appName+/index", "parentId": "routes/_app+/_layout", "path": "app/:appName/", "index": true, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/index-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/app.$appName+/test.$testName": { "id": "routes/_app+/app.$appName+/test.$testName", "parentId": "routes/_app+/_layout", "path": "app/:appName/test/:testName", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/test._testName-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/app.$appName+/test.epic_ws[.js]": { "id": "routes/_app+/app.$appName+/test.epic_ws[.js]", "parentId": "routes/_app+/_layout", "path": "app/:appName/test/epic_ws.js", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/test.epic_ws_.js_-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/discord": { "id": "routes/_app+/discord", "parentId": "routes/_app+/_layout", "path": "discord", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/discord-BhzUjmbI.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-CxCgA-_O.js", "/assets/user-DvujSs-t.js", "/assets/discord-BRTW4Rnh.js"], "css": [] }, "routes/_app+/exercise+/_layout": { "id": "routes/_app+/exercise+/_layout", "parentId": "routes/_app+/_layout", "path": "exercise", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_layout-BUs3av-e.js", "imports": ["/assets/index-1cKOJFpX.js"], "css": [] }, "routes/_app+/exercise+/$exerciseNumber": { "id": "routes/_app+/exercise+/$exerciseNumber", "parentId": "routes/_app+/exercise+/_layout", "path": ":exerciseNumber", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/_exerciseNumber-j9COGU-R.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-CxCgA-_O.js", "/assets/request-info-CEhUGODY.js", "/assets/tooltip-kD4kSf1i.js", "/assets/pe-CUZaIcdt.js", "/assets/index-YNIH4TH8.js", "/assets/loading-sXkYDMsx.js", "/assets/user-DvujSs-t.js", "/assets/workshop-config-CL4F08kr.js", "/assets/epic-video-DZzPuXR8.js", "/assets/progress-bar-D3kudPcr.js", "/assets/index-Dx5GmdYq.js", "/assets/mdx-DwC5Oacq.js", "/assets/progress-BFm2U-l5.js", "/assets/seo-pBpFCWsy.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/exercise+/$exerciseNumber_.$stepNumber": { "id": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber", "parentId": "routes/_app+/exercise+/_layout", "path": ":exerciseNumber/:stepNumber", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/_exerciseNumber_._stepNumber-7kSd_6hH.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-CxCgA-_O.js"], "css": [] }, "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout": { "id": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout", "parentId": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber", "path": ":type", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/_layout-DnttUdzs.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-CxCgA-_O.js", "/assets/request-info-CEhUGODY.js", "/assets/tooltip-kD4kSf1i.js", "/assets/pe-CUZaIcdt.js", "/assets/index-YNIH4TH8.js", "/assets/loading-sXkYDMsx.js", "/assets/user-DvujSs-t.js", "/assets/workshop-config-CL4F08kr.js", "/assets/epic-video-DZzPuXR8.js", "/assets/progress-bar-D3kudPcr.js", "/assets/index-CXyf3Reb.js", "/assets/index-BwhlO_gF.js", "/assets/index-Dx5GmdYq.js", "/assets/error-boundary-COkPRBOZ.js", "/assets/nav-chevrons-g-C0ilNz.js", "/assets/mdx-DwC5Oacq.js", "/assets/progress-BFm2U-l5.js", "/assets/set-playground-DW0yVaNn.js", "/assets/seo-pBpFCWsy.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/app": { "id": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/app", "parentId": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout", "path": "app", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/app-CJ9ElQg6.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-CxCgA-_O.js", "/assets/request-info-CEhUGODY.js", "/assets/tooltip-kD4kSf1i.js", "/assets/pe-CUZaIcdt.js", "/assets/index-YNIH4TH8.js", "/assets/button-EE0aPg10.js", "/assets/loading-sXkYDMsx.js", "/assets/progress-bar-D3kudPcr.js", "/assets/preview-C7dtR2VR.js"], "css": [] }, "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/index": { "id": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/index", "parentId": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout", "path": void 0, "index": true, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/index-ZZCxObNp.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-CxCgA-_O.js", "/assets/tooltip-kD4kSf1i.js", "/assets/index-CXyf3Reb.js", "/assets/index-BwhlO_gF.js", "/assets/request-info-CEhUGODY.js", "/assets/pe-CUZaIcdt.js", "/assets/index-YNIH4TH8.js", "/assets/loading-sXkYDMsx.js", "/assets/user-DvujSs-t.js", "/assets/workshop-config-CL4F08kr.js", "/assets/epic-video-DZzPuXR8.js", "/assets/progress-bar-D3kudPcr.js", "/assets/accordion-OfO-5m5D.js", "/assets/mdx-DwC5Oacq.js", "/assets/use-event-source-A_0lEOPX.js", "/assets/set-playground-DW0yVaNn.js", "/assets/button-EE0aPg10.js", "/assets/diff-BXHLJqTK.js", "/assets/error-boundary-COkPRBOZ.js", "/assets/discord-BRTW4Rnh.js", "/assets/index-B-hHvmeV.js", "/assets/tests-DUg6VXec.js", "/assets/preview-C7dtR2VR.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/test": { "id": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/test", "parentId": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout", "path": "test", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/test-N2HloCnX.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-CxCgA-_O.js", "/assets/request-info-CEhUGODY.js", "/assets/tooltip-kD4kSf1i.js", "/assets/pe-CUZaIcdt.js", "/assets/index-YNIH4TH8.js", "/assets/loading-sXkYDMsx.js", "/assets/user-DvujSs-t.js", "/assets/workshop-config-CL4F08kr.js", "/assets/index-CXyf3Reb.js", "/assets/index-BwhlO_gF.js", "/assets/progress-bar-D3kudPcr.js", "/assets/epic-video-DZzPuXR8.js", "/assets/accordion-OfO-5m5D.js", "/assets/use-event-source-A_0lEOPX.js", "/assets/set-playground-DW0yVaNn.js", "/assets/tests-DUg6VXec.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.index": { "id": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.index", "parentId": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber", "path": void 0, "index": true, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_exerciseNumber_._stepNumber.index-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/exercise+/$exerciseNumber_.finished": { "id": "routes/_app+/exercise+/$exerciseNumber_.finished", "parentId": "routes/_app+/exercise+/_layout", "path": ":exerciseNumber/finished", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_exerciseNumber_.finished-DDNPeo8x.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-CxCgA-_O.js", "/assets/request-info-CEhUGODY.js", "/assets/tooltip-kD4kSf1i.js", "/assets/pe-CUZaIcdt.js", "/assets/index-YNIH4TH8.js", "/assets/loading-sXkYDMsx.js", "/assets/user-DvujSs-t.js", "/assets/workshop-config-CL4F08kr.js", "/assets/epic-video-DZzPuXR8.js", "/assets/progress-bar-D3kudPcr.js", "/assets/index-Dx5GmdYq.js", "/assets/nav-chevrons-g-C0ilNz.js", "/assets/mdx-DwC5Oacq.js", "/assets/progress-BFm2U-l5.js", "/assets/seo-pBpFCWsy.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/finished": { "id": "routes/_app+/finished", "parentId": "routes/_app+/_layout", "path": "finished", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/finished-Dop_5v80.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-CxCgA-_O.js", "/assets/request-info-CEhUGODY.js", "/assets/tooltip-kD4kSf1i.js", "/assets/pe-CUZaIcdt.js", "/assets/index-YNIH4TH8.js", "/assets/loading-sXkYDMsx.js", "/assets/user-DvujSs-t.js", "/assets/workshop-config-CL4F08kr.js", "/assets/epic-video-DZzPuXR8.js", "/assets/progress-bar-D3kudPcr.js", "/assets/index-Dx5GmdYq.js", "/assets/nav-chevrons-g-C0ilNz.js", "/assets/mdx-DwC5Oacq.js", "/assets/seo-pBpFCWsy.js", "/assets/progress-BFm2U-l5.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/index": { "id": "routes/_app+/index", "parentId": "routes/_app+/_layout", "path": void 0, "index": true, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/index-D-l_qaLC.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-CxCgA-_O.js", "/assets/request-info-CEhUGODY.js", "/assets/tooltip-kD4kSf1i.js", "/assets/pe-CUZaIcdt.js", "/assets/index-YNIH4TH8.js", "/assets/loading-sXkYDMsx.js", "/assets/user-DvujSs-t.js", "/assets/workshop-config-CL4F08kr.js", "/assets/epic-video-DZzPuXR8.js", "/assets/progress-bar-D3kudPcr.js", "/assets/index-Dx5GmdYq.js", "/assets/error-boundary-COkPRBOZ.js", "/assets/mdx-DwC5Oacq.js", "/assets/progress-BFm2U-l5.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/login": { "id": "routes/_app+/login", "parentId": "routes/_app+/_layout", "path": "login", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/login-Cc73KLYm.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-CxCgA-_O.js", "/assets/request-info-CEhUGODY.js", "/assets/tooltip-kD4kSf1i.js", "/assets/pe-CUZaIcdt.js", "/assets/index-YNIH4TH8.js", "/assets/workshop-config-CL4F08kr.js", "/assets/use-event-source-A_0lEOPX.js", "/assets/button-EE0aPg10.js", "/assets/loading-sXkYDMsx.js", "/assets/product-BAWG1Vut.js"], "css": [] }, "routes/_app+/support": { "id": "routes/_app+/support", "parentId": "routes/_app+/_layout", "path": "support", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/support-hcqGIpir.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js"], "css": [] }, "routes/admin+/_layout": { "id": "routes/admin+/_layout", "parentId": "root", "path": "admin", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_layout-BwzhY4NI.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-CxCgA-_O.js", "/assets/pe-CUZaIcdt.js", "/assets/tooltip-kD4kSf1i.js", "/assets/progress-BFm2U-l5.js"], "css": [] }, "routes/admin+/apps": { "id": "routes/admin+/apps", "parentId": "routes/admin+/_layout", "path": "apps", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/apps-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/admin+/cache": { "id": "routes/admin+/cache", "parentId": "routes/admin+/_layout", "path": "cache", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/cache-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/apps": { "id": "routes/apps", "parentId": "root", "path": "apps", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/apps-DP2rzg_V.js", "imports": [], "css": [] }, "routes/diff": { "id": "routes/diff", "parentId": "root", "path": "diff", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/diff-BEEJhGiC.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-CxCgA-_O.js", "/assets/tooltip-kD4kSf1i.js", "/assets/index-CXyf3Reb.js", "/assets/index-BwhlO_gF.js", "/assets/request-info-CEhUGODY.js", "/assets/pe-CUZaIcdt.js", "/assets/index-YNIH4TH8.js", "/assets/loading-sXkYDMsx.js", "/assets/user-DvujSs-t.js", "/assets/workshop-config-CL4F08kr.js", "/assets/epic-video-DZzPuXR8.js", "/assets/progress-bar-D3kudPcr.js", "/assets/accordion-OfO-5m5D.js", "/assets/mdx-DwC5Oacq.js", "/assets/diff-BXHLJqTK.js", "/assets/nav-chevrons-g-C0ilNz.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/discord.callback": { "id": "routes/discord.callback", "parentId": "root", "path": "discord/callback", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/discord.callback-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/exercises": { "id": "routes/exercises", "parentId": "root", "path": "exercises", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/exercises-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/launch-editor": { "id": "routes/launch-editor", "parentId": "root", "path": "launch-editor", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/launch-editor-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/login-sse": { "id": "routes/login-sse", "parentId": "root", "path": "login-sse", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/login-sse-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/og": { "id": "routes/og", "parentId": "root", "path": "og", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/og-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/onboarding": { "id": "routes/onboarding", "parentId": "root", "path": "onboarding", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/onboarding-DE9gclYS.js", "imports": ["/assets/index-1cKOJFpX.js", "/assets/components-CME-nGId.js", "/assets/misc-CxCgA-_O.js", "/assets/request-info-CEhUGODY.js", "/assets/tooltip-kD4kSf1i.js", "/assets/pe-CUZaIcdt.js", "/assets/index-YNIH4TH8.js", "/assets/loading-sXkYDMsx.js", "/assets/user-DvujSs-t.js", "/assets/workshop-config-CL4F08kr.js", "/assets/button-EE0aPg10.js", "/assets/epic-video-DZzPuXR8.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/processes": { "id": "routes/processes", "parentId": "root", "path": "processes", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/processes-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/progress": { "id": "routes/progress", "parentId": "root", "path": "progress", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/progress-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/robots[.]txt": { "id": "routes/robots[.]txt", "parentId": "root", "path": "robots.txt", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/robots_._txt-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/set-playground": { "id": "routes/set-playground", "parentId": "root", "path": "set-playground", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/set-playground-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/sitemap[.]xml": { "id": "routes/sitemap[.]xml", "parentId": "root", "path": "sitemap.xml", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/sitemap_._xml-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/start": { "id": "routes/start", "parentId": "root", "path": "start", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/start-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/test": { "id": "routes/test", "parentId": "root", "path": "test", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/test-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/theme/index": { "id": "routes/theme/index", "parentId": "root", "path": "theme", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/index-K6Dvbx-E.js", "imports": [], "css": [] }, "routes/video-player/index": { "id": "routes/video-player/index", "parentId": "root", "path": "video-player", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/index-DP2rzg_V.js", "imports": [], "css": [] } }, "url": "/assets/manifest-e53d022a.js", "version": "e53d022a" };
13753
13230
  const mode = "production";
13754
13231
  const assetsBuildDirectory = "build/client";
13755
13232
  const basename = "/";
@@ -14102,21 +13579,13 @@ const routes = {
14102
13579
  caseSensitive: void 0,
14103
13580
  module: route42
14104
13581
  },
14105
- "routes/update-mdx-cache": {
14106
- id: "routes/update-mdx-cache",
14107
- parentId: "root",
14108
- path: "update-mdx-cache",
14109
- index: void 0,
14110
- caseSensitive: void 0,
14111
- module: route43
14112
- },
14113
13582
  "routes/video-player/index": {
14114
13583
  id: "routes/video-player/index",
14115
13584
  parentId: "root",
14116
13585
  path: "video-player",
14117
13586
  index: void 0,
14118
13587
  caseSensitive: void 0,
14119
- module: route44
13588
+ module: route43
14120
13589
  }
14121
13590
  };
14122
13591
  export {