From 7b4b7dffa226ec5454e134d222490efa84bc3584 Mon Sep 17 00:00:00 2001 From: Matt Bauer Date: Thu, 13 Jun 2019 09:36:31 -0500 Subject: [PATCH] =?UTF-8?q?Update=20calendar=E2=80=99s=20vendored=20ical.j?= =?UTF-8?q?s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../calendar/vendor/ical.js/.travis.yml | 4 +- .../calendar/vendor/ical.js/example.js | 23 ++-- .../calendar/vendor/ical.js/example_rrule.js | 118 ++++++++++++++++ .../vendor/ical.js/examples/example_rrule.ics | 40 ++++++ .../calendar/vendor/ical.js/node-ical.js | 78 ++++++----- .../calendar/vendor/ical.js/package.json | 9 +- .../default/calendar/vendor/ical.js/readme.md | 41 +++--- .../calendar/vendor/ical.js/test/test.js | 127 ++++++++++++++++-- .../calendar/vendor/ical.js/test/test12.ics | 19 +++ .../calendar/vendor/ical.js/test/test13.ics | 57 ++++++++ .../calendar/vendor/ical.js/test/test14.ics | 33 +++++ 11 files changed, 471 insertions(+), 78 deletions(-) create mode 100644 modules/default/calendar/vendor/ical.js/example_rrule.js create mode 100644 modules/default/calendar/vendor/ical.js/examples/example_rrule.ics create mode 100644 modules/default/calendar/vendor/ical.js/test/test12.ics create mode 100644 modules/default/calendar/vendor/ical.js/test/test13.ics create mode 100644 modules/default/calendar/vendor/ical.js/test/test14.ics diff --git a/modules/default/calendar/vendor/ical.js/.travis.yml b/modules/default/calendar/vendor/ical.js/.travis.yml index 0a4c7980ae..d5d4c1e3e2 100644 --- a/modules/default/calendar/vendor/ical.js/.travis.yml +++ b/modules/default/calendar/vendor/ical.js/.travis.yml @@ -1,6 +1,4 @@ language: node_js node_js: - - "0.10" - - "0.12" - - "4.2" + - "8.9" install: npm install diff --git a/modules/default/calendar/vendor/ical.js/example.js b/modules/default/calendar/vendor/ical.js/example.js index aceb0e7d5e..7b41f1ad39 100644 --- a/modules/default/calendar/vendor/ical.js/example.js +++ b/modules/default/calendar/vendor/ical.js/example.js @@ -1,13 +1,16 @@ -var ical = require('ical') - , months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'] +'use strict'; +const ical = require('ical'); +const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; -ical.fromURL('http://lanyrd.com/topics/nodejs/nodejs.ics', {}, function(err, data){ - for (var k in data){ - if (data.hasOwnProperty(k)){ - var ev = data[k] - console.log("Conference", ev.summary, 'is in', ev.location, 'on the', ev.start.getDate(), 'of', months[ev.start.getMonth()] ); - } - } -}) +ical.fromURL('http://lanyrd.com/topics/nodejs/nodejs.ics', {}, function (err, data) { + for (let k in data) { + if (data.hasOwnProperty(k)) { + var ev = data[k]; + if (data[k].type == 'VEVENT') { + console.log(`${ev.summary} is in ${ev.location} on the ${ev.start.getDate()} of ${months[ev.start.getMonth()]} at ${ev.start.toLocaleTimeString('en-GB')}`); + } + } + } +}); diff --git a/modules/default/calendar/vendor/ical.js/example_rrule.js b/modules/default/calendar/vendor/ical.js/example_rrule.js new file mode 100644 index 0000000000..6233c4b289 --- /dev/null +++ b/modules/default/calendar/vendor/ical.js/example_rrule.js @@ -0,0 +1,118 @@ +var ical = require('./node-ical') +var moment = require('moment') + +var data = ical.parseFile('./examples/example_rrule.ics'); + +// Complicated example demonstrating how to handle recurrence rules and exceptions. + +for (var k in data) { + + // When dealing with calendar recurrences, you need a range of dates to query against, + // because otherwise you can get an infinite number of calendar events. + var rangeStart = moment("2017-01-01"); + var rangeEnd = moment("2017-12-31"); + + + var event = data[k] + if (event.type === 'VEVENT') { + + var title = event.summary; + var startDate = moment(event.start); + var endDate = moment(event.end); + + // Calculate the duration of the event for use with recurring events. + var duration = parseInt(endDate.format("x")) - parseInt(startDate.format("x")); + + // Simple case - no recurrences, just print out the calendar event. + if (typeof event.rrule === 'undefined') + { + console.log('title:' + title); + console.log('startDate:' + startDate.format('MMMM Do YYYY, h:mm:ss a')); + console.log('endDate:' + endDate.format('MMMM Do YYYY, h:mm:ss a')); + console.log('duration:' + moment.duration(duration).humanize()); + console.log(); + } + + // Complicated case - if an RRULE exists, handle multiple recurrences of the event. + else if (typeof event.rrule !== 'undefined') + { + // For recurring events, get the set of event start dates that fall within the range + // of dates we're looking for. + var dates = event.rrule.between( + rangeStart.toDate(), + rangeEnd.toDate(), + true, + function(date, i) {return true;} + ) + + // The "dates" array contains the set of dates within our desired date range range that are valid + // for the recurrence rule. *However*, it's possible for us to have a specific recurrence that + // had its date changed from outside the range to inside the range. One way to handle this is + // to add *all* recurrence override entries into the set of dates that we check, and then later + // filter out any recurrences that don't actually belong within our range. + if (event.recurrences != undefined) + { + for (var r in event.recurrences) + { + // Only add dates that weren't already in the range we added from the rrule so that + // we don't double-add those events. + if (moment(new Date(r)).isBetween(rangeStart, rangeEnd) != true) + { + dates.push(new Date(r)); + } + } + } + + // Loop through the set of date entries to see which recurrences should be printed. + for(var i in dates) { + + var date = dates[i]; + var curEvent = event; + var showRecurrence = true; + var curDuration = duration; + + startDate = moment(date); + + // Use just the date of the recurrence to look up overrides and exceptions (i.e. chop off time information) + var dateLookupKey = date.toISOString().substring(0, 10); + + // For each date that we're checking, it's possible that there is a recurrence override for that one day. + if ((curEvent.recurrences != undefined) && (curEvent.recurrences[dateLookupKey] != undefined)) + { + // We found an override, so for this recurrence, use a potentially different title, start date, and duration. + curEvent = curEvent.recurrences[dateLookupKey]; + startDate = moment(curEvent.start); + curDuration = parseInt(moment(curEvent.end).format("x")) - parseInt(startDate.format("x")); + } + // If there's no recurrence override, check for an exception date. Exception dates represent exceptions to the rule. + else if ((curEvent.exdate != undefined) && (curEvent.exdate[dateLookupKey] != undefined)) + { + // This date is an exception date, which means we should skip it in the recurrence pattern. + showRecurrence = false; + } + + // Set the the title and the end date from either the regular event or the recurrence override. + var recurrenceTitle = curEvent.summary; + endDate = moment(parseInt(startDate.format("x")) + curDuration, 'x'); + + // If this recurrence ends before the start of the date range, or starts after the end of the date range, + // don't process it. + if (endDate.isBefore(rangeStart) || startDate.isAfter(rangeEnd)) { + showRecurrence = false; + } + + if (showRecurrence === true) { + + console.log('title:' + recurrenceTitle); + console.log('startDate:' + startDate.format('MMMM Do YYYY, h:mm:ss a')); + console.log('endDate:' + endDate.format('MMMM Do YYYY, h:mm:ss a')); + console.log('duration:' + moment.duration(curDuration).humanize()); + console.log(); + } + + } + } + } +} + + diff --git a/modules/default/calendar/vendor/ical.js/examples/example_rrule.ics b/modules/default/calendar/vendor/ical.js/examples/example_rrule.ics new file mode 100644 index 0000000000..4f72c0ecb4 --- /dev/null +++ b/modules/default/calendar/vendor/ical.js/examples/example_rrule.ics @@ -0,0 +1,40 @@ +BEGIN:VCALENDAR +PRODID:-//Google Inc//Google Calendar 70.9054//EN +VERSION:2.0 +CALSCALE:GREGORIAN +METHOD:PUBLISH +X-WR-CALNAME:ical +X-WR-TIMEZONE:US/Central +X-WR-CALDESC: +BEGIN:VEVENT +UID:98765432-ABCD-DCBB-999A-987765432123 +DTSTART;TZID=US/Central:20170601T090000 +DTEND;TZID=US/Central:20170601T170000 +DTSTAMP:20170727T044436Z +EXDATE;TZID=US/Central:20170706T090000,20170713T090000,20170720T090000,20 + 170803T090000 +LAST-MODIFIED:20170727T044435Z +RRULE:FREQ=WEEKLY;WKST=SU;UNTIL=20170814T045959Z;BYDAY=TH +SEQUENCE:0 +SUMMARY:Recurring weekly meeting from June 1 - Aug 14 (except July 6, July 13, July 20, Aug 3) +END:VEVENT +BEGIN:VEVENT +UID:98765432-ABCD-DCBB-999A-987765432123 +RECURRENCE-ID;TZID=US/Central:20170629T090000 +DTSTART;TZID=US/Central:20170703T090000 +DTEND;TZID=US/Central:20170703T120000 +DTSTAMP:20170727T044436Z +LAST-MODIFIED:20170216T143445Z +SEQUENCE:0 +SUMMARY:Last meeting in June moved to Monday July 3 and shortened to half day +END:VEVENT +BEGIN:VEVENT +UID:12354454-ABCD-DCBB-999A-2349872354897 +DTSTART;TZID=US/Central:20171201T130000 +DTEND;TZID=US/Central:20171201T150000 +DTSTAMP:20170727T044436Z +LAST-MODIFIED:20170727T044435Z +SEQUENCE:0 +SUMMARY:Single event on Dec 1 +END:VEVENT +END:VCALENDAR \ No newline at end of file diff --git a/modules/default/calendar/vendor/ical.js/node-ical.js b/modules/default/calendar/vendor/ical.js/node-ical.js index 1d295f8c82..fd817beff1 100644 --- a/modules/default/calendar/vendor/ical.js/node-ical.js +++ b/modules/default/calendar/vendor/ical.js/node-ical.js @@ -6,9 +6,16 @@ exports.fromURL = function(url, opts, cb){ if (!cb) return; request(url, opts, function(err, r, data){ - if (err) - return cb(err, null); - cb(undefined, ical.parseICS(data)); + if (err) + { + return cb(err, null); + } + else if (r.statusCode != 200) + { + return cb(r.statusCode + ": " + r.statusMessage, null); + } + + cb(undefined, ical.parseICS(data)); }) } @@ -17,44 +24,43 @@ exports.parseFile = function(filename){ } -var rrule = require('rrule-alt').RRule -var rrulestr = rrule.rrulestr +var rrule = require('rrule').RRule ical.objectHandlers['RRULE'] = function(val, params, curr, stack, line){ curr.rrule = line; return curr } var originalEnd = ical.objectHandlers['END']; -ical.objectHandlers['END'] = function(val, params, curr, stack){ - if (curr.rrule) { - var rule = curr.rrule; - if (rule.indexOf('DTSTART') === -1) { - - if (curr.start.length === 8) { - var comps = /^(\d{4})(\d{2})(\d{2})$/.exec(curr.start); - if (comps) { - curr.start = new Date (comps[1], comps[2] - 1, comps[3]); - } - } - - if( typeof (curr.start) === "date") { - rule += ' DTSTART:' + curr.start.toISOString().replace(/[-:]/g, ''); - rule = rule.replace(/\.[0-9]{3}/, ''); - } - } - for (var i in curr.exdates) { - if( typeof (curr.exdates[i]) === "date") { - rule += ' EXDATE:' + curr.exdates[i].toISOString().replace(/[-:]/g, ''); - rule = rule.replace(/\.[0-9]{3}/, ''); - } - } - try { - curr.rrule = rrulestr(rule); - } - catch(err) { - console.log("Unrecognised element in calendar feed, ignoring: " + rule); - curr.rrule = null; - } - } +ical.objectHandlers['END'] = function (val, params, curr, stack) { + // Recurrence rules are only valid for VEVENT, VTODO, and VJOURNAL. + // More specifically, we need to filter the VCALENDAR type because we might end up with a defined rrule + // due to the subtypes. + if ((val === "VEVENT") || (val === "VTODO") || (val === "VJOURNAL")) { + if (curr.rrule) { + var rule = curr.rrule.replace('RRULE:', ''); + if (rule.indexOf('DTSTART') === -1) { + + if (curr.start.length === 8) { + var comps = /^(\d{4})(\d{2})(\d{2})$/.exec(curr.start); + if (comps) { + curr.start = new Date(comps[1], comps[2] - 1, comps[3]); + } + } + + + if (typeof curr.start.toISOString === 'function') { + try { + rule += ';DTSTART=' + curr.start.toISOString().replace(/[-:]/g, ''); + rule = rule.replace(/\.[0-9]{3}/, ''); + } catch (error) { + console.error("ERROR when trying to convert to ISOString", error); + } + } else { + console.error("No toISOString function in curr.start", curr.start); + } + } + curr.rrule = rrule.fromString(rule); + } + } return originalEnd.call(this, val, params, curr, stack); } diff --git a/modules/default/calendar/vendor/ical.js/package.json b/modules/default/calendar/vendor/ical.js/package.json index 991b144080..0b226f6b74 100644 --- a/modules/default/calendar/vendor/ical.js/package.json +++ b/modules/default/calendar/vendor/ical.js/package.json @@ -10,17 +10,18 @@ ], "homepage": "https://github.com/peterbraden/ical.js", "author": "Peter Braden (peterbraden.co.uk)", + "license": "Apache-2.0", "repository": { "type": "git", "url": "git://github.com/peterbraden/ical.js.git" }, "dependencies": { - "request": "2.68.0", - "rrule": "2.0.0" + "request": "^2.88.0", + "rrule": "2.4.1" }, "devDependencies": { - "vows": "0.7.0", - "underscore": "1.3.0" + "vows": "0.8.2", + "underscore": "1.9.1" }, "scripts": { "test": "./node_modules/vows/bin/vows ./test/test.js" diff --git a/modules/default/calendar/vendor/ical.js/readme.md b/modules/default/calendar/vendor/ical.js/readme.md index 2daba074a3..5f05643605 100644 --- a/modules/default/calendar/vendor/ical.js/readme.md +++ b/modules/default/calendar/vendor/ical.js/readme.md @@ -7,6 +7,7 @@ A tolerant, minimal icalendar parser for javascript/node (http://tools.ietf.org/html/rfc5545) + ## Install - Node.js ## ical.js is availble on npm: @@ -33,19 +34,29 @@ Use the request library to fetch the specified URL (```opts``` gets passed on to ## Example 1 - Print list of upcoming node conferences (see example.js) ```javascript - var ical = require('ical') - , months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'] - - ical.fromURL('http://lanyrd.com/topics/nodejs/nodejs.ics', {}, function(err, data) { - for (var k in data){ - if (data.hasOwnProperty(k)) { - var ev = data[k] - console.log("Conference", - ev.summary, - 'is in', - ev.location, - 'on the', ev.start.getDate(), 'of', months[ev.start.getMonth()]); - } - } - }); +'use strict'; + +const ical = require('ical'); +const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; + +ical.fromURL('http://lanyrd.com/topics/nodejs/nodejs.ics', {}, function (err, data) { + for (let k in data) { + if (data.hasOwnProperty(k)) { + var ev = data[k]; + if (data[k].type == 'VEVENT') { + console.log(`${ev.summary} is in ${ev.location} on the ${ev.start.getDate()} of ${months[ev.start.getMonth()]} at ${ev.start.toLocaleTimeString('en-GB')}`); + + } + } + } +}); ``` + +## Recurrences and Exceptions ## +Calendar events with recurrence rules can be significantly more complicated to handle correctly. There are three parts to handling them: + + 1. rrule - the recurrence rule specifying the pattern of recurring dates and times for the event. + 2. recurrences - an optional array of event data that can override specific occurrences of the event. + 3. exdate - an optional array of dates that should be excluded from the recurrence pattern. + +See example_rrule.js for an example of handling recurring calendar events. diff --git a/modules/default/calendar/vendor/ical.js/test/test.js b/modules/default/calendar/vendor/ical.js/test/test.js index 041a4a13e6..ba6ad1a674 100644 --- a/modules/default/calendar/vendor/ical.js/test/test.js +++ b/modules/default/calendar/vendor/ical.js/test/test.js @@ -43,6 +43,12 @@ vows.describe('node-ical').addBatch({ , 'has a summary (invalid colon handling tolerance)' : function(topic){ assert.equal(topic.summary, '[Async]: Everything Express') } + , 'has a date only start datetime' : function(topic){ + assert.equal(topic.start.dateOnly, true) + } + , 'has a date only end datetime' : function(topic){ + assert.equal(topic.end.dateOnly, true) + } } , 'event d4c8' :{ topic : function(events){ @@ -108,7 +114,7 @@ vows.describe('node-ical').addBatch({ assert.equal(topic.end.getFullYear(), 1998); assert.equal(topic.end.getUTCMonth(), 2); assert.equal(topic.end.getUTCDate(), 15); - assert.equal(topic.end.getUTCHours(), 0); + assert.equal(topic.end.getUTCHours(), 00); assert.equal(topic.end.getUTCMinutes(), 30); } } @@ -146,7 +152,7 @@ vows.describe('node-ical').addBatch({ } , 'has a start datetime' : function(topic) { assert.equal(topic.start.getFullYear(), 2011); - assert.equal(topic.start.getMonth(), 9); + assert.equal(topic.start.getMonth(), 09); assert.equal(topic.start.getDate(), 11); } @@ -192,12 +198,12 @@ vows.describe('node-ical').addBatch({ } , 'has a start' : function(topic){ assert.equal(topic.start.tz, 'America/Phoenix') - assert.equal(topic.start.toISOString(), new Date(2011, 10, 9, 19, 0,0).toISOString()) + assert.equal(topic.start.toISOString(), new Date(2011, 10, 09, 19, 0,0).toISOString()) } } } - , 'with test6.ics (testing assembly.org)' : { + , 'with test6.ics (testing assembly.org)': { topic: function () { return ical.parseFile('./test/test6.ics') } @@ -208,7 +214,7 @@ vows.describe('node-ical').addBatch({ })[0]; } , 'has a start' : function(topic){ - assert.equal(topic.start.toISOString(), new Date(2011, 7, 4, 12, 0,0).toISOString()) + assert.equal(topic.start.toISOString(), new Date(2011, 07, 04, 12, 0,0).toISOString()) } } , 'event with rrule' :{ @@ -249,7 +255,7 @@ vows.describe('node-ical').addBatch({ }, 'task completed': function(task){ assert.equal(task.completion, 100); - assert.equal(task.completed.toISOString(), new Date(2013, 6, 16, 10, 57, 45).toISOString()); + assert.equal(task.completed.toISOString(), new Date(2013, 06, 16, 10, 57, 45).toISOString()); } } } @@ -367,14 +373,115 @@ vows.describe('node-ical').addBatch({ assert.equal(topic.end.getFullYear(), 2014); assert.equal(topic.end.getMonth(), 3); assert.equal(topic.end.getUTCHours(), 19); - assert.equal(topic.end.getUTCMinutes(), 0); + assert.equal(topic.end.getUTCMinutes(), 00); } } - }, + } + + , 'with test12.ics (testing recurrences and exdates)': { + topic: function () { + return ical.parseFile('./test/test12.ics') + } + , 'event with rrule': { + topic: function (events) { + return _.select(_.values(events), function (x) { + return x.uid === '0000001'; + })[0]; + } + , "Has an RRULE": function (topic) { + assert.notEqual(topic.rrule, undefined); + } + , "Has summary Treasure Hunting": function (topic) { + assert.equal(topic.summary, 'Treasure Hunting'); + } + , "Has two EXDATES": function (topic) { + assert.notEqual(topic.exdate, undefined); + assert.notEqual(topic.exdate[new Date(2015, 06, 08, 12, 0, 0).toISOString().substring(0, 10)], undefined); + assert.notEqual(topic.exdate[new Date(2015, 06, 10, 12, 0, 0).toISOString().substring(0, 10)], undefined); + } + , "Has a RECURRENCE-ID override": function (topic) { + assert.notEqual(topic.recurrences, undefined); + assert.notEqual(topic.recurrences[new Date(2015, 06, 07, 12, 0, 0).toISOString().substring(0, 10)], undefined); + assert.equal(topic.recurrences[new Date(2015, 06, 07, 12, 0, 0).toISOString().substring(0, 10)].summary, 'More Treasure Hunting'); + } + } + } + + , 'with test13.ics (testing recurrence-id before rrule)': { + topic: function () { + return ical.parseFile('./test/test13.ics') + } + , 'event with rrule': { + topic: function (events) { + return _.select(_.values(events), function (x) { + return x.uid === '6m2q7kb2l02798oagemrcgm6pk@google.com'; + })[0]; + } + , "Has an RRULE": function (topic) { + assert.notEqual(topic.rrule, undefined); + } + , "Has summary 'repeated'": function (topic) { + assert.equal(topic.summary, 'repeated'); + } + , "Has a RECURRENCE-ID override": function (topic) { + assert.notEqual(topic.recurrences, undefined); + assert.notEqual(topic.recurrences[new Date(2016, 7, 26, 14, 0, 0).toISOString().substring(0, 10)], undefined); + assert.equal(topic.recurrences[new Date(2016, 7, 26, 14, 0, 0).toISOString().substring(0, 10)].summary, 'bla bla'); + } + } + } + + , 'with test14.ics (testing comma-separated exdates)': { + topic: function () { + return ical.parseFile('./test/test14.ics') + } + , 'event with comma-separated exdate': { + topic: function (events) { + return _.select(_.values(events), function (x) { + return x.uid === '98765432-ABCD-DCBB-999A-987765432123'; + })[0]; + } + , "Has summary 'Example of comma-separated exdates'": function (topic) { + assert.equal(topic.summary, 'Example of comma-separated exdates'); + } + , "Has four comma-separated EXDATES": function (topic) { + assert.notEqual(topic.exdate, undefined); + // Verify the four comma-separated EXDATES are there + assert.notEqual(topic.exdate[new Date(2017, 6, 6, 12, 0, 0).toISOString().substring(0, 10)], undefined); + assert.notEqual(topic.exdate[new Date(2017, 6, 17, 12, 0, 0).toISOString().substring(0, 10)], undefined); + assert.notEqual(topic.exdate[new Date(2017, 6, 20, 12, 0, 0).toISOString().substring(0, 10)], undefined); + assert.notEqual(topic.exdate[new Date(2017, 7, 3, 12, 0, 0).toISOString().substring(0, 10)], undefined); + // Verify an arbitrary date isn't there + assert.equal(topic.exdate[new Date(2017, 4, 5, 12, 0, 0).toISOString().substring(0, 10)], undefined); + } + } + } + + , 'with test14.ics (testing exdates with bad times)': { + topic: function () { + return ical.parseFile('./test/test14.ics') + } + , 'event with exdates with bad times': { + topic: function (events) { + return _.select(_.values(events), function (x) { + return x.uid === '1234567-ABCD-ABCD-ABCD-123456789012'; + })[0]; + } + , "Has summary 'Example of exdate with bad times'": function (topic) { + assert.equal(topic.summary, 'Example of exdate with bad times'); + } + , "Has two EXDATES even though they have bad times": function (topic) { + assert.notEqual(topic.exdate, undefined); + // Verify the two EXDATES are there, even though they have bad times + assert.notEqual(topic.exdate[new Date(2017, 11, 18, 12, 0, 0).toISOString().substring(0, 10)], undefined); + assert.notEqual(topic.exdate[new Date(2017, 11, 19, 12, 0, 0).toISOString().substring(0, 10)], undefined); + } + } + } - 'url request errors' : { + , 'url request errors': { topic : function () { - ical.fromURL('http://not.exist/', {}, this.callback); + ical.fromURL('http://255.255.255.255/', {}, this.callback); } , 'are passed back to the callback' : function (err, result) { assert.instanceOf(err, Error); diff --git a/modules/default/calendar/vendor/ical.js/test/test12.ics b/modules/default/calendar/vendor/ical.js/test/test12.ics new file mode 100644 index 0000000000..4e78603b03 --- /dev/null +++ b/modules/default/calendar/vendor/ical.js/test/test12.ics @@ -0,0 +1,19 @@ +BEGIN:VCALENDAR +BEGIN:VEVENT +UID:0000001 +SUMMARY:Treasure Hunting +DTSTART;TZID=America/Los_Angeles:20150706T120000 +DTEND;TZID=America/Los_Angeles:20150706T130000 +RRULE:FREQ=DAILY;COUNT=10 +EXDATE;TZID=America/Los_Angeles:20150708T120000 +EXDATE;TZID=America/Los_Angeles:20150710T120000 +END:VEVENT +BEGIN:VEVENT +UID:0000001 +SUMMARY:More Treasure Hunting +LOCATION:The other island +DTSTART;TZID=America/Los_Angeles:20150709T150000 +DTEND;TZID=America/Los_Angeles:20150707T160000 +RECURRENCE-ID;TZID=America/Los_Angeles:20150707T120000 +END:VEVENT +END:VCALENDAR diff --git a/modules/default/calendar/vendor/ical.js/test/test13.ics b/modules/default/calendar/vendor/ical.js/test/test13.ics new file mode 100644 index 0000000000..3118186bed --- /dev/null +++ b/modules/default/calendar/vendor/ical.js/test/test13.ics @@ -0,0 +1,57 @@ +BEGIN:VCALENDAR +PRODID:-//Google Inc//Google Calendar 70.9054//EN +VERSION:2.0 +CALSCALE:GREGORIAN +METHOD:PUBLISH +X-WR-CALNAME:ical +X-WR-TIMEZONE:Europe/Kiev +X-WR-CALDESC: +BEGIN:VTIMEZONE +TZID:Europe/Kiev +X-LIC-LOCATION:Europe/Kiev +BEGIN:DAYLIGHT +TZOFFSETFROM:+0200 +TZOFFSETTO:+0300 +TZNAME:EEST +DTSTART:19700329T030000 +RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU +END:DAYLIGHT +BEGIN:STANDARD +TZOFFSETFROM:+0300 +TZOFFSETTO:+0200 +TZNAME:EET +DTSTART:19701025T040000 +RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU +END:STANDARD +END:VTIMEZONE +BEGIN:VEVENT +DTSTART;TZID=Europe/Kiev:20160826T140000 +DTEND;TZID=Europe/Kiev:20160826T150000 +DTSTAMP:20160825T061505Z +UID:6m2q7kb2l02798oagemrcgm6pk@google.com +RECURRENCE-ID;TZID=Europe/Kiev:20160826T140000 +CREATED:20160823T125221Z +DESCRIPTION: +LAST-MODIFIED:20160823T130320Z +LOCATION: +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:bla bla +TRANSP:OPAQUE +END:VEVENT +BEGIN:VEVENT +DTSTART;TZID=Europe/Kiev:20160825T140000 +DTEND;TZID=Europe/Kiev:20160825T150000 +RRULE:FREQ=DAILY;UNTIL=20160828T110000Z +DTSTAMP:20160825T061505Z +UID:6m2q7kb2l02798oagemrcgm6pk@google.com +CREATED:20160823T125221Z +DESCRIPTION: +LAST-MODIFIED:20160823T125221Z +LOCATION: +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:repeated +TRANSP:OPAQUE +END:VEVENT +END:VCALENDAR \ No newline at end of file diff --git a/modules/default/calendar/vendor/ical.js/test/test14.ics b/modules/default/calendar/vendor/ical.js/test/test14.ics new file mode 100644 index 0000000000..5c4f5cafb8 --- /dev/null +++ b/modules/default/calendar/vendor/ical.js/test/test14.ics @@ -0,0 +1,33 @@ +BEGIN:VCALENDAR +PRODID:-//Google Inc//Google Calendar 70.9054//EN +VERSION:2.0 +CALSCALE:GREGORIAN +METHOD:PUBLISH +X-WR-CALNAME:ical +X-WR-TIMEZONE:Europe/Kiev +X-WR-CALDESC: +BEGIN:VEVENT +UID:98765432-ABCD-DCBB-999A-987765432123 +DTSTART;TZID=US/Central:20170216T090000 +DTEND;TZID=US/Central:20170216T190000 +DTSTAMP:20170727T044436Z +EXDATE;TZID=US/Central:20170706T090000,20170717T090000,20170720T090000,20 + 170803T090000 +LAST-MODIFIED:20170727T044435Z +RRULE:FREQ=WEEKLY;WKST=SU;UNTIL=20170814T045959Z;INTERVAL=2;BYDAY=MO,TH +SEQUENCE:0 +SUMMARY:Example of comma-separated exdates +END:VEVENT +BEGIN:VEVENT +UID:1234567-ABCD-ABCD-ABCD-123456789012 +DTSTART:20170814T140000Z +DTEND:20170815T000000Z +DTSTAMP:20171204T134925Z +EXDATE:20171219T060000 +EXDATE:20171218T060000 +LAST-MODIFIED:20171024T140004Z +RRULE:FREQ=WEEKLY;WKST=SU;INTERVAL=2;BYDAY=MO,TU +SEQUENCE:0 +SUMMARY:Example of exdate with bad times +END:VEVENT +END:VCALENDAR \ No newline at end of file