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);