Files
past-go/weapp/tests/load-module.cjs
T

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;
};