From 9ab2acced6a882dd0c21a4e1e94f427ad9d08966 Mon Sep 17 00:00:00 2001 From: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> Date: Thu, 3 Aug 2023 18:22:21 -0700 Subject: Implement Module.wrap() --- src/bun.js/modules/NodeModuleModule.h | 68 +++++++++++++++++++++++------------ 1 file changed, 45 insertions(+), 23 deletions(-) (limited to 'src/bun.js/modules/NodeModuleModule.h') diff --git a/src/bun.js/modules/NodeModuleModule.h b/src/bun.js/modules/NodeModuleModule.h index e51f2ac86..3f2caaba6 100644 --- a/src/bun.js/modules/NodeModuleModule.h +++ b/src/bun.js/modules/NodeModuleModule.h @@ -157,6 +157,25 @@ JSC_DEFINE_HOST_FUNCTION(jsFunctionIsBuiltinModule, return JSValue::encode(jsBoolean(isBuiltinModule(moduleStr))); } +JSC_DEFINE_HOST_FUNCTION(jsFunctionWrap, (JSC::JSGlobalObject * globalObject, + JSC::CallFrame *callFrame)) { + auto &vm = globalObject->vm(); + auto scope = DECLARE_THROW_SCOPE(vm); + JSString *code = callFrame->argument(0).toStringOrNull(globalObject); + RETURN_IF_EXCEPTION(scope, JSC::JSValue::encode(JSC::jsUndefined())); + if (!code) { + return JSC::JSValue::encode(JSC::jsUndefined()); + } + + JSString *prefix = jsString( + vm, + String( + "(function (exports, require, module, __filename, __dirname) { "_s)); + JSString *suffix = jsString(vm, String("\n});"_s)); + + return JSValue::encode(jsString(globalObject, prefix, code, suffix)); +} + JSC_DEFINE_HOST_FUNCTION(jsFunctionNodeModuleCreateRequire, (JSC::JSGlobalObject * globalObject, JSC::CallFrame *callFrame)) { @@ -250,31 +269,33 @@ template consteval std::size_t countof(T (&)[N]) { namespace Zig { DEFINE_NATIVE_MODULE(NodeModule) { - // the default object here is a function, so we cant use the INIT_NATIVE_MODULE helper + // the default object here is a function, so we cant use the + // INIT_NATIVE_MODULE helper - Zig::GlobalObject *globalObject = reinterpret_cast(lexicalGlobalObject); - JSC::VM &vm = globalObject->vm(); - JSC::JSObject *defaultObject = JSC::JSFunction::create( - vm, globalObject, 0, "Module"_s, jsFunctionNodeModuleModuleConstructor, - JSC::ImplementationVisibility::Public, JSC::NoIntrinsic, + Zig::GlobalObject *globalObject = + reinterpret_cast(lexicalGlobalObject); + JSC::VM &vm = globalObject->vm(); + JSC::JSObject *defaultObject = JSC::JSFunction::create( + vm, globalObject, 0, "Module"_s, jsFunctionNodeModuleModuleConstructor, + JSC::ImplementationVisibility::Public, JSC::NoIntrinsic, jsFunctionNodeModuleModuleConstructor); - auto put = [&](JSC::Identifier name, JSC::JSValue value) { - defaultObject->putDirect(vm, name, value); - exportNames.append(name); - exportValues.append(value); - }; - auto putNativeFn = [&](JSC::Identifier name, JSC::NativeFunction ptr) { - JSC::JSFunction *value = JSC::JSFunction::create( - vm, globalObject, 1, name.string(), ptr, - JSC::ImplementationVisibility::Public, JSC::NoIntrinsic, ptr); - defaultObject->putDirect(vm, name, value); - exportNames.append(name); - exportValues.append(value); - }; - exportNames.reserveCapacity(13); - exportValues.ensureCapacity(13); - exportNames.append(vm.propertyNames->defaultKeyword); - exportValues.append(defaultObject); + auto put = [&](JSC::Identifier name, JSC::JSValue value) { + defaultObject->putDirect(vm, name, value); + exportNames.append(name); + exportValues.append(value); + }; + auto putNativeFn = [&](JSC::Identifier name, JSC::NativeFunction ptr) { + JSC::JSFunction *value = JSC::JSFunction::create( + vm, globalObject, 1, name.string(), ptr, + JSC::ImplementationVisibility::Public, JSC::NoIntrinsic, ptr); + defaultObject->putDirect(vm, name, value); + exportNames.append(name); + exportValues.append(value); + }; + exportNames.reserveCapacity(14); + exportValues.ensureCapacity(14); + exportNames.append(vm.propertyNames->defaultKeyword); + exportValues.append(defaultObject); putNativeFn(Identifier::fromString(vm, "createRequire"_s), jsFunctionNodeModuleCreateRequire); @@ -291,6 +312,7 @@ DEFINE_NATIVE_MODULE(NodeModule) { jsFunctionResolveFileName); putNativeFn(Identifier::fromString(vm, "_nodeModulePaths"_s), Resolver__nodeModulePathsForJS); + putNativeFn(Identifier::fromString(vm, "wrap"_s), jsFunctionWrap); put(Identifier::fromString(vm, "_cache"_s), jsCast(globalObject)->lazyRequireCacheObject()); -- cgit v1.2.3