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

benw pushed a commit to branch gradle-improvements
in repository https://gitbox.apache.org/repos/asf/tapestry-5.git

commit 2b95839b9498c1aeac060b7b1effd43f4427cdc0
Merge: 0d1861866 f32d32d49
Author: Ben Weidig <[email protected]>
AuthorDate: Sat Aug 16 10:05:12 2025 +0200

    Merge branch 'master' into gradle-improvements

 5_10_RELEASE_NOTES.md                              |   18 +-
 build.gradle                                       |   71 +-
 .../main/groovy/t5build/CompileCoffeeScript.groovy |   58 -
 .../groovy/t5build/PreprocessCoffeeScript.groovy   |  103 -
 tapestry-beanvalidator/build.gradle                |   14 -
 .../beanvalidator/beanvalidator-validation.coffee  |   70 -
 .../beanvalidator/modules/BeanValidatorModule.java |   26 +-
 tapestry-core/build.gradle                         |   95 +-
 tapestry-core/compile-coffeescript                 |   11 -
 tapestry-core/compile-test-coffeescript            |   11 -
 .../META-INF/modules/t5/core/ajax.coffee           |   95 -
 .../META-INF/modules/t5/core/ajaxformloop.coffee   |   87 -
 .../META-INF/modules/t5/core/alert.coffee          |  142 --
 .../META-INF/modules/t5/core/autocomplete.coffee   |   48 -
 .../META-INF/modules/t5/core/bootstrap.coffee      |   29 -
 .../META-INF/modules/t5/core/confirm-click.coffee  |   96 -
 .../META-INF/modules/t5/core/console.coffee        |  218 ---
 .../META-INF/modules/t5/core/datefield.coffee      |  180 --
 .../META-INF/modules/t5/core/events.coffee         |  187 --
 .../modules/t5/core/exception-display.coffee       |   30 -
 .../modules/t5/core/exception-frame.coffee         |   64 -
 .../META-INF/modules/t5/core/fields.coffee         |  195 --
 .../META-INF/modules/t5/core/form-fragment.coffee  |   98 -
 .../META-INF/modules/t5/core/forms.coffee          |  211 --
 .../META-INF/modules/t5/core/graphviz.coffee       |   29 -
 .../META-INF/modules/t5/core/init.coffee           |   30 -
 .../META-INF/modules/t5/core/localdate.coffee      |   37 -
 .../META-INF/modules/t5/core/messages.coffee       |   55 -
 .../META-INF/modules/t5/core/moment.coffee         |   25 -
 .../META-INF/modules/t5/core/pageinit.coffee       |  241 ---
 .../META-INF/modules/t5/core/palette.coffee        |  300 ---
 .../META-INF/modules/t5/core/select.coffee         |   32 -
 .../META-INF/modules/t5/core/time-interval.coffee  |   55 -
 .../META-INF/modules/t5/core/tree.coffee           |  114 --
 .../META-INF/modules/t5/core/utils.coffee          |   59 -
 .../META-INF/modules/t5/core/validation.coffee     |  178 --
 .../META-INF/modules/t5/core/zone-refresh.coffee   |   68 -
 .../META-INF/modules/t5/core/zone.coffee           |  160 --
 .../java/org/apache/tapestry5/SymbolConstants.java |   23 +-
 .../corelib/base/AbstractComponentEventLink.java   |    8 +-
 .../tapestry5/corelib/base/AbstractField.java      |    6 +-
 .../tapestry5/corelib/components/AjaxFormLoop.java |   10 +-
 .../tapestry5/corelib/components/Alerts.java       |    6 +-
 .../tapestry5/corelib/components/DateField.java    |   10 +-
 .../tapestry5/corelib/components/DevTool.java      |   14 +-
 .../tapestry5/corelib/components/Errors.java       |    5 +-
 .../corelib/components/ExceptionDisplay.java       |    8 +-
 .../apache/tapestry5/corelib/components/Form.java  |    6 +-
 .../tapestry5/corelib/components/FormFragment.java |   20 +-
 .../tapestry5/corelib/components/Graphviz.java     |   10 +-
 .../apache/tapestry5/corelib/components/Grid.java  |    8 +-
 .../apache/tapestry5/corelib/components/Label.java |    6 +-
 .../tapestry5/corelib/components/LinkSubmit.java   |   24 +-
 .../tapestry5/corelib/components/LocalDate.java    |   13 +-
 .../tapestry5/corelib/components/Palette.java      |   24 +-
 .../corelib/components/ProgressiveDisplay.java     |   12 +-
 .../tapestry5/corelib/components/Select.java       |   49 +-
 .../tapestry5/corelib/components/Submit.java       |   22 +-
 .../tapestry5/corelib/components/TimeInterval.java |   13 +-
 .../apache/tapestry5/corelib/components/Tree.java  |   36 +-
 .../apache/tapestry5/corelib/components/Zone.java  |   23 +-
 .../tapestry5/corelib/mixins/Autocomplete.java     |   28 +-
 .../apache/tapestry5/corelib/mixins/Confirm.java   |    8 +-
 .../tapestry5/corelib/mixins/TriggerFragment.java  |   10 +-
 .../tapestry5/corelib/mixins/ZoneRefresh.java      |    9 +-
 .../internal/alerts/AlertManagerImpl.java          |   20 +-
 .../internal/services/DocumentLinkerImpl.java      |   41 +-
 .../internal/services/EsModuleInitsManager.java    |   93 +-
 .../services/PartialMarkupDocumentLinker.java      |   14 +-
 .../internal/services/ajax/BaseInitialization.java |   10 +
 .../services/ajax/EsModuleInitializationImpl.java  |   33 +-
 .../internal/services/ajax/EsShimManagerImpl.java  |   66 +
 .../services/ajax/JavaScriptSupportImpl.java       |   48 +-
 .../services/ajax/RequireJsModeHelper.java         |   41 +
 .../services/ajax/RequireJsModeHelperImpl.java     |   49 +
 .../javascript/ConfigureHTMLElementFilter.java     |   13 +-
 .../services/javascript/EsModuleManagerImpl.java   |  165 +-
 .../services/javascript/EsShimDispatcher.java      |  141 ++
 .../services/javascript/ModuleManagerImpl.java     |   18 +-
 .../translator/NumericTranslatorSupportImpl.java   |   20 +-
 .../internal/util/MessageCatalogResource.java      |   15 +-
 .../apache/tapestry5/modules/JavaScriptModule.java |  220 ++-
 .../apache/tapestry5/modules/TapestryModule.java   |    8 +-
 .../services/javascript/EsModuleManager.java       |   54 +-
 .../tapestry5/services/javascript/EsShim.java      |  189 ++
 .../services/javascript/EsShimManager.java         |   49 +
 .../javascript/ExtensibleJavaScriptStack.java      |   18 +-
 .../services/javascript/JavaScriptStack.java       |    8 +
 .../services/javascript/JavaScriptSupport.java     |    8 +
 .../services/javascript/StackExtension.java        |   10 +
 .../services/javascript/StackExtensionType.java    |    7 +
 .../tapestry5/validator/CheckboxValidator.java     |   10 +-
 .../java/org/apache/tapestry5/validator/Email.java |   11 +-
 .../java/org/apache/tapestry5/validator/Max.java   |    9 +-
 .../org/apache/tapestry5/validator/MaxLength.java  |    9 +-
 .../java/org/apache/tapestry5/validator/Min.java   |   10 +-
 .../org/apache/tapestry5/validator/MinLength.java  |    9 +-
 .../org/apache/tapestry5/validator/Regexp.java     |    9 +-
 .../org/apache/tapestry5/validator/Required.java   |    9 +-
 .../org/apache/tapestry5/t5-core-dom.coffee        |  993 ----------
 .../META-INF/assets/es-modules/t5/.gitignore       |    2 +
 .../META-INF/assets/es-modules/underscore.js       |    5 +
 .../META-INF/assets/tapestry5/moment-2.15.1.js     |    2 +-
 .../META-INF/assets/tapestry5/underscore-1.13.6.js | 2042 --------------------
 .../META-INF/assets/tapestry5/underscore-1.13.7.js |    6 +
 .../main/resources/META-INF/modules/t5/.gitignore  |    2 +
 .../resources/org/apache/tapestry5/core.properties |    2 +-
 tapestry-core/src/main/typescript/.gitignore       |    2 +
 .../src/main/typescript/package-lock.json          |  450 +++++
 tapestry-core/src/main/typescript/package.json     |   32 +
 .../t5/beanvalidator/beanvalidator-validation.ts   |   97 +
 .../src/main/typescript/src/t5/core/ajax.ts        |  109 ++
 .../main/typescript/src/t5/core/ajaxformloop.ts    |  105 +
 .../src/main/typescript/src/t5/core/alert.ts       |  176 ++
 .../main/typescript/src/t5/core/autocomplete.ts    |   62 +
 .../typescript/src/t5/core/bootstrap.ts}           |   25 +-
 .../main/typescript/src/t5/core/confirm-click.ts   |  127 ++
 .../src/main/typescript/src/t5/core/console.ts     |  251 +++
 .../src/main/typescript/src/t5/core/datefield.ts   |  231 +++
 .../src/t5/core/datepicker.ts}                     |    7 +-
 .../src/main/typescript/src/t5/core/dom.ts         |  152 ++
 .../src/main/typescript/src/t5/core/events.ts      |  197 ++
 .../typescript/src/t5/core/exception-display.ts    |   35 +
 .../main/typescript/src/t5/core/exception-frame.ts |   78 +
 .../src/main/typescript/src/t5/core/fields.ts      |  240 +++
 .../main/typescript/src/t5/core/form-fragment.ts   |  121 ++
 .../src/main/typescript/src/t5/core/forms.ts       |  254 +++
 .../src/main/typescript/src/t5/core/graphviz.ts    |   35 +
 .../main/typescript/src/t5/core/html-sanitizer.ts  |   84 +
 .../src/main/typescript/src/t5/core/init.ts        |   36 +
 .../src/main/typescript/src/t5/core/localdate.ts   |   38 +
 .../main/typescript/src/t5/core/messages-amd.ts    |   60 +
 .../typescript/src/t5/core/messages-es-module.ts   |   68 +
 .../src/main/typescript/src/t5/core/messages.ts    |   39 +
 .../typescript/src/t5/core/moment.ts}              |   28 +-
 .../src/main/typescript/src/t5/core/pageinit.ts    |  363 ++++
 .../src/main/typescript/src/t5/core/palette.ts     |  425 ++++
 .../src/main/typescript/src/t5/core/select.ts      |   41 +
 .../typescript/src/t5/core/t5-core-dom-jquery.ts   |  547 ++++++
 .../src/t5/core/t5-core-dom-prototype.ts           |  662 +++++++
 .../typescript/src/t5/core/t53-compatibility.ts    |   56 +
 .../main/typescript/src/t5/core/time-interval.ts   |   62 +
 .../src/main/typescript/src/t5/core/tree.ts        |  144 ++
 .../src/main/typescript/src/t5/core/typeahead.ts   | 1782 +++++++++++++++++
 .../src/main/typescript/src/t5/core/types.ts       |  529 +++++
 .../src/main/typescript/src/t5/core/utils.ts       |   72 +
 .../src/main/typescript/src/t5/core/validation.ts  |  247 +++
 .../main/typescript/src/t5/core/zone-refresh.ts    |   82 +
 .../src/main/typescript/src/t5/core/zone.ts        |  217 +++
 tapestry-core/src/main/typescript/tsconfig.json    |   53 +
 tapestry-core/src/test/app1/ConfirmDemo.tml        |    2 +-
 .../coffeescript/META-INF/assets/zonedemo.coffee   |    5 -
 .../META-INF/modules/app/test-support.coffee       |   14 -
 .../META-INF/modules/client-console-demo.coffee    |    8 -
 .../META-INF/modules/palette-demo.coffee           |   11 -
 .../META-INF/modules/validate-in-error.coffee      |    7 -
 .../integration/app1/pages/qunit-config.coffee     |    2 -
 .../integration/app1/pages/qunit-driver.coffee     |    1 -
 .../integration/app1/pages/test-dom.coffee         |   72 -
 .../integration/app1/pages/test-messages.coffee    |   22 -
 .../integration/app1/pages/test-utils.coffee       |   10 -
 .../integration/app1/pages/test-validation.coffee  |   35 -
 .../integration/app1/ConfirmMixinTests.groovy      |    3 +
 .../app1/ModuleConfigurationCallbackTests.groovy   |   13 +-
 .../services/DocumentLinkerImplTest.groovy         |   59 +-
 .../ajax/JavaScriptSupportAutofocusTests.groovy    |    2 +-
 .../services/ajax/JavaScriptSupportImplTest.groovy |   34 +-
 .../tapestry5/integration/app1/AjaxTests.java      |   12 +
 .../tapestry5/integration/app1/App1TestCase.java   |    8 +
 .../tapestry5/integration/app1/AssetTests.java     |    8 +-
 .../integration/app1/CoreBehaviorsTests.java       |    2 +-
 .../tapestry5/integration/app1/EsModuleTests.java  |    1 -
 .../integration/app1/components/Border.java        |   14 +-
 .../integration/app1/pages/ClientConsoleDemo.java  |   12 +-
 .../integration/app1/pages/ConfirmDemo.java        |    5 +
 .../integration/app1/pages/EsModuleDemo.java       |    2 +-
 .../pages/ModuleConfigurationCallbackDemo.java     |    2 +
 .../integration/app1/pages/ModuleInitDemo.java     |   10 +-
 .../app1/pages/MultiZoneUpdateDemo.java            |   12 +-
 .../integration/app1/pages/PaletteDemo.java        |    9 +-
 .../integration/app1/pages/PaletteGroupedDemo.java |   11 +-
 .../integration/app1/pages/PublishEventDemo.java   |   33 +-
 .../app1/pages/ValidateInErrorEvent.java           |   12 +-
 .../integration/app1/services/AppModule.java       |    7 +-
 .../javascript/EsModuleManagerImplTest.java        |   39 +-
 .../META-INF/assets/ExpressionInJsFunction.js      |   13 +-
 .../resources/META-INF/assets/PublishEventDemo.js  |    3 +
 .../assets/es-modules/app/multi-zone-update.js     |    5 +
 .../META-INF/assets/es-modules/app/test-support.js |   14 +
 .../assets/es-modules/client-console-demo.js       |    6 +
 .../META-INF/assets/es-modules/palette-demo.js     |   14 +
 .../assets/es-modules/publish-event-demo.js        |   23 +
 .../assets/es-modules/validate-in-error.js         |    8 +
 .../src/test/resources/META-INF/assets/zonedemo.js |   25 +
 .../META-INF/modules/app/multi-zone-update.js      |    2 +-
 .../resources/META-INF/modules/app/test-support.js |   18 +
 .../META-INF/modules/client-console-demo.js        |   11 +
 .../resources/META-INF/modules/palette-demo.js     |   17 +
 .../META-INF/modules/validate-in-error.js          |    7 +
 .../integration/app1/components/Border.tml         |    9 +
 .../integration/app1/pages/nested/AssetDemo.js     |   16 +-
 .../integration/app1/pages/qunit-config.js         |    2 +
 .../integration/app1/pages/qunit-driver.js         |    1 +
 .../tapestry5/integration/app1/pages/test-dom.js   |   87 +
 .../integration/app1/pages/test-messages.js        |   20 +
 .../tapestry5/integration/app1/pages/test-utils.js |   16 +
 .../integration/app1/pages/test-validation.js      |   32 +
 .../apache/tapestry5/test/SeleniumTestCase.java    |   77 +-
 .../apache/tapestry5/upload/components/Upload.java |   18 +-
 209 files changed, 10757 insertions(+), 7046 deletions(-)

diff --cc 5_10_RELEASE_NOTES.md
index 227915b73,4a942b709..764aff6db
--- a/5_10_RELEASE_NOTES.md
+++ b/5_10_RELEASE_NOTES.md
@@@ -20,11 -21,20 +21,26 @@@ Scratch pad for changes destined for th
  
  # Non-backward-compatible changes (but that probably won't cause problems)
  
+ # 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.
+   
+ 
+ # Notes about Require.js disabled mode
+ * Underscore.js, jQuery and Require.js are not included in the default stack 
+   (i.e. the set of JavaScript files which are included in pages by default).
+   If you need to use Underscore.js or jQuery, they're automatically available 
for   
+   import as `underscore` and `jquery`, respectively.
+ 
  
  # Overall notes
 +
 +* Gradle overhaul
 +    * 8.5 -> 8.14.2
 +    * Version catalogs
 +    * Conventions
 +    * ...
diff --cc build.gradle
index 213809578,bde9ee18d..6a03cbbfb
--- a/build.gradle
+++ b/build.gradle
@@@ -303,148 -500,114 +303,137 @@@ tasks.register('aggregateJavadoc', Java
      }
  }
  
- tasks.register('coffeeScriptDocs', Exec) {
-     group 'Documentation'
-     description 'Build docco documentation for all CoffeeScript sources'
-     dependsOn project(':tapestry-core').tasks.preprocessCoffeeScript
- 
-     def outputDir = file('$buildDir/documentation/coffeescript')
- 
-     def sources = files()
- 
-     subprojects.each { sub ->
-         def coffeeDir = sub.file('src/main/coffeescript')
-         if (coffeeDir.exists()) {
-             sources += sub.fileTree(coffeeDir) {
-                 include '**/*.coffee'
-             }
-         }
-     }
- 
-     sources += 
project(':tapestry-core').tasks.preprocessCoffeeScript.outputs.files.asFileTree
 -task typeScriptDocs() {
 -    group "Documentation"
 -    description "Builds typedoc documentation for all TypeScript sources"
 -    dependsOn project(":tapestry-core").tasks.generateTypeScriptDocs
++tasks.register('typeScriptDocs') {
++    group = 'Documentation'
++    description = 'Builds typedoc documentation for all TypeScript sources'
 +
-     // Needs to be installed via 'npm install -g [email protected]'
-     executable TapestryBuildLogic.isWindows() ? 'docco.cmd' : 'docco'
-     args '--output', outputDir
-     args sources.files.sort({ a, b ->
-         a.name.compareTo b.name
-     })
++    dependsOn(project(':tapestry-core').tasks.named('generateTypeScriptDocs'))
  }
  
- 
  dependencies {
 -    if (JavaVersion.current() != JavaVersion.VERSION_1_8) {
 +    if (JavaVersion.current().isCompatibleWith(JavaVersion.VERSION_11)) {
          meta aggregateJavadoc.outputs.files
      }
  }
  
 -task combinedJacocoReport(type:JacocoReport){
 -  def subprojectsToConsider = subprojects.findAll {it.name != 'quickstart' && 
it.name != 'beanmodel' && it.name != 'commons' && it.name != 
'genericsresolver-guava' && it.name != 'tapestry5-annotations' && it.name != 
'tapestry-internal-test' && it.name != 'tapestry-runner' && it.name != 
'tapestry-test-constants' && it.name != 'tapestry-test-data' && it.name != 
'tapestry-ioc-jcache'}
 -  dependsOn = subprojectsToConsider.test
 -  
additionalSourceDirs.from(files(subprojectsToConsider.sourceSets.main.allSource.srcDirs))
 -  
sourceDirectories.from(files(subprojectsToConsider.sourceSets.main.allSource.srcDirs))
 -  classDirectories.from(files(subprojectsToConsider.sourceSets.main.output))
 -  
executionData.from(files(subprojectsToConsider.jacocoTestReport.executionData).filter
 { it.exists() })
 -  jacocoClasspath = 
files(subprojectsToConsider.jacocoTestReport.jacocoClasspath)
 -  reports {
 -      html {
 -        required = true
 -        destination = file("$buildDir/reports/jacoco")
 -      }
 -      xml {
 -        required = false
 -      }
 -      csv {
 -        required = false
 -      }
 -  }
 -  onlyIf = {
 -      true
 -  }
 +tasks.register('combinedJacocoReport', JacocoReport) {
 +    def excludedProjects = [
 +        'quickstart',
 +        'beanmodel',
 +        'commons',
 +        'genericsresolver-guava',
 +        'tapestry5-annotations',
 +        'tapestry-internal-test',
 +        'tapestry-runner',
 +        'tapestry-test-constants',
 +        'tapestry-test-data',
 +        'tapestry-ioc-jcache'
 +    ]
 +
 +    def subprojectsToConsider = subprojects.findAll {
 +        !excludedProjects.contains(it.name)
 +    }
 +
 +    dependsOn = subprojectsToConsider.test
 +
 +    
additionalSourceDirs.from(files(subprojectsToConsider.sourceSets.main.allSource.srcDirs))
 +    
sourceDirectories.from(files(subprojectsToConsider.sourceSets.main.allSource.srcDirs))
 +    classDirectories.from(files(subprojectsToConsider.sourceSets.main.output))
 +    
executionData.from(files(subprojectsToConsider.jacocoTestReport.executionData).filter
 {
 +        it.exists()
 +    })
 +    jacocoClasspath = 
files(subprojectsToConsider.jacocoTestReport.jacocoClasspath)
 +
 +    reports {
 +        html {
 +            required = true
 +            destination = file("${buildDir}/reports/jacoco")
 +        }
 +        xml.required = false
 +        csv.required = false
 +    }
  }
  
 -task continuousIntegration {
 +tasks.register('continuousIntegration') {
 +    group = 'Verification'
 +    description 'Runs a full CI build: assembles all artifacts, runs all 
checks, and generates aggregate reports.'
 +
-     dependsOn subprojects.check
-     dependsOn ':tapestry-core:testWithPrototype'
-     dependsOn combinedJacocoReport
-     dependsOn subprojects.assemble
+     def dependants = [
 -            'tapestry-core:testWithPrototypeAndRequireJsDisabled',
 -            'tapestry-core:testWithJqueryAndRequireJsDisabled',
 -            subprojects.build, // jQuery and Require.js enabled
 -            'tapestry-core:testWithPrototypeAndRequireJsEnabled', 
 -            combinedJacocoReport]
++        'tapestry-core:testWithPrototypeAndRequireJsDisabled',
++        'tapestry-core:testWithJqueryAndRequireJsDisabled',
++        'tapestry-core:testWithPrototypeAndRequireJsEnabled', 
++        subprojects.check, // jQuery and Require.js enabled
++        combinedJacocoReport
++    ]
++
+     // tapestry-javadoc doesn't work with Java 8 anymore. That's why it's 
only added if != 8.
+     if (JavaVersion.current() != JavaVersion.VERSION_1_8) {
+         dependants << aggregateJavadoc
+     }
 -    dependsOn dependants
 -    description "Task executed on Jenkins CI server after Git commits"
++
++    dependsOn(dependants)
  }
  
 -task zippedSources(type: Zip) {
 +
 +tasks.register('zippedSources', Zip) {
      description "Creates a combined Zip file of all sub-project's sources"
 -    group "Release artifact"
 +    group 'Release artifact'
- 
-     dependsOn('tapestry-beanvalidator:compileCoffeeScript')
-     dependsOn('tapestry-core:compileCoffeeScript')
-     dependsOn('tapestry-core:compileProcessedCoffeescript')
+     
 -    dependsOn("tapestry-core:compileTypeScript")
++    dependsOn('tapestry-core:compileTypeScript')
  
      destinationDirectory = buildDir
 -    archiveBaseName = "apache-tapestry"
 +    archiveBaseName = 'apache-tapestry'
      version project.version
 -    archiveClassifier = "sources"
 +    archiveClassifier = 'sources'
  
      from project.projectDir
 -    exclude "out/**"
 -    exclude "**/*.iml"
 -    exclude "**/*.ipr"
 -    exclude "**/*.iws"
 -    exclude "**/.*/**"
 -    exclude "**/bin/**"
 -    exclude "**/target/**"
 -    exclude "**/build/**"
 -    exclude "**/test-output/**"  // Left around by TestNG sometimes
 -    exclude "**/modules/***.js"
 -    exclude "**/es-modules/***.js"
 +    exclude 'out/**'
 +    exclude '**/*.iml'
 +    exclude '**/*.ipr'
 +    exclude '**/*.iws'
 +    exclude '**/.*/**'
 +    exclude '**/bin/**'
 +    exclude '**/target/**'
 +    exclude '**/build/**'
-     exclude '**/test-output/**'  // Left around by TestNG sometimes
++    exclude '**/test-output/**'  // Left around by TestNG sometime
++    exclude '**/modules/***.js'
++    exclude '**/es-modules/***.js'
  }
  
- tasks.register('zippedApidoc', Zip) {
-     dependsOn aggregateJavadoc
-     description "Zip archive of the project's aggregate JavaDoc and 
CoffeeScript documentation"
+ task zippedApidoc(type: Zip) {
 -    dependsOn typeScriptDocs
 -    dependsOn aggregateJavadoc
+     description "Zip archive of the project's aggregate JavaDoc and 
TypeScript documentation"
 -    group "Release artifact"
 +    group 'Release artifact'
 +
++    dependsOn(typeScriptDocs)
++    dependsOn(aggregateJavadoc)
+ 
      destinationDirectory = buildDir
 -    archiveBaseName = "apache-tapestry"
 +    archiveBaseName = 'apache-tapestry'
      version project.version
 -    archiveClassifier = "apidocs"
 +    archiveClassifier = 'apidocs'
  
 -    from file("src/docroot-template"), {
 +    from file('src/docroot-template'), {
          filter ReplaceTokens, tokens: [version: project.version]
 -        include "*.html"
 +        include '*.html'
      }
  
 -    from file("src/docroot-template"), {
 -        exclude "*.html"
 +    from file('src/docroot-template'), {
 +        exclude '*.html'
      }
  
 -    into "apidocs", { from aggregateJavadoc.outputs.files }
 -
 -
 -    into "typescript", { from typeScriptDocs.outputs.files }
 +    into 'apidocs', {
 +        from aggregateJavadoc.outputs.files
 +    }
  
- 
-     into 'coffeescript', {
-         from coffeeScriptDocs.outputs.files
++    into 'typescript', {
++        from typeScriptDocs.outputs.files
 +    }
  }
  
 -task zippedBinaries(type: Zip) {
 -    description "Zip archive of binaries of each sub-project"
 +tasks.register('zippedBinaries', Zip) {
 +    description 'Zip archive of binaries of each sub-project'
      // TODO: Plus dependencies?
 -    group "Release artifact"
 +    group 'Release artifact'
      // This may create a few unwanted dependencies, but does
      // seem to ensure that the subprojects are created
      inputs.files subprojects*.configurations*.archives.artifacts.files
diff --cc tapestry-beanvalidator/build.gradle
index ebeaaa127,7c20eb3ea..cebf92705
--- a/tapestry-beanvalidator/build.gradle
+++ b/tapestry-beanvalidator/build.gradle
@@@ -1,44 -1,27 +1,30 @@@
 +plugins {
 +    id 'tapestry.testng-convention'
 +}
 +
  import t5build.*
  
 -description = "Support for JSR-303 Bean Validation via the Hibernate 
validator implementation"
 +description = 'Support for JSR-303 Bean Validation via the Hibernate 
validator implementation'
  
  dependencies {
 -  implementation project(':tapestry-core')
 +    implementation project(':tapestry-core')
  
 -  implementation "jakarta.validation:jakarta.validation-api:3.0.2"
 -  implementation "org.hibernate:hibernate-validator:8.0.1.Final"
 +    implementation libs.jakarta.validation.api
 +    implementation libs.hibernate.validator
  
 -  testImplementation project(':tapestry-test')
 -  implementation 
"org.seleniumhq.selenium:selenium-leg-rc:${versions.selenium}", {
 -      exclude group: "org.seleniumhq.selenium", module: "jetty-repacked"
 -      exclude group: "org.testng", module: "testng"
 -  }
 -  testImplementation 
"org.junit.jupiter:junit-jupiter:${versions.junitJupiter}"
 +    implementation(libs.selenium.legrc) {
 +        exclude group: 'org.seleniumhq.selenium', module: 'jetty-repacked'
 +        exclude group: 'org.testng', module: 'testng'
 +    }
  
 +    testImplementation project(':tapestry-test')
  }
  
- def generatedOutputBaseDir = 'src/main/generated'
- 
- task compileCoffeeScript(type: CompileCoffeeScript) {
-     outputDir = "${generatedOutputBaseDir}/compiled-coffeescript"
- }
- 
  // Start up the test app, useful when debugging failing integration tests
  task runTestApp303(type:JavaExec) {
 -  main = 'org.apache.tapestry5.test.JettyRunner'
 -  args "-d", "src/test/webapp", "-p", "8080"
 -  classpath += project.sourceSets.test.runtimeClasspath
 +    mainClass = 'org.apache.tapestry5.test.JettyRunner'
 +    args '-d', 'src/test/webapp', '-p', '8080'
 +    classpath += project.sourceSets.test.runtimeClasspath
  }
  
- clean.delete generatedOutputBaseDir
- 
- sourceSets {
-     main {
-         output.dir(compileCoffeeScript.outputDir, builtBy: 
compileCoffeeScript)
-     }
- }
- 
  jar.manifest.attributes 'Tapestry-Module-Classes': 
'org.apache.tapestry5.beanvalidator.modules.BeanValidatorModule'
diff --cc tapestry-core/build.gradle
index 0754de77d,1e66536cd..fb0c442ef
--- a/tapestry-core/build.gradle
+++ b/tapestry-core/build.gradle
@@@ -1,15 -1,16 +1,15 @@@
 -import org.gradle.plugins.ide.idea.model.*
 +plugins {
 +    id 'tapestry.junit5-convention'
 +    id 'tapestry.testng-convention'
 +}
  
++import t5build.TapestryBuildLogic
  import org.apache.tools.ant.filters.ReplaceTokens
- import t5build.*
 -//import t5build.*
 -
 -description = "Central module for Tapestry, containing all core services and 
components"
  
 -project.ext {
 -    mainGeneratedDir = "src/main/generated"
 -    testGeneratedDir = "src/test/generated"
 -}
 +description = 'Central module for Tapestry, containing all core services and 
components'
  
 -clean.delete mainGeneratedDir, testGeneratedDir
 +def mainGeneratedDir = 'src/main/generated'
 +def testGeneratedDir = 'src/test/generated'
  
  dependencies {
      api project(':tapestry-ioc')
@@@ -17,72 -18,145 +17,127 @@@
      api project(':beanmodel')
      api project(':tapestry-http')
  
 -    api "org.apache.commons:commons-lang3:${versions.commonsLang}"
 -
 -
 -    implementation 'jakarta.annotation:jakarta.annotation-api:2.0.0'
 -    implementation 'jakarta.xml.bind:jakarta.xml.bind-api:2.3.2'
 +    implementation libs.jakarta.annotation.api
 +    implementation libs.jakarta.xml.bind.api
  
 -    provided project(":tapestry-test")
 -    provided project(":tapestry-test-constants")
 +    implementation libs.commons.codec
 +    implementation libs.commons.lang3
  
 -    provided "jakarta.servlet:jakarta.servlet-api:${versions.servletapi}"
 +    provided project(':tapestry-test')
 +    provided project(':tapestry-test-constants')
  
 -    implementation "commons-codec:commons-codec:1.13"
 +    provided libs.jakarta.servlet.api
  
 -    testImplementation 
"org.junit.jupiter:junit-jupiter:${versions.junitJupiter}"
 -    testImplementation "org.apache.httpcomponents:httpclient:4.5.14"
 -    testRuntimeOnly project(':tapestry-spock')
 +    testImplementation libs.httpcomponents.httpclient
 +    testImplementation project(":tapestry-spock")
  
 -    testRuntimeOnly "org.hsqldb:hsqldb:${versions.hsqldb}"
 -    testRuntimeOnly 'com.google.inject:guice:3.0'
 +    
testRuntimeOnly("${libs.hsqldb.get().module.group}:${libs.hsqldb.get().module.name}:${libs.hsqldb.get().version}:jdk8")
 +    testRuntimeOnly libs.guice
  }
  
- tasks.register('preprocessCoffeeScript', PreprocessCoffeeScript)
 -def npmWorkingDir = "src/main/typescript/"
++def npmWorkingDir = 'src/main/typescript/'
++def npmExec = TapestryBuildLogic.isWindows() ? 'npm.cmd' : 'npm'
  
- tasks.register('compileCoffeeScript', CompileCoffeeScript) {
-     outputDir = file("${mainGeneratedDir}/compiled-coffeescript")
 -task npmInstall(type: Exec) {
 -    group "TypeScript"
++tasks.register('npmInstall', Exec) {
++    group 'TypeScript'
+     description "Runs npm install"
+     
+     workingDir = npmWorkingDir
 -    commandLine isWindows() ? "npm.cmd" : "npm", 'install'
++    commandLine npmExec, 'install'
  }
  
- tasks.register('compileProcessedCoffeescript', CompileCoffeeScript) {
-     dependsOn tasks.named('preprocessCoffeeScript')
-     srcDir tasks.named('preprocessCoffeeScript').map { it.outputDir }
-     outputDir = file("${mainGeneratedDir}/compiled-processed-coffeescript")
 -task compileTypeScriptToAmd(type: Exec) {
++tasks.register('compileTypeScriptToAmd', Exec) {
++    group 'TypeScript'
++
+     dependsOn npmInstall
+ 
+     workingDir = npmWorkingDir
 -    commandLine isWindows() ? "npm.cmd" : "npm", 'run', 'build-amd'
++    commandLine npmExec, 'run', 'build-amd'
  }
  
- tasks.register('compileTestCoffeeScript', CompileCoffeeScript) {
-     srcDir = file('src/test/coffeescript')
-     outputDir = file("${testGeneratedDir}/compiled-coffeescript")
 -task compileTypeScriptToEsModule(type: Exec) {
++tasks.register('compileTypeScriptToEsModule', Exec) {
++    group 'TypeScript'
++
+     dependsOn npmInstall
+     
+     workingDir = npmWorkingDir
 -    commandLine isWindows() ? "npm.cmd" : "npm", 'run', 'build-es-module'
++    commandLine npmExec, 'run', 'build-es-module'
  }
  
- tasks.named('processResources') {
-     from tasks.named('compileCoffeeScript')
-     from tasks.named('compileProcessedCoffeescript')
 -task compileTypeScript() {
 -    dependsOn compileTypeScriptToAmd
 -    dependsOn compileTypeScriptToEsModule
++tasks.register('compileTypeScript', Delete) {
++    group = 'TypeScript'
++
++    dependsOn(compileTypeScriptToAmd)
++    dependsOn(compileTypeScriptToEsModule)
  }
  
- tasks.named('processTestResources') {
-     from tasks.named('compileTestCoffeeScript')
 -task generateTypeScriptDocs(type: Exec) {
++tasks.register('generateTypeScriptDocs', Exec) {
++    group 'TypeScript'
++
+     dependsOn npmInstall
+     
+     workingDir = npmWorkingDir
 -    commandLine isWindows() ? "npm.cmd" : "npm", 'run', 'docs'
++    commandLine npmExec, 'run', 'docs'
  }
  
- clean {
-     delete mainGeneratedDir, testGeneratedDir
 -task cleanTypeScriptFiles(type: Delete) {
++tasks.register('cleanTypeScriptFiles', Delete) {
+     delete fileTree("src/main/resources/META-INF/assets/es-modules/t5/core") {
+         include '**.js'
+     }
+     delete fileTree("src/main/resources/META-INF/modules/t5/core") {
+         include '**.js'
+     }
+     delete "src/main/typescript/docs"
  }
  
- tasks.register('testWithPrototype', Test) {
-     systemProperties['tapestry.javascript-infrastructure-provider'] = 
'prototype'
+ processResources.dependsOn compileTypeScript
+ clean.dependsOn cleanTypeScriptFiles
+ 
+ // Not sure why this is necessary:
+ compileTestGroovy.dependsOn compileTestJava
+ 
+ test {
 -      // Needed to have XMLTokenStreamTests.testStreamEncoding() passing on 
Java 9+
++    // Needed to have XMLTokenStreamTests.testStreamEncoding() passing on 
Java 9+
+     if (JavaVersion.current().isCompatibleWith(JavaVersion.VERSION_1_9)) {
 -        jvmArgs("--add-opens=java.base/java.nio.charset=ALL-UNNAMED");
++        jvmArgs('--add-opens=java.base/java.nio.charset=ALL-UNNAMED')
+     }
 -      // TAP5-2722
 -      systemProperty 'user.language', 'en'
 -}
+ 
 -task runTestApp1(type:JavaExec) {
 -  description 'Start app1 integration test app, useful when debugging failing 
integration tests'
 -  main = 'org.apache.tapestry5.test.JettyRunner'
 -  args "-d", "src/test/app1", "-p", "8080"
 -  classpath += project.sourceSets.test.runtimeClasspath
 -}
 -task runTestApp2(type:JavaExec) {
 -  description 'Start app2 integration test app, useful when debugging failing 
integration tests'
 -  main = 'org.apache.tapestry5.test.JettyRunner'
 -  args "-d", "src/test/app2", "-p", "8080"
 -  classpath += project.sourceSets.test.runtimeClasspath
 -}
 -task runTestApp3(type:JavaExec) {
 -  description 'Start app3 integration test app, useful when debugging failing 
integration tests'
 -  main = 'org.apache.tapestry5.test.JettyRunner'
 -  args "-d", "src/test/app3", "-p", "8080"
 -  classpath += project.sourceSets.test.runtimeClasspath
 -}
 -task runTestApp4(type:JavaExec) {
 -  description 'Start app4 integration test app, useful when debugging failing 
integration tests'
 -  main = 'org.apache.tapestry5.test.JettyRunner'
 -  args "-d", "src/test/app4", "-p", "8080"
 -  classpath += project.sourceSets.test.runtimeClasspath
 -}
 -task runTestApp5(type:JavaExec) {
 -  description 'Start app5 integration test app, useful when debugging failing 
integration tests'
 -  main = 'org.apache.tapestry5.test.JettyRunner'
 -  args "-d", "src/test/app5", "-p", "8080"
 -  classpath += project.sourceSets.test.runtimeClasspath
 -}
 -task runTestApp7(type:JavaExec) {
 -  description 'Start app7 integration test app, useful when debugging failing 
integration tests'
 -  main = 'org.apache.tapestry5.test.JettyRunner'
 -  args "-d", "src/test/app7", "-p", "8080"
 -  classpath += project.sourceSets.test.runtimeClasspath
 -}
 -task runTestAppfolder(type:JavaExec) {
 -  description 'Start appFolder integration test app, useful when debugging 
failing integration tests'
 -  main = 'org.apache.tapestry5.test.JettyRunner'
 -  args "-d", "src/test/appfolder", "-p", "8080"
 -  classpath += project.sourceSets.test.runtimeClasspath
++    // TAP5-2722
++    systemProperty 'user.language', 'en'
 +}
 +
 +[
 +    'app1',
 +    'app2',
 +    'app3',
 +    'app4',
 +    'app5',
 +    'app7',
 +    'appfolder'
 +].each { appName ->
 +    tasks.register("runTest${appName.capitalize()}", JavaExec) {
 +        group = 'Application'
 +        description = "Starts the ${appName} integration test app, useful 
when debugging."
 +        mainClass = 'org.apache.tapestry5.test.JettyRunner'
 +        args '-d', "src/test/${appName}", '-p', '8080'
 +        classpath = sourceSets.test.runtimeClasspath
 +    }
  }
+ 
+ // Default is jQuery and Require.js enabled, so here are the tests for the
+ // other combinations
+ 
 -task testWithJqueryAndRequireJsDisabled(type:Test) {
 -  systemProperties."tapestry.javascript-infrastructure-provider" = "jquery"
 -  systemProperties."tapestry.require-js-enabled" = "false"
++task testWithJqueryAndRequireJsDisabled(type: Test) {
++    systemProperties."tapestry.javascript-infrastructure-provider" = 'jquery'
++    systemProperties."tapestry.require-js-enabled" = 'false'
+ }
+ 
 -task testWithPrototypeAndRequireJsEnabled(type:Test) {
 -  systemProperties."tapestry.javascript-infrastructure-provider" = "prototype"
 -  systemProperties."tapestry.require-js-enabled" = "true"
++task testWithPrototypeAndRequireJsEnabled(type: Test) {
++    systemProperties."tapestry.javascript-infrastructure-provider" = 
'prototype'
++    systemProperties."tapestry.require-js-enabled" = 'true'
+ }  
+ 
 -task testWithPrototypeAndRequireJsDisabled(type:Test) {
 -  systemProperties."tapestry.javascript-infrastructure-provider" = "prototype"
 -  systemProperties."tapestry.require-js-enabled" = "false"
 -}
++task testWithPrototypeAndRequireJsDisabled(type: Test) {
++    systemProperties."tapestry.javascript-infrastructure-provider" = 
'prototype'
++    systemProperties."tapestry.require-js-enabled" = 'false'
++}
diff --cc 
tapestry-test/src/main/java/org/apache/tapestry5/test/SeleniumTestCase.java
index fd2dd3e2c,56dd77954..55ca74927
--- 
a/tapestry-test/src/main/java/org/apache/tapestry5/test/SeleniumTestCase.java
+++ 
b/tapestry-test/src/main/java/org/apache/tapestry5/test/SeleniumTestCase.java
@@@ -12,12 -12,10 +12,14 @@@
  
  package org.apache.tapestry5.test;
  
 -import com.thoughtworks.selenium.CommandProcessor;
 -import com.thoughtworks.selenium.Selenium;
 -import com.thoughtworks.selenium.webdriven.WebDriverBackedSelenium;
 -import com.thoughtworks.selenium.webdriven.WebDriverCommandProcessor;
 +import java.io.File;
 +import java.lang.reflect.Method;
 +import java.time.Duration;
 +import java.util.ArrayList;
++import java.util.HashMap;
 +import java.util.List;
++import java.util.Map;
 +import java.util.concurrent.TimeUnit;
  
  import org.apache.tapestry5.test.constants.TapestryRunnerConstants;
  import org.openqa.selenium.By;


Reply via email to