@northguild/gmt 1.17.0 → 1.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +462 -22
- package/dist/calendar/calculate/bucketRange.d.ts +3 -3
- package/dist/calendar/calculate/bucketRange.js +6 -6
- package/dist/calendar/calculate/floorToZone.d.ts +5 -3
- package/dist/calendar/calculate/floorToZone.js +6 -5
- 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 +53 -0
- package/dist/calendar/hours/addOperatingTime.js +59 -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 +39 -0
- package/dist/calendar/hours/isOpenAt.js +44 -0
- package/dist/calendar/hours/nextCloseAt.d.ts +49 -0
- package/dist/calendar/hours/nextCloseAt.js +51 -0
- package/dist/calendar/hours/nextOpenAt.d.ts +45 -0
- package/dist/calendar/hours/nextOpenAt.js +47 -0
- package/dist/calendar/hours/operatingIntervals.d.ts +43 -0
- package/dist/calendar/hours/operatingIntervals.js +52 -0
- package/dist/calendar/hours/operatingTimeBetween.d.ts +40 -0
- package/dist/calendar/hours/operatingTimeBetween.js +49 -0
- package/dist/calendar/hours/recurringWindows.d.ts +61 -0
- package/dist/calendar/hours/recurringWindows.js +80 -0
- package/dist/calendar/index.d.ts +1 -0
- package/dist/calendar/index.js +1 -0
- package/dist/duration/calculate/durationAs.d.ts +13 -8
- package/dist/duration/calculate/durationAs.js +4 -8
- package/dist/duration/compare/compareDurations.d.ts +12 -6
- package/dist/duration/compare/compareDurations.js +3 -6
- 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/instant/convert/classifyLocal.d.ts +1 -1
- package/dist/instant/convert/classifyLocal.js +1 -1
- package/dist/instant/convert/fromOffsetInstant.d.ts +3 -1
- package/dist/instant/convert/fromOffsetInstant.js +3 -1
- package/dist/instant/convert/resolveLocal.d.ts +12 -7
- package/dist/instant/convert/resolveLocal.js +6 -10
- package/dist/instant/convert/toOffsetInstant.d.ts +22 -9
- package/dist/instant/convert/toOffsetInstant.js +10 -3
- package/dist/intermodal/calculate/billingTimeline.d.ts +31 -11
- package/dist/intermodal/calculate/billingTimeline.js +2 -2
- package/dist/intermodal/calculate/chargeableDays.d.ts +13 -11
- package/dist/intermodal/calculate/chargeableDays.js +4 -9
- package/dist/intermodal/calculate/demurrageClock.d.ts +16 -7
- package/dist/intermodal/calculate/demurrageClock.js +7 -7
- package/dist/intermodal/calculate/freeTimeExpiry.d.ts +5 -4
- package/dist/intermodal/calculate/freeTimeExpiry.js +6 -6
- package/dist/internal/businessCalendar.d.ts +5 -0
- package/dist/internal/businessCalendar.js +5 -1
- 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/englishCalendarNames.js +1 -2
- 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/index.d.ts +9 -4
- package/dist/internal/index.js +9 -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/joinDateTimeConnector.d.ts +1 -1
- package/dist/internal/monthGridWeekRow.d.ts +2 -1
- package/dist/internal/monthGridWeekRow.js +2 -1
- package/dist/internal/normalizeTimeZone.d.ts +2 -2
- package/dist/internal/normalizeTimeZone.js +2 -2
- package/dist/internal/operatingSchedule.d.ts +129 -0
- package/dist/internal/operatingSchedule.js +668 -0
- package/dist/internal/optionOrDefault.d.ts +18 -0
- package/dist/internal/optionOrDefault.js +20 -0
- package/dist/internal/patternToken.d.ts +2 -2
- package/dist/internal/patternToken.js +28 -13
- 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/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/splitStep.d.ts +24 -1
- package/dist/internal/splitStep.js +34 -2
- 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/utcZonedDateTime.d.ts +5 -2
- package/dist/internal/utcZonedDateTime.js +8 -5
- package/dist/internal/zonedBucket.js +8 -6
- package/dist/internal/zonedLocalDates.js +1 -1
- 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/zonedWallClockOperations.d.ts +26 -13
- package/dist/internal/zonedWallClockOperations.js +87 -34
- 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 +5 -8
- package/dist/plain/calculate/addDateTime.d.ts +7 -4
- package/dist/plain/calculate/addDateTime.js +1 -4
- 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 +8 -2
- 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 +7 -5
- package/dist/plain/calculate/setDate.js +1 -5
- package/dist/plain/calculate/setDateTime.d.ts +8 -5
- package/dist/plain/calculate/setDateTime.js +1 -5
- package/dist/plain/calculate/setTime.d.ts +10 -6
- package/dist/plain/calculate/setTime.js +4 -6
- 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 +8 -1
- package/dist/plain/calculate/startOfTime.js +1 -1
- package/dist/plain/calculate/subtractDate.d.ts +7 -4
- package/dist/plain/calculate/subtractDate.js +1 -4
- package/dist/plain/calculate/subtractDateTime.d.ts +7 -4
- package/dist/plain/calculate/subtractDateTime.js +1 -4
- 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 +21 -16
- 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 +26 -15
- package/dist/plain/format/formatRelativeDateTime.d.ts +16 -3
- package/dist/plain/format/formatRelativeDateTime.js +8 -5
- package/dist/plain/format/formatRelativeTime.d.ts +16 -3
- package/dist/plain/format/formatRelativeTime.js +21 -13
- package/dist/plain/format/formatTime.js +4 -2
- 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/intervalXorAllDateTime.d.ts +9 -0
- package/dist/plain/interval/intervalXorAllTime.d.ts +9 -0
- 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/mergeIntervalsDateTime.d.ts +9 -0
- package/dist/plain/interval/mergeIntervalsTime.d.ts +9 -0
- 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/parseDateTimeWithPattern.d.ts +10 -7
- package/dist/plain/parse/parseDateTimeWithPattern.js +10 -7
- package/dist/plain/parse/parseDateWithPattern.d.ts +10 -7
- package/dist/plain/parse/parseDateWithPattern.js +10 -7
- package/dist/plain/parse/parseTimeWithPattern.d.ts +10 -7
- package/dist/plain/parse/parseTimeWithPattern.js +10 -7
- package/dist/plain/parse/parseUnitFromDate.d.ts +11 -3
- package/dist/plain/parse/parseUnitFromDate.js +3 -3
- package/dist/plain/parse/parseUnitFromDateTime.d.ts +11 -3
- package/dist/plain/parse/parseUnitFromDateTime.js +3 -3
- 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/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/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 +1 -1
- package/dist/precision/convert/fromNanoseconds.js +1 -1
- 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/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 +58 -0
- package/dist/transport/calculate/crossingTime.js +76 -0
- package/dist/transport/calculate/cutoffAt.d.ts +90 -0
- package/dist/transport/calculate/cutoffAt.js +209 -0
- package/dist/transport/calculate/cutoffSchedule.d.ts +70 -0
- package/dist/transport/calculate/cutoffSchedule.js +71 -0
- package/dist/transport/calculate/dwellTime.d.ts +16 -7
- package/dist/transport/calculate/dwellTime.js +12 -8
- 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 +150 -0
- package/dist/transport/calculate/scheduleDelivery.js +300 -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 +7 -0
- package/dist/transport/convert/etaAtZone.js +9 -4
- package/dist/transport/index.d.ts +1 -0
- package/dist/transport/index.js +1 -0
- package/dist/types/business-calendar.d.ts +19 -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/fiscal-calendar.d.ts +1 -1
- package/dist/types/fractional-digit.d.ts +5 -0
- package/dist/types/free-time-options.d.ts +21 -11
- package/dist/types/index.d.ts +2 -1
- package/dist/types/index.js +2 -1
- package/dist/types/interval.d.ts +8 -1
- package/dist/types/offset.d.ts +9 -0
- package/dist/types/operating-schedule.d.ts +71 -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/unix/calculate/addUnix.d.ts +19 -5
- package/dist/unix/calculate/addUnix.js +1 -5
- package/dist/unix/calculate/diffUnix.d.ts +13 -3
- package/dist/unix/calculate/diffUnix.js +1 -3
- package/dist/unix/calculate/diffUnixAsDuration.d.ts +13 -3
- package/dist/unix/calculate/diffUnixAsDuration.js +1 -3
- package/dist/unix/calculate/endOfQuarterForUnix.d.ts +13 -3
- package/dist/unix/calculate/endOfQuarterForUnix.js +1 -3
- package/dist/unix/calculate/endOfUnix.d.ts +20 -4
- package/dist/unix/calculate/endOfUnix.js +1 -4
- package/dist/unix/calculate/isBetweenUnix.d.ts +26 -4
- package/dist/unix/calculate/isBetweenUnix.js +4 -6
- package/dist/unix/calculate/roundUnix.d.ts +31 -3
- package/dist/unix/calculate/roundUnix.js +3 -6
- package/dist/unix/calculate/setUnix.d.ts +35 -9
- package/dist/unix/calculate/setUnix.js +4 -13
- package/dist/unix/calculate/startOfQuarterForUnix.d.ts +13 -3
- package/dist/unix/calculate/startOfQuarterForUnix.js +1 -3
- package/dist/unix/calculate/startOfUnix.d.ts +20 -4
- package/dist/unix/calculate/startOfUnix.js +1 -4
- package/dist/unix/calculate/subtractUnix.d.ts +19 -5
- package/dist/unix/calculate/subtractUnix.js +1 -5
- package/dist/unix/compare/areUnixEqual.d.ts +7 -1
- package/dist/unix/compare/areUnixEqual.js +1 -1
- package/dist/unix/compare/areUnixEqualBy.d.ts +24 -7
- package/dist/unix/compare/areUnixEqualBy.js +13 -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 +14 -4
- package/dist/unix/convert/convertUnixToPlainDate.js +2 -4
- package/dist/unix/convert/convertUnixToPlainDateTime.d.ts +14 -4
- package/dist/unix/convert/convertUnixToPlainDateTime.js +2 -4
- package/dist/unix/convert/convertUnixToPlainTime.d.ts +14 -4
- package/dist/unix/convert/convertUnixToPlainTime.js +2 -4
- package/dist/unix/convert/convertUnixToUtc.d.ts +9 -4
- package/dist/unix/convert/convertUnixToUtc.js +3 -4
- package/dist/unix/convert/convertUnixToZoned.d.ts +10 -5
- package/dist/unix/convert/convertUnixToZoned.js +4 -5
- package/dist/unix/format/formatCalendarUnix.d.ts +27 -19
- package/dist/unix/format/formatCalendarUnix.js +4 -5
- package/dist/unix/format/formatRelativeUnix.d.ts +54 -5
- package/dist/unix/format/formatRelativeUnix.js +3 -5
- package/dist/unix/format/formatUnix.d.ts +24 -6
- package/dist/unix/format/formatUnix.js +8 -7
- package/dist/unix/get/getUnixNow.d.ts +8 -3
- package/dist/unix/get/getUnixNow.js +1 -3
- package/dist/unix/interval/intervalCountUnix.d.ts +14 -5
- package/dist/unix/interval/intervalCountUnix.js +2 -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 +33 -5
- package/dist/unix/interval/intervalFromDurationUnix.js +6 -5
- package/dist/unix/interval/intervalIntersectionUnix.d.ts +6 -0
- package/dist/unix/interval/intervalLengthUnix.d.ts +16 -6
- package/dist/unix/interval/intervalLengthUnix.js +4 -6
- package/dist/unix/interval/intervalOverlappingDaysUnix.d.ts +13 -3
- package/dist/unix/interval/intervalOverlappingDaysUnix.js +1 -3
- 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 +42 -11
- package/dist/unix/interval/splitIntervalByUnitUnix.js +21 -16
- package/dist/unix/parse/parseDateFromUnix.d.ts +13 -2
- package/dist/unix/parse/parseDateFromUnix.js +1 -2
- package/dist/unix/parse/parseDayFromUnix.d.ts +14 -2
- package/dist/unix/parse/parseDayFromUnix.js +2 -2
- package/dist/unix/parse/parseDayOfWeekFromUnix.d.ts +13 -1
- package/dist/unix/parse/parseDayOfWeekFromUnix.js +1 -1
- package/dist/unix/parse/parseHourFromUnix.d.ts +14 -2
- package/dist/unix/parse/parseHourFromUnix.js +2 -2
- package/dist/unix/parse/parseMicrosecondFromUnix.d.ts +14 -2
- package/dist/unix/parse/parseMicrosecondFromUnix.js +2 -2
- package/dist/unix/parse/parseMillisecondFromUnix.d.ts +14 -2
- package/dist/unix/parse/parseMillisecondFromUnix.js +2 -2
- package/dist/unix/parse/parseMinuteFromUnix.d.ts +14 -2
- package/dist/unix/parse/parseMinuteFromUnix.js +2 -2
- package/dist/unix/parse/parseMonthFromUnix.d.ts +14 -2
- package/dist/unix/parse/parseMonthFromUnix.js +2 -2
- package/dist/unix/parse/parseNanosecondFromUnix.d.ts +14 -2
- package/dist/unix/parse/parseNanosecondFromUnix.js +2 -2
- package/dist/unix/parse/parseSecondFromUnix.d.ts +14 -2
- package/dist/unix/parse/parseSecondFromUnix.js +2 -2
- package/dist/unix/parse/parseTimeFromUnix.d.ts +13 -2
- package/dist/unix/parse/parseTimeFromUnix.js +1 -2
- package/dist/unix/parse/parseUnitFromUnix.d.ts +22 -3
- package/dist/unix/parse/parseUnitFromUnix.js +2 -3
- package/dist/unix/parse/parseWeekFromUnix.d.ts +23 -7
- package/dist/unix/parse/parseWeekFromUnix.js +3 -7
- package/dist/unix/parse/parseYearFromUnix.d.ts +14 -2
- package/dist/unix/parse/parseYearFromUnix.js +2 -2
- package/dist/unix/validate/isValidUnixRange.d.ts +20 -4
- package/dist/unix/validate/isValidUnixRange.js +1 -4
- package/dist/utc/calculate/addUtc.d.ts +7 -4
- package/dist/utc/calculate/addUtc.js +1 -4
- 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 +7 -4
- package/dist/utc/calculate/setUtc.js +1 -4
- 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 +1 -4
- package/dist/utc/compare/areUtcEqualBy.d.ts +9 -3
- package/dist/utc/compare/areUtcEqualBy.js +2 -3
- package/dist/utc/convert/convertUtcToPlainDate.d.ts +8 -3
- package/dist/utc/convert/convertUtcToPlainDate.js +5 -6
- package/dist/utc/convert/convertUtcToPlainDateTime.d.ts +8 -3
- package/dist/utc/convert/convertUtcToPlainDateTime.js +5 -6
- package/dist/utc/convert/convertUtcToPlainTime.d.ts +8 -3
- package/dist/utc/convert/convertUtcToPlainTime.js +5 -6
- package/dist/utc/convert/convertUtcToUnix.d.ts +9 -4
- package/dist/utc/convert/convertUtcToUnix.js +3 -4
- package/dist/utc/convert/convertUtcToZoned.d.ts +1 -1
- package/dist/utc/convert/convertUtcToZoned.js +1 -1
- package/dist/utc/format/formatCalendarUtc.d.ts +19 -8
- package/dist/utc/format/formatCalendarUtc.js +8 -6
- package/dist/utc/format/formatHttp.d.ts +1 -1
- package/dist/utc/format/formatHttp.js +1 -1
- package/dist/utc/format/formatRelativeUtc.d.ts +30 -10
- package/dist/utc/format/formatRelativeUtc.js +9 -11
- package/dist/utc/format/formatUtc.d.ts +17 -15
- package/dist/utc/format/formatUtc.js +8 -8
- 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/intervalXorUtc.d.ts +6 -0
- package/dist/utc/interval/mergeIntervalsUtc.d.ts +6 -0
- package/dist/utc/interval/splitIntervalByUnitUtc.d.ts +19 -6
- package/dist/utc/interval/splitIntervalByUnitUtc.js +6 -6
- package/dist/utc/parse/parseDateFromUtc.d.ts +7 -3
- package/dist/utc/parse/parseDateFromUtc.js +1 -3
- package/dist/utc/parse/parseDayFromUtc.d.ts +7 -3
- package/dist/utc/parse/parseDayFromUtc.js +1 -3
- package/dist/utc/parse/parseDayOfWeekFromUtc.d.ts +7 -3
- package/dist/utc/parse/parseDayOfWeekFromUtc.js +4 -6
- package/dist/utc/parse/parseHourFromUtc.d.ts +7 -3
- package/dist/utc/parse/parseHourFromUtc.js +1 -3
- package/dist/utc/parse/parseHttp.d.ts +1 -1
- package/dist/utc/parse/parseHttp.js +1 -1
- package/dist/utc/parse/parseMicrosecondFromUtc.d.ts +7 -3
- package/dist/utc/parse/parseMicrosecondFromUtc.js +1 -3
- package/dist/utc/parse/parseMillisecondFromUtc.d.ts +7 -3
- package/dist/utc/parse/parseMillisecondFromUtc.js +1 -3
- package/dist/utc/parse/parseMinuteFromUtc.d.ts +7 -3
- package/dist/utc/parse/parseMinuteFromUtc.js +1 -3
- package/dist/utc/parse/parseMonthFromUtc.d.ts +7 -3
- package/dist/utc/parse/parseMonthFromUtc.js +1 -3
- package/dist/utc/parse/parseNanosecondFromUtc.d.ts +7 -3
- package/dist/utc/parse/parseNanosecondFromUtc.js +1 -3
- package/dist/utc/parse/parseSecondFromUtc.d.ts +7 -3
- package/dist/utc/parse/parseSecondFromUtc.js +1 -3
- package/dist/utc/parse/parseTimeFromUtc.d.ts +8 -3
- package/dist/utc/parse/parseTimeFromUtc.js +5 -6
- package/dist/utc/parse/parseUnitFromUtc.d.ts +17 -5
- package/dist/utc/parse/parseUnitFromUtc.js +6 -8
- package/dist/utc/parse/parseWeekFromUtc.d.ts +18 -10
- package/dist/utc/parse/parseWeekFromUtc.js +7 -13
- package/dist/utc/parse/parseYearFromUtc.d.ts +7 -3
- package/dist/utc/parse/parseYearFromUtc.js +1 -3
- package/dist/utc/validate/isValidUtcRange.d.ts +16 -5
- package/dist/utc/validate/isValidUtcRange.js +2 -5
- package/dist/zoned/calculate/addZoned.d.ts +20 -10
- package/dist/zoned/calculate/addZoned.js +6 -13
- 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 +25 -8
- package/dist/zoned/calculate/setZoned.js +4 -12
- 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 +6 -13
- 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 +18 -5
- package/dist/zoned/convert/convertPlainDateTimeToZoned.js +6 -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 +1 -1
- package/dist/zoned/convert/convertZonedToZoned.js +1 -1
- package/dist/zoned/format/formatCalendarZoned.d.ts +18 -12
- package/dist/zoned/format/formatCalendarZoned.js +13 -9
- package/dist/zoned/format/formatRelativeZoned.d.ts +41 -12
- package/dist/zoned/format/formatRelativeZoned.js +7 -4
- 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 +12 -3
- package/dist/zoned/format/formatTimeZoneName.js +5 -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 +9 -10
- package/dist/zoned/get/getDstTransitions.js +12 -3
- package/dist/zoned/get/getTimeZoneOffset.d.ts +4 -1
- package/dist/zoned/get/getTimeZoneOffset.js +6 -3
- package/dist/zoned/get/getZonedNow.d.ts +13 -1
- package/dist/zoned/get/getZonedNow.js +12 -3
- 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/intervalXorZoned.d.ts +9 -0
- package/dist/zoned/interval/mergeIntervalsZoned.d.ts +9 -0
- 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 +9 -3
- package/dist/zoned/parse/parseUnitFromZoned.js +1 -3
- package/dist/zoned/parse/parseWeekFromZoned.d.ts +10 -3
- package/dist/zoned/parse/parseWeekFromZoned.js +2 -3
- package/dist/zoned/validate/hasDaylightSaving.d.ts +42 -11
- package/dist/zoned/validate/hasDaylightSaving.js +47 -31
- 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 +18 -5
- package/skills/gmt-arithmetic/SKILL.md +1 -1
- package/skills/gmt-basics/SKILL.md +10 -1
- package/skills/gmt-integration/SKILL.md +10 -5
- package/skills/gmt-timezone/SKILL.md +150 -21
- package/dist/internal/resolveReadingTimeZone.d.ts +0 -11
- package/dist/internal/resolveReadingTimeZone.js +0 -18
- package/dist/types/duration-unit.d.ts +0 -5
- /package/dist/types/{duration-unit.js → operating-schedule.js} +0 -0
|
@@ -5,33 +5,53 @@ export interface BillingDates {
|
|
|
5
5
|
* last incurred or, for a re-bill, the issuance date of the invoice received.
|
|
6
6
|
*/
|
|
7
7
|
anchorOn: string;
|
|
8
|
-
/**
|
|
8
|
+
/**
|
|
9
|
+
* The date the invoice was issued, once it has been, as an ISO date.
|
|
10
|
+
*
|
|
11
|
+
* @defaultValue None. `issuedByDeadline` and `disputeDeadline` are `null`.
|
|
12
|
+
*/
|
|
9
13
|
invoiceIssuedOn?: string;
|
|
10
|
-
/**
|
|
14
|
+
/**
|
|
15
|
+
* The date the dispute request was received, once it has been, as an ISO date. It needs
|
|
16
|
+
* `invoiceIssuedOn` and may not precede it.
|
|
17
|
+
*
|
|
18
|
+
* @defaultValue None. `requestedByDeadline` and `resolutionDeadline` are `null`.
|
|
19
|
+
*/
|
|
11
20
|
requestReceivedOn?: string;
|
|
12
21
|
}
|
|
13
22
|
/** The three windows the caller supplies, in calendar days, none defaulted, and an optional agreed resolution date. */
|
|
14
23
|
export interface BillingWindows {
|
|
15
|
-
/**
|
|
24
|
+
/** The days from `anchorOn` within which the invoice must be issued. */
|
|
16
25
|
issueDays: number;
|
|
17
|
-
/**
|
|
26
|
+
/** The days from `invoiceIssuedOn` within which a dispute may be raised. */
|
|
18
27
|
disputeDays: number;
|
|
19
|
-
/**
|
|
28
|
+
/** The days from `requestReceivedOn` within which the dispute must be resolved. */
|
|
20
29
|
resolutionDays: number;
|
|
21
|
-
/**
|
|
30
|
+
/**
|
|
31
|
+
* A resolution date the parties agreed instead, as an ISO date on or after `requestReceivedOn`;
|
|
32
|
+
* it replaces the computed one.
|
|
33
|
+
*
|
|
34
|
+
* @defaultValue None. `resolutionDeadline` is `requestReceivedOn + resolutionDays`.
|
|
35
|
+
*/
|
|
22
36
|
agreedResolutionOn?: string;
|
|
23
37
|
}
|
|
24
38
|
/** What `billingTimeline` returns: each deadline as an ISO date, and each comparison once its date exists. */
|
|
25
39
|
export interface BillingDeadlines {
|
|
26
|
-
/** `anchorOn + issueDays`. */
|
|
40
|
+
/** The last date the invoice may be issued: `anchorOn + issueDays`. */
|
|
27
41
|
invoiceDeadline: string;
|
|
28
42
|
/** Whether `invoiceIssuedOn` is on or before `invoiceDeadline`; `null` until an invoice date exists. */
|
|
29
43
|
issuedByDeadline: boolean | null;
|
|
30
|
-
/**
|
|
44
|
+
/**
|
|
45
|
+
* The last date a dispute may be raised: `invoiceIssuedOn + disputeDays`; `null` until an invoice
|
|
46
|
+
* date exists.
|
|
47
|
+
*/
|
|
31
48
|
disputeDeadline: string | null;
|
|
32
49
|
/** Whether `requestReceivedOn` is on or before `disputeDeadline`; `null` until a request date exists. */
|
|
33
50
|
requestedByDeadline: boolean | null;
|
|
34
|
-
/**
|
|
51
|
+
/**
|
|
52
|
+
* The last date the dispute must be resolved: `requestReceivedOn + resolutionDays`, or
|
|
53
|
+
* `agreedResolutionOn`; `null` until a request date exists.
|
|
54
|
+
*/
|
|
35
55
|
resolutionDeadline: string | null;
|
|
36
56
|
}
|
|
37
57
|
/**
|
|
@@ -76,8 +96,8 @@ export interface BillingDeadlines {
|
|
|
76
96
|
* request exists without an invoice or before it, `agreedResolutionOn` is before the request,
|
|
77
97
|
* or a deadline would leave Temporal's range.
|
|
78
98
|
*
|
|
79
|
-
* @param dates
|
|
80
|
-
* @param windows
|
|
99
|
+
* @param dates The anchor date, and the invoice and request dates once they exist
|
|
100
|
+
* @param windows The three calendar-day windows, none defaulted, and an agreed resolution date
|
|
81
101
|
* @returns { invoiceDeadline, issuedByDeadline, disputeDeadline, requestedByDeadline, resolutionDeadline }, or null on invalid input
|
|
82
102
|
*
|
|
83
103
|
* @example billingTimeline({ anchorOn: "2026-03-01" }, { issueDays: 30, disputeDays: 30, resolutionDays: 30 }) // { invoiceDeadline: "2026-03-31", issuedByDeadline: null, disputeDeadline: null, requestedByDeadline: null, resolutionDeadline: null } (no invoice yet: a forecast)
|
|
@@ -43,8 +43,8 @@ import { isValidDate } from "../../plain/validate/isValidDate.js";
|
|
|
43
43
|
* request exists without an invoice or before it, `agreedResolutionOn` is before the request,
|
|
44
44
|
* or a deadline would leave Temporal's range.
|
|
45
45
|
*
|
|
46
|
-
* @param dates
|
|
47
|
-
* @param windows
|
|
46
|
+
* @param dates The anchor date, and the invoice and request dates once they exist
|
|
47
|
+
* @param windows The three calendar-day windows, none defaulted, and an agreed resolution date
|
|
48
48
|
* @returns { invoiceDeadline, issuedByDeadline, disputeDeadline, requestedByDeadline, resolutionDeadline }, or null on invalid input
|
|
49
49
|
*
|
|
50
50
|
* @example billingTimeline({ anchorOn: "2026-03-01" }, { issueDays: 30, disputeDays: 30, resolutionDays: 30 }) // { invoiceDeadline: "2026-03-31", issuedByDeadline: null, disputeDeadline: null, requestedByDeadline: null, resolutionDeadline: null } (no invoice yet: a forecast)
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
import type { FreeTimeBasis, FreeTimeOptions } from "../../types/index.js";
|
|
2
2
|
/** A band of chargeable-day ordinals and how many of the charged days fell in it. */
|
|
3
3
|
export interface TierBand {
|
|
4
|
-
/**
|
|
4
|
+
/** The first chargeable-day ordinal of the band, from 1. */
|
|
5
5
|
from: number;
|
|
6
|
-
/**
|
|
6
|
+
/** The last ordinal of the band, or `null` for the open final band. */
|
|
7
7
|
to: number | null;
|
|
8
|
-
/**
|
|
8
|
+
/** The number of charged days that fell in the band. */
|
|
9
9
|
days: number;
|
|
10
10
|
}
|
|
11
11
|
/** What `chargeableDays` returns: the day count an invoice bills, and the dates that back it. */
|
|
12
12
|
export interface FreeTimeCharges {
|
|
13
|
-
/**
|
|
13
|
+
/** The number of free days the dwell touched, at most the tariff's `freeDays`. */
|
|
14
14
|
freeDaysUsed: number;
|
|
15
|
-
/**
|
|
15
|
+
/** The number of counted days on or after `expiresAt` the dwell touched. */
|
|
16
16
|
chargeableDays: number;
|
|
17
17
|
/** The instant free time ended, as a UTC instant, as `freeTimeExpiry` reports it. */
|
|
18
18
|
expiresAt: string;
|
|
@@ -31,6 +31,13 @@ export type FreeTimeChargeOptions = FreeTimeOptions & {
|
|
|
31
31
|
* working days of `calendar`. No default; see `chargeableDays`.
|
|
32
32
|
*/
|
|
33
33
|
chargeBasis: FreeTimeBasis;
|
|
34
|
+
/**
|
|
35
|
+
* The last chargeable-day ordinal of each band, as strictly ascending positive whole numbers:
|
|
36
|
+
* `[5, 10]` is days 1–5, 6–10 and 11 onward. They are day bands, not rates. Every band is
|
|
37
|
+
* returned, an empty one with `days: 0`, and the last is always open.
|
|
38
|
+
*
|
|
39
|
+
* @defaultValue None. `byTier` is the single open band `{ from: 1, to: null }`.
|
|
40
|
+
*/
|
|
34
41
|
tiers?: number[];
|
|
35
42
|
};
|
|
36
43
|
/**
|
|
@@ -66,11 +73,6 @@ export type FreeTimeChargeOptions = FreeTimeOptions & {
|
|
|
66
73
|
* - **`freeDays` may be `0`** for a tariff with no free time: `expiresAt` is the start of day one,
|
|
67
74
|
* the first day counted on `basis` (under `"nextDay"`, the first after the event day), and days
|
|
68
75
|
* before it are neither free nor charged.
|
|
69
|
-
* - **`tiers` are day bands, not rates.** `[5, 10]` names the last chargeable-day ordinal of
|
|
70
|
-
* each band: days 1–5, 6–10 and 11 onward. Every band is returned, an empty one with
|
|
71
|
-
* `days: 0`, and the last is always open. Omitted, `byTier` is the single open band
|
|
72
|
-
* `{ from: 1, to: null }`. A list that is not strictly ascending positive whole numbers
|
|
73
|
-
* returns `null`.
|
|
74
76
|
* - Returns `null` when either instant is invalid, `clockEnd` is before `clockStart` (an
|
|
75
77
|
* inverted dwell is a data error), `freeDays` is not a whole number of at least `0`, the
|
|
76
78
|
* options fail as they do for `freeTimeExpiry`, `tiers` has a hole, an unsafe integer or does not ascend, or the walk would pass
|
|
@@ -79,7 +81,7 @@ export type FreeTimeChargeOptions = FreeTimeOptions & {
|
|
|
79
81
|
* @param clockStart ISO 8601 instant string of the event that starts the clock
|
|
80
82
|
* @param clockEnd ISO 8601 instant string of the event that stops it (gate-out or empty return)
|
|
81
83
|
* @param freeDays whole number of free days the tariff allows, 0 or more
|
|
82
|
-
* @param options
|
|
84
|
+
* @param options The tariff's counting terms for free time and for charged days, and the tier bands
|
|
83
85
|
* @returns the free days used, the chargeable days, the expiry, the charged dates and the days per tier band, or null on invalid input
|
|
84
86
|
*
|
|
85
87
|
* @example chargeableDays("2024-06-14T19:00:00Z", "2024-06-17T04:00:00Z", 3, { basis: "calendar", chargeBasis: "calendar", timeZone: "America/New_York", firstDay: "eventDay" }) // { freeDaysUsed: 3, chargeableDays: 0, expiresAt: "2024-06-17T04:00:00Z", chargedDates: [], byTier: [{ from: 1, to: null, days: 0 }] } (gate-out exactly at expiry is free)
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Temporal } from "@js-temporal/polyfill";
|
|
2
|
-
import { bandsByTier, parseFreeDays, parseFreeTimeTerms, parseTiers, walkFreeTime, } from "../../internal/index.js";
|
|
2
|
+
import { bandsByTier, instantFrom, parseFreeDays, parseFreeTimeTerms, parseTiers, walkFreeTime, } from "../../internal/index.js";
|
|
3
3
|
import { isValidInstant } from "../../precision/validate/isValidInstant.js";
|
|
4
4
|
/**
|
|
5
5
|
* Count the days a container is charged for between the start of its clock and its exit,
|
|
@@ -34,11 +34,6 @@ import { isValidInstant } from "../../precision/validate/isValidInstant.js";
|
|
|
34
34
|
* - **`freeDays` may be `0`** for a tariff with no free time: `expiresAt` is the start of day one,
|
|
35
35
|
* the first day counted on `basis` (under `"nextDay"`, the first after the event day), and days
|
|
36
36
|
* before it are neither free nor charged.
|
|
37
|
-
* - **`tiers` are day bands, not rates.** `[5, 10]` names the last chargeable-day ordinal of
|
|
38
|
-
* each band: days 1–5, 6–10 and 11 onward. Every band is returned, an empty one with
|
|
39
|
-
* `days: 0`, and the last is always open. Omitted, `byTier` is the single open band
|
|
40
|
-
* `{ from: 1, to: null }`. A list that is not strictly ascending positive whole numbers
|
|
41
|
-
* returns `null`.
|
|
42
37
|
* - Returns `null` when either instant is invalid, `clockEnd` is before `clockStart` (an
|
|
43
38
|
* inverted dwell is a data error), `freeDays` is not a whole number of at least `0`, the
|
|
44
39
|
* options fail as they do for `freeTimeExpiry`, `tiers` has a hole, an unsafe integer or does not ascend, or the walk would pass
|
|
@@ -47,7 +42,7 @@ import { isValidInstant } from "../../precision/validate/isValidInstant.js";
|
|
|
47
42
|
* @param clockStart ISO 8601 instant string of the event that starts the clock
|
|
48
43
|
* @param clockEnd ISO 8601 instant string of the event that stops it (gate-out or empty return)
|
|
49
44
|
* @param freeDays whole number of free days the tariff allows, 0 or more
|
|
50
|
-
* @param options
|
|
45
|
+
* @param options The tariff's counting terms for free time and for charged days, and the tier bands
|
|
51
46
|
* @returns the free days used, the chargeable days, the expiry, the charged dates and the days per tier band, or null on invalid input
|
|
52
47
|
*
|
|
53
48
|
* @example chargeableDays("2024-06-14T19:00:00Z", "2024-06-17T04:00:00Z", 3, { basis: "calendar", chargeBasis: "calendar", timeZone: "America/New_York", firstDay: "eventDay" }) // { freeDaysUsed: 3, chargeableDays: 0, expiresAt: "2024-06-17T04:00:00Z", chargedDates: [], byTier: [{ from: 1, to: null, days: 0 }] } (gate-out exactly at expiry is free)
|
|
@@ -76,8 +71,8 @@ export function chargeableDays(clockStart, clockEnd, freeDays, options) {
|
|
|
76
71
|
tiers === null) {
|
|
77
72
|
return null;
|
|
78
73
|
}
|
|
79
|
-
const start =
|
|
80
|
-
const end =
|
|
74
|
+
const start = instantFrom(clockStart).toZonedDateTimeISO(terms.timeZone);
|
|
75
|
+
const end = instantFrom(clockEnd).toZonedDateTimeISO(terms.timeZone);
|
|
81
76
|
if (Temporal.ZonedDateTime.compare(start, end) > 0) {
|
|
82
77
|
return null;
|
|
83
78
|
}
|
|
@@ -15,8 +15,9 @@ import type { Interval } from "../../types/index.js";
|
|
|
15
15
|
export type ClockEventType = "discharged" | "available" | "gatedOut" | "emptyReturned" | "emptyReleased" | "gatedIn" | "loaded";
|
|
16
16
|
/** A container event: what happened and the instant it happened. */
|
|
17
17
|
export interface ClockEvent {
|
|
18
|
+
/** What happened to the container, as one of the events a charging clock can start or end at. */
|
|
18
19
|
type: ClockEventType;
|
|
19
|
-
/** ISO 8601
|
|
20
|
+
/** The instant it happened, as an ISO 8601 string: `Z`, an offset, or a bracketed zone. */
|
|
20
21
|
at: string;
|
|
21
22
|
}
|
|
22
23
|
/** Which charge is being clocked. `combined` is the merged demurrage-and-detention clock. */
|
|
@@ -27,9 +28,18 @@ export type ClockDirection = "import" | "export";
|
|
|
27
28
|
export type ClockStartEvent = "discharged" | "available";
|
|
28
29
|
/** The options `demurrageClock` reads. */
|
|
29
30
|
export interface ClockOptions {
|
|
30
|
-
/**
|
|
31
|
+
/**
|
|
32
|
+
* The leg of the container's cycle, `"import"` or `"export"`; required, because the same scope
|
|
33
|
+
* runs between different events in each.
|
|
34
|
+
*/
|
|
31
35
|
direction: ClockDirection;
|
|
32
|
-
/**
|
|
36
|
+
/**
|
|
37
|
+
* Where an import demurrage, storage or combined clock starts: `"discharged"`, the classic
|
|
38
|
+
* definition, or `"available"` for tariffs that start at the availability date. Not read for
|
|
39
|
+
* export or detention.
|
|
40
|
+
*
|
|
41
|
+
* @defaultValue `"discharged"`
|
|
42
|
+
*/
|
|
33
43
|
startEvent?: ClockStartEvent;
|
|
34
44
|
}
|
|
35
45
|
/**
|
|
@@ -53,9 +63,8 @@ export interface ClockOptions {
|
|
|
53
63
|
*
|
|
54
64
|
* - **`direction` has no default.** The same scope name selects different events on the import and
|
|
55
65
|
* export legs, and guessing it from the events present would be a silent guess.
|
|
56
|
-
* - **`startEvent` is import only
|
|
57
|
-
*
|
|
58
|
-
* or export, so one options object can serve every scope on a leg. A tariff that starts at
|
|
66
|
+
* - **`startEvent` is import only.** It is not read for detention or export, so one options
|
|
67
|
+
* object can serve every scope on a leg. A tariff that starts at
|
|
59
68
|
* customs release (Hapag-Lloyd Japan) or ends export demurrage at the cut-off or the scheduled
|
|
60
69
|
* sailing passes that instant as the event's `at`; GMT does not invent an event for one tariff.
|
|
61
70
|
* - Events may be in any order, and every one must be `{ type, at }` with a known type and a
|
|
@@ -71,7 +80,7 @@ export interface ClockOptions {
|
|
|
71
80
|
*
|
|
72
81
|
* @param events the container's events, `{ type, at }`, `type` one of discharged, available, gatedOut, emptyReturned, emptyReleased, gatedIn, loaded
|
|
73
82
|
* @param scope "demurrage" | "detention" | "storage" | "combined"
|
|
74
|
-
* @param options
|
|
83
|
+
* @param options Which leg of the cycle the clock is on, and where an import clock starts
|
|
75
84
|
* @returns { start, end } of the requested clock, or null on invalid input
|
|
76
85
|
*
|
|
77
86
|
* @example demurrageClock([{ type: "discharged", at: "2024-06-14T19:00:00Z" }, { type: "available", at: "2024-06-15T12:00:00Z" }, { type: "gatedOut", at: "2024-06-20T14:30:00Z" }, { type: "emptyReturned", at: "2024-06-27T09:00:00Z" }], "demurrage", { direction: "import" }) / { start: "2024-06-14T19:00:00Z", end: "2024-06-20T14:30:00Z" }
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Temporal } from "@js-temporal/polyfill";
|
|
2
|
-
import { isObject } from "../../internal/index.js";
|
|
2
|
+
import { instantFrom, isObject } from "../../internal/index.js";
|
|
3
3
|
import { isValidInstant } from "../../precision/validate/isValidInstant.js";
|
|
4
|
+
import { optionOrDefault } from "../../internal/optionOrDefault.js";
|
|
4
5
|
const CLOCK_EVENT_TYPES = [
|
|
5
6
|
"discharged",
|
|
6
7
|
"available",
|
|
@@ -48,9 +49,8 @@ const EXPORT_CLOCKS = {
|
|
|
48
49
|
*
|
|
49
50
|
* - **`direction` has no default.** The same scope name selects different events on the import and
|
|
50
51
|
* export legs, and guessing it from the events present would be a silent guess.
|
|
51
|
-
* - **`startEvent` is import only
|
|
52
|
-
*
|
|
53
|
-
* or export, so one options object can serve every scope on a leg. A tariff that starts at
|
|
52
|
+
* - **`startEvent` is import only.** It is not read for detention or export, so one options
|
|
53
|
+
* object can serve every scope on a leg. A tariff that starts at
|
|
54
54
|
* customs release (Hapag-Lloyd Japan) or ends export demurrage at the cut-off or the scheduled
|
|
55
55
|
* sailing passes that instant as the event's `at`; GMT does not invent an event for one tariff.
|
|
56
56
|
* - Events may be in any order, and every one must be `{ type, at }` with a known type and a
|
|
@@ -66,7 +66,7 @@ const EXPORT_CLOCKS = {
|
|
|
66
66
|
*
|
|
67
67
|
* @param events the container's events, `{ type, at }`, `type` one of discharged, available, gatedOut, emptyReturned, emptyReleased, gatedIn, loaded
|
|
68
68
|
* @param scope "demurrage" | "detention" | "storage" | "combined"
|
|
69
|
-
* @param options
|
|
69
|
+
* @param options Which leg of the cycle the clock is on, and where an import clock starts
|
|
70
70
|
* @returns { start, end } of the requested clock, or null on invalid input
|
|
71
71
|
*
|
|
72
72
|
* @example demurrageClock([{ type: "discharged", at: "2024-06-14T19:00:00Z" }, { type: "available", at: "2024-06-15T12:00:00Z" }, { type: "gatedOut", at: "2024-06-20T14:30:00Z" }, { type: "emptyReturned", at: "2024-06-27T09:00:00Z" }], "demurrage", { direction: "import" }) / { start: "2024-06-14T19:00:00Z", end: "2024-06-20T14:30:00Z" }
|
|
@@ -107,7 +107,7 @@ function selectClock(events, scope, options) {
|
|
|
107
107
|
return null;
|
|
108
108
|
}
|
|
109
109
|
// An explicit `undefined` is an omission (TC39 GetOption); `null` is a value, and not a valid one.
|
|
110
|
-
const startEvent = options.startEvent
|
|
110
|
+
const startEvent = optionOrDefault(options.startEvent, "discharged");
|
|
111
111
|
if (!CLOCK_START_EVENTS.includes(startEvent)) {
|
|
112
112
|
return null;
|
|
113
113
|
}
|
|
@@ -134,7 +134,7 @@ function selectClock(events, scope, options) {
|
|
|
134
134
|
if (start === null || end === null) {
|
|
135
135
|
return null;
|
|
136
136
|
}
|
|
137
|
-
return Temporal.Instant.compare(
|
|
137
|
+
return Temporal.Instant.compare(instantFrom(start), instantFrom(end)) > 0
|
|
138
138
|
? null
|
|
139
139
|
: { start, end };
|
|
140
140
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { FreeTimeOptions } from "../../types/index.js";
|
|
2
2
|
/** What `freeTimeExpiry` returns: the free-time window as local dates, and the instant it ends. */
|
|
3
3
|
export interface FreeTime {
|
|
4
|
-
/**
|
|
4
|
+
/** The first free day, as a local date in the counting zone. */
|
|
5
5
|
freeTimeStart: string;
|
|
6
6
|
/** The last free day, as a local date in the counting zone. */
|
|
7
7
|
lastFreeDay: string;
|
|
@@ -19,8 +19,9 @@ export interface FreeTime {
|
|
|
19
19
|
* the free time allowed and the dates it starts and ends.
|
|
20
20
|
*
|
|
21
21
|
* - **Days are the terminal's local days.** `clockStart` is an instant (`Z`, an offset, or a
|
|
22
|
-
* bracketed zone, of which only the instant is read
|
|
23
|
-
*
|
|
22
|
+
* bracketed zone, of which only the instant is read, a minute-rounded offset as the zone's
|
|
23
|
+
* real one, as `isValidInstant` describes); its local date in `options.timeZone` is the
|
|
24
|
+
* event day. A container discharged at 23:00 has used a free day by 00:01 under
|
|
24
25
|
* `firstDay: "eventDay"`. Day boundaries are the zone's real ones, as `floorToZone` and
|
|
25
26
|
* `dwellTime` find them: a 23- or 25-hour day is one day, a date the zone deleted is never a
|
|
26
27
|
* free day, and a fall-back that re-enters an earlier date never moves the count backwards.
|
|
@@ -48,7 +49,7 @@ export interface FreeTime {
|
|
|
48
49
|
*
|
|
49
50
|
* @param clockStart ISO 8601 instant string of the event that starts the clock (discharge, availability or gate-out)
|
|
50
51
|
* @param freeDays whole number of free days the tariff allows, at least 1
|
|
51
|
-
* @param options
|
|
52
|
+
* @param options The tariff's counting terms: which days count, in which zone, and where day one starts
|
|
52
53
|
* @returns the free-time start and last free day as local dates, and the expiry instant, or null on invalid input
|
|
53
54
|
*
|
|
54
55
|
* @example freeTimeExpiry("2024-06-14T19:00:00Z", 3, { basis: "calendar", timeZone: "America/New_York", firstDay: "eventDay" }) // { freeTimeStart: "2024-06-14", lastFreeDay: "2024-06-16", expiresAt: "2024-06-17T04:00:00Z" } (a Friday discharge: the weekend is consumed)
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { parseFreeDays, parseFreeTimeTerms, walkFreeTime, } from "../../internal/index.js";
|
|
1
|
+
import { instantFrom, parseFreeDays, parseFreeTimeTerms, walkFreeTime, } from "../../internal/index.js";
|
|
3
2
|
import { isValidInstant } from "../../precision/validate/isValidInstant.js";
|
|
4
3
|
/**
|
|
5
4
|
* Lay out a container's free time from the instant its clock started, and say when it ends.
|
|
@@ -12,8 +11,9 @@ import { isValidInstant } from "../../precision/validate/isValidInstant.js";
|
|
|
12
11
|
* the free time allowed and the dates it starts and ends.
|
|
13
12
|
*
|
|
14
13
|
* - **Days are the terminal's local days.** `clockStart` is an instant (`Z`, an offset, or a
|
|
15
|
-
* bracketed zone, of which only the instant is read
|
|
16
|
-
*
|
|
14
|
+
* bracketed zone, of which only the instant is read, a minute-rounded offset as the zone's
|
|
15
|
+
* real one, as `isValidInstant` describes); its local date in `options.timeZone` is the
|
|
16
|
+
* event day. A container discharged at 23:00 has used a free day by 00:01 under
|
|
17
17
|
* `firstDay: "eventDay"`. Day boundaries are the zone's real ones, as `floorToZone` and
|
|
18
18
|
* `dwellTime` find them: a 23- or 25-hour day is one day, a date the zone deleted is never a
|
|
19
19
|
* free day, and a fall-back that re-enters an earlier date never moves the count backwards.
|
|
@@ -41,7 +41,7 @@ import { isValidInstant } from "../../precision/validate/isValidInstant.js";
|
|
|
41
41
|
*
|
|
42
42
|
* @param clockStart ISO 8601 instant string of the event that starts the clock (discharge, availability or gate-out)
|
|
43
43
|
* @param freeDays whole number of free days the tariff allows, at least 1
|
|
44
|
-
* @param options
|
|
44
|
+
* @param options The tariff's counting terms: which days count, in which zone, and where day one starts
|
|
45
45
|
* @returns the free-time start and last free day as local dates, and the expiry instant, or null on invalid input
|
|
46
46
|
*
|
|
47
47
|
* @example freeTimeExpiry("2024-06-14T19:00:00Z", 3, { basis: "calendar", timeZone: "America/New_York", firstDay: "eventDay" }) // { freeTimeStart: "2024-06-14", lastFreeDay: "2024-06-16", expiresAt: "2024-06-17T04:00:00Z" } (a Friday discharge: the weekend is consumed)
|
|
@@ -63,7 +63,7 @@ export function freeTimeExpiry(clockStart, freeDays, options) {
|
|
|
63
63
|
if (!isValidInstant(clockStart) || terms === null || allowed === null) {
|
|
64
64
|
return null;
|
|
65
65
|
}
|
|
66
|
-
const start =
|
|
66
|
+
const start = instantFrom(clockStart).toZonedDateTimeISO(terms.timeZone);
|
|
67
67
|
const ledger = walkFreeTime(start, allowed, terms);
|
|
68
68
|
if (ledger === null) {
|
|
69
69
|
return null;
|
|
@@ -11,6 +11,11 @@ export type ResolvedBusinessCalendar = {
|
|
|
11
11
|
holidays: Set<string>;
|
|
12
12
|
};
|
|
13
13
|
export declare const DEFAULT_BUSINESS_CALENDAR: ResolvedBusinessCalendar;
|
|
14
|
+
/**
|
|
15
|
+
* Reduce a holiday list to its normalised ISO dates, or `null` when it is not an array of ISO
|
|
16
|
+
* PlainDate strings. Shared with `OperatingSchedule.holidays`, which takes the same list.
|
|
17
|
+
*/
|
|
18
|
+
export declare function parseHolidays(holidays: unknown): Set<string> | null;
|
|
14
19
|
/**
|
|
15
20
|
* Reduce a caller-supplied `BusinessCalendar` to its lookups, or `null` when it is not one.
|
|
16
21
|
*
|
|
@@ -29,7 +29,11 @@ function parseWeekend(weekend) {
|
|
|
29
29
|
// All seven weekdays closed leaves no business day, so every walk would run to its cap.
|
|
30
30
|
return days.size < ISO_WEEKDAYS ? days : null;
|
|
31
31
|
}
|
|
32
|
-
|
|
32
|
+
/**
|
|
33
|
+
* Reduce a holiday list to its normalised ISO dates, or `null` when it is not an array of ISO
|
|
34
|
+
* PlainDate strings. Shared with `OperatingSchedule.holidays`, which takes the same list.
|
|
35
|
+
*/
|
|
36
|
+
export function parseHolidays(holidays) {
|
|
33
37
|
if (!Array.isArray(holidays)) {
|
|
34
38
|
return null;
|
|
35
39
|
}
|
|
@@ -8,10 +8,12 @@
|
|
|
8
8
|
* not by repeatedly correcting a single overflow.
|
|
9
9
|
* - Round path is **not** "round to nearest": it steps by `Math.sign(amount)` first, then snaps to
|
|
10
10
|
* the next multiple of `Math.abs(amount)` in the direction of that sign (ceiling for positive
|
|
11
|
-
* amounts, floor for negative). Multiples are relative to `0`, not `bounds.min`.
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
* (the next multiple of 15 above 22), not `15` (the nearest multiple).
|
|
11
|
+
* amounts, floor for negative). Multiples are relative to `0`, not `bounds.min`. GMT's own
|
|
12
|
+
* rule, not a standard's: a cycle always moves the way `amount` points, and the nearest
|
|
13
|
+
* multiple can lie the other way — e.g. minute `22` cycled by `+15` with `round: true` lands on
|
|
14
|
+
* `30` (the next multiple of 15 above 22), not `15` (the nearest multiple).
|
|
15
|
+
* - Comparison: `@internationalized/date`'s `CycleOptions.round` rounds a bounded field the same
|
|
16
|
+
* way.
|
|
15
17
|
*
|
|
16
18
|
* @param current the field's current numeric value
|
|
17
19
|
* @param amount signed amount to cycle by
|
|
@@ -8,10 +8,12 @@
|
|
|
8
8
|
* not by repeatedly correcting a single overflow.
|
|
9
9
|
* - Round path is **not** "round to nearest": it steps by `Math.sign(amount)` first, then snaps to
|
|
10
10
|
* the next multiple of `Math.abs(amount)` in the direction of that sign (ceiling for positive
|
|
11
|
-
* amounts, floor for negative). Multiples are relative to `0`, not `bounds.min`.
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
* (the next multiple of 15 above 22), not `15` (the nearest multiple).
|
|
11
|
+
* amounts, floor for negative). Multiples are relative to `0`, not `bounds.min`. GMT's own
|
|
12
|
+
* rule, not a standard's: a cycle always moves the way `amount` points, and the nearest
|
|
13
|
+
* multiple can lie the other way — e.g. minute `22` cycled by `+15` with `round: true` lands on
|
|
14
|
+
* `30` (the next multiple of 15 above 22), not `15` (the nearest multiple).
|
|
15
|
+
* - Comparison: `@internationalized/date`'s `CycleOptions.round` rounds a bounded field the same
|
|
16
|
+
* way.
|
|
15
17
|
*
|
|
16
18
|
* @param current the field's current numeric value
|
|
17
19
|
* @param amount signed amount to cycle by
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { Temporal } from "@js-temporal/polyfill";
|
|
2
|
+
/**
|
|
3
|
+
* Whether an instant is in daylight saving time, read from the zone's offset changes alone.
|
|
4
|
+
*
|
|
5
|
+
* The rule: daylight time runs from a forward change of the clocks to the backward change that
|
|
6
|
+
* undoes it. A backward change undoes the most recent forward change of the same size that is not
|
|
7
|
+
* yet undone, and only if it comes less than 365 days after it. An instant is in daylight time when
|
|
8
|
+
* it is at or after such a forward change and before the backward change paired with it.
|
|
9
|
+
*
|
|
10
|
+
* A forward change that is never undone, or undone a year or more later, is a change of standard
|
|
11
|
+
* time (`Europe/Istanbul` 2016, `Europe/Moscow` 2011 to 2014), as is any backward change with no
|
|
12
|
+
* forward change to undo (`Asia/Almaty` 2024).
|
|
13
|
+
*
|
|
14
|
+
* This is GMT's own definition, not the tz database's daylight flag, which no JavaScript API
|
|
15
|
+
* exposes and offsets do not determine.
|
|
16
|
+
*
|
|
17
|
+
* Cost: one transition lookup forward, then one back, and more only outside the ordinary summer
|
|
18
|
+
* case. A paired change is less than 365 days away, so every lookup is given that limit and reads
|
|
19
|
+
* no further: with GMT's own search (temporalCompat D13) at most 74 offset samples and 51 reads to
|
|
20
|
+
* pin a change, for any zone and any instant.
|
|
21
|
+
*
|
|
22
|
+
* @param zoned the instant, in the zone to read
|
|
23
|
+
* @returns true in daylight time, false in standard time or when the walk exceeds its bound
|
|
24
|
+
*/
|
|
25
|
+
export declare function isInDaylightTime(zoned: Temporal.ZonedDateTime): boolean;
|
|
26
|
+
/**
|
|
27
|
+
* Whether a zone observes daylight saving time as of an instant: the instant is in daylight time,
|
|
28
|
+
* or a daylight period begins within the 365 days after it. Same rule as `isInDaylightTime`.
|
|
29
|
+
*
|
|
30
|
+
* @param zoned the instant to judge from, in the zone to read
|
|
31
|
+
* @returns true when the zone observes daylight time then, false otherwise or past the walk bound
|
|
32
|
+
*/
|
|
33
|
+
export declare function observesDaylightTime(zoned: Temporal.ZonedDateTime): boolean;
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { zonedNextTransition, zonedPreviousTransition, } from "./zonedWallClockOperations.js";
|
|
2
|
+
/**
|
|
3
|
+
* The longest a daylight period can last: a forward change and the backward change that undoes it
|
|
4
|
+
* are less than 365 days apart. Daylight time is seasonal, so it recurs within every year, and
|
|
5
|
+
* 365 days is the shortest year. A longer advance is a change of standard time.
|
|
6
|
+
*/
|
|
7
|
+
const DAYLIGHT_PERIOD_LIMIT_NANOSECONDS = 365n * 86400000000000n;
|
|
8
|
+
/**
|
|
9
|
+
* Offset changes read in each direction before the walk gives up and answers `false`, the
|
|
10
|
+
* sentinel: a bounded loop that runs out never returns a partial answer. Every walk here is also
|
|
11
|
+
* limited to 365 days, and a year of `Africa/Casablanca` holds four changes, so no real zone
|
|
12
|
+
* reaches the bound; `daylightTime.test.ts` reaches it with a made-up zone.
|
|
13
|
+
*/
|
|
14
|
+
const MAX_WALKED_CHANGES = 64;
|
|
15
|
+
function offsetChangeAt(transition) {
|
|
16
|
+
return {
|
|
17
|
+
at: transition.epochNanoseconds,
|
|
18
|
+
step: transition.offsetNanoseconds -
|
|
19
|
+
transition.subtract({ nanoseconds: 1 }).offsetNanoseconds,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Apply one change to the list of advances not yet undone. A forward change joins the list. A
|
|
24
|
+
* backward change undoes the most recent advance of the same size, if that advance is less than
|
|
25
|
+
* 365 days old, and returns it; otherwise it undoes nothing.
|
|
26
|
+
*/
|
|
27
|
+
function applyChange(open, change) {
|
|
28
|
+
if (change.step > 0) {
|
|
29
|
+
open.push(change);
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
for (let i = open.length - 1; i >= 0; i--) {
|
|
33
|
+
if (open[i].step !== -change.step) {
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
if (change.at - open[i].at >= DAYLIGHT_PERIOD_LIMIT_NANOSECONDS) {
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
return open.splice(i, 1)[0];
|
|
40
|
+
}
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
/** Whether `to` is less than the daylight period limit after `from`. */
|
|
44
|
+
function isWithinLimit(from, to) {
|
|
45
|
+
return to - from < DAYLIGHT_PERIOD_LIMIT_NANOSECONDS;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* The advances still open just before `next`: made in the 365 days before it and not yet undone.
|
|
49
|
+
* An older advance cannot be undone at or after `next`. Null past `MAX_WALKED_CHANGES` changes.
|
|
50
|
+
*
|
|
51
|
+
* @param next the first change after the instant being judged
|
|
52
|
+
* @param latest the change before `next`, already known to be within the limit
|
|
53
|
+
*/
|
|
54
|
+
function openAdvancesBefore(next, latest) {
|
|
55
|
+
const changes = [offsetChangeAt(latest)];
|
|
56
|
+
let cursor = latest;
|
|
57
|
+
for (let i = 0; i <= MAX_WALKED_CHANGES; i++) {
|
|
58
|
+
const previous = zonedPreviousTransition(cursor, next.epochNanoseconds - DAYLIGHT_PERIOD_LIMIT_NANOSECONDS);
|
|
59
|
+
if (previous === null ||
|
|
60
|
+
!isWithinLimit(previous.epochNanoseconds, next.epochNanoseconds)) {
|
|
61
|
+
const open = [];
|
|
62
|
+
for (const change of changes) {
|
|
63
|
+
applyChange(open, change);
|
|
64
|
+
}
|
|
65
|
+
return open;
|
|
66
|
+
}
|
|
67
|
+
changes.unshift(offsetChangeAt(previous));
|
|
68
|
+
cursor = previous;
|
|
69
|
+
}
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Whether a change from `next` onwards undoes one of the `open` advances made at or before `at`.
|
|
74
|
+
* It has to come less than 365 days after `at`, since the advance is no later than `at`.
|
|
75
|
+
*/
|
|
76
|
+
function isUndoneFrom(next, open, at) {
|
|
77
|
+
let cursor = next;
|
|
78
|
+
for (let i = 0; i <= MAX_WALKED_CHANGES; i++) {
|
|
79
|
+
if (cursor === null || !isWithinLimit(at, cursor.epochNanoseconds)) {
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
const undone = applyChange(open, offsetChangeAt(cursor));
|
|
83
|
+
if (undone !== null && undone.at <= at) {
|
|
84
|
+
return true;
|
|
85
|
+
}
|
|
86
|
+
cursor = zonedNextTransition(cursor, at + DAYLIGHT_PERIOD_LIMIT_NANOSECONDS);
|
|
87
|
+
}
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Whether an instant is in daylight saving time, read from the zone's offset changes alone.
|
|
92
|
+
*
|
|
93
|
+
* The rule: daylight time runs from a forward change of the clocks to the backward change that
|
|
94
|
+
* undoes it. A backward change undoes the most recent forward change of the same size that is not
|
|
95
|
+
* yet undone, and only if it comes less than 365 days after it. An instant is in daylight time when
|
|
96
|
+
* it is at or after such a forward change and before the backward change paired with it.
|
|
97
|
+
*
|
|
98
|
+
* A forward change that is never undone, or undone a year or more later, is a change of standard
|
|
99
|
+
* time (`Europe/Istanbul` 2016, `Europe/Moscow` 2011 to 2014), as is any backward change with no
|
|
100
|
+
* forward change to undo (`Asia/Almaty` 2024).
|
|
101
|
+
*
|
|
102
|
+
* This is GMT's own definition, not the tz database's daylight flag, which no JavaScript API
|
|
103
|
+
* exposes and offsets do not determine.
|
|
104
|
+
*
|
|
105
|
+
* Cost: one transition lookup forward, then one back, and more only outside the ordinary summer
|
|
106
|
+
* case. A paired change is less than 365 days away, so every lookup is given that limit and reads
|
|
107
|
+
* no further: with GMT's own search (temporalCompat D13) at most 74 offset samples and 51 reads to
|
|
108
|
+
* pin a change, for any zone and any instant.
|
|
109
|
+
*
|
|
110
|
+
* @param zoned the instant, in the zone to read
|
|
111
|
+
* @returns true in daylight time, false in standard time or when the walk exceeds its bound
|
|
112
|
+
*/
|
|
113
|
+
export function isInDaylightTime(zoned) {
|
|
114
|
+
const at = zoned.epochNanoseconds;
|
|
115
|
+
// Daylight time ends with a clock change. No change ahead, or none within the limit: standard.
|
|
116
|
+
const next = zonedNextTransition(zoned, at + DAYLIGHT_PERIOD_LIMIT_NANOSECONDS);
|
|
117
|
+
if (next === null || !isWithinLimit(at, next.epochNanoseconds)) {
|
|
118
|
+
return false;
|
|
119
|
+
}
|
|
120
|
+
// It begins with one too, and no change in the 365 days before `next` leaves nothing to undo.
|
|
121
|
+
const latest = zonedPreviousTransition(next, next.epochNanoseconds - DAYLIGHT_PERIOD_LIMIT_NANOSECONDS);
|
|
122
|
+
if (latest === null ||
|
|
123
|
+
!isWithinLimit(latest.epochNanoseconds, next.epochNanoseconds)) {
|
|
124
|
+
return false;
|
|
125
|
+
}
|
|
126
|
+
// The ordinary summer: the clocks last went forward, and next go back by as much. The latest
|
|
127
|
+
// advance is the most recent one open, so `next` undoes it whatever came before.
|
|
128
|
+
const latestStep = offsetChangeAt(latest).step;
|
|
129
|
+
const nextStep = next.offsetNanoseconds - zoned.offsetNanoseconds;
|
|
130
|
+
if (latestStep > 0 && nextStep === -latestStep) {
|
|
131
|
+
return true;
|
|
132
|
+
}
|
|
133
|
+
const open = openAdvancesBefore(next, latest);
|
|
134
|
+
if (open === null || open.length === 0) {
|
|
135
|
+
return false;
|
|
136
|
+
}
|
|
137
|
+
return isUndoneFrom(next, open, at);
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Whether a zone observes daylight saving time as of an instant: the instant is in daylight time,
|
|
141
|
+
* or a daylight period begins within the 365 days after it. Same rule as `isInDaylightTime`.
|
|
142
|
+
*
|
|
143
|
+
* @param zoned the instant to judge from, in the zone to read
|
|
144
|
+
* @returns true when the zone observes daylight time then, false otherwise or past the walk bound
|
|
145
|
+
*/
|
|
146
|
+
export function observesDaylightTime(zoned) {
|
|
147
|
+
if (isInDaylightTime(zoned)) {
|
|
148
|
+
return true;
|
|
149
|
+
}
|
|
150
|
+
let cursor = zoned;
|
|
151
|
+
for (let i = 0; i <= MAX_WALKED_CHANGES; i++) {
|
|
152
|
+
const next = zonedNextTransition(cursor, zoned.epochNanoseconds + DAYLIGHT_PERIOD_LIMIT_NANOSECONDS);
|
|
153
|
+
if (next === null ||
|
|
154
|
+
next.epochNanoseconds - zoned.epochNanoseconds >=
|
|
155
|
+
DAYLIGHT_PERIOD_LIMIT_NANOSECONDS) {
|
|
156
|
+
return false;
|
|
157
|
+
}
|
|
158
|
+
if (isInDaylightTime(next)) {
|
|
159
|
+
return true;
|
|
160
|
+
}
|
|
161
|
+
cursor = next;
|
|
162
|
+
}
|
|
163
|
+
return false;
|
|
164
|
+
}
|