Skip to content

Commit 60f1b3a

Browse files
committed
module: add module.builtinPrefixOnlyModules
Fixes #42785
1 parent dbfcbe3 commit 60f1b3a

File tree

4 files changed

+44
-3
lines changed

4 files changed

+44
-3
lines changed

doc/api/module.md

+27
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,33 @@ import { builtinModules as builtin } from 'node:module';
4545
const builtin = require('node:module').builtinModules;
4646
```
4747

48+
### `module.builtinPrefixOnlyModules`
49+
50+
<!-- YAML
51+
added:
52+
- ?.?.?
53+
-->
54+
55+
* {string\[]}
56+
57+
A list of the names of all modules provided by Node.js that require a `node:` prefix.
58+
Can be used to verify if a module is maintained by a third party or not.
59+
60+
`module` in this context isn't the same object that's provided
61+
by the [module wrapper][]. To access it, require the `Module` module:
62+
63+
```mjs
64+
// module.mjs
65+
// In an ECMAScript module
66+
import { builtinPrefoxOnlyModules as builtinPrefixOnly } from 'node:module';
67+
```
68+
69+
```cjs
70+
// module.cjs
71+
// In a CommonJS module
72+
const builtinPrefixOnly = require('node:module').builtinPrefoxOnlyModules;
73+
```
74+
4875
### `module.createRequire(filename)`
4976

5077
<!-- YAML

doc/api/modules.md

+3
Original file line numberDiff line numberDiff line change
@@ -527,6 +527,8 @@ taken the name. Currently the built-in modules that requires the `node:` prefix
527527
* [`node:test`][]
528528
* [`node:test/reporters`][]
529529

530+
The list of these modules is exposed as [`module.builtinPrefixOnlyModules`][].
531+
530532
## Cycles
531533

532534
<!--type=misc-->
@@ -1278,6 +1280,7 @@ This section was moved to
12781280
[`__filename`]: #__filename
12791281
[`import()`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/import
12801282
[`module.builtinModules`]: module.md#modulebuiltinmodules
1283+
[`module.builtinPrefixOnlyModules`]: module.md#modulebuiltinprefixonlymodules
12811284
[`module.children`]: #modulechildren
12821285
[`module.id`]: #moduleid
12831286
[`module` core module]: module.md

lib/internal/modules/cjs/loader.js

+3
Original file line numberDiff line numberDiff line change
@@ -423,6 +423,9 @@ function initializeCJS() {
423423
const builtinModules = BuiltinModule.getCanBeRequiredByUsersWithoutSchemeList();
424424
Module.builtinModules = ObjectFreeze(builtinModules);
425425

426+
const builtinPrefixOnlyModules = ArrayPrototypeMap(BuiltinModule.getSchemeOnlyModuleNames(), x => `node:${x}`);
427+
Module.builtinPrefixOnlyModules = ObjectFreeze(builtinPrefixOnlyModules);
428+
426429
initializeCjsConditions();
427430

428431
if (!getEmbedderOptions().noGlobalSearchPaths) {

test/parallel/test-internal-module-require.js

+11-3
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ const expectedPublicModules = new Set([
7575

7676
if (process.argv[2] === 'child') {
7777
assert(!process.execArgv.includes('--expose-internals'));
78-
process.once('message', ({ allBuiltins }) => {
78+
process.once('message', ({ allBuiltins, builtinPrefixOnlyModules }) => {
7979
const publicModules = new Set();
8080
for (const id of allBuiltins) {
8181
if (id.startsWith('internal/')) {
@@ -88,6 +88,7 @@ if (process.argv[2] === 'child') {
8888
} else {
8989
require(id);
9090
publicModules.add(id);
91+
require(`node:${id}`);
9192
}
9293
}
9394
assert(allBuiltins.length > publicModules.size);
@@ -98,15 +99,22 @@ if (process.argv[2] === 'child') {
9899
new Set(require('module').builtinModules)
99100
);
100101
assert.deepStrictEqual(publicModules, expectedPublicModules);
102+
103+
const prefixOnlyModules = new Set();
104+
for (const id of builtinPrefixOnlyModules) {
105+
require(id);
106+
prefixOnlyModules.add(id);
107+
}
108+
assert.deepStrictEqual(prefixOnlyModules, new Set(require('module').builtinPrefixOnlyModules));
101109
});
102110
} else {
103111
assert(process.execArgv.includes('--expose-internals'));
104112
const child = fork(__filename, ['child'], {
105113
execArgv: []
106114
});
107-
const { builtinModules } = require('module');
115+
const { builtinModules, builtinPrefixOnlyModules } = require('module');
108116
// When --expose-internals is on, require('module').builtinModules
109117
// contains internal modules.
110-
const message = { allBuiltins: builtinModules };
118+
const message = { allBuiltins: builtinModules, builtinPrefixOnlyModules };
111119
child.send(message);
112120
}

0 commit comments

Comments
 (0)