From 3e84f18cc03a6bab898235ff2a9827b47a83aac9 Mon Sep 17 00:00:00 2001 From: Jarred Sumner Date: Thu, 1 Jun 2023 18:04:09 -0700 Subject: Implement `__dirname` and `__filename`, allow direct eval in CommonJS (#3164) * Implement `__dirname` and `__filename`, allow direct eval in CommonJS * Fixup dirname and add test --------- Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> --- src/bun.js/bindings/CommonJSModuleRecord.cpp | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) (limited to 'src/bun.js/bindings/CommonJSModuleRecord.cpp') diff --git a/src/bun.js/bindings/CommonJSModuleRecord.cpp b/src/bun.js/bindings/CommonJSModuleRecord.cpp index e3bf3a0db..a32d722d9 100644 --- a/src/bun.js/bindings/CommonJSModuleRecord.cpp +++ b/src/bun.js/bindings/CommonJSModuleRecord.cpp @@ -218,7 +218,7 @@ static Structure* internalCreateCommonJSModuleStructure( structure = structure->addPropertyTransition( vm, structure, - JSC::Identifier::fromString(vm, "fileName"_s), + JSC::Identifier::fromString(vm, "filename"_s), 0, offset); @@ -310,10 +310,15 @@ JSC::SourceCode createCommonJSModule( ? JSC::constructEmptyObject(globalObject, globalObject->objectPrototype(), source.commonJSExportsLen) : JSC::constructEmptyObject(globalObject, globalObject->objectPrototype()); - if (!globalObject->requireMap()->has(globalObject, requireMapKey)) { - globalObject->requireMap()->set(globalObject, requireMapKey, exportsObject); + auto index = sourceURL.reverseFind('/', sourceURL.length()); + JSString* dirname = jsEmptyString(vm); + JSString* filename = requireMapKey; + if (index != WTF::notFound) { + dirname = JSC::jsSubstring(globalObject, requireMapKey, 0, index); } + globalObject->requireMap()->set(globalObject, requireMapKey, exportsObject); + JSC::SourceCode inputSource( JSC::StringSourceProvider::create(sourceCodeString, JSC::SourceOrigin(WTF::URL::fileURLWithFileSystemPath(sourceURL)), @@ -344,6 +349,16 @@ JSC::SourceCode createCommonJSModule( scopeExtensionObject->putDirectOffset( vm, 2, + dirname); + + scopeExtensionObject->putDirectOffset( + vm, + 3, + filename); + + scopeExtensionObject->putDirectOffset( + vm, + 4, requireFunction); auto* executable = JSC::DirectEvalExecutable::create( -- cgit v1.2.3