From b419ac82aee632ead958b2b484e60ef9cb85d700 Mon Sep 17 00:00:00 2001 From: Adam Shaw Date: Fri, 15 May 2026 00:55:01 -0400 Subject: [PATCH] have ComputeNudgeWindow support week and day additionalShift. Try additionalShift undo more scenarios that would error prior --- polyfill/lib/ecmascript.mjs | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/polyfill/lib/ecmascript.mjs b/polyfill/lib/ecmascript.mjs index 6d6a0c3eb..aa34020b0 100644 --- a/polyfill/lib/ecmascript.mjs +++ b/polyfill/lib/ecmascript.mjs @@ -3209,16 +3209,16 @@ function ComputeNudgeWindow( const weeksEnd = AddDaysToISODate(weeksStart, duration.date.days); const untilResult = CalendarDateUntil(calendar, weeksStart, weeksEnd, 'week'); const weeks = RoundNumberToIncrement(duration.date.weeks + untilResult.weeks, increment, 'trunc'); - r1 = weeks; - r2 = weeks + increment * sign; + r1 = !additionalShift ? weeks : weeks + increment * sign; + r2 = r1 + increment * sign; startDuration = AdjustDateDurationRecord(duration.date, 0, r1); endDuration = AdjustDateDurationRecord(duration.date, 0, r2); break; } case 'day': { const days = RoundNumberToIncrement(duration.date.days, increment, 'trunc'); - r1 = days; - r2 = days + increment * sign; + r1 = !additionalShift ? days : days + increment * sign; + r2 = r1 + increment * sign; startDuration = AdjustDateDurationRecord(duration.date, r1); endDuration = AdjustDateDurationRecord(duration.date, r2); break; @@ -3290,7 +3290,13 @@ function NudgeToCalendarUnit( // Round the smallestUnit within the epoch-nanosecond span if (sign === 1) { - if (!(nudgeWindow.startEpochNs.leq(destEpochNs) && destEpochNs.leq(nudgeWindow.endEpochNs))) { + if ( + !(nudgeWindow.startEpochNs.leq(destEpochNs) && destEpochNs.leq(nudgeWindow.endEpochNs)) || + // If zero-size nudge window, try again + // TODO: maybe converge with condition above? + // TODO: might not need this when sign === 1 + endEpochNs.equals(startEpochNs) + ) { // Retry nudge window if it's out of bounds nudgeWindow = ComputeNudgeWindow( sign, @@ -3310,7 +3316,12 @@ function NudgeToCalendarUnit( didExpandCalendarUnit = true; } } else if (sign == -1) { - if (!(nudgeWindow.endEpochNs.leq(destEpochNs) && destEpochNs.leq(nudgeWindow.startEpochNs))) { + if ( + !(nudgeWindow.endEpochNs.leq(destEpochNs) && destEpochNs.leq(nudgeWindow.startEpochNs)) || + // If zero-size nudge window, try again + // TODO: maybe converge with condition above? + endEpochNs.equals(startEpochNs) + ) { // Retry nudge window if it's out of bounds nudgeWindow = ComputeNudgeWindow( sign,