diff --git a/src/workerd/api/node/BUILD.bazel b/src/workerd/api/node/BUILD.bazel index e4818bf06ce..33aa9c94706 100644 --- a/src/workerd/api/node/BUILD.bazel +++ b/src/workerd/api/node/BUILD.bazel @@ -189,6 +189,12 @@ wd_test( data = ["tests/util-nodejs-test.js"], ) +wd_test( + src = "tests/sys-nodejs-test.wd-test", + args = ["--experimental"], + data = ["tests/sys-nodejs-test.js"], +) + wd_test( size = "large", src = "tests/zlib-nodejs-test.wd-test", diff --git a/src/workerd/api/node/tests/sys-nodejs-test.js b/src/workerd/api/node/tests/sys-nodejs-test.js new file mode 100644 index 00000000000..59d354ae6ac --- /dev/null +++ b/src/workerd/api/node/tests/sys-nodejs-test.js @@ -0,0 +1,27 @@ +import assert from 'node:assert'; +import module from 'node:module'; + +export const getBuiltinModule = { + async test() { + assert.deepStrictEqual( + process.getBuiltinModule('node:sys'), + process.getBuiltinModule('node:util') + ); + }, +}; + +export const canBeRequired = { + async test() { + const require = module.createRequire('/hello'); + assert.deepStrictEqual(require('node:sys'), require('node:util')); + assert.deepStrictEqual(require('sys'), require('node:util')); + }, +}; + +export const canBeImported = { + async test() { + const sys = await import('node:sys'); + const util = await import('node:util'); + assert.deepStrictEqual(sys, util); + }, +}; diff --git a/src/workerd/api/node/tests/sys-nodejs-test.wd-test b/src/workerd/api/node/tests/sys-nodejs-test.wd-test new file mode 100644 index 00000000000..1d05262cdd2 --- /dev/null +++ b/src/workerd/api/node/tests/sys-nodejs-test.wd-test @@ -0,0 +1,15 @@ +using Workerd = import "/workerd/workerd.capnp"; + +const unitTests :Workerd.Config = ( + services = [ + ( name = "nodejs-sys-test", + worker = ( + modules = [ + (name = "worker", esModule = embed "sys-nodejs-test.js") + ], + compatibilityDate = "2024-09-03", + compatibilityFlags = ["nodejs_compat"], + ) + ), + ], +); diff --git a/src/workerd/jsg/util.c++ b/src/workerd/jsg/util.c++ index 2a303ba5d88..889bcdc697b 100644 --- a/src/workerd/jsg/util.c++ +++ b/src/workerd/jsg/util.c++ @@ -708,6 +708,14 @@ static const std::set NODEJS_BUILTINS{"_http_agent"_kj, "_http_cl } // namespace kj::Maybe checkNodeSpecifier(kj::StringPtr specifier) { + // The sys module was renamed to 'util'. This shim remains to keep old programs + // working. `sys` is deprecated and shouldn't be used. + // Note to maintainers: Although this module has been deprecated for a while + // Node.js do not plan to remove it. + // See: https://github.com/nodejs/node/pull/35407#issuecomment-700693439 + if (specifier == "sys" || specifier == "node:sys") [[unlikely]] { + return kj::str("node:util"); + } if (NODEJS_BUILTINS.contains(specifier)) { return kj::str("node:", specifier); } else if (specifier.startsWith("node:")) {