From 8bd79ca1effa2ffb9e5dcdfefbdbf6317474459d Mon Sep 17 00:00:00 2001 From: Pooya Parsa Date: Thu, 14 Mar 2024 16:31:22 +0100 Subject: [PATCH 1/2] fix: generate safe imports object using `knitwork` --- package.json | 1 + pnpm-lock.yaml | 7 +++++++ src/plugin/runtime.ts | 35 ++++++++++++++++++++++++----------- 3 files changed, 32 insertions(+), 11 deletions(-) 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..34b6aee 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,37 @@ 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("\`${importName}[${genString(name)}]\` is not provided!")}`, + ]), + ); } - code += "};\n"; + const code = `${imports.join("\n")};\n\nconst _imports = ${genObjectFromRaw(importsObject)}`; + + console.log(code); return { code, From 2b6fc7ac6b785f695fad09bcc7d108b807275a5e Mon Sep 17 00:00:00 2001 From: Pooya Parsa Date: Thu, 14 Mar 2024 16:38:53 +0100 Subject: [PATCH 2/2] remove log and semi --- src/plugin/runtime.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/plugin/runtime.ts b/src/plugin/runtime.ts index 34b6aee..f86e66c 100644 --- a/src/plugin/runtime.ts +++ b/src/plugin/runtime.ts @@ -215,14 +215,12 @@ export async function getWasmImports( name, pkgImport ? `${importName}[${genString(name)}]` - : `() => { throw new Error("\`${importName}[${genString(name)}]\` is not provided!")}`, + : `() => { throw new Error(${genString(moduleName + "." + importName)} + " is not provided!")}`, ]), ); } - const code = `${imports.join("\n")};\n\nconst _imports = ${genObjectFromRaw(importsObject)}`; - - console.log(code); + const code = `${imports.join("\n")}\n\nconst _imports = ${genObjectFromRaw(importsObject)}`; return { code,