/
localRequire.js
34 lines (29 loc) 路 934 Bytes
/
localRequire.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
const {dirname} = require('path');
const {promisify} = require('@parcel/utils');
const resolve = promisify(require('resolve'));
const installPackage = require('./installPackage');
const cache = new Map();
async function localRequire(name, path, triedInstall = false) {
let [resolved] = await localResolve(name, path, triedInstall);
return require(resolved);
}
async function localResolve(name, path, triedInstall = false) {
let basedir = dirname(path);
let key = basedir + ':' + name;
let resolved = cache.get(key);
if (!resolved) {
try {
resolved = await resolve(name, {basedir});
} catch (e) {
if (e.code === 'MODULE_NOT_FOUND' && !triedInstall) {
await installPackage(name, path);
return await localResolve(name, path, true);
}
throw e;
}
cache.set(key, resolved);
}
return resolved;
}
localRequire.resolve = localResolve;
module.exports = localRequire;