diff options
author | 2023-09-20 21:28:07 -0400 | |
---|---|---|
committer | 2023-09-20 18:28:07 -0700 | |
commit | 34d191be67e821284e6e2a241a17731f2d646e2f (patch) | |
tree | 9fbb16c5d34965f702c125d1099b0e0eb4e54819 | |
parent | 5c6d7760a5e706bcfd0421680bfa148fc50aec63 (diff) | |
download | bun-34d191be67e821284e6e2a241a17731f2d646e2f.tar.gz bun-34d191be67e821284e6e2a241a17731f2d646e2f.tar.zst bun-34d191be67e821284e6e2a241a17731f2d646e2f.zip |
feat(runtime): implement `console._stdout` (#5842)
* implement console._stdout
* nonenum
-rw-r--r-- | src/bun.js/bindings/ZigGlobalObject.cpp | 36 | ||||
-rw-r--r-- | test/js/node/console/console.test.ts (renamed from test/js/node/console/console-constructor.test.ts) | 24 |
2 files changed, 59 insertions, 1 deletions
diff --git a/src/bun.js/bindings/ZigGlobalObject.cpp b/src/bun.js/bindings/ZigGlobalObject.cpp index 2f3aa2209..f3abd0f2d 100644 --- a/src/bun.js/bindings/ZigGlobalObject.cpp +++ b/src/bun.js/bindings/ZigGlobalObject.cpp @@ -3439,6 +3439,38 @@ JSC_DEFINE_CUSTOM_GETTER(getConsoleConstructor, (JSGlobalObject * globalObject, return JSValue::encode(result); } +// `console._stdout` is equal to `process.stdout` +JSC_DEFINE_CUSTOM_GETTER(getConsoleStdout, (JSGlobalObject * globalObject, EncodedJSValue thisValue, PropertyName property)) +{ + auto& vm = globalObject->vm(); + auto console = JSValue::decode(thisValue).getObject(); + auto global = static_cast<Zig::GlobalObject*>(globalObject); + + // instead of calling the constructor builtin, go through the process.stdout getter to ensure it's only created once. + auto stdout = global->processObject()->get(globalObject, Identifier::fromString(vm, "stdout"_s)); + if (!stdout) + return JSValue::encode({}); + + console->putDirect(vm, property, stdout, PropertyAttribute::DontEnum | 0); + return JSValue::encode(stdout); +} + +// `console._stderr` is equal to `process.stderr` +JSC_DEFINE_CUSTOM_GETTER(getConsoleStderr, (JSGlobalObject * globalObject, EncodedJSValue thisValue, PropertyName property)) +{ + auto& vm = globalObject->vm(); + auto console = JSValue::decode(thisValue).getObject(); + auto global = static_cast<Zig::GlobalObject*>(globalObject); + + // instead of calling the constructor builtin, go through the process.stdout getter to ensure it's only created once. + auto stdout = global->processObject()->get(globalObject, Identifier::fromString(vm, "stderr"_s)); + if (!stdout) + return JSValue::encode({}); + + console->putDirect(vm, property, stdout, PropertyAttribute::DontEnum | 0); + return JSValue::encode(stdout); +} + JSC_DEFINE_CUSTOM_SETTER(EventSource_setter, (JSC::JSGlobalObject * globalObject, JSC::EncodedJSValue thisValue, JSC::EncodedJSValue value, JSC::PropertyName property)) @@ -3676,7 +3708,9 @@ void GlobalObject::addBuiltinGlobals(JSC::VM& vm) JSC::JSObject* consoleObject = this->get(this, JSC::Identifier::fromString(vm, "console"_s)).getObject(); consoleObject->putDirectBuiltinFunction(vm, this, vm.propertyNames->asyncIteratorSymbol, consoleObjectAsyncIteratorCodeGenerator(vm), PropertyAttribute::Builtin | 0); consoleObject->putDirectBuiltinFunction(vm, this, clientData->builtinNames().writePublicName(), consoleObjectWriteCodeGenerator(vm), PropertyAttribute::Builtin | 0); - consoleObject->putDirectCustomAccessor(vm, Identifier::fromString(vm, "Console"_s), CustomGetterSetter::create(vm, getConsoleConstructor, noop_setter), 0); + consoleObject->putDirectCustomAccessor(vm, Identifier::fromString(vm, "Console"_s), CustomGetterSetter::create(vm, getConsoleConstructor, nullptr), 0); + consoleObject->putDirectCustomAccessor(vm, Identifier::fromString(vm, "_stdout"_s), CustomGetterSetter::create(vm, getConsoleStdout, nullptr), PropertyAttribute::DontEnum | 0); + consoleObject->putDirectCustomAccessor(vm, Identifier::fromString(vm, "_stderr"_s), CustomGetterSetter::create(vm, getConsoleStderr, nullptr), PropertyAttribute::DontEnum | 0); } extern "C" bool JSC__JSGlobalObject__startRemoteInspector(JSC__JSGlobalObject* globalObject, unsigned char* host, uint16_t arg1) diff --git a/test/js/node/console/console-constructor.test.ts b/test/js/node/console/console.test.ts index 2e2b29832..4585f7cfb 100644 --- a/test/js/node/console/console-constructor.test.ts +++ b/test/js/node/console/console.test.ts @@ -64,3 +64,27 @@ describe("console.Console", () => { expect(await errValue()).toBe("uh oh!\n"); }); }); + +test("console._stdout", () => { + // @ts-ignore + expect(console._stdout).toBe(process.stdout); + + expect(Object.getOwnPropertyDescriptor(console, "_stdout")).toEqual({ + value: process.stdout, + writable: true, + enumerable: false, + configurable: true, + }); +}); + +test("console._stderr", () => { + // @ts-ignore + expect(console._stderr).toBe(process.stderr); + + expect(Object.getOwnPropertyDescriptor(console, "_stderr")).toEqual({ + value: process.stderr, + writable: true, + enumerable: false, + configurable: true, + }); +}); |