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

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


The following commit(s) were added to refs/heads/feature/requirejs-less by this 
push:
     new 95b0b5a1c TAP5-2810: fixing ES modules and pageinit relationship
95b0b5a1c is described below

commit 95b0b5a1cb9c2ea54d439744397b58fd08578d44
Author: Thiago H. de Paula Figueiredo <[email protected]>
AuthorDate: Sat Jul 26 19:10:56 2025 -0300

    TAP5-2810: fixing ES modules and pageinit relationship
---
 .../internal/services/EsModuleInitsManager.java    | 39 ++++++++++++++++++++--
 .../services/PartialMarkupDocumentLinker.java      | 12 +++++--
 .../services/ajax/EsModuleInitializationImpl.java  | 10 +++---
 .../services/javascript/EsModuleManagerImpl.java   | 20 +++++------
 .../src/main/typescript/src/t5/core/pageinit.ts    | 13 ++++++--
 .../integration/app1/pages/EsModuleDemo.java       |  2 +-
 .../integration/app1/services/AppModule.java       |  2 +-
 .../javascript/EsModuleManagerImplTest.java        | 39 ++++++++++++----------
 .../src/test/resources/META-INF/assets/zonedemo.js | 22 ++++++++++--
 9 files changed, 117 insertions(+), 42 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 e3fc767fe..04f3a2a67 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
@@ -25,11 +25,14 @@
 
 package org.apache.tapestry5.internal.services;
 
+import java.util.ArrayList;
+import java.util.Collections;
 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.json.JSONArray;
 import org.apache.tapestry5.services.javascript.EsModuleInitialization;
 
 public class EsModuleInitsManager
@@ -37,13 +40,13 @@ public class EsModuleInitsManager
     private final Set<String> modules = CollectionFactory.newSet();
     
     private final List<EsModuleInitialization> initializations = 
CollectionFactory.newList();
-
+    
     public void add(EsModuleInitialization initialization)
     {
         assert initialization != null;
 
         // We ignore a module being added again.
-        final String moduleName = ((EsModuleInitializationImpl) 
initialization).getModuleId();
+        final String moduleName = ((EsModuleInitializationImpl) 
initialization).getModuleName();
         if (!modules.contains(moduleName))
         {
             initializations.add(initialization);
@@ -58,4 +61,36 @@ public class EsModuleInitsManager
     {
         return initializations;
     }
+    
+    /**
+     * Returns all previously added inits as JSONArray instances.
+     */
+    public List<JSONArray> getInitsAsJsonArrays()
+    {
+        
+        List<JSONArray> list;
+        if (!initializations.isEmpty()) 
+        {
+            list = new ArrayList<>(initializations.size());
+            for (EsModuleInitialization init : initializations) 
+            {
+                final EsModuleInitializationImpl initImpl = 
(EsModuleInitializationImpl) init;
+                final JSONArray arguments = initImpl.getArguments();
+                if (arguments != null)
+                {
+                    list.add(new JSONArray(initImpl.getModuleName(), 
arguments));
+                }
+                else
+                {
+                    list.add(new JSONArray().put(initImpl.getModuleName()));
+                }
+            }
+        }
+        else
+        {
+            list = Collections.emptyList();
+        }
+        return list;
+    }
+
 }
diff --git 
a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PartialMarkupDocumentLinker.java
 
b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PartialMarkupDocumentLinker.java
index 9ccf81629..ae0614459 100644
--- 
a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PartialMarkupDocumentLinker.java
+++ 
b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PartialMarkupDocumentLinker.java
@@ -24,6 +24,7 @@ import 
org.apache.tapestry5.services.javascript.InitializationPriority;
 import org.apache.tapestry5.services.javascript.ModuleConfigurationCallback;
 import org.apache.tapestry5.services.javascript.StylesheetLink;
 
+import java.util.ArrayList;
 import java.util.List;
 
 public class PartialMarkupDocumentLinker implements DocumentLinker
@@ -34,6 +35,8 @@ public class PartialMarkupDocumentLinker implements 
DocumentLinker
 
     private final ModuleInitsManager initsManager = new ModuleInitsManager();
     
+    private final EsModuleInitsManager esModulesinitsManager = new 
EsModuleInitsManager();
+    
     public void addCoreLibrary(String libraryURL)
     {
         notImplemented("addCoreLibrary");
@@ -84,7 +87,7 @@ public class PartialMarkupDocumentLinker implements 
DocumentLinker
     @Override
     public void addEsModuleInitialization(EsModuleInitialization 
initialization) 
     {
-        notImplemented("addEsModuleInitialization");
+        esModulesinitsManager.add(initialization);
     }
 
     /**
@@ -106,10 +109,15 @@ public class PartialMarkupDocumentLinker implements 
DocumentLinker
         }
 
         List<?> inits = initsManager.getSortedInits();
+        final List<?> esModuleInits = 
esModulesinitsManager.getInitsAsJsonArrays();
 
-        if (inits.size() > 0)
+        if (inits.size() > 0 || esModuleInits.size() > 0)
         {
+            List<Object> allInits = new ArrayList<>(inits.size() + 
esModuleInits.size());
+            allInits.addAll(inits);
+            allInits.addAll(esModuleInits);
             reply.in(InternalConstants.PARTIAL_KEY).put("inits", 
JSONArray.from(inits));
         }
+        
     }
 }
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
index eb4e32137..1fd947592 100644
--- 
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
@@ -14,6 +14,7 @@ import java.util.Collections;
 import java.util.Map;
 
 import org.apache.tapestry5.commons.util.CollectionFactory;
+import org.apache.tapestry5.json.JSONArray;
 import org.apache.tapestry5.services.javascript.EsModuleInitialization;
 import org.apache.tapestry5.services.javascript.ImportPlacement;
 
@@ -22,7 +23,7 @@ public class EsModuleInitializationImpl extends 
BaseInitialization<EsModuleIniti
     
     private Map<String, String> attributes;
     private ImportPlacement placement = ImportPlacement.BODY_BOTTOM;
-    private Object[] arguments;
+    private JSONArray arguments;
     
     public EsModuleInitializationImpl(String moduleName) 
     {
@@ -45,7 +46,7 @@ public class EsModuleInitializationImpl extends 
BaseInitialization<EsModuleIniti
         return null;
     }
 
-    public String getModuleId() {
+    public String getModuleName() {
         return moduleName;
     }
 
@@ -66,10 +67,11 @@ public class EsModuleInitializationImpl extends 
BaseInitialization<EsModuleIniti
     @Override
     public void with(Object... arguments) 
     {
-        this.arguments = arguments;
+        assert arguments != null;
+        this.arguments = new JSONArray(arguments);
     }
     
-    public Object[] getArguments() 
+    public JSONArray getArguments() 
     {
         return arguments;
     }
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 5cfebf058..6c56cbf52 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
@@ -218,7 +218,7 @@ public class EsModuleManagerImpl implements EsModuleManager
         ImportPlacement placement;
         EsModuleInitializationImpl init;
         String functionName;
-        Object[] arguments;
+        JSONArray arguments;
         
         List<EsModuleInitialization> allInits = new 
ArrayList<>(coreStackInits.size() + inits.size());
         allInits.addAll(coreStackInits);
@@ -228,7 +228,7 @@ public class EsModuleManagerImpl implements EsModuleManager
         {
             
             init = (EsModuleInitializationImpl) i;
-            final String moduleId = init.getModuleId();
+            final String moduleId = init.getModuleName();
             // Making sure the user doesn't shoot their own foot
             final String url = cache.get(moduleId);
             if (url == null)
@@ -329,26 +329,26 @@ public class EsModuleManagerImpl implements 
EsModuleManager
     }
 
 
-    static String convertToJsFunctionParameters(Object[] arguments, boolean 
compactJSON)
+    static String convertToJsFunctionParameters(JSONArray arguments, boolean 
compactJSON)
     {
         String result;
-        if (arguments == null || arguments.length == 0)
+        if (arguments == null || arguments.size() == 0)
         {
             result = "";
         }
-        else if (arguments.length == 1)
+        else if (arguments.size() == 1)
         {
-            result = convertToJsFunctionParameter(arguments[0], compactJSON);
+            result = convertToJsFunctionParameter(arguments.get(0), 
compactJSON);
         }
         else {
             StringBuilder builder = new StringBuilder();
-            for (int i = 0; i < arguments.length; i++) 
+            for (int i = 0; i < arguments.size(); i++) 
             {
                 if (i > 0)
                 {
                     builder.append(", ");
                 }
-                builder.append(convertToJsFunctionParameter(arguments[i], 
compactJSON));
+                builder.append(convertToJsFunctionParameter(arguments.get(i), 
compactJSON));
             }
             result = builder.toString();
         }
@@ -359,9 +359,9 @@ public class EsModuleManagerImpl implements EsModuleManager
     {
         String result;
         
-        if (object == null)
+        if (object == null || object == JSONObject.NULL)
         {
-            result = null;
+            result = "null";
         }
         else if (object instanceof String || object instanceof JSONLiteral)
         {
diff --git a/tapestry-core/src/main/typescript/src/t5/core/pageinit.ts 
b/tapestry-core/src/main/typescript/src/t5/core/pageinit.ts
index 5100e68bd..197af3680 100644
--- a/tapestry-core/src/main/typescript/src/t5/core/pageinit.ts
+++ b/tapestry-core/src/main/typescript/src/t5/core/pageinit.ts
@@ -35,6 +35,8 @@ const isOpera = Object.prototype.toString.call(window.opera) 
=== '[object Opera]
 // @ts-ignore
 const isIE = !!window.attachEvent && !isOpera;
 
+const requireJsEnabled = "true" == 
document.querySelector("body")?.dataset['requireJsEnabled'];
+
 const rebuildURL = function(path: string) {
   if (path.match(/^https?:/)) { return path; }
 
@@ -160,8 +162,13 @@ function loadLibraries(libraries: string[], callback: () 
=> any) {
   // @ts-ignore
   const reducer = (callback, library) => (function() {
     console.debug(`Loading library ${library}`);
-    // @ts-ignore
-    return require([library], callback);
+    if (requireJsEnabled) {
+      // @ts-ignore
+      return require([library], callback);
+    }
+    else {
+      return import(library).then(callback);
+    }
   });
 
   const finalCallback = _.reduceRight(libraries, reducer, callback);
@@ -250,7 +257,7 @@ export default exports_ = 
_.extend(loadLibrariesAndInitialize, {
   // second, which helps ensure that other initializions on the page are in 
place.
   //
   // * fieldId - element id of field to focus on
-  focus(fieldId: string) {
+  focus: function(fieldId: string) {
     const field = dom(fieldId);
 
     if (field) {
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 de17500ba..f58e2c674 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
@@ -69,7 +69,7 @@ public class EsModuleDemo
             .with();
 
         javaScriptSupport.importEsModule("parameter-type-default-export")
-            .with(null, true, false, Math.PI * Math.E, "string", "jsonLiteral",
+            .with(JSONObject.NULL, true, false, Math.PI * Math.E, "string", 
"jsonLiteral",
                     new JSONObject("key", "value"), new JSONArray(1, "2"));
 
         if (overrideEsModuleImportAgain != null && overrideEsModuleImportAgain)
diff --git 
a/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/services/AppModule.java
 
b/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/services/AppModule.java
index d067f8cac..b5c7017cc 100644
--- 
a/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/services/AppModule.java
+++ 
b/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/services/AppModule.java
@@ -187,7 +187,7 @@ public class AppModule
         // This is the emphasis of testing at this point.
         configuration.add(SymbolConstants.JAVASCRIPT_INFRASTRUCTURE_PROVIDER, 
"jquery");
 
-        configuration.add(D3_URL_SYMBOL, 
"cdnjs.cloudflare.com/ajax/libs/d3/3.0.0/d3.js");
+        configuration.add(D3_URL_SYMBOL, 
"cdnjs.cloudflare.com/ajax/libs/d3/7.9.0/d3.js");
         configuration.add(SymbolConstants.PRELOADER_MODE, 
PreloaderMode.ALWAYS);
         configuration.add(SymbolConstants.OPENAPI_APPLICATION_VERSION, 
"1.2.3.4");
         configuration.add(SymbolConstants.OPENAPI_BASE_PATH, "/rest/");
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
index 0e41bc12e..055dcac92 100644
--- 
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
@@ -32,42 +32,42 @@ public class EsModuleManagerImplTest
     @Test
     public void test_null_arguments()
     {
-        assertEquals(convert(null, true), "");
-        assertEquals(convert(null, false), "");
+        assertEquals(convert(JSONObject.NULL, true), "null");
+        assertEquals(convert(JSONObject.NULL, false), "null");
     }
     
     @Test
     public void test_empty_arguments()
     {
-        assertEquals(convert(new Object[0], true), "");
-        assertEquals(convert(new Object[0], false), "");
+        assertEquals(convert(new JSONArray(), true), "");
+        assertEquals(convert(new JSONArray(), false), "");
     }
     
     @Test
     public void test_one_argument()
     {
-        assertEquals(convert(new Object[] {null}, false), null);
+        assertEquals(convert(new JSONArray(JSONObject.NULL), false), "null");
         
-        assertEquals(convert(new Object[] {STRING}, false), quote(STRING));
+        assertEquals(convert(new JSONArray().put(STRING), false), 
quote(STRING));
         
-        assertEquals(convert(new Object[] {NUMBER}, false), NUMBER.toString());
-        assertEquals(convert(new Object[] {Boolean.TRUE}, false), 
Boolean.TRUE.toString());
-        assertEquals(convert(new Object[] {Boolean.FALSE}, false), 
Boolean.FALSE.toString());
+        assertEquals(convert(new JSONArray(NUMBER), false), NUMBER.toString());
+        assertEquals(convert(new JSONArray(Boolean.TRUE), false), 
Boolean.TRUE.toString());
+        assertEquals(convert(new JSONArray(Boolean.FALSE), false), 
Boolean.FALSE.toString());
 
-        assertEquals(convert(new Object[] {JSON_LITERAL}, false), 
quote(JSON_LITERAL.toString()));
+        assertEquals(convert(new JSONArray(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 JSONArray(JSON_ARRAY), false), 
JSON_ARRAY.toString(false));
+        assertEquals(convert(new JSONArray(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));
+        assertEquals(convert(new JSONArray(JSON_OBJECT), false), 
JSON_OBJECT.toString(false));
+        assertEquals(convert(new JSONArray(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 };
+        JSONArray arguments = new JSONArray(JSONObject.NULL, STRING, 
JSON_LITERAL, JSON_ARRAY, JSON_OBJECT);
         final String format = "null, '%s', '%s', %s, %s";
         
         assertEquals(convert(arguments, false), 
@@ -84,10 +84,15 @@ public class EsModuleManagerImplTest
     {
         return "'" + string + "'";
     }
+    
+    private String convert(Object object, boolean compactJSON) 
+    {
+        return convert(new JSONArray(object), compactJSON);
+    }
 
-    private String convert(Object[] blah, boolean compactJSON) 
+    private String convert(JSONArray array, boolean compactJSON) 
     {
-        return EsModuleManagerImpl.convertToJsFunctionParameters(blah, 
compactJSON);
+        return EsModuleManagerImpl.convertToJsFunctionParameters(array, 
compactJSON);
     }
     
 }
diff --git a/tapestry-core/src/test/resources/META-INF/assets/zonedemo.js 
b/tapestry-core/src/test/resources/META-INF/assets/zonedemo.js
index 9ab069ff9..015dfe198 100644
--- a/tapestry-core/src/test/resources/META-INF/assets/zonedemo.js
+++ b/tapestry-core/src/test/resources/META-INF/assets/zonedemo.js
@@ -3,5 +3,23 @@
  * DS102: Remove unnecessary code created because of implicit returns
  * Full docs: 
https://github.com/decaffeinate/decaffeinate/blob/main/docs/suggestions.md
  */
-require(["t5/core/dom", "t5/core/events"],
-  (dom, events) => dom.default.onDocument(events.default.zone.didUpdate, () => 
(dom.default("zone-update-message")).update("Zone updated.")));
+
+function execute(dom, events) {
+       dom.default.onDocument(events.default.zone.didUpdate, function() {
+               dom.default("zone-update-message").update("Zone updated.");
+       });
+}
+
+if (typeof require !== 'undefined') {
+       require(["t5/core/dom", "t5/core/events"], function(dom, events) {
+               execute(dom, events);
+       });
+         
+}
+else {
+       import("t5/core/dom").then((dom) => { 
+               import("t5/core/events").then((events) => {
+                       execute(dom, events);
+               });
+       });
+}
\ No newline at end of file

Reply via email to