-
-
Notifications
You must be signed in to change notification settings - Fork 9.5k
/
Copy pathrequire_context.js
81 lines (64 loc) · 2.2 KB
/
require_context.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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
import { process } from 'global';
import vm from 'vm';
import fs from 'fs';
import path from 'path';
import moduleSystem from 'module';
function requireModules(keys, root, directory, regExp, recursive) {
const files = fs.readdirSync(path.join(root, directory));
files.forEach(filename => {
// webpack adds a './' to the begining of the key
// TODO: Check this in windows
const entryKey = `./${path.join(directory, filename)}`;
if (regExp.test(entryKey)) {
keys[entryKey] = require(path.join(root, directory, filename)); // eslint-disable-line
return;
}
if (!recursive) {
return;
}
if (fs.statSync(path.join(root, directory, filename)).isDirectory()) {
requireModules(keys, root, path.join(directory, filename), regExp, recursive);
}
});
}
function isRelativeRequest(request) {
if (request.charCodeAt(0) !== 46) {
/* . */ return false;
}
if (request === '.' || '..') {
return true;
}
return (
request.charCodeAt(1) === 47 /* / */ ||
(request.charCodeAt(1) === 46 /* . */ && request.charCodeAt(2) === 47) /* / */
);
}
export default function runWithRequireContext(content, options) {
const { filename, dirname } = options;
const newRequire = request => {
if (isRelativeRequest(request)) {
return require(path.resolve(dirname, request)); // eslint-disable-line
}
return require(request); // eslint-disable-line
};
const getFullPath = directory => {
if (process.env.NODE_PATH) {
return path.resolve(process.env.NODE_PATH, directory);
}
return path.resolve(dirname, directory);
};
newRequire.resolve = require.resolve;
newRequire.extensions = require.extensions;
newRequire.main = require.main;
newRequire.cache = require.cache;
newRequire.context = (directory, useSubdirectories = false, regExp = /^\.\//) => {
const fullPath = getFullPath(directory);
const keys = {};
requireModules(keys, fullPath, '.', regExp, useSubdirectories);
const req = f => keys[f];
req.keys = () => Object.keys(keys);
return req;
};
const compiledModule = vm.runInThisContext(moduleSystem.wrap(content));
compiledModule(module.exports, newRequire, module, filename, dirname);
}