@northguild/gmt 1.17.0 → 1.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (638) hide show
  1. package/README.md +462 -22
  2. package/dist/calendar/calculate/bucketRange.d.ts +3 -3
  3. package/dist/calendar/calculate/bucketRange.js +6 -6
  4. package/dist/calendar/calculate/floorToZone.d.ts +5 -3
  5. package/dist/calendar/calculate/floorToZone.js +6 -5
  6. package/dist/calendar/calculate/getFiscalPeriod.d.ts +21 -8
  7. package/dist/calendar/calculate/getFiscalPeriod.js +9 -8
  8. package/dist/calendar/calculate/getIsoWeekDate.d.ts +10 -5
  9. package/dist/calendar/calculate/getIsoWeekDate.js +1 -5
  10. package/dist/calendar/calculate/getOrdinalDate.d.ts +10 -3
  11. package/dist/calendar/calculate/getOrdinalDate.js +2 -3
  12. package/dist/calendar/calculate/getQuarter.d.ts +21 -9
  13. package/dist/calendar/calculate/getQuarter.js +8 -12
  14. package/dist/calendar/hours/addOperatingTime.d.ts +53 -0
  15. package/dist/calendar/hours/addOperatingTime.js +59 -0
  16. package/dist/calendar/hours/index.d.ts +7 -0
  17. package/dist/calendar/hours/index.js +7 -0
  18. package/dist/calendar/hours/isOpenAt.d.ts +39 -0
  19. package/dist/calendar/hours/isOpenAt.js +44 -0
  20. package/dist/calendar/hours/nextCloseAt.d.ts +49 -0
  21. package/dist/calendar/hours/nextCloseAt.js +51 -0
  22. package/dist/calendar/hours/nextOpenAt.d.ts +45 -0
  23. package/dist/calendar/hours/nextOpenAt.js +47 -0
  24. package/dist/calendar/hours/operatingIntervals.d.ts +43 -0
  25. package/dist/calendar/hours/operatingIntervals.js +52 -0
  26. package/dist/calendar/hours/operatingTimeBetween.d.ts +40 -0
  27. package/dist/calendar/hours/operatingTimeBetween.js +49 -0
  28. package/dist/calendar/hours/recurringWindows.d.ts +61 -0
  29. package/dist/calendar/hours/recurringWindows.js +80 -0
  30. package/dist/calendar/index.d.ts +1 -0
  31. package/dist/calendar/index.js +1 -0
  32. package/dist/duration/calculate/durationAs.d.ts +13 -8
  33. package/dist/duration/calculate/durationAs.js +4 -8
  34. package/dist/duration/compare/compareDurations.d.ts +12 -6
  35. package/dist/duration/compare/compareDurations.js +3 -6
  36. package/dist/duration/format/formatDuration.d.ts +16 -4
  37. package/dist/duration/format/formatDuration.js +4 -5
  38. package/dist/duration/normalize/normalizeDuration.d.ts +39 -14
  39. package/dist/duration/normalize/normalizeDuration.js +6 -15
  40. package/dist/duration/parse/parseDuration.d.ts +21 -3
  41. package/dist/duration/parse/parseDuration.js +1 -3
  42. package/dist/instant/convert/classifyLocal.d.ts +1 -1
  43. package/dist/instant/convert/classifyLocal.js +1 -1
  44. package/dist/instant/convert/fromOffsetInstant.d.ts +3 -1
  45. package/dist/instant/convert/fromOffsetInstant.js +3 -1
  46. package/dist/instant/convert/resolveLocal.d.ts +12 -7
  47. package/dist/instant/convert/resolveLocal.js +6 -10
  48. package/dist/instant/convert/toOffsetInstant.d.ts +22 -9
  49. package/dist/instant/convert/toOffsetInstant.js +10 -3
  50. package/dist/intermodal/calculate/billingTimeline.d.ts +31 -11
  51. package/dist/intermodal/calculate/billingTimeline.js +2 -2
  52. package/dist/intermodal/calculate/chargeableDays.d.ts +13 -11
  53. package/dist/intermodal/calculate/chargeableDays.js +4 -9
  54. package/dist/intermodal/calculate/demurrageClock.d.ts +16 -7
  55. package/dist/intermodal/calculate/demurrageClock.js +7 -7
  56. package/dist/intermodal/calculate/freeTimeExpiry.d.ts +5 -4
  57. package/dist/intermodal/calculate/freeTimeExpiry.js +6 -6
  58. package/dist/internal/businessCalendar.d.ts +5 -0
  59. package/dist/internal/businessCalendar.js +5 -1
  60. package/dist/internal/cycleFieldValue.d.ts +6 -4
  61. package/dist/internal/cycleFieldValue.js +6 -4
  62. package/dist/internal/daylightTime.d.ts +33 -0
  63. package/dist/internal/daylightTime.js +164 -0
  64. package/dist/internal/durationUntilString.js +4 -3
  65. package/dist/internal/englishCalendarNames.js +1 -2
  66. package/dist/internal/epochNanoseconds.d.ts +2 -0
  67. package/dist/internal/epochNanoseconds.js +2 -0
  68. package/dist/internal/exactDuration.d.ts +37 -0
  69. package/dist/internal/exactDuration.js +64 -0
  70. package/dist/internal/exactMoment.d.ts +72 -0
  71. package/dist/internal/exactMoment.js +114 -0
  72. package/dist/internal/fiscalCalendar.d.ts +4 -3
  73. package/dist/internal/fiscalCalendar.js +4 -3
  74. package/dist/internal/formatCalendarDays.d.ts +2 -2
  75. package/dist/internal/formatRelativeDuration.d.ts +21 -1
  76. package/dist/internal/formatRelativeDuration.js +47 -7
  77. package/dist/internal/index.d.ts +9 -4
  78. package/dist/internal/index.js +9 -4
  79. package/dist/internal/instantFormatOptions.js +2 -1
  80. package/dist/internal/instantNanoseconds.d.ts +75 -9
  81. package/dist/internal/instantNanoseconds.js +192 -11
  82. package/dist/internal/joinDateTimeConnector.d.ts +1 -1
  83. package/dist/internal/monthGridWeekRow.d.ts +2 -1
  84. package/dist/internal/monthGridWeekRow.js +2 -1
  85. package/dist/internal/normalizeTimeZone.d.ts +2 -2
  86. package/dist/internal/normalizeTimeZone.js +2 -2
  87. package/dist/internal/operatingSchedule.d.ts +129 -0
  88. package/dist/internal/operatingSchedule.js +668 -0
  89. package/dist/internal/optionOrDefault.d.ts +18 -0
  90. package/dist/internal/optionOrDefault.js +20 -0
  91. package/dist/internal/patternToken.d.ts +2 -2
  92. package/dist/internal/patternToken.js +28 -13
  93. package/dist/internal/plainDateUntil.js +10 -6
  94. package/dist/internal/punctuality.d.ts +38 -0
  95. package/dist/internal/punctuality.js +59 -0
  96. package/dist/internal/readDateTimeFormatOptions.d.ts +30 -0
  97. package/dist/internal/readDateTimeFormatOptions.js +93 -0
  98. package/dist/internal/resolveDurationRelativeTo.d.ts +4 -0
  99. package/dist/internal/resolveDurationRelativeTo.js +11 -1
  100. package/dist/internal/resolveRelativeRounding.d.ts +17 -6
  101. package/dist/internal/resolveRelativeRounding.js +27 -7
  102. package/dist/internal/resolveRelativeUnit.d.ts +30 -0
  103. package/dist/internal/resolveRelativeUnit.js +40 -0
  104. package/dist/internal/splitStep.d.ts +24 -1
  105. package/dist/internal/splitStep.js +34 -2
  106. package/dist/internal/startOrEndOfZoned.js +2 -3
  107. package/dist/internal/temporalCompat/capabilities.d.ts +26 -0
  108. package/dist/internal/temporalCompat/capabilities.js +35 -3
  109. package/dist/internal/temporalCompat/fieldSearch.js +1 -1
  110. package/dist/internal/temporalCompat/index.d.ts +1 -1
  111. package/dist/internal/temporalCompat/index.js +1 -1
  112. package/dist/internal/temporalCompat/repros.d.ts +1 -1
  113. package/dist/internal/temporalCompat/repros.js +157 -0
  114. package/dist/internal/timestampEvents.d.ts +32 -0
  115. package/dist/internal/timestampEvents.js +76 -0
  116. package/dist/internal/utcZonedDateTime.d.ts +5 -2
  117. package/dist/internal/utcZonedDateTime.js +8 -5
  118. package/dist/internal/zonedBucket.js +8 -6
  119. package/dist/internal/zonedLocalDates.js +1 -1
  120. package/dist/internal/zonedTransitionSearch.d.ts +27 -0
  121. package/dist/internal/zonedTransitionSearch.js +218 -0
  122. package/dist/internal/zonedWallClock.d.ts +21 -7
  123. package/dist/internal/zonedWallClock.js +87 -18
  124. package/dist/internal/zonedWallClockOperations.d.ts +26 -13
  125. package/dist/internal/zonedWallClockOperations.js +87 -34
  126. package/dist/interval/validate/isValidInterval.d.ts +6 -3
  127. package/dist/interval/validate/isValidInterval.js +6 -3
  128. package/dist/plain/calculate/addDate.d.ts +11 -8
  129. package/dist/plain/calculate/addDate.js +5 -8
  130. package/dist/plain/calculate/addDateTime.d.ts +7 -4
  131. package/dist/plain/calculate/addDateTime.js +1 -4
  132. package/dist/plain/calculate/cycleDate.d.ts +16 -7
  133. package/dist/plain/calculate/cycleDate.js +3 -7
  134. package/dist/plain/calculate/cycleDateTime.d.ts +14 -4
  135. package/dist/plain/calculate/cycleDateTime.js +1 -4
  136. package/dist/plain/calculate/cycleTime.d.ts +10 -5
  137. package/dist/plain/calculate/cycleTime.js +3 -5
  138. package/dist/plain/calculate/diffDate.d.ts +1 -1
  139. package/dist/plain/calculate/diffDate.js +1 -1
  140. package/dist/plain/calculate/diffDateAsDuration.d.ts +1 -1
  141. package/dist/plain/calculate/diffDateAsDuration.js +1 -1
  142. package/dist/plain/calculate/diffDateTime.d.ts +1 -1
  143. package/dist/plain/calculate/diffDateTime.js +1 -1
  144. package/dist/plain/calculate/diffDateTimeAsDuration.d.ts +1 -1
  145. package/dist/plain/calculate/diffDateTimeAsDuration.js +1 -1
  146. package/dist/plain/calculate/diffTime.d.ts +1 -1
  147. package/dist/plain/calculate/diffTime.js +1 -1
  148. package/dist/plain/calculate/endOfDate.d.ts +8 -3
  149. package/dist/plain/calculate/endOfDate.js +1 -3
  150. package/dist/plain/calculate/endOfDateTime.d.ts +15 -5
  151. package/dist/plain/calculate/endOfDateTime.js +1 -5
  152. package/dist/plain/calculate/endOfTime.d.ts +8 -2
  153. package/dist/plain/calculate/endOfTime.js +1 -2
  154. package/dist/plain/calculate/getLocaleWeekYear.d.ts +16 -9
  155. package/dist/plain/calculate/getLocaleWeekYear.js +9 -9
  156. package/dist/plain/calculate/getWeekOfMonth.d.ts +7 -4
  157. package/dist/plain/calculate/getWeekOfMonth.js +7 -4
  158. package/dist/plain/calculate/getWeeksInLocaleWeekYear.d.ts +13 -6
  159. package/dist/plain/calculate/getWeeksInLocaleWeekYear.js +6 -6
  160. package/dist/plain/calculate/getWeeksInMonth.d.ts +5 -2
  161. package/dist/plain/calculate/getWeeksInMonth.js +5 -2
  162. package/dist/plain/calculate/nextWeekday.d.ts +7 -3
  163. package/dist/plain/calculate/nextWeekday.js +1 -3
  164. package/dist/plain/calculate/previousWeekday.d.ts +7 -3
  165. package/dist/plain/calculate/previousWeekday.js +1 -3
  166. package/dist/plain/calculate/roundDate.d.ts +20 -7
  167. package/dist/plain/calculate/roundDate.js +3 -10
  168. package/dist/plain/calculate/roundDateTime.d.ts +22 -8
  169. package/dist/plain/calculate/roundDateTime.js +3 -11
  170. package/dist/plain/calculate/roundTime.d.ts +20 -4
  171. package/dist/plain/calculate/roundTime.js +3 -7
  172. package/dist/plain/calculate/setDate.d.ts +7 -5
  173. package/dist/plain/calculate/setDate.js +1 -5
  174. package/dist/plain/calculate/setDateTime.d.ts +8 -5
  175. package/dist/plain/calculate/setDateTime.js +1 -5
  176. package/dist/plain/calculate/setTime.d.ts +10 -6
  177. package/dist/plain/calculate/setTime.js +4 -6
  178. package/dist/plain/calculate/startOfDate.d.ts +8 -2
  179. package/dist/plain/calculate/startOfDate.js +1 -2
  180. package/dist/plain/calculate/startOfDateTime.d.ts +15 -2
  181. package/dist/plain/calculate/startOfDateTime.js +1 -2
  182. package/dist/plain/calculate/startOfTime.d.ts +8 -1
  183. package/dist/plain/calculate/startOfTime.js +1 -1
  184. package/dist/plain/calculate/subtractDate.d.ts +7 -4
  185. package/dist/plain/calculate/subtractDate.js +1 -4
  186. package/dist/plain/calculate/subtractDateTime.d.ts +7 -4
  187. package/dist/plain/calculate/subtractDateTime.js +1 -4
  188. package/dist/plain/compare/areDateTimesEqualBy.d.ts +13 -5
  189. package/dist/plain/compare/areDateTimesEqualBy.js +6 -5
  190. package/dist/plain/compare/areDatesEqualBy.d.ts +15 -6
  191. package/dist/plain/compare/areDatesEqualBy.js +8 -6
  192. package/dist/plain/compare/isBetweenDate.d.ts +13 -2
  193. package/dist/plain/compare/isBetweenDate.js +4 -4
  194. package/dist/plain/compare/isBetweenDateTime.d.ts +13 -2
  195. package/dist/plain/compare/isBetweenDateTime.js +4 -4
  196. package/dist/plain/compare/isBetweenTime.d.ts +13 -2
  197. package/dist/plain/compare/isBetweenTime.js +4 -4
  198. package/dist/plain/compare/isRelativeDay.d.ts +1 -1
  199. package/dist/plain/compare/isRelativeDay.js +1 -1
  200. package/dist/plain/compare/isThisUnit.d.ts +1 -1
  201. package/dist/plain/compare/isThisUnit.js +1 -1
  202. package/dist/plain/format/formatCalendar.d.ts +21 -14
  203. package/dist/plain/format/formatCalendar.js +21 -16
  204. package/dist/plain/format/formatDate.js +5 -3
  205. package/dist/plain/format/formatDateRange.js +4 -2
  206. package/dist/plain/format/formatDateTime.js +4 -2
  207. package/dist/plain/format/formatDateTimeRange.js +4 -2
  208. package/dist/plain/format/formatDateTimeToParts.d.ts +15 -4
  209. package/dist/plain/format/formatDateTimeToParts.js +10 -6
  210. package/dist/plain/format/formatDateToParts.d.ts +13 -2
  211. package/dist/plain/format/formatDateToParts.js +8 -4
  212. package/dist/plain/format/formatRelativeDate.d.ts +16 -3
  213. package/dist/plain/format/formatRelativeDate.js +26 -15
  214. package/dist/plain/format/formatRelativeDateTime.d.ts +16 -3
  215. package/dist/plain/format/formatRelativeDateTime.js +8 -5
  216. package/dist/plain/format/formatRelativeTime.d.ts +16 -3
  217. package/dist/plain/format/formatRelativeTime.js +21 -13
  218. package/dist/plain/format/formatTime.js +4 -2
  219. package/dist/plain/interval/intervalDifferenceDate.d.ts +9 -0
  220. package/dist/plain/interval/intervalDifferenceDateTime.d.ts +9 -0
  221. package/dist/plain/interval/intervalDifferenceTime.d.ts +9 -0
  222. package/dist/plain/interval/intervalDivideEquallyDate.d.ts +19 -4
  223. package/dist/plain/interval/intervalDivideEquallyDate.js +3 -4
  224. package/dist/plain/interval/intervalDivideEquallyDateTime.d.ts +19 -4
  225. package/dist/plain/interval/intervalDivideEquallyDateTime.js +3 -4
  226. package/dist/plain/interval/intervalDivideEquallyTime.d.ts +19 -4
  227. package/dist/plain/interval/intervalDivideEquallyTime.js +3 -4
  228. package/dist/plain/interval/intervalFromDurationDate.d.ts +16 -3
  229. package/dist/plain/interval/intervalFromDurationDate.js +1 -3
  230. package/dist/plain/interval/intervalFromDurationDateTime.d.ts +16 -3
  231. package/dist/plain/interval/intervalFromDurationDateTime.js +1 -3
  232. package/dist/plain/interval/intervalFromDurationTime.d.ts +9 -0
  233. package/dist/plain/interval/intervalIntersectionDate.d.ts +9 -0
  234. package/dist/plain/interval/intervalIntersectionDateTime.d.ts +9 -0
  235. package/dist/plain/interval/intervalIntersectionTime.d.ts +9 -0
  236. package/dist/plain/interval/intervalSplitAtDate.d.ts +11 -0
  237. package/dist/plain/interval/intervalSplitAtDate.js +2 -0
  238. package/dist/plain/interval/intervalSplitAtDateTime.d.ts +11 -0
  239. package/dist/plain/interval/intervalSplitAtDateTime.js +2 -0
  240. package/dist/plain/interval/intervalSplitAtTime.d.ts +11 -0
  241. package/dist/plain/interval/intervalSplitAtTime.js +2 -0
  242. package/dist/plain/interval/intervalUnionDate.d.ts +9 -0
  243. package/dist/plain/interval/intervalUnionDateTime.d.ts +9 -0
  244. package/dist/plain/interval/intervalUnionTime.d.ts +9 -0
  245. package/dist/plain/interval/intervalXorAllDate.d.ts +9 -0
  246. package/dist/plain/interval/intervalXorAllDateTime.d.ts +9 -0
  247. package/dist/plain/interval/intervalXorAllTime.d.ts +9 -0
  248. package/dist/plain/interval/intervalXorDate.d.ts +9 -0
  249. package/dist/plain/interval/intervalXorDateTime.d.ts +9 -0
  250. package/dist/plain/interval/intervalXorTime.d.ts +9 -0
  251. package/dist/plain/interval/mergeIntervalsDate.d.ts +9 -0
  252. package/dist/plain/interval/mergeIntervalsDateTime.d.ts +9 -0
  253. package/dist/plain/interval/mergeIntervalsTime.d.ts +9 -0
  254. package/dist/plain/interval/splitIntervalByUnitDate.d.ts +23 -7
  255. package/dist/plain/interval/splitIntervalByUnitDate.js +7 -7
  256. package/dist/plain/interval/splitIntervalByUnitDateTime.d.ts +22 -6
  257. package/dist/plain/interval/splitIntervalByUnitDateTime.js +6 -6
  258. package/dist/plain/interval/splitIntervalByUnitTime.d.ts +17 -4
  259. package/dist/plain/interval/splitIntervalByUnitTime.js +1 -4
  260. package/dist/plain/map/mapDatesInRange.d.ts +8 -4
  261. package/dist/plain/map/mapDatesInRange.js +1 -4
  262. package/dist/plain/parse/parseDateTimeWithPattern.d.ts +10 -7
  263. package/dist/plain/parse/parseDateTimeWithPattern.js +10 -7
  264. package/dist/plain/parse/parseDateWithPattern.d.ts +10 -7
  265. package/dist/plain/parse/parseDateWithPattern.js +10 -7
  266. package/dist/plain/parse/parseTimeWithPattern.d.ts +10 -7
  267. package/dist/plain/parse/parseTimeWithPattern.js +10 -7
  268. package/dist/plain/parse/parseUnitFromDate.d.ts +11 -3
  269. package/dist/plain/parse/parseUnitFromDate.js +3 -3
  270. package/dist/plain/parse/parseUnitFromDateTime.d.ts +11 -3
  271. package/dist/plain/parse/parseUnitFromDateTime.js +3 -3
  272. package/dist/plain/parse/parseWeekFromDate.d.ts +10 -6
  273. package/dist/plain/parse/parseWeekFromDate.js +2 -6
  274. package/dist/plain/parse/parseWeekFromDateTime.d.ts +10 -6
  275. package/dist/plain/parse/parseWeekFromDateTime.js +2 -6
  276. package/dist/plain/validate/isValidDateRange.d.ts +19 -4
  277. package/dist/plain/validate/isValidDateRange.js +1 -4
  278. package/dist/plain/validate/isValidDateTimeRange.d.ts +20 -5
  279. package/dist/plain/validate/isValidDateTimeRange.js +2 -5
  280. package/dist/plain/validate/isValidTimeRange.d.ts +20 -5
  281. package/dist/plain/validate/isValidTimeRange.js +2 -5
  282. package/dist/precision/convert/fromExcelSerial.d.ts +10 -4
  283. package/dist/precision/convert/fromExcelSerial.js +4 -5
  284. package/dist/precision/convert/fromNanoseconds.d.ts +1 -1
  285. package/dist/precision/convert/fromNanoseconds.js +1 -1
  286. package/dist/precision/convert/toExcelSerial.d.ts +9 -3
  287. package/dist/precision/convert/toExcelSerial.js +3 -4
  288. package/dist/precision/convert/toNanoseconds.d.ts +11 -6
  289. package/dist/precision/convert/toNanoseconds.js +11 -6
  290. package/dist/precision/validate/isValidInstant.d.ts +12 -3
  291. package/dist/precision/validate/isValidInstant.js +12 -3
  292. package/dist/span/calculate/spanMs.d.ts +10 -4
  293. package/dist/span/calculate/spanMs.js +10 -4
  294. package/dist/span/calculate/spanNs.d.ts +10 -4
  295. package/dist/span/calculate/spanNs.js +10 -4
  296. package/dist/span/validate/isValidSpan.d.ts +8 -3
  297. package/dist/span/validate/isValidSpan.js +8 -3
  298. package/dist/transport/calculate/bestAvailable.d.ts +47 -0
  299. package/dist/transport/calculate/bestAvailable.js +76 -0
  300. package/dist/transport/calculate/crossingTime.d.ts +58 -0
  301. package/dist/transport/calculate/crossingTime.js +76 -0
  302. package/dist/transport/calculate/cutoffAt.d.ts +90 -0
  303. package/dist/transport/calculate/cutoffAt.js +209 -0
  304. package/dist/transport/calculate/cutoffSchedule.d.ts +70 -0
  305. package/dist/transport/calculate/cutoffSchedule.js +71 -0
  306. package/dist/transport/calculate/dwellTime.d.ts +16 -7
  307. package/dist/transport/calculate/dwellTime.js +12 -8
  308. package/dist/transport/calculate/estimateDrift.d.ts +65 -0
  309. package/dist/transport/calculate/estimateDrift.js +75 -0
  310. package/dist/transport/calculate/index.d.ts +8 -0
  311. package/dist/transport/calculate/index.js +8 -0
  312. package/dist/transport/calculate/nextDeparture.d.ts +78 -0
  313. package/dist/transport/calculate/nextDeparture.js +131 -0
  314. package/dist/transport/calculate/punctualityRate.d.ts +42 -0
  315. package/dist/transport/calculate/punctualityRate.js +59 -0
  316. package/dist/transport/calculate/scheduleDelivery.d.ts +150 -0
  317. package/dist/transport/calculate/scheduleDelivery.js +300 -0
  318. package/dist/transport/calculate/transitTime.d.ts +21 -3
  319. package/dist/transport/calculate/transitTime.js +29 -46
  320. package/dist/transport/compare/classifyPunctuality.d.ts +46 -0
  321. package/dist/transport/compare/classifyPunctuality.js +64 -0
  322. package/dist/transport/compare/index.d.ts +4 -0
  323. package/dist/transport/compare/index.js +4 -0
  324. package/dist/transport/compare/isPastCutoff.d.ts +33 -0
  325. package/dist/transport/compare/isPastCutoff.js +48 -0
  326. package/dist/transport/compare/scheduleDeviation.d.ts +37 -0
  327. package/dist/transport/compare/scheduleDeviation.js +53 -0
  328. package/dist/transport/compare/timeToCutoff.d.ts +31 -0
  329. package/dist/transport/compare/timeToCutoff.js +47 -0
  330. package/dist/transport/convert/etaAtZone.d.ts +7 -0
  331. package/dist/transport/convert/etaAtZone.js +9 -4
  332. package/dist/transport/index.d.ts +1 -0
  333. package/dist/transport/index.js +1 -0
  334. package/dist/types/business-calendar.d.ts +19 -14
  335. package/dist/types/calendar-options.d.ts +15 -3
  336. package/dist/types/date-cycle-field.d.ts +5 -0
  337. package/dist/types/date-duration-unit.d.ts +4 -0
  338. package/dist/types/date-time-cycle-field.d.ts +4 -0
  339. package/dist/types/date-time-duration-units.d.ts +4 -0
  340. package/dist/types/date-time-unit.d.ts +4 -0
  341. package/dist/types/date-unit.d.ts +4 -0
  342. package/dist/types/disambiguation.d.ts +8 -0
  343. package/dist/types/duration-relative-to.d.ts +8 -0
  344. package/dist/types/duration-string-options.d.ts +28 -0
  345. package/dist/types/fiscal-calendar.d.ts +1 -1
  346. package/dist/types/fractional-digit.d.ts +5 -0
  347. package/dist/types/free-time-options.d.ts +21 -11
  348. package/dist/types/index.d.ts +2 -1
  349. package/dist/types/index.js +2 -1
  350. package/dist/types/interval.d.ts +8 -1
  351. package/dist/types/offset.d.ts +9 -0
  352. package/dist/types/operating-schedule.d.ts +71 -0
  353. package/dist/types/overflow.d.ts +6 -0
  354. package/dist/types/relative-rounding-method.d.ts +6 -0
  355. package/dist/types/relative-time-options.d.ts +33 -5
  356. package/dist/types/rounding-options.d.ts +27 -0
  357. package/dist/types/time-cycle-field.d.ts +4 -0
  358. package/dist/types/time-duration-unit.d.ts +4 -0
  359. package/dist/types/time-unit.d.ts +4 -0
  360. package/dist/types/transport-timestamps.d.ts +54 -0
  361. package/dist/types/transport-timestamps.js +0 -0
  362. package/dist/unix/calculate/addUnix.d.ts +19 -5
  363. package/dist/unix/calculate/addUnix.js +1 -5
  364. package/dist/unix/calculate/diffUnix.d.ts +13 -3
  365. package/dist/unix/calculate/diffUnix.js +1 -3
  366. package/dist/unix/calculate/diffUnixAsDuration.d.ts +13 -3
  367. package/dist/unix/calculate/diffUnixAsDuration.js +1 -3
  368. package/dist/unix/calculate/endOfQuarterForUnix.d.ts +13 -3
  369. package/dist/unix/calculate/endOfQuarterForUnix.js +1 -3
  370. package/dist/unix/calculate/endOfUnix.d.ts +20 -4
  371. package/dist/unix/calculate/endOfUnix.js +1 -4
  372. package/dist/unix/calculate/isBetweenUnix.d.ts +26 -4
  373. package/dist/unix/calculate/isBetweenUnix.js +4 -6
  374. package/dist/unix/calculate/roundUnix.d.ts +31 -3
  375. package/dist/unix/calculate/roundUnix.js +3 -6
  376. package/dist/unix/calculate/setUnix.d.ts +35 -9
  377. package/dist/unix/calculate/setUnix.js +4 -13
  378. package/dist/unix/calculate/startOfQuarterForUnix.d.ts +13 -3
  379. package/dist/unix/calculate/startOfQuarterForUnix.js +1 -3
  380. package/dist/unix/calculate/startOfUnix.d.ts +20 -4
  381. package/dist/unix/calculate/startOfUnix.js +1 -4
  382. package/dist/unix/calculate/subtractUnix.d.ts +19 -5
  383. package/dist/unix/calculate/subtractUnix.js +1 -5
  384. package/dist/unix/compare/areUnixEqual.d.ts +7 -1
  385. package/dist/unix/compare/areUnixEqual.js +1 -1
  386. package/dist/unix/compare/areUnixEqualBy.d.ts +24 -7
  387. package/dist/unix/compare/areUnixEqualBy.js +13 -9
  388. package/dist/unix/compare/isAfterUnix.d.ts +7 -1
  389. package/dist/unix/compare/isAfterUnix.js +1 -1
  390. package/dist/unix/compare/isBeforeUnix.d.ts +7 -1
  391. package/dist/unix/compare/isBeforeUnix.js +1 -1
  392. package/dist/unix/convert/convertUnixToPlainDate.d.ts +14 -4
  393. package/dist/unix/convert/convertUnixToPlainDate.js +2 -4
  394. package/dist/unix/convert/convertUnixToPlainDateTime.d.ts +14 -4
  395. package/dist/unix/convert/convertUnixToPlainDateTime.js +2 -4
  396. package/dist/unix/convert/convertUnixToPlainTime.d.ts +14 -4
  397. package/dist/unix/convert/convertUnixToPlainTime.js +2 -4
  398. package/dist/unix/convert/convertUnixToUtc.d.ts +9 -4
  399. package/dist/unix/convert/convertUnixToUtc.js +3 -4
  400. package/dist/unix/convert/convertUnixToZoned.d.ts +10 -5
  401. package/dist/unix/convert/convertUnixToZoned.js +4 -5
  402. package/dist/unix/format/formatCalendarUnix.d.ts +27 -19
  403. package/dist/unix/format/formatCalendarUnix.js +4 -5
  404. package/dist/unix/format/formatRelativeUnix.d.ts +54 -5
  405. package/dist/unix/format/formatRelativeUnix.js +3 -5
  406. package/dist/unix/format/formatUnix.d.ts +24 -6
  407. package/dist/unix/format/formatUnix.js +8 -7
  408. package/dist/unix/get/getUnixNow.d.ts +8 -3
  409. package/dist/unix/get/getUnixNow.js +1 -3
  410. package/dist/unix/interval/intervalCountUnix.d.ts +14 -5
  411. package/dist/unix/interval/intervalCountUnix.js +2 -5
  412. package/dist/unix/interval/intervalDifferenceUnix.d.ts +6 -0
  413. package/dist/unix/interval/intervalDivideEquallyUnix.d.ts +18 -4
  414. package/dist/unix/interval/intervalDivideEquallyUnix.js +5 -4
  415. package/dist/unix/interval/intervalFromDurationUnix.d.ts +33 -5
  416. package/dist/unix/interval/intervalFromDurationUnix.js +6 -5
  417. package/dist/unix/interval/intervalIntersectionUnix.d.ts +6 -0
  418. package/dist/unix/interval/intervalLengthUnix.d.ts +16 -6
  419. package/dist/unix/interval/intervalLengthUnix.js +4 -6
  420. package/dist/unix/interval/intervalOverlappingDaysUnix.d.ts +13 -3
  421. package/dist/unix/interval/intervalOverlappingDaysUnix.js +1 -3
  422. package/dist/unix/interval/intervalSplitAtUnix.d.ts +8 -0
  423. package/dist/unix/interval/intervalSplitAtUnix.js +2 -0
  424. package/dist/unix/interval/intervalUnionUnix.d.ts +6 -0
  425. package/dist/unix/interval/intervalXorAllUnix.d.ts +6 -0
  426. package/dist/unix/interval/intervalXorUnix.d.ts +6 -0
  427. package/dist/unix/interval/mergeIntervalsUnix.d.ts +6 -0
  428. package/dist/unix/interval/splitIntervalByUnitUnix.d.ts +42 -11
  429. package/dist/unix/interval/splitIntervalByUnitUnix.js +21 -16
  430. package/dist/unix/parse/parseDateFromUnix.d.ts +13 -2
  431. package/dist/unix/parse/parseDateFromUnix.js +1 -2
  432. package/dist/unix/parse/parseDayFromUnix.d.ts +14 -2
  433. package/dist/unix/parse/parseDayFromUnix.js +2 -2
  434. package/dist/unix/parse/parseDayOfWeekFromUnix.d.ts +13 -1
  435. package/dist/unix/parse/parseDayOfWeekFromUnix.js +1 -1
  436. package/dist/unix/parse/parseHourFromUnix.d.ts +14 -2
  437. package/dist/unix/parse/parseHourFromUnix.js +2 -2
  438. package/dist/unix/parse/parseMicrosecondFromUnix.d.ts +14 -2
  439. package/dist/unix/parse/parseMicrosecondFromUnix.js +2 -2
  440. package/dist/unix/parse/parseMillisecondFromUnix.d.ts +14 -2
  441. package/dist/unix/parse/parseMillisecondFromUnix.js +2 -2
  442. package/dist/unix/parse/parseMinuteFromUnix.d.ts +14 -2
  443. package/dist/unix/parse/parseMinuteFromUnix.js +2 -2
  444. package/dist/unix/parse/parseMonthFromUnix.d.ts +14 -2
  445. package/dist/unix/parse/parseMonthFromUnix.js +2 -2
  446. package/dist/unix/parse/parseNanosecondFromUnix.d.ts +14 -2
  447. package/dist/unix/parse/parseNanosecondFromUnix.js +2 -2
  448. package/dist/unix/parse/parseSecondFromUnix.d.ts +14 -2
  449. package/dist/unix/parse/parseSecondFromUnix.js +2 -2
  450. package/dist/unix/parse/parseTimeFromUnix.d.ts +13 -2
  451. package/dist/unix/parse/parseTimeFromUnix.js +1 -2
  452. package/dist/unix/parse/parseUnitFromUnix.d.ts +22 -3
  453. package/dist/unix/parse/parseUnitFromUnix.js +2 -3
  454. package/dist/unix/parse/parseWeekFromUnix.d.ts +23 -7
  455. package/dist/unix/parse/parseWeekFromUnix.js +3 -7
  456. package/dist/unix/parse/parseYearFromUnix.d.ts +14 -2
  457. package/dist/unix/parse/parseYearFromUnix.js +2 -2
  458. package/dist/unix/validate/isValidUnixRange.d.ts +20 -4
  459. package/dist/unix/validate/isValidUnixRange.js +1 -4
  460. package/dist/utc/calculate/addUtc.d.ts +7 -4
  461. package/dist/utc/calculate/addUtc.js +1 -4
  462. package/dist/utc/calculate/diffUtc.d.ts +1 -1
  463. package/dist/utc/calculate/diffUtc.js +1 -1
  464. package/dist/utc/calculate/diffUtcAsDuration.d.ts +1 -1
  465. package/dist/utc/calculate/diffUtcAsDuration.js +1 -1
  466. package/dist/utc/calculate/endOfUtc.d.ts +16 -3
  467. package/dist/utc/calculate/endOfUtc.js +2 -3
  468. package/dist/utc/calculate/isBetweenUtc.d.ts +13 -2
  469. package/dist/utc/calculate/isBetweenUtc.js +4 -4
  470. package/dist/utc/calculate/roundUtc.d.ts +26 -9
  471. package/dist/utc/calculate/roundUtc.js +3 -12
  472. package/dist/utc/calculate/setUtc.d.ts +7 -4
  473. package/dist/utc/calculate/setUtc.js +1 -4
  474. package/dist/utc/calculate/startOfUtc.d.ts +15 -2
  475. package/dist/utc/calculate/startOfUtc.js +1 -2
  476. package/dist/utc/calculate/subtractUtc.d.ts +7 -4
  477. package/dist/utc/calculate/subtractUtc.js +1 -4
  478. package/dist/utc/compare/areUtcEqualBy.d.ts +9 -3
  479. package/dist/utc/compare/areUtcEqualBy.js +2 -3
  480. package/dist/utc/convert/convertUtcToPlainDate.d.ts +8 -3
  481. package/dist/utc/convert/convertUtcToPlainDate.js +5 -6
  482. package/dist/utc/convert/convertUtcToPlainDateTime.d.ts +8 -3
  483. package/dist/utc/convert/convertUtcToPlainDateTime.js +5 -6
  484. package/dist/utc/convert/convertUtcToPlainTime.d.ts +8 -3
  485. package/dist/utc/convert/convertUtcToPlainTime.js +5 -6
  486. package/dist/utc/convert/convertUtcToUnix.d.ts +9 -4
  487. package/dist/utc/convert/convertUtcToUnix.js +3 -4
  488. package/dist/utc/convert/convertUtcToZoned.d.ts +1 -1
  489. package/dist/utc/convert/convertUtcToZoned.js +1 -1
  490. package/dist/utc/format/formatCalendarUtc.d.ts +19 -8
  491. package/dist/utc/format/formatCalendarUtc.js +8 -6
  492. package/dist/utc/format/formatHttp.d.ts +1 -1
  493. package/dist/utc/format/formatHttp.js +1 -1
  494. package/dist/utc/format/formatRelativeUtc.d.ts +30 -10
  495. package/dist/utc/format/formatRelativeUtc.js +9 -11
  496. package/dist/utc/format/formatUtc.d.ts +17 -15
  497. package/dist/utc/format/formatUtc.js +8 -8
  498. package/dist/utc/interval/intervalDifferenceUtc.d.ts +6 -0
  499. package/dist/utc/interval/intervalDivideEquallyUtc.d.ts +18 -4
  500. package/dist/utc/interval/intervalDivideEquallyUtc.js +5 -4
  501. package/dist/utc/interval/intervalFromDurationUtc.d.ts +13 -3
  502. package/dist/utc/interval/intervalFromDurationUtc.js +1 -3
  503. package/dist/utc/interval/intervalIntersectionUtc.d.ts +6 -0
  504. package/dist/utc/interval/intervalSplitAtUtc.d.ts +8 -0
  505. package/dist/utc/interval/intervalSplitAtUtc.js +2 -0
  506. package/dist/utc/interval/intervalUnionUtc.d.ts +6 -0
  507. package/dist/utc/interval/intervalXorAllUtc.d.ts +6 -0
  508. package/dist/utc/interval/intervalXorUtc.d.ts +6 -0
  509. package/dist/utc/interval/mergeIntervalsUtc.d.ts +6 -0
  510. package/dist/utc/interval/splitIntervalByUnitUtc.d.ts +19 -6
  511. package/dist/utc/interval/splitIntervalByUnitUtc.js +6 -6
  512. package/dist/utc/parse/parseDateFromUtc.d.ts +7 -3
  513. package/dist/utc/parse/parseDateFromUtc.js +1 -3
  514. package/dist/utc/parse/parseDayFromUtc.d.ts +7 -3
  515. package/dist/utc/parse/parseDayFromUtc.js +1 -3
  516. package/dist/utc/parse/parseDayOfWeekFromUtc.d.ts +7 -3
  517. package/dist/utc/parse/parseDayOfWeekFromUtc.js +4 -6
  518. package/dist/utc/parse/parseHourFromUtc.d.ts +7 -3
  519. package/dist/utc/parse/parseHourFromUtc.js +1 -3
  520. package/dist/utc/parse/parseHttp.d.ts +1 -1
  521. package/dist/utc/parse/parseHttp.js +1 -1
  522. package/dist/utc/parse/parseMicrosecondFromUtc.d.ts +7 -3
  523. package/dist/utc/parse/parseMicrosecondFromUtc.js +1 -3
  524. package/dist/utc/parse/parseMillisecondFromUtc.d.ts +7 -3
  525. package/dist/utc/parse/parseMillisecondFromUtc.js +1 -3
  526. package/dist/utc/parse/parseMinuteFromUtc.d.ts +7 -3
  527. package/dist/utc/parse/parseMinuteFromUtc.js +1 -3
  528. package/dist/utc/parse/parseMonthFromUtc.d.ts +7 -3
  529. package/dist/utc/parse/parseMonthFromUtc.js +1 -3
  530. package/dist/utc/parse/parseNanosecondFromUtc.d.ts +7 -3
  531. package/dist/utc/parse/parseNanosecondFromUtc.js +1 -3
  532. package/dist/utc/parse/parseSecondFromUtc.d.ts +7 -3
  533. package/dist/utc/parse/parseSecondFromUtc.js +1 -3
  534. package/dist/utc/parse/parseTimeFromUtc.d.ts +8 -3
  535. package/dist/utc/parse/parseTimeFromUtc.js +5 -6
  536. package/dist/utc/parse/parseUnitFromUtc.d.ts +17 -5
  537. package/dist/utc/parse/parseUnitFromUtc.js +6 -8
  538. package/dist/utc/parse/parseWeekFromUtc.d.ts +18 -10
  539. package/dist/utc/parse/parseWeekFromUtc.js +7 -13
  540. package/dist/utc/parse/parseYearFromUtc.d.ts +7 -3
  541. package/dist/utc/parse/parseYearFromUtc.js +1 -3
  542. package/dist/utc/validate/isValidUtcRange.d.ts +16 -5
  543. package/dist/utc/validate/isValidUtcRange.js +2 -5
  544. package/dist/zoned/calculate/addZoned.d.ts +20 -10
  545. package/dist/zoned/calculate/addZoned.js +6 -13
  546. package/dist/zoned/calculate/cycleZoned.d.ts +33 -8
  547. package/dist/zoned/calculate/cycleZoned.js +1 -8
  548. package/dist/zoned/calculate/diffZoned.d.ts +1 -1
  549. package/dist/zoned/calculate/diffZoned.js +1 -1
  550. package/dist/zoned/calculate/diffZonedAsDuration.d.ts +1 -1
  551. package/dist/zoned/calculate/diffZonedAsDuration.js +1 -1
  552. package/dist/zoned/calculate/endOfQuarterForZoned.d.ts +9 -2
  553. package/dist/zoned/calculate/endOfQuarterForZoned.js +4 -5
  554. package/dist/zoned/calculate/endOfZoned.d.ts +16 -3
  555. package/dist/zoned/calculate/endOfZoned.js +2 -3
  556. package/dist/zoned/calculate/getLocaleZonedEndOfWeek.d.ts +10 -3
  557. package/dist/zoned/calculate/getLocaleZonedEndOfWeek.js +5 -6
  558. package/dist/zoned/calculate/getLocaleZonedStartOfWeek.d.ts +7 -1
  559. package/dist/zoned/calculate/getLocaleZonedStartOfWeek.js +3 -4
  560. package/dist/zoned/calculate/roundZoned.d.ts +21 -4
  561. package/dist/zoned/calculate/roundZoned.js +3 -7
  562. package/dist/zoned/calculate/setZoned.d.ts +25 -8
  563. package/dist/zoned/calculate/setZoned.js +4 -12
  564. package/dist/zoned/calculate/startOfQuarterForZoned.d.ts +7 -2
  565. package/dist/zoned/calculate/startOfQuarterForZoned.js +3 -5
  566. package/dist/zoned/calculate/startOfZoned.d.ts +15 -3
  567. package/dist/zoned/calculate/startOfZoned.js +1 -3
  568. package/dist/zoned/calculate/subtractZoned.d.ts +20 -10
  569. package/dist/zoned/calculate/subtractZoned.js +6 -13
  570. package/dist/zoned/compare/areZonedEqualBy.d.ts +14 -5
  571. package/dist/zoned/compare/areZonedEqualBy.js +7 -5
  572. package/dist/zoned/compare/isBetweenZoned.d.ts +13 -1
  573. package/dist/zoned/compare/isBetweenZoned.js +4 -3
  574. package/dist/zoned/compare/isInDaylightSaving.d.ts +38 -11
  575. package/dist/zoned/compare/isInDaylightSaving.js +40 -44
  576. package/dist/zoned/convert/convertPlainDateTimeToZoned.d.ts +18 -5
  577. package/dist/zoned/convert/convertPlainDateTimeToZoned.js +6 -11
  578. package/dist/zoned/convert/convertZonedToUnix.d.ts +9 -4
  579. package/dist/zoned/convert/convertZonedToUnix.js +2 -4
  580. package/dist/zoned/convert/convertZonedToZoned.d.ts +1 -1
  581. package/dist/zoned/convert/convertZonedToZoned.js +1 -1
  582. package/dist/zoned/format/formatCalendarZoned.d.ts +18 -12
  583. package/dist/zoned/format/formatCalendarZoned.js +13 -9
  584. package/dist/zoned/format/formatRelativeZoned.d.ts +41 -12
  585. package/dist/zoned/format/formatRelativeZoned.js +7 -4
  586. package/dist/zoned/format/formatRfc2822.d.ts +2 -2
  587. package/dist/zoned/format/formatRfc2822.js +2 -2
  588. package/dist/zoned/format/formatRfc3339.d.ts +2 -3
  589. package/dist/zoned/format/formatRfc3339.js +2 -3
  590. package/dist/zoned/format/formatTimeZoneName.d.ts +12 -3
  591. package/dist/zoned/format/formatTimeZoneName.js +5 -4
  592. package/dist/zoned/format/formatZonedDateTime.js +2 -1
  593. package/dist/zoned/format/formatZonedRange.js +2 -1
  594. package/dist/zoned/format/formatZonedToParts.d.ts +15 -4
  595. package/dist/zoned/format/formatZonedToParts.js +8 -5
  596. package/dist/zoned/get/getDstTransitions.d.ts +9 -10
  597. package/dist/zoned/get/getDstTransitions.js +12 -3
  598. package/dist/zoned/get/getTimeZoneOffset.d.ts +4 -1
  599. package/dist/zoned/get/getTimeZoneOffset.js +6 -3
  600. package/dist/zoned/get/getZonedNow.d.ts +13 -1
  601. package/dist/zoned/get/getZonedNow.js +12 -3
  602. package/dist/zoned/interval/intervalDifferenceZoned.d.ts +9 -0
  603. package/dist/zoned/interval/intervalDivideEquallyZoned.d.ts +22 -4
  604. package/dist/zoned/interval/intervalDivideEquallyZoned.js +6 -4
  605. package/dist/zoned/interval/intervalFromDurationZoned.d.ts +29 -10
  606. package/dist/zoned/interval/intervalFromDurationZoned.js +6 -13
  607. package/dist/zoned/interval/intervalIntersectionZoned.d.ts +9 -0
  608. package/dist/zoned/interval/intervalSplitAtZoned.d.ts +11 -0
  609. package/dist/zoned/interval/intervalSplitAtZoned.js +2 -0
  610. package/dist/zoned/interval/intervalUnionZoned.d.ts +9 -0
  611. package/dist/zoned/interval/intervalXorAllZoned.d.ts +9 -0
  612. package/dist/zoned/interval/intervalXorZoned.d.ts +9 -0
  613. package/dist/zoned/interval/mergeIntervalsZoned.d.ts +9 -0
  614. package/dist/zoned/interval/splitIntervalByUnitZoned.d.ts +27 -6
  615. package/dist/zoned/interval/splitIntervalByUnitZoned.js +11 -6
  616. package/dist/zoned/map/mapZonedDatesInRange.d.ts +9 -4
  617. package/dist/zoned/map/mapZonedDatesInRange.js +2 -4
  618. package/dist/zoned/parse/parseRfc2822.d.ts +1 -1
  619. package/dist/zoned/parse/parseRfc2822.js +1 -1
  620. package/dist/zoned/parse/parseUnitFromZoned.d.ts +9 -3
  621. package/dist/zoned/parse/parseUnitFromZoned.js +1 -3
  622. package/dist/zoned/parse/parseWeekFromZoned.d.ts +10 -3
  623. package/dist/zoned/parse/parseWeekFromZoned.js +2 -3
  624. package/dist/zoned/validate/hasDaylightSaving.d.ts +42 -11
  625. package/dist/zoned/validate/hasDaylightSaving.js +47 -31
  626. package/dist/zoned/validate/isValidZonedDateTime.d.ts +13 -0
  627. package/dist/zoned/validate/isValidZonedDateTime.js +14 -1
  628. package/dist/zoned/validate/isValidZonedRange.d.ts +15 -4
  629. package/dist/zoned/validate/isValidZonedRange.js +1 -4
  630. package/package.json +18 -5
  631. package/skills/gmt-arithmetic/SKILL.md +1 -1
  632. package/skills/gmt-basics/SKILL.md +10 -1
  633. package/skills/gmt-integration/SKILL.md +10 -5
  634. package/skills/gmt-timezone/SKILL.md +150 -21
  635. package/dist/internal/resolveReadingTimeZone.d.ts +0 -11
  636. package/dist/internal/resolveReadingTimeZone.js +0 -18
  637. package/dist/types/duration-unit.d.ts +0 -5
  638. /package/dist/types/{duration-unit.js → operating-schedule.js} +0 -0
@@ -4,19 +4,21 @@ import { Temporal } from "@js-temporal/polyfill";
4
4
  *
5
5
  * - Equality means both values share the same start-of-`unit` boundary, so
6
6
  * `"month"` requires the same month AND year — March 2023 and March 2024 are
7
- * NOT equal by month, matching date-fns's `isSameMonth` and Luxon's
8
- * `dt.hasSame(other, "month")`. This is a common point of confusion for
9
- * callers expecting a bare "same month-of-year" comparison.
7
+ * NOT equal by month. A calendar month is a year and a month together, as in
8
+ * Temporal's `PlainYearMonth`, not a bare month-of-year number. This is a
9
+ * common point of confusion for callers expecting a bare "same month-of-year"
10
+ * comparison.
11
+ * - Comparison: date-fns's `isSameMonth` and Luxon's `dt.hasSame(other, "month")`
12
+ * give the same answer.
10
13
  * - `"day"` matches `areDatesEqual` for PlainDate inputs only: `areDatesEqual` also accepts
11
14
  * PlainDateTime strings (`areDatesEqual("2024-01-01", "2024-01-01T10:00")` is `true`), while this
12
15
  * function accepts PlainDate strings only (`areDatesEqualBy` with those inputs and `"day"` is
13
16
  * `false`).
14
17
  * - `"year"`, `"month"`, `"week"` are computed via `startOfDate`.
15
18
  * - `unit` accepts the singular or plural name (`"day"` or `"days"`), as Temporal does.
16
- * - `weekStartsOn` other than `"monday"` or `"sunday"` returns false.
17
19
  * - Returns false for an unsupported unit or invalid input.
18
20
  *
19
- * Mapping from date-fns (Decision 5, `context/roadmap/issues/J.md`):
21
+ * Mapping from date-fns:
20
22
  * - `isSameDay(a, b)` → `areDatesEqualBy(a, b, "day")`
21
23
  * - `isSameWeek(a, b, options)` → `areDatesEqualBy(a, b, "week", { weekStartsOn })`
22
24
  * - `isSameMonth(a, b)` → `areDatesEqualBy(a, b, "month")`
@@ -25,7 +27,7 @@ import { Temporal } from "@js-temporal/polyfill";
25
27
  * @param value1 first ISO date string
26
28
  * @param value2 second ISO date string
27
29
  * @param unit date unit to compare by ("year" | "month" | "week" | "day", or its plural)
28
- * @param optionsArg optional: weekStartsOn ("monday" | "sunday")
30
+ * @param optionsArg How the week is defined
29
31
  * @returns true if both dates share the same start-of-unit boundary, false on an unsupported unit or invalid input
30
32
  *
31
33
  * @example areDatesEqualBy("2024-03-15", "2024-03-20", "month") // true
@@ -37,5 +39,12 @@ import { Temporal } from "@js-temporal/polyfill";
37
39
  * @example areDatesEqualBy("invalid", "2024-03-15", "month") // false
38
40
  */
39
41
  export declare function areDatesEqualBy(value1: string, value2: string, unit: Temporal.SmallestUnit<Temporal.DateUnit>, optionsArg?: {
42
+ /**
43
+ * The first day of the week, which sets where a `"week"` unit starts. `"monday"` is the ISO
44
+ * 8601 week, Monday to Sunday; `"sunday"` runs Sunday to Saturday. Any other value returns
45
+ * false, whatever the unit.
46
+ *
47
+ * @defaultValue `"monday"`
48
+ */
40
49
  weekStartsOn?: "monday" | "sunday";
41
50
  }): boolean;
@@ -11,19 +11,21 @@ const supported = ["year", "month", "week", "day"];
11
11
  *
12
12
  * - Equality means both values share the same start-of-`unit` boundary, so
13
13
  * `"month"` requires the same month AND year — March 2023 and March 2024 are
14
- * NOT equal by month, matching date-fns's `isSameMonth` and Luxon's
15
- * `dt.hasSame(other, "month")`. This is a common point of confusion for
16
- * callers expecting a bare "same month-of-year" comparison.
14
+ * NOT equal by month. A calendar month is a year and a month together, as in
15
+ * Temporal's `PlainYearMonth`, not a bare month-of-year number. This is a
16
+ * common point of confusion for callers expecting a bare "same month-of-year"
17
+ * comparison.
18
+ * - Comparison: date-fns's `isSameMonth` and Luxon's `dt.hasSame(other, "month")`
19
+ * give the same answer.
17
20
  * - `"day"` matches `areDatesEqual` for PlainDate inputs only: `areDatesEqual` also accepts
18
21
  * PlainDateTime strings (`areDatesEqual("2024-01-01", "2024-01-01T10:00")` is `true`), while this
19
22
  * function accepts PlainDate strings only (`areDatesEqualBy` with those inputs and `"day"` is
20
23
  * `false`).
21
24
  * - `"year"`, `"month"`, `"week"` are computed via `startOfDate`.
22
25
  * - `unit` accepts the singular or plural name (`"day"` or `"days"`), as Temporal does.
23
- * - `weekStartsOn` other than `"monday"` or `"sunday"` returns false.
24
26
  * - Returns false for an unsupported unit or invalid input.
25
27
  *
26
- * Mapping from date-fns (Decision 5, `context/roadmap/issues/J.md`):
28
+ * Mapping from date-fns:
27
29
  * - `isSameDay(a, b)` → `areDatesEqualBy(a, b, "day")`
28
30
  * - `isSameWeek(a, b, options)` → `areDatesEqualBy(a, b, "week", { weekStartsOn })`
29
31
  * - `isSameMonth(a, b)` → `areDatesEqualBy(a, b, "month")`
@@ -32,7 +34,7 @@ const supported = ["year", "month", "week", "day"];
32
34
  * @param value1 first ISO date string
33
35
  * @param value2 second ISO date string
34
36
  * @param unit date unit to compare by ("year" | "month" | "week" | "day", or its plural)
35
- * @param optionsArg optional: weekStartsOn ("monday" | "sunday")
37
+ * @param optionsArg How the week is defined
36
38
  * @returns true if both dates share the same start-of-unit boundary, false on an unsupported unit or invalid input
37
39
  *
38
40
  * @example areDatesEqualBy("2024-03-15", "2024-03-20", "month") // true
@@ -4,12 +4,11 @@
4
4
  * - Uses Temporal.PlainDate.compare to compare dates.
5
5
  * - Returns false if start > end (invalid range).
6
6
  * - Returns false if any input is invalid.
7
- * - Use options.inclusiveStart and options.inclusiveEnd to control boundary inclusivity.
8
7
  *
9
8
  * @param date ISO PlainDate string to check
10
9
  * @param start ISO PlainDate string for the start of the range
11
10
  * @param end ISO PlainDate string for the end of the range
12
- * @param options { inclusiveStart?: boolean = true, inclusiveEnd?: boolean = true }
11
+ * @param options Whether each end of the range counts as inside it
13
12
  * @returns boolean indicating whether date is between start and end
14
13
  *
15
14
  * @example isBetweenDate("2024-02-29", "2024-02-01", "2024-02-28") // false
@@ -21,6 +20,18 @@
21
20
  * @example isBetweenDate("2024-02-29", "2024-02-01", "invalid") // false
22
21
  */
23
22
  export declare function isBetweenDate(date: string, start: string, end: string, options?: {
23
+ /**
24
+ * Whether `date` equal to `start` counts as inside the range. `false` requires it to
25
+ * be after `start`.
26
+ *
27
+ * @defaultValue `true`
28
+ */
24
29
  inclusiveStart?: boolean;
30
+ /**
31
+ * Whether `date` equal to `end` counts as inside the range. `false` requires it to be
32
+ * before `end`.
33
+ *
34
+ * @defaultValue `true`
35
+ */
25
36
  inclusiveEnd?: boolean;
26
37
  }): boolean;
@@ -2,18 +2,18 @@
2
2
  import { Temporal } from "@js-temporal/polyfill";
3
3
  import { isValidDate } from "../validate/index.js";
4
4
  import { isOptionsArgument } from "../../internal/isObject.js";
5
+ import { optionOrDefault } from "../../internal/optionOrDefault.js";
5
6
  /**
6
7
  * Return true when `date` is between `start` and `end` (inclusive by default).
7
8
  *
8
9
  * - Uses Temporal.PlainDate.compare to compare dates.
9
10
  * - Returns false if start > end (invalid range).
10
11
  * - Returns false if any input is invalid.
11
- * - Use options.inclusiveStart and options.inclusiveEnd to control boundary inclusivity.
12
12
  *
13
13
  * @param date ISO PlainDate string to check
14
14
  * @param start ISO PlainDate string for the start of the range
15
15
  * @param end ISO PlainDate string for the end of the range
16
- * @param options { inclusiveStart?: boolean = true, inclusiveEnd?: boolean = true }
16
+ * @param options Whether each end of the range counts as inside it
17
17
  * @returns boolean indicating whether date is between start and end
18
18
  *
19
19
  * @example isBetweenDate("2024-02-29", "2024-02-01", "2024-02-28") // false
@@ -33,8 +33,8 @@ export function isBetweenDate(date, start, end, options) {
33
33
  // reading of it gives `false`: ECMA-402 reads a boolean option through ToBoolean (null → false),
34
34
  // and the house rule rejects an invalid member outright — neither yields `true`. So `null`
35
35
  // behaves here exactly as `0` and `""` already do.
36
- const inclusiveStart = options?.inclusiveStart === undefined ? true : options.inclusiveStart;
37
- const inclusiveEnd = options?.inclusiveEnd === undefined ? true : options.inclusiveEnd;
36
+ const inclusiveStart = optionOrDefault(options?.inclusiveStart, true);
37
+ const inclusiveEnd = optionOrDefault(options?.inclusiveEnd, true);
38
38
  if (!isValidDate(date) || !isValidDate(start) || !isValidDate(end)) {
39
39
  return false;
40
40
  }
@@ -4,12 +4,11 @@
4
4
  * - Uses Temporal.PlainDateTime.compare to compare date-times.
5
5
  * - Returns false if start > end (invalid range).
6
6
  * - Returns false if any input is invalid.
7
- * - Use options.inclusiveStart and options.inclusiveEnd to control boundary inclusivity.
8
7
  *
9
8
  * @param dateTime ISO PlainDateTime string to check
10
9
  * @param start ISO PlainDateTime string for the start of the range
11
10
  * @param end ISO PlainDateTime string for the end of the range
12
- * @param options { inclusiveStart?: boolean = true, inclusiveEnd?: boolean = true }
11
+ * @param options Whether each end of the range counts as inside it
13
12
  * @returns boolean indicating whether dateTime is between start and end
14
13
  *
15
14
  * @example isBetweenDateTime("2024-02-29T12:00:00", "2024-02-01T00:00:00", "2024-02-28T23:59:59") // false
@@ -21,6 +20,18 @@
21
20
  * @example isBetweenDateTime("2024-02-29T12:00:00", "2024-02-01T00:00:00", "invalid") // false
22
21
  */
23
22
  export declare function isBetweenDateTime(dateTime: string, start: string, end: string, options?: {
23
+ /**
24
+ * Whether `dateTime` equal to `start` counts as inside the range. `false` requires it to
25
+ * be after `start`.
26
+ *
27
+ * @defaultValue `true`
28
+ */
24
29
  inclusiveStart?: boolean;
30
+ /**
31
+ * Whether `dateTime` equal to `end` counts as inside the range. `false` requires it to be
32
+ * before `end`.
33
+ *
34
+ * @defaultValue `true`
35
+ */
25
36
  inclusiveEnd?: boolean;
26
37
  }): boolean;
@@ -2,18 +2,18 @@
2
2
  import { Temporal } from "@js-temporal/polyfill";
3
3
  import { isValidDateTime } from "../validate/index.js";
4
4
  import { isOptionsArgument } from "../../internal/isObject.js";
5
+ import { optionOrDefault } from "../../internal/optionOrDefault.js";
5
6
  /**
6
7
  * Return true when `dateTime` is between `start` and `end` (inclusive by default).
7
8
  *
8
9
  * - Uses Temporal.PlainDateTime.compare to compare date-times.
9
10
  * - Returns false if start > end (invalid range).
10
11
  * - Returns false if any input is invalid.
11
- * - Use options.inclusiveStart and options.inclusiveEnd to control boundary inclusivity.
12
12
  *
13
13
  * @param dateTime ISO PlainDateTime string to check
14
14
  * @param start ISO PlainDateTime string for the start of the range
15
15
  * @param end ISO PlainDateTime string for the end of the range
16
- * @param options { inclusiveStart?: boolean = true, inclusiveEnd?: boolean = true }
16
+ * @param options Whether each end of the range counts as inside it
17
17
  * @returns boolean indicating whether dateTime is between start and end
18
18
  *
19
19
  * @example isBetweenDateTime("2024-02-29T12:00:00", "2024-02-01T00:00:00", "2024-02-28T23:59:59") // false
@@ -33,8 +33,8 @@ export function isBetweenDateTime(dateTime, start, end, options) {
33
33
  // reading of it gives `false`: ECMA-402 reads a boolean option through ToBoolean (null → false),
34
34
  // and the house rule rejects an invalid member outright — neither yields `true`. So `null`
35
35
  // behaves here exactly as `0` and `""` already do.
36
- const inclusiveStart = options?.inclusiveStart === undefined ? true : options.inclusiveStart;
37
- const inclusiveEnd = options?.inclusiveEnd === undefined ? true : options.inclusiveEnd;
36
+ const inclusiveStart = optionOrDefault(options?.inclusiveStart, true);
37
+ const inclusiveEnd = optionOrDefault(options?.inclusiveEnd, true);
38
38
  if (!isValidDateTime(dateTime) ||
39
39
  !isValidDateTime(start) ||
40
40
  !isValidDateTime(end)) {
@@ -4,13 +4,12 @@
4
4
  * - Uses Temporal.PlainTime.compare to compare times.
5
5
  * - Returns false if start > end (invalid range).
6
6
  * - Returns false if any input is invalid.
7
- * - Use options.inclusiveStart and options.inclusiveEnd to control boundary inclusivity.
8
7
  * - Note: PlainTime comparison does not account for day overflow.
9
8
  *
10
9
  * @param time ISO PlainTime string to check
11
10
  * @param start ISO PlainTime string for the start of the range
12
11
  * @param end ISO PlainTime string for the end of the range
13
- * @param options { inclusiveStart?: boolean = true, inclusiveEnd?: boolean = true }
12
+ * @param options Whether each end of the range counts as inside it
14
13
  * @returns boolean indicating whether time is between start and end
15
14
  *
16
15
  * @example isBetweenTime("12:34:56", "12:00:00", "13:00:00") // true
@@ -23,6 +22,18 @@
23
22
  * @example isBetweenTime("12:34:56", "12:00:00", "invalid") // false
24
23
  */
25
24
  export declare function isBetweenTime(time: string, start: string, end: string, options?: {
25
+ /**
26
+ * Whether `time` equal to `start` counts as inside the range. `false` requires it to
27
+ * be after `start`.
28
+ *
29
+ * @defaultValue `true`
30
+ */
26
31
  inclusiveStart?: boolean;
32
+ /**
33
+ * Whether `time` equal to `end` counts as inside the range. `false` requires it to be
34
+ * before `end`.
35
+ *
36
+ * @defaultValue `true`
37
+ */
27
38
  inclusiveEnd?: boolean;
28
39
  }): boolean;
@@ -2,19 +2,19 @@
2
2
  import { Temporal } from "@js-temporal/polyfill";
3
3
  import { isValidTime } from "../validate/index.js";
4
4
  import { isOptionsArgument } from "../../internal/isObject.js";
5
+ import { optionOrDefault } from "../../internal/optionOrDefault.js";
5
6
  /**
6
7
  * Return true when `time` is between `start` and `end` (inclusive by default).
7
8
  *
8
9
  * - Uses Temporal.PlainTime.compare to compare times.
9
10
  * - Returns false if start > end (invalid range).
10
11
  * - Returns false if any input is invalid.
11
- * - Use options.inclusiveStart and options.inclusiveEnd to control boundary inclusivity.
12
12
  * - Note: PlainTime comparison does not account for day overflow.
13
13
  *
14
14
  * @param time ISO PlainTime string to check
15
15
  * @param start ISO PlainTime string for the start of the range
16
16
  * @param end ISO PlainTime string for the end of the range
17
- * @param options { inclusiveStart?: boolean = true, inclusiveEnd?: boolean = true }
17
+ * @param options Whether each end of the range counts as inside it
18
18
  * @returns boolean indicating whether time is between start and end
19
19
  *
20
20
  * @example isBetweenTime("12:34:56", "12:00:00", "13:00:00") // true
@@ -35,8 +35,8 @@ export function isBetweenTime(time, start, end, options) {
35
35
  // reading of it gives `false`: ECMA-402 reads a boolean option through ToBoolean (null → false),
36
36
  // and the house rule rejects an invalid member outright — neither yields `true`. So `null`
37
37
  // behaves here exactly as `0` and `""` already do.
38
- const inclusiveStart = options?.inclusiveStart === undefined ? true : options.inclusiveStart;
39
- const inclusiveEnd = options?.inclusiveEnd === undefined ? true : options.inclusiveEnd;
38
+ const inclusiveStart = optionOrDefault(options?.inclusiveStart, true);
39
+ const inclusiveEnd = optionOrDefault(options?.inclusiveEnd, true);
40
40
  if (!isValidTime(time) || !isValidTime(start) || !isValidTime(end)) {
41
41
  return false;
42
42
  }
@@ -14,7 +14,7 @@
14
14
  * - `offsetDays` must be an integer; non-integer or non-finite values return false.
15
15
  * - Returns false if `value` is invalid or the system timeZone is unavailable.
16
16
  *
17
- * Mapping from date-fns (Decision 5, `context/roadmap/issues/J.md`):
17
+ * Mapping from date-fns:
18
18
  * - `isToday(value)` → `isRelativeDay(value, 0)`
19
19
  * - `isYesterday(value)` → `isRelativeDay(value, -1)`
20
20
  * - `isTomorrow(value)` → `isRelativeDay(value, 1)`
@@ -18,7 +18,7 @@ import { areDatesEqual } from "./areDatesEqual.js";
18
18
  * - `offsetDays` must be an integer; non-integer or non-finite values return false.
19
19
  * - Returns false if `value` is invalid or the system timeZone is unavailable.
20
20
  *
21
- * Mapping from date-fns (Decision 5, `context/roadmap/issues/J.md`):
21
+ * Mapping from date-fns:
22
22
  * - `isToday(value)` → `isRelativeDay(value, 0)`
23
23
  * - `isYesterday(value)` → `isRelativeDay(value, -1)`
24
24
  * - `isTomorrow(value)` → `isRelativeDay(value, 1)`
@@ -21,7 +21,7 @@ import type { Temporal } from "@js-temporal/polyfill";
21
21
  * unit, so an invalid locale returns false for `"day"`, `"month"` and `"year"` too.
22
22
  * - **Compatibility:** before 1.16.0 an invalid locale was ignored for every unit but `"week"`.
23
23
  *
24
- * Mapping from date-fns (Decision 5, `context/roadmap/issues/J.md`):
24
+ * Mapping from date-fns:
25
25
  * - `isThisWeek(value, options)` → `isThisUnit(value, "week", locale)`
26
26
  * - `isThisMonth(value)` → `isThisUnit(value, "month")`
27
27
  * - `isThisYear(value)` → `isThisUnit(value, "year")`
@@ -26,7 +26,7 @@ import { areDatesEqualBy } from "./areDatesEqualBy.js";
26
26
  * unit, so an invalid locale returns false for `"day"`, `"month"` and `"year"` too.
27
27
  * - **Compatibility:** before 1.16.0 an invalid locale was ignored for every unit but `"week"`.
28
28
  *
29
- * Mapping from date-fns (Decision 5, `context/roadmap/issues/J.md`):
29
+ * Mapping from date-fns:
30
30
  * - `isThisWeek(value, options)` → `isThisUnit(value, "week", locale)`
31
31
  * - `isThisMonth(value)` → `isThisUnit(value, "month")`
32
32
  * - `isThisYear(value)` → `isThisUnit(value, "year")`
@@ -1,19 +1,24 @@
1
1
  import type { CalendarOptions } from "../../types/index.js";
2
+ /**
3
+ * Options for `formatCalendar`: the date-time the value is compared with, and the style of the
4
+ * time-of-day half.
5
+ */
2
6
  export interface FormatCalendarOptions extends CalendarOptions {
3
7
  /**
4
- * `Intl.DateTimeFormatOptions` `timeStyle` for the time-of-day half.
5
- * "long" and "full" are not offered: they differ from "medium" only by a
6
- * `timeZoneName`, and a plain value has no zone. Passed anyway (from
7
- * untyped code), they format as "medium" — Temporal's PlainDateTime format
8
- * drops `timeZoneName` (AdjustDateTimeStyleFormat).
8
+ * The length of the time-of-day part, as the `timeStyle` of `Intl.DateTimeFormat`. "long" and
9
+ * "full" are not offered: they differ from "medium" only by a `timeZoneName`, and a plain value
10
+ * has no zone. Passed anyway (from untyped code), they format as "medium" — Temporal's
11
+ * PlainDateTime format drops `timeZoneName` (AdjustDateTimeStyleFormat).
12
+ *
13
+ * @defaultValue `"short"`
9
14
  */
10
15
  timeStyle?: "short" | "medium";
11
16
  }
12
17
  /**
13
18
  * Format a plain date-time as a relative day label plus time-of-day, e.g.
14
- * "Tomorrow at 2:30 PM" — Moment's `.calendar()`, which the existing
15
- * `formatRelativeDateTime` family does not cover (that family renders
16
- * "in 1 day", an elapsed-time phrase, not a day label + clock time).
19
+ * "Tomorrow at 2:30 PM". The `formatRelativeDateTime` family does not
20
+ * cover this: it renders "in 1 day", an elapsed-time phrase, not a day
21
+ * label + clock time.
17
22
  *
18
23
  * - Within `±6` days of `reference` (default: now), renders `<day label>`
19
24
  * joined to the localized time using the locale's own connector — never a
@@ -21,15 +26,17 @@ export interface FormatCalendarOptions extends CalendarOptions {
21
26
  * (`numeric: "auto"`), so it reads "Today"/"Tomorrow"/"Yesterday" near
22
27
  * the boundary and "in N days"/"N days ago" further out, all locale-native.
23
28
  * - Beyond `±6` days, falls back to an absolute `dateStyle: "long"` +
24
- * `timeStyle` string with no relative wording, matching Moment's
25
- * `sameElse` behavior.
29
+ * `timeStyle` string with no relative wording. The one-week limit is
30
+ * GMT's own rule, not a standard's: from 7 days out a date is easier to
31
+ * place than a day count.
32
+ * - Comparison: Moment's `.calendar()` switches to a date at the same
33
+ * distance (its `sameElse` case); its wording inside the week differs.
26
34
  * - The connector between the day label and the time is read from CLDR's
27
35
  * own combined date+time pattern for the locale (see
28
36
  * `internal/joinDateTimeConnector.ts`), not hardcoded — this is what lets
29
37
  * `formatCalendar` avoid the i18n objection that excludes a token
30
- * formatter (Decision 1 in `context/roadmap/issues/J.md`).
31
- * - The time never carries a zone name: a plain value has none. A `timeStyle` of `"long"` or
32
- * `"full"` (outside the type) formats as `"medium"`.
38
+ * formatter.
39
+ * - The time never carries a zone name: a plain value has none.
33
40
  * - Use `formatCalendar` for user-facing schedules ("Tomorrow at 2:30 PM");
34
41
  * use `formatRelativeDateTime` for elapsed-time displays ("in 1 day").
35
42
  * - `options` must be an object or omitted: `null` or any other primitive returns `""`, as
@@ -37,7 +44,7 @@ export interface FormatCalendarOptions extends CalendarOptions {
37
44
  *
38
45
  * @param value ISO PlainDateTime string to format
39
46
  * @param locale optional: BCP 47 locale tag, or a preference list of tags (ECMA-402)
40
- * @param options optional: { reference, timeStyle }
47
+ * @param options What the value is compared with and how the time is written
41
48
  * @returns the formatted calendar string, or "" on invalid input
42
49
  *
43
50
  * @example formatCalendar("2026-03-16T14:30:00", "en-US", { reference: "2026-03-15T09:00:00" }) // "tomorrow at 2:30 PM"
@@ -3,15 +3,16 @@ import { Temporal } from "@js-temporal/polyfill";
3
3
  import { joinDateTimeConnector, normalizeDateTime } from "../../internal/index.js";
4
4
  import { plainTimeStyle } from "../../internal/plainFormatOptions.js";
5
5
  import { isValidDateTime } from "../validate/index.js";
6
- // Beyond a week either direction, Moment's `.calendar()` falls back to an
7
- // absolute date rather than "6 days ago" / "in 6 days" wording. GMT follows
8
- // the same threshold (documented, not a byte-for-byte Moment port — see J15).
6
+ import { optionOrDefault } from "../../internal/optionOrDefault.js";
7
+ // GMT's own rule, not a standard's: the relative day label is kept for distances
8
+ // under one week (up to 6 calendar days either way). From 7 days out the phrase
9
+ // is an absolute date, which is easier to place than a day count.
9
10
  const ABS_DAY_THRESHOLD = 6;
10
11
  /**
11
12
  * Format a plain date-time as a relative day label plus time-of-day, e.g.
12
- * "Tomorrow at 2:30 PM" — Moment's `.calendar()`, which the existing
13
- * `formatRelativeDateTime` family does not cover (that family renders
14
- * "in 1 day", an elapsed-time phrase, not a day label + clock time).
13
+ * "Tomorrow at 2:30 PM". The `formatRelativeDateTime` family does not
14
+ * cover this: it renders "in 1 day", an elapsed-time phrase, not a day
15
+ * label + clock time.
15
16
  *
16
17
  * - Within `±6` days of `reference` (default: now), renders `<day label>`
17
18
  * joined to the localized time using the locale's own connector — never a
@@ -19,15 +20,17 @@ const ABS_DAY_THRESHOLD = 6;
19
20
  * (`numeric: "auto"`), so it reads "Today"/"Tomorrow"/"Yesterday" near
20
21
  * the boundary and "in N days"/"N days ago" further out, all locale-native.
21
22
  * - Beyond `±6` days, falls back to an absolute `dateStyle: "long"` +
22
- * `timeStyle` string with no relative wording, matching Moment's
23
- * `sameElse` behavior.
23
+ * `timeStyle` string with no relative wording. The one-week limit is
24
+ * GMT's own rule, not a standard's: from 7 days out a date is easier to
25
+ * place than a day count.
26
+ * - Comparison: Moment's `.calendar()` switches to a date at the same
27
+ * distance (its `sameElse` case); its wording inside the week differs.
24
28
  * - The connector between the day label and the time is read from CLDR's
25
29
  * own combined date+time pattern for the locale (see
26
30
  * `internal/joinDateTimeConnector.ts`), not hardcoded — this is what lets
27
31
  * `formatCalendar` avoid the i18n objection that excludes a token
28
- * formatter (Decision 1 in `context/roadmap/issues/J.md`).
29
- * - The time never carries a zone name: a plain value has none. A `timeStyle` of `"long"` or
30
- * `"full"` (outside the type) formats as `"medium"`.
32
+ * formatter.
33
+ * - The time never carries a zone name: a plain value has none.
31
34
  * - Use `formatCalendar` for user-facing schedules ("Tomorrow at 2:30 PM");
32
35
  * use `formatRelativeDateTime` for elapsed-time displays ("in 1 day").
33
36
  * - `options` must be an object or omitted: `null` or any other primitive returns `""`, as
@@ -35,7 +38,7 @@ const ABS_DAY_THRESHOLD = 6;
35
38
  *
36
39
  * @param value ISO PlainDateTime string to format
37
40
  * @param locale optional: BCP 47 locale tag, or a preference list of tags (ECMA-402)
38
- * @param options optional: { reference, timeStyle }
41
+ * @param options What the value is compared with and how the time is written
39
42
  * @returns the formatted calendar string, or "" on invalid input
40
43
  *
41
44
  * @example formatCalendar("2026-03-16T14:30:00", "en-US", { reference: "2026-03-15T09:00:00" }) // "tomorrow at 2:30 PM"
@@ -52,18 +55,20 @@ export function formatCalendar(value, locale, options = {}) {
52
55
  return "";
53
56
  if (!isValidDateTime(value))
54
57
  return "";
55
- if (options.reference !== undefined && !isValidDateTime(options.reference))
58
+ // Each option is read once (GetOption).
59
+ const referenceOption = options.reference;
60
+ if (referenceOption !== undefined && !isValidDateTime(referenceOption))
56
61
  return "";
57
62
  try {
58
63
  const target = Temporal.PlainDateTime.from(value);
59
- const reference = options.reference
60
- ? Temporal.PlainDateTime.from(options.reference)
64
+ const reference = referenceOption
65
+ ? Temporal.PlainDateTime.from(referenceOption)
61
66
  : Temporal.Now.plainDateTimeISO();
62
67
  const diffDays = target.toPlainDate().since(reference.toPlainDate()).days;
63
68
  // "long"/"full" are outside the type but reachable from JS; their zone
64
69
  // name would describe the UTC anchor, not the value. Temporal's
65
70
  // PlainDateTime format drops timeZoneName (AdjustDateTimeStyleFormat).
66
- const timeStyle = plainTimeStyle(options.timeStyle === undefined ? "short" : options.timeStyle);
71
+ const timeStyle = plainTimeStyle(optionOrDefault(options.timeStyle, "short"));
67
72
  // Plain values carry no timezone. UTC is an arbitrary but stable anchor
68
73
  // for reusing Intl's part-level formatting — any fixed zone reproduces
69
74
  // the same wall-clock fields since there's no real zone to get wrong.
@@ -2,6 +2,7 @@ import { Temporal } from "@js-temporal/polyfill";
2
2
  import { normalizeDateTime } from "../../internal/index.js";
3
3
  import { plainDateFormatOptions } from "../../internal/plainFormatOptions.js";
4
4
  import { isValidDate } from "../validate/index.js";
5
+ import { readDateTimeFormatOptions } from "../../internal/readDateTimeFormatOptions.js";
5
6
  /**
6
7
  * Return a localized string for a PlainDate ISO input using Intl options.
7
8
  *
@@ -45,12 +46,13 @@ export function formatDate(value, locale, options) {
45
46
  // (CreateDateTimeFormat ~date~, ~date~), so the requested fields and
46
47
  // widths are kept. Constructing with the caller's options first surfaces
47
48
  // the TypeError or RangeError Intl.DateTimeFormat raises for invalid ones.
48
- new Intl.DateTimeFormat(locale, options);
49
+ const read = readDateTimeFormatOptions(options);
50
+ new Intl.DateTimeFormat(locale, read);
49
51
  // CreateDateTimeFormat: required ~date~ with a timeStyle is a TypeError.
50
- if (options?.timeStyle !== undefined) {
52
+ if (read.timeStyle !== undefined) {
51
53
  return "";
52
54
  }
53
- const resolved = plainDateFormatOptions(options ?? {});
55
+ const resolved = plainDateFormatOptions(read);
54
56
  if (resolved === null) {
55
57
  return "";
56
58
  }
@@ -2,6 +2,7 @@ import { Temporal } from "@js-temporal/polyfill";
2
2
  import { normalizeDateTime } from "../../internal/index.js";
3
3
  import { plainDateFormatOptions } from "../../internal/plainFormatOptions.js";
4
4
  import { isValidDate } from "../validate/index.js";
5
+ import { readDateTimeFormatOptions } from "../../internal/readDateTimeFormatOptions.js";
5
6
  /**
6
7
  * Format a plain date range using the Temporal Intl.DateTimeFormat formatRange API.
7
8
  *
@@ -43,8 +44,9 @@ export function formatDateRange(start, end, locale, options) {
43
44
  // (GetDateTimeFormat ~date~, ~date~, ~relevant~). Constructing with the
44
45
  // caller's options first surfaces the TypeError or RangeError
45
46
  // Intl.DateTimeFormat raises for invalid ones.
46
- new Intl.DateTimeFormat(locale, options);
47
- const resolved = plainDateFormatOptions(options ?? {});
47
+ const read = readDateTimeFormatOptions(options);
48
+ new Intl.DateTimeFormat(locale, read);
49
+ const resolved = plainDateFormatOptions(read);
48
50
  if (resolved === null) {
49
51
  return "";
50
52
  }
@@ -2,6 +2,7 @@ import { Temporal } from "@js-temporal/polyfill";
2
2
  import { normalizeDateTime } from "../../internal/index.js";
3
3
  import { plainDateTimeFormatOptions } from "../../internal/plainFormatOptions.js";
4
4
  import { isValidDateTime } from "../validate/index.js";
5
+ import { readDateTimeFormatOptions } from "../../internal/readDateTimeFormatOptions.js";
5
6
  /**
6
7
  * Return a localized string for a PlainDateTime ISO input using Intl options.
7
8
  *
@@ -47,9 +48,10 @@ export function formatDateTime(value, locale, options) {
47
48
  // and style widths are kept. Constructing with the caller's options first
48
49
  // surfaces the TypeError or RangeError Intl.DateTimeFormat raises for
49
50
  // invalid ones.
50
- new Intl.DateTimeFormat(locale, options);
51
+ const read = readDateTimeFormatOptions(options);
52
+ new Intl.DateTimeFormat(locale, read);
51
53
  const epochMilliseconds = Temporal.PlainDateTime.from(value).toZonedDateTime("UTC").epochMilliseconds;
52
- return normalizeDateTime(new Intl.DateTimeFormat(locale, plainDateTimeFormatOptions(options ?? {})).format(epochMilliseconds));
54
+ return normalizeDateTime(new Intl.DateTimeFormat(locale, plainDateTimeFormatOptions(read)).format(epochMilliseconds));
53
55
  }
54
56
  catch {
55
57
  return "";
@@ -2,6 +2,7 @@ import { Temporal } from "@js-temporal/polyfill";
2
2
  import { normalizeDateTime } from "../../internal/index.js";
3
3
  import { plainDateTimeFormatOptions } from "../../internal/plainFormatOptions.js";
4
4
  import { isValidDateTime } from "../validate/index.js";
5
+ import { readDateTimeFormatOptions } from "../../internal/readDateTimeFormatOptions.js";
5
6
  /**
6
7
  * Format a plain datetime range using the Temporal Intl.DateTimeFormat formatRange API.
7
8
  *
@@ -46,8 +47,9 @@ export function formatDateTimeRange(start, end, locale, options) {
46
47
  // (GetDateTimeFormat ~any~, ~all~, ~relevant~). Constructing with the
47
48
  // caller's options first surfaces the TypeError or RangeError
48
49
  // Intl.DateTimeFormat raises for invalid ones.
49
- new Intl.DateTimeFormat(locale, options);
50
- const out = new Intl.DateTimeFormat(locale, plainDateTimeFormatOptions(options ?? {})).formatRange(Temporal.PlainDateTime.from(start).toZonedDateTime("UTC")
50
+ const read = readDateTimeFormatOptions(options);
51
+ new Intl.DateTimeFormat(locale, read);
52
+ const out = new Intl.DateTimeFormat(locale, plainDateTimeFormatOptions(read)).formatRange(Temporal.PlainDateTime.from(start).toZonedDateTime("UTC")
51
53
  .epochMilliseconds, Temporal.PlainDateTime.from(end).toZonedDateTime("UTC").epochMilliseconds);
52
54
  return normalizeDateTime(out);
53
55
  }
@@ -5,8 +5,7 @@ import type { DateTimeFormatOptions } from "../../types/index.js";
5
5
  * - This is GMT's substitute for a token formatter (Luxon `toFormat`, date-fns
6
6
  * `format`). A token pattern hard-codes field order and ships US ordering to
7
7
  * every locale; `formatToParts` gives the caller full control over presentation
8
- * while the *locale* keeps control of order. See Decision 1 in
9
- * `context/roadmap/issues/J.md`.
8
+ * while the *locale* keeps control of order.
10
9
  * - Each part is `{ type, value }` where `type` can be:
11
10
  * `"era"`, `"year"`, `"relatedYear"`, `"yearName"`, `"month"`, `"day"`, `"weekday"`,
12
11
  * `"hour"`, `"minute"`, `"second"`, `"fractionalSecond"`, `"dayPeriod"`, `"literal"`.
@@ -24,8 +23,11 @@ import type { DateTimeFormatOptions } from "../../types/index.js";
24
23
  * zone field): a `timeZoneName` option is ignored, and a `"long"`/`"full"` `timeStyle` keeps its
25
24
  * hour, minute and second and drops the zone, formatting as the locale's `"medium"` time. As in
26
25
  * `Intl.DateTimeFormat`, `timeZoneName` together with `dateStyle`/`timeStyle` yields `[]`.
27
- * - Before the day period, `en-US` has used U+202F NARROW NO-BREAK SPACE since CLDR 42 (ICU 72), not
28
- * an ordinary space; the examples write it as `"\u202f"` so the difference is visible.
26
+ * - The literal before the day period depends on the runtime. CLDR 42 (ICU 72) put U+202F NARROW
27
+ * NO-BREAK SPACE there for `en-US`; Node 22 and 24 return it in the parts, and Node 26 returns
28
+ * an ordinary space (U+0020) instead. Both were checked on those runtimes. The examples show the
29
+ * Node 22 and 24 form, written as `"\u202f"` so the difference is visible. Treat the two
30
+ * characters as equal when you compare parts.
29
31
  * - Returns `[]` for invalid input.
30
32
  * - **Compatibility:** before 1.16.0 a call with no field options returned only the date parts.
31
33
  * Pass `{ year: "numeric", month: "numeric", day: "numeric" }` to keep that output.
@@ -50,6 +52,15 @@ import type { DateTimeFormatOptions } from "../../types/index.js";
50
52
  * @example formatDateTimeToParts("2024-02-03T14:30:45", ["fr-FR", "en-US"], { dateStyle: "medium", timeStyle: "short" }) // parts of "3 févr. 2024, 14:30"
51
53
  */
52
54
  export declare function formatDateTimeToParts(value: string, locale?: string | string[], options?: DateTimeFormatOptions): Array<{
55
+ /**
56
+ * The kind of part, named as ECMA-402 `Intl.DateTimeFormat.prototype.formatToParts` names it: a
57
+ * field such as `"year"`, `"month"` or `"day"`, or `"literal"` for the separator text between
58
+ * fields.
59
+ */
53
60
  type: string;
61
+ /**
62
+ * The text of the part in the requested locale, exactly as the formatter wrote it. Joining every
63
+ * `value` in array order gives the whole formatted text.
64
+ */
54
65
  value: string;
55
66
  }>;