Skip to content

Commit 600c225

Browse files
devsnektargos
authored andcommitted
module: add createRequireFunction method
PR-URL: #19360 Reviewed-By: Anna Henningsen <[email protected]> Reviewed-By: Benjamin Gruenbaum <[email protected]> Reviewed-By: Jan Krems <[email protected]> Reviewed-By: Bradley Farias <[email protected]> Reviewed-By: John-David Dalton <[email protected]>
1 parent adaf530 commit 600c225

File tree

3 files changed

+38
-2
lines changed

3 files changed

+38
-2
lines changed

doc/api/modules.md

+18
Original file line numberDiff line numberDiff line change
@@ -888,12 +888,30 @@ by the [module wrapper][]. To access it, require the `Module` module:
888888
const builtin = require('module').builtinModules;
889889
```
890890

891+
### module.createRequireFromPath(filename)
892+
<!-- YAML
893+
added: REPLACEME
894+
-->
895+
896+
* `filename` {string} Filename to be used to construct the relative require
897+
function.
898+
* Returns: {[`require`][]} Require function
899+
900+
```js
901+
const { createRequireFromPath } = require('module');
902+
const requireUtil = createRequireFromPath('../src/utils');
903+
904+
// require `../src/utils/some-tool`
905+
requireUtil('./some-tool');
906+
```
907+
891908
[`__dirname`]: #modules_dirname
892909
[`__filename`]: #modules_filename
893910
[`Error`]: errors.html#errors_class_error
894911
[`module` object]: #modules_the_module_object
895912
[`path.dirname()`]: path.html#path_path_dirname_path
896913
[GLOBAL_FOLDERS]: #modules_loading_from_the_global_folders
914+
[`require`]: #modules_require
897915
[exports shortcut]: #modules_exports_shortcut
898916
[module resolution]: #modules_all_together
899917
[module wrapper]: #modules_the_module_wrapper

lib/internal/modules/cjs/loader.js

+8-2
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323

2424
const { NativeModule } = require('internal/bootstrap/loaders');
2525
const util = require('util');
26+
const { pathToFileURL } = require('internal/url');
2627
const vm = require('vm');
2728
const assert = require('assert').ok;
2829
const fs = require('fs');
@@ -54,7 +55,6 @@ module.exports = Module;
5455
let asyncESM;
5556
let ModuleJob;
5657
let createDynamicModule;
57-
let pathToFileURL;
5858
let decorateErrorStack;
5959

6060
function lazyLoadESM() {
@@ -63,7 +63,6 @@ function lazyLoadESM() {
6363
createDynamicModule = require(
6464
'internal/modules/esm/create_dynamic_module');
6565
decorateErrorStack = require('internal/util').decorateErrorStack;
66-
pathToFileURL = require('internal/url').pathToFileURL;
6766
}
6867

6968
const {
@@ -745,6 +744,13 @@ Module.runMain = function() {
745744
process._tickCallback();
746745
};
747746

747+
Module.createRequireFromPath = (filename) => {
748+
const m = new Module(filename);
749+
m.filename = filename;
750+
m.paths = Module._nodeModulePaths(path.dirname(filename));
751+
return makeRequireFunction(m);
752+
};
753+
748754
Module._initPaths = function() {
749755
const isWindows = process.platform === 'win32';
750756

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
'use strict';
2+
3+
require('../common');
4+
const assert = require('assert');
5+
const path = require('path');
6+
7+
const { createRequireFromPath } = require('module');
8+
9+
const p = path.resolve(__dirname, '..', 'fixtures', 'fake.js');
10+
11+
const req = createRequireFromPath(p);
12+
assert.strictEqual(req('./baz'), 'perhaps I work');

0 commit comments

Comments
 (0)