Skip to content

Commit 581bbaa

Browse files
Bartek Wronavogel76
authored andcommitted
Add require() polyfill for EM_ASM tests in ESM modes
Instead of skipping EM_ASM tests that use CJS require() in ESM modes, add a createRequire-based polyfill (available since Node 12.2.0) that makes require() available in ESM output. The polyfill is only included when the build targets ESM (EXPORT_ES6, MODULARIZE=instance, or WASM_ESM_INTEGRATION). - Add test/require_polyfill.js using createRequire from 'module' - Add is_esm() and add_require_polyfill() helpers to test/common.py - Remove @no_modularize_instance skips from test_fs_nodefs_rw and test_fs_nodefs_home, enabling them in ESM test modes
1 parent 145c961 commit 581bbaa

File tree

3 files changed

+23
-2
lines changed

3 files changed

+23
-2
lines changed

test/common.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -626,12 +626,21 @@ def require_wasm2js(self):
626626
if self.get_setting('WASM_ESM_INTEGRATION'):
627627
self.skipTest('wasm2js is not compatible with WASM_ESM_INTEGRATION')
628628

629+
def is_esm(self):
630+
return self.get_setting('EXPORT_ES6') or self.get_setting('WASM_ESM_INTEGRATION') or self.get_setting('MODULARIZE') == 'instance'
631+
632+
def add_require_polyfill(self):
633+
"""Add a require() polyfill for ESM mode using createRequire (Node 12.2+)."""
634+
if self.is_esm():
635+
self.cflags += ['--pre-js', test_file('require_polyfill.js')]
636+
629637
def setup_nodefs_test(self):
630638
self.require_node()
631639
if self.get_setting('WASMFS'):
632640
# without this the JS setup code in setup_nodefs.js doesn't work
633641
self.set_setting('FORCE_FILESYSTEM')
634642
self.cflags += ['-DNODEFS', '-lnodefs.js', '--pre-js', test_file('setup_nodefs.js'), '-sINCOMING_MODULE_JS_API=onRuntimeInitialized']
643+
self.add_require_polyfill()
635644

636645
def setup_noderawfs_test(self):
637646
self.require_node()

test/require_polyfill.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
// Polyfill require() for ESM mode so that EM_ASM/EM_JS code using
2+
// require('fs'), require('path'), etc. works in both CJS and ESM.
3+
// createRequire is available since Node 12.2.0.
4+
if (typeof require === 'undefined') {
5+
var { createRequire } = await import('module');
6+
var require = createRequire(import.meta.url);
7+
}

test/test_core.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5825,6 +5825,8 @@ def test_fs_base(self):
58255825
def test_fs_nodefs_rw(self):
58265826
if not self.get_setting('NODERAWFS'):
58275827
self.setup_nodefs_test()
5828+
else:
5829+
self.add_require_polyfill()
58285830
self.maybe_closure()
58295831
self.do_runf('fs/test_nodefs_rw.c', 'success')
58305832

@@ -5848,6 +5850,7 @@ def test_fs_nodefs_dup(self):
58485850

58495851
@requires_node
58505852
def test_fs_nodefs_home(self):
5853+
self.add_require_polyfill()
58515854
self.do_runf('fs/test_nodefs_home.c', 'success', cflags=['-sFORCE_FILESYSTEM', '-lnodefs.js'])
58525855

58535856
@requires_node
@@ -8662,8 +8665,10 @@ def test(assert_returncode=0):
86628665
js = read_file(self.output_name('test_hello_world.support'))
86638666
else:
86648667
js = read_file(self.output_name('test_hello_world'))
8665-
# In ESM mode, we use dynamic import() instead of require() for node modules
8666-
if self.get_setting('WASM_ESM_INTEGRATION'):
8668+
# In ESM mode we use dynamic import() instead of require() for node modules.
8669+
# MODULARIZE=instance implies EXPORT_ES6 which triggers ESM output.
8670+
is_esm = self.get_setting('EXPORT_ES6') or self.get_setting('WASM_ESM_INTEGRATION') or self.get_setting('MODULARIZE') == 'instance'
8671+
if is_esm:
86678672
has_node_imports = 'import(' in js
86688673
else:
86698674
has_node_imports = 'require(' in js

0 commit comments

Comments
 (0)