Skip to content
This repository has been archived by the owner on Apr 22, 2023. It is now read-only.

Commit

Permalink
Browse files Browse the repository at this point in the history
repl: add automatic loading of built-in libs
  • Loading branch information
Brandon Benvie authored and bnoordhuis committed Feb 20, 2012
1 parent 8d3c46d commit b722771
Show file tree
Hide file tree
Showing 2 changed files with 91 additions and 6 deletions.
26 changes: 20 additions & 6 deletions lib/repl.js
Expand Up @@ -67,6 +67,11 @@ module.paths = require('module')._nodeModulePaths(module.filename);
// Can overridden with custom print functions, such as `probe` or `eyes.js`
exports.writer = util.inspect;

var builtinLibs = ['assert', 'buffer', 'child_process', 'cluster',
'crypto', 'dgram', 'dns', 'events', 'fs', 'http', 'https', 'net',
'os', 'path', 'punycode', 'querystring', 'readline', 'repl',
'string_decoder', 'tls', 'tty', 'url', 'util', 'vm', 'zlib'];


function REPLServer(prompt, stream, eval, useGlobal, ignoreUndefined) {
var self = this;
Expand Down Expand Up @@ -167,6 +172,21 @@ function REPLServer(prompt, stream, eval, useGlobal, ignoreUndefined) {
}
}

// Check if a builtin module name was used and then include it
// if there's no conflict.
if (~builtinLibs.indexOf(cmd)) {
var lib = require(cmd);
if (cmd in self.context && lib !== self.context[cmd]) {
self.outputStream.write('A different "' + cmd +
'" already exists globally\n');
} else {
self.context._ = self.context[cmd] = lib;
self.outputStream.write(exports.writer(lib) + '\n');
}
self.displayPrompt();
return;
}

if (!skipCatchall) {
var evalCmd = self.bufferedCommand + cmd + '\n';

Expand Down Expand Up @@ -428,12 +448,6 @@ REPLServer.prototype.complete = function(line, callback) {
}

if (!subdir) {
// Kind of lame that this needs to be updated manually.
// Intentionally excluding moved modules: posix, utils.
var builtinLibs = ['assert', 'buffer', 'child_process', 'crypto', 'dgram',
'dns', 'events', 'file', 'freelist', 'fs', 'http', 'net', 'os', 'path',
'querystring', 'readline', 'repl', 'string_decoder', 'util', 'tcp',
'url'];
completionGroups.push(builtinLibs);
}

Expand Down
71 changes: 71 additions & 0 deletions test/simple/test-repl-autolibs.js
@@ -0,0 +1,71 @@
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.

var assert = require('assert');
var util = require('util');
var repl = require('repl');

// A stream to push an array into a REPL
function ArrayStream() {
this.run = function (data) {
var self = this;
data.forEach(function (line) {
self.emit('data', line);
});
}
}
util.inherits(ArrayStream, require('stream').Stream);
ArrayStream.prototype.readable = true;
ArrayStream.prototype.writable = true;
ArrayStream.prototype.resume = function () {};
ArrayStream.prototype.write = function () {};

var putIn = new ArrayStream;
var testMe = repl.start('', putIn, null, true);

test1();

function test1(){
putIn.write = function (data) {
if (data.length) {
// inspect output matches repl output
assert.equal(data, util.inspect(require('fs'), null, null, false) + '\n');
// globally added lib matches required lib
assert.equal(global.fs, require('fs'));
test2();
}
};
putIn.run(['fs']);
}

function test2(){
putIn.write = function(data) {
if (data.length) {
// repl response error message
assert.equal(data.indexOf('A different'), 0);
// original value wasn't overwritten
assert.equal(val, global.url);
}
};
var val = {};
global.url = val;
putIn.run(['url']);
}

0 comments on commit b722771

Please sign in to comment.