@epic-web/workshop-utils 4.6.0 → 4.6.2

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.
@@ -133,7 +133,7 @@ function exists(file) {
133
133
  return fs.promises.access(file, fs.constants.F_OK).then(() => true, () => false);
134
134
  }
135
135
  function firstToExist(...files) {
136
- return Promise.all(files.map(exists)).then(results => {
136
+ return Promise.all(files.map(exists)).then((results) => {
137
137
  const index = results.findIndex(Boolean);
138
138
  return index === -1 ? null : files[index];
139
139
  });
@@ -182,7 +182,7 @@ async function readDir(dir) {
182
182
  async function compileMdxIfExists(filepath, { request } = {}) {
183
183
  filepath = filepath.replace(/\\/g, '/');
184
184
  if (await exists(filepath)) {
185
- const compiled = await compileMdx(filepath, { request }).catch(error => {
185
+ const compiled = await compileMdx(filepath, { request }).catch((error) => {
186
186
  console.error(`Error compiling ${filepath}:`, error);
187
187
  return null;
188
188
  });
@@ -226,7 +226,7 @@ export async function getExercises({ timings, request, } = {}) {
226
226
  const steps = [];
227
227
  const exerciseApps = apps
228
228
  .filter(isExerciseStepApp)
229
- .filter(app => app.exerciseNumber === exerciseNumber);
229
+ .filter((app) => app.exerciseNumber === exerciseNumber);
230
230
  for (const app of exerciseApps) {
231
231
  // @ts-ignore meh šŸ¤·ā€ā™‚ļø
232
232
  steps[app.stepNumber - 1] = {
@@ -246,10 +246,10 @@ export async function getExercises({ timings, request, } = {}) {
246
246
  steps,
247
247
  problems: apps
248
248
  .filter(isProblemApp)
249
- .filter(app => app.exerciseNumber === exerciseNumber),
249
+ .filter((app) => app.exerciseNumber === exerciseNumber),
250
250
  solutions: apps
251
251
  .filter(isSolutionApp)
252
- .filter(app => app.exerciseNumber === exerciseNumber),
252
+ .filter((app) => app.exerciseNumber === exerciseNumber),
253
253
  });
254
254
  }
255
255
  return exercises;
@@ -371,7 +371,7 @@ async function getProblemDirs() {
371
371
  const problemDirs = (await glob('**/*.problem*', {
372
372
  cwd: exercisesDir,
373
373
  ignore: 'node_modules/**',
374
- })).map(p => path.join(exercisesDir, p));
374
+ })).map((p) => path.join(exercisesDir, p));
375
375
  return problemDirs;
376
376
  }
377
377
  async function getSolutionDirs() {
@@ -379,7 +379,7 @@ async function getSolutionDirs() {
379
379
  const solutionDirs = (await glob('**/*.solution*', {
380
380
  cwd: exercisesDir,
381
381
  ignore: 'node_modules/**',
382
- })).map(p => path.join(exercisesDir, p));
382
+ })).map((p) => path.join(exercisesDir, p));
383
383
  return solutionDirs;
384
384
  }
385
385
  /**
@@ -426,7 +426,7 @@ async function getFullPathFromAppName(appName) {
426
426
  : type === 'solution'
427
427
  ? await getSolutionDirs()
428
428
  : [];
429
- const dir = appDirs.find(dir => {
429
+ const dir = appDirs.find((dir) => {
430
430
  const info = extractNumbersAndTypeFromAppNameOrPath(dir);
431
431
  if (!info)
432
432
  return false;
@@ -444,7 +444,7 @@ async function findSolutionDir({ fullPath, }) {
444
444
  const paddedStepNumber = stepNumber.toString().padStart(2, '0');
445
445
  const parentDir = path.dirname(fullPath);
446
446
  const siblingDirs = await fs.promises.readdir(parentDir);
447
- const solutionDir = siblingDirs.find(dir => dir.startsWith(`${paddedStepNumber}.solution`));
447
+ const solutionDir = siblingDirs.find((dir) => dir.startsWith(`${paddedStepNumber}.solution`));
448
448
  if (solutionDir) {
449
449
  return path.join(parentDir, solutionDir);
450
450
  }
@@ -469,7 +469,7 @@ async function findProblemDir({ fullPath, }) {
469
469
  const paddedStepNumber = stepNumber.toString().padStart(2, '0');
470
470
  const parentDir = path.dirname(fullPath);
471
471
  const siblingDirs = await fs.promises.readdir(parentDir);
472
- const problemDir = siblingDirs.find(dir => dir.endsWith('problem') && dir.includes(paddedStepNumber));
472
+ const problemDir = siblingDirs.find((dir) => dir.endsWith('problem') && dir.includes(paddedStepNumber));
473
473
  if (problemDir) {
474
474
  return path.join(parentDir, problemDir);
475
475
  }
@@ -493,7 +493,7 @@ async function getTestInfo({ fullPath, }) {
493
493
  // tests are found in the corresponding solution directory
494
494
  const testAppFullPath = (await findSolutionDir({ fullPath })) ?? fullPath;
495
495
  const dirList = await fs.promises.readdir(testAppFullPath);
496
- const testFiles = dirList.filter(item => item.includes('.test.'));
496
+ const testFiles = dirList.filter((item) => item.includes('.test.'));
497
497
  if (testFiles.length) {
498
498
  return {
499
499
  type: 'browser',
@@ -572,7 +572,7 @@ export async function getPlaygroundApp({ timings, request, } = {}) {
572
572
  dev,
573
573
  };
574
574
  },
575
- }).catch(error => {
575
+ }).catch((error) => {
576
576
  console.error(error);
577
577
  return null;
578
578
  });
@@ -597,7 +597,7 @@ async function getExampleAppFromPath(fullPath, index, request) {
597
597
  }
598
598
  async function getExampleApps({ timings, request, } = {}) {
599
599
  const examplesDir = path.join(workshopRoot, 'examples');
600
- const exampleDirs = (await glob('*', { cwd: examplesDir, ignore: 'node_modules/**' })).map(p => path.join(examplesDir, p));
600
+ const exampleDirs = (await glob('*', { cwd: examplesDir, ignore: 'node_modules/**' })).map((p) => path.join(examplesDir, p));
601
601
  const exampleApps = [];
602
602
  for (const exampleDir of exampleDirs) {
603
603
  const index = exampleDirs.indexOf(exampleDir);
@@ -610,7 +610,7 @@ async function getExampleApps({ timings, request, } = {}) {
610
610
  timingKey: exampleDir.replace(`${examplesDir}${path.sep}`, ''),
611
611
  request,
612
612
  forceFresh: getForceFreshForDir(exampleDir, exampleAppCache.get(key)),
613
- getFreshValue: () => getExampleAppFromPath(exampleDir, index, request).catch(error => {
613
+ getFreshValue: () => getExampleAppFromPath(exampleDir, index, request).catch((error) => {
614
614
  console.error(error);
615
615
  return null;
616
616
  }),
@@ -670,7 +670,7 @@ async function getSolutionApps({ timings, request, } = {}) {
670
670
  request,
671
671
  ttl: 1000 * 60 * 60 * 24,
672
672
  forceFresh: getForceFreshForDir(solutionDir, solutionAppCache.get(solutionDir)),
673
- getFreshValue: () => getSolutionAppFromPath(solutionDir, request).catch(error => {
673
+ getFreshValue: () => getSolutionAppFromPath(solutionDir, request).catch((error) => {
674
674
  console.error(error);
675
675
  return null;
676
676
  }),
@@ -730,7 +730,7 @@ async function getProblemApps({ timings, request, } = {}) {
730
730
  request,
731
731
  ttl: 1000 * 60 * 60 * 24,
732
732
  forceFresh: getForceFreshForDir(problemDir, problemAppCache.get(problemDir)),
733
- getFreshValue: () => getProblemAppFromPath(problemDir).catch(error => {
733
+ getFreshValue: () => getProblemAppFromPath(problemDir).catch((error) => {
734
734
  console.error(error);
735
735
  return null;
736
736
  }),
@@ -742,7 +742,7 @@ async function getProblemApps({ timings, request, } = {}) {
742
742
  }
743
743
  export async function getExercise(exerciseNumber, { request, timings } = {}) {
744
744
  const exercises = await getExercises({ request, timings });
745
- return exercises.find(s => s.exerciseNumber === Number(exerciseNumber));
745
+ return exercises.find((s) => s.exerciseNumber === Number(exerciseNumber));
746
746
  }
747
747
  export async function requireExercise(exerciseNumber, { request, timings } = {}) {
748
748
  const exercise = await getExercise(exerciseNumber, { request, timings });
@@ -773,7 +773,7 @@ export async function getExerciseApp(params, { request, timings } = {}) {
773
773
  }
774
774
  const { type, exerciseNumber, stepNumber } = result.data;
775
775
  const apps = (await getApps({ request, timings })).filter(isExerciseStepApp);
776
- const exerciseApp = apps.find(app => {
776
+ const exerciseApp = apps.find((app) => {
777
777
  if (isExampleApp(app))
778
778
  return false;
779
779
  return (app.exerciseNumber === exerciseNumber &&
@@ -787,11 +787,11 @@ export async function getExerciseApp(params, { request, timings } = {}) {
787
787
  }
788
788
  export async function getAppByName(name, { request, timings } = {}) {
789
789
  const apps = await getApps({ request, timings });
790
- return apps.find(a => a.name === name);
790
+ return apps.find((a) => a.name === name);
791
791
  }
792
792
  export async function getNextExerciseApp(app, { request, timings } = {}) {
793
793
  const apps = (await getApps({ request, timings })).filter(isExerciseStepApp);
794
- const index = apps.findIndex(a => a.name === app.name);
794
+ const index = apps.findIndex((a) => a.name === app.name);
795
795
  if (index === -1) {
796
796
  throw new Error(`Could not find app ${app.name}`);
797
797
  }
@@ -800,7 +800,7 @@ export async function getNextExerciseApp(app, { request, timings } = {}) {
800
800
  }
801
801
  export async function getPrevExerciseApp(app, { request, timings } = {}) {
802
802
  const apps = (await getApps({ request, timings })).filter(isExerciseStepApp);
803
- const index = apps.findIndex(a => a.name === app.name);
803
+ const index = apps.findIndex((a) => a.name === app.name);
804
804
  if (index === -1) {
805
805
  throw new Error(`Could not find app ${app.name}`);
806
806
  }
@@ -817,7 +817,7 @@ export function getAppPageRoute(app) {
817
817
  */
818
818
  export async function getAppFromFile(filePath) {
819
819
  const apps = await getApps();
820
- return apps.find(app => filePath.startsWith(app.fullPath));
820
+ return apps.find((app) => filePath.startsWith(app.fullPath));
821
821
  }
822
822
  export async function setPlayground(srcDir, { reset } = {}) {
823
823
  const isIgnored = await isGitIgnored({ cwd: srcDir });
@@ -901,12 +901,12 @@ export async function setPlayground(srcDir, { reset } = {}) {
901
901
  onlyFiles: false,
902
902
  dot: true,
903
903
  });
904
- return files.map(f => f.replace(dirPath, ''));
904
+ return files.map((f) => f.replace(dirPath, ''));
905
905
  }
906
906
  // Remove files from destDir that were in destDir before but are not in srcDir
907
907
  const srcFiles = await getFiles(srcDir);
908
908
  const destFiles = await getFiles(destDir);
909
- const filesToDelete = destFiles.filter(fileName => !srcFiles.includes(fileName));
909
+ const filesToDelete = destFiles.filter((fileName) => !srcFiles.includes(fileName));
910
910
  for (const fileToDelete of filesToDelete) {
911
911
  await fsExtra.remove(path.join(destDir, fileToDelete));
912
912
  }
@@ -991,7 +991,7 @@ export function getAppDisplayName(a, allApps) {
991
991
  displayName = `${a.exerciseNumber}.${a.stepNumber} ${a.title} (${typeLabel} ${a.type})`;
992
992
  }
993
993
  else if (isPlaygroundApp(a)) {
994
- const playgroundAppBasis = allApps.find(otherApp => a.appName === otherApp.name);
994
+ const playgroundAppBasis = allApps.find((otherApp) => a.appName === otherApp.name);
995
995
  if (playgroundAppBasis) {
996
996
  const basisDisplayName = getAppDisplayName(playgroundAppBasis, allApps);
997
997
  displayName = `šŸ› ${basisDisplayName}`;
@@ -1013,7 +1013,7 @@ export async function getWorkshopTitle() {
1013
1013
  return title;
1014
1014
  }
1015
1015
  export async function getWorkshopSubtitle() {
1016
- return await getPkgProp(workshopRoot, 'epicshop.subtitle');
1016
+ return await getPkgProp(workshopRoot, 'epicshop.subtitle', '');
1017
1017
  }
1018
1018
  export async function getWorkshopInstructor() {
1019
1019
  const InstructorSchema = z
@@ -1035,7 +1035,7 @@ export function getWorkshopRoot() {
1035
1035
  }
1036
1036
  export async function getWorkshopInstructions({ request, } = {}) {
1037
1037
  const readmeFilepath = path.join(workshopRoot, 'exercises', 'README.mdx');
1038
- const compiled = await compileMdx(readmeFilepath, { request }).then(r => ({ ...r, status: 'success' }), e => {
1038
+ const compiled = await compileMdx(readmeFilepath, { request }).then((r) => ({ ...r, status: 'success' }), (e) => {
1039
1039
  console.error(`There was an error compiling the workshop readme`, readmeFilepath, e);
1040
1040
  return { status: 'error', error: getErrorMessage(e) };
1041
1041
  });
@@ -1043,7 +1043,7 @@ export async function getWorkshopInstructions({ request, } = {}) {
1043
1043
  }
1044
1044
  export async function getWorkshopFinished({ request, } = {}) {
1045
1045
  const finishedFilepath = path.join(workshopRoot, 'exercises', 'FINISHED.mdx');
1046
- const compiled = await compileMdx(finishedFilepath, { request }).then(r => ({ ...r, status: 'success' }), e => {
1046
+ const compiled = await compileMdx(finishedFilepath, { request }).then((r) => ({ ...r, status: 'success' }), (e) => {
1047
1047
  console.error(`There was an error compiling the workshop finished.mdx`, finishedFilepath, e);
1048
1048
  return { status: 'error', error: getErrorMessage(e) };
1049
1049
  });
@@ -1 +1 @@
1
- {"version":3,"file":"apps.server.js","sourceRoot":"","sources":["../../src/apps.server.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from 'node:fs'\nimport path from 'node:path'\nimport { type CacheEntry } from '@epic-web/cachified'\nimport { remember } from '@epic-web/remember'\n/// TODO: figure out why this import is necessary (without it tsc seems to not honor the boolean reset šŸ¤·ā€ā™‚ļø)\nimport '@total-typescript/ts-reset'\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\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\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\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\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 getWorkshopSubtitle() {\n\treturn await getPkgProp<string>(workshopRoot, 'epicshop.subtitle')\n}\n\nexport async function getWorkshopInstructor() {\n\tconst InstructorSchema = z\n\t\t.object({\n\t\t\tname: z.string().optional(),\n\t\t\tavatar: z.string().optional(),\n\t\t\tš•: z.string().optional(),\n\t\t})\n\t\t.optional()\n\n\tconst instructor = InstructorSchema.parse(\n\t\tawait getPkgProp(getWorkshopRoot(), 'epicshop.instructor'),\n\t)\n\treturn instructor\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":["import fs from 'node:fs'\nimport path from 'node:path'\nimport { type CacheEntry } from '@epic-web/cachified'\nimport { remember } from '@epic-web/remember'\n/// TODO: figure out why this import is necessary (without it tsc seems to not honor the boolean reset šŸ¤·ā€ā™‚ļø)\nimport '@total-typescript/ts-reset'\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\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\t(dir) => 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\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\t(fileName) => !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\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\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\t(otherApp) => 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 getWorkshopSubtitle() {\n\treturn await getPkgProp<string>(workshopRoot, 'epicshop.subtitle', '')\n}\n\nexport async function getWorkshopInstructor() {\n\tconst InstructorSchema = z\n\t\t.object({\n\t\t\tname: z.string().optional(),\n\t\t\tavatar: z.string().optional(),\n\t\t\tš•: z.string().optional(),\n\t\t})\n\t\t.optional()\n\n\tconst instructor = InstructorSchema.parse(\n\t\tawait getPkgProp(getWorkshopRoot(), 'epicshop.instructor'),\n\t)\n\treturn instructor\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\t(r) => ({ ...r, status: 'success' }) as const,\n\t\t(e) => {\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\t(r) => ({ ...r, status: 'success' }) as const,\n\t\t(e) => {\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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@epic-web/workshop-utils",
3
- "version": "4.6.0",
3
+ "version": "4.6.2",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },