-
Notifications
You must be signed in to change notification settings - Fork 43
/
modules.ts
57 lines (54 loc) · 1.6 KB
/
modules.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import type * as core from "@previewjs/core";
import type * as vfs from "@previewjs/vfs";
import execa from "execa";
import fs from "fs";
import path from "path";
export async function loadModules({
installDir,
packageName,
}: {
installDir: string;
packageName: string;
}) {
if (
fs.existsSync(path.join(installDir, "pnpm")) &&
!fs.existsSync(path.join(installDir, "node_modules"))
) {
const pnpmProcess = execa.command(
`cd "${installDir}" && node pnpm/bin/pnpm.cjs install --frozen-lockfile`,
{
shell: true,
}
);
pnpmProcess.stdout?.on("data", (chunk) => process.stdout.write(chunk));
pnpmProcess.stderr?.on("data", (chunk) => process.stderr.write(chunk));
await pnpmProcess;
}
const coreModule = requireModule("@previewjs/core") as typeof core;
const vfsModule = requireModule("@previewjs/vfs") as typeof vfs;
const setupEnvironment: core.SetupPreviewEnvironment =
requireModule(packageName);
const frameworkPluginFactories: core.FrameworkPluginFactory[] = [
requireModule("@previewjs/plugin-react"),
requireModule("@previewjs/plugin-solid"),
requireModule("@previewjs/plugin-svelte"),
requireModule("@previewjs/plugin-vue2"),
requireModule("@previewjs/plugin-vue3"),
];
function requireModule(name: string) {
try {
return require(require.resolve(name, {
paths: [installDir],
}));
} catch (e) {
console.error(`Unable to load ${name} from ${installDir}`, e);
throw e;
}
}
return {
core: coreModule,
vfs: vfsModule,
setupEnvironment,
frameworkPluginFactories,
};
}