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 9645d2a69 TAP5-2810: ES modules for Bootstrap JS
9645d2a69 is described below

commit 9645d2a69b4a12046eb6cc923999c28b1b0783a5
Author: Thiago H. de Paula Figueiredo <thi...@arsmachina.com.br>
AuthorDate: Fri Jul 11 15:03:15 2025 -0300

    TAP5-2810: ES modules for Bootstrap JS
---
 5_10_RELEASE_NOTES.md                              | 20 ++++++--
 .../apache/tapestry5/modules/JavaScriptModule.java | 55 ++++++++++++++++++++++
 .../integration/app1/services/AppModule.java       |  1 -
 3 files changed, 70 insertions(+), 6 deletions(-)

diff --git a/5_10_RELEASE_NOTES.md b/5_10_RELEASE_NOTES.md
index d62d92163..05f469737 100644
--- a/5_10_RELEASE_NOTES.md
+++ b/5_10_RELEASE_NOTES.md
@@ -22,11 +22,21 @@ Scratch pad for changes destined for the 5.10.0 release 
notes page.
 
 # Non-backward-compatible changes
 
-When using Require.js and AMD modules, from Tapestry 5.10.0 on,
-the previously returned objects, functions or values are now
-the `default` property of the object received from `require()`.
-This is a consequence we couldn't avoid from the CoffeeScript
-to JavaScript to TypeScript conversion.
+* When using Require.js and AMD modules, from Tapestry 5.10.0 on,
+  the previously returned objects, functions or values are now
+  the `default` property of the object received from `require()`.
+  This is a consequence we couldn't avoid from the CoffeeScript
+  to JavaScript to TypeScript conversion.
+  
+
+# Notes about Require.js disabled mode
+* When using Bootstrap 3, the `t5/bootstrap/*` modules had automatic dependency
+  management (for example, if you `bootstrap/tooltip`, `bootstrap/transition`
+  would automatically be included too through Require.js). This doesn't happen
+  when Require.js is disabled. So, for example, when importing 
`bootstrap/tooltip`,
+  you should import `bootstrap/trasition` first. Notice Bootstrap 3 JavaScript 
+  files don't have any module management code on it (Require.js nor ES modules)
+  
 
 
 # Overall notes
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 81dfe7dff..7c537d7ef 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
@@ -14,6 +14,7 @@ package org.apache.tapestry5.modules;
 
 import java.util.Locale;
 
+import org.apache.tapestry5.Asset;
 import org.apache.tapestry5.BooleanHook;
 import org.apache.tapestry5.MarkupWriter;
 import org.apache.tapestry5.SymbolConstants;
@@ -48,8 +49,10 @@ import org.apache.tapestry5.ioc.annotations.Primary;
 import org.apache.tapestry5.ioc.annotations.Symbol;
 import org.apache.tapestry5.ioc.services.FactoryDefaults;
 import org.apache.tapestry5.ioc.services.SymbolProvider;
+import org.apache.tapestry5.ioc.services.SymbolSource;
 import org.apache.tapestry5.ioc.util.IdAllocator;
 import org.apache.tapestry5.json.JSONObject;
+import org.apache.tapestry5.services.AssetSource;
 import org.apache.tapestry5.services.ComponentOverride;
 import org.apache.tapestry5.services.Core;
 import org.apache.tapestry5.services.Environment;
@@ -542,6 +545,58 @@ public class JavaScriptModule
         
     }
     
+    @Contribute(EsModuleManager.class)
+    public static void setupBaseEsModules(
+            OrderedConfiguration<EsModuleManagerContribution> configuration,
+            @Symbol(SymbolConstants.BOOTSTRAP_ROOT) String bootstrapRoot,
+            Compatibility compatibility,
+            AssetSource assetSource)
+    {
+        
+        
+        if (compatibility.enabled(Trait.BOOTSTRAP_3))
+        {
+            final String[] modules = new String[]{"affix", "alert", "button", 
"carousel", "collapse", "dropdown", "modal",
+                    "scrollspy", "tab", "tooltip", "transition", "popover"};
+            addEsBootstrap3Modules(configuration, modules, bootstrapRoot, 
assetSource);
+        }
+        if (compatibility.enabled(Trait.BOOTSTRAP_4))
+        {
+            final String[] modules = new String[]{"alert", "button", 
"carousel", "collapse", "dropdown", "modal",
+                    "scrollspy", "tab", "tooltip", "bootstrap-util", "popper"};
+
+            addEsBootstrap3Modules(configuration, modules, bootstrapRoot, 
assetSource);
+        }
+
+        // Just the minimum to have alerts and AJAX validation working when 
Bootstrap
+        // is completely disabled
+        if (!compatibility.enabled(Trait.BOOTSTRAP_3) && 
!compatibility.enabled(Trait.BOOTSTRAP_4))
+        {
+            final String[] modules = new String[]{"transition", "collapse", 
"alert", "dropdown"};
+            addEsBootstrap3Modules(configuration, modules, bootstrapRoot, 
assetSource);
+        }
+
+    }
+
+    private static void addEsBootstrap3Modules(
+            OrderedConfiguration<EsModuleManagerContribution> configuration, 
+            String[] modules, 
+            String bootstrapRoot,
+            AssetSource assetSource) 
+    {
+        for (String module : modules) 
+        {
+            final String moduleId = "bootstrap/" + module;
+            final Resource resource = 
assetSource.getClasspathAsset(bootstrapRoot + "/" + module + ".js")
+                    .getResource();
+            if (resource.exists())
+            {
+                final String url = resource.toURL().toString();
+                configuration.add(moduleId, EsModuleManagerContribution.base(
+                        c -> EsModuleConfigurationCallback.setImport(c, 
moduleId, url)));
+            }
+        }
+    }
 
     /**
      * Contributes 'ConfigureHTMLElement', which writes the attributes into 
the HTML tag to describe locale, etc.
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 a506478a9..d067f8cac 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
@@ -186,7 +186,6 @@ public class AppModule
 
         // This is the emphasis of testing at this point.
         configuration.add(SymbolConstants.JAVASCRIPT_INFRASTRUCTURE_PROVIDER, 
"jquery");
-        configuration.add(SymbolConstants.REQUIRE_JS_ENABLED, "false");
 
         configuration.add(D3_URL_SYMBOL, 
"cdnjs.cloudflare.com/ajax/libs/d3/3.0.0/d3.js");
         configuration.add(SymbolConstants.PRELOADER_MODE, 
PreloaderMode.ALWAYS);

Reply via email to