Skip to content
Closed
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
repl: Keep the built-in modules non-enumerable
Make sure that the built-in modules in the repl stay non-enumerable.
Previously, they would pop up as enumerable properties of the global
object after having been accessed for the first time.
  • Loading branch information
addaleax committed Apr 18, 2016
commit 6015b6a983c510cc45bfdebc75daab053ecb1021
35 changes: 25 additions & 10 deletions lib/internal/module.js
Original file line number Diff line number Diff line change
Expand Up @@ -59,21 +59,36 @@ exports.builtinLibs = ['assert', 'buffer', 'child_process', 'cluster',
function addBuiltinLibsToObject(object) {
// Make built-in modules available directly (loaded lazily).
exports.builtinLibs.forEach((name) => {
// Goals of this mechanism are:
// - Lazy loading of built-in modules
// - Having all built-in modules available as non-enumerable properties
// - Allowing the user to re-assign these variables as if there were no
// pre-existing globals with the same name.

const setReal = (val) => {
// Deleting the property before re-assigning it disables the
// getter/setter mechanism.
delete object[name];
object[name] = val;
};

Object.defineProperty(object, name, {
get: () => {
const lib = require(name);
// This implicitly invokes the setter, so that this getter is only
// invoked at most once and does not overwrite anything.
object[name] = lib;
return lib;
},
// Allow the creation of other globals with this name.
set: (val) => {
// Deleting the property before re-assigning it disables the
// getter/setter mechanism.

// Disable the current getter/setter and set up a new
// non-enumerable property.
delete object[name];
object[name] = val;
Object.defineProperty(object, name, {
get: () => lib,
set: setReal,
configurable: true,
enumerable: false
});

return lib;
},
set: setReal,
configurable: true,
enumerable: false
});
Expand Down