@northguild/gmt 1.17.0 → 1.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (638) hide show
  1. package/README.md +462 -22
  2. package/dist/calendar/calculate/bucketRange.d.ts +3 -3
  3. package/dist/calendar/calculate/bucketRange.js +6 -6
  4. package/dist/calendar/calculate/floorToZone.d.ts +5 -3
  5. package/dist/calendar/calculate/floorToZone.js +6 -5
  6. package/dist/calendar/calculate/getFiscalPeriod.d.ts +21 -8
  7. package/dist/calendar/calculate/getFiscalPeriod.js +9 -8
  8. package/dist/calendar/calculate/getIsoWeekDate.d.ts +10 -5
  9. package/dist/calendar/calculate/getIsoWeekDate.js +1 -5
  10. package/dist/calendar/calculate/getOrdinalDate.d.ts +10 -3
  11. package/dist/calendar/calculate/getOrdinalDate.js +2 -3
  12. package/dist/calendar/calculate/getQuarter.d.ts +21 -9
  13. package/dist/calendar/calculate/getQuarter.js +8 -12
  14. package/dist/calendar/hours/addOperatingTime.d.ts +53 -0
  15. package/dist/calendar/hours/addOperatingTime.js +59 -0
  16. package/dist/calendar/hours/index.d.ts +7 -0
  17. package/dist/calendar/hours/index.js +7 -0
  18. package/dist/calendar/hours/isOpenAt.d.ts +39 -0
  19. package/dist/calendar/hours/isOpenAt.js +44 -0
  20. package/dist/calendar/hours/nextCloseAt.d.ts +49 -0
  21. package/dist/calendar/hours/nextCloseAt.js +51 -0
  22. package/dist/calendar/hours/nextOpenAt.d.ts +45 -0
  23. package/dist/calendar/hours/nextOpenAt.js +47 -0
  24. package/dist/calendar/hours/operatingIntervals.d.ts +43 -0
  25. package/dist/calendar/hours/operatingIntervals.js +52 -0
  26. package/dist/calendar/hours/operatingTimeBetween.d.ts +40 -0
  27. package/dist/calendar/hours/operatingTimeBetween.js +49 -0
  28. package/dist/calendar/hours/recurringWindows.d.ts +61 -0
  29. package/dist/calendar/hours/recurringWindows.js +80 -0
  30. package/dist/calendar/index.d.ts +1 -0
  31. package/dist/calendar/index.js +1 -0
  32. package/dist/duration/calculate/durationAs.d.ts +13 -8
  33. package/dist/duration/calculate/durationAs.js +4 -8
  34. package/dist/duration/compare/compareDurations.d.ts +12 -6
  35. package/dist/duration/compare/compareDurations.js +3 -6
  36. package/dist/duration/format/formatDuration.d.ts +16 -4
  37. package/dist/duration/format/formatDuration.js +4 -5
  38. package/dist/duration/normalize/normalizeDuration.d.ts +39 -14
  39. package/dist/duration/normalize/normalizeDuration.js +6 -15
  40. package/dist/duration/parse/parseDuration.d.ts +21 -3
  41. package/dist/duration/parse/parseDuration.js +1 -3
  42. package/dist/instant/convert/classifyLocal.d.ts +1 -1
  43. package/dist/instant/convert/classifyLocal.js +1 -1
  44. package/dist/instant/convert/fromOffsetInstant.d.ts +3 -1
  45. package/dist/instant/convert/fromOffsetInstant.js +3 -1
  46. package/dist/instant/convert/resolveLocal.d.ts +12 -7
  47. package/dist/instant/convert/resolveLocal.js +6 -10
  48. package/dist/instant/convert/toOffsetInstant.d.ts +22 -9
  49. package/dist/instant/convert/toOffsetInstant.js +10 -3
  50. package/dist/intermodal/calculate/billingTimeline.d.ts +31 -11
  51. package/dist/intermodal/calculate/billingTimeline.js +2 -2
  52. package/dist/intermodal/calculate/chargeableDays.d.ts +13 -11
  53. package/dist/intermodal/calculate/chargeableDays.js +4 -9
  54. package/dist/intermodal/calculate/demurrageClock.d.ts +16 -7
  55. package/dist/intermodal/calculate/demurrageClock.js +7 -7
  56. package/dist/intermodal/calculate/freeTimeExpiry.d.ts +5 -4
  57. package/dist/intermodal/calculate/freeTimeExpiry.js +6 -6
  58. package/dist/internal/businessCalendar.d.ts +5 -0
  59. package/dist/internal/businessCalendar.js +5 -1
  60. package/dist/internal/cycleFieldValue.d.ts +6 -4
  61. package/dist/internal/cycleFieldValue.js +6 -4
  62. package/dist/internal/daylightTime.d.ts +33 -0
  63. package/dist/internal/daylightTime.js +164 -0
  64. package/dist/internal/durationUntilString.js +4 -3
  65. package/dist/internal/englishCalendarNames.js +1 -2
  66. package/dist/internal/epochNanoseconds.d.ts +2 -0
  67. package/dist/internal/epochNanoseconds.js +2 -0
  68. package/dist/internal/exactDuration.d.ts +37 -0
  69. package/dist/internal/exactDuration.js +64 -0
  70. package/dist/internal/exactMoment.d.ts +72 -0
  71. package/dist/internal/exactMoment.js +114 -0
  72. package/dist/internal/fiscalCalendar.d.ts +4 -3
  73. package/dist/internal/fiscalCalendar.js +4 -3
  74. package/dist/internal/formatCalendarDays.d.ts +2 -2
  75. package/dist/internal/formatRelativeDuration.d.ts +21 -1
  76. package/dist/internal/formatRelativeDuration.js +47 -7
  77. package/dist/internal/index.d.ts +9 -4
  78. package/dist/internal/index.js +9 -4
  79. package/dist/internal/instantFormatOptions.js +2 -1
  80. package/dist/internal/instantNanoseconds.d.ts +75 -9
  81. package/dist/internal/instantNanoseconds.js +192 -11
  82. package/dist/internal/joinDateTimeConnector.d.ts +1 -1
  83. package/dist/internal/monthGridWeekRow.d.ts +2 -1
  84. package/dist/internal/monthGridWeekRow.js +2 -1
  85. package/dist/internal/normalizeTimeZone.d.ts +2 -2
  86. package/dist/internal/normalizeTimeZone.js +2 -2
  87. package/dist/internal/operatingSchedule.d.ts +129 -0
  88. package/dist/internal/operatingSchedule.js +668 -0
  89. package/dist/internal/optionOrDefault.d.ts +18 -0
  90. package/dist/internal/optionOrDefault.js +20 -0
  91. package/dist/internal/patternToken.d.ts +2 -2
  92. package/dist/internal/patternToken.js +28 -13
  93. package/dist/internal/plainDateUntil.js +10 -6
  94. package/dist/internal/punctuality.d.ts +38 -0
  95. package/dist/internal/punctuality.js +59 -0
  96. package/dist/internal/readDateTimeFormatOptions.d.ts +30 -0
  97. package/dist/internal/readDateTimeFormatOptions.js +93 -0
  98. package/dist/internal/resolveDurationRelativeTo.d.ts +4 -0
  99. package/dist/internal/resolveDurationRelativeTo.js +11 -1
  100. package/dist/internal/resolveRelativeRounding.d.ts +17 -6
  101. package/dist/internal/resolveRelativeRounding.js +27 -7
  102. package/dist/internal/resolveRelativeUnit.d.ts +30 -0
  103. package/dist/internal/resolveRelativeUnit.js +40 -0
  104. package/dist/internal/splitStep.d.ts +24 -1
  105. package/dist/internal/splitStep.js +34 -2
  106. package/dist/internal/startOrEndOfZoned.js +2 -3
  107. package/dist/internal/temporalCompat/capabilities.d.ts +26 -0
  108. package/dist/internal/temporalCompat/capabilities.js +35 -3
  109. package/dist/internal/temporalCompat/fieldSearch.js +1 -1
  110. package/dist/internal/temporalCompat/index.d.ts +1 -1
  111. package/dist/internal/temporalCompat/index.js +1 -1
  112. package/dist/internal/temporalCompat/repros.d.ts +1 -1
  113. package/dist/internal/temporalCompat/repros.js +157 -0
  114. package/dist/internal/timestampEvents.d.ts +32 -0
  115. package/dist/internal/timestampEvents.js +76 -0
  116. package/dist/internal/utcZonedDateTime.d.ts +5 -2
  117. package/dist/internal/utcZonedDateTime.js +8 -5
  118. package/dist/internal/zonedBucket.js +8 -6
  119. package/dist/internal/zonedLocalDates.js +1 -1
  120. package/dist/internal/zonedTransitionSearch.d.ts +27 -0
  121. package/dist/internal/zonedTransitionSearch.js +218 -0
  122. package/dist/internal/zonedWallClock.d.ts +21 -7
  123. package/dist/internal/zonedWallClock.js +87 -18
  124. package/dist/internal/zonedWallClockOperations.d.ts +26 -13
  125. package/dist/internal/zonedWallClockOperations.js +87 -34
  126. package/dist/interval/validate/isValidInterval.d.ts +6 -3
  127. package/dist/interval/validate/isValidInterval.js +6 -3
  128. package/dist/plain/calculate/addDate.d.ts +11 -8
  129. package/dist/plain/calculate/addDate.js +5 -8
  130. package/dist/plain/calculate/addDateTime.d.ts +7 -4
  131. package/dist/plain/calculate/addDateTime.js +1 -4
  132. package/dist/plain/calculate/cycleDate.d.ts +16 -7
  133. package/dist/plain/calculate/cycleDate.js +3 -7
  134. package/dist/plain/calculate/cycleDateTime.d.ts +14 -4
  135. package/dist/plain/calculate/cycleDateTime.js +1 -4
  136. package/dist/plain/calculate/cycleTime.d.ts +10 -5
  137. package/dist/plain/calculate/cycleTime.js +3 -5
  138. package/dist/plain/calculate/diffDate.d.ts +1 -1
  139. package/dist/plain/calculate/diffDate.js +1 -1
  140. package/dist/plain/calculate/diffDateAsDuration.d.ts +1 -1
  141. package/dist/plain/calculate/diffDateAsDuration.js +1 -1
  142. package/dist/plain/calculate/diffDateTime.d.ts +1 -1
  143. package/dist/plain/calculate/diffDateTime.js +1 -1
  144. package/dist/plain/calculate/diffDateTimeAsDuration.d.ts +1 -1
  145. package/dist/plain/calculate/diffDateTimeAsDuration.js +1 -1
  146. package/dist/plain/calculate/diffTime.d.ts +1 -1
  147. package/dist/plain/calculate/diffTime.js +1 -1
  148. package/dist/plain/calculate/endOfDate.d.ts +8 -3
  149. package/dist/plain/calculate/endOfDate.js +1 -3
  150. package/dist/plain/calculate/endOfDateTime.d.ts +15 -5
  151. package/dist/plain/calculate/endOfDateTime.js +1 -5
  152. package/dist/plain/calculate/endOfTime.d.ts +8 -2
  153. package/dist/plain/calculate/endOfTime.js +1 -2
  154. package/dist/plain/calculate/getLocaleWeekYear.d.ts +16 -9
  155. package/dist/plain/calculate/getLocaleWeekYear.js +9 -9
  156. package/dist/plain/calculate/getWeekOfMonth.d.ts +7 -4
  157. package/dist/plain/calculate/getWeekOfMonth.js +7 -4
  158. package/dist/plain/calculate/getWeeksInLocaleWeekYear.d.ts +13 -6
  159. package/dist/plain/calculate/getWeeksInLocaleWeekYear.js +6 -6
  160. package/dist/plain/calculate/getWeeksInMonth.d.ts +5 -2
  161. package/dist/plain/calculate/getWeeksInMonth.js +5 -2
  162. package/dist/plain/calculate/nextWeekday.d.ts +7 -3
  163. package/dist/plain/calculate/nextWeekday.js +1 -3
  164. package/dist/plain/calculate/previousWeekday.d.ts +7 -3
  165. package/dist/plain/calculate/previousWeekday.js +1 -3
  166. package/dist/plain/calculate/roundDate.d.ts +20 -7
  167. package/dist/plain/calculate/roundDate.js +3 -10
  168. package/dist/plain/calculate/roundDateTime.d.ts +22 -8
  169. package/dist/plain/calculate/roundDateTime.js +3 -11
  170. package/dist/plain/calculate/roundTime.d.ts +20 -4
  171. package/dist/plain/calculate/roundTime.js +3 -7
  172. package/dist/plain/calculate/setDate.d.ts +7 -5
  173. package/dist/plain/calculate/setDate.js +1 -5
  174. package/dist/plain/calculate/setDateTime.d.ts +8 -5
  175. package/dist/plain/calculate/setDateTime.js +1 -5
  176. package/dist/plain/calculate/setTime.d.ts +10 -6
  177. package/dist/plain/calculate/setTime.js +4 -6
  178. package/dist/plain/calculate/startOfDate.d.ts +8 -2
  179. package/dist/plain/calculate/startOfDate.js +1 -2
  180. package/dist/plain/calculate/startOfDateTime.d.ts +15 -2
  181. package/dist/plain/calculate/startOfDateTime.js +1 -2
  182. package/dist/plain/calculate/startOfTime.d.ts +8 -1
  183. package/dist/plain/calculate/startOfTime.js +1 -1
  184. package/dist/plain/calculate/subtractDate.d.ts +7 -4
  185. package/dist/plain/calculate/subtractDate.js +1 -4
  186. package/dist/plain/calculate/subtractDateTime.d.ts +7 -4
  187. package/dist/plain/calculate/subtractDateTime.js +1 -4
  188. package/dist/plain/compare/areDateTimesEqualBy.d.ts +13 -5
  189. package/dist/plain/compare/areDateTimesEqualBy.js +6 -5
  190. package/dist/plain/compare/areDatesEqualBy.d.ts +15 -6
  191. package/dist/plain/compare/areDatesEqualBy.js +8 -6
  192. package/dist/plain/compare/isBetweenDate.d.ts +13 -2
  193. package/dist/plain/compare/isBetweenDate.js +4 -4
  194. package/dist/plain/compare/isBetweenDateTime.d.ts +13 -2
  195. package/dist/plain/compare/isBetweenDateTime.js +4 -4
  196. package/dist/plain/compare/isBetweenTime.d.ts +13 -2
  197. package/dist/plain/compare/isBetweenTime.js +4 -4
  198. package/dist/plain/compare/isRelativeDay.d.ts +1 -1
  199. package/dist/plain/compare/isRelativeDay.js +1 -1
  200. package/dist/plain/compare/isThisUnit.d.ts +1 -1
  201. package/dist/plain/compare/isThisUnit.js +1 -1
  202. package/dist/plain/format/formatCalendar.d.ts +21 -14
  203. package/dist/plain/format/formatCalendar.js +21 -16
  204. package/dist/plain/format/formatDate.js +5 -3
  205. package/dist/plain/format/formatDateRange.js +4 -2
  206. package/dist/plain/format/formatDateTime.js +4 -2
  207. package/dist/plain/format/formatDateTimeRange.js +4 -2
  208. package/dist/plain/format/formatDateTimeToParts.d.ts +15 -4
  209. package/dist/plain/format/formatDateTimeToParts.js +10 -6
  210. package/dist/plain/format/formatDateToParts.d.ts +13 -2
  211. package/dist/plain/format/formatDateToParts.js +8 -4
  212. package/dist/plain/format/formatRelativeDate.d.ts +16 -3
  213. package/dist/plain/format/formatRelativeDate.js +26 -15
  214. package/dist/plain/format/formatRelativeDateTime.d.ts +16 -3
  215. package/dist/plain/format/formatRelativeDateTime.js +8 -5
  216. package/dist/plain/format/formatRelativeTime.d.ts +16 -3
  217. package/dist/plain/format/formatRelativeTime.js +21 -13
  218. package/dist/plain/format/formatTime.js +4 -2
  219. package/dist/plain/interval/intervalDifferenceDate.d.ts +9 -0
  220. package/dist/plain/interval/intervalDifferenceDateTime.d.ts +9 -0
  221. package/dist/plain/interval/intervalDifferenceTime.d.ts +9 -0
  222. package/dist/plain/interval/intervalDivideEquallyDate.d.ts +19 -4
  223. package/dist/plain/interval/intervalDivideEquallyDate.js +3 -4
  224. package/dist/plain/interval/intervalDivideEquallyDateTime.d.ts +19 -4
  225. package/dist/plain/interval/intervalDivideEquallyDateTime.js +3 -4
  226. package/dist/plain/interval/intervalDivideEquallyTime.d.ts +19 -4
  227. package/dist/plain/interval/intervalDivideEquallyTime.js +3 -4
  228. package/dist/plain/interval/intervalFromDurationDate.d.ts +16 -3
  229. package/dist/plain/interval/intervalFromDurationDate.js +1 -3
  230. package/dist/plain/interval/intervalFromDurationDateTime.d.ts +16 -3
  231. package/dist/plain/interval/intervalFromDurationDateTime.js +1 -3
  232. package/dist/plain/interval/intervalFromDurationTime.d.ts +9 -0
  233. package/dist/plain/interval/intervalIntersectionDate.d.ts +9 -0
  234. package/dist/plain/interval/intervalIntersectionDateTime.d.ts +9 -0
  235. package/dist/plain/interval/intervalIntersectionTime.d.ts +9 -0
  236. package/dist/plain/interval/intervalSplitAtDate.d.ts +11 -0
  237. package/dist/plain/interval/intervalSplitAtDate.js +2 -0
  238. package/dist/plain/interval/intervalSplitAtDateTime.d.ts +11 -0
  239. package/dist/plain/interval/intervalSplitAtDateTime.js +2 -0
  240. package/dist/plain/interval/intervalSplitAtTime.d.ts +11 -0
  241. package/dist/plain/interval/intervalSplitAtTime.js +2 -0
  242. package/dist/plain/interval/intervalUnionDate.d.ts +9 -0
  243. package/dist/plain/interval/intervalUnionDateTime.d.ts +9 -0
  244. package/dist/plain/interval/intervalUnionTime.d.ts +9 -0
  245. package/dist/plain/interval/intervalXorAllDate.d.ts +9 -0
  246. package/dist/plain/interval/intervalXorAllDateTime.d.ts +9 -0
  247. package/dist/plain/interval/intervalXorAllTime.d.ts +9 -0
  248. package/dist/plain/interval/intervalXorDate.d.ts +9 -0
  249. package/dist/plain/interval/intervalXorDateTime.d.ts +9 -0
  250. package/dist/plain/interval/intervalXorTime.d.ts +9 -0
  251. package/dist/plain/interval/mergeIntervalsDate.d.ts +9 -0
  252. package/dist/plain/interval/mergeIntervalsDateTime.d.ts +9 -0
  253. package/dist/plain/interval/mergeIntervalsTime.d.ts +9 -0
  254. package/dist/plain/interval/splitIntervalByUnitDate.d.ts +23 -7
  255. package/dist/plain/interval/splitIntervalByUnitDate.js +7 -7
  256. package/dist/plain/interval/splitIntervalByUnitDateTime.d.ts +22 -6
  257. package/dist/plain/interval/splitIntervalByUnitDateTime.js +6 -6
  258. package/dist/plain/interval/splitIntervalByUnitTime.d.ts +17 -4
  259. package/dist/plain/interval/splitIntervalByUnitTime.js +1 -4
  260. package/dist/plain/map/mapDatesInRange.d.ts +8 -4
  261. package/dist/plain/map/mapDatesInRange.js +1 -4
  262. package/dist/plain/parse/parseDateTimeWithPattern.d.ts +10 -7
  263. package/dist/plain/parse/parseDateTimeWithPattern.js +10 -7
  264. package/dist/plain/parse/parseDateWithPattern.d.ts +10 -7
  265. package/dist/plain/parse/parseDateWithPattern.js +10 -7
  266. package/dist/plain/parse/parseTimeWithPattern.d.ts +10 -7
  267. package/dist/plain/parse/parseTimeWithPattern.js +10 -7
  268. package/dist/plain/parse/parseUnitFromDate.d.ts +11 -3
  269. package/dist/plain/parse/parseUnitFromDate.js +3 -3
  270. package/dist/plain/parse/parseUnitFromDateTime.d.ts +11 -3
  271. package/dist/plain/parse/parseUnitFromDateTime.js +3 -3
  272. package/dist/plain/parse/parseWeekFromDate.d.ts +10 -6
  273. package/dist/plain/parse/parseWeekFromDate.js +2 -6
  274. package/dist/plain/parse/parseWeekFromDateTime.d.ts +10 -6
  275. package/dist/plain/parse/parseWeekFromDateTime.js +2 -6
  276. package/dist/plain/validate/isValidDateRange.d.ts +19 -4
  277. package/dist/plain/validate/isValidDateRange.js +1 -4
  278. package/dist/plain/validate/isValidDateTimeRange.d.ts +20 -5
  279. package/dist/plain/validate/isValidDateTimeRange.js +2 -5
  280. package/dist/plain/validate/isValidTimeRange.d.ts +20 -5
  281. package/dist/plain/validate/isValidTimeRange.js +2 -5
  282. package/dist/precision/convert/fromExcelSerial.d.ts +10 -4
  283. package/dist/precision/convert/fromExcelSerial.js +4 -5
  284. package/dist/precision/convert/fromNanoseconds.d.ts +1 -1
  285. package/dist/precision/convert/fromNanoseconds.js +1 -1
  286. package/dist/precision/convert/toExcelSerial.d.ts +9 -3
  287. package/dist/precision/convert/toExcelSerial.js +3 -4
  288. package/dist/precision/convert/toNanoseconds.d.ts +11 -6
  289. package/dist/precision/convert/toNanoseconds.js +11 -6
  290. package/dist/precision/validate/isValidInstant.d.ts +12 -3
  291. package/dist/precision/validate/isValidInstant.js +12 -3
  292. package/dist/span/calculate/spanMs.d.ts +10 -4
  293. package/dist/span/calculate/spanMs.js +10 -4
  294. package/dist/span/calculate/spanNs.d.ts +10 -4
  295. package/dist/span/calculate/spanNs.js +10 -4
  296. package/dist/span/validate/isValidSpan.d.ts +8 -3
  297. package/dist/span/validate/isValidSpan.js +8 -3
  298. package/dist/transport/calculate/bestAvailable.d.ts +47 -0
  299. package/dist/transport/calculate/bestAvailable.js +76 -0
  300. package/dist/transport/calculate/crossingTime.d.ts +58 -0
  301. package/dist/transport/calculate/crossingTime.js +76 -0
  302. package/dist/transport/calculate/cutoffAt.d.ts +90 -0
  303. package/dist/transport/calculate/cutoffAt.js +209 -0
  304. package/dist/transport/calculate/cutoffSchedule.d.ts +70 -0
  305. package/dist/transport/calculate/cutoffSchedule.js +71 -0
  306. package/dist/transport/calculate/dwellTime.d.ts +16 -7
  307. package/dist/transport/calculate/dwellTime.js +12 -8
  308. package/dist/transport/calculate/estimateDrift.d.ts +65 -0
  309. package/dist/transport/calculate/estimateDrift.js +75 -0
  310. package/dist/transport/calculate/index.d.ts +8 -0
  311. package/dist/transport/calculate/index.js +8 -0
  312. package/dist/transport/calculate/nextDeparture.d.ts +78 -0
  313. package/dist/transport/calculate/nextDeparture.js +131 -0
  314. package/dist/transport/calculate/punctualityRate.d.ts +42 -0
  315. package/dist/transport/calculate/punctualityRate.js +59 -0
  316. package/dist/transport/calculate/scheduleDelivery.d.ts +150 -0
  317. package/dist/transport/calculate/scheduleDelivery.js +300 -0
  318. package/dist/transport/calculate/transitTime.d.ts +21 -3
  319. package/dist/transport/calculate/transitTime.js +29 -46
  320. package/dist/transport/compare/classifyPunctuality.d.ts +46 -0
  321. package/dist/transport/compare/classifyPunctuality.js +64 -0
  322. package/dist/transport/compare/index.d.ts +4 -0
  323. package/dist/transport/compare/index.js +4 -0
  324. package/dist/transport/compare/isPastCutoff.d.ts +33 -0
  325. package/dist/transport/compare/isPastCutoff.js +48 -0
  326. package/dist/transport/compare/scheduleDeviation.d.ts +37 -0
  327. package/dist/transport/compare/scheduleDeviation.js +53 -0
  328. package/dist/transport/compare/timeToCutoff.d.ts +31 -0
  329. package/dist/transport/compare/timeToCutoff.js +47 -0
  330. package/dist/transport/convert/etaAtZone.d.ts +7 -0
  331. package/dist/transport/convert/etaAtZone.js +9 -4
  332. package/dist/transport/index.d.ts +1 -0
  333. package/dist/transport/index.js +1 -0
  334. package/dist/types/business-calendar.d.ts +19 -14
  335. package/dist/types/calendar-options.d.ts +15 -3
  336. package/dist/types/date-cycle-field.d.ts +5 -0
  337. package/dist/types/date-duration-unit.d.ts +4 -0
  338. package/dist/types/date-time-cycle-field.d.ts +4 -0
  339. package/dist/types/date-time-duration-units.d.ts +4 -0
  340. package/dist/types/date-time-unit.d.ts +4 -0
  341. package/dist/types/date-unit.d.ts +4 -0
  342. package/dist/types/disambiguation.d.ts +8 -0
  343. package/dist/types/duration-relative-to.d.ts +8 -0
  344. package/dist/types/duration-string-options.d.ts +28 -0
  345. package/dist/types/fiscal-calendar.d.ts +1 -1
  346. package/dist/types/fractional-digit.d.ts +5 -0
  347. package/dist/types/free-time-options.d.ts +21 -11
  348. package/dist/types/index.d.ts +2 -1
  349. package/dist/types/index.js +2 -1
  350. package/dist/types/interval.d.ts +8 -1
  351. package/dist/types/offset.d.ts +9 -0
  352. package/dist/types/operating-schedule.d.ts +71 -0
  353. package/dist/types/overflow.d.ts +6 -0
  354. package/dist/types/relative-rounding-method.d.ts +6 -0
  355. package/dist/types/relative-time-options.d.ts +33 -5
  356. package/dist/types/rounding-options.d.ts +27 -0
  357. package/dist/types/time-cycle-field.d.ts +4 -0
  358. package/dist/types/time-duration-unit.d.ts +4 -0
  359. package/dist/types/time-unit.d.ts +4 -0
  360. package/dist/types/transport-timestamps.d.ts +54 -0
  361. package/dist/types/transport-timestamps.js +0 -0
  362. package/dist/unix/calculate/addUnix.d.ts +19 -5
  363. package/dist/unix/calculate/addUnix.js +1 -5
  364. package/dist/unix/calculate/diffUnix.d.ts +13 -3
  365. package/dist/unix/calculate/diffUnix.js +1 -3
  366. package/dist/unix/calculate/diffUnixAsDuration.d.ts +13 -3
  367. package/dist/unix/calculate/diffUnixAsDuration.js +1 -3
  368. package/dist/unix/calculate/endOfQuarterForUnix.d.ts +13 -3
  369. package/dist/unix/calculate/endOfQuarterForUnix.js +1 -3
  370. package/dist/unix/calculate/endOfUnix.d.ts +20 -4
  371. package/dist/unix/calculate/endOfUnix.js +1 -4
  372. package/dist/unix/calculate/isBetweenUnix.d.ts +26 -4
  373. package/dist/unix/calculate/isBetweenUnix.js +4 -6
  374. package/dist/unix/calculate/roundUnix.d.ts +31 -3
  375. package/dist/unix/calculate/roundUnix.js +3 -6
  376. package/dist/unix/calculate/setUnix.d.ts +35 -9
  377. package/dist/unix/calculate/setUnix.js +4 -13
  378. package/dist/unix/calculate/startOfQuarterForUnix.d.ts +13 -3
  379. package/dist/unix/calculate/startOfQuarterForUnix.js +1 -3
  380. package/dist/unix/calculate/startOfUnix.d.ts +20 -4
  381. package/dist/unix/calculate/startOfUnix.js +1 -4
  382. package/dist/unix/calculate/subtractUnix.d.ts +19 -5
  383. package/dist/unix/calculate/subtractUnix.js +1 -5
  384. package/dist/unix/compare/areUnixEqual.d.ts +7 -1
  385. package/dist/unix/compare/areUnixEqual.js +1 -1
  386. package/dist/unix/compare/areUnixEqualBy.d.ts +24 -7
  387. package/dist/unix/compare/areUnixEqualBy.js +13 -9
  388. package/dist/unix/compare/isAfterUnix.d.ts +7 -1
  389. package/dist/unix/compare/isAfterUnix.js +1 -1
  390. package/dist/unix/compare/isBeforeUnix.d.ts +7 -1
  391. package/dist/unix/compare/isBeforeUnix.js +1 -1
  392. package/dist/unix/convert/convertUnixToPlainDate.d.ts +14 -4
  393. package/dist/unix/convert/convertUnixToPlainDate.js +2 -4
  394. package/dist/unix/convert/convertUnixToPlainDateTime.d.ts +14 -4
  395. package/dist/unix/convert/convertUnixToPlainDateTime.js +2 -4
  396. package/dist/unix/convert/convertUnixToPlainTime.d.ts +14 -4
  397. package/dist/unix/convert/convertUnixToPlainTime.js +2 -4
  398. package/dist/unix/convert/convertUnixToUtc.d.ts +9 -4
  399. package/dist/unix/convert/convertUnixToUtc.js +3 -4
  400. package/dist/unix/convert/convertUnixToZoned.d.ts +10 -5
  401. package/dist/unix/convert/convertUnixToZoned.js +4 -5
  402. package/dist/unix/format/formatCalendarUnix.d.ts +27 -19
  403. package/dist/unix/format/formatCalendarUnix.js +4 -5
  404. package/dist/unix/format/formatRelativeUnix.d.ts +54 -5
  405. package/dist/unix/format/formatRelativeUnix.js +3 -5
  406. package/dist/unix/format/formatUnix.d.ts +24 -6
  407. package/dist/unix/format/formatUnix.js +8 -7
  408. package/dist/unix/get/getUnixNow.d.ts +8 -3
  409. package/dist/unix/get/getUnixNow.js +1 -3
  410. package/dist/unix/interval/intervalCountUnix.d.ts +14 -5
  411. package/dist/unix/interval/intervalCountUnix.js +2 -5
  412. package/dist/unix/interval/intervalDifferenceUnix.d.ts +6 -0
  413. package/dist/unix/interval/intervalDivideEquallyUnix.d.ts +18 -4
  414. package/dist/unix/interval/intervalDivideEquallyUnix.js +5 -4
  415. package/dist/unix/interval/intervalFromDurationUnix.d.ts +33 -5
  416. package/dist/unix/interval/intervalFromDurationUnix.js +6 -5
  417. package/dist/unix/interval/intervalIntersectionUnix.d.ts +6 -0
  418. package/dist/unix/interval/intervalLengthUnix.d.ts +16 -6
  419. package/dist/unix/interval/intervalLengthUnix.js +4 -6
  420. package/dist/unix/interval/intervalOverlappingDaysUnix.d.ts +13 -3
  421. package/dist/unix/interval/intervalOverlappingDaysUnix.js +1 -3
  422. package/dist/unix/interval/intervalSplitAtUnix.d.ts +8 -0
  423. package/dist/unix/interval/intervalSplitAtUnix.js +2 -0
  424. package/dist/unix/interval/intervalUnionUnix.d.ts +6 -0
  425. package/dist/unix/interval/intervalXorAllUnix.d.ts +6 -0
  426. package/dist/unix/interval/intervalXorUnix.d.ts +6 -0
  427. package/dist/unix/interval/mergeIntervalsUnix.d.ts +6 -0
  428. package/dist/unix/interval/splitIntervalByUnitUnix.d.ts +42 -11
  429. package/dist/unix/interval/splitIntervalByUnitUnix.js +21 -16
  430. package/dist/unix/parse/parseDateFromUnix.d.ts +13 -2
  431. package/dist/unix/parse/parseDateFromUnix.js +1 -2
  432. package/dist/unix/parse/parseDayFromUnix.d.ts +14 -2
  433. package/dist/unix/parse/parseDayFromUnix.js +2 -2
  434. package/dist/unix/parse/parseDayOfWeekFromUnix.d.ts +13 -1
  435. package/dist/unix/parse/parseDayOfWeekFromUnix.js +1 -1
  436. package/dist/unix/parse/parseHourFromUnix.d.ts +14 -2
  437. package/dist/unix/parse/parseHourFromUnix.js +2 -2
  438. package/dist/unix/parse/parseMicrosecondFromUnix.d.ts +14 -2
  439. package/dist/unix/parse/parseMicrosecondFromUnix.js +2 -2
  440. package/dist/unix/parse/parseMillisecondFromUnix.d.ts +14 -2
  441. package/dist/unix/parse/parseMillisecondFromUnix.js +2 -2
  442. package/dist/unix/parse/parseMinuteFromUnix.d.ts +14 -2
  443. package/dist/unix/parse/parseMinuteFromUnix.js +2 -2
  444. package/dist/unix/parse/parseMonthFromUnix.d.ts +14 -2
  445. package/dist/unix/parse/parseMonthFromUnix.js +2 -2
  446. package/dist/unix/parse/parseNanosecondFromUnix.d.ts +14 -2
  447. package/dist/unix/parse/parseNanosecondFromUnix.js +2 -2
  448. package/dist/unix/parse/parseSecondFromUnix.d.ts +14 -2
  449. package/dist/unix/parse/parseSecondFromUnix.js +2 -2
  450. package/dist/unix/parse/parseTimeFromUnix.d.ts +13 -2
  451. package/dist/unix/parse/parseTimeFromUnix.js +1 -2
  452. package/dist/unix/parse/parseUnitFromUnix.d.ts +22 -3
  453. package/dist/unix/parse/parseUnitFromUnix.js +2 -3
  454. package/dist/unix/parse/parseWeekFromUnix.d.ts +23 -7
  455. package/dist/unix/parse/parseWeekFromUnix.js +3 -7
  456. package/dist/unix/parse/parseYearFromUnix.d.ts +14 -2
  457. package/dist/unix/parse/parseYearFromUnix.js +2 -2
  458. package/dist/unix/validate/isValidUnixRange.d.ts +20 -4
  459. package/dist/unix/validate/isValidUnixRange.js +1 -4
  460. package/dist/utc/calculate/addUtc.d.ts +7 -4
  461. package/dist/utc/calculate/addUtc.js +1 -4
  462. package/dist/utc/calculate/diffUtc.d.ts +1 -1
  463. package/dist/utc/calculate/diffUtc.js +1 -1
  464. package/dist/utc/calculate/diffUtcAsDuration.d.ts +1 -1
  465. package/dist/utc/calculate/diffUtcAsDuration.js +1 -1
  466. package/dist/utc/calculate/endOfUtc.d.ts +16 -3
  467. package/dist/utc/calculate/endOfUtc.js +2 -3
  468. package/dist/utc/calculate/isBetweenUtc.d.ts +13 -2
  469. package/dist/utc/calculate/isBetweenUtc.js +4 -4
  470. package/dist/utc/calculate/roundUtc.d.ts +26 -9
  471. package/dist/utc/calculate/roundUtc.js +3 -12
  472. package/dist/utc/calculate/setUtc.d.ts +7 -4
  473. package/dist/utc/calculate/setUtc.js +1 -4
  474. package/dist/utc/calculate/startOfUtc.d.ts +15 -2
  475. package/dist/utc/calculate/startOfUtc.js +1 -2
  476. package/dist/utc/calculate/subtractUtc.d.ts +7 -4
  477. package/dist/utc/calculate/subtractUtc.js +1 -4
  478. package/dist/utc/compare/areUtcEqualBy.d.ts +9 -3
  479. package/dist/utc/compare/areUtcEqualBy.js +2 -3
  480. package/dist/utc/convert/convertUtcToPlainDate.d.ts +8 -3
  481. package/dist/utc/convert/convertUtcToPlainDate.js +5 -6
  482. package/dist/utc/convert/convertUtcToPlainDateTime.d.ts +8 -3
  483. package/dist/utc/convert/convertUtcToPlainDateTime.js +5 -6
  484. package/dist/utc/convert/convertUtcToPlainTime.d.ts +8 -3
  485. package/dist/utc/convert/convertUtcToPlainTime.js +5 -6
  486. package/dist/utc/convert/convertUtcToUnix.d.ts +9 -4
  487. package/dist/utc/convert/convertUtcToUnix.js +3 -4
  488. package/dist/utc/convert/convertUtcToZoned.d.ts +1 -1
  489. package/dist/utc/convert/convertUtcToZoned.js +1 -1
  490. package/dist/utc/format/formatCalendarUtc.d.ts +19 -8
  491. package/dist/utc/format/formatCalendarUtc.js +8 -6
  492. package/dist/utc/format/formatHttp.d.ts +1 -1
  493. package/dist/utc/format/formatHttp.js +1 -1
  494. package/dist/utc/format/formatRelativeUtc.d.ts +30 -10
  495. package/dist/utc/format/formatRelativeUtc.js +9 -11
  496. package/dist/utc/format/formatUtc.d.ts +17 -15
  497. package/dist/utc/format/formatUtc.js +8 -8
  498. package/dist/utc/interval/intervalDifferenceUtc.d.ts +6 -0
  499. package/dist/utc/interval/intervalDivideEquallyUtc.d.ts +18 -4
  500. package/dist/utc/interval/intervalDivideEquallyUtc.js +5 -4
  501. package/dist/utc/interval/intervalFromDurationUtc.d.ts +13 -3
  502. package/dist/utc/interval/intervalFromDurationUtc.js +1 -3
  503. package/dist/utc/interval/intervalIntersectionUtc.d.ts +6 -0
  504. package/dist/utc/interval/intervalSplitAtUtc.d.ts +8 -0
  505. package/dist/utc/interval/intervalSplitAtUtc.js +2 -0
  506. package/dist/utc/interval/intervalUnionUtc.d.ts +6 -0
  507. package/dist/utc/interval/intervalXorAllUtc.d.ts +6 -0
  508. package/dist/utc/interval/intervalXorUtc.d.ts +6 -0
  509. package/dist/utc/interval/mergeIntervalsUtc.d.ts +6 -0
  510. package/dist/utc/interval/splitIntervalByUnitUtc.d.ts +19 -6
  511. package/dist/utc/interval/splitIntervalByUnitUtc.js +6 -6
  512. package/dist/utc/parse/parseDateFromUtc.d.ts +7 -3
  513. package/dist/utc/parse/parseDateFromUtc.js +1 -3
  514. package/dist/utc/parse/parseDayFromUtc.d.ts +7 -3
  515. package/dist/utc/parse/parseDayFromUtc.js +1 -3
  516. package/dist/utc/parse/parseDayOfWeekFromUtc.d.ts +7 -3
  517. package/dist/utc/parse/parseDayOfWeekFromUtc.js +4 -6
  518. package/dist/utc/parse/parseHourFromUtc.d.ts +7 -3
  519. package/dist/utc/parse/parseHourFromUtc.js +1 -3
  520. package/dist/utc/parse/parseHttp.d.ts +1 -1
  521. package/dist/utc/parse/parseHttp.js +1 -1
  522. package/dist/utc/parse/parseMicrosecondFromUtc.d.ts +7 -3
  523. package/dist/utc/parse/parseMicrosecondFromUtc.js +1 -3
  524. package/dist/utc/parse/parseMillisecondFromUtc.d.ts +7 -3
  525. package/dist/utc/parse/parseMillisecondFromUtc.js +1 -3
  526. package/dist/utc/parse/parseMinuteFromUtc.d.ts +7 -3
  527. package/dist/utc/parse/parseMinuteFromUtc.js +1 -3
  528. package/dist/utc/parse/parseMonthFromUtc.d.ts +7 -3
  529. package/dist/utc/parse/parseMonthFromUtc.js +1 -3
  530. package/dist/utc/parse/parseNanosecondFromUtc.d.ts +7 -3
  531. package/dist/utc/parse/parseNanosecondFromUtc.js +1 -3
  532. package/dist/utc/parse/parseSecondFromUtc.d.ts +7 -3
  533. package/dist/utc/parse/parseSecondFromUtc.js +1 -3
  534. package/dist/utc/parse/parseTimeFromUtc.d.ts +8 -3
  535. package/dist/utc/parse/parseTimeFromUtc.js +5 -6
  536. package/dist/utc/parse/parseUnitFromUtc.d.ts +17 -5
  537. package/dist/utc/parse/parseUnitFromUtc.js +6 -8
  538. package/dist/utc/parse/parseWeekFromUtc.d.ts +18 -10
  539. package/dist/utc/parse/parseWeekFromUtc.js +7 -13
  540. package/dist/utc/parse/parseYearFromUtc.d.ts +7 -3
  541. package/dist/utc/parse/parseYearFromUtc.js +1 -3
  542. package/dist/utc/validate/isValidUtcRange.d.ts +16 -5
  543. package/dist/utc/validate/isValidUtcRange.js +2 -5
  544. package/dist/zoned/calculate/addZoned.d.ts +20 -10
  545. package/dist/zoned/calculate/addZoned.js +6 -13
  546. package/dist/zoned/calculate/cycleZoned.d.ts +33 -8
  547. package/dist/zoned/calculate/cycleZoned.js +1 -8
  548. package/dist/zoned/calculate/diffZoned.d.ts +1 -1
  549. package/dist/zoned/calculate/diffZoned.js +1 -1
  550. package/dist/zoned/calculate/diffZonedAsDuration.d.ts +1 -1
  551. package/dist/zoned/calculate/diffZonedAsDuration.js +1 -1
  552. package/dist/zoned/calculate/endOfQuarterForZoned.d.ts +9 -2
  553. package/dist/zoned/calculate/endOfQuarterForZoned.js +4 -5
  554. package/dist/zoned/calculate/endOfZoned.d.ts +16 -3
  555. package/dist/zoned/calculate/endOfZoned.js +2 -3
  556. package/dist/zoned/calculate/getLocaleZonedEndOfWeek.d.ts +10 -3
  557. package/dist/zoned/calculate/getLocaleZonedEndOfWeek.js +5 -6
  558. package/dist/zoned/calculate/getLocaleZonedStartOfWeek.d.ts +7 -1
  559. package/dist/zoned/calculate/getLocaleZonedStartOfWeek.js +3 -4
  560. package/dist/zoned/calculate/roundZoned.d.ts +21 -4
  561. package/dist/zoned/calculate/roundZoned.js +3 -7
  562. package/dist/zoned/calculate/setZoned.d.ts +25 -8
  563. package/dist/zoned/calculate/setZoned.js +4 -12
  564. package/dist/zoned/calculate/startOfQuarterForZoned.d.ts +7 -2
  565. package/dist/zoned/calculate/startOfQuarterForZoned.js +3 -5
  566. package/dist/zoned/calculate/startOfZoned.d.ts +15 -3
  567. package/dist/zoned/calculate/startOfZoned.js +1 -3
  568. package/dist/zoned/calculate/subtractZoned.d.ts +20 -10
  569. package/dist/zoned/calculate/subtractZoned.js +6 -13
  570. package/dist/zoned/compare/areZonedEqualBy.d.ts +14 -5
  571. package/dist/zoned/compare/areZonedEqualBy.js +7 -5
  572. package/dist/zoned/compare/isBetweenZoned.d.ts +13 -1
  573. package/dist/zoned/compare/isBetweenZoned.js +4 -3
  574. package/dist/zoned/compare/isInDaylightSaving.d.ts +38 -11
  575. package/dist/zoned/compare/isInDaylightSaving.js +40 -44
  576. package/dist/zoned/convert/convertPlainDateTimeToZoned.d.ts +18 -5
  577. package/dist/zoned/convert/convertPlainDateTimeToZoned.js +6 -11
  578. package/dist/zoned/convert/convertZonedToUnix.d.ts +9 -4
  579. package/dist/zoned/convert/convertZonedToUnix.js +2 -4
  580. package/dist/zoned/convert/convertZonedToZoned.d.ts +1 -1
  581. package/dist/zoned/convert/convertZonedToZoned.js +1 -1
  582. package/dist/zoned/format/formatCalendarZoned.d.ts +18 -12
  583. package/dist/zoned/format/formatCalendarZoned.js +13 -9
  584. package/dist/zoned/format/formatRelativeZoned.d.ts +41 -12
  585. package/dist/zoned/format/formatRelativeZoned.js +7 -4
  586. package/dist/zoned/format/formatRfc2822.d.ts +2 -2
  587. package/dist/zoned/format/formatRfc2822.js +2 -2
  588. package/dist/zoned/format/formatRfc3339.d.ts +2 -3
  589. package/dist/zoned/format/formatRfc3339.js +2 -3
  590. package/dist/zoned/format/formatTimeZoneName.d.ts +12 -3
  591. package/dist/zoned/format/formatTimeZoneName.js +5 -4
  592. package/dist/zoned/format/formatZonedDateTime.js +2 -1
  593. package/dist/zoned/format/formatZonedRange.js +2 -1
  594. package/dist/zoned/format/formatZonedToParts.d.ts +15 -4
  595. package/dist/zoned/format/formatZonedToParts.js +8 -5
  596. package/dist/zoned/get/getDstTransitions.d.ts +9 -10
  597. package/dist/zoned/get/getDstTransitions.js +12 -3
  598. package/dist/zoned/get/getTimeZoneOffset.d.ts +4 -1
  599. package/dist/zoned/get/getTimeZoneOffset.js +6 -3
  600. package/dist/zoned/get/getZonedNow.d.ts +13 -1
  601. package/dist/zoned/get/getZonedNow.js +12 -3
  602. package/dist/zoned/interval/intervalDifferenceZoned.d.ts +9 -0
  603. package/dist/zoned/interval/intervalDivideEquallyZoned.d.ts +22 -4
  604. package/dist/zoned/interval/intervalDivideEquallyZoned.js +6 -4
  605. package/dist/zoned/interval/intervalFromDurationZoned.d.ts +29 -10
  606. package/dist/zoned/interval/intervalFromDurationZoned.js +6 -13
  607. package/dist/zoned/interval/intervalIntersectionZoned.d.ts +9 -0
  608. package/dist/zoned/interval/intervalSplitAtZoned.d.ts +11 -0
  609. package/dist/zoned/interval/intervalSplitAtZoned.js +2 -0
  610. package/dist/zoned/interval/intervalUnionZoned.d.ts +9 -0
  611. package/dist/zoned/interval/intervalXorAllZoned.d.ts +9 -0
  612. package/dist/zoned/interval/intervalXorZoned.d.ts +9 -0
  613. package/dist/zoned/interval/mergeIntervalsZoned.d.ts +9 -0
  614. package/dist/zoned/interval/splitIntervalByUnitZoned.d.ts +27 -6
  615. package/dist/zoned/interval/splitIntervalByUnitZoned.js +11 -6
  616. package/dist/zoned/map/mapZonedDatesInRange.d.ts +9 -4
  617. package/dist/zoned/map/mapZonedDatesInRange.js +2 -4
  618. package/dist/zoned/parse/parseRfc2822.d.ts +1 -1
  619. package/dist/zoned/parse/parseRfc2822.js +1 -1
  620. package/dist/zoned/parse/parseUnitFromZoned.d.ts +9 -3
  621. package/dist/zoned/parse/parseUnitFromZoned.js +1 -3
  622. package/dist/zoned/parse/parseWeekFromZoned.d.ts +10 -3
  623. package/dist/zoned/parse/parseWeekFromZoned.js +2 -3
  624. package/dist/zoned/validate/hasDaylightSaving.d.ts +42 -11
  625. package/dist/zoned/validate/hasDaylightSaving.js +47 -31
  626. package/dist/zoned/validate/isValidZonedDateTime.d.ts +13 -0
  627. package/dist/zoned/validate/isValidZonedDateTime.js +14 -1
  628. package/dist/zoned/validate/isValidZonedRange.d.ts +15 -4
  629. package/dist/zoned/validate/isValidZonedRange.js +1 -4
  630. package/package.json +18 -5
  631. package/skills/gmt-arithmetic/SKILL.md +1 -1
  632. package/skills/gmt-basics/SKILL.md +10 -1
  633. package/skills/gmt-integration/SKILL.md +10 -5
  634. package/skills/gmt-timezone/SKILL.md +150 -21
  635. package/dist/internal/resolveReadingTimeZone.d.ts +0 -11
  636. package/dist/internal/resolveReadingTimeZone.js +0 -18
  637. package/dist/types/duration-unit.d.ts +0 -5
  638. /package/dist/types/{duration-unit.js → operating-schedule.js} +0 -0
@@ -5,33 +5,53 @@ export interface BillingDates {
5
5
  * last incurred or, for a re-bill, the issuance date of the invoice received.
6
6
  */
7
7
  anchorOn: string;
8
- /** The date the invoice was issued, once it has been. */
8
+ /**
9
+ * The date the invoice was issued, once it has been, as an ISO date.
10
+ *
11
+ * @defaultValue None. `issuedByDeadline` and `disputeDeadline` are `null`.
12
+ */
9
13
  invoiceIssuedOn?: string;
10
- /** The date the dispute request was received, once it has been. */
14
+ /**
15
+ * The date the dispute request was received, once it has been, as an ISO date. It needs
16
+ * `invoiceIssuedOn` and may not precede it.
17
+ *
18
+ * @defaultValue None. `requestedByDeadline` and `resolutionDeadline` are `null`.
19
+ */
11
20
  requestReceivedOn?: string;
12
21
  }
13
22
  /** The three windows the caller supplies, in calendar days, none defaulted, and an optional agreed resolution date. */
14
23
  export interface BillingWindows {
15
- /** Days from `anchorOn` within which the invoice must be issued. */
24
+ /** The days from `anchorOn` within which the invoice must be issued. */
16
25
  issueDays: number;
17
- /** Days from `invoiceIssuedOn` within which a dispute may be raised. */
26
+ /** The days from `invoiceIssuedOn` within which a dispute may be raised. */
18
27
  disputeDays: number;
19
- /** Days from `requestReceivedOn` within which the dispute must be resolved. */
28
+ /** The days from `requestReceivedOn` within which the dispute must be resolved. */
20
29
  resolutionDays: number;
21
- /** A resolution date the parties agreed instead; it replaces the computed one. */
30
+ /**
31
+ * A resolution date the parties agreed instead, as an ISO date on or after `requestReceivedOn`;
32
+ * it replaces the computed one.
33
+ *
34
+ * @defaultValue None. `resolutionDeadline` is `requestReceivedOn + resolutionDays`.
35
+ */
22
36
  agreedResolutionOn?: string;
23
37
  }
24
38
  /** What `billingTimeline` returns: each deadline as an ISO date, and each comparison once its date exists. */
25
39
  export interface BillingDeadlines {
26
- /** `anchorOn + issueDays`. */
40
+ /** The last date the invoice may be issued: `anchorOn + issueDays`. */
27
41
  invoiceDeadline: string;
28
42
  /** Whether `invoiceIssuedOn` is on or before `invoiceDeadline`; `null` until an invoice date exists. */
29
43
  issuedByDeadline: boolean | null;
30
- /** `invoiceIssuedOn + disputeDays`; `null` until an invoice date exists. */
44
+ /**
45
+ * The last date a dispute may be raised: `invoiceIssuedOn + disputeDays`; `null` until an invoice
46
+ * date exists.
47
+ */
31
48
  disputeDeadline: string | null;
32
49
  /** Whether `requestReceivedOn` is on or before `disputeDeadline`; `null` until a request date exists. */
33
50
  requestedByDeadline: boolean | null;
34
- /** `requestReceivedOn + resolutionDays`, or `agreedResolutionOn`; `null` until a request date exists. */
51
+ /**
52
+ * The last date the dispute must be resolved: `requestReceivedOn + resolutionDays`, or
53
+ * `agreedResolutionOn`; `null` until a request date exists.
54
+ */
35
55
  resolutionDeadline: string | null;
36
56
  }
37
57
  /**
@@ -76,8 +96,8 @@ export interface BillingDeadlines {
76
96
  * request exists without an invoice or before it, `agreedResolutionOn` is before the request,
77
97
  * or a deadline would leave Temporal's range.
78
98
  *
79
- * @param dates { anchorOn: string, invoiceIssuedOn?: string, requestReceivedOn?: string } ISO dates
80
- * @param windows { issueDays: number, disputeDays: number, resolutionDays: number, agreedResolutionOn?: string } calendar-day windows, none defaulted
99
+ * @param dates The anchor date, and the invoice and request dates once they exist
100
+ * @param windows The three calendar-day windows, none defaulted, and an agreed resolution date
81
101
  * @returns { invoiceDeadline, issuedByDeadline, disputeDeadline, requestedByDeadline, resolutionDeadline }, or null on invalid input
82
102
  *
83
103
  * @example billingTimeline({ anchorOn: "2026-03-01" }, { issueDays: 30, disputeDays: 30, resolutionDays: 30 }) // { invoiceDeadline: "2026-03-31", issuedByDeadline: null, disputeDeadline: null, requestedByDeadline: null, resolutionDeadline: null } (no invoice yet: a forecast)
@@ -43,8 +43,8 @@ import { isValidDate } from "../../plain/validate/isValidDate.js";
43
43
  * request exists without an invoice or before it, `agreedResolutionOn` is before the request,
44
44
  * or a deadline would leave Temporal's range.
45
45
  *
46
- * @param dates { anchorOn: string, invoiceIssuedOn?: string, requestReceivedOn?: string } ISO dates
47
- * @param windows { issueDays: number, disputeDays: number, resolutionDays: number, agreedResolutionOn?: string } calendar-day windows, none defaulted
46
+ * @param dates The anchor date, and the invoice and request dates once they exist
47
+ * @param windows The three calendar-day windows, none defaulted, and an agreed resolution date
48
48
  * @returns { invoiceDeadline, issuedByDeadline, disputeDeadline, requestedByDeadline, resolutionDeadline }, or null on invalid input
49
49
  *
50
50
  * @example billingTimeline({ anchorOn: "2026-03-01" }, { issueDays: 30, disputeDays: 30, resolutionDays: 30 }) // { invoiceDeadline: "2026-03-31", issuedByDeadline: null, disputeDeadline: null, requestedByDeadline: null, resolutionDeadline: null } (no invoice yet: a forecast)
@@ -1,18 +1,18 @@
1
1
  import type { FreeTimeBasis, FreeTimeOptions } from "../../types/index.js";
2
2
  /** A band of chargeable-day ordinals and how many of the charged days fell in it. */
3
3
  export interface TierBand {
4
- /** First chargeable-day ordinal of the band, from 1. */
4
+ /** The first chargeable-day ordinal of the band, from 1. */
5
5
  from: number;
6
- /** Last ordinal of the band, or `null` for the open final band. */
6
+ /** The last ordinal of the band, or `null` for the open final band. */
7
7
  to: number | null;
8
- /** Charged days that fell in the band. */
8
+ /** The number of charged days that fell in the band. */
9
9
  days: number;
10
10
  }
11
11
  /** What `chargeableDays` returns: the day count an invoice bills, and the dates that back it. */
12
12
  export interface FreeTimeCharges {
13
- /** Free days the dwell touched, at most the tariff's `freeDays`. */
13
+ /** The number of free days the dwell touched, at most the tariff's `freeDays`. */
14
14
  freeDaysUsed: number;
15
- /** Counted days on or after `expiresAt` the dwell touched. */
15
+ /** The number of counted days on or after `expiresAt` the dwell touched. */
16
16
  chargeableDays: number;
17
17
  /** The instant free time ended, as a UTC instant, as `freeTimeExpiry` reports it. */
18
18
  expiresAt: string;
@@ -31,6 +31,13 @@ export type FreeTimeChargeOptions = FreeTimeOptions & {
31
31
  * working days of `calendar`. No default; see `chargeableDays`.
32
32
  */
33
33
  chargeBasis: FreeTimeBasis;
34
+ /**
35
+ * The last chargeable-day ordinal of each band, as strictly ascending positive whole numbers:
36
+ * `[5, 10]` is days 1–5, 6–10 and 11 onward. They are day bands, not rates. Every band is
37
+ * returned, an empty one with `days: 0`, and the last is always open.
38
+ *
39
+ * @defaultValue None. `byTier` is the single open band `{ from: 1, to: null }`.
40
+ */
34
41
  tiers?: number[];
35
42
  };
36
43
  /**
@@ -66,11 +73,6 @@ export type FreeTimeChargeOptions = FreeTimeOptions & {
66
73
  * - **`freeDays` may be `0`** for a tariff with no free time: `expiresAt` is the start of day one,
67
74
  * the first day counted on `basis` (under `"nextDay"`, the first after the event day), and days
68
75
  * before it are neither free nor charged.
69
- * - **`tiers` are day bands, not rates.** `[5, 10]` names the last chargeable-day ordinal of
70
- * each band: days 1–5, 6–10 and 11 onward. Every band is returned, an empty one with
71
- * `days: 0`, and the last is always open. Omitted, `byTier` is the single open band
72
- * `{ from: 1, to: null }`. A list that is not strictly ascending positive whole numbers
73
- * returns `null`.
74
76
  * - Returns `null` when either instant is invalid, `clockEnd` is before `clockStart` (an
75
77
  * inverted dwell is a data error), `freeDays` is not a whole number of at least `0`, the
76
78
  * options fail as they do for `freeTimeExpiry`, `tiers` has a hole, an unsafe integer or does not ascend, or the walk would pass
@@ -79,7 +81,7 @@ export type FreeTimeChargeOptions = FreeTimeOptions & {
79
81
  * @param clockStart ISO 8601 instant string of the event that starts the clock
80
82
  * @param clockEnd ISO 8601 instant string of the event that stops it (gate-out or empty return)
81
83
  * @param freeDays whole number of free days the tariff allows, 0 or more
82
- * @param options { basis, chargeBasis, timeZone, firstDay, calendar?, tiers?: number[] }
84
+ * @param options The tariff's counting terms for free time and for charged days, and the tier bands
83
85
  * @returns the free days used, the chargeable days, the expiry, the charged dates and the days per tier band, or null on invalid input
84
86
  *
85
87
  * @example chargeableDays("2024-06-14T19:00:00Z", "2024-06-17T04:00:00Z", 3, { basis: "calendar", chargeBasis: "calendar", timeZone: "America/New_York", firstDay: "eventDay" }) // { freeDaysUsed: 3, chargeableDays: 0, expiresAt: "2024-06-17T04:00:00Z", chargedDates: [], byTier: [{ from: 1, to: null, days: 0 }] } (gate-out exactly at expiry is free)
@@ -1,5 +1,5 @@
1
1
  import { Temporal } from "@js-temporal/polyfill";
2
- import { bandsByTier, parseFreeDays, parseFreeTimeTerms, parseTiers, walkFreeTime, } from "../../internal/index.js";
2
+ import { bandsByTier, instantFrom, parseFreeDays, parseFreeTimeTerms, parseTiers, walkFreeTime, } from "../../internal/index.js";
3
3
  import { isValidInstant } from "../../precision/validate/isValidInstant.js";
4
4
  /**
5
5
  * Count the days a container is charged for between the start of its clock and its exit,
@@ -34,11 +34,6 @@ import { isValidInstant } from "../../precision/validate/isValidInstant.js";
34
34
  * - **`freeDays` may be `0`** for a tariff with no free time: `expiresAt` is the start of day one,
35
35
  * the first day counted on `basis` (under `"nextDay"`, the first after the event day), and days
36
36
  * before it are neither free nor charged.
37
- * - **`tiers` are day bands, not rates.** `[5, 10]` names the last chargeable-day ordinal of
38
- * each band: days 1–5, 6–10 and 11 onward. Every band is returned, an empty one with
39
- * `days: 0`, and the last is always open. Omitted, `byTier` is the single open band
40
- * `{ from: 1, to: null }`. A list that is not strictly ascending positive whole numbers
41
- * returns `null`.
42
37
  * - Returns `null` when either instant is invalid, `clockEnd` is before `clockStart` (an
43
38
  * inverted dwell is a data error), `freeDays` is not a whole number of at least `0`, the
44
39
  * options fail as they do for `freeTimeExpiry`, `tiers` has a hole, an unsafe integer or does not ascend, or the walk would pass
@@ -47,7 +42,7 @@ import { isValidInstant } from "../../precision/validate/isValidInstant.js";
47
42
  * @param clockStart ISO 8601 instant string of the event that starts the clock
48
43
  * @param clockEnd ISO 8601 instant string of the event that stops it (gate-out or empty return)
49
44
  * @param freeDays whole number of free days the tariff allows, 0 or more
50
- * @param options { basis, chargeBasis, timeZone, firstDay, calendar?, tiers?: number[] }
45
+ * @param options The tariff's counting terms for free time and for charged days, and the tier bands
51
46
  * @returns the free days used, the chargeable days, the expiry, the charged dates and the days per tier band, or null on invalid input
52
47
  *
53
48
  * @example chargeableDays("2024-06-14T19:00:00Z", "2024-06-17T04:00:00Z", 3, { basis: "calendar", chargeBasis: "calendar", timeZone: "America/New_York", firstDay: "eventDay" }) // { freeDaysUsed: 3, chargeableDays: 0, expiresAt: "2024-06-17T04:00:00Z", chargedDates: [], byTier: [{ from: 1, to: null, days: 0 }] } (gate-out exactly at expiry is free)
@@ -76,8 +71,8 @@ export function chargeableDays(clockStart, clockEnd, freeDays, options) {
76
71
  tiers === null) {
77
72
  return null;
78
73
  }
79
- const start = Temporal.Instant.from(clockStart).toZonedDateTimeISO(terms.timeZone);
80
- const end = Temporal.Instant.from(clockEnd).toZonedDateTimeISO(terms.timeZone);
74
+ const start = instantFrom(clockStart).toZonedDateTimeISO(terms.timeZone);
75
+ const end = instantFrom(clockEnd).toZonedDateTimeISO(terms.timeZone);
81
76
  if (Temporal.ZonedDateTime.compare(start, end) > 0) {
82
77
  return null;
83
78
  }
@@ -15,8 +15,9 @@ import type { Interval } from "../../types/index.js";
15
15
  export type ClockEventType = "discharged" | "available" | "gatedOut" | "emptyReturned" | "emptyReleased" | "gatedIn" | "loaded";
16
16
  /** A container event: what happened and the instant it happened. */
17
17
  export interface ClockEvent {
18
+ /** What happened to the container, as one of the events a charging clock can start or end at. */
18
19
  type: ClockEventType;
19
- /** ISO 8601 instant string: `Z`, an offset, or a bracketed zone. */
20
+ /** The instant it happened, as an ISO 8601 string: `Z`, an offset, or a bracketed zone. */
20
21
  at: string;
21
22
  }
22
23
  /** Which charge is being clocked. `combined` is the merged demurrage-and-detention clock. */
@@ -27,9 +28,18 @@ export type ClockDirection = "import" | "export";
27
28
  export type ClockStartEvent = "discharged" | "available";
28
29
  /** The options `demurrageClock` reads. */
29
30
  export interface ClockOptions {
30
- /** `"import"` or `"export"`; required, because the same scope runs between different events in each. */
31
+ /**
32
+ * The leg of the container's cycle, `"import"` or `"export"`; required, because the same scope
33
+ * runs between different events in each.
34
+ */
31
35
  direction: ClockDirection;
32
- /** Import only: `"discharged"` (the default) or `"available"`. Not read for export or detention. */
36
+ /**
37
+ * Where an import demurrage, storage or combined clock starts: `"discharged"`, the classic
38
+ * definition, or `"available"` for tariffs that start at the availability date. Not read for
39
+ * export or detention.
40
+ *
41
+ * @defaultValue `"discharged"`
42
+ */
33
43
  startEvent?: ClockStartEvent;
34
44
  }
35
45
  /**
@@ -53,9 +63,8 @@ export interface ClockOptions {
53
63
  *
54
64
  * - **`direction` has no default.** The same scope name selects different events on the import and
55
65
  * export legs, and guessing it from the events present would be a silent guess.
56
- * - **`startEvent` is import only**: `"discharged"` by default, the classic definition, or
57
- * `"available"` for tariffs that start at the availability date. It is not read for detention
58
- * or export, so one options object can serve every scope on a leg. A tariff that starts at
66
+ * - **`startEvent` is import only.** It is not read for detention or export, so one options
67
+ * object can serve every scope on a leg. A tariff that starts at
59
68
  * customs release (Hapag-Lloyd Japan) or ends export demurrage at the cut-off or the scheduled
60
69
  * sailing passes that instant as the event's `at`; GMT does not invent an event for one tariff.
61
70
  * - Events may be in any order, and every one must be `{ type, at }` with a known type and a
@@ -71,7 +80,7 @@ export interface ClockOptions {
71
80
  *
72
81
  * @param events the container's events, `{ type, at }`, `type` one of discharged, available, gatedOut, emptyReturned, emptyReleased, gatedIn, loaded
73
82
  * @param scope "demurrage" | "detention" | "storage" | "combined"
74
- * @param options { direction: "import" | "export", startEvent?: "discharged" | "available" }
83
+ * @param options Which leg of the cycle the clock is on, and where an import clock starts
75
84
  * @returns { start, end } of the requested clock, or null on invalid input
76
85
  *
77
86
  * @example demurrageClock([{ type: "discharged", at: "2024-06-14T19:00:00Z" }, { type: "available", at: "2024-06-15T12:00:00Z" }, { type: "gatedOut", at: "2024-06-20T14:30:00Z" }, { type: "emptyReturned", at: "2024-06-27T09:00:00Z" }], "demurrage", { direction: "import" }) / { start: "2024-06-14T19:00:00Z", end: "2024-06-20T14:30:00Z" }
@@ -1,6 +1,7 @@
1
1
  import { Temporal } from "@js-temporal/polyfill";
2
- import { isObject } from "../../internal/index.js";
2
+ import { instantFrom, isObject } from "../../internal/index.js";
3
3
  import { isValidInstant } from "../../precision/validate/isValidInstant.js";
4
+ import { optionOrDefault } from "../../internal/optionOrDefault.js";
4
5
  const CLOCK_EVENT_TYPES = [
5
6
  "discharged",
6
7
  "available",
@@ -48,9 +49,8 @@ const EXPORT_CLOCKS = {
48
49
  *
49
50
  * - **`direction` has no default.** The same scope name selects different events on the import and
50
51
  * export legs, and guessing it from the events present would be a silent guess.
51
- * - **`startEvent` is import only**: `"discharged"` by default, the classic definition, or
52
- * `"available"` for tariffs that start at the availability date. It is not read for detention
53
- * or export, so one options object can serve every scope on a leg. A tariff that starts at
52
+ * - **`startEvent` is import only.** It is not read for detention or export, so one options
53
+ * object can serve every scope on a leg. A tariff that starts at
54
54
  * customs release (Hapag-Lloyd Japan) or ends export demurrage at the cut-off or the scheduled
55
55
  * sailing passes that instant as the event's `at`; GMT does not invent an event for one tariff.
56
56
  * - Events may be in any order, and every one must be `{ type, at }` with a known type and a
@@ -66,7 +66,7 @@ const EXPORT_CLOCKS = {
66
66
  *
67
67
  * @param events the container's events, `{ type, at }`, `type` one of discharged, available, gatedOut, emptyReturned, emptyReleased, gatedIn, loaded
68
68
  * @param scope "demurrage" | "detention" | "storage" | "combined"
69
- * @param options { direction: "import" | "export", startEvent?: "discharged" | "available" }
69
+ * @param options Which leg of the cycle the clock is on, and where an import clock starts
70
70
  * @returns { start, end } of the requested clock, or null on invalid input
71
71
  *
72
72
  * @example demurrageClock([{ type: "discharged", at: "2024-06-14T19:00:00Z" }, { type: "available", at: "2024-06-15T12:00:00Z" }, { type: "gatedOut", at: "2024-06-20T14:30:00Z" }, { type: "emptyReturned", at: "2024-06-27T09:00:00Z" }], "demurrage", { direction: "import" }) / { start: "2024-06-14T19:00:00Z", end: "2024-06-20T14:30:00Z" }
@@ -107,7 +107,7 @@ function selectClock(events, scope, options) {
107
107
  return null;
108
108
  }
109
109
  // An explicit `undefined` is an omission (TC39 GetOption); `null` is a value, and not a valid one.
110
- const startEvent = options.startEvent === undefined ? "discharged" : options.startEvent;
110
+ const startEvent = optionOrDefault(options.startEvent, "discharged");
111
111
  if (!CLOCK_START_EVENTS.includes(startEvent)) {
112
112
  return null;
113
113
  }
@@ -134,7 +134,7 @@ function selectClock(events, scope, options) {
134
134
  if (start === null || end === null) {
135
135
  return null;
136
136
  }
137
- return Temporal.Instant.compare(Temporal.Instant.from(start), Temporal.Instant.from(end)) > 0
137
+ return Temporal.Instant.compare(instantFrom(start), instantFrom(end)) > 0
138
138
  ? null
139
139
  : { start, end };
140
140
  }
@@ -1,7 +1,7 @@
1
1
  import type { FreeTimeOptions } from "../../types/index.js";
2
2
  /** What `freeTimeExpiry` returns: the free-time window as local dates, and the instant it ends. */
3
3
  export interface FreeTime {
4
- /** Free day one, as a local date in the counting zone. */
4
+ /** The first free day, as a local date in the counting zone. */
5
5
  freeTimeStart: string;
6
6
  /** The last free day, as a local date in the counting zone. */
7
7
  lastFreeDay: string;
@@ -19,8 +19,9 @@ export interface FreeTime {
19
19
  * the free time allowed and the dates it starts and ends.
20
20
  *
21
21
  * - **Days are the terminal's local days.** `clockStart` is an instant (`Z`, an offset, or a
22
- * bracketed zone, of which only the instant is read); its local date in `options.timeZone` is
23
- * the event day. A container discharged at 23:00 has used a free day by 00:01 under
22
+ * bracketed zone, of which only the instant is read, a minute-rounded offset as the zone's
23
+ * real one, as `isValidInstant` describes); its local date in `options.timeZone` is the
24
+ * event day. A container discharged at 23:00 has used a free day by 00:01 under
24
25
  * `firstDay: "eventDay"`. Day boundaries are the zone's real ones, as `floorToZone` and
25
26
  * `dwellTime` find them: a 23- or 25-hour day is one day, a date the zone deleted is never a
26
27
  * free day, and a fall-back that re-enters an earlier date never moves the count backwards.
@@ -48,7 +49,7 @@ export interface FreeTime {
48
49
  *
49
50
  * @param clockStart ISO 8601 instant string of the event that starts the clock (discharge, availability or gate-out)
50
51
  * @param freeDays whole number of free days the tariff allows, at least 1
51
- * @param options { basis: "calendar" | "working", timeZone: string, firstDay: "eventDay" | "nextDay", calendar?: BusinessCalendar }
52
+ * @param options The tariff's counting terms: which days count, in which zone, and where day one starts
52
53
  * @returns the free-time start and last free day as local dates, and the expiry instant, or null on invalid input
53
54
  *
54
55
  * @example freeTimeExpiry("2024-06-14T19:00:00Z", 3, { basis: "calendar", timeZone: "America/New_York", firstDay: "eventDay" }) // { freeTimeStart: "2024-06-14", lastFreeDay: "2024-06-16", expiresAt: "2024-06-17T04:00:00Z" } (a Friday discharge: the weekend is consumed)
@@ -1,5 +1,4 @@
1
- import { Temporal } from "@js-temporal/polyfill";
2
- import { parseFreeDays, parseFreeTimeTerms, walkFreeTime, } from "../../internal/index.js";
1
+ import { instantFrom, parseFreeDays, parseFreeTimeTerms, walkFreeTime, } from "../../internal/index.js";
3
2
  import { isValidInstant } from "../../precision/validate/isValidInstant.js";
4
3
  /**
5
4
  * Lay out a container's free time from the instant its clock started, and say when it ends.
@@ -12,8 +11,9 @@ import { isValidInstant } from "../../precision/validate/isValidInstant.js";
12
11
  * the free time allowed and the dates it starts and ends.
13
12
  *
14
13
  * - **Days are the terminal's local days.** `clockStart` is an instant (`Z`, an offset, or a
15
- * bracketed zone, of which only the instant is read); its local date in `options.timeZone` is
16
- * the event day. A container discharged at 23:00 has used a free day by 00:01 under
14
+ * bracketed zone, of which only the instant is read, a minute-rounded offset as the zone's
15
+ * real one, as `isValidInstant` describes); its local date in `options.timeZone` is the
16
+ * event day. A container discharged at 23:00 has used a free day by 00:01 under
17
17
  * `firstDay: "eventDay"`. Day boundaries are the zone's real ones, as `floorToZone` and
18
18
  * `dwellTime` find them: a 23- or 25-hour day is one day, a date the zone deleted is never a
19
19
  * free day, and a fall-back that re-enters an earlier date never moves the count backwards.
@@ -41,7 +41,7 @@ import { isValidInstant } from "../../precision/validate/isValidInstant.js";
41
41
  *
42
42
  * @param clockStart ISO 8601 instant string of the event that starts the clock (discharge, availability or gate-out)
43
43
  * @param freeDays whole number of free days the tariff allows, at least 1
44
- * @param options { basis: "calendar" | "working", timeZone: string, firstDay: "eventDay" | "nextDay", calendar?: BusinessCalendar }
44
+ * @param options The tariff's counting terms: which days count, in which zone, and where day one starts
45
45
  * @returns the free-time start and last free day as local dates, and the expiry instant, or null on invalid input
46
46
  *
47
47
  * @example freeTimeExpiry("2024-06-14T19:00:00Z", 3, { basis: "calendar", timeZone: "America/New_York", firstDay: "eventDay" }) // { freeTimeStart: "2024-06-14", lastFreeDay: "2024-06-16", expiresAt: "2024-06-17T04:00:00Z" } (a Friday discharge: the weekend is consumed)
@@ -63,7 +63,7 @@ export function freeTimeExpiry(clockStart, freeDays, options) {
63
63
  if (!isValidInstant(clockStart) || terms === null || allowed === null) {
64
64
  return null;
65
65
  }
66
- const start = Temporal.Instant.from(clockStart).toZonedDateTimeISO(terms.timeZone);
66
+ const start = instantFrom(clockStart).toZonedDateTimeISO(terms.timeZone);
67
67
  const ledger = walkFreeTime(start, allowed, terms);
68
68
  if (ledger === null) {
69
69
  return null;
@@ -11,6 +11,11 @@ export type ResolvedBusinessCalendar = {
11
11
  holidays: Set<string>;
12
12
  };
13
13
  export declare const DEFAULT_BUSINESS_CALENDAR: ResolvedBusinessCalendar;
14
+ /**
15
+ * Reduce a holiday list to its normalised ISO dates, or `null` when it is not an array of ISO
16
+ * PlainDate strings. Shared with `OperatingSchedule.holidays`, which takes the same list.
17
+ */
18
+ export declare function parseHolidays(holidays: unknown): Set<string> | null;
14
19
  /**
15
20
  * Reduce a caller-supplied `BusinessCalendar` to its lookups, or `null` when it is not one.
16
21
  *
@@ -29,7 +29,11 @@ function parseWeekend(weekend) {
29
29
  // All seven weekdays closed leaves no business day, so every walk would run to its cap.
30
30
  return days.size < ISO_WEEKDAYS ? days : null;
31
31
  }
32
- function parseHolidays(holidays) {
32
+ /**
33
+ * Reduce a holiday list to its normalised ISO dates, or `null` when it is not an array of ISO
34
+ * PlainDate strings. Shared with `OperatingSchedule.holidays`, which takes the same list.
35
+ */
36
+ export function parseHolidays(holidays) {
33
37
  if (!Array.isArray(holidays)) {
34
38
  return null;
35
39
  }
@@ -8,10 +8,12 @@
8
8
  * not by repeatedly correcting a single overflow.
9
9
  * - Round path is **not** "round to nearest": it steps by `Math.sign(amount)` first, then snaps to
10
10
  * the next multiple of `Math.abs(amount)` in the direction of that sign (ceiling for positive
11
- * amounts, floor for negative). Multiples are relative to `0`, not `bounds.min`. This matches
12
- * `@internationalized/date`'s `CycleOptions.round` behavior exactly (verified against its
13
- * `manipulation.ts` source) — e.g. minute `22` cycled by `+15` with `round: true` lands on `30`
14
- * (the next multiple of 15 above 22), not `15` (the nearest multiple).
11
+ * amounts, floor for negative). Multiples are relative to `0`, not `bounds.min`. GMT's own
12
+ * rule, not a standard's: a cycle always moves the way `amount` points, and the nearest
13
+ * multiple can lie the other way — e.g. minute `22` cycled by `+15` with `round: true` lands on
14
+ * `30` (the next multiple of 15 above 22), not `15` (the nearest multiple).
15
+ * - Comparison: `@internationalized/date`'s `CycleOptions.round` rounds a bounded field the same
16
+ * way.
15
17
  *
16
18
  * @param current the field's current numeric value
17
19
  * @param amount signed amount to cycle by
@@ -8,10 +8,12 @@
8
8
  * not by repeatedly correcting a single overflow.
9
9
  * - Round path is **not** "round to nearest": it steps by `Math.sign(amount)` first, then snaps to
10
10
  * the next multiple of `Math.abs(amount)` in the direction of that sign (ceiling for positive
11
- * amounts, floor for negative). Multiples are relative to `0`, not `bounds.min`. This matches
12
- * `@internationalized/date`'s `CycleOptions.round` behavior exactly (verified against its
13
- * `manipulation.ts` source) — e.g. minute `22` cycled by `+15` with `round: true` lands on `30`
14
- * (the next multiple of 15 above 22), not `15` (the nearest multiple).
11
+ * amounts, floor for negative). Multiples are relative to `0`, not `bounds.min`. GMT's own
12
+ * rule, not a standard's: a cycle always moves the way `amount` points, and the nearest
13
+ * multiple can lie the other way — e.g. minute `22` cycled by `+15` with `round: true` lands on
14
+ * `30` (the next multiple of 15 above 22), not `15` (the nearest multiple).
15
+ * - Comparison: `@internationalized/date`'s `CycleOptions.round` rounds a bounded field the same
16
+ * way.
15
17
  *
16
18
  * @param current the field's current numeric value
17
19
  * @param amount signed amount to cycle by
@@ -0,0 +1,33 @@
1
+ import type { Temporal } from "@js-temporal/polyfill";
2
+ /**
3
+ * Whether an instant is in daylight saving time, read from the zone's offset changes alone.
4
+ *
5
+ * The rule: daylight time runs from a forward change of the clocks to the backward change that
6
+ * undoes it. A backward change undoes the most recent forward change of the same size that is not
7
+ * yet undone, and only if it comes less than 365 days after it. An instant is in daylight time when
8
+ * it is at or after such a forward change and before the backward change paired with it.
9
+ *
10
+ * A forward change that is never undone, or undone a year or more later, is a change of standard
11
+ * time (`Europe/Istanbul` 2016, `Europe/Moscow` 2011 to 2014), as is any backward change with no
12
+ * forward change to undo (`Asia/Almaty` 2024).
13
+ *
14
+ * This is GMT's own definition, not the tz database's daylight flag, which no JavaScript API
15
+ * exposes and offsets do not determine.
16
+ *
17
+ * Cost: one transition lookup forward, then one back, and more only outside the ordinary summer
18
+ * case. A paired change is less than 365 days away, so every lookup is given that limit and reads
19
+ * no further: with GMT's own search (temporalCompat D13) at most 74 offset samples and 51 reads to
20
+ * pin a change, for any zone and any instant.
21
+ *
22
+ * @param zoned the instant, in the zone to read
23
+ * @returns true in daylight time, false in standard time or when the walk exceeds its bound
24
+ */
25
+ export declare function isInDaylightTime(zoned: Temporal.ZonedDateTime): boolean;
26
+ /**
27
+ * Whether a zone observes daylight saving time as of an instant: the instant is in daylight time,
28
+ * or a daylight period begins within the 365 days after it. Same rule as `isInDaylightTime`.
29
+ *
30
+ * @param zoned the instant to judge from, in the zone to read
31
+ * @returns true when the zone observes daylight time then, false otherwise or past the walk bound
32
+ */
33
+ export declare function observesDaylightTime(zoned: Temporal.ZonedDateTime): boolean;
@@ -0,0 +1,164 @@
1
+ import { zonedNextTransition, zonedPreviousTransition, } from "./zonedWallClockOperations.js";
2
+ /**
3
+ * The longest a daylight period can last: a forward change and the backward change that undoes it
4
+ * are less than 365 days apart. Daylight time is seasonal, so it recurs within every year, and
5
+ * 365 days is the shortest year. A longer advance is a change of standard time.
6
+ */
7
+ const DAYLIGHT_PERIOD_LIMIT_NANOSECONDS = 365n * 86400000000000n;
8
+ /**
9
+ * Offset changes read in each direction before the walk gives up and answers `false`, the
10
+ * sentinel: a bounded loop that runs out never returns a partial answer. Every walk here is also
11
+ * limited to 365 days, and a year of `Africa/Casablanca` holds four changes, so no real zone
12
+ * reaches the bound; `daylightTime.test.ts` reaches it with a made-up zone.
13
+ */
14
+ const MAX_WALKED_CHANGES = 64;
15
+ function offsetChangeAt(transition) {
16
+ return {
17
+ at: transition.epochNanoseconds,
18
+ step: transition.offsetNanoseconds -
19
+ transition.subtract({ nanoseconds: 1 }).offsetNanoseconds,
20
+ };
21
+ }
22
+ /**
23
+ * Apply one change to the list of advances not yet undone. A forward change joins the list. A
24
+ * backward change undoes the most recent advance of the same size, if that advance is less than
25
+ * 365 days old, and returns it; otherwise it undoes nothing.
26
+ */
27
+ function applyChange(open, change) {
28
+ if (change.step > 0) {
29
+ open.push(change);
30
+ return null;
31
+ }
32
+ for (let i = open.length - 1; i >= 0; i--) {
33
+ if (open[i].step !== -change.step) {
34
+ continue;
35
+ }
36
+ if (change.at - open[i].at >= DAYLIGHT_PERIOD_LIMIT_NANOSECONDS) {
37
+ return null;
38
+ }
39
+ return open.splice(i, 1)[0];
40
+ }
41
+ return null;
42
+ }
43
+ /** Whether `to` is less than the daylight period limit after `from`. */
44
+ function isWithinLimit(from, to) {
45
+ return to - from < DAYLIGHT_PERIOD_LIMIT_NANOSECONDS;
46
+ }
47
+ /**
48
+ * The advances still open just before `next`: made in the 365 days before it and not yet undone.
49
+ * An older advance cannot be undone at or after `next`. Null past `MAX_WALKED_CHANGES` changes.
50
+ *
51
+ * @param next the first change after the instant being judged
52
+ * @param latest the change before `next`, already known to be within the limit
53
+ */
54
+ function openAdvancesBefore(next, latest) {
55
+ const changes = [offsetChangeAt(latest)];
56
+ let cursor = latest;
57
+ for (let i = 0; i <= MAX_WALKED_CHANGES; i++) {
58
+ const previous = zonedPreviousTransition(cursor, next.epochNanoseconds - DAYLIGHT_PERIOD_LIMIT_NANOSECONDS);
59
+ if (previous === null ||
60
+ !isWithinLimit(previous.epochNanoseconds, next.epochNanoseconds)) {
61
+ const open = [];
62
+ for (const change of changes) {
63
+ applyChange(open, change);
64
+ }
65
+ return open;
66
+ }
67
+ changes.unshift(offsetChangeAt(previous));
68
+ cursor = previous;
69
+ }
70
+ return null;
71
+ }
72
+ /**
73
+ * Whether a change from `next` onwards undoes one of the `open` advances made at or before `at`.
74
+ * It has to come less than 365 days after `at`, since the advance is no later than `at`.
75
+ */
76
+ function isUndoneFrom(next, open, at) {
77
+ let cursor = next;
78
+ for (let i = 0; i <= MAX_WALKED_CHANGES; i++) {
79
+ if (cursor === null || !isWithinLimit(at, cursor.epochNanoseconds)) {
80
+ return false;
81
+ }
82
+ const undone = applyChange(open, offsetChangeAt(cursor));
83
+ if (undone !== null && undone.at <= at) {
84
+ return true;
85
+ }
86
+ cursor = zonedNextTransition(cursor, at + DAYLIGHT_PERIOD_LIMIT_NANOSECONDS);
87
+ }
88
+ return false;
89
+ }
90
+ /**
91
+ * Whether an instant is in daylight saving time, read from the zone's offset changes alone.
92
+ *
93
+ * The rule: daylight time runs from a forward change of the clocks to the backward change that
94
+ * undoes it. A backward change undoes the most recent forward change of the same size that is not
95
+ * yet undone, and only if it comes less than 365 days after it. An instant is in daylight time when
96
+ * it is at or after such a forward change and before the backward change paired with it.
97
+ *
98
+ * A forward change that is never undone, or undone a year or more later, is a change of standard
99
+ * time (`Europe/Istanbul` 2016, `Europe/Moscow` 2011 to 2014), as is any backward change with no
100
+ * forward change to undo (`Asia/Almaty` 2024).
101
+ *
102
+ * This is GMT's own definition, not the tz database's daylight flag, which no JavaScript API
103
+ * exposes and offsets do not determine.
104
+ *
105
+ * Cost: one transition lookup forward, then one back, and more only outside the ordinary summer
106
+ * case. A paired change is less than 365 days away, so every lookup is given that limit and reads
107
+ * no further: with GMT's own search (temporalCompat D13) at most 74 offset samples and 51 reads to
108
+ * pin a change, for any zone and any instant.
109
+ *
110
+ * @param zoned the instant, in the zone to read
111
+ * @returns true in daylight time, false in standard time or when the walk exceeds its bound
112
+ */
113
+ export function isInDaylightTime(zoned) {
114
+ const at = zoned.epochNanoseconds;
115
+ // Daylight time ends with a clock change. No change ahead, or none within the limit: standard.
116
+ const next = zonedNextTransition(zoned, at + DAYLIGHT_PERIOD_LIMIT_NANOSECONDS);
117
+ if (next === null || !isWithinLimit(at, next.epochNanoseconds)) {
118
+ return false;
119
+ }
120
+ // It begins with one too, and no change in the 365 days before `next` leaves nothing to undo.
121
+ const latest = zonedPreviousTransition(next, next.epochNanoseconds - DAYLIGHT_PERIOD_LIMIT_NANOSECONDS);
122
+ if (latest === null ||
123
+ !isWithinLimit(latest.epochNanoseconds, next.epochNanoseconds)) {
124
+ return false;
125
+ }
126
+ // The ordinary summer: the clocks last went forward, and next go back by as much. The latest
127
+ // advance is the most recent one open, so `next` undoes it whatever came before.
128
+ const latestStep = offsetChangeAt(latest).step;
129
+ const nextStep = next.offsetNanoseconds - zoned.offsetNanoseconds;
130
+ if (latestStep > 0 && nextStep === -latestStep) {
131
+ return true;
132
+ }
133
+ const open = openAdvancesBefore(next, latest);
134
+ if (open === null || open.length === 0) {
135
+ return false;
136
+ }
137
+ return isUndoneFrom(next, open, at);
138
+ }
139
+ /**
140
+ * Whether a zone observes daylight saving time as of an instant: the instant is in daylight time,
141
+ * or a daylight period begins within the 365 days after it. Same rule as `isInDaylightTime`.
142
+ *
143
+ * @param zoned the instant to judge from, in the zone to read
144
+ * @returns true when the zone observes daylight time then, false otherwise or past the walk bound
145
+ */
146
+ export function observesDaylightTime(zoned) {
147
+ if (isInDaylightTime(zoned)) {
148
+ return true;
149
+ }
150
+ let cursor = zoned;
151
+ for (let i = 0; i <= MAX_WALKED_CHANGES; i++) {
152
+ const next = zonedNextTransition(cursor, zoned.epochNanoseconds + DAYLIGHT_PERIOD_LIMIT_NANOSECONDS);
153
+ if (next === null ||
154
+ next.epochNanoseconds - zoned.epochNanoseconds >=
155
+ DAYLIGHT_PERIOD_LIMIT_NANOSECONDS) {
156
+ return false;
157
+ }
158
+ if (isInDaylightTime(next)) {
159
+ return true;
160
+ }
161
+ cursor = next;
162
+ }
163
+ return false;
164
+ }