aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> 2022-09-04 00:54:21 -0700
committerGravatar Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> 2022-09-04 00:54:21 -0700
commit1112eb75e3bbc4b8afa1c12f7fd06ca3122878a1 (patch)
tree2b2a508df2219037460dbde31ed0d6df9bc9adb0 /src
parentef268c5ee5d6e873d5f1d61c95d74d93c6f1cc80 (diff)
downloadbun-1112eb75e3bbc4b8afa1c12f7fd06ca3122878a1.tar.gz
bun-1112eb75e3bbc4b8afa1c12f7fd06ca3122878a1.tar.zst
bun-1112eb75e3bbc4b8afa1c12f7fd06ca3122878a1.zip
`[node:module]` Implement `_resolveFileName`, stub `_nodeModulePaths` & `_cache`
Closes https://github.com/oven-sh/bun/issues/1111
Diffstat (limited to 'src')
-rw-r--r--src/bun.js/bindings/ImportMetaObject.cpp35
-rw-r--r--src/bun.js/bindings/ImportMetaObject.h4
-rw-r--r--src/bun.js/bindings/ZigGlobalObject.cpp15
-rw-r--r--src/bun.js/builtins/BunBuiltinNames.h4
-rw-r--r--src/bun.js/builtins/js/ImportMetaObject.js110
-rw-r--r--src/bun.js/builtins/js/StreamInternals.js2
-rw-r--r--src/bun.js/modules/NodeModuleModule.cpp66
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(