unstale

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 init

@unstale/cli 0.2.5 on npm

rrule-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.

    2.2.7release notes

  • 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.

    2.2.7release notes

  • Weekly BYSETPOS ranking now occurs after date filters.

    2.2.6release notes

  • Generated starts in DST gaps are omitted before BYSETPOS and COUNT; explicit DTSTART/RDATE inputs retain their interpretation.

    2.2.6release notes

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.

    2.2.7release notes

  • 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.

    2.2.7release notes

  • 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.

    2.2.7release notes

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.

    2.2.8release notes

  • Quoted TZID parameter values are now accepted when parsing DTSTART, EXDATE, and RDATE; toString() still writes TZID without quotes.

    2.2.8release notes

  • Fast paths now agree with the general engine on the polyfill, avoiding different instants from all() and all(callback) for some named-zone rules.

    2.2.7release notes

  • Monthly rules no longer return a date twice when positive and negative positions select the same candidate.

    2.2.7release notes

  • Named-zone monthly BYSETPOS no longer ranks a nonexistent time during a daylight-saving transition.

    2.2.7release notes

  • The query no longer forces an aligned query anchor into the recurrence set when includeDtstart is enabled; query methods consistently retain the real DTSTART.

    2.2.6release notes

  • Query anchors and optimized output preserve calendars, and period bounds use the candidates' timezone and calendar.

    2.2.6release notes

  • 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.

    2.2.6release notes

  • DAILY INTERVAL cadence is preserved through weekday filters in general generation and optimized generation and queries.

    2.2.6release notes

  • 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.

    2.2.6release notes

  • Native Temporal reads exact timezone transitions; the polyfill fallback probes daily, avoiding transitions shifted by input milliseconds or missed by fifteen-day sampling.

    2.2.6release notes

  • 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.

    2.2.6release notes