module: add createRequire method
This is an abstraction on top of creatRequireFromPath that can accept both paths, URL Strings, and URL Objects. PR-URL: https://github.com/nodejs/node/pull/27405 Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Jan Krems <jan.krems@gmail.com> Reviewed-By: Jeremiah Senkpiel <fishrock123@rocketmail.com> Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de> Reviewed-By: Rich Trott <rtrott@gmail.com>
This commit is contained in:
parent
8cac945126
commit
411063c6f5
@ -2439,6 +2439,19 @@ The `_channel` property of child process objects returned by `spawn()` and
|
|||||||
similar functions is not intended for public use. Use `ChildProcess.channel`
|
similar functions is not intended for public use. Use `ChildProcess.channel`
|
||||||
instead.
|
instead.
|
||||||
|
|
||||||
|
<a id="DEP0130"></a>
|
||||||
|
### DEP00XX: Module.createRequireFromPath()
|
||||||
|
<!-- YAML
|
||||||
|
changes:
|
||||||
|
- version: REPLACEME
|
||||||
|
pr-url: https://github.com/nodejs/node/pull/27405
|
||||||
|
description: Documentation-only.
|
||||||
|
-->
|
||||||
|
|
||||||
|
Type: Documentation-only
|
||||||
|
|
||||||
|
Module.createRequireFromPath() is deprecated. Please use [`module.createRequire()`][] instead.
|
||||||
|
|
||||||
[`--pending-deprecation`]: cli.html#cli_pending_deprecation
|
[`--pending-deprecation`]: cli.html#cli_pending_deprecation
|
||||||
[`Buffer.allocUnsafeSlow(size)`]: buffer.html#buffer_class_method_buffer_allocunsafeslow_size
|
[`Buffer.allocUnsafeSlow(size)`]: buffer.html#buffer_class_method_buffer_allocunsafeslow_size
|
||||||
[`Buffer.from(array)`]: buffer.html#buffer_class_method_buffer_from_array
|
[`Buffer.from(array)`]: buffer.html#buffer_class_method_buffer_from_array
|
||||||
@ -2486,6 +2499,7 @@ instead.
|
|||||||
[`http.request()`]: http.html#http_http_request_options_callback
|
[`http.request()`]: http.html#http_http_request_options_callback
|
||||||
[`https.get()`]: https.html#https_https_get_options_callback
|
[`https.get()`]: https.html#https_https_get_options_callback
|
||||||
[`https.request()`]: https.html#https_https_request_options_callback
|
[`https.request()`]: https.html#https_https_request_options_callback
|
||||||
|
[`module.createRequire()`]: modules.html#modules_module_createrequire_filename
|
||||||
[`os.networkInterfaces()`]: os.html#os_os_networkinterfaces
|
[`os.networkInterfaces()`]: os.html#os_os_networkinterfaces
|
||||||
[`os.tmpdir()`]: os.html#os_os_tmpdir
|
[`os.tmpdir()`]: os.html#os_os_tmpdir
|
||||||
[`process.env`]: process.html#process_process_env
|
[`process.env`]: process.html#process_process_env
|
||||||
|
@ -905,15 +905,36 @@ by the [module wrapper][]. To access it, require the `Module` module:
|
|||||||
const builtin = require('module').builtinModules;
|
const builtin = require('module').builtinModules;
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### module.createRequire(filename)
|
||||||
|
<!-- YAML
|
||||||
|
added: REPLACEME
|
||||||
|
-->
|
||||||
|
|
||||||
|
* `filename` {string|URL} Filename to be used to construct the require
|
||||||
|
function. Must be a file URL object, file URL string, or absolute path
|
||||||
|
string.
|
||||||
|
* Returns: {require} Require function
|
||||||
|
|
||||||
|
```js
|
||||||
|
const { createRequire } = require('module');
|
||||||
|
const requireUtil = createRequire(require.resolve('../src/utils/'));
|
||||||
|
|
||||||
|
// Require `../src/utils/some-tool`
|
||||||
|
requireUtil('./some-tool');
|
||||||
|
```
|
||||||
|
|
||||||
### module.createRequireFromPath(filename)
|
### module.createRequireFromPath(filename)
|
||||||
<!-- YAML
|
<!-- YAML
|
||||||
added: v10.12.0
|
added: v10.12.0
|
||||||
|
deprecated: REPLACEME
|
||||||
-->
|
-->
|
||||||
|
|
||||||
* `filename` {string} Filename to be used to construct the relative require
|
* `filename` {string} Filename to be used to construct the relative require
|
||||||
function.
|
function.
|
||||||
* Returns: {require} Require function
|
* Returns: {require} Require function
|
||||||
|
|
||||||
|
> Stability: 0 - Deprecated: Please use [`createRequire()`][] instead.
|
||||||
|
|
||||||
```js
|
```js
|
||||||
const { createRequireFromPath } = require('module');
|
const { createRequireFromPath } = require('module');
|
||||||
const requireUtil = createRequireFromPath('../src/utils/');
|
const requireUtil = createRequireFromPath('../src/utils/');
|
||||||
@ -926,6 +947,7 @@ requireUtil('./some-tool');
|
|||||||
[`Error`]: errors.html#errors_class_error
|
[`Error`]: errors.html#errors_class_error
|
||||||
[`__dirname`]: #modules_dirname
|
[`__dirname`]: #modules_dirname
|
||||||
[`__filename`]: #modules_filename
|
[`__filename`]: #modules_filename
|
||||||
|
[`createRequire()`]: #modules_module_createrequire_filename
|
||||||
[`module` object]: #modules_the_module_object
|
[`module` object]: #modules_the_module_object
|
||||||
[`path.dirname()`]: path.html#path_path_dirname_path
|
[`path.dirname()`]: path.html#path_path_dirname_path
|
||||||
[exports shortcut]: #modules_exports_shortcut
|
[exports shortcut]: #modules_exports_shortcut
|
||||||
|
@ -24,7 +24,7 @@
|
|||||||
const { JSON, Object, Reflect } = primordials;
|
const { JSON, Object, Reflect } = primordials;
|
||||||
|
|
||||||
const { NativeModule } = require('internal/bootstrap/loaders');
|
const { NativeModule } = require('internal/bootstrap/loaders');
|
||||||
const { pathToFileURL } = require('internal/url');
|
const { pathToFileURL, fileURLToPath, URL } = require('internal/url');
|
||||||
const { deprecate } = require('internal/util');
|
const { deprecate } = require('internal/util');
|
||||||
const vm = require('vm');
|
const vm = require('vm');
|
||||||
const assert = require('internal/assert');
|
const assert = require('internal/assert');
|
||||||
@ -824,7 +824,7 @@ Module.runMain = function() {
|
|||||||
Module._load(process.argv[1], null, true);
|
Module._load(process.argv[1], null, true);
|
||||||
};
|
};
|
||||||
|
|
||||||
Module.createRequireFromPath = (filename) => {
|
function createRequireFromPath(filename) {
|
||||||
// Allow a directory to be passed as the filename
|
// Allow a directory to be passed as the filename
|
||||||
const trailingSlash =
|
const trailingSlash =
|
||||||
filename.endsWith(path.sep) || path.sep !== '/' && filename.endsWith('\\');
|
filename.endsWith(path.sep) || path.sep !== '/' && filename.endsWith('\\');
|
||||||
@ -838,7 +838,34 @@ Module.createRequireFromPath = (filename) => {
|
|||||||
|
|
||||||
m.paths = Module._nodeModulePaths(m.path);
|
m.paths = Module._nodeModulePaths(m.path);
|
||||||
return makeRequireFunction(m);
|
return makeRequireFunction(m);
|
||||||
};
|
}
|
||||||
|
|
||||||
|
Module.createRequireFromPath = createRequireFromPath;
|
||||||
|
|
||||||
|
const createRequireError = 'must be a file URL object, file URL string, or' +
|
||||||
|
'absolute path string';
|
||||||
|
|
||||||
|
function createRequire(filename) {
|
||||||
|
let filepath;
|
||||||
|
if (typeof filename === 'object' && !(filename instanceof URL)) {
|
||||||
|
throw new ERR_INVALID_ARG_VALUE('filename', filename, createRequireError);
|
||||||
|
} else if (typeof filename === 'object' ||
|
||||||
|
typeof filename === 'string' && !path.isAbsolute(filename)) {
|
||||||
|
try {
|
||||||
|
filepath = fileURLToPath(filename);
|
||||||
|
} catch {
|
||||||
|
throw new ERR_INVALID_ARG_VALUE('filename', filename,
|
||||||
|
createRequireError);
|
||||||
|
}
|
||||||
|
} else if (typeof filename !== 'string') {
|
||||||
|
throw new ERR_INVALID_ARG_VALUE('filename', filename, createRequireError);
|
||||||
|
} else {
|
||||||
|
filepath = filename;
|
||||||
|
}
|
||||||
|
return createRequireFromPath(filepath);
|
||||||
|
}
|
||||||
|
|
||||||
|
Module.createRequire = createRequire;
|
||||||
|
|
||||||
Module._initPaths = function() {
|
Module._initPaths = function() {
|
||||||
var homeDir;
|
var homeDir;
|
||||||
|
@ -4,9 +4,31 @@ require('../common');
|
|||||||
const assert = require('assert');
|
const assert = require('assert');
|
||||||
const path = require('path');
|
const path = require('path');
|
||||||
|
|
||||||
const { createRequireFromPath } = require('module');
|
const { createRequire, createRequireFromPath } = require('module');
|
||||||
|
|
||||||
const p = path.resolve(__dirname, '..', 'fixtures', 'fake.js');
|
const p = path.resolve(__dirname, '..', 'fixtures', 'fake.js');
|
||||||
|
const u = new URL(`file://${p}`);
|
||||||
|
|
||||||
const req = createRequireFromPath(p);
|
const req = createRequireFromPath(p);
|
||||||
assert.strictEqual(req('./baz'), 'perhaps I work');
|
assert.strictEqual(req('./baz'), 'perhaps I work');
|
||||||
|
|
||||||
|
const reqToo = createRequire(u);
|
||||||
|
assert.deepStrictEqual(reqToo('./experimental'), { ofLife: 42 });
|
||||||
|
|
||||||
|
assert.throws(() => {
|
||||||
|
createRequire('https://github.com/nodejs/node/pull/27405/');
|
||||||
|
}, {
|
||||||
|
code: 'ERR_INVALID_ARG_VALUE'
|
||||||
|
});
|
||||||
|
|
||||||
|
assert.throws(() => {
|
||||||
|
createRequire('../');
|
||||||
|
}, {
|
||||||
|
code: 'ERR_INVALID_ARG_VALUE'
|
||||||
|
});
|
||||||
|
|
||||||
|
assert.throws(() => {
|
||||||
|
createRequire({});
|
||||||
|
}, {
|
||||||
|
code: 'ERR_INVALID_ARG_VALUE'
|
||||||
|
});
|
||||||
|
Loading…
x
Reference in New Issue
Block a user