-
Notifications
You must be signed in to change notification settings - Fork 3
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
6d6d5ba
commit fb2a04d
Showing
2 changed files
with
68 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,67 @@ | ||
// This JS script is needed to compile the TS code. | ||
|
||
import * as esbuild from 'esbuild'; | ||
import path from 'node:path'; | ||
import fs from 'node:fs'; | ||
|
||
let wasmPlugin = { | ||
name: 'wasm', | ||
setup(build) { | ||
// Resolve ".wasm" files to a path with a namespace | ||
build.onResolve({ filter: /\.wasm$/ }, args => { | ||
// If this is the import inside the stub module, import the | ||
// binary itself. Put the path in the "wasm-binary" namespace | ||
// to tell our binary load callback to load the binary file. | ||
if (args.namespace === 'wasm-stub') { | ||
return { | ||
path: args.path, | ||
namespace: 'wasm-binary', | ||
}; | ||
} | ||
|
||
// Otherwise, generate the JavaScript stub module for this | ||
// ".wasm" file. Put it in the "wasm-stub" namespace to tell | ||
// our stub load callback to fill it with JavaScript. | ||
// | ||
// Resolve relative paths to absolute paths here since this | ||
// resolve callback is given "resolveDir", the directory to | ||
// resolve imports against. | ||
if (args.resolveDir === '') { | ||
return; // Ignore unresolvable paths | ||
} | ||
return { | ||
path: path.isAbsolute(args.path) ? args.path : path.join(args.resolveDir, args.path), | ||
namespace: 'wasm-stub', | ||
}; | ||
}); | ||
|
||
// Virtual modules in the "wasm-stub" namespace are filled with | ||
// the JavaScript code for compiling the WebAssembly binary. The | ||
// binary itself is imported from a second virtual module. | ||
build.onLoad({ filter: /.*/, namespace: 'wasm-stub' }, async (args) => ({ | ||
contents: `import wasm from ${JSON.stringify(args.path)} | ||
export default (imports) => | ||
WebAssembly.instantiate(wasm, imports).then( | ||
result => result.instance.exports)`, | ||
})); | ||
|
||
// Virtual modules in the "wasm-binary" namespace contain the | ||
// actual bytes of the WebAssembly file. This uses esbuild's | ||
// built-in "binary" loader instead of manually embedding the | ||
// binary data inside JavaScript code ourselves. | ||
build.onLoad({ filter: /.*/, namespace: 'wasm-binary' }, async (args) => ({ | ||
contents: await fs.promises.readFile(args.path), | ||
loader: 'binary', | ||
})); | ||
}, | ||
}; | ||
|
||
await esbuild.build({ | ||
entryPoints: ['./src/extension.js'], | ||
bundle: true, | ||
outfile: 'out/extension.js', | ||
plugins: [wasmPlugin], | ||
external: ['vscode'], | ||
format: 'cjs', | ||
platform: 'node' | ||
}); |