Skip to content

Commit 457f24f

Browse files
addaleaxMyles Borins
authored andcommitted
node: make builtin libs available for --eval
Make the builtin libraries available for the `--eval` and `--print` CLI options, using the same mechanism that the REPL uses. This renders workarounds like `node -e 'require("fs").doStuff()'` unnecessary. As part of this, the list of builtin modules and the code for adding the corresponding properties to the target context is moved to `internal/module.js`, and the previously missing `repl` entry is added. PR-URL: #6207 Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
1 parent 83bc0a2 commit 457f24f

5 files changed

Lines changed: 48 additions & 23 deletions

File tree

‎doc/api/cli.markdown‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,8 @@ The output of this option is less detailed than this document.
3636

3737
### `-e`, `--eval "script"`
3838

39-
Evaluate the following argument as JavaScript.
39+
Evaluate the following argument as JavaScript. The modules which are
40+
predefined in the REPL can also be used in `script`.
4041

4142

4243
### `-p`, `--print "script"`

‎lib/internal/bootstrap_node.js‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,9 @@
9494
// User passed '-e' or '--eval' arguments to Node without '-i' or
9595
// '--interactive'
9696
preloadModules();
97+
98+
constinternalModule=NativeModule.require('internal/module');
99+
internalModule.addBuiltinLibsToObject(global);
97100
evalScript('[eval]');
98101
}elseif(process.argv[1]){
99102
// make process.argv[1] into a full path

‎lib/internal/module.js‎

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
'use strict';
22

3-
exports=module.exports={ makeRequireFunction, stripBOM };
3+
exports=module.exports={
4+
makeRequireFunction,
5+
stripBOM,
6+
addBuiltinLibsToObject
7+
};
48

59
exports.requireDepth=0;
610

@@ -44,3 +48,32 @@ function stripBOM(content) {
4448
}
4549
returncontent;
4650
}
51+
52+
exports.builtinLibs=['assert','buffer','child_process','cluster',
53+
'crypto','dgram','dns','domain','events','fs','http','https','net',
54+
'os','path','punycode','querystring','readline','repl','stream',
55+
'string_decoder','tls','tty','url','util','v8','vm','zlib'];
56+
57+
functionaddBuiltinLibsToObject(object){
58+
// Make built-in modules available directly (loaded lazily).
59+
exports.builtinLibs.forEach((name)=>{
60+
Object.defineProperty(object,name,{
61+
get: ()=>{
62+
constlib=require(name);
63+
// This implicitly invokes the setter, so that this getter is only
64+
// invoked at most once and does not overwrite anything.
65+
object[name]=lib;
66+
returnlib;
67+
},
68+
// Allow the creation of other globals with this name.
69+
set: (val)=>{
70+
// Deleting the property before re-assigning it disables the
71+
// getter/setter mechanism.
72+
deleteobject[name];
73+
object[name]=val;
74+
},
75+
configurable: true,
76+
enumerable: false
77+
});
78+
});
79+
}

‎lib/repl.js‎

Lines changed: 2 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -64,10 +64,7 @@ function hasOwnProperty(obj, prop) {
6464
// This is the default "writer" value if none is passed in the REPL options.
6565
exports.writer=util.inspect;
6666

67-
exports._builtinLibs=['assert','buffer','child_process','cluster',
68-
'crypto','dgram','dns','domain','events','fs','http','https','net',
69-
'os','path','punycode','querystring','readline','stream',
70-
'string_decoder','tls','tty','url','util','v8','vm','zlib'];
67+
exports._builtinLibs=internalModule.builtinLibs;
7168

7269

7370
constBLOCK_SCOPED_ERROR='Block-scoped declarations (let, const, function, '+
@@ -559,23 +556,7 @@ REPLServer.prototype.createContext = function() {
559556
this.lines=[];
560557
this.lines.level=[];
561558

562-
// make built-in modules available directly
563-
// (loaded lazily)
564-
exports._builtinLibs.forEach(function(name){
565-
Object.defineProperty(context,name,{
566-
get: function(){
567-
varlib=require(name);
568-
context._=context[name]=lib;
569-
returnlib;
570-
},
571-
// allow the creation of other globals with this name
572-
set: function(val){
573-
deletecontext[name];
574-
context[name]=val;
575-
},
576-
configurable: true
577-
});
578-
});
559+
internalModule.addBuiltinLibsToObject(context);
579560

580561
returncontext;
581562
};

‎test/parallel/test-cli-eval.js‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,13 @@ child.exec(nodejs + ' --eval "require(\'' + filename + '\')"',
5353
assert.equal(status.code,42);
5454
});
5555

56+
// Check that builtin modules are pre-defined.
57+
child.exec(nodejs+' --print "os.platform()"',
58+
function(status,stdout,stderr){
59+
assert.strictEqual(stderr,'');
60+
assert.strictEqual(stdout.trim(),require('os').platform());
61+
});
62+
5663
// module path resolve bug, regression test
5764
child.exec(nodejs+' --eval "require(\'./test/parallel/test-cli-eval.js\')"',
5865
function(status,stdout,stderr){

0 commit comments

Comments
 (0)