diff --git a/doc/api/module.md b/doc/api/module.md index ffb07d6b5a32b87..99e6b1e0aa6b5f6 100644 --- a/doc/api/module.md +++ b/doc/api/module.md @@ -28,7 +28,7 @@ added: A list of the names of all modules provided by Node.js. Can be used to verify if a module is maintained by a third party or not. -Note: the list doesn't contain [prefix-only modules][] like `node:test`. +Note: the list also contains [prefix-only modules][] like `node:test`. `module` in this context isn't the same object that's provided by the [module wrapper][]. To access it, require the `Module` module: diff --git a/doc/api/modules.md b/doc/api/modules.md index 9daaf5111deb0ae..1c8ae41e25629d1 100644 --- a/doc/api/modules.md +++ b/doc/api/modules.md @@ -513,7 +513,7 @@ Some built-in modules are always preferentially loaded if their identifier is passed to `require()`. For instance, `require('http')` will always return the built-in HTTP module, even if there is a file by that name. The list of built-in modules that can be loaded without using the `node:` prefix is exposed -as [`module.builtinModules`][]. +in [`module.builtinModules`][], listed without the prefix. ### Built-in modules with mandatory `node:` prefix @@ -527,6 +527,8 @@ taken the name. Currently the built-in modules that requires the `node:` prefix * [`node:test`][] * [`node:test/reporters`][] +The list of these modules is exposed in [`module.builtinModules`][], including the prefix. + ## Cycles diff --git a/lib/internal/bootstrap/realm.js b/lib/internal/bootstrap/realm.js index c11f70dd6bf3298..e9e85a3fc08a268 100644 --- a/lib/internal/bootstrap/realm.js +++ b/lib/internal/bootstrap/realm.js @@ -320,14 +320,17 @@ class BuiltinModule { ); } - static getCanBeRequiredByUsersWithoutSchemeList() { - return ArrayFrom(canBeRequiredByUsersWithoutSchemeList); - } - static getSchemeOnlyModuleNames() { return ArrayFrom(schemelessBlockList); } + static getAllBuiltinModuleIds() { + return [ + ...canBeRequiredByUsersWithoutSchemeList, + ...ArrayFrom(schemelessBlockList, x => `node:${x}`), + ]; + } + // Used by user-land module loaders to compile and load builtins. compileForPublicLoader() { if (!BuiltinModule.canBeRequiredByUsers(this.id)) { diff --git a/lib/internal/modules/cjs/loader.js b/lib/internal/modules/cjs/loader.js index f99d0fc2a7a0eb3..a8af56e4c9d21cf 100644 --- a/lib/internal/modules/cjs/loader.js +++ b/lib/internal/modules/cjs/loader.js @@ -420,8 +420,8 @@ Module.isBuiltin = BuiltinModule.isBuiltin; */ function initializeCJS() { // This need to be done at runtime in case --expose-internals is set. - const builtinModules = BuiltinModule.getCanBeRequiredByUsersWithoutSchemeList(); - Module.builtinModules = ObjectFreeze(builtinModules); + + Module.builtinModules = ObjectFreeze(BuiltinModule.getAllBuiltinModuleIds()); initializeCjsConditions(); diff --git a/test/parallel/test-internal-module-require.js b/test/parallel/test-internal-module-require.js index c6e2057d3da1eee..058273c7ea4304a 100644 --- a/test/parallel/test-internal-module-require.js +++ b/test/parallel/test-internal-module-require.js @@ -87,6 +87,9 @@ if (process.argv[2] === 'child') { }); } else { require(id); + if (!id.startsWith('node:')) { + require(`node:${id}`); + } publicModules.add(id); } }