Skip to content

Commit 8615225

Browse files
committed
module: add support for require("node:…")
Fixes: #36098
1 parent 2ff1c83 commit 8615225

File tree

2 files changed

+46
-2
lines changed

2 files changed

+46
-2
lines changed

lib/internal/modules/cjs/loader.js

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,8 @@ let hasLoadedAnyUserCJSModule = false;
109109
const {
110110
ERR_INVALID_ARG_VALUE,
111111
ERR_INVALID_MODULE_SPECIFIER,
112-
ERR_REQUIRE_ESM
112+
ERR_REQUIRE_ESM,
113+
ERR_UNKNOWN_BUILTIN_MODULE,
113114
} = require('internal/errors').codes;
114115
const { validateString } = require('internal/validators');
115116
const pendingDeprecation = getOptionValue('--pending-deprecation');
@@ -766,6 +767,14 @@ Module._load = function(request, parent, isMain) {
766767
}
767768

768769
const filename = Module._resolveFilename(request, parent, isMain);
770+
if (StringPrototypeStartsWith(filename, 'node:')) {
771+
const specifier = StringPrototypeSlice(filename, 5);
772+
773+
const mod = loadNativeModule(specifier, request);
774+
if (mod && mod.canBeRequiredByUsers) return mod.exports;
775+
776+
throw new ERR_UNKNOWN_BUILTIN_MODULE(specifier);
777+
}
769778

770779
const cachedModule = Module._cache[filename];
771780
if (cachedModule !== undefined) {
@@ -837,7 +846,8 @@ Module._load = function(request, parent, isMain) {
837846
};
838847

839848
Module._resolveFilename = function(request, parent, isMain, options) {
840-
if (NativeModule.canBeRequiredByUsers(request)) {
849+
if (StringPrototypeStartsWith(request, 'node:') ||
850+
NativeModule.canBeRequiredByUsers(request)) {
841851
return request;
842852
}
843853

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
'use strict';
2+
3+
require('../common');
4+
const assert = require('assert');
5+
const fs = require('fs');
6+
7+
// For direct use of require expressions inside of CJS modules,
8+
// including via eval, all kinds of specifiers should work without issue.
9+
{
10+
// Importing a built-in, both direct & via eval
11+
assert.strictEqual(require('fs'), fs);
12+
assert.strictEqual(eval('require("fs")'), fs);
13+
assert.strictEqual(require('node:fs'), fs);
14+
assert.strictEqual(eval('require("node:fs")'), fs);
15+
16+
assert.throws(
17+
() => require('node:unknown'),
18+
{ code: 'ERR_UNKNOWN_BUILTIN_MODULE' },
19+
);
20+
}
21+
22+
// `node:`-prefixed `require(...)` calls bypass the require cache:
23+
{
24+
const fakeModule = {};
25+
26+
require.cache.fs = { exports: fakeModule };
27+
28+
assert.strictEqual(require('fs'), fakeModule);
29+
assert.strictEqual(eval('require("fs")'), fakeModule);
30+
assert.strictEqual(require('node:fs'), fs);
31+
assert.strictEqual(eval('require("node:fs")'), fs);
32+
33+
delete require.cache.fs;
34+
}

0 commit comments

Comments
 (0)