@epic-web/workshop-utils 4.1.1 → 4.2.1

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.
@@ -589,6 +589,7 @@ declare const PlaygroundAppSchema: z.ZodObject<{
589
589
  }>]>;
590
590
  type: z.ZodLiteral<"playground">;
591
591
  appName: z.ZodString;
592
+ isUpToDate: z.ZodBoolean;
592
593
  }, "strip", z.ZodTypeAny, {
593
594
  type: "playground";
594
595
  name: string;
@@ -617,6 +618,7 @@ declare const PlaygroundAppSchema: z.ZodObject<{
617
618
  type: "none";
618
619
  };
619
620
  appName: string;
621
+ isUpToDate: boolean;
620
622
  instructionsCode?: string | undefined;
621
623
  epicVideoEmbeds?: string[] | undefined;
622
624
  }, {
@@ -647,6 +649,7 @@ declare const PlaygroundAppSchema: z.ZodObject<{
647
649
  type: "none";
648
650
  };
649
651
  appName: string;
652
+ isUpToDate: boolean;
650
653
  instructionsCode?: string | undefined;
651
654
  epicVideoEmbeds?: string[] | undefined;
652
655
  }>;
@@ -2774,6 +2777,7 @@ declare const AppSchema: z.ZodUnion<[z.ZodUnion<[z.ZodObject<{
2774
2777
  }>]>;
2775
2778
  type: z.ZodLiteral<"playground">;
2776
2779
  appName: z.ZodString;
2780
+ isUpToDate: z.ZodBoolean;
2777
2781
  }, "strip", z.ZodTypeAny, {
2778
2782
  type: "playground";
2779
2783
  name: string;
@@ -2802,6 +2806,7 @@ declare const AppSchema: z.ZodUnion<[z.ZodUnion<[z.ZodObject<{
2802
2806
  type: "none";
2803
2807
  };
2804
2808
  appName: string;
2809
+ isUpToDate: boolean;
2805
2810
  instructionsCode?: string | undefined;
2806
2811
  epicVideoEmbeds?: string[] | undefined;
2807
2812
  }, {
@@ -2832,6 +2837,7 @@ declare const AppSchema: z.ZodUnion<[z.ZodUnion<[z.ZodObject<{
2832
2837
  type: "none";
2833
2838
  };
2834
2839
  appName: string;
2840
+ isUpToDate: boolean;
2835
2841
  instructionsCode?: string | undefined;
2836
2842
  epicVideoEmbeds?: string[] | undefined;
2837
2843
  }>, z.ZodObject<{
@@ -3686,6 +3692,7 @@ export declare function getAppByName(name: string, { request, timings }?: Cachif
3686
3692
  type: "none";
3687
3693
  };
3688
3694
  appName: string;
3695
+ isUpToDate: boolean;
3689
3696
  instructionsCode?: string | undefined;
3690
3697
  epicVideoEmbeds?: string[] | undefined;
3691
3698
  } | undefined>;
@@ -3944,6 +3951,7 @@ export declare function getAppFromFile(filePath: string): Promise<{
3944
3951
  type: "none";
3945
3952
  };
3946
3953
  appName: string;
3954
+ isUpToDate: boolean;
3947
3955
  instructionsCode?: string | undefined;
3948
3956
  epicVideoEmbeds?: string[] | undefined;
3949
3957
  } | undefined>;
@@ -1 +1 @@
1
- {"version":3,"file":"apps.server.d.ts","sourceRoot":"","sources":["../../src/apps.server.ts"],"names":[],"mappings":"AACA,OAAO,4BAA4B,CAAA;AAGnC,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAMrD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAiBvB,OAAO,EAAuB,KAAK,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAiBtE,KAAK,gBAAgB,GAAG;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAAA;AAiChE,QAAA,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAG7B,CAAA;AAEF,QAAA,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGpB,CAAA;AAEF,QAAA,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGrB,CAAA;AAEF,QAAA,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAEpB,CAAA;AAEF,QAAA,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGvB,CAAA;AAEF,QAAA,MAAM,cAAc;IACnB,2CAA2C;;IAE3C,uIAAuI;;IAEvI,oFAAoF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2BnF,CAAA;AAEF,QAAA,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAAiD,CAAA;AAE5E,QAAA,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAIb,CAAA;AAIF,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAA;AAC3E,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAA;AACzD,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAA;AAC3D,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAA;AACzD,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAA;AAC/D,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAA;AACnE,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,SAAS,CAAC,CAAA;AAE3C,KAAK,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAA;AAE9C,wBAAgB,KAAK,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,IAAI,GAAG,CAE1C;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,IAAI,UAAU,CAExD;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,IAAI,WAAW,CAE1D;AAED,wBAAgB,qBAAqB,CACpC,GAAG,EAAE,GAAG,GACN,GAAG,IAAI,UAAU,GAAG;IAAE,UAAU,EAAE,CAAC,CAAA;CAAE,CAEvC;AAED,wBAAgB,sBAAsB,CACrC,GAAG,EAAE,GAAG,GACN,GAAG,IAAI,WAAW,GAAG;IAAE,UAAU,EAAE,CAAC,CAAA;CAAE,CAExC;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,IAAI,aAAa,CAE9D;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,IAAI,UAAU,CAExD;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,IAAI,eAAe,CAElE;AAgBD,eAAO,MAAM,aAAa,qBAGzB,CAAA;AAED,wBAAgB,IAAI,SAcnB;AASD,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,QAEjD;AAED,wBAAgB,mBAAmB,CAClC,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,UAAU,GAAG,IAAI,GAAG,SAAS,oBASzC;AAuDD,wBAAsB,YAAY,CAAC,EAClC,OAAO,EACP,OAAO,GACP,GAAE,gBAAqB,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CA6ClD;AAID,wBAAsB,OAAO,CAAC,EAC7B,OAAO,EACP,OAAO,EACP,UAAU,GACV,GAAE,gBAAgB,GAAG;IAAE,UAAU,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAmExE;AAQD;;;;;;GAMG;AACH,wBAAgB,sCAAsC,CACrD,iBAAiB,EAAE,MAAM;;;;SA0BzB;AAsMD,wBAAsB,gBAAgB,CAAC,EACtC,OAAO,EACP,OAAO,GACP,GAAE,gBAAqB,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CA8CvD;AAqND,wBAAsB,WAAW,CAChC,cAAc,EAAE,MAAM,GAAG,MAAM,EAC/B,EAAE,OAAO,EAAE,OAAO,EAAE,GAAE,gBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;eAI3C;AAED,wBAAsB,eAAe,CACpC,cAAc,EAAE,MAAM,GAAG,MAAM,EAC/B,EAAE,OAAO,EAAE,OAAO,EAAE,GAAE,gBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAU3C;AAED,wBAAsB,kBAAkB,CACvC,MAAM,EAAE,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC,CAAC,CAAC,EAC5C,EAAE,OAAO,EAAE,OAAO,EAAE,GAAE,gBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAO3C;AAQD,wBAAsB,cAAc,CACnC,MAAM,EAAE;IACP,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,UAAU,CAAC,EAAE,MAAM,CAAA;CACnB,EACD,EAAE,OAAO,EAAE,OAAO,EAAE,GAAE,gBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAqB3C;AAED,wBAAsB,YAAY,CACjC,IAAI,EAAE,MAAM,EACZ,EAAE,OAAO,EAAE,OAAO,EAAE,GAAE,gBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;eAI3C;AAED,wBAAsB,kBAAkB,CACvC,GAAG,EAAE,eAAe,EACpB,EAAE,OAAO,EAAE,OAAO,EAAE,GAAE,gBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAS3C;AAED,wBAAsB,kBAAkB,CACvC,GAAG,EAAE,eAAe,EACpB,EAAE,OAAO,EAAE,OAAO,EAAE,GAAE,gBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAU3C;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,eAAe,UAInD;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;eAGpD;AAED,wBAAsB,aAAa,CAClC,MAAM,EAAE,MAAM,EACd,EAAE,KAAK,EAAE,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,iBA2InC;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,2BAgBzC;AAED,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,UAmB5D;AAED,wBAAsB,gBAAgB,oBAQrC;AAED,wBAAsB,mBAAmB,2BAOxC;AAED,wBAAgB,eAAe,WAE9B;AAED,wBAAsB,uBAAuB,CAAC,EAC7C,OAAO,GACP,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO;;;;;;;;;;;;GAc5B;AAED,wBAAsB,mBAAmB,CAAC,EACzC,OAAO,GACP,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO;;;;;;;;;;;;GAkB5B;AAID,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,UAK/C"}
1
+ {"version":3,"file":"apps.server.d.ts","sourceRoot":"","sources":["../../src/apps.server.ts"],"names":[],"mappings":"AACA,OAAO,4BAA4B,CAAA;AAGnC,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAMrD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAiBvB,OAAO,EAAuB,KAAK,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAiBtE,KAAK,gBAAgB,GAAG;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAAA;AAiChE,QAAA,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAG7B,CAAA;AAEF,QAAA,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGpB,CAAA;AAEF,QAAA,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGrB,CAAA;AAEF,QAAA,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAEpB,CAAA;AAEF,QAAA,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAIvB,CAAA;AAEF,QAAA,MAAM,cAAc;IACnB,2CAA2C;;IAE3C,uIAAuI;;IAEvI,oFAAoF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}
@@ -67,6 +67,7 @@ const ExampleAppSchema = BaseAppSchema.extend({
67
67
  const PlaygroundAppSchema = BaseAppSchema.extend({
68
68
  type: z.literal('playground'),
69
69
  appName: z.string(),
70
+ isUpToDate: z.boolean(),
70
71
  });
71
72
  const ExerciseSchema = z.object({
72
73
  /** a unique identifier for the exercise */
@@ -524,8 +525,16 @@ async function getDevInfo({ fullPath, portNumber, }) {
524
525
  }
525
526
  export async function getPlaygroundApp({ timings, request, } = {}) {
526
527
  const playgroundDir = path.join(workshopRoot, 'playground');
527
- const appName = await getPlaygroundAppName();
528
- const key = `playground-${appName}`;
528
+ const baseAppName = await getPlaygroundAppName();
529
+ const key = `playground-${baseAppName}`;
530
+ const baseAppFullPath = baseAppName
531
+ ? await getFullPathFromAppName(baseAppName)
532
+ : null;
533
+ const playgroundCacheEntry = playgroundAppCache.get(key);
534
+ const forceFreshPlaygroundDir = getForceFreshForDir(playgroundDir, playgroundCacheEntry) ?? false;
535
+ const forceFreshBaseApp = baseAppFullPath
536
+ ? getForceFreshForDir(baseAppFullPath, playgroundCacheEntry) ?? false
537
+ : false;
529
538
  return cachified({
530
539
  key,
531
540
  cache: playgroundAppCache,
@@ -533,11 +542,11 @@ export async function getPlaygroundApp({ timings, request, } = {}) {
533
542
  timings,
534
543
  timingKey: playgroundDir.replace(`${playgroundDir}${path.sep}`, ''),
535
544
  request,
536
- forceFresh: getForceFreshForDir(playgroundDir, playgroundAppCache.get(key)),
545
+ forceFresh: forceFreshPlaygroundDir || forceFreshBaseApp,
537
546
  getFreshValue: async () => {
538
547
  if (!(await exists(playgroundDir)))
539
548
  return null;
540
- if (!appName)
549
+ if (!baseAppName)
541
550
  return null;
542
551
  const dirName = path.basename(playgroundDir);
543
552
  const name = getAppName(playgroundDir);
@@ -547,10 +556,13 @@ export async function getPlaygroundApp({ timings, request, } = {}) {
547
556
  getTestInfo({ fullPath: playgroundDir }),
548
557
  getDevInfo({ fullPath: playgroundDir, portNumber }),
549
558
  ]);
559
+ const appModifiedTime = await getDirModifiedTime(await getFullPathFromAppName(baseAppName));
560
+ const playgroundAppModifiedTime = await getDirModifiedTime(playgroundDir);
550
561
  return {
551
562
  name,
552
- appName,
563
+ appName: baseAppName,
553
564
  type: 'playground',
565
+ isUpToDate: appModifiedTime <= playgroundAppModifiedTime,
554
566
  fullPath: playgroundDir,
555
567
  relativePath: playgroundDir.replace(`${getWorkshopRoot()}${path.sep}`, ''),
556
568
  title: compiledReadme?.title ?? name,
@@ -951,6 +963,31 @@ export async function getPlaygroundAppName() {
951
963
  return null;
952
964
  }
953
965
  }
966
+ async function getDirModifiedTime(dir) {
967
+ // we can't use modifiedTimes because it only stores the modified times of
968
+ // things the app started.
969
+ const isIgnored = await isGitIgnored({ cwd: dir });
970
+ const files = await fs.promises.readdir(dir, { withFileTypes: true });
971
+ const modifiedTimes = await Promise.all(files.map(async (file) => {
972
+ if (isIgnored(file.name))
973
+ return 0;
974
+ const filePath = path.join(dir, file.name);
975
+ if (file.isDirectory()) {
976
+ return getDirModifiedTime(filePath);
977
+ }
978
+ else {
979
+ try {
980
+ const { mtimeMs } = await fs.promises.stat(filePath);
981
+ return mtimeMs;
982
+ }
983
+ catch {
984
+ // Handle errors (e.g., file access permissions, file has been moved or deleted)
985
+ return 0;
986
+ }
987
+ }
988
+ }));
989
+ return Math.max(0, ...modifiedTimes); // Ensure there is a default of 0 if all files are ignored
990
+ }
954
991
  export function getAppDisplayName(a, allApps) {
955
992
  let displayName = `${a.title} (${a.type})`;
956
993
  if (isExerciseStepApp(a)) {
@@ -1 +1 @@
1
- {"version":3,"file":"apps.server.js","sourceRoot":"","sources":["../../src/apps.server.ts"],"names":[],"mappings":"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","sourcesContent":["/// TODO: figure out why this import is necessary (without it tsc seems to not honor the boolean reset 🤷‍♂️)\nimport '@total-typescript/ts-reset'\nimport fs from 'fs'\nimport path from 'path'\nimport { type CacheEntry } from '@epic-web/cachified'\nimport { remember } from '@epic-web/remember'\nimport { execa } from 'execa'\nimport fsExtra from 'fs-extra'\nimport { glob } from 'glob'\nimport { globby, isGitIgnored } from 'globby'\nimport { z } from 'zod'\nimport {\n\tappsCache,\n\tcachified,\n\texampleAppCache,\n\tplaygroundAppCache,\n\tproblemAppCache,\n\tsolutionAppCache,\n} from './cache.server.js'\nimport { getOptionalWatcher, getWatcher } from './change-tracker.server.js'\nimport { compileMdx } from './compile-mdx.server.js'\nimport {\n\tcloseProcess,\n\tisAppRunning,\n\trunAppDev,\n\twaitOnApp,\n} from './process-manager.server.js'\nimport { getServerTimeHeader, type Timings } from './timing.server.js'\nimport { getErrorMessage } from './utils.js'\nimport { getPkgProp } from './utils.server.js'\n\n// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\nprocess.env.NODE_ENV ??= 'development'\n\nconst workshopRoot = getWorkshopRoot()\n\nconst playgroundAppNameInfoPath = path.join(\n\tgetWorkshopRoot(),\n\t'node_modules',\n\t'.cache',\n\t'epicshop',\n\t'playground.json',\n)\n\ntype CachifiedOptions = { timings?: Timings; request?: Request }\n\nconst BaseAppSchema = z.object({\n\t/** a unique identifier for the app */\n\tname: z.string(),\n\t/** the title of the app used for display (comes from the package.json title prop) */\n\ttitle: z.string(),\n\t/** 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) */\n\tdirName: z.string(),\n\tfullPath: z.string(),\n\trelativePath: z.string(),\n\tinstructionsCode: z.string().optional(),\n\tepicVideoEmbeds: z.array(z.string()).optional(),\n\ttest: z.union([\n\t\tz.object({\n\t\t\ttype: z.literal('browser'),\n\t\t\tpathname: z.string(),\n\t\t\ttestFiles: z.array(z.string()),\n\t\t}),\n\t\tz.object({ type: z.literal('script'), script: z.string() }),\n\t\tz.object({ type: z.literal('none') }),\n\t]),\n\tdev: z.union([\n\t\tz.object({ type: z.literal('browser'), pathname: z.string() }),\n\t\tz.object({\n\t\t\ttype: z.literal('script'),\n\t\t\tportNumber: z.number(),\n\t\t\tinitialRoute: z.string(),\n\t\t}),\n\t\tz.object({ type: z.literal('none') }),\n\t]),\n})\n\nconst BaseExerciseStepAppSchema = BaseAppSchema.extend({\n\texerciseNumber: z.number(),\n\tstepNumber: z.number(),\n})\n\nconst ProblemAppSchema = BaseExerciseStepAppSchema.extend({\n\ttype: z.literal('problem'),\n\tsolutionName: z.string().nullable(),\n})\n\nconst SolutionAppSchema = BaseExerciseStepAppSchema.extend({\n\ttype: z.literal('solution'),\n\tproblemName: z.string().nullable(),\n})\n\nconst ExampleAppSchema = BaseAppSchema.extend({\n\ttype: z.literal('example'),\n})\n\nconst PlaygroundAppSchema = BaseAppSchema.extend({\n\ttype: z.literal('playground'),\n\tappName: z.string(),\n})\n\nconst ExerciseSchema = z.object({\n\t/** a unique identifier for the exercise */\n\texerciseNumber: z.number(),\n\t/** 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) */\n\tdirName: z.string(),\n\t/** the title of the app used for display (comes from the first h1 in the README) */\n\ttitle: z.string(),\n\tinstructionsCode: z.string().optional(),\n\tfinishedCode: z.string().optional(),\n\tinstructionsEpicVideoEmbeds: z.array(z.string()).optional(),\n\tfinishedEpicVideoEmbeds: z.array(z.string()).optional(),\n\tsteps: z.array(\n\t\tz.union([\n\t\t\tz.object({\n\t\t\t\tstepNumber: z.number(),\n\t\t\t\tproblem: ProblemAppSchema,\n\t\t\t\tsolution: SolutionAppSchema,\n\t\t\t}),\n\t\t\tz.object({\n\t\t\t\tstepNumber: z.number(),\n\t\t\t\tproblem: ProblemAppSchema,\n\t\t\t\tsolution: z.never().optional(),\n\t\t\t}),\n\t\t\tz.object({\n\t\t\t\tstepNumber: z.number(),\n\t\t\t\tproblem: z.never().optional(),\n\t\t\t\tsolution: SolutionAppSchema,\n\t\t\t}),\n\t\t]),\n\t),\n\tproblems: z.array(ProblemAppSchema),\n\tsolutions: z.array(SolutionAppSchema),\n})\n\nconst ExerciseStepAppSchema = z.union([ProblemAppSchema, SolutionAppSchema])\n\nconst AppSchema = z.union([\n\tExerciseStepAppSchema,\n\tPlaygroundAppSchema,\n\tExampleAppSchema,\n])\n\ntype BaseApp = z.infer<typeof BaseAppSchema>\n\nexport type BaseExerciseStepApp = z.infer<typeof BaseExerciseStepAppSchema>\nexport type ProblemApp = z.infer<typeof ProblemAppSchema>\nexport type SolutionApp = z.infer<typeof SolutionAppSchema>\nexport type ExampleApp = z.infer<typeof ExampleAppSchema>\nexport type PlaygroundApp = z.infer<typeof PlaygroundAppSchema>\nexport type ExerciseStepApp = z.infer<typeof ExerciseStepAppSchema>\nexport type App = z.infer<typeof AppSchema>\n\ntype Exercise = z.infer<typeof ExerciseSchema>\n\nexport function isApp(app: any): app is App {\n\treturn AppSchema.safeParse(app).success\n}\n\nexport function isProblemApp(app: any): app is ProblemApp {\n\treturn ProblemAppSchema.safeParse(app).success\n}\n\nexport function isSolutionApp(app: any): app is SolutionApp {\n\treturn SolutionAppSchema.safeParse(app).success\n}\n\nexport function isFirstStepProblemApp(\n\tapp: App,\n): app is ProblemApp & { stepNumber: 1 } {\n\treturn isProblemApp(app) && app.stepNumber === 1\n}\n\nexport function isFirstStepSolutionApp(\n\tapp: App,\n): app is SolutionApp & { stepNumber: 1 } {\n\treturn isSolutionApp(app) && app.stepNumber === 1\n}\n\nexport function isPlaygroundApp(app: any): app is PlaygroundApp {\n\treturn isApp(app) && app.type === 'playground'\n}\n\nexport function isExampleApp(app: any): app is ExampleApp {\n\treturn isApp(app) && app.type === 'example'\n}\n\nexport function isExerciseStepApp(app: any): app is ExerciseStepApp {\n\treturn isProblemApp(app) || isSolutionApp(app)\n}\n\nfunction exists(file: string) {\n\treturn fs.promises.access(file, fs.constants.F_OK).then(\n\t\t() => true,\n\t\t() => false,\n\t)\n}\n\nfunction firstToExist(...files: Array<string>) {\n\treturn Promise.all(files.map(exists)).then(results => {\n\t\tconst index = results.findIndex(Boolean)\n\t\treturn index === -1 ? null : files[index]\n\t})\n}\n\nexport const modifiedTimes = remember(\n\t'modified_times',\n\t() => new Map<string, number>(),\n)\n\nexport function init() {\n\tasync function handleFileChanges(\n\t\tevent: string,\n\t\tfilePath: string,\n\t): Promise<void> {\n\t\tconst apps = await getApps()\n\t\tfor (const app of apps) {\n\t\t\tif (filePath.startsWith(app.fullPath)) {\n\t\t\t\tmodifiedTimes.set(app.fullPath, Date.now())\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\tgetWatcher()?.on('all', handleFileChanges)\n}\n\nfunction getForceFresh(cacheEntry: CacheEntry | null | undefined) {\n\tif (!cacheEntry) return true\n\tconst latestModifiedTime = Math.max(...Array.from(modifiedTimes.values()))\n\tif (!latestModifiedTime) return undefined\n\treturn latestModifiedTime > cacheEntry.metadata.createdTime ? true : undefined\n}\n\nexport function setModifiedTimesForDir(dir: string) {\n\tmodifiedTimes.set(dir, Date.now())\n}\n\nexport function getForceFreshForDir(\n\tdir: string,\n\tcacheEntry: CacheEntry | null | undefined,\n) {\n\tif (!path.isAbsolute(dir)) {\n\t\tthrow new Error(`Trying to get force fresh for non-absolute path: ${dir}`)\n\t}\n\tif (!cacheEntry) return true\n\tconst modifiedTime = modifiedTimes.get(dir)\n\tif (!modifiedTime) return undefined\n\treturn modifiedTime > cacheEntry.metadata.createdTime ? true : undefined\n}\n\nasync function readDir(dir: string) {\n\tif (await exists(dir)) {\n\t\treturn fs.promises.readdir(dir)\n\t}\n\treturn []\n}\n\nasync function compileMdxIfExists(\n\tfilepath: string,\n\t{ request }: { request?: Request } = {},\n) {\n\tfilepath = filepath.replace(/\\\\/g, '/')\n\tif (await exists(filepath)) {\n\t\tconst compiled = await compileMdx(filepath, { request }).catch(error => {\n\t\t\tconsole.error(`Error compiling ${filepath}:`, error)\n\t\t\treturn null\n\t\t})\n\t\treturn compiled\n\t}\n\treturn null\n}\n\nfunction getAppDirInfo(appDir: string) {\n\tconst regex = /^(?<stepNumber>\\d+)\\.(problem|solution)(\\.(?<subtitle>.*))?$/\n\tconst match = regex.exec(appDir)\n\tif (!match?.groups) {\n\t\tconsole.info(\n\t\t\t`Ignoring directory \"${appDir}\" which does not match regex \"${regex}\"`,\n\t\t\tnew Error().stack,\n\t\t)\n\t\treturn null\n\t}\n\tconst { stepNumber: stepNumberString, subtitle } = match.groups\n\tconst stepNumber = Number(stepNumberString)\n\tif (!stepNumber || !Number.isFinite(stepNumber)) {\n\t\tthrow new Error(\n\t\t\t`Cannot identify the stepNumber for app directory \"${appDir}\" with regex \"${regex}\"`,\n\t\t)\n\t}\n\n\tconst type = match[2] as 'problem' | 'solution'\n\treturn { stepNumber, type, subtitle }\n}\n\nfunction extractExerciseNumber(dir: string) {\n\tconst regex = /^(?<number>\\d+)\\./\n\tconst number = regex.exec(dir)?.groups?.number\n\tif (!number) {\n\t\treturn null\n\t}\n\treturn Number(number)\n}\n\nexport async function getExercises({\n\ttimings,\n\trequest,\n}: CachifiedOptions = {}): Promise<Array<Exercise>> {\n\tconst apps = await getApps({ request, timings })\n\tconst exerciseDirs = await readDir(path.join(workshopRoot, 'exercises'))\n\tconst exercises: Array<Exercise> = []\n\tfor (const dirName of exerciseDirs) {\n\t\tconst exerciseNumber = extractExerciseNumber(dirName)\n\t\tif (!exerciseNumber) continue\n\t\tconst compiledReadme = await compileMdxIfExists(\n\t\t\tpath.join(workshopRoot, 'exercises', dirName, 'README.mdx'),\n\t\t\t{ request },\n\t\t)\n\t\tconst compiledFinished = await compileMdxIfExists(\n\t\t\tpath.join(workshopRoot, 'exercises', dirName, 'FINISHED.mdx'),\n\t\t\t{ request },\n\t\t)\n\t\tconst steps: Exercise['steps'] = []\n\t\tconst exerciseApps = apps\n\t\t\t.filter(isExerciseStepApp)\n\t\t\t.filter(app => app.exerciseNumber === exerciseNumber)\n\t\tfor (const app of exerciseApps) {\n\t\t\t// @ts-ignore meh 🤷‍♂️\n\t\t\tsteps[app.stepNumber - 1] = {\n\t\t\t\t...steps[app.stepNumber - 1],\n\t\t\t\t[app.type]: app,\n\t\t\t\tstepNumber: app.stepNumber,\n\t\t\t}\n\t\t}\n\t\texercises.push({\n\t\t\texerciseNumber,\n\t\t\tdirName,\n\t\t\tinstructionsCode: compiledReadme?.code,\n\t\t\tfinishedCode: compiledFinished?.code,\n\t\t\ttitle: compiledReadme?.title ?? dirName,\n\t\t\tinstructionsEpicVideoEmbeds: compiledReadme?.epicVideoEmbeds,\n\t\t\tfinishedEpicVideoEmbeds: compiledFinished?.epicVideoEmbeds,\n\t\t\tsteps,\n\t\t\tproblems: apps\n\t\t\t\t.filter(isProblemApp)\n\t\t\t\t.filter(app => app.exerciseNumber === exerciseNumber),\n\t\t\tsolutions: apps\n\t\t\t\t.filter(isSolutionApp)\n\t\t\t\t.filter(app => app.exerciseNumber === exerciseNumber),\n\t\t})\n\t}\n\treturn exercises\n}\n\nlet appCallCount = 0\n\nexport async function getApps({\n\ttimings,\n\trequest,\n\tforceFresh,\n}: CachifiedOptions & { forceFresh?: boolean } = {}): Promise<Array<App>> {\n\tconst key = 'apps'\n\tconst apps = await cachified({\n\t\tkey,\n\t\tcache: appsCache,\n\t\ttimings,\n\t\ttimingKey: `apps_${appCallCount++}`,\n\t\trequest,\n\t\t// This entire cache is to avoid a single request getting a fresh value\n\t\t// multiple times unnecessarily (because getApps is called many times)\n\t\tttl: 1000 * 60 * 60 * 24,\n\t\tforceFresh: forceFresh ?? getForceFresh(appsCache.get(key)),\n\t\tgetFreshValue: async () => {\n\t\t\tconst playgroundApp = await getPlaygroundApp({ request, timings })\n\t\t\tconst problemApps = await getProblemApps({ request, timings })\n\t\t\tconst solutionApps = await getSolutionApps({ request, timings })\n\t\t\tconst exampleApps = await getExampleApps({ request, timings })\n\t\t\tconst sortedApps = [\n\t\t\t\tplaygroundApp,\n\t\t\t\t...problemApps,\n\t\t\t\t...solutionApps,\n\t\t\t\t...exampleApps,\n\t\t\t]\n\t\t\t\t.filter(Boolean)\n\t\t\t\t.sort((a, b) => {\n\t\t\t\t\tif (isPlaygroundApp(a)) {\n\t\t\t\t\t\tif (isPlaygroundApp(b)) return a.name.localeCompare(b.name)\n\t\t\t\t\t\telse return 1\n\t\t\t\t\t}\n\t\t\t\t\tif (isPlaygroundApp(b)) return 1\n\n\t\t\t\t\tif (isExampleApp(a)) {\n\t\t\t\t\t\tif (isExampleApp(b)) return a.name.localeCompare(b.name)\n\t\t\t\t\t\telse return 1\n\t\t\t\t\t}\n\t\t\t\t\tif (isExampleApp(b)) return -1\n\n\t\t\t\t\tif (a.type === b.type) {\n\t\t\t\t\t\tif (a.exerciseNumber === b.exerciseNumber) {\n\t\t\t\t\t\t\treturn a.stepNumber - b.stepNumber\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn a.exerciseNumber - b.exerciseNumber\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// at this point, we know that a and b are different types...\n\t\t\t\t\tif (isProblemApp(a)) {\n\t\t\t\t\t\tif (a.exerciseNumber === b.exerciseNumber) {\n\t\t\t\t\t\t\treturn a.stepNumber <= b.stepNumber ? 1 : -1\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn a.exerciseNumber <= b.exerciseNumber ? 1 : -1\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (isSolutionApp(a)) {\n\t\t\t\t\t\tif (a.exerciseNumber === b.exerciseNumber) {\n\t\t\t\t\t\t\treturn a.stepNumber < b.stepNumber ? -1 : 1\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn a.exerciseNumber < b.exerciseNumber ? -1 : 1\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tconsole.error('unhandled sorting case', a, b)\n\t\t\t\t\treturn 0\n\t\t\t\t})\n\t\t\treturn sortedApps\n\t\t},\n\t})\n\treturn apps\n}\n\nconst AppIdInfoSchema = z.object({\n\texerciseNumber: z.string(),\n\tstepNumber: z.string(),\n\ttype: z.union([z.literal('problem'), z.literal('solution')]),\n})\n\n/**\n * Handles both full paths and app names\n *\n * @example\n * extractNumbersAndTypeFromAppNameOrPath('02.01.problem') // { exerciseNumber: '02', stepNumber: '01', type: 'problem' }\n * extractNumbersAndTypeFromAppNameOrPath('/path/to/exercises/02.desc/01.problem.desc') // { exerciseNumber: '02', stepNumber: '01', type: 'problem' }\n */\nexport function extractNumbersAndTypeFromAppNameOrPath(\n\tfullPathOrAppName: string,\n) {\n\tconst info: { exerciseNumber?: string; stepNumber?: string; type?: string } =\n\t\t{}\n\tif (fullPathOrAppName.includes(path.sep)) {\n\t\tconst relativePath = fullPathOrAppName.replace(\n\t\t\tpath.join(workshopRoot, 'exercises', path.sep),\n\t\t\t'',\n\t\t)\n\t\tconst [exerciseNumberPart, stepNumberPart] = relativePath.split(path.sep)\n\t\tif (!exerciseNumberPart || !stepNumberPart) return null\n\t\tconst exerciseNumber = exerciseNumberPart.split('.')[0]\n\t\tconst stepNumber = stepNumberPart.split('.')[0]\n\t\tconst type = stepNumberPart.split('.')[1]?.split('.')[0]\n\t\tinfo.exerciseNumber = exerciseNumber\n\t\tinfo.stepNumber = stepNumber\n\t\tinfo.type = type\n\t} else {\n\t\tconst [exerciseNumber, stepNumber, type] = fullPathOrAppName.split('.')\n\t\tinfo.exerciseNumber = exerciseNumber\n\t\tinfo.stepNumber = stepNumber\n\t\tinfo.type = type\n\t}\n\tconst result = AppIdInfoSchema.safeParse(info)\n\tif (result.success) return result.data\n\treturn null\n}\n\nasync function getProblemDirs() {\n\tconst exercisesDir = path.join(workshopRoot, 'exercises')\n\tconst problemDirs = (\n\t\tawait glob('**/*.problem*', {\n\t\t\tcwd: exercisesDir,\n\t\t\tignore: 'node_modules/**',\n\t\t})\n\t).map(p => path.join(exercisesDir, p))\n\treturn problemDirs\n}\n\nasync function getSolutionDirs() {\n\tconst exercisesDir = path.join(workshopRoot, 'exercises')\n\tconst solutionDirs = (\n\t\tawait glob('**/*.solution*', {\n\t\t\tcwd: exercisesDir,\n\t\t\tignore: 'node_modules/**',\n\t\t})\n\t).map(p => path.join(exercisesDir, p))\n\treturn solutionDirs\n}\n\n/**\n * This is the pathname for the app in the browser\n */\nfunction getPathname(fullPath: string) {\n\tconst appName = getAppName(fullPath)\n\treturn `/app/${appName}/`\n}\n\nfunction getAppName(fullPath: string) {\n\tif (/playground\\/?$/.test(fullPath)) return 'playground'\n\tif (/examples\\/.+\\/?$/.test(fullPath)) {\n\t\tconst restOfPath = fullPath.replace(\n\t\t\t`${getWorkshopRoot()}${path.sep}examples${path.sep}`,\n\t\t\t'',\n\t\t)\n\t\treturn `example.${restOfPath.split(path.sep).join('__sep__')}`\n\t}\n\tconst appIdInfo = extractNumbersAndTypeFromAppNameOrPath(fullPath)\n\tif (appIdInfo) {\n\t\tconst { exerciseNumber, stepNumber, type } = appIdInfo\n\t\treturn `${exerciseNumber}.${stepNumber}.${type}`\n\t} else {\n\t\tconst relativePath = fullPath.replace(`${workshopRoot}${path.sep}`, '')\n\t\treturn relativePath.split(path.sep).join('__sep__')\n\t}\n}\n\nasync function getFullPathFromAppName(appName: string) {\n\tif (appName === 'playground') return path.join(workshopRoot, 'playground')\n\tif (appName.startsWith('.example')) {\n\t\tconst relativePath = appName\n\t\t\t.replace('.example', '')\n\t\t\t.split('__sep__')\n\t\t\t.join(path.sep)\n\t\treturn path.join(workshopRoot, 'examples', relativePath)\n\t}\n\tif (appName.includes('__sep__')) {\n\t\tconst relativePath = appName.replaceAll('__sep__', path.sep)\n\t\treturn path.join(workshopRoot, relativePath)\n\t}\n\tconst [exerciseNumber, stepNumber, type] = appName.split('.')\n\tconst appDirs =\n\t\ttype === 'problem'\n\t\t\t? await getProblemDirs()\n\t\t\t: type === 'solution'\n\t\t\t\t? await getSolutionDirs()\n\t\t\t\t: []\n\tconst dir = appDirs.find(dir => {\n\t\tconst info = extractNumbersAndTypeFromAppNameOrPath(dir)\n\t\tif (!info) return false\n\t\treturn (\n\t\t\tinfo.exerciseNumber === exerciseNumber && info.stepNumber === stepNumber\n\t\t)\n\t})\n\treturn dir ?? appName\n}\n\nasync function findSolutionDir({\n\tfullPath,\n}: {\n\tfullPath: string\n}): Promise<string | null> {\n\tconst dirName = path.basename(fullPath)\n\tif (dirName.includes('.problem')) {\n\t\tconst info = getAppDirInfo(dirName)\n\t\tif (!info) return null\n\t\tconst { stepNumber } = info\n\t\tconst paddedStepNumber = stepNumber.toString().padStart(2, '0')\n\t\tconst parentDir = path.dirname(fullPath)\n\t\tconst siblingDirs = await fs.promises.readdir(parentDir)\n\t\tconst solutionDir = siblingDirs.find(dir =>\n\t\t\tdir.startsWith(`${paddedStepNumber}.solution`),\n\t\t)\n\t\tif (solutionDir) {\n\t\t\treturn path.join(parentDir, solutionDir)\n\t\t}\n\t} else if (fullPath.endsWith('playground')) {\n\t\tconst appName = await getPlaygroundAppName()\n\t\tif (appName) {\n\t\t\treturn findSolutionDir({\n\t\t\t\tfullPath: await getFullPathFromAppName(appName),\n\t\t\t})\n\t\t}\n\t}\n\treturn null\n}\n\nasync function findProblemDir({\n\tfullPath,\n}: {\n\tfullPath: string\n}): Promise<string | null> {\n\tconst dirName = path.basename(fullPath)\n\tif (dirName.includes('.solution')) {\n\t\tconst info = getAppDirInfo(dirName)\n\t\tif (!info) return null\n\t\tconst { stepNumber } = info\n\t\tconst paddedStepNumber = stepNumber.toString().padStart(2, '0')\n\t\tconst parentDir = path.dirname(fullPath)\n\t\tconst siblingDirs = await fs.promises.readdir(parentDir)\n\t\tconst problemDir = siblingDirs.find(\n\t\t\tdir => dir.endsWith('problem') && dir.includes(paddedStepNumber),\n\t\t)\n\t\tif (problemDir) {\n\t\t\treturn path.join(parentDir, problemDir)\n\t\t}\n\t} else if (fullPath.endsWith('playground')) {\n\t\tconst appName = await getPlaygroundAppName()\n\t\tif (appName) {\n\t\t\treturn findProblemDir({ fullPath: await getFullPathFromAppName(appName) })\n\t\t}\n\t}\n\treturn null\n}\n\nasync function getTestInfo({\n\tfullPath,\n}: {\n\tfullPath: string\n}): Promise<BaseApp['test']> {\n\tconst hasPkgJson = await exists(path.join(fullPath, 'package.json'))\n\tconst testScript = hasPkgJson\n\t\t? await getPkgProp(fullPath, 'epicshop.scripts.test', '')\n\t\t: null\n\n\tif (testScript) {\n\t\treturn { type: 'script', script: testScript }\n\t}\n\n\t// tests are found in the corresponding solution directory\n\tconst testAppFullPath = (await findSolutionDir({ fullPath })) ?? fullPath\n\n\tconst dirList = await fs.promises.readdir(testAppFullPath)\n\tconst testFiles = dirList.filter(item => item.includes('.test.'))\n\tif (testFiles.length) {\n\t\treturn {\n\t\t\ttype: 'browser',\n\t\t\tpathname: `${getPathname(fullPath)}test/`,\n\t\t\ttestFiles,\n\t\t}\n\t}\n\n\treturn { type: 'none' }\n}\n\nasync function getDevInfo({\n\tfullPath,\n\tportNumber,\n}: {\n\tfullPath: string\n\tportNumber: number\n}): Promise<BaseApp['dev']> {\n\tconst hasPkgJson = await exists(path.join(fullPath, 'package.json'))\n\tconst hasDevScript = hasPkgJson\n\t\t? Boolean(await getPkgProp(fullPath, 'scripts.dev', ''))\n\t\t: false\n\n\tif (hasDevScript) {\n\t\tconst initialRoute =\n\t\t\t(hasPkgJson\n\t\t\t\t? await getPkgProp(fullPath, 'epicshop.initialRoute', '')\n\t\t\t\t: '') || (await getPkgProp(workshopRoot, 'epicshop.initialRoute', '/'))\n\t\treturn { type: 'script', portNumber, initialRoute }\n\t}\n\tconst indexFiles = (await fsExtra.readdir(fullPath)).filter((file: string) =>\n\t\tfile.startsWith('index.'),\n\t)\n\tif (indexFiles.length) {\n\t\treturn { type: 'browser', pathname: getPathname(fullPath) }\n\t} else {\n\t\treturn { type: 'none' }\n\t}\n}\n\nexport async function getPlaygroundApp({\n\ttimings,\n\trequest,\n}: CachifiedOptions = {}): Promise<PlaygroundApp | null> {\n\tconst playgroundDir = path.join(workshopRoot, 'playground')\n\tconst appName = await getPlaygroundAppName()\n\tconst key = `playground-${appName}`\n\treturn cachified({\n\t\tkey,\n\t\tcache: playgroundAppCache,\n\t\tttl: 1000 * 60 * 60 * 24,\n\n\t\ttimings,\n\t\ttimingKey: playgroundDir.replace(`${playgroundDir}${path.sep}`, ''),\n\t\trequest,\n\t\tforceFresh: getForceFreshForDir(playgroundDir, playgroundAppCache.get(key)),\n\t\tgetFreshValue: async () => {\n\t\t\tif (!(await exists(playgroundDir))) return null\n\t\t\tif (!appName) return null\n\n\t\t\tconst dirName = path.basename(playgroundDir)\n\t\t\tconst name = getAppName(playgroundDir)\n\t\t\tconst portNumber = 4000\n\t\t\tconst [compiledReadme, test, dev] = await Promise.all([\n\t\t\t\tcompileMdxIfExists(path.join(playgroundDir, 'README.mdx'), { request }),\n\t\t\t\tgetTestInfo({ fullPath: playgroundDir }),\n\t\t\t\tgetDevInfo({ fullPath: playgroundDir, portNumber }),\n\t\t\t])\n\t\t\treturn {\n\t\t\t\tname,\n\t\t\t\tappName,\n\t\t\t\ttype: 'playground',\n\t\t\t\tfullPath: playgroundDir,\n\t\t\t\trelativePath: playgroundDir.replace(\n\t\t\t\t\t`${getWorkshopRoot()}${path.sep}`,\n\t\t\t\t\t'',\n\t\t\t\t),\n\t\t\t\ttitle: compiledReadme?.title ?? name,\n\t\t\t\tepicVideoEmbeds: compiledReadme?.epicVideoEmbeds,\n\t\t\t\tdirName,\n\t\t\t\tinstructionsCode: compiledReadme?.code,\n\t\t\t\ttest,\n\t\t\t\tdev,\n\t\t\t} as const\n\t\t},\n\t}).catch(error => {\n\t\tconsole.error(error)\n\t\treturn null\n\t})\n}\n\nasync function getExampleAppFromPath(\n\tfullPath: string,\n\tindex: number,\n\trequest?: Request,\n): Promise<ExampleApp> {\n\tconst dirName = path.basename(fullPath)\n\tconst compiledReadme = await compileMdxIfExists(\n\t\tpath.join(fullPath, 'README.mdx'),\n\t\t{ request },\n\t)\n\tconst name = getAppName(fullPath)\n\tconst portNumber = 8000 + index\n\treturn {\n\t\tname,\n\t\ttype: 'example',\n\t\tfullPath,\n\t\trelativePath: fullPath.replace(`${getWorkshopRoot()}${path.sep}`, ''),\n\t\ttitle: compiledReadme?.title ?? name,\n\t\tepicVideoEmbeds: compiledReadme?.epicVideoEmbeds,\n\t\tdirName,\n\t\tinstructionsCode: compiledReadme?.code,\n\t\ttest: await getTestInfo({ fullPath }),\n\t\tdev: await getDevInfo({ fullPath, portNumber }),\n\t}\n}\n\nasync function getExampleApps({\n\ttimings,\n\trequest,\n}: CachifiedOptions = {}): Promise<Array<ExampleApp>> {\n\tconst examplesDir = path.join(workshopRoot, 'examples')\n\tconst exampleDirs = (\n\t\tawait glob('*', { cwd: examplesDir, ignore: 'node_modules/**' })\n\t).map(p => path.join(examplesDir, p))\n\n\tconst exampleApps: Array<ExampleApp> = []\n\n\tfor (const exampleDir of exampleDirs) {\n\t\tconst index = exampleDirs.indexOf(exampleDir)\n\t\tconst key = `${exampleDir}-${index}`\n\t\tconst exampleApp = await cachified({\n\t\t\tkey,\n\t\t\tcache: exampleAppCache,\n\t\t\tttl: 1000 * 60 * 60 * 24,\n\n\t\t\ttimings,\n\t\t\ttimingKey: exampleDir.replace(`${examplesDir}${path.sep}`, ''),\n\t\t\trequest,\n\t\t\tforceFresh: getForceFreshForDir(exampleDir, exampleAppCache.get(key)),\n\t\t\tgetFreshValue: () =>\n\t\t\t\tgetExampleAppFromPath(exampleDir, index, request).catch(error => {\n\t\t\t\t\tconsole.error(error)\n\t\t\t\t\treturn null\n\t\t\t\t}),\n\t\t})\n\t\tif (exampleApp) exampleApps.push(exampleApp)\n\t}\n\n\treturn exampleApps\n}\n\nasync function getSolutionAppFromPath(\n\tfullPath: string,\n\trequest?: Request,\n): Promise<SolutionApp | null> {\n\tconst dirName = path.basename(fullPath)\n\tconst parentDirName = path.basename(path.dirname(fullPath))\n\tconst exerciseNumber = extractExerciseNumber(parentDirName)\n\tif (!exerciseNumber) return null\n\n\tconst name = getAppName(fullPath)\n\tconst info = getAppDirInfo(dirName)\n\tif (!info) return null\n\tconst { stepNumber } = info\n\tconst portNumber = 7000 + (exerciseNumber - 1) * 10 + stepNumber\n\tconst compiledReadme = await compileMdxIfExists(\n\t\tpath.join(fullPath, 'README.mdx'),\n\t\t{ request },\n\t)\n\tconst problemDir = await findProblemDir({\n\t\tfullPath,\n\t})\n\tconst problemName = problemDir ? getAppName(problemDir) : null\n\tconst [test, dev] = await Promise.all([\n\t\tgetTestInfo({ fullPath }),\n\t\tgetDevInfo({ fullPath, portNumber }),\n\t])\n\treturn {\n\t\tname,\n\t\ttitle: compiledReadme?.title ?? name,\n\t\tepicVideoEmbeds: compiledReadme?.epicVideoEmbeds,\n\t\ttype: 'solution',\n\t\tproblemName,\n\t\texerciseNumber,\n\t\tstepNumber,\n\t\tdirName,\n\t\tfullPath,\n\t\trelativePath: fullPath.replace(`${getWorkshopRoot()}${path.sep}`, ''),\n\t\tinstructionsCode: compiledReadme?.code,\n\t\ttest,\n\t\tdev,\n\t}\n}\n\nasync function getSolutionApps({\n\ttimings,\n\trequest,\n}: CachifiedOptions = {}): Promise<Array<SolutionApp>> {\n\tconst exercisesDir = path.join(workshopRoot, 'exercises')\n\tconst solutionDirs = await getSolutionDirs()\n\tconst solutionApps: Array<SolutionApp> = []\n\n\tfor (const solutionDir of solutionDirs) {\n\t\tconst solutionApp = await cachified({\n\t\t\tkey: solutionDir,\n\t\t\tcache: solutionAppCache,\n\t\t\ttimings,\n\t\t\ttimingKey: solutionDir.replace(`${exercisesDir}${path.sep}`, ''),\n\t\t\trequest,\n\t\t\tttl: 1000 * 60 * 60 * 24,\n\n\t\t\tforceFresh: getForceFreshForDir(\n\t\t\t\tsolutionDir,\n\t\t\t\tsolutionAppCache.get(solutionDir),\n\t\t\t),\n\t\t\tgetFreshValue: () =>\n\t\t\t\tgetSolutionAppFromPath(solutionDir, request).catch(error => {\n\t\t\t\t\tconsole.error(error)\n\t\t\t\t\treturn null\n\t\t\t\t}),\n\t\t})\n\t\tif (solutionApp) solutionApps.push(solutionApp)\n\t}\n\n\treturn solutionApps\n}\n\nasync function getProblemAppFromPath(\n\tfullPath: string,\n\trequest?: Request,\n): Promise<ProblemApp | null> {\n\tconst dirName = path.basename(fullPath)\n\tconst parentDirName = path.basename(path.dirname(fullPath))\n\tconst exerciseNumber = extractExerciseNumber(parentDirName)\n\tif (!exerciseNumber) return null\n\n\tconst name = getAppName(fullPath)\n\tconst info = getAppDirInfo(dirName)\n\tif (!info) return null\n\tconst { stepNumber } = info\n\tconst portNumber = 6000 + (exerciseNumber - 1) * 10 + stepNumber\n\tconst compiledReadme = await compileMdxIfExists(\n\t\tpath.join(fullPath, 'README.mdx'),\n\t\t{ request },\n\t)\n\tconst solutionDir = await findSolutionDir({\n\t\tfullPath,\n\t})\n\tconst solutionName = solutionDir ? getAppName(solutionDir) : null\n\tconst [test, dev] = await Promise.all([\n\t\tgetTestInfo({ fullPath }),\n\t\tgetDevInfo({ fullPath, portNumber }),\n\t])\n\treturn {\n\t\tsolutionName,\n\t\tname,\n\t\ttitle: compiledReadme?.title ?? name,\n\t\tepicVideoEmbeds: compiledReadme?.epicVideoEmbeds,\n\t\ttype: 'problem',\n\t\texerciseNumber,\n\t\tstepNumber,\n\t\tdirName,\n\t\tfullPath,\n\t\trelativePath: fullPath.replace(`${getWorkshopRoot()}${path.sep}`, ''),\n\t\tinstructionsCode: compiledReadme?.code,\n\t\ttest,\n\t\tdev,\n\t}\n}\n\nasync function getProblemApps({\n\ttimings,\n\trequest,\n}: CachifiedOptions = {}): Promise<Array<ProblemApp>> {\n\tconst exercisesDir = path.join(workshopRoot, 'exercises')\n\tconst problemDirs = await getProblemDirs()\n\tconst problemApps: Array<ProblemApp> = []\n\tfor (const problemDir of problemDirs) {\n\t\tconst problemApp = await cachified({\n\t\t\tkey: problemDir,\n\t\t\tcache: problemAppCache,\n\t\t\ttimings,\n\t\t\ttimingKey: problemDir.replace(`${exercisesDir}${path.sep}`, ''),\n\t\t\trequest,\n\t\t\tttl: 1000 * 60 * 60 * 24,\n\n\t\t\tforceFresh: getForceFreshForDir(\n\t\t\t\tproblemDir,\n\t\t\t\tproblemAppCache.get(problemDir),\n\t\t\t),\n\t\t\tgetFreshValue: () =>\n\t\t\t\tgetProblemAppFromPath(problemDir).catch(error => {\n\t\t\t\t\tconsole.error(error)\n\t\t\t\t\treturn null\n\t\t\t\t}),\n\t\t})\n\t\tif (problemApp) problemApps.push(problemApp)\n\t}\n\treturn problemApps\n}\n\nexport async function getExercise(\n\texerciseNumber: number | string,\n\t{ request, timings }: CachifiedOptions = {},\n) {\n\tconst exercises = await getExercises({ request, timings })\n\treturn exercises.find(s => s.exerciseNumber === Number(exerciseNumber))\n}\n\nexport async function requireExercise(\n\texerciseNumber: number | string,\n\t{ request, timings }: CachifiedOptions = {},\n) {\n\tconst exercise = await getExercise(exerciseNumber, { request, timings })\n\tif (!exercise) {\n\t\tthrow new Response('Not found', {\n\t\t\tstatus: 404,\n\t\t\theaders: { 'Server-Timing': getServerTimeHeader(timings) },\n\t\t})\n\t}\n\treturn exercise\n}\n\nexport async function requireExerciseApp(\n\tparams: Parameters<typeof getExerciseApp>[0],\n\t{ request, timings }: CachifiedOptions = {},\n) {\n\tconst app = await getExerciseApp(params, { request, timings })\n\tif (!app) {\n\t\tthrow new Response('Not found', { status: 404 })\n\t}\n\treturn app\n}\n\nconst ExerciseAppParamsSchema = z.object({\n\ttype: z.union([z.literal('problem'), z.literal('solution')]),\n\texerciseNumber: z.coerce.number().finite(),\n\tstepNumber: z.coerce.number().finite(),\n})\n\nexport async function getExerciseApp(\n\tparams: {\n\t\ttype?: string\n\t\texerciseNumber?: string\n\t\tstepNumber?: string\n\t},\n\t{ request, timings }: CachifiedOptions = {},\n) {\n\tconst result = ExerciseAppParamsSchema.safeParse(params)\n\tif (!result.success) {\n\t\treturn null\n\t}\n\tconst { type, exerciseNumber, stepNumber } = result.data\n\n\tconst apps = (await getApps({ request, timings })).filter(isExerciseStepApp)\n\tconst exerciseApp = apps.find(app => {\n\t\tif (isExampleApp(app)) return false\n\t\treturn (\n\t\t\tapp.exerciseNumber === exerciseNumber &&\n\t\t\tapp.stepNumber === stepNumber &&\n\t\t\tapp.type === type\n\t\t)\n\t})\n\tif (!exerciseApp) {\n\t\treturn null\n\t}\n\treturn exerciseApp\n}\n\nexport async function getAppByName(\n\tname: string,\n\t{ request, timings }: CachifiedOptions = {},\n) {\n\tconst apps = await getApps({ request, timings })\n\treturn apps.find(a => a.name === name)\n}\n\nexport async function getNextExerciseApp(\n\tapp: ExerciseStepApp,\n\t{ request, timings }: CachifiedOptions = {},\n) {\n\tconst apps = (await getApps({ request, timings })).filter(isExerciseStepApp)\n\tconst index = apps.findIndex(a => a.name === app.name)\n\tif (index === -1) {\n\t\tthrow new Error(`Could not find app ${app.name}`)\n\t}\n\tconst nextApp = apps[index + 1]\n\treturn nextApp ? nextApp : null\n}\n\nexport async function getPrevExerciseApp(\n\tapp: ExerciseStepApp,\n\t{ request, timings }: CachifiedOptions = {},\n) {\n\tconst apps = (await getApps({ request, timings })).filter(isExerciseStepApp)\n\n\tconst index = apps.findIndex(a => a.name === app.name)\n\tif (index === -1) {\n\t\tthrow new Error(`Could not find app ${app.name}`)\n\t}\n\tconst prevApp = apps[index - 1]\n\treturn prevApp ? prevApp : null\n}\n\nexport function getAppPageRoute(app: ExerciseStepApp) {\n\tconst exerciseNumber = app.exerciseNumber.toString().padStart(2, '0')\n\tconst stepNumber = app.stepNumber.toString().padStart(2, '0')\n\treturn `/${exerciseNumber}/${stepNumber}/${app.type}`\n}\n\n/**\n * Given a file path, this will find the app that file path belongs to.\n */\nexport async function getAppFromFile(filePath: string) {\n\tconst apps = await getApps()\n\treturn apps.find(app => filePath.startsWith(app.fullPath))\n}\n\nexport async function setPlayground(\n\tsrcDir: string,\n\t{ reset }: { reset?: boolean } = {},\n) {\n\tconst isIgnored = await isGitIgnored({ cwd: srcDir })\n\tconst workshopRoot = getWorkshopRoot()\n\tconst destDir = path.join(workshopRoot, 'playground')\n\tconst playgroundFiles = path.join(destDir, '**')\n\tgetOptionalWatcher()?.unwatch(playgroundFiles)\n\tconst playgroundApp = await getAppByName('playground')\n\tconst playgroundWasRunning = playgroundApp\n\t\t? isAppRunning(playgroundApp)\n\t\t: false\n\tif (playgroundApp && reset) {\n\t\tawait closeProcess(playgroundApp.name)\n\t\tawait fsExtra.remove(destDir)\n\t}\n\tconst setPlaygroundTimestamp = Date.now()\n\n\t// run prepare-playground script if it exists\n\tconst preSetPlaygroundPath = await firstToExist(\n\t\tpath.join(srcDir, 'epicshop', 'pre-set-playground.js'),\n\t\tpath.join(workshopRoot, 'epicshop', 'pre-set-playground.js'),\n\t)\n\tif (preSetPlaygroundPath) {\n\t\tawait execa('node', [preSetPlaygroundPath], {\n\t\t\tcwd: workshopRoot,\n\t\t\tstdio: 'inherit',\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n\t\t\tenv: {\n\t\t\t\tEPICSHOP_PLAYGROUND_TIMESTAMP: setPlaygroundTimestamp.toString(),\n\t\t\t\tEPICSHOP_PLAYGROUND_DEST_DIR: destDir,\n\t\t\t\tEPICSHOP_PLAYGROUND_SRC_DIR: srcDir,\n\t\t\t\tEPICSHOP_PLAYGROUND_WAS_RUNNING: playgroundWasRunning.toString(),\n\t\t\t} as any,\n\t\t})\n\t}\n\n\tconst basename = path.basename(srcDir)\n\t// If we don't delete the destination node_modules first then copying the new\n\t// node_modules has issues.\n\tawait fsExtra.remove(path.join(destDir, 'node_modules'))\n\t// Copy the contents of the source directory to the destination directory recursively\n\tawait fsExtra.copy(srcDir, destDir, {\n\t\tfilter: async (srcFile, destFile) => {\n\t\t\tif (\n\t\t\t\tsrcFile.includes(`${basename}${path.sep}build`) ||\n\t\t\t\tsrcFile.includes(`${basename}${path.sep}public${path.sep}build`)\n\t\t\t) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tif (srcFile === srcDir) return true\n\t\t\t// we copy node_modules even though it's .gitignored\n\t\t\tif (srcFile.includes('node_modules')) return true\n\t\t\t// make sure .env is copied whether it's .gitignored or not\n\t\t\tif (srcFile.endsWith('.env')) return true\n\t\t\tif (isIgnored(srcFile)) return false\n\n\t\t\ttry {\n\t\t\t\tconst isDir = (await fsExtra.stat(srcFile)).isDirectory()\n\t\t\t\tif (isDir) return true\n\t\t\t\tconst destIsDir = (await fsExtra.stat(destFile)).isDirectory()\n\t\t\t\t// weird, but ok\n\t\t\t\tif (destIsDir) return true\n\n\t\t\t\t// it's better to check if the contents are the same before copying\n\t\t\t\t// because it avoids unnecessary writes and reduces the impact on any\n\t\t\t\t// file watchers (like the remix dev server). In practice, it's definitely\n\t\t\t\t// slower, but it's better because it doesn't cause the dev server to\n\t\t\t\t// crash as often.\n\t\t\t\tconst currentContents = await fsExtra.readFile(destFile)\n\t\t\t\tconst newContents = await fsExtra.readFile(srcFile)\n\t\t\t\tif (currentContents.equals(newContents)) return false\n\n\t\t\t\treturn true\n\t\t\t} catch {\n\t\t\t\t// 🤷‍♂️ should probably copy it in this case\n\t\t\t\treturn true\n\t\t\t}\n\t\t},\n\t})\n\n\tasync function getFiles(dir: string) {\n\t\t// make globby friendly to windows\n\t\tconst dirPath = dir.replace(/\\\\/g, '/')\n\t\tconst files = await globby([`${dirPath}/**/*`, '!**/build/**/*'], {\n\t\t\tonlyFiles: false,\n\t\t\tdot: true,\n\t\t})\n\t\treturn files.map(f => f.replace(dirPath, ''))\n\t}\n\n\t// Remove files from destDir that were in destDir before but are not in srcDir\n\tconst srcFiles = await getFiles(srcDir)\n\tconst destFiles = await getFiles(destDir)\n\tconst filesToDelete = destFiles.filter(\n\t\tfileName => !srcFiles.includes(fileName),\n\t)\n\n\tfor (const fileToDelete of filesToDelete) {\n\t\tawait fsExtra.remove(path.join(destDir, fileToDelete))\n\t}\n\n\tconst appName = getAppName(srcDir)\n\tawait fsExtra.ensureDir(path.dirname(playgroundAppNameInfoPath))\n\tawait fsExtra.writeJSON(playgroundAppNameInfoPath, { appName })\n\n\tconst playgroundIsStillRunning = playgroundApp\n\t\t? isAppRunning(playgroundApp)\n\t\t: false\n\tconst restartPlayground = playgroundWasRunning && !playgroundIsStillRunning\n\n\t// run postSet-playground script if it exists\n\tconst postSetPlaygroundPath = await firstToExist(\n\t\tpath.join(srcDir, 'epicshop', 'post-set-playground.js'),\n\t\tpath.join(workshopRoot, 'epicshop', 'post-set-playground.js'),\n\t)\n\tif (postSetPlaygroundPath) {\n\t\tawait execa('node', [postSetPlaygroundPath], {\n\t\t\tcwd: workshopRoot,\n\t\t\tstdio: 'inherit',\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n\t\t\tenv: {\n\t\t\t\tEPICSHOP_PLAYGROUND_TIMESTAMP: setPlaygroundTimestamp.toString(),\n\t\t\t\tEPICSHOP_PLAYGROUND_SRC_DIR: srcDir,\n\t\t\t\tEPICSHOP_PLAYGROUND_DEST_DIR: destDir,\n\t\t\t\tEPICSHOP_PLAYGROUND_WAS_RUNNING: playgroundWasRunning.toString(),\n\t\t\t\tEPICSHOP_PLAYGROUND_IS_STILL_RUNNING:\n\t\t\t\t\tplaygroundIsStillRunning.toString(),\n\t\t\t\tEPICSHOP_PLAYGROUND_RESTART_PLAYGROUND: restartPlayground.toString(),\n\t\t\t} as any,\n\t\t})\n\t}\n\n\tif (playgroundApp && restartPlayground) {\n\t\tawait runAppDev(playgroundApp)\n\t\tawait waitOnApp(playgroundApp)\n\t}\n\n\tgetOptionalWatcher()?.add(playgroundFiles)\n\tmodifiedTimes.set(destDir, Date.now())\n}\n\n/**\n * The playground is based on another app. This returns the app the playground\n * is based on.\n */\nexport async function getPlaygroundAppName() {\n\tif (!(await exists(playgroundAppNameInfoPath))) {\n\t\treturn null\n\t}\n\ttry {\n\t\tconst jsonString = await fs.promises.readFile(\n\t\t\tplaygroundAppNameInfoPath,\n\t\t\t'utf8',\n\t\t)\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n\t\tconst { appName } = JSON.parse(jsonString) as any\n\t\tif (typeof appName !== 'string') return null\n\t\treturn appName\n\t} catch {\n\t\treturn null\n\t}\n}\n\nexport function getAppDisplayName(a: App, allApps: Array<App>) {\n\tlet displayName = `${a.title} (${a.type})`\n\tif (isExerciseStepApp(a)) {\n\t\tconst typeLabel = { problem: '💪', solution: '🏁' }[a.type]\n\t\tdisplayName = `${a.exerciseNumber}.${a.stepNumber} ${a.title} (${typeLabel} ${a.type})`\n\t} else if (isPlaygroundApp(a)) {\n\t\tconst playgroundAppBasis = allApps.find(\n\t\t\totherApp => a.appName === otherApp.name,\n\t\t)\n\t\tif (playgroundAppBasis) {\n\t\t\tconst basisDisplayName = getAppDisplayName(playgroundAppBasis, allApps)\n\t\t\tdisplayName = `🛝 ${basisDisplayName}`\n\t\t} else {\n\t\t\tdisplayName = `🛝 ${a.appName}`\n\t\t}\n\t} else if (isExampleApp(a)) {\n\t\tdisplayName = `📚 ${a.title} (example)`\n\t}\n\treturn displayName\n}\n\nexport async function getWorkshopTitle() {\n\tconst title = await getPkgProp<string>(workshopRoot, 'epicshop.title')\n\tif (!title) {\n\t\tthrow new Error(\n\t\t\t`Workshop title not found. Make sure the root of the workshop has \"epicshop\" with a \"title\" property in the package.json. ${workshopRoot}`,\n\t\t)\n\t}\n\treturn title\n}\n\nexport async function getEpicWorkshopSlug() {\n\tconst epicWorkshopSlug = await getPkgProp<string>(\n\t\tworkshopRoot,\n\t\t'epicshop.epicWorkshopSlug',\n\t\t'',\n\t)\n\treturn epicWorkshopSlug || null\n}\n\nexport function getWorkshopRoot() {\n\treturn process.env.EPICSHOP_CONTEXT_CWD ?? process.cwd()\n}\n\nexport async function getWorkshopInstructions({\n\trequest,\n}: { request?: Request } = {}) {\n\tconst readmeFilepath = path.join(workshopRoot, 'exercises', 'README.mdx')\n\tconst compiled = await compileMdx(readmeFilepath, { request }).then(\n\t\tr => ({ ...r, status: 'success' }) as const,\n\t\te => {\n\t\t\tconsole.error(\n\t\t\t\t`There was an error compiling the workshop readme`,\n\t\t\t\treadmeFilepath,\n\t\t\t\te,\n\t\t\t)\n\t\t\treturn { status: 'error', error: getErrorMessage(e) } as const\n\t\t},\n\t)\n\treturn { compiled, file: readmeFilepath, relativePath: 'exercises' } as const\n}\n\nexport async function getWorkshopFinished({\n\trequest,\n}: { request?: Request } = {}) {\n\tconst finishedFilepath = path.join(workshopRoot, 'exercises', 'FINISHED.mdx')\n\tconst compiled = await compileMdx(finishedFilepath, { request }).then(\n\t\tr => ({ ...r, status: 'success' }) as const,\n\t\te => {\n\t\t\tconsole.error(\n\t\t\t\t`There was an error compiling the workshop finished.mdx`,\n\t\t\t\tfinishedFilepath,\n\t\t\t\te,\n\t\t\t)\n\t\t\treturn { status: 'error', error: getErrorMessage(e) } as const\n\t\t},\n\t)\n\treturn {\n\t\tcompiled,\n\t\tfile: finishedFilepath,\n\t\trelativePath: 'exercises/finished.mdx',\n\t} as const\n}\n\nconst exercisesPath = path.join(workshopRoot, 'exercises/')\nconst playgroundPath = path.join(workshopRoot, 'playground/')\nexport function getRelativePath(filePath: string) {\n\treturn path\n\t\t.normalize(filePath)\n\t\t.replace(playgroundPath, `playground${path.sep}`)\n\t\t.replace(exercisesPath, '')\n}\n"]}
1
+ {"version":3,"file":"apps.server.js","sourceRoot":"","sources":["../../src/apps.server.ts"],"names":[],"mappings":"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","sourcesContent":["/// TODO: figure out why this import is necessary (without it tsc seems to not honor the boolean reset 🤷‍♂️)\nimport '@total-typescript/ts-reset'\nimport fs from 'fs'\nimport path from 'path'\nimport { type CacheEntry } from '@epic-web/cachified'\nimport { remember } from '@epic-web/remember'\nimport { execa } from 'execa'\nimport fsExtra from 'fs-extra'\nimport { glob } from 'glob'\nimport { globby, isGitIgnored } from 'globby'\nimport { z } from 'zod'\nimport {\n\tappsCache,\n\tcachified,\n\texampleAppCache,\n\tplaygroundAppCache,\n\tproblemAppCache,\n\tsolutionAppCache,\n} from './cache.server.js'\nimport { getOptionalWatcher, getWatcher } from './change-tracker.server.js'\nimport { compileMdx } from './compile-mdx.server.js'\nimport {\n\tcloseProcess,\n\tisAppRunning,\n\trunAppDev,\n\twaitOnApp,\n} from './process-manager.server.js'\nimport { getServerTimeHeader, type Timings } from './timing.server.js'\nimport { getErrorMessage } from './utils.js'\nimport { getPkgProp } from './utils.server.js'\n\n// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\nprocess.env.NODE_ENV ??= 'development'\n\nconst workshopRoot = getWorkshopRoot()\n\nconst playgroundAppNameInfoPath = path.join(\n\tgetWorkshopRoot(),\n\t'node_modules',\n\t'.cache',\n\t'epicshop',\n\t'playground.json',\n)\n\ntype CachifiedOptions = { timings?: Timings; request?: Request }\n\nconst BaseAppSchema = z.object({\n\t/** a unique identifier for the app */\n\tname: z.string(),\n\t/** the title of the app used for display (comes from the package.json title prop) */\n\ttitle: z.string(),\n\t/** 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) */\n\tdirName: z.string(),\n\tfullPath: z.string(),\n\trelativePath: z.string(),\n\tinstructionsCode: z.string().optional(),\n\tepicVideoEmbeds: z.array(z.string()).optional(),\n\ttest: z.union([\n\t\tz.object({\n\t\t\ttype: z.literal('browser'),\n\t\t\tpathname: z.string(),\n\t\t\ttestFiles: z.array(z.string()),\n\t\t}),\n\t\tz.object({ type: z.literal('script'), script: z.string() }),\n\t\tz.object({ type: z.literal('none') }),\n\t]),\n\tdev: z.union([\n\t\tz.object({ type: z.literal('browser'), pathname: z.string() }),\n\t\tz.object({\n\t\t\ttype: z.literal('script'),\n\t\t\tportNumber: z.number(),\n\t\t\tinitialRoute: z.string(),\n\t\t}),\n\t\tz.object({ type: z.literal('none') }),\n\t]),\n})\n\nconst BaseExerciseStepAppSchema = BaseAppSchema.extend({\n\texerciseNumber: z.number(),\n\tstepNumber: z.number(),\n})\n\nconst ProblemAppSchema = BaseExerciseStepAppSchema.extend({\n\ttype: z.literal('problem'),\n\tsolutionName: z.string().nullable(),\n})\n\nconst SolutionAppSchema = BaseExerciseStepAppSchema.extend({\n\ttype: z.literal('solution'),\n\tproblemName: z.string().nullable(),\n})\n\nconst ExampleAppSchema = BaseAppSchema.extend({\n\ttype: z.literal('example'),\n})\n\nconst PlaygroundAppSchema = BaseAppSchema.extend({\n\ttype: z.literal('playground'),\n\tappName: z.string(),\n\tisUpToDate: z.boolean(),\n})\n\nconst ExerciseSchema = z.object({\n\t/** a unique identifier for the exercise */\n\texerciseNumber: z.number(),\n\t/** 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) */\n\tdirName: z.string(),\n\t/** the title of the app used for display (comes from the first h1 in the README) */\n\ttitle: z.string(),\n\tinstructionsCode: z.string().optional(),\n\tfinishedCode: z.string().optional(),\n\tinstructionsEpicVideoEmbeds: z.array(z.string()).optional(),\n\tfinishedEpicVideoEmbeds: z.array(z.string()).optional(),\n\tsteps: z.array(\n\t\tz.union([\n\t\t\tz.object({\n\t\t\t\tstepNumber: z.number(),\n\t\t\t\tproblem: ProblemAppSchema,\n\t\t\t\tsolution: SolutionAppSchema,\n\t\t\t}),\n\t\t\tz.object({\n\t\t\t\tstepNumber: z.number(),\n\t\t\t\tproblem: ProblemAppSchema,\n\t\t\t\tsolution: z.never().optional(),\n\t\t\t}),\n\t\t\tz.object({\n\t\t\t\tstepNumber: z.number(),\n\t\t\t\tproblem: z.never().optional(),\n\t\t\t\tsolution: SolutionAppSchema,\n\t\t\t}),\n\t\t]),\n\t),\n\tproblems: z.array(ProblemAppSchema),\n\tsolutions: z.array(SolutionAppSchema),\n})\n\nconst ExerciseStepAppSchema = z.union([ProblemAppSchema, SolutionAppSchema])\n\nconst AppSchema = z.union([\n\tExerciseStepAppSchema,\n\tPlaygroundAppSchema,\n\tExampleAppSchema,\n])\n\ntype BaseApp = z.infer<typeof BaseAppSchema>\n\nexport type BaseExerciseStepApp = z.infer<typeof BaseExerciseStepAppSchema>\nexport type ProblemApp = z.infer<typeof ProblemAppSchema>\nexport type SolutionApp = z.infer<typeof SolutionAppSchema>\nexport type ExampleApp = z.infer<typeof ExampleAppSchema>\nexport type PlaygroundApp = z.infer<typeof PlaygroundAppSchema>\nexport type ExerciseStepApp = z.infer<typeof ExerciseStepAppSchema>\nexport type App = z.infer<typeof AppSchema>\n\ntype Exercise = z.infer<typeof ExerciseSchema>\n\nexport function isApp(app: any): app is App {\n\treturn AppSchema.safeParse(app).success\n}\n\nexport function isProblemApp(app: any): app is ProblemApp {\n\treturn ProblemAppSchema.safeParse(app).success\n}\n\nexport function isSolutionApp(app: any): app is SolutionApp {\n\treturn SolutionAppSchema.safeParse(app).success\n}\n\nexport function isFirstStepProblemApp(\n\tapp: App,\n): app is ProblemApp & { stepNumber: 1 } {\n\treturn isProblemApp(app) && app.stepNumber === 1\n}\n\nexport function isFirstStepSolutionApp(\n\tapp: App,\n): app is SolutionApp & { stepNumber: 1 } {\n\treturn isSolutionApp(app) && app.stepNumber === 1\n}\n\nexport function isPlaygroundApp(app: any): app is PlaygroundApp {\n\treturn isApp(app) && app.type === 'playground'\n}\n\nexport function isExampleApp(app: any): app is ExampleApp {\n\treturn isApp(app) && app.type === 'example'\n}\n\nexport function isExerciseStepApp(app: any): app is ExerciseStepApp {\n\treturn isProblemApp(app) || isSolutionApp(app)\n}\n\nfunction exists(file: string) {\n\treturn fs.promises.access(file, fs.constants.F_OK).then(\n\t\t() => true,\n\t\t() => false,\n\t)\n}\n\nfunction firstToExist(...files: Array<string>) {\n\treturn Promise.all(files.map(exists)).then(results => {\n\t\tconst index = results.findIndex(Boolean)\n\t\treturn index === -1 ? null : files[index]\n\t})\n}\n\nexport const modifiedTimes = remember(\n\t'modified_times',\n\t() => new Map<string, number>(),\n)\n\nexport function init() {\n\tasync function handleFileChanges(\n\t\tevent: string,\n\t\tfilePath: string,\n\t): Promise<void> {\n\t\tconst apps = await getApps()\n\t\tfor (const app of apps) {\n\t\t\tif (filePath.startsWith(app.fullPath)) {\n\t\t\t\tmodifiedTimes.set(app.fullPath, Date.now())\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\tgetWatcher()?.on('all', handleFileChanges)\n}\n\nfunction getForceFresh(cacheEntry: CacheEntry | null | undefined) {\n\tif (!cacheEntry) return true\n\tconst latestModifiedTime = Math.max(...Array.from(modifiedTimes.values()))\n\tif (!latestModifiedTime) return undefined\n\treturn latestModifiedTime > cacheEntry.metadata.createdTime ? true : undefined\n}\n\nexport function setModifiedTimesForDir(dir: string) {\n\tmodifiedTimes.set(dir, Date.now())\n}\n\nexport function getForceFreshForDir(\n\tdir: string,\n\tcacheEntry: CacheEntry | null | undefined,\n) {\n\tif (!path.isAbsolute(dir)) {\n\t\tthrow new Error(`Trying to get force fresh for non-absolute path: ${dir}`)\n\t}\n\tif (!cacheEntry) return true\n\tconst modifiedTime = modifiedTimes.get(dir)\n\tif (!modifiedTime) return undefined\n\treturn modifiedTime > cacheEntry.metadata.createdTime ? true : undefined\n}\n\nasync function readDir(dir: string) {\n\tif (await exists(dir)) {\n\t\treturn fs.promises.readdir(dir)\n\t}\n\treturn []\n}\n\nasync function compileMdxIfExists(\n\tfilepath: string,\n\t{ request }: { request?: Request } = {},\n) {\n\tfilepath = filepath.replace(/\\\\/g, '/')\n\tif (await exists(filepath)) {\n\t\tconst compiled = await compileMdx(filepath, { request }).catch(error => {\n\t\t\tconsole.error(`Error compiling ${filepath}:`, error)\n\t\t\treturn null\n\t\t})\n\t\treturn compiled\n\t}\n\treturn null\n}\n\nfunction getAppDirInfo(appDir: string) {\n\tconst regex = /^(?<stepNumber>\\d+)\\.(problem|solution)(\\.(?<subtitle>.*))?$/\n\tconst match = regex.exec(appDir)\n\tif (!match?.groups) {\n\t\tconsole.info(\n\t\t\t`Ignoring directory \"${appDir}\" which does not match regex \"${regex}\"`,\n\t\t\tnew Error().stack,\n\t\t)\n\t\treturn null\n\t}\n\tconst { stepNumber: stepNumberString, subtitle } = match.groups\n\tconst stepNumber = Number(stepNumberString)\n\tif (!stepNumber || !Number.isFinite(stepNumber)) {\n\t\tthrow new Error(\n\t\t\t`Cannot identify the stepNumber for app directory \"${appDir}\" with regex \"${regex}\"`,\n\t\t)\n\t}\n\n\tconst type = match[2] as 'problem' | 'solution'\n\treturn { stepNumber, type, subtitle }\n}\n\nfunction extractExerciseNumber(dir: string) {\n\tconst regex = /^(?<number>\\d+)\\./\n\tconst number = regex.exec(dir)?.groups?.number\n\tif (!number) {\n\t\treturn null\n\t}\n\treturn Number(number)\n}\n\nexport async function getExercises({\n\ttimings,\n\trequest,\n}: CachifiedOptions = {}): Promise<Array<Exercise>> {\n\tconst apps = await getApps({ request, timings })\n\tconst exerciseDirs = await readDir(path.join(workshopRoot, 'exercises'))\n\tconst exercises: Array<Exercise> = []\n\tfor (const dirName of exerciseDirs) {\n\t\tconst exerciseNumber = extractExerciseNumber(dirName)\n\t\tif (!exerciseNumber) continue\n\t\tconst compiledReadme = await compileMdxIfExists(\n\t\t\tpath.join(workshopRoot, 'exercises', dirName, 'README.mdx'),\n\t\t\t{ request },\n\t\t)\n\t\tconst compiledFinished = await compileMdxIfExists(\n\t\t\tpath.join(workshopRoot, 'exercises', dirName, 'FINISHED.mdx'),\n\t\t\t{ request },\n\t\t)\n\t\tconst steps: Exercise['steps'] = []\n\t\tconst exerciseApps = apps\n\t\t\t.filter(isExerciseStepApp)\n\t\t\t.filter(app => app.exerciseNumber === exerciseNumber)\n\t\tfor (const app of exerciseApps) {\n\t\t\t// @ts-ignore meh 🤷‍♂️\n\t\t\tsteps[app.stepNumber - 1] = {\n\t\t\t\t...steps[app.stepNumber - 1],\n\t\t\t\t[app.type]: app,\n\t\t\t\tstepNumber: app.stepNumber,\n\t\t\t}\n\t\t}\n\t\texercises.push({\n\t\t\texerciseNumber,\n\t\t\tdirName,\n\t\t\tinstructionsCode: compiledReadme?.code,\n\t\t\tfinishedCode: compiledFinished?.code,\n\t\t\ttitle: compiledReadme?.title ?? dirName,\n\t\t\tinstructionsEpicVideoEmbeds: compiledReadme?.epicVideoEmbeds,\n\t\t\tfinishedEpicVideoEmbeds: compiledFinished?.epicVideoEmbeds,\n\t\t\tsteps,\n\t\t\tproblems: apps\n\t\t\t\t.filter(isProblemApp)\n\t\t\t\t.filter(app => app.exerciseNumber === exerciseNumber),\n\t\t\tsolutions: apps\n\t\t\t\t.filter(isSolutionApp)\n\t\t\t\t.filter(app => app.exerciseNumber === exerciseNumber),\n\t\t})\n\t}\n\treturn exercises\n}\n\nlet appCallCount = 0\n\nexport async function getApps({\n\ttimings,\n\trequest,\n\tforceFresh,\n}: CachifiedOptions & { forceFresh?: boolean } = {}): Promise<Array<App>> {\n\tconst key = 'apps'\n\tconst apps = await cachified({\n\t\tkey,\n\t\tcache: appsCache,\n\t\ttimings,\n\t\ttimingKey: `apps_${appCallCount++}`,\n\t\trequest,\n\t\t// This entire cache is to avoid a single request getting a fresh value\n\t\t// multiple times unnecessarily (because getApps is called many times)\n\t\tttl: 1000 * 60 * 60 * 24,\n\t\tforceFresh: forceFresh ?? getForceFresh(appsCache.get(key)),\n\t\tgetFreshValue: async () => {\n\t\t\tconst playgroundApp = await getPlaygroundApp({ request, timings })\n\t\t\tconst problemApps = await getProblemApps({ request, timings })\n\t\t\tconst solutionApps = await getSolutionApps({ request, timings })\n\t\t\tconst exampleApps = await getExampleApps({ request, timings })\n\t\t\tconst sortedApps = [\n\t\t\t\tplaygroundApp,\n\t\t\t\t...problemApps,\n\t\t\t\t...solutionApps,\n\t\t\t\t...exampleApps,\n\t\t\t]\n\t\t\t\t.filter(Boolean)\n\t\t\t\t.sort((a, b) => {\n\t\t\t\t\tif (isPlaygroundApp(a)) {\n\t\t\t\t\t\tif (isPlaygroundApp(b)) return a.name.localeCompare(b.name)\n\t\t\t\t\t\telse return 1\n\t\t\t\t\t}\n\t\t\t\t\tif (isPlaygroundApp(b)) return 1\n\n\t\t\t\t\tif (isExampleApp(a)) {\n\t\t\t\t\t\tif (isExampleApp(b)) return a.name.localeCompare(b.name)\n\t\t\t\t\t\telse return 1\n\t\t\t\t\t}\n\t\t\t\t\tif (isExampleApp(b)) return -1\n\n\t\t\t\t\tif (a.type === b.type) {\n\t\t\t\t\t\tif (a.exerciseNumber === b.exerciseNumber) {\n\t\t\t\t\t\t\treturn a.stepNumber - b.stepNumber\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn a.exerciseNumber - b.exerciseNumber\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// at this point, we know that a and b are different types...\n\t\t\t\t\tif (isProblemApp(a)) {\n\t\t\t\t\t\tif (a.exerciseNumber === b.exerciseNumber) {\n\t\t\t\t\t\t\treturn a.stepNumber <= b.stepNumber ? 1 : -1\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn a.exerciseNumber <= b.exerciseNumber ? 1 : -1\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (isSolutionApp(a)) {\n\t\t\t\t\t\tif (a.exerciseNumber === b.exerciseNumber) {\n\t\t\t\t\t\t\treturn a.stepNumber < b.stepNumber ? -1 : 1\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn a.exerciseNumber < b.exerciseNumber ? -1 : 1\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tconsole.error('unhandled sorting case', a, b)\n\t\t\t\t\treturn 0\n\t\t\t\t})\n\t\t\treturn sortedApps\n\t\t},\n\t})\n\treturn apps\n}\n\nconst AppIdInfoSchema = z.object({\n\texerciseNumber: z.string(),\n\tstepNumber: z.string(),\n\ttype: z.union([z.literal('problem'), z.literal('solution')]),\n})\n\n/**\n * Handles both full paths and app names\n *\n * @example\n * extractNumbersAndTypeFromAppNameOrPath('02.01.problem') // { exerciseNumber: '02', stepNumber: '01', type: 'problem' }\n * extractNumbersAndTypeFromAppNameOrPath('/path/to/exercises/02.desc/01.problem.desc') // { exerciseNumber: '02', stepNumber: '01', type: 'problem' }\n */\nexport function extractNumbersAndTypeFromAppNameOrPath(\n\tfullPathOrAppName: string,\n) {\n\tconst info: { exerciseNumber?: string; stepNumber?: string; type?: string } =\n\t\t{}\n\tif (fullPathOrAppName.includes(path.sep)) {\n\t\tconst relativePath = fullPathOrAppName.replace(\n\t\t\tpath.join(workshopRoot, 'exercises', path.sep),\n\t\t\t'',\n\t\t)\n\t\tconst [exerciseNumberPart, stepNumberPart] = relativePath.split(path.sep)\n\t\tif (!exerciseNumberPart || !stepNumberPart) return null\n\t\tconst exerciseNumber = exerciseNumberPart.split('.')[0]\n\t\tconst stepNumber = stepNumberPart.split('.')[0]\n\t\tconst type = stepNumberPart.split('.')[1]?.split('.')[0]\n\t\tinfo.exerciseNumber = exerciseNumber\n\t\tinfo.stepNumber = stepNumber\n\t\tinfo.type = type\n\t} else {\n\t\tconst [exerciseNumber, stepNumber, type] = fullPathOrAppName.split('.')\n\t\tinfo.exerciseNumber = exerciseNumber\n\t\tinfo.stepNumber = stepNumber\n\t\tinfo.type = type\n\t}\n\tconst result = AppIdInfoSchema.safeParse(info)\n\tif (result.success) return result.data\n\treturn null\n}\n\nasync function getProblemDirs() {\n\tconst exercisesDir = path.join(workshopRoot, 'exercises')\n\tconst problemDirs = (\n\t\tawait glob('**/*.problem*', {\n\t\t\tcwd: exercisesDir,\n\t\t\tignore: 'node_modules/**',\n\t\t})\n\t).map(p => path.join(exercisesDir, p))\n\treturn problemDirs\n}\n\nasync function getSolutionDirs() {\n\tconst exercisesDir = path.join(workshopRoot, 'exercises')\n\tconst solutionDirs = (\n\t\tawait glob('**/*.solution*', {\n\t\t\tcwd: exercisesDir,\n\t\t\tignore: 'node_modules/**',\n\t\t})\n\t).map(p => path.join(exercisesDir, p))\n\treturn solutionDirs\n}\n\n/**\n * This is the pathname for the app in the browser\n */\nfunction getPathname(fullPath: string) {\n\tconst appName = getAppName(fullPath)\n\treturn `/app/${appName}/`\n}\n\nfunction getAppName(fullPath: string) {\n\tif (/playground\\/?$/.test(fullPath)) return 'playground'\n\tif (/examples\\/.+\\/?$/.test(fullPath)) {\n\t\tconst restOfPath = fullPath.replace(\n\t\t\t`${getWorkshopRoot()}${path.sep}examples${path.sep}`,\n\t\t\t'',\n\t\t)\n\t\treturn `example.${restOfPath.split(path.sep).join('__sep__')}`\n\t}\n\tconst appIdInfo = extractNumbersAndTypeFromAppNameOrPath(fullPath)\n\tif (appIdInfo) {\n\t\tconst { exerciseNumber, stepNumber, type } = appIdInfo\n\t\treturn `${exerciseNumber}.${stepNumber}.${type}`\n\t} else {\n\t\tconst relativePath = fullPath.replace(`${workshopRoot}${path.sep}`, '')\n\t\treturn relativePath.split(path.sep).join('__sep__')\n\t}\n}\n\nasync function getFullPathFromAppName(appName: string) {\n\tif (appName === 'playground') return path.join(workshopRoot, 'playground')\n\tif (appName.startsWith('.example')) {\n\t\tconst relativePath = appName\n\t\t\t.replace('.example', '')\n\t\t\t.split('__sep__')\n\t\t\t.join(path.sep)\n\t\treturn path.join(workshopRoot, 'examples', relativePath)\n\t}\n\tif (appName.includes('__sep__')) {\n\t\tconst relativePath = appName.replaceAll('__sep__', path.sep)\n\t\treturn path.join(workshopRoot, relativePath)\n\t}\n\tconst [exerciseNumber, stepNumber, type] = appName.split('.')\n\tconst appDirs =\n\t\ttype === 'problem'\n\t\t\t? await getProblemDirs()\n\t\t\t: type === 'solution'\n\t\t\t\t? await getSolutionDirs()\n\t\t\t\t: []\n\tconst dir = appDirs.find(dir => {\n\t\tconst info = extractNumbersAndTypeFromAppNameOrPath(dir)\n\t\tif (!info) return false\n\t\treturn (\n\t\t\tinfo.exerciseNumber === exerciseNumber && info.stepNumber === stepNumber\n\t\t)\n\t})\n\treturn dir ?? appName\n}\n\nasync function findSolutionDir({\n\tfullPath,\n}: {\n\tfullPath: string\n}): Promise<string | null> {\n\tconst dirName = path.basename(fullPath)\n\tif (dirName.includes('.problem')) {\n\t\tconst info = getAppDirInfo(dirName)\n\t\tif (!info) return null\n\t\tconst { stepNumber } = info\n\t\tconst paddedStepNumber = stepNumber.toString().padStart(2, '0')\n\t\tconst parentDir = path.dirname(fullPath)\n\t\tconst siblingDirs = await fs.promises.readdir(parentDir)\n\t\tconst solutionDir = siblingDirs.find(dir =>\n\t\t\tdir.startsWith(`${paddedStepNumber}.solution`),\n\t\t)\n\t\tif (solutionDir) {\n\t\t\treturn path.join(parentDir, solutionDir)\n\t\t}\n\t} else if (fullPath.endsWith('playground')) {\n\t\tconst appName = await getPlaygroundAppName()\n\t\tif (appName) {\n\t\t\treturn findSolutionDir({\n\t\t\t\tfullPath: await getFullPathFromAppName(appName),\n\t\t\t})\n\t\t}\n\t}\n\treturn null\n}\n\nasync function findProblemDir({\n\tfullPath,\n}: {\n\tfullPath: string\n}): Promise<string | null> {\n\tconst dirName = path.basename(fullPath)\n\tif (dirName.includes('.solution')) {\n\t\tconst info = getAppDirInfo(dirName)\n\t\tif (!info) return null\n\t\tconst { stepNumber } = info\n\t\tconst paddedStepNumber = stepNumber.toString().padStart(2, '0')\n\t\tconst parentDir = path.dirname(fullPath)\n\t\tconst siblingDirs = await fs.promises.readdir(parentDir)\n\t\tconst problemDir = siblingDirs.find(\n\t\t\tdir => dir.endsWith('problem') && dir.includes(paddedStepNumber),\n\t\t)\n\t\tif (problemDir) {\n\t\t\treturn path.join(parentDir, problemDir)\n\t\t}\n\t} else if (fullPath.endsWith('playground')) {\n\t\tconst appName = await getPlaygroundAppName()\n\t\tif (appName) {\n\t\t\treturn findProblemDir({ fullPath: await getFullPathFromAppName(appName) })\n\t\t}\n\t}\n\treturn null\n}\n\nasync function getTestInfo({\n\tfullPath,\n}: {\n\tfullPath: string\n}): Promise<BaseApp['test']> {\n\tconst hasPkgJson = await exists(path.join(fullPath, 'package.json'))\n\tconst testScript = hasPkgJson\n\t\t? await getPkgProp(fullPath, 'epicshop.scripts.test', '')\n\t\t: null\n\n\tif (testScript) {\n\t\treturn { type: 'script', script: testScript }\n\t}\n\n\t// tests are found in the corresponding solution directory\n\tconst testAppFullPath = (await findSolutionDir({ fullPath })) ?? fullPath\n\n\tconst dirList = await fs.promises.readdir(testAppFullPath)\n\tconst testFiles = dirList.filter(item => item.includes('.test.'))\n\tif (testFiles.length) {\n\t\treturn {\n\t\t\ttype: 'browser',\n\t\t\tpathname: `${getPathname(fullPath)}test/`,\n\t\t\ttestFiles,\n\t\t}\n\t}\n\n\treturn { type: 'none' }\n}\n\nasync function getDevInfo({\n\tfullPath,\n\tportNumber,\n}: {\n\tfullPath: string\n\tportNumber: number\n}): Promise<BaseApp['dev']> {\n\tconst hasPkgJson = await exists(path.join(fullPath, 'package.json'))\n\tconst hasDevScript = hasPkgJson\n\t\t? Boolean(await getPkgProp(fullPath, 'scripts.dev', ''))\n\t\t: false\n\n\tif (hasDevScript) {\n\t\tconst initialRoute =\n\t\t\t(hasPkgJson\n\t\t\t\t? await getPkgProp(fullPath, 'epicshop.initialRoute', '')\n\t\t\t\t: '') || (await getPkgProp(workshopRoot, 'epicshop.initialRoute', '/'))\n\t\treturn { type: 'script', portNumber, initialRoute }\n\t}\n\tconst indexFiles = (await fsExtra.readdir(fullPath)).filter((file: string) =>\n\t\tfile.startsWith('index.'),\n\t)\n\tif (indexFiles.length) {\n\t\treturn { type: 'browser', pathname: getPathname(fullPath) }\n\t} else {\n\t\treturn { type: 'none' }\n\t}\n}\n\nexport async function getPlaygroundApp({\n\ttimings,\n\trequest,\n}: CachifiedOptions = {}): Promise<PlaygroundApp | null> {\n\tconst playgroundDir = path.join(workshopRoot, 'playground')\n\tconst baseAppName = await getPlaygroundAppName()\n\tconst key = `playground-${baseAppName}`\n\n\tconst baseAppFullPath = baseAppName\n\t\t? await getFullPathFromAppName(baseAppName)\n\t\t: null\n\tconst playgroundCacheEntry = playgroundAppCache.get(key)\n\tconst forceFreshPlaygroundDir =\n\t\tgetForceFreshForDir(playgroundDir, playgroundCacheEntry) ?? false\n\tconst forceFreshBaseApp = baseAppFullPath\n\t\t? getForceFreshForDir(baseAppFullPath, playgroundCacheEntry) ?? false\n\t\t: false\n\treturn cachified({\n\t\tkey,\n\t\tcache: playgroundAppCache,\n\t\tttl: 1000 * 60 * 60 * 24,\n\n\t\ttimings,\n\t\ttimingKey: playgroundDir.replace(`${playgroundDir}${path.sep}`, ''),\n\t\trequest,\n\t\tforceFresh: forceFreshPlaygroundDir || forceFreshBaseApp,\n\t\tgetFreshValue: async () => {\n\t\t\tif (!(await exists(playgroundDir))) return null\n\t\t\tif (!baseAppName) return null\n\n\t\t\tconst dirName = path.basename(playgroundDir)\n\t\t\tconst name = getAppName(playgroundDir)\n\t\t\tconst portNumber = 4000\n\t\t\tconst [compiledReadme, test, dev] = await Promise.all([\n\t\t\t\tcompileMdxIfExists(path.join(playgroundDir, 'README.mdx'), { request }),\n\t\t\t\tgetTestInfo({ fullPath: playgroundDir }),\n\t\t\t\tgetDevInfo({ fullPath: playgroundDir, portNumber }),\n\t\t\t])\n\n\t\t\tconst appModifiedTime = await getDirModifiedTime(\n\t\t\t\tawait getFullPathFromAppName(baseAppName),\n\t\t\t)\n\t\t\tconst playgroundAppModifiedTime = await getDirModifiedTime(playgroundDir)\n\n\t\t\treturn {\n\t\t\t\tname,\n\t\t\t\tappName: baseAppName,\n\t\t\t\ttype: 'playground',\n\t\t\t\tisUpToDate: appModifiedTime <= playgroundAppModifiedTime,\n\t\t\t\tfullPath: playgroundDir,\n\t\t\t\trelativePath: playgroundDir.replace(\n\t\t\t\t\t`${getWorkshopRoot()}${path.sep}`,\n\t\t\t\t\t'',\n\t\t\t\t),\n\t\t\t\ttitle: compiledReadme?.title ?? name,\n\t\t\t\tepicVideoEmbeds: compiledReadme?.epicVideoEmbeds,\n\t\t\t\tdirName,\n\t\t\t\tinstructionsCode: compiledReadme?.code,\n\t\t\t\ttest,\n\t\t\t\tdev,\n\t\t\t} as const\n\t\t},\n\t}).catch(error => {\n\t\tconsole.error(error)\n\t\treturn null\n\t})\n}\n\nasync function getExampleAppFromPath(\n\tfullPath: string,\n\tindex: number,\n\trequest?: Request,\n): Promise<ExampleApp> {\n\tconst dirName = path.basename(fullPath)\n\tconst compiledReadme = await compileMdxIfExists(\n\t\tpath.join(fullPath, 'README.mdx'),\n\t\t{ request },\n\t)\n\tconst name = getAppName(fullPath)\n\tconst portNumber = 8000 + index\n\treturn {\n\t\tname,\n\t\ttype: 'example',\n\t\tfullPath,\n\t\trelativePath: fullPath.replace(`${getWorkshopRoot()}${path.sep}`, ''),\n\t\ttitle: compiledReadme?.title ?? name,\n\t\tepicVideoEmbeds: compiledReadme?.epicVideoEmbeds,\n\t\tdirName,\n\t\tinstructionsCode: compiledReadme?.code,\n\t\ttest: await getTestInfo({ fullPath }),\n\t\tdev: await getDevInfo({ fullPath, portNumber }),\n\t}\n}\n\nasync function getExampleApps({\n\ttimings,\n\trequest,\n}: CachifiedOptions = {}): Promise<Array<ExampleApp>> {\n\tconst examplesDir = path.join(workshopRoot, 'examples')\n\tconst exampleDirs = (\n\t\tawait glob('*', { cwd: examplesDir, ignore: 'node_modules/**' })\n\t).map(p => path.join(examplesDir, p))\n\n\tconst exampleApps: Array<ExampleApp> = []\n\n\tfor (const exampleDir of exampleDirs) {\n\t\tconst index = exampleDirs.indexOf(exampleDir)\n\t\tconst key = `${exampleDir}-${index}`\n\t\tconst exampleApp = await cachified({\n\t\t\tkey,\n\t\t\tcache: exampleAppCache,\n\t\t\tttl: 1000 * 60 * 60 * 24,\n\n\t\t\ttimings,\n\t\t\ttimingKey: exampleDir.replace(`${examplesDir}${path.sep}`, ''),\n\t\t\trequest,\n\t\t\tforceFresh: getForceFreshForDir(exampleDir, exampleAppCache.get(key)),\n\t\t\tgetFreshValue: () =>\n\t\t\t\tgetExampleAppFromPath(exampleDir, index, request).catch(error => {\n\t\t\t\t\tconsole.error(error)\n\t\t\t\t\treturn null\n\t\t\t\t}),\n\t\t})\n\t\tif (exampleApp) exampleApps.push(exampleApp)\n\t}\n\n\treturn exampleApps\n}\n\nasync function getSolutionAppFromPath(\n\tfullPath: string,\n\trequest?: Request,\n): Promise<SolutionApp | null> {\n\tconst dirName = path.basename(fullPath)\n\tconst parentDirName = path.basename(path.dirname(fullPath))\n\tconst exerciseNumber = extractExerciseNumber(parentDirName)\n\tif (!exerciseNumber) return null\n\n\tconst name = getAppName(fullPath)\n\tconst info = getAppDirInfo(dirName)\n\tif (!info) return null\n\tconst { stepNumber } = info\n\tconst portNumber = 7000 + (exerciseNumber - 1) * 10 + stepNumber\n\tconst compiledReadme = await compileMdxIfExists(\n\t\tpath.join(fullPath, 'README.mdx'),\n\t\t{ request },\n\t)\n\tconst problemDir = await findProblemDir({\n\t\tfullPath,\n\t})\n\tconst problemName = problemDir ? getAppName(problemDir) : null\n\tconst [test, dev] = await Promise.all([\n\t\tgetTestInfo({ fullPath }),\n\t\tgetDevInfo({ fullPath, portNumber }),\n\t])\n\treturn {\n\t\tname,\n\t\ttitle: compiledReadme?.title ?? name,\n\t\tepicVideoEmbeds: compiledReadme?.epicVideoEmbeds,\n\t\ttype: 'solution',\n\t\tproblemName,\n\t\texerciseNumber,\n\t\tstepNumber,\n\t\tdirName,\n\t\tfullPath,\n\t\trelativePath: fullPath.replace(`${getWorkshopRoot()}${path.sep}`, ''),\n\t\tinstructionsCode: compiledReadme?.code,\n\t\ttest,\n\t\tdev,\n\t}\n}\n\nasync function getSolutionApps({\n\ttimings,\n\trequest,\n}: CachifiedOptions = {}): Promise<Array<SolutionApp>> {\n\tconst exercisesDir = path.join(workshopRoot, 'exercises')\n\tconst solutionDirs = await getSolutionDirs()\n\tconst solutionApps: Array<SolutionApp> = []\n\n\tfor (const solutionDir of solutionDirs) {\n\t\tconst solutionApp = await cachified({\n\t\t\tkey: solutionDir,\n\t\t\tcache: solutionAppCache,\n\t\t\ttimings,\n\t\t\ttimingKey: solutionDir.replace(`${exercisesDir}${path.sep}`, ''),\n\t\t\trequest,\n\t\t\tttl: 1000 * 60 * 60 * 24,\n\n\t\t\tforceFresh: getForceFreshForDir(\n\t\t\t\tsolutionDir,\n\t\t\t\tsolutionAppCache.get(solutionDir),\n\t\t\t),\n\t\t\tgetFreshValue: () =>\n\t\t\t\tgetSolutionAppFromPath(solutionDir, request).catch(error => {\n\t\t\t\t\tconsole.error(error)\n\t\t\t\t\treturn null\n\t\t\t\t}),\n\t\t})\n\t\tif (solutionApp) solutionApps.push(solutionApp)\n\t}\n\n\treturn solutionApps\n}\n\nasync function getProblemAppFromPath(\n\tfullPath: string,\n\trequest?: Request,\n): Promise<ProblemApp | null> {\n\tconst dirName = path.basename(fullPath)\n\tconst parentDirName = path.basename(path.dirname(fullPath))\n\tconst exerciseNumber = extractExerciseNumber(parentDirName)\n\tif (!exerciseNumber) return null\n\n\tconst name = getAppName(fullPath)\n\tconst info = getAppDirInfo(dirName)\n\tif (!info) return null\n\tconst { stepNumber } = info\n\tconst portNumber = 6000 + (exerciseNumber - 1) * 10 + stepNumber\n\tconst compiledReadme = await compileMdxIfExists(\n\t\tpath.join(fullPath, 'README.mdx'),\n\t\t{ request },\n\t)\n\tconst solutionDir = await findSolutionDir({\n\t\tfullPath,\n\t})\n\tconst solutionName = solutionDir ? getAppName(solutionDir) : null\n\tconst [test, dev] = await Promise.all([\n\t\tgetTestInfo({ fullPath }),\n\t\tgetDevInfo({ fullPath, portNumber }),\n\t])\n\treturn {\n\t\tsolutionName,\n\t\tname,\n\t\ttitle: compiledReadme?.title ?? name,\n\t\tepicVideoEmbeds: compiledReadme?.epicVideoEmbeds,\n\t\ttype: 'problem',\n\t\texerciseNumber,\n\t\tstepNumber,\n\t\tdirName,\n\t\tfullPath,\n\t\trelativePath: fullPath.replace(`${getWorkshopRoot()}${path.sep}`, ''),\n\t\tinstructionsCode: compiledReadme?.code,\n\t\ttest,\n\t\tdev,\n\t}\n}\n\nasync function getProblemApps({\n\ttimings,\n\trequest,\n}: CachifiedOptions = {}): Promise<Array<ProblemApp>> {\n\tconst exercisesDir = path.join(workshopRoot, 'exercises')\n\tconst problemDirs = await getProblemDirs()\n\tconst problemApps: Array<ProblemApp> = []\n\tfor (const problemDir of problemDirs) {\n\t\tconst problemApp = await cachified({\n\t\t\tkey: problemDir,\n\t\t\tcache: problemAppCache,\n\t\t\ttimings,\n\t\t\ttimingKey: problemDir.replace(`${exercisesDir}${path.sep}`, ''),\n\t\t\trequest,\n\t\t\tttl: 1000 * 60 * 60 * 24,\n\n\t\t\tforceFresh: getForceFreshForDir(\n\t\t\t\tproblemDir,\n\t\t\t\tproblemAppCache.get(problemDir),\n\t\t\t),\n\t\t\tgetFreshValue: () =>\n\t\t\t\tgetProblemAppFromPath(problemDir).catch(error => {\n\t\t\t\t\tconsole.error(error)\n\t\t\t\t\treturn null\n\t\t\t\t}),\n\t\t})\n\t\tif (problemApp) problemApps.push(problemApp)\n\t}\n\treturn problemApps\n}\n\nexport async function getExercise(\n\texerciseNumber: number | string,\n\t{ request, timings }: CachifiedOptions = {},\n) {\n\tconst exercises = await getExercises({ request, timings })\n\treturn exercises.find(s => s.exerciseNumber === Number(exerciseNumber))\n}\n\nexport async function requireExercise(\n\texerciseNumber: number | string,\n\t{ request, timings }: CachifiedOptions = {},\n) {\n\tconst exercise = await getExercise(exerciseNumber, { request, timings })\n\tif (!exercise) {\n\t\tthrow new Response('Not found', {\n\t\t\tstatus: 404,\n\t\t\theaders: { 'Server-Timing': getServerTimeHeader(timings) },\n\t\t})\n\t}\n\treturn exercise\n}\n\nexport async function requireExerciseApp(\n\tparams: Parameters<typeof getExerciseApp>[0],\n\t{ request, timings }: CachifiedOptions = {},\n) {\n\tconst app = await getExerciseApp(params, { request, timings })\n\tif (!app) {\n\t\tthrow new Response('Not found', { status: 404 })\n\t}\n\treturn app\n}\n\nconst ExerciseAppParamsSchema = z.object({\n\ttype: z.union([z.literal('problem'), z.literal('solution')]),\n\texerciseNumber: z.coerce.number().finite(),\n\tstepNumber: z.coerce.number().finite(),\n})\n\nexport async function getExerciseApp(\n\tparams: {\n\t\ttype?: string\n\t\texerciseNumber?: string\n\t\tstepNumber?: string\n\t},\n\t{ request, timings }: CachifiedOptions = {},\n) {\n\tconst result = ExerciseAppParamsSchema.safeParse(params)\n\tif (!result.success) {\n\t\treturn null\n\t}\n\tconst { type, exerciseNumber, stepNumber } = result.data\n\n\tconst apps = (await getApps({ request, timings })).filter(isExerciseStepApp)\n\tconst exerciseApp = apps.find(app => {\n\t\tif (isExampleApp(app)) return false\n\t\treturn (\n\t\t\tapp.exerciseNumber === exerciseNumber &&\n\t\t\tapp.stepNumber === stepNumber &&\n\t\t\tapp.type === type\n\t\t)\n\t})\n\tif (!exerciseApp) {\n\t\treturn null\n\t}\n\treturn exerciseApp\n}\n\nexport async function getAppByName(\n\tname: string,\n\t{ request, timings }: CachifiedOptions = {},\n) {\n\tconst apps = await getApps({ request, timings })\n\treturn apps.find(a => a.name === name)\n}\n\nexport async function getNextExerciseApp(\n\tapp: ExerciseStepApp,\n\t{ request, timings }: CachifiedOptions = {},\n) {\n\tconst apps = (await getApps({ request, timings })).filter(isExerciseStepApp)\n\tconst index = apps.findIndex(a => a.name === app.name)\n\tif (index === -1) {\n\t\tthrow new Error(`Could not find app ${app.name}`)\n\t}\n\tconst nextApp = apps[index + 1]\n\treturn nextApp ? nextApp : null\n}\n\nexport async function getPrevExerciseApp(\n\tapp: ExerciseStepApp,\n\t{ request, timings }: CachifiedOptions = {},\n) {\n\tconst apps = (await getApps({ request, timings })).filter(isExerciseStepApp)\n\n\tconst index = apps.findIndex(a => a.name === app.name)\n\tif (index === -1) {\n\t\tthrow new Error(`Could not find app ${app.name}`)\n\t}\n\tconst prevApp = apps[index - 1]\n\treturn prevApp ? prevApp : null\n}\n\nexport function getAppPageRoute(app: ExerciseStepApp) {\n\tconst exerciseNumber = app.exerciseNumber.toString().padStart(2, '0')\n\tconst stepNumber = app.stepNumber.toString().padStart(2, '0')\n\treturn `/${exerciseNumber}/${stepNumber}/${app.type}`\n}\n\n/**\n * Given a file path, this will find the app that file path belongs to.\n */\nexport async function getAppFromFile(filePath: string) {\n\tconst apps = await getApps()\n\treturn apps.find(app => filePath.startsWith(app.fullPath))\n}\n\nexport async function setPlayground(\n\tsrcDir: string,\n\t{ reset }: { reset?: boolean } = {},\n) {\n\tconst isIgnored = await isGitIgnored({ cwd: srcDir })\n\tconst workshopRoot = getWorkshopRoot()\n\tconst destDir = path.join(workshopRoot, 'playground')\n\tconst playgroundFiles = path.join(destDir, '**')\n\tgetOptionalWatcher()?.unwatch(playgroundFiles)\n\tconst playgroundApp = await getAppByName('playground')\n\tconst playgroundWasRunning = playgroundApp\n\t\t? isAppRunning(playgroundApp)\n\t\t: false\n\tif (playgroundApp && reset) {\n\t\tawait closeProcess(playgroundApp.name)\n\t\tawait fsExtra.remove(destDir)\n\t}\n\tconst setPlaygroundTimestamp = Date.now()\n\n\t// run prepare-playground script if it exists\n\tconst preSetPlaygroundPath = await firstToExist(\n\t\tpath.join(srcDir, 'epicshop', 'pre-set-playground.js'),\n\t\tpath.join(workshopRoot, 'epicshop', 'pre-set-playground.js'),\n\t)\n\tif (preSetPlaygroundPath) {\n\t\tawait execa('node', [preSetPlaygroundPath], {\n\t\t\tcwd: workshopRoot,\n\t\t\tstdio: 'inherit',\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n\t\t\tenv: {\n\t\t\t\tEPICSHOP_PLAYGROUND_TIMESTAMP: setPlaygroundTimestamp.toString(),\n\t\t\t\tEPICSHOP_PLAYGROUND_DEST_DIR: destDir,\n\t\t\t\tEPICSHOP_PLAYGROUND_SRC_DIR: srcDir,\n\t\t\t\tEPICSHOP_PLAYGROUND_WAS_RUNNING: playgroundWasRunning.toString(),\n\t\t\t} as any,\n\t\t})\n\t}\n\n\tconst basename = path.basename(srcDir)\n\t// If we don't delete the destination node_modules first then copying the new\n\t// node_modules has issues.\n\tawait fsExtra.remove(path.join(destDir, 'node_modules'))\n\t// Copy the contents of the source directory to the destination directory recursively\n\tawait fsExtra.copy(srcDir, destDir, {\n\t\tfilter: async (srcFile, destFile) => {\n\t\t\tif (\n\t\t\t\tsrcFile.includes(`${basename}${path.sep}build`) ||\n\t\t\t\tsrcFile.includes(`${basename}${path.sep}public${path.sep}build`)\n\t\t\t) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tif (srcFile === srcDir) return true\n\t\t\t// we copy node_modules even though it's .gitignored\n\t\t\tif (srcFile.includes('node_modules')) return true\n\t\t\t// make sure .env is copied whether it's .gitignored or not\n\t\t\tif (srcFile.endsWith('.env')) return true\n\t\t\tif (isIgnored(srcFile)) return false\n\n\t\t\ttry {\n\t\t\t\tconst isDir = (await fsExtra.stat(srcFile)).isDirectory()\n\t\t\t\tif (isDir) return true\n\t\t\t\tconst destIsDir = (await fsExtra.stat(destFile)).isDirectory()\n\t\t\t\t// weird, but ok\n\t\t\t\tif (destIsDir) return true\n\n\t\t\t\t// it's better to check if the contents are the same before copying\n\t\t\t\t// because it avoids unnecessary writes and reduces the impact on any\n\t\t\t\t// file watchers (like the remix dev server). In practice, it's definitely\n\t\t\t\t// slower, but it's better because it doesn't cause the dev server to\n\t\t\t\t// crash as often.\n\t\t\t\tconst currentContents = await fsExtra.readFile(destFile)\n\t\t\t\tconst newContents = await fsExtra.readFile(srcFile)\n\t\t\t\tif (currentContents.equals(newContents)) return false\n\n\t\t\t\treturn true\n\t\t\t} catch {\n\t\t\t\t// 🤷‍♂️ should probably copy it in this case\n\t\t\t\treturn true\n\t\t\t}\n\t\t},\n\t})\n\n\tasync function getFiles(dir: string) {\n\t\t// make globby friendly to windows\n\t\tconst dirPath = dir.replace(/\\\\/g, '/')\n\t\tconst files = await globby([`${dirPath}/**/*`, '!**/build/**/*'], {\n\t\t\tonlyFiles: false,\n\t\t\tdot: true,\n\t\t})\n\t\treturn files.map(f => f.replace(dirPath, ''))\n\t}\n\n\t// Remove files from destDir that were in destDir before but are not in srcDir\n\tconst srcFiles = await getFiles(srcDir)\n\tconst destFiles = await getFiles(destDir)\n\tconst filesToDelete = destFiles.filter(\n\t\tfileName => !srcFiles.includes(fileName),\n\t)\n\n\tfor (const fileToDelete of filesToDelete) {\n\t\tawait fsExtra.remove(path.join(destDir, fileToDelete))\n\t}\n\n\tconst appName = getAppName(srcDir)\n\tawait fsExtra.ensureDir(path.dirname(playgroundAppNameInfoPath))\n\tawait fsExtra.writeJSON(playgroundAppNameInfoPath, { appName })\n\n\tconst playgroundIsStillRunning = playgroundApp\n\t\t? isAppRunning(playgroundApp)\n\t\t: false\n\tconst restartPlayground = playgroundWasRunning && !playgroundIsStillRunning\n\n\t// run postSet-playground script if it exists\n\tconst postSetPlaygroundPath = await firstToExist(\n\t\tpath.join(srcDir, 'epicshop', 'post-set-playground.js'),\n\t\tpath.join(workshopRoot, 'epicshop', 'post-set-playground.js'),\n\t)\n\tif (postSetPlaygroundPath) {\n\t\tawait execa('node', [postSetPlaygroundPath], {\n\t\t\tcwd: workshopRoot,\n\t\t\tstdio: 'inherit',\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n\t\t\tenv: {\n\t\t\t\tEPICSHOP_PLAYGROUND_TIMESTAMP: setPlaygroundTimestamp.toString(),\n\t\t\t\tEPICSHOP_PLAYGROUND_SRC_DIR: srcDir,\n\t\t\t\tEPICSHOP_PLAYGROUND_DEST_DIR: destDir,\n\t\t\t\tEPICSHOP_PLAYGROUND_WAS_RUNNING: playgroundWasRunning.toString(),\n\t\t\t\tEPICSHOP_PLAYGROUND_IS_STILL_RUNNING:\n\t\t\t\t\tplaygroundIsStillRunning.toString(),\n\t\t\t\tEPICSHOP_PLAYGROUND_RESTART_PLAYGROUND: restartPlayground.toString(),\n\t\t\t} as any,\n\t\t})\n\t}\n\n\tif (playgroundApp && restartPlayground) {\n\t\tawait runAppDev(playgroundApp)\n\t\tawait waitOnApp(playgroundApp)\n\t}\n\n\tgetOptionalWatcher()?.add(playgroundFiles)\n\tmodifiedTimes.set(destDir, Date.now())\n}\n\n/**\n * The playground is based on another app. This returns the app the playground\n * is based on.\n */\nexport async function getPlaygroundAppName() {\n\tif (!(await exists(playgroundAppNameInfoPath))) {\n\t\treturn null\n\t}\n\ttry {\n\t\tconst jsonString = await fs.promises.readFile(\n\t\t\tplaygroundAppNameInfoPath,\n\t\t\t'utf8',\n\t\t)\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n\t\tconst { appName } = JSON.parse(jsonString) as any\n\t\tif (typeof appName !== 'string') return null\n\t\treturn appName\n\t} catch {\n\t\treturn null\n\t}\n}\n\nasync function getDirModifiedTime(dir: string): Promise<number> {\n\t// we can't use modifiedTimes because it only stores the modified times of\n\t// things the app started.\n\n\tconst isIgnored = await isGitIgnored({ cwd: dir })\n\tconst files = await fs.promises.readdir(dir, { withFileTypes: true })\n\n\tconst modifiedTimes = await Promise.all(\n\t\tfiles.map(async file => {\n\t\t\tif (isIgnored(file.name)) return 0\n\n\t\t\tconst filePath = path.join(dir, file.name)\n\t\t\tif (file.isDirectory()) {\n\t\t\t\treturn getDirModifiedTime(filePath)\n\t\t\t} else {\n\t\t\t\ttry {\n\t\t\t\t\tconst { mtimeMs } = await fs.promises.stat(filePath)\n\t\t\t\t\treturn mtimeMs\n\t\t\t\t} catch {\n\t\t\t\t\t// Handle errors (e.g., file access permissions, file has been moved or deleted)\n\t\t\t\t\treturn 0\n\t\t\t\t}\n\t\t\t}\n\t\t}),\n\t)\n\n\treturn Math.max(0, ...modifiedTimes) // Ensure there is a default of 0 if all files are ignored\n}\n\nexport function getAppDisplayName(a: App, allApps: Array<App>) {\n\tlet displayName = `${a.title} (${a.type})`\n\tif (isExerciseStepApp(a)) {\n\t\tconst typeLabel = { problem: '💪', solution: '🏁' }[a.type]\n\t\tdisplayName = `${a.exerciseNumber}.${a.stepNumber} ${a.title} (${typeLabel} ${a.type})`\n\t} else if (isPlaygroundApp(a)) {\n\t\tconst playgroundAppBasis = allApps.find(\n\t\t\totherApp => a.appName === otherApp.name,\n\t\t)\n\t\tif (playgroundAppBasis) {\n\t\t\tconst basisDisplayName = getAppDisplayName(playgroundAppBasis, allApps)\n\t\t\tdisplayName = `🛝 ${basisDisplayName}`\n\t\t} else {\n\t\t\tdisplayName = `🛝 ${a.appName}`\n\t\t}\n\t} else if (isExampleApp(a)) {\n\t\tdisplayName = `📚 ${a.title} (example)`\n\t}\n\treturn displayName\n}\n\nexport async function getWorkshopTitle() {\n\tconst title = await getPkgProp<string>(workshopRoot, 'epicshop.title')\n\tif (!title) {\n\t\tthrow new Error(\n\t\t\t`Workshop title not found. Make sure the root of the workshop has \"epicshop\" with a \"title\" property in the package.json. ${workshopRoot}`,\n\t\t)\n\t}\n\treturn title\n}\n\nexport async function getEpicWorkshopSlug() {\n\tconst epicWorkshopSlug = await getPkgProp<string>(\n\t\tworkshopRoot,\n\t\t'epicshop.epicWorkshopSlug',\n\t\t'',\n\t)\n\treturn epicWorkshopSlug || null\n}\n\nexport function getWorkshopRoot() {\n\treturn process.env.EPICSHOP_CONTEXT_CWD ?? process.cwd()\n}\n\nexport async function getWorkshopInstructions({\n\trequest,\n}: { request?: Request } = {}) {\n\tconst readmeFilepath = path.join(workshopRoot, 'exercises', 'README.mdx')\n\tconst compiled = await compileMdx(readmeFilepath, { request }).then(\n\t\tr => ({ ...r, status: 'success' }) as const,\n\t\te => {\n\t\t\tconsole.error(\n\t\t\t\t`There was an error compiling the workshop readme`,\n\t\t\t\treadmeFilepath,\n\t\t\t\te,\n\t\t\t)\n\t\t\treturn { status: 'error', error: getErrorMessage(e) } as const\n\t\t},\n\t)\n\treturn { compiled, file: readmeFilepath, relativePath: 'exercises' } as const\n}\n\nexport async function getWorkshopFinished({\n\trequest,\n}: { request?: Request } = {}) {\n\tconst finishedFilepath = path.join(workshopRoot, 'exercises', 'FINISHED.mdx')\n\tconst compiled = await compileMdx(finishedFilepath, { request }).then(\n\t\tr => ({ ...r, status: 'success' }) as const,\n\t\te => {\n\t\t\tconsole.error(\n\t\t\t\t`There was an error compiling the workshop finished.mdx`,\n\t\t\t\tfinishedFilepath,\n\t\t\t\te,\n\t\t\t)\n\t\t\treturn { status: 'error', error: getErrorMessage(e) } as const\n\t\t},\n\t)\n\treturn {\n\t\tcompiled,\n\t\tfile: finishedFilepath,\n\t\trelativePath: 'exercises/finished.mdx',\n\t} as const\n}\n\nconst exercisesPath = path.join(workshopRoot, 'exercises/')\nconst playgroundPath = path.join(workshopRoot, 'playground/')\nexport function getRelativePath(filePath: string) {\n\treturn path\n\t\t.normalize(filePath)\n\t\t.replace(playgroundPath, `playground${path.sep}`)\n\t\t.replace(exercisesPath, '')\n}\n"]}
@@ -328,6 +328,7 @@ export declare const playgroundAppCache: {
328
328
  type: "none";
329
329
  };
330
330
  appName: string;
331
+ isUpToDate: boolean;
331
332
  instructionsCode?: string | undefined;
332
333
  epicVideoEmbeds?: string[] | undefined;
333
334
  }>) => C.CacheEntry<{
@@ -358,6 +359,7 @@ export declare const playgroundAppCache: {
358
359
  type: "none";
359
360
  };
360
361
  appName: string;
362
+ isUpToDate: boolean;
361
363
  instructionsCode?: string | undefined;
362
364
  epicVideoEmbeds?: string[] | undefined;
363
365
  }>;
@@ -389,6 +391,7 @@ export declare const playgroundAppCache: {
389
391
  type: "none";
390
392
  };
391
393
  appName: string;
394
+ isUpToDate: boolean;
392
395
  instructionsCode?: string | undefined;
393
396
  epicVideoEmbeds?: string[] | undefined;
394
397
  }> | undefined;
@@ -517,6 +520,7 @@ export declare const appsCache: {
517
520
  type: "none";
518
521
  };
519
522
  appName: string;
523
+ isUpToDate: boolean;
520
524
  instructionsCode?: string | undefined;
521
525
  epicVideoEmbeds?: string[] | undefined;
522
526
  }>) => C.CacheEntry<{
@@ -640,6 +644,7 @@ export declare const appsCache: {
640
644
  type: "none";
641
645
  };
642
646
  appName: string;
647
+ isUpToDate: boolean;
643
648
  instructionsCode?: string | undefined;
644
649
  epicVideoEmbeds?: string[] | undefined;
645
650
  }>;
@@ -764,6 +769,7 @@ export declare const appsCache: {
764
769
  type: "none";
765
770
  };
766
771
  appName: string;
772
+ isUpToDate: boolean;
767
773
  instructionsCode?: string | undefined;
768
774
  epicVideoEmbeds?: string[] | undefined;
769
775
  }> | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"cache.server.d.ts","sourceRoot":"","sources":["../../src/cache.server.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,CAAC,MAAM,qBAAqB,CAAA;AACxC,OAAO,EAEN,KAAK,KAAK,IAAI,cAAc,EAE5B,MAAM,qBAAqB,CAAA;AAY5B,OAAO,EAA2B,KAAK,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAE1E,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CACuB,CAAA;AACpD,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAAoD,CAAA;AAChF,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAAoD,CAAA;AAChF,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CACyB,CAAA;AACxD,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAAuC,CAAA;AAC7D,eAAO,MAAM,aAAa;;;;;CAA8C,CAAA;AACxE,eAAO,MAAM,cAAc;;;;;CAA+C,CAAA;AAC1E,eAAO,MAAM,qBAAqB;;;;;CAEjC,CAAA;AACD,MAAM,MAAM,uBAAuB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;AAC9D,eAAO,MAAM,kBAAkB;;;;;CAER,CAAA;AACvB,eAAO,MAAM,iBAAiB;;;;;CAAkD,CAAA;AAIhF,eAAO,MAAM,OAAO,EAAE,cA4BrB,CAAA;AAED,wBAAsB,WAAW,8BAUhC;AAED,wBAAgB,kBAAkB,CAAC,cAAc,EAAE,IAAI,EAAE,MAAM;;;;;EAsB9D;AAED,wBAAsB,SAAS,CAAC,KAAK,EAAE,EACtC,OAAO,EACP,OAAO,EACP,GAAG,EAGH,SAA2E,EAC3E,GAAG,OAAO,EACV,EAAE,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC,KAAK,CAAC,EAAE,YAAY,CAAC,GAAG;IAClD,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,UAAU,CAAC,EAAE,OAAO,GAAG,MAAM,CAAA;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAA;CAClB,GAAG,OAAO,CAAC,KAAK,CAAC,CAgBjB;AAED,wBAAsB,gBAAgB,CAAC,EACtC,UAAU,EACV,OAAO,EACP,GAAG,GACH,EAAE;IACF,UAAU,CAAC,EAAE,OAAO,GAAG,MAAM,CAAA;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,GAAG,CAAC,EAAE,MAAM,CAAA;CACZ,oBAaA"}
1
+ {"version":3,"file":"cache.server.d.ts","sourceRoot":"","sources":["../../src/cache.server.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,CAAC,MAAM,qBAAqB,CAAA;AACxC,OAAO,EAEN,KAAK,KAAK,IAAI,cAAc,EAE5B,MAAM,qBAAqB,CAAA;AAY5B,OAAO,EAA2B,KAAK,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAE1E,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CACuB,CAAA;AACpD,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAAoD,CAAA;AAChF,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAAoD,CAAA;AAChF,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CACyB,CAAA;AACxD,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAAuC,CAAA;AAC7D,eAAO,MAAM,aAAa;;;;;CAA8C,CAAA;AACxE,eAAO,MAAM,cAAc;;;;;CAA+C,CAAA;AAC1E,eAAO,MAAM,qBAAqB;;;;;CAEjC,CAAA;AACD,MAAM,MAAM,uBAAuB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;AAC9D,eAAO,MAAM,kBAAkB;;;;;CAER,CAAA;AACvB,eAAO,MAAM,iBAAiB;;;;;CAAkD,CAAA;AAIhF,eAAO,MAAM,OAAO,EAAE,cA4BrB,CAAA;AAED,wBAAsB,WAAW,8BAUhC;AAED,wBAAgB,kBAAkB,CAAC,cAAc,EAAE,IAAI,EAAE,MAAM;;;;;EAsB9D;AAED,wBAAsB,SAAS,CAAC,KAAK,EAAE,EACtC,OAAO,EACP,OAAO,EACP,GAAG,EAGH,SAA2E,EAC3E,GAAG,OAAO,EACV,EAAE,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC,KAAK,CAAC,EAAE,YAAY,CAAC,GAAG;IAClD,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,UAAU,CAAC,EAAE,OAAO,GAAG,MAAM,CAAA;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAA;CAClB,GAAG,OAAO,CAAC,KAAK,CAAC,CAgBjB;AAED,wBAAsB,gBAAgB,CAAC,EACtC,UAAU,EACV,OAAO,EACP,GAAG,GACH,EAAE;IACF,UAAU,CAAC,EAAE,OAAO,GAAG,MAAM,CAAA;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,GAAG,CAAC,EAAE,MAAM,CAAA;CACZ,oBAaA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@epic-web/workshop-utils",
3
- "version": "4.1.1",
3
+ "version": "4.2.1",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },