diff --git a/package-lock.json b/package-lock.json
index ba876ba081729..6d059c889615e 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -20,6 +20,7 @@
"eslint-config-prettier": "^9.1.0",
"globals": "^15.14.0",
"prettier": "^3.4.2",
+ "rollup": "^4.30.1",
"source-map": "0.7.4",
"typescript": "^5.7.2",
"vite": "^6.0.7",
diff --git a/package.json b/package.json
index 6b426d834990b..8aac0a37180a8 100644
--- a/package.json
+++ b/package.json
@@ -8,6 +8,7 @@
"eslint-config-prettier": "^9.1.0",
"globals": "^15.14.0",
"prettier": "^3.4.2",
+ "rollup": "^4.30.1",
"source-map": "0.7.4",
"typescript": "^5.7.2",
"vite": "^6.0.7",
diff --git a/test/rollup/index.html b/test/rollup/index.html
new file mode 100644
index 0000000000000..cc337edee9180
--- /dev/null
+++ b/test/rollup/index.html
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/test/rollup/index.mjs b/test/rollup/index.mjs
new file mode 100644
index 0000000000000..31281c791d1e3
--- /dev/null
+++ b/test/rollup/index.mjs
@@ -0,0 +1,17 @@
+var params = {
+ print: (function() {
+ var element = document.getElementById('output');
+ return function(text) {
+ console.log(text);
+ element.innerHTML += text.replace('\n', '
', 'g') + '
';
+ };
+ })(),
+ canvas: document.getElementById('canvas'),
+};
+
+params.print("testing..");
+
+import Module from './hello.mjs';
+Module(params).then((instance) => {
+ console.log('loaded');
+});
diff --git a/test/rollup/rollup.config.mjs b/test/rollup/rollup.config.mjs
new file mode 100644
index 0000000000000..d3ac1a4fd2515
--- /dev/null
+++ b/test/rollup/rollup.config.mjs
@@ -0,0 +1,7 @@
+export default {
+ input: 'index.mjs',
+ output: {
+ file: 'bundle.mjs',
+ format: 'es'
+ }
+};
diff --git a/test/test_browser.py b/test/test_browser.py
index 636ec411eb54c..7ddc7ab09bebf 100644
--- a/test/test_browser.py
+++ b/test/test_browser.py
@@ -5528,6 +5528,13 @@ def test_vite(self):
self.run_process(shared.get_npm_cmd('vite') + ['build'])
self.run_browser('vite/dist/index.html', '/report_result?exit:0')
+ def test_rollup(self):
+ shutil.copytree(test_file('rollup'), 'rollup')
+ with common.chdir('rollup'):
+ self.compile_btest('hello_world.c', ['-sEXPORT_ES6', '-sEXIT_RUNTIME', '-sMODULARIZE', '-o', 'hello.mjs'])
+ self.run_process(shared.get_npm_cmd('rollup') + ['--config'])
+ self.run_browser('rollup/index.html', '/report_result?exit:0')
+
class emrun(RunnerCore):
def test_emrun_info(self):