This is an automated email from the ASF dual-hosted git repository. thiagohp pushed a commit to branch feature/coffeescript-to-typescript in repository https://gitbox.apache.org/repos/asf/tapestry-5.git
commit 81834811be1e2efe2e3f15639c00614ba6c83e92 Author: Thiago H. de Paula Figueiredo <[email protected]> AuthorDate: Sat May 3 08:20:10 2025 -0300 TAP5-2804: initial work on option to disable Require.js --- .../java/org/apache/tapestry5/SymbolConstants.java | 21 ++++----- .../javascript/ConfigureHTMLElementFilter.java | 13 +++++- .../services/javascript/ModuleManagerImpl.java | 18 +++++++- .../internal/util/MessageCatalogResource.java | 15 ++++++- .../apache/tapestry5/modules/JavaScriptModule.java | 51 +++++++++++----------- .../apache/tapestry5/modules/TapestryModule.java | 2 + 6 files changed, 78 insertions(+), 42 deletions(-) diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/SymbolConstants.java b/tapestry-core/src/main/java/org/apache/tapestry5/SymbolConstants.java index 47a5cadd7..f9d16f875 100644 --- a/tapestry-core/src/main/java/org/apache/tapestry5/SymbolConstants.java +++ b/tapestry-core/src/main/java/org/apache/tapestry5/SymbolConstants.java @@ -386,18 +386,6 @@ public class SymbolConstants */ public static final String MODULE_PATH_PREFIX = "tapestry.module-path-prefix"; - /** - * Prefix used for automatically configured ES module resources. - * This may contain slashes, but should not being or end with one. - * - * The default is "es-modules". - * - * TODO remove - * - * @since 5.4 - */ - public static final String ES_MODULE_PATH_PREFIX = "tapestry.es-module-path-prefix"; - /** * Identifies the context path of the application, as determined from {@link jakarta.servlet.ServletContext#getContextPath()}. * This is either a blank string or a string that starts with a slash but does not end with one. @@ -821,5 +809,14 @@ public class SymbolConstants * @since 5.8.4 */ public static final String COMPONENT_DEPENDENCY_FILE = "tapestry.component-dependency-file"; + + /** + * Defines whether ES modules will be used, being managed by the browser. + * If not, Require.js will be used to manage AMD modules. Default value: + * {@code false} (i.e. AMD modules and Require.js). + * + * @since 5.10.0 + */ + public static final String ES_MODULES_ENABLED = "tapestry.es-modules-enabled"; } diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/javascript/ConfigureHTMLElementFilter.java b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/javascript/ConfigureHTMLElementFilter.java index aab9c2e94..c5008d087 100644 --- a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/javascript/ConfigureHTMLElementFilter.java +++ b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/javascript/ConfigureHTMLElementFilter.java @@ -15,6 +15,7 @@ package org.apache.tapestry5.internal.services.javascript; import org.apache.tapestry5.MarkupWriter; +import org.apache.tapestry5.SymbolConstants; import org.apache.tapestry5.dom.Element; import org.apache.tapestry5.http.TapestryHttpSymbolConstants; import org.apache.tapestry5.ioc.annotations.Symbol; @@ -33,11 +34,18 @@ public class ConfigureHTMLElementFilter implements MarkupRendererFilter private final ThreadLocale threadLocale; private final boolean debugEnabled; + + private final String esModulesEnabled; - public ConfigureHTMLElementFilter(ThreadLocale threadLocale, @Symbol(TapestryHttpSymbolConstants.PRODUCTION_MODE) boolean productionMode) + public ConfigureHTMLElementFilter(ThreadLocale threadLocale, + @Symbol(TapestryHttpSymbolConstants.PRODUCTION_MODE) + boolean productionMode, + @Symbol(SymbolConstants.ES_MODULES_ENABLED) + boolean esModulesEnabled) { this.threadLocale = threadLocale; this.debugEnabled = !productionMode; + this.esModulesEnabled = String.valueOf(esModulesEnabled); } public void renderMarkup(MarkupWriter writer, MarkupRenderer renderer) @@ -52,7 +60,8 @@ public class ConfigureHTMLElementFilter implements MarkupRendererFilter // to describe locale, and if debug is enabled. if (html != null) { - html.attributes("data-locale", threadLocale.getLocale().toString()); + html.attributes("data-locale", threadLocale.getLocale().toString(), + "data-es-modules-enabled", esModulesEnabled); if (debugEnabled) { diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/javascript/ModuleManagerImpl.java b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/javascript/ModuleManagerImpl.java index c56f45a96..7f198b456 100644 --- a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/javascript/ModuleManagerImpl.java +++ b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/javascript/ModuleManagerImpl.java @@ -58,6 +58,10 @@ public class ModuleManagerImpl implements ModuleManager private final JSONObject baseConfig; private final String basePath, compressedBasePath; + + private final String actualDomModule; + + private static final String DOM_MODULE = "t5/core/dom"; public ModuleManagerImpl(ResponseCompressionAnalyzer compressionAnalyzer, AssetSource assetSource, @@ -70,7 +74,9 @@ public class ModuleManagerImpl implements ModuleManager boolean productionMode, @Symbol(SymbolConstants.MODULE_PATH_PREFIX) String modulePathPrefix, - PathConstructor pathConstructor) + PathConstructor pathConstructor, + @Symbol(SymbolConstants.JAVASCRIPT_INFRASTRUCTURE_PROVIDER) + String infraProvider) { this.compressionAnalyzer = compressionAnalyzer; this.globalMessages = globalMessages; @@ -85,6 +91,9 @@ public class ModuleManagerImpl implements ModuleManager extensions.addAll(streamableResourceSource.fileExtensionsForContentType(InternalConstants.JAVASCRIPT_CONTENT_TYPE)); baseConfig = buildBaseConfig(configuration, !productionMode); + + actualDomModule = "t5/core/t5-core-dom-" + infraProvider; + } private String buildRequireJSConfig(List<ModuleConfigurationCallback> callbacks) @@ -228,6 +237,13 @@ public class ModuleManagerImpl implements ModuleManager { return resource; } + + // Trick to get the correct t5/core/dom implementation being + // returned when that module is requested. + if (moduleName.equals(DOM_MODULE)) + { + moduleName = actualDomModule; + } // Tack on a fake extension; otherwise modules whose name includes a '.' get mangled // by Resource.withExtension(). diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/internal/util/MessageCatalogResource.java b/tapestry-core/src/main/java/org/apache/tapestry5/internal/util/MessageCatalogResource.java index 8992efe59..c8120833e 100644 --- a/tapestry-core/src/main/java/org/apache/tapestry5/internal/util/MessageCatalogResource.java +++ b/tapestry-core/src/main/java/org/apache/tapestry5/internal/util/MessageCatalogResource.java @@ -33,12 +33,15 @@ public class MessageCatalogResource extends VirtualResource private final boolean compactJSON; private volatile byte[] bytes; + + private final boolean esModule; - public MessageCatalogResource(Locale locale, ComponentMessagesSource messagesSource, final ResourceChangeTracker changeTracker, boolean compactJSON) + public MessageCatalogResource(boolean esModule, Locale locale, ComponentMessagesSource messagesSource, final ResourceChangeTracker changeTracker, boolean compactJSON) { this.locale = locale; this.messagesSource = messagesSource; this.compactJSON = compactJSON; + this.esModule = esModule; messagesSource.getInvalidationEventHub().addInvalidationCallback(new Runnable() { @@ -127,7 +130,15 @@ public class MessageCatalogResource extends VirtualResource StringBuilder builder = new StringBuilder(2000); - builder.append("define(").append(catalog.toString(compactJSON)).append(");"); + final String json = catalog.toString(compactJSON); + if (esModule) + { + builder.append("export default ").append(json).append(";"); + } + else + { + builder.append("define(").append(json).append(");"); + } return builder.toString(); } diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/modules/JavaScriptModule.java b/tapestry-core/src/main/java/org/apache/tapestry5/modules/JavaScriptModule.java index 560ba0d12..d1a20145f 100644 --- a/tapestry-core/src/main/java/org/apache/tapestry5/modules/JavaScriptModule.java +++ b/tapestry-core/src/main/java/org/apache/tapestry5/modules/JavaScriptModule.java @@ -61,6 +61,7 @@ import org.apache.tapestry5.services.PathConstructor; import org.apache.tapestry5.services.compatibility.Compatibility; import org.apache.tapestry5.services.compatibility.Trait; import org.apache.tapestry5.services.javascript.AMDWrapper; +import org.apache.tapestry5.services.javascript.EsModuleConfigurationCallback; import org.apache.tapestry5.services.javascript.EsModuleManager; import org.apache.tapestry5.services.javascript.ExtensibleJavaScriptStack; import org.apache.tapestry5.services.javascript.JavaScriptModuleConfiguration; @@ -493,30 +494,6 @@ public class JavaScriptModule { configuration.add(SymbolConstants.JAVASCRIPT_INFRASTRUCTURE_PROVIDER, "prototype"); configuration.add(SymbolConstants.MODULE_PATH_PREFIX, "modules"); - configuration.add(SymbolConstants.ES_MODULE_PATH_PREFIX, "es-modules"); - } - - @Contribute(ModuleManager.class) - public static void setupFoundationFramework(MappedConfiguration<String, Object> configuration, - @Symbol(SymbolConstants.JAVASCRIPT_INFRASTRUCTURE_PROVIDER) - String provider, - @Path("classpath:org/apache/tapestry5/t5-core-dom-prototype.js") - Resource domPrototype, - @Path("classpath:org/apache/tapestry5/t5-core-dom-jquery.js") - Resource domJQuery) - { - if (provider.equals("prototype")) - { - configuration.add("t5/core/dom", new JavaScriptModuleConfiguration(domPrototype)); - } - - if (provider.equals("jquery")) - { - configuration.add("t5/core/dom", new JavaScriptModuleConfiguration(domJQuery)); - } - - // If someone wants to support a different infrastructure, they should set the provider symbol to some other value - // and contribute their own version of the t5/core/dom module. } @Contribute(ModuleManager.class) @@ -528,11 +505,35 @@ public class JavaScriptModule { for (Locale locale : localizationSetter.getSupportedLocales()) { - MessageCatalogResource resource = new MessageCatalogResource(locale, messagesSource, resourceChangeTracker, compactJSON); + MessageCatalogResource resource = new MessageCatalogResource(false, locale, messagesSource, resourceChangeTracker, compactJSON); configuration.add("t5/core/messages/" + locale.toString(), new JavaScriptModuleConfiguration(resource)); } } + + @Contribute(EsModuleManager.class) + public static void setupApplicationCatalogEsModules(OrderedConfiguration<EsModuleConfigurationCallback> configuration, + LocalizationSetter localizationSetter, + ComponentMessagesSource messagesSource, + ResourceChangeTracker resourceChangeTracker, + @Symbol(SymbolConstants.COMPACT_JSON) boolean compactJSON) + { + + EsModuleConfigurationCallback callback = jsonObject -> { + + for (Locale locale : localizationSetter.getSupportedLocales()) + { + MessageCatalogResource resource = new MessageCatalogResource(false, locale, messagesSource, resourceChangeTracker, compactJSON); + + jsonObject.put("t5/core/messages/" + locale.toString(), resource.toURL()); + } + + }; + + configuration.add("ApplicationCatalog", callback); + + } + /** * Contributes 'ConfigureHTMLElement', which writes the attributes into the HTML tag to describe locale, etc. diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/modules/TapestryModule.java b/tapestry-core/src/main/java/org/apache/tapestry5/modules/TapestryModule.java index ff6075d85..a3f42084d 100644 --- a/tapestry-core/src/main/java/org/apache/tapestry5/modules/TapestryModule.java +++ b/tapestry-core/src/main/java/org/apache/tapestry5/modules/TapestryModule.java @@ -2212,6 +2212,8 @@ public final class TapestryModule configuration.add(SymbolConstants.PUBLISH_OPENAPI_DEFINITON, "false"); configuration.add(SymbolConstants.OPENAPI_DESCRIPTION_PATH, "/openapi.json"); configuration.add(SymbolConstants.OPENAPI_BASE_PATH, "/"); + + configuration.add(SymbolConstants.ES_MODULES_ENABLED, "false"); } /**
