forked from nodejs/node
-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathmodules.js
124 lines (112 loc) · 3.95 KB
/
modules.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
'use strict';
const {
setImportModuleDynamicallyCallback,
setInitializeImportMetaObjectCallback,
} = internalBinding('module_wrap');
const getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
const hasOwnProperty = Function.call.bind(Object.prototype.hasOwnProperty);
const apply = Reflect.apply;
const errors = require('internal/errors');
const { getURLFromFilePath } = require('internal/url');
const Loader = require('internal/loader/Loader');
const path = require('path');
const { URL } = require('url');
// fires a getter or reads the value off a descriptor
function grabPropertyOffDescriptor(object, descriptor) {
if (hasOwnProperty(descriptor, 'value')) {
return descriptor.value;
} else {
return apply(descriptor.get, object, []);
}
}
function normalizeReferrerURL(referrer) {
if (typeof referrer === 'string' && path.isAbsolute(referrer)) {
return getURLFromFilePath(referrer).href;
}
return new URL(referrer).href;
}
function initializeImportMetaObject(wrap, meta) {
meta.url = wrap.url;
}
let loaderResolve;
exports.loaderPromise = new Promise((resolve, reject) => {
loaderResolve = (v) => {
resolve(v);
};
});
exports.ESMLoader = undefined;
exports.setup = function() {
setInitializeImportMetaObjectCallback(initializeImportMetaObject);
const RuntimeLoader = new Loader();
const loaderPromise = (async () => {
const { userLoaders } = process.binding('config');
if (userLoaders) {
const BootstrapLoader = new Loader();
exports.ESMLoader = BootstrapLoader;
let resolve = (url, referrer) => {
return require('internal/loader/DefaultResolve')(url, referrer);
};
let dynamicInstantiate = (url) => {
throw new errors.Error('ERR_MISSING_DYNAMIC_INSTANTIATE_HOOK');
};
for (var i = 0; i < userLoaders.length; i++) {
const loaderSpecifier = userLoaders[i];
const { default: factory } = await BootstrapLoader.import(
loaderSpecifier);
const cachedResolve = resolve;
const cachedDynamicInstantiate = dynamicInstantiate;
const next = factory({
__proto__: null,
resolve: Object.setPrototypeOf(async (url, referrer) => {
const ret = await cachedResolve(url, referrer);
return {
__proto__: null,
url: `${ret.url}`,
format: `${ret.format}`,
};
}, null),
dynamicInstantiate: Object.setPrototypeOf(async (url) => {
const ret = await cachedDynamicInstantiate(url);
return {
__proto__: null,
exports: ret.exports,
execute: ret.execute,
};
}, null),
});
const resolveDesc = getOwnPropertyDescriptor(next, 'resolve');
if (resolveDesc !== undefined) {
resolve = grabPropertyOffDescriptor(next, resolveDesc);
if (typeof resolve !== 'function') {
throw new errors.TypeError('ERR_LOADER_HOOK_BAD_TYPE',
'resolve', 'function');
}
}
const dynamicInstantiateDesc = getOwnPropertyDescriptor(
next,
'dynamicInstantiate');
if (dynamicInstantiateDesc !== undefined) {
dynamicInstantiate = grabPropertyOffDescriptor(
next,
dynamicInstantiateDesc);
if (typeof dynamicInstantiate !== 'function') {
throw new errors.TypeError('ERR_LOADER_HOOK_BAD_TYPE',
'dynamicInstantiate', 'function');
}
}
}
RuntimeLoader.hook({
resolve,
dynamicInstantiate
});
}
exports.ESMLoader = RuntimeLoader;
return RuntimeLoader;
})();
loaderResolve(loaderPromise);
setImportModuleDynamicallyCallback(async (referrer, specifier) => {
const loader = await loaderPromise;
return loader.import(specifier, normalizeReferrerURL(referrer));
});
exports.RuntimeLoader = RuntimeLoader;
};