# Specification: Generic RRULE Object Formatter ## Overview The current implementation for converting RRULE objects (from `ts-ics`) back to strings is brittle and fails when encountering nested objects or arrays for properties like `BYDAY`. This results in `[object Object]` being injected into the RRULE string, causing syntax errors in the `rrule` library. This track replaces the specific property handling with a robust, recursive generic formatter. ## Functional Requirements - **Recursive Value Formatting:** The `formatRRuleValue` function must handle nested structures: - **Arrays:** Join elements with commas (e.g., `['MO', 'TU']` -> `MO,TU`). - **Date Objects:** Format as `YYYYMMDDTHHMMSSZ`. - **Nested Property Objects:** If an object has a `date`, `day`, or `value` property, extract and format that value (e.g., `{ day: 'MO' }` -> `MO`). - **Recursion:** If an array contains objects, or an object contains an array, the logic must recurse until primitives are reached. - iCalendar Compliance: Ensure the resulting string for every property matches the iCalendar spec format expected by `rrule.js`. ## Implementation Steps 1. Reproduce: Create a test case in `icalendar_test.ts` where `BYDAY` is an object or an array of objects. Verify it fails with `Invalid weekday string: [object Object]`. 2. Fix: Re-implement `formatRRuleValue` in `icalendar.ts` as a recursive function that handles Arrays, Dates, and standard `ts-ics` nested value objects. 3. Verify: - Confirm the `BYDAY` reproduction test passes. - Add a composite test with `UNTIL` (Date) and `BYDAY` (Array) together. - Run regression tests to ensure standard string RRULEs still work. ## Acceptance Criteria - [ ] `expandRecurrences` correctly handles `BYDAY` when provided as an array of objects. - [ ] `expandRecurrences` correctly handles `UNTIL` when provided as a nested date object. - [ ] All 12+ existing tests pass, including regression checks for string-based RRULEs.