75 lines
1.9 KiB
JavaScript
75 lines
1.9 KiB
JavaScript
import { parse } from "acorn";
|
|
import { generate } from "astring";
|
|
import fs from "fs/promises";
|
|
import pako from "pako";
|
|
|
|
(async function () {
|
|
const packageObject = JSON.parse(
|
|
await fs.readFile("pkg/package.json", { encoding: "utf-8" })
|
|
);
|
|
const wasmPath = packageObject.files.find((file) => file.endsWith(".wasm"));
|
|
const wasm = await fs.readFile(`pkg/${wasmPath}`);
|
|
|
|
const deflated = Buffer.from(pako.deflate(wasm));
|
|
const wasmBase64 = deflated.toString("base64");
|
|
|
|
const init = `export async function init(inflate) {
|
|
const encoded = '${wasmBase64}';
|
|
|
|
let bytes;
|
|
|
|
if (typeof atob === 'function') {
|
|
const binary = atob(encoded);
|
|
bytes = new Uint8Array(binary.length);
|
|
|
|
for (let i = 0; i < binary.length; i++) {
|
|
bytes[i] = binary.charCodeAt(i);
|
|
}
|
|
} else if (typeof Buffer === 'function') {
|
|
bytes = Buffer.from(encoded, 'base64');
|
|
} else {
|
|
throw new Error('Unsupported platform');
|
|
}
|
|
|
|
const imports = getImports();
|
|
initMemory(imports);
|
|
|
|
bytes = inflate(bytes);
|
|
|
|
const { instance, module } = await WebAssembly.instantiate(bytes, imports);
|
|
return finalizeInit(instance, module);
|
|
}
|
|
|
|
export default init;`;
|
|
|
|
const generatedSource = await fs.readFile(`pkg/${packageObject.module}`, {
|
|
encoding: "utf-8",
|
|
});
|
|
|
|
const ast = parse(generatedSource, {
|
|
ecmaVersion: "latest",
|
|
sourceType: "module",
|
|
});
|
|
|
|
let body = ast.body.filter((v) => {
|
|
switch (v.type) {
|
|
case "FunctionDeclaration":
|
|
// we don't use these functions so we strip them out
|
|
return !["load", "init", "initSync"].includes(v.id.name);
|
|
case "ExportDefaultDeclaration":
|
|
// we will provide our own default export
|
|
return false;
|
|
default:
|
|
return true;
|
|
}
|
|
});
|
|
|
|
body.pop(); // removes `export { initSync }`
|
|
|
|
const source = generate({
|
|
...ast,
|
|
body,
|
|
});
|
|
|
|
await fs.writeFile("wasm.js", source + init);
|
|
})();
|