From 115e93d63c77838efc07c4b26b9a0a75a1dfd8ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Kwinta?= <33606064+lkwinta@users.noreply.github.com> Date: Fri, 18 Jul 2025 13:10:46 +0200 Subject: [PATCH 1/7] Add modularize to file_packager.py fix python format apply more ruff fixes fix pipeline revert file to the most actual version and apply changes add modularize to options class add utilization of EXPORT_NAME with modularize option simplify declaration of the modularize function arg documentation address @sbc100 review Fix codegen new line formatting Add file_packager tests and changelog mention fix some stylistic issues gichange file_packager modularize test simplyfi tests fix test rename to export_es6 async function promise behaviour cleanup test address @sbc100 review simplify the test rename promise handlers introduce createRequire in es6 mode alternative way to import require --- ChangeLog.md | 2 ++ test/test_other.py | 42 +++++++++++++++++++++++++++++++ tools/file_packager.py | 57 ++++++++++++++++++++++++++++++++++++------ 3 files changed, 93 insertions(+), 8 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index f067fccf42ef4..71545f0f3f6ef 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -45,6 +45,8 @@ See docs/process.md for more on how version tagging works. - emcc will now error if `MINIMAL_RUNTIME_STREAMING_WASM_COMPILATION` or `MINIMAL_RUNTIME_STREAMING_WASM_INSTANTIATION` are used with `SINGLE_FILE`. These are fundamentally incompatible but were previously ignored. (#24849) +- `--export-es6` flag was added to `file_packager.py` available when run + standalone, to enable ES6 imports of generated JavaScript code (#24737) 4.0.12 - 08/01/25 ----------------- diff --git a/test/test_other.py b/test/test_other.py index bff7e7d3fea9c..1c3fea743e232 100644 --- a/test/test_other.py +++ b/test/test_other.py @@ -3919,6 +3919,11 @@ def test_file_packager_returns_error_if_target_equal_to_jsoutput(self): err = self.expect_fail([FILE_PACKAGER, 'test.data', '--js-output=test.data']) self.assertContained(MESSAGE, err) + def test_file_packager_returns_error_if_emcc_and_export_es6(self): + MESSAGE = 'error: Can\'t use --export-es6 option together with --from-emcc since the code should be embedded within emcc\'s code' + err = self.expect_fail([FILE_PACKAGER, 'test.data', '--export-es6', '--from-emcc']) + self.assertContained(MESSAGE, err) + def test_file_packager_embed(self): create_file('data.txt', 'hello data') @@ -3945,6 +3950,43 @@ def test_file_packager_embed(self): output = self.run_js('a.out.js') self.assertContained('hello data', output) + def test_file_packager_export_es6(self): + create_file('smth.txt', 'hello data') + self.run_process([FILE_PACKAGER, 'test.data', '--export-es6', '--preload', 'smth.txt', '--js-output=dataFileLoader.js']) + + create_file('test.c', ''' + #include + #include + + EMSCRIPTEN_KEEPALIVE int test_fun() { + FILE* f = fopen("smth.txt", "r"); + char buf[64] = {0}; + int rtn = fread(buf, 1, 64, f); + buf[rtn] = '\\0'; + fclose(f); + printf("%s\\n", buf); + return 0; + } + ''') + self.run_process([EMCC, 'test.c', '-sFORCE_FILESYSTEM', '-sMODULARIZE', '-sEXPORT_ES6', '-o', 'moduleFile.js']) + + create_file('run.js', ''' + import loadDataFile from './dataFileLoader.js' + import {default as loadModule} from './moduleFile.js' + + loadModule().then((module) => { + loadDataFile(module) + .catch((cause) => Promise.reject(cause)) + .then(() => { + module._test_fun(); + } + ); + }); + ''') + + output = self.run_js('run.js') + self.assertContained('hello data', output) + @crossplatform def test_file_packager_depfile(self): create_file('data1.txt', 'data1') diff --git a/tools/file_packager.py b/tools/file_packager.py index 09de8f0b065ae..0d242d4088a21 100755 --- a/tools/file_packager.py +++ b/tools/file_packager.py @@ -21,7 +21,7 @@ Usage: - file_packager TARGET [--preload A [B..]] [--embed C [D..]] [--exclude E [F..]] [--js-output=OUTPUT.js] [--no-force] [--use-preload-cache] [--indexedDB-name=EM_PRELOAD_CACHE] [--separate-metadata] [--lz4] [--use-preload-plugins] [--no-node] [--help] + file_packager TARGET [--preload A [B..]] [--embed C [D..]] [--exclude E [F..]] [--js-output=OUTPUT.js] [--no-force] [--use-preload-cache] [--indexedDB-name=EM_PRELOAD_CACHE] [--separate-metadata] [--lz4] [--use-preload-plugins] [--no-node] [--export-es6] [--help] --preload , --embed See emcc --help for more details on those options. @@ -41,6 +41,8 @@ --export-name=EXPORT_NAME Use custom export name (default is `Module`) + --export-es6 Wrap generated code inside ES6 exported function + --no-force Don't create output if no valid input file is specified. --use-preload-cache Stores package in IndexedDB so that subsequent loads don't need to do XHR. Checks package version. @@ -129,6 +131,7 @@ def __init__(self): self.use_preload_plugins = False self.support_node = True self.wasm64 = False + self.export_es6 = False class DataFile: @@ -362,7 +365,7 @@ def main(): # noqa: C901, PLR0912, PLR0915 To revalidate these numbers, run `ruff check --select=C901,PLR091`. """ if len(sys.argv) == 1: - err('''Usage: file_packager TARGET [--preload A [B..]] [--embed C [D..]] [--exclude E [F..]] [--js-output=OUTPUT.js] [--no-force] [--use-preload-cache] [--indexedDB-name=EM_PRELOAD_CACHE] [--separate-metadata] [--lz4] [--use-preload-plugins] [--no-node] [--help] + err('''Usage: file_packager TARGET [--preload A [B..]] [--embed C [D..]] [--exclude E [F..]] [--js-output=OUTPUT.js] [--no-force] [--use-preload-cache] [--indexedDB-name=EM_PRELOAD_CACHE] [--separate-metadata] [--lz4] [--use-preload-plugins] [--no-node] [--export-es6] [--help] Try 'file_packager --help' for more details.''') return 1 @@ -391,6 +394,9 @@ def main(): # noqa: C901, PLR0912, PLR0915 elif arg == '--no-force': options.force = False leading = '' + elif arg == '--export-es6': + options.export_es6 = True + leading = '' elif arg == '--use-preload-cache': options.use_preload_cache = True leading = '' @@ -485,6 +491,11 @@ def main(): # noqa: C901, PLR0912, PLR0915 diagnostics.error('TARGET should not be the same value of --js-output') return 1 + if options.from_emcc and options.export_es6: + diagnostics.error('Can\'t use --export-es6 option together with --from-emcc since the code should be embedded ' + 'within emcc\'s code') + return 1 + walked.append(__file__) for file_ in data_files: if not should_ignore(file_.srcpath): @@ -621,13 +632,21 @@ def generate_js(data_target, data_files, metadata): if options.from_emcc: ret = '' else: - ret = ''' + if options.export_es6: + ret = 'export default async function loadDataFile(Module) {\n' + else: + ret = ''' var Module = typeof %(EXPORT_NAME)s != 'undefined' ? %(EXPORT_NAME)s : {};\n''' % {"EXPORT_NAME": options.export_name} ret += ''' Module['expectedDataFileDownloads'] ??= 0; - Module['expectedDataFileDownloads']++; - (() => { + Module['expectedDataFileDownloads']++;''' + + if not options.export_es6: + ret += ''' + (() => {''' + + ret += ''' // Do not attempt to redownload the virtual filesystem data when in a pthread or a Wasm Worker context. var isPthread = typeof ENVIRONMENT_IS_PTHREAD != 'undefined' && ENVIRONMENT_IS_PTHREAD; var isWasmWorker = typeof ENVIRONMENT_IS_WASM_WORKER != 'undefined' && ENVIRONMENT_IS_WASM_WORKER; @@ -635,6 +654,16 @@ def generate_js(data_target, data_files, metadata): if options.support_node: ret += " var isNode = typeof process === 'object' && typeof process.versions === 'object' && typeof process.versions.node === 'string';\n" + + if options.support_node and options.export_es6: + ret += '''if (isNode) { + const { createRequire } = await import('module'); + /** @suppress{duplicate} */ + var require = createRequire(import.meta.url); + }\n''' + + if options.export_es6: + ret += 'return new Promise((loadDataResolve, loadDataReject) => {\n' ret += ' async function loadPackage(metadata) {\n' code = ''' @@ -687,6 +716,8 @@ def generate_js(data_target, data_files, metadata): create_data = '''// canOwn this data in the filesystem, it is a slice into the heap that will never change Module['FS_createDataFile'](this.name, null, byteArray, true, true, true); Module['removeRunDependency'](`fp ${that.name}`);''' + ready_promise = ''' + loadDataResolve();''' if not options.lz4: # Data requests - for getting a block of data out of the big archive - have @@ -713,14 +744,14 @@ def generate_js(data_target, data_files, metadata): finish: async function(byteArray) { var that = this; %s - this.requests[this.name] = null; + this.requests[this.name] = null;%s } }; var files = metadata['files']; for (var i = 0; i < files.length; ++i) { new DataRequest(files[i]['start'], files[i]['end'], files[i]['audio'] || 0).open('GET', files[i]['filename']); - }\n''' % (create_preloaded if options.use_preload_plugins else create_data) + }\n''' % (create_preloaded if options.use_preload_plugins else create_data, ready_promise if options.export_es6 else '') if options.has_embedded and not options.obj_output: diagnostics.warn('--obj-output is recommended when using --embed. This outputs an object file for linking directly into your application is more efficient than JS encoding') @@ -961,6 +992,9 @@ def generate_js(data_target, data_files, metadata): return contents.buffer; }'''.strip() + reject_promise = ''' + loadDataReject();''' + ret += ''' async function fetchRemotePackage(packageName, packageSize) { %(node_support_code)s @@ -1131,7 +1165,14 @@ def generate_js(data_target, data_files, metadata): } loadPackage(%s);\n''' % json.dumps(metadata) - ret += ''' + if options.export_es6: + ret += ''' + }); +} +// END the loadDataFile function +''' + else: + ret += ''' })();\n''' return ret From b62ddc7a6c0d49ed1bcd3ec130c51e42339d2245 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Kwinta?= <33606064+lkwinta@users.noreply.github.com> Date: Tue, 12 Aug 2025 20:07:55 +0000 Subject: [PATCH 2/7] simplify promise usage --- tools/file_packager.py | 33 ++++++++++++--------------------- 1 file changed, 12 insertions(+), 21 deletions(-) diff --git a/tools/file_packager.py b/tools/file_packager.py index 0d242d4088a21..298859f187d50 100755 --- a/tools/file_packager.py +++ b/tools/file_packager.py @@ -644,7 +644,7 @@ def generate_js(data_target, data_files, metadata): if not options.export_es6: ret += ''' - (() => {''' + (async () => {''' ret += ''' // Do not attempt to redownload the virtual filesystem data when in a pthread or a Wasm Worker context. @@ -662,8 +662,6 @@ def generate_js(data_target, data_files, metadata): var require = createRequire(import.meta.url); }\n''' - if options.export_es6: - ret += 'return new Promise((loadDataResolve, loadDataReject) => {\n' ret += ' async function loadPackage(metadata) {\n' code = ''' @@ -716,8 +714,6 @@ def generate_js(data_target, data_files, metadata): create_data = '''// canOwn this data in the filesystem, it is a slice into the heap that will never change Module['FS_createDataFile'](this.name, null, byteArray, true, true, true); Module['removeRunDependency'](`fp ${that.name}`);''' - ready_promise = ''' - loadDataResolve();''' if not options.lz4: # Data requests - for getting a block of data out of the big archive - have @@ -744,14 +740,14 @@ def generate_js(data_target, data_files, metadata): finish: async function(byteArray) { var that = this; %s - this.requests[this.name] = null;%s + this.requests[this.name] = null; } }; var files = metadata['files']; for (var i = 0; i < files.length; ++i) { new DataRequest(files[i]['start'], files[i]['end'], files[i]['audio'] || 0).open('GET', files[i]['filename']); - }\n''' % (create_preloaded if options.use_preload_plugins else create_data, ready_promise if options.export_es6 else '') + }\n''' % (create_preloaded if options.use_preload_plugins else create_data) if options.has_embedded and not options.obj_output: diagnostics.warn('--obj-output is recommended when using --embed. This outputs an object file for linking directly into your application is more efficient than JS encoding') @@ -992,9 +988,6 @@ def generate_js(data_target, data_files, metadata): return contents.buffer; }'''.strip() - reject_promise = ''' - loadDataReject();''' - ret += ''' async function fetchRemotePackage(packageName, packageSize) { %(node_support_code)s @@ -1099,14 +1092,13 @@ def generate_js(data_target, data_files, metadata): if (!fetched) { // Note that we don't use await here because we want to execute the // the rest of this function immediately. - fetchRemotePackage(REMOTE_PACKAGE_NAME, REMOTE_PACKAGE_SIZE).then((data) => { - if (fetchedCallback) { - fetchedCallback(data); - fetchedCallback = null; - } else { - fetched = data; - } - }) + let packageData = await fetchRemotePackage(REMOTE_PACKAGE_NAME, REMOTE_PACKAGE_SIZE); + if (fetchedCallback) { + fetchedCallback(packageData); + fetchedCallback = null; + } else { + fetched = packageData; + } }\n''' code += ''' @@ -1124,7 +1116,7 @@ def generate_js(data_target, data_files, metadata): ret += ''' } if (Module['calledRun']) { - runWithFS(Module); + await runWithFS(Module); } else { (Module['preRun'] ??= []).push(runWithFS); // FS is not initialized yet, wait for it }\n''' @@ -1163,11 +1155,10 @@ def generate_js(data_target, data_files, metadata): else: ret += ''' } - loadPackage(%s);\n''' % json.dumps(metadata) + await loadPackage(%s);\n''' % json.dumps(metadata) if options.export_es6: ret += ''' - }); } // END the loadDataFile function ''' From 6707c83f630ee9441f3a3d65a30ce5bd06ecea49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Kwinta?= <33606064+lkwinta@users.noreply.github.com> Date: Tue, 12 Aug 2025 20:11:04 +0000 Subject: [PATCH 3/7] simplyfi help code --- test/test_other.py | 6 ++---- tools/file_packager.py | 3 +-- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/test/test_other.py b/test/test_other.py index 1c3fea743e232..592e820a92feb 100644 --- a/test/test_other.py +++ b/test/test_other.py @@ -3973,10 +3973,9 @@ def test_file_packager_export_es6(self): create_file('run.js', ''' import loadDataFile from './dataFileLoader.js' import {default as loadModule} from './moduleFile.js' - + loadModule().then((module) => { loadDataFile(module) - .catch((cause) => Promise.reject(cause)) .then(() => { module._test_fun(); } @@ -3984,8 +3983,7 @@ def test_file_packager_export_es6(self): }); ''') - output = self.run_js('run.js') - self.assertContained('hello data', output) + self.assertContained('hello data', self.run_js('run.js')) @crossplatform def test_file_packager_depfile(self): diff --git a/tools/file_packager.py b/tools/file_packager.py index 298859f187d50..d77a5a3dd952c 100755 --- a/tools/file_packager.py +++ b/tools/file_packager.py @@ -492,8 +492,7 @@ def main(): # noqa: C901, PLR0912, PLR0915 return 1 if options.from_emcc and options.export_es6: - diagnostics.error('Can\'t use --export-es6 option together with --from-emcc since the code should be embedded ' - 'within emcc\'s code') + diagnostics.error('Can\'t use --export-es6 option together with --from-emcc since the code should be embedded within emcc\'s code') return 1 walked.append(__file__) From a25caf1f1aa0a6356be7c288bfe516bdb4bc4be6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Kwinta?= <33606064+lkwinta@users.noreply.github.com> Date: Tue, 12 Aug 2025 20:16:36 +0000 Subject: [PATCH 4/7] simplyfi test --- test/test_other.py | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/test/test_other.py b/test/test_other.py index 592e820a92feb..7cba06185531c 100644 --- a/test/test_other.py +++ b/test/test_other.py @@ -3973,14 +3973,10 @@ def test_file_packager_export_es6(self): create_file('run.js', ''' import loadDataFile from './dataFileLoader.js' import {default as loadModule} from './moduleFile.js' - - loadModule().then((module) => { - loadDataFile(module) - .then(() => { - module._test_fun(); - } - ); - }); + + var module = await loadModule(); + await loadDataFile(module); + module._test_fun(); ''') self.assertContained('hello data', self.run_js('run.js')) From 697c9e6b747ba0cb8bd265d2edc98b9074e542a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Kwinta?= <33606064+lkwinta@users.noreply.github.com> Date: Tue, 12 Aug 2025 20:55:06 +0000 Subject: [PATCH 5/7] explicite promise resolving --- tools/file_packager.py | 46 ++++++++++++++++++++++++++---------------- 1 file changed, 29 insertions(+), 17 deletions(-) diff --git a/tools/file_packager.py b/tools/file_packager.py index d77a5a3dd952c..c80cb2984cd10 100755 --- a/tools/file_packager.py +++ b/tools/file_packager.py @@ -492,7 +492,8 @@ def main(): # noqa: C901, PLR0912, PLR0915 return 1 if options.from_emcc and options.export_es6: - diagnostics.error('Can\'t use --export-es6 option together with --from-emcc since the code should be embedded within emcc\'s code') + diagnostics.error('Can\'t use --export-es6 option together with --from-emcc since the code should be embedded ' + 'within emcc\'s code') return 1 walked.append(__file__) @@ -643,7 +644,7 @@ def generate_js(data_target, data_files, metadata): if not options.export_es6: ret += ''' - (async () => {''' + (() => {''' ret += ''' // Do not attempt to redownload the virtual filesystem data when in a pthread or a Wasm Worker context. @@ -661,6 +662,8 @@ def generate_js(data_target, data_files, metadata): var require = createRequire(import.meta.url); }\n''' + if options.export_es6: + ret += 'return new Promise((loadDataResolve, loadDataReject) => {\n' ret += ' async function loadPackage(metadata) {\n' code = ''' @@ -713,6 +716,8 @@ def generate_js(data_target, data_files, metadata): create_data = '''// canOwn this data in the filesystem, it is a slice into the heap that will never change Module['FS_createDataFile'](this.name, null, byteArray, true, true, true); Module['removeRunDependency'](`fp ${that.name}`);''' + ready_promise = ''' + loadDataResolve();''' if not options.lz4: # Data requests - for getting a block of data out of the big archive - have @@ -739,14 +744,14 @@ def generate_js(data_target, data_files, metadata): finish: async function(byteArray) { var that = this; %s - this.requests[this.name] = null; + this.requests[this.name] = null;%s } }; var files = metadata['files']; for (var i = 0; i < files.length; ++i) { new DataRequest(files[i]['start'], files[i]['end'], files[i]['audio'] || 0).open('GET', files[i]['filename']); - }\n''' % (create_preloaded if options.use_preload_plugins else create_data) + }\n''' % (create_preloaded if options.use_preload_plugins else create_data, ready_promise if options.export_es6 else '') if options.has_embedded and not options.obj_output: diagnostics.warn('--obj-output is recommended when using --embed. This outputs an object file for linking directly into your application is more efficient than JS encoding') @@ -1049,6 +1054,10 @@ def generate_js(data_target, data_files, metadata): code += ''' Module['preloadResults'] ??= {};\n''' + catch_case = ''' + .catch((error) => { + loadDataReject(error); + })''' if options.use_preload_cache: code += ''' @@ -1075,10 +1084,10 @@ def generate_js(data_target, data_files, metadata): } } } catch(e) { - await preloadFallback(e); + await preloadFallback(e)%s; } - Module['setStatus']?.('Downloading...');\n''' + Module['setStatus']?.('Downloading...');\n''' % (catch_case if options.export_es6 else '') else: # Not using preload cache, so we might as well start the xhr ASAP, # potentially before JS parsing of the main codebase if it's after us. @@ -1091,14 +1100,16 @@ def generate_js(data_target, data_files, metadata): if (!fetched) { // Note that we don't use await here because we want to execute the // the rest of this function immediately. - let packageData = await fetchRemotePackage(REMOTE_PACKAGE_NAME, REMOTE_PACKAGE_SIZE); - if (fetchedCallback) { - fetchedCallback(packageData); - fetchedCallback = null; - } else { - fetched = packageData; - } - }\n''' + fetchRemotePackage(REMOTE_PACKAGE_NAME, REMOTE_PACKAGE_SIZE) + .then((data) => { + if (fetchedCallback) { + fetchedCallback(data); + fetchedCallback = null; + } else { + fetched = data; + } + })%s; + }\n''' % (catch_case if options.export_es6 else '') code += ''' Module['preloadResults'][PACKAGE_NAME] = {fromCache: false}; @@ -1115,10 +1126,10 @@ def generate_js(data_target, data_files, metadata): ret += ''' } if (Module['calledRun']) { - await runWithFS(Module); + runWithFS(Module)%s; } else { (Module['preRun'] ??= []).push(runWithFS); // FS is not initialized yet, wait for it - }\n''' + }\n''' % (catch_case if options.export_es6 else '') if options.separate_metadata: node_support_code = '' @@ -1154,10 +1165,11 @@ def generate_js(data_target, data_files, metadata): else: ret += ''' } - await loadPackage(%s);\n''' % json.dumps(metadata) + loadPackage(%s);\n''' % json.dumps(metadata) if options.export_es6: ret += ''' + }); } // END the loadDataFile function ''' From 03095d0f4898899e76afd9b2a63eeabbc3eb9479 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Kwinta?= <33606064+lkwinta@users.noreply.github.com> Date: Wed, 13 Aug 2025 07:34:00 +0000 Subject: [PATCH 6/7] address @sbc100 review --- tools/file_packager.py | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/tools/file_packager.py b/tools/file_packager.py index c80cb2984cd10..a7bc46cd326fe 100755 --- a/tools/file_packager.py +++ b/tools/file_packager.py @@ -716,8 +716,10 @@ def generate_js(data_target, data_files, metadata): create_data = '''// canOwn this data in the filesystem, it is a slice into the heap that will never change Module['FS_createDataFile'](this.name, null, byteArray, true, true, true); Module['removeRunDependency'](`fp ${that.name}`);''' - ready_promise = ''' - loadDataResolve();''' + + finish_handler = create_preloaded if options.use_preload_plugins else create_data + if options.export_es6: + finish_handler += '\nloadDataResolve();' if not options.lz4: # Data requests - for getting a block of data out of the big archive - have @@ -744,14 +746,14 @@ def generate_js(data_target, data_files, metadata): finish: async function(byteArray) { var that = this; %s - this.requests[this.name] = null;%s + this.requests[this.name] = null; } }; var files = metadata['files']; for (var i = 0; i < files.length; ++i) { new DataRequest(files[i]['start'], files[i]['end'], files[i]['audio'] || 0).open('GET', files[i]['filename']); - }\n''' % (create_preloaded if options.use_preload_plugins else create_data, ready_promise if options.export_es6 else '') + }\n''' % finish_handler if options.has_embedded and not options.obj_output: diagnostics.warn('--obj-output is recommended when using --embed. This outputs an object file for linking directly into your application is more efficient than JS encoding') @@ -1054,10 +1056,13 @@ def generate_js(data_target, data_files, metadata): code += ''' Module['preloadResults'] ??= {};\n''' - catch_case = ''' - .catch((error) => { - loadDataReject(error); - })''' + + catch_handler = '' + if options.export_es6: + catch_handler += ''' + .catch((error) => { + loadDataReject(error); + })''' if options.use_preload_cache: code += ''' @@ -1087,7 +1092,7 @@ def generate_js(data_target, data_files, metadata): await preloadFallback(e)%s; } - Module['setStatus']?.('Downloading...');\n''' % (catch_case if options.export_es6 else '') + Module['setStatus']?.('Downloading...');\n''' % catch_handler else: # Not using preload cache, so we might as well start the xhr ASAP, # potentially before JS parsing of the main codebase if it's after us. @@ -1109,7 +1114,7 @@ def generate_js(data_target, data_files, metadata): fetched = data; } })%s; - }\n''' % (catch_case if options.export_es6 else '') + }\n''' % catch_handler code += ''' Module['preloadResults'][PACKAGE_NAME] = {fromCache: false}; @@ -1129,7 +1134,7 @@ def generate_js(data_target, data_files, metadata): runWithFS(Module)%s; } else { (Module['preRun'] ??= []).push(runWithFS); // FS is not initialized yet, wait for it - }\n''' % (catch_case if options.export_es6 else '') + }\n''' % catch_handler if options.separate_metadata: node_support_code = '' From 2874708572c11566dd5739c51921b288298ea8d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Kwinta?= <33606064+lkwinta@users.noreply.github.com> Date: Wed, 13 Aug 2025 10:46:30 +0000 Subject: [PATCH 7/7] fix indentation --- tools/file_packager.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/tools/file_packager.py b/tools/file_packager.py index a7bc46cd326fe..d88ec4e0dd8ef 100755 --- a/tools/file_packager.py +++ b/tools/file_packager.py @@ -758,6 +758,13 @@ def generate_js(data_target, data_files, metadata): if options.has_embedded and not options.obj_output: diagnostics.warn('--obj-output is recommended when using --embed. This outputs an object file for linking directly into your application is more efficient than JS encoding') + catch_handler = '' + if options.export_es6: + catch_handler += ''' + .catch((error) => { + loadDataReject(error); + })''' + for counter, file_ in enumerate(data_files): filename = file_.dstpath dirname = os.path.dirname(filename) @@ -1057,13 +1064,6 @@ def generate_js(data_target, data_files, metadata): code += ''' Module['preloadResults'] ??= {};\n''' - catch_handler = '' - if options.export_es6: - catch_handler += ''' - .catch((error) => { - loadDataReject(error); - })''' - if options.use_preload_cache: code += ''' async function preloadFallback(error) {