@northguild/gmt 1.18.0 → 1.19.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 (593) hide show
  1. package/README.md +55 -2920
  2. package/dist/calendar/calculate/bucketRange.d.ts +10 -2
  3. package/dist/calendar/calculate/bucketRange.js +18 -61
  4. package/dist/calendar/calculate/floorToZone.d.ts +10 -2
  5. package/dist/calendar/calculate/floorToZone.js +15 -7
  6. package/dist/calendar/hours/addOperatingTime.d.ts +6 -0
  7. package/dist/calendar/hours/addOperatingTime.js +7 -1
  8. package/dist/calendar/hours/isOpenAt.d.ts +6 -0
  9. package/dist/calendar/hours/isOpenAt.js +6 -0
  10. package/dist/calendar/hours/nextCloseAt.d.ts +6 -0
  11. package/dist/calendar/hours/nextCloseAt.js +7 -1
  12. package/dist/calendar/hours/nextOpenAt.d.ts +6 -0
  13. package/dist/calendar/hours/nextOpenAt.js +7 -1
  14. package/dist/calendar/hours/operatingIntervals.d.ts +5 -0
  15. package/dist/calendar/hours/operatingIntervals.js +5 -0
  16. package/dist/calendar/hours/operatingTimeBetween.d.ts +5 -0
  17. package/dist/calendar/hours/operatingTimeBetween.js +5 -0
  18. package/dist/calendar/hours/recurringWindows.d.ts +8 -1
  19. package/dist/calendar/hours/recurringWindows.js +12 -4
  20. package/dist/duration/calculate/durationFromUnits.d.ts +47 -0
  21. package/dist/duration/calculate/durationFromUnits.js +67 -0
  22. package/dist/duration/calculate/getDurationUnit.d.ts +2 -2
  23. package/dist/duration/calculate/getDurationUnit.js +2 -2
  24. package/dist/duration/calculate/index.d.ts +3 -1
  25. package/dist/duration/calculate/index.js +3 -1
  26. package/dist/duration/calculate/negateDuration.d.ts +1 -1
  27. package/dist/duration/calculate/negateDuration.js +1 -1
  28. package/dist/duration/calculate/{durationAs.d.ts → totalDuration.d.ts} +25 -19
  29. package/dist/duration/calculate/{durationAs.js → totalDuration.js} +25 -19
  30. package/dist/duration/calculate/totalUnits.d.ts +49 -0
  31. package/dist/duration/calculate/totalUnits.js +73 -0
  32. package/dist/duration/compare/compareDurations.d.ts +1 -1
  33. package/dist/duration/compare/compareDurations.js +1 -1
  34. package/dist/duty/calculate/dutyDayFor.d.ts +38 -0
  35. package/dist/duty/calculate/dutyDayFor.js +71 -0
  36. package/dist/duty/calculate/dutyTotals.d.ts +24 -0
  37. package/dist/duty/calculate/dutyTotals.js +41 -0
  38. package/dist/duty/calculate/dutyViolations.d.ts +74 -0
  39. package/dist/duty/calculate/dutyViolations.js +65 -0
  40. package/dist/duty/calculate/evaluateDutyLog.d.ts +77 -0
  41. package/dist/duty/calculate/evaluateDutyLog.js +75 -0
  42. package/dist/duty/calculate/index.d.ts +7 -0
  43. package/dist/duty/calculate/index.js +7 -0
  44. package/dist/duty/calculate/longestRun.d.ts +28 -0
  45. package/dist/duty/calculate/longestRun.js +54 -0
  46. package/dist/duty/calculate/qualifyingRestPairs.d.ts +37 -0
  47. package/dist/duty/calculate/qualifyingRestPairs.js +58 -0
  48. package/dist/duty/calculate/qualifyingRests.d.ts +27 -0
  49. package/dist/duty/calculate/qualifyingRests.js +49 -0
  50. package/dist/duty/index.d.ts +3 -0
  51. package/dist/duty/index.js +4 -0
  52. package/dist/duty/validate/index.d.ts +1 -0
  53. package/dist/duty/validate/index.js +1 -0
  54. package/dist/duty/validate/isValidDutyLog.d.ts +24 -0
  55. package/dist/duty/validate/isValidDutyLog.js +34 -0
  56. package/dist/index.d.ts +1 -0
  57. package/dist/index.js +1 -0
  58. package/dist/instant/convert/classifyLocal.d.ts +5 -1
  59. package/dist/instant/convert/classifyLocal.js +16 -6
  60. package/dist/instant/convert/fromOffsetInstant.d.ts +4 -0
  61. package/dist/instant/convert/fromOffsetInstant.js +6 -1
  62. package/dist/instant/convert/resolveLocal.d.ts +7 -2
  63. package/dist/instant/convert/resolveLocal.js +16 -8
  64. package/dist/instant/convert/toOffsetInstant.d.ts +12 -8
  65. package/dist/instant/convert/toOffsetInstant.js +19 -11
  66. package/dist/instant/index.d.ts +1 -0
  67. package/dist/instant/index.js +1 -0
  68. package/dist/instant/validate/index.d.ts +1 -0
  69. package/dist/instant/validate/index.js +1 -0
  70. package/dist/instant/validate/isValidUtcOffset.d.ts +32 -0
  71. package/dist/instant/validate/isValidUtcOffset.js +35 -0
  72. package/dist/intermodal/calculate/chargeableDays.d.ts +6 -0
  73. package/dist/intermodal/calculate/chargeableDays.js +12 -4
  74. package/dist/intermodal/calculate/freeTimeExpiry.d.ts +7 -0
  75. package/dist/intermodal/calculate/freeTimeExpiry.js +15 -4
  76. package/dist/intermodal/calculate/index.d.ts +1 -0
  77. package/dist/intermodal/calculate/index.js +1 -0
  78. package/dist/intermodal/calculate/multimodalETA.d.ts +76 -0
  79. package/dist/intermodal/calculate/multimodalETA.js +145 -0
  80. package/dist/intermodal/format/bolTimestamp.d.ts +76 -0
  81. package/dist/intermodal/format/bolTimestamp.js +78 -0
  82. package/dist/intermodal/format/formatEdifactDate.d.ts +34 -0
  83. package/dist/intermodal/format/formatEdifactDate.js +42 -0
  84. package/dist/intermodal/format/formatEdifactDatePeriod.d.ts +35 -0
  85. package/dist/intermodal/format/formatEdifactDatePeriod.js +43 -0
  86. package/dist/intermodal/format/formatEdifactDateTime.d.ts +37 -0
  87. package/dist/intermodal/format/formatEdifactDateTime.js +45 -0
  88. package/dist/intermodal/format/formatEdifactDateTimePeriod.d.ts +40 -0
  89. package/dist/intermodal/format/formatEdifactDateTimePeriod.js +48 -0
  90. package/dist/intermodal/format/formatEdifactOffsetDateTime.d.ts +62 -0
  91. package/dist/intermodal/format/formatEdifactOffsetDateTime.js +70 -0
  92. package/dist/intermodal/format/formatEdifactTime.d.ts +35 -0
  93. package/dist/intermodal/format/formatEdifactTime.js +43 -0
  94. package/dist/intermodal/format/formatEpcisEvent.d.ts +47 -0
  95. package/dist/intermodal/format/formatEpcisEvent.js +79 -0
  96. package/dist/intermodal/format/formatX12Date.d.ts +35 -0
  97. package/dist/intermodal/format/formatX12Date.js +43 -0
  98. package/dist/intermodal/format/formatX12DateRange.d.ts +37 -0
  99. package/dist/intermodal/format/formatX12DateRange.js +45 -0
  100. package/dist/intermodal/format/formatX12DateTime.d.ts +39 -0
  101. package/dist/intermodal/format/formatX12DateTime.js +47 -0
  102. package/dist/intermodal/format/formatX12DateTimeRange.d.ts +40 -0
  103. package/dist/intermodal/format/formatX12DateTimeRange.js +48 -0
  104. package/dist/intermodal/format/formatX12Time.d.ts +42 -0
  105. package/dist/intermodal/format/formatX12Time.js +50 -0
  106. package/dist/intermodal/format/formatX12TimeElement.d.ts +46 -0
  107. package/dist/intermodal/format/formatX12TimeElement.js +54 -0
  108. package/dist/intermodal/format/index.d.ts +14 -0
  109. package/dist/intermodal/format/index.js +14 -0
  110. package/dist/intermodal/index.d.ts +3 -0
  111. package/dist/intermodal/index.js +3 -0
  112. package/dist/intermodal/parse/classifyEdifactDtmFormat.d.ts +48 -0
  113. package/dist/intermodal/parse/classifyEdifactDtmFormat.js +55 -0
  114. package/dist/intermodal/parse/classifyX12DateTimePeriodFormat.d.ts +50 -0
  115. package/dist/intermodal/parse/classifyX12DateTimePeriodFormat.js +57 -0
  116. package/dist/intermodal/parse/classifyX12TimeCode.d.ts +46 -0
  117. package/dist/intermodal/parse/classifyX12TimeCode.js +57 -0
  118. package/dist/intermodal/parse/index.d.ts +18 -0
  119. package/dist/intermodal/parse/index.js +18 -0
  120. package/dist/intermodal/parse/parseEdifactDate.d.ts +37 -0
  121. package/dist/intermodal/parse/parseEdifactDate.js +45 -0
  122. package/dist/intermodal/parse/parseEdifactDatePeriod.d.ts +43 -0
  123. package/dist/intermodal/parse/parseEdifactDatePeriod.js +51 -0
  124. package/dist/intermodal/parse/parseEdifactDateTime.d.ts +43 -0
  125. package/dist/intermodal/parse/parseEdifactDateTime.js +51 -0
  126. package/dist/intermodal/parse/parseEdifactDateTimePeriod.d.ts +45 -0
  127. package/dist/intermodal/parse/parseEdifactDateTimePeriod.js +53 -0
  128. package/dist/intermodal/parse/parseEdifactOffsetDateTime.d.ts +60 -0
  129. package/dist/intermodal/parse/parseEdifactOffsetDateTime.js +68 -0
  130. package/dist/intermodal/parse/parseEdifactTime.d.ts +37 -0
  131. package/dist/intermodal/parse/parseEdifactTime.js +45 -0
  132. package/dist/intermodal/parse/parseEpcisEvent.d.ts +95 -0
  133. package/dist/intermodal/parse/parseEpcisEvent.js +102 -0
  134. package/dist/intermodal/parse/parseX12Date.d.ts +39 -0
  135. package/dist/intermodal/parse/parseX12Date.js +47 -0
  136. package/dist/intermodal/parse/parseX12DateAndTime.d.ts +52 -0
  137. package/dist/intermodal/parse/parseX12DateAndTime.js +61 -0
  138. package/dist/intermodal/parse/parseX12DateRange.d.ts +44 -0
  139. package/dist/intermodal/parse/parseX12DateRange.js +52 -0
  140. package/dist/intermodal/parse/parseX12DateTime.d.ts +45 -0
  141. package/dist/intermodal/parse/parseX12DateTime.js +53 -0
  142. package/dist/intermodal/parse/parseX12DateTimeRange.d.ts +46 -0
  143. package/dist/intermodal/parse/parseX12DateTimeRange.js +54 -0
  144. package/dist/intermodal/parse/parseX12Time.d.ts +65 -0
  145. package/dist/intermodal/parse/parseX12Time.js +77 -0
  146. package/dist/intermodal/parse/x12TimeCodeOffset.d.ts +57 -0
  147. package/dist/intermodal/parse/x12TimeCodeOffset.js +110 -0
  148. package/dist/intermodal/parse/x12TimeCodeZone.d.ts +57 -0
  149. package/dist/intermodal/parse/x12TimeCodeZone.js +105 -0
  150. package/dist/intermodal/validate/index.d.ts +18 -0
  151. package/dist/intermodal/validate/index.js +18 -0
  152. package/dist/intermodal/validate/isValidEdifactDate.d.ts +26 -0
  153. package/dist/intermodal/validate/isValidEdifactDate.js +28 -0
  154. package/dist/intermodal/validate/isValidEdifactDatePeriod.d.ts +28 -0
  155. package/dist/intermodal/validate/isValidEdifactDatePeriod.js +30 -0
  156. package/dist/intermodal/validate/isValidEdifactDateTime.d.ts +30 -0
  157. package/dist/intermodal/validate/isValidEdifactDateTime.js +32 -0
  158. package/dist/intermodal/validate/isValidEdifactDateTimePeriod.d.ts +28 -0
  159. package/dist/intermodal/validate/isValidEdifactDateTimePeriod.js +30 -0
  160. package/dist/intermodal/validate/isValidEdifactDtmFormat.d.ts +39 -0
  161. package/dist/intermodal/validate/isValidEdifactDtmFormat.js +42 -0
  162. package/dist/intermodal/validate/isValidEdifactOffsetDateTime.d.ts +36 -0
  163. package/dist/intermodal/validate/isValidEdifactOffsetDateTime.js +38 -0
  164. package/dist/intermodal/validate/isValidEdifactTime.d.ts +28 -0
  165. package/dist/intermodal/validate/isValidEdifactTime.js +30 -0
  166. package/dist/intermodal/validate/isValidEpcisEvent.d.ts +41 -0
  167. package/dist/intermodal/validate/isValidEpcisEvent.js +58 -0
  168. package/dist/intermodal/validate/isValidEpcisEventTime.d.ts +33 -0
  169. package/dist/intermodal/validate/isValidEpcisEventTime.js +48 -0
  170. package/dist/intermodal/validate/isValidEpcisTimeZoneOffset.d.ts +30 -0
  171. package/dist/intermodal/validate/isValidEpcisTimeZoneOffset.js +38 -0
  172. package/dist/intermodal/validate/isValidX12Date.d.ts +28 -0
  173. package/dist/intermodal/validate/isValidX12Date.js +30 -0
  174. package/dist/intermodal/validate/isValidX12DateAndTime.d.ts +32 -0
  175. package/dist/intermodal/validate/isValidX12DateAndTime.js +35 -0
  176. package/dist/intermodal/validate/isValidX12DateRange.d.ts +29 -0
  177. package/dist/intermodal/validate/isValidX12DateRange.js +31 -0
  178. package/dist/intermodal/validate/isValidX12DateTime.d.ts +30 -0
  179. package/dist/intermodal/validate/isValidX12DateTime.js +32 -0
  180. package/dist/intermodal/validate/isValidX12DateTimePeriodFormat.d.ts +43 -0
  181. package/dist/intermodal/validate/isValidX12DateTimePeriodFormat.js +46 -0
  182. package/dist/intermodal/validate/isValidX12DateTimeRange.d.ts +31 -0
  183. package/dist/intermodal/validate/isValidX12DateTimeRange.js +33 -0
  184. package/dist/intermodal/validate/isValidX12Time.d.ts +38 -0
  185. package/dist/intermodal/validate/isValidX12Time.js +40 -0
  186. package/dist/intermodal/validate/isValidX12TimeCode.d.ts +38 -0
  187. package/dist/intermodal/validate/isValidX12TimeCode.js +41 -0
  188. package/dist/internal/businessCalendar.js +4 -9
  189. package/dist/internal/dutyEngine.d.ts +125 -0
  190. package/dist/internal/dutyEngine.js +1746 -0
  191. package/dist/internal/dutyLog.d.ts +27 -0
  192. package/dist/internal/dutyLog.js +47 -0
  193. package/dist/internal/dutyPeriods.d.ts +135 -0
  194. package/dist/internal/dutyPeriods.js +369 -0
  195. package/dist/internal/dutyRules.d.ts +197 -0
  196. package/dist/internal/dutyRules.js +484 -0
  197. package/dist/internal/ediDateTimeFields.d.ts +97 -0
  198. package/dist/internal/ediDateTimeFields.js +288 -0
  199. package/dist/internal/ediDateTimeWriter.d.ts +92 -0
  200. package/dist/internal/ediDateTimeWriter.js +298 -0
  201. package/dist/internal/ediGrammar.d.ts +158 -0
  202. package/dist/internal/ediGrammar.js +384 -0
  203. package/dist/internal/englishCalendarNames.d.ts +3 -1
  204. package/dist/internal/englishCalendarNames.js +3 -1
  205. package/dist/internal/freeTimeLedger.d.ts +5 -0
  206. package/dist/internal/freeTimeLedger.js +11 -2
  207. package/dist/internal/index.d.ts +5 -2
  208. package/dist/internal/index.js +9 -2
  209. package/dist/internal/intervalNanoseconds.js +2 -1
  210. package/dist/internal/isObject.d.ts +13 -6
  211. package/dist/internal/isObject.js +14 -7
  212. package/dist/internal/isoYearString.d.ts +21 -0
  213. package/dist/internal/isoYearString.js +27 -0
  214. package/dist/internal/maxPieces.js +2 -1
  215. package/dist/internal/normalizeTimeZone.d.ts +4 -1
  216. package/dist/internal/normalizeTimeZone.js +4 -1
  217. package/dist/internal/operatingSchedule.d.ts +13 -4
  218. package/dist/internal/operatingSchedule.js +146 -58
  219. package/dist/internal/patternToken.d.ts +10 -3
  220. package/dist/internal/patternToken.js +31 -12
  221. package/dist/internal/readDurationUnits.d.ts +34 -0
  222. package/dist/internal/readDurationUnits.js +78 -0
  223. package/dist/internal/readSetFields.d.ts +50 -0
  224. package/dist/internal/readSetFields.js +179 -0
  225. package/dist/internal/resolveRelativeUnit.d.ts +1 -1
  226. package/dist/internal/resolveRelativeUnit.js +1 -1
  227. package/dist/internal/resolveUnixIntervalPair.d.ts +8 -2
  228. package/dist/internal/resolveUnixIntervalPair.js +11 -7
  229. package/dist/internal/startOrEndOfUnix.d.ts +2 -1
  230. package/dist/internal/startOrEndOfUnix.js +9 -6
  231. package/dist/internal/twoDigitYear.d.ts +19 -0
  232. package/dist/internal/twoDigitYear.js +22 -0
  233. package/dist/internal/unixEpochValue.js +3 -2
  234. package/dist/internal/unixWallClock.d.ts +24 -0
  235. package/dist/internal/unixWallClock.js +35 -0
  236. package/dist/internal/utcWallClock.d.ts +20 -0
  237. package/dist/internal/utcWallClock.js +32 -0
  238. package/dist/internal/yearWindowStart.d.ts +28 -0
  239. package/dist/internal/yearWindowStart.js +52 -0
  240. package/dist/internal/zoneBucketCap.d.ts +18 -0
  241. package/dist/internal/zoneBucketCap.js +64 -0
  242. package/dist/internal/zoneFrame.d.ts +180 -0
  243. package/dist/internal/zoneFrame.js +221 -0
  244. package/dist/internal/zonedNowUnitValue.d.ts +7 -4
  245. package/dist/internal/zonedNowUnitValue.js +8 -4
  246. package/dist/internal/zonedWallClockDifference.js +4 -4
  247. package/dist/internal/zonedWallClockOperations.d.ts +5 -2
  248. package/dist/internal/zonedWallClockOperations.js +7 -10
  249. package/dist/plain/calculate/addDate.js +4 -7
  250. package/dist/plain/calculate/addDateTime.js +4 -7
  251. package/dist/plain/calculate/addTime.js +4 -7
  252. package/dist/plain/calculate/endOfTime.d.ts +1 -1
  253. package/dist/plain/calculate/setDate.d.ts +20 -3
  254. package/dist/plain/calculate/setDate.js +27 -7
  255. package/dist/plain/calculate/setDateTime.d.ts +15 -3
  256. package/dist/plain/calculate/setDateTime.js +22 -7
  257. package/dist/plain/calculate/setTime.d.ts +13 -1
  258. package/dist/plain/calculate/setTime.js +21 -6
  259. package/dist/plain/calculate/startOfTime.d.ts +1 -1
  260. package/dist/plain/calculate/subtractDate.js +4 -7
  261. package/dist/plain/calculate/subtractDateTime.js +4 -7
  262. package/dist/plain/calculate/subtractTime.js +4 -7
  263. package/dist/plain/format/formatCalendar.js +2 -1
  264. package/dist/plain/format/formatRelativeDate.js +2 -1
  265. package/dist/plain/format/formatRelativeDateTime.js +2 -1
  266. package/dist/plain/format/formatRelativeTime.js +2 -1
  267. package/dist/plain/format/{formatSql.d.ts → formatSqlDateTime.d.ts} +7 -7
  268. package/dist/plain/format/{formatSql.js → formatSqlDateTime.js} +7 -7
  269. package/dist/plain/format/index.d.ts +1 -1
  270. package/dist/plain/format/index.js +1 -1
  271. package/dist/plain/get/getNowUnit.d.ts +2 -0
  272. package/dist/plain/get/getNowUnit.js +2 -0
  273. package/dist/plain/get/getYear.d.ts +2 -0
  274. package/dist/plain/get/getYear.js +4 -3
  275. package/dist/plain/interval/intervalXorAllDate.js +2 -2
  276. package/dist/plain/interval/intervalXorAllDateTime.js +2 -2
  277. package/dist/plain/interval/intervalXorAllTime.js +2 -2
  278. package/dist/plain/interval/mergeIntervalsDate.js +2 -2
  279. package/dist/plain/interval/mergeIntervalsDateTime.js +2 -2
  280. package/dist/plain/interval/mergeIntervalsTime.js +2 -2
  281. package/dist/plain/parse/index.d.ts +1 -1
  282. package/dist/plain/parse/index.js +1 -1
  283. package/dist/plain/parse/parseDateTimeWithPattern.d.ts +16 -3
  284. package/dist/plain/parse/parseDateTimeWithPattern.js +20 -5
  285. package/dist/plain/parse/parseDateWithPattern.d.ts +17 -3
  286. package/dist/plain/parse/parseDateWithPattern.js +21 -5
  287. package/dist/plain/parse/{parseSql.d.ts → parseSqlDateTime.d.ts} +8 -8
  288. package/dist/plain/parse/{parseSql.js → parseSqlDateTime.js} +8 -8
  289. package/dist/plain/parse/parseTimeWithPattern.js +1 -0
  290. package/dist/plain/parse/parseUnitFromDate.d.ts +3 -0
  291. package/dist/plain/parse/parseUnitFromDate.js +5 -1
  292. package/dist/plain/parse/parseUnitFromDateTime.d.ts +3 -0
  293. package/dist/plain/parse/parseUnitFromDateTime.js +5 -1
  294. package/dist/plain/parse/parseYearFromDate.d.ts +5 -2
  295. package/dist/plain/parse/parseYearFromDate.js +7 -3
  296. package/dist/plain/parse/parseYearFromDateTime.d.ts +4 -2
  297. package/dist/plain/parse/parseYearFromDateTime.js +6 -3
  298. package/dist/plain/validate/index.d.ts +1 -0
  299. package/dist/plain/validate/index.js +1 -0
  300. package/dist/plain/validate/isValidSqlDateTime.d.ts +33 -0
  301. package/dist/plain/validate/isValidSqlDateTime.js +36 -0
  302. package/dist/precision/convert/fromNanoseconds.d.ts +9 -3
  303. package/dist/precision/convert/fromNanoseconds.js +9 -3
  304. package/dist/regex/epcis.d.ts +60 -0
  305. package/dist/regex/epcis.js +60 -0
  306. package/dist/regex/http-date.d.ts +6 -4
  307. package/dist/regex/http-date.js +6 -4
  308. package/dist/regex/index.d.ts +1 -0
  309. package/dist/regex/index.js +1 -0
  310. package/dist/regex/rfc-2822.d.ts +2 -0
  311. package/dist/regex/rfc-2822.js +2 -0
  312. package/dist/regex/rfc-3339.d.ts +3 -1
  313. package/dist/regex/rfc-3339.js +3 -1
  314. package/dist/regex/sql-date-time.d.ts +2 -1
  315. package/dist/regex/sql-date-time.js +2 -1
  316. package/dist/regex/time-zone-like.d.ts +3 -2
  317. package/dist/regex/time-zone-like.js +3 -2
  318. package/dist/regex/utc-offset.d.ts +2 -1
  319. package/dist/regex/utc-offset.js +2 -1
  320. package/dist/transport/calculate/crossingTime.d.ts +6 -1
  321. package/dist/transport/calculate/crossingTime.js +6 -1
  322. package/dist/transport/calculate/cutoffAt.d.ts +6 -1
  323. package/dist/transport/calculate/cutoffAt.js +2 -0
  324. package/dist/transport/calculate/cutoffSchedule.d.ts +6 -1
  325. package/dist/transport/calculate/cutoffSchedule.js +2 -0
  326. package/dist/transport/calculate/dwellTime.d.ts +6 -1
  327. package/dist/transport/calculate/dwellTime.js +6 -1
  328. package/dist/transport/calculate/scheduleDelivery.d.ts +13 -5
  329. package/dist/transport/calculate/scheduleDelivery.js +6 -1
  330. package/dist/transport/convert/etaAtZone.d.ts +6 -1
  331. package/dist/transport/convert/etaAtZone.js +6 -1
  332. package/dist/types/business-calendar.d.ts +5 -4
  333. package/dist/types/duty.d.ts +777 -0
  334. package/dist/types/duty.js +0 -0
  335. package/dist/types/edi.d.ts +407 -0
  336. package/dist/types/edi.js +0 -0
  337. package/dist/types/epcis.d.ts +25 -0
  338. package/dist/types/epcis.js +0 -0
  339. package/dist/types/exact-duration-unit.d.ts +8 -0
  340. package/dist/types/exact-duration-unit.js +0 -0
  341. package/dist/types/free-time-options.d.ts +4 -3
  342. package/dist/types/index.d.ts +5 -0
  343. package/dist/types/index.js +5 -0
  344. package/dist/types/operating-schedule.d.ts +3 -2
  345. package/dist/types/two-digit-year.d.ts +23 -0
  346. package/dist/types/two-digit-year.js +0 -0
  347. package/dist/types/zone-bucket-unit.d.ts +1 -1
  348. package/dist/unix/calculate/addUnix.d.ts +11 -2
  349. package/dist/unix/calculate/addUnix.js +14 -11
  350. package/dist/unix/calculate/diffUnix.d.ts +10 -2
  351. package/dist/unix/calculate/diffUnix.js +11 -6
  352. package/dist/unix/calculate/diffUnixAsDuration.d.ts +10 -2
  353. package/dist/unix/calculate/diffUnixAsDuration.js +10 -5
  354. package/dist/unix/calculate/endOfQuarterForUnix.d.ts +10 -2
  355. package/dist/unix/calculate/endOfQuarterForUnix.js +6 -0
  356. package/dist/unix/calculate/endOfUnix.d.ts +11 -2
  357. package/dist/unix/calculate/endOfUnix.js +7 -0
  358. package/dist/unix/calculate/isBetweenUnix.d.ts +3 -2
  359. package/dist/unix/calculate/isBetweenUnix.js +3 -3
  360. package/dist/unix/calculate/roundUnix.d.ts +10 -2
  361. package/dist/unix/calculate/roundUnix.js +13 -6
  362. package/dist/unix/calculate/setUnix.d.ts +25 -5
  363. package/dist/unix/calculate/setUnix.js +33 -12
  364. package/dist/unix/calculate/startOfQuarterForUnix.d.ts +10 -2
  365. package/dist/unix/calculate/startOfQuarterForUnix.js +6 -0
  366. package/dist/unix/calculate/startOfUnix.d.ts +11 -2
  367. package/dist/unix/calculate/startOfUnix.js +7 -0
  368. package/dist/unix/calculate/subtractUnix.d.ts +10 -2
  369. package/dist/unix/calculate/subtractUnix.js +13 -11
  370. package/dist/unix/compare/areUnixEqualBy.d.ts +11 -2
  371. package/dist/unix/compare/areUnixEqualBy.js +7 -0
  372. package/dist/unix/convert/convertUnixToPlainDate.d.ts +5 -2
  373. package/dist/unix/convert/convertUnixToPlainDate.js +5 -4
  374. package/dist/unix/convert/convertUnixToPlainDateTime.d.ts +5 -2
  375. package/dist/unix/convert/convertUnixToPlainDateTime.js +5 -4
  376. package/dist/unix/convert/convertUnixToPlainTime.d.ts +5 -2
  377. package/dist/unix/convert/convertUnixToPlainTime.js +5 -4
  378. package/dist/unix/convert/convertUnixToZoned.d.ts +5 -1
  379. package/dist/unix/convert/convertUnixToZoned.js +5 -1
  380. package/dist/unix/format/formatCalendarUnix.d.ts +6 -2
  381. package/dist/unix/format/formatCalendarUnix.js +6 -1
  382. package/dist/unix/format/formatRelativeUnix.d.ts +11 -3
  383. package/dist/unix/format/formatRelativeUnix.js +13 -5
  384. package/dist/unix/format/formatUnix.d.ts +7 -2
  385. package/dist/unix/format/formatUnix.js +4 -0
  386. package/dist/unix/get/getUnixDay.d.ts +1 -3
  387. package/dist/unix/get/getUnixDay.js +5 -12
  388. package/dist/unix/get/getUnixHour.d.ts +1 -3
  389. package/dist/unix/get/getUnixHour.js +5 -12
  390. package/dist/unix/get/getUnixMicrosecond.d.ts +1 -3
  391. package/dist/unix/get/getUnixMicrosecond.js +4 -11
  392. package/dist/unix/get/getUnixMillisecond.d.ts +1 -3
  393. package/dist/unix/get/getUnixMillisecond.js +5 -12
  394. package/dist/unix/get/getUnixMinute.d.ts +1 -3
  395. package/dist/unix/get/getUnixMinute.js +5 -12
  396. package/dist/unix/get/getUnixMonth.d.ts +1 -3
  397. package/dist/unix/get/getUnixMonth.js +5 -12
  398. package/dist/unix/get/getUnixNanosecond.d.ts +1 -3
  399. package/dist/unix/get/getUnixNanosecond.js +4 -11
  400. package/dist/unix/get/getUnixNowUnit.d.ts +2 -0
  401. package/dist/unix/get/getUnixNowUnit.js +2 -0
  402. package/dist/unix/get/getUnixSecond.d.ts +1 -3
  403. package/dist/unix/get/getUnixSecond.js +5 -12
  404. package/dist/unix/get/getUnixYear.d.ts +3 -3
  405. package/dist/unix/get/getUnixYear.js +5 -12
  406. package/dist/unix/interval/intervalCountUnix.d.ts +11 -2
  407. package/dist/unix/interval/intervalCountUnix.js +7 -0
  408. package/dist/unix/interval/intervalFromDurationUnix.d.ts +10 -2
  409. package/dist/unix/interval/intervalFromDurationUnix.js +12 -7
  410. package/dist/unix/interval/intervalLengthUnix.d.ts +10 -2
  411. package/dist/unix/interval/intervalLengthUnix.js +6 -0
  412. package/dist/unix/interval/intervalOverlappingDaysUnix.d.ts +10 -2
  413. package/dist/unix/interval/intervalOverlappingDaysUnix.js +10 -5
  414. package/dist/unix/interval/splitIntervalByUnitUnix.d.ts +10 -2
  415. package/dist/unix/interval/splitIntervalByUnitUnix.js +12 -6
  416. package/dist/unix/parse/parseDateFromUnix.d.ts +4 -2
  417. package/dist/unix/parse/parseDateFromUnix.js +3 -3
  418. package/dist/unix/parse/parseDayFromUnix.d.ts +4 -2
  419. package/dist/unix/parse/parseDayOfWeekFromUnix.d.ts +4 -2
  420. package/dist/unix/parse/parseDayOfWeekFromUnix.js +2 -2
  421. package/dist/unix/parse/parseHourFromUnix.d.ts +4 -2
  422. package/dist/unix/parse/parseMicrosecondFromUnix.d.ts +4 -2
  423. package/dist/unix/parse/parseMillisecondFromUnix.d.ts +4 -2
  424. package/dist/unix/parse/parseMinuteFromUnix.d.ts +4 -2
  425. package/dist/unix/parse/parseMonthFromUnix.d.ts +4 -2
  426. package/dist/unix/parse/parseNanosecondFromUnix.d.ts +4 -2
  427. package/dist/unix/parse/parseSecondFromUnix.d.ts +4 -2
  428. package/dist/unix/parse/parseTimeFromUnix.d.ts +5 -2
  429. package/dist/unix/parse/parseTimeFromUnix.js +4 -3
  430. package/dist/unix/parse/parseUnitFromUnix.d.ts +9 -3
  431. package/dist/unix/parse/parseUnitFromUnix.js +21 -14
  432. package/dist/unix/parse/parseWeekFromUnix.d.ts +3 -2
  433. package/dist/unix/parse/parseWeekFromUnix.js +4 -4
  434. package/dist/unix/parse/parseYearFromUnix.d.ts +8 -3
  435. package/dist/unix/parse/parseYearFromUnix.js +4 -1
  436. package/dist/unix/validate/isValidUnixUnit.d.ts +1 -1
  437. package/dist/utc/calculate/addUtc.js +4 -7
  438. package/dist/utc/calculate/setUtc.d.ts +16 -3
  439. package/dist/utc/calculate/setUtc.js +22 -8
  440. package/dist/utc/calculate/subtractUtc.js +4 -7
  441. package/dist/utc/convert/convertUtcToPlainDate.d.ts +8 -2
  442. package/dist/utc/convert/convertUtcToPlainDate.js +10 -7
  443. package/dist/utc/convert/convertUtcToPlainDateTime.d.ts +9 -2
  444. package/dist/utc/convert/convertUtcToPlainDateTime.js +12 -13
  445. package/dist/utc/convert/convertUtcToPlainTime.d.ts +5 -2
  446. package/dist/utc/convert/convertUtcToPlainTime.js +7 -6
  447. package/dist/utc/convert/convertUtcToZoned.d.ts +5 -1
  448. package/dist/utc/convert/convertUtcToZoned.js +5 -1
  449. package/dist/utc/format/formatCalendarUtc.d.ts +6 -2
  450. package/dist/utc/format/formatCalendarUtc.js +6 -1
  451. package/dist/utc/format/{formatHttp.d.ts → formatHttpDate.d.ts} +7 -7
  452. package/dist/utc/format/{formatHttp.js → formatHttpDate.js} +7 -7
  453. package/dist/utc/format/formatRelativeUtc.d.ts +11 -3
  454. package/dist/utc/format/formatRelativeUtc.js +13 -5
  455. package/dist/utc/format/formatUtc.d.ts +7 -2
  456. package/dist/utc/format/formatUtc.js +4 -0
  457. package/dist/utc/format/index.d.ts +1 -1
  458. package/dist/utc/format/index.js +1 -1
  459. package/dist/utc/get/getUtcDay.d.ts +1 -3
  460. package/dist/utc/get/getUtcDay.js +5 -12
  461. package/dist/utc/get/getUtcHour.d.ts +1 -3
  462. package/dist/utc/get/getUtcHour.js +5 -12
  463. package/dist/utc/get/getUtcMicrosecond.d.ts +1 -3
  464. package/dist/utc/get/getUtcMicrosecond.js +4 -11
  465. package/dist/utc/get/getUtcMillisecond.d.ts +1 -3
  466. package/dist/utc/get/getUtcMillisecond.js +5 -12
  467. package/dist/utc/get/getUtcMinute.d.ts +1 -3
  468. package/dist/utc/get/getUtcMinute.js +5 -12
  469. package/dist/utc/get/getUtcMonth.d.ts +1 -3
  470. package/dist/utc/get/getUtcMonth.js +5 -12
  471. package/dist/utc/get/getUtcNanosecond.d.ts +1 -3
  472. package/dist/utc/get/getUtcNanosecond.js +4 -11
  473. package/dist/utc/get/getUtcNow.d.ts +1 -3
  474. package/dist/utc/get/getUtcNow.js +2 -9
  475. package/dist/utc/get/getUtcNowUnit.d.ts +2 -0
  476. package/dist/utc/get/getUtcNowUnit.js +2 -0
  477. package/dist/utc/get/getUtcSecond.d.ts +1 -3
  478. package/dist/utc/get/getUtcSecond.js +5 -12
  479. package/dist/utc/get/getUtcYear.d.ts +3 -3
  480. package/dist/utc/get/getUtcYear.js +5 -12
  481. package/dist/utc/interval/intervalXorAllUtc.js +2 -2
  482. package/dist/utc/interval/mergeIntervalsUtc.js +2 -2
  483. package/dist/utc/parse/index.d.ts +1 -1
  484. package/dist/utc/parse/index.js +1 -1
  485. package/dist/utc/parse/parseDateFromUtc.d.ts +4 -2
  486. package/dist/utc/parse/parseDateFromUtc.js +2 -2
  487. package/dist/utc/parse/parseDayFromUtc.d.ts +4 -2
  488. package/dist/utc/parse/parseDayFromUtc.js +2 -2
  489. package/dist/utc/parse/parseDayOfWeekFromUtc.d.ts +4 -2
  490. package/dist/utc/parse/parseDayOfWeekFromUtc.js +4 -4
  491. package/dist/utc/parse/parseHourFromUtc.d.ts +4 -2
  492. package/dist/utc/parse/parseHourFromUtc.js +2 -2
  493. package/dist/utc/parse/{parseHttp.d.ts → parseHttpDate.d.ts} +12 -12
  494. package/dist/utc/parse/{parseHttp.js → parseHttpDate.js} +12 -12
  495. package/dist/utc/parse/parseMicrosecondFromUtc.d.ts +4 -2
  496. package/dist/utc/parse/parseMicrosecondFromUtc.js +2 -2
  497. package/dist/utc/parse/parseMillisecondFromUtc.d.ts +4 -2
  498. package/dist/utc/parse/parseMillisecondFromUtc.js +2 -2
  499. package/dist/utc/parse/parseMinuteFromUtc.d.ts +4 -2
  500. package/dist/utc/parse/parseMinuteFromUtc.js +2 -2
  501. package/dist/utc/parse/parseMonthFromUtc.d.ts +4 -2
  502. package/dist/utc/parse/parseMonthFromUtc.js +2 -2
  503. package/dist/utc/parse/parseNanosecondFromUtc.d.ts +4 -2
  504. package/dist/utc/parse/parseNanosecondFromUtc.js +2 -2
  505. package/dist/utc/parse/parseSecondFromUtc.d.ts +4 -2
  506. package/dist/utc/parse/parseSecondFromUtc.js +2 -2
  507. package/dist/utc/parse/parseTimeFromUtc.d.ts +5 -2
  508. package/dist/utc/parse/parseTimeFromUtc.js +5 -4
  509. package/dist/utc/parse/parseUnitFromUtc.d.ts +10 -3
  510. package/dist/utc/parse/parseUnitFromUtc.js +11 -5
  511. package/dist/utc/parse/parseWeekFromUtc.d.ts +4 -2
  512. package/dist/utc/parse/parseWeekFromUtc.js +4 -4
  513. package/dist/utc/parse/parseYearFromUtc.d.ts +8 -4
  514. package/dist/utc/parse/parseYearFromUtc.js +8 -5
  515. package/dist/utc/validate/index.d.ts +2 -0
  516. package/dist/utc/validate/index.js +2 -0
  517. package/dist/utc/validate/isValidHttpDate.d.ts +35 -0
  518. package/dist/utc/validate/isValidHttpDate.js +38 -0
  519. package/dist/utc/validate/isValidUtc.d.ts +4 -0
  520. package/dist/utc/validate/isValidUtc.js +4 -0
  521. package/dist/utc/validate/isValidUtcTimestamp.d.ts +43 -0
  522. package/dist/utc/validate/isValidUtcTimestamp.js +48 -0
  523. package/dist/zoned/calculate/addZoned.js +4 -7
  524. package/dist/zoned/calculate/setZoned.d.ts +19 -5
  525. package/dist/zoned/calculate/setZoned.js +26 -9
  526. package/dist/zoned/calculate/subtractZoned.js +4 -7
  527. package/dist/zoned/convert/convertPlainDateTimeToZoned.d.ts +4 -1
  528. package/dist/zoned/convert/convertPlainDateTimeToZoned.js +4 -1
  529. package/dist/zoned/convert/convertZonedToZoned.d.ts +5 -1
  530. package/dist/zoned/convert/convertZonedToZoned.js +5 -1
  531. package/dist/zoned/format/formatCalendarZoned.js +2 -1
  532. package/dist/zoned/format/formatRelativeZoned.js +2 -1
  533. package/dist/zoned/format/formatTimeZoneName.d.ts +5 -1
  534. package/dist/zoned/format/formatTimeZoneName.js +5 -1
  535. package/dist/zoned/get/getDstTransitions.d.ts +5 -3
  536. package/dist/zoned/get/getDstTransitions.js +12 -7
  537. package/dist/zoned/get/getSystemTimeZone.d.ts +3 -1
  538. package/dist/zoned/get/getSystemTimeZone.js +5 -2
  539. package/dist/zoned/get/getTimeZoneOffset.d.ts +10 -2
  540. package/dist/zoned/get/getTimeZoneOffset.js +18 -5
  541. package/dist/zoned/get/getZonedDay.d.ts +2 -1
  542. package/dist/zoned/get/getZonedDay.js +6 -7
  543. package/dist/zoned/get/getZonedDayOfWeek.d.ts +2 -1
  544. package/dist/zoned/get/getZonedDayOfWeek.js +6 -5
  545. package/dist/zoned/get/getZonedHour.d.ts +2 -1
  546. package/dist/zoned/get/getZonedHour.js +6 -7
  547. package/dist/zoned/get/getZonedMicrosecond.d.ts +2 -1
  548. package/dist/zoned/get/getZonedMicrosecond.js +6 -5
  549. package/dist/zoned/get/getZonedMillisecond.d.ts +2 -1
  550. package/dist/zoned/get/getZonedMillisecond.js +6 -7
  551. package/dist/zoned/get/getZonedMinute.d.ts +2 -1
  552. package/dist/zoned/get/getZonedMinute.js +6 -7
  553. package/dist/zoned/get/getZonedMonth.d.ts +2 -1
  554. package/dist/zoned/get/getZonedMonth.js +6 -7
  555. package/dist/zoned/get/getZonedNanosecond.d.ts +2 -1
  556. package/dist/zoned/get/getZonedNanosecond.js +6 -5
  557. package/dist/zoned/get/getZonedNow.d.ts +5 -1
  558. package/dist/zoned/get/getZonedNow.js +5 -1
  559. package/dist/zoned/get/getZonedNowUnit.d.ts +6 -3
  560. package/dist/zoned/get/getZonedNowUnit.js +10 -7
  561. package/dist/zoned/get/getZonedSecond.d.ts +2 -1
  562. package/dist/zoned/get/getZonedSecond.js +6 -7
  563. package/dist/zoned/get/getZonedToday.d.ts +2 -1
  564. package/dist/zoned/get/getZonedToday.js +6 -5
  565. package/dist/zoned/get/getZonedWeekOfYear.d.ts +2 -1
  566. package/dist/zoned/get/getZonedWeekOfYear.js +6 -5
  567. package/dist/zoned/get/getZonedYear.d.ts +4 -1
  568. package/dist/zoned/get/getZonedYear.js +9 -7
  569. package/dist/zoned/interval/intervalXorAllZoned.js +2 -2
  570. package/dist/zoned/interval/mergeIntervalsZoned.js +2 -2
  571. package/dist/zoned/parse/parseUnitFromZoned.d.ts +4 -1
  572. package/dist/zoned/parse/parseUnitFromZoned.js +5 -1
  573. package/dist/zoned/parse/parseYearFromZoned.d.ts +4 -2
  574. package/dist/zoned/parse/parseYearFromZoned.js +6 -3
  575. package/dist/zoned/validate/hasDaylightSaving.d.ts +4 -2
  576. package/dist/zoned/validate/hasDaylightSaving.js +13 -7
  577. package/dist/zoned/validate/index.d.ts +2 -0
  578. package/dist/zoned/validate/index.js +2 -0
  579. package/dist/zoned/validate/isValidRfc2822DateTime.d.ts +32 -0
  580. package/dist/zoned/validate/isValidRfc2822DateTime.js +35 -0
  581. package/dist/zoned/validate/isValidRfc3339DateTime.d.ts +31 -0
  582. package/dist/zoned/validate/isValidRfc3339DateTime.js +34 -0
  583. package/dist/zoned/validate/isValidTimeZone.d.ts +5 -1
  584. package/dist/zoned/validate/isValidTimeZone.js +6 -2
  585. package/package.json +50 -1
  586. package/skills/gmt-arithmetic/SKILL.md +99 -12
  587. package/skills/gmt-basics/SKILL.md +57 -15
  588. package/skills/gmt-integration/SKILL.md +24 -9
  589. package/skills/gmt-timezone/SKILL.md +134 -29
  590. package/dist/internal/unixZonedDateTime.d.ts +0 -22
  591. package/dist/internal/unixZonedDateTime.js +0 -32
  592. package/dist/internal/utcZonedDateTime.d.ts +0 -19
  593. package/dist/internal/utcZonedDateTime.js +0 -31
@@ -29,11 +29,18 @@ import type { ZoneBucketUnit } from "../../types/index.js";
29
29
  * if a zone ever presented more transitions inside one bucket than the stepper walks — no
30
30
  * IANA zone does, and the whole table was swept to confirm it. A truncated list would be
31
31
  * worse than the sentinel, so none is returned in any of those cases.
32
+ * - **Limit at an offset with seconds.** The instant is placed in the offset's whole-minute zone,
33
+ * moved by its seconds, and the moved instant must be inside Temporal's range. So within the
34
+ * offset's seconds (under a minute) of the last instant Temporal supports
35
+ * (`+275760-09-13T00:00:00Z`) for an offset east of UTC, or of the first
36
+ * (`-271821-04-20T00:00:00Z`) for one west, this returns `[]`. An offset to the minute has no
37
+ * such limit.
32
38
  *
33
39
  * @param start ISO 8601 instant string for the range start (inclusive)
34
40
  * @param end ISO 8601 instant string for the range end (exclusive)
35
- * @param unit bucket unit ("hour" | "day" | "week" | "month", or its plural)
36
- * @param timeZone IANA name or UTC offset the buckets are computed in
41
+ * @param unit bucket unit ("month" | "week" | "day" | "hour", or its plural)
42
+ * @param timeZone IANA name or UTC offset the buckets are computed in: a time zone identifier
43
+ * (`+05:30`, `+0530`, `-08`) or a stored offset (`±HH:MM[:SS]`, what `getTimeZoneOffset` returns)
37
44
  * @returns array of UTC instant strings ending in "Z", or [] on invalid input
38
45
  *
39
46
  * @example bucketRange("2024-06-15T03:00:00Z", "2024-06-17T03:00:00Z", "day", "America/New_York") // ["2024-06-14T04:00:00Z", "2024-06-15T04:00:00Z", "2024-06-16T04:00:00Z"]
@@ -45,5 +52,6 @@ import type { ZoneBucketUnit } from "../../types/index.js";
45
52
  * @example bucketRange("2024-06-16T00:00:00Z", "2024-06-15T00:00:00Z", "day", "UTC") // [] (start after end)
46
53
  * @example bucketRange("2024-06-15T03:00:00Z", "2024-06-17T03:00:00Z", "days", "America/New_York") // ["2024-06-14T04:00:00Z", "2024-06-15T04:00:00Z", "2024-06-16T04:00:00Z"] (plural unit name)
47
54
  * @example bucketRange("2024-06-15T03:00:00Z", "2024-06-17T03:00:00Z", "year", "UTC") // [] (not a bucketing unit)
55
+ * @example bucketRange("1970-01-01T00:00:00Z", "1970-01-02T01:00:00Z", "day", "-00:44:30") // ["1969-12-31T00:44:30Z", "1970-01-01T00:44:30Z", "1970-01-02T00:44:30Z"]
48
56
  */
49
57
  export declare function bucketRange(start: string, end: string, unit: Temporal.SmallestUnit<ZoneBucketUnit>, timeZone: string): string[];
@@ -1,9 +1,9 @@
1
1
  import { Temporal } from "@js-temporal/polyfill";
2
- import { instantFrom, nextZonedBucketStart, zonedNextTransition, zonedUnitStart, } from "../../internal/index.js";
2
+ import { frameInstant, frameZoned, instantFrom, nextZonedBucketStart, zonedUnitStart, zoneFrame, } from "../../internal/index.js";
3
3
  import { isValidInstant } from "../../precision/validate/index.js";
4
- import { isValidTimeZone } from "../../zoned/validate/index.js";
5
4
  import { isValidZoneBucketUnit } from "../validate/index.js";
6
5
  import { resolveDateTimeUnit } from "../../internal/resolveDateTimeUnit.js";
6
+ import { certainlyTouchesMoreBuckets } from "../../internal/zoneBucketCap.js";
7
7
  /**
8
8
  * Buckets a single call will return before giving up.
9
9
  *
@@ -12,58 +12,6 @@ import { resolveDateTimeUnit } from "../../internal/resolveDateTimeUnit.js";
12
12
  * months — past anything a caller renders or aggregates in one pass.
13
13
  */
14
14
  const MAX_BUCKETS = 10_000;
15
- const NANOSECONDS_PER_HOUR = 3600000000000n;
16
- /**
17
- * The longest wall-clock stretch of each unit. Any wall-clock interval this long holds a unit
18
- * start: an hour holds an hour start, 24 hours a midnight, 7 days a Monday, 31 days a first of
19
- * the month.
20
- */
21
- const LONGEST_UNIT_NANOSECONDS = {
22
- hour: NANOSECONDS_PER_HOUR,
23
- day: 24n * NANOSECONDS_PER_HOUR,
24
- week: 168n * NANOSECONDS_PER_HOUR,
25
- month: 744n * NANOSECONDS_PER_HOUR,
26
- };
27
- /** Offset transitions read before the pre-count gives up and leaves the answer to the walk. */
28
- const MAX_PRECOUNT_TRANSITIONS = 4_096;
29
- /**
30
- * True when `[start, end)` certainly touches more than `MAX_BUCKETS` buckets, decided from the span
31
- * instead of stepping bucket by bucket (which costs milliseconds a step in some zones).
32
- *
33
- * Over a prefix of the range, the local wall clock runs continuously between offset transitions.
34
- * Those stretches cover at least the prefix's length less every backward offset change, in at most
35
- * one stretch more than there are transitions, and each stretch of wall clock holds at least
36
- * `floor(length / LONGEST_UNIT_NANOSECONDS)` distinct unit starts, each the start of its own
37
- * bucket before `end`. The count subtracts two per stretch for the partial units at its ends.
38
- * `false` means "not certain": the walk decides, exactly as before.
39
- */
40
- function certainlyExceedsBucketCap(startZoned, endZoned, unit) {
41
- const unitNs = LONGEST_UNIT_NANOSECONDS[unit];
42
- const startNs = startZoned.epochNanoseconds;
43
- const prefixEndNs = [
44
- endZoned.epochNanoseconds,
45
- startNs + 2n * BigInt(MAX_BUCKETS + 1) * unitNs,
46
- ].reduce((a, b) => (a < b ? a : b));
47
- if (prefixEndNs - startNs <= BigInt(MAX_BUCKETS) * unitNs) {
48
- return false;
49
- }
50
- let backwardNs = 0n;
51
- let transitions = 0;
52
- try {
53
- for (let current = startZoned, next = zonedNextTransition(current); next !== null && next.epochNanoseconds < prefixEndNs; current = next, next = zonedNextTransition(current)) {
54
- if (++transitions > MAX_PRECOUNT_TRANSITIONS) {
55
- return false;
56
- }
57
- const shift = BigInt(current.offsetNanoseconds - next.offsetNanoseconds);
58
- backwardNs += shift > 0n ? shift : 0n;
59
- }
60
- }
61
- catch {
62
- return false;
63
- }
64
- const wallStarts = (prefixEndNs - startNs - backwardNs) / unitNs;
65
- return wallStarts - 2n * BigInt(transitions + 1) > BigInt(MAX_BUCKETS);
66
- }
67
15
  /**
68
16
  * The bucket start after `current`: `undefined` when it lies past Temporal's last representable
69
17
  * instant, null when the stepper cannot find it.
@@ -107,11 +55,18 @@ function nextBucketStartWithinRange(current, unit) {
107
55
  * if a zone ever presented more transitions inside one bucket than the stepper walks — no
108
56
  * IANA zone does, and the whole table was swept to confirm it. A truncated list would be
109
57
  * worse than the sentinel, so none is returned in any of those cases.
58
+ * - **Limit at an offset with seconds.** The instant is placed in the offset's whole-minute zone,
59
+ * moved by its seconds, and the moved instant must be inside Temporal's range. So within the
60
+ * offset's seconds (under a minute) of the last instant Temporal supports
61
+ * (`+275760-09-13T00:00:00Z`) for an offset east of UTC, or of the first
62
+ * (`-271821-04-20T00:00:00Z`) for one west, this returns `[]`. An offset to the minute has no
63
+ * such limit.
110
64
  *
111
65
  * @param start ISO 8601 instant string for the range start (inclusive)
112
66
  * @param end ISO 8601 instant string for the range end (exclusive)
113
- * @param unit bucket unit ("hour" | "day" | "week" | "month", or its plural)
114
- * @param timeZone IANA name or UTC offset the buckets are computed in
67
+ * @param unit bucket unit ("month" | "week" | "day" | "hour", or its plural)
68
+ * @param timeZone IANA name or UTC offset the buckets are computed in: a time zone identifier
69
+ * (`+05:30`, `+0530`, `-08`) or a stored offset (`±HH:MM[:SS]`, what `getTimeZoneOffset` returns)
115
70
  * @returns array of UTC instant strings ending in "Z", or [] on invalid input
116
71
  *
117
72
  * @example bucketRange("2024-06-15T03:00:00Z", "2024-06-17T03:00:00Z", "day", "America/New_York") // ["2024-06-14T04:00:00Z", "2024-06-15T04:00:00Z", "2024-06-16T04:00:00Z"]
@@ -123,22 +78,24 @@ function nextBucketStartWithinRange(current, unit) {
123
78
  * @example bucketRange("2024-06-16T00:00:00Z", "2024-06-15T00:00:00Z", "day", "UTC") // [] (start after end)
124
79
  * @example bucketRange("2024-06-15T03:00:00Z", "2024-06-17T03:00:00Z", "days", "America/New_York") // ["2024-06-14T04:00:00Z", "2024-06-15T04:00:00Z", "2024-06-16T04:00:00Z"] (plural unit name)
125
80
  * @example bucketRange("2024-06-15T03:00:00Z", "2024-06-17T03:00:00Z", "year", "UTC") // [] (not a bucketing unit)
81
+ * @example bucketRange("1970-01-01T00:00:00Z", "1970-01-02T01:00:00Z", "day", "-00:44:30") // ["1969-12-31T00:44:30Z", "1970-01-01T00:44:30Z", "1970-01-02T00:44:30Z"]
126
82
  */
127
83
  export function bucketRange(start, end, unit, timeZone) {
128
84
  // The singular name; the guard below rejects anything outside the four units.
129
85
  const resolvedUnit = resolveDateTimeUnit(unit);
86
+ const frame = zoneFrame(timeZone);
130
87
  if (!isValidInstant(start) ||
131
88
  !isValidInstant(end) ||
132
89
  !isValidZoneBucketUnit(resolvedUnit) ||
133
- !isValidTimeZone(timeZone)) {
90
+ frame === null) {
134
91
  return [];
135
92
  }
136
93
  try {
137
- const startZoned = instantFrom(start).toZonedDateTimeISO(timeZone);
138
- const endZoned = instantFrom(end).toZonedDateTimeISO(timeZone);
94
+ const startZoned = frameZoned(instantFrom(start), frame);
95
+ const endZoned = frameZoned(instantFrom(end), frame);
139
96
  if (Temporal.ZonedDateTime.compare(startZoned, endZoned) > 0)
140
97
  return [];
141
- if (certainlyExceedsBucketCap(startZoned, endZoned, resolvedUnit))
98
+ if (certainlyTouchesMoreBuckets(startZoned, endZoned, resolvedUnit, MAX_BUCKETS))
142
99
  return [];
143
100
  const boundaries = [];
144
101
  const first = zonedUnitStart(startZoned, resolvedUnit);
@@ -149,7 +106,7 @@ export function bucketRange(start, end, unit, timeZone) {
149
106
  if (Temporal.ZonedDateTime.compare(current, endZoned) >= 0) {
150
107
  return boundaries;
151
108
  }
152
- boundaries.push(current.toInstant().toString());
109
+ boundaries.push(frameInstant(current, frame).toString());
153
110
  const next = nextBucketStartWithinRange(current, resolvedUnit);
154
111
  // Past the last representable instant, so after `end`: every touched bucket is collected.
155
112
  if (next === undefined)
@@ -24,10 +24,17 @@ import type { ZoneBucketUnit } from "../../types/index.js";
24
24
  * - Returns a UTC instant string ending in `"Z"`, exactly — no rounding.
25
25
  * - Returns `""` on invalid input, and where the boundary itself is not representable — the
26
26
  * week or month containing the first instant Temporal supports began before it.
27
+ * - **Limit at an offset with seconds.** The instant is placed in the offset's whole-minute zone,
28
+ * moved by its seconds, and the moved instant must be inside Temporal's range. So within the
29
+ * offset's seconds (under a minute) of the last instant Temporal supports
30
+ * (`+275760-09-13T00:00:00Z`) for an offset east of UTC, or of the first
31
+ * (`-271821-04-20T00:00:00Z`) for one west, this returns `""`. An offset to the minute has no
32
+ * such limit.
27
33
  *
28
34
  * @param value ISO 8601 instant string (e.g. "2024-06-15T03:00:00Z")
29
- * @param unit boundary unit ("hour" | "day" | "week" | "month", or its plural)
30
- * @param timeZone IANA name or UTC offset the boundary is computed in
35
+ * @param unit boundary unit ("month" | "week" | "day" | "hour", or its plural)
36
+ * @param timeZone IANA name or UTC offset the boundary is computed in: a time zone identifier
37
+ * (`+05:30`, `+0530`, `-08`) or a stored offset (`±HH:MM[:SS]`, what `getTimeZoneOffset` returns)
31
38
  * @returns UTC instant string ending in "Z", or "" on invalid input
32
39
  *
33
40
  * @example floorToZone("2024-06-15T03:00:00Z", "day", "America/New_York") // "2024-06-14T04:00:00Z" (the 14 June local midnight — the instant is already 14 June there)
@@ -40,5 +47,6 @@ import type { ZoneBucketUnit } from "../../types/index.js";
40
47
  * @example floorToZone("2024-06-15T03:00:00", "day", "UTC") // "" (zoneless, so it names no instant)
41
48
  * @example floorToZone("-271821-04-20T00:00:00Z", "month", "UTC") // "" (that month began before Temporal's range does)
42
49
  * @example floorToZone("2024-06-15T03:00:00Z", "day", "Invalid/Zone") // ""
50
+ * @example floorToZone("1970-01-01T13:00:00Z", "day", "-00:44:30") // "1970-01-01T00:44:30Z" (local midnight at a stored offset with seconds)
43
51
  */
44
52
  export declare function floorToZone(value: string, unit: Temporal.SmallestUnit<ZoneBucketUnit>, timeZone: string): string;
@@ -1,6 +1,5 @@
1
- import { instantFrom, zonedUnitStart } from "../../internal/index.js";
1
+ import { frameInstant, frameZoned, instantFrom, zonedUnitStart, zoneFrame, } from "../../internal/index.js";
2
2
  import { isValidInstant } from "../../precision/validate/index.js";
3
- import { isValidTimeZone } from "../../zoned/validate/index.js";
4
3
  import { isValidZoneBucketUnit } from "../validate/index.js";
5
4
  import { resolveDateTimeUnit } from "../../internal/resolveDateTimeUnit.js";
6
5
  /**
@@ -27,10 +26,17 @@ import { resolveDateTimeUnit } from "../../internal/resolveDateTimeUnit.js";
27
26
  * - Returns a UTC instant string ending in `"Z"`, exactly — no rounding.
28
27
  * - Returns `""` on invalid input, and where the boundary itself is not representable — the
29
28
  * week or month containing the first instant Temporal supports began before it.
29
+ * - **Limit at an offset with seconds.** The instant is placed in the offset's whole-minute zone,
30
+ * moved by its seconds, and the moved instant must be inside Temporal's range. So within the
31
+ * offset's seconds (under a minute) of the last instant Temporal supports
32
+ * (`+275760-09-13T00:00:00Z`) for an offset east of UTC, or of the first
33
+ * (`-271821-04-20T00:00:00Z`) for one west, this returns `""`. An offset to the minute has no
34
+ * such limit.
30
35
  *
31
36
  * @param value ISO 8601 instant string (e.g. "2024-06-15T03:00:00Z")
32
- * @param unit boundary unit ("hour" | "day" | "week" | "month", or its plural)
33
- * @param timeZone IANA name or UTC offset the boundary is computed in
37
+ * @param unit boundary unit ("month" | "week" | "day" | "hour", or its plural)
38
+ * @param timeZone IANA name or UTC offset the boundary is computed in: a time zone identifier
39
+ * (`+05:30`, `+0530`, `-08`) or a stored offset (`±HH:MM[:SS]`, what `getTimeZoneOffset` returns)
34
40
  * @returns UTC instant string ending in "Z", or "" on invalid input
35
41
  *
36
42
  * @example floorToZone("2024-06-15T03:00:00Z", "day", "America/New_York") // "2024-06-14T04:00:00Z" (the 14 June local midnight — the instant is already 14 June there)
@@ -43,19 +49,21 @@ import { resolveDateTimeUnit } from "../../internal/resolveDateTimeUnit.js";
43
49
  * @example floorToZone("2024-06-15T03:00:00", "day", "UTC") // "" (zoneless, so it names no instant)
44
50
  * @example floorToZone("-271821-04-20T00:00:00Z", "month", "UTC") // "" (that month began before Temporal's range does)
45
51
  * @example floorToZone("2024-06-15T03:00:00Z", "day", "Invalid/Zone") // ""
52
+ * @example floorToZone("1970-01-01T13:00:00Z", "day", "-00:44:30") // "1970-01-01T00:44:30Z" (local midnight at a stored offset with seconds)
46
53
  */
47
54
  export function floorToZone(value, unit, timeZone) {
48
55
  // The singular name; the guard below rejects anything outside the four units.
49
56
  const resolvedUnit = resolveDateTimeUnit(unit);
57
+ const frame = zoneFrame(timeZone);
50
58
  if (!isValidInstant(value) ||
51
59
  !isValidZoneBucketUnit(resolvedUnit) ||
52
- !isValidTimeZone(timeZone)) {
60
+ frame === null) {
53
61
  return "";
54
62
  }
55
63
  try {
56
- const zoned = instantFrom(value).toZonedDateTimeISO(timeZone);
64
+ const zoned = frameZoned(instantFrom(value), frame);
57
65
  const start = zonedUnitStart(zoned, resolvedUnit);
58
- return start ? start.toInstant().toString() : "";
66
+ return start ? frameInstant(start, frame).toString() : "";
59
67
  }
60
68
  catch {
61
69
  return "";
@@ -17,6 +17,12 @@ import type { Disambiguation, OperatingSchedule } from "../../types/index.js";
17
17
  * - Returns `""` on invalid input: an invalid instant, duration or `OperatingSchedule`, a
18
18
  * negative `duration`, a `within` that is not a non-negative ISO duration, a `disambiguation`
19
19
  * that is not one of the four values, and a search that would go more than 10,000 local dates past the input's date.
20
+ * - **Limit at an offset with seconds.** The instant is placed in the offset's whole-minute zone,
21
+ * moved by its seconds, and the moved instant must be inside Temporal's range. So within the
22
+ * offset's seconds (under a minute) of the last instant Temporal supports
23
+ * (`+275760-09-13T00:00:00Z`) for an offset east of UTC, or of the first
24
+ * (`-271821-04-20T00:00:00Z`) for one west, this returns `""`. An offset to the minute has no
25
+ * such limit.
20
26
  *
21
27
  * @param start ISO 8601 instant string where the clock starts
22
28
  * @param duration ISO 8601 duration of open time, hours and smaller units (e.g. "PT8H")
@@ -18,6 +18,12 @@ import { instantAfterOpenTime, instantText, parseOpenTimeAmount, parseOperatingS
18
18
  * - Returns `""` on invalid input: an invalid instant, duration or `OperatingSchedule`, a
19
19
  * negative `duration`, a `within` that is not a non-negative ISO duration, a `disambiguation`
20
20
  * that is not one of the four values, and a search that would go more than 10,000 local dates past the input's date.
21
+ * - **Limit at an offset with seconds.** The instant is placed in the offset's whole-minute zone,
22
+ * moved by its seconds, and the moved instant must be inside Temporal's range. So within the
23
+ * offset's seconds (under a minute) of the last instant Temporal supports
24
+ * (`+275760-09-13T00:00:00Z`) for an offset east of UTC, or of the first
25
+ * (`-271821-04-20T00:00:00Z`) for one west, this returns `""`. An offset to the minute has no
26
+ * such limit.
21
27
  *
22
28
  * @param start ISO 8601 instant string where the clock starts
23
29
  * @param duration ISO 8601 duration of open time, hours and smaller units (e.g. "PT8H")
@@ -44,7 +50,7 @@ export function addOperatingTime(start, duration, schedule, optionsArg) {
44
50
  amount === null) {
45
51
  return "";
46
52
  }
47
- const horizon = parseSearchHorizon(from, optionsArg?.within, resolved.timeZone);
53
+ const horizon = parseSearchHorizon(from, optionsArg?.within, resolved.frame);
48
54
  if (horizon === null) {
49
55
  return "";
50
56
  }
@@ -13,6 +13,11 @@ import type { Disambiguation, OperatingSchedule } from "../../types/index.js";
13
13
  * - Returns `false` on invalid input: an invalid instant or `OperatingSchedule`, or a
14
14
  * `disambiguation` that is not one of the four values. Check the schedule with
15
15
  * `operatingIntervals` when "closed" and "invalid" must be told apart.
16
+ * - **Limit at an offset with seconds.** The instant is placed in the offset's whole-minute zone,
17
+ * moved by its seconds, and the moved instant must be inside Temporal's range. So within the
18
+ * offset's seconds (under a minute) of the first instant Temporal supports
19
+ * (`-271821-04-20T00:00:00Z`), for an offset west of UTC, this returns `false`. There `false` is
20
+ * the sentinel, not a reading of the schedule. An offset to the minute has no such limit.
16
21
  *
17
22
  * @param isoString ISO 8601 instant string to test
18
23
  * @param schedule `{ timeZone, weekly, holidays?, overrides? }` operating schedule
@@ -24,6 +29,7 @@ import type { Disambiguation, OperatingSchedule } from "../../types/index.js";
24
29
  * @example isOpenAt("2024-06-15T01:00:00Z", { timeZone: "UTC", weekly: { 5: [{ from: "23:00", to: "06:00" }] } }) // true — Friday's night window, on Saturday morning
25
30
  * @example isOpenAt("2024-07-04T14:00:00Z", { timeZone: "America/New_York", weekly: { 4: [{ from: "09:00", to: "17:00" }] }, holidays: ["2024-07-04"] }) // false — a holiday
26
31
  * @example isOpenAt("2024-06-17T14:00:00", { timeZone: "UTC", weekly: { 1: [{ from: "09:00", to: "17:00" }] } }) // false — no offset, not an instant
32
+ * @example isOpenAt("1970-01-01T08:44:30Z", { timeZone: "-00:44:30", weekly: { 4: [{ from: "08:00", to: "17:00" }] } }) // true (08:00 at a stored offset with seconds)
27
33
  */
28
34
  export declare function isOpenAt(isoString: string, schedule: OperatingSchedule, optionsArg?: {
29
35
  /**
@@ -14,6 +14,11 @@ import { firstOpenInstant, parseOperatingSchedule, parseScheduleDisambiguation,
14
14
  * - Returns `false` on invalid input: an invalid instant or `OperatingSchedule`, or a
15
15
  * `disambiguation` that is not one of the four values. Check the schedule with
16
16
  * `operatingIntervals` when "closed" and "invalid" must be told apart.
17
+ * - **Limit at an offset with seconds.** The instant is placed in the offset's whole-minute zone,
18
+ * moved by its seconds, and the moved instant must be inside Temporal's range. So within the
19
+ * offset's seconds (under a minute) of the first instant Temporal supports
20
+ * (`-271821-04-20T00:00:00Z`), for an offset west of UTC, this returns `false`. There `false` is
21
+ * the sentinel, not a reading of the schedule. An offset to the minute has no such limit.
17
22
  *
18
23
  * @param isoString ISO 8601 instant string to test
19
24
  * @param schedule `{ timeZone, weekly, holidays?, overrides? }` operating schedule
@@ -25,6 +30,7 @@ import { firstOpenInstant, parseOperatingSchedule, parseScheduleDisambiguation,
25
30
  * @example isOpenAt("2024-06-15T01:00:00Z", { timeZone: "UTC", weekly: { 5: [{ from: "23:00", to: "06:00" }] } }) // true — Friday's night window, on Saturday morning
26
31
  * @example isOpenAt("2024-07-04T14:00:00Z", { timeZone: "America/New_York", weekly: { 4: [{ from: "09:00", to: "17:00" }] }, holidays: ["2024-07-04"] }) // false — a holiday
27
32
  * @example isOpenAt("2024-06-17T14:00:00", { timeZone: "UTC", weekly: { 1: [{ from: "09:00", to: "17:00" }] } }) // false — no offset, not an instant
33
+ * @example isOpenAt("1970-01-01T08:44:30Z", { timeZone: "-00:44:30", weekly: { 4: [{ from: "08:00", to: "17:00" }] } }) // true (08:00 at a stored offset with seconds)
28
34
  */
29
35
  export function isOpenAt(isoString, schedule, optionsArg) {
30
36
  try {
@@ -14,6 +14,12 @@ import type { Disambiguation, OperatingSchedule } from "../../types/index.js";
14
14
  * - Returns `""` on invalid input: an invalid instant or `OperatingSchedule`, a `within` that is
15
15
  * not a non-negative ISO duration, a `disambiguation` that is not one of the four values, and
16
16
  * a search that would go more than 10,000 local dates past the input's date.
17
+ * - **Limit at an offset with seconds.** The instant is placed in the offset's whole-minute zone,
18
+ * moved by its seconds, and the moved instant must be inside Temporal's range. So within the
19
+ * offset's seconds (under a minute) of the last instant Temporal supports
20
+ * (`+275760-09-13T00:00:00Z`) for an offset east of UTC, or of the first
21
+ * (`-271821-04-20T00:00:00Z`) for one west, this returns `""`. An offset to the minute has no
22
+ * such limit.
17
23
  *
18
24
  * @param isoString ISO 8601 instant string to search from, inclusive
19
25
  * @param schedule `{ timeZone, weekly, holidays?, overrides? }` operating schedule
@@ -15,6 +15,12 @@ import { firstClosedInstant, instantText, parseOperatingSchedule, parseScheduleD
15
15
  * - Returns `""` on invalid input: an invalid instant or `OperatingSchedule`, a `within` that is
16
16
  * not a non-negative ISO duration, a `disambiguation` that is not one of the four values, and
17
17
  * a search that would go more than 10,000 local dates past the input's date.
18
+ * - **Limit at an offset with seconds.** The instant is placed in the offset's whole-minute zone,
19
+ * moved by its seconds, and the moved instant must be inside Temporal's range. So within the
20
+ * offset's seconds (under a minute) of the last instant Temporal supports
21
+ * (`+275760-09-13T00:00:00Z`) for an offset east of UTC, or of the first
22
+ * (`-271821-04-20T00:00:00Z`) for one west, this returns `""`. An offset to the minute has no
23
+ * such limit.
18
24
  *
19
25
  * @param isoString ISO 8601 instant string to search from, inclusive
20
26
  * @param schedule `{ timeZone, weekly, holidays?, overrides? }` operating schedule
@@ -36,7 +42,7 @@ export function nextCloseAt(isoString, schedule, optionsArg) {
36
42
  if (disambiguation === null || resolved === null || from === null) {
37
43
  return "";
38
44
  }
39
- const horizon = parseSearchHorizon(from, optionsArg?.within, resolved.timeZone);
45
+ const horizon = parseSearchHorizon(from, optionsArg?.within, resolved.frame);
40
46
  if (horizon === null) {
41
47
  return "";
42
48
  }
@@ -11,6 +11,12 @@ import type { Disambiguation, OperatingSchedule } from "../../types/index.js";
11
11
  * - Returns `""` on invalid input: an invalid instant or `OperatingSchedule`, a `within` that is
12
12
  * not a non-negative ISO duration, a `disambiguation` that is not one of the four values, and
13
13
  * a search that would go more than 10,000 local dates past the input's date.
14
+ * - **Limit at an offset with seconds.** The instant is placed in the offset's whole-minute zone,
15
+ * moved by its seconds, and the moved instant must be inside Temporal's range. So within the
16
+ * offset's seconds (under a minute) of the last instant Temporal supports
17
+ * (`+275760-09-13T00:00:00Z`) for an offset east of UTC, or of the first
18
+ * (`-271821-04-20T00:00:00Z`) for one west, this returns `""`. An offset to the minute has no
19
+ * such limit.
14
20
  *
15
21
  * @param isoString ISO 8601 instant string to search from, inclusive
16
22
  * @param schedule `{ timeZone, weekly, holidays?, overrides? }` operating schedule
@@ -12,6 +12,12 @@ import { firstOpenInstant, instantText, parseOperatingSchedule, parseScheduleDis
12
12
  * - Returns `""` on invalid input: an invalid instant or `OperatingSchedule`, a `within` that is
13
13
  * not a non-negative ISO duration, a `disambiguation` that is not one of the four values, and
14
14
  * a search that would go more than 10,000 local dates past the input's date.
15
+ * - **Limit at an offset with seconds.** The instant is placed in the offset's whole-minute zone,
16
+ * moved by its seconds, and the moved instant must be inside Temporal's range. So within the
17
+ * offset's seconds (under a minute) of the last instant Temporal supports
18
+ * (`+275760-09-13T00:00:00Z`) for an offset east of UTC, or of the first
19
+ * (`-271821-04-20T00:00:00Z`) for one west, this returns `""`. An offset to the minute has no
20
+ * such limit.
15
21
  *
16
22
  * @param isoString ISO 8601 instant string to search from, inclusive
17
23
  * @param schedule `{ timeZone, weekly, holidays?, overrides? }` operating schedule
@@ -32,7 +38,7 @@ export function nextOpenAt(isoString, schedule, optionsArg) {
32
38
  if (disambiguation === null || resolved === null || from === null) {
33
39
  return "";
34
40
  }
35
- const horizon = parseSearchHorizon(from, optionsArg?.within, resolved.timeZone);
41
+ const horizon = parseSearchHorizon(from, optionsArg?.within, resolved.frame);
36
42
  if (horizon === null) {
37
43
  return "";
38
44
  }
@@ -18,6 +18,11 @@ import type { Disambiguation, Interval, OperatingSchedule } from "../../types/in
18
18
  * for one date), when `range` is not a valid `Interval`, when `disambiguation` is not one of
19
19
  * the four values, and when the range spans more than 10,000 local dates (about 27 years)
20
20
  * counted from the date `range.start` falls on.
21
+ * - **Limit at an offset with seconds.** The instant is placed in the offset's whole-minute zone,
22
+ * moved by its seconds, and the moved instant must be inside Temporal's range. So within the
23
+ * offset's seconds (under a minute) of the first instant Temporal supports
24
+ * (`-271821-04-20T00:00:00Z`), for an offset west of UTC, this returns `[]`. An offset to the
25
+ * minute has no such limit.
21
26
  *
22
27
  * @param schedule `{ timeZone, weekly, holidays?, overrides? }` operating schedule
23
28
  * @param range `{ start, end }` record of ISO 8601 instant strings to expand the schedule inside
@@ -19,6 +19,11 @@ import { parseOperatingSchedule, parseScheduleDisambiguation, scheduleRunsWithin
19
19
  * for one date), when `range` is not a valid `Interval`, when `disambiguation` is not one of
20
20
  * the four values, and when the range spans more than 10,000 local dates (about 27 years)
21
21
  * counted from the date `range.start` falls on.
22
+ * - **Limit at an offset with seconds.** The instant is placed in the offset's whole-minute zone,
23
+ * moved by its seconds, and the moved instant must be inside Temporal's range. So within the
24
+ * offset's seconds (under a minute) of the first instant Temporal supports
25
+ * (`-271821-04-20T00:00:00Z`), for an offset west of UTC, this returns `[]`. An offset to the
26
+ * minute has no such limit.
22
27
  *
23
28
  * @param schedule `{ timeZone, weekly, holidays?, overrides? }` operating schedule
24
29
  * @param range `{ start, end }` record of ISO 8601 instant strings to expand the schedule inside
@@ -14,6 +14,11 @@ import type { Disambiguation, OperatingSchedule } from "../../types/index.js";
14
14
  * - Returns `""` on invalid input: an invalid instant or `OperatingSchedule`, `start` after
15
15
  * `end`, a `disambiguation` that is not one of the four values, and a range spanning more than
16
16
  * 10,000 local dates (about 27 years) counted from the date `start` falls on.
17
+ * - **Limit at an offset with seconds.** The instant is placed in the offset's whole-minute zone,
18
+ * moved by its seconds, and the moved instant must be inside Temporal's range. So within the
19
+ * offset's seconds (under a minute) of the first instant Temporal supports
20
+ * (`-271821-04-20T00:00:00Z`), for an offset west of UTC, this returns `""`. An offset to the
21
+ * minute has no such limit.
17
22
  *
18
23
  * @param start ISO 8601 instant string where the clock starts (inclusive)
19
24
  * @param end ISO 8601 instant string where the clock stops (exclusive)
@@ -15,6 +15,11 @@ import { parseOperatingSchedule, parseScheduleDisambiguation, scheduleRunsWithin
15
15
  * - Returns `""` on invalid input: an invalid instant or `OperatingSchedule`, `start` after
16
16
  * `end`, a `disambiguation` that is not one of the four values, and a range spanning more than
17
17
  * 10,000 local dates (about 27 years) counted from the date `start` falls on.
18
+ * - **Limit at an offset with seconds.** The instant is placed in the offset's whole-minute zone,
19
+ * moved by its seconds, and the moved instant must be inside Temporal's range. So within the
20
+ * offset's seconds (under a minute) of the first instant Temporal supports
21
+ * (`-271821-04-20T00:00:00Z`), for an offset west of UTC, this returns `""`. An offset to the
22
+ * minute has no such limit.
18
23
  *
19
24
  * @param start ISO 8601 instant string where the clock starts (inclusive)
20
25
  * @param end ISO 8601 instant string where the clock stops (exclusive)
@@ -31,10 +31,16 @@ import type { Disambiguation, Interval, OperatingSchedule } from "../../types/in
31
31
  * `range` is not a valid `Interval`, when `timeZone` is invalid, when `disambiguation` is not
32
32
  * one of the four values, and when the range spans more than 10,000 local dates (about 27
33
33
  * years) counted from the date `range.start` falls on, rather than a truncated list.
34
+ * - **Limit at an offset with seconds.** The instant is placed in the offset's whole-minute zone,
35
+ * moved by its seconds, and the moved instant must be inside Temporal's range. So within the
36
+ * offset's seconds (under a minute) of the first instant Temporal supports
37
+ * (`-271821-04-20T00:00:00Z`), for an offset west of UTC, this returns `[]`. An offset to the
38
+ * minute has no such limit.
34
39
  *
35
40
  * @param weekly windows by ISO weekday, `{ 1: [{ from: "09:00", to: "17:00" }], … }`
36
41
  * @param range `{ start, end }` record of ISO 8601 instant strings to expand the pattern inside
37
- * @param timeZone IANA name or UTC offset the windows are read in
42
+ * @param timeZone IANA name or UTC offset the windows are read in: a time zone identifier
43
+ * (`+05:30`, `+0530`, `-08`) or a stored offset (`±HH:MM[:SS]`, what `getTimeZoneOffset` returns)
38
44
  * @param optionsArg How a window edge on a clock change is resolved
39
45
  * @returns sorted, merged `{ start, end }` records of the open instants, or [] on invalid input
40
46
  *
@@ -47,6 +53,7 @@ import type { Disambiguation, Interval, OperatingSchedule } from "../../types/in
47
53
  * @example recurringWindows({ 8: [{ from: "09:00", to: "17:00" }] }, { start: "2024-06-10T00:00:00Z", end: "2024-06-11T00:00:00Z" }, "UTC") // [] — not an ISO weekday
48
54
  * @example recurringWindows({ 1: [{ from: "9am", to: "17:00" }] }, { start: "2024-06-10T00:00:00Z", end: "2024-06-11T00:00:00Z" }, "UTC") // [] — malformed window
49
55
  * @example recurringWindows({ 1: [{ from: "09:00", to: "17:00" }] }, { start: "2024-06-10T00:00:00Z", end: "2024-06-11T00:00:00Z" }, "Invalid/Zone") // []
56
+ * @example recurringWindows({ 4: [{ from: "08:00", to: "17:00" }] }, { start: "1970-01-01T00:00:00Z", end: "1970-01-02T00:00:00Z" }, "-00:44:30") // [{ start: "1970-01-01T08:44:30Z", end: "1970-01-01T17:44:30Z" }]
50
57
  */
51
58
  export declare function recurringWindows(weekly: OperatingSchedule["weekly"], range: Interval, timeZone: string, optionsArg?: {
52
59
  /**
@@ -1,6 +1,5 @@
1
- import { parseIntervalNanoseconds } from "../../internal/index.js";
1
+ import { parseIntervalNanoseconds, zoneFrame } from "../../internal/index.js";
2
2
  import { parseScheduleDisambiguation, parseWeeklyPattern, scheduleRunsWithin, } from "../../internal/operatingSchedule.js";
3
- import { isValidTimeZone } from "../../zoned/validate/index.js";
4
3
  /**
5
4
  * Return the instants a weekly pattern of local windows is open inside `range`, read in
6
5
  * `timeZone`: the primitive under operating hours, curfews and recurring crew windows.
@@ -33,10 +32,16 @@ import { isValidTimeZone } from "../../zoned/validate/index.js";
33
32
  * `range` is not a valid `Interval`, when `timeZone` is invalid, when `disambiguation` is not
34
33
  * one of the four values, and when the range spans more than 10,000 local dates (about 27
35
34
  * years) counted from the date `range.start` falls on, rather than a truncated list.
35
+ * - **Limit at an offset with seconds.** The instant is placed in the offset's whole-minute zone,
36
+ * moved by its seconds, and the moved instant must be inside Temporal's range. So within the
37
+ * offset's seconds (under a minute) of the first instant Temporal supports
38
+ * (`-271821-04-20T00:00:00Z`), for an offset west of UTC, this returns `[]`. An offset to the
39
+ * minute has no such limit.
36
40
  *
37
41
  * @param weekly windows by ISO weekday, `{ 1: [{ from: "09:00", to: "17:00" }], … }`
38
42
  * @param range `{ start, end }` record of ISO 8601 instant strings to expand the pattern inside
39
- * @param timeZone IANA name or UTC offset the windows are read in
43
+ * @param timeZone IANA name or UTC offset the windows are read in: a time zone identifier
44
+ * (`+05:30`, `+0530`, `-08`) or a stored offset (`±HH:MM[:SS]`, what `getTimeZoneOffset` returns)
40
45
  * @param optionsArg How a window edge on a clock change is resolved
41
46
  * @returns sorted, merged `{ start, end }` records of the open instants, or [] on invalid input
42
47
  *
@@ -49,21 +54,24 @@ import { isValidTimeZone } from "../../zoned/validate/index.js";
49
54
  * @example recurringWindows({ 8: [{ from: "09:00", to: "17:00" }] }, { start: "2024-06-10T00:00:00Z", end: "2024-06-11T00:00:00Z" }, "UTC") // [] — not an ISO weekday
50
55
  * @example recurringWindows({ 1: [{ from: "9am", to: "17:00" }] }, { start: "2024-06-10T00:00:00Z", end: "2024-06-11T00:00:00Z" }, "UTC") // [] — malformed window
51
56
  * @example recurringWindows({ 1: [{ from: "09:00", to: "17:00" }] }, { start: "2024-06-10T00:00:00Z", end: "2024-06-11T00:00:00Z" }, "Invalid/Zone") // []
57
+ * @example recurringWindows({ 4: [{ from: "08:00", to: "17:00" }] }, { start: "1970-01-01T00:00:00Z", end: "1970-01-02T00:00:00Z" }, "-00:44:30") // [{ start: "1970-01-01T08:44:30Z", end: "1970-01-01T17:44:30Z" }]
52
58
  */
53
59
  export function recurringWindows(weekly, range, timeZone, optionsArg) {
54
60
  try {
55
61
  const disambiguation = parseScheduleDisambiguation(optionsArg);
56
62
  const weeklyWindows = parseWeeklyPattern(weekly);
57
63
  const bounds = parseIntervalNanoseconds(range);
64
+ const frame = zoneFrame(timeZone);
58
65
  if (disambiguation === null ||
59
66
  weeklyWindows === null ||
60
67
  bounds === null ||
61
68
  typeof timeZone !== "string" ||
62
- !isValidTimeZone(timeZone)) {
69
+ frame === null) {
63
70
  return [];
64
71
  }
65
72
  const runs = scheduleRunsWithin({
66
73
  timeZone,
74
+ frame,
67
75
  weekly: weeklyWindows,
68
76
  holidays: new Set(),
69
77
  overrides: new Map(),
@@ -0,0 +1,47 @@
1
+ import type { DateTimeDurationUnit } from "../../types/index.js";
2
+ /**
3
+ * Write an amount given as a unit object, such as `{ minutes: 15 }`, as an ISO 8601 duration
4
+ * string.
5
+ *
6
+ * - Uses Temporal.Duration.from to read the fields, then .toString() to write them.
7
+ * - Which function to use: `durationFromUnits` turns a unit object into the duration string that
8
+ * the other duration functions take. `totalUnits` totals a unit object of exact units in one
9
+ * call. `totalDuration` totals a duration string.
10
+ * - Takes all ten units, from years down to nanoseconds: writing a year, a month or a week needs
11
+ * no date to measure from. To total a calendar amount, pass the result to `totalDuration` with
12
+ * `relativeTo`.
13
+ * - Years down to minutes are written as given, and nothing is carried into a larger unit:
14
+ * `{ minutes: 90 }` is "PT90M". `normalizeDuration` with `largestUnit` carries it.
15
+ * - Seconds, milliseconds, microseconds and nanoseconds are written together as one decimal
16
+ * number of seconds, as Temporal's `Duration.prototype.toString` writes them:
17
+ * `{ milliseconds: 1500 }` is "PT1.5S". Reading that string back gives 1 second and 500
18
+ * milliseconds.
19
+ * - A zero amount is "PT0S", the one spelling Temporal writes for every zero duration.
20
+ * - Every key is a unit name in the plural, and every amount is a whole finite number. All
21
+ * nonzero amounts share one sign, as Temporal requires of a duration. A unit set to `undefined`
22
+ * is absent, as Temporal reads it.
23
+ * - An unknown key returns "", even beside a valid one. Temporal on its own ignores an unknown
24
+ * key, so a misspelt `{ minutes: 15, hour: 1 }` would be written "PT15M" with no warning.
25
+ * - Returns "" on an object with no unit, a non-object `units` (a duration string included), an
26
+ * invalid amount, or an amount past Temporal's duration range.
27
+ *
28
+ * @param units Partial<Record<DateTimeDurationUnit, number>> object holding the amount to write
29
+ * @returns ISO 8601 duration string, or "" on invalid input
30
+ *
31
+ * @example durationFromUnits({ minutes: 15 }) // "PT15M"
32
+ * @example durationFromUnits({ days: 1, hours: 12 }) // "P1DT12H"
33
+ * @example durationFromUnits({ minutes: 90 }) // "PT90M" (not carried into hours)
34
+ * @example durationFromUnits({ years: 1, months: 2 }) // "P1Y2M"
35
+ * @example durationFromUnits({ weeks: 1 }) // "P1W"
36
+ * @example durationFromUnits({ milliseconds: 1500 }) // "PT1.5S"
37
+ * @example durationFromUnits({ seconds: 59, milliseconds: 1500 }) // "PT60.5S" (one decimal number of seconds)
38
+ * @example durationFromUnits({ minutes: 15, hours: undefined }) // "PT15M" (an undefined unit is absent)
39
+ * @example durationFromUnits({ minutes: -15 }) // "-PT15M"
40
+ * @example durationFromUnits({ minutes: 0 }) // "PT0S"
41
+ * @example durationFromUnits({ minutes: 15, hour: 1 }) // "" (unknown key "hour")
42
+ * @example durationFromUnits({ minutes: 1.5 }) // "" (fractional amount)
43
+ * @example durationFromUnits({ hours: 1, minutes: -30 }) // "" (mixed signs)
44
+ * @example durationFromUnits({}) // ""
45
+ * @example durationFromUnits("PT15M") // "" (already a duration string)
46
+ */
47
+ export declare function durationFromUnits(units: Partial<Record<DateTimeDurationUnit, number>>): string;