Skip to content

Commit 640353a

Browse files
XadillaXBethGriggs
authored andcommitted
lib,repl: ignore non-canBeRequiredByUsers built-in
e.g. `wasi` under no `--experimental-wasi-unstable-preview1` flag shouldn't be pre-required. PR-URL: #39942 Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de> Reviewed-By: Zijian Liu <lxxyxzj@gmail.com>
1 parent 29104f5 commit 640353a

4 files changed

Lines changed: 44 additions & 5 deletions

File tree

‎lib/internal/main/eval_string.js‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ const { addBuiltinLibsToObject } = require('internal/modules/cjs/helpers');
1616
const{ getOptionValue }=require('internal/options');
1717

1818
prepareMainThreadExecution();
19-
addBuiltinLibsToObject(globalThis);
19+
addBuiltinLibsToObject(globalThis,'<eval>');
2020
markBootstrapComplete();
2121

2222
constsource=getOptionValue('--eval');

‎lib/internal/modules/cjs/helpers.js‎

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -131,9 +131,16 @@ function stripBOM(content) {
131131
returncontent;
132132
}
133133

134-
functionaddBuiltinLibsToObject(object){
134+
functionaddBuiltinLibsToObject(object,dummyModuleName){
135135
// Make built-in modules available directly (loaded lazily).
136-
const{ builtinModules }=require('internal/modules/cjs/loader').Module;
136+
constModule=require('internal/modules/cjs/loader').Module;
137+
const{ builtinModules }=Module;
138+
139+
// To require built-in modules in user-land and ignore modules whose
140+
// `canBeRequiredByUsers` is false. So we create a dummy module object and not
141+
// use `require()` directly.
142+
constdummyModule=newModule(dummyModuleName);
143+
137144
ArrayPrototypeForEach(builtinModules,(name)=>{
138145
// Neither add underscored modules, nor ones that contain slashes (e.g.,
139146
// 'fs/promises') or ones that are already defined.
@@ -157,7 +164,7 @@ function addBuiltinLibsToObject(object) {
157164

158165
ObjectDefineProperty(object,name,{
159166
get: ()=>{
160-
constlib=require(name);
167+
constlib=dummyModule.require(name);
161168

162169
// Disable the current getter/setter and set up a new
163170
// non-enumerable property.

‎lib/repl.js‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1098,7 +1098,7 @@ REPLServer.prototype.createContext = function() {
10981098
value: makeRequireFunction(replModule)
10991099
});
11001100

1101-
addBuiltinLibsToObject(context);
1101+
addBuiltinLibsToObject(context,'<REPL>');
11021102

11031103
returncontext;
11041104
};
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
'use strict';
2+
3+
require('../common');
4+
constassert=require('assert');
5+
constcp=require('child_process');
6+
7+
functionrunREPLWithAdditionalFlags(flags){
8+
// Use -i to force node into interactive mode, despite stdout not being a TTY
9+
constargs=['-i'].concat(flags);
10+
constret=cp.execFileSync(process.execPath,args,{
11+
input: 'require(\'events\');\nrequire(\'wasi\');',
12+
encoding: 'utf8',
13+
});
14+
returnret;
15+
}
16+
17+
// Run REPL in normal mode.
18+
letstdout=runREPLWithAdditionalFlags([]);
19+
assert.match(stdout,/\[Function:EventEmitter\]{/);
20+
assert.match(
21+
stdout,
22+
/UncaughtError:Cannotfindmodule'wasi'[\w\W]+-<repl>\n/);
23+
24+
// Run REPL with '--experimental-wasi-unstable-preview1'
25+
stdout=runREPLWithAdditionalFlags([
26+
'--experimental-wasi-unstable-preview1',
27+
]);
28+
assert.match(stdout,/\[Function:EventEmitter\]{/);
29+
assert.doesNotMatch(
30+
stdout,
31+
/UncaughtError:Cannotfindmodule'wasi'[\w\W]+-<repl>\n/);
32+
assert.match(stdout,/{WASI:\[classWASI\]}/);

0 commit comments

Comments
 (0)