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 <[email protected]>
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