Skip to content

Commit

Permalink
Support a default object in CommonJS wrapper
Browse files Browse the repository at this point in the history
Fixes #1284

Related to #1285
  • Loading branch information
Jarred-Sumner committed Sep 28, 2022
1 parent a1b4dc4 commit b74351e
Show file tree
Hide file tree
Showing 5 changed files with 41 additions and 13 deletions.
8 changes: 6 additions & 2 deletions src/bun.js/builtins/cpp/ImportMetaObjectBuiltins.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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" \
Expand All @@ -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" \
;
Expand Down
6 changes: 5 additions & 1 deletion src/bun.js/builtins/js/ImportMetaObject.js
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand Down
18 changes: 18 additions & 0 deletions src/bun.js/modules/EventsModule.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

namespace Zig {
using namespace WebCore;

inline void generateEventsSourceCode(JSC::JSGlobalObject *lexicalGlobalObject,
JSC::Identifier moduleKey,
Vector<JSC::Identifier, 4> &exportNames,
Expand Down Expand Up @@ -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
2 changes: 1 addition & 1 deletion src/runtime.js
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,7 @@ export var __commonJS = (cb, name) => {
return mod_exports;
};

requireFunction[cjsRequireSymbol] = true;
requireFunction[cjsRequireSymbol] = 1;
return requireFunction;
};

Expand Down
20 changes: 11 additions & 9 deletions test/bun.js/node-builtins.test.js
Original file line number Diff line number Diff line change
@@ -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);
}
});
});

0 comments on commit b74351e

Please sign in to comment.