From 387f1260c9dc0cea667b44ec0152fff0cd4def25 Mon Sep 17 00:00:00 2001 From: dave caruso Date: Thu, 28 Sep 2023 03:53:24 -0700 Subject: [PATCH] Get Next.js Pages Router to work (#6095) * hell * make it so bun-debug-src * teag * wild * yippee * fas * fix async hooks assertions * yap * yeah that's wild * aa * a * increase time allowed * so trivial --- packages/bun-types/bun.d.ts | 2 +- src/bun.js/WebKit | 2 +- src/bun.js/bindings/CommonJSModuleRecord.cpp | 69 ++-- src/bun.js/bindings/CommonJSModuleRecord.h | 6 +- src/bun.js/bindings/ZigGlobalObject.cpp | 34 +- src/bun.js/bindings/ZigGlobalObject.lut.h | 389 +++++++++--------- src/bun.js/bindings/ZigGlobalObject.lut.txt | 2 - src/bun.js/module_loader.zig | 22 +- src/bun.js/modules/NodeModuleModule.h | 44 +- src/bundler.zig | 2 + src/js/_codegen/builtin-parser.ts | 6 +- src/js/_codegen/client-js.ts | 12 +- src/js/_codegen/replacements.ts | 17 +- src/js/builtins.d.ts | 6 +- src/js/builtins/BunBuiltinNames.h | 7 +- src/js/builtins/Module.ts | 5 + src/js/builtins/ProcessObjectInternals.ts | 3 +- src/js/node/async_hooks.ts | 117 +++++- src/js/node/tty.js | 16 +- src/js/out/InternalModuleRegistryConstants.h | 12 +- src/js/out/WebCoreJSBuiltins.cpp | 16 +- src/js/out/WebCoreJSBuiltins.h | 11 + src/js_ast.zig | 1 + src/js_parser.zig | 228 +++++----- src/js_printer.zig | 16 +- src/string.zig | 20 +- test/.gitignore | 1 - test/README.md | 83 ---- test/bun.lockb | Bin 163311 -> 163310 bytes .../next/default-pages-dir/.eslintrc.json | 3 + .../next/default-pages-dir/.gitignore | 38 ++ .../next/default-pages-dir/README.md | 40 ++ .../next/default-pages-dir/bun.lockb | Bin 0 -> 167519 bytes .../next/default-pages-dir/next.config.js | 10 + .../next/default-pages-dir/package.json | 28 ++ .../next/default-pages-dir/postcss.config.js | 6 + .../next/default-pages-dir/public/favicon.ico | Bin 0 -> 25931 bytes .../next/default-pages-dir/public/next.svg | 1 + .../next/default-pages-dir/public/vercel.svg | 1 + .../next/default-pages-dir/src/Counter1.txt | 27 ++ .../next/default-pages-dir/src/Counter2.txt | 27 ++ .../next/default-pages-dir/src/pages/_app.tsx | 6 + .../default-pages-dir/src/pages/_document.tsx | 13 + .../default-pages-dir/src/pages/api/hello.ts | 10 + .../default-pages-dir/src/pages/index.tsx | 128 ++++++ .../default-pages-dir/src/styles/globals.css | 27 ++ .../next/default-pages-dir/tailwind.config.ts | 19 + .../test/dev-server-puppeteer.ts | 101 +++++ .../default-pages-dir/test/dev-server.test.ts | 79 ++++ .../default-pages-dir/test/next-build.test.ts | 141 +++++++ .../next/default-pages-dir/tsconfig.json | 22 + .../default-pages-dir/tsconfig_for_build.json | 23 ++ .../node/async_hooks/async_hooks.node.test.ts | 28 +- .../modulePrototypeOverwrite-fixture.cjs | 1 + .../node/module/modulePrototypeOverwrite.cjs | 17 + .../js/node/module/node-module-module.test.js | 11 + test/js/node/process/process-stdio.test.ts | 2 +- test/js/node/stream/node-stream.test.js | 12 +- test/js/third_party/got/bun.lockb | Bin 0 -> 9072 bytes test/js/third_party/prisma/bun.lockb | Bin 0 -> 2951 bytes test/js/third_party/yargs/bun.lockb | Bin 0 -> 6747 bytes 61 files changed, 1430 insertions(+), 540 deletions(-) delete mode 100644 test/.gitignore delete mode 100644 test/README.md create mode 100644 test/integration/next/default-pages-dir/.eslintrc.json create mode 100644 test/integration/next/default-pages-dir/.gitignore create mode 100644 test/integration/next/default-pages-dir/README.md create mode 100755 test/integration/next/default-pages-dir/bun.lockb create mode 100644 test/integration/next/default-pages-dir/next.config.js create mode 100644 test/integration/next/default-pages-dir/package.json create mode 100644 test/integration/next/default-pages-dir/postcss.config.js create mode 100644 test/integration/next/default-pages-dir/public/favicon.ico create mode 100644 test/integration/next/default-pages-dir/public/next.svg create mode 100644 test/integration/next/default-pages-dir/public/vercel.svg create mode 100644 test/integration/next/default-pages-dir/src/Counter1.txt create mode 100644 test/integration/next/default-pages-dir/src/Counter2.txt create mode 100644 test/integration/next/default-pages-dir/src/pages/_app.tsx create mode 100644 test/integration/next/default-pages-dir/src/pages/_document.tsx create mode 100644 test/integration/next/default-pages-dir/src/pages/api/hello.ts create mode 100644 test/integration/next/default-pages-dir/src/pages/index.tsx create mode 100644 test/integration/next/default-pages-dir/src/styles/globals.css create mode 100644 test/integration/next/default-pages-dir/tailwind.config.ts create mode 100644 test/integration/next/default-pages-dir/test/dev-server-puppeteer.ts create mode 100644 test/integration/next/default-pages-dir/test/dev-server.test.ts create mode 100644 test/integration/next/default-pages-dir/test/next-build.test.ts create mode 100644 test/integration/next/default-pages-dir/tsconfig.json create mode 100644 test/integration/next/default-pages-dir/tsconfig_for_build.json create mode 100644 test/js/node/module/modulePrototypeOverwrite-fixture.cjs create mode 100644 test/js/node/module/modulePrototypeOverwrite.cjs create mode 100755 test/js/third_party/got/bun.lockb create mode 100755 test/js/third_party/prisma/bun.lockb create mode 100755 test/js/third_party/yargs/bun.lockb diff --git a/packages/bun-types/bun.d.ts b/packages/bun-types/bun.d.ts index a74274667c..bd8b750237 100644 --- a/packages/bun-types/bun.d.ts +++ b/packages/bun-types/bun.d.ts @@ -3827,7 +3827,7 @@ declare module "bun" { : undefined; type ReadableToSyncIO = X extends "pipe" | undefined - ? Uint8Array + ? Buffer : undefined; type WritableIO = FileSink | number | undefined; diff --git a/src/bun.js/WebKit b/src/bun.js/WebKit index e1aa0a58e2..6ee85cc2dc 160000 --- a/src/bun.js/WebKit +++ b/src/bun.js/WebKit @@ -1 +1 @@ -Subproject commit e1aa0a58e282b53fc20503d6e7ec93c621bc5570 +Subproject commit 6ee85cc2dc431e146723885bc73ac14f33e0d82b diff --git a/src/bun.js/bindings/CommonJSModuleRecord.cpp b/src/bun.js/bindings/CommonJSModuleRecord.cpp index eea3b2a6fd..38b55ba4d8 100644 --- a/src/bun.js/bindings/CommonJSModuleRecord.cpp +++ b/src/bun.js/bindings/CommonJSModuleRecord.cpp @@ -8,7 +8,7 @@ * Then, at runtime, we create a JSCommonJSModule object. * * On this special object, we override the setter for the "exports" property in - * a non-observable way (`static bool put ...`) + * a non-observable way using a CustomGetterSetter. * * When the setter is called, we set the internal "exports" property to the * value passed in and we also update the requireMap with the new value. @@ -20,17 +20,13 @@ * * If an exception occurs, we remove the entry from the requireMap. * - * We tried using a CustomGetterSetter instead of overriding `put`, but it led - * to returning the getter itself - * - * How cyclical dependencies are handled + * How cyclical dependencies are handled: * * Before executing the CommonJS module, we set the exports object in the * requireMap to an empty object. When the CommonJS module is required again, we * return the exports object from the requireMap. The values should be in sync * while the module is being executed, unless module.exports is re-assigned to a * different value. In that case, it will have a stale value. - * */ #include "root.h" @@ -98,29 +94,35 @@ static bool canPerformFastEnumeration(Structure* s) static bool evaluateCommonJSModuleOnce(JSC::VM& vm, Zig::GlobalObject* globalObject, JSCommonJSModule* moduleObject, JSString* dirname, JSValue filename, WTF::NakedPtr& exception) { JSC::Structure* thisObjectStructure = globalObject->commonJSFunctionArgumentsStructure(); - JSC::JSObject* thisObject = JSC::constructEmptyObject( - vm, - thisObjectStructure); - thisObject->putDirectOffset( - vm, - 0, - moduleObject); - thisObject->putDirectOffset( - vm, - 1, - dirname); + JSFunction* resolveFunction = JSC::JSBoundFunction::create(vm, + globalObject, + globalObject->requireResolveFunctionUnbound(), + moduleObject->id(), + ArgList(), 1, jsString(vm, String("resolve"_s))); + JSFunction* requireFunction = JSC::JSBoundFunction::create(vm, + globalObject, + globalObject->requireFunctionUnbound(), + moduleObject, + ArgList(), 1, jsString(vm, String("require"_s))); + requireFunction->putDirect(vm, vm.propertyNames->resolve, resolveFunction, 0); + moduleObject->putDirect(vm, WebCore::clientData(vm)->builtinNames().requirePublicName(), requireFunction, 0); - thisObject->putDirectOffset( - vm, - 2, - filename); + JSC::JSObject* thisObject = JSC::constructEmptyObject(vm, thisObjectStructure); + thisObject->putDirectOffset(vm, 0, moduleObject); + thisObject->putDirectOffset(vm, 1, requireFunction); + thisObject->putDirectOffset(vm, 2, resolveFunction); + thisObject->putDirectOffset(vm, 3, dirname); + thisObject->putDirectOffset(vm, 4, filename); moduleObject->hasEvaluated = true; + // TODO: try to not use this write barrier. it needs some extensive testing. + // there is some possible GC issue where `thisObject` is gc'd before it should be globalObject->m_BunCommonJSModuleValue.set(vm, globalObject, thisObject); JSValue empty = JSC::evaluate(globalObject, moduleObject->sourceCode.get()->sourceCode(), thisObject, exception); + ensureStillAliveHere(thisObject); globalObject->m_BunCommonJSModuleValue.clear(); moduleObject->sourceCode.clear(); @@ -398,9 +400,9 @@ JSC_DEFINE_HOST_FUNCTION(functionCommonJSModuleRecord_compile, (JSGlobalObject * RETURN_IF_EXCEPTION(throwScope, JSValue::encode({})); String wrappedString = makeString( - "(function(module,exports,require,__dirname,__filename){"_s, + "(function(exports,require,module,__filename,__dirname){"_s, sourceString, - "\n}).call($_BunCommonJSModule_$.module.exports, $_BunCommonJSModule_$.module, $_BunCommonJSModule_$.module.exports, ($_BunCommonJSModule_$.module.require = $_BunCommonJSModule_$.module.require.bind($_BunCommonJSModule_$.module), $_BunCommonJSModule_$.module.require.path = $_BunCommonJSModule_$.module.id, $_BunCommonJSModule_$.module.require.resolve = $_BunCommonJSModule_$.module.require.resolve.bind($_BunCommonJSModule_$.module.id), $_BunCommonJSModule_$.module.require), $_BunCommonJSModule_$.__dirname, $_BunCommonJSModule_$.__filename);"_s); + "\n}).call(this.module.exports,this.module.exports,this.require,this.module,this.__filename,this.__dirname)"_s); SourceCode sourceCode = makeSource( WTFMove(wrappedString), @@ -483,14 +485,12 @@ public: ASSERT(inherits(vm, info())); reifyStaticProperties(vm, JSCommonJSModule::info(), JSCommonJSModulePrototypeTableValues, *this); - this->putDirect(vm, clientData(vm)->builtinNames().requirePublicName(), (static_cast(globalObject))->requireFunctionUnbound(), PropertyAttribute::Builtin | PropertyAttribute::Function | 0); - this->putDirectNativeFunction( vm, globalObject, clientData(vm)->builtinNames().requirePrivateName(), 2, - jsFunctionRequireCommonJS, ImplementationVisibility::Public, NoIntrinsic, JSC::PropertyAttribute::ReadOnly | 0); + jsFunctionRequireCommonJS, ImplementationVisibility::Public, NoIntrinsic, JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::DontDelete); } }; @@ -774,21 +774,6 @@ JSValue JSCommonJSModule::id() return m_id.get(); } -bool JSCommonJSModule::put( - JSC::JSCell* cell, - JSC::JSGlobalObject* globalObject, - JSC::PropertyName propertyName, - JSC::JSValue value, - JSC::PutPropertySlot& slot) -{ - - auto& vm = globalObject->vm(); - auto* clientData = WebCore::clientData(vm); - auto throwScope = DECLARE_THROW_SCOPE(vm); - - RELEASE_AND_RETURN(throwScope, Base::put(cell, globalObject, propertyName, value, slot)); -} - template JSC::GCClient::IsoSubspace* JSCommonJSModule::subspaceFor(JSC::VM& vm) { if constexpr (mode == JSC::SubspaceAccess::Concurrently) @@ -1022,7 +1007,7 @@ JSObject* JSCommonJSModule::createBoundRequireFunction(VM& vm, JSGlobalObject* l globalObject, globalObject->requireResolveFunctionUnbound(), moduleObject, - ArgList(), 1, jsString(vm, String("require"_s))); + ArgList(), 1, jsString(vm, String("resolve"_s))); requireFunction->putDirect(vm, builtinNames.resolvePublicName(), resolveFunction, PropertyAttribute::Function | 0); diff --git a/src/bun.js/bindings/CommonJSModuleRecord.h b/src/bun.js/bindings/CommonJSModuleRecord.h index 14d0454787..2f9ba648f6 100644 --- a/src/bun.js/bindings/CommonJSModuleRecord.h +++ b/src/bun.js/bindings/CommonJSModuleRecord.h @@ -20,7 +20,7 @@ JSC_DECLARE_HOST_FUNCTION(jsFunctionLoadModule); class JSCommonJSModule final : public JSC::JSDestructibleObject { public: using Base = JSC::JSDestructibleObject; - static constexpr unsigned StructureFlags = Base::StructureFlags | JSC::OverridesPut; + static constexpr unsigned StructureFlags = Base::StructureFlags; mutable JSC::WriteBarrier m_id; mutable JSC::WriteBarrier m_filename; @@ -74,10 +74,6 @@ public: DECLARE_VISIT_CHILDREN; - static bool put(JSC::JSCell* cell, JSC::JSGlobalObject* globalObject, - JSC::PropertyName propertyName, JSC::JSValue value, - JSC::PutPropertySlot& slot); - DECLARE_INFO; template static JSC::GCClient::IsoSubspace* subspaceFor(JSC::VM& vm); diff --git a/src/bun.js/bindings/ZigGlobalObject.cpp b/src/bun.js/bindings/ZigGlobalObject.cpp index 54fb58776b..7ffd75ccf3 100644 --- a/src/bun.js/bindings/ZigGlobalObject.cpp +++ b/src/bun.js/bindings/ZigGlobalObject.cpp @@ -1948,6 +1948,11 @@ JSC_DECLARE_HOST_FUNCTION(getInternalWritableStream); JSC_DECLARE_HOST_FUNCTION(whenSignalAborted); JSC_DECLARE_HOST_FUNCTION(isAbortSignal); +JSC_DEFINE_HOST_FUNCTION(jsCreateCJSImportMeta, (JSGlobalObject * globalObject, CallFrame* callFrame)) +{ + return JSValue::encode(Zig::ImportMetaObject::create(globalObject, callFrame->argument(0).toString(globalObject))); +} + JSC_DEFINE_HOST_FUNCTION(makeThisTypeErrorForBuiltins, (JSGlobalObject * globalObject, CallFrame* callFrame)) { ASSERT(callFrame); @@ -2825,11 +2830,20 @@ void GlobalObject::finishCreation(VM& vm) m_commonJSFunctionArgumentsStructure.initLater( [](const Initializer& init) { auto* globalObject = reinterpret_cast(init.owner); + + auto prototype = JSC::constructEmptyObject(init.owner, globalObject->objectPrototype(), 1); + prototype->putDirect( + init.vm, + Identifier::fromString(init.vm, "createImportMeta"_s), + JSFunction::create(init.vm, init.owner, 2, ""_s, jsCreateCJSImportMeta, ImplementationVisibility::Public), + PropertyAttribute::DontDelete | PropertyAttribute::DontEnum | 0); + JSC::Structure* structure = globalObject->structureCache().emptyObjectStructureForPrototype( globalObject, - globalObject->objectPrototype(), - 3); + prototype, + 5); JSC::PropertyOffset offset; + auto& vm = globalObject->vm(); structure = structure->addPropertyTransition( @@ -2839,6 +2853,20 @@ void GlobalObject::finishCreation(VM& vm) 0, offset); + structure = structure->addPropertyTransition( + vm, + structure, + JSC::Identifier::fromString(vm, "require"_s), + 0, + offset); + + structure = structure->addPropertyTransition( + vm, + structure, + JSC::Identifier::fromString(vm, "resolve"_s), + 0, + offset); + structure = structure->addPropertyTransition( vm, structure, @@ -3647,6 +3675,8 @@ void GlobalObject::addBuiltinGlobals(JSC::VM& vm) putDirectBuiltinFunction(vm, this, builtinNames.internalRequirePrivateName(), importMetaObjectInternalRequireCodeGenerator(vm), PropertyAttribute::Builtin | PropertyAttribute::DontDelete | PropertyAttribute::ReadOnly); putDirectBuiltinFunction(vm, this, builtinNames.requireNativeModulePrivateName(), moduleRequireNativeModuleCodeGenerator(vm), PropertyAttribute::Builtin | PropertyAttribute::DontDelete | PropertyAttribute::ReadOnly); + putDirectBuiltinFunction(vm, this, builtinNames.overridableRequirePrivateName(), moduleOverridableRequireCodeGenerator(vm), 0); + putDirectNativeFunction(vm, this, builtinNames.createUninitializedArrayBufferPrivateName(), 1, functionCreateUninitializedArrayBuffer, ImplementationVisibility::Public, NoIntrinsic, PropertyAttribute::DontDelete | PropertyAttribute::ReadOnly | PropertyAttribute::Function); putDirectNativeFunction(vm, this, builtinNames.resolveSyncPrivateName(), 1, functionImportMeta__resolveSyncPrivate, ImplementationVisibility::Public, NoIntrinsic, PropertyAttribute::DontDelete | PropertyAttribute::ReadOnly | PropertyAttribute::Function); putDirectNativeFunction(vm, this, builtinNames.createInternalModuleByIdPrivateName(), 1, InternalModuleRegistry::jsCreateInternalModuleById, ImplementationVisibility::Public, NoIntrinsic, PropertyAttribute::DontDelete | PropertyAttribute::ReadOnly | PropertyAttribute::Function); diff --git a/src/bun.js/bindings/ZigGlobalObject.lut.h b/src/bun.js/bindings/ZigGlobalObject.lut.h index 8363a994d4..6516648e8e 100644 --- a/src/bun.js/bindings/ZigGlobalObject.lut.h +++ b/src/bun.js/bindings/ZigGlobalObject.lut.h @@ -4,7 +4,7 @@ static const struct CompactHashIndex bunGlobalObjectTableIndex[260] = { { -1, -1 }, { -1, -1 }, { -1, -1 }, - { 43, -1 }, + { 42, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, @@ -13,7 +13,172 @@ static const struct CompactHashIndex bunGlobalObjectTableIndex[260] = { { 6, -1 }, { 3, -1 }, { -1, -1 }, + { 34, -1 }, + { -1, -1 }, + { -1, -1 }, + { -1, -1 }, + { -1, -1 }, + { -1, -1 }, + { -1, -1 }, + { -1, -1 }, + { 29, 258 }, + { -1, -1 }, + { -1, -1 }, + { 54, 257 }, + { -1, -1 }, + { -1, -1 }, + { -1, -1 }, + { -1, -1 }, + { -1, -1 }, + { -1, -1 }, + { -1, -1 }, + { -1, -1 }, + { 51, -1 }, + { -1, -1 }, + { -1, -1 }, + { -1, -1 }, + { -1, -1 }, + { 2, -1 }, + { -1, -1 }, + { -1, -1 }, + { -1, -1 }, + { -1, -1 }, + { -1, -1 }, + { 18, -1 }, + { 56, -1 }, + { -1, -1 }, + { -1, -1 }, + { 14, -1 }, + { -1, -1 }, + { -1, -1 }, + { -1, -1 }, + { -1, -1 }, + { -1, -1 }, + { -1, -1 }, + { -1, -1 }, + { -1, -1 }, + { 41, -1 }, + { 47, -1 }, + { -1, -1 }, + { -1, -1 }, + { -1, -1 }, + { -1, -1 }, + { 69, -1 }, + { -1, -1 }, + { -1, -1 }, + { -1, -1 }, + { -1, -1 }, + { -1, -1 }, + { 39, -1 }, + { -1, -1 }, + { -1, -1 }, + { 38, -1 }, + { 63, -1 }, + { -1, -1 }, + { 57, -1 }, + { -1, -1 }, + { -1, -1 }, + { -1, -1 }, + { -1, -1 }, + { -1, -1 }, + { -1, -1 }, + { -1, -1 }, + { 49, -1 }, + { -1, -1 }, + { -1, -1 }, + { -1, -1 }, + { -1, -1 }, + { -1, -1 }, + { -1, -1 }, + { 58, -1 }, + { 11, -1 }, + { -1, -1 }, + { -1, -1 }, + { 0, -1 }, + { -1, -1 }, + { 37, -1 }, + { 21, -1 }, + { 66, -1 }, + { -1, -1 }, + { -1, -1 }, + { 70, -1 }, + { -1, -1 }, + { 45, -1 }, + { -1, -1 }, + { 48, -1 }, + { -1, -1 }, + { -1, -1 }, + { 24, -1 }, + { -1, -1 }, + { -1, -1 }, + { -1, -1 }, + { 33, -1 }, + { -1, -1 }, + { -1, -1 }, + { -1, -1 }, + { -1, -1 }, + { 50, -1 }, + { 46, -1 }, + { -1, -1 }, + { 13, -1 }, + { -1, -1 }, + { -1, -1 }, + { 43, -1 }, + { -1, -1 }, + { 1, -1 }, + { -1, -1 }, + { -1, -1 }, + { -1, -1 }, + { -1, -1 }, + { -1, -1 }, + { -1, -1 }, + { -1, -1 }, + { -1, -1 }, + { -1, -1 }, + { 32, -1 }, + { -1, -1 }, + { -1, -1 }, + { -1, -1 }, + { -1, -1 }, + { 28, -1 }, + { -1, -1 }, + { -1, -1 }, + { -1, -1 }, + { -1, -1 }, + { 26, -1 }, + { -1, -1 }, + { -1, -1 }, + { 17, -1 }, + { -1, -1 }, + { 31, -1 }, + { -1, -1 }, + { -1, -1 }, { 35, -1 }, + { 71, -1 }, + { -1, -1 }, + { -1, -1 }, + { -1, -1 }, + { -1, -1 }, + { 22, -1 }, + { -1, -1 }, + { -1, -1 }, + { 4, -1 }, + { -1, -1 }, + { -1, -1 }, + { -1, -1 }, + { -1, -1 }, + { 23, -1 }, + { -1, -1 }, + { -1, -1 }, + { 55, -1 }, + { -1, -1 }, + { 53, -1 }, + { -1, -1 }, + { 12, -1 }, + { 25, -1 }, + { 7, -1 }, + { -1, -1 }, + { 9, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, @@ -21,10 +186,29 @@ static const struct CompactHashIndex bunGlobalObjectTableIndex[260] = { { -1, -1 }, { -1, -1 }, { -1, -1 }, - { 30, 258 }, + { 61, -1 }, + { 60, -1 }, + { -1, -1 }, + { 5, 256 }, + { -1, -1 }, + { 64, -1 }, { -1, -1 }, { -1, -1 }, - { 55, 257 }, + { -1, -1 }, + { 36, -1 }, + { -1, -1 }, + { 15, -1 }, + { -1, -1 }, + { -1, -1 }, + { -1, -1 }, + { -1, -1 }, + { -1, -1 }, + { -1, -1 }, + { 40, 259 }, + { -1, -1 }, + { -1, -1 }, + { 68, -1 }, + { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, @@ -38,109 +222,13 @@ static const struct CompactHashIndex bunGlobalObjectTableIndex[260] = { { -1, -1 }, { -1, -1 }, { -1, -1 }, - { 2, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, - { 18, -1 }, - { 57, -1 }, { -1, -1 }, - { -1, -1 }, - { 14, -1 }, - { -1, -1 }, - { -1, -1 }, - { -1, -1 }, - { -1, -1 }, - { -1, -1 }, - { -1, -1 }, - { -1, -1 }, - { -1, -1 }, - { 42, -1 }, - { 48, -1 }, - { -1, -1 }, - { -1, -1 }, - { -1, -1 }, - { -1, -1 }, - { 70, -1 }, - { -1, -1 }, - { -1, -1 }, - { -1, -1 }, - { -1, -1 }, - { -1, -1 }, - { 40, -1 }, - { -1, -1 }, - { -1, -1 }, - { 39, -1 }, - { 64, -1 }, - { -1, -1 }, - { 58, -1 }, - { -1, -1 }, - { -1, -1 }, - { -1, -1 }, - { -1, -1 }, - { -1, -1 }, - { -1, -1 }, - { -1, -1 }, - { 50, -1 }, - { -1, -1 }, - { -1, -1 }, - { -1, -1 }, - { -1, -1 }, - { -1, -1 }, - { -1, -1 }, - { 59, -1 }, - { 11, -1 }, - { -1, -1 }, - { -1, -1 }, - { 0, -1 }, - { -1, -1 }, - { 38, -1 }, - { 22, -1 }, - { 67, -1 }, - { -1, -1 }, - { -1, -1 }, - { 71, -1 }, - { -1, -1 }, - { 46, -1 }, - { -1, -1 }, - { 49, -1 }, - { -1, -1 }, - { -1, -1 }, - { 25, -1 }, - { -1, -1 }, - { -1, -1 }, - { -1, -1 }, - { 34, -1 }, - { -1, -1 }, - { -1, -1 }, - { -1, -1 }, - { -1, -1 }, - { 51, -1 }, - { 47, -1 }, - { -1, -1 }, - { 13, -1 }, - { -1, -1 }, - { -1, -1 }, - { 44, -1 }, - { -1, -1 }, - { 1, -1 }, - { -1, -1 }, - { -1, -1 }, - { -1, -1 }, - { -1, -1 }, - { -1, -1 }, - { 21, -1 }, - { -1, -1 }, - { -1, -1 }, - { -1, -1 }, - { 33, -1 }, - { -1, -1 }, - { -1, -1 }, - { -1, -1 }, - { -1, -1 }, - { 29, -1 }, + { 30, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, @@ -148,102 +236,14 @@ static const struct CompactHashIndex bunGlobalObjectTableIndex[260] = { { 27, -1 }, { -1, -1 }, { -1, -1 }, - { 17, -1 }, { -1, -1 }, - { 32, -1 }, + { 44, -1 }, { -1, -1 }, { -1, -1 }, - { 36, -1 }, - { 72, -1 }, - { -1, -1 }, - { -1, -1 }, - { -1, -1 }, - { -1, -1 }, - { 23, -1 }, - { -1, -1 }, - { -1, -1 }, - { 4, -1 }, - { -1, -1 }, - { -1, -1 }, - { -1, -1 }, - { -1, -1 }, - { 24, -1 }, - { -1, -1 }, - { -1, -1 }, - { 56, -1 }, - { -1, -1 }, - { 54, -1 }, - { -1, -1 }, - { 12, -1 }, - { 26, -1 }, - { 7, -1 }, - { -1, -1 }, - { 9, -1 }, - { -1, -1 }, - { -1, -1 }, - { -1, -1 }, - { -1, -1 }, - { -1, -1 }, - { -1, -1 }, - { -1, -1 }, - { 62, -1 }, - { 61, -1 }, - { -1, -1 }, - { 5, 256 }, - { -1, -1 }, { 65, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, - { 37, -1 }, - { -1, -1 }, - { 15, -1 }, - { -1, -1 }, - { -1, -1 }, - { -1, -1 }, - { -1, -1 }, - { -1, -1 }, - { -1, -1 }, - { 41, 259 }, - { -1, -1 }, - { -1, -1 }, - { 69, -1 }, - { -1, -1 }, - { -1, -1 }, - { -1, -1 }, - { -1, -1 }, - { -1, -1 }, - { -1, -1 }, - { -1, -1 }, - { -1, -1 }, - { -1, -1 }, - { 53, -1 }, - { -1, -1 }, - { -1, -1 }, - { -1, -1 }, - { -1, -1 }, - { -1, -1 }, - { -1, -1 }, - { -1, -1 }, - { -1, -1 }, - { -1, -1 }, - { -1, -1 }, - { 31, -1 }, - { -1, -1 }, - { -1, -1 }, - { -1, -1 }, - { -1, -1 }, - { 28, -1 }, - { -1, -1 }, - { -1, -1 }, - { -1, -1 }, - { 45, -1 }, - { -1, -1 }, - { -1, -1 }, - { 66, -1 }, - { -1, -1 }, - { -1, -1 }, - { -1, -1 }, { -1, -1 }, { 20, -1 }, { -1, -1 }, @@ -257,12 +257,12 @@ static const struct CompactHashIndex bunGlobalObjectTableIndex[260] = { { 19, -1 }, { -1, -1 }, { 8, -1 }, - { 60, -1 }, - { 63, -1 }, - { 68, -1 }, + { 59, -1 }, + { 62, -1 }, + { 67, -1 }, }; -static const struct HashTableValue bunGlobalObjectTableValues[73] = { +static const struct HashTableValue bunGlobalObjectTableValues[72] = { { "addEventListener"_s, static_cast(PropertyAttribute::Function), NoIntrinsic, { HashTableValue::NativeFunctionType, jsFunctionAddEventListener, 2 } }, { "alert"_s, static_cast(PropertyAttribute::Function), NoIntrinsic, { HashTableValue::NativeFunctionType, WebCore__alert, 1 } }, { "atob"_s, static_cast(PropertyAttribute::Function), NoIntrinsic, { HashTableValue::NativeFunctionType, functionATOB, 1 } }, @@ -284,7 +284,6 @@ static const struct HashTableValue bunGlobalObjectTableValues[73] = { { "structuredClone"_s, static_cast(PropertyAttribute::Function), NoIntrinsic, { HashTableValue::NativeFunctionType, functionStructuredClone, 2 } }, { "global"_s, static_cast(PropertyAttribute::PropertyCallback), NoIntrinsic, { HashTableValue::LazyPropertyType, GlobalObject_getGlobalThis } }, { "EventSource"_s, static_cast(PropertyAttribute::PropertyCallback), NoIntrinsic, { HashTableValue::LazyPropertyType, getEventSourceConstructor } }, - { "$_BunCommonJSModule_$"_s, static_cast(PropertyAttribute::CustomAccessor|PropertyAttribute::DontDelete|PropertyAttribute::ReadOnly), NoIntrinsic, { HashTableValue::GetterSetterType, BunCommonJSModule_getter, 0 } }, { "Bun"_s, static_cast(PropertyAttribute::CellProperty|PropertyAttribute::DontDelete|PropertyAttribute::ReadOnly), NoIntrinsic, { HashTableValue::LazyCellPropertyType, OBJECT_OFFSETOF(GlobalObject, m_bunObject) } }, { "File"_s, static_cast(PropertyAttribute::CellProperty), NoIntrinsic, { HashTableValue::LazyCellPropertyType, OBJECT_OFFSETOF(GlobalObject, m_JSDOMFileConstructor) } }, { "crypto"_s, static_cast(PropertyAttribute::CellProperty), NoIntrinsic, { HashTableValue::LazyCellPropertyType, OBJECT_OFFSETOF(GlobalObject, m_cryptoObject) } }, @@ -339,4 +338,4 @@ static const struct HashTableValue bunGlobalObjectTableValues[73] = { }; static const struct HashTable bunGlobalObjectTable = - { 73, 255, true, nullptr, bunGlobalObjectTableValues, bunGlobalObjectTableIndex }; + { 72, 255, false, nullptr, bunGlobalObjectTableValues, bunGlobalObjectTableIndex }; diff --git a/src/bun.js/bindings/ZigGlobalObject.lut.txt b/src/bun.js/bindings/ZigGlobalObject.lut.txt index 7700dcc8d4..aadaee92a7 100644 --- a/src/bun.js/bindings/ZigGlobalObject.lut.txt +++ b/src/bun.js/bindings/ZigGlobalObject.lut.txt @@ -25,8 +25,6 @@ global GlobalObject_getGlobalThis PropertyCallback EventSource getEventSourceConstructor PropertyCallback - $_BunCommonJSModule_$ BunCommonJSModule_getter CustomAccessor|DontDelete|ReadOnly - Bun GlobalObject::m_bunObject CellProperty|DontDelete|ReadOnly File GlobalObject::m_JSDOMFileConstructor CellProperty crypto GlobalObject::m_cryptoObject CellProperty diff --git a/src/bun.js/module_loader.zig b/src/bun.js/module_loader.zig index ca066450d2..89dca35b0a 100644 --- a/src/bun.js/module_loader.zig +++ b/src/bun.js/module_loader.zig @@ -154,21 +154,26 @@ const BunDebugHolder = struct { pub var lock: bun.Lock = undefined; }; -fn dumpSource(specifier: string, printer: anytype) !void { +/// Dumps the module source to a file in /tmp/bun-debug-src/{filepath} +/// +/// This can technically fail if concurrent access across processes happens, or permission issues. +/// Errors here should always be ignored. +fn dumpSource(specifier: string, printer: anytype) void { if (BunDebugHolder.dir == null) { - BunDebugHolder.dir = try std.fs.cwd().makeOpenPathIterable("/tmp/bun-debug-src/", .{}); + BunDebugHolder.dir = std.fs.cwd().makeOpenPathIterable("/tmp/bun-debug-src/", .{}) catch return; BunDebugHolder.lock = bun.Lock.init(); } BunDebugHolder.lock.lock(); defer BunDebugHolder.lock.unlock(); + const dir = BunDebugHolder.dir orelse return; if (std.fs.path.dirname(specifier)) |dir_path| { - var parent = try BunDebugHolder.dir.?.dir.makeOpenPathIterable(dir_path[1..], .{}); + var parent = dir.dir.makeOpenPathIterable(dir_path[1..], .{}) catch return; defer parent.close(); - try parent.dir.writeFile(std.fs.path.basename(specifier), printer.ctx.getWritten()); + parent.dir.writeFile(std.fs.path.basename(specifier), printer.ctx.getWritten()) catch return; } else { - try BunDebugHolder.dir.?.dir.writeFile(std.fs.path.basename(specifier), printer.ctx.getWritten()); + dir.dir.writeFile(std.fs.path.basename(specifier), printer.ctx.getWritten()) catch return; } } @@ -545,7 +550,7 @@ pub const RuntimeTranspilerStore = struct { } if (comptime Environment.dump_source) { - dumpSource(specifier, &printer) catch {}; + dumpSource(specifier, &printer); } this.resolved_source = ResolvedSource{ @@ -1230,7 +1235,7 @@ pub const ModuleLoader = struct { } if (comptime Environment.dump_source) { - try dumpSource(specifier, &printer); + dumpSource(specifier, &printer); } var commonjs_exports = try bun.default_allocator.alloc(ZigString, parse_result.ast.commonjs_export_names.len); @@ -1626,7 +1631,7 @@ pub const ModuleLoader = struct { }; if (comptime Environment.dump_source) { - try dumpSource(specifier, &printer); + dumpSource(specifier, &printer); } var commonjs_exports = try bun.default_allocator.alloc(ZigString, parse_result.ast.commonjs_export_names.len); @@ -1979,6 +1984,7 @@ pub const ModuleLoader = struct { if (err == error.PluginError) { return null; } + VirtualMachine.processFetchLog(globalObject, specifier_ptr.*, referrer.*, &log, ret, err); return null; }, diff --git a/src/bun.js/modules/NodeModuleModule.h b/src/bun.js/modules/NodeModuleModule.h index 6d8654024e..ddb273de46 100644 --- a/src/bun.js/modules/NodeModuleModule.h +++ b/src/bun.js/modules/NodeModuleModule.h @@ -304,6 +304,39 @@ JSC_DEFINE_CUSTOM_SETTER(set_resolveFilename, return false; } +// These two setters are only used if you directly hit +// `Module.prototype.require` or `module.require`. When accessing the cjs +// require argument, this is a bound version of `require`, which calls into the +// overridden one. +// +// This require function also intentionally does not have .resolve on it, nor +// does it have any of the other properties. +// +// Note: allowing require to be overridable at all is only needed for Next.js to +// work (they do Module.prototype.require = ...) + +JSC_DEFINE_CUSTOM_GETTER(getterRequireFunction, + (JSC::JSGlobalObject * globalObject, + JSC::EncodedJSValue thisValue, JSC::PropertyName)) { + return JSValue::encode(globalObject->getDirect( + globalObject->vm(), WebCore::clientData(globalObject->vm()) + ->builtinNames() + .overridableRequirePrivateName())); +} + +JSC_DEFINE_CUSTOM_SETTER(setterRequireFunction, + (JSC::JSGlobalObject * globalObject, + JSC::EncodedJSValue thisValue, + JSC::EncodedJSValue value, + JSC::PropertyName propertyName)) { + globalObject->putDirect(globalObject->vm(), + WebCore::clientData(globalObject->vm()) + ->builtinNames() + .overridableRequirePrivateName(), + JSValue::decode(value), 0); + return true; +} + namespace Zig { DEFINE_NATIVE_MODULE(NodeModule) { @@ -371,8 +404,15 @@ DEFINE_NATIVE_MODULE(NodeModule) { put(Identifier::fromString(vm, "globalPaths"_s), constructEmptyArray(globalObject, nullptr, 0)); - put(Identifier::fromString(vm, "prototype"_s), - constructEmptyObject(globalObject)); + auto prototype = + constructEmptyObject(globalObject, globalObject->objectPrototype(), 1); + prototype->putDirectCustomAccessor( + vm, JSC::Identifier::fromString(vm, "require"_s), + JSC::CustomGetterSetter::create(vm, getterRequireFunction, + setterRequireFunction), + 0); + + defaultObject->putDirect(vm, vm.propertyNames->prototype, prototype); JSC::JSArray *builtinModules = JSC::JSArray::create( vm, diff --git a/src/bundler.zig b/src/bundler.zig index cf0e0a4f89..479843bcd9 100644 --- a/src/bundler.zig +++ b/src/bundler.zig @@ -1106,6 +1106,7 @@ pub const Bundler = struct { .minify_syntax = bundler.options.minify_syntax, .minify_identifiers = bundler.options.minify_identifiers, .transform_only = bundler.options.transform_only, + .import_meta_ref = ast.import_meta_ref, }, enable_source_map, ), @@ -1129,6 +1130,7 @@ pub const Bundler = struct { .transform_only = bundler.options.transform_only, .module_type = if (ast.exports_kind == .cjs) .cjs else .esm, .inline_require_and_import_errors = false, + .import_meta_ref = ast.import_meta_ref, }, enable_source_map, ), diff --git a/src/js/_codegen/builtin-parser.ts b/src/js/_codegen/builtin-parser.ts index ffd5671c10..4e35f13ddc 100644 --- a/src/js/_codegen/builtin-parser.ts +++ b/src/js/_codegen/builtin-parser.ts @@ -79,12 +79,14 @@ export function sliceSourceCode( i = 1; } else if (endOnComma && contents.startsWith(",")) { if (bracketCount <= 1) { - result += ","; contents = contents.slice(1); - // if the next non-whitespace character is ), also consume + // if the next non-whitespace character is ), we will treat it like a ) let match = contents.match(/^\s*\)/); if (match) { contents = contents.slice(match[0].length); + result += ")"; + } else { + result += ","; } break; } diff --git a/src/js/_codegen/client-js.ts b/src/js/_codegen/client-js.ts index 2db3305fae..bd9ed63f44 100644 --- a/src/js/_codegen/client-js.ts +++ b/src/js/_codegen/client-js.ts @@ -27,10 +27,18 @@ export function createAssertClientJS(publicName: string) { return ` let $assert = function(check, sourceString, ...message) { if (!check) { - console.error('[${publicName}] ASSERTION FAILED: ' + sourceString); - if(message.length)console.warn (' ${" ".repeat(publicName.length)}', ...message); + const prevPrepareStackTrace = Error.prepareStackTrace; + Error.prepareStackTrace = (e, stack) => { + return e.name + ': ' + e.message + '\\n' + stack.slice(1).map(x => ' at ' + x.toString()).join('\\n'); + }; const e = new Error(sourceString); + e.stack; // materialize stack e.name = 'AssertionError'; + Error.prepareStackTrace = prevPrepareStackTrace; + console.error('[${publicName}] ASSERTION FAILED: ' + sourceString); + if (message.length) console.warn(...message); + console.warn(e.stack.split('\\n')[1] + '\\n'); + if (Bun.env.ASSERT === 'CRASH') process.exit(0xAA); throw e; } } diff --git a/src/js/_codegen/replacements.ts b/src/js/_codegen/replacements.ts index 5ce646ad50..45f2426b59 100644 --- a/src/js/_codegen/replacements.ts +++ b/src/js/_codegen/replacements.ts @@ -141,14 +141,27 @@ export function applyReplacements(src: string, length: number) { ]; } else if (name === "assert") { const checkSlice = sliceSourceCode(rest, true, undefined, true); + let rest2 = checkSlice.rest; + let extraArgs = ""; + if (checkSlice.result.at(-1) === ",") { + const sliced = sliceSourceCode("(" + rest2.slice(1), true, undefined, false); + extraArgs = ", " + sliced.result.slice(1, -1); + rest2 = sliced.rest; + } return [ slice.slice(0, match.index) + "(IS_BUN_DEVELOPMENT?$assert(" + checkSlice.result.slice(1, -1) + "," + - JSON.stringify(checkSlice.result.slice(1, -1).replace(/__intrinsic__/g, "$")) + + JSON.stringify( + checkSlice.result + .slice(1, -1) + .replace(/__intrinsic__/g, "$") + .trim(), + ) + + extraArgs + "):void 0)", - checkSlice.rest, + rest2, true, ]; } diff --git a/src/js/builtins.d.ts b/src/js/builtins.d.ts index cdda3ffe1a..ee7bd68cf8 100644 --- a/src/js/builtins.d.ts +++ b/src/js/builtins.d.ts @@ -12,7 +12,9 @@ declare function $debug(...args: any[]): void; /** $assert is a preprocessor macro that only runs in debug mode. it throws an error if the first argument is falsy. * The source code passed to `check` is inlined in the message, but in addition you can pass additional messages. */ -declare function $assert(check: any, ...message: any[]): void; +declare function $assert(check: any, ...message: any[]): asserts check; + +declare const IS_BUN_DEVELOPMENT: boolean; /** Place this directly above a function declaration (like a decorator) to make it a getter. */ declare const $getter: never; @@ -439,6 +441,8 @@ declare function $createCommonJSModule( parent: CommonJSModuleRecord, ): CommonJSModuleRecord; +declare function $overridableRequire(this: CommonJSModuleRecord, id: string): any; + // The following I cannot find any definitions of, but they are functional. declare function $toLength(length: number): number; declare function $isTypedArrayView(obj: unknown): obj is ArrayBufferView | DataView | Uint8Array; diff --git a/src/js/builtins/BunBuiltinNames.h b/src/js/builtins/BunBuiltinNames.h index caaba17384..d124a76833 100644 --- a/src/js/builtins/BunBuiltinNames.h +++ b/src/js/builtins/BunBuiltinNames.h @@ -69,6 +69,7 @@ using namespace JSC; macro(createCommonJSModule) \ macro(createEmptyReadableStream) \ macro(createFIFO) \ + macro(createInternalModuleById) \ macro(createNativeReadableStream) \ macro(createReadableStream) \ macro(createUninitializedArrayBuffer) \ @@ -119,6 +120,7 @@ using namespace JSC; macro(inFlightCloseRequest) \ macro(inFlightWriteRequest) \ macro(initializeWith) \ + macro(internalModuleRegistry) \ macro(internalRequire) \ macro(internalStream) \ macro(internalWritable) \ @@ -145,6 +147,7 @@ using namespace JSC; macro(once) \ macro(options) \ macro(origin) \ + macro(overridableRequire) \ macro(ownerReadableStream) \ macro(parse) \ macro(password) \ @@ -185,6 +188,7 @@ using namespace JSC; macro(require) \ macro(requireESM) \ macro(requireMap) \ + macro(requireNativeModule) \ macro(resolve) \ macro(resolveSync) \ macro(resume) \ @@ -238,9 +242,6 @@ using namespace JSC; macro(writer) \ macro(writing) \ macro(written) \ - macro(createInternalModuleById) \ - macro(internalModuleRegistry) \ - macro(requireNativeModule) \ class BunBuiltinNames { public: diff --git a/src/js/builtins/Module.ts b/src/js/builtins/Module.ts index 3d88f24841..b074d34886 100644 --- a/src/js/builtins/Module.ts +++ b/src/js/builtins/Module.ts @@ -4,6 +4,11 @@ export function main() { } export function require(this: CommonJSModuleRecord, id: string) { + return $overridableRequire.$call(this, id); +} + +// overridableRequire can be overridden by setting `Module.prototype.require` +export function overridableRequire(this: CommonJSModuleRecord, id: string) { const existing = $requireMap.$get(id) || $requireMap.$get((id = $resolveSync(id, this.path, false))); if (existing) { // Scenario where this is necessary: diff --git a/src/js/builtins/ProcessObjectInternals.ts b/src/js/builtins/ProcessObjectInternals.ts index ef8f1f9ced..aa7c9b7832 100644 --- a/src/js/builtins/ProcessObjectInternals.ts +++ b/src/js/builtins/ProcessObjectInternals.ts @@ -89,7 +89,8 @@ export function getStdinStream(fd) { const tty = require("node:tty"); - const stream = new tty.ReadStream(fd); + const ReadStream = tty.isatty(fd) ? tty.ReadStream : require("node:fs").ReadStream; + const stream = new ReadStream(fd); const originalOn = stream.on; stream.on = function (event, listener) { diff --git a/src/js/node/async_hooks.ts b/src/js/node/async_hooks.ts index ef77b79f79..83b3139126 100644 --- a/src/js/node/async_hooks.ts +++ b/src/js/node/async_hooks.ts @@ -19,17 +19,53 @@ // use. But the nature of this approach makes the implementation *itself* very low-impact on performance. // // AsyncContextData is an immutable array managed in here, formatted [key, value, key, value] where -// each key is an AsyncLocalStorage object and the value is the associated value. +// each key is an AsyncLocalStorage object and the value is the associated value. There are a ton of +// calls to $assert which will verify this invariant (only during bun-debug) // const { cleanupLater, setAsyncHooksEnabled } = $lazy("async_hooks"); +// Only run during debug +function assertValidAsyncContextArray(array: unknown): array is ReadonlyArray | undefined { + // undefined is OK + if (array === undefined) return true; + // Otherwise, it must be an array + $assert( + Array.isArray(array), + "AsyncContextData must be an array or undefined, got", + Bun.inspect(array, { depth: 1 }), + ); + // the array has to be even + $assert(array.length % 2 === 0, "AsyncContextData should be even-length, got", Bun.inspect(array, { depth: 1 })); + // if it is zero-length, use undefined instead + $assert(array.length > 0, "AsyncContextData should be undefined if empty, got", Bun.inspect(array, { depth: 1 })); + for (var i = 0; i < array.length; i += 2) { + $assert( + array[i] instanceof AsyncLocalStorage, + `Odd indexes in AsyncContextData should be an array of AsyncLocalStorage\nIndex %s was %s`, + i, + array[i], + ); + } + return true; +} + +// Only run during debug +function debugFormatContextValue(value: ReadonlyArray | undefined) { + if (value === undefined) return "{}"; + let str = "{\n"; + for (var i = 0; i < value.length; i += 2) { + str += ` ${value[i].__id__}: ${Bun.inspect(value[i + 1], { depth: 1, colors: Bun.enableANSIColors })}\n`; + } +} + function get(): ReadonlyArray | undefined { - $debug("get", $getInternalField($asyncContext, 0)); + $debug("get", debugFormatContextValue($getInternalField($asyncContext, 0))); return $getInternalField($asyncContext, 0); } function set(contextValue: ReadonlyArray | undefined) { - $debug("set", contextValue); + $assert(assertValidAsyncContextArray(contextValue)); + $debug("set", debugFormatContextValue(contextValue)); return $putInternalField($asyncContext, 0, contextValue); } @@ -38,6 +74,14 @@ class AsyncLocalStorage { constructor() { setAsyncHooksEnabled(true); + + // In debug mode assign every AsyncLocalStorage a unique ID + if (IS_BUN_DEVELOPMENT) { + (this as any).__id__ = + Math.random().toString(36).slice(2, 8) + + "@" + + require("node:path").basename(require("bun:jsc").callerSourceOrigin()); + } } static bind(fn, ...args: any) { @@ -67,8 +111,11 @@ class AsyncLocalStorage { return; } var { length } = context; + $assert(length > 0); + $assert(length % 2 === 0); for (var i = 0; i < length; i += 2) { if (context[i] === this) { + $assert(length > i + 1); const clone = context.slice(); clone[i + 1] = store; set(clone); @@ -76,33 +123,42 @@ class AsyncLocalStorage { } } set(context.concat(this, store)); + $assert(this.getStore() === store); } exit(cb, ...args) { return this.run(undefined, cb, ...args); } - run(store, callback, ...args) { + // This function is literred with $asserts to ensure that everything that + // is assumed to be true is *actually* true. + run(store_value, callback, ...args) { var context = get() as any[]; // we make sure to .slice() before mutating var hasPrevious = false; - var previous; + var previous_value; var i = 0; - var contextWasInit = !context; - if (contextWasInit) { - set((context = [this, store])); + var contextWasAlreadyInit = !context; + if (contextWasAlreadyInit) { + set((context = [this, store_value])); } else { // it's safe to mutate context now that it was cloned context = context!.slice(); i = context.indexOf(this); if (i > -1) { + $assert(i % 2 === 0); hasPrevious = true; - previous = context[i + 1]; - context[i + 1] = store; + previous_value = context[i + 1]; + context[i + 1] = store_value; } else { - context.push(this, store); + i = context.length; + context.push(this, store_value); + $assert(i % 2 === 0); + $assert(context.length % 2 === 0); } set(context); } + $assert(i > -1, "i was not set"); + $assert(this.getStore() === store_value, "run: store_value was not set"); try { return callback(...args); } catch (e) { @@ -111,24 +167,36 @@ class AsyncLocalStorage { // Note: early `return` will prevent `throw` above from working. I think... // Set AsyncContextFrame to undefined if we are out of context values if (!this.#disableCalled) { - var context2 = get()! as any[]; - if (context2 === context && contextWasInit) { + var context2 = get()! as any[]; // we make sure to .slice() before mutating + if (context2 === context && contextWasAlreadyInit) { + $assert(context2.length === 2, "context was mutated without copy"); set(undefined); } else { context2 = context2.slice(); // array is cloned here + $assert(context2[i] === this); if (hasPrevious) { - context2[i + 1] = previous; + context2[i + 1] = previous_value; set(context2); } else { + // i wonder if this is a fair assert to make context2.splice(i, 2); + $assert(context2.length % 2 === 0); set(context2.length ? context2 : undefined); } } + $assert( + this.getStore() === previous_value, + "run: previous_value", + Bun.inspect(previous_value), + "was not restored, i see", + this.getStore(), + ); } } } disable() { + $debug("disable " + (this as any).__id__); // In this case, we actually do want to mutate the context state if (!this.#disableCalled) { var context = get() as any[]; @@ -156,11 +224,21 @@ class AsyncLocalStorage { } } +if (IS_BUN_DEVELOPMENT) { + AsyncLocalStorage.prototype[Bun.inspect.custom] = function (depth, options) { + if (depth < 0) return `AsyncLocalStorage { ${Bun.inspect((this as any).__id__, options)} }`; + return `AsyncLocalStorage { [${options.stylize("debug id", "special")}]: ${Bun.inspect( + (this as any).__id__, + options, + )} }`; + }; +} + class AsyncResource { type; #snapshot; - constructor(type, options) { + constructor(type, options?) { if (typeof type !== "string") { throw new TypeError('The "type" argument must be of type string. Received type ' + typeof type); } @@ -200,6 +278,15 @@ class AsyncResource { set(prev); } } + + bind(fn, thisArg) { + return this.runInAsyncScope.bind(this, fn, thisArg ?? this); + } + + static bind(fn, type, thisArg) { + type = type || fn.name; + return new AsyncResource(type || "bound-anonymous-fn").bind(fn, thisArg); + } } // The rest of async_hooks is not implemented and is stubbed with no-ops and warnings. diff --git a/src/js/node/tty.js b/src/js/node/tty.js index 2ffc2d7647..1c3fb2fac4 100644 --- a/src/js/node/tty.js +++ b/src/js/node/tty.js @@ -11,30 +11,34 @@ function ReadStream(fd) { const stream = require("node:fs").ReadStream.call(this, "", { fd, }); + Object.setPrototypeOf(stream, ReadStream.prototype); stream.isRaw = false; - stream.isTTY = isatty(stream.fd); + stream.isTTY = true; + + $assert(stream instanceof ReadStream); return stream; } Object.defineProperty(ReadStream, "prototype", { get() { - const Real = require("node:fs").ReadStream.prototype; + const Prototype = Object.create(require("node:fs").ReadStream.prototype); - Object.defineProperty(ReadStream, "prototype", { value: Real }); - ReadStream.prototype.setRawMode = function (flag) { + Prototype.setRawMode = function (flag) { const mode = flag ? 1 : 0; const err = ttySetMode(this.fd, mode); if (err) { - this.emit("error", new Error("setRawMode failed with errno:", err)); + this.emit("error", new Error("setRawMode failed with errno: " + err)); return this; } this.isRaw = flag; return this; }; - return Real; + Object.defineProperty(ReadStream, "prototype", { value: Prototype }); + + return Prototype; }, enumerable: true, configurable: true, diff --git a/src/js/out/InternalModuleRegistryConstants.h b/src/js/out/InternalModuleRegistryConstants.h index 3444339522..b4a181d601 100644 --- a/src/js/out/InternalModuleRegistryConstants.h +++ b/src/js/out/InternalModuleRegistryConstants.h @@ -46,7 +46,7 @@ static constexpr ASCIILiteral NodeAssertStrictCode = "(function (){\"use strict\ // // -static constexpr ASCIILiteral NodeAsyncHooksCode = "(function (){\"use strict\";// src/js/out/tmp/node/async_hooks.ts\nvar get = function() {\n return @getInternalField(@asyncContext, 0);\n}, set = function(contextValue) {\n return @putInternalField(@asyncContext, 0, contextValue);\n}, createWarning = function(message) {\n let warned = !1;\n var wrapped = function() {\n if (warned)\n return;\n if (new Error().stack.includes(\"zx/build/core.js\"))\n return;\n warned = !0, console.warn(\"[bun] Warning:\", message);\n };\n return wrapped;\n}, createHook = function(callbacks) {\n return {\n enable: createHookNotImpl,\n disable: createHookNotImpl\n };\n}, executionAsyncId = function() {\n return executionAsyncIdNotImpl(), 0;\n}, triggerAsyncId = function() {\n return 0;\n}, executionAsyncResource = function() {\n return executionAsyncResourceWarning(), process.stdin;\n}, $, { cleanupLater, setAsyncHooksEnabled } = @lazy(\"async_hooks\");\n\nclass AsyncLocalStorage {\n #disableCalled = !1;\n constructor() {\n setAsyncHooksEnabled(!0);\n }\n static bind(fn, ...args) {\n return this.snapshot().bind(null, fn, ...args);\n }\n static snapshot() {\n var context = get();\n return (fn, ...args) => {\n var prev = get();\n set(context);\n try {\n return fn(...args);\n } catch (error) {\n throw error;\n } finally {\n set(prev);\n }\n };\n }\n enterWith(store) {\n cleanupLater();\n var context = get();\n if (!context) {\n set([this, store]);\n return;\n }\n var { length } = context;\n for (var i = 0;i < length; i += 2)\n if (context[i] === this) {\n const clone = context.slice();\n clone[i + 1] = store, set(clone);\n return;\n }\n set(context.concat(this, store));\n }\n exit(cb, ...args) {\n return this.run(@undefined, cb, ...args);\n }\n run(store, callback, ...args) {\n var context = get(), hasPrevious = !1, previous, i = 0, contextWasInit = !context;\n if (contextWasInit)\n set(context = [this, store]);\n else {\n if (context = context.slice(), i = context.indexOf(this), i > -1)\n hasPrevious = !0, previous = context[i + 1], context[i + 1] = store;\n else\n context.push(this, store);\n set(context);\n }\n try {\n return callback(...args);\n } catch (e) {\n throw e;\n } finally {\n if (!this.#disableCalled) {\n var context2 = get();\n if (context2 === context && contextWasInit)\n set(@undefined);\n else if (context2 = context2.slice(), hasPrevious)\n context2[i + 1] = previous, set(context2);\n else\n context2.splice(i, 2), set(context2.length \? context2 : @undefined);\n }\n }\n }\n disable() {\n if (!this.#disableCalled) {\n var context = get();\n if (context) {\n var { length } = context;\n for (var i = 0;i < length; i += 2)\n if (context[i] === this) {\n context.splice(i, 2), set(context.length \? context : @undefined);\n break;\n }\n }\n this.#disableCalled = !0;\n }\n }\n getStore() {\n var context = get();\n if (!context)\n return;\n var { length } = context;\n for (var i = 0;i < length; i += 2)\n if (context[i] === this)\n return context[i + 1];\n }\n}\n\nclass AsyncResource {\n type;\n #snapshot;\n constructor(type, options) {\n if (typeof type !== \"string\")\n @throwTypeError('The \"type\" argument must be of type string. Received type ' + typeof type);\n setAsyncHooksEnabled(!0), this.type = type, this.#snapshot = get();\n }\n emitBefore() {\n return !0;\n }\n emitAfter() {\n return !0;\n }\n asyncId() {\n return 0;\n }\n triggerAsyncId() {\n return 0;\n }\n emitDestroy() {\n }\n runInAsyncScope(fn, thisArg, ...args) {\n var prev = get();\n set(this.#snapshot);\n try {\n return fn.apply(thisArg, args);\n } catch (error) {\n throw error;\n } finally {\n set(prev);\n }\n }\n}\nvar createHookNotImpl = createWarning(\"async_hooks.createHook is not implemented in Bun. Hooks can still be created but will never be called.\"), executionAsyncIdNotImpl = createWarning(\"async_hooks.executionAsyncId/triggerAsyncId are not implemented in Bun. It will return 0 every time.\"), executionAsyncResourceWarning = createWarning(\"async_hooks.executionAsyncResource is not implemented in Bun. It returns a reference to process.stdin every time.\"), asyncWrapProviders = {\n NONE: 0,\n DIRHANDLE: 1,\n DNSCHANNEL: 2,\n ELDHISTOGRAM: 3,\n FILEHANDLE: 4,\n FILEHANDLECLOSEREQ: 5,\n FIXEDSIZEBLOBCOPY: 6,\n FSEVENTWRAP: 7,\n FSREQCALLBACK: 8,\n FSREQPROMISE: 9,\n GETADDRINFOREQWRAP: 10,\n GETNAMEINFOREQWRAP: 11,\n HEAPSNAPSHOT: 12,\n HTTP2SESSION: 13,\n HTTP2STREAM: 14,\n HTTP2PING: 15,\n HTTP2SETTINGS: 16,\n HTTPINCOMINGMESSAGE: 17,\n HTTPCLIENTREQUEST: 18,\n JSSTREAM: 19,\n JSUDPWRAP: 20,\n MESSAGEPORT: 21,\n PIPECONNECTWRAP: 22,\n PIPESERVERWRAP: 23,\n PIPEWRAP: 24,\n PROCESSWRAP: 25,\n PROMISE: 26,\n QUERYWRAP: 27,\n SHUTDOWNWRAP: 28,\n SIGNALWRAP: 29,\n STATWATCHER: 30,\n STREAMPIPE: 31,\n TCPCONNECTWRAP: 32,\n TCPSERVERWRAP: 33,\n TCPWRAP: 34,\n TTYWRAP: 35,\n UDPSENDWRAP: 36,\n UDPWRAP: 37,\n SIGINTWATCHDOG: 38,\n WORKER: 39,\n WORKERHEAPSNAPSHOT: 40,\n WRITEWRAP: 41,\n ZLIB: 42,\n CHECKPRIMEREQUEST: 43,\n PBKDF2REQUEST: 44,\n KEYPAIRGENREQUEST: 45,\n KEYGENREQUEST: 46,\n KEYEXPORTREQUEST: 47,\n CIPHERREQUEST: 48,\n DERIVEBITSREQUEST: 49,\n HASHREQUEST: 50,\n RANDOMBYTESREQUEST: 51,\n RANDOMPRIMEREQUEST: 52,\n SCRYPTREQUEST: 53,\n SIGNREQUEST: 54,\n TLSWRAP: 55,\n VERIFYREQUEST: 56,\n INSPECTORJSBINDING: 57\n};\n$ = {\n AsyncLocalStorage,\n createHook,\n executionAsyncId,\n triggerAsyncId,\n executionAsyncResource,\n asyncWrapProviders,\n AsyncResource\n};\nreturn $})\n"_s; +static constexpr ASCIILiteral NodeAsyncHooksCode = "(function (){\"use strict\";// src/js/out/tmp/node/async_hooks.ts\nvar get = function() {\n return @getInternalField(@asyncContext, 0);\n}, set = function(contextValue) {\n return @putInternalField(@asyncContext, 0, contextValue);\n}, createWarning = function(message) {\n let warned = !1;\n var wrapped = function() {\n if (warned)\n return;\n if (new Error().stack.includes(\"zx/build/core.js\"))\n return;\n warned = !0, console.warn(\"[bun] Warning:\", message);\n };\n return wrapped;\n}, createHook = function(callbacks) {\n return {\n enable: createHookNotImpl,\n disable: createHookNotImpl\n };\n}, executionAsyncId = function() {\n return executionAsyncIdNotImpl(), 0;\n}, triggerAsyncId = function() {\n return 0;\n}, executionAsyncResource = function() {\n return executionAsyncResourceWarning(), process.stdin;\n}, $, { cleanupLater, setAsyncHooksEnabled } = @lazy(\"async_hooks\");\n\nclass AsyncLocalStorage {\n #disableCalled = !1;\n constructor() {\n setAsyncHooksEnabled(!0);\n }\n static bind(fn, ...args) {\n return this.snapshot().bind(null, fn, ...args);\n }\n static snapshot() {\n var context = get();\n return (fn, ...args) => {\n var prev = get();\n set(context);\n try {\n return fn(...args);\n } catch (error) {\n throw error;\n } finally {\n set(prev);\n }\n };\n }\n enterWith(store) {\n cleanupLater();\n var context = get();\n if (!context) {\n set([this, store]);\n return;\n }\n var { length } = context;\n for (var i = 0;i < length; i += 2)\n if (context[i] === this) {\n const clone = context.slice();\n clone[i + 1] = store, set(clone);\n return;\n }\n set(context.concat(this, store));\n }\n exit(cb, ...args) {\n return this.run(@undefined, cb, ...args);\n }\n run(store_value, callback, ...args) {\n var context = get(), hasPrevious = !1, previous_value, i = 0, contextWasAlreadyInit = !context;\n if (contextWasAlreadyInit)\n set(context = [this, store_value]);\n else {\n if (context = context.slice(), i = context.indexOf(this), i > -1)\n hasPrevious = !0, previous_value = context[i + 1], context[i + 1] = store_value;\n else\n i = context.length, context.push(this, store_value);\n set(context);\n }\n try {\n return callback(...args);\n } catch (e) {\n throw e;\n } finally {\n if (!this.#disableCalled) {\n var context2 = get();\n if (context2 === context && contextWasAlreadyInit)\n set(@undefined);\n else if (context2 = context2.slice(), hasPrevious)\n context2[i + 1] = previous_value, set(context2);\n else\n context2.splice(i, 2), set(context2.length \? context2 : @undefined);\n }\n }\n }\n disable() {\n if (!this.#disableCalled) {\n var context = get();\n if (context) {\n var { length } = context;\n for (var i = 0;i < length; i += 2)\n if (context[i] === this) {\n context.splice(i, 2), set(context.length \? context : @undefined);\n break;\n }\n }\n this.#disableCalled = !0;\n }\n }\n getStore() {\n var context = get();\n if (!context)\n return;\n var { length } = context;\n for (var i = 0;i < length; i += 2)\n if (context[i] === this)\n return context[i + 1];\n }\n}\n\nclass AsyncResource {\n type;\n #snapshot;\n constructor(type, options) {\n if (typeof type !== \"string\")\n @throwTypeError('The \"type\" argument must be of type string. Received type ' + typeof type);\n setAsyncHooksEnabled(!0), this.type = type, this.#snapshot = get();\n }\n emitBefore() {\n return !0;\n }\n emitAfter() {\n return !0;\n }\n asyncId() {\n return 0;\n }\n triggerAsyncId() {\n return 0;\n }\n emitDestroy() {\n }\n runInAsyncScope(fn, thisArg, ...args) {\n var prev = get();\n set(this.#snapshot);\n try {\n return fn.apply(thisArg, args);\n } catch (error) {\n throw error;\n } finally {\n set(prev);\n }\n }\n bind(fn, thisArg) {\n return this.runInAsyncScope.bind(this, fn, thisArg \?\? this);\n }\n static bind(fn, type, thisArg) {\n return type = type || fn.name, new AsyncResource(type || \"bound-anonymous-fn\").bind(fn, thisArg);\n }\n}\nvar createHookNotImpl = createWarning(\"async_hooks.createHook is not implemented in Bun. Hooks can still be created but will never be called.\"), executionAsyncIdNotImpl = createWarning(\"async_hooks.executionAsyncId/triggerAsyncId are not implemented in Bun. It will return 0 every time.\"), executionAsyncResourceWarning = createWarning(\"async_hooks.executionAsyncResource is not implemented in Bun. It returns a reference to process.stdin every time.\"), asyncWrapProviders = {\n NONE: 0,\n DIRHANDLE: 1,\n DNSCHANNEL: 2,\n ELDHISTOGRAM: 3,\n FILEHANDLE: 4,\n FILEHANDLECLOSEREQ: 5,\n FIXEDSIZEBLOBCOPY: 6,\n FSEVENTWRAP: 7,\n FSREQCALLBACK: 8,\n FSREQPROMISE: 9,\n GETADDRINFOREQWRAP: 10,\n GETNAMEINFOREQWRAP: 11,\n HEAPSNAPSHOT: 12,\n HTTP2SESSION: 13,\n HTTP2STREAM: 14,\n HTTP2PING: 15,\n HTTP2SETTINGS: 16,\n HTTPINCOMINGMESSAGE: 17,\n HTTPCLIENTREQUEST: 18,\n JSSTREAM: 19,\n JSUDPWRAP: 20,\n MESSAGEPORT: 21,\n PIPECONNECTWRAP: 22,\n PIPESERVERWRAP: 23,\n PIPEWRAP: 24,\n PROCESSWRAP: 25,\n PROMISE: 26,\n QUERYWRAP: 27,\n SHUTDOWNWRAP: 28,\n SIGNALWRAP: 29,\n STATWATCHER: 30,\n STREAMPIPE: 31,\n TCPCONNECTWRAP: 32,\n TCPSERVERWRAP: 33,\n TCPWRAP: 34,\n TTYWRAP: 35,\n UDPSENDWRAP: 36,\n UDPWRAP: 37,\n SIGINTWATCHDOG: 38,\n WORKER: 39,\n WORKERHEAPSNAPSHOT: 40,\n WRITEWRAP: 41,\n ZLIB: 42,\n CHECKPRIMEREQUEST: 43,\n PBKDF2REQUEST: 44,\n KEYPAIRGENREQUEST: 45,\n KEYGENREQUEST: 46,\n KEYEXPORTREQUEST: 47,\n CIPHERREQUEST: 48,\n DERIVEBITSREQUEST: 49,\n HASHREQUEST: 50,\n RANDOMBYTESREQUEST: 51,\n RANDOMPRIMEREQUEST: 52,\n SCRYPTREQUEST: 53,\n SIGNREQUEST: 54,\n TLSWRAP: 55,\n VERIFYREQUEST: 56,\n INSPECTORJSBINDING: 57\n};\n$ = {\n AsyncLocalStorage,\n createHook,\n executionAsyncId,\n triggerAsyncId,\n executionAsyncResource,\n asyncWrapProviders,\n AsyncResource\n};\nreturn $})\n"_s; // // @@ -190,7 +190,7 @@ static constexpr ASCIILiteral NodeTraceEventsCode = "(function (){\"use strict\" // // -static constexpr ASCIILiteral NodeTtyCode = "(function (){\"use strict\";// src/js/out/tmp/node/tty.ts\nvar ReadStream = function(fd) {\n if (!(this instanceof ReadStream))\n return new ReadStream(fd);\n if (fd >> 0 !== fd || fd < 0)\n @throwRangeError(\"fd must be a positive integer\");\n const stream = (@getInternalField(@internalModuleRegistry, 21) || @createInternalModuleById(21)).ReadStream.call(this, \"\", {\n fd\n });\n return stream.isRaw = !1, stream.isTTY = isatty(stream.fd), stream;\n}, warnOnDeactivatedColors = function(env) {\n if (warned)\n return;\n let name = \"\";\n if (env.NODE_DISABLE_COLORS !== @undefined)\n name = \"NODE_DISABLE_COLORS\";\n if (env.NO_COLOR !== @undefined) {\n if (name !== \"\")\n name += \"' and '\";\n name += \"NO_COLOR\";\n }\n if (name !== \"\")\n process.emitWarning(`The '${name}' env is ignored due to the 'FORCE_COLOR' env being set.`, \"Warning\"), warned = !0;\n}, WriteStream = function(fd) {\n if (!(this instanceof WriteStream))\n return new WriteStream(fd);\n if (fd >> 0 !== fd || fd < 0)\n @throwRangeError(\"fd must be a positive integer\");\n const stream = (@getInternalField(@internalModuleRegistry, 21) || @createInternalModuleById(21)).WriteStream.call(this, \"\", {\n fd\n });\n if (stream.columns = @undefined, stream.rows = @undefined, stream.isTTY = isatty(stream.fd), stream.isTTY) {\n const windowSizeArray = [0, 0];\n if (_getWindowSize(fd, windowSizeArray) === !0)\n stream.columns = windowSizeArray[0], stream.rows = windowSizeArray[1];\n }\n return stream;\n}, { ttySetMode, isatty, getWindowSize: _getWindowSize } = @lazy(\"tty\"), StringPrototypeSplit = Function.prototype.call.bind(@String.prototype.split), RegExpPrototypeExec = Function.prototype.call.bind(@RegExp.prototype.exec), StringPrototypeToLowerCase = Function.prototype.call.bind(@String.prototype.toLowerCase), ArrayPrototypeSome = Function.prototype.call.bind(@Array.prototype.some), NumberIsInteger = Number.isInteger;\nObject.defineProperty(ReadStream, \"prototype\", {\n get() {\n const Real = (@getInternalField(@internalModuleRegistry, 21) || @createInternalModuleById(21)).ReadStream.prototype;\n return Object.defineProperty(ReadStream, \"prototype\", { value: Real }), ReadStream.prototype.setRawMode = function(flag) {\n const mode = flag \? 1 : 0, err = ttySetMode(this.fd, mode);\n if (err)\n return this.emit(\"error\", new Error(\"setRawMode failed with errno:\", err)), this;\n return this.isRaw = flag, this;\n }, Real;\n },\n enumerable: !0,\n configurable: !0\n});\nvar COLORS_2 = 1, COLORS_16 = 4, COLORS_256 = 8, COLORS_16m = 24, TERM_ENVS = {\n eterm: COLORS_16,\n cons25: COLORS_16,\n console: COLORS_16,\n cygwin: COLORS_16,\n dtterm: COLORS_16,\n gnome: COLORS_16,\n hurd: COLORS_16,\n jfbterm: COLORS_16,\n konsole: COLORS_16,\n kterm: COLORS_16,\n mlterm: COLORS_16,\n mosh: COLORS_16m,\n putty: COLORS_16,\n st: COLORS_16,\n \"rxvt-unicode-24bit\": COLORS_16m,\n terminator: COLORS_16m\n}, TERM_ENVS_REG_EXP = [/ansi/, /color/, /linux/, /^con[0-9]*x[0-9]/, /^rxvt/, /^screen/, /^xterm/, /^vt100/], warned = !1;\nObject.defineProperty(WriteStream, \"prototype\", {\n get() {\n const Real = (@getInternalField(@internalModuleRegistry, 21) || @createInternalModuleById(21)).WriteStream.prototype;\n Object.defineProperty(WriteStream, \"prototype\", { value: Real }), WriteStream.prototype._refreshSize = function() {\n const oldCols = this.columns, oldRows = this.rows, windowSizeArray = [0, 0];\n if (_getWindowSize(this.fd, windowSizeArray) === !0) {\n if (oldCols !== windowSizeArray[0] || oldRows !== windowSizeArray[1])\n this.columns = windowSizeArray[0], this.rows = windowSizeArray[1], this.emit(\"resize\");\n }\n };\n var readline = @undefined;\n return WriteStream.prototype.clearLine = function(dir, cb) {\n return (readline \?\?= @getInternalField(@internalModuleRegistry, 35) || @createInternalModuleById(35)).clearLine(this, dir, cb);\n }, WriteStream.prototype.clearScreenDown = function(cb) {\n return (readline \?\?= @getInternalField(@internalModuleRegistry, 35) || @createInternalModuleById(35)).clearScreenDown(this, cb);\n }, WriteStream.prototype.cursorTo = function(x, y, cb) {\n return (readline \?\?= @getInternalField(@internalModuleRegistry, 35) || @createInternalModuleById(35)).cursorTo(this, x, y, cb);\n }, WriteStream.prototype.getColorDepth = function(env = process.env) {\n if (env.FORCE_COLOR !== @undefined)\n switch (env.FORCE_COLOR) {\n case \"\":\n case \"1\":\n case \"true\":\n return warnOnDeactivatedColors(env), COLORS_16;\n case \"2\":\n return warnOnDeactivatedColors(env), COLORS_256;\n case \"3\":\n return warnOnDeactivatedColors(env), COLORS_16m;\n default:\n return COLORS_2;\n }\n if (env.NODE_DISABLE_COLORS !== @undefined || env.NO_COLOR !== @undefined || env.TERM === \"dumb\")\n return COLORS_2;\n if (env.TMUX)\n return COLORS_256;\n if (env.CI) {\n if ([\"APPVEYOR\", \"BUILDKITE\", \"CIRCLECI\", \"DRONE\", \"GITHUB_ACTIONS\", \"GITLAB_CI\", \"TRAVIS\"].some((sign) => (sign in env)) || env.CI_NAME === \"codeship\")\n return COLORS_256;\n return COLORS_2;\n }\n if (\"TEAMCITY_VERSION\" in env)\n return /^(9\\.(0*[1-9]\\d*)\\.|\\d{2,}\\.)/.test(env.TEAMCITY_VERSION) \? COLORS_16 : COLORS_2;\n switch (env.TERM_PROGRAM) {\n case \"iTerm.app\":\n if (!env.TERM_PROGRAM_VERSION || /^[0-2]\\./.test(env.TERM_PROGRAM_VERSION))\n return COLORS_256;\n return COLORS_16m;\n case \"HyperTerm\":\n case \"MacTerm\":\n return COLORS_16m;\n case \"Apple_Terminal\":\n return COLORS_256;\n }\n if (env.COLORTERM === \"truecolor\" || env.COLORTERM === \"24bit\")\n return COLORS_16m;\n if (env.TERM) {\n if (/^xterm-256/.test(env.TERM) !== null)\n return COLORS_256;\n const termEnv = env.TERM.toLowerCase();\n if (TERM_ENVS[termEnv])\n return TERM_ENVS[termEnv];\n if (TERM_ENVS_REG_EXP.some((term) => term.test(termEnv)))\n return COLORS_16;\n }\n if (env.COLORTERM)\n return COLORS_16;\n return COLORS_2;\n }, WriteStream.prototype.getWindowSize = function() {\n return [this.columns, this.rows];\n }, WriteStream.prototype.hasColors = function(count, env) {\n if (env === @undefined && (count === @undefined || typeof count === \"object\" && count !== null))\n env = count, count = 16;\n else\n validateInteger(count, \"count\", 2);\n return count <= 2 ** this.getColorDepth(env);\n }, WriteStream.prototype.moveCursor = function(dx, dy, cb) {\n return (readline \?\?= @getInternalField(@internalModuleRegistry, 35) || @createInternalModuleById(35)).moveCursor(this, dx, dy, cb);\n }, Real;\n },\n enumerable: !0,\n configurable: !0\n});\nvar validateInteger = (value, name, min = Number.MIN_SAFE_INTEGER, max = Number.MAX_SAFE_INTEGER) => {\n if (typeof value !== \"number\")\n throw new ERR_INVALID_ARG_TYPE(name, \"number\", value);\n if (!NumberIsInteger(value))\n throw new ERR_OUT_OF_RANGE(name, \"an integer\", value);\n if (value < min || value > max)\n throw new ERR_OUT_OF_RANGE(name, `>= ${min} && <= ${max}`, value);\n};\nreturn { ReadStream, WriteStream, isatty }})\n"_s; +static constexpr ASCIILiteral NodeTtyCode = "(function (){\"use strict\";// src/js/out/tmp/node/tty.ts\nvar ReadStream = function(fd) {\n if (!(this instanceof ReadStream))\n return new ReadStream(fd);\n if (fd >> 0 !== fd || fd < 0)\n @throwRangeError(\"fd must be a positive integer\");\n const stream = (@getInternalField(@internalModuleRegistry, 21) || @createInternalModuleById(21)).ReadStream.call(this, \"\", {\n fd\n });\n return Object.setPrototypeOf(stream, ReadStream.prototype), stream.isRaw = !1, stream.isTTY = !0, stream;\n}, warnOnDeactivatedColors = function(env) {\n if (warned)\n return;\n let name = \"\";\n if (env.NODE_DISABLE_COLORS !== @undefined)\n name = \"NODE_DISABLE_COLORS\";\n if (env.NO_COLOR !== @undefined) {\n if (name !== \"\")\n name += \"' and '\";\n name += \"NO_COLOR\";\n }\n if (name !== \"\")\n process.emitWarning(`The '${name}' env is ignored due to the 'FORCE_COLOR' env being set.`, \"Warning\"), warned = !0;\n}, WriteStream = function(fd) {\n if (!(this instanceof WriteStream))\n return new WriteStream(fd);\n if (fd >> 0 !== fd || fd < 0)\n @throwRangeError(\"fd must be a positive integer\");\n const stream = (@getInternalField(@internalModuleRegistry, 21) || @createInternalModuleById(21)).WriteStream.call(this, \"\", {\n fd\n });\n if (stream.columns = @undefined, stream.rows = @undefined, stream.isTTY = isatty(stream.fd), stream.isTTY) {\n const windowSizeArray = [0, 0];\n if (_getWindowSize(fd, windowSizeArray) === !0)\n stream.columns = windowSizeArray[0], stream.rows = windowSizeArray[1];\n }\n return stream;\n}, { ttySetMode, isatty, getWindowSize: _getWindowSize } = @lazy(\"tty\"), StringPrototypeSplit = Function.prototype.call.bind(@String.prototype.split), NumberIsInteger = Number.isInteger;\nObject.defineProperty(ReadStream, \"prototype\", {\n get() {\n const Prototype = Object.create((@getInternalField(@internalModuleRegistry, 21) || @createInternalModuleById(21)).ReadStream.prototype);\n return Prototype.setRawMode = function(flag) {\n const mode = flag \? 1 : 0, err = ttySetMode(this.fd, mode);\n if (err)\n return this.emit(\"error\", new Error(\"setRawMode failed with errno: \" + err)), this;\n return this.isRaw = flag, this;\n }, Object.defineProperty(ReadStream, \"prototype\", { value: Prototype }), Prototype;\n },\n enumerable: !0,\n configurable: !0\n});\nvar COLORS_2 = 1, COLORS_16 = 4, COLORS_256 = 8, COLORS_16m = 24, TERM_ENVS = {\n eterm: COLORS_16,\n cons25: COLORS_16,\n console: COLORS_16,\n cygwin: COLORS_16,\n dtterm: COLORS_16,\n gnome: COLORS_16,\n hurd: COLORS_16,\n jfbterm: COLORS_16,\n konsole: COLORS_16,\n kterm: COLORS_16,\n mlterm: COLORS_16,\n mosh: COLORS_16m,\n putty: COLORS_16,\n st: COLORS_16,\n \"rxvt-unicode-24bit\": COLORS_16m,\n terminator: COLORS_16m\n}, TERM_ENVS_REG_EXP = [/ansi/, /color/, /linux/, /^con[0-9]*x[0-9]/, /^rxvt/, /^screen/, /^xterm/, /^vt100/], warned = !1;\nObject.defineProperty(WriteStream, \"prototype\", {\n get() {\n const Real = (@getInternalField(@internalModuleRegistry, 21) || @createInternalModuleById(21)).WriteStream.prototype;\n Object.defineProperty(WriteStream, \"prototype\", { value: Real }), WriteStream.prototype._refreshSize = function() {\n const oldCols = this.columns, oldRows = this.rows, windowSizeArray = [0, 0];\n if (_getWindowSize(this.fd, windowSizeArray) === !0) {\n if (oldCols !== windowSizeArray[0] || oldRows !== windowSizeArray[1])\n this.columns = windowSizeArray[0], this.rows = windowSizeArray[1], this.emit(\"resize\");\n }\n };\n var readline = @undefined;\n return WriteStream.prototype.clearLine = function(dir, cb) {\n return (readline \?\?= @getInternalField(@internalModuleRegistry, 35) || @createInternalModuleById(35)).clearLine(this, dir, cb);\n }, WriteStream.prototype.clearScreenDown = function(cb) {\n return (readline \?\?= @getInternalField(@internalModuleRegistry, 35) || @createInternalModuleById(35)).clearScreenDown(this, cb);\n }, WriteStream.prototype.cursorTo = function(x, y, cb) {\n return (readline \?\?= @getInternalField(@internalModuleRegistry, 35) || @createInternalModuleById(35)).cursorTo(this, x, y, cb);\n }, WriteStream.prototype.getColorDepth = function(env = process.env) {\n if (env.FORCE_COLOR !== @undefined)\n switch (env.FORCE_COLOR) {\n case \"\":\n case \"1\":\n case \"true\":\n return warnOnDeactivatedColors(env), COLORS_16;\n case \"2\":\n return warnOnDeactivatedColors(env), COLORS_256;\n case \"3\":\n return warnOnDeactivatedColors(env), COLORS_16m;\n default:\n return COLORS_2;\n }\n if (env.NODE_DISABLE_COLORS !== @undefined || env.NO_COLOR !== @undefined || env.TERM === \"dumb\")\n return COLORS_2;\n if (env.TMUX)\n return COLORS_256;\n if (env.CI) {\n if ([\"APPVEYOR\", \"BUILDKITE\", \"CIRCLECI\", \"DRONE\", \"GITHUB_ACTIONS\", \"GITLAB_CI\", \"TRAVIS\"].some((sign) => (sign in env)) || env.CI_NAME === \"codeship\")\n return COLORS_256;\n return COLORS_2;\n }\n if (\"TEAMCITY_VERSION\" in env)\n return /^(9\\.(0*[1-9]\\d*)\\.|\\d{2,}\\.)/.test(env.TEAMCITY_VERSION) \? COLORS_16 : COLORS_2;\n switch (env.TERM_PROGRAM) {\n case \"iTerm.app\":\n if (!env.TERM_PROGRAM_VERSION || /^[0-2]\\./.test(env.TERM_PROGRAM_VERSION))\n return COLORS_256;\n return COLORS_16m;\n case \"HyperTerm\":\n case \"MacTerm\":\n return COLORS_16m;\n case \"Apple_Terminal\":\n return COLORS_256;\n }\n if (env.COLORTERM === \"truecolor\" || env.COLORTERM === \"24bit\")\n return COLORS_16m;\n if (env.TERM) {\n if (/^xterm-256/.test(env.TERM) !== null)\n return COLORS_256;\n const termEnv = env.TERM.toLowerCase();\n if (TERM_ENVS[termEnv])\n return TERM_ENVS[termEnv];\n if (TERM_ENVS_REG_EXP.some((term) => term.test(termEnv)))\n return COLORS_16;\n }\n if (env.COLORTERM)\n return COLORS_16;\n return COLORS_2;\n }, WriteStream.prototype.getWindowSize = function() {\n return [this.columns, this.rows];\n }, WriteStream.prototype.hasColors = function(count, env) {\n if (env === @undefined && (count === @undefined || typeof count === \"object\" && count !== null))\n env = count, count = 16;\n else\n validateInteger(count, \"count\", 2);\n return count <= 2 ** this.getColorDepth(env);\n }, WriteStream.prototype.moveCursor = function(dx, dy, cb) {\n return (readline \?\?= @getInternalField(@internalModuleRegistry, 35) || @createInternalModuleById(35)).moveCursor(this, dx, dy, cb);\n }, Real;\n },\n enumerable: !0,\n configurable: !0\n});\nvar validateInteger = (value, name, min = Number.MIN_SAFE_INTEGER, max = Number.MAX_SAFE_INTEGER) => {\n if (typeof value !== \"number\")\n throw new ERR_INVALID_ARG_TYPE(name, \"number\", value);\n if (!NumberIsInteger(value))\n throw new ERR_OUT_OF_RANGE(name, \"an integer\", value);\n if (value < min || value > max)\n throw new ERR_OUT_OF_RANGE(name, `>= ${min} && <= ${max}`, value);\n};\nreturn { ReadStream, WriteStream, isatty }})\n"_s; // // @@ -295,7 +295,7 @@ static constexpr ASCIILiteral NodeAssertStrictCode = "(function (){\"use strict\ // // -static constexpr ASCIILiteral NodeAsyncHooksCode = "(function (){\"use strict\";// src/js/out/tmp/node/async_hooks.ts\nvar get = function() {\n return @getInternalField(@asyncContext, 0);\n}, set = function(contextValue) {\n return @putInternalField(@asyncContext, 0, contextValue);\n}, createWarning = function(message) {\n let warned = !1;\n var wrapped = function() {\n if (warned)\n return;\n if (new Error().stack.includes(\"zx/build/core.js\"))\n return;\n warned = !0, console.warn(\"[bun] Warning:\", message);\n };\n return wrapped;\n}, createHook = function(callbacks) {\n return {\n enable: createHookNotImpl,\n disable: createHookNotImpl\n };\n}, executionAsyncId = function() {\n return executionAsyncIdNotImpl(), 0;\n}, triggerAsyncId = function() {\n return 0;\n}, executionAsyncResource = function() {\n return executionAsyncResourceWarning(), process.stdin;\n}, $, { cleanupLater, setAsyncHooksEnabled } = @lazy(\"async_hooks\");\n\nclass AsyncLocalStorage {\n #disableCalled = !1;\n constructor() {\n setAsyncHooksEnabled(!0);\n }\n static bind(fn, ...args) {\n return this.snapshot().bind(null, fn, ...args);\n }\n static snapshot() {\n var context = get();\n return (fn, ...args) => {\n var prev = get();\n set(context);\n try {\n return fn(...args);\n } catch (error) {\n throw error;\n } finally {\n set(prev);\n }\n };\n }\n enterWith(store) {\n cleanupLater();\n var context = get();\n if (!context) {\n set([this, store]);\n return;\n }\n var { length } = context;\n for (var i = 0;i < length; i += 2)\n if (context[i] === this) {\n const clone = context.slice();\n clone[i + 1] = store, set(clone);\n return;\n }\n set(context.concat(this, store));\n }\n exit(cb, ...args) {\n return this.run(@undefined, cb, ...args);\n }\n run(store, callback, ...args) {\n var context = get(), hasPrevious = !1, previous, i = 0, contextWasInit = !context;\n if (contextWasInit)\n set(context = [this, store]);\n else {\n if (context = context.slice(), i = context.indexOf(this), i > -1)\n hasPrevious = !0, previous = context[i + 1], context[i + 1] = store;\n else\n context.push(this, store);\n set(context);\n }\n try {\n return callback(...args);\n } catch (e) {\n throw e;\n } finally {\n if (!this.#disableCalled) {\n var context2 = get();\n if (context2 === context && contextWasInit)\n set(@undefined);\n else if (context2 = context2.slice(), hasPrevious)\n context2[i + 1] = previous, set(context2);\n else\n context2.splice(i, 2), set(context2.length \? context2 : @undefined);\n }\n }\n }\n disable() {\n if (!this.#disableCalled) {\n var context = get();\n if (context) {\n var { length } = context;\n for (var i = 0;i < length; i += 2)\n if (context[i] === this) {\n context.splice(i, 2), set(context.length \? context : @undefined);\n break;\n }\n }\n this.#disableCalled = !0;\n }\n }\n getStore() {\n var context = get();\n if (!context)\n return;\n var { length } = context;\n for (var i = 0;i < length; i += 2)\n if (context[i] === this)\n return context[i + 1];\n }\n}\n\nclass AsyncResource {\n type;\n #snapshot;\n constructor(type, options) {\n if (typeof type !== \"string\")\n @throwTypeError('The \"type\" argument must be of type string. Received type ' + typeof type);\n setAsyncHooksEnabled(!0), this.type = type, this.#snapshot = get();\n }\n emitBefore() {\n return !0;\n }\n emitAfter() {\n return !0;\n }\n asyncId() {\n return 0;\n }\n triggerAsyncId() {\n return 0;\n }\n emitDestroy() {\n }\n runInAsyncScope(fn, thisArg, ...args) {\n var prev = get();\n set(this.#snapshot);\n try {\n return fn.apply(thisArg, args);\n } catch (error) {\n throw error;\n } finally {\n set(prev);\n }\n }\n}\nvar createHookNotImpl = createWarning(\"async_hooks.createHook is not implemented in Bun. Hooks can still be created but will never be called.\"), executionAsyncIdNotImpl = createWarning(\"async_hooks.executionAsyncId/triggerAsyncId are not implemented in Bun. It will return 0 every time.\"), executionAsyncResourceWarning = createWarning(\"async_hooks.executionAsyncResource is not implemented in Bun. It returns a reference to process.stdin every time.\"), asyncWrapProviders = {\n NONE: 0,\n DIRHANDLE: 1,\n DNSCHANNEL: 2,\n ELDHISTOGRAM: 3,\n FILEHANDLE: 4,\n FILEHANDLECLOSEREQ: 5,\n FIXEDSIZEBLOBCOPY: 6,\n FSEVENTWRAP: 7,\n FSREQCALLBACK: 8,\n FSREQPROMISE: 9,\n GETADDRINFOREQWRAP: 10,\n GETNAMEINFOREQWRAP: 11,\n HEAPSNAPSHOT: 12,\n HTTP2SESSION: 13,\n HTTP2STREAM: 14,\n HTTP2PING: 15,\n HTTP2SETTINGS: 16,\n HTTPINCOMINGMESSAGE: 17,\n HTTPCLIENTREQUEST: 18,\n JSSTREAM: 19,\n JSUDPWRAP: 20,\n MESSAGEPORT: 21,\n PIPECONNECTWRAP: 22,\n PIPESERVERWRAP: 23,\n PIPEWRAP: 24,\n PROCESSWRAP: 25,\n PROMISE: 26,\n QUERYWRAP: 27,\n SHUTDOWNWRAP: 28,\n SIGNALWRAP: 29,\n STATWATCHER: 30,\n STREAMPIPE: 31,\n TCPCONNECTWRAP: 32,\n TCPSERVERWRAP: 33,\n TCPWRAP: 34,\n TTYWRAP: 35,\n UDPSENDWRAP: 36,\n UDPWRAP: 37,\n SIGINTWATCHDOG: 38,\n WORKER: 39,\n WORKERHEAPSNAPSHOT: 40,\n WRITEWRAP: 41,\n ZLIB: 42,\n CHECKPRIMEREQUEST: 43,\n PBKDF2REQUEST: 44,\n KEYPAIRGENREQUEST: 45,\n KEYGENREQUEST: 46,\n KEYEXPORTREQUEST: 47,\n CIPHERREQUEST: 48,\n DERIVEBITSREQUEST: 49,\n HASHREQUEST: 50,\n RANDOMBYTESREQUEST: 51,\n RANDOMPRIMEREQUEST: 52,\n SCRYPTREQUEST: 53,\n SIGNREQUEST: 54,\n TLSWRAP: 55,\n VERIFYREQUEST: 56,\n INSPECTORJSBINDING: 57\n};\n$ = {\n AsyncLocalStorage,\n createHook,\n executionAsyncId,\n triggerAsyncId,\n executionAsyncResource,\n asyncWrapProviders,\n AsyncResource\n};\nreturn $})\n"_s; +static constexpr ASCIILiteral NodeAsyncHooksCode = "(function (){\"use strict\";// src/js/out/tmp/node/async_hooks.ts\nvar get = function() {\n return @getInternalField(@asyncContext, 0);\n}, set = function(contextValue) {\n return @putInternalField(@asyncContext, 0, contextValue);\n}, createWarning = function(message) {\n let warned = !1;\n var wrapped = function() {\n if (warned)\n return;\n if (new Error().stack.includes(\"zx/build/core.js\"))\n return;\n warned = !0, console.warn(\"[bun] Warning:\", message);\n };\n return wrapped;\n}, createHook = function(callbacks) {\n return {\n enable: createHookNotImpl,\n disable: createHookNotImpl\n };\n}, executionAsyncId = function() {\n return executionAsyncIdNotImpl(), 0;\n}, triggerAsyncId = function() {\n return 0;\n}, executionAsyncResource = function() {\n return executionAsyncResourceWarning(), process.stdin;\n}, $, { cleanupLater, setAsyncHooksEnabled } = @lazy(\"async_hooks\");\n\nclass AsyncLocalStorage {\n #disableCalled = !1;\n constructor() {\n setAsyncHooksEnabled(!0);\n }\n static bind(fn, ...args) {\n return this.snapshot().bind(null, fn, ...args);\n }\n static snapshot() {\n var context = get();\n return (fn, ...args) => {\n var prev = get();\n set(context);\n try {\n return fn(...args);\n } catch (error) {\n throw error;\n } finally {\n set(prev);\n }\n };\n }\n enterWith(store) {\n cleanupLater();\n var context = get();\n if (!context) {\n set([this, store]);\n return;\n }\n var { length } = context;\n for (var i = 0;i < length; i += 2)\n if (context[i] === this) {\n const clone = context.slice();\n clone[i + 1] = store, set(clone);\n return;\n }\n set(context.concat(this, store));\n }\n exit(cb, ...args) {\n return this.run(@undefined, cb, ...args);\n }\n run(store_value, callback, ...args) {\n var context = get(), hasPrevious = !1, previous_value, i = 0, contextWasAlreadyInit = !context;\n if (contextWasAlreadyInit)\n set(context = [this, store_value]);\n else {\n if (context = context.slice(), i = context.indexOf(this), i > -1)\n hasPrevious = !0, previous_value = context[i + 1], context[i + 1] = store_value;\n else\n i = context.length, context.push(this, store_value);\n set(context);\n }\n try {\n return callback(...args);\n } catch (e) {\n throw e;\n } finally {\n if (!this.#disableCalled) {\n var context2 = get();\n if (context2 === context && contextWasAlreadyInit)\n set(@undefined);\n else if (context2 = context2.slice(), hasPrevious)\n context2[i + 1] = previous_value, set(context2);\n else\n context2.splice(i, 2), set(context2.length \? context2 : @undefined);\n }\n }\n }\n disable() {\n if (!this.#disableCalled) {\n var context = get();\n if (context) {\n var { length } = context;\n for (var i = 0;i < length; i += 2)\n if (context[i] === this) {\n context.splice(i, 2), set(context.length \? context : @undefined);\n break;\n }\n }\n this.#disableCalled = !0;\n }\n }\n getStore() {\n var context = get();\n if (!context)\n return;\n var { length } = context;\n for (var i = 0;i < length; i += 2)\n if (context[i] === this)\n return context[i + 1];\n }\n}\n\nclass AsyncResource {\n type;\n #snapshot;\n constructor(type, options) {\n if (typeof type !== \"string\")\n @throwTypeError('The \"type\" argument must be of type string. Received type ' + typeof type);\n setAsyncHooksEnabled(!0), this.type = type, this.#snapshot = get();\n }\n emitBefore() {\n return !0;\n }\n emitAfter() {\n return !0;\n }\n asyncId() {\n return 0;\n }\n triggerAsyncId() {\n return 0;\n }\n emitDestroy() {\n }\n runInAsyncScope(fn, thisArg, ...args) {\n var prev = get();\n set(this.#snapshot);\n try {\n return fn.apply(thisArg, args);\n } catch (error) {\n throw error;\n } finally {\n set(prev);\n }\n }\n bind(fn, thisArg) {\n return this.runInAsyncScope.bind(this, fn, thisArg \?\? this);\n }\n static bind(fn, type, thisArg) {\n return type = type || fn.name, new AsyncResource(type || \"bound-anonymous-fn\").bind(fn, thisArg);\n }\n}\nvar createHookNotImpl = createWarning(\"async_hooks.createHook is not implemented in Bun. Hooks can still be created but will never be called.\"), executionAsyncIdNotImpl = createWarning(\"async_hooks.executionAsyncId/triggerAsyncId are not implemented in Bun. It will return 0 every time.\"), executionAsyncResourceWarning = createWarning(\"async_hooks.executionAsyncResource is not implemented in Bun. It returns a reference to process.stdin every time.\"), asyncWrapProviders = {\n NONE: 0,\n DIRHANDLE: 1,\n DNSCHANNEL: 2,\n ELDHISTOGRAM: 3,\n FILEHANDLE: 4,\n FILEHANDLECLOSEREQ: 5,\n FIXEDSIZEBLOBCOPY: 6,\n FSEVENTWRAP: 7,\n FSREQCALLBACK: 8,\n FSREQPROMISE: 9,\n GETADDRINFOREQWRAP: 10,\n GETNAMEINFOREQWRAP: 11,\n HEAPSNAPSHOT: 12,\n HTTP2SESSION: 13,\n HTTP2STREAM: 14,\n HTTP2PING: 15,\n HTTP2SETTINGS: 16,\n HTTPINCOMINGMESSAGE: 17,\n HTTPCLIENTREQUEST: 18,\n JSSTREAM: 19,\n JSUDPWRAP: 20,\n MESSAGEPORT: 21,\n PIPECONNECTWRAP: 22,\n PIPESERVERWRAP: 23,\n PIPEWRAP: 24,\n PROCESSWRAP: 25,\n PROMISE: 26,\n QUERYWRAP: 27,\n SHUTDOWNWRAP: 28,\n SIGNALWRAP: 29,\n STATWATCHER: 30,\n STREAMPIPE: 31,\n TCPCONNECTWRAP: 32,\n TCPSERVERWRAP: 33,\n TCPWRAP: 34,\n TTYWRAP: 35,\n UDPSENDWRAP: 36,\n UDPWRAP: 37,\n SIGINTWATCHDOG: 38,\n WORKER: 39,\n WORKERHEAPSNAPSHOT: 40,\n WRITEWRAP: 41,\n ZLIB: 42,\n CHECKPRIMEREQUEST: 43,\n PBKDF2REQUEST: 44,\n KEYPAIRGENREQUEST: 45,\n KEYGENREQUEST: 46,\n KEYEXPORTREQUEST: 47,\n CIPHERREQUEST: 48,\n DERIVEBITSREQUEST: 49,\n HASHREQUEST: 50,\n RANDOMBYTESREQUEST: 51,\n RANDOMPRIMEREQUEST: 52,\n SCRYPTREQUEST: 53,\n SIGNREQUEST: 54,\n TLSWRAP: 55,\n VERIFYREQUEST: 56,\n INSPECTORJSBINDING: 57\n};\n$ = {\n AsyncLocalStorage,\n createHook,\n executionAsyncId,\n triggerAsyncId,\n executionAsyncResource,\n asyncWrapProviders,\n AsyncResource\n};\nreturn $})\n"_s; // // @@ -439,7 +439,7 @@ static constexpr ASCIILiteral NodeTraceEventsCode = "(function (){\"use strict\" // // -static constexpr ASCIILiteral NodeTtyCode = "(function (){\"use strict\";// src/js/out/tmp/node/tty.ts\nvar ReadStream = function(fd) {\n if (!(this instanceof ReadStream))\n return new ReadStream(fd);\n if (fd >> 0 !== fd || fd < 0)\n @throwRangeError(\"fd must be a positive integer\");\n const stream = (@getInternalField(@internalModuleRegistry, 21) || @createInternalModuleById(21)).ReadStream.call(this, \"\", {\n fd\n });\n return stream.isRaw = !1, stream.isTTY = isatty(stream.fd), stream;\n}, warnOnDeactivatedColors = function(env) {\n if (warned)\n return;\n let name = \"\";\n if (env.NODE_DISABLE_COLORS !== @undefined)\n name = \"NODE_DISABLE_COLORS\";\n if (env.NO_COLOR !== @undefined) {\n if (name !== \"\")\n name += \"' and '\";\n name += \"NO_COLOR\";\n }\n if (name !== \"\")\n process.emitWarning(`The '${name}' env is ignored due to the 'FORCE_COLOR' env being set.`, \"Warning\"), warned = !0;\n}, WriteStream = function(fd) {\n if (!(this instanceof WriteStream))\n return new WriteStream(fd);\n if (fd >> 0 !== fd || fd < 0)\n @throwRangeError(\"fd must be a positive integer\");\n const stream = (@getInternalField(@internalModuleRegistry, 21) || @createInternalModuleById(21)).WriteStream.call(this, \"\", {\n fd\n });\n if (stream.columns = @undefined, stream.rows = @undefined, stream.isTTY = isatty(stream.fd), stream.isTTY) {\n const windowSizeArray = [0, 0];\n if (_getWindowSize(fd, windowSizeArray) === !0)\n stream.columns = windowSizeArray[0], stream.rows = windowSizeArray[1];\n }\n return stream;\n}, { ttySetMode, isatty, getWindowSize: _getWindowSize } = @lazy(\"tty\"), StringPrototypeSplit = Function.prototype.call.bind(@String.prototype.split), RegExpPrototypeExec = Function.prototype.call.bind(@RegExp.prototype.exec), StringPrototypeToLowerCase = Function.prototype.call.bind(@String.prototype.toLowerCase), ArrayPrototypeSome = Function.prototype.call.bind(@Array.prototype.some), NumberIsInteger = Number.isInteger;\nObject.defineProperty(ReadStream, \"prototype\", {\n get() {\n const Real = (@getInternalField(@internalModuleRegistry, 21) || @createInternalModuleById(21)).ReadStream.prototype;\n return Object.defineProperty(ReadStream, \"prototype\", { value: Real }), ReadStream.prototype.setRawMode = function(flag) {\n const mode = flag \? 1 : 0, err = ttySetMode(this.fd, mode);\n if (err)\n return this.emit(\"error\", new Error(\"setRawMode failed with errno:\", err)), this;\n return this.isRaw = flag, this;\n }, Real;\n },\n enumerable: !0,\n configurable: !0\n});\nvar OSRelease, COLORS_2 = 1, COLORS_16 = 4, COLORS_256 = 8, COLORS_16m = 24, TERM_ENVS = {\n eterm: COLORS_16,\n cons25: COLORS_16,\n console: COLORS_16,\n cygwin: COLORS_16,\n dtterm: COLORS_16,\n gnome: COLORS_16,\n hurd: COLORS_16,\n jfbterm: COLORS_16,\n konsole: COLORS_16,\n kterm: COLORS_16,\n mlterm: COLORS_16,\n mosh: COLORS_16m,\n putty: COLORS_16,\n st: COLORS_16,\n \"rxvt-unicode-24bit\": COLORS_16m,\n terminator: COLORS_16m\n}, TERM_ENVS_REG_EXP = [/ansi/, /color/, /linux/, /^con[0-9]*x[0-9]/, /^rxvt/, /^screen/, /^xterm/, /^vt100/], warned = !1;\nObject.defineProperty(WriteStream, \"prototype\", {\n get() {\n const Real = (@getInternalField(@internalModuleRegistry, 21) || @createInternalModuleById(21)).WriteStream.prototype;\n Object.defineProperty(WriteStream, \"prototype\", { value: Real }), WriteStream.prototype._refreshSize = function() {\n const oldCols = this.columns, oldRows = this.rows, windowSizeArray = [0, 0];\n if (_getWindowSize(this.fd, windowSizeArray) === !0) {\n if (oldCols !== windowSizeArray[0] || oldRows !== windowSizeArray[1])\n this.columns = windowSizeArray[0], this.rows = windowSizeArray[1], this.emit(\"resize\");\n }\n };\n var readline = @undefined;\n return WriteStream.prototype.clearLine = function(dir, cb) {\n return (readline \?\?= @getInternalField(@internalModuleRegistry, 35) || @createInternalModuleById(35)).clearLine(this, dir, cb);\n }, WriteStream.prototype.clearScreenDown = function(cb) {\n return (readline \?\?= @getInternalField(@internalModuleRegistry, 35) || @createInternalModuleById(35)).clearScreenDown(this, cb);\n }, WriteStream.prototype.cursorTo = function(x, y, cb) {\n return (readline \?\?= @getInternalField(@internalModuleRegistry, 35) || @createInternalModuleById(35)).cursorTo(this, x, y, cb);\n }, WriteStream.prototype.getColorDepth = function(env = process.env) {\n if (env.FORCE_COLOR !== @undefined)\n switch (env.FORCE_COLOR) {\n case \"\":\n case \"1\":\n case \"true\":\n return warnOnDeactivatedColors(env), COLORS_16;\n case \"2\":\n return warnOnDeactivatedColors(env), COLORS_256;\n case \"3\":\n return warnOnDeactivatedColors(env), COLORS_16m;\n default:\n return COLORS_2;\n }\n if (env.NODE_DISABLE_COLORS !== @undefined || env.NO_COLOR !== @undefined || env.TERM === \"dumb\")\n return COLORS_2;\n if (OSRelease === @undefined) {\n const { release } = @getInternalField(@internalModuleRegistry, 28) || @createInternalModuleById(28);\n OSRelease = StringPrototypeSplit(release(), \".\");\n }\n if (+OSRelease[0] >= 10) {\n const build = +OSRelease[2];\n if (build >= 14931)\n return COLORS_16m;\n if (build >= 10586)\n return COLORS_256;\n }\n return COLORS_16;\n switch (env.TERM_PROGRAM) {\n case \"iTerm.app\":\n if (!env.TERM_PROGRAM_VERSION || /^[0-2]\\./.test(env.TERM_PROGRAM_VERSION))\n return COLORS_256;\n return COLORS_16m;\n case \"HyperTerm\":\n case \"MacTerm\":\n return COLORS_16m;\n case \"Apple_Terminal\":\n return COLORS_256;\n }\n }, WriteStream.prototype.getWindowSize = function() {\n return [this.columns, this.rows];\n }, WriteStream.prototype.hasColors = function(count, env) {\n if (env === @undefined && (count === @undefined || typeof count === \"object\" && count !== null))\n env = count, count = 16;\n else\n validateInteger(count, \"count\", 2);\n return count <= 2 ** this.getColorDepth(env);\n }, WriteStream.prototype.moveCursor = function(dx, dy, cb) {\n return (readline \?\?= @getInternalField(@internalModuleRegistry, 35) || @createInternalModuleById(35)).moveCursor(this, dx, dy, cb);\n }, Real;\n },\n enumerable: !0,\n configurable: !0\n});\nvar validateInteger = (value, name, min = Number.MIN_SAFE_INTEGER, max = Number.MAX_SAFE_INTEGER) => {\n if (typeof value !== \"number\")\n throw new ERR_INVALID_ARG_TYPE(name, \"number\", value);\n if (!NumberIsInteger(value))\n throw new ERR_OUT_OF_RANGE(name, \"an integer\", value);\n if (value < min || value > max)\n throw new ERR_OUT_OF_RANGE(name, `>= ${min} && <= ${max}`, value);\n};\nreturn { ReadStream, WriteStream, isatty }})\n"_s; +static constexpr ASCIILiteral NodeTtyCode = "(function (){\"use strict\";// src/js/out/tmp/node/tty.ts\nvar ReadStream = function(fd) {\n if (!(this instanceof ReadStream))\n return new ReadStream(fd);\n if (fd >> 0 !== fd || fd < 0)\n @throwRangeError(\"fd must be a positive integer\");\n const stream = (@getInternalField(@internalModuleRegistry, 21) || @createInternalModuleById(21)).ReadStream.call(this, \"\", {\n fd\n });\n return Object.setPrototypeOf(stream, ReadStream.prototype), stream.isRaw = !1, stream.isTTY = !0, stream;\n}, warnOnDeactivatedColors = function(env) {\n if (warned)\n return;\n let name = \"\";\n if (env.NODE_DISABLE_COLORS !== @undefined)\n name = \"NODE_DISABLE_COLORS\";\n if (env.NO_COLOR !== @undefined) {\n if (name !== \"\")\n name += \"' and '\";\n name += \"NO_COLOR\";\n }\n if (name !== \"\")\n process.emitWarning(`The '${name}' env is ignored due to the 'FORCE_COLOR' env being set.`, \"Warning\"), warned = !0;\n}, WriteStream = function(fd) {\n if (!(this instanceof WriteStream))\n return new WriteStream(fd);\n if (fd >> 0 !== fd || fd < 0)\n @throwRangeError(\"fd must be a positive integer\");\n const stream = (@getInternalField(@internalModuleRegistry, 21) || @createInternalModuleById(21)).WriteStream.call(this, \"\", {\n fd\n });\n if (stream.columns = @undefined, stream.rows = @undefined, stream.isTTY = isatty(stream.fd), stream.isTTY) {\n const windowSizeArray = [0, 0];\n if (_getWindowSize(fd, windowSizeArray) === !0)\n stream.columns = windowSizeArray[0], stream.rows = windowSizeArray[1];\n }\n return stream;\n}, { ttySetMode, isatty, getWindowSize: _getWindowSize } = @lazy(\"tty\"), StringPrototypeSplit = Function.prototype.call.bind(@String.prototype.split), NumberIsInteger = Number.isInteger;\nObject.defineProperty(ReadStream, \"prototype\", {\n get() {\n const Prototype = Object.create((@getInternalField(@internalModuleRegistry, 21) || @createInternalModuleById(21)).ReadStream.prototype);\n return Prototype.setRawMode = function(flag) {\n const mode = flag \? 1 : 0, err = ttySetMode(this.fd, mode);\n if (err)\n return this.emit(\"error\", new Error(\"setRawMode failed with errno: \" + err)), this;\n return this.isRaw = flag, this;\n }, Object.defineProperty(ReadStream, \"prototype\", { value: Prototype }), Prototype;\n },\n enumerable: !0,\n configurable: !0\n});\nvar OSRelease, COLORS_2 = 1, COLORS_16 = 4, COLORS_256 = 8, COLORS_16m = 24, TERM_ENVS = {\n eterm: COLORS_16,\n cons25: COLORS_16,\n console: COLORS_16,\n cygwin: COLORS_16,\n dtterm: COLORS_16,\n gnome: COLORS_16,\n hurd: COLORS_16,\n jfbterm: COLORS_16,\n konsole: COLORS_16,\n kterm: COLORS_16,\n mlterm: COLORS_16,\n mosh: COLORS_16m,\n putty: COLORS_16,\n st: COLORS_16,\n \"rxvt-unicode-24bit\": COLORS_16m,\n terminator: COLORS_16m\n}, TERM_ENVS_REG_EXP = [/ansi/, /color/, /linux/, /^con[0-9]*x[0-9]/, /^rxvt/, /^screen/, /^xterm/, /^vt100/], warned = !1;\nObject.defineProperty(WriteStream, \"prototype\", {\n get() {\n const Real = (@getInternalField(@internalModuleRegistry, 21) || @createInternalModuleById(21)).WriteStream.prototype;\n Object.defineProperty(WriteStream, \"prototype\", { value: Real }), WriteStream.prototype._refreshSize = function() {\n const oldCols = this.columns, oldRows = this.rows, windowSizeArray = [0, 0];\n if (_getWindowSize(this.fd, windowSizeArray) === !0) {\n if (oldCols !== windowSizeArray[0] || oldRows !== windowSizeArray[1])\n this.columns = windowSizeArray[0], this.rows = windowSizeArray[1], this.emit(\"resize\");\n }\n };\n var readline = @undefined;\n return WriteStream.prototype.clearLine = function(dir, cb) {\n return (readline \?\?= @getInternalField(@internalModuleRegistry, 35) || @createInternalModuleById(35)).clearLine(this, dir, cb);\n }, WriteStream.prototype.clearScreenDown = function(cb) {\n return (readline \?\?= @getInternalField(@internalModuleRegistry, 35) || @createInternalModuleById(35)).clearScreenDown(this, cb);\n }, WriteStream.prototype.cursorTo = function(x, y, cb) {\n return (readline \?\?= @getInternalField(@internalModuleRegistry, 35) || @createInternalModuleById(35)).cursorTo(this, x, y, cb);\n }, WriteStream.prototype.getColorDepth = function(env = process.env) {\n if (env.FORCE_COLOR !== @undefined)\n switch (env.FORCE_COLOR) {\n case \"\":\n case \"1\":\n case \"true\":\n return warnOnDeactivatedColors(env), COLORS_16;\n case \"2\":\n return warnOnDeactivatedColors(env), COLORS_256;\n case \"3\":\n return warnOnDeactivatedColors(env), COLORS_16m;\n default:\n return COLORS_2;\n }\n if (env.NODE_DISABLE_COLORS !== @undefined || env.NO_COLOR !== @undefined || env.TERM === \"dumb\")\n return COLORS_2;\n if (OSRelease === @undefined) {\n const { release } = @getInternalField(@internalModuleRegistry, 28) || @createInternalModuleById(28);\n OSRelease = StringPrototypeSplit(release(), \".\");\n }\n if (+OSRelease[0] >= 10) {\n const build = +OSRelease[2];\n if (build >= 14931)\n return COLORS_16m;\n if (build >= 10586)\n return COLORS_256;\n }\n return COLORS_16;\n switch (env.TERM_PROGRAM) {\n case \"iTerm.app\":\n if (!env.TERM_PROGRAM_VERSION || /^[0-2]\\./.test(env.TERM_PROGRAM_VERSION))\n return COLORS_256;\n return COLORS_16m;\n case \"HyperTerm\":\n case \"MacTerm\":\n return COLORS_16m;\n case \"Apple_Terminal\":\n return COLORS_256;\n }\n }, WriteStream.prototype.getWindowSize = function() {\n return [this.columns, this.rows];\n }, WriteStream.prototype.hasColors = function(count, env) {\n if (env === @undefined && (count === @undefined || typeof count === \"object\" && count !== null))\n env = count, count = 16;\n else\n validateInteger(count, \"count\", 2);\n return count <= 2 ** this.getColorDepth(env);\n }, WriteStream.prototype.moveCursor = function(dx, dy, cb) {\n return (readline \?\?= @getInternalField(@internalModuleRegistry, 35) || @createInternalModuleById(35)).moveCursor(this, dx, dy, cb);\n }, Real;\n },\n enumerable: !0,\n configurable: !0\n});\nvar validateInteger = (value, name, min = Number.MIN_SAFE_INTEGER, max = Number.MAX_SAFE_INTEGER) => {\n if (typeof value !== \"number\")\n throw new ERR_INVALID_ARG_TYPE(name, \"number\", value);\n if (!NumberIsInteger(value))\n throw new ERR_OUT_OF_RANGE(name, \"an integer\", value);\n if (value < min || value > max)\n throw new ERR_OUT_OF_RANGE(name, `>= ${min} && <= ${max}`, value);\n};\nreturn { ReadStream, WriteStream, isatty }})\n"_s; // // @@ -545,7 +545,7 @@ static constexpr ASCIILiteral NodeAssertStrictCode = "(function (){\"use strict\ // // -static constexpr ASCIILiteral NodeAsyncHooksCode = "(function (){\"use strict\";// src/js/out/tmp/node/async_hooks.ts\nvar get = function() {\n return @getInternalField(@asyncContext, 0);\n}, set = function(contextValue) {\n return @putInternalField(@asyncContext, 0, contextValue);\n}, createWarning = function(message) {\n let warned = !1;\n var wrapped = function() {\n if (warned)\n return;\n if (new Error().stack.includes(\"zx/build/core.js\"))\n return;\n warned = !0, console.warn(\"[bun] Warning:\", message);\n };\n return wrapped;\n}, createHook = function(callbacks) {\n return {\n enable: createHookNotImpl,\n disable: createHookNotImpl\n };\n}, executionAsyncId = function() {\n return executionAsyncIdNotImpl(), 0;\n}, triggerAsyncId = function() {\n return 0;\n}, executionAsyncResource = function() {\n return executionAsyncResourceWarning(), process.stdin;\n}, $, { cleanupLater, setAsyncHooksEnabled } = @lazy(\"async_hooks\");\n\nclass AsyncLocalStorage {\n #disableCalled = !1;\n constructor() {\n setAsyncHooksEnabled(!0);\n }\n static bind(fn, ...args) {\n return this.snapshot().bind(null, fn, ...args);\n }\n static snapshot() {\n var context = get();\n return (fn, ...args) => {\n var prev = get();\n set(context);\n try {\n return fn(...args);\n } catch (error) {\n throw error;\n } finally {\n set(prev);\n }\n };\n }\n enterWith(store) {\n cleanupLater();\n var context = get();\n if (!context) {\n set([this, store]);\n return;\n }\n var { length } = context;\n for (var i = 0;i < length; i += 2)\n if (context[i] === this) {\n const clone = context.slice();\n clone[i + 1] = store, set(clone);\n return;\n }\n set(context.concat(this, store));\n }\n exit(cb, ...args) {\n return this.run(@undefined, cb, ...args);\n }\n run(store, callback, ...args) {\n var context = get(), hasPrevious = !1, previous, i = 0, contextWasInit = !context;\n if (contextWasInit)\n set(context = [this, store]);\n else {\n if (context = context.slice(), i = context.indexOf(this), i > -1)\n hasPrevious = !0, previous = context[i + 1], context[i + 1] = store;\n else\n context.push(this, store);\n set(context);\n }\n try {\n return callback(...args);\n } catch (e) {\n throw e;\n } finally {\n if (!this.#disableCalled) {\n var context2 = get();\n if (context2 === context && contextWasInit)\n set(@undefined);\n else if (context2 = context2.slice(), hasPrevious)\n context2[i + 1] = previous, set(context2);\n else\n context2.splice(i, 2), set(context2.length \? context2 : @undefined);\n }\n }\n }\n disable() {\n if (!this.#disableCalled) {\n var context = get();\n if (context) {\n var { length } = context;\n for (var i = 0;i < length; i += 2)\n if (context[i] === this) {\n context.splice(i, 2), set(context.length \? context : @undefined);\n break;\n }\n }\n this.#disableCalled = !0;\n }\n }\n getStore() {\n var context = get();\n if (!context)\n return;\n var { length } = context;\n for (var i = 0;i < length; i += 2)\n if (context[i] === this)\n return context[i + 1];\n }\n}\n\nclass AsyncResource {\n type;\n #snapshot;\n constructor(type, options) {\n if (typeof type !== \"string\")\n @throwTypeError('The \"type\" argument must be of type string. Received type ' + typeof type);\n setAsyncHooksEnabled(!0), this.type = type, this.#snapshot = get();\n }\n emitBefore() {\n return !0;\n }\n emitAfter() {\n return !0;\n }\n asyncId() {\n return 0;\n }\n triggerAsyncId() {\n return 0;\n }\n emitDestroy() {\n }\n runInAsyncScope(fn, thisArg, ...args) {\n var prev = get();\n set(this.#snapshot);\n try {\n return fn.apply(thisArg, args);\n } catch (error) {\n throw error;\n } finally {\n set(prev);\n }\n }\n}\nvar createHookNotImpl = createWarning(\"async_hooks.createHook is not implemented in Bun. Hooks can still be created but will never be called.\"), executionAsyncIdNotImpl = createWarning(\"async_hooks.executionAsyncId/triggerAsyncId are not implemented in Bun. It will return 0 every time.\"), executionAsyncResourceWarning = createWarning(\"async_hooks.executionAsyncResource is not implemented in Bun. It returns a reference to process.stdin every time.\"), asyncWrapProviders = {\n NONE: 0,\n DIRHANDLE: 1,\n DNSCHANNEL: 2,\n ELDHISTOGRAM: 3,\n FILEHANDLE: 4,\n FILEHANDLECLOSEREQ: 5,\n FIXEDSIZEBLOBCOPY: 6,\n FSEVENTWRAP: 7,\n FSREQCALLBACK: 8,\n FSREQPROMISE: 9,\n GETADDRINFOREQWRAP: 10,\n GETNAMEINFOREQWRAP: 11,\n HEAPSNAPSHOT: 12,\n HTTP2SESSION: 13,\n HTTP2STREAM: 14,\n HTTP2PING: 15,\n HTTP2SETTINGS: 16,\n HTTPINCOMINGMESSAGE: 17,\n HTTPCLIENTREQUEST: 18,\n JSSTREAM: 19,\n JSUDPWRAP: 20,\n MESSAGEPORT: 21,\n PIPECONNECTWRAP: 22,\n PIPESERVERWRAP: 23,\n PIPEWRAP: 24,\n PROCESSWRAP: 25,\n PROMISE: 26,\n QUERYWRAP: 27,\n SHUTDOWNWRAP: 28,\n SIGNALWRAP: 29,\n STATWATCHER: 30,\n STREAMPIPE: 31,\n TCPCONNECTWRAP: 32,\n TCPSERVERWRAP: 33,\n TCPWRAP: 34,\n TTYWRAP: 35,\n UDPSENDWRAP: 36,\n UDPWRAP: 37,\n SIGINTWATCHDOG: 38,\n WORKER: 39,\n WORKERHEAPSNAPSHOT: 40,\n WRITEWRAP: 41,\n ZLIB: 42,\n CHECKPRIMEREQUEST: 43,\n PBKDF2REQUEST: 44,\n KEYPAIRGENREQUEST: 45,\n KEYGENREQUEST: 46,\n KEYEXPORTREQUEST: 47,\n CIPHERREQUEST: 48,\n DERIVEBITSREQUEST: 49,\n HASHREQUEST: 50,\n RANDOMBYTESREQUEST: 51,\n RANDOMPRIMEREQUEST: 52,\n SCRYPTREQUEST: 53,\n SIGNREQUEST: 54,\n TLSWRAP: 55,\n VERIFYREQUEST: 56,\n INSPECTORJSBINDING: 57\n};\n$ = {\n AsyncLocalStorage,\n createHook,\n executionAsyncId,\n triggerAsyncId,\n executionAsyncResource,\n asyncWrapProviders,\n AsyncResource\n};\nreturn $})\n"_s; +static constexpr ASCIILiteral NodeAsyncHooksCode = "(function (){\"use strict\";// src/js/out/tmp/node/async_hooks.ts\nvar get = function() {\n return @getInternalField(@asyncContext, 0);\n}, set = function(contextValue) {\n return @putInternalField(@asyncContext, 0, contextValue);\n}, createWarning = function(message) {\n let warned = !1;\n var wrapped = function() {\n if (warned)\n return;\n if (new Error().stack.includes(\"zx/build/core.js\"))\n return;\n warned = !0, console.warn(\"[bun] Warning:\", message);\n };\n return wrapped;\n}, createHook = function(callbacks) {\n return {\n enable: createHookNotImpl,\n disable: createHookNotImpl\n };\n}, executionAsyncId = function() {\n return executionAsyncIdNotImpl(), 0;\n}, triggerAsyncId = function() {\n return 0;\n}, executionAsyncResource = function() {\n return executionAsyncResourceWarning(), process.stdin;\n}, $, { cleanupLater, setAsyncHooksEnabled } = @lazy(\"async_hooks\");\n\nclass AsyncLocalStorage {\n #disableCalled = !1;\n constructor() {\n setAsyncHooksEnabled(!0);\n }\n static bind(fn, ...args) {\n return this.snapshot().bind(null, fn, ...args);\n }\n static snapshot() {\n var context = get();\n return (fn, ...args) => {\n var prev = get();\n set(context);\n try {\n return fn(...args);\n } catch (error) {\n throw error;\n } finally {\n set(prev);\n }\n };\n }\n enterWith(store) {\n cleanupLater();\n var context = get();\n if (!context) {\n set([this, store]);\n return;\n }\n var { length } = context;\n for (var i = 0;i < length; i += 2)\n if (context[i] === this) {\n const clone = context.slice();\n clone[i + 1] = store, set(clone);\n return;\n }\n set(context.concat(this, store));\n }\n exit(cb, ...args) {\n return this.run(@undefined, cb, ...args);\n }\n run(store_value, callback, ...args) {\n var context = get(), hasPrevious = !1, previous_value, i = 0, contextWasAlreadyInit = !context;\n if (contextWasAlreadyInit)\n set(context = [this, store_value]);\n else {\n if (context = context.slice(), i = context.indexOf(this), i > -1)\n hasPrevious = !0, previous_value = context[i + 1], context[i + 1] = store_value;\n else\n i = context.length, context.push(this, store_value);\n set(context);\n }\n try {\n return callback(...args);\n } catch (e) {\n throw e;\n } finally {\n if (!this.#disableCalled) {\n var context2 = get();\n if (context2 === context && contextWasAlreadyInit)\n set(@undefined);\n else if (context2 = context2.slice(), hasPrevious)\n context2[i + 1] = previous_value, set(context2);\n else\n context2.splice(i, 2), set(context2.length \? context2 : @undefined);\n }\n }\n }\n disable() {\n if (!this.#disableCalled) {\n var context = get();\n if (context) {\n var { length } = context;\n for (var i = 0;i < length; i += 2)\n if (context[i] === this) {\n context.splice(i, 2), set(context.length \? context : @undefined);\n break;\n }\n }\n this.#disableCalled = !0;\n }\n }\n getStore() {\n var context = get();\n if (!context)\n return;\n var { length } = context;\n for (var i = 0;i < length; i += 2)\n if (context[i] === this)\n return context[i + 1];\n }\n}\n\nclass AsyncResource {\n type;\n #snapshot;\n constructor(type, options) {\n if (typeof type !== \"string\")\n @throwTypeError('The \"type\" argument must be of type string. Received type ' + typeof type);\n setAsyncHooksEnabled(!0), this.type = type, this.#snapshot = get();\n }\n emitBefore() {\n return !0;\n }\n emitAfter() {\n return !0;\n }\n asyncId() {\n return 0;\n }\n triggerAsyncId() {\n return 0;\n }\n emitDestroy() {\n }\n runInAsyncScope(fn, thisArg, ...args) {\n var prev = get();\n set(this.#snapshot);\n try {\n return fn.apply(thisArg, args);\n } catch (error) {\n throw error;\n } finally {\n set(prev);\n }\n }\n bind(fn, thisArg) {\n return this.runInAsyncScope.bind(this, fn, thisArg \?\? this);\n }\n static bind(fn, type, thisArg) {\n return type = type || fn.name, new AsyncResource(type || \"bound-anonymous-fn\").bind(fn, thisArg);\n }\n}\nvar createHookNotImpl = createWarning(\"async_hooks.createHook is not implemented in Bun. Hooks can still be created but will never be called.\"), executionAsyncIdNotImpl = createWarning(\"async_hooks.executionAsyncId/triggerAsyncId are not implemented in Bun. It will return 0 every time.\"), executionAsyncResourceWarning = createWarning(\"async_hooks.executionAsyncResource is not implemented in Bun. It returns a reference to process.stdin every time.\"), asyncWrapProviders = {\n NONE: 0,\n DIRHANDLE: 1,\n DNSCHANNEL: 2,\n ELDHISTOGRAM: 3,\n FILEHANDLE: 4,\n FILEHANDLECLOSEREQ: 5,\n FIXEDSIZEBLOBCOPY: 6,\n FSEVENTWRAP: 7,\n FSREQCALLBACK: 8,\n FSREQPROMISE: 9,\n GETADDRINFOREQWRAP: 10,\n GETNAMEINFOREQWRAP: 11,\n HEAPSNAPSHOT: 12,\n HTTP2SESSION: 13,\n HTTP2STREAM: 14,\n HTTP2PING: 15,\n HTTP2SETTINGS: 16,\n HTTPINCOMINGMESSAGE: 17,\n HTTPCLIENTREQUEST: 18,\n JSSTREAM: 19,\n JSUDPWRAP: 20,\n MESSAGEPORT: 21,\n PIPECONNECTWRAP: 22,\n PIPESERVERWRAP: 23,\n PIPEWRAP: 24,\n PROCESSWRAP: 25,\n PROMISE: 26,\n QUERYWRAP: 27,\n SHUTDOWNWRAP: 28,\n SIGNALWRAP: 29,\n STATWATCHER: 30,\n STREAMPIPE: 31,\n TCPCONNECTWRAP: 32,\n TCPSERVERWRAP: 33,\n TCPWRAP: 34,\n TTYWRAP: 35,\n UDPSENDWRAP: 36,\n UDPWRAP: 37,\n SIGINTWATCHDOG: 38,\n WORKER: 39,\n WORKERHEAPSNAPSHOT: 40,\n WRITEWRAP: 41,\n ZLIB: 42,\n CHECKPRIMEREQUEST: 43,\n PBKDF2REQUEST: 44,\n KEYPAIRGENREQUEST: 45,\n KEYGENREQUEST: 46,\n KEYEXPORTREQUEST: 47,\n CIPHERREQUEST: 48,\n DERIVEBITSREQUEST: 49,\n HASHREQUEST: 50,\n RANDOMBYTESREQUEST: 51,\n RANDOMPRIMEREQUEST: 52,\n SCRYPTREQUEST: 53,\n SIGNREQUEST: 54,\n TLSWRAP: 55,\n VERIFYREQUEST: 56,\n INSPECTORJSBINDING: 57\n};\n$ = {\n AsyncLocalStorage,\n createHook,\n executionAsyncId,\n triggerAsyncId,\n executionAsyncResource,\n asyncWrapProviders,\n AsyncResource\n};\nreturn $})\n"_s; // // @@ -689,7 +689,7 @@ static constexpr ASCIILiteral NodeTraceEventsCode = "(function (){\"use strict\" // // -static constexpr ASCIILiteral NodeTtyCode = "(function (){\"use strict\";// src/js/out/tmp/node/tty.ts\nvar ReadStream = function(fd) {\n if (!(this instanceof ReadStream))\n return new ReadStream(fd);\n if (fd >> 0 !== fd || fd < 0)\n @throwRangeError(\"fd must be a positive integer\");\n const stream = (@getInternalField(@internalModuleRegistry, 21) || @createInternalModuleById(21)).ReadStream.call(this, \"\", {\n fd\n });\n return stream.isRaw = !1, stream.isTTY = isatty(stream.fd), stream;\n}, warnOnDeactivatedColors = function(env) {\n if (warned)\n return;\n let name = \"\";\n if (env.NODE_DISABLE_COLORS !== @undefined)\n name = \"NODE_DISABLE_COLORS\";\n if (env.NO_COLOR !== @undefined) {\n if (name !== \"\")\n name += \"' and '\";\n name += \"NO_COLOR\";\n }\n if (name !== \"\")\n process.emitWarning(`The '${name}' env is ignored due to the 'FORCE_COLOR' env being set.`, \"Warning\"), warned = !0;\n}, WriteStream = function(fd) {\n if (!(this instanceof WriteStream))\n return new WriteStream(fd);\n if (fd >> 0 !== fd || fd < 0)\n @throwRangeError(\"fd must be a positive integer\");\n const stream = (@getInternalField(@internalModuleRegistry, 21) || @createInternalModuleById(21)).WriteStream.call(this, \"\", {\n fd\n });\n if (stream.columns = @undefined, stream.rows = @undefined, stream.isTTY = isatty(stream.fd), stream.isTTY) {\n const windowSizeArray = [0, 0];\n if (_getWindowSize(fd, windowSizeArray) === !0)\n stream.columns = windowSizeArray[0], stream.rows = windowSizeArray[1];\n }\n return stream;\n}, { ttySetMode, isatty, getWindowSize: _getWindowSize } = @lazy(\"tty\"), StringPrototypeSplit = Function.prototype.call.bind(@String.prototype.split), RegExpPrototypeExec = Function.prototype.call.bind(@RegExp.prototype.exec), StringPrototypeToLowerCase = Function.prototype.call.bind(@String.prototype.toLowerCase), ArrayPrototypeSome = Function.prototype.call.bind(@Array.prototype.some), NumberIsInteger = Number.isInteger;\nObject.defineProperty(ReadStream, \"prototype\", {\n get() {\n const Real = (@getInternalField(@internalModuleRegistry, 21) || @createInternalModuleById(21)).ReadStream.prototype;\n return Object.defineProperty(ReadStream, \"prototype\", { value: Real }), ReadStream.prototype.setRawMode = function(flag) {\n const mode = flag \? 1 : 0, err = ttySetMode(this.fd, mode);\n if (err)\n return this.emit(\"error\", new Error(\"setRawMode failed with errno:\", err)), this;\n return this.isRaw = flag, this;\n }, Real;\n },\n enumerable: !0,\n configurable: !0\n});\nvar COLORS_2 = 1, COLORS_16 = 4, COLORS_256 = 8, COLORS_16m = 24, TERM_ENVS = {\n eterm: COLORS_16,\n cons25: COLORS_16,\n console: COLORS_16,\n cygwin: COLORS_16,\n dtterm: COLORS_16,\n gnome: COLORS_16,\n hurd: COLORS_16,\n jfbterm: COLORS_16,\n konsole: COLORS_16,\n kterm: COLORS_16,\n mlterm: COLORS_16,\n mosh: COLORS_16m,\n putty: COLORS_16,\n st: COLORS_16,\n \"rxvt-unicode-24bit\": COLORS_16m,\n terminator: COLORS_16m\n}, TERM_ENVS_REG_EXP = [/ansi/, /color/, /linux/, /^con[0-9]*x[0-9]/, /^rxvt/, /^screen/, /^xterm/, /^vt100/], warned = !1;\nObject.defineProperty(WriteStream, \"prototype\", {\n get() {\n const Real = (@getInternalField(@internalModuleRegistry, 21) || @createInternalModuleById(21)).WriteStream.prototype;\n Object.defineProperty(WriteStream, \"prototype\", { value: Real }), WriteStream.prototype._refreshSize = function() {\n const oldCols = this.columns, oldRows = this.rows, windowSizeArray = [0, 0];\n if (_getWindowSize(this.fd, windowSizeArray) === !0) {\n if (oldCols !== windowSizeArray[0] || oldRows !== windowSizeArray[1])\n this.columns = windowSizeArray[0], this.rows = windowSizeArray[1], this.emit(\"resize\");\n }\n };\n var readline = @undefined;\n return WriteStream.prototype.clearLine = function(dir, cb) {\n return (readline \?\?= @getInternalField(@internalModuleRegistry, 35) || @createInternalModuleById(35)).clearLine(this, dir, cb);\n }, WriteStream.prototype.clearScreenDown = function(cb) {\n return (readline \?\?= @getInternalField(@internalModuleRegistry, 35) || @createInternalModuleById(35)).clearScreenDown(this, cb);\n }, WriteStream.prototype.cursorTo = function(x, y, cb) {\n return (readline \?\?= @getInternalField(@internalModuleRegistry, 35) || @createInternalModuleById(35)).cursorTo(this, x, y, cb);\n }, WriteStream.prototype.getColorDepth = function(env = process.env) {\n if (env.FORCE_COLOR !== @undefined)\n switch (env.FORCE_COLOR) {\n case \"\":\n case \"1\":\n case \"true\":\n return warnOnDeactivatedColors(env), COLORS_16;\n case \"2\":\n return warnOnDeactivatedColors(env), COLORS_256;\n case \"3\":\n return warnOnDeactivatedColors(env), COLORS_16m;\n default:\n return COLORS_2;\n }\n if (env.NODE_DISABLE_COLORS !== @undefined || env.NO_COLOR !== @undefined || env.TERM === \"dumb\")\n return COLORS_2;\n if (env.TMUX)\n return COLORS_256;\n if (env.CI) {\n if ([\"APPVEYOR\", \"BUILDKITE\", \"CIRCLECI\", \"DRONE\", \"GITHUB_ACTIONS\", \"GITLAB_CI\", \"TRAVIS\"].some((sign) => (sign in env)) || env.CI_NAME === \"codeship\")\n return COLORS_256;\n return COLORS_2;\n }\n if (\"TEAMCITY_VERSION\" in env)\n return /^(9\\.(0*[1-9]\\d*)\\.|\\d{2,}\\.)/.test(env.TEAMCITY_VERSION) \? COLORS_16 : COLORS_2;\n switch (env.TERM_PROGRAM) {\n case \"iTerm.app\":\n if (!env.TERM_PROGRAM_VERSION || /^[0-2]\\./.test(env.TERM_PROGRAM_VERSION))\n return COLORS_256;\n return COLORS_16m;\n case \"HyperTerm\":\n case \"MacTerm\":\n return COLORS_16m;\n case \"Apple_Terminal\":\n return COLORS_256;\n }\n if (env.COLORTERM === \"truecolor\" || env.COLORTERM === \"24bit\")\n return COLORS_16m;\n if (env.TERM) {\n if (/^xterm-256/.test(env.TERM) !== null)\n return COLORS_256;\n const termEnv = env.TERM.toLowerCase();\n if (TERM_ENVS[termEnv])\n return TERM_ENVS[termEnv];\n if (TERM_ENVS_REG_EXP.some((term) => term.test(termEnv)))\n return COLORS_16;\n }\n if (env.COLORTERM)\n return COLORS_16;\n return COLORS_2;\n }, WriteStream.prototype.getWindowSize = function() {\n return [this.columns, this.rows];\n }, WriteStream.prototype.hasColors = function(count, env) {\n if (env === @undefined && (count === @undefined || typeof count === \"object\" && count !== null))\n env = count, count = 16;\n else\n validateInteger(count, \"count\", 2);\n return count <= 2 ** this.getColorDepth(env);\n }, WriteStream.prototype.moveCursor = function(dx, dy, cb) {\n return (readline \?\?= @getInternalField(@internalModuleRegistry, 35) || @createInternalModuleById(35)).moveCursor(this, dx, dy, cb);\n }, Real;\n },\n enumerable: !0,\n configurable: !0\n});\nvar validateInteger = (value, name, min = Number.MIN_SAFE_INTEGER, max = Number.MAX_SAFE_INTEGER) => {\n if (typeof value !== \"number\")\n throw new ERR_INVALID_ARG_TYPE(name, \"number\", value);\n if (!NumberIsInteger(value))\n throw new ERR_OUT_OF_RANGE(name, \"an integer\", value);\n if (value < min || value > max)\n throw new ERR_OUT_OF_RANGE(name, `>= ${min} && <= ${max}`, value);\n};\nreturn { ReadStream, WriteStream, isatty }})\n"_s; +static constexpr ASCIILiteral NodeTtyCode = "(function (){\"use strict\";// src/js/out/tmp/node/tty.ts\nvar ReadStream = function(fd) {\n if (!(this instanceof ReadStream))\n return new ReadStream(fd);\n if (fd >> 0 !== fd || fd < 0)\n @throwRangeError(\"fd must be a positive integer\");\n const stream = (@getInternalField(@internalModuleRegistry, 21) || @createInternalModuleById(21)).ReadStream.call(this, \"\", {\n fd\n });\n return Object.setPrototypeOf(stream, ReadStream.prototype), stream.isRaw = !1, stream.isTTY = !0, stream;\n}, warnOnDeactivatedColors = function(env) {\n if (warned)\n return;\n let name = \"\";\n if (env.NODE_DISABLE_COLORS !== @undefined)\n name = \"NODE_DISABLE_COLORS\";\n if (env.NO_COLOR !== @undefined) {\n if (name !== \"\")\n name += \"' and '\";\n name += \"NO_COLOR\";\n }\n if (name !== \"\")\n process.emitWarning(`The '${name}' env is ignored due to the 'FORCE_COLOR' env being set.`, \"Warning\"), warned = !0;\n}, WriteStream = function(fd) {\n if (!(this instanceof WriteStream))\n return new WriteStream(fd);\n if (fd >> 0 !== fd || fd < 0)\n @throwRangeError(\"fd must be a positive integer\");\n const stream = (@getInternalField(@internalModuleRegistry, 21) || @createInternalModuleById(21)).WriteStream.call(this, \"\", {\n fd\n });\n if (stream.columns = @undefined, stream.rows = @undefined, stream.isTTY = isatty(stream.fd), stream.isTTY) {\n const windowSizeArray = [0, 0];\n if (_getWindowSize(fd, windowSizeArray) === !0)\n stream.columns = windowSizeArray[0], stream.rows = windowSizeArray[1];\n }\n return stream;\n}, { ttySetMode, isatty, getWindowSize: _getWindowSize } = @lazy(\"tty\"), StringPrototypeSplit = Function.prototype.call.bind(@String.prototype.split), NumberIsInteger = Number.isInteger;\nObject.defineProperty(ReadStream, \"prototype\", {\n get() {\n const Prototype = Object.create((@getInternalField(@internalModuleRegistry, 21) || @createInternalModuleById(21)).ReadStream.prototype);\n return Prototype.setRawMode = function(flag) {\n const mode = flag \? 1 : 0, err = ttySetMode(this.fd, mode);\n if (err)\n return this.emit(\"error\", new Error(\"setRawMode failed with errno: \" + err)), this;\n return this.isRaw = flag, this;\n }, Object.defineProperty(ReadStream, \"prototype\", { value: Prototype }), Prototype;\n },\n enumerable: !0,\n configurable: !0\n});\nvar COLORS_2 = 1, COLORS_16 = 4, COLORS_256 = 8, COLORS_16m = 24, TERM_ENVS = {\n eterm: COLORS_16,\n cons25: COLORS_16,\n console: COLORS_16,\n cygwin: COLORS_16,\n dtterm: COLORS_16,\n gnome: COLORS_16,\n hurd: COLORS_16,\n jfbterm: COLORS_16,\n konsole: COLORS_16,\n kterm: COLORS_16,\n mlterm: COLORS_16,\n mosh: COLORS_16m,\n putty: COLORS_16,\n st: COLORS_16,\n \"rxvt-unicode-24bit\": COLORS_16m,\n terminator: COLORS_16m\n}, TERM_ENVS_REG_EXP = [/ansi/, /color/, /linux/, /^con[0-9]*x[0-9]/, /^rxvt/, /^screen/, /^xterm/, /^vt100/], warned = !1;\nObject.defineProperty(WriteStream, \"prototype\", {\n get() {\n const Real = (@getInternalField(@internalModuleRegistry, 21) || @createInternalModuleById(21)).WriteStream.prototype;\n Object.defineProperty(WriteStream, \"prototype\", { value: Real }), WriteStream.prototype._refreshSize = function() {\n const oldCols = this.columns, oldRows = this.rows, windowSizeArray = [0, 0];\n if (_getWindowSize(this.fd, windowSizeArray) === !0) {\n if (oldCols !== windowSizeArray[0] || oldRows !== windowSizeArray[1])\n this.columns = windowSizeArray[0], this.rows = windowSizeArray[1], this.emit(\"resize\");\n }\n };\n var readline = @undefined;\n return WriteStream.prototype.clearLine = function(dir, cb) {\n return (readline \?\?= @getInternalField(@internalModuleRegistry, 35) || @createInternalModuleById(35)).clearLine(this, dir, cb);\n }, WriteStream.prototype.clearScreenDown = function(cb) {\n return (readline \?\?= @getInternalField(@internalModuleRegistry, 35) || @createInternalModuleById(35)).clearScreenDown(this, cb);\n }, WriteStream.prototype.cursorTo = function(x, y, cb) {\n return (readline \?\?= @getInternalField(@internalModuleRegistry, 35) || @createInternalModuleById(35)).cursorTo(this, x, y, cb);\n }, WriteStream.prototype.getColorDepth = function(env = process.env) {\n if (env.FORCE_COLOR !== @undefined)\n switch (env.FORCE_COLOR) {\n case \"\":\n case \"1\":\n case \"true\":\n return warnOnDeactivatedColors(env), COLORS_16;\n case \"2\":\n return warnOnDeactivatedColors(env), COLORS_256;\n case \"3\":\n return warnOnDeactivatedColors(env), COLORS_16m;\n default:\n return COLORS_2;\n }\n if (env.NODE_DISABLE_COLORS !== @undefined || env.NO_COLOR !== @undefined || env.TERM === \"dumb\")\n return COLORS_2;\n if (env.TMUX)\n return COLORS_256;\n if (env.CI) {\n if ([\"APPVEYOR\", \"BUILDKITE\", \"CIRCLECI\", \"DRONE\", \"GITHUB_ACTIONS\", \"GITLAB_CI\", \"TRAVIS\"].some((sign) => (sign in env)) || env.CI_NAME === \"codeship\")\n return COLORS_256;\n return COLORS_2;\n }\n if (\"TEAMCITY_VERSION\" in env)\n return /^(9\\.(0*[1-9]\\d*)\\.|\\d{2,}\\.)/.test(env.TEAMCITY_VERSION) \? COLORS_16 : COLORS_2;\n switch (env.TERM_PROGRAM) {\n case \"iTerm.app\":\n if (!env.TERM_PROGRAM_VERSION || /^[0-2]\\./.test(env.TERM_PROGRAM_VERSION))\n return COLORS_256;\n return COLORS_16m;\n case \"HyperTerm\":\n case \"MacTerm\":\n return COLORS_16m;\n case \"Apple_Terminal\":\n return COLORS_256;\n }\n if (env.COLORTERM === \"truecolor\" || env.COLORTERM === \"24bit\")\n return COLORS_16m;\n if (env.TERM) {\n if (/^xterm-256/.test(env.TERM) !== null)\n return COLORS_256;\n const termEnv = env.TERM.toLowerCase();\n if (TERM_ENVS[termEnv])\n return TERM_ENVS[termEnv];\n if (TERM_ENVS_REG_EXP.some((term) => term.test(termEnv)))\n return COLORS_16;\n }\n if (env.COLORTERM)\n return COLORS_16;\n return COLORS_2;\n }, WriteStream.prototype.getWindowSize = function() {\n return [this.columns, this.rows];\n }, WriteStream.prototype.hasColors = function(count, env) {\n if (env === @undefined && (count === @undefined || typeof count === \"object\" && count !== null))\n env = count, count = 16;\n else\n validateInteger(count, \"count\", 2);\n return count <= 2 ** this.getColorDepth(env);\n }, WriteStream.prototype.moveCursor = function(dx, dy, cb) {\n return (readline \?\?= @getInternalField(@internalModuleRegistry, 35) || @createInternalModuleById(35)).moveCursor(this, dx, dy, cb);\n }, Real;\n },\n enumerable: !0,\n configurable: !0\n});\nvar validateInteger = (value, name, min = Number.MIN_SAFE_INTEGER, max = Number.MAX_SAFE_INTEGER) => {\n if (typeof value !== \"number\")\n throw new ERR_INVALID_ARG_TYPE(name, \"number\", value);\n if (!NumberIsInteger(value))\n throw new ERR_OUT_OF_RANGE(name, \"an integer\", value);\n if (value < min || value > max)\n throw new ERR_OUT_OF_RANGE(name, `>= ${min} && <= ${max}`, value);\n};\nreturn { ReadStream, WriteStream, isatty }})\n"_s; // // diff --git a/src/js/out/WebCoreJSBuiltins.cpp b/src/js/out/WebCoreJSBuiltins.cpp index 4940ed1f53..a60dfc281f 100644 --- a/src/js/out/WebCoreJSBuiltins.cpp +++ b/src/js/out/WebCoreJSBuiltins.cpp @@ -786,13 +786,21 @@ const int s_moduleMainCodeLength = 68; static const JSC::Intrinsic s_moduleMainCodeIntrinsic = JSC::NoIntrinsic; const char* const s_moduleMainCode = "(function () {\"use strict\";\n return @requireMap.@get(Bun.main);\n})\n"; +// overridableRequire +const JSC::ConstructAbility s_moduleOverridableRequireCodeConstructAbility = JSC::ConstructAbility::CannotConstruct; +const JSC::ConstructorKind s_moduleOverridableRequireCodeConstructorKind = JSC::ConstructorKind::None; +const JSC::ImplementationVisibility s_moduleOverridableRequireCodeImplementationVisibility = JSC::ImplementationVisibility::Public; +const int s_moduleOverridableRequireCodeLength = 888; +static const JSC::Intrinsic s_moduleOverridableRequireCodeIntrinsic = JSC::NoIntrinsic; +const char* const s_moduleOverridableRequireCode = "(function (id) {\"use strict\";\n const existing = @requireMap.@get(id) || @requireMap.@get(id = @resolveSync(id, this.path, !1));\n if (existing)\n return @evaluateCommonJSModule(existing), existing.exports;\n if (id.endsWith(\".node\"))\n return @internalRequire(id);\n const mod = @createCommonJSModule(id, {}, !1, this);\n @requireMap.@set(id, mod);\n var out = this.@require(id, mod);\n if (out === -1) {\n try {\n out = @requireESM(id);\n } catch (exception) {\n throw @requireMap.@delete(id), exception;\n }\n const esm = @Loader.registry.@get(id);\n if (esm\?.evaluated && (esm.state \?\? 0) >= @ModuleReady) {\n const namespace = @Loader.getModuleNamespaceObject(esm.module);\n return mod.exports = namespace.__esModule \? namespace : Object.create(namespace, { __esModule: { value: !0 } });\n }\n }\n return @evaluateCommonJSModule(mod), mod.exports;\n})\n"; + // require const JSC::ConstructAbility s_moduleRequireCodeConstructAbility = JSC::ConstructAbility::CannotConstruct; const JSC::ConstructorKind s_moduleRequireCodeConstructorKind = JSC::ConstructorKind::None; const JSC::ImplementationVisibility s_moduleRequireCodeImplementationVisibility = JSC::ImplementationVisibility::Public; -const int s_moduleRequireCodeLength = 888; +const int s_moduleRequireCodeLength = 79; static const JSC::Intrinsic s_moduleRequireCodeIntrinsic = JSC::NoIntrinsic; -const char* const s_moduleRequireCode = "(function (id) {\"use strict\";\n const existing = @requireMap.@get(id) || @requireMap.@get(id = @resolveSync(id, this.path, !1));\n if (existing)\n return @evaluateCommonJSModule(existing), existing.exports;\n if (id.endsWith(\".node\"))\n return @internalRequire(id);\n const mod = @createCommonJSModule(id, {}, !1, this);\n @requireMap.@set(id, mod);\n var out = this.@require(id, mod);\n if (out === -1) {\n try {\n out = @requireESM(id);\n } catch (exception) {\n throw @requireMap.@delete(id), exception;\n }\n const esm = @Loader.registry.@get(id);\n if (esm\?.evaluated && (esm.state \?\? 0) >= @ModuleReady) {\n const namespace = @Loader.getModuleNamespaceObject(esm.module);\n return mod.exports = namespace.__esModule \? namespace : Object.create(namespace, { __esModule: { value: !0 } });\n }\n }\n return @evaluateCommonJSModule(mod), mod.exports;\n})\n"; +const char* const s_moduleRequireCode = "(function (id) {\"use strict\";\n return @overridableRequire.@call(this, id);\n})\n"; // requireNativeModule const JSC::ConstructAbility s_moduleRequireNativeModuleCodeConstructAbility = JSC::ConstructAbility::CannotConstruct; @@ -824,9 +832,9 @@ WEBCORE_FOREACH_MODULE_BUILTIN_CODE(DEFINE_BUILTIN_GENERATOR) const JSC::ConstructAbility s_processObjectInternalsGetStdinStreamCodeConstructAbility = JSC::ConstructAbility::CannotConstruct; const JSC::ConstructorKind s_processObjectInternalsGetStdinStreamCodeConstructorKind = JSC::ConstructorKind::None; const JSC::ImplementationVisibility s_processObjectInternalsGetStdinStreamCodeImplementationVisibility = JSC::ImplementationVisibility::Public; -const int s_processObjectInternalsGetStdinStreamCodeLength = 1820; +const int s_processObjectInternalsGetStdinStreamCodeLength = 1945; static const JSC::Intrinsic s_processObjectInternalsGetStdinStreamCodeIntrinsic = JSC::NoIntrinsic; -const char* const s_processObjectInternalsGetStdinStreamCode = "(function (fd) {\"use strict\";\n var reader, readerRef;\n function ref() {\n reader \?\?= Bun.stdin.stream().getReader(), readerRef \?\?= setInterval(() => {\n }, 1 << 30);\n }\n function unref() {\n if (readerRef)\n clearInterval(readerRef), readerRef = @undefined;\n if (reader)\n reader.cancel(), reader = @undefined;\n }\n const stream = new ((@getInternalField(@internalModuleRegistry, 46)) || (@createInternalModuleById(46))).ReadStream(fd), originalOn = stream.on;\n stream.on = function(event, listener) {\n if (event === \"readable\")\n ref();\n return originalOn.call(this, event, listener);\n }, stream.fd = fd;\n const originalPause = stream.pause;\n stream.pause = function() {\n return unref(), originalPause.call(this);\n };\n const originalResume = stream.resume;\n stream.resume = function() {\n return ref(), originalResume.call(this);\n };\n async function internalRead(stream2) {\n try {\n var done, value;\n const read = reader\?.readMany();\n if (@isPromise(read))\n ({ done, value } = await read);\n else\n ({ done, value } = read);\n if (!done) {\n stream2.push(value[0]);\n const length = value.length;\n for (let i = 1;i < length; i++)\n stream2.push(value[i]);\n } else\n stream2.emit(\"end\"), stream2.pause();\n } catch (err) {\n stream2.destroy(err);\n }\n }\n return stream._read = function(size) {\n internalRead(this);\n }, stream.on(\"resume\", () => {\n ref(), stream._undestroy();\n }), stream._readableState.reading = !1, stream.on(\"pause\", () => {\n process.nextTick(() => {\n if (!stream.readableFlowing)\n stream._readableState.reading = !1;\n });\n }), stream.on(\"close\", () => {\n process.nextTick(() => {\n stream.destroy(), unref();\n });\n }), stream;\n})\n"; +const char* const s_processObjectInternalsGetStdinStreamCode = "(function (fd) {\"use strict\";\n var reader, readerRef;\n function ref() {\n reader \?\?= Bun.stdin.stream().getReader(), readerRef \?\?= setInterval(() => {\n }, 1 << 30);\n }\n function unref() {\n if (readerRef)\n clearInterval(readerRef), readerRef = @undefined;\n if (reader)\n reader.cancel(), reader = @undefined;\n }\n const tty = @getInternalField(@internalModuleRegistry, 46) || @createInternalModuleById(46), stream = new ((tty.isatty(fd)) \? tty.ReadStream : ((@getInternalField(@internalModuleRegistry, 21)) || (@createInternalModuleById(21))).ReadStream)(fd), originalOn = stream.on;\n stream.on = function(event, listener) {\n if (event === \"readable\")\n ref();\n return originalOn.call(this, event, listener);\n }, stream.fd = fd;\n const originalPause = stream.pause;\n stream.pause = function() {\n return unref(), originalPause.call(this);\n };\n const originalResume = stream.resume;\n stream.resume = function() {\n return ref(), originalResume.call(this);\n };\n async function internalRead(stream2) {\n try {\n var done, value;\n const read = reader\?.readMany();\n if (@isPromise(read))\n ({ done, value } = await read);\n else\n ({ done, value } = read);\n if (!done) {\n stream2.push(value[0]);\n const length = value.length;\n for (let i = 1;i < length; i++)\n stream2.push(value[i]);\n } else\n stream2.emit(\"end\"), stream2.pause();\n } catch (err) {\n stream2.destroy(err);\n }\n }\n return stream._read = function(size) {\n internalRead(this);\n }, stream.on(\"resume\", () => {\n ref(), stream._undestroy();\n }), stream._readableState.reading = !1, stream.on(\"pause\", () => {\n process.nextTick(() => {\n if (!stream.readableFlowing)\n stream._readableState.reading = !1;\n });\n }), stream.on(\"close\", () => {\n process.nextTick(() => {\n stream.destroy(), unref();\n });\n }), stream;\n})\n"; // getStdioWriteStream const JSC::ConstructAbility s_processObjectInternalsGetStdioWriteStreamCodeConstructAbility = JSC::ConstructAbility::CannotConstruct; diff --git a/src/js/out/WebCoreJSBuiltins.h b/src/js/out/WebCoreJSBuiltins.h index 70401c0884..3c6ade197b 100644 --- a/src/js/out/WebCoreJSBuiltins.h +++ b/src/js/out/WebCoreJSBuiltins.h @@ -1506,6 +1506,14 @@ extern const JSC::ConstructAbility s_moduleMainCodeConstructAbility; extern const JSC::ConstructorKind s_moduleMainCodeConstructorKind; extern const JSC::ImplementationVisibility s_moduleMainCodeImplementationVisibility; +// overridableRequire +#define WEBCORE_BUILTIN_MODULE_OVERRIDABLEREQUIRE 1 +extern const char* const s_moduleOverridableRequireCode; +extern const int s_moduleOverridableRequireCodeLength; +extern const JSC::ConstructAbility s_moduleOverridableRequireCodeConstructAbility; +extern const JSC::ConstructorKind s_moduleOverridableRequireCodeConstructorKind; +extern const JSC::ImplementationVisibility s_moduleOverridableRequireCodeImplementationVisibility; + // require #define WEBCORE_BUILTIN_MODULE_REQUIRE 1 extern const char* const s_moduleRequireCode; @@ -1532,18 +1540,21 @@ extern const JSC::ImplementationVisibility s_moduleRequireResolveCodeImplementat #define WEBCORE_FOREACH_MODULE_BUILTIN_DATA(macro) \ macro(main, moduleMain, 0) \ + macro(overridableRequire, moduleOverridableRequire, 1) \ macro(require, moduleRequire, 1) \ macro(requireNativeModule, moduleRequireNativeModule, 1) \ macro(requireResolve, moduleRequireResolve, 1) \ #define WEBCORE_FOREACH_MODULE_BUILTIN_CODE(macro) \ macro(moduleMainCode, main, "get main"_s, s_moduleMainCodeLength) \ + macro(moduleOverridableRequireCode, overridableRequire, ASCIILiteral(), s_moduleOverridableRequireCodeLength) \ macro(moduleRequireCode, require, ASCIILiteral(), s_moduleRequireCodeLength) \ macro(moduleRequireNativeModuleCode, requireNativeModule, ASCIILiteral(), s_moduleRequireNativeModuleCodeLength) \ macro(moduleRequireResolveCode, requireResolve, ASCIILiteral(), s_moduleRequireResolveCodeLength) \ #define WEBCORE_FOREACH_MODULE_BUILTIN_FUNCTION_NAME(macro) \ macro(main) \ + macro(overridableRequire) \ macro(require) \ macro(requireNativeModule) \ macro(requireResolve) \ diff --git a/src/js_ast.zig b/src/js_ast.zig index b9e34d279e..46c204e696 100644 --- a/src/js_ast.zig +++ b/src/js_ast.zig @@ -5994,6 +5994,7 @@ pub const Ast = struct { /// This is a list of named exports that may exist in a CommonJS module /// We use this with `commonjs_at_runtime` to re-export CommonJS commonjs_export_names: []string = &([_]string{}), + import_meta_ref: Ref = Ref.None, pub const CommonJSNamedExport = struct { loc_ref: LocRef, diff --git a/src/js_parser.zig b/src/js_parser.zig index 449d1cbabe..fce928a6e6 100644 --- a/src/js_parser.zig +++ b/src/js_parser.zig @@ -21241,42 +21241,50 @@ fn NewParser_( parts[parts.len - 1].stmts = new_stmts_list; }, - // This becomes + // This transforms the user's code into. // - // (function (module, exports, require) { + // (function (exports, require, module, __filename, __dirname) { + // ... + // }).call( + // this.module.exports, + // this.module.exports, + // this.require, + // this.module, + // this.__filename, + // this.__dirname, + // ); // - // })(module, exports, require); + // `this` is a `CommonJSFunctionArgumentsStructure` + // which is initialized in `evaluateCommonJSModuleOnce` .bun_js => { var args = allocator.alloc(Arg, 5) catch unreachable; args[0..5].* = .{ - Arg{ - .binding = p.b(B.Identifier{ .ref = p.module_ref }, logger.Loc.Empty), - }, - Arg{ - .binding = p.b(B.Identifier{ .ref = p.exports_ref }, logger.Loc.Empty), - }, - Arg{ - .binding = p.b(B.Identifier{ .ref = p.require_ref }, logger.Loc.Empty), - }, - Arg{ - .binding = p.b(B.Identifier{ .ref = p.dirname_ref }, logger.Loc.Empty), - }, - Arg{ - .binding = p.b(B.Identifier{ .ref = p.filename_ref }, logger.Loc.Empty), - }, + Arg{ .binding = p.b(B.Identifier{ .ref = p.exports_ref }, logger.Loc.Empty) }, + Arg{ .binding = p.b(B.Identifier{ .ref = p.require_ref }, logger.Loc.Empty) }, + Arg{ .binding = p.b(B.Identifier{ .ref = p.module_ref }, logger.Loc.Empty) }, + Arg{ .binding = p.b(B.Identifier{ .ref = p.filename_ref }, logger.Loc.Empty) }, + Arg{ .binding = p.b(B.Identifier{ .ref = p.dirname_ref }, logger.Loc.Empty) }, }; + + const cjsArguments = Expr{ + .data = .{ .e_this = .{} }, + .loc = logger.Loc.Empty, + }; + var total_stmts_count: usize = 0; for (parts) |part| { total_stmts_count += part.stmts.len; } var stmts_to_copy = allocator.alloc(Stmt, total_stmts_count) catch unreachable; - var remaining_stmts = stmts_to_copy; - for (parts) |part| { - for (part.stmts, remaining_stmts[0..part.stmts.len]) |src, *dest| { - dest.* = src; + { + var remaining_stmts = stmts_to_copy; + for (parts) |part| { + for (part.stmts, remaining_stmts[0..part.stmts.len]) |src, *dest| { + dest.* = src; + } + remaining_stmts = remaining_stmts[part.stmts.len..]; } - remaining_stmts = remaining_stmts[part.stmts.len..]; } const wrapper = p.newExpr( @@ -21284,147 +21292,57 @@ fn NewParser_( .func = G.Fn{ .name = null, .open_parens_loc = logger.Loc.Empty, - .args = args, + .args = args[0..5], .body = .{ .loc = logger.Loc.Empty, .stmts = stmts_to_copy }, .flags = Flags.Function.init(.{ .is_export = false }), }, }, logger.Loc.Empty, ); - const cjsGlobal = p.newSymbol(.unbound, "$_BunCommonJSModule_$") catch unreachable; - var all_call_args = allocator.alloc(Expr, 8) catch unreachable; + const this_module = p.newExpr( E.Dot{ .name = "module", - .target = p.newExpr(E.Identifier{ .ref = cjsGlobal }, logger.Loc.Empty), + .target = cjsArguments, .name_loc = logger.Loc.Empty, }, logger.Loc.Empty, ); - var bind_args = all_call_args[0..1]; - bind_args[0] = this_module; - var bind_resolve_args = all_call_args[1..2]; - var call_args = all_call_args[2..]; - - const module_id = p.newExpr(E.Dot{ - .name = "id", - .target = this_module, - .name_loc = logger.Loc.Empty, - }, logger.Loc.Empty); - - bind_resolve_args[0] = module_id; - const get_require = p.newExpr( + const module_exports = p.newExpr( E.Dot{ - .name = "require", + .name = "exports", .target = this_module, .name_loc = logger.Loc.Empty, }, logger.Loc.Empty, ); - const create_binding = p.newExpr( - E.Call{ - .target = p.newExpr(E.Dot{ - .name = "bind", - .name_loc = logger.Loc.Empty, - .target = get_require, - }, logger.Loc.Empty), - .args = bun.BabyList(Expr).init(bind_args), - }, - logger.Loc.Empty, - ); - - const get_resolve = p.newExpr(E.Dot{ - .name = "resolve", - .name_loc = logger.Loc.Empty, - .target = get_require, - }, logger.Loc.Empty); - - const create_resolve_binding = p.newExpr( - E.Call{ - .target = p.newExpr(E.Dot{ - .name = "bind", - .name_loc = logger.Loc.Empty, - .target = get_resolve, - }, logger.Loc.Empty), - .args = bun.BabyList(Expr).init(bind_resolve_args), - }, - logger.Loc.Empty, - ); - - const require_path = p.newExpr( - E.Dot{ - .name = "path", - .target = get_require, - .name_loc = logger.Loc.Empty, - }, - logger.Loc.Empty, - ); - const assign_binding = p.newExpr( - E.Binary{ - .left = get_require, - .right = create_binding, - .op = .bin_assign, - }, - logger.Loc.Empty, - ); - - const assign_resolve_binding = p.newExpr( - E.Binary{ - .left = get_resolve, - .right = create_resolve_binding, - .op = .bin_assign, - }, - logger.Loc.Empty, - ); - - const assign_id = p.newExpr(E.Binary{ - .left = require_path, - .right = module_id, - .op = .bin_assign, - }, logger.Loc.Empty); - - var create_require = [4]Expr{ - assign_binding, - assign_id, - assign_resolve_binding, - get_require, - }; - - // - // (function(module, exports, require, __dirname, __filename) {}).call(this.exports, this.module, this.exports, this.module.require = this.module.require.bind(module), (this.module.require.id = this.module.id, this.module.require), __dirname, __filename) + var call_args = allocator.alloc(Expr, 6) catch unreachable; call_args[0..6].* = .{ + module_exports, // this.module.exports (this value inside fn) + module_exports, // this.module.exports (arg 1) p.newExpr( E.Dot{ - .name = "exports", - .target = this_module, - .name_loc = logger.Loc.Empty, - }, - logger.Loc.Empty, - ), - this_module, - p.newExpr( - E.Dot{ - .name = "exports", - .target = this_module, - .name_loc = logger.Loc.Empty, - }, - logger.Loc.Empty, - ), - Expr.joinAllWithComma(&create_require, p.allocator), - p.newExpr( - E.Dot{ - .name = "__dirname", - .target = p.newExpr(E.Identifier{ .ref = cjsGlobal }, logger.Loc.Empty), + .name = "require", + .target = cjsArguments, .name_loc = logger.Loc.Empty, }, logger.Loc.Empty, ), + this_module, // this.module p.newExpr( E.Dot{ .name = "__filename", - .target = p.newExpr(E.Identifier{ .ref = cjsGlobal }, logger.Loc.Empty), + .target = cjsArguments, + .name_loc = logger.Loc.Empty, + }, + logger.Loc.Empty, + ), + p.newExpr( + E.Dot{ + .name = "__dirname", + .target = cjsArguments, .name_loc = logger.Loc.Empty, }, logger.Loc.Empty, @@ -21446,14 +21364,50 @@ fn NewParser_( logger.Loc.Empty, ); - var only_stmt = try p.allocator.alloc(Stmt, 1); - only_stmt[0] = p.s( + var top_level_stmts = p.allocator.alloc(Stmt, 1 + @as(usize, @intFromBool(p.has_import_meta))) catch unreachable; + parts[0].stmts = top_level_stmts; + + // var $Bun_import_meta = this.createImportMeta(this.filename); + if (p.has_import_meta) { + p.import_meta_ref = p.newSymbol(.other, "$Bun_import_meta") catch unreachable; + var decl = allocator.alloc(Decl, 1) catch unreachable; + decl[0] = Decl{ + .binding = Binding.alloc( + p.allocator, + B.Identifier{ + .ref = p.import_meta_ref, + }, + logger.Loc.Empty, + ), + .value = p.newExpr( + E.Call{ + .target = p.newExpr(E.Dot{ + .target = cjsArguments, + .name = "createImportMeta", + .name_loc = logger.Loc.Empty, + }, logger.Loc.Empty), + // reuse the `this.__filename` argument + .args = ExprNodeList.init(call_args[5..6]), + }, + logger.Loc.Empty, + ), + }; + + top_level_stmts[0] = p.s( + S.Local{ + .decls = G.Decl.List.init(decl), + .kind = .k_var, + }, + logger.Loc.Empty, + ); + top_level_stmts = top_level_stmts[1..]; + } + top_level_stmts[0] = p.s( S.SExpr{ .value = call, }, logger.Loc.Empty, ); - parts[0].stmts = only_stmt; parts.len = 1; }, @@ -21984,6 +21938,8 @@ fn NewParser_( // TODO: // .const_values = p.const_values, + + .import_meta_ref = p.import_meta_ref, }; } diff --git a/src/js_printer.zig b/src/js_printer.zig index 15f5218ae8..8202eac80a 100644 --- a/src/js_printer.zig +++ b/src/js_printer.zig @@ -482,6 +482,7 @@ pub const Options = struct { to_commonjs_ref: Ref = Ref.None, to_esm_ref: Ref = Ref.None, require_ref: ?Ref = null, + import_meta_ref: Ref = Ref.None, indent: usize = 0, externals: []u32 = &[_]u32{}, runtime_imports: runtime.Runtime.Imports = runtime.Runtime.Imports{}, @@ -2051,7 +2052,20 @@ fn NewPrinter( .e_import_meta => { p.printSpaceBeforeIdentifier(); p.addSourceMapping(expr.loc); - p.print("import.meta"); + if (!p.options.import_meta_ref.isValid()) { + // Most of the time, leave it in there + p.print("import.meta"); + } else { + // Note: The bundler will not hit this code path. The bundler will replace + // the ImportMeta AST node with a regular Identifier AST node. + // + // This is currently only used in Bun's runtime for CommonJS modules + // referencing import.meta + if (comptime Environment.allow_assert) + std.debug.assert(p.options.module_type == .cjs); + + p.printSymbol(p.options.import_meta_ref); + } }, .e_commonjs_export_identifier => |id| { p.printSpaceBeforeIdentifier(); diff --git a/src/string.zig b/src/string.zig index 7928ad97b8..1305e5884d 100644 --- a/src/string.zig +++ b/src/string.zig @@ -855,17 +855,17 @@ pub const SliceWithUnderlyingString = struct { underlying: String, pub fn toThreadSafe(this: *SliceWithUnderlyingString) void { - std.debug.assert(this.underlying.tag == .WTFStringImpl); + if (this.underlying.tag == .WTFStringImpl) { + var orig = this.underlying.value.WTFStringImpl; + this.underlying.toThreadSafe(); + if (this.underlying.value.WTFStringImpl != orig) { + orig.deref(); - var orig = this.underlying.value.WTFStringImpl; - this.underlying.toThreadSafe(); - if (this.underlying.value.WTFStringImpl != orig) { - orig.deref(); - - if (this.utf8.allocator.get()) |allocator| { - if (String.isWTFAllocator(allocator)) { - this.utf8.deinit(); - this.utf8 = this.underlying.toUTF8(bun.default_allocator); + if (this.utf8.allocator.get()) |allocator| { + if (String.isWTFAllocator(allocator)) { + this.utf8.deinit(); + this.utf8 = this.underlying.toUTF8(bun.default_allocator); + } } } } diff --git a/test/.gitignore b/test/.gitignore deleted file mode 100644 index 60f986255f..0000000000 --- a/test/.gitignore +++ /dev/null @@ -1 +0,0 @@ -bun.lockb diff --git a/test/README.md b/test/README.md deleted file mode 100644 index 03f9c97af2..0000000000 --- a/test/README.md +++ /dev/null @@ -1,83 +0,0 @@ -# Tests - -## Finding tests - -Tests are located in the [`test/`](test/) directory and are organized using the following structure: - -* `test/` - * `js/` - tests for JavaScript APIs. - * `cli/` - tests for commands, configs, and stdout. - * `bundler/` - tests for the transpiler/bundler. - * `regression/` - tests that reproduce a specific issue. - * `harness.ts` - utility functions that can be imported from any test. - -The tests in [`test/js/`](test/js/) directory are further categorized by the type of API. - -* `test/js/` - * `bun/` - tests for `Bun`-specific APIs. - * `node/` - tests for Node.js APIs. - * `web/` - tests for Web APIs, like `fetch()`. - * `first_party/` - tests for npm packages that are built-in, like `undici`. - * `third_party/` - tests for npm packages that are not built-in, but are popular, like `esbuild`. - -## Running tests - -To run a test, use Bun's built-in test command: `bun test`. - -```sh -bun test # Run all tests -bun test js/bun # Only run tests in a directory -bun test sqlite.test.ts # Only run a specific test -``` - -If you encounter lots of errors, try running `bun install`, then trying again. - -## Writing tests - -Tests are written in TypeScript (preferred) or JavaScript using Jest's `describe()`, `test()`, and `expect()` APIs. - -```ts -import { describe, test, expect } from "bun:test"; -import { gcTick } from "harness"; - -describe("TextEncoder", () => { - test("can encode a string", async () => { - const encoder = new TextEncoder(); - const actual = encoder.encode("bun"); - await gcTick(); - expect(actual).toBe(new Uint8Array([0x62, 0x75, 0x6E])); - }); -}); -``` - -If you are fixing a bug that was reported from a GitHub issue, remember to add a test in the `test/regression/` directory. - -```ts -// test/regression/issue/02005.test.ts - -import { it, expect } from "bun:test"; - -it("regex literal should work with non-latin1", () => { - const text = "这是一段要替换的文字"; - expect(text.replace(new RegExp("要替换"), "")).toBe("这是一段的文字"); - expect(text.replace(/要替换/, "")).toBe("这是一段的文字"); -}); -``` - -In the future, a bot will automatically close or re-open issues when a regression is detected or resolved. - -## Zig tests - -These tests live in various `.zig` files throughout Bun's codebase, leveraging Zig's builtin `test` keyword. - -Currently, they're not run automatically nor is there a simple way to run all of them. We will make this better soon. - -## TypeScript - -Test files should be written in TypeScript. The types in `packages/bun-types` should be updated to support all new APIs. Changes to the `.d.ts` files in `packages/bun-types` will be immediately reflected in test files; no build step is necessary. - -Writing a test will often require using invalid syntax, e.g. when checking for errors when an invalid input is passed to a function. TypeScript provides a number of escape hatches here. - -- `// @ts-expect-error` - This should be your first choice. It tells TypeScript that the next line *should* fail typechecking. -- `// @ts-ignore` - Ignore the next line entirely. -- `// @ts-nocheck` - Put this at the top of the file to disable typechecking on the entire file. Useful for autogenerated test files, or when ignoring/disabling type checks an a per-line basis is too onerous. diff --git a/test/bun.lockb b/test/bun.lockb index b68c3f55035798b515ef8e12c9aed051406505e1..13d6e0866b73f1629353ad917f6f4cb64c4078b0 100755 GIT binary patch delta 25124 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 delta 21578 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 literal 0 HcmV?d00001 diff --git a/test/integration/next/default-pages-dir/next.config.js b/test/integration/next/default-pages-dir/next.config.js new file mode 100644 index 0000000000..5a35883f4a --- /dev/null +++ b/test/integration/next/default-pages-dir/next.config.js @@ -0,0 +1,10 @@ +/** @type {import('next').NextConfig} */ +const nextConfig = { + reactStrictMode: true, + generateBuildId: async () => { + // You can, for example, get the latest git commit hash here + return "bun!"; + }, +}; + +module.exports = nextConfig; diff --git a/test/integration/next/default-pages-dir/package.json b/test/integration/next/default-pages-dir/package.json new file mode 100644 index 0000000000..b3f1d36167 --- /dev/null +++ b/test/integration/next/default-pages-dir/package.json @@ -0,0 +1,28 @@ +{ + "name": "default-create-template", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint", + "postinstall": "cd node_modules/puppeteer && bun install.mjs" + }, + "dependencies": { + "@types/node": "20.7.0", + "@types/react": "18.2.22", + "@types/react-dom": "18.2.7", + "autoprefixer": "10.4.16", + "bun-types": "^1.0.3", + "eslint": "8.50.0", + "eslint-config-next": "13.5.3", + "next": "13.5.3", + "postcss": "8.4.30", + "puppeteer": "21.3.4", + "react": "18.2.0", + "react-dom": "18.2.0", + "tailwindcss": "3.3.3", + "typescript": "5.2.2" + } +} diff --git a/test/integration/next/default-pages-dir/postcss.config.js b/test/integration/next/default-pages-dir/postcss.config.js new file mode 100644 index 0000000000..12a703d900 --- /dev/null +++ b/test/integration/next/default-pages-dir/postcss.config.js @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +}; diff --git a/test/integration/next/default-pages-dir/public/favicon.ico b/test/integration/next/default-pages-dir/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..718d6fea4835ec2d246af9800eddb7ffb276240c GIT binary patch literal 25931 zcmeHv30#a{`}aL_*G&7qml|y<+KVaDM2m#dVr!KsA!#An?kSQM(q<_dDNCpjEux83 zLb9Z^XxbDl(w>%i@8hT6>)&Gu{h#Oeyszu?xtw#Zb1mO{pgX9699l+Qppw7jXaYf~-84xW z)w4x8?=youko|}Vr~(D$UXIbiXABHh`p1?nn8Po~fxRJv}|0e(BPs|G`(TT%kKVJAdg5*Z|x0leQq0 zkdUBvb#>9F()jo|T~kx@OM8$9wzs~t2l;K=woNssA3l6|sx2r3+kdfVW@e^8e*E}v zA1y5{bRi+3Z`uD3{F7LgFJDdvm;nJilkzDku>BwXH(8ItVCXk*-lSJnR?-2UN%hJ){&rlvg`CDTj z)Bzo!3v7Ou#83zEDEFcKt(f1E0~=rqeEbTnMvWR#{+9pg%7G8y>u1OVRUSoox-ovF z2Ydma(;=YuBY(eI|04{hXzZD6_f(v~H;C~y5=DhAC{MMS>2fm~1H_t2$56pc$NH8( z5bH|<)71dV-_oCHIrzrT`2s-5w_+2CM0$95I6X8p^r!gHp+j_gd;9O<1~CEQQGS8) zS9Qh3#p&JM-G8rHekNmKVewU;pJRcTAog68KYo^dRo}(M>36U4Us zfgYWSiHZL3;lpWT=zNAW>Dh#mB!_@Lg%$ms8N-;aPqMn+C2HqZgz&9~Eu z4|Kp<`$q)Uw1R?y(~S>ePdonHxpV1#eSP1B;Ogo+-Pk}6#0GsZZ5!||ev2MGdh}_m z{DeR7?0-1^zVs&`AV6Vt;r3`I`OI_wgs*w=eO%_#7Kepl{B@xiyCANc(l zzIyd4y|c6PXWq9-|KM8(zIk8LPk(>a)zyFWjhT!$HJ$qX1vo@d25W<fvZQ2zUz5WRc(UnFMKHwe1| zWmlB1qdbiA(C0jmnV<}GfbKtmcu^2*P^O?MBLZKt|As~ge8&AAO~2K@zbXelK|4T<{|y4`raF{=72kC2Kn(L4YyenWgrPiv z@^mr$t{#X5VuIMeL!7Ab6_kG$&#&5p*Z{+?5U|TZ`B!7llpVmp@skYz&n^8QfPJzL z0G6K_OJM9x+Wu2gfN45phANGt{7=C>i34CV{Xqlx(fWpeAoj^N0Biu`w+MVcCUyU* zDZuzO0>4Z6fbu^T_arWW5n!E45vX8N=bxTVeFoep_G#VmNlQzAI_KTIc{6>c+04vr zx@W}zE5JNSU>!THJ{J=cqjz+4{L4A{Ob9$ZJ*S1?Ggg3klFp!+Y1@K+pK1DqI|_gq z5ZDXVpge8-cs!o|;K73#YXZ3AShj50wBvuq3NTOZ`M&qtjj#GOFfgExjg8Gn8>Vq5 z`85n+9|!iLCZF5$HJ$Iu($dm?8~-ofu}tEc+-pyke=3!im#6pk_Wo8IA|fJwD&~~F zc16osQ)EBo58U7XDuMexaPRjU@h8tXe%S{fA0NH3vGJFhuyyO!Uyl2^&EOpX{9As0 zWj+P>{@}jxH)8|r;2HdupP!vie{sJ28b&bo!8`D^x}TE$%zXNb^X1p@0PJ86`dZyj z%ce7*{^oo+6%&~I!8hQy-vQ7E)0t0ybH4l%KltWOo~8cO`T=157JqL(oq_rC%ea&4 z2NcTJe-HgFjNg-gZ$6!Y`SMHrlj}Etf7?r!zQTPPSv}{so2e>Fjs1{gzk~LGeesX%r(Lh6rbhSo_n)@@G-FTQy93;l#E)hgP@d_SGvyCp0~o(Y;Ee8{ zdVUDbHm5`2taPUOY^MAGOw*>=s7=Gst=D+p+2yON!0%Hk` zz5mAhyT4lS*T3LS^WSxUy86q&GnoHxzQ6vm8)VS}_zuqG?+3td68_x;etQAdu@sc6 zQJ&5|4(I?~3d-QOAODHpZ=hlSg(lBZ!JZWCtHHSj`0Wh93-Uk)_S%zsJ~aD>{`A0~ z9{AG(e|q3g5B%wYKRxiL2Y$8(4w6bzchKuloQW#e&S3n+P- z8!ds-%f;TJ1>)v)##>gd{PdS2Oc3VaR`fr=`O8QIO(6(N!A?pr5C#6fc~Ge@N%Vvu zaoAX2&(a6eWy_q&UwOhU)|P3J0Qc%OdhzW=F4D|pt0E4osw;%<%Dn58hAWD^XnZD= z>9~H(3bmLtxpF?a7su6J7M*x1By7YSUbxGi)Ot0P77`}P3{)&5Un{KD?`-e?r21!4vTTnN(4Y6Lin?UkSM z`MXCTC1@4A4~mvz%Rh2&EwY))LeoT=*`tMoqcEXI>TZU9WTP#l?uFv+@Dn~b(>xh2 z;>B?;Tz2SR&KVb>vGiBSB`@U7VIWFSo=LDSb9F{GF^DbmWAfpms8Sx9OX4CnBJca3 zlj9(x!dIjN?OG1X4l*imJNvRCk}F%!?SOfiOq5y^mZW)jFL@a|r-@d#f7 z2gmU8L3IZq0ynIws=}~m^#@&C%J6QFo~Mo4V`>v7MI-_!EBMMtb%_M&kvAaN)@ZVw z+`toz&WG#HkWDjnZE!6nk{e-oFdL^$YnbOCN}JC&{$#$O27@|Tn-skXr)2ml2~O!5 zX+gYoxhoc7qoU?C^3~&!U?kRFtnSEecWuH0B0OvLodgUAi}8p1 zrO6RSXHH}DMc$&|?D004DiOVMHV8kXCP@7NKB zgaZq^^O<7PoKEp72kby@W0Z!Y*Ay{&vfg#C&gG@YVR9g?FEocMUi1gSN$+V+ayF45{a zuDZDTN}mS|;BO%gEf}pjBfN2-gIrU#G5~cucA;dokXW89%>AyXJJI z9X4UlIWA|ZYHgbI z5?oFk@A=Ik7lrEQPDH!H+b`7_Y~aDb_qa=B2^Y&Ow41cU=4WDd40dp5(QS-WMN-=Y z9g;6_-JdNU;|6cPwf$ak*aJIcwL@1n$#l~zi{c{EW?T;DaW*E8DYq?Umtz{nJ&w-M zEMyTDrC&9K$d|kZe2#ws6)L=7K+{ zQw{XnV6UC$6-rW0emqm8wJoeZK)wJIcV?dST}Z;G0Arq{dVDu0&4kd%N!3F1*;*pW zR&qUiFzK=@44#QGw7k1`3t_d8&*kBV->O##t|tonFc2YWrL7_eqg+=+k;!F-`^b8> z#KWCE8%u4k@EprxqiV$VmmtiWxDLgnGu$Vs<8rppV5EajBXL4nyyZM$SWVm!wnCj-B!Wjqj5-5dNXukI2$$|Bu3Lrw}z65Lc=1G z^-#WuQOj$hwNGG?*CM_TO8Bg-1+qc>J7k5c51U8g?ZU5n?HYor;~JIjoWH-G>AoUP ztrWWLbRNqIjW#RT*WqZgPJXU7C)VaW5}MiijYbABmzoru6EmQ*N8cVK7a3|aOB#O& zBl8JY2WKfmj;h#Q!pN%9o@VNLv{OUL?rixHwOZuvX7{IJ{(EdPpuVFoQqIOa7giLVkBOKL@^smUA!tZ1CKRK}#SSM)iQHk)*R~?M!qkCruaS!#oIL1c z?J;U~&FfH#*98^G?i}pA{ z9Jg36t4=%6mhY(quYq*vSxptes9qy|7xSlH?G=S@>u>Ebe;|LVhs~@+06N<4CViBk zUiY$thvX;>Tby6z9Y1edAMQaiH zm^r3v#$Q#2T=X>bsY#D%s!bhs^M9PMAcHbCc0FMHV{u-dwlL;a1eJ63v5U*?Q_8JO zT#50!RD619#j_Uf))0ooADz~*9&lN!bBDRUgE>Vud-i5ck%vT=r^yD*^?Mp@Q^v+V zG#-?gKlr}Eeqifb{|So?HM&g91P8|av8hQoCmQXkd?7wIJwb z_^v8bbg`SAn{I*4bH$u(RZ6*xUhuA~hc=8czK8SHEKTzSxgbwi~9(OqJB&gwb^l4+m`k*Q;_?>Y-APi1{k zAHQ)P)G)f|AyjSgcCFps)Fh6Bca*Xznq36!pV6Az&m{O8$wGFD? zY&O*3*J0;_EqM#jh6^gMQKpXV?#1?>$ml1xvh8nSN>-?H=V;nJIwB07YX$e6vLxH( zqYwQ>qxwR(i4f)DLd)-$P>T-no_c!LsN@)8`e;W@)-Hj0>nJ-}Kla4-ZdPJzI&Mce zv)V_j;(3ERN3_@I$N<^|4Lf`B;8n+bX@bHbcZTopEmDI*Jfl)-pFDvo6svPRoo@(x z);_{lY<;);XzT`dBFpRmGrr}z5u1=pC^S-{ce6iXQlLGcItwJ^mZx{m$&DA_oEZ)B{_bYPq-HA zcH8WGoBG(aBU_j)vEy+_71T34@4dmSg!|M8Vf92Zj6WH7Q7t#OHQqWgFE3ARt+%!T z?oLovLVlnf?2c7pTc)~cc^($_8nyKwsN`RA-23ed3sdj(ys%pjjM+9JrctL;dy8a( z@en&CQmnV(()bu|Y%G1-4a(6x{aLytn$T-;(&{QIJB9vMox11U-1HpD@d(QkaJdEb zG{)+6Dos_L+O3NpWo^=gR?evp|CqEG?L&Ut#D*KLaRFOgOEK(Kq1@!EGcTfo+%A&I z=dLbB+d$u{sh?u)xP{PF8L%;YPPW53+@{>5W=Jt#wQpN;0_HYdw1{ksf_XhO4#2F= zyPx6Lx2<92L-;L5PD`zn6zwIH`Jk($?Qw({erA$^bC;q33hv!d!>%wRhj# zal^hk+WGNg;rJtb-EB(?czvOM=H7dl=vblBwAv>}%1@{}mnpUznfq1cE^sgsL0*4I zJ##!*B?=vI_OEVis5o+_IwMIRrpQyT_Sq~ZU%oY7c5JMIADzpD!Upz9h@iWg_>>~j zOLS;wp^i$-E?4<_cp?RiS%Rd?i;f*mOz=~(&3lo<=@(nR!_Rqiprh@weZlL!t#NCc zO!QTcInq|%#>OVgobj{~ixEUec`E25zJ~*DofsQdzIa@5^nOXj2T;8O`l--(QyU^$t?TGY^7#&FQ+2SS3B#qK*k3`ye?8jUYSajE5iBbJls75CCc(m3dk{t?- zopcER9{Z?TC)mk~gpi^kbbu>b-+a{m#8-y2^p$ka4n60w;Sc2}HMf<8JUvhCL0B&Btk)T`ctE$*qNW8L$`7!r^9T+>=<=2qaq-;ll2{`{Rg zc5a0ZUI$oG&j-qVOuKa=*v4aY#IsoM+1|c4Z)<}lEDvy;5huB@1RJPquU2U*U-;gu z=En2m+qjBzR#DEJDO`WU)hdd{Vj%^0V*KoyZ|5lzV87&g_j~NCjwv0uQVqXOb*QrQ zy|Qn`hxx(58c70$E;L(X0uZZ72M1!6oeg)(cdKO ze0gDaTz+ohR-#d)NbAH4x{I(21yjwvBQfmpLu$)|m{XolbgF!pmsqJ#D}(ylp6uC> z{bqtcI#hT#HW=wl7>p!38sKsJ`r8}lt-q%Keqy%u(xk=yiIJiUw6|5IvkS+#?JTBl z8H5(Q?l#wzazujH!8o>1xtn8#_w+397*_cy8!pQGP%K(Ga3pAjsaTbbXJlQF_+m+-UpUUent@xM zg%jqLUExj~o^vQ3Gl*>wh=_gOr2*|U64_iXb+-111aH}$TjeajM+I20xw(((>fej-@CIz4S1pi$(#}P7`4({6QS2CaQS4NPENDp>sAqD z$bH4KGzXGffkJ7R>V>)>tC)uax{UsN*dbeNC*v}#8Y#OWYwL4t$ePR?VTyIs!wea+ z5Urmc)X|^`MG~*dS6pGSbU+gPJoq*^a=_>$n4|P^w$sMBBy@f*Z^Jg6?n5?oId6f{ z$LW4M|4m502z0t7g<#Bx%X;9<=)smFolV&(V^(7Cv2-sxbxopQ!)*#ZRhTBpx1)Fc zNm1T%bONzv6@#|dz(w02AH8OXe>kQ#1FMCzO}2J_mST)+ExmBr9cva-@?;wnmWMOk z{3_~EX_xadgJGv&H@zK_8{(x84`}+c?oSBX*Ge3VdfTt&F}yCpFP?CpW+BE^cWY0^ zb&uBN!Ja3UzYHK-CTyA5=L zEMW{l3Usky#ly=7px648W31UNV@K)&Ub&zP1c7%)`{);I4b0Q<)B}3;NMG2JH=X$U zfIW4)4n9ZM`-yRj67I)YSLDK)qfUJ_ij}a#aZN~9EXrh8eZY2&=uY%2N0UFF7<~%M zsB8=erOWZ>Ct_#^tHZ|*q`H;A)5;ycw*IcmVxi8_0Xk}aJA^ath+E;xg!x+As(M#0=)3!NJR6H&9+zd#iP(m0PIW8$ z1Y^VX`>jm`W!=WpF*{ioM?C9`yOR>@0q=u7o>BP-eSHqCgMDj!2anwH?s%i2p+Q7D zzszIf5XJpE)IG4;d_(La-xenmF(tgAxK`Y4sQ}BSJEPs6N_U2vI{8=0C_F?@7<(G; zo$~G=8p+076G;`}>{MQ>t>7cm=zGtfbdDXm6||jUU|?X?CaE?(<6bKDYKeHlz}DA8 zXT={X=yp_R;HfJ9h%?eWvQ!dRgz&Su*JfNt!Wu>|XfU&68iRikRrHRW|ZxzRR^`eIGt zIeiDgVS>IeExKVRWW8-=A=yA`}`)ZkWBrZD`hpWIxBGkh&f#ijr449~m`j6{4jiJ*C!oVA8ZC?$1RM#K(_b zL9TW)kN*Y4%^-qPpMP7d4)o?Nk#>aoYHT(*g)qmRUb?**F@pnNiy6Fv9rEiUqD(^O zzyS?nBrX63BTRYduaG(0VVG2yJRe%o&rVrLjbxTaAFTd8s;<<@Qs>u(<193R8>}2_ zuwp{7;H2a*X7_jryzriZXMg?bTuegABb^87@SsKkr2)0Gyiax8KQWstw^v#ix45EVrcEhr>!NMhprl$InQMzjSFH54x5k9qHc`@9uKQzvL4ihcq{^B zPrVR=o_ic%Y>6&rMN)hTZsI7I<3&`#(nl+3y3ys9A~&^=4?PL&nd8)`OfG#n zwAMN$1&>K++c{^|7<4P=2y(B{jJsQ0a#U;HTo4ZmWZYvI{+s;Td{Yzem%0*k#)vjpB zia;J&>}ICate44SFYY3vEelqStQWFihx%^vQ@Do(sOy7yR2@WNv7Y9I^yL=nZr3mb zXKV5t@=?-Sk|b{XMhA7ZGB@2hqsx}4xwCW!in#C zI@}scZlr3-NFJ@NFaJlhyfcw{k^vvtGl`N9xSo**rDW4S}i zM9{fMPWo%4wYDG~BZ18BD+}h|GQKc-g^{++3MY>}W_uq7jGHx{mwE9fZiPCoxN$+7 zrODGGJrOkcPQUB(FD5aoS4g~7#6NR^ma7-!>mHuJfY5kTe6PpNNKC9GGRiu^L31uG z$7v`*JknQHsYB!Tm_W{a32TM099djW%5e+j0Ve_ct}IM>XLF1Ap+YvcrLV=|CKo6S zb+9Nl3_YdKP6%Cxy@6TxZ>;4&nTneadr z_ES90ydCev)LV!dN=#(*f}|ZORFdvkYBni^aLbUk>BajeWIOcmHP#8S)*2U~QKI%S zyrLmtPqb&TphJ;>yAxri#;{uyk`JJqODDw%(Z=2`1uc}br^V%>j!gS)D*q*f_-qf8&D;W1dJgQMlaH5er zN2U<%Smb7==vE}dDI8K7cKz!vs^73o9f>2sgiTzWcwY|BMYHH5%Vn7#kiw&eItCqa zIkR2~Q}>X=Ar8W|^Ms41Fm8o6IB2_j60eOeBB1Br!boW7JnoeX6Gs)?7rW0^5psc- zjS16yb>dFn>KPOF;imD}e!enuIniFzv}n$m2#gCCv4jM#ArwlzZ$7@9&XkFxZ4n!V zj3dyiwW4Ki2QG{@i>yuZXQizw_OkZI^-3otXC{!(lUpJF33gI60ak;Uqitp74|B6I zgg{b=Iz}WkhCGj1M=hu4#Aw173YxIVbISaoc z-nLZC*6Tgivd5V`K%GxhBsp@SUU60-rfc$=wb>zdJzXS&-5(NRRodFk;Kxk!S(O(a0e7oY=E( zAyS;Ow?6Q&XA+cnkCb{28_1N8H#?J!*$MmIwLq^*T_9-z^&UE@A(z9oGYtFy6EZef LrJugUA?W`A8`#=m literal 0 HcmV?d00001 diff --git a/test/integration/next/default-pages-dir/public/next.svg b/test/integration/next/default-pages-dir/public/next.svg new file mode 100644 index 0000000000..5174b28c56 --- /dev/null +++ b/test/integration/next/default-pages-dir/public/next.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/test/integration/next/default-pages-dir/public/vercel.svg b/test/integration/next/default-pages-dir/public/vercel.svg new file mode 100644 index 0000000000..d2f8422273 --- /dev/null +++ b/test/integration/next/default-pages-dir/public/vercel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/test/integration/next/default-pages-dir/src/Counter1.txt b/test/integration/next/default-pages-dir/src/Counter1.txt new file mode 100644 index 0000000000..3973e0125a --- /dev/null +++ b/test/integration/next/default-pages-dir/src/Counter1.txt @@ -0,0 +1,27 @@ +import { useState } from "react"; + +export function Counter() { + console.log('counter a'); + + const [count, setCount] = useState(0); + + function increment() { + setCount(count + 1); + } + + function decrement() { + setCount(count - 1); + } + + return ( +
+

Count A: {count}

+ + +
+ ); +} diff --git a/test/integration/next/default-pages-dir/src/Counter2.txt b/test/integration/next/default-pages-dir/src/Counter2.txt new file mode 100644 index 0000000000..67541a78ba --- /dev/null +++ b/test/integration/next/default-pages-dir/src/Counter2.txt @@ -0,0 +1,27 @@ +import { useState } from "react"; + +export function Counter() { + console.log('counter b loaded'); + + const [count, setCount] = useState(0); + + function increment() { + setCount(count + 2); + } + + function decrement() { + setCount(count - 2); + } + + return ( +
+

Count B: {count}

+ + +
+ ); +} diff --git a/test/integration/next/default-pages-dir/src/pages/_app.tsx b/test/integration/next/default-pages-dir/src/pages/_app.tsx new file mode 100644 index 0000000000..a7a790fba5 --- /dev/null +++ b/test/integration/next/default-pages-dir/src/pages/_app.tsx @@ -0,0 +1,6 @@ +import "@/styles/globals.css"; +import type { AppProps } from "next/app"; + +export default function App({ Component, pageProps }: AppProps) { + return ; +} diff --git a/test/integration/next/default-pages-dir/src/pages/_document.tsx b/test/integration/next/default-pages-dir/src/pages/_document.tsx new file mode 100644 index 0000000000..b2fff8b426 --- /dev/null +++ b/test/integration/next/default-pages-dir/src/pages/_document.tsx @@ -0,0 +1,13 @@ +import { Html, Head, Main, NextScript } from "next/document"; + +export default function Document() { + return ( + + + +
+ + + + ); +} diff --git a/test/integration/next/default-pages-dir/src/pages/api/hello.ts b/test/integration/next/default-pages-dir/src/pages/api/hello.ts new file mode 100644 index 0000000000..a8d68697c6 --- /dev/null +++ b/test/integration/next/default-pages-dir/src/pages/api/hello.ts @@ -0,0 +1,10 @@ +// Next.js API route support: https://nextjs.org/docs/api-routes/introduction +import type { NextApiRequest, NextApiResponse } from "next"; + +type Data = { + name: string; +}; + +export default function handler(req: NextApiRequest, res: NextApiResponse) { + res.status(200).json({ name: "John Doe" }); +} diff --git a/test/integration/next/default-pages-dir/src/pages/index.tsx b/test/integration/next/default-pages-dir/src/pages/index.tsx new file mode 100644 index 0000000000..109f5e5e27 --- /dev/null +++ b/test/integration/next/default-pages-dir/src/pages/index.tsx @@ -0,0 +1,128 @@ +import Image from "next/image"; +import { Inter } from "next/font/google"; +import Head from "next/head"; +import { Counter } from "@/Counter"; + +const inter = Inter({ subsets: ["latin"] }); + +export default function Home({ bunVersion }: any) { + return ( +
+ + + Create Next App + + + + +
+ Next.js Logo +
+ + + + +
+ ); +} + +export async function getStaticProps() { + return { + props: { + bunVersion: + process.env.NODE_ENV === "production" + ? "[production needs a constant string]" + : process.versions.bun ?? "not in bun", + }, + }; +} diff --git a/test/integration/next/default-pages-dir/src/styles/globals.css b/test/integration/next/default-pages-dir/src/styles/globals.css new file mode 100644 index 0000000000..fd81e88583 --- /dev/null +++ b/test/integration/next/default-pages-dir/src/styles/globals.css @@ -0,0 +1,27 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +:root { + --foreground-rgb: 0, 0, 0; + --background-start-rgb: 214, 219, 220; + --background-end-rgb: 255, 255, 255; +} + +@media (prefers-color-scheme: dark) { + :root { + --foreground-rgb: 255, 255, 255; + --background-start-rgb: 0, 0, 0; + --background-end-rgb: 0, 0, 0; + } +} + +body { + color: rgb(var(--foreground-rgb)); + background: linear-gradient( + to bottom, + transparent, + rgb(var(--background-end-rgb)) + ) + rgb(var(--background-start-rgb)); +} diff --git a/test/integration/next/default-pages-dir/tailwind.config.ts b/test/integration/next/default-pages-dir/tailwind.config.ts new file mode 100644 index 0000000000..168556c685 --- /dev/null +++ b/test/integration/next/default-pages-dir/tailwind.config.ts @@ -0,0 +1,19 @@ +import type { Config } from "tailwindcss"; + +const config: Config = { + content: [ + // './src/pages/**/*.{js,ts,jsx,tsx,mdx}', + "./src/**/*.{js,ts,jsx,tsx,mdx}", + // './src/app/**/*.{js,ts,jsx,tsx,mdx}', + ], + theme: { + extend: { + backgroundImage: { + "gradient-radial": "radial-gradient(var(--tw-gradient-stops))", + "gradient-conic": "conic-gradient(from 180deg at 50% 50%, var(--tw-gradient-stops))", + }, + }, + }, + plugins: [], +}; +export default config; diff --git a/test/integration/next/default-pages-dir/test/dev-server-puppeteer.ts b/test/integration/next/default-pages-dir/test/dev-server-puppeteer.ts new file mode 100644 index 0000000000..9bebeb6143 --- /dev/null +++ b/test/integration/next/default-pages-dir/test/dev-server-puppeteer.ts @@ -0,0 +1,101 @@ +import { ConsoleMessage, Page, launch } from "puppeteer"; +import assert from "assert"; +import { copyFileSync } from "fs"; +import { join } from "path"; + +const root = join(import.meta.dir, "../"); + +copyFileSync(join(root, "src/Counter1.txt"), join(root, "src/Counter.tsx")); + +let url = "http://localhost:3000"; +if (process.argv.length > 2) { + url = process.argv[2]; +} + +const b = await launch({ + headless: "new", +}); + +const p = await b.newPage(); +// p.on("console", msg => console.log("[browser]", msg.text())); + +function waitForConsoleMessage(page: Page, regex: RegExp) { + const { resolve, promise } = Promise.withResolvers(); + function onMessage(msg: ConsoleMessage) { + const text = msg.text(); + if (regex.test(text)) { + page.off("console", onMessage); + resolve(); + } + } + p.on("console", onMessage); + return promise; +} + +await p.goto(url); +await waitForConsoleMessage(p, /counter a/); + +assert.strictEqual(await p.$eval("code.font-bold", x => x.innerText), Bun.version); + +let counter_root = (await p.$("#counter-fixture"))!; + +{ + const [has_class, style_json_string] = await counter_root.evaluate( + x => [(x as HTMLElement).classList.contains("rounded-bl-full"), JSON.stringify(getComputedStyle(x))] as const, + ); + assert.strictEqual(has_class, true); + const decoded_style = JSON.parse(style_json_string); + assert.strictEqual(decoded_style.borderTopLeftRadius, "0px"); + assert.strictEqual(decoded_style.borderTopRightRadius, "0px"); + assert.strictEqual(decoded_style.borderBottomRightRadius, "0px"); + assert.strictEqual(decoded_style.borderBottomLeftRadius, "9999px"); +} + +const getCount = () => counter_root.$eval("p", x => x.innerText); + +assert.strictEqual(await getCount(), "Count A: 0"); +await counter_root.$eval(".inc", x => (x as HTMLElement).click()); +assert.strictEqual(await getCount(), "Count A: 1"); +await counter_root.$eval(".inc", x => (x as HTMLElement).click()); +assert.strictEqual(await getCount(), "Count A: 2"); +await counter_root.$eval(".dec", x => (x as HTMLElement).click()); +assert.strictEqual(await getCount(), "Count A: 1"); + +p.reload({}); +await waitForConsoleMessage(p, /counter a/); + +assert.strictEqual(await p.$eval("code.font-bold", x => x.innerText), Bun.version); + +counter_root = (await p.$("#counter-fixture"))!; + +assert.strictEqual(await getCount(), "Count A: 0"); +await counter_root.$eval(".inc", x => (x as HTMLElement).click()); +assert.strictEqual(await getCount(), "Count A: 1"); +await counter_root.$eval(".inc", x => (x as HTMLElement).click()); +assert.strictEqual(await getCount(), "Count A: 2"); +await counter_root.$eval(".dec", x => (x as HTMLElement).click()); +assert.strictEqual(await getCount(), "Count A: 1"); + +copyFileSync(join(root, "src/Counter2.txt"), join(root, "src/Counter.tsx")); +await waitForConsoleMessage(p, /counter b loaded/); +assert.strictEqual(await getCount(), "Count B: 1"); +await counter_root.$eval(".inc", x => (x as HTMLElement).click()); +assert.strictEqual(await getCount(), "Count B: 3"); +await counter_root.$eval(".inc", x => (x as HTMLElement).click()); +assert.strictEqual(await getCount(), "Count B: 5"); +await counter_root.$eval(".dec", x => (x as HTMLElement).click()); +assert.strictEqual(await getCount(), "Count B: 3"); + +{ + const [has_class, style_json_string] = await counter_root.evaluate( + x => [(x as HTMLElement).classList.contains("rounded-br-full"), JSON.stringify(getComputedStyle(x))] as const, + ); + assert.strictEqual(has_class, true); + const decoded_style = JSON.parse(style_json_string); + assert.strictEqual(decoded_style.borderTopLeftRadius, "0px"); + assert.strictEqual(decoded_style.borderTopRightRadius, "0px"); + assert.strictEqual(decoded_style.borderBottomRightRadius, "9999px"); + assert.strictEqual(decoded_style.borderBottomLeftRadius, "0px"); +} + +await b.close(); diff --git a/test/integration/next/default-pages-dir/test/dev-server.test.ts b/test/integration/next/default-pages-dir/test/dev-server.test.ts new file mode 100644 index 0000000000..8723a91c2c --- /dev/null +++ b/test/integration/next/default-pages-dir/test/dev-server.test.ts @@ -0,0 +1,79 @@ +import { afterAll, beforeAll, describe, expect, test } from "bun:test"; +import { bunEnv, bunExe } from "../../../../harness"; +import { Subprocess } from "bun"; +import { copyFileSync, rmSync } from "fs"; +import { join } from "path"; + +const root = join(import.meta.dir, "../"); +let dev_server: undefined | Subprocess<"ignore", "pipe", "inherit">; +let baseUrl: string; + +test("the dev server can start", async () => { + rmSync(join(root, ".next"), { recursive: true, force: true }); + copyFileSync(join(root, "src/Counter1.txt"), join(root, "src/Counter.tsx")); + + const install = Bun.spawnSync([bunExe(), "i"], { cwd: root, env: bunEnv }); + if (install.exitCode !== 0) { + throw new Error("Failed to install dependencies"); + } + dev_server = Bun.spawn([bunExe(), "--bun", "node_modules/.bin/next", "dev"], { + cwd: root, + env: bunEnv, + stdio: ["ignore", "pipe", "inherit"], + }); + dev_server.exited.then(() => { + dev_server = undefined; + }); + for await (const chunk of dev_server.stdout) { + console.error({ chunk }); + const str = new TextDecoder().decode(chunk); + let match = str.match(/http:\/\/localhost:\d+/); + if (match) { + baseUrl = match[0]; + } + if (str.toLowerCase().includes("ready")) { + return; + } + } + console.error("Failed to start dev server :/"); + dev_server.kill(); + dev_server = undefined; +}, 30000); + +test("ssr works for 100 requests", async () => { + expect(dev_server).not.toBeUndefined(); + expect(baseUrl).not.toBeUndefined(); + + const promises = []; + for (let i = 0; i < 100; i++) { + promises.push( + (async () => { + const x = await fetch(`${baseUrl}/`); + expect(x.status).toBe(200); + const text = await x.text(); + expect(text).toContain(`>${Bun.version}`); + })(), + ); + } + + const x = await Promise.allSettled(promises); + for (const y of x) { + expect(y.status).toBe("fulfilled"); + } +}, 10000); + +test("hot reloading works on the client (+ tailwind hmr)", async () => { + expect(dev_server).not.toBeUndefined(); + expect(baseUrl).not.toBeUndefined(); + + const result = Bun.spawnSync([bunExe(), "test/dev-server-puppeteer.ts", baseUrl], { + cwd: root, + env: bunEnv, + stdio: ["ignore", "inherit", "inherit"], + }); + expect(result.exitCode).toBe(0); +}, 30000); + +afterAll(() => { + Bun.spawnSync(["pkill", "-P", dev_server!.pid.toString()]); +}); diff --git a/test/integration/next/default-pages-dir/test/next-build.test.ts b/test/integration/next/default-pages-dir/test/next-build.test.ts new file mode 100644 index 0000000000..0a00c158ef --- /dev/null +++ b/test/integration/next/default-pages-dir/test/next-build.test.ts @@ -0,0 +1,141 @@ +import { afterAll, beforeAll, describe, expect, test } from "bun:test"; +import { bunEnv, bunExe } from "../../../../harness"; +import { copyFileSync, cpSync, mkdtempSync, readFileSync, readdirSync, rmSync, symlinkSync, writeFileSync } from "fs"; +import { tmpdir } from "os"; +import { join } from "path"; +import { cp } from "fs/promises"; + +const root = join(import.meta.dir, "../"); + +let build_passed = false; + +async function tempDirToBuildIn() { + const dir = mkdtempSync(join(tmpdir(), "bun-next-build-")); + const copy = [ + ".eslintrc.json", + "bun.lockb", + "next.config.js", + "next.config.js", + "package.json", + "postcss.config.js", + "public", + "src", + "tailwind.config.ts", + ]; + await Promise.all(copy.map(x => cp(join(root, x), join(dir, x), { recursive: true }))); + cpSync(join(root, "src/Counter1.txt"), join(dir, "src/Counter.tsx")); + cpSync(join(root, "tsconfig_for_build.json"), join(dir, "tsconfig.json")); + symlinkSync(join(root, "node_modules"), join(dir, "node_modules")); + return dir; +} + +function readdirRecursive(dir: string) { + let results: string[] = []; + + readdirSync(dir, { withFileTypes: true }).forEach(file => { + if (file.isDirectory()) { + results = results.concat(readdirRecursive(join(dir, file.name)).map(x => join(file.name, x))); + } else { + results.push(file.name); + } + }); + + return results; +} + +function hashAllFiles(dir: string) { + const files = readdirRecursive(dir).sort(); + const hashes: Record = {}; + for (const file of files) { + const hash = new Bun.CryptoHasher("sha256"); + hash.update(readFileSync(join(dir, file))); + hashes[file] = hash.digest("hex"); + } + return hashes; +} + +test("next build works", async () => { + copyFileSync(join(root, "src/Counter1.txt"), join(root, "src/Counter.tsx")); + + const install = Bun.spawnSync([bunExe(), "i"], { cwd: root, env: bunEnv }); + if (install.exitCode !== 0) { + throw new Error("Failed to install dependencies"); + } + + const bunDir = await tempDirToBuildIn(); + const nodeDir = await tempDirToBuildIn(); + + const bunBuild = await Bun.spawn([bunExe(), "--bun", "node_modules/.bin/next", "build"], { + cwd: bunDir, + // env: bunEnv, + stdio: ["ignore", "pipe", "inherit"], + env: { + ...bunEnv, + NODE_ENV: "production", + }, + }); + const nodeBuild = await Bun.spawn(["node", "node_modules/.bin/next", "build"], { + cwd: nodeDir, + env: bunEnv, + stdio: ["ignore", "pipe", "inherit"], + }); + await Promise.all([bunBuild.exited, nodeBuild.exited]); + expect(nodeBuild.exitCode).toBe(0); + expect(bunBuild.exitCode).toBe(0); + + const bunCliOutput = await Bun.readableStreamToText(bunBuild.stdout); + const nodeCliOutput = await Bun.readableStreamToText(nodeBuild.stdout); + + expect(bunCliOutput).toBe(nodeCliOutput); + + const bunBuildDir = join(bunDir, ".next"); + const nodeBuildDir = join(nodeDir, ".next"); + + const toRemove = [ + // these have timestamps and absolute paths in them + "trace", + "cache", + "required-server-files.json", + // these have "signing keys", not sure what they are tbh + "prerender-manifest.json", + "prerender-manifest.js", + // these are similar but i feel like there might be something we can fix to make them the same + "next-minimal-server.js.nft.json", + "next-server.js.nft.json", + // not sorted lol + "server/pages-manifest.json", + ]; + for (const key of toRemove) { + rmSync(join(bunBuildDir, key), { recursive: true }); + rmSync(join(nodeBuildDir, key), { recursive: true }); + } + + const bunBuildHash = hashAllFiles(bunBuildDir); + const nodeBuildHash = hashAllFiles(nodeBuildDir); + + try { + expect(bunBuildHash).toEqual(nodeBuildHash); + } catch (error) { + console.log("bunBuildDir", bunBuildDir); + console.log("nodeBuildDir", nodeBuildDir); + + // print diffs for every file if not the same + for (const key in bunBuildHash) { + if (bunBuildHash[key] !== nodeBuildHash[key]) { + console.log(key + ":"); + try { + expect(readFileSync(join(bunBuildDir, key)).toString()).toBe( + readFileSync(join(nodeBuildDir, key)).toString(), + ); + } catch (error) { + console.error(error); + } + } + } + throw error; + } + + build_passed = true; +}, 300000); + +const version_string = "[production needs a constant string]"; diff --git a/test/integration/next/default-pages-dir/tsconfig.json b/test/integration/next/default-pages-dir/tsconfig.json new file mode 100644 index 0000000000..b8629571f6 --- /dev/null +++ b/test/integration/next/default-pages-dir/tsconfig.json @@ -0,0 +1,22 @@ +{ + "compilerOptions": { + "target": "ESNext", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "paths": { + "@/*": ["./src/*"] + } + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", "../../../../packages/bun-types/dist/types.d.ts"], + "exclude": ["node_modules"] +} diff --git a/test/integration/next/default-pages-dir/tsconfig_for_build.json b/test/integration/next/default-pages-dir/tsconfig_for_build.json new file mode 100644 index 0000000000..476ee3ebc8 --- /dev/null +++ b/test/integration/next/default-pages-dir/tsconfig_for_build.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "target": "ESNext", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "paths": { + "@/*": ["./src/*"] + }, + "types": ["bun-types"] + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"], + "exclude": ["node_modules"] +} diff --git a/test/js/node/async_hooks/async_hooks.node.test.ts b/test/js/node/async_hooks/async_hooks.node.test.ts index 3d6183948f..5fc56a39b5 100644 --- a/test/js/node/async_hooks/async_hooks.node.test.ts +++ b/test/js/node/async_hooks/async_hooks.node.test.ts @@ -1,13 +1,13 @@ -import { AsyncLocalStorage } from "async_hooks"; +import { AsyncLocalStorage, AsyncResource } from "async_hooks"; import assert from "assert"; test("node async_hooks.AsyncLocalStorage enable disable", async done => { - const asyncLocalStorage = new AsyncLocalStorage(); + const asyncLocalStorage = new AsyncLocalStorage>(); asyncLocalStorage.run(new Map(), () => { - asyncLocalStorage.getStore().set("foo", "bar"); + asyncLocalStorage.getStore()!.set("foo", "bar"); process.nextTick(() => { - assert.strictEqual(asyncLocalStorage.getStore().get("foo"), "bar"); + assert.strictEqual(asyncLocalStorage.getStore()!.get("foo"), "bar"); process.nextTick(() => { assert.strictEqual(asyncLocalStorage.getStore(), undefined); }); @@ -24,7 +24,7 @@ test("node async_hooks.AsyncLocalStorage enable disable", async done => { process.nextTick(() => { assert.strictEqual(asyncLocalStorage.getStore(), undefined); asyncLocalStorage.run(new Map().set("bar", "foo"), () => { - assert.strictEqual(asyncLocalStorage.getStore().get("bar"), "foo"); + assert.strictEqual(asyncLocalStorage.getStore()!.get("bar"), "foo"); done(); }); @@ -32,3 +32,21 @@ test("node async_hooks.AsyncLocalStorage enable disable", async done => { }); }); }); + +test("AsyncResource.prototype.bind", () => { + const localStorage = new AsyncLocalStorage(); + let ar!: AsyncResource; + localStorage.run(true, () => { + ar = new AsyncResource("test"); + }); + expect(ar.bind(() => localStorage.getStore())()).toBe(true); +}); + +test("AsyncResource.bind", () => { + const localStorage = new AsyncLocalStorage(); + let fn!: () => true | undefined; + localStorage.run(true, () => { + fn = AsyncResource.bind(() => localStorage.getStore()); + }); + expect(fn()).toBe(true); +}); diff --git a/test/js/node/module/modulePrototypeOverwrite-fixture.cjs b/test/js/node/module/modulePrototypeOverwrite-fixture.cjs new file mode 100644 index 0000000000..eecab81c1a --- /dev/null +++ b/test/js/node/module/modulePrototypeOverwrite-fixture.cjs @@ -0,0 +1 @@ +module.exports = require("hook"); diff --git a/test/js/node/module/modulePrototypeOverwrite.cjs b/test/js/node/module/modulePrototypeOverwrite.cjs new file mode 100644 index 0000000000..4e84026a6a --- /dev/null +++ b/test/js/node/module/modulePrototypeOverwrite.cjs @@ -0,0 +1,17 @@ +// This behavior is required for Next.js to work +const eql = require("assert").deepStrictEqual; +const Module = require("module"); + +const old = Module.prototype.require; +Module.prototype.require = function (str) { + if (str === "hook") return "winner"; + return { + wrap: old.call(this, str), + }; +}; + +// this context has the new require +const result = require("./modulePrototypeOverwrite-fixture.cjs"); +eql(result, { wrap: "winner" }); + +console.log("--pass--"); diff --git a/test/js/node/module/node-module-module.test.js b/test/js/node/module/node-module-module.test.js index 26fbb6fabd..5ac48d4263 100644 --- a/test/js/node/module/node-module-module.test.js +++ b/test/js/node/module/node-module-module.test.js @@ -71,6 +71,17 @@ test("Overwriting _resolveFilename", () => { expect(exitCode).toBe(0); }); +test("Overwriting Module.prototype.require", () => { + const { stdout, exitCode } = Bun.spawnSync({ + cmd: [bunExe(), "run", path.join(import.meta.dir, "modulePrototypeOverwrite.cjs")], + env: bunEnv, + stderr: "inherit", + }); + + expect(stdout.toString().trim().endsWith("--pass--")).toBe(true); + expect(exitCode).toBe(0); +}); + test("Module.prototype._compile", () => { const module = new Module("module id goes here"); const starting_exports = module.exports; diff --git a/test/js/node/process/process-stdio.test.ts b/test/js/node/process/process-stdio.test.ts index 463ab5fda3..5349587afd 100644 --- a/test/js/node/process/process-stdio.test.ts +++ b/test/js/node/process/process-stdio.test.ts @@ -5,7 +5,7 @@ import { isatty } from "tty"; test("process.stdin", () => { expect(process.stdin).toBeDefined(); - expect(process.stdout.isTTY).toBe(isatty(0)); + expect(process.stdin.isTTY).toBe(isatty(0) ? true : undefined); expect(process.stdin.on("close", function () {})).toBe(process.stdin); expect(process.stdin.once("end", function () {})).toBe(process.stdin); }); diff --git a/test/js/node/stream/node-stream.test.js b/test/js/node/stream/node-stream.test.js index bc6a4fcfb7..ddbd2bc7ac 100644 --- a/test/js/node/stream/node-stream.test.js +++ b/test/js/node/stream/node-stream.test.js @@ -197,6 +197,7 @@ describe("PassThrough", () => { const ttyStreamsTest = ` import tty from "tty"; +import fs from "fs"; import { dlopen } from "bun:ffi"; @@ -278,10 +279,11 @@ describe("TTY", () => { close(child_fd); }); it("process.stdio tty", () => { - expect(process.stdin instanceof tty.ReadStream).toBe(true); + // this isnt run in a tty, so stdin will not appear to be a tty + expect(process.stdin instanceof fs.ReadStream).toBe(true); expect(process.stdout instanceof tty.WriteStream).toBe(true); expect(process.stderr instanceof tty.WriteStream).toBe(true); - expect(process.stdin.isTTY).toBeDefined(); + expect(process.stdin.isTTY).toBeUndefined(); expect(process.stdout.isTTY).toBeDefined(); expect(process.stderr.isTTY).toBeDefined(); }); @@ -311,7 +313,11 @@ it("TTY streams", () => { }); expect(stdout.toString()).toBe(""); - expect(stderr.toString()).toContain("0 fail"); + try { + expect(stderr.toString()).toContain("0 fail"); + } catch (error) { + throw new Error(stderr.toString()); + } expect(exitCode).toBe(0); }); diff --git a/test/js/third_party/got/bun.lockb b/test/js/third_party/got/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..7dbe60317fd8add3a2c1eea94e9f4515ef043dad GIT binary patch literal 9072 zcmeHMd010d77q|qKtw^dx&WeRsV^Y`0ReHtrIxj*j0$Q94+w-LBwK`G{gnxoB@yVr21)L zUk~-)zro+5#U|W+`hlwc%RM!QMQ@8b5Vy5FwcfJyFCF7*#+c1M_Eu`Er73()YLJ7o zd!gk0ba2~$l~nsbQNUy%O`lN9^mIf z+jjcV6z?Ws`?mmo66i+|3=>g1(+Lm8zf|Z)CL=tOpOY}21t15|uMQxD?I}JK@J@h- zX)R9(FTx#BlyxMq{yorkhNAxn3(JU>)sy}M-kqW!>FUY&xq&V`{H-Q!yN?~ICc5## z(RWpHQSwcu!}Fp?$0`;@=JdXs?K+#5`RK%{x9)5A9h>%Zj`#L|ub4R1?2kLYu-^De zcCNevHez1tRH9e9#^)aMO%)!vy{P!qoNxRS=4KDlweZ&S-CsW_{p_i0@#hyD?R)g@ z?ml@hmd$i5exZ9P)97fES%yk@dRCccT`Ywc?-$4&^h~Q|RlPl%GVAGw{jG_&eKJ;#Pi}g2DnonQ-UqkR4NZbi3Zw7d@zc9-R>LkUa@^)Q6kh5+ zNZ&GR;WSC!nX$oludk1EA3T3oQ7T=HAzAI($Ke-2_Wa2jy2Hcm!V{m4EK5nOy0r31 za{oVWP|(29 z43oE(E9n}mCaPaC9rZGG^V$)Ebt8=pBYJ7Vt;vWvot*Q}iP-k~Ya=D+)p zGH2{Qji0o0b0$SL(brGpw;b_b@%*>RT$h*50!}&4GKI{rUUUD?MT62`_>S;Wuc(^j z!#G^6eWQuOOWn`tbN`ePMnz7nLnq!_TUh+$m~6yZ|%QwU2=AmEL}WgTd94}ij%NEDdz+AoT6vn*_2qFS!!dxpYi%~@(8;N zx!YW_v??vP4zQL^(CQtMO8yYF;O!d?yK<+aD{ZdI<{5e{@lbc1bFk!rNw8?GKZO_W z;L1e5W~(c^|4qn&-}1~19TWUtljy9pa0tnlV5CYhMQ1$(YcHhofp=4eZ7PF`G%j<=KOTI_oJ-6fdxKpgI&Ix zU#k}#Jk`?5n`ba&#|#6PxPGF0jn~hOto8gMCPiB#b> zmp-W7rdQgrZlk>o^P+tiC;C&ld|W&&9{%KX~vfzqatJvvqY| zoO0>8=8x5V?6=-LrG3Ns@rQoD<~Pb>FQ}Vu`^K%f7Oe%$i}!QHO+V$uvovaC8?L5r z@J`5EveV z8qzB>D7^4)rA+ii>vT;@TsdxPcmCD9W`X4syK_2wHuZY!Y<^+&uG)>}&$36pT)JNJ zG^OxqeiGBzt6_{oa6{og+`eb9RQj@RYVD`+;&TR((gEn~>q zDF*vSHVybzVn4IS-8gRDnzQppy_qt*e^e@W89!@hnb58Npe*|mcZTBwb^evp6kdEj z$$2Y|$Ed%K+_LAcYg&%aR*!KHn*+CQPe{Cfk`}Z4`rt#7v|TnWll$sVSt!1^B=}Cw zF5Swf{KcZ+w7}Pb-R7Yt-%@ztol%+SvFFY`XRn=|yZEtlz-6z@6Xj}ZZypWJ%S^qU zZdBN-_|Lu0-<5x_-<-~7$NE;71wJ_{dG~r^iTS>mLwI>t`T zuQQjP(4YE5-^*mXsU^pv%+vjfwqwr3xdWVv^L;sudDV4>eG0DgZiLpw5B1wH=kB18 z`y1YPX8fKqj=~G?w#r0r+9AH0AEC8Jv|xn?@+y&jkh&1$qZOY(WQ!$0O? z@D=skGvo7i4QY;T*3p}_Wpnht+FSYs?<~e?@m^7Q;oVo6=naj@3no8PS$->K_RuH) zyg9rV(>~9jXxsslO#>W>%sJ1_r_iw^T32#d@05?MK!-g zLg9sXXJw*4ds2P8%4g85xeG(?tvoeWPt~uelo9zy!C3DhgsE1Q|B#~5(PcMuF1&T6 zW!o2e?pX6jzru6Gg@?V4mK0RqD@St{uL}buEBM!Kes!Jy=HQJ7Gu()Q4snpE{g<*Y9{A#cFCO^B12V}eQzT-Bxv?j!l&P%i(;rAAtf22@i zrFa3?bc(QMI|EmztgSrgJrKRKp*tnwMDH!=9Rs}&pnEa00o{oaExKc&dkeZ_p!)#Q zjqac5+(qiq-EN^m|CP_Q1N8-+)rb%AqI)vZiF6|ykWJV=Y%8)4*@^5z_Mmp?o`&=z zTaZntEwUHc*r2dw8GN`$Nz-W_+tx3_9=vX=^bf18*Kxc7f4^5ng!06MCos$K7jspW z`C}Mth82y5V*&Wvy1d4U!J^S{v;cp7hZ;ME6~Y7n8;VQd@A*)}vI07LS_IU9M`ZZR zKh)T^ViFV>921KyM2=z#(Q7Gy#V_(g`}4GIj)ik1a6;58YJOhAow zs~#L%!Lf>uH8%hQBPGL8jgK{*v*Cygj&J~G3|I}e;g}7Mfj|xPM($A|1L( z_YRIG;pmL23UW0VO~dgc9FGAu@Bpg1rI@u?w%tY~WLP9AW=x5el41de?=2Pc1VPTG ztdA4hUOBNF6iknXfkH^IN5C3jb+`nArBac^fyoq;K|G069K#TZ!a^hrp*V;MOM^+E zC&7|W6oxb?c7lW_2oRGJp*T1~!sJONNMge{Vs0!al!=%KDKCr^b2;2#lH(6iL%vWL z8X@|a7n9);5agd|`rB_e{$5pYR9QihrMyil@>UQwGt_o!Jy+08ESZ4Cg1wgsQXK{Xo~ zsM*iLxA6!Nw8;}}w5HHtg-7tXp#)zX0i6``BT0h87YVxP8ns!gYm_JgEmRgF?E<#8p*R9HN) zP(PLlP>i1sw-X{l%eufFakTt}`0nvROWFgSO*=|~r&)H!YU>*C|gXx)W@>(e4a zemUvRypFbbY?yq%hb68sCx8UU6H+0;6$%6-SK7rGeA*NkKP`eq+kH1bJ&}NiCjpDl O)&Ucu^#uI;J^ur*1WWw@ literal 0 HcmV?d00001 diff --git a/test/js/third_party/prisma/bun.lockb b/test/js/third_party/prisma/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..65d0238e5616f7a48c1e399fea6c63bfbef431f7 GIT binary patch literal 2951 zcmds3eN0Tt{n&atU1DpSF~L`F1@O~FhzF$x%ik;O;^Gc;qJfMh`+g5KM{TS~*Q#(#__xjFBi zdw#!r&pG$@bYm**76sbO@igE)YO|YH!9m)cmi<=F4oIt0aIg~TVN_8BLB!7$=bTiu z-2T>XkFi^n<}Y`b*0)V|+%{I4G&H9PoD)?~!@HxhR0rC0&0v`j3av>h^-xR*d-^`V89Sw9A zTzI5W4lx(j(B$`x+<$4^Ql!N|!)@4LGGQR@A%;^0_y5?M^!J zd|VnaBE+Phxv*twP?4Nhn@5(P=snIR@eh8!iAwGszW(u%L13OM{i!B1ZtBC+^uTsz zs3$)K5@BBSp0FsJs?6q*#GSVkE;jYwnbf*xBsJ-s4ZRn7ecF5bs}u8;R~H(8+xyz_ z4W@0%?xGC#319C^zpCnTRim4BZajE!b2BD_8s8_h4>JD&6Z6e@;BDhr!fmJ~_;<$x z3y*$}5H?a9@(mSQ#)sPQcj&#sw*SBGlAr%YS*uK~0&VixmgJ;pK2!()mgn&VLPo;Y^?|BZG6BOAL zLov{bJ09+2aSDbq_*d|K#62$#Vl3e2P$7Z5E1=aSIB8vksY>}RoafR`#H z$tC8}v;b_JCvMI?{>;E7%l%CBp=nR%DgVn0h8!bkL z(HRWdY?jGp^}xz#L6(-a7!3du0^Y{)KqO(3M9#@aP7uLi!?@w8!z_X0|ASMbNX>4} zzK`bkeW04E6xTS0oLf>Z#&WL0Vqb$I%rhi{VB*(62g?j`!Ee(4a!?@h&Hm4+zW|`% BU~vEd literal 0 HcmV?d00001 diff --git a/test/js/third_party/yargs/bun.lockb b/test/js/third_party/yargs/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..6b527d00fbf27e6b6fde944314d4efd03a2d573b GIT binary patch literal 6747 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 literal 0 HcmV?d00001