@northguild/gmt 1.16.0 → 1.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (654) hide show
  1. package/README.md +742 -21
  2. package/dist/calendar/calculate/bucketRange.d.ts +3 -3
  3. package/dist/calendar/calculate/bucketRange.js +6 -6
  4. package/dist/calendar/calculate/floorToZone.d.ts +5 -3
  5. package/dist/calendar/calculate/floorToZone.js +6 -5
  6. package/dist/calendar/calculate/getFiscalPeriod.d.ts +21 -8
  7. package/dist/calendar/calculate/getFiscalPeriod.js +9 -8
  8. package/dist/calendar/calculate/getIsoWeekDate.d.ts +10 -5
  9. package/dist/calendar/calculate/getIsoWeekDate.js +1 -5
  10. package/dist/calendar/calculate/getOrdinalDate.d.ts +10 -3
  11. package/dist/calendar/calculate/getOrdinalDate.js +2 -3
  12. package/dist/calendar/calculate/getQuarter.d.ts +21 -9
  13. package/dist/calendar/calculate/getQuarter.js +8 -12
  14. package/dist/calendar/hours/addOperatingTime.d.ts +53 -0
  15. package/dist/calendar/hours/addOperatingTime.js +59 -0
  16. package/dist/calendar/hours/index.d.ts +7 -0
  17. package/dist/calendar/hours/index.js +7 -0
  18. package/dist/calendar/hours/isOpenAt.d.ts +39 -0
  19. package/dist/calendar/hours/isOpenAt.js +44 -0
  20. package/dist/calendar/hours/nextCloseAt.d.ts +49 -0
  21. package/dist/calendar/hours/nextCloseAt.js +51 -0
  22. package/dist/calendar/hours/nextOpenAt.d.ts +45 -0
  23. package/dist/calendar/hours/nextOpenAt.js +47 -0
  24. package/dist/calendar/hours/operatingIntervals.d.ts +43 -0
  25. package/dist/calendar/hours/operatingIntervals.js +52 -0
  26. package/dist/calendar/hours/operatingTimeBetween.d.ts +40 -0
  27. package/dist/calendar/hours/operatingTimeBetween.js +49 -0
  28. package/dist/calendar/hours/recurringWindows.d.ts +61 -0
  29. package/dist/calendar/hours/recurringWindows.js +80 -0
  30. package/dist/calendar/index.d.ts +1 -0
  31. package/dist/calendar/index.js +1 -0
  32. package/dist/duration/calculate/durationAs.d.ts +13 -8
  33. package/dist/duration/calculate/durationAs.js +4 -8
  34. package/dist/duration/compare/compareDurations.d.ts +12 -6
  35. package/dist/duration/compare/compareDurations.js +3 -6
  36. package/dist/duration/format/formatDuration.d.ts +16 -4
  37. package/dist/duration/format/formatDuration.js +4 -5
  38. package/dist/duration/normalize/normalizeDuration.d.ts +39 -14
  39. package/dist/duration/normalize/normalizeDuration.js +6 -15
  40. package/dist/duration/parse/parseDuration.d.ts +21 -3
  41. package/dist/duration/parse/parseDuration.js +1 -3
  42. package/dist/index.d.ts +2 -0
  43. package/dist/index.js +2 -0
  44. package/dist/instant/convert/classifyLocal.d.ts +1 -1
  45. package/dist/instant/convert/classifyLocal.js +1 -1
  46. package/dist/instant/convert/fromOffsetInstant.d.ts +3 -1
  47. package/dist/instant/convert/fromOffsetInstant.js +6 -12
  48. package/dist/instant/convert/resolveLocal.d.ts +12 -7
  49. package/dist/instant/convert/resolveLocal.js +6 -10
  50. package/dist/instant/convert/toOffsetInstant.d.ts +37 -1
  51. package/dist/instant/convert/toOffsetInstant.js +12 -28
  52. package/dist/intermodal/calculate/billingTimeline.d.ts +114 -0
  53. package/dist/intermodal/calculate/billingTimeline.js +168 -0
  54. package/dist/intermodal/calculate/chargeableDays.d.ts +100 -0
  55. package/dist/intermodal/calculate/chargeableDays.js +96 -0
  56. package/dist/intermodal/calculate/demurrageClock.d.ts +102 -0
  57. package/dist/intermodal/calculate/demurrageClock.js +140 -0
  58. package/dist/intermodal/calculate/freeTimeExpiry.d.ts +67 -0
  59. package/dist/intermodal/calculate/freeTimeExpiry.js +82 -0
  60. package/dist/intermodal/calculate/index.d.ts +4 -0
  61. package/dist/intermodal/calculate/index.js +4 -0
  62. package/dist/intermodal/index.d.ts +2 -0
  63. package/dist/intermodal/index.js +3 -0
  64. package/dist/internal/businessCalendar.d.ts +5 -0
  65. package/dist/internal/businessCalendar.js +5 -1
  66. package/dist/internal/cycleFieldValue.d.ts +6 -4
  67. package/dist/internal/cycleFieldValue.js +6 -4
  68. package/dist/internal/daylightTime.d.ts +33 -0
  69. package/dist/internal/daylightTime.js +164 -0
  70. package/dist/internal/durationUntilString.js +4 -3
  71. package/dist/internal/englishCalendarNames.js +1 -2
  72. package/dist/internal/epochNanoseconds.d.ts +2 -0
  73. package/dist/internal/epochNanoseconds.js +2 -0
  74. package/dist/internal/exactDuration.d.ts +37 -0
  75. package/dist/internal/exactDuration.js +64 -0
  76. package/dist/internal/exactMoment.d.ts +72 -0
  77. package/dist/internal/exactMoment.js +114 -0
  78. package/dist/internal/fiscalCalendar.d.ts +4 -3
  79. package/dist/internal/fiscalCalendar.js +4 -3
  80. package/dist/internal/formatCalendarDays.d.ts +2 -2
  81. package/dist/internal/formatRelativeDuration.d.ts +21 -1
  82. package/dist/internal/formatRelativeDuration.js +47 -7
  83. package/dist/internal/freeTimeLedger.d.ts +93 -0
  84. package/dist/internal/freeTimeLedger.js +262 -0
  85. package/dist/internal/index.d.ts +10 -3
  86. package/dist/internal/index.js +10 -3
  87. package/dist/internal/instantFormatOptions.js +2 -1
  88. package/dist/internal/instantNanoseconds.d.ts +75 -9
  89. package/dist/internal/instantNanoseconds.js +192 -11
  90. package/dist/internal/isoStringBody.d.ts +26 -0
  91. package/dist/internal/isoStringBody.js +22 -2
  92. package/dist/internal/joinDateTimeConnector.d.ts +1 -1
  93. package/dist/internal/monthGridWeekRow.d.ts +2 -1
  94. package/dist/internal/monthGridWeekRow.js +2 -1
  95. package/dist/internal/normalizeTimeZone.d.ts +2 -2
  96. package/dist/internal/normalizeTimeZone.js +2 -2
  97. package/dist/internal/operatingSchedule.d.ts +129 -0
  98. package/dist/internal/operatingSchedule.js +668 -0
  99. package/dist/internal/optionOrDefault.d.ts +18 -0
  100. package/dist/internal/optionOrDefault.js +20 -0
  101. package/dist/internal/patternToken.d.ts +2 -2
  102. package/dist/internal/patternToken.js +28 -13
  103. package/dist/internal/plainDateUntil.js +10 -6
  104. package/dist/internal/punctuality.d.ts +38 -0
  105. package/dist/internal/punctuality.js +59 -0
  106. package/dist/internal/readDateTimeFormatOptions.d.ts +30 -0
  107. package/dist/internal/readDateTimeFormatOptions.js +93 -0
  108. package/dist/internal/resolveDurationRelativeTo.d.ts +4 -0
  109. package/dist/internal/resolveDurationRelativeTo.js +11 -1
  110. package/dist/internal/resolveRelativeRounding.d.ts +17 -6
  111. package/dist/internal/resolveRelativeRounding.js +27 -7
  112. package/dist/internal/resolveRelativeUnit.d.ts +30 -0
  113. package/dist/internal/resolveRelativeUnit.js +40 -0
  114. package/dist/internal/splitStep.d.ts +24 -1
  115. package/dist/internal/splitStep.js +34 -2
  116. package/dist/internal/startOrEndOfZoned.js +2 -3
  117. package/dist/internal/temporalCompat/capabilities.d.ts +26 -0
  118. package/dist/internal/temporalCompat/capabilities.js +35 -3
  119. package/dist/internal/temporalCompat/fieldSearch.js +1 -1
  120. package/dist/internal/temporalCompat/index.d.ts +1 -1
  121. package/dist/internal/temporalCompat/index.js +1 -1
  122. package/dist/internal/temporalCompat/repros.d.ts +1 -1
  123. package/dist/internal/temporalCompat/repros.js +157 -0
  124. package/dist/internal/timestampEvents.d.ts +32 -0
  125. package/dist/internal/timestampEvents.js +76 -0
  126. package/dist/internal/utcZonedDateTime.d.ts +5 -2
  127. package/dist/internal/utcZonedDateTime.js +8 -5
  128. package/dist/internal/wallClockAtOffset.d.ts +22 -0
  129. package/dist/internal/wallClockAtOffset.js +26 -0
  130. package/dist/internal/zonedBucket.js +8 -6
  131. package/dist/internal/zonedLocalDates.js +1 -1
  132. package/dist/internal/zonedTransitionSearch.d.ts +27 -0
  133. package/dist/internal/zonedTransitionSearch.js +218 -0
  134. package/dist/internal/zonedWallClock.d.ts +21 -7
  135. package/dist/internal/zonedWallClock.js +87 -18
  136. package/dist/internal/zonedWallClockDifference.js +5 -4
  137. package/dist/internal/zonedWallClockOperations.d.ts +26 -13
  138. package/dist/internal/zonedWallClockOperations.js +87 -34
  139. package/dist/interval/validate/isValidInterval.d.ts +6 -3
  140. package/dist/interval/validate/isValidInterval.js +6 -3
  141. package/dist/plain/calculate/addDate.d.ts +11 -8
  142. package/dist/plain/calculate/addDate.js +5 -8
  143. package/dist/plain/calculate/addDateTime.d.ts +7 -4
  144. package/dist/plain/calculate/addDateTime.js +1 -4
  145. package/dist/plain/calculate/cycleDate.d.ts +16 -7
  146. package/dist/plain/calculate/cycleDate.js +3 -7
  147. package/dist/plain/calculate/cycleDateTime.d.ts +14 -4
  148. package/dist/plain/calculate/cycleDateTime.js +1 -4
  149. package/dist/plain/calculate/cycleTime.d.ts +10 -5
  150. package/dist/plain/calculate/cycleTime.js +3 -5
  151. package/dist/plain/calculate/diffDate.d.ts +1 -1
  152. package/dist/plain/calculate/diffDate.js +1 -1
  153. package/dist/plain/calculate/diffDateAsDuration.d.ts +1 -1
  154. package/dist/plain/calculate/diffDateAsDuration.js +1 -1
  155. package/dist/plain/calculate/diffDateTime.d.ts +1 -1
  156. package/dist/plain/calculate/diffDateTime.js +1 -1
  157. package/dist/plain/calculate/diffDateTimeAsDuration.d.ts +1 -1
  158. package/dist/plain/calculate/diffDateTimeAsDuration.js +1 -1
  159. package/dist/plain/calculate/diffTime.d.ts +1 -1
  160. package/dist/plain/calculate/diffTime.js +1 -1
  161. package/dist/plain/calculate/endOfDate.d.ts +8 -3
  162. package/dist/plain/calculate/endOfDate.js +1 -3
  163. package/dist/plain/calculate/endOfDateTime.d.ts +15 -5
  164. package/dist/plain/calculate/endOfDateTime.js +1 -5
  165. package/dist/plain/calculate/endOfTime.d.ts +8 -2
  166. package/dist/plain/calculate/endOfTime.js +1 -2
  167. package/dist/plain/calculate/getLocaleWeekYear.d.ts +16 -9
  168. package/dist/plain/calculate/getLocaleWeekYear.js +9 -9
  169. package/dist/plain/calculate/getWeekOfMonth.d.ts +7 -4
  170. package/dist/plain/calculate/getWeekOfMonth.js +7 -4
  171. package/dist/plain/calculate/getWeeksInLocaleWeekYear.d.ts +13 -6
  172. package/dist/plain/calculate/getWeeksInLocaleWeekYear.js +6 -6
  173. package/dist/plain/calculate/getWeeksInMonth.d.ts +5 -2
  174. package/dist/plain/calculate/getWeeksInMonth.js +5 -2
  175. package/dist/plain/calculate/nextWeekday.d.ts +7 -3
  176. package/dist/plain/calculate/nextWeekday.js +1 -3
  177. package/dist/plain/calculate/previousWeekday.d.ts +7 -3
  178. package/dist/plain/calculate/previousWeekday.js +1 -3
  179. package/dist/plain/calculate/roundDate.d.ts +20 -7
  180. package/dist/plain/calculate/roundDate.js +3 -10
  181. package/dist/plain/calculate/roundDateTime.d.ts +22 -8
  182. package/dist/plain/calculate/roundDateTime.js +3 -11
  183. package/dist/plain/calculate/roundTime.d.ts +20 -4
  184. package/dist/plain/calculate/roundTime.js +3 -7
  185. package/dist/plain/calculate/setDate.d.ts +7 -5
  186. package/dist/plain/calculate/setDate.js +1 -5
  187. package/dist/plain/calculate/setDateTime.d.ts +8 -5
  188. package/dist/plain/calculate/setDateTime.js +1 -5
  189. package/dist/plain/calculate/setTime.d.ts +10 -6
  190. package/dist/plain/calculate/setTime.js +4 -6
  191. package/dist/plain/calculate/startOfDate.d.ts +8 -2
  192. package/dist/plain/calculate/startOfDate.js +1 -2
  193. package/dist/plain/calculate/startOfDateTime.d.ts +15 -2
  194. package/dist/plain/calculate/startOfDateTime.js +1 -2
  195. package/dist/plain/calculate/startOfTime.d.ts +8 -1
  196. package/dist/plain/calculate/startOfTime.js +1 -1
  197. package/dist/plain/calculate/subtractDate.d.ts +7 -4
  198. package/dist/plain/calculate/subtractDate.js +1 -4
  199. package/dist/plain/calculate/subtractDateTime.d.ts +7 -4
  200. package/dist/plain/calculate/subtractDateTime.js +1 -4
  201. package/dist/plain/compare/areDateTimesEqualBy.d.ts +13 -5
  202. package/dist/plain/compare/areDateTimesEqualBy.js +6 -5
  203. package/dist/plain/compare/areDatesEqualBy.d.ts +15 -6
  204. package/dist/plain/compare/areDatesEqualBy.js +8 -6
  205. package/dist/plain/compare/isBetweenDate.d.ts +13 -2
  206. package/dist/plain/compare/isBetweenDate.js +4 -4
  207. package/dist/plain/compare/isBetweenDateTime.d.ts +13 -2
  208. package/dist/plain/compare/isBetweenDateTime.js +4 -4
  209. package/dist/plain/compare/isBetweenTime.d.ts +13 -2
  210. package/dist/plain/compare/isBetweenTime.js +4 -4
  211. package/dist/plain/compare/isRelativeDay.d.ts +1 -1
  212. package/dist/plain/compare/isRelativeDay.js +1 -1
  213. package/dist/plain/compare/isThisUnit.d.ts +1 -1
  214. package/dist/plain/compare/isThisUnit.js +1 -1
  215. package/dist/plain/format/formatCalendar.d.ts +21 -14
  216. package/dist/plain/format/formatCalendar.js +21 -16
  217. package/dist/plain/format/formatDate.js +5 -3
  218. package/dist/plain/format/formatDateRange.js +4 -2
  219. package/dist/plain/format/formatDateTime.js +4 -2
  220. package/dist/plain/format/formatDateTimeRange.js +4 -2
  221. package/dist/plain/format/formatDateTimeToParts.d.ts +15 -4
  222. package/dist/plain/format/formatDateTimeToParts.js +10 -6
  223. package/dist/plain/format/formatDateToParts.d.ts +13 -2
  224. package/dist/plain/format/formatDateToParts.js +8 -4
  225. package/dist/plain/format/formatRelativeDate.d.ts +16 -3
  226. package/dist/plain/format/formatRelativeDate.js +26 -15
  227. package/dist/plain/format/formatRelativeDateTime.d.ts +16 -3
  228. package/dist/plain/format/formatRelativeDateTime.js +8 -5
  229. package/dist/plain/format/formatRelativeTime.d.ts +16 -3
  230. package/dist/plain/format/formatRelativeTime.js +21 -13
  231. package/dist/plain/format/formatTime.js +4 -2
  232. package/dist/plain/interval/intervalDifferenceDate.d.ts +9 -0
  233. package/dist/plain/interval/intervalDifferenceDateTime.d.ts +9 -0
  234. package/dist/plain/interval/intervalDifferenceTime.d.ts +9 -0
  235. package/dist/plain/interval/intervalDivideEquallyDate.d.ts +19 -4
  236. package/dist/plain/interval/intervalDivideEquallyDate.js +3 -4
  237. package/dist/plain/interval/intervalDivideEquallyDateTime.d.ts +19 -4
  238. package/dist/plain/interval/intervalDivideEquallyDateTime.js +3 -4
  239. package/dist/plain/interval/intervalDivideEquallyTime.d.ts +19 -4
  240. package/dist/plain/interval/intervalDivideEquallyTime.js +3 -4
  241. package/dist/plain/interval/intervalFromDurationDate.d.ts +16 -3
  242. package/dist/plain/interval/intervalFromDurationDate.js +1 -3
  243. package/dist/plain/interval/intervalFromDurationDateTime.d.ts +16 -3
  244. package/dist/plain/interval/intervalFromDurationDateTime.js +1 -3
  245. package/dist/plain/interval/intervalFromDurationTime.d.ts +9 -0
  246. package/dist/plain/interval/intervalIntersectionDate.d.ts +9 -0
  247. package/dist/plain/interval/intervalIntersectionDateTime.d.ts +9 -0
  248. package/dist/plain/interval/intervalIntersectionTime.d.ts +9 -0
  249. package/dist/plain/interval/intervalSplitAtDate.d.ts +11 -0
  250. package/dist/plain/interval/intervalSplitAtDate.js +2 -0
  251. package/dist/plain/interval/intervalSplitAtDateTime.d.ts +11 -0
  252. package/dist/plain/interval/intervalSplitAtDateTime.js +2 -0
  253. package/dist/plain/interval/intervalSplitAtTime.d.ts +11 -0
  254. package/dist/plain/interval/intervalSplitAtTime.js +2 -0
  255. package/dist/plain/interval/intervalUnionDate.d.ts +9 -0
  256. package/dist/plain/interval/intervalUnionDateTime.d.ts +9 -0
  257. package/dist/plain/interval/intervalUnionTime.d.ts +9 -0
  258. package/dist/plain/interval/intervalXorAllDate.d.ts +9 -0
  259. package/dist/plain/interval/intervalXorAllDateTime.d.ts +9 -0
  260. package/dist/plain/interval/intervalXorAllTime.d.ts +9 -0
  261. package/dist/plain/interval/intervalXorDate.d.ts +9 -0
  262. package/dist/plain/interval/intervalXorDateTime.d.ts +9 -0
  263. package/dist/plain/interval/intervalXorTime.d.ts +9 -0
  264. package/dist/plain/interval/mergeIntervalsDate.d.ts +9 -0
  265. package/dist/plain/interval/mergeIntervalsDateTime.d.ts +9 -0
  266. package/dist/plain/interval/mergeIntervalsTime.d.ts +9 -0
  267. package/dist/plain/interval/splitIntervalByUnitDate.d.ts +23 -7
  268. package/dist/plain/interval/splitIntervalByUnitDate.js +7 -7
  269. package/dist/plain/interval/splitIntervalByUnitDateTime.d.ts +22 -6
  270. package/dist/plain/interval/splitIntervalByUnitDateTime.js +6 -6
  271. package/dist/plain/interval/splitIntervalByUnitTime.d.ts +17 -4
  272. package/dist/plain/interval/splitIntervalByUnitTime.js +1 -4
  273. package/dist/plain/map/mapDatesInRange.d.ts +8 -4
  274. package/dist/plain/map/mapDatesInRange.js +1 -4
  275. package/dist/plain/parse/parseDateTimeWithPattern.d.ts +10 -7
  276. package/dist/plain/parse/parseDateTimeWithPattern.js +10 -7
  277. package/dist/plain/parse/parseDateWithPattern.d.ts +10 -7
  278. package/dist/plain/parse/parseDateWithPattern.js +10 -7
  279. package/dist/plain/parse/parseTimeWithPattern.d.ts +10 -7
  280. package/dist/plain/parse/parseTimeWithPattern.js +10 -7
  281. package/dist/plain/parse/parseUnitFromDate.d.ts +11 -3
  282. package/dist/plain/parse/parseUnitFromDate.js +3 -3
  283. package/dist/plain/parse/parseUnitFromDateTime.d.ts +11 -3
  284. package/dist/plain/parse/parseUnitFromDateTime.js +3 -3
  285. package/dist/plain/parse/parseWeekFromDate.d.ts +10 -6
  286. package/dist/plain/parse/parseWeekFromDate.js +2 -6
  287. package/dist/plain/parse/parseWeekFromDateTime.d.ts +10 -6
  288. package/dist/plain/parse/parseWeekFromDateTime.js +2 -6
  289. package/dist/plain/validate/isValidDateRange.d.ts +19 -4
  290. package/dist/plain/validate/isValidDateRange.js +1 -4
  291. package/dist/plain/validate/isValidDateTimeRange.d.ts +20 -5
  292. package/dist/plain/validate/isValidDateTimeRange.js +2 -5
  293. package/dist/plain/validate/isValidTimeRange.d.ts +20 -5
  294. package/dist/plain/validate/isValidTimeRange.js +2 -5
  295. package/dist/precision/convert/fromExcelSerial.d.ts +10 -4
  296. package/dist/precision/convert/fromExcelSerial.js +4 -5
  297. package/dist/precision/convert/fromNanoseconds.d.ts +1 -1
  298. package/dist/precision/convert/fromNanoseconds.js +1 -1
  299. package/dist/precision/convert/toExcelSerial.d.ts +9 -3
  300. package/dist/precision/convert/toExcelSerial.js +3 -4
  301. package/dist/precision/convert/toNanoseconds.d.ts +11 -6
  302. package/dist/precision/convert/toNanoseconds.js +11 -6
  303. package/dist/precision/validate/isValidInstant.d.ts +12 -3
  304. package/dist/precision/validate/isValidInstant.js +12 -3
  305. package/dist/span/calculate/spanMs.d.ts +10 -4
  306. package/dist/span/calculate/spanMs.js +10 -4
  307. package/dist/span/calculate/spanNs.d.ts +10 -4
  308. package/dist/span/calculate/spanNs.js +10 -4
  309. package/dist/span/validate/isValidSpan.d.ts +8 -3
  310. package/dist/span/validate/isValidSpan.js +8 -3
  311. package/dist/transport/calculate/bestAvailable.d.ts +47 -0
  312. package/dist/transport/calculate/bestAvailable.js +76 -0
  313. package/dist/transport/calculate/crossingTime.d.ts +58 -0
  314. package/dist/transport/calculate/crossingTime.js +76 -0
  315. package/dist/transport/calculate/cutoffAt.d.ts +90 -0
  316. package/dist/transport/calculate/cutoffAt.js +209 -0
  317. package/dist/transport/calculate/cutoffSchedule.d.ts +70 -0
  318. package/dist/transport/calculate/cutoffSchedule.js +71 -0
  319. package/dist/transport/calculate/dwellTime.d.ts +81 -0
  320. package/dist/transport/calculate/dwellTime.js +130 -0
  321. package/dist/transport/calculate/estimateDrift.d.ts +65 -0
  322. package/dist/transport/calculate/estimateDrift.js +75 -0
  323. package/dist/transport/calculate/index.d.ts +10 -0
  324. package/dist/transport/calculate/index.js +10 -0
  325. package/dist/transport/calculate/nextDeparture.d.ts +78 -0
  326. package/dist/transport/calculate/nextDeparture.js +131 -0
  327. package/dist/transport/calculate/punctualityRate.d.ts +42 -0
  328. package/dist/transport/calculate/punctualityRate.js +59 -0
  329. package/dist/transport/calculate/scheduleDelivery.d.ts +150 -0
  330. package/dist/transport/calculate/scheduleDelivery.js +300 -0
  331. package/dist/transport/calculate/transitTime.d.ts +71 -0
  332. package/dist/transport/calculate/transitTime.js +101 -0
  333. package/dist/transport/compare/classifyPunctuality.d.ts +46 -0
  334. package/dist/transport/compare/classifyPunctuality.js +64 -0
  335. package/dist/transport/compare/index.d.ts +4 -0
  336. package/dist/transport/compare/index.js +4 -0
  337. package/dist/transport/compare/isPastCutoff.d.ts +33 -0
  338. package/dist/transport/compare/isPastCutoff.js +48 -0
  339. package/dist/transport/compare/scheduleDeviation.d.ts +37 -0
  340. package/dist/transport/compare/scheduleDeviation.js +53 -0
  341. package/dist/transport/compare/timeToCutoff.d.ts +31 -0
  342. package/dist/transport/compare/timeToCutoff.js +47 -0
  343. package/dist/transport/convert/etaAtZone.d.ts +43 -0
  344. package/dist/transport/convert/etaAtZone.js +58 -0
  345. package/dist/transport/convert/index.d.ts +1 -0
  346. package/dist/transport/convert/index.js +1 -0
  347. package/dist/transport/index.d.ts +4 -0
  348. package/dist/transport/index.js +5 -0
  349. package/dist/types/business-calendar.d.ts +19 -14
  350. package/dist/types/calendar-options.d.ts +15 -3
  351. package/dist/types/date-cycle-field.d.ts +5 -0
  352. package/dist/types/date-duration-unit.d.ts +4 -0
  353. package/dist/types/date-time-cycle-field.d.ts +4 -0
  354. package/dist/types/date-time-duration-units.d.ts +4 -0
  355. package/dist/types/date-time-unit.d.ts +4 -0
  356. package/dist/types/date-unit.d.ts +4 -0
  357. package/dist/types/disambiguation.d.ts +8 -0
  358. package/dist/types/duration-relative-to.d.ts +8 -0
  359. package/dist/types/duration-string-options.d.ts +28 -0
  360. package/dist/types/fiscal-calendar.d.ts +1 -1
  361. package/dist/types/fractional-digit.d.ts +5 -0
  362. package/dist/types/free-time-options.d.ts +44 -0
  363. package/dist/types/index.d.ts +3 -1
  364. package/dist/types/index.js +3 -1
  365. package/dist/types/interval.d.ts +8 -1
  366. package/dist/types/offset.d.ts +9 -0
  367. package/dist/types/operating-schedule.d.ts +71 -0
  368. package/dist/types/operating-schedule.js +0 -0
  369. package/dist/types/overflow.d.ts +6 -0
  370. package/dist/types/relative-rounding-method.d.ts +6 -0
  371. package/dist/types/relative-time-options.d.ts +33 -5
  372. package/dist/types/rounding-options.d.ts +27 -0
  373. package/dist/types/time-cycle-field.d.ts +4 -0
  374. package/dist/types/time-duration-unit.d.ts +4 -0
  375. package/dist/types/time-unit.d.ts +4 -0
  376. package/dist/types/transport-timestamps.d.ts +54 -0
  377. package/dist/types/transport-timestamps.js +0 -0
  378. package/dist/unix/calculate/addUnix.d.ts +19 -5
  379. package/dist/unix/calculate/addUnix.js +1 -5
  380. package/dist/unix/calculate/diffUnix.d.ts +13 -3
  381. package/dist/unix/calculate/diffUnix.js +1 -3
  382. package/dist/unix/calculate/diffUnixAsDuration.d.ts +13 -3
  383. package/dist/unix/calculate/diffUnixAsDuration.js +1 -3
  384. package/dist/unix/calculate/endOfQuarterForUnix.d.ts +13 -3
  385. package/dist/unix/calculate/endOfQuarterForUnix.js +1 -3
  386. package/dist/unix/calculate/endOfUnix.d.ts +20 -4
  387. package/dist/unix/calculate/endOfUnix.js +1 -4
  388. package/dist/unix/calculate/isBetweenUnix.d.ts +26 -4
  389. package/dist/unix/calculate/isBetweenUnix.js +4 -6
  390. package/dist/unix/calculate/roundUnix.d.ts +31 -3
  391. package/dist/unix/calculate/roundUnix.js +3 -6
  392. package/dist/unix/calculate/setUnix.d.ts +35 -9
  393. package/dist/unix/calculate/setUnix.js +4 -13
  394. package/dist/unix/calculate/startOfQuarterForUnix.d.ts +13 -3
  395. package/dist/unix/calculate/startOfQuarterForUnix.js +1 -3
  396. package/dist/unix/calculate/startOfUnix.d.ts +20 -4
  397. package/dist/unix/calculate/startOfUnix.js +1 -4
  398. package/dist/unix/calculate/subtractUnix.d.ts +19 -5
  399. package/dist/unix/calculate/subtractUnix.js +1 -5
  400. package/dist/unix/compare/areUnixEqual.d.ts +7 -1
  401. package/dist/unix/compare/areUnixEqual.js +1 -1
  402. package/dist/unix/compare/areUnixEqualBy.d.ts +24 -7
  403. package/dist/unix/compare/areUnixEqualBy.js +13 -9
  404. package/dist/unix/compare/isAfterUnix.d.ts +7 -1
  405. package/dist/unix/compare/isAfterUnix.js +1 -1
  406. package/dist/unix/compare/isBeforeUnix.d.ts +7 -1
  407. package/dist/unix/compare/isBeforeUnix.js +1 -1
  408. package/dist/unix/convert/convertUnixToPlainDate.d.ts +14 -4
  409. package/dist/unix/convert/convertUnixToPlainDate.js +2 -4
  410. package/dist/unix/convert/convertUnixToPlainDateTime.d.ts +14 -4
  411. package/dist/unix/convert/convertUnixToPlainDateTime.js +2 -4
  412. package/dist/unix/convert/convertUnixToPlainTime.d.ts +14 -4
  413. package/dist/unix/convert/convertUnixToPlainTime.js +2 -4
  414. package/dist/unix/convert/convertUnixToUtc.d.ts +9 -4
  415. package/dist/unix/convert/convertUnixToUtc.js +3 -4
  416. package/dist/unix/convert/convertUnixToZoned.d.ts +10 -5
  417. package/dist/unix/convert/convertUnixToZoned.js +4 -5
  418. package/dist/unix/format/formatCalendarUnix.d.ts +27 -19
  419. package/dist/unix/format/formatCalendarUnix.js +4 -5
  420. package/dist/unix/format/formatRelativeUnix.d.ts +54 -5
  421. package/dist/unix/format/formatRelativeUnix.js +3 -5
  422. package/dist/unix/format/formatUnix.d.ts +24 -6
  423. package/dist/unix/format/formatUnix.js +8 -7
  424. package/dist/unix/get/getUnixNow.d.ts +8 -3
  425. package/dist/unix/get/getUnixNow.js +1 -3
  426. package/dist/unix/interval/intervalCountUnix.d.ts +14 -5
  427. package/dist/unix/interval/intervalCountUnix.js +2 -5
  428. package/dist/unix/interval/intervalDifferenceUnix.d.ts +6 -0
  429. package/dist/unix/interval/intervalDivideEquallyUnix.d.ts +18 -4
  430. package/dist/unix/interval/intervalDivideEquallyUnix.js +5 -4
  431. package/dist/unix/interval/intervalFromDurationUnix.d.ts +33 -5
  432. package/dist/unix/interval/intervalFromDurationUnix.js +6 -5
  433. package/dist/unix/interval/intervalIntersectionUnix.d.ts +6 -0
  434. package/dist/unix/interval/intervalLengthUnix.d.ts +16 -6
  435. package/dist/unix/interval/intervalLengthUnix.js +4 -6
  436. package/dist/unix/interval/intervalOverlappingDaysUnix.d.ts +13 -3
  437. package/dist/unix/interval/intervalOverlappingDaysUnix.js +1 -3
  438. package/dist/unix/interval/intervalSplitAtUnix.d.ts +8 -0
  439. package/dist/unix/interval/intervalSplitAtUnix.js +2 -0
  440. package/dist/unix/interval/intervalUnionUnix.d.ts +6 -0
  441. package/dist/unix/interval/intervalXorAllUnix.d.ts +6 -0
  442. package/dist/unix/interval/intervalXorUnix.d.ts +6 -0
  443. package/dist/unix/interval/mergeIntervalsUnix.d.ts +6 -0
  444. package/dist/unix/interval/splitIntervalByUnitUnix.d.ts +42 -11
  445. package/dist/unix/interval/splitIntervalByUnitUnix.js +21 -16
  446. package/dist/unix/parse/parseDateFromUnix.d.ts +13 -2
  447. package/dist/unix/parse/parseDateFromUnix.js +1 -2
  448. package/dist/unix/parse/parseDayFromUnix.d.ts +14 -2
  449. package/dist/unix/parse/parseDayFromUnix.js +2 -2
  450. package/dist/unix/parse/parseDayOfWeekFromUnix.d.ts +13 -1
  451. package/dist/unix/parse/parseDayOfWeekFromUnix.js +1 -1
  452. package/dist/unix/parse/parseHourFromUnix.d.ts +14 -2
  453. package/dist/unix/parse/parseHourFromUnix.js +2 -2
  454. package/dist/unix/parse/parseMicrosecondFromUnix.d.ts +14 -2
  455. package/dist/unix/parse/parseMicrosecondFromUnix.js +2 -2
  456. package/dist/unix/parse/parseMillisecondFromUnix.d.ts +14 -2
  457. package/dist/unix/parse/parseMillisecondFromUnix.js +2 -2
  458. package/dist/unix/parse/parseMinuteFromUnix.d.ts +14 -2
  459. package/dist/unix/parse/parseMinuteFromUnix.js +2 -2
  460. package/dist/unix/parse/parseMonthFromUnix.d.ts +14 -2
  461. package/dist/unix/parse/parseMonthFromUnix.js +2 -2
  462. package/dist/unix/parse/parseNanosecondFromUnix.d.ts +14 -2
  463. package/dist/unix/parse/parseNanosecondFromUnix.js +2 -2
  464. package/dist/unix/parse/parseSecondFromUnix.d.ts +14 -2
  465. package/dist/unix/parse/parseSecondFromUnix.js +2 -2
  466. package/dist/unix/parse/parseTimeFromUnix.d.ts +13 -2
  467. package/dist/unix/parse/parseTimeFromUnix.js +1 -2
  468. package/dist/unix/parse/parseUnitFromUnix.d.ts +22 -3
  469. package/dist/unix/parse/parseUnitFromUnix.js +2 -3
  470. package/dist/unix/parse/parseWeekFromUnix.d.ts +23 -7
  471. package/dist/unix/parse/parseWeekFromUnix.js +3 -7
  472. package/dist/unix/parse/parseYearFromUnix.d.ts +14 -2
  473. package/dist/unix/parse/parseYearFromUnix.js +2 -2
  474. package/dist/unix/validate/isValidUnixRange.d.ts +20 -4
  475. package/dist/unix/validate/isValidUnixRange.js +1 -4
  476. package/dist/utc/calculate/addUtc.d.ts +7 -4
  477. package/dist/utc/calculate/addUtc.js +1 -4
  478. package/dist/utc/calculate/diffUtc.d.ts +1 -1
  479. package/dist/utc/calculate/diffUtc.js +1 -1
  480. package/dist/utc/calculate/diffUtcAsDuration.d.ts +1 -1
  481. package/dist/utc/calculate/diffUtcAsDuration.js +1 -1
  482. package/dist/utc/calculate/endOfUtc.d.ts +16 -3
  483. package/dist/utc/calculate/endOfUtc.js +2 -3
  484. package/dist/utc/calculate/isBetweenUtc.d.ts +13 -2
  485. package/dist/utc/calculate/isBetweenUtc.js +4 -4
  486. package/dist/utc/calculate/roundUtc.d.ts +26 -9
  487. package/dist/utc/calculate/roundUtc.js +3 -12
  488. package/dist/utc/calculate/setUtc.d.ts +7 -4
  489. package/dist/utc/calculate/setUtc.js +1 -4
  490. package/dist/utc/calculate/startOfUtc.d.ts +15 -2
  491. package/dist/utc/calculate/startOfUtc.js +1 -2
  492. package/dist/utc/calculate/subtractUtc.d.ts +7 -4
  493. package/dist/utc/calculate/subtractUtc.js +1 -4
  494. package/dist/utc/compare/areUtcEqualBy.d.ts +9 -3
  495. package/dist/utc/compare/areUtcEqualBy.js +2 -3
  496. package/dist/utc/convert/convertUtcToPlainDate.d.ts +8 -3
  497. package/dist/utc/convert/convertUtcToPlainDate.js +5 -6
  498. package/dist/utc/convert/convertUtcToPlainDateTime.d.ts +8 -3
  499. package/dist/utc/convert/convertUtcToPlainDateTime.js +5 -6
  500. package/dist/utc/convert/convertUtcToPlainTime.d.ts +8 -3
  501. package/dist/utc/convert/convertUtcToPlainTime.js +5 -6
  502. package/dist/utc/convert/convertUtcToUnix.d.ts +9 -4
  503. package/dist/utc/convert/convertUtcToUnix.js +3 -4
  504. package/dist/utc/convert/convertUtcToZoned.d.ts +1 -1
  505. package/dist/utc/convert/convertUtcToZoned.js +1 -1
  506. package/dist/utc/format/formatCalendarUtc.d.ts +19 -8
  507. package/dist/utc/format/formatCalendarUtc.js +8 -6
  508. package/dist/utc/format/formatHttp.d.ts +1 -1
  509. package/dist/utc/format/formatHttp.js +1 -1
  510. package/dist/utc/format/formatRelativeUtc.d.ts +30 -10
  511. package/dist/utc/format/formatRelativeUtc.js +9 -11
  512. package/dist/utc/format/formatUtc.d.ts +17 -15
  513. package/dist/utc/format/formatUtc.js +8 -8
  514. package/dist/utc/interval/intervalDifferenceUtc.d.ts +6 -0
  515. package/dist/utc/interval/intervalDivideEquallyUtc.d.ts +18 -4
  516. package/dist/utc/interval/intervalDivideEquallyUtc.js +5 -4
  517. package/dist/utc/interval/intervalFromDurationUtc.d.ts +13 -3
  518. package/dist/utc/interval/intervalFromDurationUtc.js +1 -3
  519. package/dist/utc/interval/intervalIntersectionUtc.d.ts +6 -0
  520. package/dist/utc/interval/intervalSplitAtUtc.d.ts +8 -0
  521. package/dist/utc/interval/intervalSplitAtUtc.js +2 -0
  522. package/dist/utc/interval/intervalUnionUtc.d.ts +6 -0
  523. package/dist/utc/interval/intervalXorAllUtc.d.ts +6 -0
  524. package/dist/utc/interval/intervalXorUtc.d.ts +6 -0
  525. package/dist/utc/interval/mergeIntervalsUtc.d.ts +6 -0
  526. package/dist/utc/interval/splitIntervalByUnitUtc.d.ts +19 -6
  527. package/dist/utc/interval/splitIntervalByUnitUtc.js +6 -6
  528. package/dist/utc/parse/parseDateFromUtc.d.ts +7 -3
  529. package/dist/utc/parse/parseDateFromUtc.js +1 -3
  530. package/dist/utc/parse/parseDayFromUtc.d.ts +7 -3
  531. package/dist/utc/parse/parseDayFromUtc.js +1 -3
  532. package/dist/utc/parse/parseDayOfWeekFromUtc.d.ts +7 -3
  533. package/dist/utc/parse/parseDayOfWeekFromUtc.js +4 -6
  534. package/dist/utc/parse/parseHourFromUtc.d.ts +7 -3
  535. package/dist/utc/parse/parseHourFromUtc.js +1 -3
  536. package/dist/utc/parse/parseHttp.d.ts +1 -1
  537. package/dist/utc/parse/parseHttp.js +1 -1
  538. package/dist/utc/parse/parseMicrosecondFromUtc.d.ts +7 -3
  539. package/dist/utc/parse/parseMicrosecondFromUtc.js +1 -3
  540. package/dist/utc/parse/parseMillisecondFromUtc.d.ts +7 -3
  541. package/dist/utc/parse/parseMillisecondFromUtc.js +1 -3
  542. package/dist/utc/parse/parseMinuteFromUtc.d.ts +7 -3
  543. package/dist/utc/parse/parseMinuteFromUtc.js +1 -3
  544. package/dist/utc/parse/parseMonthFromUtc.d.ts +7 -3
  545. package/dist/utc/parse/parseMonthFromUtc.js +1 -3
  546. package/dist/utc/parse/parseNanosecondFromUtc.d.ts +7 -3
  547. package/dist/utc/parse/parseNanosecondFromUtc.js +1 -3
  548. package/dist/utc/parse/parseSecondFromUtc.d.ts +7 -3
  549. package/dist/utc/parse/parseSecondFromUtc.js +1 -3
  550. package/dist/utc/parse/parseTimeFromUtc.d.ts +8 -3
  551. package/dist/utc/parse/parseTimeFromUtc.js +5 -6
  552. package/dist/utc/parse/parseUnitFromUtc.d.ts +17 -5
  553. package/dist/utc/parse/parseUnitFromUtc.js +6 -8
  554. package/dist/utc/parse/parseWeekFromUtc.d.ts +18 -10
  555. package/dist/utc/parse/parseWeekFromUtc.js +7 -13
  556. package/dist/utc/parse/parseYearFromUtc.d.ts +7 -3
  557. package/dist/utc/parse/parseYearFromUtc.js +1 -3
  558. package/dist/utc/validate/isValidUtcRange.d.ts +16 -5
  559. package/dist/utc/validate/isValidUtcRange.js +2 -5
  560. package/dist/zoned/calculate/addZoned.d.ts +20 -10
  561. package/dist/zoned/calculate/addZoned.js +6 -13
  562. package/dist/zoned/calculate/cycleZoned.d.ts +33 -8
  563. package/dist/zoned/calculate/cycleZoned.js +1 -8
  564. package/dist/zoned/calculate/diffZoned.d.ts +1 -1
  565. package/dist/zoned/calculate/diffZoned.js +1 -1
  566. package/dist/zoned/calculate/diffZonedAsDuration.d.ts +1 -1
  567. package/dist/zoned/calculate/diffZonedAsDuration.js +1 -1
  568. package/dist/zoned/calculate/endOfQuarterForZoned.d.ts +9 -2
  569. package/dist/zoned/calculate/endOfQuarterForZoned.js +4 -5
  570. package/dist/zoned/calculate/endOfZoned.d.ts +16 -3
  571. package/dist/zoned/calculate/endOfZoned.js +2 -3
  572. package/dist/zoned/calculate/getLocaleZonedEndOfWeek.d.ts +10 -3
  573. package/dist/zoned/calculate/getLocaleZonedEndOfWeek.js +5 -6
  574. package/dist/zoned/calculate/getLocaleZonedStartOfWeek.d.ts +7 -1
  575. package/dist/zoned/calculate/getLocaleZonedStartOfWeek.js +3 -4
  576. package/dist/zoned/calculate/roundZoned.d.ts +21 -4
  577. package/dist/zoned/calculate/roundZoned.js +3 -7
  578. package/dist/zoned/calculate/setZoned.d.ts +25 -8
  579. package/dist/zoned/calculate/setZoned.js +4 -12
  580. package/dist/zoned/calculate/startOfQuarterForZoned.d.ts +7 -2
  581. package/dist/zoned/calculate/startOfQuarterForZoned.js +3 -5
  582. package/dist/zoned/calculate/startOfZoned.d.ts +15 -3
  583. package/dist/zoned/calculate/startOfZoned.js +1 -3
  584. package/dist/zoned/calculate/subtractZoned.d.ts +20 -10
  585. package/dist/zoned/calculate/subtractZoned.js +6 -13
  586. package/dist/zoned/compare/areZonedEqualBy.d.ts +14 -5
  587. package/dist/zoned/compare/areZonedEqualBy.js +7 -5
  588. package/dist/zoned/compare/isBetweenZoned.d.ts +13 -1
  589. package/dist/zoned/compare/isBetweenZoned.js +4 -3
  590. package/dist/zoned/compare/isInDaylightSaving.d.ts +38 -11
  591. package/dist/zoned/compare/isInDaylightSaving.js +40 -44
  592. package/dist/zoned/convert/convertPlainDateTimeToZoned.d.ts +18 -5
  593. package/dist/zoned/convert/convertPlainDateTimeToZoned.js +6 -11
  594. package/dist/zoned/convert/convertZonedToUnix.d.ts +9 -4
  595. package/dist/zoned/convert/convertZonedToUnix.js +2 -4
  596. package/dist/zoned/convert/convertZonedToZoned.d.ts +1 -1
  597. package/dist/zoned/convert/convertZonedToZoned.js +1 -1
  598. package/dist/zoned/format/formatCalendarZoned.d.ts +18 -12
  599. package/dist/zoned/format/formatCalendarZoned.js +13 -9
  600. package/dist/zoned/format/formatRelativeZoned.d.ts +41 -12
  601. package/dist/zoned/format/formatRelativeZoned.js +7 -4
  602. package/dist/zoned/format/formatRfc2822.d.ts +2 -2
  603. package/dist/zoned/format/formatRfc2822.js +2 -2
  604. package/dist/zoned/format/formatRfc3339.d.ts +2 -3
  605. package/dist/zoned/format/formatRfc3339.js +2 -3
  606. package/dist/zoned/format/formatTimeZoneName.d.ts +12 -3
  607. package/dist/zoned/format/formatTimeZoneName.js +5 -4
  608. package/dist/zoned/format/formatZonedDateTime.js +2 -1
  609. package/dist/zoned/format/formatZonedRange.js +2 -1
  610. package/dist/zoned/format/formatZonedToParts.d.ts +15 -4
  611. package/dist/zoned/format/formatZonedToParts.js +8 -5
  612. package/dist/zoned/get/getDstTransitions.d.ts +9 -10
  613. package/dist/zoned/get/getDstTransitions.js +12 -3
  614. package/dist/zoned/get/getTimeZoneOffset.d.ts +4 -1
  615. package/dist/zoned/get/getTimeZoneOffset.js +6 -3
  616. package/dist/zoned/get/getZonedNow.d.ts +13 -1
  617. package/dist/zoned/get/getZonedNow.js +12 -3
  618. package/dist/zoned/interval/intervalDifferenceZoned.d.ts +9 -0
  619. package/dist/zoned/interval/intervalDivideEquallyZoned.d.ts +22 -4
  620. package/dist/zoned/interval/intervalDivideEquallyZoned.js +6 -4
  621. package/dist/zoned/interval/intervalFromDurationZoned.d.ts +29 -10
  622. package/dist/zoned/interval/intervalFromDurationZoned.js +6 -13
  623. package/dist/zoned/interval/intervalIntersectionZoned.d.ts +9 -0
  624. package/dist/zoned/interval/intervalSplitAtZoned.d.ts +11 -0
  625. package/dist/zoned/interval/intervalSplitAtZoned.js +2 -0
  626. package/dist/zoned/interval/intervalUnionZoned.d.ts +9 -0
  627. package/dist/zoned/interval/intervalXorAllZoned.d.ts +9 -0
  628. package/dist/zoned/interval/intervalXorZoned.d.ts +9 -0
  629. package/dist/zoned/interval/mergeIntervalsZoned.d.ts +9 -0
  630. package/dist/zoned/interval/splitIntervalByUnitZoned.d.ts +27 -6
  631. package/dist/zoned/interval/splitIntervalByUnitZoned.js +11 -6
  632. package/dist/zoned/map/mapZonedDatesInRange.d.ts +9 -4
  633. package/dist/zoned/map/mapZonedDatesInRange.js +2 -4
  634. package/dist/zoned/parse/parseRfc2822.d.ts +1 -1
  635. package/dist/zoned/parse/parseRfc2822.js +1 -1
  636. package/dist/zoned/parse/parseUnitFromZoned.d.ts +9 -3
  637. package/dist/zoned/parse/parseUnitFromZoned.js +1 -3
  638. package/dist/zoned/parse/parseWeekFromZoned.d.ts +10 -3
  639. package/dist/zoned/parse/parseWeekFromZoned.js +2 -3
  640. package/dist/zoned/validate/hasDaylightSaving.d.ts +42 -11
  641. package/dist/zoned/validate/hasDaylightSaving.js +47 -31
  642. package/dist/zoned/validate/isValidZonedDateTime.d.ts +13 -0
  643. package/dist/zoned/validate/isValidZonedDateTime.js +14 -1
  644. package/dist/zoned/validate/isValidZonedRange.d.ts +15 -4
  645. package/dist/zoned/validate/isValidZonedRange.js +1 -4
  646. package/package.json +53 -5
  647. package/skills/gmt-arithmetic/SKILL.md +1 -1
  648. package/skills/gmt-basics/SKILL.md +10 -1
  649. package/skills/gmt-integration/SKILL.md +10 -5
  650. package/skills/gmt-timezone/SKILL.md +210 -14
  651. package/dist/internal/resolveReadingTimeZone.d.ts +0 -11
  652. package/dist/internal/resolveReadingTimeZone.js +0 -18
  653. package/dist/types/duration-unit.d.ts +0 -5
  654. /package/dist/types/{duration-unit.js → free-time-options.js} +0 -0
@@ -0,0 +1,27 @@
1
+ /**
2
+ * The sampling step: 5 days. It must stay under the smallest gap between two offset changes of
3
+ * one zone, 601,200 s in tz 2026c (`zdump -v`, America/Boa_Vista 2000-10-08 to 2000-10-15).
4
+ */
5
+ export declare const TRANSITION_SEARCH_STEP_NANOSECONDS: bigint;
6
+ /**
7
+ * TC39 `GetNamedTimeZoneNextTransition`: the first offset change strictly after `from`.
8
+ *
9
+ * @param timeZone a named zone
10
+ * @param from the instant to search after (exclusive)
11
+ * @param until optional: the last instant to search (inclusive); a later change returns null
12
+ * @returns the change's epoch nanoseconds, or null when there is none up to `until` or none within
13
+ * three years of the later of `from` and the current instant
14
+ * @throws RangeError past `MAX_SEARCH_STEPS` steps
15
+ */
16
+ export declare function nextTransitionAfter(timeZone: string, from: bigint, until?: bigint): bigint | null;
17
+ /**
18
+ * TC39 `GetNamedTimeZonePreviousTransition`: the last offset change strictly before `from`.
19
+ *
20
+ * @param timeZone a named zone
21
+ * @param from the instant to search before (exclusive)
22
+ * @param since optional: the search stops here (exclusive); an earlier change returns null
23
+ * @returns the change's epoch nanoseconds, or null when there is none after `since`, or, with no
24
+ * `since`, none at all
25
+ * @throws RangeError past `MAX_SEARCH_STEPS` steps or `MAX_TABLED_TRANSITIONS` tabled changes
26
+ */
27
+ export declare function previousTransitionBefore(timeZone: string, from: bigint, since?: bigint): bigint | null;
@@ -0,0 +1,218 @@
1
+ import { Temporal } from "@js-temporal/polyfill";
2
+ import { MAX_EPOCH_NANOSECONDS, MIN_EPOCH_NANOSECONDS, } from "./epochNanoseconds.js";
3
+ import { POLYFILL_TRANSITION_SEARCH_FLOOR, missedNextTransition, missedPreviousTransition, offsetAt, transitionBetween, } from "./zonedWallClock.js";
4
+ /*
5
+ * ---------------------------------------------------------------------------------------------
6
+ * GMT's own time zone transition search (temporalCompat D13; `zonedWallClock.ts` defect 5)
7
+ * ---------------------------------------------------------------------------------------------
8
+ * TC39 `GetNamedTimeZoneNextTransition` / `GetNamedTimeZonePreviousTransition`: the first offset
9
+ * change strictly after an instant, and the last strictly before it. `@js-temporal/polyfill`
10
+ * 0.5.1 samples the offset every 14 days and bisects a step whose ends differ. Two changes inside
11
+ * one step break it: a pair that returns to the same offset is skipped (America/Boa_Vista,
12
+ * 2000-10-08 and 2000-10-15), and three different offsets make its bisection loop forever
13
+ * (Europe/Riga, 1944-10-02 and 1944-10-12).
14
+ *
15
+ * This search samples the same way with a step shorter than any gap between two changes in the
16
+ * tz database, so a step holds at most one change: equal ends mean none, different ends mean
17
+ * exactly one, and bisecting it always narrows.
18
+ *
19
+ * The sampling assumption, pinned by the all-zones guard in `zonedTransitionSearch.test.ts`: no
20
+ * zone changes its offset twice within `TRANSITION_SEARCH_STEP_NANOSECONDS`. The closest pair in
21
+ * tz 2026c is 601,200 s apart (America/Boa_Vista, Noronha and Recife in 2000; Asia/Gaza and
22
+ * Asia/Hebron in 2040), measured with `zdump -v`. The step is 432,000 s (5 days), 169,200 s
23
+ * under that. A tz release with a closer pair fails the guard.
24
+ *
25
+ * "No further change" follows the polyfill's own rule, so removal changes no answer: a forward
26
+ * search stops three 366-day years past the later of its start and the current instant, and a
27
+ * backward search stops at 1847-01-01, before which the one earlier change a zone can have is
28
+ * found by comparing offsets (`missedNextTransition`, `missedPreviousTransition`).
29
+ *
30
+ * Bounds, in offset reads (one `Intl` read each):
31
+ * - a limit instant only shortens a search; the horizon above applies with or without one, so a
32
+ * limit thousands of years away costs no more than none. Within the horizon: one read per 5
33
+ * days of the limit, plus at most 51 to pin the change. The daylight rule passes 365 days: at
34
+ * most 74 + 51 reads.
35
+ * - forward: at most the steps from the start (1847 at the earliest) to three years past the later
36
+ * of the start and today, about 13,400 from 1847 and 220 from any later start; a system clock
37
+ * set absurdly far ahead stops at `MAX_SEARCH_STEPS` (200,000) with a RangeError.
38
+ * - backward: the same span, down to 1847. From more than three years past today: 220 reads over
39
+ * the three years before the instant; if nothing is there, one backward search from three years
40
+ * past today and then at most `MAX_TABLED_TRANSITIONS` (1,000) forward searches, then a
41
+ * RangeError.
42
+ *
43
+ * Removed with the D13 workaround: see `temporalCompat/README.md`.
44
+ * ---------------------------------------------------------------------------------------------
45
+ */
46
+ const NANOSECONDS_PER_SECOND = 1000000000n;
47
+ const NANOSECONDS_PER_DAY = 86400n * NANOSECONDS_PER_SECOND;
48
+ /**
49
+ * The sampling step: 5 days. It must stay under the smallest gap between two offset changes of
50
+ * one zone, 601,200 s in tz 2026c (`zdump -v`, America/Boa_Vista 2000-10-08 to 2000-10-15).
51
+ */
52
+ export const TRANSITION_SEARCH_STEP_NANOSECONDS = 432000n * NANOSECONDS_PER_SECOND;
53
+ /**
54
+ * js-temporal `GetNamedTimeZoneNextTransition`: "the farthest that we'll look for a next
55
+ * transition is 3 years after the later of epochNanoseconds or the current time"
56
+ * (`DAY_MS * 366 * 3`).
57
+ */
58
+ const NO_FURTHER_TRANSITION_HORIZON_NANOSECONDS = 3n * 366n * NANOSECONDS_PER_DAY;
59
+ /** Steps one search may take: 200,000 five-day steps is 2,700 years. */
60
+ const MAX_SEARCH_STEPS = 200_000;
61
+ /** Forward searches when walking a zone's tabled future changes; Africa/Casablanca has about 120. */
62
+ const MAX_TABLED_TRANSITIONS = 1_000;
63
+ /** Halvings to pin a whole second inside one step: 2^19 s is more than 5 days. */
64
+ const MAX_SECOND_BISECTION_STEPS = 20;
65
+ function minimum(a, b) {
66
+ return a < b ? a : b;
67
+ }
68
+ function maximum(a, b) {
69
+ return a > b ? a : b;
70
+ }
71
+ function floorSecond(epochNanoseconds) {
72
+ const seconds = epochNanoseconds / NANOSECONDS_PER_SECOND;
73
+ return epochNanoseconds % NANOSECONDS_PER_SECOND < 0n
74
+ ? seconds - 1n
75
+ : seconds;
76
+ }
77
+ /**
78
+ * The one change in `(low, high]`, given that the offsets at the two ends differ and the window is
79
+ * no longer than a step. tz changes fall on whole seconds (RFC 9636 §3.2 stores transition times in
80
+ * seconds), so the search runs over seconds; the result is checked one nanosecond earlier, and a
81
+ * change that is not on a whole second is pinned to the nanosecond instead.
82
+ */
83
+ function changeBetween(timeZone, low, high, lowOffset, highOffset) {
84
+ let before = floorSecond(low);
85
+ let after = floorSecond(high);
86
+ for (let i = 0; i < MAX_SECOND_BISECTION_STEPS && after - before > 1n; i++) {
87
+ const middle = (before + after) / 2n;
88
+ if (offsetAt(timeZone, middle * NANOSECONDS_PER_SECOND) === lowOffset) {
89
+ before = middle;
90
+ }
91
+ else {
92
+ after = middle;
93
+ }
94
+ }
95
+ const change = after * NANOSECONDS_PER_SECOND;
96
+ if (after - before === 1n &&
97
+ change > low &&
98
+ offsetAt(timeZone, change) === highOffset &&
99
+ offsetAt(timeZone, change - 1n) === lowOffset) {
100
+ return change;
101
+ }
102
+ return transitionBetween(timeZone, low, high, highOffset);
103
+ }
104
+ function currentEpochNanoseconds() {
105
+ return Temporal.Now.instant().epochNanoseconds;
106
+ }
107
+ /**
108
+ * TC39 `GetNamedTimeZoneNextTransition`: the first offset change strictly after `from`.
109
+ *
110
+ * @param timeZone a named zone
111
+ * @param from the instant to search after (exclusive)
112
+ * @param until optional: the last instant to search (inclusive); a later change returns null
113
+ * @returns the change's epoch nanoseconds, or null when there is none up to `until` or none within
114
+ * three years of the later of `from` and the current instant
115
+ * @throws RangeError past `MAX_SEARCH_STEPS` steps
116
+ */
117
+ export function nextTransitionAfter(timeZone, from, until) {
118
+ // The horizon holds with or without a limit, as it does when the polyfill answers and the
119
+ // limit only filters its result.
120
+ const horizon = maximum(from, currentEpochNanoseconds()) +
121
+ NO_FURTHER_TRANSITION_HORIZON_NANOSECONDS;
122
+ const end = minimum(MAX_EPOCH_NANOSECONDS, until === undefined ? horizon : minimum(until, horizon));
123
+ if (from >= end)
124
+ return null;
125
+ let low = from;
126
+ if (low < POLYFILL_TRANSITION_SEARCH_FLOOR) {
127
+ const missed = missedNextTransition(timeZone, low);
128
+ if (missed !== null)
129
+ return missed <= end ? missed : null;
130
+ if (end <= POLYFILL_TRANSITION_SEARCH_FLOOR)
131
+ return null;
132
+ low = POLYFILL_TRANSITION_SEARCH_FLOOR;
133
+ }
134
+ const lowOffset = offsetAt(timeZone, low);
135
+ for (let i = 0; i < MAX_SEARCH_STEPS; i++) {
136
+ const high = minimum(low + TRANSITION_SEARCH_STEP_NANOSECONDS, end);
137
+ const highOffset = offsetAt(timeZone, high);
138
+ if (highOffset !== lowOffset) {
139
+ return changeBetween(timeZone, low, high, lowOffset, highOffset);
140
+ }
141
+ if (high >= end)
142
+ return null;
143
+ low = high;
144
+ }
145
+ throw new RangeError(`Transition search in ${timeZone} ran past its bound`);
146
+ }
147
+ /** The last change in `(since, start]`, scanning back from `start`; null when there is none. */
148
+ function lastChangeBack(timeZone, start, since) {
149
+ let high = start;
150
+ const highOffset = offsetAt(timeZone, high);
151
+ for (let i = 0; i < MAX_SEARCH_STEPS; i++) {
152
+ if (high <= since)
153
+ return null;
154
+ const low = maximum(high - TRANSITION_SEARCH_STEP_NANOSECONDS, since);
155
+ const lowOffset = offsetAt(timeZone, low);
156
+ if (lowOffset !== highOffset) {
157
+ return changeBetween(timeZone, low, high, lowOffset, highOffset);
158
+ }
159
+ high = low;
160
+ }
161
+ throw new RangeError(`Transition search in ${timeZone} ran past its bound`);
162
+ }
163
+ /**
164
+ * The last change before an instant more than three years past the current one. The polyfill's
165
+ * rule: when the zone has no change between now and three years from now, there is none later, so
166
+ * the answer is the last change before that horizon. A zone whose rules repeat has one in the
167
+ * three years before `from`. Otherwise its future changes are a finite table (Africa/Casablanca,
168
+ * to 2087), walked forward to its end. A change at or before `since` is not looked for.
169
+ */
170
+ function previousTransitionFarAhead(timeZone, from, now, since) {
171
+ const recentStart = from - NO_FURTHER_TRANSITION_HORIZON_NANOSECONDS;
172
+ const recent = lastChangeBack(timeZone, from - 1n, since === undefined ? recentStart : maximum(since, recentStart));
173
+ if (recent !== null)
174
+ return recent;
175
+ if (since !== undefined && since >= recentStart)
176
+ return null;
177
+ const horizon = now + NO_FURTHER_TRANSITION_HORIZON_NANOSECONDS;
178
+ let last = previousTransitionBefore(timeZone, horizon, since);
179
+ if (last === null || last < now)
180
+ return last;
181
+ for (let i = 0; i < MAX_TABLED_TRANSITIONS; i++) {
182
+ const next = nextTransitionAfter(timeZone, last);
183
+ if (next === null || next >= from)
184
+ return last;
185
+ last = next;
186
+ }
187
+ throw new RangeError(`Transition walk in ${timeZone} ran past its bound`);
188
+ }
189
+ /**
190
+ * TC39 `GetNamedTimeZonePreviousTransition`: the last offset change strictly before `from`.
191
+ *
192
+ * @param timeZone a named zone
193
+ * @param from the instant to search before (exclusive)
194
+ * @param since optional: the search stops here (exclusive); an earlier change returns null
195
+ * @returns the change's epoch nanoseconds, or null when there is none after `since`, or, with no
196
+ * `since`, none at all
197
+ * @throws RangeError past `MAX_SEARCH_STEPS` steps or `MAX_TABLED_TRANSITIONS` tabled changes
198
+ */
199
+ export function previousTransitionBefore(timeZone, from, since) {
200
+ if (from <= MIN_EPOCH_NANOSECONDS)
201
+ return null;
202
+ // The horizon holds with or without a limit: see `nextTransitionAfter`.
203
+ const now = currentEpochNanoseconds();
204
+ if (from - 1n > now + NO_FURTHER_TRANSITION_HORIZON_NANOSECONDS) {
205
+ return previousTransitionFarAhead(timeZone, from, now, since);
206
+ }
207
+ const floor = maximum(since ?? POLYFILL_TRANSITION_SEARCH_FLOOR, POLYFILL_TRANSITION_SEARCH_FLOOR);
208
+ const found = from - 1n > floor ? lastChangeBack(timeZone, from - 1n, floor) : null;
209
+ if (found !== null)
210
+ return found;
211
+ if (since !== undefined && since >= POLYFILL_TRANSITION_SEARCH_FLOOR) {
212
+ return null;
213
+ }
214
+ const missed = missedPreviousTransition(timeZone, from);
215
+ return missed !== null && (since === undefined || missed > since)
216
+ ? missed
217
+ : null;
218
+ }
@@ -15,8 +15,6 @@ type ResolvedOffsetOption = NonNullable<Offset>;
15
15
  export type CarriedOffset = "absent" | "out-of-range" | {
16
16
  nanoseconds: bigint;
17
17
  };
18
- /** TC39 `CheckISODaysRange`: a date may sit at most 10^8 days from the Unix epoch. */
19
- export declare const MAX_ISO_EPOCH_DAYS = 100000000;
20
18
  /**
21
19
  * `getTimeZoneTransition("next")` looks at most three years (366-day years) past its receiver;
22
20
  * a `null` from further than this from the maximum is the polyfill's own horizon, not defect 2.
@@ -35,21 +33,34 @@ export declare function isNearRangeEdge(date: Temporal.PlainDate): boolean;
35
33
  export declare function isNamedTimeZone(timeZone: string): boolean;
36
34
  /** TC39 `IsValidEpochNanoseconds`. */
37
35
  export declare function isValidEpoch(epochNanoseconds: bigint): boolean;
36
+ /** UTC offset in force at an instant, reading the nearest limit for an instant outside the range. */
37
+ export declare function offsetAt(timeZone: string, epochNanoseconds: bigint): bigint;
38
38
  /** TC39 `GetUTCEpochNanoseconds`: the wall clock read as if it were UTC (may lie outside the range). */
39
39
  export declare function utcEpochNanoseconds(wall: Temporal.PlainDateTime): bigint;
40
40
  /** TC39 `GetEpochNanosecondsFor`. */
41
41
  export declare function epochNanosecondsFor(timeZone: string, wall: Temporal.PlainDateTime, disambiguation: ResolvedDisambiguation): bigint;
42
+ /**
43
+ * The first instant at or after `low` whose offset is `offset`, given that `low` has a different
44
+ * offset and `high` has `offset`: the transition between them, to the nanosecond.
45
+ */
46
+ export declare function transitionBetween(timeZone: string, low: bigint, high: bigint, offset: bigint): bigint;
42
47
  /**
43
48
  * TC39 `GetStartOfDay`: the first valid wall-clock time on `date` in `timeZone` — midnight, or,
44
49
  * when midnight is skipped, the transition that skips it.
45
50
  */
46
51
  export declare function startOfDayEpochNanoseconds(timeZone: string, date: Temporal.PlainDate): bigint;
47
52
  /**
48
- * True when a start of day on this local date — or, for a zoned value, on its own local date —
49
- * may lie before the polyfill's transition search floor, so the polyfill's `GetStartOfDay` can
50
- * miss a transition that skips it. A zoned value from 1847-01-03T00:00Z on reads no offset.
53
+ * True when the polyfill's `GetStartOfDay` cannot be trusted for this date in a named zone: it
54
+ * lies before the transition search floor (defect 3), or its midnight is skipped while the
55
+ * runtime's transition search can miss the change that skips it (defect 5). A midnight that exists
56
+ * never reaches that search, so the polyfill's answer stands for it.
57
+ */
58
+ export declare function needsOwnStartOfDaySearch(timeZone: string, value: Temporal.PlainDate | Temporal.ZonedDateTime): boolean;
59
+ /**
60
+ * `needsOwnStartOfDaySearch` for a measure that also reads the next day's start (`hoursInDay`,
61
+ * rounding to the day).
51
62
  */
52
- export declare function isBeforePolyfillTransitionSearch(value: Temporal.PlainDate | Temporal.ZonedDateTime): boolean;
63
+ export declare function needsOwnDayBoundsSearch(timeZone: string, zoned: Temporal.ZonedDateTime): boolean;
53
64
  /**
54
65
  * The first transition after `epochNanoseconds` in a named zone when it lies before the polyfill's
55
66
  * search floor, which `getTimeZoneTransition("next")` skips; null for any instant at or after the
@@ -63,6 +74,8 @@ export declare function missedNextTransition(timeZone: string, epochNanoseconds:
63
74
  * never changes between the minimum instant and there.
64
75
  */
65
76
  export declare function missedPreviousTransition(timeZone: string, epochNanoseconds: bigint): bigint | null;
77
+ /** TC39 `RoundNumberToIncrement(value, 1 minute, "half-expand")`. */
78
+ export declare function roundToMinute(nanoseconds: bigint): bigint;
66
79
  /** TC39 `InterpretISODateTimeOffset` for a named zone and a wall clock with a time of day. */
67
80
  export declare function interpretISODateTimeOffset(timeZone: string, wall: Temporal.PlainDateTime, offset: CarriedOffset, disambiguation: ResolvedDisambiguation, offsetOption: ResolvedOffsetOption, matchMinutes: boolean): bigint;
68
81
  /** A zone id as Temporal canonicalizes it, from an identifier or any RFC 9557 string. */
@@ -74,7 +87,8 @@ export declare function utcOffsetStringNanoseconds(offset: string): bigint;
74
87
  *
75
88
  * Returns the polyfill's result whenever it has one. When the polyfill throws for a named zone
76
89
  * within a month of either range limit, the TC39 result is recomputed (see the note at the top
77
- * of this file); every other failure re-throws the polyfill's own error.
90
+ * of this file); every other failure re-throws the polyfill's own error. A string whose offset
91
+ * is written with seconds is matched exactly, as TC39 requires (`matchSecondsOffsetExactly`).
78
92
  *
79
93
  * @param item RFC 9557 zoned string or ZonedDateTime-like property bag
80
94
  * @param options Temporal `disambiguation` / `offset` / `overflow`
@@ -1,9 +1,9 @@
1
1
  import { Temporal } from "@js-temporal/polyfill";
2
- import { MAX_EPOCH_NANOSECONDS, MIN_EPOCH_NANOSECONDS, } from "./epochNanoseconds.js";
2
+ import { MAX_EPOCH_NANOSECONDS, MAX_ISO_EPOCH_DAYS, MIN_EPOCH_NANOSECONDS, } from "./epochNanoseconds.js";
3
+ import { isSecondsOffsetMatchCompatNeeded, isTransitionSearchCompatNeeded, } from "./temporalCompat/index.js";
4
+ import { optionOrDefault } from "./optionOrDefault.js";
3
5
  const NANOSECONDS_PER_DAY = 86400000000000n;
4
6
  const NANOSECONDS_PER_MINUTE = 60000000000n;
5
- /** TC39 `CheckISODaysRange`: a date may sit at most 10^8 days from the Unix epoch. */
6
- export const MAX_ISO_EPOCH_DAYS = 100_000_000;
7
7
  /**
8
8
  * Dates this many days from a range limit are the only ones either defect reaches: defect 1 needs
9
9
  * a wall clock within a day of the limit, defect 2 a transition within the scan's two-week step.
@@ -74,7 +74,7 @@ function clampEpoch(epochNanoseconds) {
74
74
  return epochNanoseconds;
75
75
  }
76
76
  /** UTC offset in force at an instant, reading the nearest limit for an instant outside the range. */
77
- function offsetAt(timeZone, epochNanoseconds) {
77
+ export function offsetAt(timeZone, epochNanoseconds) {
78
78
  return BigInt(new Temporal.ZonedDateTime(clampEpoch(epochNanoseconds), timeZone)
79
79
  .offsetNanoseconds);
80
80
  }
@@ -158,7 +158,7 @@ export function epochNanosecondsFor(timeZone, wall, disambiguation) {
158
158
  * The first instant at or after `low` whose offset is `offset`, given that `low` has a different
159
159
  * offset and `high` has `offset`: the transition between them, to the nanosecond.
160
160
  */
161
- function transitionBetween(timeZone, low, high, offset) {
161
+ export function transitionBetween(timeZone, low, high, offset) {
162
162
  if (offsetAt(timeZone, high) !== offset ||
163
163
  offsetAt(timeZone, low) === offset) {
164
164
  throw new RangeError(`No transition in ${timeZone} between the bounds`);
@@ -203,13 +203,52 @@ export function startOfDayEpochNanoseconds(timeZone, date) {
203
203
  * may lie before the polyfill's transition search floor, so the polyfill's `GetStartOfDay` can
204
204
  * miss a transition that skips it. A zoned value from 1847-01-03T00:00Z on reads no offset.
205
205
  */
206
- export function isBeforePolyfillTransitionSearch(value) {
206
+ function isBeforePolyfillTransitionSearch(value) {
207
207
  if (value instanceof Temporal.ZonedDateTime) {
208
208
  return (value.epochNanoseconds < FIRST_INSTANT_AFTER_TRANSITION_SEARCH_DATE &&
209
209
  isBeforePolyfillTransitionSearch(value.toPlainDate()));
210
210
  }
211
211
  return (Temporal.PlainDate.compare(value, LAST_DATE_BEFORE_TRANSITION_SEARCH) <= 0);
212
212
  }
213
+ /** True when no instant in `timeZone` has `date`'s midnight as its wall time (it is skipped). */
214
+ function isMidnightSkipped(timeZone, date) {
215
+ try {
216
+ return (possibleEpochNanoseconds(timeZone, date.withCalendar("iso8601").toPlainDateTime()).length === 0);
217
+ }
218
+ catch {
219
+ // Outside the representable range: the range-limit fallbacks decide.
220
+ return false;
221
+ }
222
+ }
223
+ /**
224
+ * True when the polyfill's `GetStartOfDay` cannot be trusted for this date in a named zone: it
225
+ * lies before the transition search floor (defect 3), or its midnight is skipped while the
226
+ * runtime's transition search can miss the change that skips it (defect 5). A midnight that exists
227
+ * never reaches that search, so the polyfill's answer stands for it.
228
+ */
229
+ export function needsOwnStartOfDaySearch(timeZone, value) {
230
+ if (isBeforePolyfillTransitionSearch(value))
231
+ return true;
232
+ if (!isTransitionSearchCompatNeeded())
233
+ return false;
234
+ return isMidnightSkipped(timeZone, value instanceof Temporal.ZonedDateTime ? value.toPlainDate() : value);
235
+ }
236
+ /**
237
+ * `needsOwnStartOfDaySearch` for a measure that also reads the next day's start (`hoursInDay`,
238
+ * rounding to the day).
239
+ */
240
+ export function needsOwnDayBoundsSearch(timeZone, zoned) {
241
+ if (needsOwnStartOfDaySearch(timeZone, zoned))
242
+ return true;
243
+ if (!isTransitionSearchCompatNeeded())
244
+ return false;
245
+ try {
246
+ return isMidnightSkipped(timeZone, zoned.toPlainDate().add({ days: 1 }));
247
+ }
248
+ catch {
249
+ return false;
250
+ }
251
+ }
213
252
  /**
214
253
  * The first transition after `epochNanoseconds` in a named zone when it lies before the polyfill's
215
254
  * search floor, which `getTimeZoneTransition("next")` skips; null for any instant at or after the
@@ -241,7 +280,7 @@ export function missedPreviousTransition(timeZone, epochNanoseconds) {
241
280
  return transitionBetween(timeZone, MIN_EPOCH_NANOSECONDS, high, highOffset);
242
281
  }
243
282
  /** TC39 `RoundNumberToIncrement(value, 1 minute, "half-expand")`. */
244
- function roundToMinute(nanoseconds) {
283
+ export function roundToMinute(nanoseconds) {
245
284
  const sign = nanoseconds < 0n ? -1n : 1n;
246
285
  const magnitude = nanoseconds * sign;
247
286
  const quotient = magnitude / NANOSECONDS_PER_MINUTE;
@@ -303,14 +342,17 @@ export function utcOffsetStringNanoseconds(offset) {
303
342
  const utcMidnight = Temporal.ZonedDateTime.from({ year: 1970, month: 1, day: 1, timeZone: "UTC", offset }, { offset: "use" });
304
343
  return -utcMidnight.epochNanoseconds;
305
344
  }
306
- /** The epoch nanoseconds of a zoned string near the range limits, or null when out of scope. */
345
+ /**
346
+ * TC39 `ToTemporalZonedDateTime` for a zoned string in a named zone, from the wall clock and
347
+ * zone Temporal has already parsed: the epoch nanoseconds the string names. Used where the
348
+ * polyfill's own answer is unusable: near the range limits (defect 1) and for an offset written
349
+ * with seconds (defect 4).
350
+ */
307
351
  function stringEpochAtEdge(item, timeZone, wall, options) {
308
352
  if (!TIME_SEPARATOR.test(item)) {
309
353
  return startOfDayEpochNanoseconds(timeZone, wall.toPlainDate());
310
354
  }
311
- const disambiguation = options?.disambiguation === undefined
312
- ? "compatible"
313
- : options.disambiguation;
355
+ const disambiguation = optionOrDefault(options?.disambiguation, "compatible");
314
356
  if (!UTC_OFFSET.test(item)) {
315
357
  return epochNanosecondsFor(timeZone, wall, disambiguation);
316
358
  }
@@ -325,7 +367,7 @@ function stringEpochAtEdge(item, timeZone, wall, options) {
325
367
  // The grammar is already proven valid, so only the string's own instant can be out of range.
326
368
  offset = "out-of-range";
327
369
  }
328
- return interpretISODateTimeOffset(timeZone, wall, offset, disambiguation, options?.offset === undefined ? "reject" : options.offset, !UTC_OFFSET_WITH_SECONDS.test(item));
370
+ return interpretISODateTimeOffset(timeZone, wall, offset, disambiguation, optionOrDefault(options?.offset, "reject"), !UTC_OFFSET_WITH_SECONDS.test(item));
329
371
  }
330
372
  function fromStringAtEdge(item, options) {
331
373
  let wall;
@@ -367,9 +409,7 @@ function fromBagAtEdge(item, options) {
367
409
  if (!isNamedTimeZone(timeZone) || !isNearRangeEdge(wall.toPlainDate())) {
368
410
  return null;
369
411
  }
370
- const epoch = interpretISODateTimeOffset(timeZone, wall, offset, options?.disambiguation === undefined
371
- ? "compatible"
372
- : options.disambiguation, options?.offset === undefined ? "reject" : options.offset, false);
412
+ const epoch = interpretISODateTimeOffset(timeZone, wall, offset, optionOrDefault(options?.disambiguation, "compatible"), optionOrDefault(options?.offset, "reject"), false);
373
413
  return new Temporal.ZonedDateTime(epoch, timeZone, wall.calendarId);
374
414
  }
375
415
  /**
@@ -389,17 +429,43 @@ function dateOnlyBeforeTransitionSearch(item, options) {
389
429
  catch {
390
430
  return null;
391
431
  }
392
- if (!isNamedTimeZone(timeZone) || !isBeforePolyfillTransitionSearch(date)) {
432
+ if (!isNamedTimeZone(timeZone) || !needsOwnStartOfDaySearch(timeZone, date)) {
393
433
  return null;
394
434
  }
395
435
  return new Temporal.ZonedDateTime(startOfDayEpochNanoseconds(timeZone, date), timeZone, date.calendarId);
396
436
  }
437
+ /**
438
+ * The polyfill's result for a zoned string, or the TC39 result when the polyfill matched an
439
+ * offset written with seconds by minutes (defect 4, temporalCompat D12).
440
+ *
441
+ * Dormant unless the D12 probe fails. Then it acts only on a string whose offset has a seconds
442
+ * part, read with `offset: "reject"` or `"prefer"` (the two options that match the offset
443
+ * against the zone), whose result has a sub-minute offset: any other result was matched exactly,
444
+ * because an earlier candidate would have matched by rounding first. For those it recomputes
445
+ * `InterpretISODateTimeOffset` with match-exactly, which throws a `RangeError` under `"reject"`
446
+ * when no candidate has the written offset.
447
+ */
448
+ function matchSecondsOffsetExactly(item, zoned, options) {
449
+ if (!UTC_OFFSET_WITH_SECONDS.test(item) ||
450
+ BigInt(zoned.offsetNanoseconds) % NANOSECONDS_PER_MINUTE === 0n ||
451
+ options?.offset === "use" ||
452
+ options?.offset === "ignore" ||
453
+ !isSecondsOffsetMatchCompatNeeded()) {
454
+ return zoned;
455
+ }
456
+ const wall = Temporal.PlainDateTime.from(item).withCalendar("iso8601");
457
+ const epoch = stringEpochAtEdge(item, zoned.timeZoneId, wall, options);
458
+ return epoch === zoned.epochNanoseconds
459
+ ? zoned
460
+ : new Temporal.ZonedDateTime(epoch, zoned.timeZoneId, zoned.calendarId);
461
+ }
397
462
  /**
398
463
  * `Temporal.ZonedDateTime.from`, correct across the whole representable range.
399
464
  *
400
465
  * Returns the polyfill's result whenever it has one. When the polyfill throws for a named zone
401
466
  * within a month of either range limit, the TC39 result is recomputed (see the note at the top
402
- * of this file); every other failure re-throws the polyfill's own error.
467
+ * of this file); every other failure re-throws the polyfill's own error. A string whose offset
468
+ * is written with seconds is matched exactly, as TC39 requires (`matchSecondsOffsetExactly`).
403
469
  *
404
470
  * @param item RFC 9557 zoned string or ZonedDateTime-like property bag
405
471
  * @param options Temporal `disambiguation` / `offset` / `overflow`
@@ -413,7 +479,10 @@ export function zonedDateTimeFrom(item, options) {
413
479
  return dateOnly;
414
480
  }
415
481
  try {
416
- return Temporal.ZonedDateTime.from(item, options);
482
+ const zoned = Temporal.ZonedDateTime.from(item, options);
483
+ return typeof item === "string"
484
+ ? matchSecondsOffsetExactly(item, zoned, options)
485
+ : zoned;
417
486
  }
418
487
  catch (error) {
419
488
  const recovered = typeof item === "string"
@@ -1,4 +1,5 @@
1
1
  import { Temporal } from "@js-temporal/polyfill";
2
+ import { TIME_ZONE_ANNOTATION } from "./isoStringBody.js";
2
3
  import { MAX_EPOCH_NANOSECONDS, MIN_EPOCH_NANOSECONDS, } from "./epochNanoseconds.js";
3
4
  import { calendarDateAdd as compatCalendarDateAdd, calendarDateUntil as compatCalendarDateUntil, isCalendarArithmeticCompatNeeded, isNudgeWindowCompatNeeded, } from "./temporalCompat/index.js";
4
5
  import { epochNanosecondsFor, isNamedTimeZone, isValidEpoch, utcEpochNanoseconds, zonedDateTimeFrom, } from "./zonedWallClock.js";
@@ -43,7 +44,7 @@ const UTC_EQUIVALENT_OFFSET_ZONE = "+00:00";
43
44
  const OPTIONS_PROBE = new Temporal.ZonedDateTime(0n, "UTC");
44
45
  const ZERO_DURATION = new Temporal.Duration();
45
46
  /** An RFC 9557 time zone annotation (`[Europe/London]`, `[!+01:00]`), never a `key=value` one. */
46
- const TIME_ZONE_ANNOTATION = /\[!?[^\]=]+\]/;
47
+ const timeZoneAnnotation = new RegExp(TIME_ZONE_ANNOTATION);
47
48
  const ZERO_DATE_DURATION = {
48
49
  years: 0,
49
50
  months: 0,
@@ -766,7 +767,7 @@ function zonedRelativeTo(relativeTo) {
766
767
  return relativeTo;
767
768
  try {
768
769
  if (typeof relativeTo === "string") {
769
- return TIME_ZONE_ANNOTATION.test(relativeTo)
770
+ return timeZoneAnnotation.test(relativeTo)
770
771
  ? zonedDateTimeFrom(relativeTo)
771
772
  : null;
772
773
  }
@@ -868,7 +869,7 @@ function plainRelativeToNeedingCompat(relativeTo) {
868
869
  }
869
870
  else if (typeof relativeTo === "string" &&
870
871
  relativeTo.includes("u-ca=") &&
871
- !TIME_ZONE_ANNOTATION.test(relativeTo)) {
872
+ !timeZoneAnnotation.test(relativeTo)) {
872
873
  plain = Temporal.PlainDate.from(relativeTo);
873
874
  }
874
875
  else {
@@ -974,7 +975,7 @@ function plainRelativeTo(relativeTo) {
974
975
  return relativeTo.toPlainDate();
975
976
  }
976
977
  if (typeof relativeTo === "string" &&
977
- !TIME_ZONE_ANNOTATION.test(relativeTo)) {
978
+ !timeZoneAnnotation.test(relativeTo)) {
978
979
  return Temporal.PlainDate.from(relativeTo);
979
980
  }
980
981
  if (relativeTo !== null &&
@@ -40,28 +40,40 @@ export declare function zonedWithPlainTime(zoned: Temporal.ZonedDateTime, time?:
40
40
  */
41
41
  export declare function zonedHoursInDay(zoned: Temporal.ZonedDateTime): number;
42
42
  /**
43
- * `ZonedDateTime#getTimeZoneTransition("next")`, correct at the range limits and before 1847.
43
+ * `ZonedDateTime#getTimeZoneTransition("next")`: TC39 `GetNamedTimeZoneNextTransition`, the first
44
+ * offset change strictly after `zoned`.
44
45
  *
45
- * - Before 1847-01-01 the polyfill never searches (defect 3), so a named zone whose offset there
46
- * differs from its offset at 1847-01-01 has its transition found by bisection first.
47
- * - The polyfill's forward scan gives up once a two-week step would pass the maximum instant, so a
48
- * `null` within its three-year horizon of the maximum is re-checked by walking back from the
49
- * maximum with `getTimeZoneTransition("previous")`, which scans correctly there.
46
+ * - While the D13 probe fails (two changes inside one of the polyfill's 14-day search steps are
47
+ * skipped, or stall it for ever), a named zone is searched by GMT's own bounded search
48
+ * (`zonedTransitionSearch.ts`) and the polyfill's search is never called.
49
+ * - Otherwise the polyfill answers, corrected before 1847 (defect 3: it never searches there, so
50
+ * the change is found by bisection first) and within its three-year horizon of the maximum
51
+ * instant (defect 2: its forward scan gives up once a step would pass the maximum, so a `null`
52
+ * is re-checked by walking back from the maximum).
50
53
  *
51
54
  * @param zoned the instant to search after (exclusive)
52
- * @returns the next transition, or null when there is none before the maximum instant
55
+ * @param until optional: the last instant to search, in epoch nanoseconds (inclusive). A caller
56
+ * that needs only changes up to there passes it so the search reads no further
57
+ * @returns the next transition, or null when there is none up to `until` or, without it, none
58
+ * that Temporal reports
53
59
  */
54
- export declare function zonedNextTransition(zoned: Temporal.ZonedDateTime): Temporal.ZonedDateTime | null;
60
+ export declare function zonedNextTransition(zoned: Temporal.ZonedDateTime, until?: bigint): Temporal.ZonedDateTime | null;
55
61
  /**
56
- * `ZonedDateTime#getTimeZoneTransition("previous")`, correct before 1847.
62
+ * `ZonedDateTime#getTimeZoneTransition("previous")`: TC39 `GetNamedTimeZonePreviousTransition`,
63
+ * the last offset change strictly before `zoned`.
57
64
  *
58
- * The polyfill stops looking at 1847-01-01 (defect 3), so when it finds nothing in a named zone the
59
- * span from the minimum instant to the floor is checked by comparing offsets and bisecting.
65
+ * - While the D13 probe fails, a named zone is searched by GMT's own bounded search and the
66
+ * polyfill's search is never called (see `zonedNextTransition`).
67
+ * - Otherwise the polyfill answers, corrected before 1847 (defect 3): when it finds nothing in a
68
+ * named zone, the span from the minimum instant to its floor is checked by comparing offsets
69
+ * and bisecting.
60
70
  *
61
71
  * @param zoned the instant to search before (exclusive)
62
- * @returns the previous transition, or null when there is none
72
+ * @param since optional: where the search stops, in epoch nanoseconds (exclusive). A caller that
73
+ * needs only changes after there passes it so the search reads no further back
74
+ * @returns the previous transition, or null when there is none after `since` or, without it, none
63
75
  */
64
- export declare function zonedPreviousTransition(zoned: Temporal.ZonedDateTime): Temporal.ZonedDateTime | null;
76
+ export declare function zonedPreviousTransition(zoned: Temporal.ZonedDateTime, since?: bigint): Temporal.ZonedDateTime | null;
65
77
  /**
66
78
  * `ZonedDateTime#add`, correct at the range limits and in calendars the polyfill gets wrong.
67
79
  *
@@ -96,6 +108,7 @@ export declare function subtractFromZoned(zoned: Temporal.ZonedDateTime, duratio
96
108
  * "later"/"compatible" forward (DisambiguatePossibleEpochNanoseconds); "reject" throws for both.
97
109
  * - The time portion is then added in exact time and is never re-resolved.
98
110
  * - With no date portion, the whole duration is exact time and `disambiguation` never applies.
111
+ * - Each option is converted to a string once, as Temporal GetOption converts it.
99
112
  *
100
113
  * @param zoned the starting value
101
114
  * @param duration the duration to add or subtract