diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/bun.js/bindings/ImportMetaObject.cpp | 35 | ||||
-rw-r--r-- | src/bun.js/bindings/ImportMetaObject.h | 4 | ||||
-rw-r--r-- | src/bun.js/bindings/ZigGlobalObject.cpp | 15 | ||||
-rw-r--r-- | src/bun.js/builtins/BunBuiltinNames.h | 4 | ||||
-rw-r--r-- | src/bun.js/builtins/js/ImportMetaObject.js | 110 | ||||
-rw-r--r-- | src/bun.js/builtins/js/StreamInternals.js | 2 | ||||
-rw-r--r-- | src/bun.js/modules/NodeModuleModule.cpp | 66 |
7 files changed, 150 insertions, 86 deletions
diff --git a/src/bun.js/bindings/ImportMetaObject.cpp b/src/bun.js/bindings/ImportMetaObject.cpp index ba1617aa4..17338da5c 100644 --- a/src/bun.js/bindings/ImportMetaObject.cpp +++ b/src/bun.js/bindings/ImportMetaObject.cpp @@ -42,9 +42,6 @@ namespace Zig { using namespace JSC; using namespace WebCore; -extern "C" JSC__JSValue Bun__resolve(JSC::JSGlobalObject* global, JSC__JSValue specifier, JSC__JSValue from); -extern "C" JSC__JSValue Bun__resolveSync(JSC::JSGlobalObject* global, JSC__JSValue specifier, JSC__JSValue from); - static EncodedJSValue functionRequireResolve(JSC::JSGlobalObject* globalObject, JSC::CallFrame* callFrame, JSC::EncodedJSValue from) { JSC::VM& vm = globalObject->vm(); @@ -161,10 +158,7 @@ JSObject* Zig::ImportMetaObject::createRequireFunction(VM& vm, JSGlobalObject* g return requireFunction; } -static JSC_DECLARE_HOST_FUNCTION(functionImportMeta__resolveSync); - -static JSC_DEFINE_HOST_FUNCTION(functionImportMeta__resolveSync, - (JSC::JSGlobalObject * globalObject, JSC::CallFrame* callFrame)) +extern "C" EncodedJSValue functionImportMeta__resolveSync(JSC::JSGlobalObject* globalObject, JSC::CallFrame* callFrame) { JSC::VM& vm = globalObject->vm(); @@ -228,9 +222,9 @@ static JSC_DEFINE_HOST_FUNCTION(functionImportMeta__resolveSync, } } -static JSC_DECLARE_HOST_FUNCTION(functionImportMeta__resolve); +JSC_DECLARE_HOST_FUNCTION(functionImportMeta__resolve); -static JSC_DEFINE_HOST_FUNCTION(functionImportMeta__resolve, +JSC_DEFINE_HOST_FUNCTION(functionImportMeta__resolve, (JSC::JSGlobalObject * globalObject, JSC::CallFrame* callFrame)) { JSC::VM& vm = globalObject->vm(); @@ -318,27 +312,24 @@ void ImportMetaObjectPrototype::finishCreation(VM& vm, JSGlobalObject* globalObj auto* globalObject = reinterpret_cast<Zig::GlobalObject*>(globalObject_); auto clientData = WebCore::clientData(vm); - this->putDirect(vm, clientData->builtinNames().filePublicName(), jsEmptyString(vm), 0); - this->putDirect(vm, clientData->builtinNames().dirPublicName(), jsEmptyString(vm), 0); - this->putDirect(vm, clientData->builtinNames().pathPublicName(), jsEmptyString(vm), 0); - this->putDirect(vm, clientData->builtinNames().urlPublicName(), jsEmptyString(vm), 0); - this->putDirect(vm, clientData->builtinNames().mainPublicName(), jsBoolean(false), 0); + auto& builtinNames = clientData->builtinNames(); - String requireString = "[[require]]"_s; - this->putDirect(vm, clientData->builtinNames().requirePublicName(), Zig::ImportMetaObject::createRequireFunction(vm, globalObject, requireString), PropertyAttribute::Builtin | PropertyAttribute::Function | 0); + this->putDirect(vm, builtinNames.filePublicName(), jsEmptyString(vm), 0); + this->putDirect(vm, builtinNames.dirPublicName(), jsEmptyString(vm), 0); + this->putDirect(vm, builtinNames.pathPublicName(), jsEmptyString(vm), 0); + this->putDirect(vm, builtinNames.urlPublicName(), jsEmptyString(vm), 0); + this->putDirect(vm, builtinNames.mainPublicName(), jsBoolean(false), 0); - this->putDirectBuiltinFunction(vm, globalObject, - clientData->builtinNames().loadModulePublicName(), importMetaObjectLoadModuleCodeGenerator(vm), JSC::PropertyAttribute::DontEnum | JSC::PropertyAttribute::DontDelete | 0); - this->putDirectBuiltinFunction(vm, globalObject, - clientData->builtinNames().requireModulePublicName(), importMetaObjectRequireModuleCodeGenerator(vm), JSC::PropertyAttribute::DontEnum | JSC::PropertyAttribute::DontDelete | 0); + String requireString = "[[require]]"_s; + this->putDirect(vm, builtinNames.requirePublicName(), Zig::ImportMetaObject::createRequireFunction(vm, globalObject, requireString), PropertyAttribute::Builtin | PropertyAttribute::Function | 0); - this->putDirectNativeFunction(vm, globalObject, clientData->builtinNames().resolvePublicName(), 1, + this->putDirectNativeFunction(vm, globalObject, builtinNames.resolvePublicName(), 1, functionImportMeta__resolve, ImplementationVisibility::Public, NoIntrinsic, JSC::PropertyAttribute::Function | 0); this->putDirectNativeFunction( - vm, globalObject, clientData->builtinNames().resolveSyncPublicName(), + vm, globalObject, builtinNames.resolveSyncPublicName(), 1, functionImportMeta__resolveSync, ImplementationVisibility::Public, diff --git a/src/bun.js/bindings/ImportMetaObject.h b/src/bun.js/bindings/ImportMetaObject.h index 4511e4d6e..ac50df12d 100644 --- a/src/bun.js/bindings/ImportMetaObject.h +++ b/src/bun.js/bindings/ImportMetaObject.h @@ -8,6 +8,10 @@ #include "JSDOMWrapperCache.h" +extern "C" JSC_DECLARE_HOST_FUNCTION(functionImportMeta__resolveSync); +extern "C" JSC__JSValue Bun__resolve(JSC::JSGlobalObject* global, JSC__JSValue specifier, JSC__JSValue from); +extern "C" JSC__JSValue Bun__resolveSync(JSC::JSGlobalObject* global, JSC__JSValue specifier, JSC__JSValue from); + namespace Zig { using namespace JSC; diff --git a/src/bun.js/bindings/ZigGlobalObject.cpp b/src/bun.js/bindings/ZigGlobalObject.cpp index 8e8608833..888bf8f6b 100644 --- a/src/bun.js/bindings/ZigGlobalObject.cpp +++ b/src/bun.js/bindings/ZigGlobalObject.cpp @@ -2042,6 +2042,11 @@ static JSC_DEFINE_HOST_FUNCTION(functionSetImmediate, return Bun__Timer__setTimeout(globalObject, JSC::JSValue::encode(job), JSC::JSValue::encode(jsNumber(0))); } +JSC_DEFINE_CUSTOM_GETTER(JSModuleLoader_getter, (JSGlobalObject * globalObject, EncodedJSValue thisValue, PropertyName)) +{ + return JSValue::encode(globalObject->moduleLoader()); +} + EncodedJSValue GlobalObject::assignToStream(JSValue stream, JSValue controller) { JSC::VM& vm = this->vm(); @@ -2072,7 +2077,7 @@ void GlobalObject::addBuiltinGlobals(JSC::VM& vm) auto& builtinNames = WebCore::builtinNames(vm); WTF::Vector<GlobalPropertyInfo> extraStaticGlobals; - extraStaticGlobals.reserveCapacity(35); + extraStaticGlobals.reserveCapacity(40); JSC::Identifier queueMicrotaskIdentifier = JSC::Identifier::fromString(vm, "queueMicrotask"_s); extraStaticGlobals.uncheckedAppend( @@ -2177,7 +2182,6 @@ void GlobalObject::addBuiltinGlobals(JSC::VM& vm) extraStaticGlobals.uncheckedAppend(GlobalPropertyInfo(builtinNames.getInternalWritableStreamPrivateName(), JSFunction::create(vm, this, 1, String(), getInternalWritableStream, ImplementationVisibility::Public), PropertyAttribute::DontDelete | PropertyAttribute::ReadOnly)); extraStaticGlobals.uncheckedAppend(GlobalPropertyInfo(builtinNames.createWritableStreamFromInternalPrivateName(), JSFunction::create(vm, this, 1, String(), createWritableStreamFromInternal, ImplementationVisibility::Public), PropertyAttribute::DontDelete | PropertyAttribute::ReadOnly)); extraStaticGlobals.uncheckedAppend(GlobalPropertyInfo(builtinNames.fulfillModuleSyncPrivateName(), JSFunction::create(vm, this, 1, String(), functionFulfillModuleSync, ImplementationVisibility::Public), PropertyAttribute::DontDelete | PropertyAttribute::ReadOnly | PropertyAttribute::Function)); - extraStaticGlobals.uncheckedAppend(GlobalPropertyInfo(builtinNames.commonJSSymbolPrivateName(), JSC::Symbol::create(vm, vm.symbolRegistry().symbolForKey(CommonJSSymbolKey)), PropertyAttribute::DontDelete | PropertyAttribute::ReadOnly)); this->addStaticGlobals(extraStaticGlobals.data(), extraStaticGlobals.size()); @@ -2188,12 +2192,15 @@ void GlobalObject::addBuiltinGlobals(JSC::VM& vm) putDirectBuiltinFunction(vm, this, builtinNames.createNativeReadableStreamPrivateName(), readableStreamCreateNativeReadableStreamCodeGenerator(vm), PropertyAttribute::Builtin | PropertyAttribute::DontDelete | PropertyAttribute::ReadOnly); putDirectBuiltinFunction(vm, this, builtinNames.createEmptyReadableStreamPrivateName(), readableStreamCreateEmptyReadableStreamCodeGenerator(vm), PropertyAttribute::Builtin | PropertyAttribute::DontDelete | PropertyAttribute::ReadOnly); putDirectBuiltinFunction(vm, this, builtinNames.consumeReadableStreamPrivateName(), readableStreamConsumeReadableStreamCodeGenerator(vm), PropertyAttribute::Builtin | PropertyAttribute::DontDelete | PropertyAttribute::ReadOnly); + + putDirect(vm, builtinNames.LoaderPrivateName(), this->moduleLoader(), 0); putDirectBuiltinFunction(vm, this, builtinNames.createNativeReadableStreamPrivateName(), readableStreamCreateNativeReadableStreamCodeGenerator(vm), PropertyAttribute::Builtin | PropertyAttribute::DontDelete | PropertyAttribute::ReadOnly); - // putDirectBuiltinFunction(vm, this, builtinNames.loadModulePrivateName(), jsZigGlobalObjectInternalsLoadModuleCodeGenerator(vm), PropertyAttribute::Builtin | PropertyAttribute::DontDelete | PropertyAttribute::ReadOnly); - // putDirectBuiltinFunction(vm, this, builtinNames.requireModulePrivateName(), jsZigGlobalObjectInternalsRequireModuleCodeGenerator(vm), PropertyAttribute::Builtin | PropertyAttribute::DontDelete | PropertyAttribute::ReadOnly); + putDirectBuiltinFunction(vm, this, builtinNames.requireESMPrivateName(), importMetaObjectRequireESMCodeGenerator(vm), PropertyAttribute::Builtin | PropertyAttribute::DontDelete | PropertyAttribute::ReadOnly); + putDirectBuiltinFunction(vm, this, builtinNames.loadCJS2ESMPrivateName(), importMetaObjectLoadCJS2ESMCodeGenerator(vm), PropertyAttribute::Builtin | PropertyAttribute::DontDelete | PropertyAttribute::ReadOnly); putDirectNativeFunction(vm, this, builtinNames.createUninitializedArrayBufferPrivateName(), 1, functionCreateUninitializedArrayBuffer, ImplementationVisibility::Public, NoIntrinsic, PropertyAttribute::DontDelete | PropertyAttribute::ReadOnly | PropertyAttribute::Function); + putDirectNativeFunction(vm, this, builtinNames.resolveSyncPrivateName(), 1, functionImportMeta__resolveSync, ImplementationVisibility::Public, NoIntrinsic, PropertyAttribute::DontDelete | PropertyAttribute::ReadOnly | PropertyAttribute::Function); putDirectCustomAccessor(vm, JSC::Identifier::fromString(vm, "process"_s), JSC::CustomGetterSetter::create(vm, property_lazyProcessGetter, property_lazyProcessSetter), JSC::PropertyAttribute::CustomAccessor | 0); diff --git a/src/bun.js/builtins/BunBuiltinNames.h b/src/bun.js/builtins/BunBuiltinNames.h index c8a14a260..2982e8fae 100644 --- a/src/bun.js/builtins/BunBuiltinNames.h +++ b/src/bun.js/builtins/BunBuiltinNames.h @@ -25,6 +25,7 @@ using namespace JSC; #define BUN_COMMON_PRIVATE_IDENTIFIERS_EACH_PROPERTY_NAME(macro) \ macro(AbortSignal) \ macro(Bun) \ + macro(Loader) \ macro(ReadableByteStreamController) \ macro(ReadableStream) \ macro(ReadableStreamBYOBReader) \ @@ -133,6 +134,7 @@ using namespace JSC; macro(lazy) \ macro(lazyLoad) \ macro(lazyStreamPrototypeMap) \ + macro(loadCJS2ESM) \ macro(loadModule) \ macro(localStreams) \ macro(main) \ @@ -183,8 +185,8 @@ using namespace JSC; macro(releaseLock) \ macro(removeEventListener) \ macro(require) \ + macro(requireESM) \ macro(requireMap) \ - macro(requireModule) \ macro(resolve) \ macro(resolveSync) \ macro(resume) \ diff --git a/src/bun.js/builtins/js/ImportMetaObject.js b/src/bun.js/builtins/js/ImportMetaObject.js index ce28775c2..f7fad3344 100644 --- a/src/bun.js/builtins/js/ImportMetaObject.js +++ b/src/bun.js/builtins/js/ImportMetaObject.js @@ -23,61 +23,22 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -function require(name) { - "use strict"; - if (typeof name !== "string") { - @throwTypeError("require() expects a string as its argument"); - } - - const resolved = this.resolveSync(name, this.path); - var cached = @requireMap.@get(resolved); - const last5 = resolved.substring(resolved.length - 5); - if (cached) { - if (last5 === ".node") { - return cached.exports; - } - - return cached; - } - - - // TODO: remove this hardcoding - if (last5 === ".json") { - var fs = (globalThis[Symbol.for("_fs")] ||= Bun.fs()); - var exports = JSON.parse(fs.readFileSync(resolved, "utf8")); - @requireMap.@set(resolved, exports); - return exports; - } else if (last5 === ".node") { - var module = { exports: {} }; - globalThis.process.dlopen(module, resolved); - @requireMap.@set(resolved, module); - return module.exports; - } else if (last5 === ".toml") { - var fs = (globalThis[Symbol.for("_fs")] ||= Bun.fs()); - var exports = Bun.TOML.parse(fs.readFileSync(resolved, "utf8")); - @requireMap.@set(resolved, exports); - return exports; - } else { - var exports = this.requireModule(this, resolved); - @requireMap.@set(resolved, exports); - return exports; - } -} -function loadModule(meta, resolvedSpecifier) { +function loadCJS2ESM(resolvedSpecifier) { "use strict"; + var loader = @Loader; var queue = @createFIFO(); var key = resolvedSpecifier; while (key) { // we need to explicitly check because state could be @ModuleFetch // it will throw this error if we do not: // @throwTypeError("Requested module is already fetched."); - var entry = Loader.registry.@get(key); + var entry = loader.registry.@get(key); if (!entry || !entry.state || entry.state <= @ModuleFetch) { @fulfillModuleSync(key); - entry = Loader.registry.@get(key); + entry = loader.registry.@get(key); } @@ -92,7 +53,7 @@ function loadModule(meta, resolvedSpecifier) { // parseModule() returns a Promise, but the value is already fulfilled // so we just pull it out of the promise here once again // But, this time we do it a little more carefully because this is a JSC function call and not bun source code - var moduleRecordPromise = Loader.parseModule(key, sourceCodeObject); + var moduleRecordPromise = loader.parseModule(key, sourceCodeObject); var module = entry.module; if (!module && moduleRecordPromise && @isPromise(moduleRecordPromise)) { var reactionsOrResult = @getPromiseInternalField( @@ -127,7 +88,7 @@ function loadModule(meta, resolvedSpecifier) { // This is very similar to "requestInstantiate" in ModuleLoader.js in JavaScriptCore. @setStateToMax(entry, @ModuleLink); var dependenciesMap = module.dependenciesMap; - var requestedModules = Loader.requestedModules(module); + var requestedModules = loader.requestedModules(module); var dependencies = @newArrayWithSize(requestedModules.length); for (var i = 0, length = requestedModules.length; i < length; ++i) { var depName = requestedModules[i]; @@ -136,8 +97,8 @@ function loadModule(meta, resolvedSpecifier) { var depKey = depName[0] === "/" ? depName - : Loader.resolve(depName, key, @undefined); - var depEntry = Loader.ensureRegistered(depKey); + : loader.resolve(depName, key, @undefined); + var depEntry = loader.ensureRegistered(depKey); if (depEntry.state < @ModuleLink) { queue.push(depKey); } @@ -151,13 +112,13 @@ function loadModule(meta, resolvedSpecifier) { entry.instantiate = @Promise.resolve(entry) entry.satisfy = @Promise.resolve(entry); key = queue.shift(); - while (key && (Loader.registry.@get(key)?.state ?? @ModuleFetch) >= @ModuleLink) { + while (key && (loader.registry.@get(key)?.state ?? @ModuleFetch) >= @ModuleLink) { key = queue.shift(); } } - var linkAndEvaluateResult = Loader.linkAndEvaluateModule( + var linkAndEvaluateResult = loader.linkAndEvaluateModule( resolvedSpecifier, @undefined ); @@ -169,26 +130,65 @@ function loadModule(meta, resolvedSpecifier) { ); } - return Loader.registry.@get(resolvedSpecifier); + return loader.registry.@get(resolvedSpecifier); } -function requireModule(meta, resolved) { + +function requireESM(resolved) { "use strict"; - var Loader = globalThis.Loader; - var entry = Loader.registry.@get(resolved); + var entry = @Loader.registry.@get(resolved); if (!entry || !entry.evaluated) { - entry = this.loadModule(meta, resolved); + entry = @loadCJS2ESM(resolved); } if (!entry || !entry.evaluated || !entry.module) { @throwTypeError(`require() failed to evaluate module \"${resolved}\". This is an internal consistentency error.`); } - var exports = Loader.getModuleNamespaceObject(entry.module); + var exports = @Loader.getModuleNamespaceObject(entry.module); var commonJS = exports.default; if (commonJS && @isObject(commonJS) && @commonJSSymbol in commonJS) { return commonJS(); } return exports; } + +function require(name) { + "use strict"; + if (typeof name !== "string") { + @throwTypeError("require() expects a string as its argument"); + } + const resolved = @resolveSync(name, this.path); + var cached = @requireMap.@get(resolved); + const last5 = resolved.substring(resolved.length - 5); + if (cached) { + if (last5 === ".node") { + return cached.exports; + } + + return cached; + } + + // TODO: remove this hardcoding + if (last5 === ".json") { + var fs = (globalThis[Symbol.for("_fs")] ||= @Bun.fs()); + var exports = JSON.parse(fs.readFileSync(resolved, "utf8")); + @requireMap.@set(resolved, exports); + return exports; + } else if (last5 === ".node") { + var module = { exports: {} }; + process.dlopen(module, resolved); + @requireMap.@set(resolved, module); + return module.exports; + } else if (last5 === ".toml") { + var fs = (globalThis[Symbol.for("_fs")] ||= @Bun.fs()); + var exports = @Bun.TOML.parse(fs.readFileSync(resolved, "utf8")); + @requireMap.@set(resolved, exports); + return exports; + } else { + var exports = @requireESM(resolved); + @requireMap.@set(resolved, exports); + return exports; + } +}
\ No newline at end of file diff --git a/src/bun.js/builtins/js/StreamInternals.js b/src/bun.js/builtins/js/StreamInternals.js index c2ca3f5b5..9f8cb84f4 100644 --- a/src/bun.js/builtins/js/StreamInternals.js +++ b/src/bun.js/builtins/js/StreamInternals.js @@ -114,7 +114,7 @@ function validateAndNormalizeQueuingStrategy(size, highWaterMark) return { size: size, highWaterMark: newHighWaterMark }; } -@globalPrivate +@linkTimeConstant function createFIFO() { "use strict"; class Denqueue { diff --git a/src/bun.js/modules/NodeModuleModule.cpp b/src/bun.js/modules/NodeModuleModule.cpp index 319d18478..02e4e3849 100644 --- a/src/bun.js/modules/NodeModuleModule.cpp +++ b/src/bun.js/modules/NodeModuleModule.cpp @@ -4,7 +4,7 @@ #include "ImportMetaObject.h" #include "JavaScriptCore/JSBoundFunction.h" - +#include "JavaScriptCore/ObjectConstructor.h" using namespace Zig; using namespace JSC; @@ -53,7 +53,11 @@ JSC_DEFINE_HOST_FUNCTION(jsFunctionNodeModuleCreateRequire, JSC_DEFINE_HOST_FUNCTION(jsFunctionNodeModulePaths, (JSC::JSGlobalObject * globalObject, JSC::CallFrame *callFrame)) { - return JSC::JSValue::encode(JSC::JSArray::create(globalObject->vm(), 0)); + return JSC::JSValue::encode(JSC::JSArray::create( + globalObject->vm(), + globalObject->arrayStructureForIndexingTypeDuringAllocation( + ArrayWithContiguous), + 0)); } JSC_DEFINE_HOST_FUNCTION(jsFunctionFindSourceMap, @@ -81,8 +85,49 @@ JSC_DEFINE_HOST_FUNCTION(jsFunctionSourceMap, (JSGlobalObject * globalObject, return JSValue::encode(jsUndefined()); } -namespace Zig { +JSC_DEFINE_HOST_FUNCTION(jsFunctionResolveFileName, + (JSC::JSGlobalObject * globalObject, + JSC::CallFrame *callFrame)) { + JSC::VM &vm = globalObject->vm(); + + switch (callFrame->argumentCount()) { + case 0: { + auto scope = DECLARE_THROW_SCOPE(globalObject->vm()); + // not "requires" because "require" could be confusing + JSC::throwTypeError( + globalObject, scope, + "Module._resolveFileName needs 2+ arguments (a string)"_s); + scope.release(); + return JSC::JSValue::encode(JSC::JSValue{}); + } + default: { + JSC::JSValue moduleName = callFrame->argument(0); + + if (moduleName.isUndefinedOrNull()) { + auto scope = DECLARE_THROW_SCOPE(globalObject->vm()); + JSC::throwTypeError(globalObject, scope, + "Module._resolveFileName expects a string"_s); + scope.release(); + return JSC::JSValue::encode(JSC::JSValue{}); + } + + auto result = + Bun__resolveSync(globalObject, JSC::JSValue::encode(moduleName), + JSValue::encode(callFrame->argument(1))); + auto scope = DECLARE_THROW_SCOPE(globalObject->vm()); + + if (!JSC::JSValue::decode(result).isString()) { + JSC::throwException(globalObject, scope, JSC::JSValue::decode(result)); + return JSC::JSValue::encode(JSC::JSValue{}); + } + + scope.release(); + return result; + } + } +} +namespace Zig { void generateNodeModuleModule(JSC::JSGlobalObject *globalObject, JSC::Identifier moduleKey, Vector<JSC::Identifier, 4> &exportNames, @@ -112,6 +157,21 @@ void generateNodeModuleModule(JSC::JSGlobalObject *globalObject, exportNames.append(JSC::Identifier::fromString(vm, "syncBuiltinExports"_s)); exportNames.append(JSC::Identifier::fromString(vm, "SourceMap"_s)); + // note: this is not technically correct + // it doesn't set process.mainModule + exportNames.append(JSC::Identifier::fromString(vm, "_resolveFileName"_s)); + exportValues.append(JSFunction::create( + vm, globalObject, 3, String("_resolveFileName"_s), + jsFunctionResolveFileName, ImplementationVisibility::Public)); + + exportNames.append(JSC::Identifier::fromString(vm, "_nodeModulePaths"_s)); + exportValues.append(JSFunction::create( + vm, globalObject, 0, String("_nodeModulePaths"_s), + jsFunctionNodeModulePaths, ImplementationVisibility::Public)); + + exportNames.append(JSC::Identifier::fromString(vm, "_cache"_s)); + exportValues.append(JSC::constructEmptyObject(globalObject)); + exportNames.append(JSC::Identifier::fromString(vm, "builtinModules"_s)); JSC::JSArray *builtinModules = JSC::JSArray::create( |