@northguild/gmt 1.17.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.
- package/README.md +55 -2480
- package/dist/calendar/calculate/bucketRange.d.ts +12 -4
- package/dist/calendar/calculate/bucketRange.js +20 -63
- package/dist/calendar/calculate/floorToZone.d.ts +14 -4
- package/dist/calendar/calculate/floorToZone.js +18 -9
- package/dist/calendar/calculate/getFiscalPeriod.d.ts +21 -8
- package/dist/calendar/calculate/getFiscalPeriod.js +9 -8
- package/dist/calendar/calculate/getIsoWeekDate.d.ts +10 -5
- package/dist/calendar/calculate/getIsoWeekDate.js +1 -5
- package/dist/calendar/calculate/getOrdinalDate.d.ts +10 -3
- package/dist/calendar/calculate/getOrdinalDate.js +2 -3
- package/dist/calendar/calculate/getQuarter.d.ts +21 -9
- package/dist/calendar/calculate/getQuarter.js +8 -12
- package/dist/calendar/hours/addOperatingTime.d.ts +59 -0
- package/dist/calendar/hours/addOperatingTime.js +65 -0
- package/dist/calendar/hours/index.d.ts +7 -0
- package/dist/calendar/hours/index.js +7 -0
- package/dist/calendar/hours/isOpenAt.d.ts +45 -0
- package/dist/calendar/hours/isOpenAt.js +50 -0
- package/dist/calendar/hours/nextCloseAt.d.ts +55 -0
- package/dist/calendar/hours/nextCloseAt.js +57 -0
- package/dist/calendar/hours/nextOpenAt.d.ts +51 -0
- package/dist/calendar/hours/nextOpenAt.js +53 -0
- package/dist/calendar/hours/operatingIntervals.d.ts +48 -0
- package/dist/calendar/hours/operatingIntervals.js +57 -0
- package/dist/calendar/hours/operatingTimeBetween.d.ts +45 -0
- package/dist/calendar/hours/operatingTimeBetween.js +54 -0
- package/dist/calendar/hours/recurringWindows.d.ts +68 -0
- package/dist/calendar/hours/recurringWindows.js +88 -0
- package/dist/calendar/index.d.ts +1 -0
- package/dist/calendar/index.js +1 -0
- package/dist/duration/calculate/durationFromUnits.d.ts +47 -0
- package/dist/duration/calculate/durationFromUnits.js +67 -0
- package/dist/duration/calculate/getDurationUnit.d.ts +2 -2
- package/dist/duration/calculate/getDurationUnit.js +2 -2
- package/dist/duration/calculate/index.d.ts +3 -1
- package/dist/duration/calculate/index.js +3 -1
- package/dist/duration/calculate/negateDuration.d.ts +1 -1
- package/dist/duration/calculate/negateDuration.js +1 -1
- package/dist/duration/calculate/totalDuration.d.ts +73 -0
- package/dist/duration/calculate/{durationAs.js → totalDuration.js} +29 -27
- package/dist/duration/calculate/totalUnits.d.ts +49 -0
- package/dist/duration/calculate/totalUnits.js +73 -0
- package/dist/duration/compare/compareDurations.d.ts +13 -7
- package/dist/duration/compare/compareDurations.js +4 -7
- package/dist/duration/format/formatDuration.d.ts +16 -4
- package/dist/duration/format/formatDuration.js +4 -5
- package/dist/duration/normalize/normalizeDuration.d.ts +39 -14
- package/dist/duration/normalize/normalizeDuration.js +6 -15
- package/dist/duration/parse/parseDuration.d.ts +21 -3
- package/dist/duration/parse/parseDuration.js +1 -3
- package/dist/duty/calculate/dutyDayFor.d.ts +38 -0
- package/dist/duty/calculate/dutyDayFor.js +71 -0
- package/dist/duty/calculate/dutyTotals.d.ts +24 -0
- package/dist/duty/calculate/dutyTotals.js +41 -0
- package/dist/duty/calculate/dutyViolations.d.ts +74 -0
- package/dist/duty/calculate/dutyViolations.js +65 -0
- package/dist/duty/calculate/evaluateDutyLog.d.ts +77 -0
- package/dist/duty/calculate/evaluateDutyLog.js +75 -0
- package/dist/duty/calculate/index.d.ts +7 -0
- package/dist/duty/calculate/index.js +7 -0
- package/dist/duty/calculate/longestRun.d.ts +28 -0
- package/dist/duty/calculate/longestRun.js +54 -0
- package/dist/duty/calculate/qualifyingRestPairs.d.ts +37 -0
- package/dist/duty/calculate/qualifyingRestPairs.js +58 -0
- package/dist/duty/calculate/qualifyingRests.d.ts +27 -0
- package/dist/duty/calculate/qualifyingRests.js +49 -0
- package/dist/duty/index.d.ts +3 -0
- package/dist/duty/index.js +4 -0
- package/dist/duty/validate/index.d.ts +1 -0
- package/dist/duty/validate/index.js +1 -0
- package/dist/duty/validate/isValidDutyLog.d.ts +24 -0
- package/dist/duty/validate/isValidDutyLog.js +34 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/instant/convert/classifyLocal.d.ts +5 -1
- package/dist/instant/convert/classifyLocal.js +16 -6
- package/dist/instant/convert/fromOffsetInstant.d.ts +7 -1
- package/dist/instant/convert/fromOffsetInstant.js +9 -2
- package/dist/instant/convert/resolveLocal.d.ts +18 -8
- package/dist/instant/convert/resolveLocal.js +21 -17
- package/dist/instant/convert/toOffsetInstant.d.ts +33 -16
- package/dist/instant/convert/toOffsetInstant.js +28 -13
- package/dist/instant/index.d.ts +1 -0
- package/dist/instant/index.js +1 -0
- package/dist/instant/validate/index.d.ts +1 -0
- package/dist/instant/validate/index.js +1 -0
- package/dist/instant/validate/isValidUtcOffset.d.ts +32 -0
- package/dist/instant/validate/isValidUtcOffset.js +35 -0
- package/dist/intermodal/calculate/billingTimeline.d.ts +31 -11
- package/dist/intermodal/calculate/billingTimeline.js +2 -2
- package/dist/intermodal/calculate/chargeableDays.d.ts +19 -11
- package/dist/intermodal/calculate/chargeableDays.js +13 -10
- package/dist/intermodal/calculate/demurrageClock.d.ts +16 -7
- package/dist/intermodal/calculate/demurrageClock.js +7 -7
- package/dist/intermodal/calculate/freeTimeExpiry.d.ts +12 -4
- package/dist/intermodal/calculate/freeTimeExpiry.js +19 -8
- package/dist/intermodal/calculate/index.d.ts +1 -0
- package/dist/intermodal/calculate/index.js +1 -0
- package/dist/intermodal/calculate/multimodalETA.d.ts +76 -0
- package/dist/intermodal/calculate/multimodalETA.js +145 -0
- package/dist/intermodal/format/bolTimestamp.d.ts +76 -0
- package/dist/intermodal/format/bolTimestamp.js +78 -0
- package/dist/intermodal/format/formatEdifactDate.d.ts +34 -0
- package/dist/intermodal/format/formatEdifactDate.js +42 -0
- package/dist/intermodal/format/formatEdifactDatePeriod.d.ts +35 -0
- package/dist/intermodal/format/formatEdifactDatePeriod.js +43 -0
- package/dist/intermodal/format/formatEdifactDateTime.d.ts +37 -0
- package/dist/intermodal/format/formatEdifactDateTime.js +45 -0
- package/dist/intermodal/format/formatEdifactDateTimePeriod.d.ts +40 -0
- package/dist/intermodal/format/formatEdifactDateTimePeriod.js +48 -0
- package/dist/intermodal/format/formatEdifactOffsetDateTime.d.ts +62 -0
- package/dist/intermodal/format/formatEdifactOffsetDateTime.js +70 -0
- package/dist/intermodal/format/formatEdifactTime.d.ts +35 -0
- package/dist/intermodal/format/formatEdifactTime.js +43 -0
- package/dist/intermodal/format/formatEpcisEvent.d.ts +47 -0
- package/dist/intermodal/format/formatEpcisEvent.js +79 -0
- package/dist/intermodal/format/formatX12Date.d.ts +35 -0
- package/dist/intermodal/format/formatX12Date.js +43 -0
- package/dist/intermodal/format/formatX12DateRange.d.ts +37 -0
- package/dist/intermodal/format/formatX12DateRange.js +45 -0
- package/dist/intermodal/format/formatX12DateTime.d.ts +39 -0
- package/dist/intermodal/format/formatX12DateTime.js +47 -0
- package/dist/intermodal/format/formatX12DateTimeRange.d.ts +40 -0
- package/dist/intermodal/format/formatX12DateTimeRange.js +48 -0
- package/dist/intermodal/format/formatX12Time.d.ts +42 -0
- package/dist/intermodal/format/formatX12Time.js +50 -0
- package/dist/intermodal/format/formatX12TimeElement.d.ts +46 -0
- package/dist/intermodal/format/formatX12TimeElement.js +54 -0
- package/dist/intermodal/format/index.d.ts +14 -0
- package/dist/intermodal/format/index.js +14 -0
- package/dist/intermodal/index.d.ts +3 -0
- package/dist/intermodal/index.js +3 -0
- package/dist/intermodal/parse/classifyEdifactDtmFormat.d.ts +48 -0
- package/dist/intermodal/parse/classifyEdifactDtmFormat.js +55 -0
- package/dist/intermodal/parse/classifyX12DateTimePeriodFormat.d.ts +50 -0
- package/dist/intermodal/parse/classifyX12DateTimePeriodFormat.js +57 -0
- package/dist/intermodal/parse/classifyX12TimeCode.d.ts +46 -0
- package/dist/intermodal/parse/classifyX12TimeCode.js +57 -0
- package/dist/intermodal/parse/index.d.ts +18 -0
- package/dist/intermodal/parse/index.js +18 -0
- package/dist/intermodal/parse/parseEdifactDate.d.ts +37 -0
- package/dist/intermodal/parse/parseEdifactDate.js +45 -0
- package/dist/intermodal/parse/parseEdifactDatePeriod.d.ts +43 -0
- package/dist/intermodal/parse/parseEdifactDatePeriod.js +51 -0
- package/dist/intermodal/parse/parseEdifactDateTime.d.ts +43 -0
- package/dist/intermodal/parse/parseEdifactDateTime.js +51 -0
- package/dist/intermodal/parse/parseEdifactDateTimePeriod.d.ts +45 -0
- package/dist/intermodal/parse/parseEdifactDateTimePeriod.js +53 -0
- package/dist/intermodal/parse/parseEdifactOffsetDateTime.d.ts +60 -0
- package/dist/intermodal/parse/parseEdifactOffsetDateTime.js +68 -0
- package/dist/intermodal/parse/parseEdifactTime.d.ts +37 -0
- package/dist/intermodal/parse/parseEdifactTime.js +45 -0
- package/dist/intermodal/parse/parseEpcisEvent.d.ts +95 -0
- package/dist/intermodal/parse/parseEpcisEvent.js +102 -0
- package/dist/intermodal/parse/parseX12Date.d.ts +39 -0
- package/dist/intermodal/parse/parseX12Date.js +47 -0
- package/dist/intermodal/parse/parseX12DateAndTime.d.ts +52 -0
- package/dist/intermodal/parse/parseX12DateAndTime.js +61 -0
- package/dist/intermodal/parse/parseX12DateRange.d.ts +44 -0
- package/dist/intermodal/parse/parseX12DateRange.js +52 -0
- package/dist/intermodal/parse/parseX12DateTime.d.ts +45 -0
- package/dist/intermodal/parse/parseX12DateTime.js +53 -0
- package/dist/intermodal/parse/parseX12DateTimeRange.d.ts +46 -0
- package/dist/intermodal/parse/parseX12DateTimeRange.js +54 -0
- package/dist/intermodal/parse/parseX12Time.d.ts +65 -0
- package/dist/intermodal/parse/parseX12Time.js +77 -0
- package/dist/intermodal/parse/x12TimeCodeOffset.d.ts +57 -0
- package/dist/intermodal/parse/x12TimeCodeOffset.js +110 -0
- package/dist/intermodal/parse/x12TimeCodeZone.d.ts +57 -0
- package/dist/intermodal/parse/x12TimeCodeZone.js +105 -0
- package/dist/intermodal/validate/index.d.ts +18 -0
- package/dist/intermodal/validate/index.js +18 -0
- package/dist/intermodal/validate/isValidEdifactDate.d.ts +26 -0
- package/dist/intermodal/validate/isValidEdifactDate.js +28 -0
- package/dist/intermodal/validate/isValidEdifactDatePeriod.d.ts +28 -0
- package/dist/intermodal/validate/isValidEdifactDatePeriod.js +30 -0
- package/dist/intermodal/validate/isValidEdifactDateTime.d.ts +30 -0
- package/dist/intermodal/validate/isValidEdifactDateTime.js +32 -0
- package/dist/intermodal/validate/isValidEdifactDateTimePeriod.d.ts +28 -0
- package/dist/intermodal/validate/isValidEdifactDateTimePeriod.js +30 -0
- package/dist/intermodal/validate/isValidEdifactDtmFormat.d.ts +39 -0
- package/dist/intermodal/validate/isValidEdifactDtmFormat.js +42 -0
- package/dist/intermodal/validate/isValidEdifactOffsetDateTime.d.ts +36 -0
- package/dist/intermodal/validate/isValidEdifactOffsetDateTime.js +38 -0
- package/dist/intermodal/validate/isValidEdifactTime.d.ts +28 -0
- package/dist/intermodal/validate/isValidEdifactTime.js +30 -0
- package/dist/intermodal/validate/isValidEpcisEvent.d.ts +41 -0
- package/dist/intermodal/validate/isValidEpcisEvent.js +58 -0
- package/dist/intermodal/validate/isValidEpcisEventTime.d.ts +33 -0
- package/dist/intermodal/validate/isValidEpcisEventTime.js +48 -0
- package/dist/intermodal/validate/isValidEpcisTimeZoneOffset.d.ts +30 -0
- package/dist/intermodal/validate/isValidEpcisTimeZoneOffset.js +38 -0
- package/dist/intermodal/validate/isValidX12Date.d.ts +28 -0
- package/dist/intermodal/validate/isValidX12Date.js +30 -0
- package/dist/intermodal/validate/isValidX12DateAndTime.d.ts +32 -0
- package/dist/intermodal/validate/isValidX12DateAndTime.js +35 -0
- package/dist/intermodal/validate/isValidX12DateRange.d.ts +29 -0
- package/dist/intermodal/validate/isValidX12DateRange.js +31 -0
- package/dist/intermodal/validate/isValidX12DateTime.d.ts +30 -0
- package/dist/intermodal/validate/isValidX12DateTime.js +32 -0
- package/dist/intermodal/validate/isValidX12DateTimePeriodFormat.d.ts +43 -0
- package/dist/intermodal/validate/isValidX12DateTimePeriodFormat.js +46 -0
- package/dist/intermodal/validate/isValidX12DateTimeRange.d.ts +31 -0
- package/dist/intermodal/validate/isValidX12DateTimeRange.js +33 -0
- package/dist/intermodal/validate/isValidX12Time.d.ts +38 -0
- package/dist/intermodal/validate/isValidX12Time.js +40 -0
- package/dist/intermodal/validate/isValidX12TimeCode.d.ts +38 -0
- package/dist/intermodal/validate/isValidX12TimeCode.js +41 -0
- package/dist/internal/businessCalendar.d.ts +5 -0
- package/dist/internal/businessCalendar.js +9 -10
- package/dist/internal/cycleFieldValue.d.ts +6 -4
- package/dist/internal/cycleFieldValue.js +6 -4
- package/dist/internal/daylightTime.d.ts +33 -0
- package/dist/internal/daylightTime.js +164 -0
- package/dist/internal/durationUntilString.js +4 -3
- package/dist/internal/dutyEngine.d.ts +125 -0
- package/dist/internal/dutyEngine.js +1746 -0
- package/dist/internal/dutyLog.d.ts +27 -0
- package/dist/internal/dutyLog.js +47 -0
- package/dist/internal/dutyPeriods.d.ts +135 -0
- package/dist/internal/dutyPeriods.js +369 -0
- package/dist/internal/dutyRules.d.ts +197 -0
- package/dist/internal/dutyRules.js +484 -0
- package/dist/internal/ediDateTimeFields.d.ts +97 -0
- package/dist/internal/ediDateTimeFields.js +288 -0
- package/dist/internal/ediDateTimeWriter.d.ts +92 -0
- package/dist/internal/ediDateTimeWriter.js +298 -0
- package/dist/internal/ediGrammar.d.ts +158 -0
- package/dist/internal/ediGrammar.js +384 -0
- package/dist/internal/englishCalendarNames.d.ts +3 -1
- package/dist/internal/englishCalendarNames.js +4 -3
- package/dist/internal/epochNanoseconds.d.ts +2 -0
- package/dist/internal/epochNanoseconds.js +2 -0
- package/dist/internal/exactDuration.d.ts +37 -0
- package/dist/internal/exactDuration.js +64 -0
- package/dist/internal/exactMoment.d.ts +72 -0
- package/dist/internal/exactMoment.js +114 -0
- package/dist/internal/fiscalCalendar.d.ts +4 -3
- package/dist/internal/fiscalCalendar.js +4 -3
- package/dist/internal/formatCalendarDays.d.ts +2 -2
- package/dist/internal/formatRelativeDuration.d.ts +21 -1
- package/dist/internal/formatRelativeDuration.js +47 -7
- package/dist/internal/freeTimeLedger.d.ts +5 -0
- package/dist/internal/freeTimeLedger.js +11 -2
- package/dist/internal/index.d.ts +12 -4
- package/dist/internal/index.js +16 -4
- package/dist/internal/instantFormatOptions.js +2 -1
- package/dist/internal/instantNanoseconds.d.ts +75 -9
- package/dist/internal/instantNanoseconds.js +192 -11
- package/dist/internal/intervalNanoseconds.js +2 -1
- package/dist/internal/isObject.d.ts +13 -6
- package/dist/internal/isObject.js +14 -7
- package/dist/internal/isoYearString.d.ts +21 -0
- package/dist/internal/isoYearString.js +27 -0
- package/dist/internal/joinDateTimeConnector.d.ts +1 -1
- package/dist/internal/maxPieces.js +2 -1
- package/dist/internal/monthGridWeekRow.d.ts +2 -1
- package/dist/internal/monthGridWeekRow.js +2 -1
- package/dist/internal/normalizeTimeZone.d.ts +5 -2
- package/dist/internal/normalizeTimeZone.js +5 -2
- package/dist/internal/operatingSchedule.d.ts +138 -0
- package/dist/internal/operatingSchedule.js +756 -0
- package/dist/internal/optionOrDefault.d.ts +18 -0
- package/dist/internal/optionOrDefault.js +20 -0
- package/dist/internal/patternToken.d.ts +12 -5
- package/dist/internal/patternToken.js +59 -25
- package/dist/internal/plainDateUntil.js +10 -6
- package/dist/internal/punctuality.d.ts +38 -0
- package/dist/internal/punctuality.js +59 -0
- package/dist/internal/readDateTimeFormatOptions.d.ts +30 -0
- package/dist/internal/readDateTimeFormatOptions.js +93 -0
- package/dist/internal/readDurationUnits.d.ts +34 -0
- package/dist/internal/readDurationUnits.js +78 -0
- package/dist/internal/readSetFields.d.ts +50 -0
- package/dist/internal/readSetFields.js +179 -0
- package/dist/internal/resolveDurationRelativeTo.d.ts +4 -0
- package/dist/internal/resolveDurationRelativeTo.js +11 -1
- package/dist/internal/resolveRelativeRounding.d.ts +17 -6
- package/dist/internal/resolveRelativeRounding.js +27 -7
- package/dist/internal/resolveRelativeUnit.d.ts +30 -0
- package/dist/internal/resolveRelativeUnit.js +40 -0
- package/dist/internal/resolveUnixIntervalPair.d.ts +8 -2
- package/dist/internal/resolveUnixIntervalPair.js +11 -7
- package/dist/internal/splitStep.d.ts +24 -1
- package/dist/internal/splitStep.js +34 -2
- package/dist/internal/startOrEndOfUnix.d.ts +2 -1
- package/dist/internal/startOrEndOfUnix.js +9 -6
- package/dist/internal/startOrEndOfZoned.js +2 -3
- package/dist/internal/temporalCompat/capabilities.d.ts +26 -0
- package/dist/internal/temporalCompat/capabilities.js +35 -3
- package/dist/internal/temporalCompat/fieldSearch.js +1 -1
- package/dist/internal/temporalCompat/index.d.ts +1 -1
- package/dist/internal/temporalCompat/index.js +1 -1
- package/dist/internal/temporalCompat/repros.d.ts +1 -1
- package/dist/internal/temporalCompat/repros.js +157 -0
- package/dist/internal/timestampEvents.d.ts +32 -0
- package/dist/internal/timestampEvents.js +76 -0
- package/dist/internal/twoDigitYear.d.ts +19 -0
- package/dist/internal/twoDigitYear.js +22 -0
- package/dist/internal/unixEpochValue.js +3 -2
- package/dist/internal/unixWallClock.d.ts +24 -0
- package/dist/internal/unixWallClock.js +35 -0
- package/dist/internal/utcWallClock.d.ts +20 -0
- package/dist/internal/utcWallClock.js +32 -0
- package/dist/internal/yearWindowStart.d.ts +28 -0
- package/dist/internal/yearWindowStart.js +52 -0
- package/dist/internal/zoneBucketCap.d.ts +18 -0
- package/dist/internal/zoneBucketCap.js +64 -0
- package/dist/internal/zoneFrame.d.ts +180 -0
- package/dist/internal/zoneFrame.js +221 -0
- package/dist/internal/zonedBucket.js +8 -6
- package/dist/internal/zonedLocalDates.js +1 -1
- package/dist/internal/zonedNowUnitValue.d.ts +7 -4
- package/dist/internal/zonedNowUnitValue.js +8 -4
- package/dist/internal/zonedTransitionSearch.d.ts +27 -0
- package/dist/internal/zonedTransitionSearch.js +218 -0
- package/dist/internal/zonedWallClock.d.ts +21 -7
- package/dist/internal/zonedWallClock.js +87 -18
- package/dist/internal/zonedWallClockDifference.js +4 -4
- package/dist/internal/zonedWallClockOperations.d.ts +31 -15
- package/dist/internal/zonedWallClockOperations.js +93 -43
- package/dist/interval/validate/isValidInterval.d.ts +6 -3
- package/dist/interval/validate/isValidInterval.js +6 -3
- package/dist/plain/calculate/addDate.d.ts +11 -8
- package/dist/plain/calculate/addDate.js +9 -15
- package/dist/plain/calculate/addDateTime.d.ts +7 -4
- package/dist/plain/calculate/addDateTime.js +5 -11
- package/dist/plain/calculate/addTime.js +4 -7
- package/dist/plain/calculate/cycleDate.d.ts +16 -7
- package/dist/plain/calculate/cycleDate.js +3 -7
- package/dist/plain/calculate/cycleDateTime.d.ts +14 -4
- package/dist/plain/calculate/cycleDateTime.js +1 -4
- package/dist/plain/calculate/cycleTime.d.ts +10 -5
- package/dist/plain/calculate/cycleTime.js +3 -5
- package/dist/plain/calculate/diffDate.d.ts +1 -1
- package/dist/plain/calculate/diffDate.js +1 -1
- package/dist/plain/calculate/diffDateAsDuration.d.ts +1 -1
- package/dist/plain/calculate/diffDateAsDuration.js +1 -1
- package/dist/plain/calculate/diffDateTime.d.ts +1 -1
- package/dist/plain/calculate/diffDateTime.js +1 -1
- package/dist/plain/calculate/diffDateTimeAsDuration.d.ts +1 -1
- package/dist/plain/calculate/diffDateTimeAsDuration.js +1 -1
- package/dist/plain/calculate/diffTime.d.ts +1 -1
- package/dist/plain/calculate/diffTime.js +1 -1
- package/dist/plain/calculate/endOfDate.d.ts +8 -3
- package/dist/plain/calculate/endOfDate.js +1 -3
- package/dist/plain/calculate/endOfDateTime.d.ts +15 -5
- package/dist/plain/calculate/endOfDateTime.js +1 -5
- package/dist/plain/calculate/endOfTime.d.ts +9 -3
- package/dist/plain/calculate/endOfTime.js +1 -2
- package/dist/plain/calculate/getLocaleWeekYear.d.ts +16 -9
- package/dist/plain/calculate/getLocaleWeekYear.js +9 -9
- package/dist/plain/calculate/getWeekOfMonth.d.ts +7 -4
- package/dist/plain/calculate/getWeekOfMonth.js +7 -4
- package/dist/plain/calculate/getWeeksInLocaleWeekYear.d.ts +13 -6
- package/dist/plain/calculate/getWeeksInLocaleWeekYear.js +6 -6
- package/dist/plain/calculate/getWeeksInMonth.d.ts +5 -2
- package/dist/plain/calculate/getWeeksInMonth.js +5 -2
- package/dist/plain/calculate/nextWeekday.d.ts +7 -3
- package/dist/plain/calculate/nextWeekday.js +1 -3
- package/dist/plain/calculate/previousWeekday.d.ts +7 -3
- package/dist/plain/calculate/previousWeekday.js +1 -3
- package/dist/plain/calculate/roundDate.d.ts +20 -7
- package/dist/plain/calculate/roundDate.js +3 -10
- package/dist/plain/calculate/roundDateTime.d.ts +22 -8
- package/dist/plain/calculate/roundDateTime.js +3 -11
- package/dist/plain/calculate/roundTime.d.ts +20 -4
- package/dist/plain/calculate/roundTime.js +3 -7
- package/dist/plain/calculate/setDate.d.ts +27 -8
- package/dist/plain/calculate/setDate.js +28 -12
- package/dist/plain/calculate/setDateTime.d.ts +23 -8
- package/dist/plain/calculate/setDateTime.js +23 -12
- package/dist/plain/calculate/setTime.d.ts +23 -7
- package/dist/plain/calculate/setTime.js +25 -12
- package/dist/plain/calculate/startOfDate.d.ts +8 -2
- package/dist/plain/calculate/startOfDate.js +1 -2
- package/dist/plain/calculate/startOfDateTime.d.ts +15 -2
- package/dist/plain/calculate/startOfDateTime.js +1 -2
- package/dist/plain/calculate/startOfTime.d.ts +9 -2
- package/dist/plain/calculate/startOfTime.js +1 -1
- package/dist/plain/calculate/subtractDate.d.ts +7 -4
- package/dist/plain/calculate/subtractDate.js +5 -11
- package/dist/plain/calculate/subtractDateTime.d.ts +7 -4
- package/dist/plain/calculate/subtractDateTime.js +5 -11
- package/dist/plain/calculate/subtractTime.js +4 -7
- package/dist/plain/compare/areDateTimesEqualBy.d.ts +13 -5
- package/dist/plain/compare/areDateTimesEqualBy.js +6 -5
- package/dist/plain/compare/areDatesEqualBy.d.ts +15 -6
- package/dist/plain/compare/areDatesEqualBy.js +8 -6
- package/dist/plain/compare/isBetweenDate.d.ts +13 -2
- package/dist/plain/compare/isBetweenDate.js +4 -4
- package/dist/plain/compare/isBetweenDateTime.d.ts +13 -2
- package/dist/plain/compare/isBetweenDateTime.js +4 -4
- package/dist/plain/compare/isBetweenTime.d.ts +13 -2
- package/dist/plain/compare/isBetweenTime.js +4 -4
- package/dist/plain/compare/isRelativeDay.d.ts +1 -1
- package/dist/plain/compare/isRelativeDay.js +1 -1
- package/dist/plain/compare/isThisUnit.d.ts +1 -1
- package/dist/plain/compare/isThisUnit.js +1 -1
- package/dist/plain/format/formatCalendar.d.ts +21 -14
- package/dist/plain/format/formatCalendar.js +23 -17
- package/dist/plain/format/formatDate.js +5 -3
- package/dist/plain/format/formatDateRange.js +4 -2
- package/dist/plain/format/formatDateTime.js +4 -2
- package/dist/plain/format/formatDateTimeRange.js +4 -2
- package/dist/plain/format/formatDateTimeToParts.d.ts +15 -4
- package/dist/plain/format/formatDateTimeToParts.js +10 -6
- package/dist/plain/format/formatDateToParts.d.ts +13 -2
- package/dist/plain/format/formatDateToParts.js +8 -4
- package/dist/plain/format/formatRelativeDate.d.ts +16 -3
- package/dist/plain/format/formatRelativeDate.js +28 -16
- package/dist/plain/format/formatRelativeDateTime.d.ts +16 -3
- package/dist/plain/format/formatRelativeDateTime.js +10 -6
- package/dist/plain/format/formatRelativeTime.d.ts +16 -3
- package/dist/plain/format/formatRelativeTime.js +23 -14
- package/dist/plain/format/{formatSql.d.ts → formatSqlDateTime.d.ts} +7 -7
- package/dist/plain/format/{formatSql.js → formatSqlDateTime.js} +7 -7
- package/dist/plain/format/formatTime.js +4 -2
- package/dist/plain/format/index.d.ts +1 -1
- package/dist/plain/format/index.js +1 -1
- package/dist/plain/get/getNowUnit.d.ts +2 -0
- package/dist/plain/get/getNowUnit.js +2 -0
- package/dist/plain/get/getYear.d.ts +2 -0
- package/dist/plain/get/getYear.js +4 -3
- package/dist/plain/interval/intervalDifferenceDate.d.ts +9 -0
- package/dist/plain/interval/intervalDifferenceDateTime.d.ts +9 -0
- package/dist/plain/interval/intervalDifferenceTime.d.ts +9 -0
- package/dist/plain/interval/intervalDivideEquallyDate.d.ts +19 -4
- package/dist/plain/interval/intervalDivideEquallyDate.js +3 -4
- package/dist/plain/interval/intervalDivideEquallyDateTime.d.ts +19 -4
- package/dist/plain/interval/intervalDivideEquallyDateTime.js +3 -4
- package/dist/plain/interval/intervalDivideEquallyTime.d.ts +19 -4
- package/dist/plain/interval/intervalDivideEquallyTime.js +3 -4
- package/dist/plain/interval/intervalFromDurationDate.d.ts +16 -3
- package/dist/plain/interval/intervalFromDurationDate.js +1 -3
- package/dist/plain/interval/intervalFromDurationDateTime.d.ts +16 -3
- package/dist/plain/interval/intervalFromDurationDateTime.js +1 -3
- package/dist/plain/interval/intervalFromDurationTime.d.ts +9 -0
- package/dist/plain/interval/intervalIntersectionDate.d.ts +9 -0
- package/dist/plain/interval/intervalIntersectionDateTime.d.ts +9 -0
- package/dist/plain/interval/intervalIntersectionTime.d.ts +9 -0
- package/dist/plain/interval/intervalSplitAtDate.d.ts +11 -0
- package/dist/plain/interval/intervalSplitAtDate.js +2 -0
- package/dist/plain/interval/intervalSplitAtDateTime.d.ts +11 -0
- package/dist/plain/interval/intervalSplitAtDateTime.js +2 -0
- package/dist/plain/interval/intervalSplitAtTime.d.ts +11 -0
- package/dist/plain/interval/intervalSplitAtTime.js +2 -0
- package/dist/plain/interval/intervalUnionDate.d.ts +9 -0
- package/dist/plain/interval/intervalUnionDateTime.d.ts +9 -0
- package/dist/plain/interval/intervalUnionTime.d.ts +9 -0
- package/dist/plain/interval/intervalXorAllDate.d.ts +9 -0
- package/dist/plain/interval/intervalXorAllDate.js +2 -2
- package/dist/plain/interval/intervalXorAllDateTime.d.ts +9 -0
- package/dist/plain/interval/intervalXorAllDateTime.js +2 -2
- package/dist/plain/interval/intervalXorAllTime.d.ts +9 -0
- package/dist/plain/interval/intervalXorAllTime.js +2 -2
- package/dist/plain/interval/intervalXorDate.d.ts +9 -0
- package/dist/plain/interval/intervalXorDateTime.d.ts +9 -0
- package/dist/plain/interval/intervalXorTime.d.ts +9 -0
- package/dist/plain/interval/mergeIntervalsDate.d.ts +9 -0
- package/dist/plain/interval/mergeIntervalsDate.js +2 -2
- package/dist/plain/interval/mergeIntervalsDateTime.d.ts +9 -0
- package/dist/plain/interval/mergeIntervalsDateTime.js +2 -2
- package/dist/plain/interval/mergeIntervalsTime.d.ts +9 -0
- package/dist/plain/interval/mergeIntervalsTime.js +2 -2
- package/dist/plain/interval/splitIntervalByUnitDate.d.ts +23 -7
- package/dist/plain/interval/splitIntervalByUnitDate.js +7 -7
- package/dist/plain/interval/splitIntervalByUnitDateTime.d.ts +22 -6
- package/dist/plain/interval/splitIntervalByUnitDateTime.js +6 -6
- package/dist/plain/interval/splitIntervalByUnitTime.d.ts +17 -4
- package/dist/plain/interval/splitIntervalByUnitTime.js +1 -4
- package/dist/plain/map/mapDatesInRange.d.ts +8 -4
- package/dist/plain/map/mapDatesInRange.js +1 -4
- package/dist/plain/parse/index.d.ts +1 -1
- package/dist/plain/parse/index.js +1 -1
- package/dist/plain/parse/parseDateTimeWithPattern.d.ts +25 -9
- package/dist/plain/parse/parseDateTimeWithPattern.js +29 -11
- package/dist/plain/parse/parseDateWithPattern.d.ts +26 -9
- package/dist/plain/parse/parseDateWithPattern.js +30 -11
- package/dist/plain/parse/{parseSql.d.ts → parseSqlDateTime.d.ts} +8 -8
- package/dist/plain/parse/{parseSql.js → parseSqlDateTime.js} +8 -8
- package/dist/plain/parse/parseTimeWithPattern.d.ts +10 -7
- package/dist/plain/parse/parseTimeWithPattern.js +11 -7
- package/dist/plain/parse/parseUnitFromDate.d.ts +14 -3
- package/dist/plain/parse/parseUnitFromDate.js +8 -4
- package/dist/plain/parse/parseUnitFromDateTime.d.ts +14 -3
- package/dist/plain/parse/parseUnitFromDateTime.js +8 -4
- package/dist/plain/parse/parseWeekFromDate.d.ts +10 -6
- package/dist/plain/parse/parseWeekFromDate.js +2 -6
- package/dist/plain/parse/parseWeekFromDateTime.d.ts +10 -6
- package/dist/plain/parse/parseWeekFromDateTime.js +2 -6
- package/dist/plain/parse/parseYearFromDate.d.ts +5 -2
- package/dist/plain/parse/parseYearFromDate.js +7 -3
- package/dist/plain/parse/parseYearFromDateTime.d.ts +4 -2
- package/dist/plain/parse/parseYearFromDateTime.js +6 -3
- package/dist/plain/validate/index.d.ts +1 -0
- package/dist/plain/validate/index.js +1 -0
- package/dist/plain/validate/isValidDateRange.d.ts +19 -4
- package/dist/plain/validate/isValidDateRange.js +1 -4
- package/dist/plain/validate/isValidDateTimeRange.d.ts +20 -5
- package/dist/plain/validate/isValidDateTimeRange.js +2 -5
- package/dist/plain/validate/isValidSqlDateTime.d.ts +33 -0
- package/dist/plain/validate/isValidSqlDateTime.js +36 -0
- package/dist/plain/validate/isValidTimeRange.d.ts +20 -5
- package/dist/plain/validate/isValidTimeRange.js +2 -5
- package/dist/precision/convert/fromExcelSerial.d.ts +10 -4
- package/dist/precision/convert/fromExcelSerial.js +4 -5
- package/dist/precision/convert/fromNanoseconds.d.ts +9 -3
- package/dist/precision/convert/fromNanoseconds.js +9 -3
- package/dist/precision/convert/toExcelSerial.d.ts +9 -3
- package/dist/precision/convert/toExcelSerial.js +3 -4
- package/dist/precision/convert/toNanoseconds.d.ts +11 -6
- package/dist/precision/convert/toNanoseconds.js +11 -6
- package/dist/precision/validate/isValidInstant.d.ts +12 -3
- package/dist/precision/validate/isValidInstant.js +12 -3
- package/dist/regex/epcis.d.ts +60 -0
- package/dist/regex/epcis.js +60 -0
- package/dist/regex/http-date.d.ts +6 -4
- package/dist/regex/http-date.js +6 -4
- package/dist/regex/index.d.ts +1 -0
- package/dist/regex/index.js +1 -0
- package/dist/regex/rfc-2822.d.ts +2 -0
- package/dist/regex/rfc-2822.js +2 -0
- package/dist/regex/rfc-3339.d.ts +3 -1
- package/dist/regex/rfc-3339.js +3 -1
- package/dist/regex/sql-date-time.d.ts +2 -1
- package/dist/regex/sql-date-time.js +2 -1
- package/dist/regex/time-zone-like.d.ts +3 -2
- package/dist/regex/time-zone-like.js +3 -2
- package/dist/regex/utc-offset.d.ts +2 -1
- package/dist/regex/utc-offset.js +2 -1
- package/dist/span/calculate/spanMs.d.ts +10 -4
- package/dist/span/calculate/spanMs.js +10 -4
- package/dist/span/calculate/spanNs.d.ts +10 -4
- package/dist/span/calculate/spanNs.js +10 -4
- package/dist/span/validate/isValidSpan.d.ts +8 -3
- package/dist/span/validate/isValidSpan.js +8 -3
- package/dist/transport/calculate/bestAvailable.d.ts +47 -0
- package/dist/transport/calculate/bestAvailable.js +76 -0
- package/dist/transport/calculate/crossingTime.d.ts +63 -0
- package/dist/transport/calculate/crossingTime.js +81 -0
- package/dist/transport/calculate/cutoffAt.d.ts +95 -0
- package/dist/transport/calculate/cutoffAt.js +211 -0
- package/dist/transport/calculate/cutoffSchedule.d.ts +75 -0
- package/dist/transport/calculate/cutoffSchedule.js +73 -0
- package/dist/transport/calculate/dwellTime.d.ts +22 -8
- package/dist/transport/calculate/dwellTime.js +18 -9
- package/dist/transport/calculate/estimateDrift.d.ts +65 -0
- package/dist/transport/calculate/estimateDrift.js +75 -0
- package/dist/transport/calculate/index.d.ts +8 -0
- package/dist/transport/calculate/index.js +8 -0
- package/dist/transport/calculate/nextDeparture.d.ts +78 -0
- package/dist/transport/calculate/nextDeparture.js +131 -0
- package/dist/transport/calculate/punctualityRate.d.ts +42 -0
- package/dist/transport/calculate/punctualityRate.js +59 -0
- package/dist/transport/calculate/scheduleDelivery.d.ts +158 -0
- package/dist/transport/calculate/scheduleDelivery.js +305 -0
- package/dist/transport/calculate/transitTime.d.ts +21 -3
- package/dist/transport/calculate/transitTime.js +29 -46
- package/dist/transport/compare/classifyPunctuality.d.ts +46 -0
- package/dist/transport/compare/classifyPunctuality.js +64 -0
- package/dist/transport/compare/index.d.ts +4 -0
- package/dist/transport/compare/index.js +4 -0
- package/dist/transport/compare/isPastCutoff.d.ts +33 -0
- package/dist/transport/compare/isPastCutoff.js +48 -0
- package/dist/transport/compare/scheduleDeviation.d.ts +37 -0
- package/dist/transport/compare/scheduleDeviation.js +53 -0
- package/dist/transport/compare/timeToCutoff.d.ts +31 -0
- package/dist/transport/compare/timeToCutoff.js +47 -0
- package/dist/transport/convert/etaAtZone.d.ts +13 -1
- package/dist/transport/convert/etaAtZone.js +15 -5
- package/dist/transport/index.d.ts +1 -0
- package/dist/transport/index.js +1 -0
- package/dist/types/business-calendar.d.ts +20 -14
- package/dist/types/calendar-options.d.ts +15 -3
- package/dist/types/date-cycle-field.d.ts +5 -0
- package/dist/types/date-duration-unit.d.ts +4 -0
- package/dist/types/date-time-cycle-field.d.ts +4 -0
- package/dist/types/date-time-duration-units.d.ts +4 -0
- package/dist/types/date-time-unit.d.ts +4 -0
- package/dist/types/date-unit.d.ts +4 -0
- package/dist/types/disambiguation.d.ts +8 -0
- package/dist/types/duration-relative-to.d.ts +8 -0
- package/dist/types/duration-string-options.d.ts +28 -0
- package/dist/types/duty.d.ts +777 -0
- package/dist/types/edi.d.ts +407 -0
- package/dist/types/edi.js +0 -0
- package/dist/types/epcis.d.ts +25 -0
- package/dist/types/epcis.js +0 -0
- package/dist/types/exact-duration-unit.d.ts +8 -0
- package/dist/types/exact-duration-unit.js +0 -0
- package/dist/types/fiscal-calendar.d.ts +1 -1
- package/dist/types/fractional-digit.d.ts +5 -0
- package/dist/types/free-time-options.d.ts +22 -11
- package/dist/types/index.d.ts +7 -1
- package/dist/types/index.js +7 -1
- package/dist/types/interval.d.ts +8 -1
- package/dist/types/offset.d.ts +9 -0
- package/dist/types/operating-schedule.d.ts +72 -0
- package/dist/types/operating-schedule.js +0 -0
- package/dist/types/overflow.d.ts +6 -0
- package/dist/types/relative-rounding-method.d.ts +6 -0
- package/dist/types/relative-time-options.d.ts +33 -5
- package/dist/types/rounding-options.d.ts +27 -0
- package/dist/types/time-cycle-field.d.ts +4 -0
- package/dist/types/time-duration-unit.d.ts +4 -0
- package/dist/types/time-unit.d.ts +4 -0
- package/dist/types/transport-timestamps.d.ts +54 -0
- package/dist/types/transport-timestamps.js +0 -0
- package/dist/types/two-digit-year.d.ts +23 -0
- package/dist/types/two-digit-year.js +0 -0
- package/dist/types/zone-bucket-unit.d.ts +1 -1
- package/dist/unix/calculate/addUnix.d.ts +28 -5
- package/dist/unix/calculate/addUnix.js +15 -16
- package/dist/unix/calculate/diffUnix.d.ts +21 -3
- package/dist/unix/calculate/diffUnix.js +12 -9
- package/dist/unix/calculate/diffUnixAsDuration.d.ts +21 -3
- package/dist/unix/calculate/diffUnixAsDuration.js +11 -8
- package/dist/unix/calculate/endOfQuarterForUnix.d.ts +21 -3
- package/dist/unix/calculate/endOfQuarterForUnix.js +7 -3
- package/dist/unix/calculate/endOfUnix.d.ts +29 -4
- package/dist/unix/calculate/endOfUnix.js +8 -4
- package/dist/unix/calculate/isBetweenUnix.d.ts +27 -4
- package/dist/unix/calculate/isBetweenUnix.js +7 -9
- package/dist/unix/calculate/roundUnix.d.ts +39 -3
- package/dist/unix/calculate/roundUnix.js +16 -12
- package/dist/unix/calculate/setUnix.d.ts +58 -12
- package/dist/unix/calculate/setUnix.js +37 -25
- package/dist/unix/calculate/startOfQuarterForUnix.d.ts +21 -3
- package/dist/unix/calculate/startOfQuarterForUnix.js +7 -3
- package/dist/unix/calculate/startOfUnix.d.ts +29 -4
- package/dist/unix/calculate/startOfUnix.js +8 -4
- package/dist/unix/calculate/subtractUnix.d.ts +27 -5
- package/dist/unix/calculate/subtractUnix.js +14 -16
- package/dist/unix/compare/areUnixEqual.d.ts +7 -1
- package/dist/unix/compare/areUnixEqual.js +1 -1
- package/dist/unix/compare/areUnixEqualBy.d.ts +33 -7
- package/dist/unix/compare/areUnixEqualBy.js +20 -9
- package/dist/unix/compare/isAfterUnix.d.ts +7 -1
- package/dist/unix/compare/isAfterUnix.js +1 -1
- package/dist/unix/compare/isBeforeUnix.d.ts +7 -1
- package/dist/unix/compare/isBeforeUnix.js +1 -1
- package/dist/unix/convert/convertUnixToPlainDate.d.ts +17 -4
- package/dist/unix/convert/convertUnixToPlainDate.js +7 -8
- package/dist/unix/convert/convertUnixToPlainDateTime.d.ts +17 -4
- package/dist/unix/convert/convertUnixToPlainDateTime.js +7 -8
- package/dist/unix/convert/convertUnixToPlainTime.d.ts +17 -4
- package/dist/unix/convert/convertUnixToPlainTime.js +7 -8
- package/dist/unix/convert/convertUnixToUtc.d.ts +9 -4
- package/dist/unix/convert/convertUnixToUtc.js +3 -4
- package/dist/unix/convert/convertUnixToZoned.d.ts +14 -5
- package/dist/unix/convert/convertUnixToZoned.js +8 -5
- package/dist/unix/format/formatCalendarUnix.d.ts +31 -19
- package/dist/unix/format/formatCalendarUnix.js +10 -6
- package/dist/unix/format/formatRelativeUnix.d.ts +62 -5
- package/dist/unix/format/formatRelativeUnix.js +16 -10
- package/dist/unix/format/formatUnix.d.ts +29 -6
- package/dist/unix/format/formatUnix.js +12 -7
- package/dist/unix/get/getUnixDay.d.ts +1 -3
- package/dist/unix/get/getUnixDay.js +5 -12
- package/dist/unix/get/getUnixHour.d.ts +1 -3
- package/dist/unix/get/getUnixHour.js +5 -12
- package/dist/unix/get/getUnixMicrosecond.d.ts +1 -3
- package/dist/unix/get/getUnixMicrosecond.js +4 -11
- package/dist/unix/get/getUnixMillisecond.d.ts +1 -3
- package/dist/unix/get/getUnixMillisecond.js +5 -12
- package/dist/unix/get/getUnixMinute.d.ts +1 -3
- package/dist/unix/get/getUnixMinute.js +5 -12
- package/dist/unix/get/getUnixMonth.d.ts +1 -3
- package/dist/unix/get/getUnixMonth.js +5 -12
- package/dist/unix/get/getUnixNanosecond.d.ts +1 -3
- package/dist/unix/get/getUnixNanosecond.js +4 -11
- package/dist/unix/get/getUnixNow.d.ts +8 -3
- package/dist/unix/get/getUnixNow.js +1 -3
- package/dist/unix/get/getUnixNowUnit.d.ts +2 -0
- package/dist/unix/get/getUnixNowUnit.js +2 -0
- package/dist/unix/get/getUnixSecond.d.ts +1 -3
- package/dist/unix/get/getUnixSecond.js +5 -12
- package/dist/unix/get/getUnixYear.d.ts +3 -3
- package/dist/unix/get/getUnixYear.js +5 -12
- package/dist/unix/interval/intervalCountUnix.d.ts +23 -5
- package/dist/unix/interval/intervalCountUnix.js +9 -5
- package/dist/unix/interval/intervalDifferenceUnix.d.ts +6 -0
- package/dist/unix/interval/intervalDivideEquallyUnix.d.ts +18 -4
- package/dist/unix/interval/intervalDivideEquallyUnix.js +5 -4
- package/dist/unix/interval/intervalFromDurationUnix.d.ts +41 -5
- package/dist/unix/interval/intervalFromDurationUnix.js +18 -12
- package/dist/unix/interval/intervalIntersectionUnix.d.ts +6 -0
- package/dist/unix/interval/intervalLengthUnix.d.ts +24 -6
- package/dist/unix/interval/intervalLengthUnix.js +10 -6
- package/dist/unix/interval/intervalOverlappingDaysUnix.d.ts +21 -3
- package/dist/unix/interval/intervalOverlappingDaysUnix.js +11 -8
- package/dist/unix/interval/intervalSplitAtUnix.d.ts +8 -0
- package/dist/unix/interval/intervalSplitAtUnix.js +2 -0
- package/dist/unix/interval/intervalUnionUnix.d.ts +6 -0
- package/dist/unix/interval/intervalXorAllUnix.d.ts +6 -0
- package/dist/unix/interval/intervalXorUnix.d.ts +6 -0
- package/dist/unix/interval/mergeIntervalsUnix.d.ts +6 -0
- package/dist/unix/interval/splitIntervalByUnitUnix.d.ts +50 -11
- package/dist/unix/interval/splitIntervalByUnitUnix.js +33 -22
- package/dist/unix/parse/parseDateFromUnix.d.ts +15 -2
- package/dist/unix/parse/parseDateFromUnix.js +4 -5
- package/dist/unix/parse/parseDayFromUnix.d.ts +16 -2
- package/dist/unix/parse/parseDayFromUnix.js +2 -2
- package/dist/unix/parse/parseDayOfWeekFromUnix.d.ts +15 -1
- package/dist/unix/parse/parseDayOfWeekFromUnix.js +3 -3
- package/dist/unix/parse/parseHourFromUnix.d.ts +16 -2
- package/dist/unix/parse/parseHourFromUnix.js +2 -2
- package/dist/unix/parse/parseMicrosecondFromUnix.d.ts +16 -2
- package/dist/unix/parse/parseMicrosecondFromUnix.js +2 -2
- package/dist/unix/parse/parseMillisecondFromUnix.d.ts +16 -2
- package/dist/unix/parse/parseMillisecondFromUnix.js +2 -2
- package/dist/unix/parse/parseMinuteFromUnix.d.ts +16 -2
- package/dist/unix/parse/parseMinuteFromUnix.js +2 -2
- package/dist/unix/parse/parseMonthFromUnix.d.ts +16 -2
- package/dist/unix/parse/parseMonthFromUnix.js +2 -2
- package/dist/unix/parse/parseNanosecondFromUnix.d.ts +16 -2
- package/dist/unix/parse/parseNanosecondFromUnix.js +2 -2
- package/dist/unix/parse/parseSecondFromUnix.d.ts +16 -2
- package/dist/unix/parse/parseSecondFromUnix.js +2 -2
- package/dist/unix/parse/parseTimeFromUnix.d.ts +16 -2
- package/dist/unix/parse/parseTimeFromUnix.js +5 -5
- package/dist/unix/parse/parseUnitFromUnix.d.ts +29 -4
- package/dist/unix/parse/parseUnitFromUnix.js +23 -17
- package/dist/unix/parse/parseWeekFromUnix.d.ts +24 -7
- package/dist/unix/parse/parseWeekFromUnix.js +7 -11
- package/dist/unix/parse/parseYearFromUnix.d.ts +20 -3
- package/dist/unix/parse/parseYearFromUnix.js +6 -3
- package/dist/unix/validate/isValidUnixRange.d.ts +20 -4
- package/dist/unix/validate/isValidUnixRange.js +1 -4
- package/dist/unix/validate/isValidUnixUnit.d.ts +1 -1
- package/dist/utc/calculate/addUtc.d.ts +7 -4
- package/dist/utc/calculate/addUtc.js +5 -11
- package/dist/utc/calculate/diffUtc.d.ts +1 -1
- package/dist/utc/calculate/diffUtc.js +1 -1
- package/dist/utc/calculate/diffUtcAsDuration.d.ts +1 -1
- package/dist/utc/calculate/diffUtcAsDuration.js +1 -1
- package/dist/utc/calculate/endOfUtc.d.ts +16 -3
- package/dist/utc/calculate/endOfUtc.js +2 -3
- package/dist/utc/calculate/isBetweenUtc.d.ts +13 -2
- package/dist/utc/calculate/isBetweenUtc.js +4 -4
- package/dist/utc/calculate/roundUtc.d.ts +26 -9
- package/dist/utc/calculate/roundUtc.js +3 -12
- package/dist/utc/calculate/setUtc.d.ts +23 -7
- package/dist/utc/calculate/setUtc.js +23 -12
- package/dist/utc/calculate/startOfUtc.d.ts +15 -2
- package/dist/utc/calculate/startOfUtc.js +1 -2
- package/dist/utc/calculate/subtractUtc.d.ts +7 -4
- package/dist/utc/calculate/subtractUtc.js +5 -11
- package/dist/utc/compare/areUtcEqualBy.d.ts +9 -3
- package/dist/utc/compare/areUtcEqualBy.js +2 -3
- package/dist/utc/convert/convertUtcToPlainDate.d.ts +14 -3
- package/dist/utc/convert/convertUtcToPlainDate.js +12 -10
- package/dist/utc/convert/convertUtcToPlainDateTime.d.ts +15 -3
- package/dist/utc/convert/convertUtcToPlainDateTime.js +14 -16
- package/dist/utc/convert/convertUtcToPlainTime.d.ts +11 -3
- package/dist/utc/convert/convertUtcToPlainTime.js +9 -9
- package/dist/utc/convert/convertUtcToUnix.d.ts +9 -4
- package/dist/utc/convert/convertUtcToUnix.js +3 -4
- package/dist/utc/convert/convertUtcToZoned.d.ts +5 -1
- package/dist/utc/convert/convertUtcToZoned.js +5 -1
- package/dist/utc/format/formatCalendarUtc.d.ts +23 -8
- package/dist/utc/format/formatCalendarUtc.js +14 -7
- package/dist/utc/format/{formatHttp.d.ts → formatHttpDate.d.ts} +8 -8
- package/dist/utc/format/{formatHttp.js → formatHttpDate.js} +8 -8
- package/dist/utc/format/formatRelativeUtc.d.ts +38 -10
- package/dist/utc/format/formatRelativeUtc.js +22 -16
- package/dist/utc/format/formatUtc.d.ts +22 -15
- package/dist/utc/format/formatUtc.js +12 -8
- package/dist/utc/format/index.d.ts +1 -1
- package/dist/utc/format/index.js +1 -1
- package/dist/utc/get/getUtcDay.d.ts +1 -3
- package/dist/utc/get/getUtcDay.js +5 -12
- package/dist/utc/get/getUtcHour.d.ts +1 -3
- package/dist/utc/get/getUtcHour.js +5 -12
- package/dist/utc/get/getUtcMicrosecond.d.ts +1 -3
- package/dist/utc/get/getUtcMicrosecond.js +4 -11
- package/dist/utc/get/getUtcMillisecond.d.ts +1 -3
- package/dist/utc/get/getUtcMillisecond.js +5 -12
- package/dist/utc/get/getUtcMinute.d.ts +1 -3
- package/dist/utc/get/getUtcMinute.js +5 -12
- package/dist/utc/get/getUtcMonth.d.ts +1 -3
- package/dist/utc/get/getUtcMonth.js +5 -12
- package/dist/utc/get/getUtcNanosecond.d.ts +1 -3
- package/dist/utc/get/getUtcNanosecond.js +4 -11
- package/dist/utc/get/getUtcNow.d.ts +1 -3
- package/dist/utc/get/getUtcNow.js +2 -9
- package/dist/utc/get/getUtcNowUnit.d.ts +2 -0
- package/dist/utc/get/getUtcNowUnit.js +2 -0
- package/dist/utc/get/getUtcSecond.d.ts +1 -3
- package/dist/utc/get/getUtcSecond.js +5 -12
- package/dist/utc/get/getUtcYear.d.ts +3 -3
- package/dist/utc/get/getUtcYear.js +5 -12
- package/dist/utc/interval/intervalDifferenceUtc.d.ts +6 -0
- package/dist/utc/interval/intervalDivideEquallyUtc.d.ts +18 -4
- package/dist/utc/interval/intervalDivideEquallyUtc.js +5 -4
- package/dist/utc/interval/intervalFromDurationUtc.d.ts +13 -3
- package/dist/utc/interval/intervalFromDurationUtc.js +1 -3
- package/dist/utc/interval/intervalIntersectionUtc.d.ts +6 -0
- package/dist/utc/interval/intervalSplitAtUtc.d.ts +8 -0
- package/dist/utc/interval/intervalSplitAtUtc.js +2 -0
- package/dist/utc/interval/intervalUnionUtc.d.ts +6 -0
- package/dist/utc/interval/intervalXorAllUtc.d.ts +6 -0
- package/dist/utc/interval/intervalXorAllUtc.js +2 -2
- package/dist/utc/interval/intervalXorUtc.d.ts +6 -0
- package/dist/utc/interval/mergeIntervalsUtc.d.ts +6 -0
- package/dist/utc/interval/mergeIntervalsUtc.js +2 -2
- package/dist/utc/interval/splitIntervalByUnitUtc.d.ts +19 -6
- package/dist/utc/interval/splitIntervalByUnitUtc.js +6 -6
- package/dist/utc/parse/index.d.ts +1 -1
- package/dist/utc/parse/index.js +1 -1
- package/dist/utc/parse/parseDateFromUtc.d.ts +9 -3
- package/dist/utc/parse/parseDateFromUtc.js +3 -5
- package/dist/utc/parse/parseDayFromUtc.d.ts +9 -3
- package/dist/utc/parse/parseDayFromUtc.js +3 -5
- package/dist/utc/parse/parseDayOfWeekFromUtc.d.ts +9 -3
- package/dist/utc/parse/parseDayOfWeekFromUtc.js +5 -7
- package/dist/utc/parse/parseHourFromUtc.d.ts +9 -3
- package/dist/utc/parse/parseHourFromUtc.js +3 -5
- package/dist/utc/parse/{parseHttp.d.ts → parseHttpDate.d.ts} +12 -12
- package/dist/utc/parse/{parseHttp.js → parseHttpDate.js} +12 -12
- package/dist/utc/parse/parseMicrosecondFromUtc.d.ts +9 -3
- package/dist/utc/parse/parseMicrosecondFromUtc.js +3 -5
- package/dist/utc/parse/parseMillisecondFromUtc.d.ts +9 -3
- package/dist/utc/parse/parseMillisecondFromUtc.js +3 -5
- package/dist/utc/parse/parseMinuteFromUtc.d.ts +9 -3
- package/dist/utc/parse/parseMinuteFromUtc.js +3 -5
- package/dist/utc/parse/parseMonthFromUtc.d.ts +9 -3
- package/dist/utc/parse/parseMonthFromUtc.js +3 -5
- package/dist/utc/parse/parseNanosecondFromUtc.d.ts +9 -3
- package/dist/utc/parse/parseNanosecondFromUtc.js +3 -5
- package/dist/utc/parse/parseSecondFromUtc.d.ts +9 -3
- package/dist/utc/parse/parseSecondFromUtc.js +3 -5
- package/dist/utc/parse/parseTimeFromUtc.d.ts +11 -3
- package/dist/utc/parse/parseTimeFromUtc.js +7 -7
- package/dist/utc/parse/parseUnitFromUtc.d.ts +25 -6
- package/dist/utc/parse/parseUnitFromUtc.js +14 -10
- package/dist/utc/parse/parseWeekFromUtc.d.ts +20 -10
- package/dist/utc/parse/parseWeekFromUtc.js +8 -14
- package/dist/utc/parse/parseYearFromUtc.d.ts +13 -5
- package/dist/utc/parse/parseYearFromUtc.js +9 -8
- package/dist/utc/validate/index.d.ts +2 -0
- package/dist/utc/validate/index.js +2 -0
- package/dist/utc/validate/isValidHttpDate.d.ts +35 -0
- package/dist/utc/validate/isValidHttpDate.js +38 -0
- package/dist/utc/validate/isValidUtc.d.ts +4 -0
- package/dist/utc/validate/isValidUtc.js +4 -0
- package/dist/utc/validate/isValidUtcRange.d.ts +16 -5
- package/dist/utc/validate/isValidUtcRange.js +2 -5
- package/dist/utc/validate/isValidUtcTimestamp.d.ts +43 -0
- package/dist/utc/validate/isValidUtcTimestamp.js +48 -0
- package/dist/zoned/calculate/addZoned.d.ts +20 -10
- package/dist/zoned/calculate/addZoned.js +10 -20
- package/dist/zoned/calculate/cycleZoned.d.ts +33 -8
- package/dist/zoned/calculate/cycleZoned.js +1 -8
- package/dist/zoned/calculate/diffZoned.d.ts +1 -1
- package/dist/zoned/calculate/diffZoned.js +1 -1
- package/dist/zoned/calculate/diffZonedAsDuration.d.ts +1 -1
- package/dist/zoned/calculate/diffZonedAsDuration.js +1 -1
- package/dist/zoned/calculate/endOfQuarterForZoned.d.ts +9 -2
- package/dist/zoned/calculate/endOfQuarterForZoned.js +4 -5
- package/dist/zoned/calculate/endOfZoned.d.ts +16 -3
- package/dist/zoned/calculate/endOfZoned.js +2 -3
- package/dist/zoned/calculate/getLocaleZonedEndOfWeek.d.ts +10 -3
- package/dist/zoned/calculate/getLocaleZonedEndOfWeek.js +5 -6
- package/dist/zoned/calculate/getLocaleZonedStartOfWeek.d.ts +7 -1
- package/dist/zoned/calculate/getLocaleZonedStartOfWeek.js +3 -4
- package/dist/zoned/calculate/roundZoned.d.ts +21 -4
- package/dist/zoned/calculate/roundZoned.js +3 -7
- package/dist/zoned/calculate/setZoned.d.ts +44 -13
- package/dist/zoned/calculate/setZoned.js +30 -21
- package/dist/zoned/calculate/startOfQuarterForZoned.d.ts +7 -2
- package/dist/zoned/calculate/startOfQuarterForZoned.js +3 -5
- package/dist/zoned/calculate/startOfZoned.d.ts +15 -3
- package/dist/zoned/calculate/startOfZoned.js +1 -3
- package/dist/zoned/calculate/subtractZoned.d.ts +20 -10
- package/dist/zoned/calculate/subtractZoned.js +10 -20
- package/dist/zoned/compare/areZonedEqualBy.d.ts +14 -5
- package/dist/zoned/compare/areZonedEqualBy.js +7 -5
- package/dist/zoned/compare/isBetweenZoned.d.ts +13 -1
- package/dist/zoned/compare/isBetweenZoned.js +4 -3
- package/dist/zoned/compare/isInDaylightSaving.d.ts +38 -11
- package/dist/zoned/compare/isInDaylightSaving.js +40 -44
- package/dist/zoned/convert/convertPlainDateTimeToZoned.d.ts +21 -5
- package/dist/zoned/convert/convertPlainDateTimeToZoned.js +9 -11
- package/dist/zoned/convert/convertZonedToUnix.d.ts +9 -4
- package/dist/zoned/convert/convertZonedToUnix.js +2 -4
- package/dist/zoned/convert/convertZonedToZoned.d.ts +5 -1
- package/dist/zoned/convert/convertZonedToZoned.js +5 -1
- package/dist/zoned/format/formatCalendarZoned.d.ts +18 -12
- package/dist/zoned/format/formatCalendarZoned.js +15 -10
- package/dist/zoned/format/formatRelativeZoned.d.ts +41 -12
- package/dist/zoned/format/formatRelativeZoned.js +9 -5
- package/dist/zoned/format/formatRfc2822.d.ts +2 -2
- package/dist/zoned/format/formatRfc2822.js +2 -2
- package/dist/zoned/format/formatRfc3339.d.ts +2 -3
- package/dist/zoned/format/formatRfc3339.js +2 -3
- package/dist/zoned/format/formatTimeZoneName.d.ts +16 -3
- package/dist/zoned/format/formatTimeZoneName.js +9 -4
- package/dist/zoned/format/formatZonedDateTime.js +2 -1
- package/dist/zoned/format/formatZonedRange.js +2 -1
- package/dist/zoned/format/formatZonedToParts.d.ts +15 -4
- package/dist/zoned/format/formatZonedToParts.js +8 -5
- package/dist/zoned/get/getDstTransitions.d.ts +11 -10
- package/dist/zoned/get/getDstTransitions.js +21 -7
- package/dist/zoned/get/getSystemTimeZone.d.ts +3 -1
- package/dist/zoned/get/getSystemTimeZone.js +5 -2
- package/dist/zoned/get/getTimeZoneOffset.d.ts +13 -2
- package/dist/zoned/get/getTimeZoneOffset.js +22 -6
- package/dist/zoned/get/getZonedDay.d.ts +2 -1
- package/dist/zoned/get/getZonedDay.js +6 -7
- package/dist/zoned/get/getZonedDayOfWeek.d.ts +2 -1
- package/dist/zoned/get/getZonedDayOfWeek.js +6 -5
- package/dist/zoned/get/getZonedHour.d.ts +2 -1
- package/dist/zoned/get/getZonedHour.js +6 -7
- package/dist/zoned/get/getZonedMicrosecond.d.ts +2 -1
- package/dist/zoned/get/getZonedMicrosecond.js +6 -5
- package/dist/zoned/get/getZonedMillisecond.d.ts +2 -1
- package/dist/zoned/get/getZonedMillisecond.js +6 -7
- package/dist/zoned/get/getZonedMinute.d.ts +2 -1
- package/dist/zoned/get/getZonedMinute.js +6 -7
- package/dist/zoned/get/getZonedMonth.d.ts +2 -1
- package/dist/zoned/get/getZonedMonth.js +6 -7
- package/dist/zoned/get/getZonedNanosecond.d.ts +2 -1
- package/dist/zoned/get/getZonedNanosecond.js +6 -5
- package/dist/zoned/get/getZonedNow.d.ts +18 -2
- package/dist/zoned/get/getZonedNow.js +17 -4
- package/dist/zoned/get/getZonedNowUnit.d.ts +6 -3
- package/dist/zoned/get/getZonedNowUnit.js +10 -7
- package/dist/zoned/get/getZonedSecond.d.ts +2 -1
- package/dist/zoned/get/getZonedSecond.js +6 -7
- package/dist/zoned/get/getZonedToday.d.ts +2 -1
- package/dist/zoned/get/getZonedToday.js +6 -5
- package/dist/zoned/get/getZonedWeekOfYear.d.ts +2 -1
- package/dist/zoned/get/getZonedWeekOfYear.js +6 -5
- package/dist/zoned/get/getZonedYear.d.ts +4 -1
- package/dist/zoned/get/getZonedYear.js +9 -7
- package/dist/zoned/interval/intervalDifferenceZoned.d.ts +9 -0
- package/dist/zoned/interval/intervalDivideEquallyZoned.d.ts +22 -4
- package/dist/zoned/interval/intervalDivideEquallyZoned.js +6 -4
- package/dist/zoned/interval/intervalFromDurationZoned.d.ts +29 -10
- package/dist/zoned/interval/intervalFromDurationZoned.js +6 -13
- package/dist/zoned/interval/intervalIntersectionZoned.d.ts +9 -0
- package/dist/zoned/interval/intervalSplitAtZoned.d.ts +11 -0
- package/dist/zoned/interval/intervalSplitAtZoned.js +2 -0
- package/dist/zoned/interval/intervalUnionZoned.d.ts +9 -0
- package/dist/zoned/interval/intervalXorAllZoned.d.ts +9 -0
- package/dist/zoned/interval/intervalXorAllZoned.js +2 -2
- package/dist/zoned/interval/intervalXorZoned.d.ts +9 -0
- package/dist/zoned/interval/mergeIntervalsZoned.d.ts +9 -0
- package/dist/zoned/interval/mergeIntervalsZoned.js +2 -2
- package/dist/zoned/interval/splitIntervalByUnitZoned.d.ts +27 -6
- package/dist/zoned/interval/splitIntervalByUnitZoned.js +11 -6
- package/dist/zoned/map/mapZonedDatesInRange.d.ts +9 -4
- package/dist/zoned/map/mapZonedDatesInRange.js +2 -4
- package/dist/zoned/parse/parseRfc2822.d.ts +1 -1
- package/dist/zoned/parse/parseRfc2822.js +1 -1
- package/dist/zoned/parse/parseUnitFromZoned.d.ts +13 -4
- package/dist/zoned/parse/parseUnitFromZoned.js +6 -4
- package/dist/zoned/parse/parseWeekFromZoned.d.ts +10 -3
- package/dist/zoned/parse/parseWeekFromZoned.js +2 -3
- package/dist/zoned/parse/parseYearFromZoned.d.ts +4 -2
- package/dist/zoned/parse/parseYearFromZoned.js +6 -3
- package/dist/zoned/validate/hasDaylightSaving.d.ts +45 -12
- package/dist/zoned/validate/hasDaylightSaving.js +54 -32
- package/dist/zoned/validate/index.d.ts +2 -0
- package/dist/zoned/validate/index.js +2 -0
- package/dist/zoned/validate/isValidRfc2822DateTime.d.ts +32 -0
- package/dist/zoned/validate/isValidRfc2822DateTime.js +35 -0
- package/dist/zoned/validate/isValidRfc3339DateTime.d.ts +31 -0
- package/dist/zoned/validate/isValidRfc3339DateTime.js +34 -0
- package/dist/zoned/validate/isValidTimeZone.d.ts +5 -1
- package/dist/zoned/validate/isValidTimeZone.js +6 -2
- package/dist/zoned/validate/isValidZonedDateTime.d.ts +13 -0
- package/dist/zoned/validate/isValidZonedDateTime.js +14 -1
- package/dist/zoned/validate/isValidZonedRange.d.ts +15 -4
- package/dist/zoned/validate/isValidZonedRange.js +1 -4
- package/package.json +67 -5
- package/skills/gmt-arithmetic/SKILL.md +99 -12
- package/skills/gmt-basics/SKILL.md +64 -13
- package/skills/gmt-integration/SKILL.md +33 -13
- package/skills/gmt-timezone/SKILL.md +265 -31
- package/dist/duration/calculate/durationAs.d.ts +0 -62
- package/dist/internal/resolveReadingTimeZone.d.ts +0 -11
- package/dist/internal/resolveReadingTimeZone.js +0 -18
- package/dist/internal/unixZonedDateTime.d.ts +0 -22
- package/dist/internal/unixZonedDateTime.js +0 -32
- package/dist/internal/utcZonedDateTime.d.ts +0 -16
- package/dist/internal/utcZonedDateTime.js +0 -28
- package/dist/types/duration-unit.d.ts +0 -5
- /package/dist/types/{duration-unit.js → duty.js} +0 -0
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import type { Disambiguation, DutyEntry, DutyRule, DutyViolation, Interval } from "../../types/index.js";
|
|
2
|
+
/**
|
|
3
|
+
* Return every violation of a set of hours-of-work rules inside a range, each with the window
|
|
4
|
+
* that failed it: the record over a month, not the check before dispatch.
|
|
5
|
+
*
|
|
6
|
+
* - Each rule is checked as `evaluateDutyLog` checks it, at every instant where its answer can
|
|
7
|
+
* change: entry bounds, those bounds shifted by a sliding window's length, where a run reaches
|
|
8
|
+
* or falls below a floor the rule compares it with, the boundaries of its local periods, and
|
|
9
|
+
* the instants either side of each. So the record does not depend on how a status is split
|
|
10
|
+
* into entries.
|
|
11
|
+
* - One entry per violation. A moving window (an elapsed duration, or more than one local period)
|
|
12
|
+
* is one violation for as long as it keeps failing, with no passing check between, reported by
|
|
13
|
+
* the window that failed worst, the earliest on a tie. A count since a reset, or one short rest
|
|
14
|
+
* before a duty, is one violation however often it is checked, reported by its worst check. One
|
|
15
|
+
* fixed period is one violation, reported by its last check, which judges the period complete.
|
|
16
|
+
* - A violation is listed in the range it began in. One already failing at `range.start` belongs
|
|
17
|
+
* to the range before; one still failing at `range.end` is followed to its worst window, which
|
|
18
|
+
* may end after the range, but never past the log's last entry. So two adjacent ranges list
|
|
19
|
+
* every violation once.
|
|
20
|
+
* - Each check reads the log as it stood then, so a failure stays listed when later entries would
|
|
21
|
+
* have excused it, such as a rest that completes a pair after the window it would have moved
|
|
22
|
+
* had closed. The record lists what a check at that moment would have said, so it only grows as
|
|
23
|
+
* the log does.
|
|
24
|
+
* - Only logged time is judged. Nothing after the log's last entry is checked, so a range running
|
|
25
|
+
* past the log reads as one ending with it, and a period still open there is judged as not yet
|
|
26
|
+
* over. Nothing before the log's first entry (and, for `usageLookback`, its first use) is
|
|
27
|
+
* checked either, so a range of any length is read as the part of it the log covers.
|
|
28
|
+
* - Time before the log is read two ways. `evaluateDutyLog` reads it strictly, for a check before
|
|
29
|
+
* dispatch: it is neither work nor rest, so a rest rule whose window reaches back before the log
|
|
30
|
+
* fails for want of logged rest. The record does not invent a violation there: a rest rule
|
|
31
|
+
* (`restRequirement`, `freePeriod`, `pattern`, `restBeforeDuty`) is not judged on a window that
|
|
32
|
+
* starts before the log's first entry. A cap is, since time no entry covers never counts towards
|
|
33
|
+
* one. Both read the log's first entry as the start of a stretch without rest for `maxGap`.
|
|
34
|
+
* - Rules with `severity: "advisory"` are not listed: an advisory is not a violation.
|
|
35
|
+
* - Entries are ordered by window start, then by the order of `rules`.
|
|
36
|
+
* - Returns `null` for anything `evaluateDutyLog` refuses, for a `range` that is not a valid
|
|
37
|
+
* `Interval`, when more than 10,000 of a rule's local periods end in the part of `range` the log
|
|
38
|
+
* covers, and when one rule would need more than 1,000,000 instants checked there.
|
|
39
|
+
*
|
|
40
|
+
* @param log the duty log, ordered and non-overlapping
|
|
41
|
+
* @param range `{ start, end }` record of ISO 8601 instant strings to report on
|
|
42
|
+
* @param rules the rules, every number the caller's
|
|
43
|
+
* @param options the reference zone and the operator day
|
|
44
|
+
* @returns the violations, or null on invalid input
|
|
45
|
+
*
|
|
46
|
+
* @example dutyViolations([{ status: "off", start: "2024-01-01T00:00:00Z", end: "2024-01-01T10:00:00Z" }, { status: "driving", start: "2024-01-01T10:00:00Z", end: "2024-01-01T22:00:00Z" }], { start: "2024-01-01T00:00:00Z", end: "2024-01-02T00:00:00Z" }, [{ label: "11 driving", kind: "cumulativeCap", statuses: ["driving"], cap: "PT11H", since: { statuses: ["off"], consecutive: "PT10H" } }], { timeZone: "UTC" }) // [{ label: "11 driving", window: { start: "2024-01-01T10:00:00Z", end: "2024-01-01T22:00:00Z" }, used: "PT12H", limit: "PT11H" }]
|
|
47
|
+
* @example dutyViolations([], { start: "2024-01-01T00:00:00Z", end: "2024-02-01T00:00:00Z" }, [], { timeZone: "UTC" }) // []
|
|
48
|
+
* @example dutyViolations([], { start: "2024-02-01T00:00:00Z", end: "2024-01-01T00:00:00Z" }, [], { timeZone: "UTC" }) // null — inverted range
|
|
49
|
+
*/
|
|
50
|
+
export declare function dutyViolations(log: DutyEntry[], range: Interval, rules: DutyRule[], options: {
|
|
51
|
+
/**
|
|
52
|
+
* The reference time zone every local period is read in, an IANA name or UTC offset: a time
|
|
53
|
+
* zone identifier (`+05:30`, `+0530`, `-08`) or a stored offset (`±HH:MM[:SS]`, what
|
|
54
|
+
* `getTimeZoneOffset` returns).
|
|
55
|
+
*/
|
|
56
|
+
timeZone: string;
|
|
57
|
+
/**
|
|
58
|
+
* The local wall time each operator day starts at, as an ISO PlainTime string (`"04:00"`).
|
|
59
|
+
* A rule that counts `operatorDays` needs it.
|
|
60
|
+
*
|
|
61
|
+
* @defaultValue None. A rule that counts operator days makes the call invalid.
|
|
62
|
+
*/
|
|
63
|
+
dayStartTime?: string;
|
|
64
|
+
/**
|
|
65
|
+
* How a day start, or a `freePeriod` window edge, that the clock repeats or skips becomes an
|
|
66
|
+
* instant, as `resolveLocal` resolves it. `"compatible"` reads a skipped time after the gap
|
|
67
|
+
* and a repeated one at its first pass, `"earlier"` and `"later"` take that side in both
|
|
68
|
+
* cases, and `"reject"` returns the sentinel when an operator day a rule counts starts or ends
|
|
69
|
+
* at such a time, or a local window with such an edge reaches a logged free period.
|
|
70
|
+
*
|
|
71
|
+
* @defaultValue `"compatible"`, Temporal's default.
|
|
72
|
+
*/
|
|
73
|
+
disambiguation?: Disambiguation;
|
|
74
|
+
}): DutyViolation[] | null;
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { parseIntervalNanoseconds } from "../../internal/index.js";
|
|
2
|
+
import { prepareDutyCall, scanDutyViolations } from "../../internal/dutyEngine.js";
|
|
3
|
+
/**
|
|
4
|
+
* Return every violation of a set of hours-of-work rules inside a range, each with the window
|
|
5
|
+
* that failed it: the record over a month, not the check before dispatch.
|
|
6
|
+
*
|
|
7
|
+
* - Each rule is checked as `evaluateDutyLog` checks it, at every instant where its answer can
|
|
8
|
+
* change: entry bounds, those bounds shifted by a sliding window's length, where a run reaches
|
|
9
|
+
* or falls below a floor the rule compares it with, the boundaries of its local periods, and
|
|
10
|
+
* the instants either side of each. So the record does not depend on how a status is split
|
|
11
|
+
* into entries.
|
|
12
|
+
* - One entry per violation. A moving window (an elapsed duration, or more than one local period)
|
|
13
|
+
* is one violation for as long as it keeps failing, with no passing check between, reported by
|
|
14
|
+
* the window that failed worst, the earliest on a tie. A count since a reset, or one short rest
|
|
15
|
+
* before a duty, is one violation however often it is checked, reported by its worst check. One
|
|
16
|
+
* fixed period is one violation, reported by its last check, which judges the period complete.
|
|
17
|
+
* - A violation is listed in the range it began in. One already failing at `range.start` belongs
|
|
18
|
+
* to the range before; one still failing at `range.end` is followed to its worst window, which
|
|
19
|
+
* may end after the range, but never past the log's last entry. So two adjacent ranges list
|
|
20
|
+
* every violation once.
|
|
21
|
+
* - Each check reads the log as it stood then, so a failure stays listed when later entries would
|
|
22
|
+
* have excused it, such as a rest that completes a pair after the window it would have moved
|
|
23
|
+
* had closed. The record lists what a check at that moment would have said, so it only grows as
|
|
24
|
+
* the log does.
|
|
25
|
+
* - Only logged time is judged. Nothing after the log's last entry is checked, so a range running
|
|
26
|
+
* past the log reads as one ending with it, and a period still open there is judged as not yet
|
|
27
|
+
* over. Nothing before the log's first entry (and, for `usageLookback`, its first use) is
|
|
28
|
+
* checked either, so a range of any length is read as the part of it the log covers.
|
|
29
|
+
* - Time before the log is read two ways. `evaluateDutyLog` reads it strictly, for a check before
|
|
30
|
+
* dispatch: it is neither work nor rest, so a rest rule whose window reaches back before the log
|
|
31
|
+
* fails for want of logged rest. The record does not invent a violation there: a rest rule
|
|
32
|
+
* (`restRequirement`, `freePeriod`, `pattern`, `restBeforeDuty`) is not judged on a window that
|
|
33
|
+
* starts before the log's first entry. A cap is, since time no entry covers never counts towards
|
|
34
|
+
* one. Both read the log's first entry as the start of a stretch without rest for `maxGap`.
|
|
35
|
+
* - Rules with `severity: "advisory"` are not listed: an advisory is not a violation.
|
|
36
|
+
* - Entries are ordered by window start, then by the order of `rules`.
|
|
37
|
+
* - Returns `null` for anything `evaluateDutyLog` refuses, for a `range` that is not a valid
|
|
38
|
+
* `Interval`, when more than 10,000 of a rule's local periods end in the part of `range` the log
|
|
39
|
+
* covers, and when one rule would need more than 1,000,000 instants checked there.
|
|
40
|
+
*
|
|
41
|
+
* @param log the duty log, ordered and non-overlapping
|
|
42
|
+
* @param range `{ start, end }` record of ISO 8601 instant strings to report on
|
|
43
|
+
* @param rules the rules, every number the caller's
|
|
44
|
+
* @param options the reference zone and the operator day
|
|
45
|
+
* @returns the violations, or null on invalid input
|
|
46
|
+
*
|
|
47
|
+
* @example dutyViolations([{ status: "off", start: "2024-01-01T00:00:00Z", end: "2024-01-01T10:00:00Z" }, { status: "driving", start: "2024-01-01T10:00:00Z", end: "2024-01-01T22:00:00Z" }], { start: "2024-01-01T00:00:00Z", end: "2024-01-02T00:00:00Z" }, [{ label: "11 driving", kind: "cumulativeCap", statuses: ["driving"], cap: "PT11H", since: { statuses: ["off"], consecutive: "PT10H" } }], { timeZone: "UTC" }) // [{ label: "11 driving", window: { start: "2024-01-01T10:00:00Z", end: "2024-01-01T22:00:00Z" }, used: "PT12H", limit: "PT11H" }]
|
|
48
|
+
* @example dutyViolations([], { start: "2024-01-01T00:00:00Z", end: "2024-02-01T00:00:00Z" }, [], { timeZone: "UTC" }) // []
|
|
49
|
+
* @example dutyViolations([], { start: "2024-02-01T00:00:00Z", end: "2024-01-01T00:00:00Z" }, [], { timeZone: "UTC" }) // null — inverted range
|
|
50
|
+
*/
|
|
51
|
+
export function dutyViolations(log, range, rules, options) {
|
|
52
|
+
try {
|
|
53
|
+
const bounds = parseIntervalNanoseconds(range);
|
|
54
|
+
const call = prepareDutyCall(log, rules, options);
|
|
55
|
+
if (bounds === null || call === null) {
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
return scanDutyViolations(call.context, call.rules, bounds);
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
// Never throws (Core Rule 3): a hostile
|
|
62
|
+
// argument is invalid input, not an exception.
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import type { Disambiguation, DutyEntry, DutyReport, DutyRule } from "../../types/index.js";
|
|
2
|
+
/**
|
|
3
|
+
* Evaluate every hours-of-work rule over a duty log at one instant, and report each one whether
|
|
4
|
+
* or not it binds.
|
|
5
|
+
*
|
|
6
|
+
* GMT implements no regulation: each rule is a shape, and every number in it is the caller's. A
|
|
7
|
+
* regime is the array of rules the caller assembles and labels. GMT reports totals, what is left
|
|
8
|
+
* and what failed; it does not decide dispatch, fitness or eligibility.
|
|
9
|
+
*
|
|
10
|
+
* - The log is read as it stands at `at`: later entries are ignored and one straddling `at` is cut
|
|
11
|
+
* there. Time no entry covers is in no status, so it is neither work nor rest. That includes the
|
|
12
|
+
* time before the log's first entry: give a log that reaches back as far as the longest rule
|
|
13
|
+
* looks, or a rest rule fails for want of logged rest. A planned roster is the same call with
|
|
14
|
+
* the plan appended and `at` set to its end.
|
|
15
|
+
* - This is the strict reading, for a check before dispatch. `dutyViolations` reads a record the
|
|
16
|
+
* other way: it does not judge a rest rule on a window that starts before the log's first
|
|
17
|
+
* entry, since the log cannot say what happened then. Both read the log's first entry as the
|
|
18
|
+
* start of a stretch without rest for `maxGap`, as the end of a rest would be.
|
|
19
|
+
* - Every outcome carries `used`, `limit`, `remaining`, `window`, `dueBy` and `resetAt`, so the
|
|
20
|
+
* second-tightest limit is visible before it binds. Failed rules are listed again under
|
|
21
|
+
* `violations` or, with `severity: "advisory"`, under `advisories` only.
|
|
22
|
+
* - A duration in a `Period` is a sliding window ending at `at`; `operatorDays` are the days of
|
|
23
|
+
* `dutyDayFor`; calendar days, ISO weeks, months and years are local periods in `timeZone`,
|
|
24
|
+
* 23 or 25 hours long across a one-hour clock change. Each outcome names its `periodBasis`.
|
|
25
|
+
* - The local periods are the ones holding the last instant before `at`, so at a boundary the
|
|
26
|
+
* period just ended is judged: a roster ending at midnight is checked through its last day.
|
|
27
|
+
* - A window that runs past `at` (the rest of today, this week) has not failed a minimum while
|
|
28
|
+
* the minimum could still be met with rest from `at` to its end; a cap fails as soon as it is
|
|
29
|
+
* passed.
|
|
30
|
+
* - Endpoints are UTC instants ending in "Z"; durations are ISO 8601 with hours as the largest
|
|
31
|
+
* unit (`"PT49H30M"`).
|
|
32
|
+
* - Returns `null` when the log fails `isValidDutyLog`, when `at` is not an ISO 8601 instant
|
|
33
|
+
* string, when a rule is malformed (an unknown kind, a status list that is empty or holds a
|
|
34
|
+
* non-string, a duration that is not positive exact time, a malformed period, a duplicate
|
|
35
|
+
* label, a count of periods past 10,000 alone or times `adjacent`, `lookback` or `periods`, a
|
|
36
|
+
* `containing.count` past 10,000), when `options.timeZone` is invalid, when a rule counts
|
|
37
|
+
* `operatorDays` without `options.dayStartTime`, when a window, or a requirement `orFactor`
|
|
38
|
+
* scales, falls outside Temporal's range, when a count of free periods passes
|
|
39
|
+
* `Number.MAX_SAFE_INTEGER`, and when one run of rest in a `freePeriod` window holds more than
|
|
40
|
+
* 20,000 of its `containing` windows (about 54 years of a daily window).
|
|
41
|
+
*
|
|
42
|
+
* @param log the duty log, ordered and non-overlapping
|
|
43
|
+
* @param at ISO 8601 instant string to evaluate at
|
|
44
|
+
* @param rules the rules, every number the caller's
|
|
45
|
+
* @param options the reference zone and the operator day
|
|
46
|
+
* @returns the report, or null on invalid input
|
|
47
|
+
*
|
|
48
|
+
* @example evaluateDutyLog([{ status: "off", start: "2024-01-01T00:00:00Z", end: "2024-01-01T10:00:00Z" }, { status: "driving", start: "2024-01-01T10:00:00Z", end: "2024-01-01T21:00:00Z" }], "2024-01-01T21:00:00Z", [{ label: "11 driving", kind: "cumulativeCap", statuses: ["driving"], cap: "PT11H", since: { statuses: ["off"], consecutive: "PT10H" } }], { timeZone: "UTC" }) // { at: "2024-01-01T21:00:00Z", outcomes: [{ label: "11 driving", kind: "cumulativeCap", severity: "violation", satisfied: true, used: "PT11H", limit: "PT11H", remaining: "PT0S", window: { start: "2024-01-01T10:00:00Z", end: "2024-01-01T21:00:00Z" }, periodBasis: null, dueBy: null, resetAt: "2024-01-01T10:00:00Z" }], violations: [], advisories: [] }
|
|
49
|
+
* @example evaluateDutyLog([{ status: "driving", start: "2024-01-01T10:00:00Z", end: "2024-01-01T21:00:00Z" }], "2024-01-01T21:00:00Z", [{ label: "60 in 7", kind: "rollingCap", statuses: ["driving"], cap: "PT60H", window: { operatorDays: 7 } }], { timeZone: "UTC" }) // null — operator days without dayStartTime
|
|
50
|
+
* @example evaluateDutyLog([], "2024-01-01T00:00:00Z", [], { timeZone: "UTC" }) // { at: "2024-01-01T00:00:00Z", outcomes: [], violations: [], advisories: [] }
|
|
51
|
+
* @example evaluateDutyLog([{ status: "on", start: "2024-01-01T02:00:00Z", end: "2024-01-01T01:00:00Z" }], "2024-01-01T03:00:00Z", [], { timeZone: "UTC" }) // null — inverted entry
|
|
52
|
+
*/
|
|
53
|
+
export declare function evaluateDutyLog(log: DutyEntry[], at: string, rules: DutyRule[], options: {
|
|
54
|
+
/**
|
|
55
|
+
* The reference time zone every local period is read in, an IANA name or UTC offset: a time
|
|
56
|
+
* zone identifier (`+05:30`, `+0530`, `-08`) or a stored offset (`±HH:MM[:SS]`, what
|
|
57
|
+
* `getTimeZoneOffset` returns). A log kept in another clock is converted to instants first.
|
|
58
|
+
*/
|
|
59
|
+
timeZone: string;
|
|
60
|
+
/**
|
|
61
|
+
* The local wall time each operator day starts at, as an ISO PlainTime string (`"04:00"`).
|
|
62
|
+
* A rule that counts `operatorDays` needs it.
|
|
63
|
+
*
|
|
64
|
+
* @defaultValue None. A rule that counts operator days makes the call invalid.
|
|
65
|
+
*/
|
|
66
|
+
dayStartTime?: string;
|
|
67
|
+
/**
|
|
68
|
+
* How a day start, or a `freePeriod` window edge, that the clock repeats or skips becomes an
|
|
69
|
+
* instant, as `resolveLocal` resolves it. `"compatible"` reads a skipped time after the gap
|
|
70
|
+
* and a repeated one at its first pass, `"earlier"` and `"later"` take that side in both
|
|
71
|
+
* cases, and `"reject"` returns the sentinel when an operator day a rule counts starts or ends
|
|
72
|
+
* at such a time, or a local window with such an edge reaches a logged free period.
|
|
73
|
+
*
|
|
74
|
+
* @defaultValue `"compatible"`, Temporal's default.
|
|
75
|
+
*/
|
|
76
|
+
disambiguation?: Disambiguation;
|
|
77
|
+
}): DutyReport | null;
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { Temporal } from "@js-temporal/polyfill";
|
|
2
|
+
import { parseInstantNanoseconds } from "../../internal/index.js";
|
|
3
|
+
import { evaluateDutyRules, prepareDutyCall } from "../../internal/dutyEngine.js";
|
|
4
|
+
/**
|
|
5
|
+
* Evaluate every hours-of-work rule over a duty log at one instant, and report each one whether
|
|
6
|
+
* or not it binds.
|
|
7
|
+
*
|
|
8
|
+
* GMT implements no regulation: each rule is a shape, and every number in it is the caller's. A
|
|
9
|
+
* regime is the array of rules the caller assembles and labels. GMT reports totals, what is left
|
|
10
|
+
* and what failed; it does not decide dispatch, fitness or eligibility.
|
|
11
|
+
*
|
|
12
|
+
* - The log is read as it stands at `at`: later entries are ignored and one straddling `at` is cut
|
|
13
|
+
* there. Time no entry covers is in no status, so it is neither work nor rest. That includes the
|
|
14
|
+
* time before the log's first entry: give a log that reaches back as far as the longest rule
|
|
15
|
+
* looks, or a rest rule fails for want of logged rest. A planned roster is the same call with
|
|
16
|
+
* the plan appended and `at` set to its end.
|
|
17
|
+
* - This is the strict reading, for a check before dispatch. `dutyViolations` reads a record the
|
|
18
|
+
* other way: it does not judge a rest rule on a window that starts before the log's first
|
|
19
|
+
* entry, since the log cannot say what happened then. Both read the log's first entry as the
|
|
20
|
+
* start of a stretch without rest for `maxGap`, as the end of a rest would be.
|
|
21
|
+
* - Every outcome carries `used`, `limit`, `remaining`, `window`, `dueBy` and `resetAt`, so the
|
|
22
|
+
* second-tightest limit is visible before it binds. Failed rules are listed again under
|
|
23
|
+
* `violations` or, with `severity: "advisory"`, under `advisories` only.
|
|
24
|
+
* - A duration in a `Period` is a sliding window ending at `at`; `operatorDays` are the days of
|
|
25
|
+
* `dutyDayFor`; calendar days, ISO weeks, months and years are local periods in `timeZone`,
|
|
26
|
+
* 23 or 25 hours long across a one-hour clock change. Each outcome names its `periodBasis`.
|
|
27
|
+
* - The local periods are the ones holding the last instant before `at`, so at a boundary the
|
|
28
|
+
* period just ended is judged: a roster ending at midnight is checked through its last day.
|
|
29
|
+
* - A window that runs past `at` (the rest of today, this week) has not failed a minimum while
|
|
30
|
+
* the minimum could still be met with rest from `at` to its end; a cap fails as soon as it is
|
|
31
|
+
* passed.
|
|
32
|
+
* - Endpoints are UTC instants ending in "Z"; durations are ISO 8601 with hours as the largest
|
|
33
|
+
* unit (`"PT49H30M"`).
|
|
34
|
+
* - Returns `null` when the log fails `isValidDutyLog`, when `at` is not an ISO 8601 instant
|
|
35
|
+
* string, when a rule is malformed (an unknown kind, a status list that is empty or holds a
|
|
36
|
+
* non-string, a duration that is not positive exact time, a malformed period, a duplicate
|
|
37
|
+
* label, a count of periods past 10,000 alone or times `adjacent`, `lookback` or `periods`, a
|
|
38
|
+
* `containing.count` past 10,000), when `options.timeZone` is invalid, when a rule counts
|
|
39
|
+
* `operatorDays` without `options.dayStartTime`, when a window, or a requirement `orFactor`
|
|
40
|
+
* scales, falls outside Temporal's range, when a count of free periods passes
|
|
41
|
+
* `Number.MAX_SAFE_INTEGER`, and when one run of rest in a `freePeriod` window holds more than
|
|
42
|
+
* 20,000 of its `containing` windows (about 54 years of a daily window).
|
|
43
|
+
*
|
|
44
|
+
* @param log the duty log, ordered and non-overlapping
|
|
45
|
+
* @param at ISO 8601 instant string to evaluate at
|
|
46
|
+
* @param rules the rules, every number the caller's
|
|
47
|
+
* @param options the reference zone and the operator day
|
|
48
|
+
* @returns the report, or null on invalid input
|
|
49
|
+
*
|
|
50
|
+
* @example evaluateDutyLog([{ status: "off", start: "2024-01-01T00:00:00Z", end: "2024-01-01T10:00:00Z" }, { status: "driving", start: "2024-01-01T10:00:00Z", end: "2024-01-01T21:00:00Z" }], "2024-01-01T21:00:00Z", [{ label: "11 driving", kind: "cumulativeCap", statuses: ["driving"], cap: "PT11H", since: { statuses: ["off"], consecutive: "PT10H" } }], { timeZone: "UTC" }) // { at: "2024-01-01T21:00:00Z", outcomes: [{ label: "11 driving", kind: "cumulativeCap", severity: "violation", satisfied: true, used: "PT11H", limit: "PT11H", remaining: "PT0S", window: { start: "2024-01-01T10:00:00Z", end: "2024-01-01T21:00:00Z" }, periodBasis: null, dueBy: null, resetAt: "2024-01-01T10:00:00Z" }], violations: [], advisories: [] }
|
|
51
|
+
* @example evaluateDutyLog([{ status: "driving", start: "2024-01-01T10:00:00Z", end: "2024-01-01T21:00:00Z" }], "2024-01-01T21:00:00Z", [{ label: "60 in 7", kind: "rollingCap", statuses: ["driving"], cap: "PT60H", window: { operatorDays: 7 } }], { timeZone: "UTC" }) // null — operator days without dayStartTime
|
|
52
|
+
* @example evaluateDutyLog([], "2024-01-01T00:00:00Z", [], { timeZone: "UTC" }) // { at: "2024-01-01T00:00:00Z", outcomes: [], violations: [], advisories: [] }
|
|
53
|
+
* @example evaluateDutyLog([{ status: "on", start: "2024-01-01T02:00:00Z", end: "2024-01-01T01:00:00Z" }], "2024-01-01T03:00:00Z", [], { timeZone: "UTC" }) // null — inverted entry
|
|
54
|
+
*/
|
|
55
|
+
export function evaluateDutyLog(log, at, rules, options) {
|
|
56
|
+
try {
|
|
57
|
+
const instant = typeof at === "string" ? parseInstantNanoseconds(at) : null;
|
|
58
|
+
const call = prepareDutyCall(log, rules, options);
|
|
59
|
+
if (instant === null || call === null) {
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
const outcomes = evaluateDutyRules(call.context, call.rules, instant);
|
|
63
|
+
return {
|
|
64
|
+
at: Temporal.Instant.fromEpochNanoseconds(instant).toString(),
|
|
65
|
+
outcomes,
|
|
66
|
+
violations: outcomes.filter((outcome) => !outcome.satisfied && outcome.severity === "violation"),
|
|
67
|
+
advisories: outcomes.filter((outcome) => !outcome.satisfied && outcome.severity === "advisory"),
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
// Never throws (Core Rule 3): a hostile
|
|
72
|
+
// argument is invalid input, not an exception.
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { DutyEntry, Interval } from "../../types/index.js";
|
|
2
|
+
/**
|
|
3
|
+
* Return the longest unbroken stretch a duty log spends in any of `statuses` inside a window.
|
|
4
|
+
*
|
|
5
|
+
* - A stretch is a run of touching entries whose statuses are all in `statuses`; another status
|
|
6
|
+
* or an unlogged gap ends it. Each run is cut to `window` (half-open) before it is measured.
|
|
7
|
+
* - On a tie the earlier stretch is returned.
|
|
8
|
+
* - `interval` is in UTC instants ending in "Z"; `duration` is an exact ISO 8601 duration with
|
|
9
|
+
* hours as the largest unit.
|
|
10
|
+
* - Returns `null` when no stretch falls inside the window, which is also the sentinel: when the
|
|
11
|
+
* log fails `isValidDutyLog`, when `window` is not a valid `Interval`, and when `statuses` is not
|
|
12
|
+
* an array of strings.
|
|
13
|
+
*
|
|
14
|
+
* @param log the duty log, ordered and non-overlapping
|
|
15
|
+
* @param window `{ start, end }` record of ISO 8601 instant strings to search inside
|
|
16
|
+
* @param statuses the statuses a stretch is made of
|
|
17
|
+
* @returns `{ interval, duration }` of the longest stretch, or null when there is none or on invalid input
|
|
18
|
+
*
|
|
19
|
+
* @example longestRun([{ status: "driving", start: "2024-01-01T00:00:00Z", end: "2024-01-01T03:00:00Z" }, { status: "onDuty", start: "2024-01-01T03:00:00Z", end: "2024-01-01T04:00:00Z" }, { status: "driving", start: "2024-01-01T04:00:00Z", end: "2024-01-01T08:00:00Z" }], { start: "2024-01-01T00:00:00Z", end: "2024-01-02T00:00:00Z" }, ["driving"]) // { interval: { start: "2024-01-01T04:00:00Z", end: "2024-01-01T08:00:00Z" }, duration: "PT4H" }
|
|
20
|
+
* @example longestRun([{ status: "driving", start: "2024-01-01T00:00:00Z", end: "2024-01-01T03:00:00Z" }, { status: "onDuty", start: "2024-01-01T03:00:00Z", end: "2024-01-01T04:00:00Z" }], { start: "2024-01-01T00:00:00Z", end: "2024-01-02T00:00:00Z" }, ["driving", "onDuty"]) // { interval: { start: "2024-01-01T00:00:00Z", end: "2024-01-01T04:00:00Z" }, duration: "PT4H" } — touching entries join
|
|
21
|
+
* @example longestRun([{ status: "off", start: "2024-01-01T00:00:00Z", end: "2024-01-01T08:00:00Z" }], { start: "2024-01-01T00:00:00Z", end: "2024-01-02T00:00:00Z" }, ["driving"]) // null — none
|
|
22
|
+
*/
|
|
23
|
+
export declare function longestRun(log: DutyEntry[], window: Interval, statuses: string[]): {
|
|
24
|
+
/** The stretch, as UTC instants ending in "Z", cut to the window. */
|
|
25
|
+
interval: Interval;
|
|
26
|
+
/** Its length, an exact ISO 8601 duration with hours as the largest unit. */
|
|
27
|
+
duration: string;
|
|
28
|
+
} | null;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { Temporal } from "@js-temporal/polyfill";
|
|
2
|
+
import { formatHourDuration, parseIntervalNanoseconds } from "../../internal/index.js";
|
|
3
|
+
import { parseDutyLog } from "../../internal/dutyLog.js";
|
|
4
|
+
import { clipRuns, readStatusList, runsOf } from "../../internal/dutyEngine.js";
|
|
5
|
+
/**
|
|
6
|
+
* Return the longest unbroken stretch a duty log spends in any of `statuses` inside a window.
|
|
7
|
+
*
|
|
8
|
+
* - A stretch is a run of touching entries whose statuses are all in `statuses`; another status
|
|
9
|
+
* or an unlogged gap ends it. Each run is cut to `window` (half-open) before it is measured.
|
|
10
|
+
* - On a tie the earlier stretch is returned.
|
|
11
|
+
* - `interval` is in UTC instants ending in "Z"; `duration` is an exact ISO 8601 duration with
|
|
12
|
+
* hours as the largest unit.
|
|
13
|
+
* - Returns `null` when no stretch falls inside the window, which is also the sentinel: when the
|
|
14
|
+
* log fails `isValidDutyLog`, when `window` is not a valid `Interval`, and when `statuses` is not
|
|
15
|
+
* an array of strings.
|
|
16
|
+
*
|
|
17
|
+
* @param log the duty log, ordered and non-overlapping
|
|
18
|
+
* @param window `{ start, end }` record of ISO 8601 instant strings to search inside
|
|
19
|
+
* @param statuses the statuses a stretch is made of
|
|
20
|
+
* @returns `{ interval, duration }` of the longest stretch, or null when there is none or on invalid input
|
|
21
|
+
*
|
|
22
|
+
* @example longestRun([{ status: "driving", start: "2024-01-01T00:00:00Z", end: "2024-01-01T03:00:00Z" }, { status: "onDuty", start: "2024-01-01T03:00:00Z", end: "2024-01-01T04:00:00Z" }, { status: "driving", start: "2024-01-01T04:00:00Z", end: "2024-01-01T08:00:00Z" }], { start: "2024-01-01T00:00:00Z", end: "2024-01-02T00:00:00Z" }, ["driving"]) // { interval: { start: "2024-01-01T04:00:00Z", end: "2024-01-01T08:00:00Z" }, duration: "PT4H" }
|
|
23
|
+
* @example longestRun([{ status: "driving", start: "2024-01-01T00:00:00Z", end: "2024-01-01T03:00:00Z" }, { status: "onDuty", start: "2024-01-01T03:00:00Z", end: "2024-01-01T04:00:00Z" }], { start: "2024-01-01T00:00:00Z", end: "2024-01-02T00:00:00Z" }, ["driving", "onDuty"]) // { interval: { start: "2024-01-01T00:00:00Z", end: "2024-01-01T04:00:00Z" }, duration: "PT4H" } — touching entries join
|
|
24
|
+
* @example longestRun([{ status: "off", start: "2024-01-01T00:00:00Z", end: "2024-01-01T08:00:00Z" }], { start: "2024-01-01T00:00:00Z", end: "2024-01-02T00:00:00Z" }, ["driving"]) // null — none
|
|
25
|
+
*/
|
|
26
|
+
export function longestRun(log, window, statuses) {
|
|
27
|
+
try {
|
|
28
|
+
const entries = parseDutyLog(log);
|
|
29
|
+
const bounds = parseIntervalNanoseconds(window);
|
|
30
|
+
const wanted = readStatusList(statuses);
|
|
31
|
+
if (entries === null || bounds === null || wanted === null) {
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
const runs = clipRuns(runsOf(entries, wanted), bounds.start, bounds.end);
|
|
35
|
+
const longest = runs.reduce((best, run) => best === undefined || run.end - run.start > best.end - best.start
|
|
36
|
+
? run
|
|
37
|
+
: best, undefined);
|
|
38
|
+
if (longest === undefined) {
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
return {
|
|
42
|
+
interval: {
|
|
43
|
+
start: Temporal.Instant.fromEpochNanoseconds(longest.start).toString(),
|
|
44
|
+
end: Temporal.Instant.fromEpochNanoseconds(longest.end).toString(),
|
|
45
|
+
},
|
|
46
|
+
duration: formatHourDuration(longest.end - longest.start),
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
// Never throws (Core Rule 3): a hostile
|
|
51
|
+
// argument is invalid input, not an exception.
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { DutyEntry, PairSpec, RestPair } from "../../types/index.js";
|
|
2
|
+
/**
|
|
3
|
+
* Return every paired rest in a duty log: two separate rests that together count as one, because
|
|
4
|
+
* they meet all three floors of `spec.pair`.
|
|
5
|
+
*
|
|
6
|
+
* A pair is three constraints, not two integers: with `{ eachAtLeast: "PT2H", oneAtLeast: "PT7H",
|
|
7
|
+
* combinedAtLeast: "PT10H" }`, 7.5 + 2.5 hours and 8 + 2 qualify, and 6 + 4 does not.
|
|
8
|
+
*
|
|
9
|
+
* - Rests are runs of touching entries in `spec.statuses`. Two rests in a row pair; either may be
|
|
10
|
+
* the longer.
|
|
11
|
+
* - A rest of `spec.minimum` or more is a full rest on its own: it pairs with nothing, and no pair
|
|
12
|
+
* spans it. A rest shorter than `eachAtLeast` is neither half of a pair nor a break between two.
|
|
13
|
+
* - Pairs chain: rests of 7, 3 and 7 hours give two pairs, (7, 3) and (3, 7).
|
|
14
|
+
* - Intervals are UTC instants ending in "Z", in log order.
|
|
15
|
+
* - `[]` is both a legitimate result and the sentinel: returned when the log fails
|
|
16
|
+
* `isValidDutyLog`, when `spec` is not an object, when `statuses` is not an array of strings,
|
|
17
|
+
* and when `minimum` or a floor of `pair` is not a positive ISO 8601 duration of exact time.
|
|
18
|
+
*
|
|
19
|
+
* @param log the duty log, ordered and non-overlapping
|
|
20
|
+
* @param spec the statuses a rest is made of, the length of a full rest, and the pair's floors
|
|
21
|
+
* @returns the pairs as `{ first, second }` records, or [] on invalid input
|
|
22
|
+
*
|
|
23
|
+
* @example qualifyingRestPairs([{ status: "sleeper", start: "2024-01-01T00:00:00Z", end: "2024-01-01T07:30:00Z" }, { status: "work", start: "2024-01-01T07:30:00Z", end: "2024-01-01T11:30:00Z" }, { status: "off", start: "2024-01-01T11:30:00Z", end: "2024-01-01T14:00:00Z" }], { statuses: ["off", "sleeper"], minimum: "PT10H", pair: { eachAtLeast: "PT2H", oneAtLeast: "PT7H", combinedAtLeast: "PT10H" } }) // [{ first: { start: "2024-01-01T00:00:00Z", end: "2024-01-01T07:30:00Z" }, second: { start: "2024-01-01T11:30:00Z", end: "2024-01-01T14:00:00Z" } }]
|
|
24
|
+
* @example qualifyingRestPairs([{ status: "off", start: "2024-01-01T00:00:00Z", end: "2024-01-01T06:00:00Z" }, { status: "work", start: "2024-01-01T06:00:00Z", end: "2024-01-01T10:00:00Z" }, { status: "off", start: "2024-01-01T10:00:00Z", end: "2024-01-01T14:00:00Z" }], { statuses: ["off"], minimum: "PT10H", pair: { eachAtLeast: "PT2H", oneAtLeast: "PT7H", combinedAtLeast: "PT10H" } }) // [] — 6 + 4: neither is 7
|
|
25
|
+
* @example qualifyingRestPairs([], { statuses: ["off"], minimum: "PT10H" }) // [] — no pair
|
|
26
|
+
*/
|
|
27
|
+
export declare function qualifyingRestPairs(log: DutyEntry[], spec: {
|
|
28
|
+
/** The statuses a rest is made of. Touching entries in any of them are one rest. */
|
|
29
|
+
statuses: string[];
|
|
30
|
+
/**
|
|
31
|
+
* The length of a full rest, a positive ISO 8601 duration of exact time (`"PT10H"`). A rest
|
|
32
|
+
* this long or longer is not half of a pair.
|
|
33
|
+
*/
|
|
34
|
+
minimum: string;
|
|
35
|
+
/** The three floors the two rests must meet. */
|
|
36
|
+
pair: PairSpec;
|
|
37
|
+
}): RestPair[];
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { Temporal } from "@js-temporal/polyfill";
|
|
2
|
+
import { isObject, nonNegativeExactDurationNanoseconds } from "../../internal/index.js";
|
|
3
|
+
import { readStatusList, restPairs, runsOf } from "../../internal/dutyEngine.js";
|
|
4
|
+
import { parseDutyLog } from "../../internal/dutyLog.js";
|
|
5
|
+
import { parsePairSpec } from "../../internal/dutyRules.js";
|
|
6
|
+
/**
|
|
7
|
+
* Return every paired rest in a duty log: two separate rests that together count as one, because
|
|
8
|
+
* they meet all three floors of `spec.pair`.
|
|
9
|
+
*
|
|
10
|
+
* A pair is three constraints, not two integers: with `{ eachAtLeast: "PT2H", oneAtLeast: "PT7H",
|
|
11
|
+
* combinedAtLeast: "PT10H" }`, 7.5 + 2.5 hours and 8 + 2 qualify, and 6 + 4 does not.
|
|
12
|
+
*
|
|
13
|
+
* - Rests are runs of touching entries in `spec.statuses`. Two rests in a row pair; either may be
|
|
14
|
+
* the longer.
|
|
15
|
+
* - A rest of `spec.minimum` or more is a full rest on its own: it pairs with nothing, and no pair
|
|
16
|
+
* spans it. A rest shorter than `eachAtLeast` is neither half of a pair nor a break between two.
|
|
17
|
+
* - Pairs chain: rests of 7, 3 and 7 hours give two pairs, (7, 3) and (3, 7).
|
|
18
|
+
* - Intervals are UTC instants ending in "Z", in log order.
|
|
19
|
+
* - `[]` is both a legitimate result and the sentinel: returned when the log fails
|
|
20
|
+
* `isValidDutyLog`, when `spec` is not an object, when `statuses` is not an array of strings,
|
|
21
|
+
* and when `minimum` or a floor of `pair` is not a positive ISO 8601 duration of exact time.
|
|
22
|
+
*
|
|
23
|
+
* @param log the duty log, ordered and non-overlapping
|
|
24
|
+
* @param spec the statuses a rest is made of, the length of a full rest, and the pair's floors
|
|
25
|
+
* @returns the pairs as `{ first, second }` records, or [] on invalid input
|
|
26
|
+
*
|
|
27
|
+
* @example qualifyingRestPairs([{ status: "sleeper", start: "2024-01-01T00:00:00Z", end: "2024-01-01T07:30:00Z" }, { status: "work", start: "2024-01-01T07:30:00Z", end: "2024-01-01T11:30:00Z" }, { status: "off", start: "2024-01-01T11:30:00Z", end: "2024-01-01T14:00:00Z" }], { statuses: ["off", "sleeper"], minimum: "PT10H", pair: { eachAtLeast: "PT2H", oneAtLeast: "PT7H", combinedAtLeast: "PT10H" } }) // [{ first: { start: "2024-01-01T00:00:00Z", end: "2024-01-01T07:30:00Z" }, second: { start: "2024-01-01T11:30:00Z", end: "2024-01-01T14:00:00Z" } }]
|
|
28
|
+
* @example qualifyingRestPairs([{ status: "off", start: "2024-01-01T00:00:00Z", end: "2024-01-01T06:00:00Z" }, { status: "work", start: "2024-01-01T06:00:00Z", end: "2024-01-01T10:00:00Z" }, { status: "off", start: "2024-01-01T10:00:00Z", end: "2024-01-01T14:00:00Z" }], { statuses: ["off"], minimum: "PT10H", pair: { eachAtLeast: "PT2H", oneAtLeast: "PT7H", combinedAtLeast: "PT10H" } }) // [] — 6 + 4: neither is 7
|
|
29
|
+
* @example qualifyingRestPairs([], { statuses: ["off"], minimum: "PT10H" }) // [] — no pair
|
|
30
|
+
*/
|
|
31
|
+
export function qualifyingRestPairs(log, spec) {
|
|
32
|
+
try {
|
|
33
|
+
const entries = parseDutyLog(log);
|
|
34
|
+
if (entries === null || !isObject(spec)) {
|
|
35
|
+
return [];
|
|
36
|
+
}
|
|
37
|
+
const { statuses, minimum, pair } = spec;
|
|
38
|
+
const wanted = readStatusList(statuses);
|
|
39
|
+
const fullRest = nonNegativeExactDurationNanoseconds(minimum);
|
|
40
|
+
const floors = parsePairSpec(pair);
|
|
41
|
+
if (wanted === null ||
|
|
42
|
+
fullRest === null ||
|
|
43
|
+
fullRest === 0n ||
|
|
44
|
+
floors === null) {
|
|
45
|
+
return [];
|
|
46
|
+
}
|
|
47
|
+
const text = (nanoseconds) => Temporal.Instant.fromEpochNanoseconds(nanoseconds).toString();
|
|
48
|
+
return restPairs(runsOf(entries, wanted), fullRest, floors).map(({ first, second }) => ({
|
|
49
|
+
first: { start: text(first.start), end: text(first.end) },
|
|
50
|
+
second: { start: text(second.start), end: text(second.end) },
|
|
51
|
+
}));
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
// Never throws (Core Rule 3): a hostile
|
|
55
|
+
// argument is invalid input, not an exception.
|
|
56
|
+
return [];
|
|
57
|
+
}
|
|
58
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { DutyEntry, Interval } from "../../types/index.js";
|
|
2
|
+
/**
|
|
3
|
+
* Return every rest of at least `minimum` in a duty log: the runs of touching entries in any of
|
|
4
|
+
* `spec.statuses` that last that long.
|
|
5
|
+
*
|
|
6
|
+
* - A run is ended by another status or an unlogged gap, never by a change between two of
|
|
7
|
+
* `statuses`: an off period running straight into a sleeper-berth period is one rest.
|
|
8
|
+
* - The whole log is read. Intervals are UTC instants ending in "Z", in log order.
|
|
9
|
+
* - For two shorter rests that count together, use `qualifyingRestPairs`.
|
|
10
|
+
* - `[]` is both a legitimate result and the sentinel: returned when the log fails
|
|
11
|
+
* `isValidDutyLog`, when `spec` is not an object, when `statuses` is not an array of strings,
|
|
12
|
+
* and when `minimum` is not a positive ISO 8601 duration of exact time.
|
|
13
|
+
*
|
|
14
|
+
* @param log the duty log, ordered and non-overlapping
|
|
15
|
+
* @param spec the statuses a rest is made of and the shortest that counts
|
|
16
|
+
* @returns the rests' `{ start, end }` records, or [] on invalid input
|
|
17
|
+
*
|
|
18
|
+
* @example qualifyingRests([{ status: "off", start: "2024-01-01T00:00:00Z", end: "2024-01-01T10:00:00Z" }, { status: "work", start: "2024-01-01T10:00:00Z", end: "2024-01-01T16:00:00Z" }, { status: "off", start: "2024-01-01T16:00:00Z", end: "2024-01-01T23:00:00Z" }], { statuses: ["off"], minimum: "PT10H" }) // [{ start: "2024-01-01T00:00:00Z", end: "2024-01-01T10:00:00Z" }]
|
|
19
|
+
* @example qualifyingRests([{ status: "off", start: "2024-01-01T00:00:00Z", end: "2024-01-01T05:00:00Z" }, { status: "sleeper", start: "2024-01-01T05:00:00Z", end: "2024-01-01T12:00:00Z" }], { statuses: ["off", "sleeper"], minimum: "PT10H" }) // [{ start: "2024-01-01T00:00:00Z", end: "2024-01-01T12:00:00Z" }] — one rest
|
|
20
|
+
* @example qualifyingRests([], { statuses: ["off"], minimum: "PT0S" }) // [] — a zero minimum
|
|
21
|
+
*/
|
|
22
|
+
export declare function qualifyingRests(log: DutyEntry[], spec: {
|
|
23
|
+
/** The statuses a rest is made of. Touching entries in any of them are one rest. */
|
|
24
|
+
statuses: string[];
|
|
25
|
+
/** The shortest rest returned, a positive ISO 8601 duration of exact time (`"PT10H"`). */
|
|
26
|
+
minimum: string;
|
|
27
|
+
}): Interval[];
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { Temporal } from "@js-temporal/polyfill";
|
|
2
|
+
import { isObject, nonNegativeExactDurationNanoseconds } from "../../internal/index.js";
|
|
3
|
+
import { parseDutyLog } from "../../internal/dutyLog.js";
|
|
4
|
+
import { readStatusList, runsOf } from "../../internal/dutyEngine.js";
|
|
5
|
+
/**
|
|
6
|
+
* Return every rest of at least `minimum` in a duty log: the runs of touching entries in any of
|
|
7
|
+
* `spec.statuses` that last that long.
|
|
8
|
+
*
|
|
9
|
+
* - A run is ended by another status or an unlogged gap, never by a change between two of
|
|
10
|
+
* `statuses`: an off period running straight into a sleeper-berth period is one rest.
|
|
11
|
+
* - The whole log is read. Intervals are UTC instants ending in "Z", in log order.
|
|
12
|
+
* - For two shorter rests that count together, use `qualifyingRestPairs`.
|
|
13
|
+
* - `[]` is both a legitimate result and the sentinel: returned when the log fails
|
|
14
|
+
* `isValidDutyLog`, when `spec` is not an object, when `statuses` is not an array of strings,
|
|
15
|
+
* and when `minimum` is not a positive ISO 8601 duration of exact time.
|
|
16
|
+
*
|
|
17
|
+
* @param log the duty log, ordered and non-overlapping
|
|
18
|
+
* @param spec the statuses a rest is made of and the shortest that counts
|
|
19
|
+
* @returns the rests' `{ start, end }` records, or [] on invalid input
|
|
20
|
+
*
|
|
21
|
+
* @example qualifyingRests([{ status: "off", start: "2024-01-01T00:00:00Z", end: "2024-01-01T10:00:00Z" }, { status: "work", start: "2024-01-01T10:00:00Z", end: "2024-01-01T16:00:00Z" }, { status: "off", start: "2024-01-01T16:00:00Z", end: "2024-01-01T23:00:00Z" }], { statuses: ["off"], minimum: "PT10H" }) // [{ start: "2024-01-01T00:00:00Z", end: "2024-01-01T10:00:00Z" }]
|
|
22
|
+
* @example qualifyingRests([{ status: "off", start: "2024-01-01T00:00:00Z", end: "2024-01-01T05:00:00Z" }, { status: "sleeper", start: "2024-01-01T05:00:00Z", end: "2024-01-01T12:00:00Z" }], { statuses: ["off", "sleeper"], minimum: "PT10H" }) // [{ start: "2024-01-01T00:00:00Z", end: "2024-01-01T12:00:00Z" }] — one rest
|
|
23
|
+
* @example qualifyingRests([], { statuses: ["off"], minimum: "PT0S" }) // [] — a zero minimum
|
|
24
|
+
*/
|
|
25
|
+
export function qualifyingRests(log, spec) {
|
|
26
|
+
try {
|
|
27
|
+
const entries = parseDutyLog(log);
|
|
28
|
+
if (entries === null || !isObject(spec)) {
|
|
29
|
+
return [];
|
|
30
|
+
}
|
|
31
|
+
const { statuses, minimum } = spec;
|
|
32
|
+
const wanted = readStatusList(statuses);
|
|
33
|
+
const floor = nonNegativeExactDurationNanoseconds(minimum);
|
|
34
|
+
if (wanted === null || floor === null || floor === 0n) {
|
|
35
|
+
return [];
|
|
36
|
+
}
|
|
37
|
+
return runsOf(entries, wanted)
|
|
38
|
+
.filter((run) => run.end - run.start >= floor)
|
|
39
|
+
.map((run) => ({
|
|
40
|
+
start: Temporal.Instant.fromEpochNanoseconds(run.start).toString(),
|
|
41
|
+
end: Temporal.Instant.fromEpochNanoseconds(run.end).toString(),
|
|
42
|
+
}));
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
// Never throws (Core Rule 3): a hostile
|
|
46
|
+
// argument is invalid input, not an exception.
|
|
47
|
+
return [];
|
|
48
|
+
}
|
|
49
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./isValidDutyLog.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./isValidDutyLog.js";
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validate whether a value is a duty log every `duty/` function accepts.
|
|
3
|
+
*
|
|
4
|
+
* - True for an array of `{ status, start, end }` entries where `status` is a string and `start`
|
|
5
|
+
* and `end` are ISO 8601 instant strings (offset required, no leap second), `end` after `start`.
|
|
6
|
+
* - Entries must be ordered by `start` and must not overlap. One may start exactly where the
|
|
7
|
+
* previous one ends, since entries are half-open, or later, leaving a gap. Order is by instant,
|
|
8
|
+
* not text.
|
|
9
|
+
* - `[]` is a valid, empty log. Extra keys on an entry are ignored.
|
|
10
|
+
* - Every other `duty/` function returns its sentinel for a log this rejects.
|
|
11
|
+
* - Returns `false` for a non-array, an entry that is not an object, a non-string status, a bound
|
|
12
|
+
* that is not an instant, a zero-length or inverted entry, and entries out of order or
|
|
13
|
+
* overlapping.
|
|
14
|
+
*
|
|
15
|
+
* @param log candidate array of `{ status, start, end }` records
|
|
16
|
+
* @returns boolean indicating whether the log is valid
|
|
17
|
+
*
|
|
18
|
+
* @example isValidDutyLog([{ status: "off", start: "2024-01-01T00:00:00Z", end: "2024-01-01T10:00:00Z" }, { status: "driving", start: "2024-01-01T10:00:00Z", end: "2024-01-01T15:00:00Z" }]) // true
|
|
19
|
+
* @example isValidDutyLog([]) // true — an empty log
|
|
20
|
+
* @example isValidDutyLog([{ status: "on", start: "2024-01-01T02:00:00Z", end: "2024-01-01T01:00:00Z" }]) // false — inverted
|
|
21
|
+
* @example isValidDutyLog([{ status: "on", start: "2024-01-01T00:00:00Z", end: "2024-01-01T02:00:00Z" }, { status: "off", start: "2024-01-01T01:59:59Z", end: "2024-01-01T03:00:00Z" }]) // false — overlapping
|
|
22
|
+
* @example isValidDutyLog([{ status: "on", start: "2024-01-01T00:00:00", end: "2024-01-01T01:00:00Z" }]) // false — no offset
|
|
23
|
+
*/
|
|
24
|
+
export declare function isValidDutyLog(log: unknown): boolean;
|