mirror of
https://github.com/oven-sh/bun
synced 2026-02-10 19:08:50 +00:00
getModuleRequests
This commit is contained in:
@@ -1916,10 +1916,14 @@ public:
|
||||
JSObject* namespace_() const { return m_namespace.get(); }
|
||||
void namespace_(VM& vm, JSObject* value) { m_namespace.set(vm, this, value); }
|
||||
|
||||
const WTF::Vector<NodeVMModuleRequest>& moduleRequests() const { return m_moduleRequests; }
|
||||
void addModuleRequest(NodeVMModuleRequest request) { m_moduleRequests.append(WTFMove(request)); }
|
||||
|
||||
protected:
|
||||
WTF::String m_identifier;
|
||||
Status m_status = Status::Unlinked;
|
||||
mutable WriteBarrier<JSObject> m_namespace;
|
||||
WTF::Vector<NodeVMModuleRequest> m_moduleRequests;
|
||||
|
||||
NodeVMModule(JSC::VM& vm, JSC::Structure* structure, WTF::String identifier)
|
||||
: Base(vm, structure)
|
||||
@@ -2005,8 +2009,10 @@ NodeVMSourceTextModule* NodeVMSourceTextModule::create(VM& vm, JSGlobalObject* g
|
||||
}
|
||||
|
||||
JSValue contextValue = args.at(1);
|
||||
if (!contextValue.isObject()) {
|
||||
// TODO(@heimskr): if undefined, use current execution context
|
||||
if (contextValue.isUndefined()) {
|
||||
// TODO(@heimskr): should this be `globalObject->globalThis()` instead?
|
||||
contextValue = globalObject;
|
||||
} else if (!contextValue.isObject()) {
|
||||
throwArgumentTypeError(*globalObject, scope, 1, "context"_s, "Module"_s, "Module"_s, "object"_s);
|
||||
return nullptr;
|
||||
}
|
||||
@@ -2108,8 +2114,16 @@ JSC_DEFINE_HOST_FUNCTION(jsNodeVmModuleGetError, (JSC::JSGlobalObject * globalOb
|
||||
|
||||
JSC_DEFINE_HOST_FUNCTION(jsNodeVmModuleGetModuleRequests, (JSC::JSGlobalObject * globalObject, JSC::CallFrame* callFrame))
|
||||
{
|
||||
// auto* thisObject = jsCast<NodeVMSourceTextModule*>(callFrame->thisValue());
|
||||
return JSC::encodedJSUndefined();
|
||||
auto* thisObject = jsCast<NodeVMModule*>(callFrame->thisValue());
|
||||
const WTF::Vector<NodeVMModuleRequest>& requests = thisObject->moduleRequests();
|
||||
|
||||
JSArray* array = constructEmptyArray(globalObject, nullptr, requests.size());
|
||||
|
||||
for (unsigned i = 0; const NodeVMModuleRequest& request : requests) {
|
||||
array->putDirectIndex(globalObject, i++, request.toJS(globalObject));
|
||||
}
|
||||
|
||||
return JSValue::encode(array);
|
||||
}
|
||||
|
||||
JSC_DEFINE_HOST_FUNCTION(jsNodeVmModuleEvaluate, (JSC::JSGlobalObject * globalObject, JSC::CallFrame* callFrame))
|
||||
|
||||
@@ -32,6 +32,7 @@ public:
|
||||
void finishCreation(JSC::VM&);
|
||||
static void destroy(JSCell* cell);
|
||||
void setContextifiedObject(JSC::JSObject* contextifiedObject);
|
||||
JSC::JSObject* contextifiedObject() const { return m_sandbox.get(); }
|
||||
void clearContextifiedObject();
|
||||
|
||||
// Override property access to delegate to contextified object
|
||||
|
||||
@@ -94,7 +94,29 @@ const arrayToSafePromiseIterable = (promises, mapFn) =>
|
||||
),
|
||||
);
|
||||
const PromiseAll = Promise.all;
|
||||
const PromiseResolve = Promise.resolve;
|
||||
const SafePromiseAll = (promises, mapFn) => PromiseAll(arrayToSafePromiseIterable(promises, mapFn));
|
||||
const SafePromiseAllReturnArrayLike = (promises, mapFn) =>
|
||||
new Promise((resolve, reject) => {
|
||||
const { length } = promises;
|
||||
|
||||
const returnVal = Array(length);
|
||||
ObjectSetPrototypeOf(returnVal, null);
|
||||
if (length === 0) resolve(returnVal);
|
||||
|
||||
let pendingPromises = length;
|
||||
for (let i = 0; i < length; i++) {
|
||||
const promise = mapFn != null ? mapFn(promises[i], i) : promises[i];
|
||||
PromisePrototypeThen(
|
||||
PromiseResolve(promise),
|
||||
result => {
|
||||
returnVal[i] = result;
|
||||
if (--pendingPromises === 0) resolve(returnVal);
|
||||
},
|
||||
reject,
|
||||
);
|
||||
}
|
||||
});
|
||||
|
||||
export default {
|
||||
Array,
|
||||
@@ -113,6 +135,7 @@ export default {
|
||||
},
|
||||
),
|
||||
SafePromiseAll,
|
||||
SafePromiseAllReturnArrayLike,
|
||||
SafeSet: makeSafe(
|
||||
Set,
|
||||
class SafeSet extends Set {
|
||||
|
||||
@@ -9,7 +9,7 @@ const {
|
||||
validateBuffer,
|
||||
validateFunction,
|
||||
} = require("internal/validators");
|
||||
const { SafePromiseAll } = require("internal/primordials");
|
||||
const { SafePromiseAllReturnArrayLike } = require("internal/primordials");
|
||||
|
||||
const vm = $cpp("NodeVM.cpp", "Bun::createNodeVMBinding");
|
||||
|
||||
@@ -267,7 +267,7 @@ class SourceTextModule extends Module {
|
||||
}
|
||||
|
||||
try {
|
||||
const modules = await SafePromiseAll(modulePromises);
|
||||
const modules = await SafePromiseAllReturnArrayLike(modulePromises);
|
||||
this[kNative].link(specifiers, modules);
|
||||
} catch (e) {
|
||||
this.#error = e;
|
||||
@@ -279,7 +279,7 @@ class SourceTextModule extends Module {
|
||||
|
||||
get dependencySpecifiers() {
|
||||
this[kDependencySpecifiers] ??= ObjectFreeze(
|
||||
ArrayPrototypeMap.$call(this[kNative].getModuleRequests(), request => request.specifier),
|
||||
ArrayPrototypeMap.$call(this[kNative].getModuleRequests(), request => request[0]),
|
||||
);
|
||||
return this[kDependencySpecifiers];
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user