Ask the recurrenceId, which is the part that survives expansion

Rules alone were still wrong, in the other direction. A live 0.16.19 was
asked to expand a real weekly series: the occurrences come back carrying
no rule at all — only the master has one — and Stalwart spells that
master's rule "recurrenceRule", singular, not the RFC 8984 array ihasmail
looks for. So a genuine occurrence would have read as a one-off, and the
delete dialog would have offered to delete "this event" while deleting
the series.

What an occurrence does carry is a recurrenceId, which a one-off never
has. Master by its rule under either name, occurrence by its
recurrenceId. The tests carry the shapes the live server returned.
This commit is contained in:
2026-08-25 08:18:38 -07:00
parent 330cecfb04
commit 458eb118b4
3 changed files with 24 additions and 9 deletions
+2
View File
@@ -679,6 +679,8 @@ export interface JSCalendarEvent {
recurrenceId?: LocalDate;
recurrenceIdTimeZone?: string;
recurrenceRules?: JSCalendarRecurrenceRule[];
/** Stalwart 0.16 stores a single rule under this name instead of the array above. */
recurrenceRule?: JSCalendarRecurrenceRule;
excludedRecurrenceRules?: JSCalendarRecurrenceRule[];
recurrenceOverrides?: Record<LocalDate, Record<string, unknown> | null>;
excluded?: boolean;