-
-
Notifications
You must be signed in to change notification settings - Fork 1.1k
/
generatePnpScript.ts
72 lines (60 loc) Β· 2.19 KB
/
generatePnpScript.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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
import {Filename} from '@yarnpkg/fslib';
import {generatePrettyJson} from './generatePrettyJson';
import {generateSerializedState} from './generateSerializedState';
import getTemplate from './hook';
import {SerializedState} from './types';
import {PnpSettings} from './types';
export function generateLoader(shebang: string | null | undefined, loader: string) {
return [
shebang ? `${shebang}\n` : ``,
`/* eslint-disable */\n`,
`// @ts-nocheck\n`,
`"use strict";\n`,
`\n`,
loader,
`\n`,
getTemplate(),
].join(``);
}
function generateJsonString(data: SerializedState) {
return JSON.stringify(data, null, 2);
}
function generateStringLiteral(value: string) {
return `'${
value
.replace(/\\/g, `\\\\`)
.replace(/'/g, `\\'`)
.replace(/\n/g, `\\\n`)
}'`;
}
function generateInlinedSetup(data: SerializedState) {
return [
`const RAW_RUNTIME_STATE =\n`,
`${generateStringLiteral(generatePrettyJson(data))};\n\n`,
`function $$SETUP_STATE(hydrateRuntimeState, basePath) {\n`,
` return hydrateRuntimeState(JSON.parse(RAW_RUNTIME_STATE), {basePath: basePath || __dirname});\n`,
`}\n`,
].join(``);
}
function generateSplitSetup() {
return [
`function $$SETUP_STATE(hydrateRuntimeState, basePath) {\n`,
` const fs = require('fs');\n`,
` const path = require('path');\n`,
` const pnpDataFilepath = path.resolve(__dirname, ${JSON.stringify(Filename.pnpData)});\n`,
` return hydrateRuntimeState(JSON.parse(fs.readFileSync(pnpDataFilepath, 'utf8')), {basePath: basePath || __dirname});\n`,
`}\n`,
].join(``);
}
export function generateInlinedScript(settings: PnpSettings): string {
const data = generateSerializedState(settings);
const setup = generateInlinedSetup(data);
const loaderFile = generateLoader(settings.shebang, setup);
return loaderFile;
}
export function generateSplitScript(settings: PnpSettings): {dataFile: string, loaderFile: string} {
const data = generateSerializedState(settings);
const setup = generateSplitSetup();
const loaderFile = generateLoader(settings.shebang, setup);
return {dataFile: generateJsonString(data), loaderFile};
}