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