From 79ffed7738f60bad18f2febc4d05433169742ec5 Mon Sep 17 00:00:00 2001 From: sjungwon03 Date: Thu, 20 Aug 2026 10:43:34 +0900 Subject: [PATCH] module: derive builtinModules from enabled builtin set Signed-off-by: sjungwon03 --- lib/internal/bootstrap/realm.js | 11 +++++- lib/internal/modules/cjs/loader.js | 15 +------- .../test-module-builtin-experimental.js | 35 +++++++++++++++++++ 3 files changed, 46 insertions(+), 15 deletions(-) create mode 100644 test/parallel/test-module-builtin-experimental.js diff --git a/lib/internal/bootstrap/realm.js b/lib/internal/bootstrap/realm.js index 8a4d179806aa..4dfb39ae9568 100644 --- a/lib/internal/bootstrap/realm.js +++ b/lib/internal/bootstrap/realm.js @@ -334,7 +334,16 @@ class BuiltinModule { static getAllBuiltinModuleIds() { const allBuiltins = ArrayFrom(canBeRequiredByUsersWithoutSchemeList); - ArrayPrototypePushApply(allBuiltins, ArrayFrom(schemelessBlockList, (x) => `node:${x}`)); + ArrayPrototypePushApply( + allBuiltins, + ArrayPrototypeMap( + ArrayPrototypeFilter( + ArrayFrom(schemelessBlockList), + (id) => canBeRequiredByUsersList.has(id), + ), + (id) => 'node:' + id, + ), + ); return allBuiltins; } diff --git a/lib/internal/modules/cjs/loader.js b/lib/internal/modules/cjs/loader.js index bb466d0b68d5..6f62e9626ffe 100644 --- a/lib/internal/modules/cjs/loader.js +++ b/lib/internal/modules/cjs/loader.js @@ -492,20 +492,7 @@ Module.isBuiltin = BuiltinModule.isBuiltin; function initializeCJS() { // This need to be done at runtime in case --expose-internals is set. - let modules = Module.builtinModules = BuiltinModule.getAllBuiltinModuleIds(); - if (!getOptionValue('--experimental-dtls')) { - modules = modules.filter((i) => i !== 'node:dtls'); - } - if (!getOptionValue('--experimental-quic')) { - modules = modules.filter((i) => i !== 'node:quic'); - } - if (!getOptionValue('--experimental-ffi')) { - modules = modules.filter((i) => i !== 'node:ffi'); - } - if (!getOptionValue('--experimental-vfs')) { - modules = modules.filter((i) => i !== 'node:vfs'); - } - Module.builtinModules = ObjectFreeze(modules); + Module.builtinModules = ObjectFreeze(BuiltinModule.getAllBuiltinModuleIds()); initializeCjsConditions(); diff --git a/test/parallel/test-module-builtin-experimental.js b/test/parallel/test-module-builtin-experimental.js new file mode 100644 index 000000000000..b8a5713a906d --- /dev/null +++ b/test/parallel/test-module-builtin-experimental.js @@ -0,0 +1,35 @@ +'use strict'; + +const common = require('../common'); +const { spawnSyncAndAssert } = require('../common/child_process'); + +const experimentalBuiltins = [ + ['dtls', '--experimental-dtls', common.hasDtls], + ['ffi', '--experimental-ffi', common.hasFFI], + ['quic', '--experimental-quic', common.hasQuic], + ['vfs', '--experimental-vfs', true], +].filter(([, , available]) => available); + +for (const [id, flag] of experimentalBuiltins) { + const builtin = `node:${id}`; + + spawnSyncAndAssert(process.execPath, [ + '-e', `const m = require('node:module'); if (m.builtinModules.includes('${builtin}')) process.exit(1); try { require('${builtin}'); } catch (e) { if (e.code === 'ERR_UNKNOWN_BUILTIN_MODULE') process.exit(0); } process.exit(1);`, + ], { status: 0 }); + + spawnSyncAndAssert(process.execPath, [ + flag, + '-e', `const m = require('node:module'); if (!m.builtinModules.includes('${builtin}')) process.exit(1); require('${builtin}');`, + ], { status: 0 }); +} + +const schemeOnlyBuiltins = ['node:test', 'node:sea']; +if (common.hasSQLite) { + schemeOnlyBuiltins.push('node:sqlite'); +} + +for (const id of schemeOnlyBuiltins) { + spawnSyncAndAssert(process.execPath, [ + '-e', `const m = require('node:module'); if (!m.builtinModules.includes('${id}')) process.exit(1); require('${id}');`, + ], { status: 0 }); +}