40 lines
1.2 KiB
JavaScript
40 lines
1.2 KiB
JavaScript
|
'use strict';
|
||
|
|
||
|
var pathToFileURL = require('url').pathToFileURL;
|
||
|
|
||
|
var importESM;
|
||
|
try {
|
||
|
// Node.js <10 errors out with a SyntaxError when loading a script that uses import().
|
||
|
// So a function is dynamically created to catch the SyntaxError at runtime instead of parsetime.
|
||
|
// That way we can keep supporting all Node.js versions all the way back to 0.10.
|
||
|
importESM = new Function('id', 'return import(id);');
|
||
|
} catch (e) {
|
||
|
/* istanbul ignore next */
|
||
|
importESM = null;
|
||
|
}
|
||
|
|
||
|
function requireOrImport(path, callback) {
|
||
|
var err = null;
|
||
|
var cjs;
|
||
|
try {
|
||
|
cjs = require(path);
|
||
|
} catch (e) {
|
||
|
/* istanbul ignore else */
|
||
|
if (pathToFileURL && importESM) {
|
||
|
// Because e.code is undefined on nyc process.
|
||
|
/* istanbul ignore else */
|
||
|
if (e.code === 'ERR_REQUIRE_ESM' || process.env.NYC_CONFIG) {
|
||
|
// This is needed on Windows, because import() fails if providing a Windows file path.
|
||
|
var url = pathToFileURL(path);
|
||
|
importESM(url).then(function(esm) { callback(null, esm); }, callback);
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
/* istanbul ignore next */
|
||
|
err = e;
|
||
|
}
|
||
|
process.nextTick(function() { callback(err, cjs); });
|
||
|
}
|
||
|
|
||
|
module.exports = requireOrImport;
|