@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
@@ -1,16 +1,62 @@
1
+ import { Temporal } from "@js-temporal/polyfill";
1
2
  /**
2
3
  * Parse an ISO 8601 instant string to epoch nanoseconds, or `null` when it is not one.
3
4
  *
4
- * The single definition of "an instant string GMT accepts": the RFC 9557 instant grammar
5
- * `Temporal.Instant.from` parses, restricted to ISO 8601 extended format before the first `[`
6
- * (`instantBody`: `<date>T<time>`, then `Z` or `±HH:MM[:SS[.fraction]]`), minus
7
- * leap seconds (which Temporal clamps rather than rejects). Basic format, a space or lower-case
8
- * `t` separator, a lower-case `z` and an hour-only time or offset are rejected. Annotations are read as Temporal reads them (proposal-temporal
5
+ * The single definition of "an instant string GMT accepts", and of the instant it names. Every
6
+ * GMT function that reads a moment without keeping its zone reads through here.
7
+ *
8
+ * **Which strings.** The RFC 9557 instant grammar `Temporal.Instant.from` parses, restricted to
9
+ * ISO 8601 extended format before the first `[` (`instantBody`: `<date>T<time>`, then `Z` or
10
+ * `±HH:MM[:SS[.fraction]]`), minus leap seconds (which Temporal clamps rather than rejects).
11
+ * Basic format, a space or lower-case `t` separator, a lower-case `z` and an hour-only time or
12
+ * offset are rejected. Annotations are read as Temporal reads them (proposal-temporal
9
13
  * `ParseISODateTime`, RFC 9557 §3.3): a time zone, calendar (`[u-ca=hebrew]`) or elective
10
- * (`[foo=bar]`) annotation is ignored, because an instant has neither zone nor calendar, and an
11
- * unknown critical one (`[!foo=bar]`) is rejected. Callers layer their own sentinel on top —
12
- * `toNanoseconds` returns `0n`, `spanNs` returns `null` — so the parse result stays unambiguous
13
- * here.
14
+ * (`[foo=bar]`) annotation never makes a string invalid, and an unknown critical one
15
+ * (`[!foo=bar]`) is rejected.
16
+ *
17
+ * **Which instant.** The written offset fixes it, as in `Temporal.Instant.from`, with one
18
+ * exception:
19
+ *
20
+ * - **A minute-rounded offset is read as its zone's real offset.** When the string has a
21
+ * bracketed zone and an offset written to the minute, and that offset is the zone's actual
22
+ * offset at that wall time rounded to the minute, the instant is the one the zone gives. This
23
+ * is TC39 `ToTemporalZonedDateTime`'s match-minutes rule (`InterpretISODateTimeOffset`),
24
+ * applied to the zone and the offset alone. It exists because
25
+ * `Temporal.ZonedDateTime.prototype.toString` writes the offset rounded to the minute: in a
26
+ * zone with a sub-minute offset (`Africa/Monrovia` before 1972, at −00:44:30, written
27
+ * `-00:45`), the string a zoned function writes would otherwise be read up to 30 seconds off.
28
+ * - **The instant range is the only range.** The match has no `CheckISODaysRange` on the local
29
+ * date, which `Temporal.ZonedDateTime.from` has, and does not need the written offset's own
30
+ * reading to be in range. So every string Temporal writes for an instant in range is read
31
+ * back, the first and last instants included: `-271821-04-19T23:58:45-00:01[Europe/London]`
32
+ * (London's local mean time, −00:01:15) is the first instant, although its local date is
33
+ * outside Temporal's date range and its reading at −00:01 is 15 seconds before the range.
34
+ * - **A repeated wall time inside a sub-minute offset change reads as its first pass.** The
35
+ * match is against each candidate instant in order, so when a wall time happened twice and
36
+ * the rounded offset fits the first pass, the first pass is the answer, even if the string
37
+ * was written for the second. This is a class of strings, not one zone: it arises wherever a
38
+ * zone's history has a fall-back of under a minute at a sub-minute offset. The example
39
+ * test262 uses: Pacific/Niue moved from −11:19:40 to −11:20:00 at the end of
40
+ * 15 October 1952, so 23:59:40 to 23:59:59 happened twice, 20 seconds apart, and both passes
41
+ * are written `-11:20`: `1952-10-15T23:59:59-11:20[Pacific/Niue]` reads as the pass at
42
+ * −11:19:40. This is `Temporal.ZonedDateTime.from`'s own reading (test262
43
+ * `intl402/Temporal/ZonedDateTime/from/zoneddatetime-sub-minute-offset.js`), and the one kind
44
+ * of string Temporal writes that an instant reader does not read as the instant it was
45
+ * written for. The exact offset, `-11:20:00`, names the second pass.
46
+ * - **Everything else keeps the written offset.** The complete list: a string without a
47
+ * bracket; a `Z` instant; an offset written with seconds, which TC39 matches exactly
48
+ * (`-00:45:00[Africa/Monrovia]` is −00:45:00); a bracket whose zone does not exist; and a
49
+ * bracket whose zone has no instant in range with that wall time at the written offset or at
50
+ * an offset that rounds to it (`-00:44[Africa/Monrovia]`, `-05:00[America/New_York]` in
51
+ * June). Such a bracket is not validated here; a function that keeps the zone
52
+ * (`transitTime`, `toOffsetInstant`) rejects it instead. Calendar and elective annotations
53
+ * never change the reading. A string whose written reading is outside the instant range, and
54
+ * which the zone does not bring inside it, is `null`.
55
+ *
56
+ * The zone's offset comes from Temporal's time-zone data; nothing here holds an offset or a
57
+ * zone name. A string in a whole-minute zone costs two offset lookups more than
58
+ * `Temporal.Instant.from`. Callers layer their own sentinel on top — `toNanoseconds` returns
59
+ * `0n`, `spanNs` returns `null` — so the parse result stays unambiguous here.
14
60
  *
15
61
  * @param value candidate ISO 8601 instant string
16
62
  * @returns nanoseconds since the Unix epoch, or null when `value` is not a valid instant
@@ -21,5 +67,25 @@
21
67
  * @example parseInstantNanoseconds("20240310T120000Z") // null — basic format
22
68
  * @example parseInstantNanoseconds("2024-03-10T12:00:00z") // null — lower-case z
23
69
  * @example parseInstantNanoseconds("1970-01-01T00:00:00Z[u-ca=hebrew]") // 0n — calendar annotation ignored
70
+ * @example parseInstantNanoseconds("1960-01-01T00:20:00-00:45[Africa/Monrovia]") // -315615330000000000n — 01:04:30Z: Monrovia stood at -00:44:30
71
+ * @example parseInstantNanoseconds("1960-01-01T00:20:00-00:45") // -315615300000000000n — 01:05:00Z: no zone, so the offset is exact
72
+ * @example parseInstantNanoseconds("1952-10-15T23:59:59-11:20[Pacific/Niue]") // -543069621000000000n — the first pass of a repeated second, at -11:19:40
73
+ * @example parseInstantNanoseconds("-271821-04-19T23:58:45-00:01[Europe/London]") // -8640000000000000000000n — the first instant, at London's -00:01:15
74
+ * @example parseInstantNanoseconds("2024-06-15T10:00:00Z[Not/AZone]") // 1718445600000000000n — the bracket is not validated
24
75
  */
25
76
  export declare function parseInstantNanoseconds(value: string): bigint | null;
77
+ /**
78
+ * `parseInstantNanoseconds` as a `Temporal.Instant`, for callers that already hold a validated
79
+ * string and go on to Temporal arithmetic. Use it wherever a caller's instant string would
80
+ * otherwise go to `Temporal.Instant.from`, so a minute-rounded offset is read the same way
81
+ * everywhere. Throws where `Temporal.Instant.from` throws, so it sits inside the caller's `try`
82
+ * like any other Temporal parse.
83
+ *
84
+ * @param value ISO 8601 instant or zoned datetime string
85
+ * @returns the instant the string names
86
+ * @throws RangeError when `value` is not a valid instant
87
+ *
88
+ * @example instantFrom("1960-01-01T00:20:00-00:45[Africa/Monrovia]").toString() // "1960-01-01T01:04:30Z"
89
+ * @example instantFrom("2024-06-15T10:00:00") // throws RangeError
90
+ */
91
+ export declare function instantFrom(value: string): Temporal.Instant;
@@ -1,19 +1,83 @@
1
1
  import { Temporal } from "@js-temporal/polyfill";
2
2
  import { instantLeapSecond } from "../regex/leap-second.js";
3
- import { hasInstantShape } from "./isoStringBody.js";
3
+ import { hasInstantShape, isoStringBody } from "./isoStringBody.js";
4
+ import { parseUtcOffsetNanoseconds } from "./utcOffsetString.js";
5
+ import { isValidEpoch, offsetAt, roundToMinute, utcEpochNanoseconds, } from "./zonedWallClock.js";
6
+ /**
7
+ * The first time-zone annotation in the string, as `TIME_ZONE_ANNOTATION` defines one (a
8
+ * bracket without `=`), with its identifier captured without the critical flag. Only a string
9
+ * that names a zone can have a rounded offset to resolve. The capture goes to Temporal, which
10
+ * decides whether it is a zone.
11
+ */
12
+ const zoneAnnotation = /\[!?([^\]=]+)\]/;
13
+ const NANOSECONDS_PER_MINUTE = 60000000000n;
14
+ /** The most a minute-rounded offset can differ from the real one (half-expand rounding). */
15
+ const HALF_MINUTE = 30000000000n;
16
+ /** `±HH:MM`: the length of an offset written to the minute. */
17
+ const MINUTE_OFFSET_LENGTH = 6;
18
+ /**
19
+ * An instant body that ends in an offset written to the minute (`±HH:MM`), with no seconds
20
+ * part. The sign must sit directly before `HH:MM`, so `-04:56:02` does not match on its `56:02`.
21
+ */
22
+ const minuteOffset = /[+-]\d{2}:\d{2}$/;
4
23
  /**
5
24
  * Parse an ISO 8601 instant string to epoch nanoseconds, or `null` when it is not one.
6
25
  *
7
- * The single definition of "an instant string GMT accepts": the RFC 9557 instant grammar
8
- * `Temporal.Instant.from` parses, restricted to ISO 8601 extended format before the first `[`
9
- * (`instantBody`: `<date>T<time>`, then `Z` or `±HH:MM[:SS[.fraction]]`), minus
10
- * leap seconds (which Temporal clamps rather than rejects). Basic format, a space or lower-case
11
- * `t` separator, a lower-case `z` and an hour-only time or offset are rejected. Annotations are read as Temporal reads them (proposal-temporal
26
+ * The single definition of "an instant string GMT accepts", and of the instant it names. Every
27
+ * GMT function that reads a moment without keeping its zone reads through here.
28
+ *
29
+ * **Which strings.** The RFC 9557 instant grammar `Temporal.Instant.from` parses, restricted to
30
+ * ISO 8601 extended format before the first `[` (`instantBody`: `<date>T<time>`, then `Z` or
31
+ * `±HH:MM[:SS[.fraction]]`), minus leap seconds (which Temporal clamps rather than rejects).
32
+ * Basic format, a space or lower-case `t` separator, a lower-case `z` and an hour-only time or
33
+ * offset are rejected. Annotations are read as Temporal reads them (proposal-temporal
12
34
  * `ParseISODateTime`, RFC 9557 §3.3): a time zone, calendar (`[u-ca=hebrew]`) or elective
13
- * (`[foo=bar]`) annotation is ignored, because an instant has neither zone nor calendar, and an
14
- * unknown critical one (`[!foo=bar]`) is rejected. Callers layer their own sentinel on top —
15
- * `toNanoseconds` returns `0n`, `spanNs` returns `null` — so the parse result stays unambiguous
16
- * here.
35
+ * (`[foo=bar]`) annotation never makes a string invalid, and an unknown critical one
36
+ * (`[!foo=bar]`) is rejected.
37
+ *
38
+ * **Which instant.** The written offset fixes it, as in `Temporal.Instant.from`, with one
39
+ * exception:
40
+ *
41
+ * - **A minute-rounded offset is read as its zone's real offset.** When the string has a
42
+ * bracketed zone and an offset written to the minute, and that offset is the zone's actual
43
+ * offset at that wall time rounded to the minute, the instant is the one the zone gives. This
44
+ * is TC39 `ToTemporalZonedDateTime`'s match-minutes rule (`InterpretISODateTimeOffset`),
45
+ * applied to the zone and the offset alone. It exists because
46
+ * `Temporal.ZonedDateTime.prototype.toString` writes the offset rounded to the minute: in a
47
+ * zone with a sub-minute offset (`Africa/Monrovia` before 1972, at −00:44:30, written
48
+ * `-00:45`), the string a zoned function writes would otherwise be read up to 30 seconds off.
49
+ * - **The instant range is the only range.** The match has no `CheckISODaysRange` on the local
50
+ * date, which `Temporal.ZonedDateTime.from` has, and does not need the written offset's own
51
+ * reading to be in range. So every string Temporal writes for an instant in range is read
52
+ * back, the first and last instants included: `-271821-04-19T23:58:45-00:01[Europe/London]`
53
+ * (London's local mean time, −00:01:15) is the first instant, although its local date is
54
+ * outside Temporal's date range and its reading at −00:01 is 15 seconds before the range.
55
+ * - **A repeated wall time inside a sub-minute offset change reads as its first pass.** The
56
+ * match is against each candidate instant in order, so when a wall time happened twice and
57
+ * the rounded offset fits the first pass, the first pass is the answer, even if the string
58
+ * was written for the second. This is a class of strings, not one zone: it arises wherever a
59
+ * zone's history has a fall-back of under a minute at a sub-minute offset. The example
60
+ * test262 uses: Pacific/Niue moved from −11:19:40 to −11:20:00 at the end of
61
+ * 15 October 1952, so 23:59:40 to 23:59:59 happened twice, 20 seconds apart, and both passes
62
+ * are written `-11:20`: `1952-10-15T23:59:59-11:20[Pacific/Niue]` reads as the pass at
63
+ * −11:19:40. This is `Temporal.ZonedDateTime.from`'s own reading (test262
64
+ * `intl402/Temporal/ZonedDateTime/from/zoneddatetime-sub-minute-offset.js`), and the one kind
65
+ * of string Temporal writes that an instant reader does not read as the instant it was
66
+ * written for. The exact offset, `-11:20:00`, names the second pass.
67
+ * - **Everything else keeps the written offset.** The complete list: a string without a
68
+ * bracket; a `Z` instant; an offset written with seconds, which TC39 matches exactly
69
+ * (`-00:45:00[Africa/Monrovia]` is −00:45:00); a bracket whose zone does not exist; and a
70
+ * bracket whose zone has no instant in range with that wall time at the written offset or at
71
+ * an offset that rounds to it (`-00:44[Africa/Monrovia]`, `-05:00[America/New_York]` in
72
+ * June). Such a bracket is not validated here; a function that keeps the zone
73
+ * (`transitTime`, `toOffsetInstant`) rejects it instead. Calendar and elective annotations
74
+ * never change the reading. A string whose written reading is outside the instant range, and
75
+ * which the zone does not bring inside it, is `null`.
76
+ *
77
+ * The zone's offset comes from Temporal's time-zone data; nothing here holds an offset or a
78
+ * zone name. A string in a whole-minute zone costs two offset lookups more than
79
+ * `Temporal.Instant.from`. Callers layer their own sentinel on top — `toNanoseconds` returns
80
+ * `0n`, `spanNs` returns `null` — so the parse result stays unambiguous here.
17
81
  *
18
82
  * @param value candidate ISO 8601 instant string
19
83
  * @returns nanoseconds since the Unix epoch, or null when `value` is not a valid instant
@@ -24,6 +88,11 @@ import { hasInstantShape } from "./isoStringBody.js";
24
88
  * @example parseInstantNanoseconds("20240310T120000Z") // null — basic format
25
89
  * @example parseInstantNanoseconds("2024-03-10T12:00:00z") // null — lower-case z
26
90
  * @example parseInstantNanoseconds("1970-01-01T00:00:00Z[u-ca=hebrew]") // 0n — calendar annotation ignored
91
+ * @example parseInstantNanoseconds("1960-01-01T00:20:00-00:45[Africa/Monrovia]") // -315615330000000000n — 01:04:30Z: Monrovia stood at -00:44:30
92
+ * @example parseInstantNanoseconds("1960-01-01T00:20:00-00:45") // -315615300000000000n — 01:05:00Z: no zone, so the offset is exact
93
+ * @example parseInstantNanoseconds("1952-10-15T23:59:59-11:20[Pacific/Niue]") // -543069621000000000n — the first pass of a repeated second, at -11:19:40
94
+ * @example parseInstantNanoseconds("-271821-04-19T23:58:45-00:01[Europe/London]") // -8640000000000000000000n — the first instant, at London's -00:01:15
95
+ * @example parseInstantNanoseconds("2024-06-15T10:00:00Z[Not/AZone]") // 1718445600000000000n — the bracket is not validated
27
96
  */
28
97
  export function parseInstantNanoseconds(value) {
29
98
  if (typeof value !== "string") {
@@ -32,10 +101,122 @@ export function parseInstantNanoseconds(value) {
32
101
  if (instantLeapSecond.test(value) || !hasInstantShape(value)) {
33
102
  return null;
34
103
  }
104
+ let written;
105
+ try {
106
+ written = Temporal.Instant.from(value).epochNanoseconds;
107
+ }
108
+ catch {
109
+ // Not an instant as written. It may still be one through its zone: see `zonedReading`.
110
+ written = null;
111
+ }
112
+ const body = isoStringBody(value);
113
+ const zone = minuteOffset.test(body)
114
+ ? zoneAnnotation.exec(value)?.[1]
115
+ : undefined;
116
+ if (zone === undefined) {
117
+ return written;
118
+ }
35
119
  try {
36
- return Temporal.Instant.from(value).epochNanoseconds;
120
+ return written === null
121
+ ? zonedReadingOutsideWrittenRange(value, body, zone)
122
+ : (zonedReading(zone, written, () => writtenOffset(body)) ?? written);
37
123
  }
38
124
  catch {
125
+ // The zone does not exist: the written offset stands.
126
+ return written;
127
+ }
128
+ }
129
+ /** The nanoseconds of the `±HH:MM` offset that ends `body`, parsed by Temporal. */
130
+ function writtenOffset(body) {
131
+ return parseUtcOffsetNanoseconds(body.slice(-MINUTE_OFFSET_LENGTH));
132
+ }
133
+ /**
134
+ * TC39 `InterpretISODateTimeOffset`'s match for a minute-precision offset, on epoch nanoseconds:
135
+ * the instant `zone` gives a wall time written with `offset`, or `null` when the zone has no
136
+ * instant in range whose offset is `offset` or rounds to it.
137
+ *
138
+ * `written` is the wall time read at the written offset. A candidate instant has the same wall
139
+ * time at the zone's own offset, so it lies within half a minute of `written`, and the zone's
140
+ * offsets half a minute either side are the only ones a candidate can have. When both are whole
141
+ * minutes nothing can round, the written offset is never read, and the answer is `null`: the
142
+ * common case costs two offset lookups. Otherwise each candidate is checked against the zone and
143
+ * the earliest match wins, as the spec's loop over the possible instants does. It assumes a
144
+ * zone changes its offset at most once in any one minute.
145
+ *
146
+ * Unlike `Temporal.ZonedDateTime.from` this has no `CheckISODaysRange` on the local date: an
147
+ * instant is in range or it is not, whatever date its wall clock shows.
148
+ *
149
+ * @throws RangeError when `zone` is not a time zone
150
+ */
151
+ function zonedReading(zone, written, offset) {
152
+ const before = offsetAt(zone, written - HALF_MINUTE);
153
+ const after = offsetAt(zone, written + HALF_MINUTE);
154
+ if (before % NANOSECONDS_PER_MINUTE === 0n &&
155
+ after % NANOSECONDS_PER_MINUTE === 0n) {
156
+ return null;
157
+ }
158
+ const writtenOffsetNanoseconds = offset();
159
+ if (writtenOffsetNanoseconds === null) {
160
+ return null;
161
+ }
162
+ // With one offset across the whole minute a candidate needs no second look at the zone: it
163
+ // lies inside that minute. Across a change, each side's candidate must fall on its own side.
164
+ const steady = before === after;
165
+ let earliest = null;
166
+ for (const candidateOffset of steady ? [before] : [before, after]) {
167
+ const candidate = written + writtenOffsetNanoseconds - candidateOffset;
168
+ if ((candidateOffset === writtenOffsetNanoseconds ||
169
+ roundToMinute(candidateOffset) === writtenOffsetNanoseconds) &&
170
+ isValidEpoch(candidate) &&
171
+ (steady || offsetAt(zone, candidate) === candidateOffset) &&
172
+ (earliest === null || candidate < earliest)) {
173
+ earliest = candidate;
174
+ }
175
+ }
176
+ return earliest;
177
+ }
178
+ /**
179
+ * `zonedReading` for a string `Temporal.Instant.from` refused. At the range limits the written,
180
+ * minute-rounded offset can put the literal reading just outside the instant range while the
181
+ * zone's real offset keeps the instant inside it: Europe/London at local mean time (−00:01:15)
182
+ * writes the first instant as `-271821-04-19T23:58:45-00:01`, 15 seconds before the range when
183
+ * read at −00:01. Temporal reads both halves again: the wall clock as a `PlainDateTime`, from
184
+ * the part before the first annotation, and the annotations on a stand-in instant, exactly as
185
+ * `Temporal.Instant.from` reads them (a calendar id is not checked). So every other reason the
186
+ * string was refused (an invalid date, an unknown critical annotation) is refused again here
187
+ * by the throw.
188
+ *
189
+ * @throws RangeError when the string is not a date-time, or `zone` is not a time zone
190
+ */
191
+ function zonedReadingOutsideWrittenRange(value, body, zone) {
192
+ const offset = writtenOffset(body);
193
+ if (offset === null) {
39
194
  return null;
40
195
  }
196
+ // The annotations are read as an instant's are: on a stand-in instant, so an unknown critical
197
+ // annotation or a misplaced zone throws, and a calendar id is not checked.
198
+ Temporal.Instant.from(`1970-01-01T00:00:00Z${value.slice(body.length)}`);
199
+ const wall = Temporal.PlainDateTime.from(body);
200
+ return zonedReading(zone, utcEpochNanoseconds(wall) - offset, () => offset);
201
+ }
202
+ /**
203
+ * `parseInstantNanoseconds` as a `Temporal.Instant`, for callers that already hold a validated
204
+ * string and go on to Temporal arithmetic. Use it wherever a caller's instant string would
205
+ * otherwise go to `Temporal.Instant.from`, so a minute-rounded offset is read the same way
206
+ * everywhere. Throws where `Temporal.Instant.from` throws, so it sits inside the caller's `try`
207
+ * like any other Temporal parse.
208
+ *
209
+ * @param value ISO 8601 instant or zoned datetime string
210
+ * @returns the instant the string names
211
+ * @throws RangeError when `value` is not a valid instant
212
+ *
213
+ * @example instantFrom("1960-01-01T00:20:00-00:45[Africa/Monrovia]").toString() // "1960-01-01T01:04:30Z"
214
+ * @example instantFrom("2024-06-15T10:00:00") // throws RangeError
215
+ */
216
+ export function instantFrom(value) {
217
+ const nanoseconds = parseInstantNanoseconds(value);
218
+ if (nanoseconds === null) {
219
+ throw new RangeError("Not an ISO 8601 instant string");
220
+ }
221
+ return Temporal.Instant.fromEpochNanoseconds(nanoseconds);
41
222
  }
@@ -34,4 +34,4 @@
34
34
  * @param timeStyle Intl.DateTimeFormatOptions `timeStyle` for the time half
35
35
  * @returns `dayLabel` joined to the localized time with the locale's own connector
36
36
  */
37
- export declare function joinDateTimeConnector(epochMilliseconds: number, timeZone: string, locale: string | string[] | undefined, dayLabel: string, timeStyle: "short" | "medium" | "full"): string;
37
+ export declare function joinDateTimeConnector(epochMilliseconds: number, timeZone: string, locale: string | string[] | undefined, dayLabel: string, timeStyle: "short" | "medium" | "long" | "full"): string;
@@ -7,7 +7,8 @@ import type { Temporal } from "@js-temporal/polyfill";
7
7
  * Shared by `getWeekOfMonth` (row for the date itself) and
8
8
  * `getWeeksInMonth` (row for the month's last day, i.e. the row count).
9
9
  * Week 1 is the row containing the 1st of the month, even when that row
10
- * is a partial week (date-fns's `getWeekOfMonth` convention).
10
+ * is a partial week: a month grid draws every day of the month, so its
11
+ * first row always holds the 1st. GMT's own rule; CLDR's `minDays` plays no part.
11
12
  *
12
13
  * Only the weekday of the 1st is read, so callers may pass `{ dayOfWeek }` without building a
13
14
  * date that could lie before the representable range (April 1 of -271821).
@@ -6,7 +6,8 @@
6
6
  * Shared by `getWeekOfMonth` (row for the date itself) and
7
7
  * `getWeeksInMonth` (row for the month's last day, i.e. the row count).
8
8
  * Week 1 is the row containing the 1st of the month, even when that row
9
- * is a partial week (date-fns's `getWeekOfMonth` convention).
9
+ * is a partial week: a month grid draws every day of the month, so its
10
+ * first row always holds the 1st. GMT's own rule; CLDR's `minDays` plays no part.
10
11
  *
11
12
  * Only the weekday of the 1st is read, so callers may pass `{ dayOfWeek }` without building a
12
13
  * date that could lie before the representable range (April 1 of -271821).
@@ -1,11 +1,11 @@
1
1
  /**
2
- * Resolve the `timeZone` option of every `unix/` function and the `utc/` formatters.
2
+ * Resolve the `timeZone` option of every `unix/` and `utc/` function that takes one.
3
3
  *
4
4
  * - Omitted (`undefined`) → `"UTC"`. A Unix epoch and a UTC string name an instant, so no host
5
5
  * zone is read unless asked for.
6
6
  * - `"local"` → the system time zone (`getSystemTimeZone()`), or `""` when the host reports none
7
7
  * that is valid.
8
- * - A valid IANA identifier → returned as-is.
8
+ * - A valid IANA identifier or UTC offset (`"+05:30"`) → returned as-is.
9
9
  * - Anything else (`null`, `""`, a typo, a non-string) → `""`, the caller's cue to return its
10
10
  * sentinel. ECMA-402 `Intl.DateTimeFormat` and Temporal `ToTemporalTimeZoneIdentifier` throw
11
11
  * `RangeError` for an unknown zone, so a typo never silently renders UTC.
@@ -1,13 +1,13 @@
1
1
  import { getSystemTimeZone } from "../zoned/get/getSystemTimeZone.js";
2
2
  import { isValidTimeZone } from "../zoned/validate/index.js";
3
3
  /**
4
- * Resolve the `timeZone` option of every `unix/` function and the `utc/` formatters.
4
+ * Resolve the `timeZone` option of every `unix/` and `utc/` function that takes one.
5
5
  *
6
6
  * - Omitted (`undefined`) → `"UTC"`. A Unix epoch and a UTC string name an instant, so no host
7
7
  * zone is read unless asked for.
8
8
  * - `"local"` → the system time zone (`getSystemTimeZone()`), or `""` when the host reports none
9
9
  * that is valid.
10
- * - A valid IANA identifier → returned as-is.
10
+ * - A valid IANA identifier or UTC offset (`"+05:30"`) → returned as-is.
11
11
  * - Anything else (`null`, `""`, a typo, a non-string) → `""`, the caller's cue to return its
12
12
  * sentinel. ECMA-402 `Intl.DateTimeFormat` and Temporal `ToTemporalTimeZoneIdentifier` throw
13
13
  * `RangeError` for an unknown zone, so a typo never silently renders UTC.
@@ -0,0 +1,129 @@
1
+ import type { Disambiguation } from "../types/index.js";
2
+ import { type IntervalNanoseconds } from "./intervalNanoseconds.js";
3
+ /** A `LocalWindow` validated once: canonical PlainTime strings, and whether it wraps midnight. */
4
+ export type ResolvedWindow = {
5
+ from: string;
6
+ to: string;
7
+ wraps: boolean;
8
+ };
9
+ /** An `OperatingSchedule` reduced to the lookups the day walk needs. */
10
+ export type ResolvedSchedule = {
11
+ timeZone: string;
12
+ /** Windows by ISO weekday; index 0 is unused. */
13
+ weekly: readonly (readonly ResolvedWindow[])[];
14
+ holidays: ReadonlySet<string>;
15
+ overrides: ReadonlyMap<string, readonly ResolvedWindow[]>;
16
+ };
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 declare const MAX_SCHEDULE_DAYS = 10000;
23
+ /**
24
+ * The search horizon of `nextOpenAt`, `nextCloseAt` and `addOperatingTime` when the caller
25
+ * gives no `within`: one calendar year in the schedule's zone.
26
+ */
27
+ export declare const DEFAULT_OPERATING_HORIZON = "P1Y";
28
+ /**
29
+ * Parse `OperatingSchedule['weekly']`: an object whose own keys are ISO weekdays `"1"`–`"7"`,
30
+ * each holding an array of `LocalWindow`s (or `undefined`, meaning closed). Any other key, or a
31
+ * malformed window, returns `null`.
32
+ */
33
+ export declare function parseWeeklyPattern(value: unknown): ResolvedWindow[][] | null;
34
+ /** Validate an `OperatingSchedule`, or `null` when any part of it is malformed. */
35
+ export declare function parseOperatingSchedule(value: unknown): ResolvedSchedule | null;
36
+ /**
37
+ * Read `disambiguation` from an options argument. Omitted means `"compatible"`, as in
38
+ * `resolveLocal`; anything but the four Temporal values, or an options argument that is not an
39
+ * object, returns `null`.
40
+ */
41
+ export declare function parseScheduleDisambiguation(options: unknown): Disambiguation | null;
42
+ /**
43
+ * The last instant a search may answer with: `from` plus `within` (default one year), added in
44
+ * the schedule's zone so `P1D` is one local day. It is clamped to the search cap: the last instant
45
+ * before the local date `MAX_SCHEDULE_DAYS + 1` after the one `from` falls on, so a search answers
46
+ * anywhere on the 10,000th date and nowhere after it. A horizon past Temporal's last instant is
47
+ * that instant, since nothing after it can be answered. `null` when `within` is not a
48
+ * non-negative ISO duration.
49
+ */
50
+ export declare function parseSearchHorizon(fromNs: bigint, within: unknown, timeZone: string): bigint | null;
51
+ /**
52
+ * What the walk tells its caller.
53
+ *
54
+ * - `run` is a finished open run: sorted, disjoint, non-touching and never extended later.
55
+ * - `day` announces that every window still to come starts at or after `bound`, and passes the
56
+ * runs still `pending`: sorted and disjoint, each ending at or after `bound`, so a later window
57
+ * may extend them but cannot add open time before `bound`. A caller can answer from them once
58
+ * its answer lies at or before `bound`.
59
+ * - Returning `true` from either stops the walk; stopping from `day` hands the pending runs to
60
+ * `run` first.
61
+ */
62
+ export type ScheduleVisitor = {
63
+ run: (run: IntervalNanoseconds) => boolean;
64
+ day: (bound: bigint, pending: readonly IntervalNanoseconds[]) => boolean;
65
+ };
66
+ /**
67
+ * How a walk ended. `unresolvedStart` is the earliest instant a window rejected under
68
+ * `"reject"` could open at, among those that could still be open at or after `fromNs`;
69
+ * `undefined` when there is none. A rejected window on a date the walk did not reach starts at
70
+ * or after the last `bound` it announced.
71
+ */
72
+ export type ScheduleWalk = {
73
+ unresolvedStart: bigint | undefined;
74
+ };
75
+ /**
76
+ * Walk the schedule's local dates from a little before `fromNs`, handing the visitor each open
77
+ * run as soon as no later window can extend it.
78
+ *
79
+ * - Dates come from the day buckets `floorToZone` and `bucketRange` use, so a deleted date
80
+ * (`Pacific/Apia`, 2011-12-30) is never visited, and a date the clock re-enters after a
81
+ * fall-back (`America/Goose_Bay`, 2010-11-06) is visited once.
82
+ * - A window can start as early as the previous date's first instant (see `resolveDateWindows`),
83
+ * so the walk settles one date behind: once a date is resolved, the first instant of the date
84
+ * resolved before it is the `bound` no later window starts before.
85
+ * - When the visitor stops the walk from `day`, or the last representable day is reached, the
86
+ * runs still pending are handed over too.
87
+ * - Returns `null` when a day bucket could not be found, or the walk would resolve a date
88
+ * `MAX_SCHEDULE_DAYS + 2` after the one `fromNs` falls on. Neither use reaches that: a range
89
+ * is refused up front past `MAX_SCHEDULE_DAYS` dates, and a search's horizon ends with the
90
+ * `MAX_SCHEDULE_DAYS`th date, so its walk stops by the horizon one date later.
91
+ */
92
+ export declare function walkSchedule(schedule: ResolvedSchedule, fromNs: bigint, disambiguation: Disambiguation, visitor: ScheduleVisitor): ScheduleWalk | null;
93
+ /**
94
+ * The schedule's open runs clipped to `[startNs, endNs)`, in the range's own strings where a run
95
+ * is clipped. `null` when the walk fails (see `walkSchedule`), or when a window rejected under
96
+ * `"reject"` reaches into the range.
97
+ */
98
+ export declare function scheduleRunsWithin(schedule: ResolvedSchedule, range: IntervalNanoseconds, disambiguation: Disambiguation): IntervalNanoseconds[] | null;
99
+ /**
100
+ * The first instant at or after `fromNs` that the schedule is open: `fromNs` itself inside an
101
+ * open run, else the start of the next run. Answered as soon as no later window can open
102
+ * sooner, without waiting for the run to close. `undefined` when none falls at or before
103
+ * `horizonNs`, `null` when the walk fails or a window rejected under `"reject"` could open
104
+ * sooner.
105
+ */
106
+ export declare function firstOpenInstant(schedule: ResolvedSchedule, fromNs: bigint, horizonNs: bigint, disambiguation: Disambiguation): bigint | undefined | null;
107
+ /**
108
+ * The first instant at or after `fromNs` that the schedule is closed: `fromNs` itself outside
109
+ * every open run, else the end of the run holding it. A closed `fromNs` is answered as soon as
110
+ * no later window can cover it. `undefined` when the answer falls after `horizonNs`, `null` when
111
+ * the walk fails or a window rejected under `"reject"` could keep the schedule open past it.
112
+ */
113
+ export declare function firstClosedInstant(schedule: ResolvedSchedule, fromNs: bigint, horizonNs: bigint, disambiguation: Disambiguation): bigint | undefined | null;
114
+ /**
115
+ * The instant at which `amountNs` of open time has elapsed since `fromNs`: the earliest `X`
116
+ * with exactly that much open time in `[fromNs, X)`. `fromNs` itself when `amountNs` is zero.
117
+ * Answered as soon as no later window can add open time before `X`. `undefined` when `X` falls
118
+ * after `horizonNs`, `null` when the walk fails or a window rejected under `"reject"` could add
119
+ * open time before `X`.
120
+ */
121
+ export declare function instantAfterOpenTime(schedule: ResolvedSchedule, fromNs: bigint, amountNs: bigint, horizonNs: bigint, disambiguation: Disambiguation): bigint | undefined | null;
122
+ /**
123
+ * An amount of open time in nanoseconds, from an ISO duration of hours and smaller units.
124
+ * `null` for a negative duration, for any calendar unit (years, months, weeks or days — `P1D`
125
+ * could mean 24 open hours or one working day, so it is not guessed), or invalid input.
126
+ */
127
+ export declare function parseOpenTimeAmount(value: unknown): bigint | null;
128
+ /** Epoch nanoseconds as a UTC instant string ending in `Z`. */
129
+ export declare function instantText(nanoseconds: bigint): string;