Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Exdate showing blank array when EXDATE parameters exist in ical file #167

Open
cmdcheshire opened this issue Nov 13, 2021 · 4 comments
Open

Comments

@cmdcheshire
Copy link

Here's the code I'm running.

if (fs.existsSync('data/calendar.ics')) {
                    console.log('file verified, converting...')
                    // use the sync function parseFile() to parse this ics file
                    const events = ical.sync.parseFile('data/calendar.ics');
                    // convert object to JSON string
                    const eventsJSON = JSON.stringify(events);
                    // saves data to file
                    fs.writeFile('data/calendar.json', eventsJSON, (err) => {
                        if (err) {
                            throw err;
                        }
                        console.log("JSON data is saved.");
                    });
                } else {
                    console.log('file could not be verified');
                };

This is a snippet from the ICS file:

BEGIN:VEVENT
DESCRIPTION:\n
RRULE:FREQ=WEEKLY;UNTIL=20210719T210000Z;INTERVAL=1;BYDAY=MO;WKST=SU
EXDATE;TZID=Pacific Standard Time:20210621T140000,20210705T140000
UID:040000008200E00074C5B7101A82E008000000009CF65AD5C445D701000000000000000
 010000000384A1B20012EE9428B50E322309A05B1
SUMMARY:(5th FL) Titus and Tate
DTSTART;TZID=Pacific Standard Time:20210517T140000
DTEND;TZID=Pacific Standard Time:20210517T163000
CLASS:PUBLIC
PRIORITY:5
DTSTAMP:20211113T223638Z
TRANSP:OPAQUE
STATUS:CONFIRMED
SEQUENCE:0
LOCATION:
X-MICROSOFT-CDO-APPT-SEQUENCE:0
X-MICROSOFT-CDO-BUSYSTATUS:BUSY
X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY
X-MICROSOFT-CDO-ALLDAYEVENT:FALSE
X-MICROSOFT-CDO-IMPORTANCE:1
X-MICROSOFT-CDO-INSTTYPE:1
X-MICROSOFT-DONOTFORWARDMEETING:FALSE
X-MICROSOFT-DISALLOW-COUNTER:FALSE
END:VEVENT

This is the corresponding item in the JSON.

{
  "040000008200E00074C5B7101A82E008000000009CF65AD5C445D701000000000000000010000000384A1B20012EE9428B50E322309A05B1": {
    "type": "VEVENT",
    "params": [],
    "description": "\n",
    "rrule": {
      "_cache": {
        "all": false,
        "before": [],
        "after": [],
        "between": []
      },
      "origOptions": {
        "tzid": "America/Los_Angeles",
        "dtstart": "2021-05-17T21:00:00.000Z",
        "freq": 2,
        "until": "2021-07-19T21:00:00.000Z",
        "interval": 1,
        "byweekday": [
          {
            "weekday": 0
          }
        ],
        "wkst": {
          "weekday": 6
        }
      },
      "options": {
        "freq": 2,
        "dtstart": "2021-05-17T21:00:00.000Z",
        "interval": 1,
        "wkst": 6,
        "count": null,
        "until": "2021-07-19T21:00:00.000Z",
        "tzid": "America/Los_Angeles",
        "bysetpos": null,
        "bymonth": null,
        "bymonthday": [],
        "bynmonthday": [],
        "byyearday": null,
        "byweekno": null,
        "byweekday": [
          0
        ],
        "bynweekday": null,
        "byhour": [
          21
        ],
        "byminute": [
          0
        ],
        "bysecond": [
          0
        ],
        "byeaster": null
      }
    },
    "exdate": [],
    "uid": "040000008200E00074C5B7101A82E008000000009CF65AD5C445D701000000000000000010000000384A1B20012EE9428B50E322309A05B1",
    "summary": "(5th FL) Titus and Tate",
    "start": "2021-05-17T21:00:00.000Z",
    "datetype": "date-time",
    "end": "2021-05-17T23:30:00.000Z",
    "class": "PUBLIC",
    "priority": "5",
    "dtstamp": "2021-11-13T22:49:38.000Z",
    "transparency": "OPAQUE",
    "status": "CONFIRMED",
    "sequence": "0",
    "location": "",
    "MICROSOFT-CDO-APPT-SEQUENCE": "0",
    "MICROSOFT-CDO-BUSYSTATUS": "BUSY",
    "MICROSOFT-CDO-INTENDEDSTATUS": "BUSY",
    "MICROSOFT-CDO-ALLDAYEVENT": "FALSE",
    "MICROSOFT-CDO-IMPORTANCE": "1",
    "MICROSOFT-CDO-INSTTYPE": "1",
    "MICROSOFT-DONOTFORWARDMEETING": "FALSE",
    "MICROSOFT-DISALLOW-COUNTER": "FALSE",
    "method": "PUBLISH",
    "recurrences": {
      "2021-06-14": {
        "type": "VEVENT",
        "params": [],
        "description": "\n",
        "uid": "040000008200E00074C5B7101A82E008000000009CF65AD5C445D701000000000000000010000000384A1B20012EE9428B50E322309A05B1",
        "recurrenceid": "2021-06-14T21:00:00.000Z",
        "summary": "(REMOTE) Titus and Tate ",
        "start": "2021-06-14T21:00:00.000Z",
        "datetype": "date-time",
        "end": "2021-06-14T23:30:00.000Z",
        "class": "PUBLIC",
        "priority": "5",
        "dtstamp": "2021-11-13T22:49:38.000Z",
        "transparency": "OPAQUE",
        "status": "CONFIRMED",
        "sequence": "0",
        "location": "",
        "MICROSOFT-CDO-APPT-SEQUENCE": "0",
        "MICROSOFT-CDO-BUSYSTATUS": "BUSY",
        "MICROSOFT-CDO-INTENDEDSTATUS": "BUSY",
        "MICROSOFT-CDO-ALLDAYEVENT": "FALSE",
        "MICROSOFT-CDO-IMPORTANCE": "1",
        "MICROSOFT-CDO-INSTTYPE": "3",
        "MICROSOFT-DONOTFORWARDMEETING": "FALSE",
        "MICROSOFT-DISALLOW-COUNTER": "FALSE"
      },
      "2021-06-28": {
        "type": "VEVENT",
        "params": [],
        "description": "\n",
        "uid": "040000008200E00074C5B7101A82E008000000009CF65AD5C445D701000000000000000010000000384A1B20012EE9428B50E322309A05B1",
        "recurrenceid": "2021-06-28T21:00:00.000Z",
        "summary": "REMOTE T&T",
        "start": "2021-06-28T21:00:00.000Z",
        "datetype": "date-time",
        "end": "2021-06-28T23:30:00.000Z",
        "class": "PUBLIC",
        "priority": "5",
        "dtstamp": "2021-11-13T22:49:38.000Z",
        "transparency": "OPAQUE",
        "status": "CONFIRMED",
        "sequence": "0",
        "location": "",
        "MICROSOFT-CDO-APPT-SEQUENCE": "0",
        "MICROSOFT-CDO-BUSYSTATUS": "BUSY",
        "MICROSOFT-CDO-INTENDEDSTATUS": "BUSY",
        "MICROSOFT-CDO-ALLDAYEVENT": "FALSE",
        "MICROSOFT-CDO-IMPORTANCE": "1",
        "MICROSOFT-CDO-INSTTYPE": "3",
        "MICROSOFT-DONOTFORWARDMEETING": "FALSE",
        "MICROSOFT-DISALLOW-COUNTER": "FALSE"
      },
      "2021-07-12": {
        "type": "VEVENT",
        "params": [],
        "description": "\n",
        "uid": "040000008200E00074C5B7101A82E008000000009CF65AD5C445D701000000000000000010000000384A1B20012EE9428B50E322309A05B1",
        "recurrenceid": "2021-07-12T21:00:00.000Z",
        "summary": "(Remote) Titus and Tate",
        "start": "2021-07-12T21:00:00.000Z",
        "datetype": "date-time",
        "end": "2021-07-12T23:30:00.000Z",
        "class": "PUBLIC",
        "priority": "5",
        "dtstamp": "2021-11-13T22:49:38.000Z",
        "transparency": "OPAQUE",
        "status": "CONFIRMED",
        "sequence": "0",
        "location": "",
        "MICROSOFT-CDO-APPT-SEQUENCE": "0",
        "MICROSOFT-CDO-BUSYSTATUS": "BUSY",
        "MICROSOFT-CDO-INTENDEDSTATUS": "BUSY",
        "MICROSOFT-CDO-ALLDAYEVENT": "FALSE",
        "MICROSOFT-CDO-IMPORTANCE": "1",
        "MICROSOFT-CDO-INSTTYPE": "3",
        "MICROSOFT-DONOTFORWARDMEETING": "FALSE",
        "MICROSOFT-DISALLOW-COUNTER": "FALSE"
      },
      "2021-07-19": {
        "type": "VEVENT",
        "params": [],
        "description": "\n",
        "uid": "040000008200E00074C5B7101A82E008000000009CF65AD5C445D701000000000000000010000000384A1B20012EE9428B50E322309A05B1",
        "recurrenceid": "2021-07-19T21:00:00.000Z",
        "summary": "(5th FL) Titus and Tate",
        "start": "2021-07-19T21:00:00.000Z",
        "datetype": "date-time",
        "end": "2021-07-19T23:00:00.000Z",
        "class": "PUBLIC",
        "priority": "5",
        "dtstamp": "2021-11-13T22:49:38.000Z",
        "transparency": "OPAQUE",
        "status": "CONFIRMED",
        "sequence": "0",
        "location": "",
        "MICROSOFT-CDO-APPT-SEQUENCE": "0",
        "MICROSOFT-CDO-BUSYSTATUS": "BUSY",
        "MICROSOFT-CDO-INTENDEDSTATUS": "BUSY",
        "MICROSOFT-CDO-ALLDAYEVENT": "FALSE",
        "MICROSOFT-CDO-IMPORTANCE": "1",
        "MICROSOFT-CDO-INSTTYPE": "3",
        "MICROSOFT-DONOTFORWARDMEETING": "FALSE",
        "MICROSOFT-DISALLOW-COUNTER": "FALSE"
      }
    }
  }
}
@runely
Copy link
Contributor

runely commented Apr 18, 2022

I'm having the exact same problem now with node-ical v0.15.1.

EXDATE property on the event in ics has two dates, but the exdate property on the event after parsing through node-ical is empty..

I first thought this had to do with this event had a recurrence, but all my calendars which has events with exdates in ics are missing exdate information after parsed through node-ical ...

Event from ICS

BEGIN:VEVENT
RRULE:FREQ=WEEKLY;UNTIL=20221005T073000Z;INTERVAL=2;BYDAY=WE;WKST=MO
EXDATE;TZID=W. Europe Standard Time:20220406T093000,20220420T093000
UID:040000008200E00074C5B7101A82E0080000000040C4A302812CD80100000000000000001000000029A1E9F657F7DC4C89FECB693B75F0FC
SUMMARY:Event name
DTSTART;TZID=W. Europe Standard Time:20220309T093000
DTEND;TZID=W. Europe Standard Time:20220309T110000
CLASS:PUBLIC
PRIORITY:5
DTSTAMP:20220418T093557Z
TRANSP:OPAQUE
STATUS:CONFIRMED
SEQUENCE:0
LOCATION:Microsoft Teams-møte
X-MICROSOFT-CDO-APPT-SEQUENCE:0
X-MICROSOFT-CDO-BUSYSTATUS:BUSY
X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY
X-MICROSOFT-CDO-ALLDAYEVENT:FALSE
X-MICROSOFT-CDO-IMPORTANCE:1
X-MICROSOFT-CDO-INSTTYPE:1
X-MICROSOFT-DONOTFORWARDMEETING:FALSE
X-MICROSOFT-DISALLOW-COUNTER:FALSE
END:VEVENT

Recurrence event moved out of range

BEGIN:VEVENT
UID:040000008200E00074C5B7101A82E0080000000040C4A302812CD80100000000000000001000000029A1E9F657F7DC4C89FECB693B75F0FC
RECURRENCE-ID;TZID=W. Europe Standard Time:20220323T093000
SUMMARY:Event name
DTSTART;TZID=W. Europe Standard Time:20220323T100000
DTEND;TZID=W. Europe Standard Time:20220323T110000
CLASS:PUBLIC
PRIORITY:5
DTSTAMP:20220418T093557Z
TRANSP:OPAQUE
STATUS:CONFIRMED
SEQUENCE:1
LOCATION:Microsoft Teams-møte
X-MICROSOFT-CDO-APPT-SEQUENCE:1
X-MICROSOFT-CDO-BUSYSTATUS:BUSY
X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY
X-MICROSOFT-CDO-ALLDAYEVENT:FALSE
X-MICROSOFT-CDO-IMPORTANCE:1
X-MICROSOFT-CDO-INSTTYPE:3
X-MICROSOFT-DONOTFORWARDMEETING:FALSE
X-MICROSOFT-DISALLOW-COUNTER:FALSE
END:VEVENT

Event parsed through node-ical

"040000008200E00074C5B7101A82E0080000000040C4A302812CD80100000000000000001000000029A1E9F657F7DC4C89FECB693B75F0FC": {
    "type": "VEVENT",
    "params": [],
    "rrule": {
        "_cache": {
            "all": false,
            "before": [],
            "after": [],
            "between": []
        },
        "origOptions": {
            "tzid": "Europe/Berlin",
            "dtstart": "2022-03-09T08:30:00.000Z",
            "freq": 2,
            "until": "2022-10-05T07:30:00.000Z",
            "interval": 2,
            "byweekday": [
                {
                    "weekday": 2
                }
            ],
            "wkst": {
                "weekday": 0
            }
        },
        "options": {
            "freq": 2,
            "dtstart": "2022-03-09T08:30:00.000Z",
            "interval": 2,
            "wkst": 0,
            "count": null,
            "until": "2022-10-05T07:30:00.000Z",
            "tzid": "Europe/Berlin",
            "bysetpos": null,
            "bymonth": null,
            "bymonthday": [],
            "bynmonthday": [],
            "byyearday": null,
            "byweekno": null,
            "byweekday": [
                2
            ],
            "bynweekday": null,
            "byhour": [
                8
            ],
            "byminute": [
                30
            ],
            "bysecond": [
                0
            ],
            "byeaster": null
        }
    },
    "exdate": [],
    "uid": "040000008200E00074C5B7101A82E0080000000040C4A302812CD80100000000000000001000000029A1E9F657F7DC4C89FECB693B75F0FC",
    "summary": "Event name",
    "start": "2022-03-09T08:30:00.000Z",
    "datetype": "date-time",
    "end": "2022-03-09T10:00:00.000Z",
    "class": "PUBLIC",
    "priority": "5",
    "dtstamp": "2022-04-18T09:34:19.000Z",
    "transparency": "OPAQUE",
    "status": "CONFIRMED",
    "sequence": "0",
    "location": "Microsoft Teams-møte",
    "MICROSOFT-CDO-APPT-SEQUENCE": "0",
    "MICROSOFT-CDO-BUSYSTATUS": "BUSY",
    "MICROSOFT-CDO-INTENDEDSTATUS": "BUSY",
    "MICROSOFT-CDO-ALLDAYEVENT": "FALSE",
    "MICROSOFT-CDO-IMPORTANCE": "1",
    "MICROSOFT-CDO-INSTTYPE": "1",
    "MICROSOFT-DONOTFORWARDMEETING": "FALSE",
    "MICROSOFT-DISALLOW-COUNTER": "FALSE",
    "method": "PUBLISH",
    "recurrences": {
        "2022-03-23": {
            "type": "VEVENT",
            "params": [],
            "uid": "040000008200E00074C5B7101A82E0080000000040C4A302812CD80100000000000000001000000029A1E9F657F7DC4C89FECB693B75F0FC",
            "recurrenceid": "2022-03-23T08:30:00.000Z",
            "summary": "Event name",
            "start": "2022-03-23T09:00:00.000Z",
            "datetype": "date-time",
            "end": "2022-03-23T10:00:00.000Z",
            "class": "PUBLIC",
            "priority": "5",
            "dtstamp": "2022-04-18T09:34:19.000Z",
            "transparency": "OPAQUE",
            "status": "CONFIRMED",
            "sequence": "1",
            "location": "Microsoft Teams-møte",
            "MICROSOFT-CDO-APPT-SEQUENCE": "1",
            "MICROSOFT-CDO-BUSYSTATUS": "BUSY",
            "MICROSOFT-CDO-INTENDEDSTATUS": "BUSY",
            "MICROSOFT-CDO-ALLDAYEVENT": "FALSE",
            "MICROSOFT-CDO-IMPORTANCE": "1",
            "MICROSOFT-CDO-INSTTYPE": "3",
            "MICROSOFT-DONOTFORWARDMEETING": "FALSE",
            "MICROSOFT-DISALLOW-COUNTER": "FALSE"
        }
    }
}

@runely
Copy link
Contributor

runely commented Apr 24, 2022

The issue for me is that node-ical makes the exdate as an invalid array. Array methods like length and join only sees the valid values.

exdate property from an event and the the length of the exdate array from the same event:
image

I use deepClone of lodash to create a copy of the event (to preserve non-primitive types in the object). deepClone clones the exdate property with valid array values (which is none!)

The exdate property should be created as an object. This will also work with deepClone of lodash
image

@waldbaer
Copy link

I stumbled over the exact same issue when debugging why excluded dates are not properly handled.
The parsed exdate property is always empty.
"exdate": [].

Is here any workaround available? or did this work in older versions?

@AnthonyAnise
Copy link

I found a temporary workaround.

event.exdate = Object.values(event.exdate || []);

This will spit out the array of excluded starting times from the corrupted array.

You will still have to manually remove them from the rrule dates.

In the loop of rrule dates:
if (event.exdate.find((v) => v.getTime() === rdate.startingDate.getTime())) { /* remove the date from the list */}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants