Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 98b9a8a

Browse files
committedFeb 6, 2021
module: add support for node:‑prefixed require(…) calls
Fixes: nodejs#36098
1 parent c0e66e3 commit 98b9a8a

File tree

2 files changed

+51
-2
lines changed

2 files changed

+51
-2
lines changed
 

Diff for: ‎lib/internal/modules/cjs/loader.js

+12-2
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

Diff for: ‎test/parallel/test-require-node-prefix.js

+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
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+
assert.throws(
22+
() => require('node:internal/test/binding'),
23+
{ code: 'ERR_UNKNOWN_BUILTIN_MODULE' },
24+
);
25+
}
26+
27+
// `node:`-prefixed `require(...)` calls bypass the require cache:
28+
{
29+
const fakeModule = {};
30+
31+
require.cache.fs = { exports: fakeModule };
32+
33+
assert.strictEqual(require('fs'), fakeModule);
34+
assert.strictEqual(eval('require("fs")'), fakeModule);
35+
assert.strictEqual(require('node:fs'), fs);
36+
assert.strictEqual(eval('require("node:fs")'), fs);
37+
38+
delete require.cache.fs;
39+
}

0 commit comments

Comments
 (0)
Please sign in to comment.