diff --git a/doc/api/modules.md b/doc/api/modules.md index c6a25df417a1ba..671aeea386de9c 100644 --- a/doc/api/modules.md +++ b/doc/api/modules.md @@ -817,6 +817,32 @@ The `module.require` method provides a way to load a module as if `module` is typically *only* available within a specific module's code, it must be explicitly exported in order to be used. +## Listing and Identifying Core Modules + +The current set of the core modules may be identified using the +`Module.isCoreModule()` and `Module.listCoreModules()` methods. + +```js +const { + isCoreModule, + listCoreModules +} = require('module'); + +console.log(isCoreModule('http2')); // true +console.log(isCoreModule('foo')); // false + +listCoreModules().forEach(console.log); +``` + +### Module.isCoreModule(id) + +* `id` {string} A module name +* Returns `true` if `id` identifies a core module, false otherwise + +### Module.getCoreModules() + +* Returns: An array of core module names + [`__dirname`]: #modules_dirname [`__filename`]: #modules_filename [`Error`]: errors.html#errors_class_error diff --git a/lib/module.js b/lib/module.js index e92c0b61d9e548..0d2bc7592e0f08 100644 --- a/lib/module.js +++ b/lib/module.js @@ -37,6 +37,10 @@ const { const preserveSymlinks = !!process.binding('config').preserveSymlinks; const experimentalModules = !!process.binding('config').experimentalModules; +const kCoreModules = + new Set(Object.keys(process.binding('natives')) + .filter((name) => !name.startsWith('internal/'))); + const errors = require('internal/errors'); const Loader = require('internal/loader/Loader'); @@ -74,6 +78,14 @@ function Module(id, parent) { } module.exports = Module; +Module.getCoreModules = function getCoreModules() { + return Array.from(kCoreModules); +}; + +Module.isCoreModule = function isCoreModule(name) { + return kCoreModules.has(name); +}; + Module._cache = Object.create(null); Module._pathCache = Object.create(null); Module._extensions = Object.create(null); diff --git a/test/parallel/test-module-core-modules.js b/test/parallel/test-module-core-modules.js new file mode 100644 index 00000000000000..6dd05de91ed906 --- /dev/null +++ b/test/parallel/test-module-core-modules.js @@ -0,0 +1,26 @@ +'use strict'; + +require('../common'); +const assert = require('assert'); +const natives = process.binding('natives'); +const { + isCoreModule, + getCoreModules +} = require('module'); + +const keys = Object.keys(natives); + +keys.filter((name) => !name.startsWith('internal/')) + .forEach((i) => assert(isCoreModule(i))); + +keys.filter((name) => name.startsWith('internal/')) + .forEach((i) => assert(!isCoreModule(i))); + +['foo', 'bar', 'baz'] + .forEach((i) => assert(!isCoreModule(i))); + +const list = getCoreModules(); + +assert(Array.isArray(list)); +assert.deepStrictEqual(list, + keys.filter((name) => !name.startsWith('internal/')));