npm / rrule-temporal
rrule-temporal
What changed in rrule-temporal 2, from its official release notes, upgrade guides and advisories. Sources checked 2026-10-24.
4 breaking3 performance12 fixes and other
See which of these apply to your code, ranked, in your agent:
npx @unstale/cli initrrule-temporal 219 changes
Breaking changes 4
SECONDLY and MINUTELY rules limited by BYDAY now begin at the matching day's first second or minute rather than at DTSTART's time of day.
HOURLY, MINUTELY, and SECONDLY rules with BYxxx parts now follow DTSTART + k * INTERVAL instead of jumping to the next BYxxx value; results may differ from v2.2.6 and stored occurrences may need regeneration.
Weekly BYSETPOS ranking now occurs after date filters.
Generated starts in DST gaps are omitted before BYSETPOS and COUNT; explicit DTSTART/RDATE inputs retain their interpretation.
Performance 3
Sub-daily rules with BYxxx parts use an integer engine that constructs only returned occurrences; additional UTC and named-zone rule shapes retain fast paths with RDATE/EXDATE or COUNT.
Queries on rules without COUNT can visit only recurrence periods around the query for supported shapes, making next(), previous(), between(), matches(), and occursOn() faster; unsupported shapes retain the existing path.
Time zone tables are built from Temporal transitions instead of daily Intl probes, speeding setup and preventing long-running processes from slowing exponentially as tables expand.
Fixes and other changes 12
With includeDtstart: true, DTSTART is no longer dropped when BYSETPOS excludes it; it is emitted and counted within COUNT across generation and query methods.
Quoted TZID parameter values are now accepted when parsing DTSTART, EXDATE, and RDATE; toString() still writes TZID without quotes.
Fast paths now agree with the general engine on the polyfill, avoiding different instants from all() and all(callback) for some named-zone rules.
Monthly rules no longer return a date twice when positive and negative positions select the same candidate.
Named-zone monthly BYSETPOS no longer ranks a nonexistent time during a daylight-saving transition.
The query no longer forces an aligned query anchor into the recurrence set when includeDtstart is enabled; query methods consistently retain the real DTSTART.
Query anchors and optimized output preserve calendars, and period bounds use the candidates' timezone and calendar.
Weekly and period generation no longer drifts wall time or creates skipped time slots after gaps and phantom HOURLY occurrences during fall-back; calendar folds use the first instant.
DAILY INTERVAL cadence is preserved through weekday filters in general generation and optimized generation and queries.
Missing inherited dates in MONTHLY and YEARLY rules are omitted without consuming COUNT or changing later occurrences; January 31 and February 29 retain their calendar behavior.
Native Temporal reads exact timezone transitions; the polyfill fallback probes daily, avoiding transitions shifted by input milliseconds or missed by fifteen-day sampling.
Mixed positive and negative week numbers are ordered before streaming and COUNT; query bounds include week-year spillover, with WKST and non-ISO year lengths respected.