Skip to content

Commit a79f392

Browse files
authored
fix: improve CJS Interoperability (#50)
1 parent f9718b9 commit a79f392

File tree

2 files changed

+46
-18
lines changed

2 files changed

+46
-18
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
"format": "prettier --write '**/*.{mjs,cjs,js,mts,cts,ts}'",
3434
"pretest": "yarn --cwd e2e && playwright install firefox"
3535
},
36+
"packageManager": "[email protected]",
3637
"devDependencies": {
3738
"@babel/core": "^7.23.5",
3839
"@babel/preset-env": "^7.23.5",

src/wasm-parser.ts

Lines changed: 45 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -35,22 +35,49 @@ export async function generateGlueCode(
3535
names: { initWasm: string; wasmUrl: string }
3636
): Promise<string> {
3737
const { imports, exports } = await parseWasm(wasmFilePath);
38-
return `
39-
${imports
40-
.map(
41-
({ from, names }, i) =>
42-
`import { ${names.map((name, j) => `${name} as __vite__wasmImport_${i}_${j}`).join(", ")} } from ${JSON.stringify(
43-
from
44-
)};`
45-
)
46-
.join("\n")}
47-
const __vite__wasmModule = await ${names.initWasm}({ ${imports
48-
.map(
49-
({ from, names }, i) =>
50-
`${JSON.stringify(from)}: { ${names.map((name, j) => `${name}: __vite__wasmImport_${i}_${j}`).join(", ")} }`
51-
)
52-
.join(", ")} }, ${names.wasmUrl});
53-
${exports
54-
.map(name => `export ${name === "default" ? "default" : `const ${name} =`} __vite__wasmModule.${name};`)
55-
.join("\n")}`;
38+
39+
const importStatements = imports.map(({ from }, i) => {
40+
return `import * as __vite__wasmImport_${i} from ${JSON.stringify(from)};`;
41+
});
42+
43+
const importObject = imports.map(({ from, names }, i) => {
44+
return {
45+
key: JSON.stringify(from),
46+
value: names.map(name => {
47+
return {
48+
key: JSON.stringify(name),
49+
value: `__vite__wasmImport_${i}[${JSON.stringify(name)}]`
50+
};
51+
})
52+
};
53+
});
54+
55+
const initCode = `const __vite__wasmModule = await ${names.initWasm}(${codegenSimpleObject(importObject)}, ${
56+
names.wasmUrl
57+
});`;
58+
59+
const exportsStatements = exports.map(name => {
60+
return `export ${name === "default" ? "default" : `const ${name} =`} __vite__wasmModule.${name};`;
61+
});
62+
63+
return [...importStatements, initCode, ...exportsStatements].join("\n");
64+
}
65+
66+
type SimpleObject = SimpleObjectKeyValue[];
67+
68+
interface SimpleObjectKeyValue {
69+
key: string;
70+
value: string | SimpleObject;
71+
}
72+
73+
function codegenSimpleObject(obj: SimpleObject): string {
74+
return `{ ${codegenSimpleObjectKeyValue(obj)} }`;
75+
}
76+
77+
function codegenSimpleObjectKeyValue(obj: SimpleObject): string {
78+
return obj
79+
.map(({ key, value }) => {
80+
return `${key}: ${typeof value === "string" ? value : codegenSimpleObject(value)}`;
81+
})
82+
.join(",\n");
5683
}

0 commit comments

Comments
 (0)