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");
     }
 
     /**

Reply via email to