-
-
Notifications
You must be signed in to change notification settings - Fork 6.5k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat: support WebAssembly (Wasm) imports in ESM modules #13505
Merged
Merged
Changes from 23 commits
Commits
Show all changes
27 commits
Select commit
Hold shift + click to select a range
95ef976
Add failing test
kachkaev 645db88
Update `jest-runtime` to fix tests
kachkaev 9985179
Support data:application/wasm imports
kachkaev 5d73f9a
Run tests twice (with and without --experimental-wasm-modules)
kachkaev bc6d38c
Merge remote-tracking branch 'u/main' into native-esm-wasm
kachkaev 734bbc5
Cover more rows
kachkaev 612d480
Add CHANGELOG entry
kachkaev dcff11e
Simplify tests
kachkaev e524e40
Improve `path.endsWith`
kachkaev 08c8906
Delete unused file
kachkaev 66c8312
Make changelog phrase more explicit
kachkaev 6586a24
Fix Wasm casing
kachkaev 01f8d78
Update CHANGELOG.md
kachkaev 27d73b6
Mention Wasm in docs
kachkaev 2aea674
Merge remote-tracking branch 'origin/main' into native-esm-wasm
kachkaev 79e0f40
Use Wasm file from mdn examples
kachkaev 0d4945e
Implement `readFileBuffer`
kachkaev 26db3fd
Call loadEsmModule instead of linkAndEvaluateModule in _importWasmModule
kachkaev 1e6d75b
Update e2e/native-esm/__tests__/native-esm-wasm.test.js
kachkaev d4e9b73
Merge remote-tracking branch 'origin/main' into native-esm-wasm
kachkaev ad32edd
Add another test case for dynamic import
kachkaev 397bcd1
Extract `isWasm` function
kachkaev 976ef61
Merge remote-tracking branch 'origin/main' into native-esm-wasm
kachkaev 66a2312
Revert "Implement `readFileBuffer`"
SimenB 7188086
separate buffer cache
SimenB 26e7022
tweak
SimenB 607fc0f
clear new cache as well
SimenB File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
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
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,58 @@ | ||
/** | ||
* Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved. | ||
* | ||
* This source code is licensed under the MIT license found in the | ||
* LICENSE file in the root directory of this source tree. | ||
*/ | ||
|
||
// the point here is that it's the node core module | ||
// eslint-disable-next-line no-restricted-imports | ||
import {readFileSync} from 'fs'; | ||
// file origin: https://github.com/mdn/webassembly-examples/blob/2f2163287f86fe29deb162335bccca7d5d95ca4f/understanding-text-format/add.wasm | ||
// source code: https://github.com/mdn/webassembly-examples/blob/2f2163287f86fe29deb162335bccca7d5d95ca4f/understanding-text-format/add.was | ||
import {add} from '../add.wasm'; | ||
|
||
const wasmFileBuffer = readFileSync('add.wasm'); | ||
|
||
test('supports native wasm imports', () => { | ||
expect(add(1, 2)).toBe(3); | ||
|
||
// because arguments are i32 (signed), fractional part is truncated | ||
expect(add(0.99, 1.01)).toBe(1); | ||
|
||
// because return value is i32 (signed), (2^31 - 1) + 1 overflows and becomes -2^31 | ||
expect(add(Math.pow(2, 31) - 1, 1)).toBe(-Math.pow(2, 31)); | ||
|
||
// invalid or missing arguments are treated as 0 | ||
expect(add('hello', 'world')).toBe(0); | ||
expect(add()).toBe(0); | ||
expect(add(null)).toBe(0); | ||
expect(add({}, [])).toBe(0); | ||
|
||
// redundant arguments are silently ignored | ||
expect(add(1, 2, 3)).toBe(3); | ||
}); | ||
|
||
test('supports dynamic wasm imports', async () => { | ||
const {add: dynamicAdd} = await import('../add.wasm'); | ||
expect(dynamicAdd(1, 2)).toBe(3); | ||
}); | ||
|
||
test('supports imports from "data:application/wasm" URI with base64 encoding', async () => { | ||
const importedWasmModule = await import( | ||
`data:application/wasm;base64,${wasmFileBuffer.toString('base64')}` | ||
); | ||
expect(importedWasmModule.add(0, 42)).toBe(42); | ||
}); | ||
|
||
test('imports from "data:application/wasm" URI without explicit encoding fail', async () => { | ||
await expect(() => | ||
import(`data:application/wasm,${wasmFileBuffer.toString('base64')}`), | ||
).rejects.toThrow('Missing data URI encoding'); | ||
}); | ||
|
||
test('imports from "data:application/wasm" URI with invalid encoding fail', async () => { | ||
await expect(() => | ||
import('data:application/wasm;charset=utf-8,oops'), | ||
).rejects.toThrow('Invalid data URI encoding: charset=utf-8'); | ||
}); |
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
Binary file not shown.
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
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't think we should change this type.
I can tinker with this 👍