From 51d3d4382281f789f8175079ed426a63529eb3e7 Mon Sep 17 00:00:00 2001 From: Jarred Sumner Date: Sun, 10 Sep 2023 22:15:35 -0800 Subject: Support named imports for json & toml files at runtime (#4783) * Support named exports in json imports * Support named imports for `*.json` files * Remove stale comments * Don't export arrays as non-default * Add test for default exports * Don't break webpack --------- Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> --- src/bun.js/modules/ObjectModule.cpp | 77 ++++++++++++++++++++++++++++++++++++- 1 file changed, 76 insertions(+), 1 deletion(-) (limited to 'src/bun.js/modules/ObjectModule.cpp') diff --git a/src/bun.js/modules/ObjectModule.cpp b/src/bun.js/modules/ObjectModule.cpp index 4272bec4e..ebb4af32e 100644 --- a/src/bun.js/modules/ObjectModule.cpp +++ b/src/bun.js/modules/ObjectModule.cpp @@ -5,7 +5,41 @@ JSC::SyntheticSourceProvider::SyntheticSourceGenerator generateObjectModuleSourceCode(JSC::JSGlobalObject *globalObject, JSC::JSObject *object) { JSC::VM &vm = globalObject->vm(); + gcProtectNullTolerant(object); + return [object](JSC::JSGlobalObject *lexicalGlobalObject, + JSC::Identifier moduleKey, + Vector &exportNames, + JSC::MarkedArgumentBuffer &exportValues) -> void { + JSC::VM &vm = lexicalGlobalObject->vm(); + GlobalObject *globalObject = + reinterpret_cast(lexicalGlobalObject); + JSC::EnsureStillAliveScope stillAlive(object); + + PropertyNameArray properties(vm, PropertyNameMode::Strings, + PrivateSymbolMode::Exclude); + object->getPropertyNames(globalObject, properties, + DontEnumPropertiesMode::Exclude); + gcUnprotectNullTolerant(object); + for (auto &entry : properties) { + exportNames.append(entry); + + auto scope = DECLARE_CATCH_SCOPE(vm); + JSValue value = object->get(globalObject, entry); + if (scope.exception()) { + scope.clearException(); + value = jsUndefined(); + } + exportValues.append(value); + } + }; +} + +JSC::SyntheticSourceProvider::SyntheticSourceGenerator +generateObjectModuleSourceCodeForJSON(JSC::JSGlobalObject *globalObject, + JSC::JSObject *object) { + JSC::VM &vm = globalObject->vm(); + gcProtectNullTolerant(object); return [object](JSC::JSGlobalObject *lexicalGlobalObject, JSC::Identifier moduleKey, Vector &exportNames, @@ -19,11 +53,52 @@ generateObjectModuleSourceCode(JSC::JSGlobalObject *globalObject, PrivateSymbolMode::Exclude); object->getPropertyNames(globalObject, properties, DontEnumPropertiesMode::Exclude); + gcUnprotectNullTolerant(object); for (auto &entry : properties) { + if (entry == vm.propertyNames->defaultKeyword) { + continue; + } + exportNames.append(entry); - exportValues.append(object->get(globalObject, entry)); + + auto scope = DECLARE_CATCH_SCOPE(vm); + JSValue value = object->get(globalObject, entry); + if (scope.exception()) { + scope.clearException(); + value = jsUndefined(); + } + exportValues.append(value); } + + exportNames.append(vm.propertyNames->defaultKeyword); + exportValues.append(object); + }; +} + +JSC::SyntheticSourceProvider::SyntheticSourceGenerator +generateJSValueModuleSourceCode(JSC::JSGlobalObject *globalObject, + JSC::JSValue value) { + + if (value.isObject() && !JSC::isJSArray(value)) { + return generateObjectModuleSourceCodeForJSON(globalObject, + value.getObject()); + } + + if (value.isCell()) + gcProtectNullTolerant(value.asCell()); + return [value](JSC::JSGlobalObject *lexicalGlobalObject, + JSC::Identifier moduleKey, + Vector &exportNames, + JSC::MarkedArgumentBuffer &exportValues) -> void { + JSC::VM &vm = lexicalGlobalObject->vm(); + GlobalObject *globalObject = + reinterpret_cast(lexicalGlobalObject); + exportNames.append(vm.propertyNames->defaultKeyword); + exportValues.append(value); + + if (value.isCell()) + gcUnprotectNullTolerant(value.asCell()); }; } } // namespace Zig \ No newline at end of file -- cgit v1.2.3