@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,75 @@
1
+ import { formatHourDuration, isOptionsArgument, nonNegativeExactDurationNanoseconds, parseTimestampEvents, } from "../../internal/index.js";
2
+ /**
3
+ * Measure how far an estimate moved between its first and last revision.
4
+ *
5
+ * Schedule-reliability reporting asks how much an estimated arrival slid while it was being
6
+ * revised, and a revision far enough from the first estimate means something must be redone:
7
+ * rebooked, re-planned, renotified. The threshold is the caller's; the consequence is the
8
+ * consumer's.
9
+ *
10
+ * - Only `EST` records are read, in the order they were recorded (`recordedAt`). Two records at
11
+ * the same instant are ordered by their place in the array, the later one last — the same tie
12
+ * rule as `bestAvailable`. `PLN`, `REQ` and `ACT` records are validated and otherwise ignored.
13
+ * - `revisions` is the number of EST records, the first included.
14
+ * - `drift` is the last EST's `at` minus the first's, in exact elapsed time with hours as the
15
+ * largest unit: positive when the estimate moved later, negative when earlier. Across a
16
+ * fall-back night, 01:30 EDT to 01:30 EST is `PT1H`.
17
+ * - With `tolerance`, `exceedsTolerance` is `true` when the drift, in either direction, is
18
+ * **greater** than the tolerance; exactly the tolerance is `false`. Without it, `null`.
19
+ * - `first` and `last` echo `at` exactly as written; both are instants (`Z`/offset) or zoned
20
+ * strings compared as instants, read as `scheduleDeviation` reads them: the offset fixes the
21
+ * instant, and an offset written to the minute that is the bracketed zone's sub-minute offset
22
+ * rounded (`-00:45[Africa/Monrovia]`, for −00:44:30) names the instant the zone gives.
23
+ * Otherwise the bracket is not checked.
24
+ * - Returns `null` with fewer than two EST records — there is no drift from one sample — and on
25
+ * invalid input: any invalid event, of any class, or an invalid, negative or calendar-unit
26
+ * `tolerance`.
27
+ *
28
+ * @param events the event's timestamp records, in any order
29
+ * @param options The threshold the absolute drift is compared with
30
+ * @returns the first and last estimates, the drift, the revision count and the tolerance check (null with fewer than two EST records), or null on invalid input
31
+ *
32
+ * @example estimateDrift([{ classifier: "EST", at: "2024-06-20T08:00:00Z", recordedAt: "2024-06-01T00:00:00Z" }, { classifier: "EST", at: "2024-06-20T12:00:00Z", recordedAt: "2024-06-05T00:00:00Z" }, { classifier: "EST", at: "2024-06-20T17:00:00Z", recordedAt: "2024-06-10T00:00:00Z" }]) // { first: "2024-06-20T08:00:00Z", last: "2024-06-20T17:00:00Z", drift: "PT9H", revisions: 3, exceedsTolerance: null }
33
+ * @example estimateDrift([{ classifier: "EST", at: "2024-06-20T17:00:00Z", recordedAt: "2024-06-01T00:00:00Z" }, { classifier: "EST", at: "2024-06-20T08:00:00Z", recordedAt: "2024-06-10T00:00:00Z" }], { tolerance: "PT8H" }) // { first: "2024-06-20T17:00:00Z", last: "2024-06-20T08:00:00Z", drift: "-PT9H", revisions: 2, exceedsTolerance: true } (nine hours earlier exceeds eight)
34
+ * @example estimateDrift([{ classifier: "EST", at: "2024-06-20T08:00:00Z", recordedAt: "2024-06-01T00:00:00Z" }, { classifier: "EST", at: "2024-06-20T15:00:00Z", recordedAt: "2024-06-10T00:00:00Z" }], { tolerance: "PT8H" }) // { first: "2024-06-20T08:00:00Z", last: "2024-06-20T15:00:00Z", drift: "PT7H", revisions: 2, exceedsTolerance: false }
35
+ * @example estimateDrift([{ classifier: "EST", at: "2024-06-20T08:00:00Z", recordedAt: "2024-06-01T00:00:00Z" }]) // null (no drift from one sample)
36
+ * @example estimateDrift([{ classifier: "EST", at: "2024-06-20T08:00:00Z", recordedAt: "2024-06-01T00:00:00Z" }, { classifier: "EST", at: "2024-06-20T15:00:00Z", recordedAt: "2024-06-10T00:00:00Z" }], { tolerance: "P1W" }) // null (weeks need a reference point)
37
+ */
38
+ export function estimateDrift(events, options) {
39
+ try {
40
+ if (!isOptionsArgument(options)) {
41
+ return null;
42
+ }
43
+ const tolerance = options?.tolerance;
44
+ const toleranceNanoseconds = tolerance === undefined
45
+ ? null
46
+ : nonNegativeExactDurationNanoseconds(tolerance);
47
+ if (tolerance !== undefined && toleranceNanoseconds === null) {
48
+ return null;
49
+ }
50
+ const parsed = parseTimestampEvents(events);
51
+ if (parsed === null) {
52
+ return null;
53
+ }
54
+ const estimates = parsed.filter((event) => event.classifier === "EST");
55
+ const first = estimates[0];
56
+ const last = estimates[estimates.length - 1];
57
+ if (estimates.length < 2 || first === undefined || last === undefined) {
58
+ return null;
59
+ }
60
+ const drift = last.atNanoseconds - first.atNanoseconds;
61
+ const magnitude = drift < 0n ? -drift : drift;
62
+ return {
63
+ first: first.at,
64
+ last: last.at,
65
+ drift: `${drift < 0n ? "-" : ""}${formatHourDuration(magnitude)}`,
66
+ revisions: estimates.length,
67
+ exceedsTolerance: toleranceNanoseconds === null ? null : magnitude > toleranceNanoseconds,
68
+ };
69
+ }
70
+ catch {
71
+ // Never throws (Core Rule 3): a hostile
72
+ // argument is invalid input, not an exception.
73
+ return null;
74
+ }
75
+ }
@@ -0,0 +1,10 @@
1
+ export * from "./bestAvailable.js";
2
+ export * from "./crossingTime.js";
3
+ export * from "./cutoffAt.js";
4
+ export * from "./cutoffSchedule.js";
5
+ export * from "./dwellTime.js";
6
+ export * from "./estimateDrift.js";
7
+ export * from "./nextDeparture.js";
8
+ export * from "./punctualityRate.js";
9
+ export * from "./scheduleDelivery.js";
10
+ export * from "./transitTime.js";
@@ -0,0 +1,10 @@
1
+ export * from "./bestAvailable.js";
2
+ export * from "./crossingTime.js";
3
+ export * from "./cutoffAt.js";
4
+ export * from "./cutoffSchedule.js";
5
+ export * from "./dwellTime.js";
6
+ export * from "./estimateDrift.js";
7
+ export * from "./nextDeparture.js";
8
+ export * from "./punctualityRate.js";
9
+ export * from "./scheduleDelivery.js";
10
+ export * from "./transitTime.js";
@@ -0,0 +1,78 @@
1
+ /**
2
+ * A headway service: a departure every `headway` from `from`, up to (not including) `to` — the
3
+ * shape of a GTFS `frequencies.txt` row (`headway_secs`, `start_time`, `end_time`; GTFS Schedule
4
+ * Reference, https://github.com/google/transit/blob/master/gtfs/spec/en/reference.md#frequenciestxt).
5
+ *
6
+ * The departures are modelled as GTFS `exact_times=1` (schedule-based): each `from + k × headway`
7
+ * is a real departure. For a frequency-based service (`exact_times=0`, "a bus every 20 minutes"
8
+ * with no published times) the result is a nominal slot, not a timetabled departure.
9
+ */
10
+ export interface Headway {
11
+ /**
12
+ * The ISO 8601 duration between departures: exact time (a day is 24 hours), greater than zero.
13
+ */
14
+ headway: string;
15
+ /** The first departure, an exact moment: an instant (`Z`/offset) or a zoned string. */
16
+ from: string;
17
+ /** The end of the service window, excluded: an exact moment after `from`. */
18
+ to: string;
19
+ }
20
+ /** Options for `nextDeparture`. */
21
+ export interface NextDepartureOptions {
22
+ /**
23
+ * The ISO 8601 duration the connection needs after `after` before a departure can be made:
24
+ * exact time (a day is 24 hours), not negative.
25
+ *
26
+ * @defaultValue `"PT0S"`
27
+ */
28
+ minimumConnection?: string;
29
+ }
30
+ /**
31
+ * Find the next departure a connection can make: the first scheduled departure at or after
32
+ * `after` plus the minimum connection time.
33
+ *
34
+ * This is timetable lookup, not routing: it answers "which departure does this arrival make",
35
+ * the explicit `departure` a `scheduleDelivery` leg takes. Choosing among routes is the
36
+ * consumer's.
37
+ *
38
+ * - **The threshold is `after` plus `minimumConnection`, in exact time.** A departure exactly at
39
+ * the threshold is made: a zero-slack connection is feasible, as in `scheduleDelivery`. The
40
+ * connection follows `transitTime`'s duration rule (a day is 24 hours; years, months and weeks
41
+ * return `""`) and may not be negative.
42
+ * - **List form** (`string[]`): the earliest entry at or after the threshold, in any order. Two
43
+ * entries at the same instant go to the first in the list. The entry is returned **exactly as
44
+ * written**, so it can be passed straight to `scheduleDelivery` as a leg's `departure`. An empty
45
+ * list, or no entry late enough, returns `""`.
46
+ * - **Headway form** (`{ headway, from, to }`): departures every `headway` from `from`, in the
47
+ * half-open window `[from, to)` — `to` itself is never a departure, as a GTFS
48
+ * `frequencies.txt` `end_time` is not. Departures are `from + k × headway` in exact time, so
49
+ * across a DST transition they keep their spacing and the wall clock shifts. The result is
50
+ * written the way `from` was written: in its zone, at its offset exactly as written, or as a
51
+ * `Z` instant. A headway that is not greater than zero, or `to` at or before `from`, returns
52
+ * `""`, as does a threshold past the last departure. This models GTFS `exact_times=1`
53
+ * (schedule-based) service; for frequency-based service (`exact_times=0`) the result is a
54
+ * nominal slot, not a timetabled departure.
55
+ * - **Every moment must carry its offset** — `after`, each entry, `from` and `to`: an instant
56
+ * (`Z`/offset), or a zoned string with its offset, whose bracketed zone must be real and agree
57
+ * with that offset, as `transitTime` reads a departure. A zoned wall time without an offset is
58
+ * refused, since in a repeated fall-back hour it names two departures, and a zoneless wall time
59
+ * names none; both return `""`. One invalid entry invalidates the whole list, never a partial
60
+ * answer.
61
+ * - Returns `""` on invalid input or when no departure qualifies.
62
+ *
63
+ * @param after ISO 8601 instant or zoned datetime string of the arrival that must connect
64
+ * @param timetable the departures as exact moments, or a headway service `{ headway, from, to }`
65
+ * @param options The connection time needed before a departure can be made
66
+ * @returns the departure (a list entry as written, or a headway departure in from's notation; "" when none qualifies), or "" on invalid input
67
+ *
68
+ * @example nextDeparture("2024-06-15T09:00:00Z", ["2024-06-15T08:00:00Z", "2024-06-15T09:30:00Z", "2024-06-15T11:00:00Z"]) // "2024-06-15T09:30:00Z"
69
+ * @example nextDeparture("2024-06-15T09:00:00Z", ["2024-06-15T08:00:00Z", "2024-06-15T09:30:00Z", "2024-06-15T11:00:00Z"], { minimumConnection: "PT45M" }) // "2024-06-15T11:00:00Z" (a 45-minute connection misses the 09:30)
70
+ * @example nextDeparture("2024-06-15T09:00:00Z", ["2024-06-15T05:30:00-04:00[America/New_York]"]) // "2024-06-15T05:30:00-04:00[America/New_York]" (echoed as written)
71
+ * @example nextDeparture("2024-06-15T06:05:00+02:00", { headway: "PT20M", from: "2024-06-15T06:00:00+02:00", to: "2024-06-15T09:00:00+02:00" }) // "2024-06-15T06:20:00+02:00"
72
+ * @example nextDeparture("2024-06-15T09:00:00+02:00", { headway: "PT20M", from: "2024-06-15T06:00:00+02:00", to: "2024-06-15T09:00:00+02:00" }) // "" (to is excluded)
73
+ * @example nextDeparture("2024-11-03T01:30:00-04:00[America/New_York]", { headway: "PT1H", from: "2024-11-03T00:00:00-04:00[America/New_York]", to: "2024-11-03T04:00:00-05:00[America/New_York]" }) // "2024-11-03T01:00:00-05:00[America/New_York]" (hourly in exact time: the repeated hour's second pass)
74
+ * @example nextDeparture("2024-06-15T09:00:00Z", ["2024-06-15T09:30:00"]) // "" (a timetable entry needs an offset)
75
+ * @example nextDeparture("2024-06-15T09:00:00Z", ["2024-06-15T09:30:00[Europe/London]"]) // "" (a zoned entry needs its offset too)
76
+ * @example nextDeparture("2024-06-15T09:00:00Z", ["2024-06-15T09:30:00Z"], { minimumConnection: "-PT5M" }) // "" (a negative connection)
77
+ */
78
+ export declare function nextDeparture(after: string, timetable: readonly string[] | Headway, options?: NextDepartureOptions): string;
@@ -0,0 +1,131 @@
1
+ import { exactDurationNanoseconds, isObject, isOptionsArgument, nonNegativeExactDurationNanoseconds, readExactMoment, writeExactMoment, } from "../../internal/index.js";
2
+ import { hasInstantShape } from "../../internal/isoStringBody.js";
3
+ /**
4
+ * A moment that carries its own offset (`Z`, `±HH:MM`, or a zoned string with one), read as
5
+ * `transitTime` reads a departure, or `null`. A zoned wall time without an offset is refused: in
6
+ * a repeated hour it names two instants, and a timetable must say which.
7
+ */
8
+ function readTimetableMoment(value) {
9
+ return typeof value === "string" && hasInstantShape(value)
10
+ ? readExactMoment(value)
11
+ : null;
12
+ }
13
+ /** The earliest entry at or after `threshold`, echoed as written; `""` when none, or one is invalid. */
14
+ function listDeparture(threshold, entries) {
15
+ let best = null;
16
+ for (const entry of entries) {
17
+ const moment = readTimetableMoment(entry);
18
+ if (moment === null) {
19
+ return "";
20
+ }
21
+ // Strictly earlier replaces, so of two entries at the same instant the first is kept.
22
+ if (moment.nanoseconds >= threshold &&
23
+ (best === null || moment.nanoseconds < best.nanoseconds)) {
24
+ best = { entry: entry, nanoseconds: moment.nanoseconds };
25
+ }
26
+ }
27
+ return best === null ? "" : best.entry;
28
+ }
29
+ /**
30
+ * The first `from + k × headway` at or after `threshold` and before `to`, written the way `from`
31
+ * was written; `""` when none. Computed, never stepped: `k` is the ceiling of the distance over
32
+ * the headway, in bigint nanoseconds, so a long window costs nothing and every candidate is
33
+ * before `to`, inside the instant range.
34
+ */
35
+ function headwayDeparture(threshold, service) {
36
+ const { headway, from, to } = service;
37
+ const step = exactDurationNanoseconds(headway);
38
+ const start = readTimetableMoment(from);
39
+ const end = readTimetableMoment(to);
40
+ if (step === null ||
41
+ step <= 0n ||
42
+ start === null ||
43
+ end === null ||
44
+ start.nanoseconds >= end.nanoseconds) {
45
+ return "";
46
+ }
47
+ const behind = threshold - start.nanoseconds;
48
+ const steps = behind <= 0n ? 0n : (behind + step - 1n) / step;
49
+ const departure = start.nanoseconds + steps * step;
50
+ return departure < end.nanoseconds
51
+ ? writeExactMoment(departure, start.notation)
52
+ : "";
53
+ }
54
+ /**
55
+ * Find the next departure a connection can make: the first scheduled departure at or after
56
+ * `after` plus the minimum connection time.
57
+ *
58
+ * This is timetable lookup, not routing: it answers "which departure does this arrival make",
59
+ * the explicit `departure` a `scheduleDelivery` leg takes. Choosing among routes is the
60
+ * consumer's.
61
+ *
62
+ * - **The threshold is `after` plus `minimumConnection`, in exact time.** A departure exactly at
63
+ * the threshold is made: a zero-slack connection is feasible, as in `scheduleDelivery`. The
64
+ * connection follows `transitTime`'s duration rule (a day is 24 hours; years, months and weeks
65
+ * return `""`) and may not be negative.
66
+ * - **List form** (`string[]`): the earliest entry at or after the threshold, in any order. Two
67
+ * entries at the same instant go to the first in the list. The entry is returned **exactly as
68
+ * written**, so it can be passed straight to `scheduleDelivery` as a leg's `departure`. An empty
69
+ * list, or no entry late enough, returns `""`.
70
+ * - **Headway form** (`{ headway, from, to }`): departures every `headway` from `from`, in the
71
+ * half-open window `[from, to)` — `to` itself is never a departure, as a GTFS
72
+ * `frequencies.txt` `end_time` is not. Departures are `from + k × headway` in exact time, so
73
+ * across a DST transition they keep their spacing and the wall clock shifts. The result is
74
+ * written the way `from` was written: in its zone, at its offset exactly as written, or as a
75
+ * `Z` instant. A headway that is not greater than zero, or `to` at or before `from`, returns
76
+ * `""`, as does a threshold past the last departure. This models GTFS `exact_times=1`
77
+ * (schedule-based) service; for frequency-based service (`exact_times=0`) the result is a
78
+ * nominal slot, not a timetabled departure.
79
+ * - **Every moment must carry its offset** — `after`, each entry, `from` and `to`: an instant
80
+ * (`Z`/offset), or a zoned string with its offset, whose bracketed zone must be real and agree
81
+ * with that offset, as `transitTime` reads a departure. A zoned wall time without an offset is
82
+ * refused, since in a repeated fall-back hour it names two departures, and a zoneless wall time
83
+ * names none; both return `""`. One invalid entry invalidates the whole list, never a partial
84
+ * answer.
85
+ * - Returns `""` on invalid input or when no departure qualifies.
86
+ *
87
+ * @param after ISO 8601 instant or zoned datetime string of the arrival that must connect
88
+ * @param timetable the departures as exact moments, or a headway service `{ headway, from, to }`
89
+ * @param options The connection time needed before a departure can be made
90
+ * @returns the departure (a list entry as written, or a headway departure in from's notation; "" when none qualifies), or "" on invalid input
91
+ *
92
+ * @example nextDeparture("2024-06-15T09:00:00Z", ["2024-06-15T08:00:00Z", "2024-06-15T09:30:00Z", "2024-06-15T11:00:00Z"]) // "2024-06-15T09:30:00Z"
93
+ * @example nextDeparture("2024-06-15T09:00:00Z", ["2024-06-15T08:00:00Z", "2024-06-15T09:30:00Z", "2024-06-15T11:00:00Z"], { minimumConnection: "PT45M" }) // "2024-06-15T11:00:00Z" (a 45-minute connection misses the 09:30)
94
+ * @example nextDeparture("2024-06-15T09:00:00Z", ["2024-06-15T05:30:00-04:00[America/New_York]"]) // "2024-06-15T05:30:00-04:00[America/New_York]" (echoed as written)
95
+ * @example nextDeparture("2024-06-15T06:05:00+02:00", { headway: "PT20M", from: "2024-06-15T06:00:00+02:00", to: "2024-06-15T09:00:00+02:00" }) // "2024-06-15T06:20:00+02:00"
96
+ * @example nextDeparture("2024-06-15T09:00:00+02:00", { headway: "PT20M", from: "2024-06-15T06:00:00+02:00", to: "2024-06-15T09:00:00+02:00" }) // "" (to is excluded)
97
+ * @example nextDeparture("2024-11-03T01:30:00-04:00[America/New_York]", { headway: "PT1H", from: "2024-11-03T00:00:00-04:00[America/New_York]", to: "2024-11-03T04:00:00-05:00[America/New_York]" }) // "2024-11-03T01:00:00-05:00[America/New_York]" (hourly in exact time: the repeated hour's second pass)
98
+ * @example nextDeparture("2024-06-15T09:00:00Z", ["2024-06-15T09:30:00"]) // "" (a timetable entry needs an offset)
99
+ * @example nextDeparture("2024-06-15T09:00:00Z", ["2024-06-15T09:30:00[Europe/London]"]) // "" (a zoned entry needs its offset too)
100
+ * @example nextDeparture("2024-06-15T09:00:00Z", ["2024-06-15T09:30:00Z"], { minimumConnection: "-PT5M" }) // "" (a negative connection)
101
+ */
102
+ export function nextDeparture(after, timetable, options) {
103
+ try {
104
+ if (!isOptionsArgument(options)) {
105
+ return "";
106
+ }
107
+ const connection = options?.minimumConnection;
108
+ const connectionNanoseconds = connection === undefined
109
+ ? 0n
110
+ : nonNegativeExactDurationNanoseconds(connection);
111
+ if (connectionNanoseconds === null) {
112
+ return "";
113
+ }
114
+ const arrival = readTimetableMoment(after);
115
+ if (arrival === null) {
116
+ return "";
117
+ }
118
+ const threshold = arrival.nanoseconds + connectionNanoseconds;
119
+ if (Array.isArray(timetable)) {
120
+ return listDeparture(threshold, timetable);
121
+ }
122
+ return isObject(timetable)
123
+ ? headwayDeparture(threshold, timetable)
124
+ : "";
125
+ }
126
+ catch {
127
+ // Never throws (Core Rule 3): a hostile
128
+ // argument is invalid input, not an exception.
129
+ return "";
130
+ }
131
+ }
@@ -0,0 +1,42 @@
1
+ import type { PunctualityTolerance } from "../../types/index.js";
2
+ /** One planned/actual pair for `punctualityRate`. */
3
+ export interface PlannedActual {
4
+ /** The planned time, as an ISO 8601 instant or zoned datetime string. */
5
+ planned: string;
6
+ /** The actual time, as an ISO 8601 instant or zoned datetime string. */
7
+ actual: string;
8
+ }
9
+ /** What `punctualityRate` returns: the on-time count, the total, and their ratio. */
10
+ export interface OnTimeRate {
11
+ /** The number of pairs `classifyPunctuality` calls `"onTime"`. */
12
+ onTime: number;
13
+ /** Every pair counted. */
14
+ total: number;
15
+ /** The on-time share, `onTime / total`, from 0 to 1. */
16
+ rate: number;
17
+ }
18
+ /**
19
+ * The share of planned/actual pairs that were on time under one tolerance.
20
+ *
21
+ * A rate is a count under a stated tolerance: the same arrivals give a different rate under a
22
+ * 60-minute tolerance than under a 120-minute one, so the tolerance travels with the number.
23
+ *
24
+ * - Each pair is classified by `classifyPunctuality`'s rule under the same tolerance: `late` and
25
+ * `early` are read once, before any pair, so the whole list is judged under one tolerance.
26
+ * Only `"onTime"` counts: with an `early` tolerance, an early arrival is **not** on time;
27
+ * without one, it is.
28
+ * - `rate` is `onTime / total` as a plain number (`0.75`), not rounded.
29
+ * - Every pair must be valid: one invalid pair returns `null`, never a rate over the rest.
30
+ * - An empty list returns `null`: no arrivals have no rate.
31
+ * - Anything beyond a rate — percentiles, causes — is the consumer's.
32
+ *
33
+ * @param pairs the planned and actual time of each arrival
34
+ * @param tolerance late (required) and early (optional) tolerances, as classifyPunctuality takes them
35
+ * @returns the on-time count, the total and the rate (null for an empty list), or null on invalid input
36
+ *
37
+ * @example punctualityRate([{ planned: "2024-06-15T10:00:00Z", actual: "2024-06-15T10:05:00Z" }, { planned: "2024-06-15T10:00:00Z", actual: "2024-06-15T10:14:00Z" }, { planned: "2024-06-15T10:00:00Z", actual: "2024-06-15T10:16:00Z" }, { planned: "2024-06-15T10:00:00Z", actual: "2024-06-15T09:57:00Z" }], { late: "PT15M" }) // { onTime: 3, total: 4, rate: 0.75 }
38
+ * @example punctualityRate([{ planned: "2024-06-15T10:00:00Z", actual: "2024-06-15T09:48:00Z" }, { planned: "2024-06-15T10:00:00Z", actual: "2024-06-15T10:01:00Z" }], { late: "PT15M", early: "PT10M" }) // { onTime: 1, total: 2, rate: 0.5 } (12 minutes early is not on time under a 10-minute early tolerance)
39
+ * @example punctualityRate([], { late: "PT15M" }) // null
40
+ * @example punctualityRate([{ planned: "2024-06-15T10:00:00Z", actual: "2024-06-15T10:05:00" }], { late: "PT15M" }) // null (a zoneless actual is not a moment)
41
+ */
42
+ export declare function punctualityRate(pairs: PlannedActual[], tolerance: PunctualityTolerance): OnTimeRate | null;
@@ -0,0 +1,59 @@
1
+ import { isObject, parseInstantNanoseconds, parsePunctualityTolerance, punctualityOf, } from "../../internal/index.js";
2
+ /**
3
+ * The share of planned/actual pairs that were on time under one tolerance.
4
+ *
5
+ * A rate is a count under a stated tolerance: the same arrivals give a different rate under a
6
+ * 60-minute tolerance than under a 120-minute one, so the tolerance travels with the number.
7
+ *
8
+ * - Each pair is classified by `classifyPunctuality`'s rule under the same tolerance: `late` and
9
+ * `early` are read once, before any pair, so the whole list is judged under one tolerance.
10
+ * Only `"onTime"` counts: with an `early` tolerance, an early arrival is **not** on time;
11
+ * without one, it is.
12
+ * - `rate` is `onTime / total` as a plain number (`0.75`), not rounded.
13
+ * - Every pair must be valid: one invalid pair returns `null`, never a rate over the rest.
14
+ * - An empty list returns `null`: no arrivals have no rate.
15
+ * - Anything beyond a rate — percentiles, causes — is the consumer's.
16
+ *
17
+ * @param pairs the planned and actual time of each arrival
18
+ * @param tolerance late (required) and early (optional) tolerances, as classifyPunctuality takes them
19
+ * @returns the on-time count, the total and the rate (null for an empty list), or null on invalid input
20
+ *
21
+ * @example punctualityRate([{ planned: "2024-06-15T10:00:00Z", actual: "2024-06-15T10:05:00Z" }, { planned: "2024-06-15T10:00:00Z", actual: "2024-06-15T10:14:00Z" }, { planned: "2024-06-15T10:00:00Z", actual: "2024-06-15T10:16:00Z" }, { planned: "2024-06-15T10:00:00Z", actual: "2024-06-15T09:57:00Z" }], { late: "PT15M" }) // { onTime: 3, total: 4, rate: 0.75 }
22
+ * @example punctualityRate([{ planned: "2024-06-15T10:00:00Z", actual: "2024-06-15T09:48:00Z" }, { planned: "2024-06-15T10:00:00Z", actual: "2024-06-15T10:01:00Z" }], { late: "PT15M", early: "PT10M" }) // { onTime: 1, total: 2, rate: 0.5 } (12 minutes early is not on time under a 10-minute early tolerance)
23
+ * @example punctualityRate([], { late: "PT15M" }) // null
24
+ * @example punctualityRate([{ planned: "2024-06-15T10:00:00Z", actual: "2024-06-15T10:05:00" }], { late: "PT15M" }) // null (a zoneless actual is not a moment)
25
+ */
26
+ export function punctualityRate(pairs, tolerance) {
27
+ try {
28
+ if (!Array.isArray(pairs) || pairs.length === 0) {
29
+ return null;
30
+ }
31
+ // Read once: every pair is judged under the same tolerance, whatever a getter returns later.
32
+ const bounds = parsePunctualityTolerance(tolerance);
33
+ if (bounds === null) {
34
+ return null;
35
+ }
36
+ let onTime = 0;
37
+ for (const pair of pairs) {
38
+ if (!isObject(pair)) {
39
+ return null;
40
+ }
41
+ const { planned, actual } = pair;
42
+ const plannedNanoseconds = parseInstantNanoseconds(planned);
43
+ const actualNanoseconds = parseInstantNanoseconds(actual);
44
+ if (plannedNanoseconds === null || actualNanoseconds === null) {
45
+ return null;
46
+ }
47
+ if (punctualityOf(actualNanoseconds - plannedNanoseconds, bounds) ===
48
+ "onTime") {
49
+ onTime += 1;
50
+ }
51
+ }
52
+ return { onTime, total: pairs.length, rate: onTime / pairs.length };
53
+ }
54
+ catch {
55
+ // Never throws (Core Rule 3): a hostile
56
+ // argument is invalid input, not an exception.
57
+ return null;
58
+ }
59
+ }
@@ -0,0 +1,150 @@
1
+ /** One leg of a multi-modal journey: a departure, how long it takes, and where it lands. */
2
+ export interface Leg {
3
+ /**
4
+ * The departure: an instant (`Z`/offset) or a zoned string, always exact; on any leg but the
5
+ * first, a zoneless wall time is also accepted and is read in the previous leg's `timeZone`
6
+ * (the first leg's equivalent is `ScheduleDeliveryOptions.startTimeZone`). Required on the
7
+ * first leg; on later legs it is the scheduled connection the cargo waits for.
8
+ *
9
+ * @defaultValue None. The leg leaves as soon as the previous leg's arrival plus its
10
+ * `dwellAfter` allows; a first leg without it is invalid input.
11
+ */
12
+ departure?: string;
13
+ /** The ISO 8601 duration of the leg; time units and 24-hour days only (`transitTime`'s rule). */
14
+ duration: string;
15
+ /** The time zone of the destination, the caller's fact: an IANA name or a UTC offset. */
16
+ timeZone: string;
17
+ /**
18
+ * The handling time at the handoff after this leg; the minimum connect time.
19
+ *
20
+ * @defaultValue `"PT0S"`
21
+ */
22
+ dwellAfter?: string;
23
+ /**
24
+ * An opaque tag echoed back on the LegTime; GMT does not interpret transport modes.
25
+ *
26
+ * @defaultValue None. The LegTime carries no `mode`.
27
+ */
28
+ mode?: string;
29
+ /**
30
+ * An opaque tag echoed back on the LegTime; never resolved to a zone.
31
+ *
32
+ * @defaultValue None. The LegTime carries no `origin`.
33
+ */
34
+ origin?: string;
35
+ /**
36
+ * An opaque tag echoed back on the LegTime; never resolved to a zone.
37
+ *
38
+ * @defaultValue None. The LegTime carries no `destination`.
39
+ */
40
+ destination?: string;
41
+ }
42
+ /** One leg's computed times, with the leg's own tags echoed back. */
43
+ export interface LegTime {
44
+ /** The arrival as a UTC instant (`Z` form) — every leg boundary is an exact instant. */
45
+ arrival: string;
46
+ /** The arrival rendered in the leg's `timeZone`, as `etaAtZone` renders it. */
47
+ localArrival: string;
48
+ /** The leg's `dwellAfter` echoed as written, `"PT0S"` when omitted. */
49
+ dwellAfter: string;
50
+ /** The leg's `mode`, echoed back; absent when the leg did not supply it. */
51
+ mode?: string;
52
+ /** The leg's `origin`, echoed back; absent when the leg did not supply it. */
53
+ origin?: string;
54
+ /** The leg's `destination`, echoed back; absent when the leg did not supply it. */
55
+ destination?: string;
56
+ }
57
+ /** Options for `scheduleDelivery`. */
58
+ export interface ScheduleDeliveryOptions {
59
+ /**
60
+ * The time zone a zoneless first-leg departure is read in, an IANA name or a UTC offset, for
61
+ * schedules published as local wall times. An ambiguous wall time resolves to the earlier instant
62
+ * and a nonexistent one to the later instant (`"compatible"`). Ignored when the first departure
63
+ * is already exact; never applied to later legs.
64
+ *
65
+ * @defaultValue None. A zoneless first-leg departure is invalid input.
66
+ */
67
+ startTimeZone?: string;
68
+ }
69
+ /** What `scheduleDelivery` returns: the final local ETA and every leg's times. */
70
+ export interface DeliverySchedule {
71
+ /** The last leg's `localArrival`. `""` only for an empty legs array. */
72
+ eta: string;
73
+ /** One `LegTime` per leg, in order. */
74
+ legTimes: LegTime[];
75
+ }
76
+ /**
77
+ * Chain the legs of a multi-modal move into an end-to-end ETA with zone-local times at every
78
+ * handoff.
79
+ *
80
+ * A truck→ship→rail move is published as one departure plus a duration per leg, and the hour
81
+ * naive implementations lose lives at the handoffs: every leg boundary here is an exact
82
+ * instant, and local rendering happens only at the edges, via `etaAtZone`.
83
+ *
84
+ * - **Each leg's arrival plus its `dwellAfter` is the next leg's departure** unless the next leg
85
+ * carries an explicit `departure` — a scheduled connection the cargo waits for. `dwellAfter`
86
+ * is the handling time at the handoff, the minimum connect time: a scheduled departure
87
+ * earlier than the previous arrival plus its dwell is a missed connection and returns `null`
88
+ * (equal passes — a zero-slack connection is feasible). It follows `transitTime`'s duration
89
+ * grammar, may not be negative, and is echoed on the `LegTime` exactly as written (`"PT90M"`
90
+ * stays `"PT90M"`), `"PT0S"` when omitted. The last leg's dwell moves nothing — there is no
91
+ * leg after it — so it is validated as a duration (no years, months or weeks, not negative)
92
+ * and echoed, but never added to an instant: it cannot turn a representable ETA into `null`.
93
+ * - **`departure` must be exact:** an instant (`Z`/offset) or a zoned string, whose bracketed
94
+ * zone is read and must be real and agree with its offset. The first leg requires one.
95
+ * - **`startTimeZone` resolves the first leg alone:** schedules are published as zone-local wall
96
+ * times, so a zoneless first-leg departure is read in `startTimeZone`. Zoneless without the
97
+ * option is `null`; the option is ignored when the departure is already exact; an invalid
98
+ * `startTimeZone` is `null` even when unused; it is never applied to a later leg — see the next
99
+ * rule for those.
100
+ * - **A later leg's zoneless departure is read in the previous leg's `timeZone`:** a real
101
+ * timetable publishes a local wall time at every hub, not just at origin, and leg N−1's
102
+ * `timeZone` is exactly leg N's departure zone. So a zoneless departure on any leg but the
103
+ * first is read there, with the same `"compatible"` disambiguation as `startTimeZone`. This is
104
+ * a separate, always-on mechanism — `startTimeZone` still names only the first leg's zone and
105
+ * cannot be used for a later one. The missed-connection check still runs after resolution, so a
106
+ * later zoneless departure that resolves earlier than the cursor is still `null`.
107
+ * - **Local-time resolution policy (`"compatible"`).** A zoned departure written without an
108
+ * offset (`"2024-11-03T01:30:00[America/New_York]"`), a zoneless first departure read in
109
+ * `startTimeZone`, and a zoneless later-leg departure read in the previous leg's `timeZone`
110
+ * are all wall times. An **ambiguous** wall time — a fall-back hour the clock ran through
111
+ * twice — resolves to the **earlier** instant; a **nonexistent** one — a spring-forward hour
112
+ * the clock skipped — resolves to the **later** instant. Write the offset to pick the other
113
+ * pass of a repeated hour.
114
+ * - **A repeated hour at a hub takes the pass the cargo can catch.** On any leg but the first, an
115
+ * ambiguous wall time resolves to the earliest pass at or after the previous arrival plus its
116
+ * dwell — a printed timetable never says which pass it means. When neither pass is that late,
117
+ * it resolves to the earlier pass as above, and the connection is missed. A skipped hour, and
118
+ * the first leg, which has no arrival to wait for, keep the rule above.
119
+ * - `duration` follows `transitTime`: time units are elapsed time, a day is exactly 24 hours,
120
+ * and calendar units (years, months, weeks) return `null`. `transitTime` accepts a negative
121
+ * duration (to recover a departure from an arrival), but a leg cannot arrive before it
122
+ * departs, so a negative leg is invalid input here and returns `null` (`-PT0S` is zero).
123
+ * - `mode`, `origin` and `destination` are opaque string tags echoed onto each `LegTime` and
124
+ * absent when not supplied; GMT does not resolve them to zones — `timeZone` is the caller's
125
+ * fact.
126
+ * - `eta` is the last leg's `localArrival`, so a single-leg schedule is exactly `transitTime`
127
+ * composed with `etaAtZone`.
128
+ * - An empty legs array is valid vacuous input and returns `{ eta: "", legTimes: [] }`;
129
+ * malformed input (a non-array, a non-object leg, an invalid field) returns `null`.
130
+ * - Returns `null` on invalid input.
131
+ *
132
+ * @param legs the journey's legs, in travel order
133
+ * @param options The zone a zoneless first-leg departure is read in
134
+ * @returns the final local ETA and each leg's arrival, local arrival and dwell, or null on invalid input
135
+ *
136
+ * @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" }] }
137
+ * @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)
138
+ * @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)
139
+ * @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)
140
+ * @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)
141
+ * @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)
142
+ * @example scheduleDelivery([]) // { eta: "", legTimes: [] }
143
+ * @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)
144
+ * @example scheduleDelivery([{ departure: "2024-06-15T10:00:00", duration: "PT1H", timeZone: "UTC" }]) // null (a zoneless departure without startTimeZone is not a moment)
145
+ * @example scheduleDelivery([{ departure: "2024-06-15T10:00:00Z", duration: "-PT1H", timeZone: "UTC" }]) // null (a leg cannot arrive before it departs)
146
+ * @example scheduleDelivery([{ duration: "PT1H", timeZone: "UTC" }]) // null (the first leg needs a departure)
147
+ * @example scheduleDelivery([{ departure: "2024-06-15T10:00:00Z", duration: "P1M", timeZone: "UTC" }]) // null (calendar units need a reference point)
148
+ * @example scheduleDelivery("legs") // null
149
+ */
150
+ export declare function scheduleDelivery(legs: Leg[], options?: ScheduleDeliveryOptions): DeliverySchedule | null;