@northguild/gmt 1.16.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 +742 -21
- 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/index.d.ts +2 -0
- package/dist/index.js +2 -0
- 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 +6 -12
- package/dist/instant/convert/resolveLocal.d.ts +12 -7
- package/dist/instant/convert/resolveLocal.js +6 -10
- package/dist/instant/convert/toOffsetInstant.d.ts +37 -1
- package/dist/instant/convert/toOffsetInstant.js +12 -28
- package/dist/intermodal/calculate/billingTimeline.d.ts +114 -0
- package/dist/intermodal/calculate/billingTimeline.js +168 -0
- package/dist/intermodal/calculate/chargeableDays.d.ts +100 -0
- package/dist/intermodal/calculate/chargeableDays.js +96 -0
- package/dist/intermodal/calculate/demurrageClock.d.ts +102 -0
- package/dist/intermodal/calculate/demurrageClock.js +140 -0
- package/dist/intermodal/calculate/freeTimeExpiry.d.ts +67 -0
- package/dist/intermodal/calculate/freeTimeExpiry.js +82 -0
- package/dist/intermodal/calculate/index.d.ts +4 -0
- package/dist/intermodal/calculate/index.js +4 -0
- package/dist/intermodal/index.d.ts +2 -0
- package/dist/intermodal/index.js +3 -0
- 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/freeTimeLedger.d.ts +93 -0
- package/dist/internal/freeTimeLedger.js +262 -0
- package/dist/internal/index.d.ts +10 -3
- package/dist/internal/index.js +10 -3
- 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/isoStringBody.d.ts +26 -0
- package/dist/internal/isoStringBody.js +22 -2
- 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/wallClockAtOffset.d.ts +22 -0
- package/dist/internal/wallClockAtOffset.js +26 -0
- 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/zonedWallClockDifference.js +5 -4
- 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 +81 -0
- package/dist/transport/calculate/dwellTime.js +130 -0
- package/dist/transport/calculate/estimateDrift.d.ts +65 -0
- package/dist/transport/calculate/estimateDrift.js +75 -0
- package/dist/transport/calculate/index.d.ts +10 -0
- package/dist/transport/calculate/index.js +10 -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 +71 -0
- package/dist/transport/calculate/transitTime.js +101 -0
- 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 +43 -0
- package/dist/transport/convert/etaAtZone.js +58 -0
- package/dist/transport/convert/index.d.ts +1 -0
- package/dist/transport/convert/index.js +1 -0
- package/dist/transport/index.d.ts +4 -0
- package/dist/transport/index.js +5 -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 +44 -0
- package/dist/types/index.d.ts +3 -1
- package/dist/types/index.js +3 -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/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/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 +53 -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 +210 -14
- 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 → free-time-options.js} +0 -0
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The value of an option that was read once, or its default when the option is absent.
|
|
3
|
+
*
|
|
4
|
+
* - ECMA-402 `GetOption` (the Temporal specification defines the same operation) reads the
|
|
5
|
+
* property with one `Get` and returns the default only when that value is `undefined`. Pass
|
|
6
|
+
* the property read as the argument, so the option is read exactly once: a getter cannot
|
|
7
|
+
* answer one value to the check and another to the use.
|
|
8
|
+
* - `null` is a value, not an omission, so it is returned as it is for the caller to validate.
|
|
9
|
+
*
|
|
10
|
+
* @param value the option as read from the caller's object, `undefined` when absent
|
|
11
|
+
* @param fallback the documented default
|
|
12
|
+
* @returns `fallback` when `value` is `undefined`, otherwise `value`
|
|
13
|
+
*
|
|
14
|
+
* @example optionOrDefault(undefined, "compatible") // "compatible"
|
|
15
|
+
* @example optionOrDefault("later", "compatible") // "later"
|
|
16
|
+
* @example optionOrDefault(null, true) // null (a value for the caller to validate)
|
|
17
|
+
*/
|
|
18
|
+
export function optionOrDefault(value, fallback) {
|
|
19
|
+
return value === undefined ? fallback : value;
|
|
20
|
+
}
|
|
@@ -3,8 +3,8 @@ import { type LocalesArgument } from "./resolveLocale.js";
|
|
|
3
3
|
* Shared token-pattern engine for J11's `parse*WithPattern` family.
|
|
4
4
|
*
|
|
5
5
|
* This is GMT's one named exception to `context/coding-standards.md`'s
|
|
6
|
-
* "manual string parsing" prohibition (
|
|
7
|
-
*
|
|
6
|
+
* "manual string parsing" prohibition (its section "Scoped exception:
|
|
7
|
+
* manual string parsing"). The exception is scoped to this module
|
|
8
8
|
* and the three `parse*WithPattern` public functions, and is bound by
|
|
9
9
|
* three rules, enforced throughout this file:
|
|
10
10
|
* 1. The regex is always built *from the pattern string itself* at call
|
|
@@ -24,9 +24,10 @@ export const DATE_TIME_PATTERN_FIELDS = new Set([
|
|
|
24
24
|
...DATE_PATTERN_FIELDS,
|
|
25
25
|
...TIME_PATTERN_FIELDS,
|
|
26
26
|
]);
|
|
27
|
-
// Recognized vocabulary letters
|
|
28
|
-
//
|
|
29
|
-
//
|
|
27
|
+
// Recognized vocabulary letters: a subset of the UTS #35 Date Field Symbol
|
|
28
|
+
// Table, with its field lengths (`MMM` abbreviated, `MMMM` wide), restricted
|
|
29
|
+
// to what's unambiguous to parse — no offset/zone-name tokens since this
|
|
30
|
+
// story is plain-only (Decision 1). Any other unquoted letter in a pattern
|
|
30
31
|
// is malformed. Numeric ranges are baked into each regex so a shape
|
|
31
32
|
// mismatch (e.g. "13" for a 12-hour token) fails at the regex stage,
|
|
32
33
|
// before ever reaching Temporal.
|
|
@@ -78,13 +79,21 @@ const VOCABULARY_LETTERS = "yMdHhmsSEaG";
|
|
|
78
79
|
/**
|
|
79
80
|
* Split a pattern string into literal and letter-run parts.
|
|
80
81
|
*
|
|
81
|
-
*
|
|
82
|
-
*
|
|
83
|
-
*
|
|
84
|
-
*
|
|
85
|
-
*
|
|
86
|
-
*
|
|
87
|
-
*
|
|
82
|
+
* Literal text follows UTS #35 Part 4, Date Format Patterns
|
|
83
|
+
* (https://unicode.org/reports/tr35/tr35-dates.html#Date_Format_Patterns):
|
|
84
|
+
* - "Any characters other than A..Z and a..z, including spaces and
|
|
85
|
+
* punctuation" are literals with no quoting.
|
|
86
|
+
* - "Any text between single vertical quotes ('xxxx'), which may include
|
|
87
|
+
* A..Z and a..z as literal text."
|
|
88
|
+
* - "Two adjacent single vertical quotes (''), which represent a literal
|
|
89
|
+
* single quote, either inside or outside quoted text."
|
|
90
|
+
*
|
|
91
|
+
* The pattern is read left to right, so a `''` pair is taken before a
|
|
92
|
+
* lone `'` is read as opening or closing quoted text: `''''` is two
|
|
93
|
+
* literal quotes, and `'''T'` is a literal quote followed by the quoted
|
|
94
|
+
* text `T`. UTS #35 defines quoted text only as text *between* two
|
|
95
|
+
* quotes, so a quote that never closes has no defined meaning and the
|
|
96
|
+
* pattern is malformed (`null`).
|
|
88
97
|
*/
|
|
89
98
|
function tokenizePattern(pattern) {
|
|
90
99
|
const parts = [];
|
|
@@ -92,6 +101,12 @@ function tokenizePattern(pattern) {
|
|
|
92
101
|
while (i < pattern.length) {
|
|
93
102
|
const ch = pattern[i];
|
|
94
103
|
if (ch === "'") {
|
|
104
|
+
// `''` outside quoted text: one literal quote, no quoted text opened.
|
|
105
|
+
if (pattern[i + 1] === "'") {
|
|
106
|
+
parts.push({ type: "literal", text: "'" });
|
|
107
|
+
i += 2;
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
95
110
|
let j = i + 1;
|
|
96
111
|
let text = "";
|
|
97
112
|
let closed = false;
|
|
@@ -109,9 +124,9 @@ function tokenizePattern(pattern) {
|
|
|
109
124
|
text += pattern[j];
|
|
110
125
|
j += 1;
|
|
111
126
|
}
|
|
112
|
-
//
|
|
113
|
-
//
|
|
114
|
-
// have closed.
|
|
127
|
+
// UTS #35 gives quoted text a meaning only between two quotes, so
|
|
128
|
+
// an unterminated quote is a malformed pattern, not a guess at
|
|
129
|
+
// where it should have closed.
|
|
115
130
|
if (!closed)
|
|
116
131
|
return null;
|
|
117
132
|
parts.push({ type: "literal", text });
|
|
@@ -24,16 +24,20 @@ function singularDateUnit(unit) {
|
|
|
24
24
|
* @example plainDateUntil(Temporal.PlainDate.from("2024-01-31"), Temporal.PlainDate.from("2024-03-01"), "months").toString() // "P1M1D"
|
|
25
25
|
*/
|
|
26
26
|
export function plainDateUntil(start, end, largestUnit, options) {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
27
|
+
// Each option is read once (GetOption).
|
|
28
|
+
const smallestUnit = options?.smallestUnit;
|
|
29
|
+
const roundingIncrement = options?.roundingIncrement;
|
|
30
|
+
const roundingMode = options?.roundingMode;
|
|
31
|
+
if (smallestUnit === undefined &&
|
|
32
|
+
roundingIncrement === undefined &&
|
|
33
|
+
roundingMode === undefined) {
|
|
30
34
|
return Temporal.Duration.from(calendarDateUntil(start, end, singularDateUnit(largestUnit)));
|
|
31
35
|
}
|
|
32
36
|
const untilOptions = {
|
|
33
37
|
largestUnit: largestUnit,
|
|
34
|
-
smallestUnit
|
|
35
|
-
roundingIncrement
|
|
36
|
-
roundingMode
|
|
38
|
+
smallestUnit,
|
|
39
|
+
roundingIncrement,
|
|
40
|
+
roundingMode,
|
|
37
41
|
};
|
|
38
42
|
// No D11 term here. The nudge window can only miss its target when the target sits strictly
|
|
39
43
|
// between the window bounds by a sub-day amount, which is why every D11 case carries a time
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { Punctuality } from "../types/index.js";
|
|
2
|
+
/** A `PunctualityTolerance` as non-negative exact nanoseconds; `early` is `null` when absent. */
|
|
3
|
+
export type ToleranceNanoseconds = {
|
|
4
|
+
late: bigint;
|
|
5
|
+
early: bigint | null;
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* Read a `PunctualityTolerance` once into exact nanoseconds, or `null` when it is invalid.
|
|
9
|
+
*
|
|
10
|
+
* - `late` and `early` are each read exactly once, so a caller that classifies many pairs under
|
|
11
|
+
* one tolerance really uses one tolerance, whatever a getter returns on a later read.
|
|
12
|
+
* - Each bound is an exact duration (a day is 24 hours; years, months and weeks refused) and not
|
|
13
|
+
* negative (`-PT0S` is zero). `late` is required; `early: undefined` is absent and
|
|
14
|
+
* `early: null` is invalid.
|
|
15
|
+
* - A hostile value (a throwing getter, a revoked Proxy) is invalid input: `null`, never a throw.
|
|
16
|
+
*
|
|
17
|
+
* @param tolerance candidate `{ late, early? }`
|
|
18
|
+
* @returns the bounds in nanoseconds, or null on invalid input
|
|
19
|
+
*
|
|
20
|
+
* @example parsePunctualityTolerance({ late: "PT15M" }) // { late: 900000000000n, early: null }
|
|
21
|
+
* @example parsePunctualityTolerance({ late: "-PT15M" }) // null
|
|
22
|
+
*/
|
|
23
|
+
export declare function parsePunctualityTolerance(tolerance: unknown): ToleranceNanoseconds | null;
|
|
24
|
+
/**
|
|
25
|
+
* Classify a deviation (actual − planned, exact nanoseconds) against a tolerance.
|
|
26
|
+
*
|
|
27
|
+
* Late when the deviation is `late` or more; early when `early` is set and the deviation is
|
|
28
|
+
* `-early` or less; on time strictly between. Late is checked first, so with both bounds zero the
|
|
29
|
+
* plan itself is late.
|
|
30
|
+
*
|
|
31
|
+
* @param deviation actual minus planned, in nanoseconds
|
|
32
|
+
* @param tolerance the bounds from `parsePunctualityTolerance`
|
|
33
|
+
* @returns "early", "onTime" or "late"
|
|
34
|
+
*
|
|
35
|
+
* @example punctualityOf(900000000000n, { late: 900000000000n, early: null }) // "late"
|
|
36
|
+
* @example punctualityOf(0n, { late: 900000000000n, early: 0n }) // "early"
|
|
37
|
+
*/
|
|
38
|
+
export declare function punctualityOf(deviation: bigint, tolerance: ToleranceNanoseconds): Punctuality;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { nonNegativeExactDurationNanoseconds } from "./exactDuration.js";
|
|
2
|
+
import { isObject } from "./isObject.js";
|
|
3
|
+
/**
|
|
4
|
+
* Read a `PunctualityTolerance` once into exact nanoseconds, or `null` when it is invalid.
|
|
5
|
+
*
|
|
6
|
+
* - `late` and `early` are each read exactly once, so a caller that classifies many pairs under
|
|
7
|
+
* one tolerance really uses one tolerance, whatever a getter returns on a later read.
|
|
8
|
+
* - Each bound is an exact duration (a day is 24 hours; years, months and weeks refused) and not
|
|
9
|
+
* negative (`-PT0S` is zero). `late` is required; `early: undefined` is absent and
|
|
10
|
+
* `early: null` is invalid.
|
|
11
|
+
* - A hostile value (a throwing getter, a revoked Proxy) is invalid input: `null`, never a throw.
|
|
12
|
+
*
|
|
13
|
+
* @param tolerance candidate `{ late, early? }`
|
|
14
|
+
* @returns the bounds in nanoseconds, or null on invalid input
|
|
15
|
+
*
|
|
16
|
+
* @example parsePunctualityTolerance({ late: "PT15M" }) // { late: 900000000000n, early: null }
|
|
17
|
+
* @example parsePunctualityTolerance({ late: "-PT15M" }) // null
|
|
18
|
+
*/
|
|
19
|
+
export function parsePunctualityTolerance(tolerance) {
|
|
20
|
+
try {
|
|
21
|
+
if (!isObject(tolerance)) {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
const { late, early } = tolerance;
|
|
25
|
+
const lateNanoseconds = nonNegativeExactDurationNanoseconds(late);
|
|
26
|
+
const earlyNanoseconds = early === undefined ? null : nonNegativeExactDurationNanoseconds(early);
|
|
27
|
+
if (lateNanoseconds === null ||
|
|
28
|
+
(early !== undefined && earlyNanoseconds === null)) {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
return { late: lateNanoseconds, early: earlyNanoseconds };
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Classify a deviation (actual − planned, exact nanoseconds) against a tolerance.
|
|
39
|
+
*
|
|
40
|
+
* Late when the deviation is `late` or more; early when `early` is set and the deviation is
|
|
41
|
+
* `-early` or less; on time strictly between. Late is checked first, so with both bounds zero the
|
|
42
|
+
* plan itself is late.
|
|
43
|
+
*
|
|
44
|
+
* @param deviation actual minus planned, in nanoseconds
|
|
45
|
+
* @param tolerance the bounds from `parsePunctualityTolerance`
|
|
46
|
+
* @returns "early", "onTime" or "late"
|
|
47
|
+
*
|
|
48
|
+
* @example punctualityOf(900000000000n, { late: 900000000000n, early: null }) // "late"
|
|
49
|
+
* @example punctualityOf(0n, { late: 900000000000n, early: 0n }) // "early"
|
|
50
|
+
*/
|
|
51
|
+
export function punctualityOf(deviation, tolerance) {
|
|
52
|
+
if (deviation >= tolerance.late) {
|
|
53
|
+
return "late";
|
|
54
|
+
}
|
|
55
|
+
if (tolerance.early !== null && deviation <= -tolerance.early) {
|
|
56
|
+
return "early";
|
|
57
|
+
}
|
|
58
|
+
return "onTime";
|
|
59
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Read a caller's `Intl.DateTimeFormat` options once, into a plain object of primitives.
|
|
3
|
+
*
|
|
4
|
+
* - A formatter that inspects the options before it hands them to `Intl.DateTimeFormat` would
|
|
5
|
+
* otherwise read each one several times, and a getter could answer one value to the check and
|
|
6
|
+
* another to the formatter. ECMA-402 CreateDateTimeFormat reads each option with one `Get`
|
|
7
|
+
* (GetOption); this does the same, in the same order, and everything after works on the copy.
|
|
8
|
+
* - Each value is converted once as well, right after its `Get`, as GetOption converts it:
|
|
9
|
+
* ToString for a string option, ToNumber for `fractionalSecondDigits`, ToBoolean for `hour12`.
|
|
10
|
+
* An option given as an object would otherwise be asked for its value by every
|
|
11
|
+
* `Intl.DateTimeFormat` built from the copy, and could answer each one differently. The range
|
|
12
|
+
* and the allowed values are still checked by `Intl.DateTimeFormat`. `timeZone` alone is copied
|
|
13
|
+
* unconverted, for the caller's own zone rule.
|
|
14
|
+
* - The object is coerced as ECMA-402 CoerceOptionsToObject coerces it: `undefined` is no options,
|
|
15
|
+
* `null` throws TypeError, and a string or a number has none of these properties. Inherited
|
|
16
|
+
* properties are read, as `Get` reads them.
|
|
17
|
+
* - Only the options `Intl.DateTimeFormat` reads are copied, and only those that are not
|
|
18
|
+
* `undefined`. Any other key was never read by the formatter, so dropping it changes nothing.
|
|
19
|
+
*
|
|
20
|
+
* @param options the caller's options argument
|
|
21
|
+
* @returns a plain object holding each option that was set, converted to its primitive; throws
|
|
22
|
+
* TypeError for `null`, or for a value that cannot be converted, for the caller's sentinel
|
|
23
|
+
*
|
|
24
|
+
* @example readDateTimeFormatOptions({ dateStyle: "long", extra: 1 }) // { dateStyle: "long" }
|
|
25
|
+
* @example readDateTimeFormatOptions({ month: { toString: () => "long" } }) // { month: "long" }
|
|
26
|
+
* @example readDateTimeFormatOptions(undefined) // {}
|
|
27
|
+
* @example readDateTimeFormatOptions("x") // {} (a string has no date-time options)
|
|
28
|
+
* @example readDateTimeFormatOptions(null) // throws TypeError
|
|
29
|
+
*/
|
|
30
|
+
export declare function readDateTimeFormatOptions(options: unknown): Intl.DateTimeFormatOptions;
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The options ECMA-402 CreateDateTimeFormat reads, in the order it reads them: the formatter's own
|
|
3
|
+
* settings, then `timeZone`, then each date-time component, then `formatMatcher` and the styles.
|
|
4
|
+
*/
|
|
5
|
+
const DATE_TIME_FORMAT_OPTIONS = [
|
|
6
|
+
"localeMatcher",
|
|
7
|
+
"calendar",
|
|
8
|
+
"numberingSystem",
|
|
9
|
+
"hour12",
|
|
10
|
+
"hourCycle",
|
|
11
|
+
"timeZone",
|
|
12
|
+
"weekday",
|
|
13
|
+
"era",
|
|
14
|
+
"year",
|
|
15
|
+
"month",
|
|
16
|
+
"day",
|
|
17
|
+
"dayPeriod",
|
|
18
|
+
"hour",
|
|
19
|
+
"minute",
|
|
20
|
+
"second",
|
|
21
|
+
"fractionalSecondDigits",
|
|
22
|
+
"timeZoneName",
|
|
23
|
+
"formatMatcher",
|
|
24
|
+
"dateStyle",
|
|
25
|
+
"timeStyle",
|
|
26
|
+
];
|
|
27
|
+
/**
|
|
28
|
+
* Convert an option's value as ECMA-402 GetOption converts it for that option's type: ToBoolean
|
|
29
|
+
* for `hour12`, ToNumber for `fractionalSecondDigits` (GetNumberOption), ToString for every other
|
|
30
|
+
* option. `timeZone` is the exception and is returned as it was read: each caller has its own
|
|
31
|
+
* rule for a zone, and one that hands it to `Intl.DateTimeFormat` does so once.
|
|
32
|
+
*
|
|
33
|
+
* The template literal and the unary plus are ToString and ToNumber exactly, so a symbol (and a
|
|
34
|
+
* bigint for a number) throws TypeError as it does inside `Intl.DateTimeFormat`.
|
|
35
|
+
*/
|
|
36
|
+
function convertOption(name, value) {
|
|
37
|
+
switch (name) {
|
|
38
|
+
case "timeZone":
|
|
39
|
+
return value;
|
|
40
|
+
case "hour12":
|
|
41
|
+
return Boolean(value);
|
|
42
|
+
case "fractionalSecondDigits":
|
|
43
|
+
return +value;
|
|
44
|
+
default:
|
|
45
|
+
return `${value}`;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Read a caller's `Intl.DateTimeFormat` options once, into a plain object of primitives.
|
|
50
|
+
*
|
|
51
|
+
* - A formatter that inspects the options before it hands them to `Intl.DateTimeFormat` would
|
|
52
|
+
* otherwise read each one several times, and a getter could answer one value to the check and
|
|
53
|
+
* another to the formatter. ECMA-402 CreateDateTimeFormat reads each option with one `Get`
|
|
54
|
+
* (GetOption); this does the same, in the same order, and everything after works on the copy.
|
|
55
|
+
* - Each value is converted once as well, right after its `Get`, as GetOption converts it:
|
|
56
|
+
* ToString for a string option, ToNumber for `fractionalSecondDigits`, ToBoolean for `hour12`.
|
|
57
|
+
* An option given as an object would otherwise be asked for its value by every
|
|
58
|
+
* `Intl.DateTimeFormat` built from the copy, and could answer each one differently. The range
|
|
59
|
+
* and the allowed values are still checked by `Intl.DateTimeFormat`. `timeZone` alone is copied
|
|
60
|
+
* unconverted, for the caller's own zone rule.
|
|
61
|
+
* - The object is coerced as ECMA-402 CoerceOptionsToObject coerces it: `undefined` is no options,
|
|
62
|
+
* `null` throws TypeError, and a string or a number has none of these properties. Inherited
|
|
63
|
+
* properties are read, as `Get` reads them.
|
|
64
|
+
* - Only the options `Intl.DateTimeFormat` reads are copied, and only those that are not
|
|
65
|
+
* `undefined`. Any other key was never read by the formatter, so dropping it changes nothing.
|
|
66
|
+
*
|
|
67
|
+
* @param options the caller's options argument
|
|
68
|
+
* @returns a plain object holding each option that was set, converted to its primitive; throws
|
|
69
|
+
* TypeError for `null`, or for a value that cannot be converted, for the caller's sentinel
|
|
70
|
+
*
|
|
71
|
+
* @example readDateTimeFormatOptions({ dateStyle: "long", extra: 1 }) // { dateStyle: "long" }
|
|
72
|
+
* @example readDateTimeFormatOptions({ month: { toString: () => "long" } }) // { month: "long" }
|
|
73
|
+
* @example readDateTimeFormatOptions(undefined) // {}
|
|
74
|
+
* @example readDateTimeFormatOptions("x") // {} (a string has no date-time options)
|
|
75
|
+
* @example readDateTimeFormatOptions(null) // throws TypeError
|
|
76
|
+
*/
|
|
77
|
+
export function readDateTimeFormatOptions(options) {
|
|
78
|
+
if (options === null) {
|
|
79
|
+
throw new TypeError("options must be an object or undefined");
|
|
80
|
+
}
|
|
81
|
+
const read = {};
|
|
82
|
+
if (options === undefined) {
|
|
83
|
+
return read;
|
|
84
|
+
}
|
|
85
|
+
const source = Object(options);
|
|
86
|
+
for (const name of DATE_TIME_FORMAT_OPTIONS) {
|
|
87
|
+
const value = source[name];
|
|
88
|
+
if (value !== undefined) {
|
|
89
|
+
read[name] = convertOption(name, value);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return read;
|
|
93
|
+
}
|
|
@@ -18,6 +18,10 @@ import type { DurationRelativeTo } from "../types/index.js";
|
|
|
18
18
|
* calendar must be a `CalendarSystem`, and `"ethiopic"`/`"coptic"` compute in `"ethioaa"`,
|
|
19
19
|
* which polyfill 0.5.1 can read. The digits are ISO, so this is the date Temporal itself would
|
|
20
20
|
* read.
|
|
21
|
+
* - A zoned string without a calendar annotation is read with `zonedDateTimeFrom`, so its offset
|
|
22
|
+
* is matched against the zone as TC39 `ToRelativeTemporalObject` matches it: an offset written
|
|
23
|
+
* to the minute may be the zone's sub-minute offset rounded, and one written with seconds must
|
|
24
|
+
* be the zone's offset exactly (`"1970-01-01T00:00:00-00:45:00[Africa/Monrovia]"` throws).
|
|
21
25
|
* - A leap second (second `60`) throws, in every spelling Temporal's grammar accepts — `T`, `t`
|
|
22
26
|
* or space separator, extended or basic digits, with or without a designator. Temporal's
|
|
23
27
|
* ParseISODateTime would otherwise clamp it to `:59`.
|
|
@@ -3,6 +3,7 @@ import { plainDateTime } from "../regex/date-time.js";
|
|
|
3
3
|
import { parseCalendarDateValue, temporalStringLeapSecond, } from "./calendarDateString.js";
|
|
4
4
|
import { parseCalendarZonedValue } from "./calendarZonedString.js";
|
|
5
5
|
import { hasZonedDateTimeShape, isoStringBody } from "./isoStringBody.js";
|
|
6
|
+
import { zonedDateTimeFrom } from "./zonedWallClock.js";
|
|
6
7
|
/**
|
|
7
8
|
* A calendar annotation in any spelling: critical flag or not, any letter case. An upper-case key
|
|
8
9
|
* is not Temporal syntax, so it is parsed here and throws rather than reaching Temporal later.
|
|
@@ -45,6 +46,10 @@ function hasRelativeToShape(value) {
|
|
|
45
46
|
* calendar must be a `CalendarSystem`, and `"ethiopic"`/`"coptic"` compute in `"ethioaa"`,
|
|
46
47
|
* which polyfill 0.5.1 can read. The digits are ISO, so this is the date Temporal itself would
|
|
47
48
|
* read.
|
|
49
|
+
* - A zoned string without a calendar annotation is read with `zonedDateTimeFrom`, so its offset
|
|
50
|
+
* is matched against the zone as TC39 `ToRelativeTemporalObject` matches it: an offset written
|
|
51
|
+
* to the minute may be the zone's sub-minute offset rounded, and one written with seconds must
|
|
52
|
+
* be the zone's offset exactly (`"1970-01-01T00:00:00-00:45:00[Africa/Monrovia]"` throws).
|
|
48
53
|
* - A leap second (second `60`) throws, in every spelling Temporal's grammar accepts — `T`, `t`
|
|
49
54
|
* or space separator, extended or basic digits, with or without a designator. Temporal's
|
|
50
55
|
* ParseISODateTime would otherwise clamp it to `:59`.
|
|
@@ -70,7 +75,12 @@ export function resolveDurationRelativeTo(relativeTo) {
|
|
|
70
75
|
throw new RangeError(`Not an extended ISO 8601 date, date-time or zoned date-time: ${relativeTo}`);
|
|
71
76
|
}
|
|
72
77
|
if (!anyCalendarAnnotation.test(relativeTo)) {
|
|
73
|
-
|
|
78
|
+
// A zoned string is read here, not handed on as text: `zonedDateTimeFrom` matches an offset
|
|
79
|
+
// written with seconds exactly, as TC39 `ToRelativeTemporalObject` requires and polyfill
|
|
80
|
+
// 0.5.1 does not (temporalCompat D12).
|
|
81
|
+
return timeZoneAnnotation.test(relativeTo)
|
|
82
|
+
? zonedDateTimeFrom(relativeTo)
|
|
83
|
+
: relativeTo;
|
|
74
84
|
}
|
|
75
85
|
if (timeZoneAnnotation.test(relativeTo)) {
|
|
76
86
|
return parseCalendarZonedValue(relativeTo);
|
|
@@ -3,17 +3,28 @@ import type { RelativeRoundingMethod } from "../types/index.js";
|
|
|
3
3
|
* Round a relative-time distance to an integer using the given method, defaulting to "round".
|
|
4
4
|
*
|
|
5
5
|
* Applied directly to the signed fractional value (not its absolute value), so floor/ceil
|
|
6
|
-
* respect whether the distance is past (negative) or future (positive)
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
6
|
+
* respect whether the distance is past (negative) or future (positive): "floor" rounds toward
|
|
7
|
+
* negative infinity and "ceil" toward positive infinity, as ECMA-262 `Math.floor` / `Math.ceil`
|
|
8
|
+
* and Temporal's rounding modes of the same names do. "round" is ECMA-262 `Math.round`, a half
|
|
9
|
+
* going toward positive infinity. Comparison: date-fns's `formatDistanceStrict` `roundingMethod`
|
|
10
|
+
* rounds the unsigned distance, so its floor and ceil differ for a past value.
|
|
11
|
+
*
|
|
12
|
+
* A rounded `-0` is preserved rather than normalized to `0`: `Intl.RelativeTimeFormat` treats the
|
|
13
|
+
* sign of zero as meaningful (with `numeric: "always"`, `-0` renders as "0 <unit> ago" and `0` as
|
|
14
|
+
* "in 0 <unit>"), so collapsing it here would change existing `formatRelative*` output for
|
|
15
|
+
* near-zero distances.
|
|
16
|
+
*
|
|
17
|
+
* The method is matched against the three names `RelativeRoundingMethod` lists, never looked up on
|
|
18
|
+
* `Math`: `Math.abs`, `Math.trunc`, `Math.random` and the keys `Math` inherits from
|
|
19
|
+
* `Object.prototype` are not rounding methods. An `undefined` method is the omitted option
|
|
20
|
+
* (ECMA-402 `GetOption`, which the Temporal specification also defines) and takes the default.
|
|
11
21
|
*
|
|
12
22
|
* @param value the fractional distance in the target display unit
|
|
13
23
|
* @param method optional: "floor" | "ceil" | "round" (default "round")
|
|
14
|
-
* @returns the rounded amount
|
|
24
|
+
* @returns the rounded amount; throws RangeError for any other method, for the caller's sentinel
|
|
15
25
|
* @example resolveRelativeRounding(2.7) // 3
|
|
16
26
|
* @example resolveRelativeRounding(2.7, "floor") // 2
|
|
17
27
|
* @example resolveRelativeRounding(-2.7, "ceil") // -2
|
|
28
|
+
* @example resolveRelativeRounding(-2.7, "abs" as never) // throws RangeError
|
|
18
29
|
*/
|
|
19
30
|
export declare function resolveRelativeRounding(value: number, method?: RelativeRoundingMethod): number;
|
|
@@ -2,19 +2,39 @@
|
|
|
2
2
|
* Round a relative-time distance to an integer using the given method, defaulting to "round".
|
|
3
3
|
*
|
|
4
4
|
* Applied directly to the signed fractional value (not its absolute value), so floor/ceil
|
|
5
|
-
* respect whether the distance is past (negative) or future (positive)
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
5
|
+
* respect whether the distance is past (negative) or future (positive): "floor" rounds toward
|
|
6
|
+
* negative infinity and "ceil" toward positive infinity, as ECMA-262 `Math.floor` / `Math.ceil`
|
|
7
|
+
* and Temporal's rounding modes of the same names do. "round" is ECMA-262 `Math.round`, a half
|
|
8
|
+
* going toward positive infinity. Comparison: date-fns's `formatDistanceStrict` `roundingMethod`
|
|
9
|
+
* rounds the unsigned distance, so its floor and ceil differ for a past value.
|
|
10
|
+
*
|
|
11
|
+
* A rounded `-0` is preserved rather than normalized to `0`: `Intl.RelativeTimeFormat` treats the
|
|
12
|
+
* sign of zero as meaningful (with `numeric: "always"`, `-0` renders as "0 <unit> ago" and `0` as
|
|
13
|
+
* "in 0 <unit>"), so collapsing it here would change existing `formatRelative*` output for
|
|
14
|
+
* near-zero distances.
|
|
15
|
+
*
|
|
16
|
+
* The method is matched against the three names `RelativeRoundingMethod` lists, never looked up on
|
|
17
|
+
* `Math`: `Math.abs`, `Math.trunc`, `Math.random` and the keys `Math` inherits from
|
|
18
|
+
* `Object.prototype` are not rounding methods. An `undefined` method is the omitted option
|
|
19
|
+
* (ECMA-402 `GetOption`, which the Temporal specification also defines) and takes the default.
|
|
10
20
|
*
|
|
11
21
|
* @param value the fractional distance in the target display unit
|
|
12
22
|
* @param method optional: "floor" | "ceil" | "round" (default "round")
|
|
13
|
-
* @returns the rounded amount
|
|
23
|
+
* @returns the rounded amount; throws RangeError for any other method, for the caller's sentinel
|
|
14
24
|
* @example resolveRelativeRounding(2.7) // 3
|
|
15
25
|
* @example resolveRelativeRounding(2.7, "floor") // 2
|
|
16
26
|
* @example resolveRelativeRounding(-2.7, "ceil") // -2
|
|
27
|
+
* @example resolveRelativeRounding(-2.7, "abs" as never) // throws RangeError
|
|
17
28
|
*/
|
|
18
29
|
export function resolveRelativeRounding(value, method = "round") {
|
|
19
|
-
|
|
30
|
+
switch (method) {
|
|
31
|
+
case "floor":
|
|
32
|
+
return Math.floor(value);
|
|
33
|
+
case "ceil":
|
|
34
|
+
return Math.ceil(value);
|
|
35
|
+
case "round":
|
|
36
|
+
return Math.round(value);
|
|
37
|
+
default:
|
|
38
|
+
throw new RangeError(`Invalid roundingMethod: ${String(method)}`);
|
|
39
|
+
}
|
|
20
40
|
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { RelativeUnit } from "../types/index.js";
|
|
2
|
+
/**
|
|
3
|
+
* Resolve the `largestUnit` option of a `formatRelative*` function to one of the units the
|
|
4
|
+
* function allows, in its singular form.
|
|
5
|
+
*
|
|
6
|
+
* - Temporal reads a unit option with GetTemporalUnitValuedOption, which takes a plural name as
|
|
7
|
+
* its singular, then checks it with ValidateTemporalUnitValue against the unit group of the
|
|
8
|
+
* type — date, time or datetime — and throws RangeError for a unit outside the group:
|
|
9
|
+
* `Temporal.PlainDate.prototype.until` rejects `"hour"`, `Temporal.PlainTime.prototype.until`
|
|
10
|
+
* rejects `"day"`. `allowed` is that group for the calling function.
|
|
11
|
+
* - `undefined` is the omitted option (GetOption), so the caller picks the unit from the distance.
|
|
12
|
+
* - Unit names are lower case, as in Temporal.
|
|
13
|
+
* - The set of units is Temporal's. Rejecting a value that is not a string is GMT's own rule, and
|
|
14
|
+
* stricter than Temporal: GetOption converts any value with ToString, so Temporal accepts
|
|
15
|
+
* `["day"]` and an object whose `toString` returns `"day"` (test262
|
|
16
|
+
* `largestunit-wrong-type.js`). GMT takes string inputs, and its other unit readers
|
|
17
|
+
* (`roundDate`, `roundDateTime`, `roundUtc`, `roundZoned`, `startOfDate`, `durationAs`,
|
|
18
|
+
* `areDatesEqualBy`) reject a non-string the same way, so this one does not convert either.
|
|
19
|
+
*
|
|
20
|
+
* @param largestUnit the option as read from the caller's object, `undefined` when absent
|
|
21
|
+
* @param allowed the singular units the calling function lists in its type
|
|
22
|
+
* @returns the singular unit, or `undefined` when the option is absent; throws RangeError for any
|
|
23
|
+
* other value, for the caller's sentinel
|
|
24
|
+
*
|
|
25
|
+
* @example resolveRelativeUnit("hours", ["hour", "minute", "second"]) // "hour"
|
|
26
|
+
* @example resolveRelativeUnit(undefined, ["hour", "minute", "second"]) // undefined
|
|
27
|
+
* @example resolveRelativeUnit("day", ["hour", "minute", "second"]) // throws RangeError
|
|
28
|
+
* @example resolveRelativeUnit(["hour"], ["hour", "minute", "second"]) // throws RangeError (GMT's rule; Temporal converts it to "hour")
|
|
29
|
+
*/
|
|
30
|
+
export declare function resolveRelativeUnit<Unit extends RelativeUnit>(largestUnit: unknown, allowed: readonly Unit[]): Unit | undefined;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolve the `largestUnit` option of a `formatRelative*` function to one of the units the
|
|
3
|
+
* function allows, in its singular form.
|
|
4
|
+
*
|
|
5
|
+
* - Temporal reads a unit option with GetTemporalUnitValuedOption, which takes a plural name as
|
|
6
|
+
* its singular, then checks it with ValidateTemporalUnitValue against the unit group of the
|
|
7
|
+
* type — date, time or datetime — and throws RangeError for a unit outside the group:
|
|
8
|
+
* `Temporal.PlainDate.prototype.until` rejects `"hour"`, `Temporal.PlainTime.prototype.until`
|
|
9
|
+
* rejects `"day"`. `allowed` is that group for the calling function.
|
|
10
|
+
* - `undefined` is the omitted option (GetOption), so the caller picks the unit from the distance.
|
|
11
|
+
* - Unit names are lower case, as in Temporal.
|
|
12
|
+
* - The set of units is Temporal's. Rejecting a value that is not a string is GMT's own rule, and
|
|
13
|
+
* stricter than Temporal: GetOption converts any value with ToString, so Temporal accepts
|
|
14
|
+
* `["day"]` and an object whose `toString` returns `"day"` (test262
|
|
15
|
+
* `largestunit-wrong-type.js`). GMT takes string inputs, and its other unit readers
|
|
16
|
+
* (`roundDate`, `roundDateTime`, `roundUtc`, `roundZoned`, `startOfDate`, `durationAs`,
|
|
17
|
+
* `areDatesEqualBy`) reject a non-string the same way, so this one does not convert either.
|
|
18
|
+
*
|
|
19
|
+
* @param largestUnit the option as read from the caller's object, `undefined` when absent
|
|
20
|
+
* @param allowed the singular units the calling function lists in its type
|
|
21
|
+
* @returns the singular unit, or `undefined` when the option is absent; throws RangeError for any
|
|
22
|
+
* other value, for the caller's sentinel
|
|
23
|
+
*
|
|
24
|
+
* @example resolveRelativeUnit("hours", ["hour", "minute", "second"]) // "hour"
|
|
25
|
+
* @example resolveRelativeUnit(undefined, ["hour", "minute", "second"]) // undefined
|
|
26
|
+
* @example resolveRelativeUnit("day", ["hour", "minute", "second"]) // throws RangeError
|
|
27
|
+
* @example resolveRelativeUnit(["hour"], ["hour", "minute", "second"]) // throws RangeError (GMT's rule; Temporal converts it to "hour")
|
|
28
|
+
*/
|
|
29
|
+
export function resolveRelativeUnit(largestUnit, allowed) {
|
|
30
|
+
if (largestUnit === undefined) {
|
|
31
|
+
return undefined;
|
|
32
|
+
}
|
|
33
|
+
const unit = typeof largestUnit === "string"
|
|
34
|
+
? allowed.find((name) => name === largestUnit || `${name}s` === largestUnit)
|
|
35
|
+
: undefined;
|
|
36
|
+
if (unit === undefined) {
|
|
37
|
+
throw new RangeError(`Invalid largestUnit: ${String(largestUnit)}`);
|
|
38
|
+
}
|
|
39
|
+
return unit;
|
|
40
|
+
}
|
|
@@ -33,7 +33,8 @@ export declare function isExactDurationUnit(unit: string): boolean;
|
|
|
33
33
|
* - A step that goes backwards returns `null`.
|
|
34
34
|
* - More than `maxSlices` slices returns `null` as soon as the next one is due, so the work stays
|
|
35
35
|
* bounded by the limit (owner decision A2, CORE-8).
|
|
36
|
-
* - The last slice's end is
|
|
36
|
+
* - The last slice's end is `end` itself, whether the last step passes `end` (trimmed) or lands on
|
|
37
|
+
* it. Callers handle `start >= end` before calling.
|
|
37
38
|
* - A step that throws a RangeError (it lands past Temporal's last representable value, so after
|
|
38
39
|
* `end`) closes the split with a last slice ending at `end`.
|
|
39
40
|
*
|
|
@@ -57,6 +58,28 @@ export declare function isExactDurationUnit(unit: string): boolean;
|
|
|
57
58
|
export declare function tileByUnit<T extends {
|
|
58
59
|
add(duration: Temporal.DurationLike): T;
|
|
59
60
|
}>(start: T, end: T, compare: (a: T, b: T) => number, unit: string, amount: number, maxSlices: number, add?: (value: T, duration: Temporal.DurationLike) => T): Array<[T, T]> | null;
|
|
61
|
+
/**
|
|
62
|
+
* The step a split takes when its boundaries are then floored to whole `floorUnit`s.
|
|
63
|
+
*
|
|
64
|
+
* - An exact step shorter than one `floorUnit` moves each boundary by less than one unit, so the
|
|
65
|
+
* floored boundaries are every whole unit from the start to the end, each one repeated once per
|
|
66
|
+
* step that falls inside it. Stepping by one `floorUnit` gives those boundaries once each: no
|
|
67
|
+
* empty piece, and no work spent on steps the result cannot show.
|
|
68
|
+
* - Any other step is returned unchanged: a step of one `floorUnit` or more never floors two
|
|
69
|
+
* boundaries to the same value, a calendar step is never shorter than a second, and a
|
|
70
|
+
* fractional `amount` is left for Temporal to reject.
|
|
71
|
+
* - The split's start must itself be a whole `floorUnit`, as a Unix epoch is.
|
|
72
|
+
*
|
|
73
|
+
* @param unit plural duration unit, as returned by `resolveDurationUnit`
|
|
74
|
+
* @param amount positive number of units per step
|
|
75
|
+
* @param floorUnit plural exact unit the boundaries are floored to
|
|
76
|
+
* @returns the `[unit, amount]` to step by
|
|
77
|
+
*
|
|
78
|
+
* @example stepNoFinerThan("milliseconds", 500, "seconds") // ["seconds", 1]
|
|
79
|
+
* @example stepNoFinerThan("milliseconds", 1500, "seconds") // ["milliseconds", 1500]
|
|
80
|
+
* @example stepNoFinerThan("days", 1, "seconds") // ["days", 1]
|
|
81
|
+
*/
|
|
82
|
+
export declare function stepNoFinerThan(unit: string, amount: number, floorUnit: string): [unit: string, amount: number];
|
|
60
83
|
/**
|
|
61
84
|
* A lower bound on the number of slices `tileByUnit` returns for a span, without stepping.
|
|
62
85
|
*
|