Browse Source

Don't overwrite default export from `SourceTextModule` (#1952)

Michael Kriese 11 months ago
parent
commit
2f3a801d14

+ 16 - 0
Jint.Tests/Runtime/ModuleTests.cs

@@ -43,6 +43,22 @@ public class ModuleTests
         Assert.Equal("exported value", ns.Get("default").AsString());
     }
 
+    [Fact]
+    public void ShouldExportDefaultFunctionWithoutName()
+    {
+        _engine.Modules.Add("module1", "export default function main() { return 1; }");
+        _engine.Modules.Add("module2", "export default function () { return 1; }");
+        var ns = _engine.Modules.Import("module1");
+
+        var func = ns.Get("default");
+        Assert.Equal(1, func.Call());
+
+        ns = _engine.Modules.Import("module2");
+
+        func = ns.Get("default");
+        Assert.Equal(1, func.Call());
+    }
+
     [Fact]
     public void ShouldExportAll()
     {

+ 7 - 0
Jint/Runtime/Interpreter/Statements/JintExportDefaultDeclaration.cs

@@ -42,6 +42,13 @@ internal sealed class JintExportDefaultDeclaration : JintStatement<ExportDefault
     protected override Completion ExecuteInternal(EvaluationContext context)
     {
         var env = context.Engine.ExecutionContext.LexicalEnvironment;
+        if (env.HasBinding("*default*"))
+        {
+            // We already have the default binding.
+            // Initialized in SourceTextModule.InitializeEnvironment.
+            return Completion.Empty();
+        }
+
         JsValue value;
         if (_classDefinition is not null)
         {