diff --git a/packages/aris-core/src/feed-engine.ts b/packages/aris-core/src/feed-engine.ts index a3a0bce..7ff50c4 100644 --- a/packages/aris-core/src/feed-engine.ts +++ b/packages/aris-core/src/feed-engine.ts @@ -331,7 +331,16 @@ export class FeedEngine { } } - return { items: currentItems, groupedItems: allGroupedItems, errors: allErrors } + // Remove stale item IDs from groups and drop empty groups + const itemIds = new Set(currentItems.map((item) => item.id)) + const validGroups = allGroupedItems + .map((group) => ({ + ...group, + itemIds: group.itemIds.filter((id) => itemIds.has(id)), + })) + .filter((group) => group.itemIds.length > 0) + + return { items: currentItems, groupedItems: validGroups, errors: allErrors } } private ensureGraph(): SourceGraph { diff --git a/packages/aris-core/src/feed-post-processor.test.ts b/packages/aris-core/src/feed-post-processor.test.ts index 2e71eb9..00ce945 100644 --- a/packages/aris-core/src/feed-post-processor.test.ts +++ b/packages/aris-core/src/feed-post-processor.test.ts @@ -173,6 +173,32 @@ describe("FeedPostProcessor", () => { ]) }) + test("stale item IDs are removed from groups after suppression", async () => { + const engine = new FeedEngine() + .register( + createCalendarSource([calendarItem("c1", "Meeting A"), calendarItem("c2", "Meeting B")]), + ) + .registerPostProcessor(async () => ({ + groupedItems: [{ itemIds: ["c1", "c2"], summary: "Afternoon" }], + })) + .registerPostProcessor(async () => ({ suppress: ["c1"] })) + + const result = await engine.refresh() + expect(result.groupedItems).toEqual([{ itemIds: ["c2"], summary: "Afternoon" }]) + }) + + test("groups with all items suppressed are dropped", async () => { + const engine = new FeedEngine() + .register(createCalendarSource([calendarItem("c1", "Meeting A")])) + .registerPostProcessor(async () => ({ + groupedItems: [{ itemIds: ["c1"], summary: "Solo" }], + })) + .registerPostProcessor(async () => ({ suppress: ["c1"] })) + + const result = await engine.refresh() + expect(result.groupedItems).toBeUndefined() + }) + test("groupedItems is omitted when no processors produce groups", async () => { const engine = new FeedEngine() .register(createWeatherSource([weatherItem("w1", 20)]))