diff --git a/package.json b/package.json index c1ddfcd..34586a4 100644 --- a/package.json +++ b/package.json @@ -48,6 +48,7 @@ "test:types": "tsc --noEmit --skipLibCheck" }, "dependencies": { + "knitwork": "^1.0.0", "magic-string": "^0.30.8", "mlly": "^1.6.1", "pathe": "^1.1.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9d1c4d2..b3cfe50 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,6 +5,9 @@ settings: excludeLinksFromLockfile: false dependencies: + knitwork: + specifier: ^1.0.0 + version: 1.0.0 magic-string: specifier: ^0.30.8 version: 0.30.8 @@ -3496,6 +3499,10 @@ packages: json-buffer: 3.0.1 dev: true + /knitwork@1.0.0: + resolution: {integrity: sha512-dWl0Dbjm6Xm+kDxhPQJsCBTxrJzuGl0aP9rhr+TG8D3l+GL90N8O8lYUi7dTSAN2uuDqCtNgb6aEuQH5wsiV8Q==} + dev: false + /levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} diff --git a/src/plugin/runtime.ts b/src/plugin/runtime.ts index 5cad162..f86e66c 100644 --- a/src/plugin/runtime.ts +++ b/src/plugin/runtime.ts @@ -1,4 +1,10 @@ import { readPackageJSON } from "pkg-types"; +import { + genSafeVariableName, + genObjectFromRaw, + genString, + genImport, +} from "knitwork"; import { UMWASM_HELPERS_ID, UNWASM_EXTERNAL_PREFIX, @@ -186,30 +192,35 @@ export async function getWasmImports( // Try to resolve from nearest package.json const pkgJSON = await readPackageJSON(asset.id); - let code = "const _imports = {"; - let resolved = true; + const imports: string[] = []; + const importsObject: Record> = {}; + for (const moduleName of importNames) { const importNames = asset.imports[moduleName]; const pkgImport = pkgJSON.imports?.[moduleName] || pkgJSON.imports?.[`#${moduleName}`]; + const importName = "_imports_" + genSafeVariableName(moduleName); + if (pkgImport) { - code = `import * as _imports_${moduleName} from "${pkgImport}";\n${code}`; + imports.push(genImport(pkgImport, { name: "*", as: importName })); } else { resolved = false; } - code += `\n ${moduleName}: {`; - for (const name of importNames) { - code += pkgImport - ? `\n ${name}: _imports_${moduleName}.${name},\n` - : `\n ${name}: () => { throw new Error("\`${moduleName}.${name}\` is not provided!")},\n`; - } - code += " },\n"; + + importsObject[moduleName] = Object.fromEntries( + importNames.map((name) => [ + name, + pkgImport + ? `${importName}[${genString(name)}]` + : `() => { throw new Error(${genString(moduleName + "." + importName)} + " is not provided!")}`, + ]), + ); } - code += "};\n"; + const code = `${imports.join("\n")}\n\nconst _imports = ${genObjectFromRaw(importsObject)}`; return { code,