@epic-web/workshop-utils 5.0.0 → 5.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/apps.server.d.ts.map +1 -1
- package/dist/esm/apps.server.js +126 -124
- package/dist/esm/apps.server.js.map +1 -1
- package/dist/esm/change-tracker.server.d.ts +3 -2
- package/dist/esm/change-tracker.server.d.ts.map +1 -1
- package/dist/esm/change-tracker.server.js +60 -12
- package/dist/esm/change-tracker.server.js.map +1 -1
- package/dist/esm/compile-mdx.server.d.ts.map +1 -1
- package/dist/esm/compile-mdx.server.js +1 -4
- package/dist/esm/compile-mdx.server.js.map +1 -1
- package/dist/esm/config.server.d.ts +9 -9
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apps.server.d.ts","sourceRoot":"","sources":["../../src/apps.server.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"apps.server.d.ts","sourceRoot":"","sources":["../../src/apps.server.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/apps.server.js
CHANGED
|
@@ -9,7 +9,7 @@ import { glob } from 'glob';
|
|
|
9
9
|
import { globby, isGitIgnored } from 'globby';
|
|
10
10
|
import { z } from 'zod';
|
|
11
11
|
import { appsCache, cachified, exampleAppCache, playgroundAppCache, problemAppCache, solutionAppCache, } from './cache.server.js';
|
|
12
|
-
import {
|
|
12
|
+
import { getWatcher, withoutWatcher } from './change-tracker.server.js';
|
|
13
13
|
import { compileMdx } from './compile-mdx.server.js';
|
|
14
14
|
import { bustWorkshopConfigCache, getAppConfig, getStackBlitzUrl, getWorkshopConfig, } from './config.server.js';
|
|
15
15
|
import { getEnv, init as initEnv } from './env.server.js';
|
|
@@ -150,19 +150,19 @@ export function init() {
|
|
|
150
150
|
process.env.EPICSHOP_GITHUB_ROOT = config.githubRoot;
|
|
151
151
|
initEnv();
|
|
152
152
|
global.ENV = getEnv();
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
153
|
+
getWatcher()?.on('all', handleFileChanges);
|
|
154
|
+
}
|
|
155
|
+
async function handleFileChanges(event, filePath) {
|
|
156
|
+
if (filePath === path.join(workshopRoot, 'package.json')) {
|
|
157
|
+
bustWorkshopConfigCache();
|
|
158
|
+
}
|
|
159
|
+
const apps = await getApps();
|
|
160
|
+
for (const app of apps) {
|
|
161
|
+
if (filePath.startsWith(app.fullPath)) {
|
|
162
|
+
modifiedTimes.set(app.fullPath, Date.now());
|
|
163
|
+
break;
|
|
163
164
|
}
|
|
164
165
|
}
|
|
165
|
-
getWatcher()?.on('all', handleFileChanges);
|
|
166
166
|
}
|
|
167
167
|
function getForceFresh(cacheEntry) {
|
|
168
168
|
if (!cacheEntry)
|
|
@@ -867,124 +867,126 @@ export async function getAppFromFile(filePath) {
|
|
|
867
867
|
return apps.find((app) => filePath.startsWith(app.fullPath));
|
|
868
868
|
}
|
|
869
869
|
export async function setPlayground(srcDir, { reset } = {}) {
|
|
870
|
-
const isIgnored = await isGitIgnored({ cwd: srcDir });
|
|
871
870
|
const destDir = path.join(workshopRoot, 'playground');
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
return true;
|
|
910
|
-
// we copy node_modules even though it's .gitignored
|
|
911
|
-
if (srcFile.includes('node_modules'))
|
|
912
|
-
return true;
|
|
913
|
-
// make sure .env is copied whether it's .gitignored or not
|
|
914
|
-
if (srcFile.endsWith('.env'))
|
|
915
|
-
return true;
|
|
916
|
-
if (isIgnored(srcFile))
|
|
917
|
-
return false;
|
|
918
|
-
try {
|
|
919
|
-
const isDir = (await fsExtra.stat(srcFile)).isDirectory();
|
|
920
|
-
if (isDir)
|
|
871
|
+
await withoutWatcher(async () => {
|
|
872
|
+
const isIgnored = await isGitIgnored({ cwd: srcDir });
|
|
873
|
+
const playgroundApp = await getAppByName('playground');
|
|
874
|
+
const playgroundWasRunning = playgroundApp
|
|
875
|
+
? isAppRunning(playgroundApp)
|
|
876
|
+
: false;
|
|
877
|
+
if (playgroundApp && reset) {
|
|
878
|
+
await closeProcess(playgroundApp.name);
|
|
879
|
+
await fsExtra.remove(destDir);
|
|
880
|
+
}
|
|
881
|
+
const setPlaygroundTimestamp = Date.now();
|
|
882
|
+
// run prepare-playground script if it exists
|
|
883
|
+
const preSetPlaygroundPath = await firstToExist(path.join(srcDir, 'epicshop', 'pre-set-playground.js'), path.join(workshopRoot, 'epicshop', 'pre-set-playground.js'));
|
|
884
|
+
if (preSetPlaygroundPath) {
|
|
885
|
+
await execa('node', [preSetPlaygroundPath], {
|
|
886
|
+
cwd: workshopRoot,
|
|
887
|
+
stdio: 'inherit',
|
|
888
|
+
env: {
|
|
889
|
+
EPICSHOP_PLAYGROUND_TIMESTAMP: setPlaygroundTimestamp.toString(),
|
|
890
|
+
EPICSHOP_PLAYGROUND_DEST_DIR: destDir,
|
|
891
|
+
EPICSHOP_PLAYGROUND_SRC_DIR: srcDir,
|
|
892
|
+
EPICSHOP_PLAYGROUND_WAS_RUNNING: playgroundWasRunning.toString(),
|
|
893
|
+
},
|
|
894
|
+
});
|
|
895
|
+
}
|
|
896
|
+
const basename = path.basename(srcDir);
|
|
897
|
+
// If we don't delete the destination node_modules first then copying the new
|
|
898
|
+
// node_modules has issues.
|
|
899
|
+
await fsExtra.remove(path.join(destDir, 'node_modules'));
|
|
900
|
+
// Copy the contents of the source directory to the destination directory recursively
|
|
901
|
+
await fsExtra.copy(srcDir, destDir, {
|
|
902
|
+
filter: async (srcFile, destFile) => {
|
|
903
|
+
if (srcFile.includes(`${basename}${path.sep}build`) ||
|
|
904
|
+
srcFile.includes(`${basename}${path.sep}public${path.sep}build`)) {
|
|
905
|
+
return false;
|
|
906
|
+
}
|
|
907
|
+
if (srcFile === srcDir)
|
|
921
908
|
return true;
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
if (destIsDir)
|
|
909
|
+
// we copy node_modules even though it's .gitignored
|
|
910
|
+
if (srcFile.includes('node_modules'))
|
|
925
911
|
return true;
|
|
926
|
-
//
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
// crash as often.
|
|
931
|
-
const currentContents = await fsExtra.readFile(destFile);
|
|
932
|
-
const newContents = await fsExtra.readFile(srcFile);
|
|
933
|
-
if (currentContents.equals(newContents))
|
|
912
|
+
// make sure .env is copied whether it's .gitignored or not
|
|
913
|
+
if (srcFile.endsWith('.env'))
|
|
914
|
+
return true;
|
|
915
|
+
if (isIgnored(srcFile))
|
|
934
916
|
return false;
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
}
|
|
959
|
-
const appName = getAppName(srcDir);
|
|
960
|
-
await fsExtra.ensureDir(path.dirname(playgroundAppNameInfoPath));
|
|
961
|
-
await fsExtra.writeJSON(playgroundAppNameInfoPath, { appName });
|
|
962
|
-
const playgroundIsStillRunning = playgroundApp
|
|
963
|
-
? isAppRunning(playgroundApp)
|
|
964
|
-
: false;
|
|
965
|
-
const restartPlayground = playgroundWasRunning && !playgroundIsStillRunning;
|
|
966
|
-
// run postSet-playground script if it exists
|
|
967
|
-
const postSetPlaygroundPath = await firstToExist(path.join(srcDir, 'epicshop', 'post-set-playground.js'), path.join(workshopRoot, 'epicshop', 'post-set-playground.js'));
|
|
968
|
-
if (postSetPlaygroundPath) {
|
|
969
|
-
await execa('node', [postSetPlaygroundPath], {
|
|
970
|
-
cwd: workshopRoot,
|
|
971
|
-
stdio: 'inherit',
|
|
972
|
-
env: {
|
|
973
|
-
EPICSHOP_PLAYGROUND_TIMESTAMP: setPlaygroundTimestamp.toString(),
|
|
974
|
-
EPICSHOP_PLAYGROUND_SRC_DIR: srcDir,
|
|
975
|
-
EPICSHOP_PLAYGROUND_DEST_DIR: destDir,
|
|
976
|
-
EPICSHOP_PLAYGROUND_WAS_RUNNING: playgroundWasRunning.toString(),
|
|
977
|
-
EPICSHOP_PLAYGROUND_IS_STILL_RUNNING: playgroundIsStillRunning.toString(),
|
|
978
|
-
EPICSHOP_PLAYGROUND_RESTART_PLAYGROUND: restartPlayground.toString(),
|
|
917
|
+
try {
|
|
918
|
+
const isDir = (await fsExtra.stat(srcFile)).isDirectory();
|
|
919
|
+
if (isDir)
|
|
920
|
+
return true;
|
|
921
|
+
const destIsDir = (await fsExtra.stat(destFile)).isDirectory();
|
|
922
|
+
// weird, but ok
|
|
923
|
+
if (destIsDir)
|
|
924
|
+
return true;
|
|
925
|
+
// it's better to check if the contents are the same before copying
|
|
926
|
+
// because it avoids unnecessary writes and reduces the impact on any
|
|
927
|
+
// file watchers (like the remix dev server). In practice, it's definitely
|
|
928
|
+
// slower, but it's better because it doesn't cause the dev server to
|
|
929
|
+
// crash as often.
|
|
930
|
+
const currentContents = await fsExtra.readFile(destFile);
|
|
931
|
+
const newContents = await fsExtra.readFile(srcFile);
|
|
932
|
+
if (currentContents.equals(newContents))
|
|
933
|
+
return false;
|
|
934
|
+
return true;
|
|
935
|
+
}
|
|
936
|
+
catch {
|
|
937
|
+
// 🤷♂️ should probably copy it in this case
|
|
938
|
+
return true;
|
|
939
|
+
}
|
|
979
940
|
},
|
|
980
941
|
});
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
942
|
+
async function getFiles(dir) {
|
|
943
|
+
// make globby friendly to windows
|
|
944
|
+
const dirPath = dir.replace(/\\/g, '/');
|
|
945
|
+
const files = await globby([`${dirPath}/**/*`, '!**/build/**/*'], {
|
|
946
|
+
onlyFiles: false,
|
|
947
|
+
dot: true,
|
|
948
|
+
});
|
|
949
|
+
return files.map((f) => f.replace(dirPath, ''));
|
|
950
|
+
}
|
|
951
|
+
// Remove files from destDir that were in destDir before but are not in srcDir
|
|
952
|
+
const srcFiles = await getFiles(srcDir);
|
|
953
|
+
const destFiles = await getFiles(destDir);
|
|
954
|
+
const filesToDelete = destFiles.filter((fileName) => !srcFiles.includes(fileName));
|
|
955
|
+
for (const fileToDelete of filesToDelete) {
|
|
956
|
+
await fsExtra.remove(path.join(destDir, fileToDelete));
|
|
957
|
+
}
|
|
958
|
+
const appName = getAppName(srcDir);
|
|
959
|
+
await fsExtra.ensureDir(path.dirname(playgroundAppNameInfoPath));
|
|
960
|
+
await fsExtra.writeJSON(playgroundAppNameInfoPath, { appName });
|
|
961
|
+
const playgroundIsStillRunning = playgroundApp
|
|
962
|
+
? isAppRunning(playgroundApp)
|
|
963
|
+
: false;
|
|
964
|
+
const restartPlayground = playgroundWasRunning && !playgroundIsStillRunning;
|
|
965
|
+
// run postSet-playground script if it exists
|
|
966
|
+
const postSetPlaygroundPath = await firstToExist(path.join(srcDir, 'epicshop', 'post-set-playground.js'), path.join(workshopRoot, 'epicshop', 'post-set-playground.js'));
|
|
967
|
+
if (postSetPlaygroundPath) {
|
|
968
|
+
await execa('node', [postSetPlaygroundPath], {
|
|
969
|
+
cwd: workshopRoot,
|
|
970
|
+
stdio: 'inherit',
|
|
971
|
+
env: {
|
|
972
|
+
EPICSHOP_PLAYGROUND_TIMESTAMP: setPlaygroundTimestamp.toString(),
|
|
973
|
+
EPICSHOP_PLAYGROUND_SRC_DIR: srcDir,
|
|
974
|
+
EPICSHOP_PLAYGROUND_DEST_DIR: destDir,
|
|
975
|
+
EPICSHOP_PLAYGROUND_WAS_RUNNING: playgroundWasRunning.toString(),
|
|
976
|
+
EPICSHOP_PLAYGROUND_IS_STILL_RUNNING: playgroundIsStillRunning.toString(),
|
|
977
|
+
EPICSHOP_PLAYGROUND_RESTART_PLAYGROUND: restartPlayground.toString(),
|
|
978
|
+
},
|
|
979
|
+
});
|
|
980
|
+
}
|
|
981
|
+
// since we are running without the watcher we need to set the modified time
|
|
982
|
+
modifiedTimes.set(destDir, Date.now());
|
|
983
|
+
if (playgroundApp && restartPlayground) {
|
|
984
|
+
await runAppDev(playgroundApp);
|
|
985
|
+
await waitOnApp(playgroundApp);
|
|
986
|
+
}
|
|
987
|
+
});
|
|
988
|
+
// let the app know the playground changed
|
|
989
|
+
getWatcher()?.emit('all', 'playground', destDir);
|
|
988
990
|
}
|
|
989
991
|
/**
|
|
990
992
|
* The playground is based on another app. This returns the app the playground
|
|
@@ -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\tbustWorkshopConfigCache,\n\tgetAppConfig,\n\tgetStackBlitzUrl,\n\tgetWorkshopConfig,\n} from './config.server.js'\nimport { getEnv, init as initEnv } from './env.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'\n\nlet initialized = false\n\nexport const workshopRoot = (process.env.EPICSHOP_CONTEXT_CWD =\n\tprocess.env.EPICSHOP_CONTEXT_CWD ?? process.cwd())\n\nconst playgroundAppNameInfoPath = path.join(\n\tworkshopRoot,\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\tstackBlitzUrl: z.string().nullable(),\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>\nexport type AppType = App['type']\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\nasync function firstToExist(...files: Array<string>) {\n\tconst results = await Promise.all(files.map(exists))\n\tconst index = results.findIndex(Boolean)\n\treturn index === -1 ? null : files[index]\n}\n\nexport const modifiedTimes = remember(\n\t'modified_times',\n\t() => new Map<string, number>(),\n)\n\nexport function init() {\n\tif (initialized) return\n\n\tinitialized = true\n\tconst config = getWorkshopConfig()\n\tprocess.env.EPICSHOP_GITHUB_REPO = config.githubRepo\n\tprocess.env.EPICSHOP_GITHUB_ROOT = config.githubRoot\n\n\tinitEnv()\n\n\tglobal.ENV = getEnv()\n\n\tasync function handleFileChanges(\n\t\tevent: string,\n\t\tfilePath: string,\n\t): Promise<void> {\n\t\tif (filePath === path.join(workshopRoot, 'package.json')) {\n\t\t\tbustWorkshopConfigCache()\n\t\t}\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\tcacheEntry: CacheEntry | null | undefined,\n\t...dirs: Array<string | undefined | null>\n) {\n\tconst truthyDirs = dirs.filter(Boolean)\n\tfor (const d of truthyDirs) {\n\t\tif (!path.isAbsolute(d)) {\n\t\t\tthrow new Error(`Trying to get force fresh for non-absolute path: ${d}`)\n\t\t}\n\t}\n\tif (!cacheEntry) return true\n\tconst latestModifiedTime = truthyDirs.reduce((latest, dir) => {\n\t\tconst modifiedTime = modifiedTimes.get(dir)\n\t\treturn modifiedTime && modifiedTime > latest ? modifiedTime : latest\n\t}, 0)\n\tif (!latestModifiedTime) return undefined\n\treturn latestModifiedTime > 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\tif (!initialized) init()\n\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`${workshopRoot}${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 {\n\t\ttestTab: { enabled },\n\t\tscripts: { test: testScript },\n\t} = await getAppConfig(fullPath)\n\tif (enabled === false) return { type: 'none' }\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 {\n\t\tscripts: { dev: devScript },\n\t\tinitialRoute,\n\t} = await getAppConfig(fullPath)\n\tconst hasDevScript = Boolean(devScript)\n\n\tif (hasDevScript) {\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\treturn cachified({\n\t\tkey,\n\t\tcache: playgroundAppCache,\n\t\tttl: 1000 * 60 * 60 * 24,\n\n\t\ttimings,\n\t\ttimingKey: playgroundDir.replace(`${playgroundDir}${path.sep}`, ''),\n\t\trequest,\n\t\tforceFresh: getForceFreshForDir(\n\t\t\tplaygroundCacheEntry,\n\t\t\tplaygroundDir,\n\t\t\tbaseAppFullPath,\n\t\t),\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\t\t\tconst type = 'playground'\n\n\t\t\tconst title = compiledReadme?.title ?? name\n\t\t\treturn {\n\t\t\t\tname,\n\t\t\t\tappName: baseAppName,\n\t\t\t\ttype,\n\t\t\t\tisUpToDate: appModifiedTime <= playgroundAppModifiedTime,\n\t\t\t\tfullPath: playgroundDir,\n\t\t\t\trelativePath: playgroundDir.replace(`${workshopRoot}${path.sep}`, ''),\n\t\t\t\ttitle,\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\tstackBlitzUrl: await getStackBlitzUrl({\n\t\t\t\t\tfullPath: playgroundDir,\n\t\t\t\t\ttitle,\n\t\t\t\t\ttype,\n\t\t\t\t}),\n\t\t\t} satisfies PlaygroundApp\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\tconst type = 'example'\n\tconst title = compiledReadme?.title ?? name\n\treturn {\n\t\tname,\n\t\ttype,\n\t\tfullPath,\n\t\trelativePath: fullPath.replace(`${workshopRoot}${path.sep}`, ''),\n\t\ttitle,\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\tstackBlitzUrl: await getStackBlitzUrl({\n\t\t\tfullPath,\n\t\t\ttitle,\n\t\t\ttype,\n\t\t}),\n\t} satisfies ExampleApp\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(exampleAppCache.get(key), exampleDir),\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\tconst title = compiledReadme?.title ?? name\n\treturn {\n\t\tname,\n\t\ttitle,\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(`${workshopRoot}${path.sep}`, ''),\n\t\tinstructionsCode: compiledReadme?.code,\n\t\ttest,\n\t\tdev,\n\t\tstackBlitzUrl: await getStackBlitzUrl({\n\t\t\tfullPath,\n\t\t\ttitle,\n\t\t\ttype: 'solution',\n\t\t}),\n\t} satisfies SolutionApp\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\tsolutionAppCache.get(solutionDir),\n\t\t\t\tsolutionDir,\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\tconst title = compiledReadme?.title ?? name\n\treturn {\n\t\tsolutionName,\n\t\tname,\n\t\ttitle,\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(`${workshopRoot}${path.sep}`, ''),\n\t\tinstructionsCode: compiledReadme?.code,\n\t\ttest,\n\t\tdev,\n\t\tstackBlitzUrl: await getStackBlitzUrl({\n\t\t\tfullPath,\n\t\t\ttitle,\n\t\t\ttype: 'problem',\n\t\t}),\n\t} satisfies ProblemApp\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 solutionDir = await findSolutionDir({ fullPath: problemDir })\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\tproblemAppCache.get(problemDir),\n\t\t\t\tproblemDir,\n\t\t\t\tsolutionDir,\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}\nexport function getAppPageRoute(\n\tapp: ExerciseStepApp,\n\t{\n\t\tsubroute,\n\t\tsearchParams,\n\t}: { subroute?: string; searchParams?: URLSearchParams } = {},\n) {\n\tconst exerciseNumber = app.exerciseNumber.toString().padStart(2, '0')\n\tconst stepNumber = app.stepNumber.toString().padStart(2, '0')\n\tconst baseUrl = `/exercise/${exerciseNumber}/${stepNumber}/${app.type}`\n\tconst subrouteUrl = subroute ? `/${subroute}` : ''\n\n\tif (searchParams) {\n\t\t// these are used on the diff tab and if we preserve them then the user will\n\t\t// be confused why the diff is never changing as they advance through the workshop.\n\t\tsearchParams.delete('app1')\n\t\tsearchParams.delete('app2')\n\t}\n\n\tconst searchString = searchParams?.toString()\n\treturn `${baseUrl}${subrouteUrl}${searchString ? `?${searchString}` : ''}`\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 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 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"]}
|
|
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 { getWatcher, withoutWatcher } from './change-tracker.server.js'\nimport { compileMdx } from './compile-mdx.server.js'\nimport {\n\tbustWorkshopConfigCache,\n\tgetAppConfig,\n\tgetStackBlitzUrl,\n\tgetWorkshopConfig,\n} from './config.server.js'\nimport { getEnv, init as initEnv } from './env.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'\n\nlet initialized = false\n\nexport const workshopRoot = (process.env.EPICSHOP_CONTEXT_CWD =\n\tprocess.env.EPICSHOP_CONTEXT_CWD ?? process.cwd())\n\nconst playgroundAppNameInfoPath = path.join(\n\tworkshopRoot,\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\tstackBlitzUrl: z.string().nullable(),\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>\nexport type AppType = App['type']\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\nasync function firstToExist(...files: Array<string>) {\n\tconst results = await Promise.all(files.map(exists))\n\tconst index = results.findIndex(Boolean)\n\treturn index === -1 ? null : files[index]\n}\n\nexport const modifiedTimes = remember(\n\t'modified_times',\n\t() => new Map<string, number>(),\n)\n\nexport function init() {\n\tif (initialized) return\n\n\tinitialized = true\n\tconst config = getWorkshopConfig()\n\tprocess.env.EPICSHOP_GITHUB_REPO = config.githubRepo\n\tprocess.env.EPICSHOP_GITHUB_ROOT = config.githubRoot\n\n\tinitEnv()\n\n\tglobal.ENV = getEnv()\n\n\tgetWatcher()?.on('all', handleFileChanges)\n}\n\nasync function handleFileChanges(\n\tevent: string,\n\tfilePath: string,\n): Promise<void> {\n\tif (filePath === path.join(workshopRoot, 'package.json')) {\n\t\tbustWorkshopConfigCache()\n\t}\n\tconst apps = await getApps()\n\tfor (const app of apps) {\n\t\tif (filePath.startsWith(app.fullPath)) {\n\t\t\tmodifiedTimes.set(app.fullPath, Date.now())\n\t\t\tbreak\n\t\t}\n\t}\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\tcacheEntry: CacheEntry | null | undefined,\n\t...dirs: Array<string | undefined | null>\n) {\n\tconst truthyDirs = dirs.filter(Boolean)\n\tfor (const d of truthyDirs) {\n\t\tif (!path.isAbsolute(d)) {\n\t\t\tthrow new Error(`Trying to get force fresh for non-absolute path: ${d}`)\n\t\t}\n\t}\n\tif (!cacheEntry) return true\n\tconst latestModifiedTime = truthyDirs.reduce((latest, dir) => {\n\t\tconst modifiedTime = modifiedTimes.get(dir)\n\t\treturn modifiedTime && modifiedTime > latest ? modifiedTime : latest\n\t}, 0)\n\tif (!latestModifiedTime) return undefined\n\treturn latestModifiedTime > 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\tif (!initialized) init()\n\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`${workshopRoot}${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 {\n\t\ttestTab: { enabled },\n\t\tscripts: { test: testScript },\n\t} = await getAppConfig(fullPath)\n\tif (enabled === false) return { type: 'none' }\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 {\n\t\tscripts: { dev: devScript },\n\t\tinitialRoute,\n\t} = await getAppConfig(fullPath)\n\tconst hasDevScript = Boolean(devScript)\n\n\tif (hasDevScript) {\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\treturn cachified({\n\t\tkey,\n\t\tcache: playgroundAppCache,\n\t\tttl: 1000 * 60 * 60 * 24,\n\n\t\ttimings,\n\t\ttimingKey: playgroundDir.replace(`${playgroundDir}${path.sep}`, ''),\n\t\trequest,\n\t\tforceFresh: getForceFreshForDir(\n\t\t\tplaygroundCacheEntry,\n\t\t\tplaygroundDir,\n\t\t\tbaseAppFullPath,\n\t\t),\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\t\t\tconst type = 'playground'\n\n\t\t\tconst title = compiledReadme?.title ?? name\n\t\t\treturn {\n\t\t\t\tname,\n\t\t\t\tappName: baseAppName,\n\t\t\t\ttype,\n\t\t\t\tisUpToDate: appModifiedTime <= playgroundAppModifiedTime,\n\t\t\t\tfullPath: playgroundDir,\n\t\t\t\trelativePath: playgroundDir.replace(`${workshopRoot}${path.sep}`, ''),\n\t\t\t\ttitle,\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\tstackBlitzUrl: await getStackBlitzUrl({\n\t\t\t\t\tfullPath: playgroundDir,\n\t\t\t\t\ttitle,\n\t\t\t\t\ttype,\n\t\t\t\t}),\n\t\t\t} satisfies PlaygroundApp\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\tconst type = 'example'\n\tconst title = compiledReadme?.title ?? name\n\treturn {\n\t\tname,\n\t\ttype,\n\t\tfullPath,\n\t\trelativePath: fullPath.replace(`${workshopRoot}${path.sep}`, ''),\n\t\ttitle,\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\tstackBlitzUrl: await getStackBlitzUrl({\n\t\t\tfullPath,\n\t\t\ttitle,\n\t\t\ttype,\n\t\t}),\n\t} satisfies ExampleApp\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(exampleAppCache.get(key), exampleDir),\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\tconst title = compiledReadme?.title ?? name\n\treturn {\n\t\tname,\n\t\ttitle,\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(`${workshopRoot}${path.sep}`, ''),\n\t\tinstructionsCode: compiledReadme?.code,\n\t\ttest,\n\t\tdev,\n\t\tstackBlitzUrl: await getStackBlitzUrl({\n\t\t\tfullPath,\n\t\t\ttitle,\n\t\t\ttype: 'solution',\n\t\t}),\n\t} satisfies SolutionApp\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\tsolutionAppCache.get(solutionDir),\n\t\t\t\tsolutionDir,\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\tconst title = compiledReadme?.title ?? name\n\treturn {\n\t\tsolutionName,\n\t\tname,\n\t\ttitle,\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(`${workshopRoot}${path.sep}`, ''),\n\t\tinstructionsCode: compiledReadme?.code,\n\t\ttest,\n\t\tdev,\n\t\tstackBlitzUrl: await getStackBlitzUrl({\n\t\t\tfullPath,\n\t\t\ttitle,\n\t\t\ttype: 'problem',\n\t\t}),\n\t} satisfies ProblemApp\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 solutionDir = await findSolutionDir({ fullPath: problemDir })\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\tproblemAppCache.get(problemDir),\n\t\t\t\tproblemDir,\n\t\t\t\tsolutionDir,\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}\nexport function getAppPageRoute(\n\tapp: ExerciseStepApp,\n\t{\n\t\tsubroute,\n\t\tsearchParams,\n\t}: { subroute?: string; searchParams?: URLSearchParams } = {},\n) {\n\tconst exerciseNumber = app.exerciseNumber.toString().padStart(2, '0')\n\tconst stepNumber = app.stepNumber.toString().padStart(2, '0')\n\tconst baseUrl = `/exercise/${exerciseNumber}/${stepNumber}/${app.type}`\n\tconst subrouteUrl = subroute ? `/${subroute}` : ''\n\n\tif (searchParams) {\n\t\t// these are used on the diff tab and if we preserve them then the user will\n\t\t// be confused why the diff is never changing as they advance through the workshop.\n\t\tsearchParams.delete('app1')\n\t\tsearchParams.delete('app2')\n\t}\n\n\tconst searchString = searchParams?.toString()\n\treturn `${baseUrl}${subrouteUrl}${searchString ? `?${searchString}` : ''}`\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 destDir = path.join(workshopRoot, 'playground')\n\tawait withoutWatcher(async () => {\n\t\tconst isIgnored = await isGitIgnored({ cwd: srcDir })\n\t\tconst playgroundApp = await getAppByName('playground')\n\t\tconst playgroundWasRunning = playgroundApp\n\t\t\t? isAppRunning(playgroundApp)\n\t\t\t: false\n\t\tif (playgroundApp && reset) {\n\t\t\tawait closeProcess(playgroundApp.name)\n\t\t\tawait fsExtra.remove(destDir)\n\t\t}\n\t\tconst setPlaygroundTimestamp = Date.now()\n\n\t\t// run prepare-playground script if it exists\n\t\tconst preSetPlaygroundPath = await firstToExist(\n\t\t\tpath.join(srcDir, 'epicshop', 'pre-set-playground.js'),\n\t\t\tpath.join(workshopRoot, 'epicshop', 'pre-set-playground.js'),\n\t\t)\n\t\tif (preSetPlaygroundPath) {\n\t\t\tawait execa('node', [preSetPlaygroundPath], {\n\t\t\t\tcwd: workshopRoot,\n\t\t\t\tstdio: 'inherit',\n\n\t\t\t\tenv: {\n\t\t\t\t\tEPICSHOP_PLAYGROUND_TIMESTAMP: setPlaygroundTimestamp.toString(),\n\t\t\t\t\tEPICSHOP_PLAYGROUND_DEST_DIR: destDir,\n\t\t\t\t\tEPICSHOP_PLAYGROUND_SRC_DIR: srcDir,\n\t\t\t\t\tEPICSHOP_PLAYGROUND_WAS_RUNNING: playgroundWasRunning.toString(),\n\t\t\t\t} as any,\n\t\t\t})\n\t\t}\n\n\t\tconst basename = path.basename(srcDir)\n\t\t// If we don't delete the destination node_modules first then copying the new\n\t\t// node_modules has issues.\n\t\tawait fsExtra.remove(path.join(destDir, 'node_modules'))\n\t\t// Copy the contents of the source directory to the destination directory recursively\n\t\tawait fsExtra.copy(srcDir, destDir, {\n\t\t\tfilter: async (srcFile, destFile) => {\n\t\t\t\tif (\n\t\t\t\t\tsrcFile.includes(`${basename}${path.sep}build`) ||\n\t\t\t\t\tsrcFile.includes(`${basename}${path.sep}public${path.sep}build`)\n\t\t\t\t) {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t\tif (srcFile === srcDir) return true\n\t\t\t\t// we copy node_modules even though it's .gitignored\n\t\t\t\tif (srcFile.includes('node_modules')) return true\n\t\t\t\t// make sure .env is copied whether it's .gitignored or not\n\t\t\t\tif (srcFile.endsWith('.env')) return true\n\t\t\t\tif (isIgnored(srcFile)) return false\n\n\t\t\t\ttry {\n\t\t\t\t\tconst isDir = (await fsExtra.stat(srcFile)).isDirectory()\n\t\t\t\t\tif (isDir) return true\n\t\t\t\t\tconst destIsDir = (await fsExtra.stat(destFile)).isDirectory()\n\t\t\t\t\t// weird, but ok\n\t\t\t\t\tif (destIsDir) return true\n\n\t\t\t\t\t// it's better to check if the contents are the same before copying\n\t\t\t\t\t// because it avoids unnecessary writes and reduces the impact on any\n\t\t\t\t\t// file watchers (like the remix dev server). In practice, it's definitely\n\t\t\t\t\t// slower, but it's better because it doesn't cause the dev server to\n\t\t\t\t\t// crash as often.\n\t\t\t\t\tconst currentContents = await fsExtra.readFile(destFile)\n\t\t\t\t\tconst newContents = await fsExtra.readFile(srcFile)\n\t\t\t\t\tif (currentContents.equals(newContents)) return false\n\n\t\t\t\t\treturn true\n\t\t\t\t} catch {\n\t\t\t\t\t// 🤷♂️ should probably copy it in this case\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t},\n\t\t})\n\n\t\tasync function getFiles(dir: string) {\n\t\t\t// make globby friendly to windows\n\t\t\tconst dirPath = dir.replace(/\\\\/g, '/')\n\t\t\tconst files = await globby([`${dirPath}/**/*`, '!**/build/**/*'], {\n\t\t\t\tonlyFiles: false,\n\t\t\t\tdot: true,\n\t\t\t})\n\t\t\treturn files.map((f) => f.replace(dirPath, ''))\n\t\t}\n\n\t\t// Remove files from destDir that were in destDir before but are not in srcDir\n\t\tconst srcFiles = await getFiles(srcDir)\n\t\tconst destFiles = await getFiles(destDir)\n\t\tconst filesToDelete = destFiles.filter(\n\t\t\t(fileName) => !srcFiles.includes(fileName),\n\t\t)\n\n\t\tfor (const fileToDelete of filesToDelete) {\n\t\t\tawait fsExtra.remove(path.join(destDir, fileToDelete))\n\t\t}\n\n\t\tconst appName = getAppName(srcDir)\n\t\tawait fsExtra.ensureDir(path.dirname(playgroundAppNameInfoPath))\n\t\tawait fsExtra.writeJSON(playgroundAppNameInfoPath, { appName })\n\n\t\tconst playgroundIsStillRunning = playgroundApp\n\t\t\t? isAppRunning(playgroundApp)\n\t\t\t: false\n\t\tconst restartPlayground = playgroundWasRunning && !playgroundIsStillRunning\n\n\t\t// run postSet-playground script if it exists\n\t\tconst postSetPlaygroundPath = await firstToExist(\n\t\t\tpath.join(srcDir, 'epicshop', 'post-set-playground.js'),\n\t\t\tpath.join(workshopRoot, 'epicshop', 'post-set-playground.js'),\n\t\t)\n\t\tif (postSetPlaygroundPath) {\n\t\t\tawait execa('node', [postSetPlaygroundPath], {\n\t\t\t\tcwd: workshopRoot,\n\t\t\t\tstdio: 'inherit',\n\n\t\t\t\tenv: {\n\t\t\t\t\tEPICSHOP_PLAYGROUND_TIMESTAMP: setPlaygroundTimestamp.toString(),\n\t\t\t\t\tEPICSHOP_PLAYGROUND_SRC_DIR: srcDir,\n\t\t\t\t\tEPICSHOP_PLAYGROUND_DEST_DIR: destDir,\n\t\t\t\t\tEPICSHOP_PLAYGROUND_WAS_RUNNING: playgroundWasRunning.toString(),\n\t\t\t\t\tEPICSHOP_PLAYGROUND_IS_STILL_RUNNING:\n\t\t\t\t\t\tplaygroundIsStillRunning.toString(),\n\t\t\t\t\tEPICSHOP_PLAYGROUND_RESTART_PLAYGROUND: restartPlayground.toString(),\n\t\t\t\t} as any,\n\t\t\t})\n\t\t}\n\n\t\t// since we are running without the watcher we need to set the modified time\n\t\tmodifiedTimes.set(destDir, Date.now())\n\n\t\tif (playgroundApp && restartPlayground) {\n\t\t\tawait runAppDev(playgroundApp)\n\t\t\tawait waitOnApp(playgroundApp)\n\t\t}\n\t})\n\n\t// let the app know the playground changed\n\tgetWatcher()?.emit('all', 'playground', destDir)\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 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"]}
|
|
@@ -3,6 +3,7 @@ import closeWithGrace from 'close-with-grace';
|
|
|
3
3
|
declare global {
|
|
4
4
|
var __change_tracker_watcher__: ReturnType<typeof chokidar.watch> | undefined, __change_tracker_close_with_grace_return__: ReturnType<typeof closeWithGrace>;
|
|
5
5
|
}
|
|
6
|
-
export declare function getWatcher(): chokidar.FSWatcher |
|
|
7
|
-
export declare function getOptionalWatcher(): chokidar.FSWatcher | undefined;
|
|
6
|
+
export declare function getWatcher(): import("chokidar").FSWatcher | undefined;
|
|
7
|
+
export declare function getOptionalWatcher(): import("chokidar").FSWatcher | undefined;
|
|
8
|
+
export declare function withoutWatcher<ReturnValue>(fn: () => Promise<ReturnValue> | ReturnValue): Promise<ReturnValue>;
|
|
8
9
|
//# sourceMappingURL=change-tracker.server.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"change-tracker.server.d.ts","sourceRoot":"","sources":["../../src/change-tracker.server.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"change-tracker.server.d.ts","sourceRoot":"","sources":["../../src/change-tracker.server.ts"],"names":[],"mappings":"AACA,OAAO,QAAQ,MAAM,UAAU,CAAA;AAC/B,OAAO,cAAc,MAAM,kBAAkB,CAAA;AAG7C,OAAO,CAAC,MAAM,CAAC;IACd,IAAI,0BAA0B,EAAE,UAAU,CAAC,OAAO,QAAQ,CAAC,KAAK,CAAC,GAAG,SAAS,EAC5E,0CAA0C,EAAE,UAAU,CACrD,OAAO,cAAc,CACrB,CAAA;CACF;AAqBD,wBAAgB,UAAU,6CAmBzB;AAED,wBAAgB,kBAAkB,6CAEjC;AAMD,wBAAsB,cAAc,CAAC,WAAW,EAC/C,EAAE,EAAE,MAAM,OAAO,CAAC,WAAW,CAAC,GAAG,WAAW,wBAoC5C"}
|
|
@@ -1,25 +1,37 @@
|
|
|
1
|
+
import path from 'path';
|
|
1
2
|
import chokidar from 'chokidar';
|
|
2
3
|
import closeWithGrace from 'close-with-grace';
|
|
4
|
+
import { workshopRoot } from './config.server.js';
|
|
3
5
|
let watcher = global.__change_tracker_watcher__;
|
|
6
|
+
const dirsToWatch = [
|
|
7
|
+
path.join(workshopRoot, 'playground'),
|
|
8
|
+
path.join(workshopRoot, 'exercises'),
|
|
9
|
+
path.join(workshopRoot, 'examples'),
|
|
10
|
+
];
|
|
11
|
+
const ignoredDirs = [
|
|
12
|
+
'/.git',
|
|
13
|
+
'/node_modules',
|
|
14
|
+
'/build',
|
|
15
|
+
'/server-build',
|
|
16
|
+
'/public/build',
|
|
17
|
+
'/playwright-report',
|
|
18
|
+
'/dist',
|
|
19
|
+
'/.cache',
|
|
20
|
+
];
|
|
4
21
|
export function getWatcher() {
|
|
5
22
|
if (process.env.EPICSHOP_DEPLOYED ??
|
|
6
23
|
process.env.EPICSHOP_ENABLE_WATCHER !== 'true') {
|
|
7
|
-
return
|
|
24
|
+
return undefined;
|
|
8
25
|
}
|
|
9
26
|
if (watcher)
|
|
10
27
|
return watcher;
|
|
11
|
-
|
|
12
|
-
watcher = chokidar.watch(workshopRoot, {
|
|
28
|
+
watcher = chokidar.watch(dirsToWatch, {
|
|
13
29
|
ignoreInitial: true,
|
|
14
|
-
ignored
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
'**/playwright-report/**',
|
|
20
|
-
'**/dist/**',
|
|
21
|
-
'**/.cache/**',
|
|
22
|
-
],
|
|
30
|
+
ignored(path, stat) {
|
|
31
|
+
return stat?.isDirectory()
|
|
32
|
+
? ignoredDirs.some((dir) => path.endsWith(dir))
|
|
33
|
+
: false;
|
|
34
|
+
},
|
|
23
35
|
});
|
|
24
36
|
global.__change_tracker_watcher__ = watcher;
|
|
25
37
|
return watcher;
|
|
@@ -27,6 +39,42 @@ export function getWatcher() {
|
|
|
27
39
|
export function getOptionalWatcher() {
|
|
28
40
|
return watcher;
|
|
29
41
|
}
|
|
42
|
+
// NOTE: I tried going the unwatch/add route and it just didn't work. All changes
|
|
43
|
+
// were still tracked. This listener nonsense was the only way I could come up with
|
|
44
|
+
// to handle changes properly.
|
|
45
|
+
let currentWithoutWatcher = null;
|
|
46
|
+
export async function withoutWatcher(fn) {
|
|
47
|
+
if (!watcher)
|
|
48
|
+
return fn();
|
|
49
|
+
let thisWithoutWatcher = (currentWithoutWatcher = Symbol('withoutWatcher'));
|
|
50
|
+
const eventNames = watcher.eventNames();
|
|
51
|
+
const eventNamesToListenersMap = {};
|
|
52
|
+
for (const eventName of eventNames) {
|
|
53
|
+
if (typeof eventName === 'string') {
|
|
54
|
+
eventNamesToListenersMap[eventName] = watcher.listeners(eventName);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
watcher.removeAllListeners();
|
|
58
|
+
try {
|
|
59
|
+
const result = await fn();
|
|
60
|
+
return result;
|
|
61
|
+
}
|
|
62
|
+
finally {
|
|
63
|
+
if (currentWithoutWatcher === thisWithoutWatcher) {
|
|
64
|
+
// give it a bit to settle,
|
|
65
|
+
// without this the watcher may notice all changes that happened anyway
|
|
66
|
+
await new Promise((r) => setTimeout(r, 100));
|
|
67
|
+
for (const eventName of eventNames) {
|
|
68
|
+
if (typeof eventName === 'string') {
|
|
69
|
+
const listeners = eventNamesToListenersMap[eventName] || [];
|
|
70
|
+
for (const listener of listeners) {
|
|
71
|
+
watcher.on(eventName, listener);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
30
78
|
global.__change_tracker_close_with_grace_return__?.uninstall();
|
|
31
79
|
global.__change_tracker_close_with_grace_return__ = closeWithGrace(() => watcher?.close());
|
|
32
80
|
//# sourceMappingURL=change-tracker.server.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"change-tracker.server.js","sourceRoot":"","sources":["../../src/change-tracker.server.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAA;AAC/B,OAAO,cAAc,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"change-tracker.server.js","sourceRoot":"","sources":["../../src/change-tracker.server.ts"],"names":[],"mappings":"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","sourcesContent":["import path from 'path'\nimport chokidar from 'chokidar'\nimport closeWithGrace from 'close-with-grace'\nimport { workshopRoot } from './config.server.js'\n\ndeclare global {\n\tvar __change_tracker_watcher__: ReturnType<typeof chokidar.watch> | undefined,\n\t\t__change_tracker_close_with_grace_return__: ReturnType<\n\t\t\ttypeof closeWithGrace\n\t\t>\n}\n\nlet watcher = global.__change_tracker_watcher__\n\nconst dirsToWatch = [\n\tpath.join(workshopRoot, 'playground'),\n\tpath.join(workshopRoot, 'exercises'),\n\tpath.join(workshopRoot, 'examples'),\n]\n\nconst ignoredDirs = [\n\t'/.git',\n\t'/node_modules',\n\t'/build',\n\t'/server-build',\n\t'/public/build',\n\t'/playwright-report',\n\t'/dist',\n\t'/.cache',\n]\n\nexport function getWatcher() {\n\tif (\n\t\tprocess.env.EPICSHOP_DEPLOYED ??\n\t\tprocess.env.EPICSHOP_ENABLE_WATCHER !== 'true'\n\t) {\n\t\treturn undefined\n\t}\n\tif (watcher) return watcher\n\twatcher = chokidar.watch(dirsToWatch, {\n\t\tignoreInitial: true,\n\t\tignored(path, stat) {\n\t\t\treturn stat?.isDirectory()\n\t\t\t\t? ignoredDirs.some((dir) => path.endsWith(dir))\n\t\t\t\t: false\n\t\t},\n\t})\n\n\tglobal.__change_tracker_watcher__ = watcher\n\treturn watcher\n}\n\nexport function getOptionalWatcher() {\n\treturn watcher\n}\n\n// NOTE: I tried going the unwatch/add route and it just didn't work. All changes\n// were still tracked. This listener nonsense was the only way I could come up with\n// to handle changes properly.\nlet currentWithoutWatcher = null\nexport async function withoutWatcher<ReturnValue>(\n\tfn: () => Promise<ReturnValue> | ReturnValue,\n) {\n\tif (!watcher) return fn()\n\n\tlet thisWithoutWatcher = (currentWithoutWatcher = Symbol('withoutWatcher'))\n\tconst eventNames = watcher.eventNames()\n\tconst eventNamesToListenersMap: Record<\n\t\tstring,\n\t\tReturnType<typeof watcher.listeners>\n\t> = {}\n\tfor (const eventName of eventNames) {\n\t\tif (typeof eventName === 'string') {\n\t\t\teventNamesToListenersMap[eventName] = watcher.listeners(eventName)\n\t\t}\n\t}\n\twatcher.removeAllListeners()\n\n\ttry {\n\t\tconst result = await fn()\n\t\treturn result\n\t} finally {\n\t\tif (currentWithoutWatcher === thisWithoutWatcher) {\n\t\t\t// give it a bit to settle,\n\t\t\t// without this the watcher may notice all changes that happened anyway\n\t\t\tawait new Promise((r) => setTimeout(r, 100))\n\n\t\t\tfor (const eventName of eventNames) {\n\t\t\t\tif (typeof eventName === 'string') {\n\t\t\t\t\tconst listeners = eventNamesToListenersMap[eventName] || []\n\t\t\t\t\tfor (const listener of listeners) {\n\t\t\t\t\t\twatcher.on(eventName, listener as any)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nglobal.__change_tracker_close_with_grace_return__?.uninstall()\nglobal.__change_tracker_close_with_grace_return__ = closeWithGrace(() =>\n\twatcher?.close(),\n)\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compile-mdx.server.d.ts","sourceRoot":"","sources":["../../src/compile-mdx.server.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAsDjD,wBAAsB,UAAU,CAC/B,IAAI,EAAE,MAAM,EACZ,EACC,OAAO,EACP,OAAO,EACP,UAAU,GACV,GAAE;IACF,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,UAAU,CAAC,EAAE,OAAO,CAAA;CACf;;;;
|
|
1
|
+
{"version":3,"file":"compile-mdx.server.d.ts","sourceRoot":"","sources":["../../src/compile-mdx.server.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAsDjD,wBAAsB,UAAU,CAC/B,IAAI,EAAE,MAAM,EACZ,EACC,OAAO,EACP,OAAO,EACP,UAAU,GACV,GAAE;IACF,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,UAAU,CAAC,EAAE,OAAO,CAAA;CACf;;;;GAyBN;AAuED,wBAAsB,qBAAqB,CAAC,cAAc,EAAE,MAAM,mBA8BjE"}
|
|
@@ -61,10 +61,7 @@ export async function compileMdx(file, { request, timings, forceFresh, } = {}) {
|
|
|
61
61
|
forceFresh = await shouldForceFresh({ forceFresh, request, key });
|
|
62
62
|
const existingCacheEntry = await compiledInstructionMarkdownCache.get(key);
|
|
63
63
|
if (!forceFresh && existingCacheEntry) {
|
|
64
|
-
|
|
65
|
-
if (stat.mtimeMs <= compiledTime) {
|
|
66
|
-
return existingCacheEntry.value;
|
|
67
|
-
}
|
|
64
|
+
forceFresh = stat.mtimeMs > existingCacheEntry.metadata.createdTime;
|
|
68
65
|
}
|
|
69
66
|
return cachified({
|
|
70
67
|
key,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compile-mdx.server.js","sourceRoot":"","sources":["../../src/compile-mdx.server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAA;AACnB,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;AAG3D,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,MAAM,MAAM,SAAS,CAAA;AAC5B,OAAO,sBAAsB,MAAM,0BAA0B,CAAA;AAC7D,OAAO,KAAK,MAAM,cAAc,CAAA;AAChC,OAAO,GAAG,MAAM,YAAY,CAAA;AAE5B,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACxC,OAAO,EACN,SAAS,EACT,gCAAgC,EAChC,qBAAqB,EACrB,gBAAgB,GAChB,MAAM,mBAAmB,CAAA;AAG1B,SAAS,cAAc;IACtB,OAAO,KAAK,UAAU,WAAW,CAAC,IAAc;QAC/C,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC,OAAgB,EAAE,EAAE;YAC3C,IAAI,OAAO,CAAC,OAAO,KAAK,KAAK,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;gBAC3D,OAAM;YACP,CAAC;YACD,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;YACpC,IACC,CAAC,QAAQ;gBACT,QAAQ,CAAC,IAAI,KAAK,SAAS;gBAC3B,QAAQ,CAAC,OAAO,KAAK,MAAM,EAC1B,CAAC;gBACF,OAAM;YACP,CAAC;YACD,MAAM,CAAC,cAAc,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAA;YAC1C,IAAI,CAAC,cAAc;gBAAE,OAAM;YAE3B,IAAI,cAAc,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBACpC,OAAO,CAAC,IAAI,CACX,kEAAkE,cAAc,CAAC,IAAI,EAAE,CACvF,CAAA;gBACD,OAAM;YACP,CAAC;YACD,cAAc,CAAC,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,OAAO,EAAE,CAAA;QACtD,CAAC,CAAC,CAAA;IACH,CAAC,CAAA;AACF,CAAC;AAED,SAAS,sBAAsB;IAC9B,OAAO,KAAK,UAAU,2BAA2B,CAAC,IAAc;QAC/D,KAAK,CACJ,IAAI,EACJ,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,EACnC,SAAS,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM;YACnC,IAAI,MAAM,EAAE,IAAI,KAAK,SAAS;gBAAE,OAAM;YACtC,IAAI,MAAM,CAAC,OAAO,KAAK,KAAK;gBAAE,OAAM;YACpC,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC;gBAAE,OAAM;YACvD,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;QAC5B,CAAC,CACD,CAAA;IACF,CAAC,CAAA;AACF,CAAC;AAED,MAAM,aAAa,GAAG;IACrB,cAAc;IACd,qBAAqB;IACrB,sBAAsB;CACE,CAAA;AAEzB,MAAM,UAAU,GACf,OAAO,CAAC,GAAG,CAAC,oBAAoB,KAAK,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAE,CAAC,CAAA;AAErE,MAAM,CAAC,KAAK,UAAU,UAAU,CAC/B,IAAY,EACZ,EACC,OAAO,EACP,OAAO,EACP,UAAU,MAKP,EAAE;IAEN,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ;SAC5B,IAAI,CAAC,IAAI,CAAC;SACV,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAA;IACxC,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,6BAA6B,IAAI,CAAC,KAAK,EAAE,CAAC,CAAA;IAC3D,CAAC;IAED,MAAM,GAAG,GAAG,QAAQ,IAAI,EAAE,CAAA;IAC1B,UAAU,GAAG,MAAM,gBAAgB,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAA;IAEjE,MAAM,kBAAkB,GAAG,MAAM,gCAAgC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAC1E,IAAI,CAAC,UAAU,IAAI,kBAAkB,EAAE,CAAC;QACvC,MAAM,YAAY,GAAG,kBAAkB,CAAC,QAAQ,CAAC,WAAW,CAAA;QAC5D,IAAI,IAAI,CAAC,OAAO,IAAI,YAAY,EAAE,CAAC;YAClC,OAAO,kBAAkB,CAAC,KAAK,CAAA;QAChC,CAAC;IACF,CAAC;IAED,OAAO,SAAS,CAAC;QAChB,GAAG;QACH,KAAK,EAAE,gCAAgC;QACvC,OAAO;QACP,OAAO;QACP,UAAU;QACV,aAAa,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC;KACzC,CAAC,CAAA;AACH,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,IAAY;IAKzC,IAAI,KAAK,GAAkB,IAAI,CAAA;IAC/B,MAAM,eAAe,GAAkB,EAAE,CAAA;IAEzC,IAAI,CAAC;QACJ,UAAU,CAAC,aAAa,IAAI,EAAE,CAAC,CAAA;QAC/B,MAAM,YAAY,GAAG,MAAM,eAAe,CAAC;YAC1C,IAAI;YACJ,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;YACvB,UAAU,CAAC,OAAO;gBACjB,OAAO,CAAC,aAAa,GAAG;oBACvB,GAAG,CAAC,OAAO,CAAC,aAAa,IAAI,EAAE,CAAC;oBAChC,CAAC,sBAAsB,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;oBAC9C,GAAG;oBACH,GAAG,EAAE,CAAC,CAAC,IAAe,EAAE,EAAE;wBACzB,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE;4BAC/B,IAAI,KAAK;gCAAE,OAAM;4BACjB,IAAI,IAAI,CAAC,KAAK,KAAK,CAAC,EAAE,CAAC;gCACtB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE;oCAChC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAA;gCAC9B,CAAC,CAAC,CAAA;4BACH,CAAC;wBACF,CAAC,CAAC,CAAA;wBACF,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAA;oBAC3D,CAAC;oBACD,GAAG,EAAE,CAAC,CAAC,IAAe,EAAE,EAAE;wBACzB,KAAK,CAAC,IAAI,EAAE,mBAAmB,EAAE,CAAC,KAAK,EAAE,EAAE;4BAC1C,0EAA0E;4BAC1E,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW;gCAAE,OAAM;4BACtC,0EAA0E;4BAC1E,MAAM,OAAO,GAAG,KAAK,CAAC,UAAU,CAAC,IAAI;4BACpC,0EAA0E;4BAC1E,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,iBAAiB,IAAI,CAAC,CAAC,IAAI,KAAK,KAAK,CACvD,CAAA;4BACD,IAAI,CAAC,OAAO;gCAAE,OAAM;4BACpB,IAAI,GAAG,GAAG,OAAO,CAAC,KAAK,CAAA;4BACvB,IAAI,OAAO,GAAG,KAAK,QAAQ;gCAAE,OAAM;4BACnC,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC;gCAAE,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;4BAC7C,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;wBAC1B,CAAC,CAAC,CAAA;oBACH,CAAC;oBACD,KAAK;iBACL,CAAA;gBACD,OAAO,CAAC,aAAa,GAAG;oBACvB,GAAG,CAAC,OAAO,CAAC,aAAa,IAAI,EAAE,CAAC;oBAChC,GAAG,aAAa;iBAChB,CAAA;gBACD,OAAO,CAAC,aAAa,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;gBACvC,OAAO,CAAC,MAAM,GAAG,KAAK,CAAA;gBACtB,OAAO,CAAC,WAAW,GAAG,KAAK,CAAA;gBAC3B,OAAO,OAAO,CAAA;YACf,CAAC;SACD,CAAC,CAAA;QACF,IAAI,CAAC,YAAY;YAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,IAAI,EAAE,CAAC,CAAA;QAE/D,MAAM,MAAM,GAAG,EAAE,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,KAAK,EAAE,eAAe,EAAE,CAAA;QAClE,OAAO,MAAM,CAAA;IACd,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACzB,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,IAAI,EAAE,KAAK,CAAC,CAAA;QAC1D,MAAM,KAAK,CAAA;IACZ,CAAC;YAAS,CAAC;QACV,UAAU,CAAC,yBAAyB,IAAI,EAAE,CAAC,CAAA;IAC5C,CAAC;AACF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,cAAsB;IACjE,OAAO,SAAS,CAAC;QAChB,GAAG,EAAE,cAAc;QACnB,KAAK,EAAE,qBAAqB;QAC5B,GAAG,EAAE,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;QACxB,aAAa,EAAE,KAAK,IAAI,EAAE;YACzB,IAAI,CAAC;gBACJ,UAAU,CAAC,kBAAkB,EAAE,cAAc,CAAC,CAAA;gBAC9C,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC;oBACpC,MAAM,EAAE,cAAc;oBACtB,UAAU,CAAC,OAAO;wBACjB,OAAO,CAAC,aAAa,GAAG;4BACvB,GAAG,CAAC,OAAO,CAAC,aAAa,IAAI,EAAE,CAAC;4BAChC,GAAG,aAAa;yBAChB,CAAA;wBACD,OAAO,CAAC,WAAW,GAAG,KAAK,CAAA;wBAC3B,OAAO,OAAO,CAAA;oBACf,CAAC;iBACD,CAAC,CAAA;gBACF,IAAI,CAAC,MAAM;oBAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAA;gBAEnE,OAAO,MAAM,CAAC,IAAI,CAAA;YACnB,CAAC;YAAC,OAAO,KAAc,EAAE,CAAC;gBACzB,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,cAAc,EAAE,KAAK,CAAC,CAAA;gBACpE,MAAM,KAAK,CAAA;YACZ,CAAC;oBAAS,CAAC;gBACV,UAAU,CAAC,8BAA8B,EAAE,cAAc,CAAC,CAAA;YAC3D,CAAC;QACF,CAAC;KACD,CAAC,CAAA;AACH,CAAC;AAED,IAAI,MAAM,GAAkB,IAAI,CAAA;AAChC,KAAK,UAAU,QAAQ;IACtB,IAAI,MAAM;QAAE,OAAO,MAAM,CAAA;IAEzB,MAAM,GAAG,IAAI,MAAM,CAAC;QACnB,WAAW,EAAE,CAAC;QACd,cAAc,EAAE,IAAI;QACpB,OAAO,EAAE,IAAI,GAAG,EAAE;KAClB,CAAC,CAAA;IACF,OAAO,MAAM,CAAA;AACd,CAAC;AAED,+EAA+E;AAC/E,8EAA8E;AAC9E,KAAK,UAAU,eAAe,CAAC,GAAG,IAAkC;IACnE,MAAM,KAAK,GAAG,MAAM,QAAQ,EAAE,CAAA;IAC9B,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC,CAAA;IACxD,OAAO,MAAM,CAAA;AACd,CAAC;AAED,kBAAkB;AAClB;;;;;;EAME","sourcesContent":["import fs from 'fs'\nimport path from 'path'\nimport { remarkCodeBlocksShiki } from '@kentcdodds/md-temp'\nimport { type Element, type Root as HastRoot } from 'hast'\nimport { type Root as MdastRoot } from 'mdast'\nimport { bundleMDX } from 'mdx-bundler'\nimport PQueue from 'p-queue'\nimport remarkAutolinkHeadings from 'remark-autolink-headings'\nimport emoji from 'remark-emoji'\nimport gfm from 'remark-gfm'\nimport { type PluggableList } from 'unified'\nimport { visit } from 'unist-util-visit'\nimport {\n\tcachified,\n\tcompiledInstructionMarkdownCache,\n\tcompiledMarkdownCache,\n\tshouldForceFresh,\n} from './cache.server.js'\nimport { type Timings } from './timing.server.js'\n\nfunction trimCodeBlocks() {\n\treturn async function transformer(tree: HastRoot) {\n\t\tvisit(tree, 'element', (preNode: Element) => {\n\t\t\tif (preNode.tagName !== 'pre' || !preNode.children.length) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst codeNode = preNode.children[0]\n\t\t\tif (\n\t\t\t\t!codeNode ||\n\t\t\t\tcodeNode.type !== 'element' ||\n\t\t\t\tcodeNode.tagName !== 'code'\n\t\t\t) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst [codeStringNode] = codeNode.children\n\t\t\tif (!codeStringNode) return\n\n\t\t\tif (codeStringNode.type !== 'text') {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`trimCodeBlocks: Unexpected: codeStringNode type is not \"text\": ${codeStringNode.type}`,\n\t\t\t\t)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tcodeStringNode.value = codeStringNode.value.trimEnd()\n\t\t})\n\t}\n}\n\nfunction removePreContainerDivs() {\n\treturn async function preContainerDivsTransformer(tree: HastRoot) {\n\t\tvisit(\n\t\t\ttree,\n\t\t\t{ type: 'element', tagName: 'pre' },\n\t\t\tfunction visitor(node, index, parent) {\n\t\t\t\tif (parent?.type !== 'element') return\n\t\t\t\tif (parent.tagName !== 'div') return\n\t\t\t\tif (parent.children.length !== 1 && index === 0) return\n\t\t\t\tObject.assign(parent, node)\n\t\t\t},\n\t\t)\n\t}\n}\n\nconst rehypePlugins = [\n\ttrimCodeBlocks,\n\tremarkCodeBlocksShiki,\n\tremovePreContainerDivs,\n] satisfies PluggableList\n\nconst verboseLog =\n\tprocess.env.EPICSHOP_VERBOSE_LOG === 'true' ? console.log : () => {}\n\nexport async function compileMdx(\n\tfile: string,\n\t{\n\t\trequest,\n\t\ttimings,\n\t\tforceFresh,\n\t}: {\n\t\trequest?: Request\n\t\ttimings?: Timings\n\t\tforceFresh?: boolean\n\t} = {},\n) {\n\tconst stat = await fs.promises\n\t\t.stat(file)\n\t\t.catch((error: unknown) => ({ error }))\n\tif ('error' in stat) {\n\t\tthrow new Error(`File stat cannot be read: ${stat.error}`)\n\t}\n\n\tconst key = `file:${file}`\n\tforceFresh = await shouldForceFresh({ forceFresh, request, key })\n\n\tconst existingCacheEntry = await compiledInstructionMarkdownCache.get(key)\n\tif (!forceFresh && existingCacheEntry) {\n\t\tconst compiledTime = existingCacheEntry.metadata.createdTime\n\t\tif (stat.mtimeMs <= compiledTime) {\n\t\t\treturn existingCacheEntry.value\n\t\t}\n\t}\n\n\treturn cachified({\n\t\tkey,\n\t\tcache: compiledInstructionMarkdownCache,\n\t\trequest,\n\t\ttimings,\n\t\tforceFresh,\n\t\tgetFreshValue: () => compileMdxImpl(file),\n\t})\n}\n\nasync function compileMdxImpl(file: string): Promise<{\n\tcode: string\n\ttitle: string | null\n\tepicVideoEmbeds: Array<string>\n}> {\n\tlet title: string | null = null\n\tconst epicVideoEmbeds: Array<string> = []\n\n\ttry {\n\t\tverboseLog(`Compiling ${file}`)\n\t\tconst bundleResult = await queuedBundleMDX({\n\t\t\tfile,\n\t\t\tcwd: path.dirname(file),\n\t\t\tmdxOptions(options) {\n\t\t\t\toptions.remarkPlugins = [\n\t\t\t\t\t...(options.remarkPlugins ?? []),\n\t\t\t\t\t[remarkAutolinkHeadings, { behavior: 'wrap' }],\n\t\t\t\t\tgfm,\n\t\t\t\t\t() => (tree: MdastRoot) => {\n\t\t\t\t\t\tvisit(tree, 'heading', (node) => {\n\t\t\t\t\t\t\tif (title) return\n\t\t\t\t\t\t\tif (node.depth === 1) {\n\t\t\t\t\t\t\t\tvisit(node, 'text', (textNode) => {\n\t\t\t\t\t\t\t\t\ttitle = textNode.value.trim()\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t\t\ttitle = title ? title.replace(/^\\d+\\. /, '').trim() : null\n\t\t\t\t\t},\n\t\t\t\t\t() => (tree: MdastRoot) => {\n\t\t\t\t\t\tvisit(tree, 'mdxJsxFlowElement', (jsxEl) => {\n\t\t\t\t\t\t\t// @ts-expect-error no idea why this started being an issue suddenly 🤷♂️\n\t\t\t\t\t\t\tif (jsxEl.name !== 'EpicVideo') return\n\t\t\t\t\t\t\t// @ts-expect-error no idea why this started being an issue suddenly 🤷♂️\n\t\t\t\t\t\t\tconst urlAttr = jsxEl.attributes.find(\n\t\t\t\t\t\t\t\t// @ts-expect-error no idea why this started being an issue suddenly 🤷♂️\n\t\t\t\t\t\t\t\t(a) => a.type === 'mdxJsxAttribute' && a.name === 'url',\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\tif (!urlAttr) return\n\t\t\t\t\t\t\tlet url = urlAttr.value\n\t\t\t\t\t\t\tif (typeof url !== 'string') return\n\t\t\t\t\t\t\tif (url.endsWith('/')) url = url.slice(0, -1)\n\t\t\t\t\t\t\tepicVideoEmbeds.push(url)\n\t\t\t\t\t\t})\n\t\t\t\t\t},\n\t\t\t\t\temoji,\n\t\t\t\t]\n\t\t\t\toptions.rehypePlugins = [\n\t\t\t\t\t...(options.rehypePlugins ?? []),\n\t\t\t\t\t...rehypePlugins,\n\t\t\t\t]\n\t\t\t\toptions.mdxExtensions = ['.mdx', '.md']\n\t\t\t\toptions.format = 'mdx'\n\t\t\t\toptions.development = false\n\t\t\t\treturn options\n\t\t\t},\n\t\t})\n\t\tif (!bundleResult) throw new Error(`Timeout for file: ${file}`)\n\n\t\tconst result = { code: bundleResult.code, title, epicVideoEmbeds }\n\t\treturn result\n\t} catch (error: unknown) {\n\t\tconsole.error(`Compilation error for file: `, file, error)\n\t\tthrow error\n\t} finally {\n\t\tverboseLog(`Successfully compiled ${file}`)\n\t}\n}\n\nexport async function compileMarkdownString(markdownString: string) {\n\treturn cachified({\n\t\tkey: markdownString,\n\t\tcache: compiledMarkdownCache,\n\t\tttl: 1000 * 60 * 60 * 24,\n\t\tgetFreshValue: async () => {\n\t\t\ttry {\n\t\t\t\tverboseLog(`Compiling string`, markdownString)\n\t\t\t\tconst result = await queuedBundleMDX({\n\t\t\t\t\tsource: markdownString,\n\t\t\t\t\tmdxOptions(options) {\n\t\t\t\t\t\toptions.rehypePlugins = [\n\t\t\t\t\t\t\t...(options.rehypePlugins ?? []),\n\t\t\t\t\t\t\t...rehypePlugins,\n\t\t\t\t\t\t]\n\t\t\t\t\t\toptions.development = false\n\t\t\t\t\t\treturn options\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t\tif (!result) throw new Error(`Timed out compiling markdown string`)\n\n\t\t\t\treturn result.code\n\t\t\t} catch (error: unknown) {\n\t\t\t\tconsole.error(`Compilation error for code: `, markdownString, error)\n\t\t\t\tthrow error\n\t\t\t} finally {\n\t\t\t\tverboseLog(`Successfully compiled string`, markdownString)\n\t\t\t}\n\t\t},\n\t})\n}\n\nlet _queue: PQueue | null = null\nasync function getQueue() {\n\tif (_queue) return _queue\n\n\t_queue = new PQueue({\n\t\tconcurrency: 1,\n\t\tthrowOnTimeout: true,\n\t\ttimeout: 1000 * 60,\n\t})\n\treturn _queue\n}\n\n// We have to use a queue because we can't run more than one of these at a time\n// or we'll hit an out of memory error because esbuild uses a lot of memory...\nasync function queuedBundleMDX(...args: Parameters<typeof bundleMDX>) {\n\tconst queue = await getQueue()\n\tconst result = await queue.add(() => bundleMDX(...args))\n\treturn result\n}\n\n// TODO: Fix these\n/*\neslint\n\t\"@typescript-eslint/no-unsafe-assignment\": \"off\",\n\t\"@typescript-eslint/no-unsafe-member-access\": \"off\",\n\t\"@typescript-eslint/no-unnecessary-condition\": \"off\",\n\t\"@typescript-eslint/no-unsafe-argument\": \"off\",\n*/\n"]}
|
|
1
|
+
{"version":3,"file":"compile-mdx.server.js","sourceRoot":"","sources":["../../src/compile-mdx.server.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from 'fs'\nimport path from 'path'\nimport { remarkCodeBlocksShiki } from '@kentcdodds/md-temp'\nimport { type Element, type Root as HastRoot } from 'hast'\nimport { type Root as MdastRoot } from 'mdast'\nimport { bundleMDX } from 'mdx-bundler'\nimport PQueue from 'p-queue'\nimport remarkAutolinkHeadings from 'remark-autolink-headings'\nimport emoji from 'remark-emoji'\nimport gfm from 'remark-gfm'\nimport { type PluggableList } from 'unified'\nimport { visit } from 'unist-util-visit'\nimport {\n\tcachified,\n\tcompiledInstructionMarkdownCache,\n\tcompiledMarkdownCache,\n\tshouldForceFresh,\n} from './cache.server.js'\nimport { type Timings } from './timing.server.js'\n\nfunction trimCodeBlocks() {\n\treturn async function transformer(tree: HastRoot) {\n\t\tvisit(tree, 'element', (preNode: Element) => {\n\t\t\tif (preNode.tagName !== 'pre' || !preNode.children.length) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst codeNode = preNode.children[0]\n\t\t\tif (\n\t\t\t\t!codeNode ||\n\t\t\t\tcodeNode.type !== 'element' ||\n\t\t\t\tcodeNode.tagName !== 'code'\n\t\t\t) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst [codeStringNode] = codeNode.children\n\t\t\tif (!codeStringNode) return\n\n\t\t\tif (codeStringNode.type !== 'text') {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`trimCodeBlocks: Unexpected: codeStringNode type is not \"text\": ${codeStringNode.type}`,\n\t\t\t\t)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tcodeStringNode.value = codeStringNode.value.trimEnd()\n\t\t})\n\t}\n}\n\nfunction removePreContainerDivs() {\n\treturn async function preContainerDivsTransformer(tree: HastRoot) {\n\t\tvisit(\n\t\t\ttree,\n\t\t\t{ type: 'element', tagName: 'pre' },\n\t\t\tfunction visitor(node, index, parent) {\n\t\t\t\tif (parent?.type !== 'element') return\n\t\t\t\tif (parent.tagName !== 'div') return\n\t\t\t\tif (parent.children.length !== 1 && index === 0) return\n\t\t\t\tObject.assign(parent, node)\n\t\t\t},\n\t\t)\n\t}\n}\n\nconst rehypePlugins = [\n\ttrimCodeBlocks,\n\tremarkCodeBlocksShiki,\n\tremovePreContainerDivs,\n] satisfies PluggableList\n\nconst verboseLog =\n\tprocess.env.EPICSHOP_VERBOSE_LOG === 'true' ? console.log : () => {}\n\nexport async function compileMdx(\n\tfile: string,\n\t{\n\t\trequest,\n\t\ttimings,\n\t\tforceFresh,\n\t}: {\n\t\trequest?: Request\n\t\ttimings?: Timings\n\t\tforceFresh?: boolean\n\t} = {},\n) {\n\tconst stat = await fs.promises\n\t\t.stat(file)\n\t\t.catch((error: unknown) => ({ error }))\n\tif ('error' in stat) {\n\t\tthrow new Error(`File stat cannot be read: ${stat.error}`)\n\t}\n\n\tconst key = `file:${file}`\n\tforceFresh = await shouldForceFresh({ forceFresh, request, key })\n\n\tconst existingCacheEntry = await compiledInstructionMarkdownCache.get(key)\n\tif (!forceFresh && existingCacheEntry) {\n\t\tforceFresh = stat.mtimeMs > existingCacheEntry.metadata.createdTime\n\t}\n\n\treturn cachified({\n\t\tkey,\n\t\tcache: compiledInstructionMarkdownCache,\n\t\trequest,\n\t\ttimings,\n\t\tforceFresh,\n\t\tgetFreshValue: () => compileMdxImpl(file),\n\t})\n}\n\nasync function compileMdxImpl(file: string): Promise<{\n\tcode: string\n\ttitle: string | null\n\tepicVideoEmbeds: Array<string>\n}> {\n\tlet title: string | null = null\n\tconst epicVideoEmbeds: Array<string> = []\n\n\ttry {\n\t\tverboseLog(`Compiling ${file}`)\n\t\tconst bundleResult = await queuedBundleMDX({\n\t\t\tfile,\n\t\t\tcwd: path.dirname(file),\n\t\t\tmdxOptions(options) {\n\t\t\t\toptions.remarkPlugins = [\n\t\t\t\t\t...(options.remarkPlugins ?? []),\n\t\t\t\t\t[remarkAutolinkHeadings, { behavior: 'wrap' }],\n\t\t\t\t\tgfm,\n\t\t\t\t\t() => (tree: MdastRoot) => {\n\t\t\t\t\t\tvisit(tree, 'heading', (node) => {\n\t\t\t\t\t\t\tif (title) return\n\t\t\t\t\t\t\tif (node.depth === 1) {\n\t\t\t\t\t\t\t\tvisit(node, 'text', (textNode) => {\n\t\t\t\t\t\t\t\t\ttitle = textNode.value.trim()\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t\t\ttitle = title ? title.replace(/^\\d+\\. /, '').trim() : null\n\t\t\t\t\t},\n\t\t\t\t\t() => (tree: MdastRoot) => {\n\t\t\t\t\t\tvisit(tree, 'mdxJsxFlowElement', (jsxEl) => {\n\t\t\t\t\t\t\t// @ts-expect-error no idea why this started being an issue suddenly 🤷♂️\n\t\t\t\t\t\t\tif (jsxEl.name !== 'EpicVideo') return\n\t\t\t\t\t\t\t// @ts-expect-error no idea why this started being an issue suddenly 🤷♂️\n\t\t\t\t\t\t\tconst urlAttr = jsxEl.attributes.find(\n\t\t\t\t\t\t\t\t// @ts-expect-error no idea why this started being an issue suddenly 🤷♂️\n\t\t\t\t\t\t\t\t(a) => a.type === 'mdxJsxAttribute' && a.name === 'url',\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\tif (!urlAttr) return\n\t\t\t\t\t\t\tlet url = urlAttr.value\n\t\t\t\t\t\t\tif (typeof url !== 'string') return\n\t\t\t\t\t\t\tif (url.endsWith('/')) url = url.slice(0, -1)\n\t\t\t\t\t\t\tepicVideoEmbeds.push(url)\n\t\t\t\t\t\t})\n\t\t\t\t\t},\n\t\t\t\t\temoji,\n\t\t\t\t]\n\t\t\t\toptions.rehypePlugins = [\n\t\t\t\t\t...(options.rehypePlugins ?? []),\n\t\t\t\t\t...rehypePlugins,\n\t\t\t\t]\n\t\t\t\toptions.mdxExtensions = ['.mdx', '.md']\n\t\t\t\toptions.format = 'mdx'\n\t\t\t\toptions.development = false\n\t\t\t\treturn options\n\t\t\t},\n\t\t})\n\t\tif (!bundleResult) throw new Error(`Timeout for file: ${file}`)\n\n\t\tconst result = { code: bundleResult.code, title, epicVideoEmbeds }\n\t\treturn result\n\t} catch (error: unknown) {\n\t\tconsole.error(`Compilation error for file: `, file, error)\n\t\tthrow error\n\t} finally {\n\t\tverboseLog(`Successfully compiled ${file}`)\n\t}\n}\n\nexport async function compileMarkdownString(markdownString: string) {\n\treturn cachified({\n\t\tkey: markdownString,\n\t\tcache: compiledMarkdownCache,\n\t\tttl: 1000 * 60 * 60 * 24,\n\t\tgetFreshValue: async () => {\n\t\t\ttry {\n\t\t\t\tverboseLog(`Compiling string`, markdownString)\n\t\t\t\tconst result = await queuedBundleMDX({\n\t\t\t\t\tsource: markdownString,\n\t\t\t\t\tmdxOptions(options) {\n\t\t\t\t\t\toptions.rehypePlugins = [\n\t\t\t\t\t\t\t...(options.rehypePlugins ?? []),\n\t\t\t\t\t\t\t...rehypePlugins,\n\t\t\t\t\t\t]\n\t\t\t\t\t\toptions.development = false\n\t\t\t\t\t\treturn options\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t\tif (!result) throw new Error(`Timed out compiling markdown string`)\n\n\t\t\t\treturn result.code\n\t\t\t} catch (error: unknown) {\n\t\t\t\tconsole.error(`Compilation error for code: `, markdownString, error)\n\t\t\t\tthrow error\n\t\t\t} finally {\n\t\t\t\tverboseLog(`Successfully compiled string`, markdownString)\n\t\t\t}\n\t\t},\n\t})\n}\n\nlet _queue: PQueue | null = null\nasync function getQueue() {\n\tif (_queue) return _queue\n\n\t_queue = new PQueue({\n\t\tconcurrency: 1,\n\t\tthrowOnTimeout: true,\n\t\ttimeout: 1000 * 60,\n\t})\n\treturn _queue\n}\n\n// We have to use a queue because we can't run more than one of these at a time\n// or we'll hit an out of memory error because esbuild uses a lot of memory...\nasync function queuedBundleMDX(...args: Parameters<typeof bundleMDX>) {\n\tconst queue = await getQueue()\n\tconst result = await queue.add(() => bundleMDX(...args))\n\treturn result\n}\n\n// TODO: Fix these\n/*\neslint\n\t\"@typescript-eslint/no-unsafe-assignment\": \"off\",\n\t\"@typescript-eslint/no-unsafe-member-access\": \"off\",\n\t\"@typescript-eslint/no-unnecessary-condition\": \"off\",\n\t\"@typescript-eslint/no-unsafe-argument\": \"off\",\n*/\n"]}
|
|
@@ -7,14 +7,14 @@ export declare const StackBlitzConfigSchema: z.ZodObject<{
|
|
|
7
7
|
file: z.ZodOptional<z.ZodString>;
|
|
8
8
|
}, "strip", z.ZodTypeAny, {
|
|
9
9
|
title?: string | undefined;
|
|
10
|
-
file?: string | undefined;
|
|
11
10
|
startScript?: string | undefined;
|
|
12
11
|
view?: "editor" | "preview" | "both" | undefined;
|
|
12
|
+
file?: string | undefined;
|
|
13
13
|
}, {
|
|
14
14
|
title?: string | undefined;
|
|
15
|
-
file?: string | undefined;
|
|
16
15
|
startScript?: string | undefined;
|
|
17
16
|
view?: "editor" | "preview" | "both" | undefined;
|
|
17
|
+
file?: string | undefined;
|
|
18
18
|
}>;
|
|
19
19
|
declare const WorkshopConfigSchema: z.ZodEffects<z.ZodObject<{
|
|
20
20
|
title: z.ZodString;
|
|
@@ -72,14 +72,14 @@ declare const WorkshopConfigSchema: z.ZodEffects<z.ZodObject<{
|
|
|
72
72
|
file: z.ZodOptional<z.ZodString>;
|
|
73
73
|
}, "strip", z.ZodTypeAny, {
|
|
74
74
|
title?: string | undefined;
|
|
75
|
-
file?: string | undefined;
|
|
76
75
|
startScript?: string | undefined;
|
|
77
76
|
view?: "editor" | "preview" | "both" | undefined;
|
|
77
|
+
file?: string | undefined;
|
|
78
78
|
}, {
|
|
79
79
|
title?: string | undefined;
|
|
80
|
-
file?: string | undefined;
|
|
81
80
|
startScript?: string | undefined;
|
|
82
81
|
view?: "editor" | "preview" | "both" | undefined;
|
|
82
|
+
file?: string | undefined;
|
|
83
83
|
}>>;
|
|
84
84
|
forms: z.ZodDefault<z.ZodObject<{
|
|
85
85
|
workshop: z.ZodDefault<z.ZodString>;
|
|
@@ -139,9 +139,9 @@ declare const WorkshopConfigSchema: z.ZodEffects<z.ZodObject<{
|
|
|
139
139
|
epicWorkshopSlug?: string | undefined;
|
|
140
140
|
stackBlitzConfig?: {
|
|
141
141
|
title?: string | undefined;
|
|
142
|
-
file?: string | undefined;
|
|
143
142
|
startScript?: string | undefined;
|
|
144
143
|
view?: "editor" | "preview" | "both" | undefined;
|
|
144
|
+
file?: string | undefined;
|
|
145
145
|
} | undefined;
|
|
146
146
|
scripts?: {
|
|
147
147
|
postupdate?: string | undefined;
|
|
@@ -172,9 +172,9 @@ declare const WorkshopConfigSchema: z.ZodEffects<z.ZodObject<{
|
|
|
172
172
|
onboardingVideo?: string | undefined;
|
|
173
173
|
stackBlitzConfig?: {
|
|
174
174
|
title?: string | undefined;
|
|
175
|
-
file?: string | undefined;
|
|
176
175
|
startScript?: string | undefined;
|
|
177
176
|
view?: "editor" | "preview" | "both" | undefined;
|
|
177
|
+
file?: string | undefined;
|
|
178
178
|
} | undefined;
|
|
179
179
|
forms?: {
|
|
180
180
|
workshop?: string | undefined;
|
|
@@ -219,9 +219,9 @@ declare const WorkshopConfigSchema: z.ZodEffects<z.ZodObject<{
|
|
|
219
219
|
epicWorkshopSlug?: string | undefined;
|
|
220
220
|
stackBlitzConfig?: {
|
|
221
221
|
title?: string | undefined;
|
|
222
|
-
file?: string | undefined;
|
|
223
222
|
startScript?: string | undefined;
|
|
224
223
|
view?: "editor" | "preview" | "both" | undefined;
|
|
224
|
+
file?: string | undefined;
|
|
225
225
|
} | undefined;
|
|
226
226
|
scripts?: {
|
|
227
227
|
postupdate?: string | undefined;
|
|
@@ -252,9 +252,9 @@ declare const WorkshopConfigSchema: z.ZodEffects<z.ZodObject<{
|
|
|
252
252
|
onboardingVideo?: string | undefined;
|
|
253
253
|
stackBlitzConfig?: {
|
|
254
254
|
title?: string | undefined;
|
|
255
|
-
file?: string | undefined;
|
|
256
255
|
startScript?: string | undefined;
|
|
257
256
|
view?: "editor" | "preview" | "both" | undefined;
|
|
257
|
+
file?: string | undefined;
|
|
258
258
|
} | undefined;
|
|
259
259
|
forms?: {
|
|
260
260
|
workshop?: string | undefined;
|
|
@@ -279,9 +279,9 @@ export declare function getAppConfig(fullPath: string): Promise<{
|
|
|
279
279
|
initialRoute: string;
|
|
280
280
|
stackBlitzConfig: {
|
|
281
281
|
title?: string | undefined;
|
|
282
|
-
file?: string | undefined;
|
|
283
282
|
startScript?: string | undefined;
|
|
284
283
|
view?: "editor" | "preview" | "both" | undefined;
|
|
284
|
+
file?: string | undefined;
|
|
285
285
|
} | null;
|
|
286
286
|
testTab: {
|
|
287
287
|
enabled: boolean;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@epic-web/workshop-utils",
|
|
3
|
-
"version": "5.0.
|
|
3
|
+
"version": "5.0.1",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public"
|
|
6
6
|
},
|
|
@@ -160,7 +160,7 @@
|
|
|
160
160
|
"chai": "^5.1.1",
|
|
161
161
|
"chai-dom": "^1.12.0",
|
|
162
162
|
"chalk": "^5.3.0",
|
|
163
|
-
"chokidar": "^
|
|
163
|
+
"chokidar": "^4.0.1",
|
|
164
164
|
"close-with-grace": "^1.3.0",
|
|
165
165
|
"cross-spawn": "^7.0.3",
|
|
166
166
|
"execa": "^9.1.0",
|