@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
@@ -0,0 +1,78 @@
1
+ import { isObject } from "./isObject.js";
2
+ import { isValidAmount } from "./isValidAmount.js";
3
+ /**
4
+ * The ten fields TC39 Temporal reads from a duration-like object, in the order it reads them:
5
+ * ToTemporalPartialDurationRecord (7.5.18) gets them in alphabetical order.
6
+ */
7
+ const DURATION_UNIT_NAMES = [
8
+ "days",
9
+ "hours",
10
+ "microseconds",
11
+ "milliseconds",
12
+ "minutes",
13
+ "months",
14
+ "nanoseconds",
15
+ "seconds",
16
+ "weeks",
17
+ "years",
18
+ ];
19
+ /**
20
+ * Read a `units` argument, such as `{ minutes: 15 }`, the way Temporal reads a duration-like
21
+ * object, and return the amounts as a fresh plain object that holds only the caller's units.
22
+ *
23
+ * The check and the read are one pass, so nothing reaches Temporal that was not checked:
24
+ *
25
+ * - `units` must be an Object (`isObject`), a function included.
26
+ * - An own enumerable string key that `isAllowed` refuses returns `null`, whatever its value.
27
+ * This is the guard against a misspelt key, which Temporal on its own ignores. A symbol key and
28
+ * a non-enumerable key that is no unit name are not entries and are ignored.
29
+ * - Each of the ten unit names is read once with an ordinary property get, in the order Temporal's
30
+ * ToTemporalPartialDurationRecord reads them, so an inherited or non-enumerable unit applies.
31
+ * `undefined` means the unit is absent. Any other value must be a finite number; nothing is
32
+ * converted to one.
33
+ * - A unit `isAllowed` refuses returns `null` when its amount is not zero. Zero is no amount:
34
+ * Temporal too tells a calendar duration from an exact one by its nonzero fields.
35
+ * - No allowed unit present returns `null`.
36
+ *
37
+ * Whole numbers, one sign and the range are left to Temporal, which throws for each. A getter
38
+ * that throws is not caught here; the calling function's own catch returns its sentinel.
39
+ *
40
+ * @param units the caller's `units` argument
41
+ * @param isAllowed type guard for the units the calling function takes
42
+ * @returns a new plain object of the allowed units that were present, or null on invalid input
43
+ *
44
+ * @example readDurationUnits({ minutes: 15 }, isValidTimeDurationUnit) // { minutes: 15 }
45
+ * @example readDurationUnits({ minutes: 15, hours: undefined }, isValidTimeDurationUnit) // { minutes: 15 }
46
+ * @example readDurationUnits({ minutes: 15, hour: 1 }, isValidTimeDurationUnit) // null (unknown key)
47
+ * @example readDurationUnits(Object.create({ minutes: "15" }), isValidTimeDurationUnit) // null (not a number)
48
+ * @example readDurationUnits(Object.create({ days: 1 }), isValidTimeDurationUnit) // null (a unit outside the set)
49
+ * @example readDurationUnits({}, isValidTimeDurationUnit) // null
50
+ */
51
+ export function readDurationUnits(units, isAllowed) {
52
+ if (!isObject(units)) {
53
+ return null;
54
+ }
55
+ if (!Object.keys(units).every((key) => isAllowed(key))) {
56
+ return null;
57
+ }
58
+ const record = units;
59
+ const read = {};
60
+ let present = false;
61
+ for (const name of DURATION_UNIT_NAMES) {
62
+ const amount = record[name];
63
+ if (amount === undefined) {
64
+ continue;
65
+ }
66
+ if (!isValidAmount(amount)) {
67
+ return null;
68
+ }
69
+ if (isAllowed(name)) {
70
+ read[name] = amount;
71
+ present = true;
72
+ }
73
+ else if (amount !== 0) {
74
+ return null;
75
+ }
76
+ }
77
+ return present ? read : null;
78
+ }
@@ -0,0 +1,50 @@
1
+ /** The date fields `setDate` takes. */
2
+ export declare const DATE_FIELDS: readonly ["year", "month", "monthCode", "day"];
3
+ /** The time fields `setTime` takes. */
4
+ export declare const TIME_FIELDS: readonly ["hour", "minute", "second", "millisecond", "microsecond", "nanosecond"];
5
+ /** The fields `setDateTime`, `setUtc`, `setUnix` and `setZoned` take. */
6
+ export declare const DATE_TIME_FIELDS: readonly ["year", "month", "monthCode", "day", "hour", "minute", "second", "millisecond", "microsecond", "nanosecond"];
7
+ /** The one field whose value is a string; every other field a `set*` function takes is a number. */
8
+ declare const STRING_FIELD = "monthCode";
9
+ /** A field a `set*` function may take. */
10
+ type SetField = (typeof DATE_TIME_FIELDS)[number];
11
+ /** The checked values of the fields in `Field`: `monthCode` a string, every other an integer. */
12
+ export type SetFields<Field extends SetField> = {
13
+ [Name in Field]?: Name extends typeof STRING_FIELD ? string : number;
14
+ };
15
+ /**
16
+ * Read the `fields` argument of a `set*` function the way Temporal's `with` reads it, and return
17
+ * the values as a fresh plain object that holds only the fields the function takes.
18
+ *
19
+ * The check and the read are one pass, so nothing reaches Temporal that was not checked:
20
+ *
21
+ * - `fields` must be an Object (`isObject`), a function included, and not a Temporal object that
22
+ * holds a date or a time (TC39 IsPartialTemporalObject).
23
+ * - An own enumerable string key outside `allowedFields` returns `null`, whatever its value: the guard
24
+ * against a misspelt key. A symbol key is ignored.
25
+ * - Each property `with` reads is read once with an ordinary property get, in the order `with`
26
+ * reads them, so an inherited, non-enumerable or getter field applies. `undefined` means absent.
27
+ * A defined property outside `allowedFields` (another type's field, an era, an offset, a
28
+ * `calendar` or a `timeZone`) returns `null`.
29
+ * - A value is not converted: `monthCode` must be a string, and every other field a number that is
30
+ * an integer. `null`, a numeric string, a boolean and a fraction return `null`, where Temporal
31
+ * would convert or truncate them. A bigint, `NaN` and an infinity return `null` too; Temporal
32
+ * throws for them (ToIntegerWithTruncation).
33
+ *
34
+ * Range and overflow are left to Temporal. An empty result means nothing is set: the function
35
+ * returns its value unchanged, where Temporal's `with` would throw. A getter that throws is not
36
+ * caught here, nor is a Proxy's `getPrototypeOf` trap that throws; the calling function's own catch
37
+ * returns its sentinel.
38
+ *
39
+ * @param fields the caller's `fields` argument
40
+ * @param allowedFields the fields the calling function takes
41
+ * @returns a new plain object of the fields set, empty when none is, or null on invalid input
42
+ *
43
+ * @example readSetFields({ year: 2025 }, DATE_FIELDS) // { year: 2025 }
44
+ * @example readSetFields({}, DATE_FIELDS) // {} (nothing set)
45
+ * @example readSetFields({ year: "2025" }, DATE_FIELDS) // null (not converted)
46
+ * @example readSetFields({ year: 2025, yaer: 1 }, DATE_FIELDS) // null (misspelt key)
47
+ * @example readSetFields({ year: 2025, hour: 5 }, DATE_FIELDS) // null (a field setDate does not take)
48
+ */
49
+ export declare function readSetFields<Field extends SetField>(fields: unknown, allowedFields: readonly Field[]): SetFields<Field> | null;
50
+ export {};
@@ -0,0 +1,179 @@
1
+ import { Temporal } from "@js-temporal/polyfill";
2
+ import { isObject } from "./isObject.js";
3
+ /** The date fields `setDate` takes. */
4
+ export const DATE_FIELDS = ["year", "month", "monthCode", "day"];
5
+ /** The time fields `setTime` takes. */
6
+ export const TIME_FIELDS = [
7
+ "hour",
8
+ "minute",
9
+ "second",
10
+ "millisecond",
11
+ "microsecond",
12
+ "nanosecond",
13
+ ];
14
+ /** The fields `setDateTime`, `setUtc`, `setUnix` and `setZoned` take. */
15
+ export const DATE_TIME_FIELDS = [...DATE_FIELDS, ...TIME_FIELDS];
16
+ /**
17
+ * Every property TC39 Temporal's `with` methods read from their argument, in the order they read
18
+ * them: `calendar` and `timeZone` first, which IsPartialTemporalObject (13.24) refuses, then the
19
+ * date and time fields and the `offset` that `ZonedDateTime.prototype.with` reads, in code-unit
20
+ * order. PrepareCalendarFields (12.3.3) sorts them so for every `with` that takes a date, and
21
+ * ToTemporalTimeRecord (4.5.12), which `PlainTime.prototype.with` uses, reads its six fields in
22
+ * the same order. The list adds the era fields,
23
+ * which `with` never reads for the ISO 8601 calendar (CalendarExtraFields returns none) and which
24
+ * GMT reads only to refuse them.
25
+ */
26
+ const WITH_PROPERTY_NAMES = [
27
+ "calendar",
28
+ "timeZone",
29
+ "day",
30
+ "era",
31
+ "eraYear",
32
+ "hour",
33
+ "microsecond",
34
+ "millisecond",
35
+ "minute",
36
+ "month",
37
+ "monthCode",
38
+ "nanosecond",
39
+ "offset",
40
+ "second",
41
+ "year",
42
+ ];
43
+ /** The one field whose value is a string; every other field a `set*` function takes is a number. */
44
+ const STRING_FIELD = "monthCode";
45
+ /**
46
+ * For each Temporal class whose objects hold a date or a time (the internal slots TC39
47
+ * IsPartialTemporalObject tests), a getter that throws for any receiver without that slot.
48
+ */
49
+ const BRANDED_GETTERS = [
50
+ ["PlainDate", "calendarId"],
51
+ ["PlainDateTime", "calendarId"],
52
+ ["PlainMonthDay", "calendarId"],
53
+ ["PlainYearMonth", "calendarId"],
54
+ ["ZonedDateTime", "calendarId"],
55
+ ["PlainTime", "hour"],
56
+ ];
57
+ /** Whether `value` holds the internal slot of one class of `namespace`. */
58
+ function isObjectOf(namespace, value) {
59
+ return BRANDED_GETTERS.some(([name, key]) => {
60
+ const prototype = namespace[name]?.prototype;
61
+ const getter = isObject(prototype)
62
+ ? Object.getOwnPropertyDescriptor(prototype, key)?.get
63
+ : undefined;
64
+ if (typeof getter !== "function") {
65
+ return false;
66
+ }
67
+ try {
68
+ getter.call(value);
69
+ return true;
70
+ }
71
+ catch {
72
+ return false;
73
+ }
74
+ });
75
+ }
76
+ /**
77
+ * Whether `value` is an object of the Temporal the host provides on `globalThis`, if any. A
78
+ * malformed host Temporal recognises nothing, so it never changes the result for a field object.
79
+ */
80
+ function isHostTemporalObject(value) {
81
+ try {
82
+ const host = globalThis.Temporal;
83
+ return (isObject(host) &&
84
+ host !== Temporal &&
85
+ isObjectOf(host, value));
86
+ }
87
+ catch {
88
+ return false;
89
+ }
90
+ }
91
+ /**
92
+ * Whether `value` is a Temporal object that holds a date or a time, from the polyfill GMT uses or
93
+ * from a Temporal the host provides. The test is the one a class's own getter makes: it reads the
94
+ * internal slot, so neither the prototype chain nor any property of `value` decides it.
95
+ *
96
+ * The check calls up to six getters, twelve with a host Temporal, and a throwing getter is slow, so
97
+ * it is skipped when the prototype is `Object.prototype`, `null` or `Function.prototype`: a plain
98
+ * object, an `Object.create(null)` object or a function, which no Temporal class makes.
99
+ *
100
+ * Limits:
101
+ * - An object from a second copy of the polyfill that is not on `globalThis` is not detected and
102
+ * is read as a field bag, which is also what TC39 IsPartialTemporalObject (13.24) does with an
103
+ * object that lacks this polyfill's internal slots.
104
+ * - A Temporal object whose prototype was swapped to one of the three above is not detected
105
+ * either. Its getters are then out of reach, so it reads as setting nothing and the function
106
+ * returns its value unchanged (accepted by owner decision for the speed of the plain case).
107
+ */
108
+ function isTemporalDateOrTimeObject(value) {
109
+ const prototype = Object.getPrototypeOf(value);
110
+ if (prototype === Object.prototype ||
111
+ prototype === null ||
112
+ prototype === Function.prototype) {
113
+ return false;
114
+ }
115
+ return (isObjectOf(Temporal, value) ||
116
+ isHostTemporalObject(value));
117
+ }
118
+ /** Whether `value` is one Temporal reads for `name` without converting it. */
119
+ function isFieldValue(name, value) {
120
+ return name === STRING_FIELD
121
+ ? typeof value === "string"
122
+ : typeof value === "number" && Number.isInteger(value);
123
+ }
124
+ /**
125
+ * Read the `fields` argument of a `set*` function the way Temporal's `with` reads it, and return
126
+ * the values as a fresh plain object that holds only the fields the function takes.
127
+ *
128
+ * The check and the read are one pass, so nothing reaches Temporal that was not checked:
129
+ *
130
+ * - `fields` must be an Object (`isObject`), a function included, and not a Temporal object that
131
+ * holds a date or a time (TC39 IsPartialTemporalObject).
132
+ * - An own enumerable string key outside `allowedFields` returns `null`, whatever its value: the guard
133
+ * against a misspelt key. A symbol key is ignored.
134
+ * - Each property `with` reads is read once with an ordinary property get, in the order `with`
135
+ * reads them, so an inherited, non-enumerable or getter field applies. `undefined` means absent.
136
+ * A defined property outside `allowedFields` (another type's field, an era, an offset, a
137
+ * `calendar` or a `timeZone`) returns `null`.
138
+ * - A value is not converted: `monthCode` must be a string, and every other field a number that is
139
+ * an integer. `null`, a numeric string, a boolean and a fraction return `null`, where Temporal
140
+ * would convert or truncate them. A bigint, `NaN` and an infinity return `null` too; Temporal
141
+ * throws for them (ToIntegerWithTruncation).
142
+ *
143
+ * Range and overflow are left to Temporal. An empty result means nothing is set: the function
144
+ * returns its value unchanged, where Temporal's `with` would throw. A getter that throws is not
145
+ * caught here, nor is a Proxy's `getPrototypeOf` trap that throws; the calling function's own catch
146
+ * returns its sentinel.
147
+ *
148
+ * @param fields the caller's `fields` argument
149
+ * @param allowedFields the fields the calling function takes
150
+ * @returns a new plain object of the fields set, empty when none is, or null on invalid input
151
+ *
152
+ * @example readSetFields({ year: 2025 }, DATE_FIELDS) // { year: 2025 }
153
+ * @example readSetFields({}, DATE_FIELDS) // {} (nothing set)
154
+ * @example readSetFields({ year: "2025" }, DATE_FIELDS) // null (not converted)
155
+ * @example readSetFields({ year: 2025, yaer: 1 }, DATE_FIELDS) // null (misspelt key)
156
+ * @example readSetFields({ year: 2025, hour: 5 }, DATE_FIELDS) // null (a field setDate does not take)
157
+ */
158
+ export function readSetFields(fields, allowedFields) {
159
+ const allowed = allowedFields;
160
+ if (!isObject(fields) || isTemporalDateOrTimeObject(fields)) {
161
+ return null;
162
+ }
163
+ if (!Object.keys(fields).every((key) => allowed.includes(key))) {
164
+ return null;
165
+ }
166
+ const record = fields;
167
+ const read = {};
168
+ for (const name of WITH_PROPERTY_NAMES) {
169
+ const value = record[name];
170
+ if (value === undefined) {
171
+ continue;
172
+ }
173
+ if (!allowed.includes(name) || !isFieldValue(name, value)) {
174
+ return null;
175
+ }
176
+ read[name] = value;
177
+ }
178
+ return read;
179
+ }
@@ -14,7 +14,7 @@ import type { RelativeUnit } from "../types/index.js";
14
14
  * stricter than Temporal: GetOption converts any value with ToString, so Temporal accepts
15
15
  * `["day"]` and an object whose `toString` returns `"day"` (test262
16
16
  * `largestunit-wrong-type.js`). GMT takes string inputs, and its other unit readers
17
- * (`roundDate`, `roundDateTime`, `roundUtc`, `roundZoned`, `startOfDate`, `durationAs`,
17
+ * (`roundDate`, `roundDateTime`, `roundUtc`, `roundZoned`, `startOfDate`, `totalDuration`,
18
18
  * `areDatesEqualBy`) reject a non-string the same way, so this one does not convert either.
19
19
  *
20
20
  * @param largestUnit the option as read from the caller's object, `undefined` when absent
@@ -13,7 +13,7 @@
13
13
  * stricter than Temporal: GetOption converts any value with ToString, so Temporal accepts
14
14
  * `["day"]` and an object whose `toString` returns `"day"` (test262
15
15
  * `largestunit-wrong-type.js`). GMT takes string inputs, and its other unit readers
16
- * (`roundDate`, `roundDateTime`, `roundUtc`, `roundZoned`, `startOfDate`, `durationAs`,
16
+ * (`roundDate`, `roundDateTime`, `roundUtc`, `roundZoned`, `startOfDate`, `totalDuration`,
17
17
  * `areDatesEqualBy`) reject a non-string the same way, so this one does not convert either.
18
18
  *
19
19
  * @param largestUnit the option as read from the caller's object, `undefined` when absent
@@ -1,10 +1,13 @@
1
1
  import type { Temporal } from "@js-temporal/polyfill";
2
2
  import { type UnixEpochUnit } from "./unixEpochValue.js";
3
+ import { type ZoneFrame } from "./zoneFrame.js";
3
4
  export interface ResolvedUnixInterval {
4
5
  startVal: Temporal.ZonedDateTime;
5
6
  endVal: Temporal.ZonedDateTime;
6
7
  resolvedUnit: Temporal.DateTimeUnit;
7
8
  epochUnit: UnixEpochUnit;
9
+ /** The frame both ends were placed on; `frameInstant` turns a result back into an instant. */
10
+ frame: ZoneFrame;
8
11
  }
9
12
  /**
10
13
  * Resolve the shared arguments of `intervalLengthUnix`, `intervalCountUnix` and
@@ -13,13 +16,16 @@ export interface ResolvedUnixInterval {
13
16
  *
14
17
  * - Epochs follow the one `unix/` grammar (`parseUnixEpochValue`) and must name Temporal instants.
15
18
  * - `epochUnit` defaults to `"milliseconds"`; `timeZone` defaults to `"UTC"` (`"local"` is the
16
- * system zone, an unknown zone is invalid).
19
+ * system zone; a time zone identifier or a stored UTC offset `±HH:MM[:SS]` is read as written;
20
+ * anything else is invalid).
21
+ * - The ends are placed with `frameZoned`: for a seconds offset they sit in the offset's
22
+ * whole-minute zone, moved by its seconds, to compute with and never to write.
17
23
  *
18
24
  * @param start interval start epoch
19
25
  * @param end interval end epoch
20
26
  * @param unit unit name, singular or plural
21
27
  * @param options optional `{ epochUnit, timeZone }`
22
- * @returns the zoned ends, singular unit and epoch unit, or null on invalid input
28
+ * @returns the zoned ends, singular unit, epoch unit and frame, or null on invalid input
23
29
  *
24
30
  * @example resolveUnixIntervalPair(0, 86400, "days", { epochUnit: "seconds" })?.resolvedUnit // "day"
25
31
  * @example resolveUnixIntervalPair(10, 0, "day") // null (reversed)
@@ -1,7 +1,7 @@
1
- import { normalizeTimeZone } from "./normalizeTimeZone.js";
2
1
  import { resolveDateTimeUnit } from "./resolveDateTimeUnit.js";
3
2
  import { parseUnixEpochInterval, resolveUnixEpochUnit, unixEpochToInstant, } from "./unixEpochValue.js";
4
3
  import { isValidDateTimeUnit } from "../plain/validate/index.js";
4
+ import { frameZoned, normalizeZoneFrame } from "./zoneFrame.js";
5
5
  /**
6
6
  * Resolve the shared arguments of `intervalLengthUnix`, `intervalCountUnix` and
7
7
  * `splitIntervalByUnitUnix`: a non-reversed epoch pair in `epochUnit`, a singular-or-plural
@@ -9,13 +9,16 @@ import { isValidDateTimeUnit } from "../plain/validate/index.js";
9
9
  *
10
10
  * - Epochs follow the one `unix/` grammar (`parseUnixEpochValue`) and must name Temporal instants.
11
11
  * - `epochUnit` defaults to `"milliseconds"`; `timeZone` defaults to `"UTC"` (`"local"` is the
12
- * system zone, an unknown zone is invalid).
12
+ * system zone; a time zone identifier or a stored UTC offset `±HH:MM[:SS]` is read as written;
13
+ * anything else is invalid).
14
+ * - The ends are placed with `frameZoned`: for a seconds offset they sit in the offset's
15
+ * whole-minute zone, moved by its seconds, to compute with and never to write.
13
16
  *
14
17
  * @param start interval start epoch
15
18
  * @param end interval end epoch
16
19
  * @param unit unit name, singular or plural
17
20
  * @param options optional `{ epochUnit, timeZone }`
18
- * @returns the zoned ends, singular unit and epoch unit, or null on invalid input
21
+ * @returns the zoned ends, singular unit, epoch unit and frame, or null on invalid input
19
22
  *
20
23
  * @example resolveUnixIntervalPair(0, 86400, "days", { epochUnit: "seconds" })?.resolvedUnit // "day"
21
24
  * @example resolveUnixIntervalPair(10, 0, "day") // null (reversed)
@@ -23,10 +26,10 @@ import { isValidDateTimeUnit } from "../plain/validate/index.js";
23
26
  export function resolveUnixIntervalPair(start, end, unit, options) {
24
27
  const interval = parseUnixEpochInterval(start, end);
25
28
  const epochUnit = resolveUnixEpochUnit(options?.epochUnit);
26
- const timeZone = normalizeTimeZone(options?.timeZone);
29
+ const frame = normalizeZoneFrame(options?.timeZone);
27
30
  if (interval === null ||
28
31
  epochUnit === null ||
29
- !timeZone ||
32
+ frame === null ||
30
33
  typeof unit !== "string") {
31
34
  return null;
32
35
  }
@@ -41,10 +44,11 @@ export function resolveUnixIntervalPair(start, end, unit, options) {
41
44
  }
42
45
  try {
43
46
  return {
44
- startVal: startInstant.toZonedDateTimeISO(timeZone),
45
- endVal: endInstant.toZonedDateTimeISO(timeZone),
47
+ startVal: frameZoned(startInstant, frame),
48
+ endVal: frameZoned(endInstant, frame),
46
49
  resolvedUnit,
47
50
  epochUnit,
51
+ frame,
48
52
  };
49
53
  }
50
54
  catch {
@@ -8,7 +8,8 @@ import type { Temporal } from "@js-temporal/polyfill";
8
8
  * or `"quarter"` from `startOfQuarterForUnix` / `endOfQuarterForUnix` only.
9
9
  * - `value` follows the one epoch grammar (`parseUnixEpochValue`); `epochUnit` accepts singular
10
10
  * and plural names and defaults to `"milliseconds"`.
11
- * - `timeZone` defaults to `"UTC"`; `"local"` is the system zone; an unknown zone returns null.
11
+ * - `timeZone` defaults to `"UTC"`; `"local"` is the system zone; a time zone identifier or a
12
+ * stored UTC offset (`±HH:MM[:SS]`) is read as written; anything else returns null.
12
13
  * - `weekStartsOn` other than `"monday"` or `"sunday"` returns null.
13
14
  * - The boundary is always the real local bucket from `internal/zonedBucket.ts` — a start never
14
15
  * after `value`, an end never before it.
@@ -1,7 +1,7 @@
1
- import { normalizeTimeZone } from "./normalizeTimeZone.js";
2
1
  import { resolveWeekStartsOn } from "./resolveWeekStartsOn.js";
3
2
  import { resolveUnixEpochUnit, toUnixEpoch, unixEpochToInstant, } from "./unixEpochValue.js";
4
3
  import { zonedUnitEnd, zonedUnitStart } from "./zonedBucket.js";
4
+ import { frameInstant, frameZoned, normalizeZoneFrame } from "./zoneFrame.js";
5
5
  /**
6
6
  * Internal shared implementation for `startOfUnix` / `endOfUnix` and the quarter functions.
7
7
  *
@@ -11,7 +11,8 @@ import { zonedUnitEnd, zonedUnitStart } from "./zonedBucket.js";
11
11
  * or `"quarter"` from `startOfQuarterForUnix` / `endOfQuarterForUnix` only.
12
12
  * - `value` follows the one epoch grammar (`parseUnixEpochValue`); `epochUnit` accepts singular
13
13
  * and plural names and defaults to `"milliseconds"`.
14
- * - `timeZone` defaults to `"UTC"`; `"local"` is the system zone; an unknown zone returns null.
14
+ * - `timeZone` defaults to `"UTC"`; `"local"` is the system zone; a time zone identifier or a
15
+ * stored UTC offset (`±HH:MM[:SS]`) is read as written; anything else returns null.
15
16
  * - `weekStartsOn` other than `"monday"` or `"sunday"` returns null.
16
17
  * - The boundary is always the real local bucket from `internal/zonedBucket.ts` — a start never
17
18
  * after `value`, an end never before it.
@@ -24,9 +25,9 @@ import { zonedUnitEnd, zonedUnitStart } from "./zonedBucket.js";
24
25
  */
25
26
  export function startOrEndOfUnix(value, unit, options, isEnd) {
26
27
  const epochUnit = resolveUnixEpochUnit(options.epochUnit);
27
- const timeZone = normalizeTimeZone(options.timeZone);
28
+ const frame = normalizeZoneFrame(options.timeZone);
28
29
  const weekStartsOn = resolveWeekStartsOn(options.weekStartsOn);
29
- if (!timeZone || epochUnit === null || weekStartsOn === null) {
30
+ if (frame === null || epochUnit === null || weekStartsOn === null) {
30
31
  return null;
31
32
  }
32
33
  const instant = unixEpochToInstant(value, epochUnit);
@@ -35,11 +36,13 @@ export function startOrEndOfUnix(value, unit, options, isEnd) {
35
36
  }
36
37
  const weekStartDay = weekStartsOn === "monday" ? 1 : 7;
37
38
  try {
38
- const source = instant.toZonedDateTimeISO(timeZone);
39
+ const source = frameZoned(instant, frame);
39
40
  const boundary = isEnd
40
41
  ? zonedUnitEnd(source, unit, weekStartDay)
41
42
  : zonedUnitStart(source, unit, weekStartDay);
42
- return boundary ? toUnixEpoch(boundary, epochUnit) : null;
43
+ return boundary
44
+ ? toUnixEpoch(frameInstant(boundary, frame), epochUnit)
45
+ : null;
43
46
  }
44
47
  catch {
45
48
  return null;
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Resolve a two-digit year inside a caller-chosen hundred-year window: the one year in
3
+ * `[windowStart, windowStart + 99]` whose last two digits are `yy`.
4
+ *
5
+ * Pure arithmetic: the function holds no window of its own and reads no clock. The window comes
6
+ * from the caller's `TwoDigitYearOptions.yearWindow`, resolved by `readYearWindowStart`
7
+ * (`internal/yearWindowStart.ts`); no standard says which century a two-digit year belongs to,
8
+ * so the library never supplies one.
9
+ *
10
+ * @param yy the two-digit year, 0–99, as the grammar read it
11
+ * @param windowStart the first year of the hundred-year window
12
+ * @returns the four-digit year in the window ending in `yy`
13
+ *
14
+ * @example twoDigitYear(24, 2000) // 2024
15
+ * @example twoDigitYear(99, 1950) // 1999
16
+ * @example twoDigitYear(49, 1950) // 2049
17
+ * @example twoDigitYear(0, 1976) // 2000
18
+ */
19
+ export declare function twoDigitYear(yy: number, windowStart: number): number;
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Resolve a two-digit year inside a caller-chosen hundred-year window: the one year in
3
+ * `[windowStart, windowStart + 99]` whose last two digits are `yy`.
4
+ *
5
+ * Pure arithmetic: the function holds no window of its own and reads no clock. The window comes
6
+ * from the caller's `TwoDigitYearOptions.yearWindow`, resolved by `readYearWindowStart`
7
+ * (`internal/yearWindowStart.ts`); no standard says which century a two-digit year belongs to,
8
+ * so the library never supplies one.
9
+ *
10
+ * @param yy the two-digit year, 0–99, as the grammar read it
11
+ * @param windowStart the first year of the hundred-year window
12
+ * @returns the four-digit year in the window ending in `yy`
13
+ *
14
+ * @example twoDigitYear(24, 2000) // 2024
15
+ * @example twoDigitYear(99, 1950) // 1999
16
+ * @example twoDigitYear(49, 1950) // 2049
17
+ * @example twoDigitYear(0, 1976) // 2000
18
+ */
19
+ export function twoDigitYear(yy, windowStart) {
20
+ const candidate = Math.floor(windowStart / 100) * 100 + yy;
21
+ return candidate < windowStart ? candidate + 100 : candidate;
22
+ }
@@ -1,5 +1,6 @@
1
1
  import { Temporal } from "@js-temporal/polyfill";
2
2
  import { MAX_EPOCH_NANOSECONDS } from "./epochNanoseconds.js";
3
+ import { isObject } from "./isObject.js";
3
4
  // TC39 Temporal IsValidEpochNanoseconds bound (nsMaxInstant = 10^8 days) in milliseconds: 8.64e15.
4
5
  const MAX_EPOCH_MILLISECONDS = Number(MAX_EPOCH_NANOSECONDS / 1000000n);
5
6
  // An optionally negative run of ASCII digits and nothing else. `\d` without the `u` flag is
@@ -91,7 +92,7 @@ export function resolveUnixEpochUnitOptions(options) {
91
92
  if (options === undefined) {
92
93
  return "milliseconds";
93
94
  }
94
- if (options === null || typeof options !== "object") {
95
+ if (!isObject(options)) {
95
96
  return null;
96
97
  }
97
98
  return resolveUnixEpochUnit(options.epochUnit);
@@ -231,7 +232,7 @@ export function parseUnixEpochIntervalList(intervals) {
231
232
  }
232
233
  const parsed = [];
233
234
  for (const interval of intervals) {
234
- if (!interval || typeof interval !== "object") {
235
+ if (!isObject(interval)) {
235
236
  return null;
236
237
  }
237
238
  const { start, end } = interval;
@@ -0,0 +1,24 @@
1
+ import type { Temporal } from "@js-temporal/polyfill";
2
+ /**
3
+ * Read a Unix epoch argument on the local wall clock of the shared `unix/` options, or null when
4
+ * anything is invalid. For the `parse*FromUnix` accessors, which only read fields.
5
+ *
6
+ * - `value` follows the one epoch grammar (`parseUnixEpochValue`).
7
+ * - `epochUnit` accepts singular or plural names and defaults to `"milliseconds"`.
8
+ * - `timeZone` defaults to `"UTC"`; `"local"` is the system zone; a time zone identifier or a
9
+ * stored UTC offset (`±HH:MM[:SS]`) is read as written; anything else is invalid (see
10
+ * `normalizeZoneFrame`).
11
+ *
12
+ * @param value Unix epoch number or digit string
13
+ * @param options optional `{ epochUnit, timeZone }`
14
+ * @returns the local wall clock, or null
15
+ *
16
+ * @example unixWallClock(0)?.toString() // "1970-01-01T00:00:00"
17
+ * @example unixWallClock("86400", { epochUnit: "second", timeZone: "Asia/Tokyo" })?.hour // 9
18
+ * @example unixWallClock(45870000, { timeZone: "-00:44:30" })?.toString() // "1970-01-01T12:00:00"
19
+ * @example unixWallClock(0, { timeZone: "Asia/Tokio" }) // null
20
+ */
21
+ export declare function unixWallClock(value: unknown, options?: {
22
+ epochUnit?: unknown;
23
+ timeZone?: unknown;
24
+ }): Temporal.PlainDateTime | null;
@@ -0,0 +1,35 @@
1
+ import { resolveUnixEpochUnit, unixEpochToInstant } from "./unixEpochValue.js";
2
+ import { frameWallClock, normalizeZoneFrame } from "./zoneFrame.js";
3
+ /**
4
+ * Read a Unix epoch argument on the local wall clock of the shared `unix/` options, or null when
5
+ * anything is invalid. For the `parse*FromUnix` accessors, which only read fields.
6
+ *
7
+ * - `value` follows the one epoch grammar (`parseUnixEpochValue`).
8
+ * - `epochUnit` accepts singular or plural names and defaults to `"milliseconds"`.
9
+ * - `timeZone` defaults to `"UTC"`; `"local"` is the system zone; a time zone identifier or a
10
+ * stored UTC offset (`±HH:MM[:SS]`) is read as written; anything else is invalid (see
11
+ * `normalizeZoneFrame`).
12
+ *
13
+ * @param value Unix epoch number or digit string
14
+ * @param options optional `{ epochUnit, timeZone }`
15
+ * @returns the local wall clock, or null
16
+ *
17
+ * @example unixWallClock(0)?.toString() // "1970-01-01T00:00:00"
18
+ * @example unixWallClock("86400", { epochUnit: "second", timeZone: "Asia/Tokyo" })?.hour // 9
19
+ * @example unixWallClock(45870000, { timeZone: "-00:44:30" })?.toString() // "1970-01-01T12:00:00"
20
+ * @example unixWallClock(0, { timeZone: "Asia/Tokio" }) // null
21
+ */
22
+ export function unixWallClock(value, options) {
23
+ const epochUnit = resolveUnixEpochUnit(options?.epochUnit);
24
+ const frame = normalizeZoneFrame(options?.timeZone);
25
+ if (epochUnit === null || frame === null) {
26
+ return null;
27
+ }
28
+ try {
29
+ const instant = unixEpochToInstant(value, epochUnit);
30
+ return instant === null ? null : frameWallClock(instant, frame);
31
+ }
32
+ catch {
33
+ return null;
34
+ }
35
+ }
@@ -0,0 +1,20 @@
1
+ import { Temporal } from "@js-temporal/polyfill";
2
+ /**
3
+ * Read a UTC ISO string on a local wall clock for the `parse*FromUtc` accessors: the instant it
4
+ * names, on the wall clock of `options.timeZone`. The utc twin of `unixWallClock`.
5
+ *
6
+ * - `timeZone` defaults to `"UTC"`; `"local"` is the system zone; a time zone identifier or a
7
+ * stored UTC offset (`±HH:MM[:SS]`) is read as written; anything else is invalid (see
8
+ * `normalizeZoneFrame`).
9
+ *
10
+ * @param value UTC ISO 8601 datetime string
11
+ * @param options optional `{ timeZone }`
12
+ * @returns the local wall clock, or null when the value or the zone is invalid
13
+ * @example utcWallClock("2024-03-15T14:30:00Z", { timeZone: "Asia/Tokyo" })?.toString() // "2024-03-15T23:30:00"
14
+ * @example utcWallClock("1970-01-01T12:44:30Z", { timeZone: "-00:44:30" })?.toString() // "1970-01-01T12:00:00"
15
+ * @example utcWallClock("2024-03-15T14:30:00Z", { timeZone: "Invalid/Zone" }) // null
16
+ * @example utcWallClock("2024-03-15T14:30:00") // null (no Z)
17
+ */
18
+ export declare function utcWallClock(value: string, options?: {
19
+ timeZone?: string;
20
+ }): Temporal.PlainDateTime | null;