aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> 2022-09-28 14:37:35 -0700
committerGravatar Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> 2022-09-28 14:37:35 -0700
commitb74351e55fcb54451e793879302754de440e3da0 (patch)
tree6070b9c33c17767f49d931393b9c3000e12d406b
parenta1b4dc42cb863eedbbe6735cb29a3d6941e02e04 (diff)
downloadbun-b74351e55fcb54451e793879302754de440e3da0.tar.gz
bun-b74351e55fcb54451e793879302754de440e3da0.tar.zst
bun-b74351e55fcb54451e793879302754de440e3da0.zip
Support a `default` object in CommonJS wrapper
Fixes https://github.com/oven-sh/bun/issues/1284 Related to https://github.com/oven-sh/bun/issues/1285
-rw-r--r--src/bun.js/builtins/cpp/ImportMetaObjectBuiltins.cpp8
-rw-r--r--src/bun.js/builtins/js/ImportMetaObject.js6
-rw-r--r--src/bun.js/modules/EventsModule.h18
-rw-r--r--src/runtime.js2
-rw-r--r--test/bun.js/node-builtins.test.js20
5 files changed, 41 insertions, 13 deletions
diff --git a/src/bun.js/builtins/cpp/ImportMetaObjectBuiltins.cpp b/src/bun.js/builtins/cpp/ImportMetaObjectBuiltins.cpp
index 0afe19141..360168176 100644
--- a/src/bun.js/builtins/cpp/ImportMetaObjectBuiltins.cpp
+++ b/src/bun.js/builtins/cpp/ImportMetaObjectBuiltins.cpp
@@ -168,7 +168,7 @@ const char* const s_importMetaObjectLoadCJS2ESMCode =
const JSC::ConstructAbility s_importMetaObjectRequireESMCodeConstructAbility = JSC::ConstructAbility::CannotConstruct;
const JSC::ConstructorKind s_importMetaObjectRequireESMCodeConstructorKind = JSC::ConstructorKind::None;
const JSC::ImplementationVisibility s_importMetaObjectRequireESMCodeImplementationVisibility = JSC::ImplementationVisibility::Public;
-const int s_importMetaObjectRequireESMCodeLength = 561;
+const int s_importMetaObjectRequireESMCodeLength = 626;
static const JSC::Intrinsic s_importMetaObjectRequireESMCodeIntrinsic = JSC::NoIntrinsic;
const char* const s_importMetaObjectRequireESMCode =
"(function (resolved) {\n" \
@@ -184,9 +184,13 @@ const char* const s_importMetaObjectRequireESMCode =
" }\n" \
" var exports = @Loader.getModuleNamespaceObject(entry.module);\n" \
" var commonJS = exports.default;\n" \
- " if (commonJS && @isCallable(commonJS) && @commonJSSymbol in commonJS) {\n" \
+ " var cjs = commonJS && commonJS[@commonJSSymbol];\n" \
+ " if (cjs === 0) {\n" \
+ " return commonJS;\n" \
+ " } else if (cjs && @isCallable(commonJS)) {\n" \
" return commonJS();\n" \
" }\n" \
+ " \n" \
" return exports;\n" \
"})\n" \
;
diff --git a/src/bun.js/builtins/js/ImportMetaObject.js b/src/bun.js/builtins/js/ImportMetaObject.js
index d1b409b64..bb943aabf 100644
--- a/src/bun.js/builtins/js/ImportMetaObject.js
+++ b/src/bun.js/builtins/js/ImportMetaObject.js
@@ -148,9 +148,13 @@ function requireESM(resolved) {
}
var exports = @Loader.getModuleNamespaceObject(entry.module);
var commonJS = exports.default;
- if (commonJS && @isCallable(commonJS) && @commonJSSymbol in commonJS) {
+ var cjs = commonJS && commonJS[@commonJSSymbol];
+ if (cjs === 0) {
+ return commonJS;
+ } else if (cjs && @isCallable(commonJS)) {
return commonJS();
}
+
return exports;
}
diff --git a/src/bun.js/modules/EventsModule.h b/src/bun.js/modules/EventsModule.h
index d1e14a2db..00966b858 100644
--- a/src/bun.js/modules/EventsModule.h
+++ b/src/bun.js/modules/EventsModule.h
@@ -3,6 +3,7 @@
namespace Zig {
using namespace WebCore;
+
inline void generateEventsSourceCode(JSC::JSGlobalObject *lexicalGlobalObject,
JSC::Identifier moduleKey,
Vector<JSC::Identifier, 4> &exportNames,
@@ -31,6 +32,23 @@ inline void generateEventsSourceCode(JSC::JSGlobalObject *lexicalGlobalObject,
exportValues.append(JSC::JSFunction::create(
vm, lexicalGlobalObject, 0, MAKE_STATIC_STRING_IMPL("on"),
Events_functionOn, ImplementationVisibility::Public));
+
+ JSFunction *eventEmitterModuleCJS =
+ jsCast<JSFunction *>(WebCore::JSEventEmitter::getConstructor(
+ vm, reinterpret_cast<Zig::GlobalObject *>(globalObject)));
+
+ eventEmitterModuleCJS->putDirect(
+ vm,
+ PropertyName(
+ Identifier::fromUid(vm.symbolRegistry().symbolForKey("CommonJS"_s))),
+ jsNumber(0), 0);
+
+ for (size_t i = 0; i < exportNames.size(); i++) {
+ eventEmitterModuleCJS->putDirect(vm, exportNames[i], exportValues.at(i), 0);
+ }
+
+ exportNames.append(JSC::Identifier::fromString(vm, "default"_s));
+ exportValues.append(eventEmitterModuleCJS);
}
} // namespace Zig
diff --git a/src/runtime.js b/src/runtime.js
index 10223e712..e1cf9e3df 100644
--- a/src/runtime.js
+++ b/src/runtime.js
@@ -128,7 +128,7 @@ export var __commonJS = (cb, name) => {
return mod_exports;
};
- requireFunction[cjsRequireSymbol] = true;
+ requireFunction[cjsRequireSymbol] = 1;
return requireFunction;
};
diff --git a/test/bun.js/node-builtins.test.js b/test/bun.js/node-builtins.test.js
index df31c64fc..67050f31a 100644
--- a/test/bun.js/node-builtins.test.js
+++ b/test/bun.js/node-builtins.test.js
@@ -1,16 +1,18 @@
import { describe, it, expect } from "bun:test";
import { EventEmitter } from "events";
-
+var emitters = [EventEmitter, require("events")];
describe("EventEmitter", () => {
it("should emit events", () => {
- const emitter = new EventEmitter();
- var called = false;
- const listener = () => {
- called = true;
- };
- emitter.on("test", listener);
- emitter.emit("test");
- expect(called).toBe(true);
+ for (let Emitter of emitters) {
+ const emitter = new Emitter();
+ var called = false;
+ const listener = () => {
+ called = true;
+ };
+ emitter.on("test", listener);
+ emitter.emit("test");
+ expect(called).toBe(true);
+ }
});
});