@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,668 @@
1
+ import { Temporal } from "@js-temporal/polyfill";
2
+ import { resolveLocal } from "../instant/convert/resolveLocal.js";
3
+ import { isValidDate } from "../plain/validate/isValidDate.js";
4
+ import { isValidTime } from "../plain/validate/isValidTime.js";
5
+ import { isValidTimeZone } from "../zoned/validate/isValidTimeZone.js";
6
+ import { parseBusinessCalendar, parseHolidays } from "./businessCalendar.js";
7
+ import { coalesceIntervalNanoseconds, } from "./intervalNanoseconds.js";
8
+ import { isObject, isOptionsArgument } from "./isObject.js";
9
+ import { nextZonedBucketStart, zonedUnitStart } from "./zonedBucket.js";
10
+ const DISAMBIGUATIONS = [
11
+ "compatible",
12
+ "earlier",
13
+ "later",
14
+ "reject",
15
+ ];
16
+ const WEEKDAY_KEYS = ["1", "2", "3", "4", "5", "6", "7"];
17
+ /**
18
+ * Local dates a range may span, counted from the date its start falls on: about 27 years, the
19
+ * same bound `bucketRange` puts on a day walk. A walk that runs out answers with the sentinel,
20
+ * never a partial list.
21
+ */
22
+ export const MAX_SCHEDULE_DAYS = 10_000;
23
+ /**
24
+ * Day buckets one walk may step through: the lookback, the dates, the one date past them that
25
+ * settles the last, and the extra bucket a fall-back into the previous date opens. The date
26
+ * limit is the one that binds.
27
+ */
28
+ const MAX_SCHEDULE_BUCKETS = 2 * MAX_SCHEDULE_DAYS;
29
+ /**
30
+ * How far before the first instant of interest the walk starts, in nanoseconds (72 hours). A
31
+ * window is at most one local day of wall time, but a resolved edge can land a whole deleted day
32
+ * later (`Pacific/Apia` skipped 2011-12-30), so a window that started up to two days earlier can
33
+ * still be open. Three days clears that with room to spare.
34
+ */
35
+ const LOOKBACK_NANOSECONDS = 259200000000000n;
36
+ /** TC39 `nsMinInstant` and `nsMaxInstant`: ±10^8 days from the epoch. */
37
+ const MIN_INSTANT_NANOSECONDS = -8640000000000000000000n;
38
+ const MAX_INSTANT_NANOSECONDS = 8640000000000000000000n;
39
+ /**
40
+ * Where an edge whose wall time lies past Temporal's range resolves: just outside it. Such an
41
+ * edge has no string, so it is only ever clipped to a range or compared, never returned.
42
+ */
43
+ const PAST_LAST_INSTANT = MAX_INSTANT_NANOSECONDS + 1n;
44
+ const BEFORE_FIRST_INSTANT = MIN_INSTANT_NANOSECONDS - 1n;
45
+ /**
46
+ * The search horizon of `nextOpenAt`, `nextCloseAt` and `addOperatingTime` when the caller
47
+ * gives no `within`: one calendar year in the schedule's zone.
48
+ */
49
+ export const DEFAULT_OPERATING_HORIZON = "P1Y";
50
+ function parseWindow(value) {
51
+ if (!isObject(value) || Array.isArray(value)) {
52
+ return null;
53
+ }
54
+ const { from, to } = value;
55
+ if (typeof from !== "string" ||
56
+ typeof to !== "string" ||
57
+ !isValidTime(from) ||
58
+ !isValidTime(to)) {
59
+ return null;
60
+ }
61
+ const fromTime = Temporal.PlainTime.from(from);
62
+ const toTime = Temporal.PlainTime.from(to);
63
+ return {
64
+ from: fromTime.toString(),
65
+ to: toTime.toString(),
66
+ wraps: Temporal.PlainTime.compare(toTime, fromTime) <= 0,
67
+ };
68
+ }
69
+ function parseWindows(value) {
70
+ if (!Array.isArray(value)) {
71
+ return null;
72
+ }
73
+ const windows = [];
74
+ for (const candidate of value) {
75
+ const window = parseWindow(candidate);
76
+ if (window === null) {
77
+ return null;
78
+ }
79
+ windows.push(window);
80
+ }
81
+ return windows;
82
+ }
83
+ /**
84
+ * Parse `OperatingSchedule['weekly']`: an object whose own keys are ISO weekdays `"1"`–`"7"`,
85
+ * each holding an array of `LocalWindow`s (or `undefined`, meaning closed). Any other key, or a
86
+ * malformed window, returns `null`.
87
+ */
88
+ export function parseWeeklyPattern(value) {
89
+ if (!isObject(value) || Array.isArray(value)) {
90
+ return null;
91
+ }
92
+ const weekly = Array.from({ length: 8 }, () => []);
93
+ const record = value;
94
+ for (const key of Reflect.ownKeys(record)) {
95
+ if (typeof key !== "string" || !WEEKDAY_KEYS.includes(key)) {
96
+ return null;
97
+ }
98
+ if (record[key] === undefined) {
99
+ continue;
100
+ }
101
+ const windows = parseWindows(record[key]);
102
+ if (windows === null) {
103
+ return null;
104
+ }
105
+ weekly[Number(key)] = windows;
106
+ }
107
+ return weekly;
108
+ }
109
+ /** `holidays` as a date list or a `BusinessCalendar` (only its `holidays` are read). */
110
+ function parseScheduleHolidays(value) {
111
+ if (value === undefined) {
112
+ return new Set();
113
+ }
114
+ if (Array.isArray(value)) {
115
+ return parseHolidays(value);
116
+ }
117
+ return parseBusinessCalendar(value)?.holidays ?? null;
118
+ }
119
+ function parseOverrides(value) {
120
+ if (value === undefined) {
121
+ return new Map();
122
+ }
123
+ if (!Array.isArray(value)) {
124
+ return null;
125
+ }
126
+ const overrides = new Map();
127
+ for (const candidate of value) {
128
+ if (!isObject(candidate) || Array.isArray(candidate)) {
129
+ return null;
130
+ }
131
+ const { date, windows } = candidate;
132
+ if (typeof date !== "string" || !isValidDate(date)) {
133
+ return null;
134
+ }
135
+ const key = Temporal.PlainDate.from(date).toString();
136
+ const parsed = parseWindows(windows);
137
+ // Two overrides for one date say two different things about it.
138
+ if (parsed === null || overrides.has(key)) {
139
+ return null;
140
+ }
141
+ overrides.set(key, parsed);
142
+ }
143
+ return overrides;
144
+ }
145
+ /** Validate an `OperatingSchedule`, or `null` when any part of it is malformed. */
146
+ export function parseOperatingSchedule(value) {
147
+ if (!isObject(value) || Array.isArray(value)) {
148
+ return null;
149
+ }
150
+ const { timeZone, weekly, holidays, overrides } = value;
151
+ if (typeof timeZone !== "string" || !isValidTimeZone(timeZone)) {
152
+ return null;
153
+ }
154
+ const weeklyWindows = parseWeeklyPattern(weekly);
155
+ const holidayDates = parseScheduleHolidays(holidays);
156
+ const overrideWindows = parseOverrides(overrides);
157
+ if (weeklyWindows === null ||
158
+ holidayDates === null ||
159
+ overrideWindows === null) {
160
+ return null;
161
+ }
162
+ return {
163
+ timeZone,
164
+ weekly: weeklyWindows,
165
+ holidays: holidayDates,
166
+ overrides: overrideWindows,
167
+ };
168
+ }
169
+ /**
170
+ * Read `disambiguation` from an options argument. Omitted means `"compatible"`, as in
171
+ * `resolveLocal`; anything but the four Temporal values, or an options argument that is not an
172
+ * object, returns `null`.
173
+ */
174
+ export function parseScheduleDisambiguation(options) {
175
+ if (!isOptionsArgument(options)) {
176
+ return null;
177
+ }
178
+ const value = options
179
+ ?.disambiguation;
180
+ if (value === undefined) {
181
+ return "compatible";
182
+ }
183
+ return typeof value === "string" && DISAMBIGUATIONS.includes(value)
184
+ ? value
185
+ : null;
186
+ }
187
+ /**
188
+ * The last instant a search may answer with: `from` plus `within` (default one year), added in
189
+ * the schedule's zone so `P1D` is one local day. It is clamped to the search cap: the last instant
190
+ * before the local date `MAX_SCHEDULE_DAYS + 1` after the one `from` falls on, so a search answers
191
+ * anywhere on the 10,000th date and nowhere after it. A horizon past Temporal's last instant is
192
+ * that instant, since nothing after it can be answered. `null` when `within` is not a
193
+ * non-negative ISO duration.
194
+ */
195
+ export function parseSearchHorizon(fromNs, within, timeZone) {
196
+ const text = within === undefined ? DEFAULT_OPERATING_HORIZON : within;
197
+ if (typeof text !== "string") {
198
+ return null;
199
+ }
200
+ let duration;
201
+ try {
202
+ duration = Temporal.Duration.from(text);
203
+ }
204
+ catch {
205
+ return null;
206
+ }
207
+ if (duration.sign < 0) {
208
+ return null;
209
+ }
210
+ const from = Temporal.Instant.fromEpochNanoseconds(fromNs).toZonedDateTimeISO(timeZone);
211
+ const horizon = clampedToRange(() => from.add(duration).epochNanoseconds);
212
+ const cap = clampedToRange(() => from
213
+ .toPlainDate()
214
+ .add({ days: MAX_SCHEDULE_DAYS + 1 })
215
+ .toZonedDateTime(timeZone).epochNanoseconds - 1n);
216
+ return horizon < cap ? horizon : cap;
217
+ }
218
+ /** An instant computed by `instant`, or Temporal's last instant when it lies past the range. */
219
+ function clampedToRange(instant) {
220
+ try {
221
+ return instant();
222
+ }
223
+ catch (error) {
224
+ if (error instanceof RangeError) {
225
+ return MAX_INSTANT_NANOSECONDS;
226
+ }
227
+ throw error;
228
+ }
229
+ }
230
+ /** The local date of an instant in the schedule's zone. */
231
+ function localDateOf(schedule, ns) {
232
+ return Temporal.Instant.fromEpochNanoseconds(ns)
233
+ .toZonedDateTimeISO(schedule.timeZone)
234
+ .toPlainDate();
235
+ }
236
+ /**
237
+ * The local date `days` after the one `fromNs` falls on, or `null` when that is past Temporal's
238
+ * last date: no walk from `fromNs` can reach it before time runs out.
239
+ */
240
+ function dateLimit(schedule, fromNs, days) {
241
+ try {
242
+ return localDateOf(schedule, fromNs).add({ days });
243
+ }
244
+ catch (error) {
245
+ if (error instanceof RangeError) {
246
+ return null;
247
+ }
248
+ throw error;
249
+ }
250
+ }
251
+ /**
252
+ * The day bucket the walk starts in: the one holding the instant 72 hours before `fromNs`, or
253
+ * Temporal's first instant when that is earlier. When the bucket's own start is not
254
+ * representable, the walk starts at that instant instead, the earliest of its date there is.
255
+ */
256
+ function firstWalkBucket(schedule, fromNs) {
257
+ const startNs = fromNs - LOOKBACK_NANOSECONDS < MIN_INSTANT_NANOSECONDS
258
+ ? MIN_INSTANT_NANOSECONDS
259
+ : fromNs - LOOKBACK_NANOSECONDS;
260
+ const zoned = Temporal.Instant.fromEpochNanoseconds(startNs).toZonedDateTimeISO(schedule.timeZone);
261
+ try {
262
+ return zonedUnitStart(zoned, "day");
263
+ }
264
+ catch (error) {
265
+ if (error instanceof RangeError) {
266
+ return zoned;
267
+ }
268
+ throw error;
269
+ }
270
+ }
271
+ /** The windows that apply on `date`: an override, else nothing on a holiday, else the weekday's. */
272
+ function windowsOn(schedule, date) {
273
+ const key = date.toString();
274
+ const override = schedule.overrides.get(key);
275
+ if (override !== undefined) {
276
+ return override;
277
+ }
278
+ return schedule.holidays.has(key) ? [] : schedule.weekly[date.dayOfWeek];
279
+ }
280
+ /**
281
+ * Resolve one window edge with `resolveLocal`. `local` is `null` for a wrap past Temporal's last
282
+ * date. A wall time outside Temporal's range fails under every policy, so it resolves just
283
+ * outside the range, on the side its date lies. `undefined` means `"reject"` refused it.
284
+ */
285
+ function resolveEdge(local, date, timeZone, disambiguation) {
286
+ if (local === null) {
287
+ return { ns: PAST_LAST_INSTANT, text: "" };
288
+ }
289
+ const text = resolveLocal(local, timeZone, { disambiguation });
290
+ if (text !== "") {
291
+ return { ns: Temporal.Instant.from(text).epochNanoseconds, text };
292
+ }
293
+ if (disambiguation === "reject" && resolveLocal(local, timeZone) !== "") {
294
+ return undefined;
295
+ }
296
+ return {
297
+ ns: date.year > 0 ? PAST_LAST_INSTANT : BEFORE_FIRST_INSTANT,
298
+ text: "",
299
+ };
300
+ }
301
+ /**
302
+ * Resolve one date's windows to instants with `resolveLocal`. Each edge is resolved on its own
303
+ * under `disambiguation`; a wrapping window's `to` is read on the next date. An edge pair that
304
+ * resolves to an empty or inverted span (a window shorter than the gap it straddles) is dropped.
305
+ *
306
+ * Under `"earlier"`, an edge in a gap moves back by the gap's length (TC39
307
+ * DisambiguatePossibleEpochNanoseconds), so a date whose midnight is skipped can open before its
308
+ * own first instant, on the previous date. No zone has jumped forward by more than a day, so a
309
+ * window never starts before the previous date's first instant.
310
+ *
311
+ * Under `"reject"`, a window with an ambiguous or nonexistent edge is not guessed: it is returned
312
+ * in `unresolved` as the widest span it could cover (its start read `"earlier"`, its end
313
+ * `"later"`), so the caller can refuse an answer it might change and ignore it elsewhere.
314
+ */
315
+ function resolveDateWindows(schedule, date, disambiguation) {
316
+ const records = [];
317
+ const unresolved = [];
318
+ const { timeZone } = schedule;
319
+ for (const window of windowsOn(schedule, date)) {
320
+ let endDate = date;
321
+ if (window.wraps) {
322
+ try {
323
+ endDate = date.add({ days: 1 });
324
+ }
325
+ catch (error) {
326
+ if (!(error instanceof RangeError)) {
327
+ throw error;
328
+ }
329
+ endDate = null;
330
+ }
331
+ }
332
+ const startLocal = `${date.toString()}T${window.from}`;
333
+ const endLocal = endDate === null ? null : `${endDate.toString()}T${window.to}`;
334
+ const start = resolveEdge(startLocal, date, timeZone, disambiguation);
335
+ const end = resolveEdge(endLocal, endDate ?? date, timeZone, disambiguation);
336
+ if (start === undefined || end === undefined) {
337
+ // "earlier" and "later" always resolve, so the widest span is always known.
338
+ const earliest = resolveEdge(startLocal, date, timeZone, "earlier");
339
+ const latest = resolveEdge(endLocal, endDate ?? date, timeZone, "later");
340
+ unresolved.push({
341
+ start: earliest?.ns ?? BEFORE_FIRST_INSTANT,
342
+ end: latest?.ns ?? PAST_LAST_INSTANT,
343
+ });
344
+ continue;
345
+ }
346
+ if (start.ns < end.ns) {
347
+ records.push({
348
+ start: start.ns,
349
+ end: end.ns,
350
+ startText: start.text,
351
+ endText: end.text,
352
+ });
353
+ }
354
+ }
355
+ return { records, unresolved };
356
+ }
357
+ /**
358
+ * Walk the schedule's local dates from a little before `fromNs`, handing the visitor each open
359
+ * run as soon as no later window can extend it.
360
+ *
361
+ * - Dates come from the day buckets `floorToZone` and `bucketRange` use, so a deleted date
362
+ * (`Pacific/Apia`, 2011-12-30) is never visited, and a date the clock re-enters after a
363
+ * fall-back (`America/Goose_Bay`, 2010-11-06) is visited once.
364
+ * - A window can start as early as the previous date's first instant (see `resolveDateWindows`),
365
+ * so the walk settles one date behind: once a date is resolved, the first instant of the date
366
+ * resolved before it is the `bound` no later window starts before.
367
+ * - When the visitor stops the walk from `day`, or the last representable day is reached, the
368
+ * runs still pending are handed over too.
369
+ * - Returns `null` when a day bucket could not be found, or the walk would resolve a date
370
+ * `MAX_SCHEDULE_DAYS + 2` after the one `fromNs` falls on. Neither use reaches that: a range
371
+ * is refused up front past `MAX_SCHEDULE_DAYS` dates, and a search's horizon ends with the
372
+ * `MAX_SCHEDULE_DAYS`th date, so its walk stops by the horizon one date later.
373
+ */
374
+ export function walkSchedule(schedule, fromNs, disambiguation, visitor) {
375
+ let pending = [];
376
+ let unresolvedStart;
377
+ const finish = () => ({ unresolvedStart });
378
+ const flush = () => {
379
+ for (const run of pending) {
380
+ if (visitor.run(run)) {
381
+ break;
382
+ }
383
+ }
384
+ return finish();
385
+ };
386
+ // The span a range or search may cover, plus the date after its last, which is resolved to
387
+ // settle it because its windows can start before its own first instant.
388
+ const limitDate = dateLimit(schedule, fromNs, MAX_SCHEDULE_DAYS + 2);
389
+ let current = firstWalkBucket(schedule, fromNs);
390
+ let lastDate = null;
391
+ let bound;
392
+ for (let bucket = 0; bucket < MAX_SCHEDULE_BUCKETS; bucket++) {
393
+ if (current === null) {
394
+ return null;
395
+ }
396
+ if (bound !== undefined) {
397
+ const settleBefore = bound;
398
+ for (const run of pending) {
399
+ if (run.end >= settleBefore) {
400
+ break;
401
+ }
402
+ if (visitor.run(run)) {
403
+ return finish();
404
+ }
405
+ }
406
+ pending = pending.filter((run) => run.end >= settleBefore);
407
+ if (visitor.day(settleBefore, pending)) {
408
+ return flush();
409
+ }
410
+ }
411
+ const date = current.toPlainDate();
412
+ // A fall-back that re-enters the previous date opens a second bucket for it; its windows
413
+ // were already resolved on the first visit.
414
+ if (lastDate === null || Temporal.PlainDate.compare(date, lastDate) > 0) {
415
+ if (limitDate !== null &&
416
+ Temporal.PlainDate.compare(date, limitDate) >= 0) {
417
+ return null;
418
+ }
419
+ const resolved = resolveDateWindows(schedule, date, disambiguation);
420
+ for (const window of resolved.unresolved) {
421
+ if (window.end > fromNs &&
422
+ (unresolvedStart === undefined || window.start < unresolvedStart)) {
423
+ unresolvedStart = window.start;
424
+ }
425
+ }
426
+ pending = coalesceIntervalNanoseconds([...pending, ...resolved.records]);
427
+ lastDate = date;
428
+ bound = current.epochNanoseconds;
429
+ }
430
+ try {
431
+ current = nextZonedBucketStart(current, "day");
432
+ }
433
+ catch (error) {
434
+ // The next day starts past Temporal's last instant: nothing more can open.
435
+ if (error instanceof RangeError) {
436
+ return flush();
437
+ }
438
+ throw error;
439
+ }
440
+ }
441
+ return null;
442
+ }
443
+ /**
444
+ * The schedule's open runs clipped to `[startNs, endNs)`, in the range's own strings where a run
445
+ * is clipped. `null` when the walk fails (see `walkSchedule`), or when a window rejected under
446
+ * `"reject"` reaches into the range.
447
+ */
448
+ export function scheduleRunsWithin(schedule, range, disambiguation) {
449
+ // Refuse a range spanning more than MAX_SCHEDULE_DAYS local dates before walking it. Walking
450
+ // thousands of dates only to return the sentinel took seconds.
451
+ const lastInstant = range.end > range.start ? range.end - 1n : range.end;
452
+ const limit = dateLimit(schedule, range.start, MAX_SCHEDULE_DAYS);
453
+ if (limit !== null &&
454
+ Temporal.PlainDate.compare(localDateOf(schedule, lastInstant), limit) >= 0) {
455
+ return null;
456
+ }
457
+ const runs = [];
458
+ const walked = walkSchedule(schedule, range.start, disambiguation, {
459
+ run: (run) => {
460
+ if (run.start >= range.end) {
461
+ return true;
462
+ }
463
+ if (run.end > range.start) {
464
+ const clipStart = run.start < range.start;
465
+ const clipEnd = run.end > range.end;
466
+ runs.push({
467
+ start: clipStart ? range.start : run.start,
468
+ end: clipEnd ? range.end : run.end,
469
+ startText: clipStart ? range.startText : run.startText,
470
+ endText: clipEnd ? range.endText : run.endText,
471
+ });
472
+ }
473
+ return false;
474
+ },
475
+ day: (bound) => bound >= range.end,
476
+ });
477
+ if (walked === null ||
478
+ (walked.unresolvedStart !== undefined && walked.unresolvedStart < range.end)) {
479
+ return null;
480
+ }
481
+ return runs.filter((run) => run.start < run.end);
482
+ }
483
+ /** The later of two instants. */
484
+ function later(a, b) {
485
+ return a > b ? a : b;
486
+ }
487
+ /**
488
+ * The first instant at or after `fromNs` that the schedule is open: `fromNs` itself inside an
489
+ * open run, else the start of the next run. Answered as soon as no later window can open
490
+ * sooner, without waiting for the run to close. `undefined` when none falls at or before
491
+ * `horizonNs`, `null` when the walk fails or a window rejected under `"reject"` could open
492
+ * sooner.
493
+ */
494
+ export function firstOpenInstant(schedule, fromNs, horizonNs, disambiguation) {
495
+ let answer;
496
+ const walked = walkSchedule(schedule, fromNs, disambiguation, {
497
+ run: (run) => {
498
+ if (answer !== undefined) {
499
+ return true;
500
+ }
501
+ if (run.end <= fromNs) {
502
+ return false;
503
+ }
504
+ answer = later(run.start, fromNs);
505
+ return true;
506
+ },
507
+ day: (bound, pending) => {
508
+ if (bound > horizonNs) {
509
+ return true;
510
+ }
511
+ const next = pending.find((run) => run.end > fromNs);
512
+ if (next !== undefined && later(next.start, fromNs) <= bound) {
513
+ answer = later(next.start, fromNs);
514
+ return true;
515
+ }
516
+ return false;
517
+ },
518
+ });
519
+ if (walked === null) {
520
+ return null;
521
+ }
522
+ if (answer === undefined || answer > horizonNs) {
523
+ return undefined;
524
+ }
525
+ const { unresolvedStart } = walked;
526
+ return answer > fromNs &&
527
+ unresolvedStart !== undefined &&
528
+ unresolvedStart < answer
529
+ ? null
530
+ : answer;
531
+ }
532
+ /**
533
+ * The first instant at or after `fromNs` that the schedule is closed: `fromNs` itself outside
534
+ * every open run, else the end of the run holding it. A closed `fromNs` is answered as soon as
535
+ * no later window can cover it. `undefined` when the answer falls after `horizonNs`, `null` when
536
+ * the walk fails or a window rejected under `"reject"` could keep the schedule open past it.
537
+ */
538
+ export function firstClosedInstant(schedule, fromNs, horizonNs, disambiguation) {
539
+ let answer;
540
+ const walked = walkSchedule(schedule, fromNs, disambiguation, {
541
+ run: (run) => {
542
+ if (answer !== undefined) {
543
+ return true;
544
+ }
545
+ if (run.end <= fromNs) {
546
+ return false;
547
+ }
548
+ answer = run.start <= fromNs ? run.end : fromNs;
549
+ return true;
550
+ },
551
+ day: (bound, pending) => {
552
+ if (bound > horizonNs) {
553
+ return true;
554
+ }
555
+ const next = pending.find((run) => run.end > fromNs);
556
+ // Closed at `fromNs`, and every later window starts after it.
557
+ if (fromNs < bound && (next === undefined || next.start > fromNs)) {
558
+ answer = fromNs;
559
+ return true;
560
+ }
561
+ return false;
562
+ },
563
+ });
564
+ if (walked === null) {
565
+ return null;
566
+ }
567
+ const closed = answer ?? fromNs;
568
+ if (closed > horizonNs) {
569
+ return undefined;
570
+ }
571
+ const { unresolvedStart } = walked;
572
+ return unresolvedStart !== undefined && unresolvedStart <= closed
573
+ ? null
574
+ : closed;
575
+ }
576
+ /**
577
+ * The instant at which `amountNs` of open time has elapsed since `fromNs`: the earliest `X`
578
+ * with exactly that much open time in `[fromNs, X)`. `fromNs` itself when `amountNs` is zero.
579
+ * Answered as soon as no later window can add open time before `X`. `undefined` when `X` falls
580
+ * after `horizonNs`, `null` when the walk fails or a window rejected under `"reject"` could add
581
+ * open time before `X`.
582
+ */
583
+ export function instantAfterOpenTime(schedule, fromNs, amountNs, horizonNs, disambiguation) {
584
+ if (amountNs === 0n) {
585
+ return fromNs;
586
+ }
587
+ let remaining = amountNs;
588
+ let answer;
589
+ const walked = walkSchedule(schedule, fromNs, disambiguation, {
590
+ run: (run) => {
591
+ if (answer !== undefined) {
592
+ return true;
593
+ }
594
+ if (run.end <= fromNs) {
595
+ return false;
596
+ }
597
+ const start = later(run.start, fromNs);
598
+ if (run.end - start >= remaining) {
599
+ answer = start + remaining;
600
+ return true;
601
+ }
602
+ remaining -= run.end - start;
603
+ return false;
604
+ },
605
+ day: (bound, pending) => {
606
+ if (bound > horizonNs) {
607
+ return true;
608
+ }
609
+ // Every pending run ends at or after `bound`, so only the first can hold a deadline at or
610
+ // before it; open time before `bound` is final.
611
+ const next = pending.find((run) => run.end > fromNs);
612
+ if (next !== undefined) {
613
+ const deadline = later(next.start, fromNs) + remaining;
614
+ if (deadline <= next.end && deadline <= bound) {
615
+ answer = deadline;
616
+ return true;
617
+ }
618
+ }
619
+ return false;
620
+ },
621
+ });
622
+ if (walked === null) {
623
+ return null;
624
+ }
625
+ if (answer === undefined || answer > horizonNs) {
626
+ return undefined;
627
+ }
628
+ const { unresolvedStart } = walked;
629
+ return unresolvedStart !== undefined && unresolvedStart < answer
630
+ ? null
631
+ : answer;
632
+ }
633
+ const NANOSECONDS_PER_UNIT = {
634
+ hours: 3600000000000n,
635
+ minutes: 60000000000n,
636
+ seconds: 1000000000n,
637
+ milliseconds: 1000000n,
638
+ microseconds: 1000n,
639
+ nanoseconds: 1n,
640
+ };
641
+ /**
642
+ * An amount of open time in nanoseconds, from an ISO duration of hours and smaller units.
643
+ * `null` for a negative duration, for any calendar unit (years, months, weeks or days — `P1D`
644
+ * could mean 24 open hours or one working day, so it is not guessed), or invalid input.
645
+ */
646
+ export function parseOpenTimeAmount(value) {
647
+ if (typeof value !== "string") {
648
+ return null;
649
+ }
650
+ try {
651
+ const duration = Temporal.Duration.from(value);
652
+ if (duration.sign < 0 ||
653
+ duration.years !== 0 ||
654
+ duration.months !== 0 ||
655
+ duration.weeks !== 0 ||
656
+ duration.days !== 0) {
657
+ return null;
658
+ }
659
+ return Object.keys(NANOSECONDS_PER_UNIT).reduce((total, unit) => total + BigInt(duration[unit]) * NANOSECONDS_PER_UNIT[unit], 0n);
660
+ }
661
+ catch {
662
+ return null;
663
+ }
664
+ }
665
+ /** Epoch nanoseconds as a UTC instant string ending in `Z`. */
666
+ export function instantText(nanoseconds) {
667
+ return Temporal.Instant.fromEpochNanoseconds(nanoseconds).toString();
668
+ }
@@ -0,0 +1,18 @@
1
+ /**
2
+ * The value of an option that was read once, or its default when the option is absent.
3
+ *
4
+ * - ECMA-402 `GetOption` (the Temporal specification defines the same operation) reads the
5
+ * property with one `Get` and returns the default only when that value is `undefined`. Pass
6
+ * the property read as the argument, so the option is read exactly once: a getter cannot
7
+ * answer one value to the check and another to the use.
8
+ * - `null` is a value, not an omission, so it is returned as it is for the caller to validate.
9
+ *
10
+ * @param value the option as read from the caller's object, `undefined` when absent
11
+ * @param fallback the documented default
12
+ * @returns `fallback` when `value` is `undefined`, otherwise `value`
13
+ *
14
+ * @example optionOrDefault(undefined, "compatible") // "compatible"
15
+ * @example optionOrDefault("later", "compatible") // "later"
16
+ * @example optionOrDefault(null, true) // null (a value for the caller to validate)
17
+ */
18
+ export declare function optionOrDefault<T>(value: T | undefined, fallback: T): T;