diff --git a/doc/api/repl.md b/doc/api/repl.md index d52ff0e7d012c5..5a2c35f4a1c494 100644 --- a/doc/api/repl.md +++ b/doc/api/repl.md @@ -540,6 +540,15 @@ by default. However, this is not the case when creating a REPL programmatically. Use this method to initialize a history log file when working with REPL instances programmatically. +## `repl.builtinModules` +<!-- YAML +added: REPLACEME +--> + +* {string[]} + +A list of the names of all Node.js modules, e.g., `'http'`. + ## `repl.start([options])` <!-- YAML added: v0.1.91 diff --git a/lib/repl.js b/lib/repl.js index 41aaf126e39b94..8bd109ecaf52eb 100644 --- a/lib/repl.js +++ b/lib/repl.js @@ -86,7 +86,7 @@ const { const { Console } = require('console'); const CJSModule = require('internal/modules/cjs/loader').Module; let _builtinLibs = [...CJSModule.builtinModules] - .filter((e) => !e.startsWith('_')); + .filter((e) => !e.startsWith('_') && !e.includes('/')); const domain = require('domain'); const debug = require('internal/util/debuglog').debuglog('repl'); const { @@ -1610,6 +1610,13 @@ module.exports = { Recoverable }; +ObjectDefineProperty(module.exports, 'builtinModules', { + get: () => _builtinLibs, + set: (val) => _builtinLibs = val, + enumerable: true, + configurable: true +}); + ObjectDefineProperty(module.exports, '_builtinLibs', { get: pendingDeprecation ? deprecate( () => _builtinLibs, diff --git a/test/parallel/test-repl-tab-complete.js b/test/parallel/test-repl-tab-complete.js index c40485ce3f5eac..79604ba2d8edf9 100644 --- a/test/parallel/test-repl-tab-complete.js +++ b/test/parallel/test-repl-tab-complete.js @@ -224,9 +224,18 @@ putIn.run(['.clear']); testMe.complete('require(\'', common.mustCall(function(error, data) { assert.strictEqual(error, null); builtinModules.forEach((lib) => { - if (!lib.startsWith('_')) - assert(data[0].includes(lib), `${lib} not found`); + assert( + data[0].includes(lib) || lib.startsWith('_') || lib.includes('/'), + `${lib} not found` + ); }); + const newModule = 'foobar'; + assert(!builtinModules.includes(newModule)); + repl.builtinModules.push(newModule); + testMe.complete('require(\'', common.mustCall((_, [modules]) => { + assert.strictEqual(data[0].length + 1, modules.length); + assert(modules.includes(newModule)); + })); })); testMe.complete("require\t( 'n", common.mustCall(function(error, data) {