module: allow passing a directory to createRequireFromPath

Fixes: https://github.com/nodejs/node/issues/23710

PR-URL: https://github.com/nodejs/node/pull/23818
Reviewed-By: Guy Bedford <guybedford@gmail.com>
Reviewed-By: Myles Borins <myles.borins@gmail.com>
Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de>
Reviewed-By: Anna Henningsen <anna@addaleax.net>
This commit is contained in:
Gilles De Mey 2018-10-22 20:42:53 +02:00 committed by Myles Borins
parent b884ceb518
commit e5c8be2bd0
No known key found for this signature in database
GPG Key ID: 933B01F40B5CA946
3 changed files with 31 additions and 4 deletions

View File

@ -916,7 +916,7 @@ added: v10.12.0
```js
const { createRequireFromPath } = require('module');
const requireUtil = createRequireFromPath('../src/utils');
const requireUtil = createRequireFromPath('../src/utils/');
// Require `../src/utils/some-tool`
requireUtil('./some-tool');

View File

@ -825,9 +825,18 @@ Module.runMain = function() {
};
Module.createRequireFromPath = (filename) => {
const m = new Module(filename);
m.filename = filename;
m.paths = Module._nodeModulePaths(path.dirname(filename));
// Allow a directory to be passed as the filename
const trailingSlash =
filename.endsWith(path.sep) || path.sep !== '/' && filename.endsWith('\\');
const proxyPath = trailingSlash ?
path.join(filename, 'noop.js') :
filename;
const m = new Module(proxyPath);
m.filename = proxyPath;
m.paths = Module._nodeModulePaths(m.path);
return makeRequireFunction(m);
};

View File

@ -0,0 +1,18 @@
'use strict';
require('../common');
const assert = require('assert');
const path = require('path');
const { createRequireFromPath } = require('module');
const fixPath = path.resolve(__dirname, '..', 'fixtures');
const p = path.join(fixPath, path.sep);
const req = createRequireFromPath(p);
const reqFromNotDir = createRequireFromPath(fixPath);
assert.strictEqual(req('./baz'), 'perhaps I work');
assert.throws(() => {
reqFromNotDir('./baz');
}, { code: 'MODULE_NOT_FOUND' });