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.

PR-URL: https://github.com/nodejs/node/pull/6207
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
This commit is contained in:
Anna Henningsen 2016-04-18 13:19:12 +02:00 коммит произвёл James M Snell
Родитель 39d905e293
Коммит ebc8c37f70
1 изменённых файлов: 25 добавлений и 10 удалений

Просмотреть файл

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