@northguild/gmt 1.18.0 → 1.19.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +55 -2920
- package/dist/calendar/calculate/bucketRange.d.ts +10 -2
- package/dist/calendar/calculate/bucketRange.js +18 -61
- package/dist/calendar/calculate/floorToZone.d.ts +10 -2
- package/dist/calendar/calculate/floorToZone.js +15 -7
- package/dist/calendar/hours/addOperatingTime.d.ts +6 -0
- package/dist/calendar/hours/addOperatingTime.js +7 -1
- package/dist/calendar/hours/isOpenAt.d.ts +6 -0
- package/dist/calendar/hours/isOpenAt.js +6 -0
- package/dist/calendar/hours/nextCloseAt.d.ts +6 -0
- package/dist/calendar/hours/nextCloseAt.js +7 -1
- package/dist/calendar/hours/nextOpenAt.d.ts +6 -0
- package/dist/calendar/hours/nextOpenAt.js +7 -1
- package/dist/calendar/hours/operatingIntervals.d.ts +5 -0
- package/dist/calendar/hours/operatingIntervals.js +5 -0
- package/dist/calendar/hours/operatingTimeBetween.d.ts +5 -0
- package/dist/calendar/hours/operatingTimeBetween.js +5 -0
- package/dist/calendar/hours/recurringWindows.d.ts +8 -1
- package/dist/calendar/hours/recurringWindows.js +12 -4
- package/dist/duration/calculate/durationFromUnits.d.ts +47 -0
- package/dist/duration/calculate/durationFromUnits.js +67 -0
- package/dist/duration/calculate/getDurationUnit.d.ts +2 -2
- package/dist/duration/calculate/getDurationUnit.js +2 -2
- package/dist/duration/calculate/index.d.ts +3 -1
- package/dist/duration/calculate/index.js +3 -1
- package/dist/duration/calculate/negateDuration.d.ts +1 -1
- package/dist/duration/calculate/negateDuration.js +1 -1
- package/dist/duration/calculate/{durationAs.d.ts → totalDuration.d.ts} +25 -19
- package/dist/duration/calculate/{durationAs.js → totalDuration.js} +25 -19
- package/dist/duration/calculate/totalUnits.d.ts +49 -0
- package/dist/duration/calculate/totalUnits.js +73 -0
- package/dist/duration/compare/compareDurations.d.ts +1 -1
- package/dist/duration/compare/compareDurations.js +1 -1
- package/dist/duty/calculate/dutyDayFor.d.ts +38 -0
- package/dist/duty/calculate/dutyDayFor.js +71 -0
- package/dist/duty/calculate/dutyTotals.d.ts +24 -0
- package/dist/duty/calculate/dutyTotals.js +41 -0
- package/dist/duty/calculate/dutyViolations.d.ts +74 -0
- package/dist/duty/calculate/dutyViolations.js +65 -0
- package/dist/duty/calculate/evaluateDutyLog.d.ts +77 -0
- package/dist/duty/calculate/evaluateDutyLog.js +75 -0
- package/dist/duty/calculate/index.d.ts +7 -0
- package/dist/duty/calculate/index.js +7 -0
- package/dist/duty/calculate/longestRun.d.ts +28 -0
- package/dist/duty/calculate/longestRun.js +54 -0
- package/dist/duty/calculate/qualifyingRestPairs.d.ts +37 -0
- package/dist/duty/calculate/qualifyingRestPairs.js +58 -0
- package/dist/duty/calculate/qualifyingRests.d.ts +27 -0
- package/dist/duty/calculate/qualifyingRests.js +49 -0
- package/dist/duty/index.d.ts +3 -0
- package/dist/duty/index.js +4 -0
- package/dist/duty/validate/index.d.ts +1 -0
- package/dist/duty/validate/index.js +1 -0
- package/dist/duty/validate/isValidDutyLog.d.ts +24 -0
- package/dist/duty/validate/isValidDutyLog.js +34 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/instant/convert/classifyLocal.d.ts +5 -1
- package/dist/instant/convert/classifyLocal.js +16 -6
- package/dist/instant/convert/fromOffsetInstant.d.ts +4 -0
- package/dist/instant/convert/fromOffsetInstant.js +6 -1
- package/dist/instant/convert/resolveLocal.d.ts +7 -2
- package/dist/instant/convert/resolveLocal.js +16 -8
- package/dist/instant/convert/toOffsetInstant.d.ts +12 -8
- package/dist/instant/convert/toOffsetInstant.js +19 -11
- package/dist/instant/index.d.ts +1 -0
- package/dist/instant/index.js +1 -0
- package/dist/instant/validate/index.d.ts +1 -0
- package/dist/instant/validate/index.js +1 -0
- package/dist/instant/validate/isValidUtcOffset.d.ts +32 -0
- package/dist/instant/validate/isValidUtcOffset.js +35 -0
- package/dist/intermodal/calculate/chargeableDays.d.ts +6 -0
- package/dist/intermodal/calculate/chargeableDays.js +12 -4
- package/dist/intermodal/calculate/freeTimeExpiry.d.ts +7 -0
- package/dist/intermodal/calculate/freeTimeExpiry.js +15 -4
- package/dist/intermodal/calculate/index.d.ts +1 -0
- package/dist/intermodal/calculate/index.js +1 -0
- package/dist/intermodal/calculate/multimodalETA.d.ts +76 -0
- package/dist/intermodal/calculate/multimodalETA.js +145 -0
- package/dist/intermodal/format/bolTimestamp.d.ts +76 -0
- package/dist/intermodal/format/bolTimestamp.js +78 -0
- package/dist/intermodal/format/formatEdifactDate.d.ts +34 -0
- package/dist/intermodal/format/formatEdifactDate.js +42 -0
- package/dist/intermodal/format/formatEdifactDatePeriod.d.ts +35 -0
- package/dist/intermodal/format/formatEdifactDatePeriod.js +43 -0
- package/dist/intermodal/format/formatEdifactDateTime.d.ts +37 -0
- package/dist/intermodal/format/formatEdifactDateTime.js +45 -0
- package/dist/intermodal/format/formatEdifactDateTimePeriod.d.ts +40 -0
- package/dist/intermodal/format/formatEdifactDateTimePeriod.js +48 -0
- package/dist/intermodal/format/formatEdifactOffsetDateTime.d.ts +62 -0
- package/dist/intermodal/format/formatEdifactOffsetDateTime.js +70 -0
- package/dist/intermodal/format/formatEdifactTime.d.ts +35 -0
- package/dist/intermodal/format/formatEdifactTime.js +43 -0
- package/dist/intermodal/format/formatEpcisEvent.d.ts +47 -0
- package/dist/intermodal/format/formatEpcisEvent.js +79 -0
- package/dist/intermodal/format/formatX12Date.d.ts +35 -0
- package/dist/intermodal/format/formatX12Date.js +43 -0
- package/dist/intermodal/format/formatX12DateRange.d.ts +37 -0
- package/dist/intermodal/format/formatX12DateRange.js +45 -0
- package/dist/intermodal/format/formatX12DateTime.d.ts +39 -0
- package/dist/intermodal/format/formatX12DateTime.js +47 -0
- package/dist/intermodal/format/formatX12DateTimeRange.d.ts +40 -0
- package/dist/intermodal/format/formatX12DateTimeRange.js +48 -0
- package/dist/intermodal/format/formatX12Time.d.ts +42 -0
- package/dist/intermodal/format/formatX12Time.js +50 -0
- package/dist/intermodal/format/formatX12TimeElement.d.ts +46 -0
- package/dist/intermodal/format/formatX12TimeElement.js +54 -0
- package/dist/intermodal/format/index.d.ts +14 -0
- package/dist/intermodal/format/index.js +14 -0
- package/dist/intermodal/index.d.ts +3 -0
- package/dist/intermodal/index.js +3 -0
- package/dist/intermodal/parse/classifyEdifactDtmFormat.d.ts +48 -0
- package/dist/intermodal/parse/classifyEdifactDtmFormat.js +55 -0
- package/dist/intermodal/parse/classifyX12DateTimePeriodFormat.d.ts +50 -0
- package/dist/intermodal/parse/classifyX12DateTimePeriodFormat.js +57 -0
- package/dist/intermodal/parse/classifyX12TimeCode.d.ts +46 -0
- package/dist/intermodal/parse/classifyX12TimeCode.js +57 -0
- package/dist/intermodal/parse/index.d.ts +18 -0
- package/dist/intermodal/parse/index.js +18 -0
- package/dist/intermodal/parse/parseEdifactDate.d.ts +37 -0
- package/dist/intermodal/parse/parseEdifactDate.js +45 -0
- package/dist/intermodal/parse/parseEdifactDatePeriod.d.ts +43 -0
- package/dist/intermodal/parse/parseEdifactDatePeriod.js +51 -0
- package/dist/intermodal/parse/parseEdifactDateTime.d.ts +43 -0
- package/dist/intermodal/parse/parseEdifactDateTime.js +51 -0
- package/dist/intermodal/parse/parseEdifactDateTimePeriod.d.ts +45 -0
- package/dist/intermodal/parse/parseEdifactDateTimePeriod.js +53 -0
- package/dist/intermodal/parse/parseEdifactOffsetDateTime.d.ts +60 -0
- package/dist/intermodal/parse/parseEdifactOffsetDateTime.js +68 -0
- package/dist/intermodal/parse/parseEdifactTime.d.ts +37 -0
- package/dist/intermodal/parse/parseEdifactTime.js +45 -0
- package/dist/intermodal/parse/parseEpcisEvent.d.ts +95 -0
- package/dist/intermodal/parse/parseEpcisEvent.js +102 -0
- package/dist/intermodal/parse/parseX12Date.d.ts +39 -0
- package/dist/intermodal/parse/parseX12Date.js +47 -0
- package/dist/intermodal/parse/parseX12DateAndTime.d.ts +52 -0
- package/dist/intermodal/parse/parseX12DateAndTime.js +61 -0
- package/dist/intermodal/parse/parseX12DateRange.d.ts +44 -0
- package/dist/intermodal/parse/parseX12DateRange.js +52 -0
- package/dist/intermodal/parse/parseX12DateTime.d.ts +45 -0
- package/dist/intermodal/parse/parseX12DateTime.js +53 -0
- package/dist/intermodal/parse/parseX12DateTimeRange.d.ts +46 -0
- package/dist/intermodal/parse/parseX12DateTimeRange.js +54 -0
- package/dist/intermodal/parse/parseX12Time.d.ts +65 -0
- package/dist/intermodal/parse/parseX12Time.js +77 -0
- package/dist/intermodal/parse/x12TimeCodeOffset.d.ts +57 -0
- package/dist/intermodal/parse/x12TimeCodeOffset.js +110 -0
- package/dist/intermodal/parse/x12TimeCodeZone.d.ts +57 -0
- package/dist/intermodal/parse/x12TimeCodeZone.js +105 -0
- package/dist/intermodal/validate/index.d.ts +18 -0
- package/dist/intermodal/validate/index.js +18 -0
- package/dist/intermodal/validate/isValidEdifactDate.d.ts +26 -0
- package/dist/intermodal/validate/isValidEdifactDate.js +28 -0
- package/dist/intermodal/validate/isValidEdifactDatePeriod.d.ts +28 -0
- package/dist/intermodal/validate/isValidEdifactDatePeriod.js +30 -0
- package/dist/intermodal/validate/isValidEdifactDateTime.d.ts +30 -0
- package/dist/intermodal/validate/isValidEdifactDateTime.js +32 -0
- package/dist/intermodal/validate/isValidEdifactDateTimePeriod.d.ts +28 -0
- package/dist/intermodal/validate/isValidEdifactDateTimePeriod.js +30 -0
- package/dist/intermodal/validate/isValidEdifactDtmFormat.d.ts +39 -0
- package/dist/intermodal/validate/isValidEdifactDtmFormat.js +42 -0
- package/dist/intermodal/validate/isValidEdifactOffsetDateTime.d.ts +36 -0
- package/dist/intermodal/validate/isValidEdifactOffsetDateTime.js +38 -0
- package/dist/intermodal/validate/isValidEdifactTime.d.ts +28 -0
- package/dist/intermodal/validate/isValidEdifactTime.js +30 -0
- package/dist/intermodal/validate/isValidEpcisEvent.d.ts +41 -0
- package/dist/intermodal/validate/isValidEpcisEvent.js +58 -0
- package/dist/intermodal/validate/isValidEpcisEventTime.d.ts +33 -0
- package/dist/intermodal/validate/isValidEpcisEventTime.js +48 -0
- package/dist/intermodal/validate/isValidEpcisTimeZoneOffset.d.ts +30 -0
- package/dist/intermodal/validate/isValidEpcisTimeZoneOffset.js +38 -0
- package/dist/intermodal/validate/isValidX12Date.d.ts +28 -0
- package/dist/intermodal/validate/isValidX12Date.js +30 -0
- package/dist/intermodal/validate/isValidX12DateAndTime.d.ts +32 -0
- package/dist/intermodal/validate/isValidX12DateAndTime.js +35 -0
- package/dist/intermodal/validate/isValidX12DateRange.d.ts +29 -0
- package/dist/intermodal/validate/isValidX12DateRange.js +31 -0
- package/dist/intermodal/validate/isValidX12DateTime.d.ts +30 -0
- package/dist/intermodal/validate/isValidX12DateTime.js +32 -0
- package/dist/intermodal/validate/isValidX12DateTimePeriodFormat.d.ts +43 -0
- package/dist/intermodal/validate/isValidX12DateTimePeriodFormat.js +46 -0
- package/dist/intermodal/validate/isValidX12DateTimeRange.d.ts +31 -0
- package/dist/intermodal/validate/isValidX12DateTimeRange.js +33 -0
- package/dist/intermodal/validate/isValidX12Time.d.ts +38 -0
- package/dist/intermodal/validate/isValidX12Time.js +40 -0
- package/dist/intermodal/validate/isValidX12TimeCode.d.ts +38 -0
- package/dist/intermodal/validate/isValidX12TimeCode.js +41 -0
- package/dist/internal/businessCalendar.js +4 -9
- package/dist/internal/dutyEngine.d.ts +125 -0
- package/dist/internal/dutyEngine.js +1746 -0
- package/dist/internal/dutyLog.d.ts +27 -0
- package/dist/internal/dutyLog.js +47 -0
- package/dist/internal/dutyPeriods.d.ts +135 -0
- package/dist/internal/dutyPeriods.js +369 -0
- package/dist/internal/dutyRules.d.ts +197 -0
- package/dist/internal/dutyRules.js +484 -0
- package/dist/internal/ediDateTimeFields.d.ts +97 -0
- package/dist/internal/ediDateTimeFields.js +288 -0
- package/dist/internal/ediDateTimeWriter.d.ts +92 -0
- package/dist/internal/ediDateTimeWriter.js +298 -0
- package/dist/internal/ediGrammar.d.ts +158 -0
- package/dist/internal/ediGrammar.js +384 -0
- package/dist/internal/englishCalendarNames.d.ts +3 -1
- package/dist/internal/englishCalendarNames.js +3 -1
- package/dist/internal/freeTimeLedger.d.ts +5 -0
- package/dist/internal/freeTimeLedger.js +11 -2
- package/dist/internal/index.d.ts +5 -2
- package/dist/internal/index.js +9 -2
- package/dist/internal/intervalNanoseconds.js +2 -1
- package/dist/internal/isObject.d.ts +13 -6
- package/dist/internal/isObject.js +14 -7
- package/dist/internal/isoYearString.d.ts +21 -0
- package/dist/internal/isoYearString.js +27 -0
- package/dist/internal/maxPieces.js +2 -1
- package/dist/internal/normalizeTimeZone.d.ts +4 -1
- package/dist/internal/normalizeTimeZone.js +4 -1
- package/dist/internal/operatingSchedule.d.ts +13 -4
- package/dist/internal/operatingSchedule.js +146 -58
- package/dist/internal/patternToken.d.ts +10 -3
- package/dist/internal/patternToken.js +31 -12
- package/dist/internal/readDurationUnits.d.ts +34 -0
- package/dist/internal/readDurationUnits.js +78 -0
- package/dist/internal/readSetFields.d.ts +50 -0
- package/dist/internal/readSetFields.js +179 -0
- package/dist/internal/resolveRelativeUnit.d.ts +1 -1
- package/dist/internal/resolveRelativeUnit.js +1 -1
- package/dist/internal/resolveUnixIntervalPair.d.ts +8 -2
- package/dist/internal/resolveUnixIntervalPair.js +11 -7
- package/dist/internal/startOrEndOfUnix.d.ts +2 -1
- package/dist/internal/startOrEndOfUnix.js +9 -6
- package/dist/internal/twoDigitYear.d.ts +19 -0
- package/dist/internal/twoDigitYear.js +22 -0
- package/dist/internal/unixEpochValue.js +3 -2
- package/dist/internal/unixWallClock.d.ts +24 -0
- package/dist/internal/unixWallClock.js +35 -0
- package/dist/internal/utcWallClock.d.ts +20 -0
- package/dist/internal/utcWallClock.js +32 -0
- package/dist/internal/yearWindowStart.d.ts +28 -0
- package/dist/internal/yearWindowStart.js +52 -0
- package/dist/internal/zoneBucketCap.d.ts +18 -0
- package/dist/internal/zoneBucketCap.js +64 -0
- package/dist/internal/zoneFrame.d.ts +180 -0
- package/dist/internal/zoneFrame.js +221 -0
- package/dist/internal/zonedNowUnitValue.d.ts +7 -4
- package/dist/internal/zonedNowUnitValue.js +8 -4
- package/dist/internal/zonedWallClockDifference.js +4 -4
- package/dist/internal/zonedWallClockOperations.d.ts +5 -2
- package/dist/internal/zonedWallClockOperations.js +7 -10
- package/dist/plain/calculate/addDate.js +4 -7
- package/dist/plain/calculate/addDateTime.js +4 -7
- package/dist/plain/calculate/addTime.js +4 -7
- package/dist/plain/calculate/endOfTime.d.ts +1 -1
- package/dist/plain/calculate/setDate.d.ts +20 -3
- package/dist/plain/calculate/setDate.js +27 -7
- package/dist/plain/calculate/setDateTime.d.ts +15 -3
- package/dist/plain/calculate/setDateTime.js +22 -7
- package/dist/plain/calculate/setTime.d.ts +13 -1
- package/dist/plain/calculate/setTime.js +21 -6
- package/dist/plain/calculate/startOfTime.d.ts +1 -1
- package/dist/plain/calculate/subtractDate.js +4 -7
- package/dist/plain/calculate/subtractDateTime.js +4 -7
- package/dist/plain/calculate/subtractTime.js +4 -7
- package/dist/plain/format/formatCalendar.js +2 -1
- package/dist/plain/format/formatRelativeDate.js +2 -1
- package/dist/plain/format/formatRelativeDateTime.js +2 -1
- package/dist/plain/format/formatRelativeTime.js +2 -1
- package/dist/plain/format/{formatSql.d.ts → formatSqlDateTime.d.ts} +7 -7
- package/dist/plain/format/{formatSql.js → formatSqlDateTime.js} +7 -7
- package/dist/plain/format/index.d.ts +1 -1
- package/dist/plain/format/index.js +1 -1
- package/dist/plain/get/getNowUnit.d.ts +2 -0
- package/dist/plain/get/getNowUnit.js +2 -0
- package/dist/plain/get/getYear.d.ts +2 -0
- package/dist/plain/get/getYear.js +4 -3
- package/dist/plain/interval/intervalXorAllDate.js +2 -2
- package/dist/plain/interval/intervalXorAllDateTime.js +2 -2
- package/dist/plain/interval/intervalXorAllTime.js +2 -2
- package/dist/plain/interval/mergeIntervalsDate.js +2 -2
- package/dist/plain/interval/mergeIntervalsDateTime.js +2 -2
- package/dist/plain/interval/mergeIntervalsTime.js +2 -2
- package/dist/plain/parse/index.d.ts +1 -1
- package/dist/plain/parse/index.js +1 -1
- package/dist/plain/parse/parseDateTimeWithPattern.d.ts +16 -3
- package/dist/plain/parse/parseDateTimeWithPattern.js +20 -5
- package/dist/plain/parse/parseDateWithPattern.d.ts +17 -3
- package/dist/plain/parse/parseDateWithPattern.js +21 -5
- package/dist/plain/parse/{parseSql.d.ts → parseSqlDateTime.d.ts} +8 -8
- package/dist/plain/parse/{parseSql.js → parseSqlDateTime.js} +8 -8
- package/dist/plain/parse/parseTimeWithPattern.js +1 -0
- package/dist/plain/parse/parseUnitFromDate.d.ts +3 -0
- package/dist/plain/parse/parseUnitFromDate.js +5 -1
- package/dist/plain/parse/parseUnitFromDateTime.d.ts +3 -0
- package/dist/plain/parse/parseUnitFromDateTime.js +5 -1
- package/dist/plain/parse/parseYearFromDate.d.ts +5 -2
- package/dist/plain/parse/parseYearFromDate.js +7 -3
- package/dist/plain/parse/parseYearFromDateTime.d.ts +4 -2
- package/dist/plain/parse/parseYearFromDateTime.js +6 -3
- package/dist/plain/validate/index.d.ts +1 -0
- package/dist/plain/validate/index.js +1 -0
- package/dist/plain/validate/isValidSqlDateTime.d.ts +33 -0
- package/dist/plain/validate/isValidSqlDateTime.js +36 -0
- package/dist/precision/convert/fromNanoseconds.d.ts +9 -3
- package/dist/precision/convert/fromNanoseconds.js +9 -3
- package/dist/regex/epcis.d.ts +60 -0
- package/dist/regex/epcis.js +60 -0
- package/dist/regex/http-date.d.ts +6 -4
- package/dist/regex/http-date.js +6 -4
- package/dist/regex/index.d.ts +1 -0
- package/dist/regex/index.js +1 -0
- package/dist/regex/rfc-2822.d.ts +2 -0
- package/dist/regex/rfc-2822.js +2 -0
- package/dist/regex/rfc-3339.d.ts +3 -1
- package/dist/regex/rfc-3339.js +3 -1
- package/dist/regex/sql-date-time.d.ts +2 -1
- package/dist/regex/sql-date-time.js +2 -1
- package/dist/regex/time-zone-like.d.ts +3 -2
- package/dist/regex/time-zone-like.js +3 -2
- package/dist/regex/utc-offset.d.ts +2 -1
- package/dist/regex/utc-offset.js +2 -1
- package/dist/transport/calculate/crossingTime.d.ts +6 -1
- package/dist/transport/calculate/crossingTime.js +6 -1
- package/dist/transport/calculate/cutoffAt.d.ts +6 -1
- package/dist/transport/calculate/cutoffAt.js +2 -0
- package/dist/transport/calculate/cutoffSchedule.d.ts +6 -1
- package/dist/transport/calculate/cutoffSchedule.js +2 -0
- package/dist/transport/calculate/dwellTime.d.ts +6 -1
- package/dist/transport/calculate/dwellTime.js +6 -1
- package/dist/transport/calculate/scheduleDelivery.d.ts +13 -5
- package/dist/transport/calculate/scheduleDelivery.js +6 -1
- package/dist/transport/convert/etaAtZone.d.ts +6 -1
- package/dist/transport/convert/etaAtZone.js +6 -1
- package/dist/types/business-calendar.d.ts +5 -4
- package/dist/types/duty.d.ts +777 -0
- package/dist/types/duty.js +0 -0
- package/dist/types/edi.d.ts +407 -0
- package/dist/types/edi.js +0 -0
- package/dist/types/epcis.d.ts +25 -0
- package/dist/types/epcis.js +0 -0
- package/dist/types/exact-duration-unit.d.ts +8 -0
- package/dist/types/exact-duration-unit.js +0 -0
- package/dist/types/free-time-options.d.ts +4 -3
- package/dist/types/index.d.ts +5 -0
- package/dist/types/index.js +5 -0
- package/dist/types/operating-schedule.d.ts +3 -2
- package/dist/types/two-digit-year.d.ts +23 -0
- package/dist/types/two-digit-year.js +0 -0
- package/dist/types/zone-bucket-unit.d.ts +1 -1
- package/dist/unix/calculate/addUnix.d.ts +11 -2
- package/dist/unix/calculate/addUnix.js +14 -11
- package/dist/unix/calculate/diffUnix.d.ts +10 -2
- package/dist/unix/calculate/diffUnix.js +11 -6
- package/dist/unix/calculate/diffUnixAsDuration.d.ts +10 -2
- package/dist/unix/calculate/diffUnixAsDuration.js +10 -5
- package/dist/unix/calculate/endOfQuarterForUnix.d.ts +10 -2
- package/dist/unix/calculate/endOfQuarterForUnix.js +6 -0
- package/dist/unix/calculate/endOfUnix.d.ts +11 -2
- package/dist/unix/calculate/endOfUnix.js +7 -0
- package/dist/unix/calculate/isBetweenUnix.d.ts +3 -2
- package/dist/unix/calculate/isBetweenUnix.js +3 -3
- package/dist/unix/calculate/roundUnix.d.ts +10 -2
- package/dist/unix/calculate/roundUnix.js +13 -6
- package/dist/unix/calculate/setUnix.d.ts +25 -5
- package/dist/unix/calculate/setUnix.js +33 -12
- package/dist/unix/calculate/startOfQuarterForUnix.d.ts +10 -2
- package/dist/unix/calculate/startOfQuarterForUnix.js +6 -0
- package/dist/unix/calculate/startOfUnix.d.ts +11 -2
- package/dist/unix/calculate/startOfUnix.js +7 -0
- package/dist/unix/calculate/subtractUnix.d.ts +10 -2
- package/dist/unix/calculate/subtractUnix.js +13 -11
- package/dist/unix/compare/areUnixEqualBy.d.ts +11 -2
- package/dist/unix/compare/areUnixEqualBy.js +7 -0
- package/dist/unix/convert/convertUnixToPlainDate.d.ts +5 -2
- package/dist/unix/convert/convertUnixToPlainDate.js +5 -4
- package/dist/unix/convert/convertUnixToPlainDateTime.d.ts +5 -2
- package/dist/unix/convert/convertUnixToPlainDateTime.js +5 -4
- package/dist/unix/convert/convertUnixToPlainTime.d.ts +5 -2
- package/dist/unix/convert/convertUnixToPlainTime.js +5 -4
- package/dist/unix/convert/convertUnixToZoned.d.ts +5 -1
- package/dist/unix/convert/convertUnixToZoned.js +5 -1
- package/dist/unix/format/formatCalendarUnix.d.ts +6 -2
- package/dist/unix/format/formatCalendarUnix.js +6 -1
- package/dist/unix/format/formatRelativeUnix.d.ts +11 -3
- package/dist/unix/format/formatRelativeUnix.js +13 -5
- package/dist/unix/format/formatUnix.d.ts +7 -2
- package/dist/unix/format/formatUnix.js +4 -0
- package/dist/unix/get/getUnixDay.d.ts +1 -3
- package/dist/unix/get/getUnixDay.js +5 -12
- package/dist/unix/get/getUnixHour.d.ts +1 -3
- package/dist/unix/get/getUnixHour.js +5 -12
- package/dist/unix/get/getUnixMicrosecond.d.ts +1 -3
- package/dist/unix/get/getUnixMicrosecond.js +4 -11
- package/dist/unix/get/getUnixMillisecond.d.ts +1 -3
- package/dist/unix/get/getUnixMillisecond.js +5 -12
- package/dist/unix/get/getUnixMinute.d.ts +1 -3
- package/dist/unix/get/getUnixMinute.js +5 -12
- package/dist/unix/get/getUnixMonth.d.ts +1 -3
- package/dist/unix/get/getUnixMonth.js +5 -12
- package/dist/unix/get/getUnixNanosecond.d.ts +1 -3
- package/dist/unix/get/getUnixNanosecond.js +4 -11
- package/dist/unix/get/getUnixNowUnit.d.ts +2 -0
- package/dist/unix/get/getUnixNowUnit.js +2 -0
- package/dist/unix/get/getUnixSecond.d.ts +1 -3
- package/dist/unix/get/getUnixSecond.js +5 -12
- package/dist/unix/get/getUnixYear.d.ts +3 -3
- package/dist/unix/get/getUnixYear.js +5 -12
- package/dist/unix/interval/intervalCountUnix.d.ts +11 -2
- package/dist/unix/interval/intervalCountUnix.js +7 -0
- package/dist/unix/interval/intervalFromDurationUnix.d.ts +10 -2
- package/dist/unix/interval/intervalFromDurationUnix.js +12 -7
- package/dist/unix/interval/intervalLengthUnix.d.ts +10 -2
- package/dist/unix/interval/intervalLengthUnix.js +6 -0
- package/dist/unix/interval/intervalOverlappingDaysUnix.d.ts +10 -2
- package/dist/unix/interval/intervalOverlappingDaysUnix.js +10 -5
- package/dist/unix/interval/splitIntervalByUnitUnix.d.ts +10 -2
- package/dist/unix/interval/splitIntervalByUnitUnix.js +12 -6
- package/dist/unix/parse/parseDateFromUnix.d.ts +4 -2
- package/dist/unix/parse/parseDateFromUnix.js +3 -3
- package/dist/unix/parse/parseDayFromUnix.d.ts +4 -2
- package/dist/unix/parse/parseDayOfWeekFromUnix.d.ts +4 -2
- package/dist/unix/parse/parseDayOfWeekFromUnix.js +2 -2
- package/dist/unix/parse/parseHourFromUnix.d.ts +4 -2
- package/dist/unix/parse/parseMicrosecondFromUnix.d.ts +4 -2
- package/dist/unix/parse/parseMillisecondFromUnix.d.ts +4 -2
- package/dist/unix/parse/parseMinuteFromUnix.d.ts +4 -2
- package/dist/unix/parse/parseMonthFromUnix.d.ts +4 -2
- package/dist/unix/parse/parseNanosecondFromUnix.d.ts +4 -2
- package/dist/unix/parse/parseSecondFromUnix.d.ts +4 -2
- package/dist/unix/parse/parseTimeFromUnix.d.ts +5 -2
- package/dist/unix/parse/parseTimeFromUnix.js +4 -3
- package/dist/unix/parse/parseUnitFromUnix.d.ts +9 -3
- package/dist/unix/parse/parseUnitFromUnix.js +21 -14
- package/dist/unix/parse/parseWeekFromUnix.d.ts +3 -2
- package/dist/unix/parse/parseWeekFromUnix.js +4 -4
- package/dist/unix/parse/parseYearFromUnix.d.ts +8 -3
- package/dist/unix/parse/parseYearFromUnix.js +4 -1
- package/dist/unix/validate/isValidUnixUnit.d.ts +1 -1
- package/dist/utc/calculate/addUtc.js +4 -7
- package/dist/utc/calculate/setUtc.d.ts +16 -3
- package/dist/utc/calculate/setUtc.js +22 -8
- package/dist/utc/calculate/subtractUtc.js +4 -7
- package/dist/utc/convert/convertUtcToPlainDate.d.ts +8 -2
- package/dist/utc/convert/convertUtcToPlainDate.js +10 -7
- package/dist/utc/convert/convertUtcToPlainDateTime.d.ts +9 -2
- package/dist/utc/convert/convertUtcToPlainDateTime.js +12 -13
- package/dist/utc/convert/convertUtcToPlainTime.d.ts +5 -2
- package/dist/utc/convert/convertUtcToPlainTime.js +7 -6
- package/dist/utc/convert/convertUtcToZoned.d.ts +5 -1
- package/dist/utc/convert/convertUtcToZoned.js +5 -1
- package/dist/utc/format/formatCalendarUtc.d.ts +6 -2
- package/dist/utc/format/formatCalendarUtc.js +6 -1
- package/dist/utc/format/{formatHttp.d.ts → formatHttpDate.d.ts} +7 -7
- package/dist/utc/format/{formatHttp.js → formatHttpDate.js} +7 -7
- package/dist/utc/format/formatRelativeUtc.d.ts +11 -3
- package/dist/utc/format/formatRelativeUtc.js +13 -5
- package/dist/utc/format/formatUtc.d.ts +7 -2
- package/dist/utc/format/formatUtc.js +4 -0
- package/dist/utc/format/index.d.ts +1 -1
- package/dist/utc/format/index.js +1 -1
- package/dist/utc/get/getUtcDay.d.ts +1 -3
- package/dist/utc/get/getUtcDay.js +5 -12
- package/dist/utc/get/getUtcHour.d.ts +1 -3
- package/dist/utc/get/getUtcHour.js +5 -12
- package/dist/utc/get/getUtcMicrosecond.d.ts +1 -3
- package/dist/utc/get/getUtcMicrosecond.js +4 -11
- package/dist/utc/get/getUtcMillisecond.d.ts +1 -3
- package/dist/utc/get/getUtcMillisecond.js +5 -12
- package/dist/utc/get/getUtcMinute.d.ts +1 -3
- package/dist/utc/get/getUtcMinute.js +5 -12
- package/dist/utc/get/getUtcMonth.d.ts +1 -3
- package/dist/utc/get/getUtcMonth.js +5 -12
- package/dist/utc/get/getUtcNanosecond.d.ts +1 -3
- package/dist/utc/get/getUtcNanosecond.js +4 -11
- package/dist/utc/get/getUtcNow.d.ts +1 -3
- package/dist/utc/get/getUtcNow.js +2 -9
- package/dist/utc/get/getUtcNowUnit.d.ts +2 -0
- package/dist/utc/get/getUtcNowUnit.js +2 -0
- package/dist/utc/get/getUtcSecond.d.ts +1 -3
- package/dist/utc/get/getUtcSecond.js +5 -12
- package/dist/utc/get/getUtcYear.d.ts +3 -3
- package/dist/utc/get/getUtcYear.js +5 -12
- package/dist/utc/interval/intervalXorAllUtc.js +2 -2
- package/dist/utc/interval/mergeIntervalsUtc.js +2 -2
- package/dist/utc/parse/index.d.ts +1 -1
- package/dist/utc/parse/index.js +1 -1
- package/dist/utc/parse/parseDateFromUtc.d.ts +4 -2
- package/dist/utc/parse/parseDateFromUtc.js +2 -2
- package/dist/utc/parse/parseDayFromUtc.d.ts +4 -2
- package/dist/utc/parse/parseDayFromUtc.js +2 -2
- package/dist/utc/parse/parseDayOfWeekFromUtc.d.ts +4 -2
- package/dist/utc/parse/parseDayOfWeekFromUtc.js +4 -4
- package/dist/utc/parse/parseHourFromUtc.d.ts +4 -2
- package/dist/utc/parse/parseHourFromUtc.js +2 -2
- package/dist/utc/parse/{parseHttp.d.ts → parseHttpDate.d.ts} +12 -12
- package/dist/utc/parse/{parseHttp.js → parseHttpDate.js} +12 -12
- package/dist/utc/parse/parseMicrosecondFromUtc.d.ts +4 -2
- package/dist/utc/parse/parseMicrosecondFromUtc.js +2 -2
- package/dist/utc/parse/parseMillisecondFromUtc.d.ts +4 -2
- package/dist/utc/parse/parseMillisecondFromUtc.js +2 -2
- package/dist/utc/parse/parseMinuteFromUtc.d.ts +4 -2
- package/dist/utc/parse/parseMinuteFromUtc.js +2 -2
- package/dist/utc/parse/parseMonthFromUtc.d.ts +4 -2
- package/dist/utc/parse/parseMonthFromUtc.js +2 -2
- package/dist/utc/parse/parseNanosecondFromUtc.d.ts +4 -2
- package/dist/utc/parse/parseNanosecondFromUtc.js +2 -2
- package/dist/utc/parse/parseSecondFromUtc.d.ts +4 -2
- package/dist/utc/parse/parseSecondFromUtc.js +2 -2
- package/dist/utc/parse/parseTimeFromUtc.d.ts +5 -2
- package/dist/utc/parse/parseTimeFromUtc.js +5 -4
- package/dist/utc/parse/parseUnitFromUtc.d.ts +10 -3
- package/dist/utc/parse/parseUnitFromUtc.js +11 -5
- package/dist/utc/parse/parseWeekFromUtc.d.ts +4 -2
- package/dist/utc/parse/parseWeekFromUtc.js +4 -4
- package/dist/utc/parse/parseYearFromUtc.d.ts +8 -4
- package/dist/utc/parse/parseYearFromUtc.js +8 -5
- package/dist/utc/validate/index.d.ts +2 -0
- package/dist/utc/validate/index.js +2 -0
- package/dist/utc/validate/isValidHttpDate.d.ts +35 -0
- package/dist/utc/validate/isValidHttpDate.js +38 -0
- package/dist/utc/validate/isValidUtc.d.ts +4 -0
- package/dist/utc/validate/isValidUtc.js +4 -0
- package/dist/utc/validate/isValidUtcTimestamp.d.ts +43 -0
- package/dist/utc/validate/isValidUtcTimestamp.js +48 -0
- package/dist/zoned/calculate/addZoned.js +4 -7
- package/dist/zoned/calculate/setZoned.d.ts +19 -5
- package/dist/zoned/calculate/setZoned.js +26 -9
- package/dist/zoned/calculate/subtractZoned.js +4 -7
- package/dist/zoned/convert/convertPlainDateTimeToZoned.d.ts +4 -1
- package/dist/zoned/convert/convertPlainDateTimeToZoned.js +4 -1
- package/dist/zoned/convert/convertZonedToZoned.d.ts +5 -1
- package/dist/zoned/convert/convertZonedToZoned.js +5 -1
- package/dist/zoned/format/formatCalendarZoned.js +2 -1
- package/dist/zoned/format/formatRelativeZoned.js +2 -1
- package/dist/zoned/format/formatTimeZoneName.d.ts +5 -1
- package/dist/zoned/format/formatTimeZoneName.js +5 -1
- package/dist/zoned/get/getDstTransitions.d.ts +5 -3
- package/dist/zoned/get/getDstTransitions.js +12 -7
- package/dist/zoned/get/getSystemTimeZone.d.ts +3 -1
- package/dist/zoned/get/getSystemTimeZone.js +5 -2
- package/dist/zoned/get/getTimeZoneOffset.d.ts +10 -2
- package/dist/zoned/get/getTimeZoneOffset.js +18 -5
- package/dist/zoned/get/getZonedDay.d.ts +2 -1
- package/dist/zoned/get/getZonedDay.js +6 -7
- package/dist/zoned/get/getZonedDayOfWeek.d.ts +2 -1
- package/dist/zoned/get/getZonedDayOfWeek.js +6 -5
- package/dist/zoned/get/getZonedHour.d.ts +2 -1
- package/dist/zoned/get/getZonedHour.js +6 -7
- package/dist/zoned/get/getZonedMicrosecond.d.ts +2 -1
- package/dist/zoned/get/getZonedMicrosecond.js +6 -5
- package/dist/zoned/get/getZonedMillisecond.d.ts +2 -1
- package/dist/zoned/get/getZonedMillisecond.js +6 -7
- package/dist/zoned/get/getZonedMinute.d.ts +2 -1
- package/dist/zoned/get/getZonedMinute.js +6 -7
- package/dist/zoned/get/getZonedMonth.d.ts +2 -1
- package/dist/zoned/get/getZonedMonth.js +6 -7
- package/dist/zoned/get/getZonedNanosecond.d.ts +2 -1
- package/dist/zoned/get/getZonedNanosecond.js +6 -5
- package/dist/zoned/get/getZonedNow.d.ts +5 -1
- package/dist/zoned/get/getZonedNow.js +5 -1
- package/dist/zoned/get/getZonedNowUnit.d.ts +6 -3
- package/dist/zoned/get/getZonedNowUnit.js +10 -7
- package/dist/zoned/get/getZonedSecond.d.ts +2 -1
- package/dist/zoned/get/getZonedSecond.js +6 -7
- package/dist/zoned/get/getZonedToday.d.ts +2 -1
- package/dist/zoned/get/getZonedToday.js +6 -5
- package/dist/zoned/get/getZonedWeekOfYear.d.ts +2 -1
- package/dist/zoned/get/getZonedWeekOfYear.js +6 -5
- package/dist/zoned/get/getZonedYear.d.ts +4 -1
- package/dist/zoned/get/getZonedYear.js +9 -7
- package/dist/zoned/interval/intervalXorAllZoned.js +2 -2
- package/dist/zoned/interval/mergeIntervalsZoned.js +2 -2
- package/dist/zoned/parse/parseUnitFromZoned.d.ts +4 -1
- package/dist/zoned/parse/parseUnitFromZoned.js +5 -1
- package/dist/zoned/parse/parseYearFromZoned.d.ts +4 -2
- package/dist/zoned/parse/parseYearFromZoned.js +6 -3
- package/dist/zoned/validate/hasDaylightSaving.d.ts +4 -2
- package/dist/zoned/validate/hasDaylightSaving.js +13 -7
- package/dist/zoned/validate/index.d.ts +2 -0
- package/dist/zoned/validate/index.js +2 -0
- package/dist/zoned/validate/isValidRfc2822DateTime.d.ts +32 -0
- package/dist/zoned/validate/isValidRfc2822DateTime.js +35 -0
- package/dist/zoned/validate/isValidRfc3339DateTime.d.ts +31 -0
- package/dist/zoned/validate/isValidRfc3339DateTime.js +34 -0
- package/dist/zoned/validate/isValidTimeZone.d.ts +5 -1
- package/dist/zoned/validate/isValidTimeZone.js +6 -2
- package/package.json +50 -1
- package/skills/gmt-arithmetic/SKILL.md +99 -12
- package/skills/gmt-basics/SKILL.md +57 -15
- package/skills/gmt-integration/SKILL.md +24 -9
- package/skills/gmt-timezone/SKILL.md +134 -29
- package/dist/internal/unixZonedDateTime.d.ts +0 -22
- package/dist/internal/unixZonedDateTime.js +0 -32
- package/dist/internal/utcZonedDateTime.d.ts +0 -19
- package/dist/internal/utcZonedDateTime.js +0 -31
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { isObject } from "./isObject.js";
|
|
2
|
+
import { isValidAmount } from "./isValidAmount.js";
|
|
3
|
+
/**
|
|
4
|
+
* The ten fields TC39 Temporal reads from a duration-like object, in the order it reads them:
|
|
5
|
+
* ToTemporalPartialDurationRecord (7.5.18) gets them in alphabetical order.
|
|
6
|
+
*/
|
|
7
|
+
const DURATION_UNIT_NAMES = [
|
|
8
|
+
"days",
|
|
9
|
+
"hours",
|
|
10
|
+
"microseconds",
|
|
11
|
+
"milliseconds",
|
|
12
|
+
"minutes",
|
|
13
|
+
"months",
|
|
14
|
+
"nanoseconds",
|
|
15
|
+
"seconds",
|
|
16
|
+
"weeks",
|
|
17
|
+
"years",
|
|
18
|
+
];
|
|
19
|
+
/**
|
|
20
|
+
* Read a `units` argument, such as `{ minutes: 15 }`, the way Temporal reads a duration-like
|
|
21
|
+
* object, and return the amounts as a fresh plain object that holds only the caller's units.
|
|
22
|
+
*
|
|
23
|
+
* The check and the read are one pass, so nothing reaches Temporal that was not checked:
|
|
24
|
+
*
|
|
25
|
+
* - `units` must be an Object (`isObject`), a function included.
|
|
26
|
+
* - An own enumerable string key that `isAllowed` refuses returns `null`, whatever its value.
|
|
27
|
+
* This is the guard against a misspelt key, which Temporal on its own ignores. A symbol key and
|
|
28
|
+
* a non-enumerable key that is no unit name are not entries and are ignored.
|
|
29
|
+
* - Each of the ten unit names is read once with an ordinary property get, in the order Temporal's
|
|
30
|
+
* ToTemporalPartialDurationRecord reads them, so an inherited or non-enumerable unit applies.
|
|
31
|
+
* `undefined` means the unit is absent. Any other value must be a finite number; nothing is
|
|
32
|
+
* converted to one.
|
|
33
|
+
* - A unit `isAllowed` refuses returns `null` when its amount is not zero. Zero is no amount:
|
|
34
|
+
* Temporal too tells a calendar duration from an exact one by its nonzero fields.
|
|
35
|
+
* - No allowed unit present returns `null`.
|
|
36
|
+
*
|
|
37
|
+
* Whole numbers, one sign and the range are left to Temporal, which throws for each. A getter
|
|
38
|
+
* that throws is not caught here; the calling function's own catch returns its sentinel.
|
|
39
|
+
*
|
|
40
|
+
* @param units the caller's `units` argument
|
|
41
|
+
* @param isAllowed type guard for the units the calling function takes
|
|
42
|
+
* @returns a new plain object of the allowed units that were present, or null on invalid input
|
|
43
|
+
*
|
|
44
|
+
* @example readDurationUnits({ minutes: 15 }, isValidTimeDurationUnit) // { minutes: 15 }
|
|
45
|
+
* @example readDurationUnits({ minutes: 15, hours: undefined }, isValidTimeDurationUnit) // { minutes: 15 }
|
|
46
|
+
* @example readDurationUnits({ minutes: 15, hour: 1 }, isValidTimeDurationUnit) // null (unknown key)
|
|
47
|
+
* @example readDurationUnits(Object.create({ minutes: "15" }), isValidTimeDurationUnit) // null (not a number)
|
|
48
|
+
* @example readDurationUnits(Object.create({ days: 1 }), isValidTimeDurationUnit) // null (a unit outside the set)
|
|
49
|
+
* @example readDurationUnits({}, isValidTimeDurationUnit) // null
|
|
50
|
+
*/
|
|
51
|
+
export function readDurationUnits(units, isAllowed) {
|
|
52
|
+
if (!isObject(units)) {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
if (!Object.keys(units).every((key) => isAllowed(key))) {
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
const record = units;
|
|
59
|
+
const read = {};
|
|
60
|
+
let present = false;
|
|
61
|
+
for (const name of DURATION_UNIT_NAMES) {
|
|
62
|
+
const amount = record[name];
|
|
63
|
+
if (amount === undefined) {
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
if (!isValidAmount(amount)) {
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
if (isAllowed(name)) {
|
|
70
|
+
read[name] = amount;
|
|
71
|
+
present = true;
|
|
72
|
+
}
|
|
73
|
+
else if (amount !== 0) {
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return present ? read : null;
|
|
78
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/** The date fields `setDate` takes. */
|
|
2
|
+
export declare const DATE_FIELDS: readonly ["year", "month", "monthCode", "day"];
|
|
3
|
+
/** The time fields `setTime` takes. */
|
|
4
|
+
export declare const TIME_FIELDS: readonly ["hour", "minute", "second", "millisecond", "microsecond", "nanosecond"];
|
|
5
|
+
/** The fields `setDateTime`, `setUtc`, `setUnix` and `setZoned` take. */
|
|
6
|
+
export declare const DATE_TIME_FIELDS: readonly ["year", "month", "monthCode", "day", "hour", "minute", "second", "millisecond", "microsecond", "nanosecond"];
|
|
7
|
+
/** The one field whose value is a string; every other field a `set*` function takes is a number. */
|
|
8
|
+
declare const STRING_FIELD = "monthCode";
|
|
9
|
+
/** A field a `set*` function may take. */
|
|
10
|
+
type SetField = (typeof DATE_TIME_FIELDS)[number];
|
|
11
|
+
/** The checked values of the fields in `Field`: `monthCode` a string, every other an integer. */
|
|
12
|
+
export type SetFields<Field extends SetField> = {
|
|
13
|
+
[Name in Field]?: Name extends typeof STRING_FIELD ? string : number;
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Read the `fields` argument of a `set*` function the way Temporal's `with` reads it, and return
|
|
17
|
+
* the values as a fresh plain object that holds only the fields the function takes.
|
|
18
|
+
*
|
|
19
|
+
* The check and the read are one pass, so nothing reaches Temporal that was not checked:
|
|
20
|
+
*
|
|
21
|
+
* - `fields` must be an Object (`isObject`), a function included, and not a Temporal object that
|
|
22
|
+
* holds a date or a time (TC39 IsPartialTemporalObject).
|
|
23
|
+
* - An own enumerable string key outside `allowedFields` returns `null`, whatever its value: the guard
|
|
24
|
+
* against a misspelt key. A symbol key is ignored.
|
|
25
|
+
* - Each property `with` reads is read once with an ordinary property get, in the order `with`
|
|
26
|
+
* reads them, so an inherited, non-enumerable or getter field applies. `undefined` means absent.
|
|
27
|
+
* A defined property outside `allowedFields` (another type's field, an era, an offset, a
|
|
28
|
+
* `calendar` or a `timeZone`) returns `null`.
|
|
29
|
+
* - A value is not converted: `monthCode` must be a string, and every other field a number that is
|
|
30
|
+
* an integer. `null`, a numeric string, a boolean and a fraction return `null`, where Temporal
|
|
31
|
+
* would convert or truncate them. A bigint, `NaN` and an infinity return `null` too; Temporal
|
|
32
|
+
* throws for them (ToIntegerWithTruncation).
|
|
33
|
+
*
|
|
34
|
+
* Range and overflow are left to Temporal. An empty result means nothing is set: the function
|
|
35
|
+
* returns its value unchanged, where Temporal's `with` would throw. A getter that throws is not
|
|
36
|
+
* caught here, nor is a Proxy's `getPrototypeOf` trap that throws; the calling function's own catch
|
|
37
|
+
* returns its sentinel.
|
|
38
|
+
*
|
|
39
|
+
* @param fields the caller's `fields` argument
|
|
40
|
+
* @param allowedFields the fields the calling function takes
|
|
41
|
+
* @returns a new plain object of the fields set, empty when none is, or null on invalid input
|
|
42
|
+
*
|
|
43
|
+
* @example readSetFields({ year: 2025 }, DATE_FIELDS) // { year: 2025 }
|
|
44
|
+
* @example readSetFields({}, DATE_FIELDS) // {} (nothing set)
|
|
45
|
+
* @example readSetFields({ year: "2025" }, DATE_FIELDS) // null (not converted)
|
|
46
|
+
* @example readSetFields({ year: 2025, yaer: 1 }, DATE_FIELDS) // null (misspelt key)
|
|
47
|
+
* @example readSetFields({ year: 2025, hour: 5 }, DATE_FIELDS) // null (a field setDate does not take)
|
|
48
|
+
*/
|
|
49
|
+
export declare function readSetFields<Field extends SetField>(fields: unknown, allowedFields: readonly Field[]): SetFields<Field> | null;
|
|
50
|
+
export {};
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import { Temporal } from "@js-temporal/polyfill";
|
|
2
|
+
import { isObject } from "./isObject.js";
|
|
3
|
+
/** The date fields `setDate` takes. */
|
|
4
|
+
export const DATE_FIELDS = ["year", "month", "monthCode", "day"];
|
|
5
|
+
/** The time fields `setTime` takes. */
|
|
6
|
+
export const TIME_FIELDS = [
|
|
7
|
+
"hour",
|
|
8
|
+
"minute",
|
|
9
|
+
"second",
|
|
10
|
+
"millisecond",
|
|
11
|
+
"microsecond",
|
|
12
|
+
"nanosecond",
|
|
13
|
+
];
|
|
14
|
+
/** The fields `setDateTime`, `setUtc`, `setUnix` and `setZoned` take. */
|
|
15
|
+
export const DATE_TIME_FIELDS = [...DATE_FIELDS, ...TIME_FIELDS];
|
|
16
|
+
/**
|
|
17
|
+
* Every property TC39 Temporal's `with` methods read from their argument, in the order they read
|
|
18
|
+
* them: `calendar` and `timeZone` first, which IsPartialTemporalObject (13.24) refuses, then the
|
|
19
|
+
* date and time fields and the `offset` that `ZonedDateTime.prototype.with` reads, in code-unit
|
|
20
|
+
* order. PrepareCalendarFields (12.3.3) sorts them so for every `with` that takes a date, and
|
|
21
|
+
* ToTemporalTimeRecord (4.5.12), which `PlainTime.prototype.with` uses, reads its six fields in
|
|
22
|
+
* the same order. The list adds the era fields,
|
|
23
|
+
* which `with` never reads for the ISO 8601 calendar (CalendarExtraFields returns none) and which
|
|
24
|
+
* GMT reads only to refuse them.
|
|
25
|
+
*/
|
|
26
|
+
const WITH_PROPERTY_NAMES = [
|
|
27
|
+
"calendar",
|
|
28
|
+
"timeZone",
|
|
29
|
+
"day",
|
|
30
|
+
"era",
|
|
31
|
+
"eraYear",
|
|
32
|
+
"hour",
|
|
33
|
+
"microsecond",
|
|
34
|
+
"millisecond",
|
|
35
|
+
"minute",
|
|
36
|
+
"month",
|
|
37
|
+
"monthCode",
|
|
38
|
+
"nanosecond",
|
|
39
|
+
"offset",
|
|
40
|
+
"second",
|
|
41
|
+
"year",
|
|
42
|
+
];
|
|
43
|
+
/** The one field whose value is a string; every other field a `set*` function takes is a number. */
|
|
44
|
+
const STRING_FIELD = "monthCode";
|
|
45
|
+
/**
|
|
46
|
+
* For each Temporal class whose objects hold a date or a time (the internal slots TC39
|
|
47
|
+
* IsPartialTemporalObject tests), a getter that throws for any receiver without that slot.
|
|
48
|
+
*/
|
|
49
|
+
const BRANDED_GETTERS = [
|
|
50
|
+
["PlainDate", "calendarId"],
|
|
51
|
+
["PlainDateTime", "calendarId"],
|
|
52
|
+
["PlainMonthDay", "calendarId"],
|
|
53
|
+
["PlainYearMonth", "calendarId"],
|
|
54
|
+
["ZonedDateTime", "calendarId"],
|
|
55
|
+
["PlainTime", "hour"],
|
|
56
|
+
];
|
|
57
|
+
/** Whether `value` holds the internal slot of one class of `namespace`. */
|
|
58
|
+
function isObjectOf(namespace, value) {
|
|
59
|
+
return BRANDED_GETTERS.some(([name, key]) => {
|
|
60
|
+
const prototype = namespace[name]?.prototype;
|
|
61
|
+
const getter = isObject(prototype)
|
|
62
|
+
? Object.getOwnPropertyDescriptor(prototype, key)?.get
|
|
63
|
+
: undefined;
|
|
64
|
+
if (typeof getter !== "function") {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
try {
|
|
68
|
+
getter.call(value);
|
|
69
|
+
return true;
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Whether `value` is an object of the Temporal the host provides on `globalThis`, if any. A
|
|
78
|
+
* malformed host Temporal recognises nothing, so it never changes the result for a field object.
|
|
79
|
+
*/
|
|
80
|
+
function isHostTemporalObject(value) {
|
|
81
|
+
try {
|
|
82
|
+
const host = globalThis.Temporal;
|
|
83
|
+
return (isObject(host) &&
|
|
84
|
+
host !== Temporal &&
|
|
85
|
+
isObjectOf(host, value));
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Whether `value` is a Temporal object that holds a date or a time, from the polyfill GMT uses or
|
|
93
|
+
* from a Temporal the host provides. The test is the one a class's own getter makes: it reads the
|
|
94
|
+
* internal slot, so neither the prototype chain nor any property of `value` decides it.
|
|
95
|
+
*
|
|
96
|
+
* The check calls up to six getters, twelve with a host Temporal, and a throwing getter is slow, so
|
|
97
|
+
* it is skipped when the prototype is `Object.prototype`, `null` or `Function.prototype`: a plain
|
|
98
|
+
* object, an `Object.create(null)` object or a function, which no Temporal class makes.
|
|
99
|
+
*
|
|
100
|
+
* Limits:
|
|
101
|
+
* - An object from a second copy of the polyfill that is not on `globalThis` is not detected and
|
|
102
|
+
* is read as a field bag, which is also what TC39 IsPartialTemporalObject (13.24) does with an
|
|
103
|
+
* object that lacks this polyfill's internal slots.
|
|
104
|
+
* - A Temporal object whose prototype was swapped to one of the three above is not detected
|
|
105
|
+
* either. Its getters are then out of reach, so it reads as setting nothing and the function
|
|
106
|
+
* returns its value unchanged (accepted by owner decision for the speed of the plain case).
|
|
107
|
+
*/
|
|
108
|
+
function isTemporalDateOrTimeObject(value) {
|
|
109
|
+
const prototype = Object.getPrototypeOf(value);
|
|
110
|
+
if (prototype === Object.prototype ||
|
|
111
|
+
prototype === null ||
|
|
112
|
+
prototype === Function.prototype) {
|
|
113
|
+
return false;
|
|
114
|
+
}
|
|
115
|
+
return (isObjectOf(Temporal, value) ||
|
|
116
|
+
isHostTemporalObject(value));
|
|
117
|
+
}
|
|
118
|
+
/** Whether `value` is one Temporal reads for `name` without converting it. */
|
|
119
|
+
function isFieldValue(name, value) {
|
|
120
|
+
return name === STRING_FIELD
|
|
121
|
+
? typeof value === "string"
|
|
122
|
+
: typeof value === "number" && Number.isInteger(value);
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Read the `fields` argument of a `set*` function the way Temporal's `with` reads it, and return
|
|
126
|
+
* the values as a fresh plain object that holds only the fields the function takes.
|
|
127
|
+
*
|
|
128
|
+
* The check and the read are one pass, so nothing reaches Temporal that was not checked:
|
|
129
|
+
*
|
|
130
|
+
* - `fields` must be an Object (`isObject`), a function included, and not a Temporal object that
|
|
131
|
+
* holds a date or a time (TC39 IsPartialTemporalObject).
|
|
132
|
+
* - An own enumerable string key outside `allowedFields` returns `null`, whatever its value: the guard
|
|
133
|
+
* against a misspelt key. A symbol key is ignored.
|
|
134
|
+
* - Each property `with` reads is read once with an ordinary property get, in the order `with`
|
|
135
|
+
* reads them, so an inherited, non-enumerable or getter field applies. `undefined` means absent.
|
|
136
|
+
* A defined property outside `allowedFields` (another type's field, an era, an offset, a
|
|
137
|
+
* `calendar` or a `timeZone`) returns `null`.
|
|
138
|
+
* - A value is not converted: `monthCode` must be a string, and every other field a number that is
|
|
139
|
+
* an integer. `null`, a numeric string, a boolean and a fraction return `null`, where Temporal
|
|
140
|
+
* would convert or truncate them. A bigint, `NaN` and an infinity return `null` too; Temporal
|
|
141
|
+
* throws for them (ToIntegerWithTruncation).
|
|
142
|
+
*
|
|
143
|
+
* Range and overflow are left to Temporal. An empty result means nothing is set: the function
|
|
144
|
+
* returns its value unchanged, where Temporal's `with` would throw. A getter that throws is not
|
|
145
|
+
* caught here, nor is a Proxy's `getPrototypeOf` trap that throws; the calling function's own catch
|
|
146
|
+
* returns its sentinel.
|
|
147
|
+
*
|
|
148
|
+
* @param fields the caller's `fields` argument
|
|
149
|
+
* @param allowedFields the fields the calling function takes
|
|
150
|
+
* @returns a new plain object of the fields set, empty when none is, or null on invalid input
|
|
151
|
+
*
|
|
152
|
+
* @example readSetFields({ year: 2025 }, DATE_FIELDS) // { year: 2025 }
|
|
153
|
+
* @example readSetFields({}, DATE_FIELDS) // {} (nothing set)
|
|
154
|
+
* @example readSetFields({ year: "2025" }, DATE_FIELDS) // null (not converted)
|
|
155
|
+
* @example readSetFields({ year: 2025, yaer: 1 }, DATE_FIELDS) // null (misspelt key)
|
|
156
|
+
* @example readSetFields({ year: 2025, hour: 5 }, DATE_FIELDS) // null (a field setDate does not take)
|
|
157
|
+
*/
|
|
158
|
+
export function readSetFields(fields, allowedFields) {
|
|
159
|
+
const allowed = allowedFields;
|
|
160
|
+
if (!isObject(fields) || isTemporalDateOrTimeObject(fields)) {
|
|
161
|
+
return null;
|
|
162
|
+
}
|
|
163
|
+
if (!Object.keys(fields).every((key) => allowed.includes(key))) {
|
|
164
|
+
return null;
|
|
165
|
+
}
|
|
166
|
+
const record = fields;
|
|
167
|
+
const read = {};
|
|
168
|
+
for (const name of WITH_PROPERTY_NAMES) {
|
|
169
|
+
const value = record[name];
|
|
170
|
+
if (value === undefined) {
|
|
171
|
+
continue;
|
|
172
|
+
}
|
|
173
|
+
if (!allowed.includes(name) || !isFieldValue(name, value)) {
|
|
174
|
+
return null;
|
|
175
|
+
}
|
|
176
|
+
read[name] = value;
|
|
177
|
+
}
|
|
178
|
+
return read;
|
|
179
|
+
}
|
|
@@ -14,7 +14,7 @@ import type { RelativeUnit } from "../types/index.js";
|
|
|
14
14
|
* stricter than Temporal: GetOption converts any value with ToString, so Temporal accepts
|
|
15
15
|
* `["day"]` and an object whose `toString` returns `"day"` (test262
|
|
16
16
|
* `largestunit-wrong-type.js`). GMT takes string inputs, and its other unit readers
|
|
17
|
-
* (`roundDate`, `roundDateTime`, `roundUtc`, `roundZoned`, `startOfDate`, `
|
|
17
|
+
* (`roundDate`, `roundDateTime`, `roundUtc`, `roundZoned`, `startOfDate`, `totalDuration`,
|
|
18
18
|
* `areDatesEqualBy`) reject a non-string the same way, so this one does not convert either.
|
|
19
19
|
*
|
|
20
20
|
* @param largestUnit the option as read from the caller's object, `undefined` when absent
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
* stricter than Temporal: GetOption converts any value with ToString, so Temporal accepts
|
|
14
14
|
* `["day"]` and an object whose `toString` returns `"day"` (test262
|
|
15
15
|
* `largestunit-wrong-type.js`). GMT takes string inputs, and its other unit readers
|
|
16
|
-
* (`roundDate`, `roundDateTime`, `roundUtc`, `roundZoned`, `startOfDate`, `
|
|
16
|
+
* (`roundDate`, `roundDateTime`, `roundUtc`, `roundZoned`, `startOfDate`, `totalDuration`,
|
|
17
17
|
* `areDatesEqualBy`) reject a non-string the same way, so this one does not convert either.
|
|
18
18
|
*
|
|
19
19
|
* @param largestUnit the option as read from the caller's object, `undefined` when absent
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
import type { Temporal } from "@js-temporal/polyfill";
|
|
2
2
|
import { type UnixEpochUnit } from "./unixEpochValue.js";
|
|
3
|
+
import { type ZoneFrame } from "./zoneFrame.js";
|
|
3
4
|
export interface ResolvedUnixInterval {
|
|
4
5
|
startVal: Temporal.ZonedDateTime;
|
|
5
6
|
endVal: Temporal.ZonedDateTime;
|
|
6
7
|
resolvedUnit: Temporal.DateTimeUnit;
|
|
7
8
|
epochUnit: UnixEpochUnit;
|
|
9
|
+
/** The frame both ends were placed on; `frameInstant` turns a result back into an instant. */
|
|
10
|
+
frame: ZoneFrame;
|
|
8
11
|
}
|
|
9
12
|
/**
|
|
10
13
|
* Resolve the shared arguments of `intervalLengthUnix`, `intervalCountUnix` and
|
|
@@ -13,13 +16,16 @@ export interface ResolvedUnixInterval {
|
|
|
13
16
|
*
|
|
14
17
|
* - Epochs follow the one `unix/` grammar (`parseUnixEpochValue`) and must name Temporal instants.
|
|
15
18
|
* - `epochUnit` defaults to `"milliseconds"`; `timeZone` defaults to `"UTC"` (`"local"` is the
|
|
16
|
-
* system zone
|
|
19
|
+
* system zone; a time zone identifier or a stored UTC offset `±HH:MM[:SS]` is read as written;
|
|
20
|
+
* anything else is invalid).
|
|
21
|
+
* - The ends are placed with `frameZoned`: for a seconds offset they sit in the offset's
|
|
22
|
+
* whole-minute zone, moved by its seconds, to compute with and never to write.
|
|
17
23
|
*
|
|
18
24
|
* @param start interval start epoch
|
|
19
25
|
* @param end interval end epoch
|
|
20
26
|
* @param unit unit name, singular or plural
|
|
21
27
|
* @param options optional `{ epochUnit, timeZone }`
|
|
22
|
-
* @returns the zoned ends, singular unit
|
|
28
|
+
* @returns the zoned ends, singular unit, epoch unit and frame, or null on invalid input
|
|
23
29
|
*
|
|
24
30
|
* @example resolveUnixIntervalPair(0, 86400, "days", { epochUnit: "seconds" })?.resolvedUnit // "day"
|
|
25
31
|
* @example resolveUnixIntervalPair(10, 0, "day") // null (reversed)
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { normalizeTimeZone } from "./normalizeTimeZone.js";
|
|
2
1
|
import { resolveDateTimeUnit } from "./resolveDateTimeUnit.js";
|
|
3
2
|
import { parseUnixEpochInterval, resolveUnixEpochUnit, unixEpochToInstant, } from "./unixEpochValue.js";
|
|
4
3
|
import { isValidDateTimeUnit } from "../plain/validate/index.js";
|
|
4
|
+
import { frameZoned, normalizeZoneFrame } from "./zoneFrame.js";
|
|
5
5
|
/**
|
|
6
6
|
* Resolve the shared arguments of `intervalLengthUnix`, `intervalCountUnix` and
|
|
7
7
|
* `splitIntervalByUnitUnix`: a non-reversed epoch pair in `epochUnit`, a singular-or-plural
|
|
@@ -9,13 +9,16 @@ import { isValidDateTimeUnit } from "../plain/validate/index.js";
|
|
|
9
9
|
*
|
|
10
10
|
* - Epochs follow the one `unix/` grammar (`parseUnixEpochValue`) and must name Temporal instants.
|
|
11
11
|
* - `epochUnit` defaults to `"milliseconds"`; `timeZone` defaults to `"UTC"` (`"local"` is the
|
|
12
|
-
* system zone
|
|
12
|
+
* system zone; a time zone identifier or a stored UTC offset `±HH:MM[:SS]` is read as written;
|
|
13
|
+
* anything else is invalid).
|
|
14
|
+
* - The ends are placed with `frameZoned`: for a seconds offset they sit in the offset's
|
|
15
|
+
* whole-minute zone, moved by its seconds, to compute with and never to write.
|
|
13
16
|
*
|
|
14
17
|
* @param start interval start epoch
|
|
15
18
|
* @param end interval end epoch
|
|
16
19
|
* @param unit unit name, singular or plural
|
|
17
20
|
* @param options optional `{ epochUnit, timeZone }`
|
|
18
|
-
* @returns the zoned ends, singular unit
|
|
21
|
+
* @returns the zoned ends, singular unit, epoch unit and frame, or null on invalid input
|
|
19
22
|
*
|
|
20
23
|
* @example resolveUnixIntervalPair(0, 86400, "days", { epochUnit: "seconds" })?.resolvedUnit // "day"
|
|
21
24
|
* @example resolveUnixIntervalPair(10, 0, "day") // null (reversed)
|
|
@@ -23,10 +26,10 @@ import { isValidDateTimeUnit } from "../plain/validate/index.js";
|
|
|
23
26
|
export function resolveUnixIntervalPair(start, end, unit, options) {
|
|
24
27
|
const interval = parseUnixEpochInterval(start, end);
|
|
25
28
|
const epochUnit = resolveUnixEpochUnit(options?.epochUnit);
|
|
26
|
-
const
|
|
29
|
+
const frame = normalizeZoneFrame(options?.timeZone);
|
|
27
30
|
if (interval === null ||
|
|
28
31
|
epochUnit === null ||
|
|
29
|
-
|
|
32
|
+
frame === null ||
|
|
30
33
|
typeof unit !== "string") {
|
|
31
34
|
return null;
|
|
32
35
|
}
|
|
@@ -41,10 +44,11 @@ export function resolveUnixIntervalPair(start, end, unit, options) {
|
|
|
41
44
|
}
|
|
42
45
|
try {
|
|
43
46
|
return {
|
|
44
|
-
startVal: startInstant
|
|
45
|
-
endVal: endInstant
|
|
47
|
+
startVal: frameZoned(startInstant, frame),
|
|
48
|
+
endVal: frameZoned(endInstant, frame),
|
|
46
49
|
resolvedUnit,
|
|
47
50
|
epochUnit,
|
|
51
|
+
frame,
|
|
48
52
|
};
|
|
49
53
|
}
|
|
50
54
|
catch {
|
|
@@ -8,7 +8,8 @@ import type { Temporal } from "@js-temporal/polyfill";
|
|
|
8
8
|
* or `"quarter"` from `startOfQuarterForUnix` / `endOfQuarterForUnix` only.
|
|
9
9
|
* - `value` follows the one epoch grammar (`parseUnixEpochValue`); `epochUnit` accepts singular
|
|
10
10
|
* and plural names and defaults to `"milliseconds"`.
|
|
11
|
-
* - `timeZone` defaults to `"UTC"`; `"local"` is the system zone;
|
|
11
|
+
* - `timeZone` defaults to `"UTC"`; `"local"` is the system zone; a time zone identifier or a
|
|
12
|
+
* stored UTC offset (`±HH:MM[:SS]`) is read as written; anything else returns null.
|
|
12
13
|
* - `weekStartsOn` other than `"monday"` or `"sunday"` returns null.
|
|
13
14
|
* - The boundary is always the real local bucket from `internal/zonedBucket.ts` — a start never
|
|
14
15
|
* after `value`, an end never before it.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { normalizeTimeZone } from "./normalizeTimeZone.js";
|
|
2
1
|
import { resolveWeekStartsOn } from "./resolveWeekStartsOn.js";
|
|
3
2
|
import { resolveUnixEpochUnit, toUnixEpoch, unixEpochToInstant, } from "./unixEpochValue.js";
|
|
4
3
|
import { zonedUnitEnd, zonedUnitStart } from "./zonedBucket.js";
|
|
4
|
+
import { frameInstant, frameZoned, normalizeZoneFrame } from "./zoneFrame.js";
|
|
5
5
|
/**
|
|
6
6
|
* Internal shared implementation for `startOfUnix` / `endOfUnix` and the quarter functions.
|
|
7
7
|
*
|
|
@@ -11,7 +11,8 @@ import { zonedUnitEnd, zonedUnitStart } from "./zonedBucket.js";
|
|
|
11
11
|
* or `"quarter"` from `startOfQuarterForUnix` / `endOfQuarterForUnix` only.
|
|
12
12
|
* - `value` follows the one epoch grammar (`parseUnixEpochValue`); `epochUnit` accepts singular
|
|
13
13
|
* and plural names and defaults to `"milliseconds"`.
|
|
14
|
-
* - `timeZone` defaults to `"UTC"`; `"local"` is the system zone;
|
|
14
|
+
* - `timeZone` defaults to `"UTC"`; `"local"` is the system zone; a time zone identifier or a
|
|
15
|
+
* stored UTC offset (`±HH:MM[:SS]`) is read as written; anything else returns null.
|
|
15
16
|
* - `weekStartsOn` other than `"monday"` or `"sunday"` returns null.
|
|
16
17
|
* - The boundary is always the real local bucket from `internal/zonedBucket.ts` — a start never
|
|
17
18
|
* after `value`, an end never before it.
|
|
@@ -24,9 +25,9 @@ import { zonedUnitEnd, zonedUnitStart } from "./zonedBucket.js";
|
|
|
24
25
|
*/
|
|
25
26
|
export function startOrEndOfUnix(value, unit, options, isEnd) {
|
|
26
27
|
const epochUnit = resolveUnixEpochUnit(options.epochUnit);
|
|
27
|
-
const
|
|
28
|
+
const frame = normalizeZoneFrame(options.timeZone);
|
|
28
29
|
const weekStartsOn = resolveWeekStartsOn(options.weekStartsOn);
|
|
29
|
-
if (
|
|
30
|
+
if (frame === null || epochUnit === null || weekStartsOn === null) {
|
|
30
31
|
return null;
|
|
31
32
|
}
|
|
32
33
|
const instant = unixEpochToInstant(value, epochUnit);
|
|
@@ -35,11 +36,13 @@ export function startOrEndOfUnix(value, unit, options, isEnd) {
|
|
|
35
36
|
}
|
|
36
37
|
const weekStartDay = weekStartsOn === "monday" ? 1 : 7;
|
|
37
38
|
try {
|
|
38
|
-
const source = instant
|
|
39
|
+
const source = frameZoned(instant, frame);
|
|
39
40
|
const boundary = isEnd
|
|
40
41
|
? zonedUnitEnd(source, unit, weekStartDay)
|
|
41
42
|
: zonedUnitStart(source, unit, weekStartDay);
|
|
42
|
-
return boundary
|
|
43
|
+
return boundary
|
|
44
|
+
? toUnixEpoch(frameInstant(boundary, frame), epochUnit)
|
|
45
|
+
: null;
|
|
43
46
|
}
|
|
44
47
|
catch {
|
|
45
48
|
return null;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolve a two-digit year inside a caller-chosen hundred-year window: the one year in
|
|
3
|
+
* `[windowStart, windowStart + 99]` whose last two digits are `yy`.
|
|
4
|
+
*
|
|
5
|
+
* Pure arithmetic: the function holds no window of its own and reads no clock. The window comes
|
|
6
|
+
* from the caller's `TwoDigitYearOptions.yearWindow`, resolved by `readYearWindowStart`
|
|
7
|
+
* (`internal/yearWindowStart.ts`); no standard says which century a two-digit year belongs to,
|
|
8
|
+
* so the library never supplies one.
|
|
9
|
+
*
|
|
10
|
+
* @param yy the two-digit year, 0–99, as the grammar read it
|
|
11
|
+
* @param windowStart the first year of the hundred-year window
|
|
12
|
+
* @returns the four-digit year in the window ending in `yy`
|
|
13
|
+
*
|
|
14
|
+
* @example twoDigitYear(24, 2000) // 2024
|
|
15
|
+
* @example twoDigitYear(99, 1950) // 1999
|
|
16
|
+
* @example twoDigitYear(49, 1950) // 2049
|
|
17
|
+
* @example twoDigitYear(0, 1976) // 2000
|
|
18
|
+
*/
|
|
19
|
+
export declare function twoDigitYear(yy: number, windowStart: number): number;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolve a two-digit year inside a caller-chosen hundred-year window: the one year in
|
|
3
|
+
* `[windowStart, windowStart + 99]` whose last two digits are `yy`.
|
|
4
|
+
*
|
|
5
|
+
* Pure arithmetic: the function holds no window of its own and reads no clock. The window comes
|
|
6
|
+
* from the caller's `TwoDigitYearOptions.yearWindow`, resolved by `readYearWindowStart`
|
|
7
|
+
* (`internal/yearWindowStart.ts`); no standard says which century a two-digit year belongs to,
|
|
8
|
+
* so the library never supplies one.
|
|
9
|
+
*
|
|
10
|
+
* @param yy the two-digit year, 0–99, as the grammar read it
|
|
11
|
+
* @param windowStart the first year of the hundred-year window
|
|
12
|
+
* @returns the four-digit year in the window ending in `yy`
|
|
13
|
+
*
|
|
14
|
+
* @example twoDigitYear(24, 2000) // 2024
|
|
15
|
+
* @example twoDigitYear(99, 1950) // 1999
|
|
16
|
+
* @example twoDigitYear(49, 1950) // 2049
|
|
17
|
+
* @example twoDigitYear(0, 1976) // 2000
|
|
18
|
+
*/
|
|
19
|
+
export function twoDigitYear(yy, windowStart) {
|
|
20
|
+
const candidate = Math.floor(windowStart / 100) * 100 + yy;
|
|
21
|
+
return candidate < windowStart ? candidate + 100 : candidate;
|
|
22
|
+
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Temporal } from "@js-temporal/polyfill";
|
|
2
2
|
import { MAX_EPOCH_NANOSECONDS } from "./epochNanoseconds.js";
|
|
3
|
+
import { isObject } from "./isObject.js";
|
|
3
4
|
// TC39 Temporal IsValidEpochNanoseconds bound (nsMaxInstant = 10^8 days) in milliseconds: 8.64e15.
|
|
4
5
|
const MAX_EPOCH_MILLISECONDS = Number(MAX_EPOCH_NANOSECONDS / 1000000n);
|
|
5
6
|
// An optionally negative run of ASCII digits and nothing else. `\d` without the `u` flag is
|
|
@@ -91,7 +92,7 @@ export function resolveUnixEpochUnitOptions(options) {
|
|
|
91
92
|
if (options === undefined) {
|
|
92
93
|
return "milliseconds";
|
|
93
94
|
}
|
|
94
|
-
if (options
|
|
95
|
+
if (!isObject(options)) {
|
|
95
96
|
return null;
|
|
96
97
|
}
|
|
97
98
|
return resolveUnixEpochUnit(options.epochUnit);
|
|
@@ -231,7 +232,7 @@ export function parseUnixEpochIntervalList(intervals) {
|
|
|
231
232
|
}
|
|
232
233
|
const parsed = [];
|
|
233
234
|
for (const interval of intervals) {
|
|
234
|
-
if (!interval
|
|
235
|
+
if (!isObject(interval)) {
|
|
235
236
|
return null;
|
|
236
237
|
}
|
|
237
238
|
const { start, end } = interval;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { Temporal } from "@js-temporal/polyfill";
|
|
2
|
+
/**
|
|
3
|
+
* Read a Unix epoch argument on the local wall clock of the shared `unix/` options, or null when
|
|
4
|
+
* anything is invalid. For the `parse*FromUnix` accessors, which only read fields.
|
|
5
|
+
*
|
|
6
|
+
* - `value` follows the one epoch grammar (`parseUnixEpochValue`).
|
|
7
|
+
* - `epochUnit` accepts singular or plural names and defaults to `"milliseconds"`.
|
|
8
|
+
* - `timeZone` defaults to `"UTC"`; `"local"` is the system zone; a time zone identifier or a
|
|
9
|
+
* stored UTC offset (`±HH:MM[:SS]`) is read as written; anything else is invalid (see
|
|
10
|
+
* `normalizeZoneFrame`).
|
|
11
|
+
*
|
|
12
|
+
* @param value Unix epoch number or digit string
|
|
13
|
+
* @param options optional `{ epochUnit, timeZone }`
|
|
14
|
+
* @returns the local wall clock, or null
|
|
15
|
+
*
|
|
16
|
+
* @example unixWallClock(0)?.toString() // "1970-01-01T00:00:00"
|
|
17
|
+
* @example unixWallClock("86400", { epochUnit: "second", timeZone: "Asia/Tokyo" })?.hour // 9
|
|
18
|
+
* @example unixWallClock(45870000, { timeZone: "-00:44:30" })?.toString() // "1970-01-01T12:00:00"
|
|
19
|
+
* @example unixWallClock(0, { timeZone: "Asia/Tokio" }) // null
|
|
20
|
+
*/
|
|
21
|
+
export declare function unixWallClock(value: unknown, options?: {
|
|
22
|
+
epochUnit?: unknown;
|
|
23
|
+
timeZone?: unknown;
|
|
24
|
+
}): Temporal.PlainDateTime | null;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { resolveUnixEpochUnit, unixEpochToInstant } from "./unixEpochValue.js";
|
|
2
|
+
import { frameWallClock, normalizeZoneFrame } from "./zoneFrame.js";
|
|
3
|
+
/**
|
|
4
|
+
* Read a Unix epoch argument on the local wall clock of the shared `unix/` options, or null when
|
|
5
|
+
* anything is invalid. For the `parse*FromUnix` accessors, which only read fields.
|
|
6
|
+
*
|
|
7
|
+
* - `value` follows the one epoch grammar (`parseUnixEpochValue`).
|
|
8
|
+
* - `epochUnit` accepts singular or plural names and defaults to `"milliseconds"`.
|
|
9
|
+
* - `timeZone` defaults to `"UTC"`; `"local"` is the system zone; a time zone identifier or a
|
|
10
|
+
* stored UTC offset (`±HH:MM[:SS]`) is read as written; anything else is invalid (see
|
|
11
|
+
* `normalizeZoneFrame`).
|
|
12
|
+
*
|
|
13
|
+
* @param value Unix epoch number or digit string
|
|
14
|
+
* @param options optional `{ epochUnit, timeZone }`
|
|
15
|
+
* @returns the local wall clock, or null
|
|
16
|
+
*
|
|
17
|
+
* @example unixWallClock(0)?.toString() // "1970-01-01T00:00:00"
|
|
18
|
+
* @example unixWallClock("86400", { epochUnit: "second", timeZone: "Asia/Tokyo" })?.hour // 9
|
|
19
|
+
* @example unixWallClock(45870000, { timeZone: "-00:44:30" })?.toString() // "1970-01-01T12:00:00"
|
|
20
|
+
* @example unixWallClock(0, { timeZone: "Asia/Tokio" }) // null
|
|
21
|
+
*/
|
|
22
|
+
export function unixWallClock(value, options) {
|
|
23
|
+
const epochUnit = resolveUnixEpochUnit(options?.epochUnit);
|
|
24
|
+
const frame = normalizeZoneFrame(options?.timeZone);
|
|
25
|
+
if (epochUnit === null || frame === null) {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
try {
|
|
29
|
+
const instant = unixEpochToInstant(value, epochUnit);
|
|
30
|
+
return instant === null ? null : frameWallClock(instant, frame);
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Temporal } from "@js-temporal/polyfill";
|
|
2
|
+
/**
|
|
3
|
+
* Read a UTC ISO string on a local wall clock for the `parse*FromUtc` accessors: the instant it
|
|
4
|
+
* names, on the wall clock of `options.timeZone`. The utc twin of `unixWallClock`.
|
|
5
|
+
*
|
|
6
|
+
* - `timeZone` defaults to `"UTC"`; `"local"` is the system zone; a time zone identifier or a
|
|
7
|
+
* stored UTC offset (`±HH:MM[:SS]`) is read as written; anything else is invalid (see
|
|
8
|
+
* `normalizeZoneFrame`).
|
|
9
|
+
*
|
|
10
|
+
* @param value UTC ISO 8601 datetime string
|
|
11
|
+
* @param options optional `{ timeZone }`
|
|
12
|
+
* @returns the local wall clock, or null when the value or the zone is invalid
|
|
13
|
+
* @example utcWallClock("2024-03-15T14:30:00Z", { timeZone: "Asia/Tokyo" })?.toString() // "2024-03-15T23:30:00"
|
|
14
|
+
* @example utcWallClock("1970-01-01T12:44:30Z", { timeZone: "-00:44:30" })?.toString() // "1970-01-01T12:00:00"
|
|
15
|
+
* @example utcWallClock("2024-03-15T14:30:00Z", { timeZone: "Invalid/Zone" }) // null
|
|
16
|
+
* @example utcWallClock("2024-03-15T14:30:00") // null (no Z)
|
|
17
|
+
*/
|
|
18
|
+
export declare function utcWallClock(value: string, options?: {
|
|
19
|
+
timeZone?: string;
|
|
20
|
+
}): Temporal.PlainDateTime | null;
|