@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
@@ -1,11 +1,14 @@
1
1
  import { Temporal } from "@js-temporal/polyfill";
2
+ import { isoYearString } from "./isoYearString.js";
2
3
  /**
3
4
  * One field of a zoned "now" as the `get*NowUnit` accessors return it: zero-padded to two digits
4
- * (three for sub-second fields), the year and day of week unpadded. The week number is the
5
+ * (three for sub-second fields), the day of week unpadded, and the year as Temporal writes one
6
+ * (`isoYearString`: four digits, or a sign and six outside 0000–9999). The week number is the
5
7
  * caller's, since the plain and zoned accessors read it through `parseWeekFromDate` and the utc and
6
8
  * unix ones from the ISO date.
7
9
  *
8
- * @param now the current moment on the wall clock being read
10
+ * @param now the current moment on the wall clock being read: a zoned date-time, or the plain wall
11
+ * clock of a stored UTC offset with seconds, which no time zone identifier can carry
9
12
  * @param unit a singular unit, `dayOfWeek` included (already validated by the caller)
10
13
  * @param week the week number for `now`, as a string
11
14
  * @returns the field, or "" for any other unit
@@ -16,7 +19,7 @@ import { Temporal } from "@js-temporal/polyfill";
16
19
  export function zonedNowUnitValue(now, unit, week) {
17
20
  switch (unit) {
18
21
  case "year":
19
- return now.year.toString();
22
+ return isoYearString(now.year);
20
23
  case "month":
21
24
  return now.month.toString().padStart(2, "0");
22
25
  case "week":
@@ -44,7 +47,8 @@ export function zonedNowUnitValue(now, unit, week) {
44
47
  /**
45
48
  * The ISO 8601 week number of `now`'s date, the week the utc and unix `get*NowUnit` accessors read.
46
49
  *
47
- * @param now the current moment on the wall clock being read
50
+ * @param now the current moment on the wall clock being read: a zoned date-time, or the plain wall
51
+ * clock of a stored UTC offset with seconds, which no time zone identifier can carry
48
52
  * @returns the week number as a string
49
53
  * @example isoWeekOfYear(Temporal.ZonedDateTime.from("2024-12-30T00:00:00+00:00[UTC]")) // "1"
50
54
  */
@@ -3,6 +3,7 @@ import { TIME_ZONE_ANNOTATION } from "./isoStringBody.js";
3
3
  import { MAX_EPOCH_NANOSECONDS, MIN_EPOCH_NANOSECONDS, } from "./epochNanoseconds.js";
4
4
  import { calendarDateAdd as compatCalendarDateAdd, calendarDateUntil as compatCalendarDateUntil, isCalendarArithmeticCompatNeeded, isNudgeWindowCompatNeeded, } from "./temporalCompat/index.js";
5
5
  import { epochNanosecondsFor, isNamedTimeZone, isValidEpoch, utcEpochNanoseconds, zonedDateTimeFrom, } from "./zonedWallClock.js";
6
+ import { isObject } from "./isObject.js";
6
7
  const UNITS = [
7
8
  "year",
8
9
  "month",
@@ -771,7 +772,7 @@ function zonedRelativeTo(relativeTo) {
771
772
  ? zonedDateTimeFrom(relativeTo)
772
773
  : null;
773
774
  }
774
- if (typeof relativeTo === "object" &&
775
+ if (isObject(relativeTo) &&
775
776
  !(relativeTo instanceof Temporal.PlainDateTime) &&
776
777
  "timeZone" in relativeTo &&
777
778
  relativeTo.timeZone !== undefined) {
@@ -956,7 +957,7 @@ function relativeToDayOfMonth(relativeTo, zoned) {
956
957
  if (typeof relativeTo === "string") {
957
958
  return Temporal.PlainDate.from(relativeTo).day;
958
959
  }
959
- if (relativeTo !== null && typeof relativeTo === "object") {
960
+ if (isObject(relativeTo)) {
960
961
  return Temporal.PlainDate.from(relativeTo).day;
961
962
  }
962
963
  }
@@ -978,8 +979,7 @@ function plainRelativeTo(relativeTo) {
978
979
  !timeZoneAnnotation.test(relativeTo)) {
979
980
  return Temporal.PlainDate.from(relativeTo);
980
981
  }
981
- if (relativeTo !== null &&
982
- typeof relativeTo === "object" &&
982
+ if (isObject(relativeTo) &&
983
983
  !(relativeTo instanceof Temporal.ZonedDateTime)) {
984
984
  return Temporal.PlainDate.from(relativeTo);
985
985
  }
@@ -1,5 +1,6 @@
1
1
  import { Temporal } from "@js-temporal/polyfill";
2
2
  import type { Disambiguation, Offset, Overflow } from "../types/index.js";
3
+ import type { DATE_TIME_FIELDS, SetFields } from "./readSetFields.js";
3
4
  type RoundingSmallestUnit = Temporal.SmallestUnit<"day" | "hour" | "minute" | "second" | "millisecond" | "microsecond" | "nanosecond">;
4
5
  interface ZonedRoundTo {
5
6
  smallestUnit: RoundingSmallestUnit;
@@ -125,15 +126,17 @@ interface ZonedWithOptions {
125
126
  disambiguation?: Disambiguation;
126
127
  offset?: Offset;
127
128
  }
129
+ /** The date and time fields a `set*` function passes, as `readSetFields` checked them. */
130
+ type ZonedWithFields = SetFields<(typeof DATE_TIME_FIELDS)[number]>;
128
131
  /**
129
132
  * `ZonedDateTime#with`, correct at the range limits.
130
133
  *
131
134
  * @param zoned the value to change
132
- * @param fields the date/time (and optional offset) fields to set
135
+ * @param fields the date and time fields to set
133
136
  * @param options Temporal `overflow` / `disambiguation` / `offset` (default `"prefer"`)
134
137
  * @returns the changed value; throws where TC39 Temporal throws
135
138
  */
136
- export declare function withZonedFields(zoned: Temporal.ZonedDateTime, fields: Temporal.ZonedDateTimeLike, options?: ZonedWithOptions): Temporal.ZonedDateTime;
139
+ export declare function withZonedFields(zoned: Temporal.ZonedDateTime, fields: ZonedWithFields, options?: ZonedWithOptions): Temporal.ZonedDateTime;
137
140
  /**
138
141
  * `ZonedDateTime#round`, correct at the range limits and, by day, before 1847.
139
142
  *
@@ -2,7 +2,7 @@ import { Temporal } from "@js-temporal/polyfill";
2
2
  import { MAX_EPOCH_NANOSECONDS } from "./epochNanoseconds.js";
3
3
  import { calendarDateAdd, isCalendarArithmeticCompatNeeded, isTransitionSearchCompatNeeded, } from "./temporalCompat/index.js";
4
4
  import { nextTransitionAfter, previousTransitionBefore, } from "./zonedTransitionSearch.js";
5
- import { epochNanosecondsFor, interpretISODateTimeOffset, isNamedTimeZone, isNearRangeEdge, isValidEpoch, MAX_TRANSITIONS_BEFORE_MAXIMUM, missedNextTransition, missedPreviousTransition, needsOwnDayBoundsSearch, needsOwnStartOfDaySearch, NEXT_TRANSITION_HORIZON_NANOSECONDS, startOfDayEpochNanoseconds, timeZoneIdOf, utcOffsetStringNanoseconds, } from "./zonedWallClock.js";
5
+ import { epochNanosecondsFor, interpretISODateTimeOffset, isNamedTimeZone, isNearRangeEdge, isValidEpoch, MAX_TRANSITIONS_BEFORE_MAXIMUM, missedNextTransition, missedPreviousTransition, needsOwnDayBoundsSearch, needsOwnStartOfDaySearch, NEXT_TRANSITION_HORIZON_NANOSECONDS, startOfDayEpochNanoseconds, timeZoneIdOf, } from "./zonedWallClock.js";
6
6
  import { optionOrDefault } from "./optionOrDefault.js";
7
7
  /*
8
8
  * Polyfill-first wrappers for the Temporal operations that resolve a wall clock or a start of day
@@ -480,22 +480,19 @@ export function addToZonedDisambiguated(zoned, duration, sign, options) {
480
480
  /** TC39 `ZonedDateTime#with` at the range limits. */
481
481
  function withAtEdge(zoned, fields, options) {
482
482
  let wall;
483
- let offset;
484
483
  try {
485
484
  Temporal.ZonedDateTime.from(zoned, options);
486
- const { offset: offsetString, ...dateTimeFields } = fields;
487
485
  wall = zoned
488
486
  .toPlainDateTime()
489
- .with(dateTimeFields, { overflow: options?.overflow });
490
- offset = {
491
- nanoseconds: offsetString === undefined
492
- ? BigInt(zoned.offsetNanoseconds)
493
- : utcOffsetStringNanoseconds(offsetString),
494
- };
487
+ .with(fields, { overflow: options?.overflow });
495
488
  }
496
489
  catch {
497
490
  return null;
498
491
  }
492
+ // `fields` holds no offset, so the merged wall clock keeps the receiver's (ZonedDateTime#with).
493
+ const offset = {
494
+ nanoseconds: BigInt(zoned.offsetNanoseconds),
495
+ };
499
496
  if (!isAtRangeEdge(zoned.timeZoneId, wall.toPlainDate())) {
500
497
  return null;
501
498
  }
@@ -506,7 +503,7 @@ function withAtEdge(zoned, fields, options) {
506
503
  * `ZonedDateTime#with`, correct at the range limits.
507
504
  *
508
505
  * @param zoned the value to change
509
- * @param fields the date/time (and optional offset) fields to set
506
+ * @param fields the date and time fields to set
510
507
  * @param options Temporal `overflow` / `disambiguation` / `offset` (default `"prefer"`)
511
508
  * @returns the changed value; throws where TC39 Temporal throws
512
509
  */
@@ -1,5 +1,5 @@
1
1
  // fallow-ignore-file code-duplication -- sibling variant keeps its own guard, parse and try/catch, by design
2
- import { calendarSystemOfDateValue, formatDateInCalendar, isValidAmount, parseCalendarDateValue, plainDateAdd, resolveOverflow, } from "../../internal/index.js";
2
+ import { calendarSystemOfDateValue, formatDateInCalendar, parseCalendarDateValue, plainDateAdd, readDurationUnits, resolveOverflow, } from "../../internal/index.js";
3
3
  import { isValidCalendarDate, isValidDateDurationUnit } from "../validate/index.js";
4
4
  import { isOptionsArgument } from "../../internal/isObject.js";
5
5
  /**
@@ -37,11 +37,8 @@ export function addDate(value /* ISO 8601 date */, units, options) {
37
37
  return "";
38
38
  }
39
39
  const validDate = isValidCalendarDate(value);
40
- const validUnits = typeof units === "object" &&
41
- units !== null &&
42
- Object.keys(units).every(isValidDateDurationUnit);
43
- const validAmounts = validUnits && Object.values(units).every(isValidAmount);
44
- if (!validDate || !validUnits || !validAmounts) {
40
+ const amounts = readDurationUnits(units, isValidDateDurationUnit);
41
+ if (!validDate || amounts === null) {
45
42
  return "";
46
43
  }
47
44
  try {
@@ -50,7 +47,7 @@ export function addDate(value /* ISO 8601 date */, units, options) {
50
47
  return "";
51
48
  }
52
49
  const date = parseCalendarDateValue(value);
53
- const result = plainDateAdd(date, units, resolveOverflow(options?.overflow));
50
+ const result = plainDateAdd(date, amounts, resolveOverflow(options?.overflow));
54
51
  return formatDateInCalendar(result, calendar);
55
52
  }
56
53
  catch {
@@ -1,6 +1,6 @@
1
1
  // fallow-ignore-file code-duplication -- sibling variant keeps its own guard, parse and try/catch, by design
2
2
  import { Temporal } from "@js-temporal/polyfill";
3
- import { isValidAmount, resolveOverflow } from "../../internal/index.js";
3
+ import { readDurationUnits, resolveOverflow } from "../../internal/index.js";
4
4
  import { isValidDateTime, isValidDateTimeDurationUnit } from "../validate/index.js";
5
5
  import { isOptionsArgument } from "../../internal/isObject.js";
6
6
  /**
@@ -24,17 +24,14 @@ export function addDateTime(value, units, options) {
24
24
  return "";
25
25
  }
26
26
  const validDateTime = isValidDateTime(value);
27
- const validUnits = typeof units === "object" &&
28
- units !== null &&
29
- Object.keys(units).every(isValidDateTimeDurationUnit);
30
- const validAmounts = validUnits && Object.values(units).every(isValidAmount);
31
- if (!validDateTime || !validUnits || !validAmounts) {
27
+ const amounts = readDurationUnits(units, isValidDateTimeDurationUnit);
28
+ if (!validDateTime || amounts === null) {
32
29
  return "";
33
30
  }
34
31
  try {
35
32
  const dateTime = Temporal.PlainDateTime.from(value);
36
33
  return dateTime
37
- .add(units, { overflow: resolveOverflow(options?.overflow) })
34
+ .add(amounts, { overflow: resolveOverflow(options?.overflow) })
38
35
  .toString();
39
36
  }
40
37
  catch {
@@ -1,6 +1,6 @@
1
1
  // fallow-ignore-file code-duplication -- sibling variant keeps its own guard, parse and try/catch, by design
2
2
  import { Temporal } from "@js-temporal/polyfill";
3
- import { isValidAmount } from "../../internal/index.js";
3
+ import { readDurationUnits } from "../../internal/index.js";
4
4
  import { isValidTime, isValidTimeDurationUnit } from "../validate/index.js";
5
5
  /**
6
6
  * Return a PlainTime ISO string with `units` added to `value`.
@@ -22,16 +22,13 @@ import { isValidTime, isValidTimeDurationUnit } from "../validate/index.js";
22
22
  export function addTime(value, units) {
23
23
  try {
24
24
  const validTime = isValidTime(value);
25
- const validUnits = typeof units === "object" &&
26
- units !== null &&
27
- Object.keys(units).every(isValidTimeDurationUnit);
28
- const validAmounts = validUnits && Object.values(units).every(isValidAmount);
29
- if (!validTime || !validUnits || !validAmounts) {
25
+ const amounts = readDurationUnits(units, isValidTimeDurationUnit);
26
+ if (!validTime || amounts === null) {
30
27
  return "";
31
28
  }
32
29
  try {
33
30
  const time = Temporal.PlainTime.from(value);
34
- return time.add(units).toString();
31
+ return time.add(amounts).toString();
35
32
  }
36
33
  catch {
37
34
  return "";
@@ -8,7 +8,7 @@ import type { FractionalDigit } from "../../types/index.js";
8
8
  * import { EndOfTimeUnit } from "@northguild/gmt/plain";
9
9
  * const unit: EndOfTimeUnit = "minutes";
10
10
  */
11
- export type EndOfTimeUnit = Temporal.SmallestUnit<Temporal.TimeUnit | "day">;
11
+ export type EndOfTimeUnit = Temporal.SmallestUnit<"day" | Temporal.TimeUnit>;
12
12
  /**
13
13
  * Return the end of the specified time `unit` for a given ISO 8601 time string.
14
14
  *
@@ -8,8 +8,20 @@ import type { Overflow } from "../../types/index.js";
8
8
  * field-by-field: each sequential `.add()` resolves overflow against its own intermediate
9
9
  * value, so setting month-then-day vs. day-then-month on the same target can silently
10
10
  * diverge — `.with()` has no such order-dependence.
11
- * - `fields` may set `year`, `month`, `monthCode`, `day`, `era`, and/or `eraYear`; omitted
12
- * fields keep their current value. An empty object is a no-op.
11
+ * - `fields` may set `year`, `month`, `monthCode` and/or `day`; omitted fields keep their current
12
+ * value. An object with no field set, such as `{}` or `{ year: undefined }`, is a no-op.
13
+ * - Values are not converted: `year`, `month` and `day` must be integer numbers and `monthCode` a
14
+ * string. `null`, a numeric string, a boolean or a fraction returns "", where Temporal would
15
+ * convert or truncate it. A bigint, `NaN` or an infinity returns "" too. A number too large for
16
+ * its field follows `overflow`. A month or day below 1, or a date outside Temporal's range,
17
+ * returns "".
18
+ * - An own key that is not one of these fields, such as a misspelt `yaer`, returns "". So does a
19
+ * field this function does not take, such as `hour`, or a `calendar` or `timeZone` property,
20
+ * whether own, inherited or a getter. A field is read with a property get, as Temporal reads it,
21
+ * so an inherited or getter field is set.
22
+ * - A Temporal date or time object returns "", as Temporal's `with` refuses one. One whose
23
+ * prototype has been replaced with `Object.prototype`, `null` or `Function.prototype` sets
24
+ * nothing instead.
13
25
  * - Returns "" for invalid input.
14
26
  *
15
27
  * @param value ISO PlainDate string
@@ -20,10 +32,15 @@ import type { Overflow } from "../../types/index.js";
20
32
  * @example setDate("2024-03-10", { year: 2025 }) // "2025-03-10"
21
33
  * @example setDate("2024-01-31", { month: 2 }) // "2024-02-29" (constrain clamps to the last valid day)
22
34
  * @example setDate("2024-01-31", { month: 2 }, { overflow: "reject" }) // ""
35
+ * @example setDate("2024-01-31", { month: 13 }) // "2024-12-31" (too large: constrain clamps it)
36
+ * @example setDate("2024-01-31", { month: 0 }) // "" (below 1, under either overflow)
23
37
  * @example setDate("2024-03-10", {}) // "2024-03-10" (empty fields object is a no-op)
38
+ * @example setDate("2024-01-31", { year: "2025" }) // "" (not converted)
39
+ * @example setDate("2024-01-31", { year: 2025, yaer: 1 }) // "" (misspelt key)
40
+ * @example setDate("2024-03-10", { year: 2025, hour: 5 }) // "" (setDate takes no hour)
24
41
  * @example setDate("invalid", { year: 2025 }) // ""
25
42
  */
26
- export declare function setDate(value: string, fields: Omit<Temporal.PlainDateLike, "calendar">, options?: {
43
+ export declare function setDate(value: string, fields: Omit<Temporal.PlainDateLike, "calendar" | "era" | "eraYear">, options?: {
27
44
  /**
28
45
  * What to do when the fields do not form a real date. `"constrain"` clamps to the last valid
29
46
  * day, so `month: 2` on the 31st gives Feb 29 or 28; `"reject"` returns `""`.
@@ -1,5 +1,5 @@
1
1
  import { Temporal } from "@js-temporal/polyfill";
2
- import { resolveOverflow } from "../../internal/index.js";
2
+ import { DATE_FIELDS, readSetFields, resolveOverflow } from "../../internal/index.js";
3
3
  import { isValidDate } from "../validate/index.js";
4
4
  import { isOptionsArgument } from "../../internal/isObject.js";
5
5
  /**
@@ -10,8 +10,20 @@ import { isOptionsArgument } from "../../internal/isObject.js";
10
10
  * field-by-field: each sequential `.add()` resolves overflow against its own intermediate
11
11
  * value, so setting month-then-day vs. day-then-month on the same target can silently
12
12
  * diverge — `.with()` has no such order-dependence.
13
- * - `fields` may set `year`, `month`, `monthCode`, `day`, `era`, and/or `eraYear`; omitted
14
- * fields keep their current value. An empty object is a no-op.
13
+ * - `fields` may set `year`, `month`, `monthCode` and/or `day`; omitted fields keep their current
14
+ * value. An object with no field set, such as `{}` or `{ year: undefined }`, is a no-op.
15
+ * - Values are not converted: `year`, `month` and `day` must be integer numbers and `monthCode` a
16
+ * string. `null`, a numeric string, a boolean or a fraction returns "", where Temporal would
17
+ * convert or truncate it. A bigint, `NaN` or an infinity returns "" too. A number too large for
18
+ * its field follows `overflow`. A month or day below 1, or a date outside Temporal's range,
19
+ * returns "".
20
+ * - An own key that is not one of these fields, such as a misspelt `yaer`, returns "". So does a
21
+ * field this function does not take, such as `hour`, or a `calendar` or `timeZone` property,
22
+ * whether own, inherited or a getter. A field is read with a property get, as Temporal reads it,
23
+ * so an inherited or getter field is set.
24
+ * - A Temporal date or time object returns "", as Temporal's `with` refuses one. One whose
25
+ * prototype has been replaced with `Object.prototype`, `null` or `Function.prototype` sets
26
+ * nothing instead.
15
27
  * - Returns "" for invalid input.
16
28
  *
17
29
  * @param value ISO PlainDate string
@@ -22,7 +34,12 @@ import { isOptionsArgument } from "../../internal/isObject.js";
22
34
  * @example setDate("2024-03-10", { year: 2025 }) // "2025-03-10"
23
35
  * @example setDate("2024-01-31", { month: 2 }) // "2024-02-29" (constrain clamps to the last valid day)
24
36
  * @example setDate("2024-01-31", { month: 2 }, { overflow: "reject" }) // ""
37
+ * @example setDate("2024-01-31", { month: 13 }) // "2024-12-31" (too large: constrain clamps it)
38
+ * @example setDate("2024-01-31", { month: 0 }) // "" (below 1, under either overflow)
25
39
  * @example setDate("2024-03-10", {}) // "2024-03-10" (empty fields object is a no-op)
40
+ * @example setDate("2024-01-31", { year: "2025" }) // "" (not converted)
41
+ * @example setDate("2024-01-31", { year: 2025, yaer: 1 }) // "" (misspelt key)
42
+ * @example setDate("2024-03-10", { year: 2025, hour: 5 }) // "" (setDate takes no hour)
26
43
  * @example setDate("invalid", { year: 2025 }) // ""
27
44
  */
28
45
  export function setDate(value, fields, options) {
@@ -33,12 +50,15 @@ export function setDate(value, fields, options) {
33
50
  return "";
34
51
  try {
35
52
  const date = Temporal.PlainDate.from(value);
36
- // Temporal.PlainDate.prototype.with() throws on an empty fields object ("no supported
37
- // properties found") rather than treating it as a no-op, so short-circuit here.
38
- if (Object.keys(fields).length === 0)
53
+ const set = readSetFields(fields, DATE_FIELDS);
54
+ if (set === null)
55
+ return "";
56
+ // Only the values readSetFields checked reach Temporal. An empty result sets nothing: a
57
+ // no-op here, where Temporal's with() would throw.
58
+ if (Object.keys(set).length === 0)
39
59
  return date.toString();
40
60
  return date
41
- .with(fields, { overflow: resolveOverflow(options?.overflow) })
61
+ .with(set, { overflow: resolveOverflow(options?.overflow) })
42
62
  .toString();
43
63
  }
44
64
  catch {
@@ -7,8 +7,19 @@ import type { Overflow } from "../../types/index.js";
7
7
  * single atomic overflow pass — see `setDate`'s doc for why that matters over composing
8
8
  * `addDateTime()` calls field-by-field.
9
9
  * - `fields` may set any of `year`, `month`, `monthCode`, `day`, `hour`, `minute`, `second`,
10
- * `millisecond`, `microsecond`, `nanosecond`, `era`, and/or `eraYear`; omitted fields keep
11
- * their current value. An empty object is a no-op.
10
+ * `millisecond`, `microsecond` and/or `nanosecond`; omitted fields keep their current value. An
11
+ * object with no field set, such as `{}` or `{ year: undefined }`, is a no-op.
12
+ * - Values are not converted: `monthCode` must be a string and every other field an integer number.
13
+ * `null`, a numeric string, a boolean or a fraction returns "", where Temporal would convert or
14
+ * truncate it. A bigint, `NaN` or an infinity returns "" too. A number too large for its
15
+ * field follows `overflow`. A month or day below 1, or a date outside Temporal's range, returns
16
+ * "".
17
+ * - An own key that is not one of these fields, such as a misspelt `yaer`, returns "". So does an
18
+ * era, or a `calendar` or `timeZone` property, whether own, inherited or a getter. A field is
19
+ * read with a property get, as Temporal reads it, so an inherited or getter field is set.
20
+ * - A Temporal date or time object returns "", as Temporal's `with` refuses one. One whose
21
+ * prototype has been replaced with `Object.prototype`, `null` or `Function.prototype` sets
22
+ * nothing instead.
12
23
  * - Returns "" for invalid input.
13
24
  *
14
25
  * @param value ISO PlainDateTime string
@@ -20,9 +31,10 @@ import type { Overflow } from "../../types/index.js";
20
31
  * @example setDateTime("2024-01-31T12:00:00", { month: 2 }) // "2024-02-29T12:00:00" (constrain clamps to the last valid day)
21
32
  * @example setDateTime("2024-01-31T12:00:00", { month: 2 }, { overflow: "reject" }) // ""
22
33
  * @example setDateTime("2024-03-10T12:00:00", {}) // "2024-03-10T12:00:00" (empty fields object is a no-op)
34
+ * @example setDateTime("2024-03-10T12:00:00", { hour: "9" }) // "" (not converted)
23
35
  * @example setDateTime("invalid", { hour: 9 }) // ""
24
36
  */
25
- export declare function setDateTime(value: string, fields: Omit<Temporal.PlainDateTimeLike, "calendar">, options?: {
37
+ export declare function setDateTime(value: string, fields: Omit<Temporal.PlainDateTimeLike, "calendar" | "era" | "eraYear">, options?: {
26
38
  /**
27
39
  * What to do when the fields do not form a real date-time. `"constrain"` clamps each field to
28
40
  * its nearest valid value, so `month: 2` on the 31st gives Feb 29 or 28; `"reject"` returns
@@ -1,5 +1,5 @@
1
1
  import { Temporal } from "@js-temporal/polyfill";
2
- import { resolveOverflow } from "../../internal/index.js";
2
+ import { DATE_TIME_FIELDS, readSetFields, resolveOverflow, } from "../../internal/index.js";
3
3
  import { isValidDateTime } from "../validate/index.js";
4
4
  import { isOptionsArgument } from "../../internal/isObject.js";
5
5
  /**
@@ -9,8 +9,19 @@ import { isOptionsArgument } from "../../internal/isObject.js";
9
9
  * single atomic overflow pass — see `setDate`'s doc for why that matters over composing
10
10
  * `addDateTime()` calls field-by-field.
11
11
  * - `fields` may set any of `year`, `month`, `monthCode`, `day`, `hour`, `minute`, `second`,
12
- * `millisecond`, `microsecond`, `nanosecond`, `era`, and/or `eraYear`; omitted fields keep
13
- * their current value. An empty object is a no-op.
12
+ * `millisecond`, `microsecond` and/or `nanosecond`; omitted fields keep their current value. An
13
+ * object with no field set, such as `{}` or `{ year: undefined }`, is a no-op.
14
+ * - Values are not converted: `monthCode` must be a string and every other field an integer number.
15
+ * `null`, a numeric string, a boolean or a fraction returns "", where Temporal would convert or
16
+ * truncate it. A bigint, `NaN` or an infinity returns "" too. A number too large for its
17
+ * field follows `overflow`. A month or day below 1, or a date outside Temporal's range, returns
18
+ * "".
19
+ * - An own key that is not one of these fields, such as a misspelt `yaer`, returns "". So does an
20
+ * era, or a `calendar` or `timeZone` property, whether own, inherited or a getter. A field is
21
+ * read with a property get, as Temporal reads it, so an inherited or getter field is set.
22
+ * - A Temporal date or time object returns "", as Temporal's `with` refuses one. One whose
23
+ * prototype has been replaced with `Object.prototype`, `null` or `Function.prototype` sets
24
+ * nothing instead.
14
25
  * - Returns "" for invalid input.
15
26
  *
16
27
  * @param value ISO PlainDateTime string
@@ -22,6 +33,7 @@ import { isOptionsArgument } from "../../internal/isObject.js";
22
33
  * @example setDateTime("2024-01-31T12:00:00", { month: 2 }) // "2024-02-29T12:00:00" (constrain clamps to the last valid day)
23
34
  * @example setDateTime("2024-01-31T12:00:00", { month: 2 }, { overflow: "reject" }) // ""
24
35
  * @example setDateTime("2024-03-10T12:00:00", {}) // "2024-03-10T12:00:00" (empty fields object is a no-op)
36
+ * @example setDateTime("2024-03-10T12:00:00", { hour: "9" }) // "" (not converted)
25
37
  * @example setDateTime("invalid", { hour: 9 }) // ""
26
38
  */
27
39
  export function setDateTime(value, fields, options) {
@@ -32,12 +44,15 @@ export function setDateTime(value, fields, options) {
32
44
  return "";
33
45
  try {
34
46
  const dateTime = Temporal.PlainDateTime.from(value);
35
- // Temporal.PlainDateTime.prototype.with() throws on an empty fields object ("no supported
36
- // properties found") rather than treating it as a no-op, so short-circuit here.
37
- if (Object.keys(fields).length === 0)
47
+ const set = readSetFields(fields, DATE_TIME_FIELDS);
48
+ if (set === null)
49
+ return "";
50
+ // Only the values readSetFields checked reach Temporal. An empty result sets nothing: a
51
+ // no-op here, where Temporal's with() would throw.
52
+ if (Object.keys(set).length === 0)
38
53
  return dateTime.toString();
39
54
  return dateTime
40
- .with(fields, { overflow: resolveOverflow(options?.overflow) })
55
+ .with(set, { overflow: resolveOverflow(options?.overflow) })
41
56
  .toString();
42
57
  }
43
58
  catch {
@@ -7,7 +7,18 @@ import type { Overflow } from "../../types/index.js";
7
7
  * single atomic overflow pass — see `setDate`'s doc for why that matters over composing
8
8
  * `addTime()` calls field-by-field.
9
9
  * - `fields` may set any of `hour`, `minute`, `second`, `millisecond`, `microsecond`, and/or
10
- * `nanosecond`; omitted fields keep their current value. An empty object is a no-op.
10
+ * `nanosecond`; omitted fields keep their current value. An object with no field set, such as
11
+ * `{}` or `{ hour: undefined }`, is a no-op.
12
+ * - Values are not converted: all six fields must be integer numbers. `null`, a numeric string, a
13
+ * boolean or a fraction returns "", where Temporal would convert or truncate it. A bigint, `NaN`
14
+ * or an infinity returns "" too. An out-of-range number follows `overflow`.
15
+ * - An own key that is not one of these fields, such as a misspelt `huor`, returns "". So does a
16
+ * date field, such as `year`, or a `calendar` or `timeZone` property, whether own, inherited or a
17
+ * getter. A field is read with a property get, as Temporal reads it, so an inherited or getter
18
+ * field is set.
19
+ * - A Temporal date or time object returns "", as Temporal's `with` refuses one. One whose
20
+ * prototype has been replaced with `Object.prototype`, `null` or `Function.prototype` sets
21
+ * nothing instead.
11
22
  * - Unlike `addTime`, which takes no `overflow` because addition always wraps around the clock,
12
23
  * `overflow` has an effect here: `.with()` assigns fixed field values rather than adding a
13
24
  * delta.
@@ -22,6 +33,7 @@ import type { Overflow } from "../../types/index.js";
22
33
  * @example setTime("12:00:00", { hour: 25 }) // "23:00:00" (constrain clamps to the max valid hour)
23
34
  * @example setTime("12:00:00", { hour: 25 }, { overflow: "reject" }) // ""
24
35
  * @example setTime("12:00:00", {}) // "12:00:00" (empty fields object is a no-op)
36
+ * @example setTime("12:00:00", { hour: 9.5 }) // "" (not truncated)
25
37
  * @example setTime("invalid", { hour: 9 }) // ""
26
38
  */
27
39
  export declare function setTime(value: string, fields: Temporal.PlainTimeLike, options?: {
@@ -1,5 +1,5 @@
1
1
  import { Temporal } from "@js-temporal/polyfill";
2
- import { resolveOverflow } from "../../internal/index.js";
2
+ import { TIME_FIELDS, readSetFields, resolveOverflow } from "../../internal/index.js";
3
3
  import { isValidTime } from "../validate/index.js";
4
4
  import { isOptionsArgument } from "../../internal/isObject.js";
5
5
  /**
@@ -9,7 +9,18 @@ import { isOptionsArgument } from "../../internal/isObject.js";
9
9
  * single atomic overflow pass — see `setDate`'s doc for why that matters over composing
10
10
  * `addTime()` calls field-by-field.
11
11
  * - `fields` may set any of `hour`, `minute`, `second`, `millisecond`, `microsecond`, and/or
12
- * `nanosecond`; omitted fields keep their current value. An empty object is a no-op.
12
+ * `nanosecond`; omitted fields keep their current value. An object with no field set, such as
13
+ * `{}` or `{ hour: undefined }`, is a no-op.
14
+ * - Values are not converted: all six fields must be integer numbers. `null`, a numeric string, a
15
+ * boolean or a fraction returns "", where Temporal would convert or truncate it. A bigint, `NaN`
16
+ * or an infinity returns "" too. An out-of-range number follows `overflow`.
17
+ * - An own key that is not one of these fields, such as a misspelt `huor`, returns "". So does a
18
+ * date field, such as `year`, or a `calendar` or `timeZone` property, whether own, inherited or a
19
+ * getter. A field is read with a property get, as Temporal reads it, so an inherited or getter
20
+ * field is set.
21
+ * - A Temporal date or time object returns "", as Temporal's `with` refuses one. One whose
22
+ * prototype has been replaced with `Object.prototype`, `null` or `Function.prototype` sets
23
+ * nothing instead.
13
24
  * - Unlike `addTime`, which takes no `overflow` because addition always wraps around the clock,
14
25
  * `overflow` has an effect here: `.with()` assigns fixed field values rather than adding a
15
26
  * delta.
@@ -24,6 +35,7 @@ import { isOptionsArgument } from "../../internal/isObject.js";
24
35
  * @example setTime("12:00:00", { hour: 25 }) // "23:00:00" (constrain clamps to the max valid hour)
25
36
  * @example setTime("12:00:00", { hour: 25 }, { overflow: "reject" }) // ""
26
37
  * @example setTime("12:00:00", {}) // "12:00:00" (empty fields object is a no-op)
38
+ * @example setTime("12:00:00", { hour: 9.5 }) // "" (not truncated)
27
39
  * @example setTime("invalid", { hour: 9 }) // ""
28
40
  */
29
41
  export function setTime(value, fields, options) {
@@ -34,12 +46,15 @@ export function setTime(value, fields, options) {
34
46
  return "";
35
47
  try {
36
48
  const time = Temporal.PlainTime.from(value);
37
- // Temporal.PlainTime.prototype.with() throws on an empty fields object ("invalid time-like")
38
- // rather than treating it as a no-op, so short-circuit here.
39
- if (Object.keys(fields).length === 0)
49
+ const set = readSetFields(fields, TIME_FIELDS);
50
+ if (set === null)
51
+ return "";
52
+ // Only the values readSetFields checked reach Temporal. An empty result sets nothing: a
53
+ // no-op here, where Temporal's with() would throw.
54
+ if (Object.keys(set).length === 0)
40
55
  return time.toString();
41
56
  return time
42
- .with(fields, { overflow: resolveOverflow(options?.overflow) })
57
+ .with(set, { overflow: resolveOverflow(options?.overflow) })
43
58
  .toString();
44
59
  }
45
60
  catch {
@@ -7,7 +7,7 @@ import type { FractionalDigit } from "../../types/index.js";
7
7
  * import { StartOfTimeUnit } from "@northguild/gmt/plain";
8
8
  * const unit: StartOfTimeUnit = "hours";
9
9
  */
10
- export type StartOfTimeUnit = Temporal.SmallestUnit<Temporal.TimeUnit | "day">;
10
+ export type StartOfTimeUnit = Temporal.SmallestUnit<"day" | Temporal.TimeUnit>;
11
11
  /**
12
12
  * Return the start of the specified time `unit` for a given ISO 8601 time string.
13
13
  *
@@ -1,6 +1,6 @@
1
1
  // fallow-ignore-file code-duplication -- sibling variant keeps its own guard, parse and try/catch, by design
2
2
  import { Temporal } from "@js-temporal/polyfill";
3
- import { calendarSystemOfDateValue, formatDateInCalendar, isValidAmount, parseCalendarDateValue, plainDateAdd, resolveOverflow, } from "../../internal/index.js";
3
+ import { calendarSystemOfDateValue, formatDateInCalendar, parseCalendarDateValue, plainDateAdd, readDurationUnits, resolveOverflow, } from "../../internal/index.js";
4
4
  import { isValidCalendarDate, isValidDateDurationUnit } from "../validate/index.js";
5
5
  import { isOptionsArgument } from "../../internal/isObject.js";
6
6
  /**
@@ -30,11 +30,8 @@ export function subtractDate(value, units, options) {
30
30
  return "";
31
31
  }
32
32
  const validDate = isValidCalendarDate(value);
33
- const validUnits = typeof units === "object" &&
34
- units !== null &&
35
- Object.keys(units).every(isValidDateDurationUnit);
36
- const validAmounts = validUnits && Object.values(units).every(isValidAmount);
37
- if (!validDate || !validUnits || !validAmounts) {
33
+ const amounts = readDurationUnits(units, isValidDateDurationUnit);
34
+ if (!validDate || amounts === null) {
38
35
  return "";
39
36
  }
40
37
  try {
@@ -43,7 +40,7 @@ export function subtractDate(value, units, options) {
43
40
  return "";
44
41
  }
45
42
  const date = parseCalendarDateValue(value);
46
- const result = plainDateAdd(date, Temporal.Duration.from(units).negated(), resolveOverflow(options?.overflow));
43
+ const result = plainDateAdd(date, Temporal.Duration.from(amounts).negated(), resolveOverflow(options?.overflow));
47
44
  return formatDateInCalendar(result, calendar);
48
45
  }
49
46
  catch {
@@ -1,6 +1,6 @@
1
1
  // fallow-ignore-file code-duplication -- sibling variant keeps its own guard, parse and try/catch, by design
2
2
  import { Temporal } from "@js-temporal/polyfill";
3
- import { isValidAmount, resolveOverflow } from "../../internal/index.js";
3
+ import { readDurationUnits, resolveOverflow } from "../../internal/index.js";
4
4
  import { isValidDateTime, isValidDateTimeDurationUnit } from "../validate/index.js";
5
5
  import { isOptionsArgument } from "../../internal/isObject.js";
6
6
  /**
@@ -24,17 +24,14 @@ export function subtractDateTime(value, units, options) {
24
24
  return "";
25
25
  }
26
26
  const validDateTime = isValidDateTime(value);
27
- const validUnits = typeof units === "object" &&
28
- units !== null &&
29
- Object.keys(units).every(isValidDateTimeDurationUnit);
30
- const validAmounts = validUnits && Object.values(units).every(isValidAmount);
31
- if (!validDateTime || !validUnits || !validAmounts) {
27
+ const amounts = readDurationUnits(units, isValidDateTimeDurationUnit);
28
+ if (!validDateTime || amounts === null) {
32
29
  return "";
33
30
  }
34
31
  try {
35
32
  const dateTime = Temporal.PlainDateTime.from(value);
36
33
  return dateTime
37
- .subtract(units, { overflow: resolveOverflow(options?.overflow) })
34
+ .subtract(amounts, { overflow: resolveOverflow(options?.overflow) })
38
35
  .toString();
39
36
  }
40
37
  catch {
@@ -1,6 +1,6 @@
1
1
  // fallow-ignore-file code-duplication -- sibling variant keeps its own guard, parse and try/catch, by design
2
2
  import { Temporal } from "@js-temporal/polyfill";
3
- import { isValidAmount } from "../../internal/index.js";
3
+ import { readDurationUnits } from "../../internal/index.js";
4
4
  import { isValidTime, isValidTimeDurationUnit } from "../validate/index.js";
5
5
  /**
6
6
  * Return a PlainTime ISO string with `units` subtracted from `value`.
@@ -22,16 +22,13 @@ import { isValidTime, isValidTimeDurationUnit } from "../validate/index.js";
22
22
  export function subtractTime(value, units) {
23
23
  try {
24
24
  const validTime = isValidTime(value);
25
- const validUnits = typeof units === "object" &&
26
- units !== null &&
27
- Object.keys(units).every(isValidTimeDurationUnit);
28
- const validAmounts = validUnits && Object.values(units).every(isValidAmount);
29
- if (!validTime || !validUnits || !validAmounts) {
25
+ const amounts = readDurationUnits(units, isValidTimeDurationUnit);
26
+ if (!validTime || amounts === null) {
30
27
  return "";
31
28
  }
32
29
  try {
33
30
  const time = Temporal.PlainTime.from(value);
34
- return time.subtract(units).toString();
31
+ return time.subtract(amounts).toString();
35
32
  }
36
33
  catch {
37
34
  return "";