Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 3 additions & 4 deletions .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -106,11 +106,11 @@ commands:
cat ~/emsdk/.emscripten
echo "export PATH=\"$HOME/node-v${version}-linux-x64/bin:\$PATH\"" >> $BASH_ENV
install-node-oldest:
description: "install node 12.22.9 (oldest)"
description: "install node 18.3.0 (oldest)"
steps:
- install-node-version:
# Keep this in sync with `OLDEST_SUPPORTED_NODE` in `feature_matrix.py`
node_version: "12.22.9"
node_version: "18.3.0"
install-node-lts:
description: "install node 22.21.0 (current LTS)"
steps:
Expand Down Expand Up @@ -970,8 +970,7 @@ jobs:
# support in the generated code.
- install-node-oldest
- run-tests:
title: "node (oldest / 12.22.9)"
extra-cflags: "-sMIN_NODE_VERSION=122209"
title: "node (oldest / 18.3.0)"
# We include most but not all of the nodefs and node rawfs tests here.
# test_fs_nodefs_rw, test_fs_nodefs_statvfs, and test_unistd_io_nodefs_bigint fail.
test_targets: "
Expand Down
2 changes: 2 additions & 0 deletions ChangeLog.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ See docs/process.md for more on how version tagging works.

5.0.6 (in development)
----------------------
- The minimum version of node supported by the generated code was bumped from
v12.22.0 to v18.3.0. (#26604)

5.0.5 - 04/03/26
----------------
Expand Down
7 changes: 4 additions & 3 deletions site/source/docs/tools_reference/settings_reference.rst
Original file line number Diff line number Diff line change
Expand Up @@ -2919,10 +2919,11 @@ MIN_NODE_VERSION
Specifies minimum node version to target for the generated code. This is
distinct from the minimum version required to run the emscripten compiler.
Version is encoded in MMmmVV, e.g. 181401 denotes Node 18.14.01.
Minimum supported value is 122209, which was released 2022-01-11 (see
feature_matrix.py). This version aligns with the Ubuntu TLS 22.04 (Jammy).
Minimum supported value is 180300, which was released 2022-05-18 (see
feature_matrix.py). This version aligns with the version available in
debian/stable (bookworm).

Default value: 160000
Default value: 180300

.. _minimal_runtime:

Expand Down
48 changes: 0 additions & 48 deletions src/babel-plugins/strip-node-prefix.mjs

This file was deleted.

12 changes: 0 additions & 12 deletions src/runtime_common.js
Original file line number Diff line number Diff line change
Expand Up @@ -136,18 +136,6 @@ function updateMemoryViews() {
#endif
}

#if ENVIRONMENT_MAY_BE_NODE && MIN_NODE_VERSION < 160000
// The performance global was added to node in v16.0.0:
// https://nodejs.org/api/globals.html#performance
if (ENVIRONMENT_IS_NODE) {
// This is needed for emscripten_get_now and for pthreads support which
// depends on it for accurate timing.
// Use `global` rather than `globalThis` here since older versions of node
// don't have `globalThis`.
global.performance ??= require('perf_hooks').performance;
}
#endif

#if IMPORTED_MEMORY
// In non-standalone/normal mode, we create the memory here.
#include "runtime_init_memory.js"
Expand Down
7 changes: 4 additions & 3 deletions src/settings.js
Original file line number Diff line number Diff line change
Expand Up @@ -1920,9 +1920,10 @@ var MIN_CHROME_VERSION = 85;
// Specifies minimum node version to target for the generated code. This is
// distinct from the minimum version required to run the emscripten compiler.
// Version is encoded in MMmmVV, e.g. 181401 denotes Node 18.14.01.
// Minimum supported value is 122209, which was released 2022-01-11 (see
// feature_matrix.py). This version aligns with the Ubuntu TLS 22.04 (Jammy).
var MIN_NODE_VERSION = 160000;
// Minimum supported value is 180300, which was released 2022-05-18 (see
// feature_matrix.py). This version aligns with the version available in
// debian/stable (bookworm).
var MIN_NODE_VERSION = 180300;

// If true, uses minimal sized runtime without POSIX features, Module,
// preRun/preInit/etc., Emscripten built-in XHR loading or library_browser.js.
Expand Down
4 changes: 2 additions & 2 deletions test/codesize/test_codesize_hello_O0.json
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
{
"a.out.js": 24261,
"a.out.js.gz": 8714,
"a.out.js.gz": 8720,
"a.out.nodebug.wasm": 14850,
"a.out.nodebug.wasm.gz": 7311,
"total": 39111,
"total_gz": 16025,
"total_gz": 16031,
"sent": [
"fd_write"
],
Expand Down
4 changes: 2 additions & 2 deletions test/codesize/test_codesize_minimal_O0.expected.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@
// Note: We use a typeof check here instead of optional chaining using
// globalThis because older browsers might not have globalThis defined.
var currentNodeVersion = typeof process !== 'undefined' && process.versions?.node ? humanReadableVersionToPacked(process.versions.node) : TARGET_NOT_SUPPORTED;
if (currentNodeVersion < 160000) {
throw new Error(`This emscripten-generated code requires node v${ packedVersionToHumanReadable(160000) } (detected v${packedVersionToHumanReadable(currentNodeVersion)})`);
if (currentNodeVersion < 180300) {
throw new Error(`This emscripten-generated code requires node v${ packedVersionToHumanReadable(180300) } (detected v${packedVersionToHumanReadable(currentNodeVersion)})`);
}

var userAgent = typeof navigator !== 'undefined' && navigator.userAgent;
Expand Down
4 changes: 2 additions & 2 deletions test/codesize/test_codesize_minimal_O0.json
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
{
"a.out.js": 19452,
"a.out.js.gz": 6998,
"a.out.js.gz": 7004,
"a.out.nodebug.wasm": 1015,
"a.out.nodebug.wasm.gz": 602,
"total": 20467,
"total_gz": 7600,
"total_gz": 7606,
"sent": [],
"imports": [],
"exports": [
Expand Down
6 changes: 3 additions & 3 deletions test/codesize/test_unoptimized_code_size.json
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
{
"hello_world.js": 57078,
"hello_world.js.gz": 17753,
"hello_world.js.gz": 17757,
"hello_world.wasm": 14850,
"hello_world.wasm.gz": 7311,
"no_asserts.js": 26654,
"no_asserts.js.gz": 8901,
"no_asserts.wasm": 12010,
"no_asserts.wasm.gz": 5880,
"strict.js": 54896,
"strict.js.gz": 17061,
"strict.js.gz": 17065,
"strict.wasm": 14850,
"strict.wasm.gz": 7311,
"total": 180338,
"total_gz": 64217
"total_gz": 64225
}
47 changes: 2 additions & 45 deletions test/common.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
import line_endings
from retryable_unittest import RetryableTestCase

from tools import building, config, feature_matrix, shared, utils
from tools import building, config, shared, utils
from tools.feature_matrix import Feature
from tools.settings import COMPILE_TIME_SETTINGS
from tools.shared import DEBUG, EMCC, EMXX, get_canonical_temp_dir
Expand Down Expand Up @@ -147,15 +147,6 @@ def record_flaky_test(test_name, attempt_count, max_attempts, exception_msg):
f.write(f'{test_name}\n')


def node_bigint_flags(node_version):
# The --experimental-wasm-bigint flag was added in v12, and then removed (enabled by default)
# in v16.
if node_version and node_version < (16, 0, 0):
return ['--experimental-wasm-bigint']
else:
return []


@contextlib.contextmanager
def env_modify(updates):
"""A context manager that updates os.environ."""
Expand Down Expand Up @@ -457,11 +448,7 @@ def require_pthreads(self):
if self.get_setting('MINIMAL_RUNTIME'):
self.skipTest('non-browser pthreads not yet supported with MINIMAL_RUNTIME')
for engine in self.js_engines:
if engine_is_node(engine):
if not self.try_require_node_version(16, 0, 0):
self.fail('node v16 required to run this test')
return
elif engine_is_bun(engine) or engine_is_deno(engine):
if engine_is_node(engine) or engine_is_bun(engine) or engine_is_deno(engine):
self.require_engine(engine)
return
self.fail('no JS engine found capable of running pthreads')
Expand Down Expand Up @@ -531,23 +518,6 @@ def try_require_node_version(self, major, minor=0, revision=0):
self.require_engine(nodejs)
return True

def require_simd(self):
if 'EMTEST_SKIP_SIMD' in os.environ:
self.skipTest('test requires node >= 16 or d8 (and EMTEST_SKIP_SIMD is set)')
if self.is_browser_test():
return

if self.try_require_node_version(16):
return

v8 = get_v8()
if v8:
self.cflags.append('-sENVIRONMENT=shell')
self.require_engine(v8)
return

self.fail('either d8 or node >= 16 required to run wasm64 tests. Use EMTEST_SKIP_SIMD to skip')

def require_wasm_legacy_eh(self):
if 'EMTEST_SKIP_WASM_LEGACY_EH' in os.environ:
self.skipTest('test requires node >= 17 or d8 (and EMTEST_SKIP_WASM_LEGACY_EH is set)')
Expand Down Expand Up @@ -701,13 +671,6 @@ def setUp(self):
nodejs = get_nodejs()
if nodejs:
node_version = shared.get_node_version(nodejs)
if node_version < (13, 0, 0):
self.node_args.append('--unhandled-rejections=strict')
elif node_version < (15, 0, 0):
# Opt in to node v15 default behaviour:
# https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode
self.node_args.append('--unhandled-rejections=throw')
self.node_args += node_bigint_flags(node_version)

# If the version we are running tests in is lower than the version that
# emcc targets then we need to tell emcc to target that older version.
Expand All @@ -719,12 +682,6 @@ def setUp(self):
)
if node_version < emcc_min_node_version:
self.cflags.append('-sMIN_NODE_VERSION=%02d%02d%02d' % node_version)
self.cflags.append('-Wno-transpile')

# This allows much of the test suite to be run on older versions of node that don't
# support wasm bigint integration
if node_version[0] < feature_matrix.min_browser_versions[feature_matrix.Feature.JS_BIGINT_INTEGRATION]['node'] / 10000:
self.cflags.append('-sWASM_BIGINT=0')

self.v8_args = ['--wasm-staging']
self.env = {}
Expand Down
1 change: 0 additions & 1 deletion test/test_core.py
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,6 @@ def wasm_simd(func):

@wraps(func)
def decorated(self, *args, **kwargs):
self.require_simd()
if self.is_wasm2js():
self.skipTest('wasm2js only supports MVP for now')
if '-O3' in self.cflags:
Expand Down
9 changes: 0 additions & 9 deletions test/test_other.py
Original file line number Diff line number Diff line change
Expand Up @@ -13414,15 +13414,6 @@ def check_for_es6(filename, expect):
self.do_runf('test.c', expected, cflags=['--closure=1'], output_basename='test_closure')
check_for_es6('test_closure.js', False)

def test_node_prefix_transpile(self):
self.run_process([EMCC, test_file('hello_world.c'), '-sEXPORT_ES6'])
content = read_file('a.out.js')
self.assertContained('node:', content)

self.run_process([EMCC, test_file('hello_world.c'), '-sEXPORT_ES6', '-sMIN_NODE_VERSION=150000', '-Wno-transpile'])
content = read_file('a.out.js')
self.assertNotContained('node:', content)

def test_gmtime_noleak(self):
# Confirm that gmtime_r does not leak when called in isolation.
self.do_other_test('test_gmtime_noleak.c', cflags=['-fsanitize=leak'])
Expand Down
4 changes: 2 additions & 2 deletions test/test_sanity.py
Original file line number Diff line number Diff line change
Expand Up @@ -313,8 +313,8 @@ def test_node(self):
('v4.1.0', False),
('v10.18.0', False),
('v16.20.0', False),
('v18.3.0', True),
('v18.3.1-pre', True),
('v18.19.1', True),
('v18.19.1-pre', True),
('cheez', False)):
print(version, succeed)
delete_file(SANITY_FILE)
Expand Down
7 changes: 0 additions & 7 deletions tools/building.py
Original file line number Diff line number Diff line change
Expand Up @@ -543,13 +543,7 @@ def transpile(filename):
config = {
'sourceType': 'script',
'presets': ['@babel/preset-env'],
'plugins': [],
'targets': {},
'parserOpts': {
# FIXME: Remove when updating to Babel 8, see:
# https://babeljs.io/docs/v8-migration-api#javascript-nodes
'createImportExpressions': True,
},
}
if settings.MIN_CHROME_VERSION != UNSUPPORTED:
config['targets']['chrome'] = str(settings.MIN_CHROME_VERSION)
Expand All @@ -559,7 +553,6 @@ def transpile(filename):
config['targets']['safari'] = version_split(settings.MIN_SAFARI_VERSION)
if settings.MIN_NODE_VERSION != UNSUPPORTED:
config['targets']['node'] = version_split(settings.MIN_NODE_VERSION)
config['plugins'] = [path_from_root('src/babel-plugins/strip-node-prefix.mjs')]
config_json = json.dumps(config, indent=2)
outfile = shared.get_temp_files().get('babel.js').name
config_file = shared.get_temp_files().get('babel_config.json').name
Expand Down
4 changes: 2 additions & 2 deletions tools/feature_matrix.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,9 @@
OLDEST_SUPPORTED_CHROME = 74 # Released on 2019-04-23
OLDEST_SUPPORTED_FIREFOX = 68 # Released on 2019-07-09
OLDEST_SUPPORTED_SAFARI = 120200 # Released on 2019-03-25
# 12.22.09 is the oldest version of node that we do any testing with.
# This is the oldest version of node that we do any testing with.
# Keep this in sync with the test-node-compat in .circleci/config.yml.
OLDEST_SUPPORTED_NODE = 122209
OLDEST_SUPPORTED_NODE = 180300


class Feature(IntEnum):
Expand Down
3 changes: 1 addition & 2 deletions tools/link.py
Original file line number Diff line number Diff line change
Expand Up @@ -1380,8 +1380,7 @@ def limit_incoming_module_api():
# TODO: replace this with feature matrix in the future.
settings.TRANSPILE = (settings.MIN_FIREFOX_VERSION < 79 or
settings.MIN_CHROME_VERSION < 85 or
settings.MIN_SAFARI_VERSION < 140000 or
settings.MIN_NODE_VERSION < 160000)
settings.MIN_SAFARI_VERSION < 140000)

if settings.STB_IMAGE:
settings.EXPORTED_FUNCTIONS += ['_stbi_load', '_stbi_load_from_memory', '_stbi_image_free']
Expand Down
Loading