@northguild/gmt 1.17.0 → 1.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (638) hide show
  1. package/README.md +462 -22
  2. package/dist/calendar/calculate/bucketRange.d.ts +3 -3
  3. package/dist/calendar/calculate/bucketRange.js +6 -6
  4. package/dist/calendar/calculate/floorToZone.d.ts +5 -3
  5. package/dist/calendar/calculate/floorToZone.js +6 -5
  6. package/dist/calendar/calculate/getFiscalPeriod.d.ts +21 -8
  7. package/dist/calendar/calculate/getFiscalPeriod.js +9 -8
  8. package/dist/calendar/calculate/getIsoWeekDate.d.ts +10 -5
  9. package/dist/calendar/calculate/getIsoWeekDate.js +1 -5
  10. package/dist/calendar/calculate/getOrdinalDate.d.ts +10 -3
  11. package/dist/calendar/calculate/getOrdinalDate.js +2 -3
  12. package/dist/calendar/calculate/getQuarter.d.ts +21 -9
  13. package/dist/calendar/calculate/getQuarter.js +8 -12
  14. package/dist/calendar/hours/addOperatingTime.d.ts +53 -0
  15. package/dist/calendar/hours/addOperatingTime.js +59 -0
  16. package/dist/calendar/hours/index.d.ts +7 -0
  17. package/dist/calendar/hours/index.js +7 -0
  18. package/dist/calendar/hours/isOpenAt.d.ts +39 -0
  19. package/dist/calendar/hours/isOpenAt.js +44 -0
  20. package/dist/calendar/hours/nextCloseAt.d.ts +49 -0
  21. package/dist/calendar/hours/nextCloseAt.js +51 -0
  22. package/dist/calendar/hours/nextOpenAt.d.ts +45 -0
  23. package/dist/calendar/hours/nextOpenAt.js +47 -0
  24. package/dist/calendar/hours/operatingIntervals.d.ts +43 -0
  25. package/dist/calendar/hours/operatingIntervals.js +52 -0
  26. package/dist/calendar/hours/operatingTimeBetween.d.ts +40 -0
  27. package/dist/calendar/hours/operatingTimeBetween.js +49 -0
  28. package/dist/calendar/hours/recurringWindows.d.ts +61 -0
  29. package/dist/calendar/hours/recurringWindows.js +80 -0
  30. package/dist/calendar/index.d.ts +1 -0
  31. package/dist/calendar/index.js +1 -0
  32. package/dist/duration/calculate/durationAs.d.ts +13 -8
  33. package/dist/duration/calculate/durationAs.js +4 -8
  34. package/dist/duration/compare/compareDurations.d.ts +12 -6
  35. package/dist/duration/compare/compareDurations.js +3 -6
  36. package/dist/duration/format/formatDuration.d.ts +16 -4
  37. package/dist/duration/format/formatDuration.js +4 -5
  38. package/dist/duration/normalize/normalizeDuration.d.ts +39 -14
  39. package/dist/duration/normalize/normalizeDuration.js +6 -15
  40. package/dist/duration/parse/parseDuration.d.ts +21 -3
  41. package/dist/duration/parse/parseDuration.js +1 -3
  42. package/dist/instant/convert/classifyLocal.d.ts +1 -1
  43. package/dist/instant/convert/classifyLocal.js +1 -1
  44. package/dist/instant/convert/fromOffsetInstant.d.ts +3 -1
  45. package/dist/instant/convert/fromOffsetInstant.js +3 -1
  46. package/dist/instant/convert/resolveLocal.d.ts +12 -7
  47. package/dist/instant/convert/resolveLocal.js +6 -10
  48. package/dist/instant/convert/toOffsetInstant.d.ts +22 -9
  49. package/dist/instant/convert/toOffsetInstant.js +10 -3
  50. package/dist/intermodal/calculate/billingTimeline.d.ts +31 -11
  51. package/dist/intermodal/calculate/billingTimeline.js +2 -2
  52. package/dist/intermodal/calculate/chargeableDays.d.ts +13 -11
  53. package/dist/intermodal/calculate/chargeableDays.js +4 -9
  54. package/dist/intermodal/calculate/demurrageClock.d.ts +16 -7
  55. package/dist/intermodal/calculate/demurrageClock.js +7 -7
  56. package/dist/intermodal/calculate/freeTimeExpiry.d.ts +5 -4
  57. package/dist/intermodal/calculate/freeTimeExpiry.js +6 -6
  58. package/dist/internal/businessCalendar.d.ts +5 -0
  59. package/dist/internal/businessCalendar.js +5 -1
  60. package/dist/internal/cycleFieldValue.d.ts +6 -4
  61. package/dist/internal/cycleFieldValue.js +6 -4
  62. package/dist/internal/daylightTime.d.ts +33 -0
  63. package/dist/internal/daylightTime.js +164 -0
  64. package/dist/internal/durationUntilString.js +4 -3
  65. package/dist/internal/englishCalendarNames.js +1 -2
  66. package/dist/internal/epochNanoseconds.d.ts +2 -0
  67. package/dist/internal/epochNanoseconds.js +2 -0
  68. package/dist/internal/exactDuration.d.ts +37 -0
  69. package/dist/internal/exactDuration.js +64 -0
  70. package/dist/internal/exactMoment.d.ts +72 -0
  71. package/dist/internal/exactMoment.js +114 -0
  72. package/dist/internal/fiscalCalendar.d.ts +4 -3
  73. package/dist/internal/fiscalCalendar.js +4 -3
  74. package/dist/internal/formatCalendarDays.d.ts +2 -2
  75. package/dist/internal/formatRelativeDuration.d.ts +21 -1
  76. package/dist/internal/formatRelativeDuration.js +47 -7
  77. package/dist/internal/index.d.ts +9 -4
  78. package/dist/internal/index.js +9 -4
  79. package/dist/internal/instantFormatOptions.js +2 -1
  80. package/dist/internal/instantNanoseconds.d.ts +75 -9
  81. package/dist/internal/instantNanoseconds.js +192 -11
  82. package/dist/internal/joinDateTimeConnector.d.ts +1 -1
  83. package/dist/internal/monthGridWeekRow.d.ts +2 -1
  84. package/dist/internal/monthGridWeekRow.js +2 -1
  85. package/dist/internal/normalizeTimeZone.d.ts +2 -2
  86. package/dist/internal/normalizeTimeZone.js +2 -2
  87. package/dist/internal/operatingSchedule.d.ts +129 -0
  88. package/dist/internal/operatingSchedule.js +668 -0
  89. package/dist/internal/optionOrDefault.d.ts +18 -0
  90. package/dist/internal/optionOrDefault.js +20 -0
  91. package/dist/internal/patternToken.d.ts +2 -2
  92. package/dist/internal/patternToken.js +28 -13
  93. package/dist/internal/plainDateUntil.js +10 -6
  94. package/dist/internal/punctuality.d.ts +38 -0
  95. package/dist/internal/punctuality.js +59 -0
  96. package/dist/internal/readDateTimeFormatOptions.d.ts +30 -0
  97. package/dist/internal/readDateTimeFormatOptions.js +93 -0
  98. package/dist/internal/resolveDurationRelativeTo.d.ts +4 -0
  99. package/dist/internal/resolveDurationRelativeTo.js +11 -1
  100. package/dist/internal/resolveRelativeRounding.d.ts +17 -6
  101. package/dist/internal/resolveRelativeRounding.js +27 -7
  102. package/dist/internal/resolveRelativeUnit.d.ts +30 -0
  103. package/dist/internal/resolveRelativeUnit.js +40 -0
  104. package/dist/internal/splitStep.d.ts +24 -1
  105. package/dist/internal/splitStep.js +34 -2
  106. package/dist/internal/startOrEndOfZoned.js +2 -3
  107. package/dist/internal/temporalCompat/capabilities.d.ts +26 -0
  108. package/dist/internal/temporalCompat/capabilities.js +35 -3
  109. package/dist/internal/temporalCompat/fieldSearch.js +1 -1
  110. package/dist/internal/temporalCompat/index.d.ts +1 -1
  111. package/dist/internal/temporalCompat/index.js +1 -1
  112. package/dist/internal/temporalCompat/repros.d.ts +1 -1
  113. package/dist/internal/temporalCompat/repros.js +157 -0
  114. package/dist/internal/timestampEvents.d.ts +32 -0
  115. package/dist/internal/timestampEvents.js +76 -0
  116. package/dist/internal/utcZonedDateTime.d.ts +5 -2
  117. package/dist/internal/utcZonedDateTime.js +8 -5
  118. package/dist/internal/zonedBucket.js +8 -6
  119. package/dist/internal/zonedLocalDates.js +1 -1
  120. package/dist/internal/zonedTransitionSearch.d.ts +27 -0
  121. package/dist/internal/zonedTransitionSearch.js +218 -0
  122. package/dist/internal/zonedWallClock.d.ts +21 -7
  123. package/dist/internal/zonedWallClock.js +87 -18
  124. package/dist/internal/zonedWallClockOperations.d.ts +26 -13
  125. package/dist/internal/zonedWallClockOperations.js +87 -34
  126. package/dist/interval/validate/isValidInterval.d.ts +6 -3
  127. package/dist/interval/validate/isValidInterval.js +6 -3
  128. package/dist/plain/calculate/addDate.d.ts +11 -8
  129. package/dist/plain/calculate/addDate.js +5 -8
  130. package/dist/plain/calculate/addDateTime.d.ts +7 -4
  131. package/dist/plain/calculate/addDateTime.js +1 -4
  132. package/dist/plain/calculate/cycleDate.d.ts +16 -7
  133. package/dist/plain/calculate/cycleDate.js +3 -7
  134. package/dist/plain/calculate/cycleDateTime.d.ts +14 -4
  135. package/dist/plain/calculate/cycleDateTime.js +1 -4
  136. package/dist/plain/calculate/cycleTime.d.ts +10 -5
  137. package/dist/plain/calculate/cycleTime.js +3 -5
  138. package/dist/plain/calculate/diffDate.d.ts +1 -1
  139. package/dist/plain/calculate/diffDate.js +1 -1
  140. package/dist/plain/calculate/diffDateAsDuration.d.ts +1 -1
  141. package/dist/plain/calculate/diffDateAsDuration.js +1 -1
  142. package/dist/plain/calculate/diffDateTime.d.ts +1 -1
  143. package/dist/plain/calculate/diffDateTime.js +1 -1
  144. package/dist/plain/calculate/diffDateTimeAsDuration.d.ts +1 -1
  145. package/dist/plain/calculate/diffDateTimeAsDuration.js +1 -1
  146. package/dist/plain/calculate/diffTime.d.ts +1 -1
  147. package/dist/plain/calculate/diffTime.js +1 -1
  148. package/dist/plain/calculate/endOfDate.d.ts +8 -3
  149. package/dist/plain/calculate/endOfDate.js +1 -3
  150. package/dist/plain/calculate/endOfDateTime.d.ts +15 -5
  151. package/dist/plain/calculate/endOfDateTime.js +1 -5
  152. package/dist/plain/calculate/endOfTime.d.ts +8 -2
  153. package/dist/plain/calculate/endOfTime.js +1 -2
  154. package/dist/plain/calculate/getLocaleWeekYear.d.ts +16 -9
  155. package/dist/plain/calculate/getLocaleWeekYear.js +9 -9
  156. package/dist/plain/calculate/getWeekOfMonth.d.ts +7 -4
  157. package/dist/plain/calculate/getWeekOfMonth.js +7 -4
  158. package/dist/plain/calculate/getWeeksInLocaleWeekYear.d.ts +13 -6
  159. package/dist/plain/calculate/getWeeksInLocaleWeekYear.js +6 -6
  160. package/dist/plain/calculate/getWeeksInMonth.d.ts +5 -2
  161. package/dist/plain/calculate/getWeeksInMonth.js +5 -2
  162. package/dist/plain/calculate/nextWeekday.d.ts +7 -3
  163. package/dist/plain/calculate/nextWeekday.js +1 -3
  164. package/dist/plain/calculate/previousWeekday.d.ts +7 -3
  165. package/dist/plain/calculate/previousWeekday.js +1 -3
  166. package/dist/plain/calculate/roundDate.d.ts +20 -7
  167. package/dist/plain/calculate/roundDate.js +3 -10
  168. package/dist/plain/calculate/roundDateTime.d.ts +22 -8
  169. package/dist/plain/calculate/roundDateTime.js +3 -11
  170. package/dist/plain/calculate/roundTime.d.ts +20 -4
  171. package/dist/plain/calculate/roundTime.js +3 -7
  172. package/dist/plain/calculate/setDate.d.ts +7 -5
  173. package/dist/plain/calculate/setDate.js +1 -5
  174. package/dist/plain/calculate/setDateTime.d.ts +8 -5
  175. package/dist/plain/calculate/setDateTime.js +1 -5
  176. package/dist/plain/calculate/setTime.d.ts +10 -6
  177. package/dist/plain/calculate/setTime.js +4 -6
  178. package/dist/plain/calculate/startOfDate.d.ts +8 -2
  179. package/dist/plain/calculate/startOfDate.js +1 -2
  180. package/dist/plain/calculate/startOfDateTime.d.ts +15 -2
  181. package/dist/plain/calculate/startOfDateTime.js +1 -2
  182. package/dist/plain/calculate/startOfTime.d.ts +8 -1
  183. package/dist/plain/calculate/startOfTime.js +1 -1
  184. package/dist/plain/calculate/subtractDate.d.ts +7 -4
  185. package/dist/plain/calculate/subtractDate.js +1 -4
  186. package/dist/plain/calculate/subtractDateTime.d.ts +7 -4
  187. package/dist/plain/calculate/subtractDateTime.js +1 -4
  188. package/dist/plain/compare/areDateTimesEqualBy.d.ts +13 -5
  189. package/dist/plain/compare/areDateTimesEqualBy.js +6 -5
  190. package/dist/plain/compare/areDatesEqualBy.d.ts +15 -6
  191. package/dist/plain/compare/areDatesEqualBy.js +8 -6
  192. package/dist/plain/compare/isBetweenDate.d.ts +13 -2
  193. package/dist/plain/compare/isBetweenDate.js +4 -4
  194. package/dist/plain/compare/isBetweenDateTime.d.ts +13 -2
  195. package/dist/plain/compare/isBetweenDateTime.js +4 -4
  196. package/dist/plain/compare/isBetweenTime.d.ts +13 -2
  197. package/dist/plain/compare/isBetweenTime.js +4 -4
  198. package/dist/plain/compare/isRelativeDay.d.ts +1 -1
  199. package/dist/plain/compare/isRelativeDay.js +1 -1
  200. package/dist/plain/compare/isThisUnit.d.ts +1 -1
  201. package/dist/plain/compare/isThisUnit.js +1 -1
  202. package/dist/plain/format/formatCalendar.d.ts +21 -14
  203. package/dist/plain/format/formatCalendar.js +21 -16
  204. package/dist/plain/format/formatDate.js +5 -3
  205. package/dist/plain/format/formatDateRange.js +4 -2
  206. package/dist/plain/format/formatDateTime.js +4 -2
  207. package/dist/plain/format/formatDateTimeRange.js +4 -2
  208. package/dist/plain/format/formatDateTimeToParts.d.ts +15 -4
  209. package/dist/plain/format/formatDateTimeToParts.js +10 -6
  210. package/dist/plain/format/formatDateToParts.d.ts +13 -2
  211. package/dist/plain/format/formatDateToParts.js +8 -4
  212. package/dist/plain/format/formatRelativeDate.d.ts +16 -3
  213. package/dist/plain/format/formatRelativeDate.js +26 -15
  214. package/dist/plain/format/formatRelativeDateTime.d.ts +16 -3
  215. package/dist/plain/format/formatRelativeDateTime.js +8 -5
  216. package/dist/plain/format/formatRelativeTime.d.ts +16 -3
  217. package/dist/plain/format/formatRelativeTime.js +21 -13
  218. package/dist/plain/format/formatTime.js +4 -2
  219. package/dist/plain/interval/intervalDifferenceDate.d.ts +9 -0
  220. package/dist/plain/interval/intervalDifferenceDateTime.d.ts +9 -0
  221. package/dist/plain/interval/intervalDifferenceTime.d.ts +9 -0
  222. package/dist/plain/interval/intervalDivideEquallyDate.d.ts +19 -4
  223. package/dist/plain/interval/intervalDivideEquallyDate.js +3 -4
  224. package/dist/plain/interval/intervalDivideEquallyDateTime.d.ts +19 -4
  225. package/dist/plain/interval/intervalDivideEquallyDateTime.js +3 -4
  226. package/dist/plain/interval/intervalDivideEquallyTime.d.ts +19 -4
  227. package/dist/plain/interval/intervalDivideEquallyTime.js +3 -4
  228. package/dist/plain/interval/intervalFromDurationDate.d.ts +16 -3
  229. package/dist/plain/interval/intervalFromDurationDate.js +1 -3
  230. package/dist/plain/interval/intervalFromDurationDateTime.d.ts +16 -3
  231. package/dist/plain/interval/intervalFromDurationDateTime.js +1 -3
  232. package/dist/plain/interval/intervalFromDurationTime.d.ts +9 -0
  233. package/dist/plain/interval/intervalIntersectionDate.d.ts +9 -0
  234. package/dist/plain/interval/intervalIntersectionDateTime.d.ts +9 -0
  235. package/dist/plain/interval/intervalIntersectionTime.d.ts +9 -0
  236. package/dist/plain/interval/intervalSplitAtDate.d.ts +11 -0
  237. package/dist/plain/interval/intervalSplitAtDate.js +2 -0
  238. package/dist/plain/interval/intervalSplitAtDateTime.d.ts +11 -0
  239. package/dist/plain/interval/intervalSplitAtDateTime.js +2 -0
  240. package/dist/plain/interval/intervalSplitAtTime.d.ts +11 -0
  241. package/dist/plain/interval/intervalSplitAtTime.js +2 -0
  242. package/dist/plain/interval/intervalUnionDate.d.ts +9 -0
  243. package/dist/plain/interval/intervalUnionDateTime.d.ts +9 -0
  244. package/dist/plain/interval/intervalUnionTime.d.ts +9 -0
  245. package/dist/plain/interval/intervalXorAllDate.d.ts +9 -0
  246. package/dist/plain/interval/intervalXorAllDateTime.d.ts +9 -0
  247. package/dist/plain/interval/intervalXorAllTime.d.ts +9 -0
  248. package/dist/plain/interval/intervalXorDate.d.ts +9 -0
  249. package/dist/plain/interval/intervalXorDateTime.d.ts +9 -0
  250. package/dist/plain/interval/intervalXorTime.d.ts +9 -0
  251. package/dist/plain/interval/mergeIntervalsDate.d.ts +9 -0
  252. package/dist/plain/interval/mergeIntervalsDateTime.d.ts +9 -0
  253. package/dist/plain/interval/mergeIntervalsTime.d.ts +9 -0
  254. package/dist/plain/interval/splitIntervalByUnitDate.d.ts +23 -7
  255. package/dist/plain/interval/splitIntervalByUnitDate.js +7 -7
  256. package/dist/plain/interval/splitIntervalByUnitDateTime.d.ts +22 -6
  257. package/dist/plain/interval/splitIntervalByUnitDateTime.js +6 -6
  258. package/dist/plain/interval/splitIntervalByUnitTime.d.ts +17 -4
  259. package/dist/plain/interval/splitIntervalByUnitTime.js +1 -4
  260. package/dist/plain/map/mapDatesInRange.d.ts +8 -4
  261. package/dist/plain/map/mapDatesInRange.js +1 -4
  262. package/dist/plain/parse/parseDateTimeWithPattern.d.ts +10 -7
  263. package/dist/plain/parse/parseDateTimeWithPattern.js +10 -7
  264. package/dist/plain/parse/parseDateWithPattern.d.ts +10 -7
  265. package/dist/plain/parse/parseDateWithPattern.js +10 -7
  266. package/dist/plain/parse/parseTimeWithPattern.d.ts +10 -7
  267. package/dist/plain/parse/parseTimeWithPattern.js +10 -7
  268. package/dist/plain/parse/parseUnitFromDate.d.ts +11 -3
  269. package/dist/plain/parse/parseUnitFromDate.js +3 -3
  270. package/dist/plain/parse/parseUnitFromDateTime.d.ts +11 -3
  271. package/dist/plain/parse/parseUnitFromDateTime.js +3 -3
  272. package/dist/plain/parse/parseWeekFromDate.d.ts +10 -6
  273. package/dist/plain/parse/parseWeekFromDate.js +2 -6
  274. package/dist/plain/parse/parseWeekFromDateTime.d.ts +10 -6
  275. package/dist/plain/parse/parseWeekFromDateTime.js +2 -6
  276. package/dist/plain/validate/isValidDateRange.d.ts +19 -4
  277. package/dist/plain/validate/isValidDateRange.js +1 -4
  278. package/dist/plain/validate/isValidDateTimeRange.d.ts +20 -5
  279. package/dist/plain/validate/isValidDateTimeRange.js +2 -5
  280. package/dist/plain/validate/isValidTimeRange.d.ts +20 -5
  281. package/dist/plain/validate/isValidTimeRange.js +2 -5
  282. package/dist/precision/convert/fromExcelSerial.d.ts +10 -4
  283. package/dist/precision/convert/fromExcelSerial.js +4 -5
  284. package/dist/precision/convert/fromNanoseconds.d.ts +1 -1
  285. package/dist/precision/convert/fromNanoseconds.js +1 -1
  286. package/dist/precision/convert/toExcelSerial.d.ts +9 -3
  287. package/dist/precision/convert/toExcelSerial.js +3 -4
  288. package/dist/precision/convert/toNanoseconds.d.ts +11 -6
  289. package/dist/precision/convert/toNanoseconds.js +11 -6
  290. package/dist/precision/validate/isValidInstant.d.ts +12 -3
  291. package/dist/precision/validate/isValidInstant.js +12 -3
  292. package/dist/span/calculate/spanMs.d.ts +10 -4
  293. package/dist/span/calculate/spanMs.js +10 -4
  294. package/dist/span/calculate/spanNs.d.ts +10 -4
  295. package/dist/span/calculate/spanNs.js +10 -4
  296. package/dist/span/validate/isValidSpan.d.ts +8 -3
  297. package/dist/span/validate/isValidSpan.js +8 -3
  298. package/dist/transport/calculate/bestAvailable.d.ts +47 -0
  299. package/dist/transport/calculate/bestAvailable.js +76 -0
  300. package/dist/transport/calculate/crossingTime.d.ts +58 -0
  301. package/dist/transport/calculate/crossingTime.js +76 -0
  302. package/dist/transport/calculate/cutoffAt.d.ts +90 -0
  303. package/dist/transport/calculate/cutoffAt.js +209 -0
  304. package/dist/transport/calculate/cutoffSchedule.d.ts +70 -0
  305. package/dist/transport/calculate/cutoffSchedule.js +71 -0
  306. package/dist/transport/calculate/dwellTime.d.ts +16 -7
  307. package/dist/transport/calculate/dwellTime.js +12 -8
  308. package/dist/transport/calculate/estimateDrift.d.ts +65 -0
  309. package/dist/transport/calculate/estimateDrift.js +75 -0
  310. package/dist/transport/calculate/index.d.ts +8 -0
  311. package/dist/transport/calculate/index.js +8 -0
  312. package/dist/transport/calculate/nextDeparture.d.ts +78 -0
  313. package/dist/transport/calculate/nextDeparture.js +131 -0
  314. package/dist/transport/calculate/punctualityRate.d.ts +42 -0
  315. package/dist/transport/calculate/punctualityRate.js +59 -0
  316. package/dist/transport/calculate/scheduleDelivery.d.ts +150 -0
  317. package/dist/transport/calculate/scheduleDelivery.js +300 -0
  318. package/dist/transport/calculate/transitTime.d.ts +21 -3
  319. package/dist/transport/calculate/transitTime.js +29 -46
  320. package/dist/transport/compare/classifyPunctuality.d.ts +46 -0
  321. package/dist/transport/compare/classifyPunctuality.js +64 -0
  322. package/dist/transport/compare/index.d.ts +4 -0
  323. package/dist/transport/compare/index.js +4 -0
  324. package/dist/transport/compare/isPastCutoff.d.ts +33 -0
  325. package/dist/transport/compare/isPastCutoff.js +48 -0
  326. package/dist/transport/compare/scheduleDeviation.d.ts +37 -0
  327. package/dist/transport/compare/scheduleDeviation.js +53 -0
  328. package/dist/transport/compare/timeToCutoff.d.ts +31 -0
  329. package/dist/transport/compare/timeToCutoff.js +47 -0
  330. package/dist/transport/convert/etaAtZone.d.ts +7 -0
  331. package/dist/transport/convert/etaAtZone.js +9 -4
  332. package/dist/transport/index.d.ts +1 -0
  333. package/dist/transport/index.js +1 -0
  334. package/dist/types/business-calendar.d.ts +19 -14
  335. package/dist/types/calendar-options.d.ts +15 -3
  336. package/dist/types/date-cycle-field.d.ts +5 -0
  337. package/dist/types/date-duration-unit.d.ts +4 -0
  338. package/dist/types/date-time-cycle-field.d.ts +4 -0
  339. package/dist/types/date-time-duration-units.d.ts +4 -0
  340. package/dist/types/date-time-unit.d.ts +4 -0
  341. package/dist/types/date-unit.d.ts +4 -0
  342. package/dist/types/disambiguation.d.ts +8 -0
  343. package/dist/types/duration-relative-to.d.ts +8 -0
  344. package/dist/types/duration-string-options.d.ts +28 -0
  345. package/dist/types/fiscal-calendar.d.ts +1 -1
  346. package/dist/types/fractional-digit.d.ts +5 -0
  347. package/dist/types/free-time-options.d.ts +21 -11
  348. package/dist/types/index.d.ts +2 -1
  349. package/dist/types/index.js +2 -1
  350. package/dist/types/interval.d.ts +8 -1
  351. package/dist/types/offset.d.ts +9 -0
  352. package/dist/types/operating-schedule.d.ts +71 -0
  353. package/dist/types/overflow.d.ts +6 -0
  354. package/dist/types/relative-rounding-method.d.ts +6 -0
  355. package/dist/types/relative-time-options.d.ts +33 -5
  356. package/dist/types/rounding-options.d.ts +27 -0
  357. package/dist/types/time-cycle-field.d.ts +4 -0
  358. package/dist/types/time-duration-unit.d.ts +4 -0
  359. package/dist/types/time-unit.d.ts +4 -0
  360. package/dist/types/transport-timestamps.d.ts +54 -0
  361. package/dist/types/transport-timestamps.js +0 -0
  362. package/dist/unix/calculate/addUnix.d.ts +19 -5
  363. package/dist/unix/calculate/addUnix.js +1 -5
  364. package/dist/unix/calculate/diffUnix.d.ts +13 -3
  365. package/dist/unix/calculate/diffUnix.js +1 -3
  366. package/dist/unix/calculate/diffUnixAsDuration.d.ts +13 -3
  367. package/dist/unix/calculate/diffUnixAsDuration.js +1 -3
  368. package/dist/unix/calculate/endOfQuarterForUnix.d.ts +13 -3
  369. package/dist/unix/calculate/endOfQuarterForUnix.js +1 -3
  370. package/dist/unix/calculate/endOfUnix.d.ts +20 -4
  371. package/dist/unix/calculate/endOfUnix.js +1 -4
  372. package/dist/unix/calculate/isBetweenUnix.d.ts +26 -4
  373. package/dist/unix/calculate/isBetweenUnix.js +4 -6
  374. package/dist/unix/calculate/roundUnix.d.ts +31 -3
  375. package/dist/unix/calculate/roundUnix.js +3 -6
  376. package/dist/unix/calculate/setUnix.d.ts +35 -9
  377. package/dist/unix/calculate/setUnix.js +4 -13
  378. package/dist/unix/calculate/startOfQuarterForUnix.d.ts +13 -3
  379. package/dist/unix/calculate/startOfQuarterForUnix.js +1 -3
  380. package/dist/unix/calculate/startOfUnix.d.ts +20 -4
  381. package/dist/unix/calculate/startOfUnix.js +1 -4
  382. package/dist/unix/calculate/subtractUnix.d.ts +19 -5
  383. package/dist/unix/calculate/subtractUnix.js +1 -5
  384. package/dist/unix/compare/areUnixEqual.d.ts +7 -1
  385. package/dist/unix/compare/areUnixEqual.js +1 -1
  386. package/dist/unix/compare/areUnixEqualBy.d.ts +24 -7
  387. package/dist/unix/compare/areUnixEqualBy.js +13 -9
  388. package/dist/unix/compare/isAfterUnix.d.ts +7 -1
  389. package/dist/unix/compare/isAfterUnix.js +1 -1
  390. package/dist/unix/compare/isBeforeUnix.d.ts +7 -1
  391. package/dist/unix/compare/isBeforeUnix.js +1 -1
  392. package/dist/unix/convert/convertUnixToPlainDate.d.ts +14 -4
  393. package/dist/unix/convert/convertUnixToPlainDate.js +2 -4
  394. package/dist/unix/convert/convertUnixToPlainDateTime.d.ts +14 -4
  395. package/dist/unix/convert/convertUnixToPlainDateTime.js +2 -4
  396. package/dist/unix/convert/convertUnixToPlainTime.d.ts +14 -4
  397. package/dist/unix/convert/convertUnixToPlainTime.js +2 -4
  398. package/dist/unix/convert/convertUnixToUtc.d.ts +9 -4
  399. package/dist/unix/convert/convertUnixToUtc.js +3 -4
  400. package/dist/unix/convert/convertUnixToZoned.d.ts +10 -5
  401. package/dist/unix/convert/convertUnixToZoned.js +4 -5
  402. package/dist/unix/format/formatCalendarUnix.d.ts +27 -19
  403. package/dist/unix/format/formatCalendarUnix.js +4 -5
  404. package/dist/unix/format/formatRelativeUnix.d.ts +54 -5
  405. package/dist/unix/format/formatRelativeUnix.js +3 -5
  406. package/dist/unix/format/formatUnix.d.ts +24 -6
  407. package/dist/unix/format/formatUnix.js +8 -7
  408. package/dist/unix/get/getUnixNow.d.ts +8 -3
  409. package/dist/unix/get/getUnixNow.js +1 -3
  410. package/dist/unix/interval/intervalCountUnix.d.ts +14 -5
  411. package/dist/unix/interval/intervalCountUnix.js +2 -5
  412. package/dist/unix/interval/intervalDifferenceUnix.d.ts +6 -0
  413. package/dist/unix/interval/intervalDivideEquallyUnix.d.ts +18 -4
  414. package/dist/unix/interval/intervalDivideEquallyUnix.js +5 -4
  415. package/dist/unix/interval/intervalFromDurationUnix.d.ts +33 -5
  416. package/dist/unix/interval/intervalFromDurationUnix.js +6 -5
  417. package/dist/unix/interval/intervalIntersectionUnix.d.ts +6 -0
  418. package/dist/unix/interval/intervalLengthUnix.d.ts +16 -6
  419. package/dist/unix/interval/intervalLengthUnix.js +4 -6
  420. package/dist/unix/interval/intervalOverlappingDaysUnix.d.ts +13 -3
  421. package/dist/unix/interval/intervalOverlappingDaysUnix.js +1 -3
  422. package/dist/unix/interval/intervalSplitAtUnix.d.ts +8 -0
  423. package/dist/unix/interval/intervalSplitAtUnix.js +2 -0
  424. package/dist/unix/interval/intervalUnionUnix.d.ts +6 -0
  425. package/dist/unix/interval/intervalXorAllUnix.d.ts +6 -0
  426. package/dist/unix/interval/intervalXorUnix.d.ts +6 -0
  427. package/dist/unix/interval/mergeIntervalsUnix.d.ts +6 -0
  428. package/dist/unix/interval/splitIntervalByUnitUnix.d.ts +42 -11
  429. package/dist/unix/interval/splitIntervalByUnitUnix.js +21 -16
  430. package/dist/unix/parse/parseDateFromUnix.d.ts +13 -2
  431. package/dist/unix/parse/parseDateFromUnix.js +1 -2
  432. package/dist/unix/parse/parseDayFromUnix.d.ts +14 -2
  433. package/dist/unix/parse/parseDayFromUnix.js +2 -2
  434. package/dist/unix/parse/parseDayOfWeekFromUnix.d.ts +13 -1
  435. package/dist/unix/parse/parseDayOfWeekFromUnix.js +1 -1
  436. package/dist/unix/parse/parseHourFromUnix.d.ts +14 -2
  437. package/dist/unix/parse/parseHourFromUnix.js +2 -2
  438. package/dist/unix/parse/parseMicrosecondFromUnix.d.ts +14 -2
  439. package/dist/unix/parse/parseMicrosecondFromUnix.js +2 -2
  440. package/dist/unix/parse/parseMillisecondFromUnix.d.ts +14 -2
  441. package/dist/unix/parse/parseMillisecondFromUnix.js +2 -2
  442. package/dist/unix/parse/parseMinuteFromUnix.d.ts +14 -2
  443. package/dist/unix/parse/parseMinuteFromUnix.js +2 -2
  444. package/dist/unix/parse/parseMonthFromUnix.d.ts +14 -2
  445. package/dist/unix/parse/parseMonthFromUnix.js +2 -2
  446. package/dist/unix/parse/parseNanosecondFromUnix.d.ts +14 -2
  447. package/dist/unix/parse/parseNanosecondFromUnix.js +2 -2
  448. package/dist/unix/parse/parseSecondFromUnix.d.ts +14 -2
  449. package/dist/unix/parse/parseSecondFromUnix.js +2 -2
  450. package/dist/unix/parse/parseTimeFromUnix.d.ts +13 -2
  451. package/dist/unix/parse/parseTimeFromUnix.js +1 -2
  452. package/dist/unix/parse/parseUnitFromUnix.d.ts +22 -3
  453. package/dist/unix/parse/parseUnitFromUnix.js +2 -3
  454. package/dist/unix/parse/parseWeekFromUnix.d.ts +23 -7
  455. package/dist/unix/parse/parseWeekFromUnix.js +3 -7
  456. package/dist/unix/parse/parseYearFromUnix.d.ts +14 -2
  457. package/dist/unix/parse/parseYearFromUnix.js +2 -2
  458. package/dist/unix/validate/isValidUnixRange.d.ts +20 -4
  459. package/dist/unix/validate/isValidUnixRange.js +1 -4
  460. package/dist/utc/calculate/addUtc.d.ts +7 -4
  461. package/dist/utc/calculate/addUtc.js +1 -4
  462. package/dist/utc/calculate/diffUtc.d.ts +1 -1
  463. package/dist/utc/calculate/diffUtc.js +1 -1
  464. package/dist/utc/calculate/diffUtcAsDuration.d.ts +1 -1
  465. package/dist/utc/calculate/diffUtcAsDuration.js +1 -1
  466. package/dist/utc/calculate/endOfUtc.d.ts +16 -3
  467. package/dist/utc/calculate/endOfUtc.js +2 -3
  468. package/dist/utc/calculate/isBetweenUtc.d.ts +13 -2
  469. package/dist/utc/calculate/isBetweenUtc.js +4 -4
  470. package/dist/utc/calculate/roundUtc.d.ts +26 -9
  471. package/dist/utc/calculate/roundUtc.js +3 -12
  472. package/dist/utc/calculate/setUtc.d.ts +7 -4
  473. package/dist/utc/calculate/setUtc.js +1 -4
  474. package/dist/utc/calculate/startOfUtc.d.ts +15 -2
  475. package/dist/utc/calculate/startOfUtc.js +1 -2
  476. package/dist/utc/calculate/subtractUtc.d.ts +7 -4
  477. package/dist/utc/calculate/subtractUtc.js +1 -4
  478. package/dist/utc/compare/areUtcEqualBy.d.ts +9 -3
  479. package/dist/utc/compare/areUtcEqualBy.js +2 -3
  480. package/dist/utc/convert/convertUtcToPlainDate.d.ts +8 -3
  481. package/dist/utc/convert/convertUtcToPlainDate.js +5 -6
  482. package/dist/utc/convert/convertUtcToPlainDateTime.d.ts +8 -3
  483. package/dist/utc/convert/convertUtcToPlainDateTime.js +5 -6
  484. package/dist/utc/convert/convertUtcToPlainTime.d.ts +8 -3
  485. package/dist/utc/convert/convertUtcToPlainTime.js +5 -6
  486. package/dist/utc/convert/convertUtcToUnix.d.ts +9 -4
  487. package/dist/utc/convert/convertUtcToUnix.js +3 -4
  488. package/dist/utc/convert/convertUtcToZoned.d.ts +1 -1
  489. package/dist/utc/convert/convertUtcToZoned.js +1 -1
  490. package/dist/utc/format/formatCalendarUtc.d.ts +19 -8
  491. package/dist/utc/format/formatCalendarUtc.js +8 -6
  492. package/dist/utc/format/formatHttp.d.ts +1 -1
  493. package/dist/utc/format/formatHttp.js +1 -1
  494. package/dist/utc/format/formatRelativeUtc.d.ts +30 -10
  495. package/dist/utc/format/formatRelativeUtc.js +9 -11
  496. package/dist/utc/format/formatUtc.d.ts +17 -15
  497. package/dist/utc/format/formatUtc.js +8 -8
  498. package/dist/utc/interval/intervalDifferenceUtc.d.ts +6 -0
  499. package/dist/utc/interval/intervalDivideEquallyUtc.d.ts +18 -4
  500. package/dist/utc/interval/intervalDivideEquallyUtc.js +5 -4
  501. package/dist/utc/interval/intervalFromDurationUtc.d.ts +13 -3
  502. package/dist/utc/interval/intervalFromDurationUtc.js +1 -3
  503. package/dist/utc/interval/intervalIntersectionUtc.d.ts +6 -0
  504. package/dist/utc/interval/intervalSplitAtUtc.d.ts +8 -0
  505. package/dist/utc/interval/intervalSplitAtUtc.js +2 -0
  506. package/dist/utc/interval/intervalUnionUtc.d.ts +6 -0
  507. package/dist/utc/interval/intervalXorAllUtc.d.ts +6 -0
  508. package/dist/utc/interval/intervalXorUtc.d.ts +6 -0
  509. package/dist/utc/interval/mergeIntervalsUtc.d.ts +6 -0
  510. package/dist/utc/interval/splitIntervalByUnitUtc.d.ts +19 -6
  511. package/dist/utc/interval/splitIntervalByUnitUtc.js +6 -6
  512. package/dist/utc/parse/parseDateFromUtc.d.ts +7 -3
  513. package/dist/utc/parse/parseDateFromUtc.js +1 -3
  514. package/dist/utc/parse/parseDayFromUtc.d.ts +7 -3
  515. package/dist/utc/parse/parseDayFromUtc.js +1 -3
  516. package/dist/utc/parse/parseDayOfWeekFromUtc.d.ts +7 -3
  517. package/dist/utc/parse/parseDayOfWeekFromUtc.js +4 -6
  518. package/dist/utc/parse/parseHourFromUtc.d.ts +7 -3
  519. package/dist/utc/parse/parseHourFromUtc.js +1 -3
  520. package/dist/utc/parse/parseHttp.d.ts +1 -1
  521. package/dist/utc/parse/parseHttp.js +1 -1
  522. package/dist/utc/parse/parseMicrosecondFromUtc.d.ts +7 -3
  523. package/dist/utc/parse/parseMicrosecondFromUtc.js +1 -3
  524. package/dist/utc/parse/parseMillisecondFromUtc.d.ts +7 -3
  525. package/dist/utc/parse/parseMillisecondFromUtc.js +1 -3
  526. package/dist/utc/parse/parseMinuteFromUtc.d.ts +7 -3
  527. package/dist/utc/parse/parseMinuteFromUtc.js +1 -3
  528. package/dist/utc/parse/parseMonthFromUtc.d.ts +7 -3
  529. package/dist/utc/parse/parseMonthFromUtc.js +1 -3
  530. package/dist/utc/parse/parseNanosecondFromUtc.d.ts +7 -3
  531. package/dist/utc/parse/parseNanosecondFromUtc.js +1 -3
  532. package/dist/utc/parse/parseSecondFromUtc.d.ts +7 -3
  533. package/dist/utc/parse/parseSecondFromUtc.js +1 -3
  534. package/dist/utc/parse/parseTimeFromUtc.d.ts +8 -3
  535. package/dist/utc/parse/parseTimeFromUtc.js +5 -6
  536. package/dist/utc/parse/parseUnitFromUtc.d.ts +17 -5
  537. package/dist/utc/parse/parseUnitFromUtc.js +6 -8
  538. package/dist/utc/parse/parseWeekFromUtc.d.ts +18 -10
  539. package/dist/utc/parse/parseWeekFromUtc.js +7 -13
  540. package/dist/utc/parse/parseYearFromUtc.d.ts +7 -3
  541. package/dist/utc/parse/parseYearFromUtc.js +1 -3
  542. package/dist/utc/validate/isValidUtcRange.d.ts +16 -5
  543. package/dist/utc/validate/isValidUtcRange.js +2 -5
  544. package/dist/zoned/calculate/addZoned.d.ts +20 -10
  545. package/dist/zoned/calculate/addZoned.js +6 -13
  546. package/dist/zoned/calculate/cycleZoned.d.ts +33 -8
  547. package/dist/zoned/calculate/cycleZoned.js +1 -8
  548. package/dist/zoned/calculate/diffZoned.d.ts +1 -1
  549. package/dist/zoned/calculate/diffZoned.js +1 -1
  550. package/dist/zoned/calculate/diffZonedAsDuration.d.ts +1 -1
  551. package/dist/zoned/calculate/diffZonedAsDuration.js +1 -1
  552. package/dist/zoned/calculate/endOfQuarterForZoned.d.ts +9 -2
  553. package/dist/zoned/calculate/endOfQuarterForZoned.js +4 -5
  554. package/dist/zoned/calculate/endOfZoned.d.ts +16 -3
  555. package/dist/zoned/calculate/endOfZoned.js +2 -3
  556. package/dist/zoned/calculate/getLocaleZonedEndOfWeek.d.ts +10 -3
  557. package/dist/zoned/calculate/getLocaleZonedEndOfWeek.js +5 -6
  558. package/dist/zoned/calculate/getLocaleZonedStartOfWeek.d.ts +7 -1
  559. package/dist/zoned/calculate/getLocaleZonedStartOfWeek.js +3 -4
  560. package/dist/zoned/calculate/roundZoned.d.ts +21 -4
  561. package/dist/zoned/calculate/roundZoned.js +3 -7
  562. package/dist/zoned/calculate/setZoned.d.ts +25 -8
  563. package/dist/zoned/calculate/setZoned.js +4 -12
  564. package/dist/zoned/calculate/startOfQuarterForZoned.d.ts +7 -2
  565. package/dist/zoned/calculate/startOfQuarterForZoned.js +3 -5
  566. package/dist/zoned/calculate/startOfZoned.d.ts +15 -3
  567. package/dist/zoned/calculate/startOfZoned.js +1 -3
  568. package/dist/zoned/calculate/subtractZoned.d.ts +20 -10
  569. package/dist/zoned/calculate/subtractZoned.js +6 -13
  570. package/dist/zoned/compare/areZonedEqualBy.d.ts +14 -5
  571. package/dist/zoned/compare/areZonedEqualBy.js +7 -5
  572. package/dist/zoned/compare/isBetweenZoned.d.ts +13 -1
  573. package/dist/zoned/compare/isBetweenZoned.js +4 -3
  574. package/dist/zoned/compare/isInDaylightSaving.d.ts +38 -11
  575. package/dist/zoned/compare/isInDaylightSaving.js +40 -44
  576. package/dist/zoned/convert/convertPlainDateTimeToZoned.d.ts +18 -5
  577. package/dist/zoned/convert/convertPlainDateTimeToZoned.js +6 -11
  578. package/dist/zoned/convert/convertZonedToUnix.d.ts +9 -4
  579. package/dist/zoned/convert/convertZonedToUnix.js +2 -4
  580. package/dist/zoned/convert/convertZonedToZoned.d.ts +1 -1
  581. package/dist/zoned/convert/convertZonedToZoned.js +1 -1
  582. package/dist/zoned/format/formatCalendarZoned.d.ts +18 -12
  583. package/dist/zoned/format/formatCalendarZoned.js +13 -9
  584. package/dist/zoned/format/formatRelativeZoned.d.ts +41 -12
  585. package/dist/zoned/format/formatRelativeZoned.js +7 -4
  586. package/dist/zoned/format/formatRfc2822.d.ts +2 -2
  587. package/dist/zoned/format/formatRfc2822.js +2 -2
  588. package/dist/zoned/format/formatRfc3339.d.ts +2 -3
  589. package/dist/zoned/format/formatRfc3339.js +2 -3
  590. package/dist/zoned/format/formatTimeZoneName.d.ts +12 -3
  591. package/dist/zoned/format/formatTimeZoneName.js +5 -4
  592. package/dist/zoned/format/formatZonedDateTime.js +2 -1
  593. package/dist/zoned/format/formatZonedRange.js +2 -1
  594. package/dist/zoned/format/formatZonedToParts.d.ts +15 -4
  595. package/dist/zoned/format/formatZonedToParts.js +8 -5
  596. package/dist/zoned/get/getDstTransitions.d.ts +9 -10
  597. package/dist/zoned/get/getDstTransitions.js +12 -3
  598. package/dist/zoned/get/getTimeZoneOffset.d.ts +4 -1
  599. package/dist/zoned/get/getTimeZoneOffset.js +6 -3
  600. package/dist/zoned/get/getZonedNow.d.ts +13 -1
  601. package/dist/zoned/get/getZonedNow.js +12 -3
  602. package/dist/zoned/interval/intervalDifferenceZoned.d.ts +9 -0
  603. package/dist/zoned/interval/intervalDivideEquallyZoned.d.ts +22 -4
  604. package/dist/zoned/interval/intervalDivideEquallyZoned.js +6 -4
  605. package/dist/zoned/interval/intervalFromDurationZoned.d.ts +29 -10
  606. package/dist/zoned/interval/intervalFromDurationZoned.js +6 -13
  607. package/dist/zoned/interval/intervalIntersectionZoned.d.ts +9 -0
  608. package/dist/zoned/interval/intervalSplitAtZoned.d.ts +11 -0
  609. package/dist/zoned/interval/intervalSplitAtZoned.js +2 -0
  610. package/dist/zoned/interval/intervalUnionZoned.d.ts +9 -0
  611. package/dist/zoned/interval/intervalXorAllZoned.d.ts +9 -0
  612. package/dist/zoned/interval/intervalXorZoned.d.ts +9 -0
  613. package/dist/zoned/interval/mergeIntervalsZoned.d.ts +9 -0
  614. package/dist/zoned/interval/splitIntervalByUnitZoned.d.ts +27 -6
  615. package/dist/zoned/interval/splitIntervalByUnitZoned.js +11 -6
  616. package/dist/zoned/map/mapZonedDatesInRange.d.ts +9 -4
  617. package/dist/zoned/map/mapZonedDatesInRange.js +2 -4
  618. package/dist/zoned/parse/parseRfc2822.d.ts +1 -1
  619. package/dist/zoned/parse/parseRfc2822.js +1 -1
  620. package/dist/zoned/parse/parseUnitFromZoned.d.ts +9 -3
  621. package/dist/zoned/parse/parseUnitFromZoned.js +1 -3
  622. package/dist/zoned/parse/parseWeekFromZoned.d.ts +10 -3
  623. package/dist/zoned/parse/parseWeekFromZoned.js +2 -3
  624. package/dist/zoned/validate/hasDaylightSaving.d.ts +42 -11
  625. package/dist/zoned/validate/hasDaylightSaving.js +47 -31
  626. package/dist/zoned/validate/isValidZonedDateTime.d.ts +13 -0
  627. package/dist/zoned/validate/isValidZonedDateTime.js +14 -1
  628. package/dist/zoned/validate/isValidZonedRange.d.ts +15 -4
  629. package/dist/zoned/validate/isValidZonedRange.js +1 -4
  630. package/package.json +18 -5
  631. package/skills/gmt-arithmetic/SKILL.md +1 -1
  632. package/skills/gmt-basics/SKILL.md +10 -1
  633. package/skills/gmt-integration/SKILL.md +10 -5
  634. package/skills/gmt-timezone/SKILL.md +150 -21
  635. package/dist/internal/resolveReadingTimeZone.d.ts +0 -11
  636. package/dist/internal/resolveReadingTimeZone.js +0 -18
  637. package/dist/types/duration-unit.d.ts +0 -5
  638. /package/dist/types/{duration-unit.js → operating-schedule.js} +0 -0
@@ -2,16 +2,17 @@ import { Temporal } from "@js-temporal/polyfill";
2
2
  import { plainDateUntil } from "./plainDateUntil.js";
3
3
  import { zonedUntil } from "./zonedWallClockDifference.js";
4
4
  export function durationUntilString(start, end, largestUnit, options) {
5
- const untilOptions = {
6
- largestUnit,
5
+ // Each option is read once (GetOption); the difference below works on these values.
6
+ const roundingOptions = {
7
7
  smallestUnit: options?.smallestUnit,
8
8
  roundingIncrement: options?.roundingIncrement,
9
9
  roundingMode: options?.roundingMode,
10
10
  };
11
+ const untilOptions = { largestUnit, ...roundingOptions };
11
12
  const duration = start instanceof Temporal.ZonedDateTime
12
13
  ? zonedUntil(start, end, untilOptions)
13
14
  : start instanceof Temporal.PlainDate
14
- ? plainDateUntil(start, end, largestUnit, options)
15
+ ? plainDateUntil(start, end, largestUnit, roundingOptions)
15
16
  : start.until(end, untilOptions);
16
17
  return duration.toString({
17
18
  smallestUnit: options?.toStringSmallestUnit,
@@ -2,8 +2,7 @@
2
2
  // RFC 7231) mandate English weekday/month
3
3
  // abbreviations regardless of the caller's locale — these are fixed,
4
4
  // non-locale-adaptive grammars, not a display format, so hardcoding the
5
- // English names here is not the i18n bug it would be in a formatter (see
6
- // roadmap Decision 1 / J13's "Why this survives Decision 1").
5
+ // English names here is not the i18n bug it would be in a formatter.
7
6
  // Index 0 = Monday, aligned with Temporal's 1-7 `dayOfWeek` via `[dayOfWeek - 1]`.
8
7
  export const ENGLISH_WEEKDAY_NAMES = [
9
8
  "Mon",
@@ -8,6 +8,8 @@ export declare const MIN_EPOCH_NANOSECONDS = -8640000000000000000000n;
8
8
  * +10^8 days from the Unix epoch, i.e. `+275760-09-13T00:00:00Z`.
9
9
  */
10
10
  export declare const MAX_EPOCH_NANOSECONDS = 8640000000000000000000n;
11
+ /** TC39 `CheckISODaysRange`: a date may sit at most 10^8 days from the Unix epoch. */
12
+ export declare const MAX_ISO_EPOCH_DAYS = 100000000;
11
13
  /**
12
14
  * Digits in `MAX_EPOCH_NANOSECONDS` (22) — the longest a decimal form of an in-range
13
15
  * epoch-nanosecond value can be, sign excluded.
@@ -8,6 +8,8 @@ export const MIN_EPOCH_NANOSECONDS = -8640000000000000000000n;
8
8
  * +10^8 days from the Unix epoch, i.e. `+275760-09-13T00:00:00Z`.
9
9
  */
10
10
  export const MAX_EPOCH_NANOSECONDS = 8640000000000000000000n;
11
+ /** TC39 `CheckISODaysRange`: a date may sit at most 10^8 days from the Unix epoch. */
12
+ export const MAX_ISO_EPOCH_DAYS = 100_000_000;
11
13
  /**
12
14
  * Digits in `MAX_EPOCH_NANOSECONDS` (22) — the longest a decimal form of an in-range
13
15
  * epoch-nanosecond value can be, sign excluded.
@@ -0,0 +1,37 @@
1
+ /**
2
+ * An ISO 8601 duration as exact elapsed nanoseconds, signed, or `null` when it is not one.
3
+ *
4
+ * The transport rule for a span of exact time (`transitTime`, `classifyPunctuality`,
5
+ * `nextDeparture`, …):
6
+ *
7
+ * - Hours, minutes, seconds and fractions are elapsed time, and a day is 24 hours exactly. That
8
+ * is how TC39 Temporal's `Duration.prototype.round` and `total` read a day when no
9
+ * `relativeTo` is given.
10
+ * - Years, months and weeks return `null`: `round` and `total` require a `relativeTo` for them,
11
+ * so they have no exact length on their own. A zero calendar component (`P0Y1D`) changes
12
+ * nothing. (`Temporal.Instant#add` accepts no date unit at all, days included; callers add the
13
+ * nanoseconds this returns instead.)
14
+ * - The result keeps the duration's sign, so a caller that needs a non-negative amount checks
15
+ * `< 0n` itself. `-PT0S` is `0n`.
16
+ * - Summed in bigint, so it stays exact past 2^53 ns and across the whole instant range.
17
+ *
18
+ * @param value candidate ISO 8601 duration string
19
+ * @returns the duration in nanoseconds, negative for a negative duration, or null on invalid input
20
+ *
21
+ * @example exactDurationNanoseconds("PT1H") // 3600000000000n
22
+ * @example exactDurationNanoseconds("-PT5M") // -300000000000n
23
+ * @example exactDurationNanoseconds("P1D") // 86400000000000n
24
+ * @example exactDurationNanoseconds("P1W") // null
25
+ */
26
+ export declare function exactDurationNanoseconds(value: unknown): bigint | null;
27
+ /**
28
+ * `exactDurationNanoseconds` for an amount that may not be negative — a tolerance, a minimum
29
+ * connection — or `null`. Zero is allowed, and `-PT0S` is zero.
30
+ *
31
+ * @param value candidate ISO 8601 duration string
32
+ * @returns the duration in nanoseconds, zero or more, or null on invalid input or a negative duration
33
+ *
34
+ * @example nonNegativeExactDurationNanoseconds("PT15M") // 900000000000n
35
+ * @example nonNegativeExactDurationNanoseconds("-PT15M") // null
36
+ */
37
+ export declare function nonNegativeExactDurationNanoseconds(value: unknown): bigint | null;
@@ -0,0 +1,64 @@
1
+ import { Temporal } from "@js-temporal/polyfill";
2
+ import { NANOSECONDS_PER_DAY, NANOSECONDS_PER_MICROSECOND, NANOSECONDS_PER_MILLISECOND, NANOSECONDS_PER_SECOND, } from "./foreignEpochs.js";
3
+ const NANOSECONDS_PER_HOUR = 3600000000000n;
4
+ const NANOSECONDS_PER_MINUTE = 60000000000n;
5
+ /**
6
+ * An ISO 8601 duration as exact elapsed nanoseconds, signed, or `null` when it is not one.
7
+ *
8
+ * The transport rule for a span of exact time (`transitTime`, `classifyPunctuality`,
9
+ * `nextDeparture`, …):
10
+ *
11
+ * - Hours, minutes, seconds and fractions are elapsed time, and a day is 24 hours exactly. That
12
+ * is how TC39 Temporal's `Duration.prototype.round` and `total` read a day when no
13
+ * `relativeTo` is given.
14
+ * - Years, months and weeks return `null`: `round` and `total` require a `relativeTo` for them,
15
+ * so they have no exact length on their own. A zero calendar component (`P0Y1D`) changes
16
+ * nothing. (`Temporal.Instant#add` accepts no date unit at all, days included; callers add the
17
+ * nanoseconds this returns instead.)
18
+ * - The result keeps the duration's sign, so a caller that needs a non-negative amount checks
19
+ * `< 0n` itself. `-PT0S` is `0n`.
20
+ * - Summed in bigint, so it stays exact past 2^53 ns and across the whole instant range.
21
+ *
22
+ * @param value candidate ISO 8601 duration string
23
+ * @returns the duration in nanoseconds, negative for a negative duration, or null on invalid input
24
+ *
25
+ * @example exactDurationNanoseconds("PT1H") // 3600000000000n
26
+ * @example exactDurationNanoseconds("-PT5M") // -300000000000n
27
+ * @example exactDurationNanoseconds("P1D") // 86400000000000n
28
+ * @example exactDurationNanoseconds("P1W") // null
29
+ */
30
+ export function exactDurationNanoseconds(value) {
31
+ if (typeof value !== "string") {
32
+ return null;
33
+ }
34
+ try {
35
+ const duration = Temporal.Duration.from(value);
36
+ if (duration.years !== 0 || duration.months !== 0 || duration.weeks !== 0) {
37
+ return null;
38
+ }
39
+ return (BigInt(duration.days) * NANOSECONDS_PER_DAY +
40
+ BigInt(duration.hours) * NANOSECONDS_PER_HOUR +
41
+ BigInt(duration.minutes) * NANOSECONDS_PER_MINUTE +
42
+ BigInt(duration.seconds) * NANOSECONDS_PER_SECOND +
43
+ BigInt(duration.milliseconds) * NANOSECONDS_PER_MILLISECOND +
44
+ BigInt(duration.microseconds) * NANOSECONDS_PER_MICROSECOND +
45
+ BigInt(duration.nanoseconds));
46
+ }
47
+ catch {
48
+ return null;
49
+ }
50
+ }
51
+ /**
52
+ * `exactDurationNanoseconds` for an amount that may not be negative — a tolerance, a minimum
53
+ * connection — or `null`. Zero is allowed, and `-PT0S` is zero.
54
+ *
55
+ * @param value candidate ISO 8601 duration string
56
+ * @returns the duration in nanoseconds, zero or more, or null on invalid input or a negative duration
57
+ *
58
+ * @example nonNegativeExactDurationNanoseconds("PT15M") // 900000000000n
59
+ * @example nonNegativeExactDurationNanoseconds("-PT15M") // null
60
+ */
61
+ export function nonNegativeExactDurationNanoseconds(value) {
62
+ const nanoseconds = exactDurationNanoseconds(value);
63
+ return nanoseconds === null || nanoseconds < 0n ? null : nanoseconds;
64
+ }
@@ -0,0 +1,72 @@
1
+ /**
2
+ * How an exact moment was written, so a result can be written the same way: in a named zone
3
+ * (the bracket), at a UTC offset (its text exactly as written), or as a `Z` instant.
4
+ */
5
+ export type MomentNotation = {
6
+ kind: "zone";
7
+ timeZone: string;
8
+ } | {
9
+ kind: "offset";
10
+ offset: string;
11
+ } | {
12
+ kind: "utc";
13
+ };
14
+ /** An exact moment: its epoch nanoseconds and how it was written. */
15
+ export type ExactMoment = {
16
+ nanoseconds: bigint;
17
+ notation: MomentNotation;
18
+ };
19
+ /**
20
+ * Read an exact moment the way `transitTime` reads a departure, or `null`.
21
+ *
22
+ * - A zoned string (`…-04:00[America/New_York]`) is read through its bracket, which must name a
23
+ * real zone that agrees with the offset, as `isValidZonedDateTime` requires. An offset written
24
+ * to the minute agrees when it is the zone's sub-minute offset rounded (TC39
25
+ * `ToTemporalZonedDateTime`, match-minutes), which is how `writeExactMoment` writes one.
26
+ * - A wall time with a bracket and no offset is read in that zone with the `"compatible"`
27
+ * disambiguation policy (`context/reference/LOCAL_TIME_RESOLUTION.md`): an **ambiguous** wall
28
+ * time, a fall-back hour the clock ran through twice, resolves to the **earlier** instant
29
+ * (`2024-11-03T01:30:00[America/New_York]` is `01:30-04:00`), and a **nonexistent** one, a
30
+ * spring-forward hour the clock skipped, to the **later** instant
31
+ * (`2024-03-10T02:30:00[America/New_York]` is `03:30-04:00`). A caller that must not guess
32
+ * refuses the offset-less form before calling, as `nextDeparture` does.
33
+ * - A string that names a zone the zoned read rejects is `null`; it never falls back to its
34
+ * offset. That includes a zoned string whose local date is −271821-04-19, which
35
+ * `Temporal.ZonedDateTime.from` refuses although its instant is in range.
36
+ * - Otherwise an instant (`Z` or an offset) as `parseInstantNanoseconds` reads it: calendar and
37
+ * elective annotations are ignored and a critical unknown one is rejected. Its offset text is
38
+ * kept exactly as written, sub-minute and `,` fractions included.
39
+ *
40
+ * @param value candidate zoned datetime or instant string
41
+ * @returns the moment's epoch nanoseconds and notation, or null on invalid input
42
+ *
43
+ * @example readExactMoment("2024-06-15T10:00:00+09:00") // { nanoseconds: 1718413200000000000n, notation: { kind: "offset", offset: "+09:00" } }
44
+ * @example readExactMoment("2024-06-15T10:00:00Z[Not/AZone]") // null
45
+ * @example readExactMoment("2024-03-10T02:30:00[America/New_York]") // { nanoseconds: 1710055800000000000n, notation: { kind: "zone", timeZone: "America/New_York" } } (nonexistent: the later instant, 03:30-04:00)
46
+ */
47
+ export declare function readExactMoment(value: unknown): ExactMoment | null;
48
+ /**
49
+ * Write epoch nanoseconds the way a moment was written: in its zone, at its offset text, or as a
50
+ * `Z` instant. `""` when the nanoseconds leave the instant range (±8.64e21 ns).
51
+ *
52
+ * - A zone notation is written as Temporal writes a `ZonedDateTime`: the offset in force at that
53
+ * instant, rounded to the minute (`-00:45` for Monrovia's −00:44:30), then the bracket.
54
+ * `readExactMoment` and `parseInstantNanoseconds` read that string back as the same instant,
55
+ * with two exceptions, both Temporal's own. A wall time repeated inside a sub-minute offset
56
+ * change reads as its first pass, in both readers (`parseInstantNanoseconds` states the
57
+ * rule). And `readExactMoment`, a zoned read, refuses a string whose local date is
58
+ * −271821-04-19 (`CheckISODaysRange` in `Temporal.ZonedDateTime.from`): the string written
59
+ * for the first hours of the instant range in a zone west of Greenwich reads as `null` there,
60
+ * and as its instant in `parseInstantNanoseconds`
61
+ * (`context/domination/js-temporal-polyfill-bugs.md` § J).
62
+ * - An offset notation keeps its text as written. The wall clock is shifted, never the instant
63
+ * (`wallClockAtOffset`), so the last hours of the range still write at a positive offset.
64
+ *
65
+ * @param nanoseconds epoch nanoseconds of the moment to write
66
+ * @param notation how to write it, from `readExactMoment`
67
+ * @returns the moment as a zoned, offset or `Z` string, or "" when it is out of range
68
+ *
69
+ * @example writeExactMoment(0n, { kind: "offset", offset: "+09:00" }) // "1970-01-01T09:00:00+09:00"
70
+ * @example writeExactMoment(0n, { kind: "zone", timeZone: "UTC" }) // "1970-01-01T00:00:00+00:00[UTC]"
71
+ */
72
+ export declare function writeExactMoment(nanoseconds: bigint, notation: MomentNotation): string;
@@ -0,0 +1,114 @@
1
+ import { Temporal } from "@js-temporal/polyfill";
2
+ import { isValidZonedDateTime } from "../zoned/validate/isValidZonedDateTime.js";
3
+ import { parseInstantNanoseconds } from "./instantNanoseconds.js";
4
+ import { EXTENDED_UTC_OFFSET, TIME_ZONE_ANNOTATION } from "./isoStringBody.js";
5
+ import { wallClockAtOffset } from "./wallClockAtOffset.js";
6
+ import { utcOffsetStringNanoseconds, zonedDateTimeFrom, } from "./zonedWallClock.js";
7
+ /**
8
+ * Trailing `Z` or extended offset of an instant string, before any annotation. The offset grammar
9
+ * is `isValidInstant`'s own (`EXTENDED_UTC_OFFSET`), so every offset it accepts, `,` fractions
10
+ * included, is captured as written.
11
+ */
12
+ const trailingOffset = new RegExp(`(Z|${EXTENDED_UTC_OFFSET})(?:\\[[^\\]]*\\])*$`);
13
+ /**
14
+ * A time-zone annotation anywhere in the string (`TIME_ZONE_ANNOTATION`). Every `key=value`
15
+ * bracket is a tagged annotation, which the instant parse already decides.
16
+ */
17
+ const zoneAnnotation = new RegExp(TIME_ZONE_ANNOTATION);
18
+ /**
19
+ * Read an exact moment the way `transitTime` reads a departure, or `null`.
20
+ *
21
+ * - A zoned string (`…-04:00[America/New_York]`) is read through its bracket, which must name a
22
+ * real zone that agrees with the offset, as `isValidZonedDateTime` requires. An offset written
23
+ * to the minute agrees when it is the zone's sub-minute offset rounded (TC39
24
+ * `ToTemporalZonedDateTime`, match-minutes), which is how `writeExactMoment` writes one.
25
+ * - A wall time with a bracket and no offset is read in that zone with the `"compatible"`
26
+ * disambiguation policy (`context/reference/LOCAL_TIME_RESOLUTION.md`): an **ambiguous** wall
27
+ * time, a fall-back hour the clock ran through twice, resolves to the **earlier** instant
28
+ * (`2024-11-03T01:30:00[America/New_York]` is `01:30-04:00`), and a **nonexistent** one, a
29
+ * spring-forward hour the clock skipped, to the **later** instant
30
+ * (`2024-03-10T02:30:00[America/New_York]` is `03:30-04:00`). A caller that must not guess
31
+ * refuses the offset-less form before calling, as `nextDeparture` does.
32
+ * - A string that names a zone the zoned read rejects is `null`; it never falls back to its
33
+ * offset. That includes a zoned string whose local date is −271821-04-19, which
34
+ * `Temporal.ZonedDateTime.from` refuses although its instant is in range.
35
+ * - Otherwise an instant (`Z` or an offset) as `parseInstantNanoseconds` reads it: calendar and
36
+ * elective annotations are ignored and a critical unknown one is rejected. Its offset text is
37
+ * kept exactly as written, sub-minute and `,` fractions included.
38
+ *
39
+ * @param value candidate zoned datetime or instant string
40
+ * @returns the moment's epoch nanoseconds and notation, or null on invalid input
41
+ *
42
+ * @example readExactMoment("2024-06-15T10:00:00+09:00") // { nanoseconds: 1718413200000000000n, notation: { kind: "offset", offset: "+09:00" } }
43
+ * @example readExactMoment("2024-06-15T10:00:00Z[Not/AZone]") // null
44
+ * @example readExactMoment("2024-03-10T02:30:00[America/New_York]") // { nanoseconds: 1710055800000000000n, notation: { kind: "zone", timeZone: "America/New_York" } } (nonexistent: the later instant, 03:30-04:00)
45
+ */
46
+ export function readExactMoment(value) {
47
+ if (typeof value !== "string") {
48
+ return null;
49
+ }
50
+ try {
51
+ if (isValidZonedDateTime(value)) {
52
+ const zoned = zonedDateTimeFrom(value);
53
+ return {
54
+ nanoseconds: zoned.epochNanoseconds,
55
+ notation: { kind: "zone", timeZone: zoned.timeZoneId },
56
+ };
57
+ }
58
+ if (zoneAnnotation.test(value)) {
59
+ return null;
60
+ }
61
+ const nanoseconds = parseInstantNanoseconds(value);
62
+ if (nanoseconds === null) {
63
+ return null;
64
+ }
65
+ const offset = trailingOffset.exec(value)?.[1] ?? "Z";
66
+ return {
67
+ nanoseconds,
68
+ notation: offset === "Z" ? { kind: "utc" } : { kind: "offset", offset },
69
+ };
70
+ }
71
+ catch {
72
+ return null;
73
+ }
74
+ }
75
+ /**
76
+ * Write epoch nanoseconds the way a moment was written: in its zone, at its offset text, or as a
77
+ * `Z` instant. `""` when the nanoseconds leave the instant range (±8.64e21 ns).
78
+ *
79
+ * - A zone notation is written as Temporal writes a `ZonedDateTime`: the offset in force at that
80
+ * instant, rounded to the minute (`-00:45` for Monrovia's −00:44:30), then the bracket.
81
+ * `readExactMoment` and `parseInstantNanoseconds` read that string back as the same instant,
82
+ * with two exceptions, both Temporal's own. A wall time repeated inside a sub-minute offset
83
+ * change reads as its first pass, in both readers (`parseInstantNanoseconds` states the
84
+ * rule). And `readExactMoment`, a zoned read, refuses a string whose local date is
85
+ * −271821-04-19 (`CheckISODaysRange` in `Temporal.ZonedDateTime.from`): the string written
86
+ * for the first hours of the instant range in a zone west of Greenwich reads as `null` there,
87
+ * and as its instant in `parseInstantNanoseconds`
88
+ * (`context/domination/js-temporal-polyfill-bugs.md` § J).
89
+ * - An offset notation keeps its text as written. The wall clock is shifted, never the instant
90
+ * (`wallClockAtOffset`), so the last hours of the range still write at a positive offset.
91
+ *
92
+ * @param nanoseconds epoch nanoseconds of the moment to write
93
+ * @param notation how to write it, from `readExactMoment`
94
+ * @returns the moment as a zoned, offset or `Z` string, or "" when it is out of range
95
+ *
96
+ * @example writeExactMoment(0n, { kind: "offset", offset: "+09:00" }) // "1970-01-01T09:00:00+09:00"
97
+ * @example writeExactMoment(0n, { kind: "zone", timeZone: "UTC" }) // "1970-01-01T00:00:00+00:00[UTC]"
98
+ */
99
+ export function writeExactMoment(nanoseconds, notation) {
100
+ try {
101
+ const instant = Temporal.Instant.fromEpochNanoseconds(nanoseconds);
102
+ if (notation.kind === "zone") {
103
+ return instant.toZonedDateTimeISO(notation.timeZone).toString();
104
+ }
105
+ if (notation.kind === "utc") {
106
+ return instant.toString();
107
+ }
108
+ const wall = wallClockAtOffset(instant, utcOffsetStringNanoseconds(notation.offset));
109
+ return `${wall.toString()}${notation.offset}`;
110
+ }
111
+ catch {
112
+ return "";
113
+ }
114
+ }
@@ -10,9 +10,10 @@ import type { FiscalPattern } from "../types/index.js";
10
10
  * off the result.
11
11
  *
12
12
  * - The month-day is moved into `year` with Temporal's `overflow: "constrain"`, so a
13
- * February 29 anchor targets February 28 in a common year before the weekday shift. A
14
- * "month-end" rule (the 26 CFR 1.441-2 style, "the last Saturday of February") would
15
- * instead put a February 28 anchor on February 29 in a leap year; this does not.
13
+ * February 29 anchor targets February 28 in a common year before the weekday shift. A rule
14
+ * tied to the end of a month ("the last Saturday of February", or the Saturday nearest the
15
+ * month's last day) would instead put a February 28 anchor on February 29 in a leap year;
16
+ * this does not.
16
17
  */
17
18
  export declare function fiscalYearEndIn(anchor: Temporal.PlainDate, year: number): Temporal.PlainDate;
18
19
  /**
@@ -32,9 +32,10 @@ const NEAREST_WEEKDAY_RADIUS = 3;
32
32
  * off the result.
33
33
  *
34
34
  * - The month-day is moved into `year` with Temporal's `overflow: "constrain"`, so a
35
- * February 29 anchor targets February 28 in a common year before the weekday shift. A
36
- * "month-end" rule (the 26 CFR 1.441-2 style, "the last Saturday of February") would
37
- * instead put a February 28 anchor on February 29 in a leap year; this does not.
35
+ * February 29 anchor targets February 28 in a common year before the weekday shift. A rule
36
+ * tied to the end of a month ("the last Saturday of February", or the Saturday nearest the
37
+ * month's last day) would instead put a February 28 anchor on February 29 in a leap year;
38
+ * this does not.
38
39
  */
39
40
  export function fiscalYearEndIn(anchor, year) {
40
41
  const target = anchor.with({ year }, { overflow: "constrain" });
@@ -13,7 +13,7 @@ import type { Temporal } from "@js-temporal/polyfill";
13
13
  * @example formatCalendarDays(1, 1710685800000, "UTC", "en-US", "short") // "tomorrow at 2:30 PM"
14
14
  * @example formatCalendarDays(-9, 1710685800000, "UTC", "en-US", "short") // "March 17, 2024 at 2:30 PM"
15
15
  */
16
- export declare function formatCalendarDays(diffDays: number, epochMilliseconds: number, timeZone: string, locale: string | string[] | undefined, timeStyle: "short" | "medium" | "full"): string;
16
+ export declare function formatCalendarDays(diffDays: number, epochMilliseconds: number, timeZone: string, locale: string | string[] | undefined, timeStyle: "short" | "medium" | "long" | "full"): string;
17
17
  /**
18
18
  * `formatCalendarDays` for two instants, counting calendar days between their dates in `timeZone`.
19
19
  *
@@ -25,4 +25,4 @@ export declare function formatCalendarDays(diffDays: number, epochMilliseconds:
25
25
  * @returns the phrase; throws where Temporal or `Intl` throws
26
26
  * @example formatCalendarInstants(Temporal.Instant.from("2024-03-17T14:30:00Z"), Temporal.Instant.from("2024-03-16T09:00:00Z"), "UTC", "en-US", "short") // "tomorrow at 2:30 PM"
27
27
  */
28
- export declare function formatCalendarInstants(target: Temporal.Instant, reference: Temporal.Instant, timeZone: string, locale: string | string[] | undefined, timeStyle: "short" | "medium" | "full"): string;
28
+ export declare function formatCalendarInstants(target: Temporal.Instant, reference: Temporal.Instant, timeZone: string, locale: string | string[] | undefined, timeStyle: "short" | "medium" | "long" | "full"): string;
@@ -23,5 +23,25 @@ export interface RelativeDurationFormatOptions {
23
23
  * @example formatRelativeDuration(Temporal.Duration.from({ hours: 36 }), "en-US", { largestUnit: "hour" }, () => 0) // "in 36 hours"
24
24
  * @example formatRelativeDuration(Temporal.Duration.from({ days: 400 }), "en-US", {}, () => 1) // "next year" (month/year totals come from calendarTotal)
25
25
  */
26
- export declare function formatRelativeDuration(diff: Temporal.Duration, locale: string | string[] | undefined, options: RelativeDurationFormatOptions, calendarTotal: (unit: RelativeUnitName) => number): string;
26
+ export declare function formatRelativeDuration(diff: Temporal.Duration, locale: string | string[] | undefined, options: RelativeDurationFormatOptions, calendarTotal: (unit: RelativeUnit) => number): string;
27
+ /**
28
+ * Round a distance to a whole number of `unit` and render it with `Intl.RelativeTimeFormat`. The
29
+ * shared last step of every `formatRelative*` function.
30
+ *
31
+ * - `numeric` and `style` are read here, once each (GetOption); `roundingMethod` is passed in
32
+ * because the caller has already read it.
33
+ *
34
+ * @param total the signed fractional distance in `unit`
35
+ * @param unit the singular unit the distance is written in
36
+ * @param locale BCP 47 locale(s) passed through to `Intl.RelativeTimeFormat`
37
+ * @param options the caller's options, read for `numeric` (default `"auto"`) and `style`
38
+ * (default `"long"`)
39
+ * @param roundingMethod the caller's `roundingMethod`, `undefined` for the default `"round"`
40
+ * @returns the formatted phrase; throws where `Intl` throws or the rounding method is invalid, for
41
+ * the caller's sentinel
42
+ * @example formatRelativeAmount(-1.5, "hour", "en-US", {}, "floor") // "2 hours ago"
43
+ * @example formatRelativeAmount(1, "day", "en-US", { numeric: "always" }, undefined) // "in 1 day"
44
+ * @example formatRelativeAmount(1, "day", "en-US", { style: "wide" as never }, undefined) // throws RangeError
45
+ */
46
+ export declare function formatRelativeAmount(total: number, unit: RelativeUnit, locale: string | string[] | undefined, options: Pick<RelativeDurationFormatOptions, "numeric" | "style">, roundingMethod: RelativeRoundingMethod | undefined): string;
27
47
  export {};
@@ -1,5 +1,18 @@
1
1
  import { normalizeDateTime } from "./normalizeDateTime.js";
2
2
  import { resolveRelativeRounding } from "./resolveRelativeRounding.js";
3
+ import { optionOrDefault } from "./optionOrDefault.js";
4
+ import { resolveRelativeUnit } from "./resolveRelativeUnit.js";
5
+ // The units of the seven-unit functions: Temporal's datetime unit group down to the second, less
6
+ // the sub-second units, which Intl.RelativeTimeFormat does not have.
7
+ const RELATIVE_UNITS = [
8
+ "year",
9
+ "month",
10
+ "week",
11
+ "day",
12
+ "hour",
13
+ "minute",
14
+ "second",
15
+ ];
3
16
  // Seconds up to a day, then formatRelativeDate's day thresholds (7, 28 and 365 days).
4
17
  const SECONDS_PER_DAY = 86_400;
5
18
  const AUTO_UNITS = [
@@ -26,20 +39,47 @@ const AUTO_UNITS = [
26
39
  * @example formatRelativeDuration(Temporal.Duration.from({ days: 400 }), "en-US", {}, () => 1) // "next year" (month/year totals come from calendarTotal)
27
40
  */
28
41
  export function formatRelativeDuration(diff, locale, options, calendarTotal) {
42
+ // Each option is read once (GetOption), and largestUnit is validated before anything is measured.
43
+ const forcedUnit = resolveRelativeUnit(options.largestUnit, RELATIVE_UNITS);
44
+ const roundingMethod = options.roundingMethod;
29
45
  const absSeconds = Math.abs(diff.total("second"));
30
- const unit = options.largestUnit === undefined
46
+ const unit = forcedUnit === undefined
31
47
  ? (AUTO_UNITS.find((t) => absSeconds < t.maxSeconds)?.unit ?? "year")
32
- : options.largestUnit;
33
- let amount;
48
+ : forcedUnit;
49
+ let total;
34
50
  try {
35
- amount = resolveRelativeRounding(diff.total(unit), options.roundingMethod);
51
+ total = diff.total(unit);
36
52
  }
37
53
  catch {
38
54
  // month/year are calendrical and need a relativeTo anchor.
39
- amount = resolveRelativeRounding(calendarTotal(unit), options.roundingMethod);
55
+ total = calendarTotal(unit);
40
56
  }
57
+ // Outside the retry: an invalid roundingMethod throws once, straight to the caller's sentinel.
58
+ return formatRelativeAmount(total, unit, locale, options, roundingMethod);
59
+ }
60
+ /**
61
+ * Round a distance to a whole number of `unit` and render it with `Intl.RelativeTimeFormat`. The
62
+ * shared last step of every `formatRelative*` function.
63
+ *
64
+ * - `numeric` and `style` are read here, once each (GetOption); `roundingMethod` is passed in
65
+ * because the caller has already read it.
66
+ *
67
+ * @param total the signed fractional distance in `unit`
68
+ * @param unit the singular unit the distance is written in
69
+ * @param locale BCP 47 locale(s) passed through to `Intl.RelativeTimeFormat`
70
+ * @param options the caller's options, read for `numeric` (default `"auto"`) and `style`
71
+ * (default `"long"`)
72
+ * @param roundingMethod the caller's `roundingMethod`, `undefined` for the default `"round"`
73
+ * @returns the formatted phrase; throws where `Intl` throws or the rounding method is invalid, for
74
+ * the caller's sentinel
75
+ * @example formatRelativeAmount(-1.5, "hour", "en-US", {}, "floor") // "2 hours ago"
76
+ * @example formatRelativeAmount(1, "day", "en-US", { numeric: "always" }, undefined) // "in 1 day"
77
+ * @example formatRelativeAmount(1, "day", "en-US", { style: "wide" as never }, undefined) // throws RangeError
78
+ */
79
+ export function formatRelativeAmount(total, unit, locale, options, roundingMethod) {
80
+ const amount = resolveRelativeRounding(total, roundingMethod);
41
81
  return normalizeDateTime(new Intl.RelativeTimeFormat(locale, {
42
- numeric: options.numeric === undefined ? "auto" : options.numeric,
43
- style: options.style === undefined ? "long" : options.style,
82
+ numeric: optionOrDefault(options.numeric, "auto"),
83
+ style: optionOrDefault(options.style, "long"),
44
84
  }).format(amount, unit));
45
85
  }
@@ -7,6 +7,7 @@ export { calendarOfAllDateValues, calendarSystemOfDateValue, } from "./calendarV
7
7
  export { calendarOfAllZonedValues, calendarSystemOfZonedValue, } from "./calendarValueOfZoned.js";
8
8
  export { formatZonedInCalendar, parseCalendarZonedValue, } from "./calendarZonedString.js";
9
9
  export { cycleFieldValue } from "./cycleFieldValue.js";
10
+ export { isInDaylightTime, observesDaylightTime } from "./daylightTime.js";
10
11
  export { fiscalPeriodOfWeek, fiscalYearOf } from "./fiscalCalendar.js";
11
12
  export { floorDivide } from "./floorDivide.js";
12
13
  export { DOT_NET_TICKS_EPOCH_OFFSET, EXCEL_1900_EPOCH_NANOSECONDS, EXCEL_1900_PHANTOM_END_NANOSECONDS, EXCEL_1900_PRE_PHANTOM_EPOCH_NANOSECONDS, EXCEL_1904_EPOCH_NANOSECONDS, EXCEL_PHANTOM_SERIAL, FILE_TIME_EPOCH_OFFSET_TICKS, MAX_DOT_NET_TICKS, MAX_EXCEL_1900_SERIAL_EXCLUSIVE, MAX_EXCEL_1904_SERIAL_EXCLUSIVE, MAX_FILE_TIME, MILLISECONDS_PER_DAY, MIN_DOT_NET_TICKS, MIN_EXCEL_1900_SERIAL, MIN_EXCEL_1904_SERIAL, MIN_FILE_TIME, MIN_PG_MICROSECONDS, NANOSECONDS_PER_DAY, NANOSECONDS_PER_DAY_NUMBER, NANOSECONDS_PER_MICROSECOND, NANOSECONDS_PER_MILLISECOND, NANOSECONDS_PER_SECOND, NANOSECONDS_PER_TICK, NTP_EPOCH_OFFSET_NANOSECONDS, NTP_ERA_UNITS, NTP_UNITS_PER_SECOND, PG_EPOCH_OFFSET_MICROSECONDS, } from "./foreignEpochs.js";
@@ -14,13 +15,15 @@ export { isValidEpochNanoseconds, MAX_EPOCH_NANOSECOND_DIGITS, } from "./epochNa
14
15
  export { dateCycleFieldBounds } from "./dateCycleFieldBounds.js";
15
16
  export { timeCycleFieldBounds } from "./timeCycleFieldBounds.js";
16
17
  export { durationUntilString } from "./durationUntilString.js";
18
+ export { exactDurationNanoseconds, nonNegativeExactDurationNanoseconds, } from "./exactDuration.js";
19
+ export { type ExactMoment, readExactMoment, writeExactMoment, } from "./exactMoment.js";
17
20
  export { formatDateInCalendar } from "./formatDateInCalendar.js";
18
21
  export { bandsByTier, parseFreeDays, parseFreeTimeTerms, parseTiers, walkFreeTime, } from "./freeTimeLedger.js";
19
22
  export { halfOpenAbuts, halfOpenContainsPoint, halfOpenContainsSpan, halfOpenDifference, halfOpenIntersection, halfOpenMerge, halfOpenOverlap, halfOpenUnion, halfOpenXor, } from "./halfOpenIntervals.js";
20
- export { EXTENDED_UTC_OFFSET, isoStringBody, TIME_ZONE_ANNOTATION, } from "./isoStringBody.js";
23
+ export { isoStringBody, TIME_ZONE_ANNOTATION } from "./isoStringBody.js";
21
24
  export { formatHourDuration } from "./hourDurationString.js";
22
25
  export { canonicalInstantIntervals } from "./instantIntervalText.js";
23
- export { parseInstantNanoseconds } from "./instantNanoseconds.js";
26
+ export { instantFrom, parseInstantNanoseconds } from "./instantNanoseconds.js";
24
27
  export { coalesceIntervalNanoseconds, parseIntervalNanoseconds, parseIntervalNanosecondsList, } from "./intervalNanoseconds.js";
25
28
  export { resolveDurationRelativeTo } from "./resolveDurationRelativeTo.js";
26
29
  export { formatUtcOffset, parseUtcOffsetNanoseconds } from "./utcOffsetString.js";
@@ -39,6 +42,7 @@ export { monthGridWeekRow } from "./monthGridWeekRow.js";
39
42
  export { normalizeDateTime } from "./normalizeDateTime.js";
40
43
  export { DATE_PATTERN_FIELDS, DATE_TIME_PATTERN_FIELDS, parseValueWithPattern, TIME_PATTERN_FIELDS, } from "./patternToken.js";
41
44
  export { plainDateAdd } from "./plainDateAdd.js";
45
+ export { parsePunctualityTolerance, punctualityOf } from "./punctuality.js";
42
46
  export { plainDateUntil } from "./plainDateUntil.js";
43
47
  export { resolveDateTimeUnit } from "./resolveDateTimeUnit.js";
44
48
  export { resolveDurationUnit } from "./resolveDurationUnit.js";
@@ -46,10 +50,11 @@ export { resolveOverflow } from "./resolveOverflow.js";
46
50
  export { resolveRelativeRounding } from "./resolveRelativeRounding.js";
47
51
  export { parseUnixEpochInterval, parseUnixEpochIntervalList, parseUnixEpochIntervalPair, parseUnixEpochValue, } from "./unixEpochValue.js";
48
52
  export { tileByUnit } from "./splitStep.js";
53
+ export { parseTimestampEvents } from "./timestampEvents.js";
49
54
  export { countZonedBuckets, nextZonedBucketStart, type WeekStartDay, zonedUnitEnd, zonedUnitStart, } from "./zonedBucket.js";
50
55
  export { countZonedLocalDates } from "./zonedLocalDates.js";
51
- export { utcOffsetStringNanoseconds, zonedDateTimeFrom, } from "./zonedWallClock.js";
56
+ export { zonedDateTimeFrom } from "./zonedWallClock.js";
52
57
  export { wallClockAtOffset } from "./wallClockAtOffset.js";
53
58
  export { durationCompare, durationRound, durationTotal, isCalendarDifferenceAcrossZones, plainUntilWithRounding, zonedUntil, } from "./zonedWallClockDifference.js";
54
- export { addToZoned, addToZonedDisambiguated, plainToZoned, roundZonedDateTime, subtractFromZoned, withZonedFields, zonedHoursInDay, zonedNextTransition, zonedStartOfDay, } from "./zonedWallClockOperations.js";
59
+ export { addToZoned, addToZonedDisambiguated, plainToZoned, roundZonedDateTime, subtractFromZoned, withZonedFields, zonedHoursInDay, zonedNextTransition, zonedPreviousTransition, zonedStartOfDay, } from "./zonedWallClockOperations.js";
55
60
  export { zonelessCalendarDate } from "./zonelessCalendarDate.js";
@@ -7,6 +7,7 @@ export { calendarOfAllDateValues, calendarSystemOfDateValue, } from "./calendarV
7
7
  export { calendarOfAllZonedValues, calendarSystemOfZonedValue, } from "./calendarValueOfZoned.js";
8
8
  export { formatZonedInCalendar, parseCalendarZonedValue, } from "./calendarZonedString.js";
9
9
  export { cycleFieldValue } from "./cycleFieldValue.js";
10
+ export { isInDaylightTime, observesDaylightTime } from "./daylightTime.js";
10
11
  export { fiscalPeriodOfWeek, fiscalYearOf } from "./fiscalCalendar.js";
11
12
  export { floorDivide } from "./floorDivide.js";
12
13
  export { DOT_NET_TICKS_EPOCH_OFFSET, EXCEL_1900_EPOCH_NANOSECONDS, EXCEL_1900_PHANTOM_END_NANOSECONDS, EXCEL_1900_PRE_PHANTOM_EPOCH_NANOSECONDS, EXCEL_1904_EPOCH_NANOSECONDS, EXCEL_PHANTOM_SERIAL, FILE_TIME_EPOCH_OFFSET_TICKS, MAX_DOT_NET_TICKS, MAX_EXCEL_1900_SERIAL_EXCLUSIVE, MAX_EXCEL_1904_SERIAL_EXCLUSIVE, MAX_FILE_TIME, MILLISECONDS_PER_DAY, MIN_DOT_NET_TICKS, MIN_EXCEL_1900_SERIAL, MIN_EXCEL_1904_SERIAL, MIN_FILE_TIME, MIN_PG_MICROSECONDS, NANOSECONDS_PER_DAY, NANOSECONDS_PER_DAY_NUMBER, NANOSECONDS_PER_MICROSECOND, NANOSECONDS_PER_MILLISECOND, NANOSECONDS_PER_SECOND, NANOSECONDS_PER_TICK, NTP_EPOCH_OFFSET_NANOSECONDS, NTP_ERA_UNITS, NTP_UNITS_PER_SECOND, PG_EPOCH_OFFSET_MICROSECONDS, } from "./foreignEpochs.js";
@@ -14,13 +15,15 @@ export { isValidEpochNanoseconds, MAX_EPOCH_NANOSECOND_DIGITS, } from "./epochNa
14
15
  export { dateCycleFieldBounds } from "./dateCycleFieldBounds.js";
15
16
  export { timeCycleFieldBounds } from "./timeCycleFieldBounds.js";
16
17
  export { durationUntilString } from "./durationUntilString.js";
18
+ export { exactDurationNanoseconds, nonNegativeExactDurationNanoseconds, } from "./exactDuration.js";
19
+ export { readExactMoment, writeExactMoment, } from "./exactMoment.js";
17
20
  export { formatDateInCalendar } from "./formatDateInCalendar.js";
18
21
  export { bandsByTier, parseFreeDays, parseFreeTimeTerms, parseTiers, walkFreeTime, } from "./freeTimeLedger.js";
19
22
  export { halfOpenAbuts, halfOpenContainsPoint, halfOpenContainsSpan, halfOpenDifference, halfOpenIntersection, halfOpenMerge, halfOpenOverlap, halfOpenUnion, halfOpenXor, } from "./halfOpenIntervals.js";
20
- export { EXTENDED_UTC_OFFSET, isoStringBody, TIME_ZONE_ANNOTATION, } from "./isoStringBody.js";
23
+ export { isoStringBody, TIME_ZONE_ANNOTATION } from "./isoStringBody.js";
21
24
  export { formatHourDuration } from "./hourDurationString.js";
22
25
  export { canonicalInstantIntervals } from "./instantIntervalText.js";
23
- export { parseInstantNanoseconds } from "./instantNanoseconds.js";
26
+ export { instantFrom, parseInstantNanoseconds } from "./instantNanoseconds.js";
24
27
  export { coalesceIntervalNanoseconds, parseIntervalNanoseconds, parseIntervalNanosecondsList, } from "./intervalNanoseconds.js";
25
28
  export { resolveDurationRelativeTo } from "./resolveDurationRelativeTo.js";
26
29
  export { formatUtcOffset, parseUtcOffsetNanoseconds } from "./utcOffsetString.js";
@@ -39,6 +42,7 @@ export { monthGridWeekRow } from "./monthGridWeekRow.js";
39
42
  export { normalizeDateTime } from "./normalizeDateTime.js";
40
43
  export { DATE_PATTERN_FIELDS, DATE_TIME_PATTERN_FIELDS, parseValueWithPattern, TIME_PATTERN_FIELDS, } from "./patternToken.js";
41
44
  export { plainDateAdd } from "./plainDateAdd.js";
45
+ export { parsePunctualityTolerance, punctualityOf } from "./punctuality.js";
42
46
  export { plainDateUntil } from "./plainDateUntil.js";
43
47
  export { resolveDateTimeUnit } from "./resolveDateTimeUnit.js";
44
48
  export { resolveDurationUnit } from "./resolveDurationUnit.js";
@@ -46,10 +50,11 @@ export { resolveOverflow } from "./resolveOverflow.js";
46
50
  export { resolveRelativeRounding } from "./resolveRelativeRounding.js";
47
51
  export { parseUnixEpochInterval, parseUnixEpochIntervalList, parseUnixEpochIntervalPair, parseUnixEpochValue, } from "./unixEpochValue.js";
48
52
  export { tileByUnit } from "./splitStep.js";
53
+ export { parseTimestampEvents } from "./timestampEvents.js";
49
54
  export { countZonedBuckets, nextZonedBucketStart, zonedUnitEnd, zonedUnitStart, } from "./zonedBucket.js";
50
55
  export { countZonedLocalDates } from "./zonedLocalDates.js";
51
- export { utcOffsetStringNanoseconds, zonedDateTimeFrom, } from "./zonedWallClock.js";
56
+ export { zonedDateTimeFrom } from "./zonedWallClock.js";
52
57
  export { wallClockAtOffset } from "./wallClockAtOffset.js";
53
58
  export { durationCompare, durationRound, durationTotal, isCalendarDifferenceAcrossZones, plainUntilWithRounding, zonedUntil, } from "./zonedWallClockDifference.js";
54
- export { addToZoned, addToZonedDisambiguated, plainToZoned, roundZonedDateTime, subtractFromZoned, withZonedFields, zonedHoursInDay, zonedNextTransition, zonedStartOfDay, } from "./zonedWallClockOperations.js";
59
+ export { addToZoned, addToZonedDisambiguated, plainToZoned, roundZonedDateTime, subtractFromZoned, withZonedFields, zonedHoursInDay, zonedNextTransition, zonedPreviousTransition, zonedStartOfDay, } from "./zonedWallClockOperations.js";
55
60
  export { zonelessCalendarDate } from "./zonelessCalendarDate.js";
@@ -4,6 +4,7 @@
4
4
  // and GetDateTimeFormat with required ~any~ and inherit ~all~, so every caller
5
5
  // field, including `era` and `timeZoneName`, is passed on unchanged.
6
6
  import { plainDateTimeFormatOptions } from "./plainFormatOptions.js";
7
+ import { optionOrDefault } from "./optionOrDefault.js";
7
8
  // GetDateTimeFormat requiredOptions for ~any~. `era` and `timeZoneName` are
8
9
  // deliberately absent: neither suppresses the defaults.
9
10
  const REQUIRED_FIELDS = [
@@ -58,7 +59,7 @@ export function instantFormatOptions(options, timeZone, defaults) {
58
59
  ...DEFAULT_FIELDS,
59
60
  ...(defaults === "zoned-date-time"
60
61
  ? {
61
- timeZoneName: options.timeZoneName === undefined ? "short" : options.timeZoneName,
62
+ timeZoneName: optionOrDefault(options.timeZoneName, "short"),
62
63
  }
63
64
  : {}),
64
65
  timeZone,