24 lines
827 B
JavaScript
24 lines
827 B
JavaScript
const fs = require('node:fs');
|
|
const vm = require('node:vm');
|
|
const path = require('node:path');
|
|
module.exports = function createLoader(globals, mocks = {}) {
|
|
const modules = new Map();
|
|
function load(file) {
|
|
file = path.resolve(file);
|
|
if (modules.has(file)) return modules.get(file).exports;
|
|
const module = { exports: {} };
|
|
modules.set(file, module);
|
|
vm.runInNewContext(fs.readFileSync(file, 'utf8'), {
|
|
...globals, module, exports: module.exports,
|
|
require(name) {
|
|
if (mocks[name]) return mocks[name];
|
|
if (!name.startsWith('.')) return require(name);
|
|
const resolved = path.resolve(path.dirname(file), name);
|
|
return load(path.extname(resolved) ? resolved : resolved + '.js');
|
|
}
|
|
}, { filename: file });
|
|
return module.exports;
|
|
}
|
|
return load;
|
|
};
|