-
Notifications
You must be signed in to change notification settings - Fork 147
/
index.js
143 lines (118 loc) · 3.09 KB
/
index.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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
import "./binding.js"
import "./module/internal/make-require-function.js"
import "./safe/buffer.js"
import "./safe/crypto.js"
import "./safe/inspector.js"
import "./safe/path.js"
import "./safe/process.js"
import "./safe/util.js"
import "./safe/vm.js"
import "./util/prepare-context.js"
import "./util/satisfies.js"
import ENV from "./constant/env.js"
import Module from "./module.js"
import Package from "./package.js"
import RealModule from "./real/module.js"
import Shim from "./shim.js"
import builtinVM from "./builtin/vm.js"
import errors from "./errors.js"
import globalHook from "./hook/global.js"
import isInstalled from "./util/is-installed.js"
import isObject from "./util/is-object.js"
import isOwnPath from "./util/is-own-path.js"
import isSideloaded from "./env/is-sideloaded.js"
import keys from "./util/keys.js"
import mainHook from "./hook/main.js"
import moduleHook from "./hook/module.js"
import processHook from "./hook/process.js"
import realProcess from "./real/process.js"
import realVM from "./real/vm.js"
import requireHook from "./hook/require.js"
import shared from "./shared.js"
import vmHook from "./hook/vm.js"
const {
CHECK,
CLI,
EVAL,
FLAGS,
INTERNAL,
REPL
} = ENV
const {
ERR_INVALID_ARG_TYPE
} = errors
let exported
if (shared.inited &&
! shared.reloaded) {
Shim.enable(shared.unsafeGlobal)
exported = (mod, options) => {
if (! isObject(mod)) {
throw new ERR_INVALID_ARG_TYPE("module", "object")
}
let cacheKey
if (options === void 0) {
const pkg = Package.from(mod)
if (pkg) {
cacheKey = JSON.stringify(pkg.options)
}
} else {
options = Package.createOptions(options)
cacheKey = JSON.stringify(options)
}
if (cacheKey) {
const { state } = shared.package
Package.state = state[cacheKey] || (state[cacheKey] = {
cache: { __proto__: null },
default: null
})
}
if (options) {
Package.from(mod, options)
}
moduleHook(Module, mod)
if (! isInstalled(mod)) {
processHook(realProcess)
}
return requireHook(mod)
}
} else {
exported = shared
exported.inited = true
exported.reloaded = false
Shim.enable(shared.safeGlobal)
Shim.enable(shared.unsafeGlobal)
if (CHECK) {
vmHook(realVM)
} else if (EVAL) {
RealModule.prototype._compile = Module.prototype._compile
moduleHook(Module)
processHook(realProcess)
vmHook(realVM)
} else if (REPL) {
moduleHook(Module)
processHook(realProcess)
vmHook(realVM)
const names = keys(builtinVM)
for (const name of names) {
builtinVM[name] = realVM[name]
}
} else if (CLI ||
INTERNAL ||
isSideloaded()) {
moduleHook(RealModule)
mainHook(RealModule)
processHook(realProcess)
if (INTERNAL) {
globalHook(shared.unsafeGlobal)
} else if (! isSideloaded()) {
const { _cache } = Module
for (const name in _cache) {
if (! isOwnPath(name)) {
Reflect.deleteProperty(_cache, name)
}
}
Module._preloadModules(FLAGS.preloadModules)
}
}
}
export default exported