| const nativeModule = require('module') |
| const path = require('path') |
| const fs = require('fs') |
| |
| function createRequire (filename) { |
| // Fallback to process.cwd() if no filename passed |
| if (!filename) { |
| filename = process.cwd() |
| } |
| |
| // If filename is dir, createRequire goes with parent directory, so we need fakepath |
| if (isDir(filename)) { |
| filename = path.join(filename, 'index.js') |
| } |
| |
| // Added in Node v12.2.0 |
| if (nativeModule.createRequire) { |
| return nativeModule.createRequire(filename) |
| } |
| |
| // Added in Node v10.12.0 and deprecated since Node v12.2.0 |
| if (nativeModule.createRequireFromPath) { |
| return nativeModule.createRequireFromPath(filename) |
| } |
| |
| // Polyfill |
| return _createRequire(filename) |
| } |
| |
| // Polyfill |
| function _createRequire (filename) { |
| const mod = new nativeModule.Module(filename, null) |
| mod.filename = filename |
| mod.paths = nativeModule.Module._nodeModulePaths(path.dirname(filename)) |
| mod._compile('module.exports = require;', filename) |
| return mod.exports |
| } |
| |
| function isDir (path) { |
| try { |
| const stat = fs.lstatSync(path) |
| return stat.isDirectory() |
| } catch (e) { |
| // lstatSync throws an error if path doesn't exist |
| return false |
| } |
| } |
| |
| module.exports = createRequire |