This is an automated email from the ASF dual-hosted git repository.

thiagohp pushed a commit to branch feature/es-module-support
in repository https://gitbox.apache.org/repos/asf/tapestry-5.git


The following commit(s) were added to refs/heads/feature/es-module-support by 
this push:
     new 8c74cb8ae TAP5-2803: Implemented EsModuleInitialization.invoke() and 
.with().
8c74cb8ae is described below

commit 8c74cb8ae02eedcbcbc83f0980abf5529854d3d5
Author: Thiago H. de Paula Figueiredo <thi...@arsmachina.com.br>
AuthorDate: Wed Apr 2 17:36:32 2025 -0300

    TAP5-2803: Implemented EsModuleInitialization.invoke() and .with().
---
 .../internal/services/EsModuleInitsManager.java    |   3 +-
 .../internal/services/ajax/BaseInitialization.java |  27 +++++
 .../services/ajax/EsModuleInitializationImpl.java  |  67 ++++++++++++
 .../internal/services/ajax/InitializationImpl.java |  37 +++++++
 .../services/ajax/JavaScriptSupportImpl.java       |  99 ------------------
 .../services/javascript/EsModuleManagerImpl.java   | 115 +++++++++++++++++++--
 .../javascript/EsModuleInitialization.java         |  15 ---
 .../tapestry5/integration/app1/EsModuleTests.java  |  45 +++++++-
 .../integration/app1/pages/EsModuleDemo.java       |  15 +++
 .../javascript/EsModuleManagerImplTest.java        |  89 ++++++++++++++++
 .../META-INF/assets/es-modules/default-export.js   |   3 +
 .../assets/es-modules/non-default-export.js        |   6 ++
 .../es-modules/parameterless-default-export.js     |   3 +
 .../integration/app1/pages/EsModuleDemo.tml        |   5 +-
 14 files changed, 404 insertions(+), 125 deletions(-)

diff --git 
a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/EsModuleInitsManager.java
 
b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/EsModuleInitsManager.java
index 4116679c9..e3fc767fe 100644
--- 
a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/EsModuleInitsManager.java
+++ 
b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/EsModuleInitsManager.java
@@ -29,6 +29,7 @@ import java.util.List;
 import java.util.Set;
 
 import org.apache.tapestry5.commons.util.CollectionFactory;
+import org.apache.tapestry5.internal.services.ajax.EsModuleInitializationImpl;
 import org.apache.tapestry5.services.javascript.EsModuleInitialization;
 
 public class EsModuleInitsManager
@@ -42,7 +43,7 @@ public class EsModuleInitsManager
         assert initialization != null;
 
         // We ignore a module being added again.
-        final String moduleName = initialization.getModuleId();
+        final String moduleName = ((EsModuleInitializationImpl) 
initialization).getModuleId();
         if (!modules.contains(moduleName))
         {
             initializations.add(initialization);
diff --git 
a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ajax/BaseInitialization.java
 
b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ajax/BaseInitialization.java
new file mode 100644
index 000000000..589a8850a
--- /dev/null
+++ 
b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ajax/BaseInitialization.java
@@ -0,0 +1,27 @@
+package org.apache.tapestry5.internal.services.ajax;
+
+import org.apache.tapestry5.ioc.internal.util.InternalUtils;
+import org.apache.tapestry5.services.javascript.AbstractInitialization;
+
+abstract class BaseInitialization<T extends AbstractInitialization<?>> 
implements AbstractInitialization<T>
+{
+    final String moduleName;
+
+    protected String functionName;
+
+    BaseInitialization(String moduleName)
+    {
+        this.moduleName = moduleName;
+    }
+
+    @SuppressWarnings("unchecked")
+    public T invoke(String functionName)
+    {
+        assert InternalUtils.isNonBlank(functionName);
+
+        this.functionName = functionName;
+
+        return (T) this;
+    }
+    
+}
\ No newline at end of file
diff --git 
a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ajax/EsModuleInitializationImpl.java
 
b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ajax/EsModuleInitializationImpl.java
new file mode 100644
index 000000000..3b3bfeb4a
--- /dev/null
+++ 
b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ajax/EsModuleInitializationImpl.java
@@ -0,0 +1,67 @@
+package org.apache.tapestry5.internal.services.ajax;
+
+import java.util.Collections;
+import java.util.Map;
+
+import org.apache.tapestry5.commons.util.CollectionFactory;
+import org.apache.tapestry5.services.javascript.EsModuleInitialization;
+import org.apache.tapestry5.services.javascript.ImportPlacement;
+
+public class EsModuleInitializationImpl extends 
BaseInitialization<EsModuleInitialization> implements EsModuleInitialization
+{
+    
+    private Map<String, String> attributes;
+    private ImportPlacement placement = ImportPlacement.BODY_BOTTOM;
+    private Object[] arguments;
+    
+    EsModuleInitializationImpl(String moduleName) 
+    {
+        super(moduleName);
+    }
+
+    public EsModuleInitialization withAttribute(String id, String value) 
+    {
+        if (attributes == null)
+        {
+            attributes = CollectionFactory.newMap();
+        }
+        attributes.put(id, value);
+        return this;
+    }
+
+    public EsModuleInitialization placement(ImportPlacement placement) 
+    {
+        this.placement = placement;
+        return null;
+    }
+
+    public String getModuleId() {
+        return moduleName;
+    }
+
+    public Map<String, String> getAttributes() {
+        return attributes != null ? 
+                Collections.unmodifiableMap(attributes) : 
+                    Collections.emptyMap();
+    }
+
+    public ImportPlacement getPlacement() {
+        return placement;
+    }
+    
+    public String getFunctionName() {
+        return functionName;
+    }
+
+    @Override
+    public void with(Object... arguments) 
+    {
+        this.arguments = arguments;
+    }
+    
+    public Object[] getArguments() 
+    {
+        return arguments;
+    }
+    
+}
\ No newline at end of file
diff --git 
a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ajax/InitializationImpl.java
 
b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ajax/InitializationImpl.java
new file mode 100644
index 000000000..59e2ff974
--- /dev/null
+++ 
b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ajax/InitializationImpl.java
@@ -0,0 +1,37 @@
+package org.apache.tapestry5.internal.services.ajax;
+
+import org.apache.tapestry5.json.JSONArray;
+import org.apache.tapestry5.services.javascript.Initialization;
+import org.apache.tapestry5.services.javascript.InitializationPriority;
+
+class InitializationImpl extends BaseInitialization<Initialization> implements 
Initialization
+{
+    
+    JSONArray arguments;
+    
+    InitializationPriority priority = InitializationPriority.NORMAL;
+
+    public InitializationImpl(String moduleName) 
+    {
+        super(moduleName);
+    }
+    
+    public Initialization priority(InitializationPriority priority)
+    {
+        assert priority != null;
+
+        this.priority = priority;
+
+        return this;
+    }
+    
+    @Override
+    public void with(Object... arguments)
+    {
+        assert arguments != null;
+
+        this.arguments = new JSONArray(arguments);
+    }
+
+    
+}
\ No newline at end of file
diff --git 
a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ajax/JavaScriptSupportImpl.java
 
b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ajax/JavaScriptSupportImpl.java
index 2d9308b98..5cf4dbd3b 100644
--- 
a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ajax/JavaScriptSupportImpl.java
+++ 
b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ajax/JavaScriptSupportImpl.java
@@ -13,7 +13,6 @@
 package org.apache.tapestry5.internal.services.ajax;
 
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.Comparator;
 import java.util.List;
 import java.util.Map;
@@ -33,10 +32,8 @@ import org.apache.tapestry5.ioc.internal.util.InternalUtils;
 import org.apache.tapestry5.ioc.util.IdAllocator;
 import org.apache.tapestry5.json.JSONArray;
 import org.apache.tapestry5.json.JSONObject;
-import org.apache.tapestry5.services.javascript.AbstractInitialization;
 import org.apache.tapestry5.services.javascript.EsModuleConfigurationCallback;
 import org.apache.tapestry5.services.javascript.EsModuleInitialization;
-import org.apache.tapestry5.services.javascript.ImportPlacement;
 import org.apache.tapestry5.services.javascript.Initialization;
 import org.apache.tapestry5.services.javascript.InitializationPriority;
 import org.apache.tapestry5.services.javascript.JavaScriptStack;
@@ -81,102 +78,6 @@ public class JavaScriptSupportImpl implements 
JavaScriptSupport
 
     private Map<String, String> libraryURLToStackName, moduleNameToStackName;
 
-    abstract class BaseInitialization<T extends AbstractInitialization<?>> 
implements AbstractInitialization<T>
-    {
-        final String moduleName;
-
-        String functionName;
-
-        JSONArray arguments;
-
-        BaseInitialization(String moduleName)
-        {
-            this.moduleName = moduleName;
-        }
-
-        public T invoke(String functionName)
-        {
-            assert InternalUtils.isNonBlank(functionName);
-
-            this.functionName = functionName;
-
-            return (T) this;
-        }
-
-        public void with(Object... arguments)
-        {
-            assert arguments != null;
-
-            this.arguments = new JSONArray(arguments);
-        }
-    }
-    
-    class InitializationImpl extends BaseInitialization<Initialization> 
implements Initialization
-    {
-        
-        InitializationPriority priority = InitializationPriority.NORMAL;
-
-        public InitializationImpl(String moduleName) 
-        {
-            super(moduleName);
-        }
-        
-        public Initialization priority(InitializationPriority priority)
-        {
-            assert priority != null;
-
-            this.priority = priority;
-
-            return this;
-        }
-        
-    }
-    
-    class EsModuleInitializationImpl extends 
BaseInitialization<EsModuleInitialization> implements EsModuleInitialization
-    {
-        
-        Map<String, String> attributes;
-        ImportPlacement placement = ImportPlacement.BODY_BOTTOM;
-        
-        EsModuleInitializationImpl(String moduleName) 
-        {
-            super(moduleName);
-        }
-
-        public EsModuleInitialization withAttribute(String id, String value) 
-        {
-            if (attributes == null)
-            {
-                attributes = CollectionFactory.newMap();
-            }
-            attributes.put(id, value);
-            return this;
-        }
-
-        public EsModuleInitialization placement(ImportPlacement placement) 
-        {
-            this.placement = placement;
-            return null;
-        }
-
-        public String getModuleId() {
-            return moduleName;
-        }
-
-        public Map<String, String> getAttributes() {
-            return attributes != null ? 
-                    Collections.unmodifiableMap(attributes) : 
-                        Collections.emptyMap();
-        }
-
-        @Override
-        public ImportPlacement getPlacement() {
-            return placement;
-        }
-
-    }
-
-
     public JavaScriptSupportImpl(DocumentLinker linker, JavaScriptStackSource 
javascriptStackSource,
                                  JavaScriptStackPathConstructor 
stackPathConstructor, BooleanHook suppressCoreStylesheetsHook)
     {
diff --git 
a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/javascript/EsModuleManagerImpl.java
 
b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/javascript/EsModuleManagerImpl.java
index 236f72382..a36385c33 100644
--- 
a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/javascript/EsModuleManagerImpl.java
+++ 
b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/javascript/EsModuleManagerImpl.java
@@ -25,11 +25,15 @@ import 
org.apache.tapestry5.commons.util.UnknownValueException;
 import org.apache.tapestry5.dom.Element;
 import org.apache.tapestry5.http.TapestryHttpSymbolConstants;
 import org.apache.tapestry5.internal.InternalConstants;
+import org.apache.tapestry5.internal.services.ajax.EsModuleInitializationImpl;
 import org.apache.tapestry5.internal.services.assets.ResourceChangeTracker;
 import org.apache.tapestry5.ioc.annotations.PostInjection;
 import org.apache.tapestry5.ioc.annotations.Symbol;
 import org.apache.tapestry5.ioc.services.ClasspathMatcher;
 import org.apache.tapestry5.ioc.services.ClasspathScanner;
+import org.apache.tapestry5.json.JSONArray;
+import org.apache.tapestry5.json.JSONCollection;
+import org.apache.tapestry5.json.JSONLiteral;
 import org.apache.tapestry5.json.JSONObject;
 import org.apache.tapestry5.services.AssetSource;
 import org.apache.tapestry5.services.assets.StreamableResourceSource;
@@ -169,9 +173,14 @@ public class EsModuleManagerImpl implements EsModuleManager
         Element body = null;
         Element head = null;
         ImportPlacement placement;
-        for (EsModuleInitialization init : inits) 
+        EsModuleInitializationImpl init;
+        String functionName;
+        Object[] arguments;
+        
+        for (EsModuleInitialization i : inits) 
         {
             
+            init = (EsModuleInitializationImpl) i;
             final String moduleId = init.getModuleId();
             // Making sure the user doesn't shoot heir own foot
             final String url = cache.get(moduleId);
@@ -208,14 +217,11 @@ public class EsModuleManagerImpl implements 
EsModuleManager
                 }
             }
             
-            final Map<String, String> attributes = init.getAttributes();
-            for (String name : attributes.keySet())
-            {
-                script.attribute(name, attributes.get(name));
-            }
-            
+            writeAttributes(script, init);
             script.attribute("src", url);
-            script.attribute("type", "module");
+            
+            functionName = init.getFunctionName();
+            arguments = init.getArguments();
             
             if (!productionMode)
             {
@@ -225,8 +231,101 @@ public class EsModuleManagerImpl implements 
EsModuleManager
                 log.moveBefore(script);
             }
             
+            // If we have not only the import, but also an automatic function 
call
+            if (arguments != null || functionName != null)
+            {
+                final Element moduleFunctionCall = script.element("script");
+                
+                moduleFunctionCall.moveAfter(script);
+                
+                final String moduleFunctionCallFormat = 
+                        "import %s from '%s';\n"
+                        + "%s(%s);";
+                
+                final String importName = functionName != null ? functionName 
: "m";
+                final String importDeclaration = functionName != null ? 
+                        "{ " + functionName + " }": 
+                            "m";
+                
+                final String code = String.format(moduleFunctionCallFormat, 
+                        importDeclaration, moduleId, importName,
+                        convertToJsFunctionParameters(arguments, compactJSON));
+                moduleFunctionCall.text(code);
+                
+                writeAttributes(moduleFunctionCall, init);
+                
+                // Avoiding duplicated ids
+                final String id = moduleFunctionCall.getAttribute("id");
+                if (id != null)
+                {
+                    moduleFunctionCall.forceAttributes("id", id + 
"-function-call");
+                }
+                
+            }
+            
+        }
+        
+    }
+    
+    static String convertToJsFunctionParameters(Object[] arguments, boolean 
compactJSON)
+    {
+        String result;
+        if (arguments == null || arguments.length == 0)
+        {
+            result = "";
+        }
+        else if (arguments.length == 1)
+        {
+            result = convertToJsFunctionParameter(arguments[0], compactJSON);
+        }
+        else {
+            StringBuilder builder = new StringBuilder();
+            for (int i = 0; i < arguments.length; i++) 
+            {
+                if (i > 0)
+                {
+                    builder.append(", ");
+                }
+                builder.append(convertToJsFunctionParameter(arguments[i], 
compactJSON));
+            }
+            result = builder.toString();
+        }
+        return result;
+    }
+
+    static String convertToJsFunctionParameter(Object object, boolean 
compactJSON) 
+    {
+        String result;
+        
+        if (object == null)
+        {
+            result = null;
+        }
+        else if (object instanceof String || object instanceof JSONLiteral)
+        {
+            result = "'" + object.toString() + "'";
+        }
+        else if (object instanceof JSONCollection)
+        {
+            result = ((JSONCollection) object).toString(compactJSON);
+        }
+        else
+        {
+            throw new IllegalArgumentException(String.format(
+                    "Unsupported value: %s (type %s)", object.toString(), 
object.getClass().getName()));
+        }
+        
+        return result;
+    }
+
+    private void writeAttributes(Element script, EsModuleInitializationImpl 
init) {
+        final Map<String, String> attributes = init.getAttributes();
+        for (String name : attributes.keySet())
+        {
+            script.attribute(name, attributes.get(name));
         }
         
+        script.attribute("type", "module");
     }
 
     private JSONObject executeCallbacks(JSONObject importMap, 
List<EsModuleConfigurationCallback> callbacks) 
diff --git 
a/tapestry-core/src/main/java/org/apache/tapestry5/services/javascript/EsModuleInitialization.java
 
b/tapestry-core/src/main/java/org/apache/tapestry5/services/javascript/EsModuleInitialization.java
index 5894bdab3..6647f2e21 100644
--- 
a/tapestry-core/src/main/java/org/apache/tapestry5/services/javascript/EsModuleInitialization.java
+++ 
b/tapestry-core/src/main/java/org/apache/tapestry5/services/javascript/EsModuleInitialization.java
@@ -95,19 +95,4 @@ public interface EsModuleInitialization extends 
AbstractInitialization<EsModuleI
      */
     void with(Object... arguments);
     
-    /**
-     * Returns the module id.
-     */
-    String getModuleId();
-    
-    /**
-     * Returns an unmodifiable view of the attributes.
-     */
-    Map<String, String> getAttributes();
-    
-    /**
-     * Returns the import placement.
-     */
-    ImportPlacement getPlacement();
-    
 }
diff --git 
a/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/EsModuleTests.java
 
b/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/EsModuleTests.java
index 17d5c54f5..32e5311de 100644
--- 
a/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/EsModuleTests.java
+++ 
b/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/EsModuleTests.java
@@ -24,6 +24,7 @@ import org.apache.tapestry5.ioc.annotations.Inject;
 import org.apache.tapestry5.json.JSONObject;
 import org.apache.tapestry5.services.AssetSource;
 import org.apache.tapestry5.services.javascript.EsModuleConfigurationCallback;
+import org.apache.tapestry5.services.javascript.EsModuleInitialization;
 import org.apache.tapestry5.services.javascript.EsModuleManager;
 import org.apache.tapestry5.services.javascript.JavaScriptSupport;
 import org.testng.annotations.Test;
@@ -134,7 +135,49 @@ public class EsModuleTests extends App1TestCase
         openLinks(PAGE_NAME);
         assertEquals(getText("root-folder-message"), "ES module imported 
correctly from the root folder!");
     }
-
+    
+    /**
+     * Tests using {@link EsModuleInitialization#with(Object...)} without using
+     * {@link EsModuleInitialization#invoke(String)} (i.e. invoking the default
+     * exported function with at least one parameter).
+     */
+    @Test
+    public void invoking_default_exported_function() throws 
InterruptedException
+    {
+        openLinks(PAGE_NAME);
+        assertEquals(
+                getText(EsModuleDemo.DEFAULT_EXPORT_MESSAGE), 
+                EsModuleDemo.DEFAULT_EXPORT_PARAMETER);
+    }
+    
+    /**
+     * Tests using {@link EsModuleInitialization#with(Object...)} without using
+     * {@link EsModuleInitialization#invoke(String)} (i.e. invoking the default
+     * exported function). In order words,
+     * {@code javaScriptSupport.importEsModule("foo").with(...)}
+     */
+    @Test
+    public void invoking_non_default_exported_function() throws 
InterruptedException
+    {
+        openLinks(PAGE_NAME);
+        assertEquals(
+                getText(EsModuleDemo.DEFAULT_EXPORT_MESSAGE), 
+                EsModuleDemo.DEFAULT_EXPORT_PARAMETER);
+    }
+    
+    /**
+     * Tests using {@code javaScriptSupport.importEsModule("foo").with()}
+     * (i.e. invoking the default withot parameters)
+     */
+    @Test
+    public void invoking_non_default_exported_function_without_parameters() 
throws InterruptedException
+    {
+        openLinks(PAGE_NAME);
+        assertEquals(
+                getText("parameterless-default-export-message"), 
+                "Parameterless default export!");
+    }
+    
     private void assertModulesDefinedByGlobalCallbacks(JSONObject importMap) {
         assertModuleUrl(NON_OVERRIDDEN_ES_MODULE_ID, 
NON_OVERRIDDEN_ES_MODULE_URL, importMap);
         assertModuleUrl(OVERRIDDEN_ES_MODULE_ID, OVERRIDDEN_ES_MODULE_NEW_URL, 
importMap);
diff --git 
a/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/EsModuleDemo.java
 
b/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/EsModuleDemo.java
index 101cd71aa..bc69029e2 100644
--- 
a/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/EsModuleDemo.java
+++ 
b/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/EsModuleDemo.java
@@ -15,6 +15,7 @@ package org.apache.tapestry5.integration.app1.pages;
 import org.apache.tapestry5.annotations.Import;
 import org.apache.tapestry5.annotations.Property;
 import org.apache.tapestry5.annotations.SetupRender;
+import org.apache.tapestry5.integration.app1.EsModuleTests;
 import org.apache.tapestry5.integration.app1.services.AppModule;
 import org.apache.tapestry5.ioc.annotations.Inject;
 import org.apache.tapestry5.services.javascript.EsModuleConfigurationCallback;
@@ -24,6 +25,10 @@ import 
org.apache.tapestry5.services.javascript.JavaScriptSupport;
 @Import(esModule = {"root-folder"})
 public class EsModuleDemo
 {
+    public static final String DEFAULT_EXPORT_MESSAGE = 
"default-export-message";
+
+    public static final String DEFAULT_EXPORT_PARAMETER = "Importing module 
exporting single function!";
+
     public static final String REQUEST_OVERRIDEN_MODULE_URL = 
"/overridenAgainURL";
 
     @Inject
@@ -51,6 +56,16 @@ public class EsModuleDemo
             .placement(ImportPlacement.HEAD);
         javaScriptSupport.importEsModule("outside-metainf");        
         javaScriptSupport.importEsModule("show-import-map");
+        
+        javaScriptSupport.importEsModule("default-export")
+            .with(EsModuleDemo.DEFAULT_EXPORT_MESSAGE, 
EsModuleDemo.DEFAULT_EXPORT_PARAMETER);
+        
+        javaScriptSupport.importEsModule("non-default-export")
+            .invoke("setMessage");
+        
+        // Both .with() and .invoke() cause the function to be invoked
+        javaScriptSupport.importEsModule("parameterless-default-export")
+            .with();
 
         if (overrideEsModuleImportAgain != null && overrideEsModuleImportAgain)
         {
diff --git 
a/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/javascript/EsModuleManagerImplTest.java
 
b/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/javascript/EsModuleManagerImplTest.java
new file mode 100644
index 000000000..b357f9e41
--- /dev/null
+++ 
b/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/javascript/EsModuleManagerImplTest.java
@@ -0,0 +1,89 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry5.internal.services.javascript;
+
+import static org.testng.Assert.assertEquals;
+
+import org.apache.tapestry5.json.JSONArray;
+import org.apache.tapestry5.json.JSONLiteral;
+import org.apache.tapestry5.json.JSONObject;
+import org.testng.annotations.Test;
+
+public class EsModuleManagerImplTest 
+{
+    private static final String STRING = "asdfasdfasdfadsf";
+
+    private static final JSONLiteral JSON_LITERAL = new 
JSONLiteral("literally");
+    private static final JSONArray JSON_ARRAY = new JSONArray("1", "true");
+    private static JSONObject JSON_OBJECT = new JSONObject("something", 
"else", "array",
+            JSON_ARRAY, "literal", JSON_LITERAL);
+    
+
+    @Test
+    public void test_null_arguments()
+    {
+        assertEquals(convert(null, true), "");
+        assertEquals(convert(null, false), "");
+    }
+    
+    @Test
+    public void test_empty_arguments()
+    {
+        assertEquals(convert(new Object[0], true), "");
+        assertEquals(convert(new Object[0], false), "");
+    }
+    
+    @Test
+    public void test_one_argument()
+    {
+        assertEquals(convert(new Object[] {null}, false), null);
+        
+        assertEquals(convert(new Object[] {STRING}, false), quote(STRING));
+
+        assertEquals(convert(new Object[] {JSON_LITERAL}, false), 
quote(JSON_LITERAL.toString()));
+
+        assertEquals(convert(new Object[] {JSON_ARRAY}, false), 
JSON_ARRAY.toString(false));
+        assertEquals(convert(new Object[] {JSON_ARRAY}, true), 
JSON_ARRAY.toString(true));
+
+        assertEquals(convert(new Object[] {JSON_OBJECT}, false), 
JSON_OBJECT.toString(false));
+        assertEquals(convert(new Object[] {JSON_OBJECT}, true), 
JSON_OBJECT.toString(true));
+
+    }
+    
+    @Test
+    public void test_multiple_arguments()
+    {
+        Object[] arguments = new Object[] { null, STRING, JSON_LITERAL, 
JSON_ARRAY, JSON_OBJECT };
+        final String format = "null, '%s', '%s', %s, %s";
+        
+        assertEquals(convert(arguments, false), 
+                String.format(format, STRING, JSON_LITERAL, 
+                        JSON_ARRAY.toString(false), 
JSON_OBJECT.toString(false)));
+        
+        assertEquals(convert(arguments, true), 
+                String.format(format, STRING, JSON_LITERAL, 
+                        JSON_ARRAY.toString(true), 
JSON_OBJECT.toString(true)));
+
+    }
+    
+    private String quote(String string)
+    {
+        return "'" + string + "'";
+    }
+
+    private String convert(Object[] blah, boolean compactJSON) 
+    {
+        return EsModuleManagerImpl.convertToJsFunctionParameters(blah, 
compactJSON);
+    }
+    
+}
diff --git 
a/tapestry-core/src/test/resources/META-INF/assets/es-modules/default-export.js 
b/tapestry-core/src/test/resources/META-INF/assets/es-modules/default-export.js
new file mode 100644
index 000000000..671a2c21c
--- /dev/null
+++ 
b/tapestry-core/src/test/resources/META-INF/assets/es-modules/default-export.js
@@ -0,0 +1,3 @@
+export default function(id, message) {
+       document.getElementById(id).innerHTML = message;
+}
\ No newline at end of file
diff --git 
a/tapestry-core/src/test/resources/META-INF/assets/es-modules/non-default-export.js
 
b/tapestry-core/src/test/resources/META-INF/assets/es-modules/non-default-export.js
new file mode 100644
index 000000000..f6cf336a0
--- /dev/null
+++ 
b/tapestry-core/src/test/resources/META-INF/assets/es-modules/non-default-export.js
@@ -0,0 +1,6 @@
+function setMessage() {
+       document.getElementById("non-default-export-message").innerHTML = 
+               "Non-default exported function!";
+}
+
+export { setMessage };
\ No newline at end of file
diff --git 
a/tapestry-core/src/test/resources/META-INF/assets/es-modules/parameterless-default-export.js
 
b/tapestry-core/src/test/resources/META-INF/assets/es-modules/parameterless-default-export.js
new file mode 100644
index 000000000..32d1a2c0e
--- /dev/null
+++ 
b/tapestry-core/src/test/resources/META-INF/assets/es-modules/parameterless-default-export.js
@@ -0,0 +1,3 @@
+export default function() {
+       
document.getElementById("parameterless-default-export-message").innerHTML = 
"Parameterless default export!";
+}
\ No newline at end of file
diff --git 
a/tapestry-core/src/test/resources/org/apache/tapestry5/integration/app1/pages/EsModuleDemo.tml
 
b/tapestry-core/src/test/resources/org/apache/tapestry5/integration/app1/pages/EsModuleDemo.tml
index 4c6c3fde5..df08c79ed 100644
--- 
a/tapestry-core/src/test/resources/org/apache/tapestry5/integration/app1/pages/EsModuleDemo.tml
+++ 
b/tapestry-core/src/test/resources/org/apache/tapestry5/integration/app1/pages/EsModuleDemo.tml
@@ -19,6 +19,9 @@
        <p id="body-bottom-message"/>
        <p id="root-folder-message"/>
        <p id="outside-metainf-message"/>
+       <p id="${DEFAULT_EXPORT_MESSAGE}"/>
+       <p id="non-default-export-message"/>
+       <p id="parameterless-default-export-message"/>
        
        <p>
                Import map:
@@ -26,5 +29,5 @@
        <pre id="import-map-listing"/>
        
        <p id="last-body-element"></p>
-
+       
 </html>
\ No newline at end of file

Reply via email to