@northguild/gmt 1.16.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 (654) hide show
  1. package/README.md +742 -21
  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/index.d.ts +2 -0
  43. package/dist/index.js +2 -0
  44. package/dist/instant/convert/classifyLocal.d.ts +1 -1
  45. package/dist/instant/convert/classifyLocal.js +1 -1
  46. package/dist/instant/convert/fromOffsetInstant.d.ts +3 -1
  47. package/dist/instant/convert/fromOffsetInstant.js +6 -12
  48. package/dist/instant/convert/resolveLocal.d.ts +12 -7
  49. package/dist/instant/convert/resolveLocal.js +6 -10
  50. package/dist/instant/convert/toOffsetInstant.d.ts +37 -1
  51. package/dist/instant/convert/toOffsetInstant.js +12 -28
  52. package/dist/intermodal/calculate/billingTimeline.d.ts +114 -0
  53. package/dist/intermodal/calculate/billingTimeline.js +168 -0
  54. package/dist/intermodal/calculate/chargeableDays.d.ts +100 -0
  55. package/dist/intermodal/calculate/chargeableDays.js +96 -0
  56. package/dist/intermodal/calculate/demurrageClock.d.ts +102 -0
  57. package/dist/intermodal/calculate/demurrageClock.js +140 -0
  58. package/dist/intermodal/calculate/freeTimeExpiry.d.ts +67 -0
  59. package/dist/intermodal/calculate/freeTimeExpiry.js +82 -0
  60. package/dist/intermodal/calculate/index.d.ts +4 -0
  61. package/dist/intermodal/calculate/index.js +4 -0
  62. package/dist/intermodal/index.d.ts +2 -0
  63. package/dist/intermodal/index.js +3 -0
  64. package/dist/internal/businessCalendar.d.ts +5 -0
  65. package/dist/internal/businessCalendar.js +5 -1
  66. package/dist/internal/cycleFieldValue.d.ts +6 -4
  67. package/dist/internal/cycleFieldValue.js +6 -4
  68. package/dist/internal/daylightTime.d.ts +33 -0
  69. package/dist/internal/daylightTime.js +164 -0
  70. package/dist/internal/durationUntilString.js +4 -3
  71. package/dist/internal/englishCalendarNames.js +1 -2
  72. package/dist/internal/epochNanoseconds.d.ts +2 -0
  73. package/dist/internal/epochNanoseconds.js +2 -0
  74. package/dist/internal/exactDuration.d.ts +37 -0
  75. package/dist/internal/exactDuration.js +64 -0
  76. package/dist/internal/exactMoment.d.ts +72 -0
  77. package/dist/internal/exactMoment.js +114 -0
  78. package/dist/internal/fiscalCalendar.d.ts +4 -3
  79. package/dist/internal/fiscalCalendar.js +4 -3
  80. package/dist/internal/formatCalendarDays.d.ts +2 -2
  81. package/dist/internal/formatRelativeDuration.d.ts +21 -1
  82. package/dist/internal/formatRelativeDuration.js +47 -7
  83. package/dist/internal/freeTimeLedger.d.ts +93 -0
  84. package/dist/internal/freeTimeLedger.js +262 -0
  85. package/dist/internal/index.d.ts +10 -3
  86. package/dist/internal/index.js +10 -3
  87. package/dist/internal/instantFormatOptions.js +2 -1
  88. package/dist/internal/instantNanoseconds.d.ts +75 -9
  89. package/dist/internal/instantNanoseconds.js +192 -11
  90. package/dist/internal/isoStringBody.d.ts +26 -0
  91. package/dist/internal/isoStringBody.js +22 -2
  92. package/dist/internal/joinDateTimeConnector.d.ts +1 -1
  93. package/dist/internal/monthGridWeekRow.d.ts +2 -1
  94. package/dist/internal/monthGridWeekRow.js +2 -1
  95. package/dist/internal/normalizeTimeZone.d.ts +2 -2
  96. package/dist/internal/normalizeTimeZone.js +2 -2
  97. package/dist/internal/operatingSchedule.d.ts +129 -0
  98. package/dist/internal/operatingSchedule.js +668 -0
  99. package/dist/internal/optionOrDefault.d.ts +18 -0
  100. package/dist/internal/optionOrDefault.js +20 -0
  101. package/dist/internal/patternToken.d.ts +2 -2
  102. package/dist/internal/patternToken.js +28 -13
  103. package/dist/internal/plainDateUntil.js +10 -6
  104. package/dist/internal/punctuality.d.ts +38 -0
  105. package/dist/internal/punctuality.js +59 -0
  106. package/dist/internal/readDateTimeFormatOptions.d.ts +30 -0
  107. package/dist/internal/readDateTimeFormatOptions.js +93 -0
  108. package/dist/internal/resolveDurationRelativeTo.d.ts +4 -0
  109. package/dist/internal/resolveDurationRelativeTo.js +11 -1
  110. package/dist/internal/resolveRelativeRounding.d.ts +17 -6
  111. package/dist/internal/resolveRelativeRounding.js +27 -7
  112. package/dist/internal/resolveRelativeUnit.d.ts +30 -0
  113. package/dist/internal/resolveRelativeUnit.js +40 -0
  114. package/dist/internal/splitStep.d.ts +24 -1
  115. package/dist/internal/splitStep.js +34 -2
  116. package/dist/internal/startOrEndOfZoned.js +2 -3
  117. package/dist/internal/temporalCompat/capabilities.d.ts +26 -0
  118. package/dist/internal/temporalCompat/capabilities.js +35 -3
  119. package/dist/internal/temporalCompat/fieldSearch.js +1 -1
  120. package/dist/internal/temporalCompat/index.d.ts +1 -1
  121. package/dist/internal/temporalCompat/index.js +1 -1
  122. package/dist/internal/temporalCompat/repros.d.ts +1 -1
  123. package/dist/internal/temporalCompat/repros.js +157 -0
  124. package/dist/internal/timestampEvents.d.ts +32 -0
  125. package/dist/internal/timestampEvents.js +76 -0
  126. package/dist/internal/utcZonedDateTime.d.ts +5 -2
  127. package/dist/internal/utcZonedDateTime.js +8 -5
  128. package/dist/internal/wallClockAtOffset.d.ts +22 -0
  129. package/dist/internal/wallClockAtOffset.js +26 -0
  130. package/dist/internal/zonedBucket.js +8 -6
  131. package/dist/internal/zonedLocalDates.js +1 -1
  132. package/dist/internal/zonedTransitionSearch.d.ts +27 -0
  133. package/dist/internal/zonedTransitionSearch.js +218 -0
  134. package/dist/internal/zonedWallClock.d.ts +21 -7
  135. package/dist/internal/zonedWallClock.js +87 -18
  136. package/dist/internal/zonedWallClockDifference.js +5 -4
  137. package/dist/internal/zonedWallClockOperations.d.ts +26 -13
  138. package/dist/internal/zonedWallClockOperations.js +87 -34
  139. package/dist/interval/validate/isValidInterval.d.ts +6 -3
  140. package/dist/interval/validate/isValidInterval.js +6 -3
  141. package/dist/plain/calculate/addDate.d.ts +11 -8
  142. package/dist/plain/calculate/addDate.js +5 -8
  143. package/dist/plain/calculate/addDateTime.d.ts +7 -4
  144. package/dist/plain/calculate/addDateTime.js +1 -4
  145. package/dist/plain/calculate/cycleDate.d.ts +16 -7
  146. package/dist/plain/calculate/cycleDate.js +3 -7
  147. package/dist/plain/calculate/cycleDateTime.d.ts +14 -4
  148. package/dist/plain/calculate/cycleDateTime.js +1 -4
  149. package/dist/plain/calculate/cycleTime.d.ts +10 -5
  150. package/dist/plain/calculate/cycleTime.js +3 -5
  151. package/dist/plain/calculate/diffDate.d.ts +1 -1
  152. package/dist/plain/calculate/diffDate.js +1 -1
  153. package/dist/plain/calculate/diffDateAsDuration.d.ts +1 -1
  154. package/dist/plain/calculate/diffDateAsDuration.js +1 -1
  155. package/dist/plain/calculate/diffDateTime.d.ts +1 -1
  156. package/dist/plain/calculate/diffDateTime.js +1 -1
  157. package/dist/plain/calculate/diffDateTimeAsDuration.d.ts +1 -1
  158. package/dist/plain/calculate/diffDateTimeAsDuration.js +1 -1
  159. package/dist/plain/calculate/diffTime.d.ts +1 -1
  160. package/dist/plain/calculate/diffTime.js +1 -1
  161. package/dist/plain/calculate/endOfDate.d.ts +8 -3
  162. package/dist/plain/calculate/endOfDate.js +1 -3
  163. package/dist/plain/calculate/endOfDateTime.d.ts +15 -5
  164. package/dist/plain/calculate/endOfDateTime.js +1 -5
  165. package/dist/plain/calculate/endOfTime.d.ts +8 -2
  166. package/dist/plain/calculate/endOfTime.js +1 -2
  167. package/dist/plain/calculate/getLocaleWeekYear.d.ts +16 -9
  168. package/dist/plain/calculate/getLocaleWeekYear.js +9 -9
  169. package/dist/plain/calculate/getWeekOfMonth.d.ts +7 -4
  170. package/dist/plain/calculate/getWeekOfMonth.js +7 -4
  171. package/dist/plain/calculate/getWeeksInLocaleWeekYear.d.ts +13 -6
  172. package/dist/plain/calculate/getWeeksInLocaleWeekYear.js +6 -6
  173. package/dist/plain/calculate/getWeeksInMonth.d.ts +5 -2
  174. package/dist/plain/calculate/getWeeksInMonth.js +5 -2
  175. package/dist/plain/calculate/nextWeekday.d.ts +7 -3
  176. package/dist/plain/calculate/nextWeekday.js +1 -3
  177. package/dist/plain/calculate/previousWeekday.d.ts +7 -3
  178. package/dist/plain/calculate/previousWeekday.js +1 -3
  179. package/dist/plain/calculate/roundDate.d.ts +20 -7
  180. package/dist/plain/calculate/roundDate.js +3 -10
  181. package/dist/plain/calculate/roundDateTime.d.ts +22 -8
  182. package/dist/plain/calculate/roundDateTime.js +3 -11
  183. package/dist/plain/calculate/roundTime.d.ts +20 -4
  184. package/dist/plain/calculate/roundTime.js +3 -7
  185. package/dist/plain/calculate/setDate.d.ts +7 -5
  186. package/dist/plain/calculate/setDate.js +1 -5
  187. package/dist/plain/calculate/setDateTime.d.ts +8 -5
  188. package/dist/plain/calculate/setDateTime.js +1 -5
  189. package/dist/plain/calculate/setTime.d.ts +10 -6
  190. package/dist/plain/calculate/setTime.js +4 -6
  191. package/dist/plain/calculate/startOfDate.d.ts +8 -2
  192. package/dist/plain/calculate/startOfDate.js +1 -2
  193. package/dist/plain/calculate/startOfDateTime.d.ts +15 -2
  194. package/dist/plain/calculate/startOfDateTime.js +1 -2
  195. package/dist/plain/calculate/startOfTime.d.ts +8 -1
  196. package/dist/plain/calculate/startOfTime.js +1 -1
  197. package/dist/plain/calculate/subtractDate.d.ts +7 -4
  198. package/dist/plain/calculate/subtractDate.js +1 -4
  199. package/dist/plain/calculate/subtractDateTime.d.ts +7 -4
  200. package/dist/plain/calculate/subtractDateTime.js +1 -4
  201. package/dist/plain/compare/areDateTimesEqualBy.d.ts +13 -5
  202. package/dist/plain/compare/areDateTimesEqualBy.js +6 -5
  203. package/dist/plain/compare/areDatesEqualBy.d.ts +15 -6
  204. package/dist/plain/compare/areDatesEqualBy.js +8 -6
  205. package/dist/plain/compare/isBetweenDate.d.ts +13 -2
  206. package/dist/plain/compare/isBetweenDate.js +4 -4
  207. package/dist/plain/compare/isBetweenDateTime.d.ts +13 -2
  208. package/dist/plain/compare/isBetweenDateTime.js +4 -4
  209. package/dist/plain/compare/isBetweenTime.d.ts +13 -2
  210. package/dist/plain/compare/isBetweenTime.js +4 -4
  211. package/dist/plain/compare/isRelativeDay.d.ts +1 -1
  212. package/dist/plain/compare/isRelativeDay.js +1 -1
  213. package/dist/plain/compare/isThisUnit.d.ts +1 -1
  214. package/dist/plain/compare/isThisUnit.js +1 -1
  215. package/dist/plain/format/formatCalendar.d.ts +21 -14
  216. package/dist/plain/format/formatCalendar.js +21 -16
  217. package/dist/plain/format/formatDate.js +5 -3
  218. package/dist/plain/format/formatDateRange.js +4 -2
  219. package/dist/plain/format/formatDateTime.js +4 -2
  220. package/dist/plain/format/formatDateTimeRange.js +4 -2
  221. package/dist/plain/format/formatDateTimeToParts.d.ts +15 -4
  222. package/dist/plain/format/formatDateTimeToParts.js +10 -6
  223. package/dist/plain/format/formatDateToParts.d.ts +13 -2
  224. package/dist/plain/format/formatDateToParts.js +8 -4
  225. package/dist/plain/format/formatRelativeDate.d.ts +16 -3
  226. package/dist/plain/format/formatRelativeDate.js +26 -15
  227. package/dist/plain/format/formatRelativeDateTime.d.ts +16 -3
  228. package/dist/plain/format/formatRelativeDateTime.js +8 -5
  229. package/dist/plain/format/formatRelativeTime.d.ts +16 -3
  230. package/dist/plain/format/formatRelativeTime.js +21 -13
  231. package/dist/plain/format/formatTime.js +4 -2
  232. package/dist/plain/interval/intervalDifferenceDate.d.ts +9 -0
  233. package/dist/plain/interval/intervalDifferenceDateTime.d.ts +9 -0
  234. package/dist/plain/interval/intervalDifferenceTime.d.ts +9 -0
  235. package/dist/plain/interval/intervalDivideEquallyDate.d.ts +19 -4
  236. package/dist/plain/interval/intervalDivideEquallyDate.js +3 -4
  237. package/dist/plain/interval/intervalDivideEquallyDateTime.d.ts +19 -4
  238. package/dist/plain/interval/intervalDivideEquallyDateTime.js +3 -4
  239. package/dist/plain/interval/intervalDivideEquallyTime.d.ts +19 -4
  240. package/dist/plain/interval/intervalDivideEquallyTime.js +3 -4
  241. package/dist/plain/interval/intervalFromDurationDate.d.ts +16 -3
  242. package/dist/plain/interval/intervalFromDurationDate.js +1 -3
  243. package/dist/plain/interval/intervalFromDurationDateTime.d.ts +16 -3
  244. package/dist/plain/interval/intervalFromDurationDateTime.js +1 -3
  245. package/dist/plain/interval/intervalFromDurationTime.d.ts +9 -0
  246. package/dist/plain/interval/intervalIntersectionDate.d.ts +9 -0
  247. package/dist/plain/interval/intervalIntersectionDateTime.d.ts +9 -0
  248. package/dist/plain/interval/intervalIntersectionTime.d.ts +9 -0
  249. package/dist/plain/interval/intervalSplitAtDate.d.ts +11 -0
  250. package/dist/plain/interval/intervalSplitAtDate.js +2 -0
  251. package/dist/plain/interval/intervalSplitAtDateTime.d.ts +11 -0
  252. package/dist/plain/interval/intervalSplitAtDateTime.js +2 -0
  253. package/dist/plain/interval/intervalSplitAtTime.d.ts +11 -0
  254. package/dist/plain/interval/intervalSplitAtTime.js +2 -0
  255. package/dist/plain/interval/intervalUnionDate.d.ts +9 -0
  256. package/dist/plain/interval/intervalUnionDateTime.d.ts +9 -0
  257. package/dist/plain/interval/intervalUnionTime.d.ts +9 -0
  258. package/dist/plain/interval/intervalXorAllDate.d.ts +9 -0
  259. package/dist/plain/interval/intervalXorAllDateTime.d.ts +9 -0
  260. package/dist/plain/interval/intervalXorAllTime.d.ts +9 -0
  261. package/dist/plain/interval/intervalXorDate.d.ts +9 -0
  262. package/dist/plain/interval/intervalXorDateTime.d.ts +9 -0
  263. package/dist/plain/interval/intervalXorTime.d.ts +9 -0
  264. package/dist/plain/interval/mergeIntervalsDate.d.ts +9 -0
  265. package/dist/plain/interval/mergeIntervalsDateTime.d.ts +9 -0
  266. package/dist/plain/interval/mergeIntervalsTime.d.ts +9 -0
  267. package/dist/plain/interval/splitIntervalByUnitDate.d.ts +23 -7
  268. package/dist/plain/interval/splitIntervalByUnitDate.js +7 -7
  269. package/dist/plain/interval/splitIntervalByUnitDateTime.d.ts +22 -6
  270. package/dist/plain/interval/splitIntervalByUnitDateTime.js +6 -6
  271. package/dist/plain/interval/splitIntervalByUnitTime.d.ts +17 -4
  272. package/dist/plain/interval/splitIntervalByUnitTime.js +1 -4
  273. package/dist/plain/map/mapDatesInRange.d.ts +8 -4
  274. package/dist/plain/map/mapDatesInRange.js +1 -4
  275. package/dist/plain/parse/parseDateTimeWithPattern.d.ts +10 -7
  276. package/dist/plain/parse/parseDateTimeWithPattern.js +10 -7
  277. package/dist/plain/parse/parseDateWithPattern.d.ts +10 -7
  278. package/dist/plain/parse/parseDateWithPattern.js +10 -7
  279. package/dist/plain/parse/parseTimeWithPattern.d.ts +10 -7
  280. package/dist/plain/parse/parseTimeWithPattern.js +10 -7
  281. package/dist/plain/parse/parseUnitFromDate.d.ts +11 -3
  282. package/dist/plain/parse/parseUnitFromDate.js +3 -3
  283. package/dist/plain/parse/parseUnitFromDateTime.d.ts +11 -3
  284. package/dist/plain/parse/parseUnitFromDateTime.js +3 -3
  285. package/dist/plain/parse/parseWeekFromDate.d.ts +10 -6
  286. package/dist/plain/parse/parseWeekFromDate.js +2 -6
  287. package/dist/plain/parse/parseWeekFromDateTime.d.ts +10 -6
  288. package/dist/plain/parse/parseWeekFromDateTime.js +2 -6
  289. package/dist/plain/validate/isValidDateRange.d.ts +19 -4
  290. package/dist/plain/validate/isValidDateRange.js +1 -4
  291. package/dist/plain/validate/isValidDateTimeRange.d.ts +20 -5
  292. package/dist/plain/validate/isValidDateTimeRange.js +2 -5
  293. package/dist/plain/validate/isValidTimeRange.d.ts +20 -5
  294. package/dist/plain/validate/isValidTimeRange.js +2 -5
  295. package/dist/precision/convert/fromExcelSerial.d.ts +10 -4
  296. package/dist/precision/convert/fromExcelSerial.js +4 -5
  297. package/dist/precision/convert/fromNanoseconds.d.ts +1 -1
  298. package/dist/precision/convert/fromNanoseconds.js +1 -1
  299. package/dist/precision/convert/toExcelSerial.d.ts +9 -3
  300. package/dist/precision/convert/toExcelSerial.js +3 -4
  301. package/dist/precision/convert/toNanoseconds.d.ts +11 -6
  302. package/dist/precision/convert/toNanoseconds.js +11 -6
  303. package/dist/precision/validate/isValidInstant.d.ts +12 -3
  304. package/dist/precision/validate/isValidInstant.js +12 -3
  305. package/dist/span/calculate/spanMs.d.ts +10 -4
  306. package/dist/span/calculate/spanMs.js +10 -4
  307. package/dist/span/calculate/spanNs.d.ts +10 -4
  308. package/dist/span/calculate/spanNs.js +10 -4
  309. package/dist/span/validate/isValidSpan.d.ts +8 -3
  310. package/dist/span/validate/isValidSpan.js +8 -3
  311. package/dist/transport/calculate/bestAvailable.d.ts +47 -0
  312. package/dist/transport/calculate/bestAvailable.js +76 -0
  313. package/dist/transport/calculate/crossingTime.d.ts +58 -0
  314. package/dist/transport/calculate/crossingTime.js +76 -0
  315. package/dist/transport/calculate/cutoffAt.d.ts +90 -0
  316. package/dist/transport/calculate/cutoffAt.js +209 -0
  317. package/dist/transport/calculate/cutoffSchedule.d.ts +70 -0
  318. package/dist/transport/calculate/cutoffSchedule.js +71 -0
  319. package/dist/transport/calculate/dwellTime.d.ts +81 -0
  320. package/dist/transport/calculate/dwellTime.js +130 -0
  321. package/dist/transport/calculate/estimateDrift.d.ts +65 -0
  322. package/dist/transport/calculate/estimateDrift.js +75 -0
  323. package/dist/transport/calculate/index.d.ts +10 -0
  324. package/dist/transport/calculate/index.js +10 -0
  325. package/dist/transport/calculate/nextDeparture.d.ts +78 -0
  326. package/dist/transport/calculate/nextDeparture.js +131 -0
  327. package/dist/transport/calculate/punctualityRate.d.ts +42 -0
  328. package/dist/transport/calculate/punctualityRate.js +59 -0
  329. package/dist/transport/calculate/scheduleDelivery.d.ts +150 -0
  330. package/dist/transport/calculate/scheduleDelivery.js +300 -0
  331. package/dist/transport/calculate/transitTime.d.ts +71 -0
  332. package/dist/transport/calculate/transitTime.js +101 -0
  333. package/dist/transport/compare/classifyPunctuality.d.ts +46 -0
  334. package/dist/transport/compare/classifyPunctuality.js +64 -0
  335. package/dist/transport/compare/index.d.ts +4 -0
  336. package/dist/transport/compare/index.js +4 -0
  337. package/dist/transport/compare/isPastCutoff.d.ts +33 -0
  338. package/dist/transport/compare/isPastCutoff.js +48 -0
  339. package/dist/transport/compare/scheduleDeviation.d.ts +37 -0
  340. package/dist/transport/compare/scheduleDeviation.js +53 -0
  341. package/dist/transport/compare/timeToCutoff.d.ts +31 -0
  342. package/dist/transport/compare/timeToCutoff.js +47 -0
  343. package/dist/transport/convert/etaAtZone.d.ts +43 -0
  344. package/dist/transport/convert/etaAtZone.js +58 -0
  345. package/dist/transport/convert/index.d.ts +1 -0
  346. package/dist/transport/convert/index.js +1 -0
  347. package/dist/transport/index.d.ts +4 -0
  348. package/dist/transport/index.js +5 -0
  349. package/dist/types/business-calendar.d.ts +19 -14
  350. package/dist/types/calendar-options.d.ts +15 -3
  351. package/dist/types/date-cycle-field.d.ts +5 -0
  352. package/dist/types/date-duration-unit.d.ts +4 -0
  353. package/dist/types/date-time-cycle-field.d.ts +4 -0
  354. package/dist/types/date-time-duration-units.d.ts +4 -0
  355. package/dist/types/date-time-unit.d.ts +4 -0
  356. package/dist/types/date-unit.d.ts +4 -0
  357. package/dist/types/disambiguation.d.ts +8 -0
  358. package/dist/types/duration-relative-to.d.ts +8 -0
  359. package/dist/types/duration-string-options.d.ts +28 -0
  360. package/dist/types/fiscal-calendar.d.ts +1 -1
  361. package/dist/types/fractional-digit.d.ts +5 -0
  362. package/dist/types/free-time-options.d.ts +44 -0
  363. package/dist/types/index.d.ts +3 -1
  364. package/dist/types/index.js +3 -1
  365. package/dist/types/interval.d.ts +8 -1
  366. package/dist/types/offset.d.ts +9 -0
  367. package/dist/types/operating-schedule.d.ts +71 -0
  368. package/dist/types/operating-schedule.js +0 -0
  369. package/dist/types/overflow.d.ts +6 -0
  370. package/dist/types/relative-rounding-method.d.ts +6 -0
  371. package/dist/types/relative-time-options.d.ts +33 -5
  372. package/dist/types/rounding-options.d.ts +27 -0
  373. package/dist/types/time-cycle-field.d.ts +4 -0
  374. package/dist/types/time-duration-unit.d.ts +4 -0
  375. package/dist/types/time-unit.d.ts +4 -0
  376. package/dist/types/transport-timestamps.d.ts +54 -0
  377. package/dist/types/transport-timestamps.js +0 -0
  378. package/dist/unix/calculate/addUnix.d.ts +19 -5
  379. package/dist/unix/calculate/addUnix.js +1 -5
  380. package/dist/unix/calculate/diffUnix.d.ts +13 -3
  381. package/dist/unix/calculate/diffUnix.js +1 -3
  382. package/dist/unix/calculate/diffUnixAsDuration.d.ts +13 -3
  383. package/dist/unix/calculate/diffUnixAsDuration.js +1 -3
  384. package/dist/unix/calculate/endOfQuarterForUnix.d.ts +13 -3
  385. package/dist/unix/calculate/endOfQuarterForUnix.js +1 -3
  386. package/dist/unix/calculate/endOfUnix.d.ts +20 -4
  387. package/dist/unix/calculate/endOfUnix.js +1 -4
  388. package/dist/unix/calculate/isBetweenUnix.d.ts +26 -4
  389. package/dist/unix/calculate/isBetweenUnix.js +4 -6
  390. package/dist/unix/calculate/roundUnix.d.ts +31 -3
  391. package/dist/unix/calculate/roundUnix.js +3 -6
  392. package/dist/unix/calculate/setUnix.d.ts +35 -9
  393. package/dist/unix/calculate/setUnix.js +4 -13
  394. package/dist/unix/calculate/startOfQuarterForUnix.d.ts +13 -3
  395. package/dist/unix/calculate/startOfQuarterForUnix.js +1 -3
  396. package/dist/unix/calculate/startOfUnix.d.ts +20 -4
  397. package/dist/unix/calculate/startOfUnix.js +1 -4
  398. package/dist/unix/calculate/subtractUnix.d.ts +19 -5
  399. package/dist/unix/calculate/subtractUnix.js +1 -5
  400. package/dist/unix/compare/areUnixEqual.d.ts +7 -1
  401. package/dist/unix/compare/areUnixEqual.js +1 -1
  402. package/dist/unix/compare/areUnixEqualBy.d.ts +24 -7
  403. package/dist/unix/compare/areUnixEqualBy.js +13 -9
  404. package/dist/unix/compare/isAfterUnix.d.ts +7 -1
  405. package/dist/unix/compare/isAfterUnix.js +1 -1
  406. package/dist/unix/compare/isBeforeUnix.d.ts +7 -1
  407. package/dist/unix/compare/isBeforeUnix.js +1 -1
  408. package/dist/unix/convert/convertUnixToPlainDate.d.ts +14 -4
  409. package/dist/unix/convert/convertUnixToPlainDate.js +2 -4
  410. package/dist/unix/convert/convertUnixToPlainDateTime.d.ts +14 -4
  411. package/dist/unix/convert/convertUnixToPlainDateTime.js +2 -4
  412. package/dist/unix/convert/convertUnixToPlainTime.d.ts +14 -4
  413. package/dist/unix/convert/convertUnixToPlainTime.js +2 -4
  414. package/dist/unix/convert/convertUnixToUtc.d.ts +9 -4
  415. package/dist/unix/convert/convertUnixToUtc.js +3 -4
  416. package/dist/unix/convert/convertUnixToZoned.d.ts +10 -5
  417. package/dist/unix/convert/convertUnixToZoned.js +4 -5
  418. package/dist/unix/format/formatCalendarUnix.d.ts +27 -19
  419. package/dist/unix/format/formatCalendarUnix.js +4 -5
  420. package/dist/unix/format/formatRelativeUnix.d.ts +54 -5
  421. package/dist/unix/format/formatRelativeUnix.js +3 -5
  422. package/dist/unix/format/formatUnix.d.ts +24 -6
  423. package/dist/unix/format/formatUnix.js +8 -7
  424. package/dist/unix/get/getUnixNow.d.ts +8 -3
  425. package/dist/unix/get/getUnixNow.js +1 -3
  426. package/dist/unix/interval/intervalCountUnix.d.ts +14 -5
  427. package/dist/unix/interval/intervalCountUnix.js +2 -5
  428. package/dist/unix/interval/intervalDifferenceUnix.d.ts +6 -0
  429. package/dist/unix/interval/intervalDivideEquallyUnix.d.ts +18 -4
  430. package/dist/unix/interval/intervalDivideEquallyUnix.js +5 -4
  431. package/dist/unix/interval/intervalFromDurationUnix.d.ts +33 -5
  432. package/dist/unix/interval/intervalFromDurationUnix.js +6 -5
  433. package/dist/unix/interval/intervalIntersectionUnix.d.ts +6 -0
  434. package/dist/unix/interval/intervalLengthUnix.d.ts +16 -6
  435. package/dist/unix/interval/intervalLengthUnix.js +4 -6
  436. package/dist/unix/interval/intervalOverlappingDaysUnix.d.ts +13 -3
  437. package/dist/unix/interval/intervalOverlappingDaysUnix.js +1 -3
  438. package/dist/unix/interval/intervalSplitAtUnix.d.ts +8 -0
  439. package/dist/unix/interval/intervalSplitAtUnix.js +2 -0
  440. package/dist/unix/interval/intervalUnionUnix.d.ts +6 -0
  441. package/dist/unix/interval/intervalXorAllUnix.d.ts +6 -0
  442. package/dist/unix/interval/intervalXorUnix.d.ts +6 -0
  443. package/dist/unix/interval/mergeIntervalsUnix.d.ts +6 -0
  444. package/dist/unix/interval/splitIntervalByUnitUnix.d.ts +42 -11
  445. package/dist/unix/interval/splitIntervalByUnitUnix.js +21 -16
  446. package/dist/unix/parse/parseDateFromUnix.d.ts +13 -2
  447. package/dist/unix/parse/parseDateFromUnix.js +1 -2
  448. package/dist/unix/parse/parseDayFromUnix.d.ts +14 -2
  449. package/dist/unix/parse/parseDayFromUnix.js +2 -2
  450. package/dist/unix/parse/parseDayOfWeekFromUnix.d.ts +13 -1
  451. package/dist/unix/parse/parseDayOfWeekFromUnix.js +1 -1
  452. package/dist/unix/parse/parseHourFromUnix.d.ts +14 -2
  453. package/dist/unix/parse/parseHourFromUnix.js +2 -2
  454. package/dist/unix/parse/parseMicrosecondFromUnix.d.ts +14 -2
  455. package/dist/unix/parse/parseMicrosecondFromUnix.js +2 -2
  456. package/dist/unix/parse/parseMillisecondFromUnix.d.ts +14 -2
  457. package/dist/unix/parse/parseMillisecondFromUnix.js +2 -2
  458. package/dist/unix/parse/parseMinuteFromUnix.d.ts +14 -2
  459. package/dist/unix/parse/parseMinuteFromUnix.js +2 -2
  460. package/dist/unix/parse/parseMonthFromUnix.d.ts +14 -2
  461. package/dist/unix/parse/parseMonthFromUnix.js +2 -2
  462. package/dist/unix/parse/parseNanosecondFromUnix.d.ts +14 -2
  463. package/dist/unix/parse/parseNanosecondFromUnix.js +2 -2
  464. package/dist/unix/parse/parseSecondFromUnix.d.ts +14 -2
  465. package/dist/unix/parse/parseSecondFromUnix.js +2 -2
  466. package/dist/unix/parse/parseTimeFromUnix.d.ts +13 -2
  467. package/dist/unix/parse/parseTimeFromUnix.js +1 -2
  468. package/dist/unix/parse/parseUnitFromUnix.d.ts +22 -3
  469. package/dist/unix/parse/parseUnitFromUnix.js +2 -3
  470. package/dist/unix/parse/parseWeekFromUnix.d.ts +23 -7
  471. package/dist/unix/parse/parseWeekFromUnix.js +3 -7
  472. package/dist/unix/parse/parseYearFromUnix.d.ts +14 -2
  473. package/dist/unix/parse/parseYearFromUnix.js +2 -2
  474. package/dist/unix/validate/isValidUnixRange.d.ts +20 -4
  475. package/dist/unix/validate/isValidUnixRange.js +1 -4
  476. package/dist/utc/calculate/addUtc.d.ts +7 -4
  477. package/dist/utc/calculate/addUtc.js +1 -4
  478. package/dist/utc/calculate/diffUtc.d.ts +1 -1
  479. package/dist/utc/calculate/diffUtc.js +1 -1
  480. package/dist/utc/calculate/diffUtcAsDuration.d.ts +1 -1
  481. package/dist/utc/calculate/diffUtcAsDuration.js +1 -1
  482. package/dist/utc/calculate/endOfUtc.d.ts +16 -3
  483. package/dist/utc/calculate/endOfUtc.js +2 -3
  484. package/dist/utc/calculate/isBetweenUtc.d.ts +13 -2
  485. package/dist/utc/calculate/isBetweenUtc.js +4 -4
  486. package/dist/utc/calculate/roundUtc.d.ts +26 -9
  487. package/dist/utc/calculate/roundUtc.js +3 -12
  488. package/dist/utc/calculate/setUtc.d.ts +7 -4
  489. package/dist/utc/calculate/setUtc.js +1 -4
  490. package/dist/utc/calculate/startOfUtc.d.ts +15 -2
  491. package/dist/utc/calculate/startOfUtc.js +1 -2
  492. package/dist/utc/calculate/subtractUtc.d.ts +7 -4
  493. package/dist/utc/calculate/subtractUtc.js +1 -4
  494. package/dist/utc/compare/areUtcEqualBy.d.ts +9 -3
  495. package/dist/utc/compare/areUtcEqualBy.js +2 -3
  496. package/dist/utc/convert/convertUtcToPlainDate.d.ts +8 -3
  497. package/dist/utc/convert/convertUtcToPlainDate.js +5 -6
  498. package/dist/utc/convert/convertUtcToPlainDateTime.d.ts +8 -3
  499. package/dist/utc/convert/convertUtcToPlainDateTime.js +5 -6
  500. package/dist/utc/convert/convertUtcToPlainTime.d.ts +8 -3
  501. package/dist/utc/convert/convertUtcToPlainTime.js +5 -6
  502. package/dist/utc/convert/convertUtcToUnix.d.ts +9 -4
  503. package/dist/utc/convert/convertUtcToUnix.js +3 -4
  504. package/dist/utc/convert/convertUtcToZoned.d.ts +1 -1
  505. package/dist/utc/convert/convertUtcToZoned.js +1 -1
  506. package/dist/utc/format/formatCalendarUtc.d.ts +19 -8
  507. package/dist/utc/format/formatCalendarUtc.js +8 -6
  508. package/dist/utc/format/formatHttp.d.ts +1 -1
  509. package/dist/utc/format/formatHttp.js +1 -1
  510. package/dist/utc/format/formatRelativeUtc.d.ts +30 -10
  511. package/dist/utc/format/formatRelativeUtc.js +9 -11
  512. package/dist/utc/format/formatUtc.d.ts +17 -15
  513. package/dist/utc/format/formatUtc.js +8 -8
  514. package/dist/utc/interval/intervalDifferenceUtc.d.ts +6 -0
  515. package/dist/utc/interval/intervalDivideEquallyUtc.d.ts +18 -4
  516. package/dist/utc/interval/intervalDivideEquallyUtc.js +5 -4
  517. package/dist/utc/interval/intervalFromDurationUtc.d.ts +13 -3
  518. package/dist/utc/interval/intervalFromDurationUtc.js +1 -3
  519. package/dist/utc/interval/intervalIntersectionUtc.d.ts +6 -0
  520. package/dist/utc/interval/intervalSplitAtUtc.d.ts +8 -0
  521. package/dist/utc/interval/intervalSplitAtUtc.js +2 -0
  522. package/dist/utc/interval/intervalUnionUtc.d.ts +6 -0
  523. package/dist/utc/interval/intervalXorAllUtc.d.ts +6 -0
  524. package/dist/utc/interval/intervalXorUtc.d.ts +6 -0
  525. package/dist/utc/interval/mergeIntervalsUtc.d.ts +6 -0
  526. package/dist/utc/interval/splitIntervalByUnitUtc.d.ts +19 -6
  527. package/dist/utc/interval/splitIntervalByUnitUtc.js +6 -6
  528. package/dist/utc/parse/parseDateFromUtc.d.ts +7 -3
  529. package/dist/utc/parse/parseDateFromUtc.js +1 -3
  530. package/dist/utc/parse/parseDayFromUtc.d.ts +7 -3
  531. package/dist/utc/parse/parseDayFromUtc.js +1 -3
  532. package/dist/utc/parse/parseDayOfWeekFromUtc.d.ts +7 -3
  533. package/dist/utc/parse/parseDayOfWeekFromUtc.js +4 -6
  534. package/dist/utc/parse/parseHourFromUtc.d.ts +7 -3
  535. package/dist/utc/parse/parseHourFromUtc.js +1 -3
  536. package/dist/utc/parse/parseHttp.d.ts +1 -1
  537. package/dist/utc/parse/parseHttp.js +1 -1
  538. package/dist/utc/parse/parseMicrosecondFromUtc.d.ts +7 -3
  539. package/dist/utc/parse/parseMicrosecondFromUtc.js +1 -3
  540. package/dist/utc/parse/parseMillisecondFromUtc.d.ts +7 -3
  541. package/dist/utc/parse/parseMillisecondFromUtc.js +1 -3
  542. package/dist/utc/parse/parseMinuteFromUtc.d.ts +7 -3
  543. package/dist/utc/parse/parseMinuteFromUtc.js +1 -3
  544. package/dist/utc/parse/parseMonthFromUtc.d.ts +7 -3
  545. package/dist/utc/parse/parseMonthFromUtc.js +1 -3
  546. package/dist/utc/parse/parseNanosecondFromUtc.d.ts +7 -3
  547. package/dist/utc/parse/parseNanosecondFromUtc.js +1 -3
  548. package/dist/utc/parse/parseSecondFromUtc.d.ts +7 -3
  549. package/dist/utc/parse/parseSecondFromUtc.js +1 -3
  550. package/dist/utc/parse/parseTimeFromUtc.d.ts +8 -3
  551. package/dist/utc/parse/parseTimeFromUtc.js +5 -6
  552. package/dist/utc/parse/parseUnitFromUtc.d.ts +17 -5
  553. package/dist/utc/parse/parseUnitFromUtc.js +6 -8
  554. package/dist/utc/parse/parseWeekFromUtc.d.ts +18 -10
  555. package/dist/utc/parse/parseWeekFromUtc.js +7 -13
  556. package/dist/utc/parse/parseYearFromUtc.d.ts +7 -3
  557. package/dist/utc/parse/parseYearFromUtc.js +1 -3
  558. package/dist/utc/validate/isValidUtcRange.d.ts +16 -5
  559. package/dist/utc/validate/isValidUtcRange.js +2 -5
  560. package/dist/zoned/calculate/addZoned.d.ts +20 -10
  561. package/dist/zoned/calculate/addZoned.js +6 -13
  562. package/dist/zoned/calculate/cycleZoned.d.ts +33 -8
  563. package/dist/zoned/calculate/cycleZoned.js +1 -8
  564. package/dist/zoned/calculate/diffZoned.d.ts +1 -1
  565. package/dist/zoned/calculate/diffZoned.js +1 -1
  566. package/dist/zoned/calculate/diffZonedAsDuration.d.ts +1 -1
  567. package/dist/zoned/calculate/diffZonedAsDuration.js +1 -1
  568. package/dist/zoned/calculate/endOfQuarterForZoned.d.ts +9 -2
  569. package/dist/zoned/calculate/endOfQuarterForZoned.js +4 -5
  570. package/dist/zoned/calculate/endOfZoned.d.ts +16 -3
  571. package/dist/zoned/calculate/endOfZoned.js +2 -3
  572. package/dist/zoned/calculate/getLocaleZonedEndOfWeek.d.ts +10 -3
  573. package/dist/zoned/calculate/getLocaleZonedEndOfWeek.js +5 -6
  574. package/dist/zoned/calculate/getLocaleZonedStartOfWeek.d.ts +7 -1
  575. package/dist/zoned/calculate/getLocaleZonedStartOfWeek.js +3 -4
  576. package/dist/zoned/calculate/roundZoned.d.ts +21 -4
  577. package/dist/zoned/calculate/roundZoned.js +3 -7
  578. package/dist/zoned/calculate/setZoned.d.ts +25 -8
  579. package/dist/zoned/calculate/setZoned.js +4 -12
  580. package/dist/zoned/calculate/startOfQuarterForZoned.d.ts +7 -2
  581. package/dist/zoned/calculate/startOfQuarterForZoned.js +3 -5
  582. package/dist/zoned/calculate/startOfZoned.d.ts +15 -3
  583. package/dist/zoned/calculate/startOfZoned.js +1 -3
  584. package/dist/zoned/calculate/subtractZoned.d.ts +20 -10
  585. package/dist/zoned/calculate/subtractZoned.js +6 -13
  586. package/dist/zoned/compare/areZonedEqualBy.d.ts +14 -5
  587. package/dist/zoned/compare/areZonedEqualBy.js +7 -5
  588. package/dist/zoned/compare/isBetweenZoned.d.ts +13 -1
  589. package/dist/zoned/compare/isBetweenZoned.js +4 -3
  590. package/dist/zoned/compare/isInDaylightSaving.d.ts +38 -11
  591. package/dist/zoned/compare/isInDaylightSaving.js +40 -44
  592. package/dist/zoned/convert/convertPlainDateTimeToZoned.d.ts +18 -5
  593. package/dist/zoned/convert/convertPlainDateTimeToZoned.js +6 -11
  594. package/dist/zoned/convert/convertZonedToUnix.d.ts +9 -4
  595. package/dist/zoned/convert/convertZonedToUnix.js +2 -4
  596. package/dist/zoned/convert/convertZonedToZoned.d.ts +1 -1
  597. package/dist/zoned/convert/convertZonedToZoned.js +1 -1
  598. package/dist/zoned/format/formatCalendarZoned.d.ts +18 -12
  599. package/dist/zoned/format/formatCalendarZoned.js +13 -9
  600. package/dist/zoned/format/formatRelativeZoned.d.ts +41 -12
  601. package/dist/zoned/format/formatRelativeZoned.js +7 -4
  602. package/dist/zoned/format/formatRfc2822.d.ts +2 -2
  603. package/dist/zoned/format/formatRfc2822.js +2 -2
  604. package/dist/zoned/format/formatRfc3339.d.ts +2 -3
  605. package/dist/zoned/format/formatRfc3339.js +2 -3
  606. package/dist/zoned/format/formatTimeZoneName.d.ts +12 -3
  607. package/dist/zoned/format/formatTimeZoneName.js +5 -4
  608. package/dist/zoned/format/formatZonedDateTime.js +2 -1
  609. package/dist/zoned/format/formatZonedRange.js +2 -1
  610. package/dist/zoned/format/formatZonedToParts.d.ts +15 -4
  611. package/dist/zoned/format/formatZonedToParts.js +8 -5
  612. package/dist/zoned/get/getDstTransitions.d.ts +9 -10
  613. package/dist/zoned/get/getDstTransitions.js +12 -3
  614. package/dist/zoned/get/getTimeZoneOffset.d.ts +4 -1
  615. package/dist/zoned/get/getTimeZoneOffset.js +6 -3
  616. package/dist/zoned/get/getZonedNow.d.ts +13 -1
  617. package/dist/zoned/get/getZonedNow.js +12 -3
  618. package/dist/zoned/interval/intervalDifferenceZoned.d.ts +9 -0
  619. package/dist/zoned/interval/intervalDivideEquallyZoned.d.ts +22 -4
  620. package/dist/zoned/interval/intervalDivideEquallyZoned.js +6 -4
  621. package/dist/zoned/interval/intervalFromDurationZoned.d.ts +29 -10
  622. package/dist/zoned/interval/intervalFromDurationZoned.js +6 -13
  623. package/dist/zoned/interval/intervalIntersectionZoned.d.ts +9 -0
  624. package/dist/zoned/interval/intervalSplitAtZoned.d.ts +11 -0
  625. package/dist/zoned/interval/intervalSplitAtZoned.js +2 -0
  626. package/dist/zoned/interval/intervalUnionZoned.d.ts +9 -0
  627. package/dist/zoned/interval/intervalXorAllZoned.d.ts +9 -0
  628. package/dist/zoned/interval/intervalXorZoned.d.ts +9 -0
  629. package/dist/zoned/interval/mergeIntervalsZoned.d.ts +9 -0
  630. package/dist/zoned/interval/splitIntervalByUnitZoned.d.ts +27 -6
  631. package/dist/zoned/interval/splitIntervalByUnitZoned.js +11 -6
  632. package/dist/zoned/map/mapZonedDatesInRange.d.ts +9 -4
  633. package/dist/zoned/map/mapZonedDatesInRange.js +2 -4
  634. package/dist/zoned/parse/parseRfc2822.d.ts +1 -1
  635. package/dist/zoned/parse/parseRfc2822.js +1 -1
  636. package/dist/zoned/parse/parseUnitFromZoned.d.ts +9 -3
  637. package/dist/zoned/parse/parseUnitFromZoned.js +1 -3
  638. package/dist/zoned/parse/parseWeekFromZoned.d.ts +10 -3
  639. package/dist/zoned/parse/parseWeekFromZoned.js +2 -3
  640. package/dist/zoned/validate/hasDaylightSaving.d.ts +42 -11
  641. package/dist/zoned/validate/hasDaylightSaving.js +47 -31
  642. package/dist/zoned/validate/isValidZonedDateTime.d.ts +13 -0
  643. package/dist/zoned/validate/isValidZonedDateTime.js +14 -1
  644. package/dist/zoned/validate/isValidZonedRange.d.ts +15 -4
  645. package/dist/zoned/validate/isValidZonedRange.js +1 -4
  646. package/package.json +53 -5
  647. package/skills/gmt-arithmetic/SKILL.md +1 -1
  648. package/skills/gmt-basics/SKILL.md +10 -1
  649. package/skills/gmt-integration/SKILL.md +10 -5
  650. package/skills/gmt-timezone/SKILL.md +210 -14
  651. package/dist/internal/resolveReadingTimeZone.d.ts +0 -11
  652. package/dist/internal/resolveReadingTimeZone.js +0 -18
  653. package/dist/types/duration-unit.d.ts +0 -5
  654. /package/dist/types/{duration-unit.js → free-time-options.js} +0 -0
@@ -0,0 +1,300 @@
1
+ import { Temporal } from "@js-temporal/polyfill";
2
+ import { TIME_ZONE_ANNOTATION, exactDurationNanoseconds, isOptionsArgument, isoStringBody, zonedDateTimeFrom, } from "../../internal/index.js";
3
+ import { isValidDateTime } from "../../plain/validate/isValidDateTime.js";
4
+ import { isValidInstant } from "../../precision/validate/isValidInstant.js";
5
+ import { isValidTimeZone } from "../../zoned/validate/isValidTimeZone.js";
6
+ import { isValidZonedDateTime } from "../../zoned/validate/isValidZonedDateTime.js";
7
+ import { etaAtZone } from "../convert/etaAtZone.js";
8
+ import { transitTime } from "./transitTime.js";
9
+ import { optionOrDefault } from "../../internal/optionOrDefault.js";
10
+ /**
11
+ * A time-zone annotation anywhere in the string (`TIME_ZONE_ANNOTATION`): a bracket without
12
+ * `=`. A departure that names a zone must name a real one that agrees with its offset.
13
+ */
14
+ const zoneAnnotation = new RegExp(TIME_ZONE_ANNOTATION);
15
+ /**
16
+ * A departure resolved to the exact instant it names, or `null`.
17
+ *
18
+ * An instant (`Z`/offset) is already exact; a zoned string is exact through its bracket, which
19
+ * is read and must be real and agree with its offset (unlike `crossingTime`, which never reads
20
+ * one). A zoneless wall time is a published local schedule time, exact only through
21
+ * `wallTimeZone` — the caller decides which zone that is: `startTimeZone` for the first leg,
22
+ * the previous leg's `timeZone` for any other leg (see `legDeparture`). Without one, a
23
+ * zoneless departure is not a moment. `cursor` picks the pass of a repeated hour (see
24
+ * `wallTimeInstant`).
25
+ */
26
+ function departureInstant(departure, wallTimeZone, cursor) {
27
+ if (typeof departure !== "string") {
28
+ return null;
29
+ }
30
+ if (isValidZonedDateTime(departure)) {
31
+ return wallTimeInstant(departure, cursor);
32
+ }
33
+ if (zoneAnnotation.test(departure)) {
34
+ return null;
35
+ }
36
+ if (isValidInstant(departure)) {
37
+ return Temporal.Instant.from(departure);
38
+ }
39
+ if (wallTimeZone !== undefined && isValidDateTime(departure)) {
40
+ // resolveLocal's core: the zone the schedule's wall time is exact in.
41
+ return wallTimeInstant(`${isoStringBody(departure)}[${wallTimeZone}]`, cursor);
42
+ }
43
+ return null;
44
+ }
45
+ /**
46
+ * The instant a zoned string names. On a later leg (`cursor` set), a wall time the clock showed
47
+ * twice — a fall-back hour — resolves to the earliest pass at or after `cursor`, the first
48
+ * moment the cargo can leave: a printed hub time never says which pass it means, and the one a
49
+ * shipper would catch is the first the cargo is ready for. Otherwise, and when neither pass is
50
+ * at or after `cursor` (a real miss), it resolves `"compatible"`: the earlier pass of a
51
+ * repeated hour, the later instant of a skipped one. A written offset names one pass, so both
52
+ * reads agree and it always wins. A repeated hour is told apart from a skipped one by whether
53
+ * both passes keep the wall time asked for.
54
+ */
55
+ function wallTimeInstant(zoned, cursor) {
56
+ if (cursor !== null) {
57
+ const earlier = zonedDateTimeFrom(zoned, { disambiguation: "earlier" });
58
+ const later = zonedDateTimeFrom(zoned, { disambiguation: "later" });
59
+ const repeated = !earlier.toInstant().equals(later.toInstant()) &&
60
+ earlier.toPlainDateTime().equals(later.toPlainDateTime());
61
+ if (repeated) {
62
+ for (const pass of [earlier.toInstant(), later.toInstant()]) {
63
+ if (Temporal.Instant.compare(pass, cursor) >= 0) {
64
+ return pass;
65
+ }
66
+ }
67
+ }
68
+ }
69
+ return zonedDateTimeFrom(zoned, { disambiguation: "compatible" }).toInstant();
70
+ }
71
+ /** The three opaque tag keys of a leg, echoed onto its LegTime. */
72
+ const TAG_KEYS = ["mode", "origin", "destination"];
73
+ /**
74
+ * The leg's tags, ready to spread onto its LegTime — an unsupplied key stays truly absent —
75
+ * or `null` when a present tag is not a string.
76
+ */
77
+ function legTags(leg) {
78
+ const tags = {};
79
+ for (const key of TAG_KEYS) {
80
+ const tag = leg[key];
81
+ if (tag === undefined) {
82
+ continue;
83
+ }
84
+ if (typeof tag !== "string") {
85
+ return null;
86
+ }
87
+ tags[key] = tag;
88
+ }
89
+ return tags;
90
+ }
91
+ /**
92
+ * The instant this leg leaves: its scheduled `departure`, or the connection cursor (the previous
93
+ * arrival plus its dwell) it chains from. A zoneless `departure` is read as a wall time in
94
+ * `startTimeZone` on the first leg (`cursor === null`), or in `previousTimeZone` — the previous
95
+ * leg's own `timeZone`, already proven real by that leg's `legBoundaries` call — on any other
96
+ * leg; `previousTimeZone` is `undefined`, and ignored, on the first leg. A scheduled departure
97
+ * before the cursor — inside the previous handoff's minimum connect time, or before the arrival
98
+ * itself — is a missed connection, invalid input rather than a negative wait; equal passes, a
99
+ * zero-slack connection is feasible. `null` on the first leg (no cursor) means the leg's
100
+ * departure did not resolve.
101
+ */
102
+ function legDeparture(leg, cursor, startTimeZone, previousTimeZone) {
103
+ if (cursor !== null && leg.departure === undefined) {
104
+ return cursor;
105
+ }
106
+ const wallTimeZone = cursor === null ? startTimeZone : previousTimeZone;
107
+ const departure = departureInstant(leg.departure, wallTimeZone, cursor);
108
+ if (departure === null) {
109
+ return null;
110
+ }
111
+ if (cursor !== null && Temporal.Instant.compare(departure, cursor) < 0) {
112
+ return null;
113
+ }
114
+ return departure;
115
+ }
116
+ /**
117
+ * Whether a final leg's `dwellAfter` is a dwell `transitTime` would accept — an ISO 8601
118
+ * duration with no years, months or weeks — and is not negative. Checked on the duration alone:
119
+ * the last dwell moves nothing, so no instant is computed and the range cannot reject it.
120
+ */
121
+ function isValidFinalDwell(dwellAfter) {
122
+ const nanoseconds = exactDurationNanoseconds(dwellAfter);
123
+ return nanoseconds !== null && nanoseconds >= 0n;
124
+ }
125
+ /**
126
+ * A leg's arrival, its local rendering, and the dwell hop to when the next leg may leave.
127
+ *
128
+ * `transitTime` gives both the leg and the hop the duration grammar (calendar units refused, a
129
+ * day is 24 hours). A leg that lands before it departs, or a hop that lands before its own
130
+ * arrival, is negative time — a data error. The final leg's hop is not taken (`released` is
131
+ * `null`): its dwell is validated as a duration and echoed, never turned into an instant.
132
+ */
133
+ function legBoundaries(departure, leg, isFinal) {
134
+ const arrival = transitTime(departure.toString(), leg.duration);
135
+ if (arrival === "") {
136
+ return null;
137
+ }
138
+ const arrivalInstant = Temporal.Instant.from(arrival);
139
+ if (Temporal.Instant.compare(arrivalInstant, departure) < 0) {
140
+ return null;
141
+ }
142
+ const localArrival = etaAtZone(arrival, leg.timeZone);
143
+ if (localArrival === "") {
144
+ return null;
145
+ }
146
+ const dwellAfter = optionOrDefault(leg.dwellAfter, "PT0S");
147
+ if (isFinal) {
148
+ return isValidFinalDwell(dwellAfter)
149
+ ? { arrival, localArrival, dwellAfter, released: null }
150
+ : null;
151
+ }
152
+ const releasedString = transitTime(arrival, dwellAfter);
153
+ if (releasedString === "") {
154
+ return null;
155
+ }
156
+ const released = Temporal.Instant.from(releasedString);
157
+ if (Temporal.Instant.compare(released, arrivalInstant) < 0) {
158
+ return null;
159
+ }
160
+ return { arrival, localArrival, dwellAfter, released };
161
+ }
162
+ /**
163
+ * Chain the legs: each leg leaves at its scheduled departure or at the cursor the previous leg
164
+ * released, and lands as `legBoundaries` computes. `previousTimeZone` carries leg N-1's own
165
+ * `timeZone` forward so leg N's zoneless departure can be read in it; it stays `undefined`
166
+ * before leg 0 (where `startTimeZone` applies instead, never this) and is captured only once
167
+ * `legBoundaries` has proven that zone real, never speculatively. `null` when any leg is
168
+ * malformed, misses its connection, or leaves the instant range.
169
+ */
170
+ function chainLegs(legs, startTimeZone) {
171
+ const legTimes = [];
172
+ let cursor = null;
173
+ let previousTimeZone;
174
+ for (const [index, leg] of legs.entries()) {
175
+ if (typeof leg !== "object" || leg === null) {
176
+ return null;
177
+ }
178
+ const tags = legTags(leg);
179
+ if (tags === null) {
180
+ return null;
181
+ }
182
+ const departure = legDeparture(leg, cursor, startTimeZone, previousTimeZone);
183
+ if (departure === null) {
184
+ return null;
185
+ }
186
+ const boundaries = legBoundaries(departure, leg, index === legs.length - 1);
187
+ if (boundaries === null) {
188
+ return null;
189
+ }
190
+ cursor = boundaries.released;
191
+ previousTimeZone = leg.timeZone;
192
+ legTimes.push({
193
+ arrival: boundaries.arrival,
194
+ localArrival: boundaries.localArrival,
195
+ dwellAfter: boundaries.dwellAfter,
196
+ ...tags,
197
+ });
198
+ }
199
+ return legTimes;
200
+ }
201
+ /**
202
+ * Chain the legs of a multi-modal move into an end-to-end ETA with zone-local times at every
203
+ * handoff.
204
+ *
205
+ * A truck→ship→rail move is published as one departure plus a duration per leg, and the hour
206
+ * naive implementations lose lives at the handoffs: every leg boundary here is an exact
207
+ * instant, and local rendering happens only at the edges, via `etaAtZone`.
208
+ *
209
+ * - **Each leg's arrival plus its `dwellAfter` is the next leg's departure** unless the next leg
210
+ * carries an explicit `departure` — a scheduled connection the cargo waits for. `dwellAfter`
211
+ * is the handling time at the handoff, the minimum connect time: a scheduled departure
212
+ * earlier than the previous arrival plus its dwell is a missed connection and returns `null`
213
+ * (equal passes — a zero-slack connection is feasible). It follows `transitTime`'s duration
214
+ * grammar, may not be negative, and is echoed on the `LegTime` exactly as written (`"PT90M"`
215
+ * stays `"PT90M"`), `"PT0S"` when omitted. The last leg's dwell moves nothing — there is no
216
+ * leg after it — so it is validated as a duration (no years, months or weeks, not negative)
217
+ * and echoed, but never added to an instant: it cannot turn a representable ETA into `null`.
218
+ * - **`departure` must be exact:** an instant (`Z`/offset) or a zoned string, whose bracketed
219
+ * zone is read and must be real and agree with its offset. The first leg requires one.
220
+ * - **`startTimeZone` resolves the first leg alone:** schedules are published as zone-local wall
221
+ * times, so a zoneless first-leg departure is read in `startTimeZone`. Zoneless without the
222
+ * option is `null`; the option is ignored when the departure is already exact; an invalid
223
+ * `startTimeZone` is `null` even when unused; it is never applied to a later leg — see the next
224
+ * rule for those.
225
+ * - **A later leg's zoneless departure is read in the previous leg's `timeZone`:** a real
226
+ * timetable publishes a local wall time at every hub, not just at origin, and leg N−1's
227
+ * `timeZone` is exactly leg N's departure zone. So a zoneless departure on any leg but the
228
+ * first is read there, with the same `"compatible"` disambiguation as `startTimeZone`. This is
229
+ * a separate, always-on mechanism — `startTimeZone` still names only the first leg's zone and
230
+ * cannot be used for a later one. The missed-connection check still runs after resolution, so a
231
+ * later zoneless departure that resolves earlier than the cursor is still `null`.
232
+ * - **Local-time resolution policy (`"compatible"`).** A zoned departure written without an
233
+ * offset (`"2024-11-03T01:30:00[America/New_York]"`), a zoneless first departure read in
234
+ * `startTimeZone`, and a zoneless later-leg departure read in the previous leg's `timeZone`
235
+ * are all wall times. An **ambiguous** wall time — a fall-back hour the clock ran through
236
+ * twice — resolves to the **earlier** instant; a **nonexistent** one — a spring-forward hour
237
+ * the clock skipped — resolves to the **later** instant. Write the offset to pick the other
238
+ * pass of a repeated hour.
239
+ * - **A repeated hour at a hub takes the pass the cargo can catch.** On any leg but the first, an
240
+ * ambiguous wall time resolves to the earliest pass at or after the previous arrival plus its
241
+ * dwell — a printed timetable never says which pass it means. When neither pass is that late,
242
+ * it resolves to the earlier pass as above, and the connection is missed. A skipped hour, and
243
+ * the first leg, which has no arrival to wait for, keep the rule above.
244
+ * - `duration` follows `transitTime`: time units are elapsed time, a day is exactly 24 hours,
245
+ * and calendar units (years, months, weeks) return `null`. `transitTime` accepts a negative
246
+ * duration (to recover a departure from an arrival), but a leg cannot arrive before it
247
+ * departs, so a negative leg is invalid input here and returns `null` (`-PT0S` is zero).
248
+ * - `mode`, `origin` and `destination` are opaque string tags echoed onto each `LegTime` and
249
+ * absent when not supplied; GMT does not resolve them to zones — `timeZone` is the caller's
250
+ * fact.
251
+ * - `eta` is the last leg's `localArrival`, so a single-leg schedule is exactly `transitTime`
252
+ * composed with `etaAtZone`.
253
+ * - An empty legs array is valid vacuous input and returns `{ eta: "", legTimes: [] }`;
254
+ * malformed input (a non-array, a non-object leg, an invalid field) returns `null`.
255
+ * - Returns `null` on invalid input.
256
+ *
257
+ * @param legs the journey's legs, in travel order
258
+ * @param options The zone a zoneless first-leg departure is read in
259
+ * @returns the final local ETA and each leg's arrival, local arrival and dwell, or null on invalid input
260
+ *
261
+ * @example scheduleDelivery([{ departure: "2024-06-15T10:00:00Z", duration: "PT36H", timeZone: "Asia/Tokyo" }]) // { eta: "2024-06-17T07:00:00+09:00[Asia/Tokyo]", legTimes: [{ arrival: "2024-06-16T22:00:00Z", localArrival: "2024-06-17T07:00:00+09:00[Asia/Tokyo]", dwellAfter: "PT0S" }] }
262
+ * @example scheduleDelivery([{ departure: "2024-06-15T00:00:00Z", duration: "PT10H", timeZone: "UTC", dwellAfter: "PT2H" }, { duration: "PT5H", timeZone: "Asia/Tokyo" }]) // { eta: "2024-06-16T02:00:00+09:00[Asia/Tokyo]", legTimes: [{ arrival: "2024-06-15T10:00:00Z", localArrival: "2024-06-15T10:00:00+00:00[UTC]", dwellAfter: "PT2H" }, { arrival: "2024-06-15T17:00:00Z", localArrival: "2024-06-16T02:00:00+09:00[Asia/Tokyo]", dwellAfter: "PT0S" }] } (the second leg leaves at 12:00Z, after the dwell)
263
+ * @example scheduleDelivery([{ departure: "2024-06-15T10:00:00Z", duration: "PT1H", timeZone: "UTC", mode: "ship" }]) // { eta: "2024-06-15T11:00:00+00:00[UTC]", legTimes: [{ arrival: "2024-06-15T11:00:00Z", localArrival: "2024-06-15T11:00:00+00:00[UTC]", dwellAfter: "PT0S", mode: "ship" }] } (tags echo back; unsupplied tag keys stay absent)
264
+ * @example scheduleDelivery([{ departure: "2024-06-15T10:00:00", duration: "PT1H", timeZone: "UTC" }], { startTimeZone: "America/New_York" }) // { eta: "2024-06-15T15:00:00+00:00[UTC]", legTimes: [{ arrival: "2024-06-15T15:00:00Z", localArrival: "2024-06-15T15:00:00+00:00[UTC]", dwellAfter: "PT0S" }] } (a published 10:00 wall time, read in New York)
265
+ * @example scheduleDelivery([{ departure: "2024-06-15T00:00:00Z", duration: "PT10H", timeZone: "UTC", dwellAfter: "PT2H" }, { departure: "2024-06-15T13:00:00", duration: "PT1H", timeZone: "UTC" }]) // { eta: "2024-06-15T14:00:00+00:00[UTC]", legTimes: [{ arrival: "2024-06-15T10:00:00Z", localArrival: "2024-06-15T10:00:00+00:00[UTC]", dwellAfter: "PT2H" }, { arrival: "2024-06-15T14:00:00Z", localArrival: "2024-06-15T14:00:00+00:00[UTC]", dwellAfter: "PT0S" }] } (leg 2's zoneless 13:00 is read in leg 1's UTC destination zone, not startTimeZone, since none was supplied)
266
+ * @example scheduleDelivery([{ departure: "2024-06-15T00:00:00Z", duration: "PT10H", timeZone: "UTC", dwellAfter: "PT2H" }, { departure: "2024-06-15T11:00:00", duration: "PT1H", timeZone: "UTC" }]) // null (leg 2's zoneless 11:00, read in UTC, falls inside leg 1's dwell: a missed connection)
267
+ * @example scheduleDelivery([]) // { eta: "", legTimes: [] }
268
+ * @example scheduleDelivery([{ departure: "2024-06-15T00:00:00Z", duration: "PT10H", timeZone: "UTC", dwellAfter: "PT2H" }, { departure: "2024-06-15T11:00:00Z", duration: "PT1H", timeZone: "UTC" }]) // null (the scheduled connection leaves inside the dwell: a missed connection)
269
+ * @example scheduleDelivery([{ departure: "2024-06-15T10:00:00", duration: "PT1H", timeZone: "UTC" }]) // null (a zoneless departure without startTimeZone is not a moment)
270
+ * @example scheduleDelivery([{ departure: "2024-06-15T10:00:00Z", duration: "-PT1H", timeZone: "UTC" }]) // null (a leg cannot arrive before it departs)
271
+ * @example scheduleDelivery([{ duration: "PT1H", timeZone: "UTC" }]) // null (the first leg needs a departure)
272
+ * @example scheduleDelivery([{ departure: "2024-06-15T10:00:00Z", duration: "P1M", timeZone: "UTC" }]) // null (calendar units need a reference point)
273
+ * @example scheduleDelivery("legs") // null
274
+ */
275
+ export function scheduleDelivery(legs, options) {
276
+ try {
277
+ if (!isOptionsArgument(options)) {
278
+ return null;
279
+ }
280
+ const startTimeZone = options?.startTimeZone;
281
+ if (startTimeZone !== undefined && !isValidTimeZone(startTimeZone)) {
282
+ return null;
283
+ }
284
+ if (!Array.isArray(legs)) {
285
+ return null;
286
+ }
287
+ const legTimes = chainLegs(legs, startTimeZone);
288
+ if (legTimes === null) {
289
+ return null;
290
+ }
291
+ // An empty legs array is the vacuous schedule: eta is "" only there.
292
+ const last = legTimes.at(-1);
293
+ return { eta: last === undefined ? "" : last.localArrival, legTimes };
294
+ }
295
+ catch {
296
+ // Never throws (Core Rule 3): a hostile
297
+ // argument is invalid input, not an exception.
298
+ return null;
299
+ }
300
+ }
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Add a transit duration to a departure and return the arrival, in the departure's own zone.
3
+ *
4
+ * The first of the three shared transport operations: a leg is a departure plus how long it
5
+ * takes. Every mode publishes it that way, and every mode gets the same thing wrong — a leg
6
+ * that crosses a DST transition is a fixed number of *elapsed* hours, not a wall-clock
7
+ * interval, so the local arrival time reflects the shift.
8
+ *
9
+ * - **Transit time is exact time.** Hours, minutes, seconds and fractions are added as elapsed
10
+ * time, and a day component means 24 hours, exactly. That is TC39 Temporal's rule:
11
+ * `Duration.prototype.round` and `total` without a `relativeTo` treat a day as 24 hours and
12
+ * require a `relativeTo` for weeks, months and years. A 26-hour leg that starts the evening
13
+ * before a spring-forward arrives at a wall time one hour later than a wall-clock reading would
14
+ * suggest, because that is when the vessel, train or aircraft actually gets there.
15
+ * - **Calendar units are refused.** A `duration` with years, months or weeks returns `""`: no
16
+ * leg takes "a month" in a sense that time arithmetic can fix without a reference point, and
17
+ * Temporal's `round` and `total` require a `relativeTo` for them. Scheduled connections that
18
+ * are dated rather than timed belong to `scheduleDelivery`.
19
+ * - **The departure's zone is preserved.** A bracketed IANA zone (`…-05:00[America/New_York]`)
20
+ * stays that zone, so the arrival's offset is whatever is in force there at arrival. A `Z`
21
+ * instant returns a `Z` instant; an offset-only instant keeps its offset, written exactly as
22
+ * the departure wrote it, sub-minute offsets such as `+05:30:15` included (an offset is not a
23
+ * zone, so nothing else can be inferred from it — see `toOffsetInstant`). A bracketed zone
24
+ * that does not exist, or that contradicts its offset, is rejected as `isValidZonedDateTime`
25
+ * rejects it; it does not fall back to the offset. An offset written to the minute that is the
26
+ * zone's sub-minute offset rounded (`-00:45[Africa/Monrovia]`, for −00:44:30) agrees with the
27
+ * zone, as Temporal writes and reads it, and names the instant the zone gives.
28
+ * - **One zoned departure in range is refused.** A zoned departure is read as
29
+ * `Temporal.ZonedDateTime.from` reads it, which rejects a local date of −271821-04-19. A zone
30
+ * west of Greenwich shows that date for the first hours of the instant range, so a departure
31
+ * written there (`-271821-04-19T23:59:00-00:01[Europe/London]`) returns `""`, although
32
+ * `etaAtZone` writes it and `scheduleDeviation` reads it. Pass the instant in `Z` form.
33
+ * - **Local-time resolution policy (`"compatible"`).** A departure written as a wall time with a
34
+ * bracketed zone and no offset is resolved in that zone with the `"compatible"` policy,
35
+ * Temporal's default and `resolveLocal`'s. An **ambiguous** wall time — a fall-back hour the
36
+ * clock ran through twice — resolves to the **earlier** instant:
37
+ * `2024-11-03T01:30:00[America/New_York]` is `01:30-04:00`. A **nonexistent** one — a
38
+ * spring-forward hour the clock skipped — resolves to the **later** instant:
39
+ * `2024-03-10T02:30:00[America/New_York]` is `03:30-04:00`. Write the offset to name the other
40
+ * pass of a repeated hour; a departure that carries its offset is never re-resolved.
41
+ * - RFC 9557 annotations are read as `Temporal.Instant.from` reads them: a bracket without `=`
42
+ * is a time zone, and a `key=value` bracket with an unknown key is ignored when elective and
43
+ * rejected when critical (`[!…]`). A calendar on a departure without a zone is accepted and
44
+ * changes nothing, since an instant has no calendar; a zoned departure's calendar must be ISO,
45
+ * as `isValidZonedDateTime` requires.
46
+ * - A negative duration is allowed and moves backwards; that is how a departure is recovered
47
+ * from an arrival.
48
+ * - Returns `""` when `departure` is not a zoned datetime or instant string, or `duration` is
49
+ * not an ISO 8601 duration.
50
+ *
51
+ * @param departure ISO 8601 zoned datetime (bracketed zone) or instant string (`Z` or offset)
52
+ * @param duration ISO 8601 duration of the leg; time units and 24-hour days only
53
+ * @returns the arrival in the departure's zone or offset form, or "" on invalid input
54
+ *
55
+ * @example transitTime("2024-06-15T10:00:00-04:00[America/New_York]", "PT2H30M") // "2024-06-15T12:30:00-04:00[America/New_York]"
56
+ * @example transitTime("2024-03-09T23:00:00-05:00[America/New_York]", "PT4H") // "2024-03-10T04:00:00-04:00[America/New_York]" (four elapsed hours across the spring-forward, so the wall clock reads 04:00, not 03:00)
57
+ * @example transitTime("2024-03-09T12:00:00-05:00[America/New_York]", "P1D") // "2024-03-10T13:00:00-04:00[America/New_York]" (a day is 24 elapsed hours, not "the same wall time tomorrow")
58
+ * @example transitTime("2024-06-15T10:00:00Z", "PT36H") // "2024-06-16T22:00:00Z"
59
+ * @example transitTime("2024-06-15T10:00:00+09:00", "PT1H") // "2024-06-15T11:00:00+09:00" (an offset stays an offset)
60
+ * @example transitTime("2024-06-15T10:00:00+05:30:15", "PT1H") // "2024-06-15T11:00:00+05:30:15" (a sub-minute offset is kept as written)
61
+ * @example transitTime("2024-06-15T10:00:00Z[foo=bar]", "PT1H") // "2024-06-15T11:00:00Z" (an elective unknown annotation is ignored)
62
+ * @example transitTime("2024-06-15T12:30:00-04:00[America/New_York]", "-PT2H30M") // "2024-06-15T10:00:00-04:00[America/New_York]"
63
+ * @example transitTime("2024-11-03T01:30:00[America/New_York]", "PT0S") // "2024-11-03T01:30:00-04:00[America/New_York]" (an ambiguous wall time resolves to the earlier instant)
64
+ * @example transitTime("2024-03-10T02:30:00[America/New_York]", "PT0S") // "2024-03-10T03:30:00-04:00[America/New_York]" (a nonexistent wall time resolves to the later instant)
65
+ * @example transitTime("2024-06-15T10:00:00-04:00[America/New_York]", "P1M") // "" (calendar units need a reference point)
66
+ * @example transitTime("2024-06-15T10:00:00-05:00[America/New_York]", "PT2H") // "" (New York is -04:00 in June: the offset contradicts the zone)
67
+ * @example transitTime("-271821-04-19T23:59:00-00:01[Europe/London]", "PT0S") // "" (a zoned string on a local date before Temporal's date range)
68
+ * @example transitTime("2024-06-15T10:00:00", "PT2H") // "" (no zone and no offset: not a moment)
69
+ * @example transitTime("2024-06-15T10:00:00Z", "2 hours") // ""
70
+ */
71
+ export declare function transitTime(departure: string, duration: string): string;
@@ -0,0 +1,101 @@
1
+ import { exactDurationNanoseconds, readExactMoment, writeExactMoment, } from "../../internal/index.js";
2
+ /**
3
+ * Add a transit duration to a departure and return the arrival, in the departure's own zone.
4
+ *
5
+ * The first of the three shared transport operations: a leg is a departure plus how long it
6
+ * takes. Every mode publishes it that way, and every mode gets the same thing wrong — a leg
7
+ * that crosses a DST transition is a fixed number of *elapsed* hours, not a wall-clock
8
+ * interval, so the local arrival time reflects the shift.
9
+ *
10
+ * - **Transit time is exact time.** Hours, minutes, seconds and fractions are added as elapsed
11
+ * time, and a day component means 24 hours, exactly. That is TC39 Temporal's rule:
12
+ * `Duration.prototype.round` and `total` without a `relativeTo` treat a day as 24 hours and
13
+ * require a `relativeTo` for weeks, months and years. A 26-hour leg that starts the evening
14
+ * before a spring-forward arrives at a wall time one hour later than a wall-clock reading would
15
+ * suggest, because that is when the vessel, train or aircraft actually gets there.
16
+ * - **Calendar units are refused.** A `duration` with years, months or weeks returns `""`: no
17
+ * leg takes "a month" in a sense that time arithmetic can fix without a reference point, and
18
+ * Temporal's `round` and `total` require a `relativeTo` for them. Scheduled connections that
19
+ * are dated rather than timed belong to `scheduleDelivery`.
20
+ * - **The departure's zone is preserved.** A bracketed IANA zone (`…-05:00[America/New_York]`)
21
+ * stays that zone, so the arrival's offset is whatever is in force there at arrival. A `Z`
22
+ * instant returns a `Z` instant; an offset-only instant keeps its offset, written exactly as
23
+ * the departure wrote it, sub-minute offsets such as `+05:30:15` included (an offset is not a
24
+ * zone, so nothing else can be inferred from it — see `toOffsetInstant`). A bracketed zone
25
+ * that does not exist, or that contradicts its offset, is rejected as `isValidZonedDateTime`
26
+ * rejects it; it does not fall back to the offset. An offset written to the minute that is the
27
+ * zone's sub-minute offset rounded (`-00:45[Africa/Monrovia]`, for −00:44:30) agrees with the
28
+ * zone, as Temporal writes and reads it, and names the instant the zone gives.
29
+ * - **One zoned departure in range is refused.** A zoned departure is read as
30
+ * `Temporal.ZonedDateTime.from` reads it, which rejects a local date of −271821-04-19. A zone
31
+ * west of Greenwich shows that date for the first hours of the instant range, so a departure
32
+ * written there (`-271821-04-19T23:59:00-00:01[Europe/London]`) returns `""`, although
33
+ * `etaAtZone` writes it and `scheduleDeviation` reads it. Pass the instant in `Z` form.
34
+ * - **Local-time resolution policy (`"compatible"`).** A departure written as a wall time with a
35
+ * bracketed zone and no offset is resolved in that zone with the `"compatible"` policy,
36
+ * Temporal's default and `resolveLocal`'s. An **ambiguous** wall time — a fall-back hour the
37
+ * clock ran through twice — resolves to the **earlier** instant:
38
+ * `2024-11-03T01:30:00[America/New_York]` is `01:30-04:00`. A **nonexistent** one — a
39
+ * spring-forward hour the clock skipped — resolves to the **later** instant:
40
+ * `2024-03-10T02:30:00[America/New_York]` is `03:30-04:00`. Write the offset to name the other
41
+ * pass of a repeated hour; a departure that carries its offset is never re-resolved.
42
+ * - RFC 9557 annotations are read as `Temporal.Instant.from` reads them: a bracket without `=`
43
+ * is a time zone, and a `key=value` bracket with an unknown key is ignored when elective and
44
+ * rejected when critical (`[!…]`). A calendar on a departure without a zone is accepted and
45
+ * changes nothing, since an instant has no calendar; a zoned departure's calendar must be ISO,
46
+ * as `isValidZonedDateTime` requires.
47
+ * - A negative duration is allowed and moves backwards; that is how a departure is recovered
48
+ * from an arrival.
49
+ * - Returns `""` when `departure` is not a zoned datetime or instant string, or `duration` is
50
+ * not an ISO 8601 duration.
51
+ *
52
+ * @param departure ISO 8601 zoned datetime (bracketed zone) or instant string (`Z` or offset)
53
+ * @param duration ISO 8601 duration of the leg; time units and 24-hour days only
54
+ * @returns the arrival in the departure's zone or offset form, or "" on invalid input
55
+ *
56
+ * @example transitTime("2024-06-15T10:00:00-04:00[America/New_York]", "PT2H30M") // "2024-06-15T12:30:00-04:00[America/New_York]"
57
+ * @example transitTime("2024-03-09T23:00:00-05:00[America/New_York]", "PT4H") // "2024-03-10T04:00:00-04:00[America/New_York]" (four elapsed hours across the spring-forward, so the wall clock reads 04:00, not 03:00)
58
+ * @example transitTime("2024-03-09T12:00:00-05:00[America/New_York]", "P1D") // "2024-03-10T13:00:00-04:00[America/New_York]" (a day is 24 elapsed hours, not "the same wall time tomorrow")
59
+ * @example transitTime("2024-06-15T10:00:00Z", "PT36H") // "2024-06-16T22:00:00Z"
60
+ * @example transitTime("2024-06-15T10:00:00+09:00", "PT1H") // "2024-06-15T11:00:00+09:00" (an offset stays an offset)
61
+ * @example transitTime("2024-06-15T10:00:00+05:30:15", "PT1H") // "2024-06-15T11:00:00+05:30:15" (a sub-minute offset is kept as written)
62
+ * @example transitTime("2024-06-15T10:00:00Z[foo=bar]", "PT1H") // "2024-06-15T11:00:00Z" (an elective unknown annotation is ignored)
63
+ * @example transitTime("2024-06-15T12:30:00-04:00[America/New_York]", "-PT2H30M") // "2024-06-15T10:00:00-04:00[America/New_York]"
64
+ * @example transitTime("2024-11-03T01:30:00[America/New_York]", "PT0S") // "2024-11-03T01:30:00-04:00[America/New_York]" (an ambiguous wall time resolves to the earlier instant)
65
+ * @example transitTime("2024-03-10T02:30:00[America/New_York]", "PT0S") // "2024-03-10T03:30:00-04:00[America/New_York]" (a nonexistent wall time resolves to the later instant)
66
+ * @example transitTime("2024-06-15T10:00:00-04:00[America/New_York]", "P1M") // "" (calendar units need a reference point)
67
+ * @example transitTime("2024-06-15T10:00:00-05:00[America/New_York]", "PT2H") // "" (New York is -04:00 in June: the offset contradicts the zone)
68
+ * @example transitTime("-271821-04-19T23:59:00-00:01[Europe/London]", "PT0S") // "" (a zoned string on a local date before Temporal's date range)
69
+ * @example transitTime("2024-06-15T10:00:00", "PT2H") // "" (no zone and no offset: not a moment)
70
+ * @example transitTime("2024-06-15T10:00:00Z", "2 hours") // ""
71
+ */
72
+ export function transitTime(departure, duration) {
73
+ // A non-string would reach the regex tests below, which coerce it: a throwing `toString`, a
74
+ // Symbol or a hostile Proxy would escape. Refuse it before any read.
75
+ if (typeof departure !== "string" || typeof duration !== "string") {
76
+ return "";
77
+ }
78
+ try {
79
+ return addLeg(departure, duration);
80
+ }
81
+ catch {
82
+ // Never throws (Core Rule 3): a hostile
83
+ // argument is invalid input, not an exception.
84
+ return "";
85
+ }
86
+ }
87
+ /** `transitTime` for two strings, without the guard. */
88
+ function addLeg(departure, duration) {
89
+ // Days are 24 exact hours; years, months and weeks are refused.
90
+ const amount = exactDurationNanoseconds(duration);
91
+ if (amount === null) {
92
+ return "";
93
+ }
94
+ // A string that names a zone must name a real one that agrees with its offset; only a string
95
+ // that names none is read as an instant, keeping its offset text.
96
+ const moment = readExactMoment(departure);
97
+ if (moment === null) {
98
+ return "";
99
+ }
100
+ return writeExactMoment(moment.nanoseconds + amount, moment.notation);
101
+ }
@@ -0,0 +1,46 @@
1
+ import type { Punctuality, PunctualityTolerance } from "../../types/index.js";
2
+ /**
3
+ * Classify an arrival as early, on time or late against the caller's tolerance.
4
+ *
5
+ * "On time" without a stated tolerance is not a measurement, and the tolerance differs by mode:
6
+ * a 15-minute tolerance (`{ late: "PT15M" }`), a 60/120-minute pair compared side by side, or a
7
+ * day-based one (`{ late: "P1D", early: "P1D" }`). GMT holds no default; the caller states it.
8
+ *
9
+ * - The deviation is `scheduleDeviation`'s: `actual` minus `planned` in exact elapsed time, so a
10
+ * delay across a DST transition is measured in real minutes, never wall-clock ones.
11
+ * - **Late** when the deviation is `late` or more: exactly 15 minutes against `PT15M` is late.
12
+ * - **Early** when `early` is given and the deviation is `-early` or less: exactly 10 minutes
13
+ * early against `PT10M` is early.
14
+ * - **On time** only strictly inside the tolerance: after `-early` (when given) and before
15
+ * `late`. Both boundaries belong to the outside. This convention is GMT's own, stated here, not
16
+ * a reading of any rule.
17
+ * - **Without `early`, every early arrival is on time.** `early: undefined` is the same as
18
+ * leaving it out; `early: null` is invalid.
19
+ * - `late: "PT0S"` leaves no on-time window after the plan: an arrival exactly on the plan is
20
+ * late. `early: "PT0S"` leaves none before it: an arrival exactly on the plan is early (with a
21
+ * non-zero `late`), because both boundaries are outside the on-time window. With both at
22
+ * `"PT0S"`, nothing is on time; late is checked first, so the plan itself is late.
23
+ * - Tolerances are exact durations: a day is 24 hours; years, months and weeks return `null`, as
24
+ * does a negative tolerance (`-PT0S` is zero).
25
+ * - Both times are an instant (`Z`/offset) or a zoned string, read as `scheduleDeviation` reads
26
+ * them: the offset fixes the instant, and an offset written to the minute that is the
27
+ * bracketed zone's sub-minute offset rounded (`-00:45[Africa/Monrovia]`, for −00:44:30) names
28
+ * the instant the zone gives. Otherwise the bracket is not checked.
29
+ * - Returns `null` on invalid input.
30
+ *
31
+ * @param planned ISO 8601 instant or zoned datetime string of the planned time
32
+ * @param actual ISO 8601 instant or zoned datetime string of the actual time
33
+ * @param tolerance late (required) and early (optional) tolerances as ISO 8601 durations of exact time
34
+ * @returns "early", "onTime" or "late", or null on invalid input
35
+ *
36
+ * @example classifyPunctuality("2024-06-15T10:00:00Z", "2024-06-15T10:14:59Z", { late: "PT15M" }) // "onTime"
37
+ * @example classifyPunctuality("2024-06-15T10:00:00Z", "2024-06-15T10:15:00Z", { late: "PT15M" }) // "late" (exactly the tolerance is late)
38
+ * @example classifyPunctuality("2024-06-15T10:00:00Z", "2024-06-15T08:00:00Z", { late: "PT15M" }) // "onTime" (without early, an early arrival is on time)
39
+ * @example classifyPunctuality("2024-06-15T10:00:00Z", "2024-06-15T09:49:00Z", { late: "PT15M", early: "PT10M" }) // "early"
40
+ * @example classifyPunctuality("2024-06-15T10:00:00Z", "2024-06-15T11:30:00Z", { late: "PT120M" }) // "onTime" (a 90-minute delay under a 120-minute tolerance)
41
+ * @example classifyPunctuality("2024-06-15T10:00:00Z", "2024-06-15T10:00:00Z", { late: "PT15M", early: "PT0S" }) // "early" (exactly on the plan is on the early boundary, which is outside)
42
+ * @example classifyPunctuality("2024-11-03T01:30:00-04:00[America/New_York]", "2024-11-03T01:30:00-05:00[America/New_York]", { late: "PT15M" }) // "late" (the same wall time an hour later, across the fall-back)
43
+ * @example classifyPunctuality("2024-06-15T10:00:00Z", "2024-06-15T10:14:00Z", { late: "-PT15M" }) // null (a negative tolerance)
44
+ * @example classifyPunctuality("2024-06-15T10:00:00Z", "2024-06-15T10:14:00Z", { late: "P1W" }) // null (weeks need a reference point)
45
+ */
46
+ export declare function classifyPunctuality(planned: string, actual: string, tolerance: PunctualityTolerance): Punctuality | null;
@@ -0,0 +1,64 @@
1
+ import { parseInstantNanoseconds, parsePunctualityTolerance, punctualityOf, } from "../../internal/index.js";
2
+ /**
3
+ * Classify an arrival as early, on time or late against the caller's tolerance.
4
+ *
5
+ * "On time" without a stated tolerance is not a measurement, and the tolerance differs by mode:
6
+ * a 15-minute tolerance (`{ late: "PT15M" }`), a 60/120-minute pair compared side by side, or a
7
+ * day-based one (`{ late: "P1D", early: "P1D" }`). GMT holds no default; the caller states it.
8
+ *
9
+ * - The deviation is `scheduleDeviation`'s: `actual` minus `planned` in exact elapsed time, so a
10
+ * delay across a DST transition is measured in real minutes, never wall-clock ones.
11
+ * - **Late** when the deviation is `late` or more: exactly 15 minutes against `PT15M` is late.
12
+ * - **Early** when `early` is given and the deviation is `-early` or less: exactly 10 minutes
13
+ * early against `PT10M` is early.
14
+ * - **On time** only strictly inside the tolerance: after `-early` (when given) and before
15
+ * `late`. Both boundaries belong to the outside. This convention is GMT's own, stated here, not
16
+ * a reading of any rule.
17
+ * - **Without `early`, every early arrival is on time.** `early: undefined` is the same as
18
+ * leaving it out; `early: null` is invalid.
19
+ * - `late: "PT0S"` leaves no on-time window after the plan: an arrival exactly on the plan is
20
+ * late. `early: "PT0S"` leaves none before it: an arrival exactly on the plan is early (with a
21
+ * non-zero `late`), because both boundaries are outside the on-time window. With both at
22
+ * `"PT0S"`, nothing is on time; late is checked first, so the plan itself is late.
23
+ * - Tolerances are exact durations: a day is 24 hours; years, months and weeks return `null`, as
24
+ * does a negative tolerance (`-PT0S` is zero).
25
+ * - Both times are an instant (`Z`/offset) or a zoned string, read as `scheduleDeviation` reads
26
+ * them: the offset fixes the instant, and an offset written to the minute that is the
27
+ * bracketed zone's sub-minute offset rounded (`-00:45[Africa/Monrovia]`, for −00:44:30) names
28
+ * the instant the zone gives. Otherwise the bracket is not checked.
29
+ * - Returns `null` on invalid input.
30
+ *
31
+ * @param planned ISO 8601 instant or zoned datetime string of the planned time
32
+ * @param actual ISO 8601 instant or zoned datetime string of the actual time
33
+ * @param tolerance late (required) and early (optional) tolerances as ISO 8601 durations of exact time
34
+ * @returns "early", "onTime" or "late", or null on invalid input
35
+ *
36
+ * @example classifyPunctuality("2024-06-15T10:00:00Z", "2024-06-15T10:14:59Z", { late: "PT15M" }) // "onTime"
37
+ * @example classifyPunctuality("2024-06-15T10:00:00Z", "2024-06-15T10:15:00Z", { late: "PT15M" }) // "late" (exactly the tolerance is late)
38
+ * @example classifyPunctuality("2024-06-15T10:00:00Z", "2024-06-15T08:00:00Z", { late: "PT15M" }) // "onTime" (without early, an early arrival is on time)
39
+ * @example classifyPunctuality("2024-06-15T10:00:00Z", "2024-06-15T09:49:00Z", { late: "PT15M", early: "PT10M" }) // "early"
40
+ * @example classifyPunctuality("2024-06-15T10:00:00Z", "2024-06-15T11:30:00Z", { late: "PT120M" }) // "onTime" (a 90-minute delay under a 120-minute tolerance)
41
+ * @example classifyPunctuality("2024-06-15T10:00:00Z", "2024-06-15T10:00:00Z", { late: "PT15M", early: "PT0S" }) // "early" (exactly on the plan is on the early boundary, which is outside)
42
+ * @example classifyPunctuality("2024-11-03T01:30:00-04:00[America/New_York]", "2024-11-03T01:30:00-05:00[America/New_York]", { late: "PT15M" }) // "late" (the same wall time an hour later, across the fall-back)
43
+ * @example classifyPunctuality("2024-06-15T10:00:00Z", "2024-06-15T10:14:00Z", { late: "-PT15M" }) // null (a negative tolerance)
44
+ * @example classifyPunctuality("2024-06-15T10:00:00Z", "2024-06-15T10:14:00Z", { late: "P1W" }) // null (weeks need a reference point)
45
+ */
46
+ export function classifyPunctuality(planned, actual, tolerance) {
47
+ try {
48
+ const bounds = parsePunctualityTolerance(tolerance);
49
+ if (bounds === null) {
50
+ return null;
51
+ }
52
+ const plannedNanoseconds = parseInstantNanoseconds(planned);
53
+ const actualNanoseconds = parseInstantNanoseconds(actual);
54
+ if (plannedNanoseconds === null || actualNanoseconds === null) {
55
+ return null;
56
+ }
57
+ return punctualityOf(actualNanoseconds - plannedNanoseconds, bounds);
58
+ }
59
+ catch {
60
+ // Never throws (Core Rule 3): a hostile
61
+ // argument is invalid input, not an exception.
62
+ return null;
63
+ }
64
+ }
@@ -0,0 +1,4 @@
1
+ export * from "./classifyPunctuality.js";
2
+ export * from "./isPastCutoff.js";
3
+ export * from "./scheduleDeviation.js";
4
+ export * from "./timeToCutoff.js";
@@ -0,0 +1,4 @@
1
+ export * from "./classifyPunctuality.js";
2
+ export * from "./isPastCutoff.js";
3
+ export * from "./scheduleDeviation.js";
4
+ export * from "./timeToCutoff.js";
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Report whether a cut-off has passed.
3
+ *
4
+ * The window to meet a cut-off is half-open, `[…, cutoff)`: at the cut-off instant itself it
5
+ * has closed, so `now` equal to `cutoff` is past. This matches the half-open rule GMT's
6
+ * intervals follow, and `timeToCutoff`, which is `PT0S` there.
7
+ *
8
+ * - Both arguments are exact: an instant (`Z`/offset) or a zoned string, as `cutoffAt`
9
+ * returns one. They are compared as instants, so the zone each is written in does not
10
+ * matter, and the two passes of a repeated hour are told apart by their offsets.
11
+ * - **The offset fixes the instant; a bracketed zone only resolves a rounded one.** An offset
12
+ * written to the minute that is the bracketed zone's sub-minute offset rounded
13
+ * (`-00:45[Africa/Monrovia]`, for −00:44:30) names the instant the zone gives, as
14
+ * `Temporal.ZonedDateTime.from` reads it, so a cut-off `cutoffAt` wrote is the instant it
15
+ * computed, except a wall time repeated inside a sub-minute offset change, which reads as
16
+ * its first pass (see `isValidInstant`). Otherwise the bracket is not checked: a zone that does not exist, or that
17
+ * disagrees with the offset, changes nothing.
18
+ * - `now` is the caller's: GMT does not read the clock here, so the answer is reproducible.
19
+ * - Returns `false` on invalid input, including `cutoffAt`'s `""` sentinel — which reads as
20
+ * "not past". Check the cut-off is not `""` before trusting a `false`.
21
+ *
22
+ * @param now ISO 8601 instant or zoned datetime string of the moment asked about
23
+ * @param cutoff ISO 8601 instant or zoned datetime string of the cut-off
24
+ * @returns true when now is at or after the cut-off, false otherwise or on invalid input
25
+ *
26
+ * @example isPastCutoff("2024-06-12T16:00:00Z", "2024-06-12T17:00:00+02:00[Europe/Amsterdam]") // true
27
+ * @example isPastCutoff("2024-06-12T14:00:00Z", "2024-06-12T17:00:00+02:00[Europe/Amsterdam]") // false
28
+ * @example isPastCutoff("2024-06-12T15:00:00Z", "2024-06-12T17:00:00+02:00[Europe/Amsterdam]") // true (at the cut-off, the window has closed)
29
+ * @example isPastCutoff("2024-11-03T01:30:00-05:00[America/New_York]", "2024-11-03T01:30:00-04:00[America/New_York]") // true (the second 01:30 is an hour after the first)
30
+ * @example isPastCutoff("2024-06-12T16:00:00", "2024-06-12T17:00:00+02:00[Europe/Amsterdam]") // false (a zoneless now is not a moment)
31
+ * @example isPastCutoff("2024-06-12T16:00:00Z", "") // false
32
+ */
33
+ export declare function isPastCutoff(now: string, cutoff: string): boolean;