@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,777 @@
1
+ import type { Disambiguation } from "./disambiguation.js";
2
+ import type { Interval } from "./interval.js";
3
+ import type { LocalWindow } from "./operating-schedule.js";
4
+ /**
5
+ * One status held over a half-open span of time, `[start, end)`: one line of a duty log.
6
+ *
7
+ * A log is an array of entries ordered by `start` that do not overlap; `isValidDutyLog` checks
8
+ * it. Time no entry covers is in no status: it is neither work nor rest, so an unlogged gap ends
9
+ * a run and never counts as rest.
10
+ */
11
+ export type DutyEntry<S extends string = string> = {
12
+ /**
13
+ * The caller's status for the span, such as `"driving"`, `"off"` or `"homeCall"`. GMT reads no
14
+ * meaning into it: each rule names the statuses it counts, and a status no rule names is ignored.
15
+ */
16
+ status: S;
17
+ /** When the status begins, as an ISO 8601 instant string with an offset (`Z` or `±HH:MM`). */
18
+ start: string;
19
+ /**
20
+ * When the status ends, as an ISO 8601 instant string with an offset. It must be after `start`,
21
+ * and the entry does not include it.
22
+ */
23
+ end: string;
24
+ };
25
+ /**
26
+ * The operator-designated day: a 24-hour period that starts at `dayStartTime` in `timeZone`,
27
+ * wherever the person is. Neither field has a default, and local midnight is never assumed. A
28
+ * day with a clock change inside it is shorter or longer by the change: 23 or 25 hours across a
29
+ * one-hour change.
30
+ */
31
+ export type DutyDay = {
32
+ /**
33
+ * The reference time zone the day is read in, an IANA name or UTC offset: a time zone
34
+ * identifier (`+05:30`, `+0530`, `-08`) or a stored offset (`±HH:MM[:SS]`, what
35
+ * `getTimeZoneOffset` returns). A log whose entries cross zones is still read in this one.
36
+ */
37
+ timeZone: string;
38
+ /**
39
+ * The local wall time each day starts at, as an ISO PlainTime string (`"04:00"`) that
40
+ * `isValidTime` accepts.
41
+ */
42
+ dayStartTime: string;
43
+ /**
44
+ * How a day start the clock repeats or skips becomes an instant, as `resolveLocal` resolves it.
45
+ * `"compatible"` reads a skipped time after the gap and a repeated one at its first pass,
46
+ * `"earlier"` and `"later"` take that side in both cases, and `"reject"` returns the sentinel
47
+ * for a day that starts or ends at such a time.
48
+ *
49
+ * @defaultValue `"compatible"`, Temporal's default.
50
+ */
51
+ disambiguation?: Disambiguation;
52
+ };
53
+ /** An exact length of time, every sliding window of it ending at the instant evaluated. */
54
+ export type ElapsedPeriod = {
55
+ /**
56
+ * The window's length, as an ISO 8601 duration of exact time: hours, minutes, seconds and
57
+ * days of 24 hours (`"PT24H"`, `"PT672H"`, `"P7D"`). Years, months and weeks are refused.
58
+ * Clock changes do not lengthen or shorten it.
59
+ */
60
+ elapsed: string;
61
+ };
62
+ /** A count of operator-designated days, the last of them the day the instant falls in. */
63
+ export type OperatorDaysPeriod = {
64
+ /**
65
+ * How many operator days, an integer from 1 to 10,000. The days come from `dayStartTime` in
66
+ * the reference zone, so the call needs `dayStartTime`.
67
+ */
68
+ operatorDays: number;
69
+ };
70
+ /** A count of local calendar days in the reference zone, the last the day the instant falls in. */
71
+ export type CalendarDaysPeriod = {
72
+ /**
73
+ * How many local calendar days, an integer from 1 to 10,000. A day across a one-hour clock
74
+ * change is 23 or 25 hours long, so 28 days across one are 671 or 673 hours.
75
+ */
76
+ calendarDays: number;
77
+ };
78
+ /** A count of ISO weeks (Monday to Sunday) in the reference zone, the last the current one. */
79
+ export type IsoWeeksPeriod = {
80
+ /** How many ISO weeks, an integer from 1 to 10,000. Each starts at local midnight on Monday. */
81
+ isoWeeks: number;
82
+ };
83
+ /** A count of local calendar months in the reference zone, the last the current one. */
84
+ export type CalendarMonthsPeriod = {
85
+ /**
86
+ * How many calendar months, an integer from 1 to 10,000. Each starts at local midnight on the
87
+ * 1st.
88
+ */
89
+ calendarMonths: number;
90
+ };
91
+ /** A count of local calendar years in the reference zone, the last the current one. */
92
+ export type CalendarYearsPeriod = {
93
+ /**
94
+ * How many calendar years, an integer from 1 to 10,000. Each starts at local midnight on
95
+ * 1 January.
96
+ */
97
+ calendarYears: number;
98
+ };
99
+ /**
100
+ * The span a rule looks back over: an exact elapsed duration, or a count of local periods in
101
+ * the reference zone. Give exactly one key.
102
+ *
103
+ * - `elapsed` is sliding: every window of that length, the one evaluated ending at the instant.
104
+ * - The counts are whole local periods ending with the one the instant falls in, so their window
105
+ * runs to the end of the current period. A count of `operatorDays` reads `dayStartTime`.
106
+ * - A count is 10,000 at most, and so is a count times the rule's `adjacent`, `lookback` or
107
+ * `periods`: `{ isoWeeks: 2 }` with `adjacent: 5001` names 10,002 weeks, and is refused.
108
+ */
109
+ export type Period = ElapsedPeriod | OperatorDaysPeriod | CalendarDaysPeriod | IsoWeeksPeriod | CalendarMonthsPeriod | CalendarYearsPeriod;
110
+ /** A count of local periods in the reference zone: a `Period` that is not an elapsed duration. */
111
+ export type LocalPeriod = Exclude<Period, ElapsedPeriod>;
112
+ /**
113
+ * A rest that resets a counter: a run of at least `consecutive` in any of `statuses`. The
114
+ * counter starts again where the run ends.
115
+ */
116
+ export type Reset<S extends string = string> = {
117
+ /** The statuses the run is made of. Touching entries in any of them form one run. */
118
+ statuses: S[];
119
+ /** How long the run must be, as a positive ISO 8601 duration of exact time (`"PT10H"`). */
120
+ consecutive: string;
121
+ };
122
+ /**
123
+ * A paired rest: two separate rest periods that together count as one, when all three floors
124
+ * hold. `{ eachAtLeast: "PT2H", oneAtLeast: "PT7H", combinedAtLeast: "PT10H" }` accepts 7.5 + 2.5
125
+ * hours and 8 + 2, and refuses 6 + 4.
126
+ */
127
+ export type PairSpec = {
128
+ /** The floor on each of the two periods, a positive ISO 8601 duration of exact time. */
129
+ eachAtLeast: string;
130
+ /** The floor on the longer period, a positive ISO 8601 duration of exact time. */
131
+ oneAtLeast: string;
132
+ /** The floor on the two periods added together, a positive ISO 8601 duration of exact time. */
133
+ combinedAtLeast: string;
134
+ };
135
+ /** Whether a failed rule is a violation (a "must") or an advisory (a "should"). */
136
+ export type DutySeverity = "violation" | "advisory";
137
+ /**
138
+ * A cap on time in `statuses` since the last reset: "11 hours driving since 10 hours off".
139
+ *
140
+ * - `used` is the time in `statuses` since the end of the last `since` run (or since the log's
141
+ * first entry when there is none); the rule holds while `used` is at most `cap`.
142
+ * - `window` runs from that start to the instant evaluated; `resetAt` is the reset's end.
143
+ */
144
+ export type CumulativeCapRule<S extends string = string> = {
145
+ /** The caller's name for the rule. The report is keyed by it; labels must be unique. */
146
+ label: string;
147
+ /**
148
+ * Whether a failure is a violation or an advisory.
149
+ *
150
+ * @defaultValue `"violation"`.
151
+ */
152
+ severity?: DutySeverity;
153
+ /** Selects this rule kind. */
154
+ kind: "cumulativeCap";
155
+ /** The statuses whose time is capped. */
156
+ statuses: S[];
157
+ /** The most time allowed, a positive ISO 8601 duration of exact time. */
158
+ cap: string;
159
+ /** The rest that starts the count again. */
160
+ since: Reset<S>;
161
+ };
162
+ /**
163
+ * A window that opens when work starts after a reset and closes `length` later, whatever rest
164
+ * falls inside it: "no driving more than 14 hours after work began".
165
+ *
166
+ * - The window opens at the first entry in `startStatuses` after the last `since` run, and the
167
+ * rule fails once time in `restrictedStatuses` falls at or after its close. `dueBy` is the close.
168
+ * - With `exclude`, two consecutive runs of `since.statuses` that satisfy the `PairSpec` (each
169
+ * shorter than `since.consecutive`) move the window: it is counted again from the end of the
170
+ * first, and its time stops while the second lasts, so the close moves by the second's whole
171
+ * length. A second run that starts after the close moves nothing: the window had closed. A run
172
+ * shorter than `eachAtLeast` between the two is neither half of the pair nor a break in it.
173
+ * - With `extension`, a window open at the instant `from` closes `by` later. Any other window is
174
+ * unchanged.
175
+ */
176
+ export type ElapsedWindowRule<S extends string = string> = {
177
+ /** The caller's name for the rule. The report is keyed by it; labels must be unique. */
178
+ label: string;
179
+ /**
180
+ * Whether a failure is a violation or an advisory.
181
+ *
182
+ * @defaultValue `"violation"`.
183
+ */
184
+ severity?: DutySeverity;
185
+ /** Selects this rule kind. */
186
+ kind: "elapsedWindow";
187
+ /** The statuses whose first entry after the reset opens the window. */
188
+ startStatuses: S[];
189
+ /** How long the window stays open, a positive ISO 8601 duration of exact time. */
190
+ length: string;
191
+ /** The statuses not allowed once the window has closed. */
192
+ restrictedStatuses: S[];
193
+ /** The rest that closes one window, so that the next work opens a new one. */
194
+ since: Reset<S>;
195
+ /**
196
+ * A paired rest that does not count against the window.
197
+ *
198
+ * @defaultValue None. Rest inside the window never moves it.
199
+ */
200
+ exclude?: PairSpec;
201
+ /**
202
+ * A caller-declared extension: the window open at `from` closes `by` later.
203
+ *
204
+ * @defaultValue None. No window is extended.
205
+ */
206
+ extension?: {
207
+ /** How much later the window closes, a positive ISO 8601 duration of exact time. */
208
+ by: string;
209
+ /** The instant the extension is declared at, an ISO 8601 instant string. */
210
+ from: string;
211
+ };
212
+ };
213
+ /**
214
+ * A required break after a stretch of counted time: "30 minutes after 8 hours driving".
215
+ *
216
+ * - `used` is the time in `countedStatuses` since the last qualifying interruption, and the rule
217
+ * holds while it is at most `after`.
218
+ * - An interruption is a run of logged time outside `countedStatuses` (and inside
219
+ * `outsideStatuses` when given) of at least `minimum`, or the runs of `orderedSplit` taken in
220
+ * that order. `resetAt` is where the last one ended.
221
+ */
222
+ export type RequiredInterruptionRule<S extends string = string> = {
223
+ /** The caller's name for the rule. The report is keyed by it; labels must be unique. */
224
+ label: string;
225
+ /**
226
+ * Whether a failure is a violation or an advisory.
227
+ *
228
+ * @defaultValue `"violation"`.
229
+ */
230
+ severity?: DutySeverity;
231
+ /** Selects this rule kind. */
232
+ kind: "requiredInterruption";
233
+ /** The statuses that count towards the stretch. */
234
+ countedStatuses: S[];
235
+ /** The most counted time allowed without an interruption, a positive ISO 8601 duration. */
236
+ after: string;
237
+ /** What counts as an interruption. */
238
+ interruption: {
239
+ /** The shortest single run that interrupts, a positive ISO 8601 duration of exact time. */
240
+ minimum: string;
241
+ /**
242
+ * The statuses an interruption may be made of.
243
+ *
244
+ * @defaultValue None. Any logged status outside `countedStatuses` interrupts.
245
+ */
246
+ outsideStatuses?: S[];
247
+ /**
248
+ * Shorter runs that together interrupt when taken in this order: `["PT15M", "PT30M"]` is a
249
+ * run of at least 15 minutes followed later by one of at least 30, and not the reverse.
250
+ *
251
+ * @defaultValue None. Only a run of `minimum` interrupts.
252
+ */
253
+ orderedSplit?: string[];
254
+ };
255
+ };
256
+ /**
257
+ * A cap on time in `statuses` inside a window: "60 hours in 7 operator days", "100 hours in
258
+ * 672 hours".
259
+ *
260
+ * - The window is `window` ending at the instant evaluated, starting no earlier than the end of
261
+ * the last `reset` run.
262
+ * - With `precondition`, the cap applies only once the window holds a run of `minimum` in
263
+ * `restStatuses`. Before that run, the limit is `beforeHours`.
264
+ */
265
+ export type RollingCapRule<S extends string = string> = {
266
+ /** The caller's name for the rule. The report is keyed by it; labels must be unique. */
267
+ label: string;
268
+ /**
269
+ * Whether a failure is a violation or an advisory.
270
+ *
271
+ * @defaultValue `"violation"`.
272
+ */
273
+ severity?: DutySeverity;
274
+ /** Selects this rule kind. */
275
+ kind: "rollingCap";
276
+ /** The statuses whose time is capped. */
277
+ statuses: S[];
278
+ /** The most time allowed in the window, a positive ISO 8601 duration of exact time. */
279
+ cap: string;
280
+ /** The span the cap is counted over. */
281
+ window: Period;
282
+ /**
283
+ * A rest that starts the count again, as a long rest that restarts a cycle does.
284
+ *
285
+ * @defaultValue None. Only the window limits the count.
286
+ */
287
+ reset?: Reset<S>;
288
+ /**
289
+ * A rest the window must hold before its time passes `beforeHours`.
290
+ *
291
+ * @defaultValue None. The cap applies from the start of the window.
292
+ */
293
+ precondition?: {
294
+ /** The statuses the rest is made of. */
295
+ restStatuses: S[];
296
+ /** How long the rest must be, a positive ISO 8601 duration of exact time. */
297
+ minimum: string;
298
+ /** The most time allowed before that rest, a positive ISO 8601 duration of exact time. */
299
+ beforeHours: string;
300
+ };
301
+ };
302
+ /**
303
+ * A cap on time in `statuses` over whole local periods: "56 hours in an ISO week", "90 hours in
304
+ * two adjacent weeks", "80 hours a week averaged over four".
305
+ *
306
+ * - The window is the `adjacent` periods ending with the one the instant falls in. A shift that
307
+ * crosses a period boundary is cut there, and each part counts in its own period.
308
+ * - With `average`, `used` is the mean over the `adjacent` periods, rounded up to the nanosecond,
309
+ * and `remaining` is the time left before the mean passes `cap`.
310
+ */
311
+ export type FixedPeriodCapRule<S extends string = string> = {
312
+ /** The caller's name for the rule. The report is keyed by it; labels must be unique. */
313
+ label: string;
314
+ /**
315
+ * Whether a failure is a violation or an advisory.
316
+ *
317
+ * @defaultValue `"violation"`.
318
+ */
319
+ severity?: DutySeverity;
320
+ /** Selects this rule kind. */
321
+ kind: "fixedPeriodCap";
322
+ /** The statuses whose time is capped. */
323
+ statuses: S[];
324
+ /** The most time allowed, per period with `average`, a positive ISO 8601 duration. */
325
+ cap: string;
326
+ /** The period, a count of local periods. */
327
+ period: LocalPeriod;
328
+ /**
329
+ * How many adjacent periods the cap covers, an integer from 1 to 10,000. Times the period's
330
+ * count, it is 10,000 at most.
331
+ *
332
+ * @defaultValue `1`.
333
+ */
334
+ adjacent?: number;
335
+ /**
336
+ * Whether `cap` limits the mean over the `adjacent` periods instead of their total.
337
+ *
338
+ * @defaultValue `false`.
339
+ */
340
+ average?: boolean;
341
+ };
342
+ /**
343
+ * A minimum of rest inside every window: "10 hours of rest in every 24, in at most two periods,
344
+ * one at least 6 hours long".
345
+ *
346
+ * - Rest is time in `restStatuses` inside the window; only the part of a run inside it counts.
347
+ * - `composition` limits the periods the rest is counted from; `composite` asks for a long run
348
+ * plus shorter blocks; `maxGap` caps the time between the end of one run and the start of the
349
+ * next. The log's first entry starts such a stretch as the end of a rest would, so the work
350
+ * logged before the first rest is held to `maxGap` too.
351
+ * - A window that runs past the instant evaluated has not failed while it could still be met with
352
+ * rest from that instant to its end.
353
+ */
354
+ export type RestRequirementRule<S extends string = string> = {
355
+ /** The caller's name for the rule. The report is keyed by it; labels must be unique. */
356
+ label: string;
357
+ /**
358
+ * Whether a failure is a violation or an advisory.
359
+ *
360
+ * @defaultValue `"violation"`.
361
+ */
362
+ severity?: DutySeverity;
363
+ /** Selects this rule kind. */
364
+ kind: "restRequirement";
365
+ /** The statuses that are rest. */
366
+ restStatuses: S[];
367
+ /** The window the rest is counted in. */
368
+ per: Period;
369
+ /** The least rest required in the window, a positive ISO 8601 duration of exact time. */
370
+ minimum: string;
371
+ /**
372
+ * How the rest may be divided: it is counted from the `maxPeriods` longest runs, the longest at
373
+ * least `longestAtLeast` and each other at least `othersAtLeast`.
374
+ *
375
+ * @defaultValue None. Every run of rest counts.
376
+ */
377
+ composition?: {
378
+ /** The most runs the rest may come from, a positive integer. */
379
+ maxPeriods: number;
380
+ /** The floor on the longest run, a positive ISO 8601 duration of exact time. */
381
+ longestAtLeast: string;
382
+ /**
383
+ * The floor on every other run counted, a positive ISO 8601 duration of exact time.
384
+ *
385
+ * @defaultValue None. The other runs count at any length.
386
+ */
387
+ othersAtLeast?: string;
388
+ };
389
+ /**
390
+ * A consecutive run plus additional rest in blocks: rest is the longest run, at least
391
+ * `consecutive`, plus the other runs of at least `blockMinimum`, which must add up to
392
+ * `additional`.
393
+ *
394
+ * @defaultValue None. Rest is counted without the split.
395
+ */
396
+ composite?: {
397
+ /** The floor on the longest run, a positive ISO 8601 duration of exact time. */
398
+ consecutive: string;
399
+ /** The rest required beyond the longest run, a positive ISO 8601 duration of exact time. */
400
+ additional: string;
401
+ /** The shortest block that counts, a positive ISO 8601 duration of exact time. */
402
+ blockMinimum: string;
403
+ };
404
+ /**
405
+ * The most time allowed from the end of one run of rest, or from the log's first entry, to the
406
+ * start of the next run of rest, a positive ISO 8601 duration of exact time.
407
+ *
408
+ * @defaultValue None. The time between rests is not limited.
409
+ */
410
+ maxGap?: string;
411
+ };
412
+ /**
413
+ * A free period of at least `minimum` consecutive rest inside every window: "30 consecutive
414
+ * hours off in every 168", "36 hours off containing two local nights", "one day in seven free,
415
+ * averaged over four weeks".
416
+ *
417
+ * - `used` is how many separate free periods the window holds; only the part of a run inside the
418
+ * window counts. A run twice `minimum` long holds two.
419
+ * - With `containing`, each free period must also contain `count` whole local windows.
420
+ * - `dueBy` is the instant the next free period must be complete by, if no more rest is taken.
421
+ * - A window that runs past the instant evaluated has not failed while it could still be met with
422
+ * rest from that instant to its end.
423
+ */
424
+ export type FreePeriodRule<S extends string = string> = {
425
+ /** The caller's name for the rule. The report is keyed by it; labels must be unique. */
426
+ label: string;
427
+ /**
428
+ * Whether a failure is a violation or an advisory.
429
+ *
430
+ * @defaultValue `"violation"`.
431
+ */
432
+ severity?: DutySeverity;
433
+ /** Selects this rule kind. */
434
+ kind: "freePeriod";
435
+ /** The statuses that are free time. */
436
+ restStatuses: S[];
437
+ /** The shortest free period, a positive ISO 8601 duration of exact time. */
438
+ minimum: string;
439
+ /** The window the free periods are counted in. */
440
+ within: Period;
441
+ /**
442
+ * Local windows each free period must contain, such as nights from 22:00 to 08:00, read in the
443
+ * reference zone. Their edges resolve under the call's `disambiguation`.
444
+ *
445
+ * @defaultValue None. Any run of `minimum` is a free period.
446
+ */
447
+ containing?: {
448
+ /** The local window, as operating hours take it. */
449
+ window: LocalWindow;
450
+ /** How many whole windows each free period must contain, an integer from 1 to 10,000. */
451
+ count: number;
452
+ };
453
+ /**
454
+ * How many free periods the window must hold, a non-negative integer.
455
+ *
456
+ * @defaultValue `1`.
457
+ */
458
+ atLeast?: number;
459
+ };
460
+ /**
461
+ * A rest required before each duty: "10 hours off in the 24 before a duty", "rest before duty
462
+ * at least as long as the duty before it, and never under 12 hours".
463
+ *
464
+ * - A duty starts where logged time outside `restStatuses` begins. A stint after any rest is a
465
+ * new duty start, measured from where it starts: log a break inside a duty in a status outside
466
+ * `restStatuses`.
467
+ * - Without `orFactor`, the rest before a duty is the longest run of rest inside `within` before
468
+ * it, so a short break between two stints does not stand in for the rest before them, and it
469
+ * must be at least `minimum`.
470
+ * - With `orFactor`, the rest is the run that ends where the duty starts, measured whole, and it
471
+ * must be at least `minimum`, `floor` and `k` × the duty it ends. That duty runs from the end of
472
+ * the last rest of at least `minimum` before it to where the rest starts, breaks included. A
473
+ * duty that starts with no rest right before it has none. Logging more of the time before a
474
+ * duty as rest never fails it, unless a whole duty becomes rest: the two rests around it are
475
+ * then one, which ends the duty before.
476
+ * - Evaluated during rest, the rule holds and `remaining` is the rest still needed before a duty
477
+ * may start.
478
+ */
479
+ export type RestBeforeDutyRule<S extends string = string> = {
480
+ /** The caller's name for the rule. The report is keyed by it; labels must be unique. */
481
+ label: string;
482
+ /**
483
+ * Whether a failure is a violation or an advisory.
484
+ *
485
+ * @defaultValue `"violation"`.
486
+ */
487
+ severity?: DutySeverity;
488
+ /** Selects this rule kind. */
489
+ kind: "restBeforeDuty";
490
+ /** The statuses that are rest. */
491
+ restStatuses: S[];
492
+ /** The least rest required, a positive ISO 8601 duration of exact time. */
493
+ minimum: string;
494
+ /**
495
+ * How far before a duty the rest is looked for, a positive ISO 8601 duration of exact time.
496
+ * With `orFactor` the rest is the one right before the duty, which `within` does not cut.
497
+ */
498
+ within: string;
499
+ /**
500
+ * A requirement that grows with the previous duty: the larger of `k` × its length and `floor`.
501
+ *
502
+ * @defaultValue None. The requirement is `minimum`.
503
+ */
504
+ orFactor?: {
505
+ /**
506
+ * The multiple of the previous duty's length, a positive finite number. It is read as the
507
+ * shortest decimal `String(k)` prints, exactly: `1.1` is eleven tenths, and `0.1 + 0.2` is
508
+ * 0.30000000000000004. The product is rounded up to the nanosecond.
509
+ */
510
+ k: number;
511
+ /** The least the requirement can be, a positive ISO 8601 duration of exact time. */
512
+ floor: string;
513
+ };
514
+ };
515
+ /**
516
+ * A cap on how often a short rest is taken: "at most 3 reduced rests between two full rests".
517
+ *
518
+ * - An event is a run in `event.statuses` at least `event.minimum` and shorter than
519
+ * `event.maximum`, counted in the period it starts in. A run the log carries on past the
520
+ * instant evaluated may still grow past `maximum`, so it is not counted until it ends.
521
+ * - `used` counts the events since the last `reset` run, or inside the `every` window.
522
+ */
523
+ export type QuotaRule<S extends string = string> = {
524
+ /** The caller's name for the rule. The report is keyed by it; labels must be unique. */
525
+ label: string;
526
+ /**
527
+ * Whether a failure is a violation or an advisory.
528
+ *
529
+ * @defaultValue `"violation"`.
530
+ */
531
+ severity?: DutySeverity;
532
+ /** Selects this rule kind. */
533
+ kind: "quota";
534
+ /** The run that counts once. */
535
+ event: {
536
+ /** The statuses the run is made of. */
537
+ statuses: S[];
538
+ /** The shortest run that counts, a positive ISO 8601 duration of exact time. */
539
+ minimum: string;
540
+ /** The length a run must stay under to count, a positive ISO 8601 duration of exact time. */
541
+ maximum: string;
542
+ };
543
+ /** The most events allowed, a non-negative integer. */
544
+ count: number;
545
+ /** What starts the count again: a full rest, or a window. */
546
+ reset: Reset<S> | {
547
+ /** The window the events are counted in. */
548
+ every: Period;
549
+ };
550
+ };
551
+ /**
552
+ * A rest that must start within a number of periods of the last one: "a weekly rest by the end
553
+ * of six operator days after the previous one".
554
+ *
555
+ * - The clock starts at the end of the last run in `event.statuses` of at least `event.minimum`,
556
+ * or of a `reset` run when that is later. `dueBy` is the end of the `periods`-th `period`, the
557
+ * period the clock starts in counting as the first.
558
+ * - The rule holds until `dueBy`, and after it while a run in `event.statuses` that began by
559
+ * `dueBy` is still going.
560
+ */
561
+ export type DueByRule<S extends string = string> = {
562
+ /** The caller's name for the rule. The report is keyed by it; labels must be unique. */
563
+ label: string;
564
+ /**
565
+ * Whether a failure is a violation or an advisory.
566
+ *
567
+ * @defaultValue `"violation"`.
568
+ */
569
+ severity?: DutySeverity;
570
+ /** Selects this rule kind. */
571
+ kind: "dueBy";
572
+ /** The rest that is due. */
573
+ event: {
574
+ /** The statuses the rest is made of. */
575
+ statuses: S[];
576
+ /** How long the rest must be, a positive ISO 8601 duration of exact time. */
577
+ minimum: string;
578
+ };
579
+ /** How soon the rest is due. */
580
+ within: {
581
+ /**
582
+ * How many periods, an integer from 1 to 10,000. Times a count `period`, it is 10,000 at
583
+ * most.
584
+ */
585
+ periods: number;
586
+ /** The period counted: an `elapsed` length, or one local period (`{ operatorDays: 1 }`). */
587
+ period: Period;
588
+ };
589
+ /**
590
+ * Another rest that also starts the clock.
591
+ *
592
+ * @defaultValue None. Only the event starts the clock.
593
+ */
594
+ reset?: Reset<S>;
595
+ };
596
+ /**
597
+ * A count of rests by class inside a window: "at least 4 weekly rests in any 4 weeks, at least
598
+ * 2 of them regular".
599
+ *
600
+ * - The window is `lookback` periods of `period` ending with the instant's.
601
+ * - A run in a class's `statuses` of at least its `minimum` counts once in that class, in the
602
+ * window it starts in. A run can count in several classes.
603
+ * - `used` and `limit` are the tightest requirement's count and floor, the first on a tie.
604
+ * - A window that runs past the instant evaluated has not failed while enough runs could still
605
+ * start before it ends, each a class's `minimum` long before the next.
606
+ */
607
+ export type PatternRule<S extends string = string> = {
608
+ /** The caller's name for the rule. The report is keyed by it; labels must be unique. */
609
+ label: string;
610
+ /**
611
+ * Whether a failure is a violation or an advisory.
612
+ *
613
+ * @defaultValue `"violation"`.
614
+ */
615
+ severity?: DutySeverity;
616
+ /** Selects this rule kind. */
617
+ kind: "pattern";
618
+ /** The unit the window is counted in. */
619
+ period: Period;
620
+ /**
621
+ * How many periods the window covers, an integer from 1 to 10,000. Times a count `period`, it is
622
+ * 10,000 at most.
623
+ */
624
+ lookback: number;
625
+ /** The classes of rest, each named for `require`. */
626
+ classes: {
627
+ /** The class's name, unique within the rule. */
628
+ label: string;
629
+ /** The statuses a run of this class is made of. */
630
+ statuses: S[];
631
+ /** The shortest run of this class, a positive ISO 8601 duration of exact time. */
632
+ minimum: string;
633
+ }[];
634
+ /** The count each class needs. */
635
+ require: {
636
+ /** The class, one of the labels in `classes`. */
637
+ label: string;
638
+ /** The fewest runs of that class the window must hold, a non-negative integer. */
639
+ atLeast: number;
640
+ }[];
641
+ };
642
+ /**
643
+ * A cap on how many local periods hold a status: "night duty no more often than every third
644
+ * night", "duty started on at most 6 of any 7 days".
645
+ *
646
+ * - The window is `lookback` periods of `per` ending with the instant's, and `used` is how many
647
+ * of them hold time in `statuses`, or with `byInitiationDate` how many a run starts in.
648
+ */
649
+ export type OccurrenceCapRule<S extends string = string> = {
650
+ /** The caller's name for the rule. The report is keyed by it; labels must be unique. */
651
+ label: string;
652
+ /**
653
+ * Whether a failure is a violation or an advisory.
654
+ *
655
+ * @defaultValue `"violation"`.
656
+ */
657
+ severity?: DutySeverity;
658
+ /** Selects this rule kind. */
659
+ kind: "occurrenceCap";
660
+ /** The statuses that occur. */
661
+ statuses: S[];
662
+ /** The local period occurrences are counted by. */
663
+ per: LocalPeriod;
664
+ /**
665
+ * How many periods the window covers, an integer from 1 to 10,000. Times the count in `per`, it
666
+ * is 10,000 at most.
667
+ */
668
+ lookback: number;
669
+ /** The most periods allowed to hold an occurrence, a non-negative integer. */
670
+ maximum: number;
671
+ /**
672
+ * Whether a run counts only in the period it starts in, so that two tours starting on one date
673
+ * count once and a night shift counts on the date it began.
674
+ *
675
+ * @defaultValue `false`. A run counts in every period it touches.
676
+ */
677
+ byInitiationDate?: boolean;
678
+ };
679
+ /**
680
+ * An allowance used at most once inside a window, restored by a rest: "not used within the
681
+ * previous 7 days unless 34 hours off came between".
682
+ *
683
+ * - `uses` are the instants the caller used it. `used` counts the uses at or before the instant
684
+ * evaluated, inside `notWithin`, after the last `reset` run; the rule holds while that is at
685
+ * most 1, and `remaining` is 1 when the allowance is free to use.
686
+ * - Each window holds a use once. An `elapsed` window holds the uses after its start, up to and
687
+ * including the instant evaluated, so a use exactly its length before is outside it. A window
688
+ * of local periods holds only its own uses, so one exactly on its end is the next window's.
689
+ */
690
+ export type UsageLookbackRule<S extends string = string> = {
691
+ /** The caller's name for the rule. The report is keyed by it; labels must be unique. */
692
+ label: string;
693
+ /**
694
+ * Whether a failure is a violation or an advisory.
695
+ *
696
+ * @defaultValue `"violation"`.
697
+ */
698
+ severity?: DutySeverity;
699
+ /** Selects this rule kind. */
700
+ kind: "usageLookback";
701
+ /** The instants the allowance was used, as ISO 8601 instant strings. */
702
+ uses: string[];
703
+ /** The window no second use may fall in. */
704
+ notWithin: Period;
705
+ /** The rest that restores the allowance. */
706
+ reset: Reset<S>;
707
+ };
708
+ /**
709
+ * One hours-of-work rule over a duty log, every number the caller's. A regime is an array of
710
+ * rules the caller assembles and labels; nested caps are separate rules, reported separately.
711
+ */
712
+ export type DutyRule<S extends string = string> = CumulativeCapRule<S> | ElapsedWindowRule<S> | RequiredInterruptionRule<S> | RollingCapRule<S> | FixedPeriodCapRule<S> | RestRequirementRule<S> | FreePeriodRule<S> | RestBeforeDutyRule<S> | QuotaRule<S> | DueByRule<S> | PatternRule<S> | OccurrenceCapRule<S> | UsageLookbackRule<S>;
713
+ /** Which arithmetic a window used: exact elapsed time, operator days, or local calendar periods. */
714
+ export type PeriodBasis = "elapsed" | "operatorDay" | "calendar";
715
+ /**
716
+ * One rule evaluated at one instant, reported whether or not it binds. Durations are ISO 8601
717
+ * with hours as the largest unit; counts are numbers.
718
+ */
719
+ export type RuleOutcome = {
720
+ /** The rule's label. */
721
+ label: string;
722
+ /** The rule's kind. */
723
+ kind: DutyRule["kind"];
724
+ /** The rule's severity, `"violation"` when the rule gave none. */
725
+ severity: DutySeverity;
726
+ /** Whether the rule holds at the instant evaluated. */
727
+ satisfied: boolean;
728
+ /** How much the rule has used, or found: a duration or a count; null when nothing is measured. */
729
+ used: string | number | null;
730
+ /** The figure `used` is held to: a cap, a minimum or a count. */
731
+ limit: string | number | null;
732
+ /**
733
+ * What is left before a cap binds, or still needed to meet a minimum; never negative.
734
+ */
735
+ remaining: string | number | null;
736
+ /**
737
+ * The span the rule measured, as UTC instants. A window of local periods runs to the end of
738
+ * the current period, past the instant evaluated. Null when the rule has not started: an
739
+ * `elapsedWindow` with no work since its reset.
740
+ */
741
+ window: Interval | null;
742
+ /** How `window` was counted; null when the rule has no window of its own. */
743
+ periodBasis: PeriodBasis | null;
744
+ /** The instant something is due by: a window's close, a rest's deadline; null when none. */
745
+ dueBy: string | null;
746
+ /** Where the last reset ended, as a UTC instant; null when the rule has none or none occurred. */
747
+ resetAt: string | null;
748
+ };
749
+ /** Every rule of a regime evaluated at one instant. */
750
+ export type DutyReport = {
751
+ /** The instant evaluated, as a UTC instant. */
752
+ at: string;
753
+ /** One outcome per rule, in the order the rules were given. */
754
+ outcomes: RuleOutcome[];
755
+ /** The outcomes of failed rules whose severity is `"violation"`. */
756
+ violations: RuleOutcome[];
757
+ /** The outcomes of failed rules whose severity is `"advisory"`. */
758
+ advisories: RuleOutcome[];
759
+ };
760
+ /** One failed window in a range, for the record. */
761
+ export type DutyViolation = {
762
+ /** The label of the rule that failed. */
763
+ label: string;
764
+ /** The window that failed it, as UTC instants. */
765
+ window: Interval;
766
+ /** What the rule found in that window: a duration or a count. */
767
+ used: string | number;
768
+ /** The figure it was held to. */
769
+ limit: string | number;
770
+ };
771
+ /** Two rest periods that satisfy a `PairSpec`, in the order they were taken. */
772
+ export type RestPair = {
773
+ /** The earlier period, as UTC instants. */
774
+ first: Interval;
775
+ /** The later period, as UTC instants. */
776
+ second: Interval;
777
+ };