import rust from "@wasm-tool/rollup-plugin-rust";
import resolve from "@rollup/plugin-node-resolve";
import commonjs from "@rollup/plugin-commonjs";
import copy from "rollup-plugin-copy";
const devMode = process.env.MIDEN_WEB_DEV === "true";
const cargoArgsUseDebugSymbols = ["--config", "profile.release.debug='full'"];
const cargoArgsLineTablesDebug = [
"--config",
"profile.release.debug='line-tables-only'",
"--config",
"profile.release.strip='none'",
];
const wasmOptArgs = [
"--strip-dwarf",
devMode ? "-O0" : "-O3",
"--enable-bulk-memory",
"--enable-nontrapping-float-to-int",
"--debuginfo",
];
const baseCargoArgs = [
"--features",
"testing",
"--config",
`build.rustflags=["-C", "target-feature=+atomics,+bulk-memory,+mutable-globals", "-C", "link-arg=--max-memory=4294967296", "-C", "panic=abort"]`,
"--no-default-features",
...cargoArgsLineTablesDebug,
].concat(devMode ? cargoArgsUseDebugSymbols : []);
export default [
{
input: ["./js/wasm.js", "./js/index.js"],
output: {
dir: `dist`,
format: "es",
sourcemap: true,
assetFileNames: "assets/[name][extname]",
},
plugins: [
rust({
verbose: true,
extraArgs: {
cargo: [...baseCargoArgs],
wasmOpt: wasmOptArgs,
wasmBindgen: ["--keep-debug"],
},
experimental: {
typescriptDeclarationDir: "dist/crates",
},
optimize: { release: true, rustc: !devMode },
}),
resolve(),
commonjs(),
{
name: "remove-wasm-tla",
generateBundle(_, bundle) {
for (const [name, chunk] of Object.entries(bundle)) {
if (chunk.type !== "chunk" || !chunk.code) continue;
if (!chunk.code.includes("__wbg_init")) continue;
const before = chunk.code.length;
chunk.code = chunk.code.replace(
/\n\s*await __wbg_init\([^)]*\);\s*\n/g,
"\n"
);
if (chunk.code.length !== before) {
if (
!chunk.code.includes("__wbg_init,") &&
!chunk.code.includes(", __wbg_init")
) {
chunk.code = chunk.code.replace(
/export \{([^}]+)\};(\s*)$/m,
"export { $1, __wbg_init, module$$1 as __wasm_url };$2"
);
}
console.log(`[remove-wasm-tla] Stripped TLA from ${name}`);
}
}
},
},
],
},
{
input: "./js/workers/web-client-methods-worker.js",
output: {
dir: `dist/workers`,
format: "es",
sourcemap: true,
inlineDynamicImports: true,
},
plugins: [
resolve(),
commonjs(),
copy({
targets: [
{ src: "dist/assets/*.wasm", dest: "dist/workers/assets" },
],
verbose: true,
}),
{
name: "wrap-worker-classic",
generateBundle(_, bundle) {
for (const [, chunk] of Object.entries(bundle)) {
if (chunk.type !== "chunk" || !chunk.code) continue;
chunk.code = chunk.code.replace(
/import\.meta\.url/g,
"self.location.href"
);
chunk.code = chunk.code.replace(/import\.meta\.env/g, "undefined");
chunk.code = chunk.code.replace(/^export\s*\{[^}]*\};?\s*$/gm, "");
chunk.code = chunk.code.replace(
/^export\s+default\s+/gm,
"var _default = "
);
chunk.code = chunk.code.replace(
/^export\s+(const|let|var|function|class|async)\s/gm,
"$1 "
);
chunk.code = "(async function() {\n" + chunk.code + "\n})();";
}
},
},
],
},
{
input: "./js/workers/web-client-methods-worker.js",
output: {
dir: `dist/workers`,
format: "es",
sourcemap: true,
entryFileNames: "[name].module.js",
},
plugins: [resolve(), commonjs()],
},
];