-
Notifications
You must be signed in to change notification settings - Fork 289
Expand file tree
/
Copy pathscript.ts
More file actions
131 lines (112 loc) · 2.97 KB
/
script.ts
File metadata and controls
131 lines (112 loc) · 2.97 KB
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
const child_process = require("child_process");
const spawn = child_process.spawn;
child_process.spawn = function (...args: any[]) {
if (args[0]?.includes("app.asar")) {
args[0] = args[0].replace("app.asar", "app.asar.unpacked");
}
return spawn.apply(this, args);
};
const esbuild = require("esbuild");
const replaceImportMetaDirname = {
name: "replaceImportMetaDirname",
setup(build) {
build.onLoad({ filter: /.*/ }, async (args) => {
const source = await require("fs").promises.readFile(args.path, "utf8");
const transformedSource = source.replace(/import\.meta\.dirname/g, "__dirname");
return {
loader: "default",
contents: transformedSource,
};
});
},
};
async function compile(srcAbsolutePath: string, outputAbsolutePath: string) {
const buildOptions = {
entryPoints: [srcAbsolutePath],
bundle: true,
platform: "node",
target: "node20",
format: "cjs",
outfile: outputAbsolutePath,
treeShaking: false,
loader: {
".ts": "ts",
".node": "file",
},
external: ["sharp", "electron", "@recast-navigation/core", "@recast-navigation/generators", "@babylonjs/addons"],
keepNames: true,
plugins: [replaceImportMetaDirname],
};
try {
await esbuild.build(buildOptions);
postMessage({
success: true,
});
} catch (e) {
postMessage({
success: false,
error: e.toString(),
});
}
}
function extract(outputAbsolutePath: string) {
let inspectorProperties: any = null;
try {
const output = require(outputAbsolutePath) as any;
if (output.default) {
inspectorProperties = output.default?._VisibleInInspector ?? null;
try {
function createMock(recorder = {}) {
return new Proxy(function () {}, {
get(_target, prop) {
if (!(prop in recorder)) {
recorder[prop] = createMock({});
}
return recorder[prop];
},
set(_target, prop, value) {
recorder[prop] = value;
return true;
},
apply() {
return createMock({});
},
construct() {
return createMock({});
},
});
}
const mock = createMock();
const instance = new output.default(mock);
inspectorProperties?.forEach((value) => {
const defaultValue = instance[value.propertyKey];
value.defaultValue = defaultValue?.asArray?.() ?? defaultValue;
});
} catch (e) {
// Catch silently.
}
} else if (output.config) {
const keys = Object.keys(output.config);
inspectorProperties = keys.map((key) => {
const property = output.config[key];
property.propertyKey = key;
property.defaultValue = property.value?.asArray?.() ?? property.value;
delete property.value;
return property;
});
}
} catch (e) {
// Catch silently.
}
postMessage(inspectorProperties);
}
addEventListener("message", async (event) => {
switch (event.data.action) {
case "compile":
await compile(event.data.srcAbsolutePath, event.data.outputAbsolutePath);
break;
case "extract":
extract(event.data.outputAbsolutePath);
break;
}
});