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 560f2c1a353ca0530f58ab51fa0437d82e76f09c
Author: Thiago H. de Paula Figueiredo <thi...@arsmachina.com.br>
AuthorDate: Fri Apr 18 17:23:39 2025 -0300

    TAP5-2804: adapting the build system to the TS codebase
---
 build.gradle                                       |  32 +-
 tapestry-core/build.gradle                         |  59 +-
 tapestry-core/compile-coffeescript                 |  11 -
 tapestry-core/compile-test-coffeescript            |  11 -
 .../META-INF/assets/es-modules/t5/core/.gitignore  |   1 +
 .../resources/META-INF/modules/t5/core/.gitignore  |   1 +
 .../META-INF/modules/t5/core/datepicker.js         | 766 ---------------------
 .../src/main/typescript/package-lock.json          |   3 +-
 tapestry-core/src/main/typescript/package.json     |   7 +-
 tapestry-core/src/main/typescript/tsconfig.json    |   2 +-
 10 files changed, 56 insertions(+), 837 deletions(-)

diff --git a/build.gradle b/build.gradle
index 94355316c..9bd845b41 100755
--- a/build.gradle
+++ b/build.gradle
@@ -500,29 +500,12 @@ task aggregateJavadoc(type: Javadoc) {
     }
 }
 
-task coffeeScriptDocs(type: Exec) {
+task typeScriptDocs(type: 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 ->
-        sources += sub.fileTree("src/main/coffeescript", { include 
"**/*.coffee" })
-    }
-
-    sources += 
project(":tapestry-core").tasks.preprocessCoffeeScript.outputs.files.asFileTree
-
-    // Needs to be installed via "npm install -g docco@0.6.3"
-    executable isWindows() ? "docco.cmd" : "docco"
-    args "--output", outputDir
-    args sources.files.sort({ a, b -> a.name.compareTo b.name })
+    description "Builds typedoc documentation for all TypeScript sources"
+    dependsOn project(":tapestry-core").tasks.generateTypeScriptDocs
 }
 
-
-
 dependencies {
     if (JavaVersion.current() != JavaVersion.VERSION_1_8) {
         meta aggregateJavadoc.outputs.files
@@ -569,8 +552,7 @@ task zippedSources(type: Zip) {
     group "Release artifact"
     
     dependsOn("tapestry-beanvalidator:compileCoffeeScript")
-    dependsOn("tapestry-core:compileCoffeeScript")
-    dependsOn("tapestry-core:compileProcessedCoffeescript")
+    dependsOn("tapestry-core:compileTypeScript")
 
     destinationDirectory = buildDir
     archiveBaseName = "apache-tapestry"
@@ -587,11 +569,13 @@ task zippedSources(type: Zip) {
     exclude "**/target/**"
     exclude "**/build/**"
     exclude "**/test-output/**"  // Left around by TestNG sometimes
+    exclude "**/modules/***.js"
+    exclude "**/es-modules/***.js"
 }
 
 task zippedApidoc(type: Zip) {
     dependsOn aggregateJavadoc
-    description "Zip archive of the project's aggregate JavaDoc and 
CoffeeScript documentation"
+    description "Zip archive of the project's aggregate JavaDoc and TypeScript 
documentation"
     group "Release artifact"
 
     destinationDirectory = buildDir
@@ -611,7 +595,7 @@ task zippedApidoc(type: Zip) {
     into "apidocs", { from aggregateJavadoc.outputs.files }
 
 
-    into "coffeescript", { from coffeeScriptDocs.outputs.files }
+    into "typescript", { from typeScriptDocs.outputs.files }
 
 }
 
diff --git a/tapestry-core/build.gradle b/tapestry-core/build.gradle
index 328e1e9eb..c06f44831 100644
--- a/tapestry-core/build.gradle
+++ b/tapestry-core/build.gradle
@@ -1,6 +1,7 @@
 import org.gradle.plugins.ide.idea.model.*
+
 import org.apache.tools.ant.filters.ReplaceTokens
-import t5build.*
+//import t5build.*
 
 description = "Central module for Tapestry, containing all core services and 
components"
 
@@ -22,9 +23,6 @@ dependencies {
 
     implementation 'jakarta.annotation:jakarta.annotation-api:2.0.0'
     implementation 'jakarta.xml.bind:jakarta.xml.bind-api:2.3.2'
-//    implementation 'org.glassfish.jaxb:jaxb-runtime:2.3.2'
-//    implementation 'com.sun.xml.ws:jaxws-rt:2.3.2'
-//    implementation 'javax.xml.ws:jaxws-api:2.3.1'
 
     provided project(":tapestry-test")
     provided project(":tapestry-test-constants")
@@ -41,34 +39,55 @@ dependencies {
     testRuntimeOnly 'com.google.inject:guice:3.0'
 }
 
-task preprocessCoffeeScript(type: PreprocessCoffeeScript) {
+def npmWorkingDir = "src/main/typescript/"
+
+task npmInstall(type: Exec) {
+    group "TypeScript"
+    description "Runs npm install"
+    
+    workingDir = npmWorkingDir
+    commandLine isWindows() ? "npm.cmd" : "npm", 'install'
+}
+
+task compileTypeScriptToAmd(type: Exec) {
+    dependsOn npmInstall
+
+    workingDir = npmWorkingDir
+    commandLine isWindows() ? "npm.cmd" : "npm", 'run', 'build-amd'
 }
 
-task compileCoffeeScript(type: CompileCoffeeScript) {
-    outputDir "${mainGeneratedDir}/compiled-coffeescript"
+task compileTypeScriptToEsModule(type: Exec) {
+    dependsOn npmInstall
+    
+    workingDir = npmWorkingDir
+    commandLine isWindows() ? "npm.cmd" : "npm", 'run', 'build-es-module'
 }
 
-task compileProcessedCoffeescript(type: CompileCoffeeScript) {
-    dependsOn preprocessCoffeeScript
-    srcDir preprocessCoffeeScript.outputDir
-    outputDir "${mainGeneratedDir}/compiled-processed-coffeescript"
+task compileTypeScript() {
+    dependsOn compileTypeScriptToAmd
+    dependsOn compileTypeScriptToEsModule
 }
 
-task compileTestCoffeeScript(type: CompileCoffeeScript) {
-    srcDir "src/test/coffeescript"
-    outputDir "${testGeneratedDir}/compiled-coffeescript"
+task generateTypeScriptDocs(type: Exec) {
+    dependsOn npmInstall
+    
+    workingDir = npmWorkingDir
+    commandLine isWindows() ? "npm.cmd" : "npm", 'run', 'docs'
 }
 
-sourceSets {
-    main {
-        output.dir(compileCoffeeScript.outputDir, builtBy: compileCoffeeScript)
-        output.dir(compileProcessedCoffeescript.outputDir, builtBy: 
compileProcessedCoffeescript)
+task cleanTypeScriptFiles(type: Delete) {
+    delete fileTree("src/main/resources/META-INF/assets/es-modules/t5/core") {
+        include '**.js'
     }
-    test {
-        output.dir(compileTestCoffeeScript.outputDir, builtBy: 
compileTestCoffeeScript)
+    delete fileTree("src/main/resources/META-INF/modules/t5/core") {
+        include '**.js'
     }
+    delete "src/main/typescript/docs"
 }
 
+build.dependsOn compileTypeScript
+clean.dependsOn cleanTypeScriptFiles
+
 // Not sure why this is necessary:
 compileTestGroovy.dependsOn compileTestJava
 
diff --git a/tapestry-core/compile-coffeescript 
b/tapestry-core/compile-coffeescript
deleted file mode 100755
index bf99d9950..000000000
--- a/tapestry-core/compile-coffeescript
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/sh
-# This is handy when developing as the Gradle build can be very slow.
-# Starts coffee in --watch mode, so it will keep compiling files on change.
-# Expects coffee to be on the path.
-# Should be executed from the tapestry-core folder.
-# Does NOT compile the test scripts.
-
-inputDir=src/main/coffeescript
-outputDir=src/main/generated/compiled-coffeescript
-
-coffee --watch --output $outputDir $inputDir
diff --git a/tapestry-core/compile-test-coffeescript 
b/tapestry-core/compile-test-coffeescript
deleted file mode 100755
index 2f58178ef..000000000
--- a/tapestry-core/compile-test-coffeescript
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/sh
-# This is handy when developing as the Gradle build can be very slow.
-# Starts coffee in --watch mode, so it will keep compiling files on change.
-# Expects coffee to be on the path.
-# Should be executed from the tapestry-core folder.
-# Doe NOT compile the test scripts.
-
-inputDir=src/test/coffeescript
-outputDir=src/test/generated/compiled-coffeescript
-
-coffee --watch --output $outputDir $inputDir
\ No newline at end of file
diff --git 
a/tapestry-core/src/main/resources/META-INF/assets/es-modules/t5/core/.gitignore
 
b/tapestry-core/src/main/resources/META-INF/assets/es-modules/t5/core/.gitignore
new file mode 100644
index 000000000..343d521e6
--- /dev/null
+++ 
b/tapestry-core/src/main/resources/META-INF/assets/es-modules/t5/core/.gitignore
@@ -0,0 +1 @@
+/*.js
\ No newline at end of file
diff --git 
a/tapestry-core/src/main/resources/META-INF/modules/t5/core/.gitignore 
b/tapestry-core/src/main/resources/META-INF/modules/t5/core/.gitignore
new file mode 100644
index 000000000..343d521e6
--- /dev/null
+++ b/tapestry-core/src/main/resources/META-INF/modules/t5/core/.gitignore
@@ -0,0 +1 @@
+/*.js
\ No newline at end of file
diff --git 
a/tapestry-core/src/main/resources/META-INF/modules/t5/core/datepicker.js 
b/tapestry-core/src/main/resources/META-INF/modules/t5/core/datepicker.js
deleted file mode 100644
index f76d1c8ba..000000000
--- a/tapestry-core/src/main/resources/META-INF/modules/t5/core/datepicker.js
+++ /dev/null
@@ -1,766 +0,0 @@
-/*----------------------------------------------------------------------------\
-|                              Date Picker 1.06                               |
-|-----------------------------------------------------------------------------|
-|                         Created by Erik Arvidsson                           |
-|                  (http://webfx.eae.net/contact.html#erik)                   |
-|                      For WebFX (http://webfx.eae.net/)                      |
-|-----------------------------------------------------------------------------|
-|                            A DOM based Date Picker                          |
-|-----------------------------------------------------------------------------|
-|       Copyright (c) 1999, 2002, 2002, 2003, 2004, 2006 Erik Arvidsson       |
-|-----------------------------------------------------------------------------|
-| Licensed under the Apache License, Version 2.0 (the "License"); you may not |
-| use this file except in compliance with the License.  You may obtain a copy |
-| of the License at http://www.apache.org/licenses/LICENSE-2.0                |
-| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
-| Unless  required  by  applicable law or  agreed  to  in  writing,  software |
-| distributed under the License is distributed on an  "AS IS" BASIS,  WITHOUT |
-| WARRANTIES OR  CONDITIONS OF ANY KIND,  either express or implied.  See the |
-| License  for the  specific language  governing permissions  and limitations |
-| under the License.                                                          |
-|-----------------------------------------------------------------------------|
-| Dependencies: datepicker.css      Date picker style declarations            |
-|-----------------------------------------------------------------------------|
-| 2002-02-10 | Changed _update method to only update the text nodes instead   |
-|            | rewriting the entire table. Also added support for mouse wheel |
-|            | in IE6.                                                        |
-| 2002-01-14 | Cleaned up for 1.0 public version                              |
-| 2002-01-15 | Replace all innerHTML calls with DOM1 methods                  |
-| 2002-01-18 | Minor IE6 bug that occured when dragging the mouse             |
-| 2002-01-19 | Added a popup that is shown when the user clicks on the month. |
-|            | This allows navigation to 6 adjacent months.                   |
-| 2002-04-10 | Fixed a bug that occured in the popup when a date was selected |
-|            | that caused surroundung months to "overflow"                   |
-|            | This had the effect that one could get two October months      |
-|            | listed.                                                        |
-| 2002-09-06 | I had missed one place were window was used instead of         |
-|            | doc.parentWindow                                               |
-| 2003-08-28 | Added support for ensurin no date overflow when changing       |
-|            | months.                                                        |
-| 2004-01-10 | Adding type on the buttons to ensure they are not submit       |
-|            | buttons. Minor CSS change for CSS2                             |
-| 2006-05-28 | Changed license to Apache Software License 2.0.                |
-| 2011-07-27 | Separated "selected date" and "calendar date" concepts.        |
-|            | Selected date is the date specifically selected by the user to |
-|            | put into the form field.  Calendar date reflects the currently |
-|            | displayed month. These are often, but not always, the same     |
-|            | value.  Separating them simplifies a lot of logic and resolves |
-|            | TAP5-1409. Also somewhat smarter for whether to trigger        |
-|            | onselect when clicking "today" (and/or "none")                 |
-| 2012-11-11 | Minor changes to integrate into a page with Twitter Bootstrap, |
-|            | and to support localizing the Today/None buttons.              |
-| 2013-08-29 | More changes to adapt to Bootstrap 3 style                     |
-| 2014-04-27 | Wrap the datepicker script into an AMD module                  |
-|-----------------------------------------------------------------------------|
-| Created 2001-10-?? | All changes are in the log above. | Updated 2006-05-28 |
-\----------------------------------------------------------------------------*/
-
-define([], function(){
-  //The DatePicker constructor
-  //oDate : Date Optional argument representing the date to select
-  //Note: some minor modifications for Tapestry, to work well as a popup.
-  function DatePicker(oDate)
-  {
-      // check arguments
-      if (arguments.length == 0)
-      {
-          this._selectedDate = null;
-          this._calendarDate = new Date;
-          this._selectedInited = false;
-      }
-      else
-      {
-          this._selectedDate = oDate;
-          if (!oDate) 
-          {
-              this._calendarDate = new Date;
-          } else 
-          {
-              this._calendarDate = new Date(oDate);
-          }
-          this._selectedInited = true;
-          
-      }
-
-      this._matrix = [[],[],[],[],[],[],[]];
-      this._showNone = true;
-      this._showToday = true;
-      this._firstWeekDay = 0; // start week with monday according to standards
-      this._redWeekDay = 6;   // sunday is the default red day.
-      // the names of the months and days
-      this._months = [
-          "January", "February", "March", "April",
-          "May", "June", "July", "August",
-          "September", "October", "November", "December"];
-      this._days = ["m", "t", "w", "t", "f", "s", "s"];
-
-      // Allow these to be localized
-      this._todayLabel = "Today";
-      this._noneLabel = "None";
-
-  }
-
-  // Function invoked whenever the selected date changes, whether by
-  // navigation or when the user selects a date.
-  DatePicker.prototype.onchange = function ()
-  {
-  };
-
-  // onselect is more specified than onchange, and    is triggered only when 
the user makes a specific selection
-  // using the calendar (rather than navigating to a new month). For Tapestry,
-  // this will dismiss the popup.
-  DatePicker.prototype.onselect = function()
-  {
-  }
-
-
-  // create the nodes inside the date picker
-  DatePicker.prototype.create = function (doc)
-  {
-      if (doc == null) doc = document;
-
-      this._document = doc;
-
-      // create elements
-      this._el = doc.createElement("div");
-      this._el.className = "datePicker";
-
-      // header
-      var div = doc.createElement("div");
-      div.className = "header";
-      this._el.appendChild(div);
-
-      var headerTable = doc.createElement("table");
-      headerTable.className = "headerTable";
-      headerTable.cellSpacing = 0;
-      div.appendChild(headerTable);
-
-      var tBody = doc.createElement("tbody");
-      headerTable.appendChild(tBody);
-
-      var tr = doc.createElement("tr");
-      tBody.appendChild(tr);
-
-      var td = doc.createElement("td");
-      this._previousMonth = doc.createElement("button");
-      this._previousMonth.className = "btn btn-default btn-xs previousButton";
-      this._previousMonth.setAttribute("type", "button");
-      var icon = doc.createElement("span");
-      icon.className = "glyphicon glyphicon-chevron-left";
-      this._previousMonth.appendChild(icon);
-      td.appendChild(this._previousMonth);
-      tr.appendChild(td);
-
-      td = doc.createElement("td");
-      td.className = "labelContainer";
-      tr.appendChild(td);
-
-      this._topLabel = doc.createElement("a");
-      this._topLabel.className = "topLabel";
-      this._topLabel.href = "#";
-      this._topLabel.appendChild(doc.createTextNode(String.fromCharCode(160)));
-      td.appendChild(this._topLabel);
-
-      this._labelPopup = doc.createElement("div");
-      this._labelPopup.className = "labelPopup";
-      // no insertion
-
-      td = doc.createElement("td");
-      this._nextMonth = doc.createElement("button");
-      this._nextMonth.className = "btn btn-default btn-xs nextButton";
-      this._nextMonth.setAttribute("type", "button");
-      icon = doc.createElement("span");
-      icon.className = "glyphicon glyphicon-chevron-right";
-      this._nextMonth.appendChild(icon);
-
-      td.appendChild(this._nextMonth);
-      tr.appendChild(td);
-
-      // grid
-      div = doc.createElement("div");
-      div.className = "grid";
-      this._el.appendChild(div);
-      this._table = div;
-
-      // footer
-      div = doc.createElement("div");
-      div.className = "footer";
-      this._el.appendChild(div);
-
-      var footerTable = doc.createElement("table");
-      footerTable.className = "footerTable";
-      footerTable.cellSpacing = 0;
-      div.appendChild(footerTable);
-
-      tBody = doc.createElement("tbody");
-      footerTable.appendChild(tBody);
-
-      tr = doc.createElement("tr");
-      tBody.appendChild(tr);
-
-      td = doc.createElement("td");
-      this._todayButton = doc.createElement("button");
-      this._todayButton.className = "btn btn-default btn-xs";
-      this._todayButton.setAttribute("type", "button");
-      this._todayButton.appendChild(doc.createTextNode(this._todayLabel));
-      td.appendChild(this._todayButton);
-      tr.appendChild(td);
-
-      td = doc.createElement("td");
-      td.className = "filler";
-      td.appendChild(doc.createTextNode(String.fromCharCode(160)));
-      tr.appendChild(td);
-
-      td = doc.createElement("td");
-      this._noneButton = doc.createElement("button");
-      this._noneButton.className = "btn btn-default btn-xs";
-      this._noneButton.setAttribute("type", "button");
-      this._noneButton.appendChild(doc.createTextNode(this._noneLabel));
-      td.appendChild(this._noneButton);
-      tr.appendChild(td);
-
-
-      this._createTable(doc);
-
-      this._updateTable();
-      this._setTopLabel();
-
-      if (!this._showNone)
-          this._noneButton.style.visibility = "hidden";
-      if (!this._showToday)
-          this._todayButton.style.visibility = "hidden";
-
-      // IE55+ extension
-      this._previousMonth.hideFocus = true;
-      this._nextMonth.hideFocus = true;
-      this._todayButton.hideFocus = true;
-      this._noneButton.hideFocus = true;
-      // end IE55+ extension
-
-      // hook up events
-      var dp = this;
-      // buttons
-      this._previousMonth.onclick = function ()
-      {
-          dp.goToPreviousMonth();
-      };
-      this._nextMonth.onclick = function ()
-      {
-          dp.goToNextMonth();
-      };
-      this._todayButton.onclick = function ()
-      {
-          dp.goToToday();
-      };
-      this._noneButton.onclick = function ()
-      {
-          //this should always clear the date and trigger onselected... 
-          dp.setDate(null, true);
-      };
-
-      this._el.onselectstart = function ()
-      {
-          return false;
-      };
-
-      this._table.onclick = function (e)
-      {
-          // find event
-          if (e == null) e = doc.parentWindow.event;
-
-          // find td
-          var el = e.target != null ? e.target : e.srcElement;
-          while (el.nodeType != 1)
-              el = el.parentNode;
-          while (el != null && el.tagName && el.tagName.toLowerCase() != "td")
-              el = el.parentNode;
-
-          // if no td found, return
-          if (el == null || el.tagName == null || el.tagName.toLowerCase() != 
"td")
-              return;
-
-          var d = new Date(dp._calendarDate);
-          var n = Number(el.firstChild.data);
-          if (isNaN(n) || n <= 0 || n == null)
-              return;
-
-          d.setDate(n);
-          dp.setDate(d);
-      };
-
-      // show popup
-      this._topLabel.onclick = function (e)
-      {
-          dp._showLabelPopup();
-          return false;
-      };
-
-      this._el.onkeydown = function (e)
-      {
-          if (e == null) e = doc.parentWindow.event;
-          var kc = e.keyCode != null ? e.keyCode : e.charCode;
-
-          if (kc < 37 || kc > 40) return true;
-
-          var d = new Date(dp._calendarDate).valueOf();
-          if (kc == 37) // left
-              d -= 24 * 60 * 60 * 1000;
-          else if (kc == 39) // right
-              d += 24 * 60 * 60 * 1000;
-          else if (kc == 38) // up
-              d -= 7 * 24 * 60 * 60 * 1000;
-          else if (kc == 40) // down
-              d += 7 * 24 * 60 * 60 * 1000;
-
-          dp.setCalendarDate(new Date(d));
-          return false;
-      }
-
-      // ie6 extension
-      this._el.onmousewheel = function (e)
-      {
-          if (e == null) e = doc.parentWindow.event;
-          var n = - e.wheelDelta / 120;
-          var d = new Date(dp._calendarDate);
-          var m = d.getMonth() + n;
-          d.setMonth(m);
-
-
-          dp.setCalendarDate(d);
-
-          return false;
-      }
-
-      doc.onclick  =  function (e) {
-          var targ;
-          
-           // find event
-          if (e == null) e = doc.parentWindow.event;
-          
-          if (e.target) targ = e.target;
-          else if (e.srcElement) targ = e.srcElement;
-          // find classname 'datePicker' as parent
-          var insideDatePicker = null;
-          var parent = targ.parentNode;
-          while (parent != null) {
-              if (parent.className == 'datePicker' || parent.className == 
'labelPopup') {
-                  insideDatePicker = parent;
-                  break;
-              }
-              parent = parent.parentNode;
-          }
-      }
-      return this._el;
-  };
-
-  DatePicker.prototype.setCalendarDate = function(oDate)
-  {
-      if (oDate != null) 
-      {
-          //note that calendarDate should never be null!
-          this._calendarDate = oDate;
-      }
-      this._hideLabelPopup();
-      this._setTopLabel();
-      this._updateTable();
-  }
-
-  DatePicker.prototype.setDate = function (oDate, forceOnSelect)
-  {
-
-      // if null then set None
-      if (oDate == null)
-      {
-          //if _selectedDate isn't null, then this is an actual change...
-          //but if it /is/ null, we have to see if we were inited or not. If 
we weren't inited, then we're 
-          //setting this to null now, and we shouldn't fire a select...
-          //but the problem occurs on subsequent... hm...
-          if (this._selectedDate != null)
-          {
-              this._selectedDate = null;
-              if (typeof this.onchange == "function")
-                  this.onchange();
-              this.onselect();
-          } else if (forceOnSelect)
-              this.onselect();
-          //note: setDate must inherently set the calendar date
-          this._selectedInited=true;
-          this.setCalendarDate(null);
-
-          return;
-      }
-
-      // if string or number create a Date object
-      if (typeof oDate == "string" || typeof oDate == "number")
-      {
-          oDate = new Date(oDate);
-      }
-
-      // do not update if not really changed
-      if (this._selectedDate == null || 
!this._datesAreSame(this._selectedDate, oDate))
-      {
-          this._selectedDate = new Date(oDate);
-      
-          if (typeof this.onchange == "function")
-              this.onchange();
-
-          //so if _selectedInited is false, then the value is different only 
because we set the value programmatically, post-initialization.
-          //that handles the creation + set event. Subsequent reveals will set 
it to whatever _selectedDate already was, so it's handled.
-          if (this._selectedInited)
-              this.onselect();
-          else
-              this._selectedInited=true;
-      } else if (forceOnSelect)
-          this.onselect();
-      //note: setDate must inherently set the calendar date
-      this.setCalendarDate(oDate);
-
-  }
-
-
-  DatePicker.prototype.getDate = function ()
-  {
-      if (!this._selectedDate) return null;
-      return new Date(this._selectedDate);    // create a new instance
-  }
-
-  // creates the table elements and inserts them into the date picker
-  DatePicker.prototype._createTable = function (doc)
-  {
-      var str, i;
-      var rows = 6;
-      var cols = 7;
-      var currentWeek = 0;
-
-      var table = doc.createElement("table");
-      table.className = "gridTable";
-      table.cellSpacing = 0;
-
-      var tBody = doc.createElement("tbody");
-      table.appendChild(tBody);
-
-      // days row
-      var tr = doc.createElement("tr");
-      tr.className = "daysRow";
-
-      var td, tn;
-      var nbsp = String.fromCharCode(160);
-      for (i = 0; i < cols; i++)
-      {
-          td = doc.createElement("td");
-          td.appendChild(doc.createTextNode(nbsp));
-          tr.appendChild(td);
-      }
-      tBody.appendChild(tr);
-
-      // upper line
-      tr = doc.createElement("tr");
-      td = doc.createElement("td");
-      td.className = "upperLine";
-      td.colSpan = 7;
-      tr.appendChild(td);
-      tBody.appendChild(tr);
-
-      // rest
-      for (i = 0; i < rows; i++)
-      {
-          tr = doc.createElement("tr");
-          for (var j = 0; j < cols; j++)
-          {
-              td = doc.createElement("td");
-              td.appendChild(doc.createTextNode(nbsp));
-              tr.appendChild(td);
-          }
-          tBody.appendChild(tr);
-      }
-      str += "</table>";
-
-      if (this._table != null)
-          this._table.appendChild(table)
-  };
-  // this method updates all the text nodes inside the table as well
-  // as all the classNames on the tds
-  DatePicker.prototype._updateTable = function ()
-  {
-      // if no element no need to continue
-      if (this._table == null) return;
-
-      var i;
-      var str = "";
-      var rows = 6;
-      var cols = 7;
-      var currentWeek = 0;
-
-      var cells = new Array(rows);
-      this._matrix = new Array(rows)
-      for (i = 0; i < rows; i++)
-      {
-          cells[i] = new Array(cols);
-          this._matrix[i] = new Array(cols);
-      }
-
-      // Set the tmpDate to this month
-      var tmpDate = new Date(this._calendarDate.getFullYear(),
-              this._calendarDate.getMonth(), 1);
-      var today = new Date();
-      // go thorugh all days this month and store the text
-      // and the class name in the cells matrix
-      for (i = 1; i < 32; i++)
-      {
-          tmpDate.setDate(i);
-          // convert to ISO, Monday is 0 and 6 is Sunday
-          var weekDay = ( tmpDate.getDay() + 6 ) % 7;
-          var colIndex = ( weekDay - this._firstWeekDay + 7 ) % 7;
-          if (tmpDate.getMonth() == this._calendarDate.getMonth())
-          {
-
-              var isToday = this._datesAreSame(tmpDate, today);
-
-              cells[currentWeek][colIndex] = { text: "", className: "" };
-
-              if (this._datesAreSame(this._selectedDate, tmpDate)) 
-                  cells[currentWeek][colIndex].className += "selected ";
-              if (isToday)
-                  cells[currentWeek][colIndex].className += "today ";
-              if (( tmpDate.getDay() + 6 ) % 7 == this._redWeekDay) // ISO
-                  cells[currentWeek][colIndex].className += "red";
-
-              cells[currentWeek][colIndex].text =
-              this._matrix[currentWeek][colIndex] = tmpDate.getDate();
-
-              if (colIndex == 6)
-                  currentWeek++;
-          }
-      }
-
-      // fix day letter order if not standard
-      var weekDays = this._days;
-      if (this._firstWeekDay != 0)
-      {
-          weekDays = new Array(7);
-          for (i = 0; i < 7; i++)
-              weekDays[i] = this._days[ (i + this._firstWeekDay) % 7];
-      }
-
-      // update text in days row
-      var tds = this._table.firstChild.tBodies[0].rows[0].cells;
-      for (i = 0; i < cols; i++)
-          tds[i].firstChild.data = weekDays[i];
-
-      // update the text nodes and class names
-      var trs = this._table.firstChild.tBodies[0].rows;
-      var tmpCell;
-      var nbsp = String.fromCharCode(160);
-      for (var y = 0; y < rows; y++)
-      {
-          for (var x = 0; x < cols; x++)
-          {
-              tmpCell = trs[y + 2].cells[x];
-              if (typeof cells[y][x] != "undefined")
-              {
-                  tmpCell.className = cells[y][x].className;
-                  tmpCell.firstChild.data = cells[y][x].text;
-              }
-              else
-              {
-                  tmpCell.className = "";
-                  tmpCell.firstChild.data = nbsp;
-              }
-          }
-      }
-  }
-
-  // sets the label showing the year and selected month
-  DatePicker.prototype._setTopLabel = function ()
-  {
-      var str = this._calendarDate.getFullYear() + " " + this._months[ 
this._calendarDate.getMonth() ];
-      if (this._topLabel != null)
-          this._topLabel.lastChild.data = str;
-  }
-
-  DatePicker.prototype.goToNextMonth = function ()
-  {
-      var d = new Date(this._calendarDate);
-      d.setDate(Math.min(d.getDate(), DatePicker.getDaysPerMonth(d.getMonth() 
+ 1,
-              d.getFullYear()))); // no need to catch dec -> jan for the year
-      d.setMonth(d.getMonth() + 1);
-      this.setCalendarDate(d);
-  }
-
-  DatePicker.prototype.goToPreviousMonth = function ()
-  {
-      var d = new Date(this._calendarDate);
-      d.setDate(Math.min(d.getDate(), DatePicker.getDaysPerMonth(d.getMonth() 
- 1,
-              d.getFullYear()))); // no need to catch jan -> dec for the year
-      d.setMonth(d.getMonth() - 1);
-      this.setCalendarDate(d);
-  }
-
-  DatePicker.prototype.goToToday = function ()
-  {
-      //note: small tweak here so that clicking the "Today" button will 
properly update the selected date and trigger selected
-      //but note that we want this behavior iff "today" is already selected 
and visible. 
-      //For instance: If you're looking at some date months away from today 
and want to jump back to today AND today is the selectedDate
-      //then we don't want that to close the calendar.
-      var today = new Date();
-      var forceOnSelect=false;
-      if (this._selectedDate == null || (this._datesAreSame(today, 
this._selectedDate) && this._calendarDate.getMonth() == today.getMonth() && 
this._calendarDate.getFullYear() == today.getFullYear())) {
-          //then go ahead and force the selection...
-          forceOnSelect=true;
-      }
-      this.setDate(new Date(), forceOnSelect);//note that setDate calls 
setCalendarDate...
-  }
-
-  DatePicker.prototype.setShowToday = function (bShowToday)
-  {
-      if (typeof bShowToday == "string")
-          bShowToday = !/false|0|no/i.test(bShowToday);
-
-      if (this._todayButton != null)
-          this._todayButton.style.visibility = bShowToday ? "visible" : 
"hidden";
-      this._showToday = bShowToday;
-  }
-
-  DatePicker.prototype.getShowToday = function ()
-  {
-      return this._showToday;
-  }
-
-  DatePicker.prototype.setShowNone = function (bShowNone)
-  {
-      if (typeof bShowNone == "string")
-          bShowNone = !/false|0|no/i.test(bShowNone);
-
-      if (this._noneButton != null)
-          this._noneButton.style.visibility = bShowNone ? "visible" : "hidden";
-      this._showNone = bShowNone;
-  }
-
-  DatePicker.prototype.getShowNone = function ()
-  {
-      return this._showNone;
-  }
-
-  // 0 is monday and 6 is sunday as in the ISO standard
-  DatePicker.prototype.setFirstWeekDay = function (nFirstWeekDay)
-  {
-      if (this._firstWeekDay != nFirstWeekDay)
-      {
-          this._firstWeekDay = nFirstWeekDay;
-          this._updateTable();
-      }
-  }
-
-  DatePicker.prototype.getFirstWeekDay = function ()
-  {
-      return this._firstWeekDay;
-  }
-
-  // 0 is monday and 6 is sunday as in the ISO standard
-  DatePicker.prototype.setRedWeekDay = function (nRedWeekDay)
-  {
-      if (this._redWeekDay != nRedWeekDay)
-      {
-          this._redWeekDay = nRedWeekDay;
-          this._updateTable();
-      }
-  }
-
-  DatePicker.prototype.getRedWeekDay = function ()
-  {
-      return this._redWeekDay;
-  }
-
-  
-  DatePicker.prototype.setLocalizations = function(monthNames, dayNames, 
todayLabel, noneLabel)
-  {
-      this._months = monthNames;
-      this._days = dayNames;
-      this._todayLabel = todayLabel;
-      this._noneLabel = noneLabel;
-      if (this._todayButton != null)
-      {
-          this._todayButton.innerHTML = todayLabel;
-      }
-      if (this._noneButton != null)
-      {
-          this._noneButton.innerHTML = noneLabel;
-      }
-      this._updateTable();
-  }
-
-  DatePicker.prototype._showLabelPopup = function ()
-  {
-
-      var dateContext = function (dp, d)
-      {
-          return function (e)
-          {
-              dp._hideLabelPopup();
-              dp.setCalendarDate(d);
-              return false;
-          };
-      };
-
-      var dp = this;
-
-      // clear all old elements in the popup
-      while (this._labelPopup.hasChildNodes())
-          this._labelPopup.removeChild(this._labelPopup.firstChild);
-
-      var a, tmp, tmp2;
-      for (var i = -3; i < 4; i++)
-      {
-          tmp = new Date(this._calendarDate);
-          tmp2 = new Date(this._calendarDate);    // need another tmp to catch 
year change when checking leap
-          tmp2.setDate(1);
-          tmp2.setMonth(tmp2.getMonth() + i);
-          tmp.setDate(Math.min(tmp.getDate(), 
DatePicker.getDaysPerMonth(tmp.getMonth() + i,
-                  tmp2.getFullYear())));
-          tmp.setMonth(tmp.getMonth() + i);
-
-          a = this._document.createElement("a");
-          a.href = "javascript:void 0;";
-          a.onclick = dateContext(dp, tmp);
-          a.appendChild(this._document.createTextNode(tmp.getFullYear() + " " +
-                                                      this._months[ 
tmp.getMonth() ]));
-          if (i == 0)
-              a.className = "selected";
-          this._labelPopup.appendChild(a);
-      }
-
-      this._topLabel.parentNode.insertBefore(this._labelPopup, 
this._topLabel.parentNode.firstChild);
-  };
-
-  DatePicker.prototype._hideLabelPopup = function ()
-  {
-      if (this._labelPopup.parentNode)
-          this._labelPopup.parentNode.removeChild(this._labelPopup);
-  };
-
-  DatePicker.prototype._datesAreSame = function(d1,d2)
-  {
-      if (d1 == null && d2 == null)
-          return true;
-      else if (d1 == null)
-          return false;
-      else if (d2 == null)
-          return false;
-      return d1.getDate() == d2.getDate() && d1.getMonth() == d2.getMonth() && 
d1.getFullYear() == d2.getFullYear();    
-  }
-
-  DatePicker._daysPerMonth = [31,28,31,30,31,30,31,31,30,31,30,31];
-  DatePicker.getDaysPerMonth = function (nMonth, nYear)
-  {
-      nMonth = (nMonth + 12) % 12;
-      var res = DatePicker._daysPerMonth[nMonth];
-      if (nMonth == 1)
-      {
-          res += nYear % 4 == 0 && !(nYear % 400 == 0) ? 1 : 0;
-      }
-      return res;
-  };
-  return DatePicker;
-
-});
-
diff --git a/tapestry-core/src/main/typescript/package-lock.json 
b/tapestry-core/src/main/typescript/package-lock.json
index 4b1160c17..3b3b44d48 100644
--- a/tapestry-core/src/main/typescript/package-lock.json
+++ b/tapestry-core/src/main/typescript/package-lock.json
@@ -1,9 +1,10 @@
 {
-  "name": "typescript",
+  "name": "tapestry-5",
   "lockfileVersion": 3,
   "requires": true,
   "packages": {
     "": {
+      "name": "tapestry-5",
       "license": "Apache-2.0",
       "devDependencies": {
         "@hpcc-js/wasm": "^2.22.4",
diff --git a/tapestry-core/src/main/typescript/package.json 
b/tapestry-core/src/main/typescript/package.json
index 6cd5b7a06..eb668549c 100644
--- a/tapestry-core/src/main/typescript/package.json
+++ b/tapestry-core/src/main/typescript/package.json
@@ -1,4 +1,5 @@
 {
+  "packageManager": "npm",
   "type": "module",
   "devDependencies": {
     "@hpcc-js/wasm": "^2.22.4",
@@ -13,10 +14,10 @@
   },
   "scripts": {
     "build": "npx tsc",
+    "build-es-module": "npx tsc --outDir 
../resources/META-INF/assets/es-modules/t5/core/",
+    "build-amd": "npx tsc --module amd --outDir 
../resources/META-INF/modules/t5/core/",
     "docs": "typedoc",
-    "docs-old": "node_modules/.bin/jsdoc --destination ./docs -r --verbose 
--pedantic ./output",
-    "docs-config": "node_modules/.bin/jsdoc -c jsdoc.json",
-    "clean-docs": "rm -rf out"
+    "clean-docs": "rm -rf docs"
   },
   "license": "Apache-2.0",
   "name": "tapestry-5",
diff --git a/tapestry-core/src/main/typescript/tsconfig.json 
b/tapestry-core/src/main/typescript/tsconfig.json
index f88558b88..4b9f95903 100644
--- a/tapestry-core/src/main/typescript/tsconfig.json
+++ b/tapestry-core/src/main/typescript/tsconfig.json
@@ -31,7 +31,7 @@
     // "skipDefaultLibCheck": true,                      /* Skip type checking 
.d.ts files that are included with TypeScript. */
     "skipLibCheck": true                                 /* Skip type checking 
all .d.ts files. */,
 
-    "outDir": "output",
+    "outDir": "../resources/META-INF/assets/es-modules/t5/core/",
 
   },
 


Reply via email to