diff --git a/.gitignore b/.gitignore index a5325d6..11698cf 100644 --- a/.gitignore +++ b/.gitignore @@ -3,7 +3,6 @@ coverage .idea .cache .temp -dist build npm-debug.log yarn-error.log diff --git a/dist/datebook.min.cjs b/dist/datebook.min.cjs new file mode 100644 index 0000000..f43d802 --- /dev/null +++ b/dist/datebook.min.cjs @@ -0,0 +1,811 @@ +'use strict'; + +var RECURRENCE = { + FREQUENCY: { + DAILY: 'DAILY', + WEEKLY: 'WEEKLY', + MONTHLY: 'MONTHLY', + YEARLY: 'YEARLY' + } +}; +var FORMAT = { + DATE: 'YYYYMMDD', + TIME: 'ThhmmssZ', + FULL: 'YYYYMMDDThhmmssZ', + NO_UTC_FULL: 'YYYYMMDDThhmmss', + OUTLOOK_DATE: 'YYYY-MM-DD', + OUTLOOK_TIME: 'Thh:mm:ssZ', + OUTLOOK_FULL: 'YYYY-MM-DDThh:mm:ssZ' +}; +var URL = { + YAHOO: 'https://calendar.yahoo.com/', + GOOGLE: 'https://calendar.google.com/calendar/render', + OUTLOOK: 'https://outlook.{{host}}.com/calendar/action/compose' +}; + +/** + * Adds a leading zero to a single-digit string and returns a two-digit string. + * + * @param {number | string} n + * @returns {string} + */ +var addLeadingZero = function (n) { + if (n === void 0) { n = ''; } + return "0".concat(parseInt(n.toString(), 10)).slice(-2); +}; +/** + * Returns the duration between two given dates in hhmm format. + * + * @param {number} start + * @param {number} end + * @returns {string} + */ +var getDuration = function (start, end) { + var seconds = Math.floor((end - start) / 1000); + var hours = Math.floor(seconds / 3600); + var mins = ((seconds / 3600) % 1) * 60; + return "".concat(addLeadingZero(hours)).concat(addLeadingZero(mins)); +}; +/** + * Returns the number of hours between two given dates. + * + * @param {number} start + * @param {number} end + * @returns {number} + */ +var getHoursDiff = function (start, end) { + var seconds = Math.floor((end - start) / 1000); + return Math.floor(seconds / 3600); +}; +/** + * Computes the number of days a recurrence will last. + * + * @param {CalendarRecurrence} recurrence + * @returns {number} + */ +var getRecurrenceLengthDays = function (recurrence) { + var frequency = recurrence.frequency, interval = recurrence.interval; + var FREQUENCY = RECURRENCE.FREQUENCY; + if (interval) { + switch (frequency) { + case FREQUENCY.YEARLY: + return interval * 365.25; + case FREQUENCY.MONTHLY: + return interval * 30.42; // avg days in a year + case FREQUENCY.WEEKLY: + return interval * 7; + default: + return interval; // daily + } + } + // if no frequency is specified, set an arbitrarily-long recurrence end + return 365.25 * 100; // 100 years +}; +/** + * Formats the given JS Date() object to the given format. + * Format defaults to: YYYYMMDDTHHMMss + * + * @param {Date} [d = new Date()] + * @param {string} format + * @returns {string} + */ +var formatDate = function (d, format) { + if (d === void 0) { d = new Date(); } + var dateValues = { + YYYY: d.getUTCFullYear(), + MM: addLeadingZero(d.getUTCMonth() + 1), + DD: addLeadingZero(d.getUTCDate()), + hh: addLeadingZero(d.getUTCHours()), + mm: addLeadingZero(d.getUTCMinutes()), + ss: addLeadingZero(d.getUTCSeconds()) + }; + return Object + .keys(dateValues) + .reduce(function (date, key) { + return date.replace(key, dateValues[key].toString()); + }, format); +}; +/** + * Formats the given JS Date() object to the given format, not using UTC + * Format defaults to: YYYYMMDDTHHMMss + * + * @param {Date} [d = new Date()] + * @param {string} format + * @returns {string} + */ +var formatDateNoUtc = function (d, format) { + if (d === void 0) { d = new Date(); } + var dateValues = { + YYYY: d.getFullYear(), + MM: addLeadingZero(d.getMonth() + 1), + DD: addLeadingZero(d.getDate()), + hh: addLeadingZero(d.getHours()), + mm: addLeadingZero(d.getMinutes()), + ss: addLeadingZero(d.getSeconds()) + }; + return Object + .keys(dateValues) + .reduce(function (date, key) { + return date.replace(key, dateValues[key].toString()); + }, format); +}; +/** + * Returns the current timestamp. + * + * @returns {string} + */ +var getTimeCreated = function () { + return formatDate(new Date(), FORMAT.FULL); +}; +/** + * Increments dates by the given number of days. + * This will account for edge cases, such as leap years. + * + * @param {Date} dateInput - date to increment + * @param {number} days - number of days + * @returns {Date} + */ +var incrementDate = function (dateInput, days) { + var additionalTime = days * 86400000; + var newDate = new Date(); + newDate.setTime(dateInput.getTime() + additionalTime); + return newDate; +}; +var time = { + addLeadingZero: addLeadingZero, + getDuration: getDuration, + getHoursDiff: getHoursDiff, + getRecurrenceLengthDays: getRecurrenceLengthDays, + formatDate: formatDate, + formatDateNoUtc: formatDateNoUtc, + getTimeCreated: getTimeCreated, + incrementDate: incrementDate +}; + +/** + * Base calendar class. This class can be extended to add new calendar services. + */ +var CalendarBase = /** @class */ (function () { + /** + * Constructor. + * + * @param {CalendarOptions} options + */ + function CalendarBase(options) { + var _this = this; + /** True if the event is one that spans the entire day. */ + this.isAllDay = false; + /** Event description. */ + this.description = ''; + /** Event title. */ + this.title = ''; + /** Event physical location. */ + this.location = ''; + /** Start time of the event. */ + this.start = new Date(); + /** End time of the event. */ + this.end = new Date(); + /** Calendar service query string params. */ + this.params = {}; + /** Array of event attendees. See {@link CalendarAttendee} */ + this.attendees = []; + /** + * Sets the description, title and location. + * + * @param {CalendarOptions} options + */ + this.setText = function (options) { + _this.description = options.description || ''; + _this.title = options.title || ''; + _this.location = options.location || ''; + }; + /** + * Sets the time and recurrence parameters. + * + * @param {CalendarOptions} options + */ + this.setTimestamps = function (options) { + _this.isAllDay = !options.end; + _this.start = options.start; + // if no end date is specified, make the end date exactly 1 day from the start date + _this.end = options.end || time.incrementDate(_this.start, 1); + _this.recurrence = options.recurrence; + }; + /** + * Sets additional calendar service properties. + * May be used to override existing query string params if necessary. + * + * @param {string} key + * @param {string | null} value + * @returns {CalendarBase} + */ + this.setParam = function (key, value) { + _this.params[key] = value; + return _this; + }; + this.setText(options); + this.setTimestamps(options); + this.setAttendees(options); + } + /** + * Sets the attendees array if attendees are supplied. + * + * @param {CalendarOptions} options + */ + CalendarBase.prototype.setAttendees = function (options) { + this.attendees = Array.isArray(options.attendees) ? options.attendees : []; + }; + return CalendarBase; +}()); + +/****************************************************************************** +Copyright (c) Microsoft Corporation. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +***************************************************************************** */ +/* global Reflect, Promise */ + +var extendStatics = function(d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); +}; + +function __extends(d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +} + +var __assign = function() { + __assign = Object.assign || function __assign(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; + +function __spreadArray(to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); +} + +/** + * Creates a param string from a flat key-value pair. + * + * @param {Record} params + * @param {string} [delimiter = ';'] + * @param {Function} [transformFn] - transformation function to be applied to each param + * @returns {string} + */ +var toParamString = function (params, delimiter, transformFn) { + if (delimiter === void 0) { delimiter = ';'; } + if (transformFn === void 0) { transformFn = function (s) { return s; }; } + var paramString = []; + for (var key in params) { + if (params.hasOwnProperty(key) && params[key] !== undefined) { + paramString.push("".concat(key, "=").concat(transformFn(params[key]))); + } + } + return paramString.join(delimiter); +}; +/** + * Creates a query string from a flat key-value pair. + * + * @param {Record} params + * @returns {string} + */ +var toQueryString = function (params) { + // filter the record set to remove null values + var filteredParams = Object + .keys(params) + .filter(function (p) { return params[p] !== null; }) + .reduce(function (p, k) { + var _a; + return (__assign(__assign({}, p), (_a = {}, _a[k] = params[k], _a))); + }, {}); + return toParamString(filteredParams, '&', encodeURIComponent); +}; +/** + * Creates an ICS param string from a flat key-value pair. + * + * @param {Record} params + * @returns {string} + */ +var toIcsParamString = function (params) { + return toParamString(params, ';'); +}; +/** + * Renders a comma-separated string of mailto values. + * (e.g., 'John Doe ,Jane Doe ') + * + * @param {CalendarAttendee[]} attendees + * @returns {string[]} + */ +var toMailtoList = function (attendees) { + return attendees + .map(function (_a) { + var email = _a.email, name = _a.name; + return name + ? "".concat(name, " <").concat(email, ">") + : email; + }); +}; +/** + * Converts the given string to ProperCase. + * + * @param {string} s + * @returns {string} + */ +var toProperCase = function (s) { + return [ + s[0].toUpperCase(), + s.slice(-s.length + 1).toLowerCase() + ].join(''); +}; +var data = { + toParamString: toParamString, + toQueryString: toQueryString, + toIcsParamString: toIcsParamString, + toMailtoList: toMailtoList, + toProperCase: toProperCase +}; + +/** + * Removes line breaks from a string. Returns an empty string if falsy. + * + * @param {string} [str = ''] - string to sanitize + * @returns {string} + */ +var formatText = function (str) { + if (str === void 0) { str = ''; } + return str + .replace(/\\/g, '\\\\') + .replace(/\n/g, '\\n') + .replace(/[,;]/g, '\\$&'); +}; +/** + * Returns a random base 36 hash for iCal UID. + * + * @returns {string} + */ +var getUid = function () { + return Math.random().toString(36).substr(2); +}; +/** + * Returns the hostname for usage in `PRODID`. Returns `datebook` in Node.js. + * + * @returns {string} + */ +var getProdId = function () { + return typeof window !== 'undefined' + ? window.location.host + : 'datebook'; +}; +/** + * Converts the given recurrence options to RFC???? + * + * @param {CalendarRecurrence} recurrence + * @returns {string} + */ +var getRrule = function (recurrence) { + var _a, _b; + var rrule = { + FREQ: recurrence.frequency, + INTERVAL: (_a = recurrence.interval) === null || _a === void 0 ? void 0 : _a.toString(), + COUNT: (_b = recurrence.count) === null || _b === void 0 ? void 0 : _b.toString(), + WKST: recurrence.weekstart, + BYDAY: recurrence.weekdays, + BYMONTHDAY: recurrence.monthdays + }; + if (recurrence.end) { + rrule.UNTIL = time.formatDate(recurrence.end, FORMAT.FULL); + } + return data.toIcsParamString(rrule); +}; +var ics = { + formatText: formatText, + getUid: getUid, + getProdId: getProdId, + getRrule: getRrule +}; + +/** + * Generates a Google Calendar url. + */ +var GoogleCalendar = /** @class */ (function (_super) { + __extends(GoogleCalendar, _super); + function GoogleCalendar(opts) { + var _this = _super.call(this, opts) || this; + /** + * Sets the basic properties for the calendar instance. + */ + _this.setInitialParams = function () { + var timestampFormat = FORMAT.DATE; + if (!_this.isAllDay) { + timestampFormat += FORMAT.TIME; + } + var dates = [ + time.formatDate(_this.start, timestampFormat), + time.formatDate(_this.end, timestampFormat) + ].join('/'); + _this + .setParam('action', 'TEMPLATE') + .setParam('dates', dates) + .setParam('text', _this.title) + .setParam('details', _this.description) + .setParam('location', _this.location) + .setParam('allday', _this.isAllDay.toString()); + if (_this.recurrence) { + _this.setParam('recur', "RRULE:".concat(ics.getRrule(_this.recurrence))); + } + if (_this.attendees.length > 0) { + _this.setParam('add', data.toMailtoList(_this.attendees).join(',')); + } + }; + /** + * Generates the Google Calendar url. + * + * @returns {string} + */ + _this.render = function () { + var baseUrl = URL.GOOGLE; + var queryString = data.toQueryString(_this.params); + return "".concat(baseUrl, "?").concat(queryString); + }; + _this.setInitialParams(); + return _this; + } + return GoogleCalendar; +}(CalendarBase)); + +/** + * Generates a Yahoo! Calendar url. + * + * @remark Yahoo! Calendar's support for recurrence is limited to only the interval and frequency. + */ +var YahooCalendar = /** @class */ (function (_super) { + __extends(YahooCalendar, _super); + function YahooCalendar(opts) { + var _this = _super.call(this, opts) || this; + /** + * Sets the basic properties for the calendar instance. + */ + _this.setInitialParams = function () { + _this + .setParam('v', '60') // version number; must be 60 + .setParam('title', _this.title) + .setParam('desc', _this.description) + .setParam('in_loc', _this.location); + _this.setTimeParams(); + if (_this.attendees.length > 0) { + _this.setParam('inv_list', data.toMailtoList(_this.attendees).join(',')); + } + }; + /** + * Sets the start/end/allday parameters. + */ + _this.setTimeParams = function () { + if (_this.isAllDay) { + _this + .setParam('dur', 'allday') + .setParam('st', time.formatDateNoUtc(_this.start, FORMAT.DATE)); + } + else { + _this.setParam('st', time.formatDateNoUtc(_this.start, FORMAT.NO_UTC_FULL)); + if (time.getHoursDiff(_this.start.getTime(), _this.end.getTime()) > 99) { + // Yahoo only supports up to 99 hours, so we are forced to specify the end time instead of the duration + _this.setParam('et', time.formatDateNoUtc(_this.end, FORMAT.NO_UTC_FULL)); + } + else { + // we prefer specifying duration in lieu of end time, because apparently Yahoo's end time is buggy w.r.t. timezones + _this.setParam('dur', time.getDuration(_this.start.getTime(), _this.end.getTime())); + } + } + }; + /** + * Generates the Yahoo! Calendar data. + * + * @returns {string} + */ + _this.render = function () { + var baseUrl = URL.YAHOO; + var queryString = data.toQueryString(_this.params); + return "".concat(baseUrl, "?").concat(queryString); + }; + _this.setInitialParams(); + return _this; + } + return YahooCalendar; +}(CalendarBase)); + +/** + * Generates an Outlook Calendar url. + * + * @remark Outlook Calendar's query string params do not support recurrence. + */ +var OutlookCalendar = /** @class */ (function (_super) { + __extends(OutlookCalendar, _super); + function OutlookCalendar(opts) { + var _this = _super.call(this, opts) || this; + /** Base URL for the host service. */ + _this.baseUrl = URL.OUTLOOK; + /** + * Sets the basic properties for the calendar instance. + */ + _this.setInitialParams = function () { + var timestampFormat = FORMAT.OUTLOOK_DATE; + if (!_this.isAllDay) { + timestampFormat += FORMAT.OUTLOOK_TIME; + } + _this + .setParam('rru', 'addevent') + .setParam('path', '/calendar/action/compose') + .setParam('startdt', time.formatDate(_this.start, timestampFormat)) + .setParam('enddt', time.formatDate(_this.end, timestampFormat)) + .setParam('subject', _this.title) + .setParam('body', _this.description) + .setParam('location', _this.location) + .setParam('allday', _this.isAllDay.toString()); + if (_this.attendees.length > 0) { + _this.setParam('to', data.toMailtoList(_this.attendees).join(',')); + } + }; + /** + * Sets the host service type. The default host for Outlook is **`live`**. + * + * @param {string} host - `live` (for personal accounts) or `office` (for Office365) + * @returns {OutlookCalendar} + */ + _this.setHost = function (host) { + if (['live', 'office'].includes(host)) { + _this.baseUrl = URL.OUTLOOK.replace('{{host}}', host); + } + return _this; + }; + /** + * Generates the Outlook url. + * + * @returns {string} + */ + _this.render = function () { + var queryString = data.toQueryString(_this.params); + return "".concat(_this.baseUrl, "?").concat(queryString); + }; + _this.setInitialParams(); + _this.setHost('live'); + return _this; + } + return OutlookCalendar; +}(CalendarBase)); + +/** + * Renders ICS file content. + */ +var ICalendar = /** @class */ (function (_super) { + __extends(ICalendar, _super); + function ICalendar(opts) { + var _this = _super.call(this, opts) || this; + /** List of additional ICalendar events to add. */ + _this.additionalEvents = []; + /** List of VEVENT property-value entries */ + _this.properties = []; + /** Key-value pair of basic calendar properties. */ + _this.meta = {}; + /** + * Sets the basic properties for the calendar instance. + */ + _this.setInitialParams = function () { + _this + .setMeta('UID', ics.getUid()) + .setMeta('DTSTAMP', time.getTimeCreated()) + .addProperty('CLASS', 'PUBLIC') + .addProperty('DESCRIPTION', ics.formatText(_this.description)) + .addProperty('LOCATION', ics.formatText(_this.location)) + .addProperty('SUMMARY', ics.formatText(_this.title)) + .addProperty('TRANSP', 'TRANSPARENT'); + if (_this.isAllDay) { + // for all-day events, omit the time and just place dates + _this + .addProperty('DTSTART;VALUE=DATE', time.formatDateNoUtc(_this.start, FORMAT.DATE)) + .addProperty('DTEND;VALUE=DATE', time.formatDateNoUtc(time.incrementDate(_this.start, 1), FORMAT.DATE)); + } + else { + // otherwise, set the full start and end dates + _this + .addProperty('DTSTART', time.formatDate(_this.start, FORMAT.FULL)) + .addProperty('DTEND', time.formatDate(_this.end, FORMAT.FULL)); + } + if (_this.recurrence) { + _this.addProperty('RRULE', ics.getRrule(_this.recurrence)); + } + if (_this.attendees.length > 0) { + _this + .attendees + .forEach(function (_a) { + var email = _a.email, name = _a.name, _b = _a.icsOptions, icsOptions = _b === void 0 ? {} : _b; + var params = _this.getAttendeeParams(icsOptions, name); + var mailto = "MAILTO:".concat(email); + _this.addProperty(params, mailto); + }); + } + }; + /** + * Generates the ATTENDEE property param based on user-specified options and the attendee name. + * + * @param {ICSAttendeeOptions} options + * @param {string} name + * @returns {string} + */ + _this.getAttendeeParams = function (options, name) { + var params = {}; + if (name) + params['CN'] = name; + if (options.delegatedFrom) + params['DELEGATED-FROM'] = options.delegatedFrom; + if (options.partStat) + params['PARTSTAT'] = options.partStat; + if (options.role) + params['ROLE'] = options.role; + if (options.sentBy) + params['SENT-BY'] = options.sentBy; + params['RSVP'] = options.rsvp ? 'TRUE' : 'FALSE'; + var paramString = data.toParamString(params, ';'); + return "ATTENDEE;".concat(paramString); + }; + /** + * Generates a valid ICS alarm duration. + * + * @example getAlarmDuration({ minutes: 3, seconds: 2 }) -> PT3M2S + * @param {ICSDuration} duration + * @returns {string} + */ + _this.getAlarmDuration = function (duration) { + var features = [ + "".concat(duration.weeks, "W"), + "".concat(duration.days, "D"), + "".concat(duration.hours, "H"), + "".concat(duration.minutes, "M"), + "".concat(duration.seconds, "S") + ].filter(function (s) { return /^[0-9]+[A-Z]$/.exec(s); }); // exclude zero-duration features + features.unshift(duration.after ? 'PT' : '-PT'); + return features.join(''); + }; + /** + * Returns the iCalendar meta properties, formatted as VEVENT entry lines. + * + * @returns {string[]} + */ + _this.getMeta = function () { + return Object + .keys(_this.meta) + .map(function (key) { + return "".concat(key, ":").concat(_this.meta[key]); + }); + }; + /** + * Sets iCalendar meta properties, such as UID, DTSTAMP, etc. + * + * @param {string} key + * @param {string} value + * @returns {ICalendar} + */ + _this.setMeta = function (key, value) { + _this.meta[key] = value; + return _this; + }; + /** + * Adds the given event to the same `.ics` file instance. + * + * @param {ICalendar} event + * @returns {ICalendar} + */ + _this.addEvent = function (event) { + _this.additionalEvents.push(event); + return _this; + }; + /** + * Adds any additional desired iCalendar property having the given key-value pair to the instance. + * + * @param {Alarm} alarm + * @returns {ICalendar} + */ + _this.addProperty = function (key, value) { + if (typeof value === 'object') { + _this.properties.push("BEGIN:".concat(key)); + for (var k in value) { + _this.addProperty(k, value[k]); + } + _this.properties.push("END:".concat(key)); + } + else { + _this.properties.push("".concat(key, ":").concat(value.toString())); + } + return _this; + }; + /** + * Adds an alarm. Multiple different alarms may be added to a single instance. + * + * @param {Alarm} alarm + * @returns {ICalendar} + */ + _this.addAlarm = function (alarm) { + var value = { + ACTION: alarm.action + }; + if (alarm.description) + value.DESCRIPTION = ics.formatText(alarm.description); + if (alarm.summary) + value.SUMMARY = ics.formatText(alarm.summary); + if (alarm.duration) + value.DURATION = _this.getAlarmDuration(alarm.duration); + if (alarm.repeat) + value.REPEAT = alarm.repeat; + if (alarm.attach) { + var key = alarm.attach.params + ? "ATTACH;".concat(alarm.attach.params) + : 'ATTACH'; + value[key] = alarm.attach.url; + } + if (alarm.trigger instanceof Date) { + value['TRIGGER;VALUE=DATE-TIME'] = time.formatDate(alarm.trigger, FORMAT.FULL); + } + else { + value['TRIGGER'] = _this.getAlarmDuration(alarm.trigger); + } + return _this.addProperty('VALARM', value); + }; + /** + * Generates the iCalendar data. + * + * @returns {string} + */ + _this.render = function () { + var events = __spreadArray([ + _this + ], _this.additionalEvents, true); + var vEvents = events.reduce(function (properties, calendar) { return __spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray([], properties, true), [ + 'BEGIN:VEVENT' + ], false), calendar.properties, true), calendar.getMeta(), true), [ + 'END:VEVENT' + ], false); }, []); + return __spreadArray(__spreadArray([ + 'BEGIN:VCALENDAR', + 'VERSION:2.0' + ], vEvents, true), [ + "PRODID:".concat(ics.getProdId()), + 'END:VCALENDAR' + ], false).join('\n'); + }; + _this.setInitialParams(); + return _this; + } + return ICalendar; +}(CalendarBase)); + +exports.CalendarBase = CalendarBase; +exports.GoogleCalendar = GoogleCalendar; +exports.ICalendar = ICalendar; +exports.OutlookCalendar = OutlookCalendar; +exports.YahooCalendar = YahooCalendar; +//# sourceMappingURL=datebook.min.cjs.map diff --git a/dist/datebook.min.cjs.map b/dist/datebook.min.cjs.map new file mode 100644 index 0000000..817b378 --- /dev/null +++ b/dist/datebook.min.cjs.map @@ -0,0 +1 @@ +{"version":3,"file":"datebook.min.cjs","sources":["../../src/constants.ts","../../src/utils/time.ts","../../src/CalendarBase.ts","../node_modules/tslib/tslib.es6.js","../../src/utils/data.ts","../../src/utils/ics.ts","../../src/GoogleCalendar.ts","../../src/YahooCalendar.ts","../../src/OutlookCalendar.ts","../../src/ICalendar.ts"],"sourcesContent":["export const RECURRENCE = {\n FREQUENCY: {\n DAILY: 'DAILY',\n WEEKLY: 'WEEKLY',\n MONTHLY: 'MONTHLY',\n YEARLY: 'YEARLY'\n }\n}\n\nexport const FORMAT = {\n DATE: 'YYYYMMDD',\n TIME: 'ThhmmssZ',\n FULL: 'YYYYMMDDThhmmssZ',\n NO_UTC_FULL: 'YYYYMMDDThhmmss',\n OUTLOOK_DATE: 'YYYY-MM-DD',\n OUTLOOK_TIME: 'Thh:mm:ssZ',\n OUTLOOK_FULL: 'YYYY-MM-DDThh:mm:ssZ'\n}\n\nexport const URL = {\n YAHOO: 'https://calendar.yahoo.com/',\n GOOGLE: 'https://calendar.google.com/calendar/render',\n OUTLOOK: 'https://outlook.{{host}}.com/calendar/action/compose'\n}\n","import { RECURRENCE, FORMAT } from '../constants'\nimport CalendarRecurrence from '../types/CalendarRecurrence'\n\n/**\n * Adds a leading zero to a single-digit string and returns a two-digit string.\n *\n * @param {number | string} n\n * @returns {string}\n */\nconst addLeadingZero = (n: number | string = ''): string => {\n return `0${parseInt(n.toString(), 10)}`.slice(-2)\n}\n\n/**\n * Returns the duration between two given dates in hhmm format.\n *\n * @param {number} start\n * @param {number} end\n * @returns {string}\n */\nconst getDuration = (start: number, end: number): string => {\n const seconds = Math.floor((end - start) / 1000)\n const hours = Math.floor(seconds / 3600)\n const mins = ((seconds / 3600) % 1) * 60\n\n return `${addLeadingZero(hours)}${addLeadingZero(mins)}`\n}\n\n/**\n * Returns the number of hours between two given dates.\n *\n * @param {number} start\n * @param {number} end\n * @returns {number}\n */\nconst getHoursDiff = (start: number, end: number): number => {\n const seconds = Math.floor((end - start) / 1000)\n\n return Math.floor(seconds / 3600)\n}\n\n/**\n * Computes the number of days a recurrence will last.\n *\n * @param {CalendarRecurrence} recurrence\n * @returns {number}\n */\nconst getRecurrenceLengthDays = (recurrence: CalendarRecurrence): number => {\n const { frequency, interval } = recurrence\n const { FREQUENCY } = RECURRENCE\n\n if (interval) {\n switch (frequency) {\n case FREQUENCY.YEARLY:\n return interval * 365.25\n case FREQUENCY.MONTHLY:\n return interval * 30.42 // avg days in a year\n case FREQUENCY.WEEKLY:\n return interval * 7\n default:\n return interval // daily\n }\n }\n\n // if no frequency is specified, set an arbitrarily-long recurrence end\n return 365.25 * 100 // 100 years\n}\n\n/**\n * Formats the given JS Date() object to the given format.\n * Format defaults to: YYYYMMDDTHHMMss\n *\n * @param {Date} [d = new Date()]\n * @param {string} format\n * @returns {string}\n */\nconst formatDate = (d: Date = new Date(), format: string): string => {\n const dateValues: Record = {\n YYYY: d.getUTCFullYear(),\n MM: addLeadingZero(d.getUTCMonth() + 1),\n DD: addLeadingZero(d.getUTCDate()),\n hh: addLeadingZero(d.getUTCHours()),\n mm: addLeadingZero(d.getUTCMinutes()),\n ss: addLeadingZero(d.getUTCSeconds())\n }\n\n return Object\n .keys(dateValues)\n .reduce((date: string, key: string): string => {\n return date.replace(key, dateValues[key].toString())\n }, format)\n}\n\n\n/**\n * Formats the given JS Date() object to the given format, not using UTC\n * Format defaults to: YYYYMMDDTHHMMss\n *\n * @param {Date} [d = new Date()]\n * @param {string} format\n * @returns {string}\n */\nconst formatDateNoUtc = (d: Date = new Date(), format: string): string => {\n const dateValues: Record = {\n YYYY: d.getFullYear(),\n MM: addLeadingZero(d.getMonth() + 1),\n DD: addLeadingZero(d.getDate()),\n hh: addLeadingZero(d.getHours()),\n mm: addLeadingZero(d.getMinutes()),\n ss: addLeadingZero(d.getSeconds())\n }\n\n return Object\n .keys(dateValues)\n .reduce((date: string, key: string): string => {\n return date.replace(key, dateValues[key].toString())\n }, format)\n}\n\n/**\n * Returns the current timestamp.\n *\n * @returns {string}\n */\nconst getTimeCreated = (): string => {\n return formatDate(new Date(), FORMAT.FULL)\n}\n\n/**\n * Increments dates by the given number of days.\n * This will account for edge cases, such as leap years.\n *\n * @param {Date} dateInput - date to increment\n * @param {number} days - number of days\n * @returns {Date}\n */\nconst incrementDate = (dateInput: Date, days: number): Date => {\n const additionalTime = days * 86400000\n const newDate = new Date()\n\n newDate.setTime(dateInput.getTime() + additionalTime)\n\n return newDate\n}\n\nexport default {\n addLeadingZero,\n getDuration,\n getHoursDiff,\n getRecurrenceLengthDays,\n formatDate,\n formatDateNoUtc,\n getTimeCreated,\n incrementDate\n}\n","import ICalendarBase from './types/ICalendarBase'\nimport CalendarRecurrence from './types/CalendarRecurrence'\nimport CalendarOptions from './types/CalendarOptions'\nimport time from './utils/time'\nimport CalendarAttendee from './types/CalendarAttendee'\n\n/**\n * Base calendar class. This class can be extended to add new calendar services.\n */\nabstract class CalendarBase implements ICalendarBase {\n /** True if the event is one that spans the entire day. */\n protected isAllDay = false\n\n /** Event description. */\n protected description = ''\n\n /** Event title. */\n protected title = ''\n\n /** Event physical location. */\n protected location = ''\n\n /** Start time of the event. */\n protected start = new Date()\n\n /** End time of the event. */\n protected end = new Date()\n\n /** Event recurrence specification. See {@link CalendarRecurrence} */\n protected recurrence?: CalendarRecurrence\n\n /** Calendar service query string params. */\n protected params: Record = {}\n\n /** Array of event attendees. See {@link CalendarAttendee} */\n protected attendees: CalendarAttendee[] = []\n\n /**\n * Constructor.\n *\n * @param {CalendarOptions} options\n */\n constructor (options: CalendarOptions) {\n this.setText(options)\n this.setTimestamps(options)\n this.setAttendees(options)\n }\n\n /**\n * Sets the description, title and location.\n *\n * @param {CalendarOptions} options\n */\n protected setText = (options: CalendarOptions): void => {\n this.description = options.description || ''\n this.title = options.title || ''\n this.location = options.location || ''\n }\n\n /**\n * Sets the time and recurrence parameters.\n *\n * @param {CalendarOptions} options\n */\n protected setTimestamps = (options: CalendarOptions): void => {\n this.isAllDay = !options.end\n this.start = options.start\n\n // if no end date is specified, make the end date exactly 1 day from the start date\n this.end = options.end || time.incrementDate(this.start, 1)\n\n this.recurrence = options.recurrence\n }\n\n /**\n * Sets the attendees array if attendees are supplied.\n *\n * @param {CalendarOptions} options\n */\n protected setAttendees (options: CalendarOptions): void {\n this.attendees = Array.isArray(options.attendees) ? options.attendees : []\n }\n\n /**\n * Sets additional calendar service properties.\n * May be used to override existing query string params if necessary.\n *\n * @param {string} key\n * @param {string | null} value\n * @returns {CalendarBase}\n */\n public setParam = (key: string, value: string | null): this => {\n this.params[key] = value\n\n return this\n }\n\n /** Sets base query string/ICS params. */\n protected abstract setInitialParams (): void\n\n /** Renders the URL/ICS file data. */\n public abstract render (): string\n}\n\nexport default CalendarBase\n","/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n","import CalendarAttendee from '../types/CalendarAttendee'\n\n/**\n * Creates a param string from a flat key-value pair.\n *\n * @param {Record} params\n * @param {string} [delimiter = ';']\n * @param {Function} [transformFn] - transformation function to be applied to each param\n * @returns {string}\n */\nconst toParamString = (\n params: Record,\n delimiter = ';',\n transformFn: (s: string) => string = s => s\n): string => {\n const paramString = []\n\n for (const key in params) {\n if (params.hasOwnProperty(key) && params[key] !== undefined) {\n paramString.push(`${key}=${transformFn(params[key])}`)\n }\n }\n\n return paramString.join(delimiter)\n}\n\n/**\n * Creates a query string from a flat key-value pair.\n *\n * @param {Record} params\n * @returns {string}\n */\nconst toQueryString = (params: Record): string => {\n // filter the record set to remove null values\n const filteredParams = Object\n .keys(params)\n .filter(p => params[p] !== null)\n .reduce((p: Record, k: string) => ({\n ...p,\n [k]: params[k] as string\n }), {})\n\n return toParamString(filteredParams, '&', encodeURIComponent)\n}\n\n/**\n * Creates an ICS param string from a flat key-value pair.\n *\n * @param {Record} params\n * @returns {string}\n */\nconst toIcsParamString = (params: Record): string => {\n return toParamString(params, ';')\n}\n\n/**\n * Renders a comma-separated string of mailto values.\n * (e.g., 'John Doe ,Jane Doe ')\n *\n * @param {CalendarAttendee[]} attendees\n * @returns {string[]}\n */\nconst toMailtoList = (attendees: CalendarAttendee[]): string[] => {\n return attendees\n .map(({ email, name }) => {\n return name\n ? `${name} <${email}>`\n : email\n })\n}\n\n/**\n * Converts the given string to ProperCase.\n *\n * @param {string} s\n * @returns {string}\n */\nconst toProperCase = (s: string): string => {\n return [\n s[0].toUpperCase(),\n s.slice(-s.length + 1).toLowerCase()\n ].join('')\n}\n\nexport default {\n toParamString,\n toQueryString,\n toIcsParamString,\n toMailtoList,\n toProperCase\n}\n","import data from './data'\nimport time from './time'\nimport CalendarRecurrence from '../types/CalendarRecurrence'\nimport { FORMAT } from '../constants'\n\n/**\n * Removes line breaks from a string. Returns an empty string if falsy.\n *\n * @param {string} [str = ''] - string to sanitize\n * @returns {string}\n */\nconst formatText = (str = ''): string => {\n return str\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/\\n/g, '\\\\n')\n .replace(/[,;]/g, '\\\\$&')\n}\n\n/**\n * Returns a random base 36 hash for iCal UID.\n *\n * @returns {string}\n */\nconst getUid = (): string => {\n return Math.random().toString(36).substr(2)\n}\n\n/**\n * Returns the hostname for usage in `PRODID`. Returns `datebook` in Node.js.\n *\n * @returns {string}\n */\nconst getProdId = (): string => {\n return typeof window !== 'undefined'\n ? window.location.host\n : 'datebook'\n}\n\n/**\n * Converts the given recurrence options to RFC????\n *\n * @param {CalendarRecurrence} recurrence\n * @returns {string}\n */\nconst getRrule = (recurrence: CalendarRecurrence): string => {\n const rrule: Record = {\n FREQ: recurrence.frequency,\n INTERVAL: recurrence.interval?.toString(),\n COUNT: recurrence.count?.toString(),\n WKST: recurrence.weekstart,\n BYDAY: recurrence.weekdays,\n BYMONTHDAY: recurrence.monthdays\n }\n\n if (recurrence.end) {\n rrule.UNTIL = time.formatDate(recurrence.end, FORMAT.FULL)\n }\n\n return data.toIcsParamString(rrule)\n}\n\nexport default {\n formatText,\n getUid,\n getProdId,\n getRrule\n}\n","import CalendarBase from './CalendarBase'\nimport data from './utils/data'\nimport ics from './utils/ics'\nimport time from './utils/time'\nimport { FORMAT, URL } from './constants'\nimport CalendarOptions from './types/CalendarOptions'\n\n/**\n * Generates a Google Calendar url.\n */\nexport default class GoogleCalendar extends CalendarBase {\n constructor (opts: CalendarOptions) {\n super(opts)\n this.setInitialParams()\n }\n\n /**\n * Sets the basic properties for the calendar instance.\n */\n protected setInitialParams = (): void => {\n let timestampFormat = FORMAT.DATE\n\n if (!this.isAllDay) {\n timestampFormat += FORMAT.TIME\n }\n\n const dates = [\n time.formatDate(this.start, timestampFormat),\n time.formatDate(this.end, timestampFormat)\n ].join('/')\n\n this\n .setParam('action', 'TEMPLATE')\n .setParam('dates', dates)\n .setParam('text', this.title)\n .setParam('details', this.description)\n .setParam('location', this.location)\n .setParam('allday', this.isAllDay.toString())\n\n if (this.recurrence) {\n this.setParam('recur', `RRULE:${ics.getRrule(this.recurrence)}`)\n }\n\n if (this.attendees.length > 0) {\n this.setParam('add', data.toMailtoList(this.attendees).join(','))\n }\n }\n\n /**\n * Generates the Google Calendar url.\n *\n * @returns {string}\n */\n public render = (): string => {\n const baseUrl = URL.GOOGLE\n const queryString = data.toQueryString(this.params)\n\n return `${baseUrl}?${queryString}`\n }\n}\n","import CalendarBase from './CalendarBase'\nimport { URL, FORMAT } from './constants'\nimport data from './utils/data'\nimport time from './utils/time'\nimport CalendarOptions from './types/CalendarOptions'\n\n/**\n * Generates a Yahoo! Calendar url.\n *\n * @remark Yahoo! Calendar's support for recurrence is limited to only the interval and frequency.\n */\nexport default class YahooCalendar extends CalendarBase {\n constructor (opts: CalendarOptions) {\n super(opts)\n this.setInitialParams()\n }\n\n /**\n * Sets the basic properties for the calendar instance.\n */\n protected setInitialParams = (): void => {\n this\n .setParam('v', '60') // version number; must be 60\n .setParam('title', this.title)\n .setParam('desc', this.description)\n .setParam('in_loc', this.location)\n\n this.setTimeParams()\n\n if (this.attendees.length > 0) {\n this.setParam('inv_list', data.toMailtoList(this.attendees).join(','))\n }\n }\n\n /**\n * Sets the start/end/allday parameters.\n */\n private setTimeParams = (): void => {\n if (this.isAllDay) {\n this\n .setParam('dur', 'allday')\n .setParam('st', time.formatDateNoUtc(this.start, FORMAT.DATE))\n } else {\n this.setParam('st', time.formatDateNoUtc(this.start, FORMAT.NO_UTC_FULL))\n\n if (time.getHoursDiff(this.start.getTime(), this.end.getTime()) > 99) {\n // Yahoo only supports up to 99 hours, so we are forced to specify the end time instead of the duration\n this.setParam('et', time.formatDateNoUtc(this.end, FORMAT.NO_UTC_FULL))\n } else {\n // we prefer specifying duration in lieu of end time, because apparently Yahoo's end time is buggy w.r.t. timezones\n this.setParam('dur', time.getDuration(this.start.getTime(), this.end.getTime()))\n }\n }\n }\n\n /**\n * Generates the Yahoo! Calendar data.\n *\n * @returns {string}\n */\n public render = (): string => {\n const baseUrl = URL.YAHOO\n const queryString = data.toQueryString(this.params)\n\n return `${baseUrl}?${queryString}`\n }\n}\n","import CalendarBase from './CalendarBase'\nimport { FORMAT, URL } from './constants'\nimport data from './utils/data'\nimport time from './utils/time'\nimport CalendarOptions from './types/CalendarOptions'\n\n/**\n * Generates an Outlook Calendar url.\n *\n * @remark Outlook Calendar's query string params do not support recurrence.\n */\nexport default class OutlookCalendar extends CalendarBase {\n /** Base URL for the host service. */\n private baseUrl: string = URL.OUTLOOK\n\n constructor (opts: CalendarOptions) {\n super(opts)\n this.setInitialParams()\n this.setHost('live')\n }\n\n /**\n * Sets the basic properties for the calendar instance.\n */\n protected setInitialParams = (): void => {\n let timestampFormat = FORMAT.OUTLOOK_DATE\n\n if (!this.isAllDay) {\n timestampFormat += FORMAT.OUTLOOK_TIME\n }\n\n this\n .setParam('rru', 'addevent')\n .setParam('path', '/calendar/action/compose')\n .setParam('startdt', time.formatDate(this.start, timestampFormat))\n .setParam('enddt', time.formatDate(this.end, timestampFormat))\n .setParam('subject', this.title)\n .setParam('body', this.description)\n .setParam('location', this.location)\n .setParam('allday', this.isAllDay.toString())\n\n if (this.attendees.length > 0) {\n this.setParam('to', data.toMailtoList(this.attendees).join(','))\n }\n }\n\n /**\n * Sets the host service type. The default host for Outlook is **`live`**.\n *\n * @param {string} host - `live` (for personal accounts) or `office` (for Office365)\n * @returns {OutlookCalendar}\n */\n public setHost = (host: string): this => {\n if (['live', 'office'].includes(host)) {\n this.baseUrl = URL.OUTLOOK.replace('{{host}}', host)\n }\n\n return this\n }\n\n /**\n * Generates the Outlook url.\n *\n * @returns {string}\n */\n public render = (): string => {\n const queryString = data.toQueryString(this.params)\n\n return `${this.baseUrl}?${queryString}`\n }\n}\n","import CalendarBase from './CalendarBase'\nimport { FORMAT } from './constants'\nimport data from './utils/data'\nimport ics from './utils/ics'\nimport time from './utils/time'\nimport CalendarOptions from './types/CalendarOptions'\nimport ICSAlarm from './types/ICSAlarm'\nimport ICSAttendeeOptions from './types/ICSAttendeeOptions'\nimport ICSDuration from './types/ICSDuration'\nimport ICSPropertyValue from './types/ICSPropertyValue'\n\n/**\n * Renders ICS file content.\n */\nexport default class ICalendar extends CalendarBase {\n /** List of additional ICalendar events to add. */\n private additionalEvents: ICalendar[] = []\n\n /** List of VEVENT property-value entries */\n public properties: string[] = []\n\n /** Key-value pair of basic calendar properties. */\n private meta: Record = {}\n\n constructor (opts: CalendarOptions) {\n super(opts)\n this.setInitialParams()\n }\n\n /**\n * Sets the basic properties for the calendar instance.\n */\n protected setInitialParams = (): void => {\n this\n .setMeta('UID', ics.getUid())\n .setMeta('DTSTAMP', time.getTimeCreated())\n .addProperty('CLASS', 'PUBLIC')\n .addProperty('DESCRIPTION', ics.formatText(this.description))\n .addProperty('LOCATION', ics.formatText(this.location))\n .addProperty('SUMMARY', ics.formatText(this.title))\n .addProperty('TRANSP', 'TRANSPARENT')\n\n if (this.isAllDay) {\n // for all-day events, omit the time and just place dates\n this\n .addProperty('DTSTART;VALUE=DATE', time.formatDateNoUtc(this.start, FORMAT.DATE))\n .addProperty('DTEND;VALUE=DATE', time.formatDateNoUtc(time.incrementDate(this.start, 1), FORMAT.DATE))\n } else {\n // otherwise, set the full start and end dates\n this\n .addProperty('DTSTART', time.formatDate(this.start, FORMAT.FULL))\n .addProperty('DTEND', time.formatDate(this.end, FORMAT.FULL))\n }\n\n if (this.recurrence) {\n this.addProperty('RRULE', ics.getRrule(this.recurrence))\n }\n\n if (this.attendees.length > 0) {\n this\n .attendees\n .forEach(({ email, name, icsOptions = {} }) => {\n const params = this.getAttendeeParams(icsOptions, name)\n const mailto = `MAILTO:${email}`\n\n this.addProperty(params, mailto)\n })\n }\n }\n\n /**\n * Generates the ATTENDEE property param based on user-specified options and the attendee name.\n *\n * @param {ICSAttendeeOptions} options\n * @param {string} name\n * @returns {string}\n */\n private getAttendeeParams = (options: ICSAttendeeOptions, name?: string): string => {\n const params: Record = {}\n\n if (name) params['CN'] = name\n if (options.delegatedFrom) params['DELEGATED-FROM'] = options.delegatedFrom\n if (options.partStat) params['PARTSTAT'] = options.partStat\n if (options.role) params['ROLE'] = options.role\n if (options.sentBy) params['SENT-BY'] = options.sentBy\n\n params['RSVP'] = options.rsvp ? 'TRUE' : 'FALSE'\n\n const paramString = data.toParamString(params, ';')\n\n return `ATTENDEE;${paramString}`\n }\n\n /**\n * Generates a valid ICS alarm duration.\n *\n * @example getAlarmDuration({ minutes: 3, seconds: 2 }) -> PT3M2S\n * @param {ICSDuration} duration\n * @returns {string}\n */\n private getAlarmDuration = (duration: ICSDuration): string => {\n const features = [\n `${duration.weeks}W`,\n `${duration.days}D`,\n `${duration.hours}H`,\n `${duration.minutes}M`,\n `${duration.seconds}S`\n ].filter((s: string) => /^[0-9]+[A-Z]$/.exec(s)) // exclude zero-duration features\n\n features.unshift(duration.after ? 'PT' : '-PT')\n\n return features.join('')\n }\n\n /**\n * Returns the iCalendar meta properties, formatted as VEVENT entry lines.\n *\n * @returns {string[]}\n */\n public getMeta = (): string[] => {\n return Object\n .keys(this.meta)\n .map((key: string) => {\n return `${key}:${this.meta[key]}`\n })\n }\n\n /**\n * Sets iCalendar meta properties, such as UID, DTSTAMP, etc.\n *\n * @param {string} key\n * @param {string} value\n * @returns {ICalendar}\n */\n public setMeta = (key: string, value: string): this => {\n this.meta[key] = value\n\n return this\n }\n\n /**\n * Adds the given event to the same `.ics` file instance.\n *\n * @param {ICalendar} event\n * @returns {ICalendar}\n */\n public addEvent = (event: ICalendar): this => {\n this.additionalEvents.push(event)\n\n return this\n }\n\n /**\n * Adds any additional desired iCalendar property having the given key-value pair to the instance.\n *\n * @param {Alarm} alarm\n * @returns {ICalendar}\n */\n public addProperty = (key: string, value: ICSPropertyValue): this => {\n if (typeof value === 'object') {\n this.properties.push(`BEGIN:${key}`)\n\n for (const k in value) {\n this.addProperty(k, value[k])\n }\n\n this.properties.push(`END:${key}`)\n } else {\n this.properties.push(`${key}:${value.toString()}`)\n }\n\n return this\n }\n\n /**\n * Adds an alarm. Multiple different alarms may be added to a single instance.\n *\n * @param {Alarm} alarm\n * @returns {ICalendar}\n */\n public addAlarm = (alarm: ICSAlarm): this => {\n const value: ICSPropertyValue = {\n ACTION: alarm.action\n }\n\n if (alarm.description) value.DESCRIPTION = ics.formatText(alarm.description)\n if (alarm.summary) value.SUMMARY = ics.formatText(alarm.summary)\n if (alarm.duration) value.DURATION = this.getAlarmDuration(alarm.duration)\n if (alarm.repeat) value.REPEAT = alarm.repeat\n if (alarm.attach) {\n const key = alarm.attach.params\n ? `ATTACH;${alarm.attach.params}`\n : 'ATTACH'\n\n value[key] = alarm.attach.url\n }\n if (alarm.trigger instanceof Date) {\n value['TRIGGER;VALUE=DATE-TIME'] = time.formatDate(alarm.trigger, FORMAT.FULL)\n } else {\n value['TRIGGER'] = this.getAlarmDuration(alarm.trigger)\n }\n\n return this.addProperty('VALARM', value)\n }\n\n /**\n * Generates the iCalendar data.\n *\n * @returns {string}\n */\n public render = (): string => {\n const events = [\n this,\n ...this.additionalEvents\n ]\n\n const vEvents = events.reduce((properties: string[], calendar: ICalendar) => [\n ...properties,\n 'BEGIN:VEVENT',\n ...calendar.properties,\n ...calendar.getMeta(),\n 'END:VEVENT'\n ], [])\n\n return [\n 'BEGIN:VCALENDAR',\n 'VERSION:2.0',\n ...vEvents,\n `PRODID:${ics.getProdId()}`,\n 'END:VCALENDAR'\n ].join('\\n')\n }\n}\n"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/datebook.min.js b/dist/datebook.min.js new file mode 100644 index 0000000..b66c5a8 --- /dev/null +++ b/dist/datebook.min.js @@ -0,0 +1,2 @@ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).datebook={})}(this,(function(t){"use strict";var e="YYYYMMDD",n="ThhmmssZ",r="YYYYMMDDThhmmssZ",a="YYYYMMDDThhmmss",o="YYYY-MM-DD",i="Thh:mm:ssZ",s={YAHOO:"https://calendar.yahoo.com/",GOOGLE:"https://calendar.google.com/calendar/render",OUTLOOK:"https://outlook.{{host}}.com/calendar/action/compose"},c=function(t){return void 0===t&&(t=""),"0".concat(parseInt(t.toString(),10)).slice(-2)},u=function(t,e){void 0===t&&(t=new Date);var n={YYYY:t.getUTCFullYear(),MM:c(t.getUTCMonth()+1),DD:c(t.getUTCDate()),hh:c(t.getUTCHours()),mm:c(t.getUTCMinutes()),ss:c(t.getUTCSeconds())};return Object.keys(n).reduce((function(t,e){return t.replace(e,n[e].toString())}),e)},d=function(t,e){var n=Math.floor((e-t)/1e3),r=Math.floor(n/3600),a=n/3600%1*60;return"".concat(c(r)).concat(c(a))},l=function(t,e){var n=Math.floor((e-t)/1e3);return Math.floor(n/3600)},f=u,p=function(t,e){void 0===t&&(t=new Date);var n={YYYY:t.getFullYear(),MM:c(t.getMonth()+1),DD:c(t.getDate()),hh:c(t.getHours()),mm:c(t.getMinutes()),ss:c(t.getSeconds())};return Object.keys(n).reduce((function(t,e){return t.replace(e,n[e].toString())}),e)},m=function(){return u(new Date,r)},h=function(t,e){var n=864e5*e,r=new Date;return r.setTime(t.getTime()+n),r},T=function(){function t(t){var e=this;this.isAllDay=!1,this.description="",this.title="",this.location="",this.start=new Date,this.end=new Date,this.params={},this.attendees=[],this.setText=function(t){e.description=t.description||"",e.title=t.title||"",e.location=t.location||""},this.setTimestamps=function(t){e.isAllDay=!t.end,e.start=t.start,e.end=t.end||h(e.start,1),e.recurrence=t.recurrence},this.setParam=function(t,n){return e.params[t]=n,e},this.setText(t),this.setTimestamps(t),this.setAttendees(t)}return t.prototype.setAttendees=function(t){this.attendees=Array.isArray(t.attendees)?t.attendees:[]},t}(),P=function(t,e){return P=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n])},P(t,e)};function y(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function n(){this.constructor=t}P(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)}var A=function(){return A=Object.assign||function(t){for(var e,n=1,r=arguments.length;n"):e}))},Y=function(t){return void 0===t&&(t=""),t.replace(/\\/g,"\\\\").replace(/\n/g,"\\n").replace(/[,;]/g,"\\$&")},R=function(){return Math.random().toString(36).substr(2)},S=function(){return"undefined"!=typeof window?window.location.host:"datebook"},I=function(t){var e,n,a={FREQ:t.frequency,INTERVAL:null===(e=t.interval)||void 0===e?void 0:e.toString(),COUNT:null===(n=t.count)||void 0===n?void 0:n.toString(),WKST:t.weekstart,BYDAY:t.weekdays,BYMONTHDAY:t.monthdays};return t.end&&(a.UNTIL=f(t.end,r)),O(a)},N=function(t){function r(r){var a=t.call(this,r)||this;return a.setInitialParams=function(){var t=e;a.isAllDay||(t+=n);var r=[f(a.start,t),f(a.end,t)].join("/");a.setParam("action","TEMPLATE").setParam("dates",r).setParam("text",a.title).setParam("details",a.description).setParam("location",a.location).setParam("allday",a.isAllDay.toString()),a.recurrence&&a.setParam("recur","RRULE:".concat(I(a.recurrence))),a.attendees.length>0&&a.setParam("add",M(a.attendees).join(","))},a.render=function(){var t=s.GOOGLE,e=E(a.params);return"".concat(t,"?").concat(e)},a.setInitialParams(),a}return y(r,t),r}(T),U=function(t){function n(n){var r=t.call(this,n)||this;return r.setInitialParams=function(){r.setParam("v","60").setParam("title",r.title).setParam("desc",r.description).setParam("in_loc",r.location),r.setTimeParams(),r.attendees.length>0&&r.setParam("inv_list",M(r.attendees).join(","))},r.setTimeParams=function(){r.isAllDay?r.setParam("dur","allday").setParam("st",p(r.start,e)):(r.setParam("st",p(r.start,a)),l(r.start.getTime(),r.end.getTime())>99?r.setParam("et",p(r.end,a)):r.setParam("dur",d(r.start.getTime(),r.end.getTime())))},r.render=function(){var t=s.YAHOO,e=E(r.params);return"".concat(t,"?").concat(e)},r.setInitialParams(),r}return y(n,t),n}(T),C=function(t){function e(e){var n=t.call(this,e)||this;return n.baseUrl=s.OUTLOOK,n.setInitialParams=function(){var t=o;n.isAllDay||(t+=i),n.setParam("rru","addevent").setParam("path","/calendar/action/compose").setParam("startdt",f(n.start,t)).setParam("enddt",f(n.end,t)).setParam("subject",n.title).setParam("body",n.description).setParam("location",n.location).setParam("allday",n.isAllDay.toString()),n.attendees.length>0&&n.setParam("to",M(n.attendees).join(","))},n.setHost=function(t){return["live","office"].includes(t)&&(n.baseUrl=s.OUTLOOK.replace("{{host}}",t)),n},n.render=function(){var t=E(n.params);return"".concat(n.baseUrl,"?").concat(t)},n.setInitialParams(),n.setHost("live"),n}return y(e,t),e}(T),L=function(t){function n(n){var a=t.call(this,n)||this;return a.additionalEvents=[],a.properties=[],a.meta={},a.setInitialParams=function(){a.setMeta("UID",R()).setMeta("DTSTAMP",m()).addProperty("CLASS","PUBLIC").addProperty("DESCRIPTION",Y(a.description)).addProperty("LOCATION",Y(a.location)).addProperty("SUMMARY",Y(a.title)).addProperty("TRANSP","TRANSPARENT"),a.isAllDay?a.addProperty("DTSTART;VALUE=DATE",p(a.start,e)).addProperty("DTEND;VALUE=DATE",p(h(a.start,1),e)):a.addProperty("DTSTART",f(a.start,r)).addProperty("DTEND",f(a.end,r)),a.recurrence&&a.addProperty("RRULE",I(a.recurrence)),a.attendees.length>0&&a.attendees.forEach((function(t){var e=t.email,n=t.name,r=t.icsOptions,o=void 0===r?{}:r,i=a.getAttendeeParams(o,n),s="MAILTO:".concat(e);a.addProperty(i,s)}))},a.getAttendeeParams=function(t,e){var n={};e&&(n.CN=e),t.delegatedFrom&&(n["DELEGATED-FROM"]=t.delegatedFrom),t.partStat&&(n.PARTSTAT=t.partStat),t.role&&(n.ROLE=t.role),t.sentBy&&(n["SENT-BY"]=t.sentBy),n.RSVP=t.rsvp?"TRUE":"FALSE";var r=g(n,";");return"ATTENDEE;".concat(r)},a.getAlarmDuration=function(t){var e=["".concat(t.weeks,"W"),"".concat(t.days,"D"),"".concat(t.hours,"H"),"".concat(t.minutes,"M"),"".concat(t.seconds,"S")].filter((function(t){return/^[0-9]+[A-Z]$/.exec(t)}));return e.unshift(t.after?"PT":"-PT"),e.join("")},a.getMeta=function(){return Object.keys(a.meta).map((function(t){return"".concat(t,":").concat(a.meta[t])}))},a.setMeta=function(t,e){return a.meta[t]=e,a},a.addEvent=function(t){return a.additionalEvents.push(t),a},a.addProperty=function(t,e){if("object"==typeof e){for(var n in a.properties.push("BEGIN:".concat(t)),e)a.addProperty(n,e[n]);a.properties.push("END:".concat(t))}else a.properties.push("".concat(t,":").concat(e.toString()));return a},a.addAlarm=function(t){var e={ACTION:t.action};(t.description&&(e.DESCRIPTION=Y(t.description)),t.summary&&(e.SUMMARY=Y(t.summary)),t.duration&&(e.DURATION=a.getAlarmDuration(t.duration)),t.repeat&&(e.REPEAT=t.repeat),t.attach)&&(e[t.attach.params?"ATTACH;".concat(t.attach.params):"ATTACH"]=t.attach.url);return t.trigger instanceof Date?e["TRIGGER;VALUE=DATE-TIME"]=f(t.trigger,r):e.TRIGGER=a.getAlarmDuration(t.trigger),a.addProperty("VALARM",e)},a.render=function(){var t=v([a],a.additionalEvents,!0).reduce((function(t,e){return v(v(v(v(v([],t,!0),["BEGIN:VEVENT"],!1),e.properties,!0),e.getMeta(),!0),["END:VEVENT"],!1)}),[]);return v(v(["BEGIN:VCALENDAR","VERSION:2.0"],t,!0),["PRODID:".concat(S()),"END:VCALENDAR"],!1).join("\n")},a.setInitialParams(),a}return y(n,t),n}(T);t.CalendarBase=T,t.GoogleCalendar=N,t.ICalendar=L,t.OutlookCalendar=C,t.YahooCalendar=U})); +//# sourceMappingURL=datebook.min.js.map diff --git a/dist/datebook.min.js.map b/dist/datebook.min.js.map new file mode 100644 index 0000000..7adc1fa --- /dev/null +++ b/dist/datebook.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"datebook.min.js","sources":["../../src/constants.ts","../../src/utils/time.ts","../../src/CalendarBase.ts","../node_modules/tslib/tslib.es6.js","../../src/utils/data.ts","../../src/utils/ics.ts","../../src/GoogleCalendar.ts","../../src/YahooCalendar.ts","../../src/OutlookCalendar.ts","../../src/ICalendar.ts"],"sourcesContent":["export const RECURRENCE = {\n FREQUENCY: {\n DAILY: 'DAILY',\n WEEKLY: 'WEEKLY',\n MONTHLY: 'MONTHLY',\n YEARLY: 'YEARLY'\n }\n}\n\nexport const FORMAT = {\n DATE: 'YYYYMMDD',\n TIME: 'ThhmmssZ',\n FULL: 'YYYYMMDDThhmmssZ',\n NO_UTC_FULL: 'YYYYMMDDThhmmss',\n OUTLOOK_DATE: 'YYYY-MM-DD',\n OUTLOOK_TIME: 'Thh:mm:ssZ',\n OUTLOOK_FULL: 'YYYY-MM-DDThh:mm:ssZ'\n}\n\nexport const URL = {\n YAHOO: 'https://calendar.yahoo.com/',\n GOOGLE: 'https://calendar.google.com/calendar/render',\n OUTLOOK: 'https://outlook.{{host}}.com/calendar/action/compose'\n}\n","import { RECURRENCE, FORMAT } from '../constants'\nimport CalendarRecurrence from '../types/CalendarRecurrence'\n\n/**\n * Adds a leading zero to a single-digit string and returns a two-digit string.\n *\n * @param {number | string} n\n * @returns {string}\n */\nconst addLeadingZero = (n: number | string = ''): string => {\n return `0${parseInt(n.toString(), 10)}`.slice(-2)\n}\n\n/**\n * Returns the duration between two given dates in hhmm format.\n *\n * @param {number} start\n * @param {number} end\n * @returns {string}\n */\nconst getDuration = (start: number, end: number): string => {\n const seconds = Math.floor((end - start) / 1000)\n const hours = Math.floor(seconds / 3600)\n const mins = ((seconds / 3600) % 1) * 60\n\n return `${addLeadingZero(hours)}${addLeadingZero(mins)}`\n}\n\n/**\n * Returns the number of hours between two given dates.\n *\n * @param {number} start\n * @param {number} end\n * @returns {number}\n */\nconst getHoursDiff = (start: number, end: number): number => {\n const seconds = Math.floor((end - start) / 1000)\n\n return Math.floor(seconds / 3600)\n}\n\n/**\n * Computes the number of days a recurrence will last.\n *\n * @param {CalendarRecurrence} recurrence\n * @returns {number}\n */\nconst getRecurrenceLengthDays = (recurrence: CalendarRecurrence): number => {\n const { frequency, interval } = recurrence\n const { FREQUENCY } = RECURRENCE\n\n if (interval) {\n switch (frequency) {\n case FREQUENCY.YEARLY:\n return interval * 365.25\n case FREQUENCY.MONTHLY:\n return interval * 30.42 // avg days in a year\n case FREQUENCY.WEEKLY:\n return interval * 7\n default:\n return interval // daily\n }\n }\n\n // if no frequency is specified, set an arbitrarily-long recurrence end\n return 365.25 * 100 // 100 years\n}\n\n/**\n * Formats the given JS Date() object to the given format.\n * Format defaults to: YYYYMMDDTHHMMss\n *\n * @param {Date} [d = new Date()]\n * @param {string} format\n * @returns {string}\n */\nconst formatDate = (d: Date = new Date(), format: string): string => {\n const dateValues: Record = {\n YYYY: d.getUTCFullYear(),\n MM: addLeadingZero(d.getUTCMonth() + 1),\n DD: addLeadingZero(d.getUTCDate()),\n hh: addLeadingZero(d.getUTCHours()),\n mm: addLeadingZero(d.getUTCMinutes()),\n ss: addLeadingZero(d.getUTCSeconds())\n }\n\n return Object\n .keys(dateValues)\n .reduce((date: string, key: string): string => {\n return date.replace(key, dateValues[key].toString())\n }, format)\n}\n\n\n/**\n * Formats the given JS Date() object to the given format, not using UTC\n * Format defaults to: YYYYMMDDTHHMMss\n *\n * @param {Date} [d = new Date()]\n * @param {string} format\n * @returns {string}\n */\nconst formatDateNoUtc = (d: Date = new Date(), format: string): string => {\n const dateValues: Record = {\n YYYY: d.getFullYear(),\n MM: addLeadingZero(d.getMonth() + 1),\n DD: addLeadingZero(d.getDate()),\n hh: addLeadingZero(d.getHours()),\n mm: addLeadingZero(d.getMinutes()),\n ss: addLeadingZero(d.getSeconds())\n }\n\n return Object\n .keys(dateValues)\n .reduce((date: string, key: string): string => {\n return date.replace(key, dateValues[key].toString())\n }, format)\n}\n\n/**\n * Returns the current timestamp.\n *\n * @returns {string}\n */\nconst getTimeCreated = (): string => {\n return formatDate(new Date(), FORMAT.FULL)\n}\n\n/**\n * Increments dates by the given number of days.\n * This will account for edge cases, such as leap years.\n *\n * @param {Date} dateInput - date to increment\n * @param {number} days - number of days\n * @returns {Date}\n */\nconst incrementDate = (dateInput: Date, days: number): Date => {\n const additionalTime = days * 86400000\n const newDate = new Date()\n\n newDate.setTime(dateInput.getTime() + additionalTime)\n\n return newDate\n}\n\nexport default {\n addLeadingZero,\n getDuration,\n getHoursDiff,\n getRecurrenceLengthDays,\n formatDate,\n formatDateNoUtc,\n getTimeCreated,\n incrementDate\n}\n","import ICalendarBase from './types/ICalendarBase'\nimport CalendarRecurrence from './types/CalendarRecurrence'\nimport CalendarOptions from './types/CalendarOptions'\nimport time from './utils/time'\nimport CalendarAttendee from './types/CalendarAttendee'\n\n/**\n * Base calendar class. This class can be extended to add new calendar services.\n */\nabstract class CalendarBase implements ICalendarBase {\n /** True if the event is one that spans the entire day. */\n protected isAllDay = false\n\n /** Event description. */\n protected description = ''\n\n /** Event title. */\n protected title = ''\n\n /** Event physical location. */\n protected location = ''\n\n /** Start time of the event. */\n protected start = new Date()\n\n /** End time of the event. */\n protected end = new Date()\n\n /** Event recurrence specification. See {@link CalendarRecurrence} */\n protected recurrence?: CalendarRecurrence\n\n /** Calendar service query string params. */\n protected params: Record = {}\n\n /** Array of event attendees. See {@link CalendarAttendee} */\n protected attendees: CalendarAttendee[] = []\n\n /**\n * Constructor.\n *\n * @param {CalendarOptions} options\n */\n constructor (options: CalendarOptions) {\n this.setText(options)\n this.setTimestamps(options)\n this.setAttendees(options)\n }\n\n /**\n * Sets the description, title and location.\n *\n * @param {CalendarOptions} options\n */\n protected setText = (options: CalendarOptions): void => {\n this.description = options.description || ''\n this.title = options.title || ''\n this.location = options.location || ''\n }\n\n /**\n * Sets the time and recurrence parameters.\n *\n * @param {CalendarOptions} options\n */\n protected setTimestamps = (options: CalendarOptions): void => {\n this.isAllDay = !options.end\n this.start = options.start\n\n // if no end date is specified, make the end date exactly 1 day from the start date\n this.end = options.end || time.incrementDate(this.start, 1)\n\n this.recurrence = options.recurrence\n }\n\n /**\n * Sets the attendees array if attendees are supplied.\n *\n * @param {CalendarOptions} options\n */\n protected setAttendees (options: CalendarOptions): void {\n this.attendees = Array.isArray(options.attendees) ? options.attendees : []\n }\n\n /**\n * Sets additional calendar service properties.\n * May be used to override existing query string params if necessary.\n *\n * @param {string} key\n * @param {string | null} value\n * @returns {CalendarBase}\n */\n public setParam = (key: string, value: string | null): this => {\n this.params[key] = value\n\n return this\n }\n\n /** Sets base query string/ICS params. */\n protected abstract setInitialParams (): void\n\n /** Renders the URL/ICS file data. */\n public abstract render (): string\n}\n\nexport default CalendarBase\n","/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n","import CalendarAttendee from '../types/CalendarAttendee'\n\n/**\n * Creates a param string from a flat key-value pair.\n *\n * @param {Record} params\n * @param {string} [delimiter = ';']\n * @param {Function} [transformFn] - transformation function to be applied to each param\n * @returns {string}\n */\nconst toParamString = (\n params: Record,\n delimiter = ';',\n transformFn: (s: string) => string = s => s\n): string => {\n const paramString = []\n\n for (const key in params) {\n if (params.hasOwnProperty(key) && params[key] !== undefined) {\n paramString.push(`${key}=${transformFn(params[key])}`)\n }\n }\n\n return paramString.join(delimiter)\n}\n\n/**\n * Creates a query string from a flat key-value pair.\n *\n * @param {Record} params\n * @returns {string}\n */\nconst toQueryString = (params: Record): string => {\n // filter the record set to remove null values\n const filteredParams = Object\n .keys(params)\n .filter(p => params[p] !== null)\n .reduce((p: Record, k: string) => ({\n ...p,\n [k]: params[k] as string\n }), {})\n\n return toParamString(filteredParams, '&', encodeURIComponent)\n}\n\n/**\n * Creates an ICS param string from a flat key-value pair.\n *\n * @param {Record} params\n * @returns {string}\n */\nconst toIcsParamString = (params: Record): string => {\n return toParamString(params, ';')\n}\n\n/**\n * Renders a comma-separated string of mailto values.\n * (e.g., 'John Doe ,Jane Doe ')\n *\n * @param {CalendarAttendee[]} attendees\n * @returns {string[]}\n */\nconst toMailtoList = (attendees: CalendarAttendee[]): string[] => {\n return attendees\n .map(({ email, name }) => {\n return name\n ? `${name} <${email}>`\n : email\n })\n}\n\n/**\n * Converts the given string to ProperCase.\n *\n * @param {string} s\n * @returns {string}\n */\nconst toProperCase = (s: string): string => {\n return [\n s[0].toUpperCase(),\n s.slice(-s.length + 1).toLowerCase()\n ].join('')\n}\n\nexport default {\n toParamString,\n toQueryString,\n toIcsParamString,\n toMailtoList,\n toProperCase\n}\n","import data from './data'\nimport time from './time'\nimport CalendarRecurrence from '../types/CalendarRecurrence'\nimport { FORMAT } from '../constants'\n\n/**\n * Removes line breaks from a string. Returns an empty string if falsy.\n *\n * @param {string} [str = ''] - string to sanitize\n * @returns {string}\n */\nconst formatText = (str = ''): string => {\n return str\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/\\n/g, '\\\\n')\n .replace(/[,;]/g, '\\\\$&')\n}\n\n/**\n * Returns a random base 36 hash for iCal UID.\n *\n * @returns {string}\n */\nconst getUid = (): string => {\n return Math.random().toString(36).substr(2)\n}\n\n/**\n * Returns the hostname for usage in `PRODID`. Returns `datebook` in Node.js.\n *\n * @returns {string}\n */\nconst getProdId = (): string => {\n return typeof window !== 'undefined'\n ? window.location.host\n : 'datebook'\n}\n\n/**\n * Converts the given recurrence options to RFC????\n *\n * @param {CalendarRecurrence} recurrence\n * @returns {string}\n */\nconst getRrule = (recurrence: CalendarRecurrence): string => {\n const rrule: Record = {\n FREQ: recurrence.frequency,\n INTERVAL: recurrence.interval?.toString(),\n COUNT: recurrence.count?.toString(),\n WKST: recurrence.weekstart,\n BYDAY: recurrence.weekdays,\n BYMONTHDAY: recurrence.monthdays\n }\n\n if (recurrence.end) {\n rrule.UNTIL = time.formatDate(recurrence.end, FORMAT.FULL)\n }\n\n return data.toIcsParamString(rrule)\n}\n\nexport default {\n formatText,\n getUid,\n getProdId,\n getRrule\n}\n","import CalendarBase from './CalendarBase'\nimport data from './utils/data'\nimport ics from './utils/ics'\nimport time from './utils/time'\nimport { FORMAT, URL } from './constants'\nimport CalendarOptions from './types/CalendarOptions'\n\n/**\n * Generates a Google Calendar url.\n */\nexport default class GoogleCalendar extends CalendarBase {\n constructor (opts: CalendarOptions) {\n super(opts)\n this.setInitialParams()\n }\n\n /**\n * Sets the basic properties for the calendar instance.\n */\n protected setInitialParams = (): void => {\n let timestampFormat = FORMAT.DATE\n\n if (!this.isAllDay) {\n timestampFormat += FORMAT.TIME\n }\n\n const dates = [\n time.formatDate(this.start, timestampFormat),\n time.formatDate(this.end, timestampFormat)\n ].join('/')\n\n this\n .setParam('action', 'TEMPLATE')\n .setParam('dates', dates)\n .setParam('text', this.title)\n .setParam('details', this.description)\n .setParam('location', this.location)\n .setParam('allday', this.isAllDay.toString())\n\n if (this.recurrence) {\n this.setParam('recur', `RRULE:${ics.getRrule(this.recurrence)}`)\n }\n\n if (this.attendees.length > 0) {\n this.setParam('add', data.toMailtoList(this.attendees).join(','))\n }\n }\n\n /**\n * Generates the Google Calendar url.\n *\n * @returns {string}\n */\n public render = (): string => {\n const baseUrl = URL.GOOGLE\n const queryString = data.toQueryString(this.params)\n\n return `${baseUrl}?${queryString}`\n }\n}\n","import CalendarBase from './CalendarBase'\nimport { URL, FORMAT } from './constants'\nimport data from './utils/data'\nimport time from './utils/time'\nimport CalendarOptions from './types/CalendarOptions'\n\n/**\n * Generates a Yahoo! Calendar url.\n *\n * @remark Yahoo! Calendar's support for recurrence is limited to only the interval and frequency.\n */\nexport default class YahooCalendar extends CalendarBase {\n constructor (opts: CalendarOptions) {\n super(opts)\n this.setInitialParams()\n }\n\n /**\n * Sets the basic properties for the calendar instance.\n */\n protected setInitialParams = (): void => {\n this\n .setParam('v', '60') // version number; must be 60\n .setParam('title', this.title)\n .setParam('desc', this.description)\n .setParam('in_loc', this.location)\n\n this.setTimeParams()\n\n if (this.attendees.length > 0) {\n this.setParam('inv_list', data.toMailtoList(this.attendees).join(','))\n }\n }\n\n /**\n * Sets the start/end/allday parameters.\n */\n private setTimeParams = (): void => {\n if (this.isAllDay) {\n this\n .setParam('dur', 'allday')\n .setParam('st', time.formatDateNoUtc(this.start, FORMAT.DATE))\n } else {\n this.setParam('st', time.formatDateNoUtc(this.start, FORMAT.NO_UTC_FULL))\n\n if (time.getHoursDiff(this.start.getTime(), this.end.getTime()) > 99) {\n // Yahoo only supports up to 99 hours, so we are forced to specify the end time instead of the duration\n this.setParam('et', time.formatDateNoUtc(this.end, FORMAT.NO_UTC_FULL))\n } else {\n // we prefer specifying duration in lieu of end time, because apparently Yahoo's end time is buggy w.r.t. timezones\n this.setParam('dur', time.getDuration(this.start.getTime(), this.end.getTime()))\n }\n }\n }\n\n /**\n * Generates the Yahoo! Calendar data.\n *\n * @returns {string}\n */\n public render = (): string => {\n const baseUrl = URL.YAHOO\n const queryString = data.toQueryString(this.params)\n\n return `${baseUrl}?${queryString}`\n }\n}\n","import CalendarBase from './CalendarBase'\nimport { FORMAT, URL } from './constants'\nimport data from './utils/data'\nimport time from './utils/time'\nimport CalendarOptions from './types/CalendarOptions'\n\n/**\n * Generates an Outlook Calendar url.\n *\n * @remark Outlook Calendar's query string params do not support recurrence.\n */\nexport default class OutlookCalendar extends CalendarBase {\n /** Base URL for the host service. */\n private baseUrl: string = URL.OUTLOOK\n\n constructor (opts: CalendarOptions) {\n super(opts)\n this.setInitialParams()\n this.setHost('live')\n }\n\n /**\n * Sets the basic properties for the calendar instance.\n */\n protected setInitialParams = (): void => {\n let timestampFormat = FORMAT.OUTLOOK_DATE\n\n if (!this.isAllDay) {\n timestampFormat += FORMAT.OUTLOOK_TIME\n }\n\n this\n .setParam('rru', 'addevent')\n .setParam('path', '/calendar/action/compose')\n .setParam('startdt', time.formatDate(this.start, timestampFormat))\n .setParam('enddt', time.formatDate(this.end, timestampFormat))\n .setParam('subject', this.title)\n .setParam('body', this.description)\n .setParam('location', this.location)\n .setParam('allday', this.isAllDay.toString())\n\n if (this.attendees.length > 0) {\n this.setParam('to', data.toMailtoList(this.attendees).join(','))\n }\n }\n\n /**\n * Sets the host service type. The default host for Outlook is **`live`**.\n *\n * @param {string} host - `live` (for personal accounts) or `office` (for Office365)\n * @returns {OutlookCalendar}\n */\n public setHost = (host: string): this => {\n if (['live', 'office'].includes(host)) {\n this.baseUrl = URL.OUTLOOK.replace('{{host}}', host)\n }\n\n return this\n }\n\n /**\n * Generates the Outlook url.\n *\n * @returns {string}\n */\n public render = (): string => {\n const queryString = data.toQueryString(this.params)\n\n return `${this.baseUrl}?${queryString}`\n }\n}\n","import CalendarBase from './CalendarBase'\nimport { FORMAT } from './constants'\nimport data from './utils/data'\nimport ics from './utils/ics'\nimport time from './utils/time'\nimport CalendarOptions from './types/CalendarOptions'\nimport ICSAlarm from './types/ICSAlarm'\nimport ICSAttendeeOptions from './types/ICSAttendeeOptions'\nimport ICSDuration from './types/ICSDuration'\nimport ICSPropertyValue from './types/ICSPropertyValue'\n\n/**\n * Renders ICS file content.\n */\nexport default class ICalendar extends CalendarBase {\n /** List of additional ICalendar events to add. */\n private additionalEvents: ICalendar[] = []\n\n /** List of VEVENT property-value entries */\n public properties: string[] = []\n\n /** Key-value pair of basic calendar properties. */\n private meta: Record = {}\n\n constructor (opts: CalendarOptions) {\n super(opts)\n this.setInitialParams()\n }\n\n /**\n * Sets the basic properties for the calendar instance.\n */\n protected setInitialParams = (): void => {\n this\n .setMeta('UID', ics.getUid())\n .setMeta('DTSTAMP', time.getTimeCreated())\n .addProperty('CLASS', 'PUBLIC')\n .addProperty('DESCRIPTION', ics.formatText(this.description))\n .addProperty('LOCATION', ics.formatText(this.location))\n .addProperty('SUMMARY', ics.formatText(this.title))\n .addProperty('TRANSP', 'TRANSPARENT')\n\n if (this.isAllDay) {\n // for all-day events, omit the time and just place dates\n this\n .addProperty('DTSTART;VALUE=DATE', time.formatDateNoUtc(this.start, FORMAT.DATE))\n .addProperty('DTEND;VALUE=DATE', time.formatDateNoUtc(time.incrementDate(this.start, 1), FORMAT.DATE))\n } else {\n // otherwise, set the full start and end dates\n this\n .addProperty('DTSTART', time.formatDate(this.start, FORMAT.FULL))\n .addProperty('DTEND', time.formatDate(this.end, FORMAT.FULL))\n }\n\n if (this.recurrence) {\n this.addProperty('RRULE', ics.getRrule(this.recurrence))\n }\n\n if (this.attendees.length > 0) {\n this\n .attendees\n .forEach(({ email, name, icsOptions = {} }) => {\n const params = this.getAttendeeParams(icsOptions, name)\n const mailto = `MAILTO:${email}`\n\n this.addProperty(params, mailto)\n })\n }\n }\n\n /**\n * Generates the ATTENDEE property param based on user-specified options and the attendee name.\n *\n * @param {ICSAttendeeOptions} options\n * @param {string} name\n * @returns {string}\n */\n private getAttendeeParams = (options: ICSAttendeeOptions, name?: string): string => {\n const params: Record = {}\n\n if (name) params['CN'] = name\n if (options.delegatedFrom) params['DELEGATED-FROM'] = options.delegatedFrom\n if (options.partStat) params['PARTSTAT'] = options.partStat\n if (options.role) params['ROLE'] = options.role\n if (options.sentBy) params['SENT-BY'] = options.sentBy\n\n params['RSVP'] = options.rsvp ? 'TRUE' : 'FALSE'\n\n const paramString = data.toParamString(params, ';')\n\n return `ATTENDEE;${paramString}`\n }\n\n /**\n * Generates a valid ICS alarm duration.\n *\n * @example getAlarmDuration({ minutes: 3, seconds: 2 }) -> PT3M2S\n * @param {ICSDuration} duration\n * @returns {string}\n */\n private getAlarmDuration = (duration: ICSDuration): string => {\n const features = [\n `${duration.weeks}W`,\n `${duration.days}D`,\n `${duration.hours}H`,\n `${duration.minutes}M`,\n `${duration.seconds}S`\n ].filter((s: string) => /^[0-9]+[A-Z]$/.exec(s)) // exclude zero-duration features\n\n features.unshift(duration.after ? 'PT' : '-PT')\n\n return features.join('')\n }\n\n /**\n * Returns the iCalendar meta properties, formatted as VEVENT entry lines.\n *\n * @returns {string[]}\n */\n public getMeta = (): string[] => {\n return Object\n .keys(this.meta)\n .map((key: string) => {\n return `${key}:${this.meta[key]}`\n })\n }\n\n /**\n * Sets iCalendar meta properties, such as UID, DTSTAMP, etc.\n *\n * @param {string} key\n * @param {string} value\n * @returns {ICalendar}\n */\n public setMeta = (key: string, value: string): this => {\n this.meta[key] = value\n\n return this\n }\n\n /**\n * Adds the given event to the same `.ics` file instance.\n *\n * @param {ICalendar} event\n * @returns {ICalendar}\n */\n public addEvent = (event: ICalendar): this => {\n this.additionalEvents.push(event)\n\n return this\n }\n\n /**\n * Adds any additional desired iCalendar property having the given key-value pair to the instance.\n *\n * @param {Alarm} alarm\n * @returns {ICalendar}\n */\n public addProperty = (key: string, value: ICSPropertyValue): this => {\n if (typeof value === 'object') {\n this.properties.push(`BEGIN:${key}`)\n\n for (const k in value) {\n this.addProperty(k, value[k])\n }\n\n this.properties.push(`END:${key}`)\n } else {\n this.properties.push(`${key}:${value.toString()}`)\n }\n\n return this\n }\n\n /**\n * Adds an alarm. Multiple different alarms may be added to a single instance.\n *\n * @param {Alarm} alarm\n * @returns {ICalendar}\n */\n public addAlarm = (alarm: ICSAlarm): this => {\n const value: ICSPropertyValue = {\n ACTION: alarm.action\n }\n\n if (alarm.description) value.DESCRIPTION = ics.formatText(alarm.description)\n if (alarm.summary) value.SUMMARY = ics.formatText(alarm.summary)\n if (alarm.duration) value.DURATION = this.getAlarmDuration(alarm.duration)\n if (alarm.repeat) value.REPEAT = alarm.repeat\n if (alarm.attach) {\n const key = alarm.attach.params\n ? `ATTACH;${alarm.attach.params}`\n : 'ATTACH'\n\n value[key] = alarm.attach.url\n }\n if (alarm.trigger instanceof Date) {\n value['TRIGGER;VALUE=DATE-TIME'] = time.formatDate(alarm.trigger, FORMAT.FULL)\n } else {\n value['TRIGGER'] = this.getAlarmDuration(alarm.trigger)\n }\n\n return this.addProperty('VALARM', value)\n }\n\n /**\n * Generates the iCalendar data.\n *\n * @returns {string}\n */\n public render = (): string => {\n const events = [\n this,\n ...this.additionalEvents\n ]\n\n const vEvents = events.reduce((properties: string[], calendar: ICalendar) => [\n ...properties,\n 'BEGIN:VEVENT',\n ...calendar.properties,\n ...calendar.getMeta(),\n 'END:VEVENT'\n ], [])\n\n return [\n 'BEGIN:VCALENDAR',\n 'VERSION:2.0',\n ...vEvents,\n `PRODID:${ics.getProdId()}`,\n 'END:VCALENDAR'\n ].join('\\n')\n }\n}\n"],"names":["FORMAT","URL","YAHOO","GOOGLE","OUTLOOK","addLeadingZero","n","parseInt","toString","slice","formatDate","d","format","Date","dateValues","YYYY","getUTCFullYear","MM","getUTCMonth","DD","getUTCDate","hh","getUTCHours","mm","getUTCMinutes","ss","getUTCSeconds","Object","keys","reduce","date","key","replace","time","start","end","seconds","Math","floor","hours","mins","concat","getFullYear","getMonth","getDate","getHours","getMinutes","getSeconds","dateInput","days","additionalTime","newDate","setTime","getTime","CalendarBase","options","_this","this","isAllDay","description","title","location","params","attendees","setText","setTimestamps","recurrence","setParam","value","setAttendees","prototype","Array","isArray","extendStatics","b","setPrototypeOf","__proto__","p","hasOwnProperty","call","__extends","TypeError","String","__","constructor","create","__assign","assign","t","s","i","arguments","length","apply","__spreadArray","to","from","pack","ar","l","toParamString","delimiter","transformFn","paramString","undefined","push","join","data","filteredParams","filter","k","_a","encodeURIComponent","map","email","name","ics","str","random","substr","window","host","rrule","FREQ","frequency","INTERVAL","interval","COUNT","_b","count","WKST","weekstart","BYDAY","weekdays","BYMONTHDAY","monthdays","UNTIL","GoogleCalendar","_super","opts","setInitialParams","timestampFormat","dates","render","baseUrl","queryString","YahooCalendar","setTimeParams","OutlookCalendar","setHost","includes","ICalendar","additionalEvents","properties","meta","setMeta","addProperty","forEach","icsOptions","getAttendeeParams","mailto","delegatedFrom","partStat","role","sentBy","rsvp","getAlarmDuration","duration","features","weeks","minutes","exec","unshift","after","getMeta","addEvent","event","addAlarm","alarm","ACTION","action","DESCRIPTION","summary","SUMMARY","DURATION","repeat","REPEAT","attach","url","trigger","vEvents","calendar"],"mappings":"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"} \ No newline at end of file diff --git a/dist/datebook.min.mjs b/dist/datebook.min.mjs new file mode 100644 index 0000000..a7a3e25 --- /dev/null +++ b/dist/datebook.min.mjs @@ -0,0 +1,805 @@ +var RECURRENCE = { + FREQUENCY: { + DAILY: 'DAILY', + WEEKLY: 'WEEKLY', + MONTHLY: 'MONTHLY', + YEARLY: 'YEARLY' + } +}; +var FORMAT = { + DATE: 'YYYYMMDD', + TIME: 'ThhmmssZ', + FULL: 'YYYYMMDDThhmmssZ', + NO_UTC_FULL: 'YYYYMMDDThhmmss', + OUTLOOK_DATE: 'YYYY-MM-DD', + OUTLOOK_TIME: 'Thh:mm:ssZ', + OUTLOOK_FULL: 'YYYY-MM-DDThh:mm:ssZ' +}; +var URL = { + YAHOO: 'https://calendar.yahoo.com/', + GOOGLE: 'https://calendar.google.com/calendar/render', + OUTLOOK: 'https://outlook.{{host}}.com/calendar/action/compose' +}; + +/** + * Adds a leading zero to a single-digit string and returns a two-digit string. + * + * @param {number | string} n + * @returns {string} + */ +var addLeadingZero = function (n) { + if (n === void 0) { n = ''; } + return "0".concat(parseInt(n.toString(), 10)).slice(-2); +}; +/** + * Returns the duration between two given dates in hhmm format. + * + * @param {number} start + * @param {number} end + * @returns {string} + */ +var getDuration = function (start, end) { + var seconds = Math.floor((end - start) / 1000); + var hours = Math.floor(seconds / 3600); + var mins = ((seconds / 3600) % 1) * 60; + return "".concat(addLeadingZero(hours)).concat(addLeadingZero(mins)); +}; +/** + * Returns the number of hours between two given dates. + * + * @param {number} start + * @param {number} end + * @returns {number} + */ +var getHoursDiff = function (start, end) { + var seconds = Math.floor((end - start) / 1000); + return Math.floor(seconds / 3600); +}; +/** + * Computes the number of days a recurrence will last. + * + * @param {CalendarRecurrence} recurrence + * @returns {number} + */ +var getRecurrenceLengthDays = function (recurrence) { + var frequency = recurrence.frequency, interval = recurrence.interval; + var FREQUENCY = RECURRENCE.FREQUENCY; + if (interval) { + switch (frequency) { + case FREQUENCY.YEARLY: + return interval * 365.25; + case FREQUENCY.MONTHLY: + return interval * 30.42; // avg days in a year + case FREQUENCY.WEEKLY: + return interval * 7; + default: + return interval; // daily + } + } + // if no frequency is specified, set an arbitrarily-long recurrence end + return 365.25 * 100; // 100 years +}; +/** + * Formats the given JS Date() object to the given format. + * Format defaults to: YYYYMMDDTHHMMss + * + * @param {Date} [d = new Date()] + * @param {string} format + * @returns {string} + */ +var formatDate = function (d, format) { + if (d === void 0) { d = new Date(); } + var dateValues = { + YYYY: d.getUTCFullYear(), + MM: addLeadingZero(d.getUTCMonth() + 1), + DD: addLeadingZero(d.getUTCDate()), + hh: addLeadingZero(d.getUTCHours()), + mm: addLeadingZero(d.getUTCMinutes()), + ss: addLeadingZero(d.getUTCSeconds()) + }; + return Object + .keys(dateValues) + .reduce(function (date, key) { + return date.replace(key, dateValues[key].toString()); + }, format); +}; +/** + * Formats the given JS Date() object to the given format, not using UTC + * Format defaults to: YYYYMMDDTHHMMss + * + * @param {Date} [d = new Date()] + * @param {string} format + * @returns {string} + */ +var formatDateNoUtc = function (d, format) { + if (d === void 0) { d = new Date(); } + var dateValues = { + YYYY: d.getFullYear(), + MM: addLeadingZero(d.getMonth() + 1), + DD: addLeadingZero(d.getDate()), + hh: addLeadingZero(d.getHours()), + mm: addLeadingZero(d.getMinutes()), + ss: addLeadingZero(d.getSeconds()) + }; + return Object + .keys(dateValues) + .reduce(function (date, key) { + return date.replace(key, dateValues[key].toString()); + }, format); +}; +/** + * Returns the current timestamp. + * + * @returns {string} + */ +var getTimeCreated = function () { + return formatDate(new Date(), FORMAT.FULL); +}; +/** + * Increments dates by the given number of days. + * This will account for edge cases, such as leap years. + * + * @param {Date} dateInput - date to increment + * @param {number} days - number of days + * @returns {Date} + */ +var incrementDate = function (dateInput, days) { + var additionalTime = days * 86400000; + var newDate = new Date(); + newDate.setTime(dateInput.getTime() + additionalTime); + return newDate; +}; +var time = { + addLeadingZero: addLeadingZero, + getDuration: getDuration, + getHoursDiff: getHoursDiff, + getRecurrenceLengthDays: getRecurrenceLengthDays, + formatDate: formatDate, + formatDateNoUtc: formatDateNoUtc, + getTimeCreated: getTimeCreated, + incrementDate: incrementDate +}; + +/** + * Base calendar class. This class can be extended to add new calendar services. + */ +var CalendarBase = /** @class */ (function () { + /** + * Constructor. + * + * @param {CalendarOptions} options + */ + function CalendarBase(options) { + var _this = this; + /** True if the event is one that spans the entire day. */ + this.isAllDay = false; + /** Event description. */ + this.description = ''; + /** Event title. */ + this.title = ''; + /** Event physical location. */ + this.location = ''; + /** Start time of the event. */ + this.start = new Date(); + /** End time of the event. */ + this.end = new Date(); + /** Calendar service query string params. */ + this.params = {}; + /** Array of event attendees. See {@link CalendarAttendee} */ + this.attendees = []; + /** + * Sets the description, title and location. + * + * @param {CalendarOptions} options + */ + this.setText = function (options) { + _this.description = options.description || ''; + _this.title = options.title || ''; + _this.location = options.location || ''; + }; + /** + * Sets the time and recurrence parameters. + * + * @param {CalendarOptions} options + */ + this.setTimestamps = function (options) { + _this.isAllDay = !options.end; + _this.start = options.start; + // if no end date is specified, make the end date exactly 1 day from the start date + _this.end = options.end || time.incrementDate(_this.start, 1); + _this.recurrence = options.recurrence; + }; + /** + * Sets additional calendar service properties. + * May be used to override existing query string params if necessary. + * + * @param {string} key + * @param {string | null} value + * @returns {CalendarBase} + */ + this.setParam = function (key, value) { + _this.params[key] = value; + return _this; + }; + this.setText(options); + this.setTimestamps(options); + this.setAttendees(options); + } + /** + * Sets the attendees array if attendees are supplied. + * + * @param {CalendarOptions} options + */ + CalendarBase.prototype.setAttendees = function (options) { + this.attendees = Array.isArray(options.attendees) ? options.attendees : []; + }; + return CalendarBase; +}()); + +/****************************************************************************** +Copyright (c) Microsoft Corporation. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +***************************************************************************** */ +/* global Reflect, Promise */ + +var extendStatics = function(d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); +}; + +function __extends(d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +} + +var __assign = function() { + __assign = Object.assign || function __assign(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; + +function __spreadArray(to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); +} + +/** + * Creates a param string from a flat key-value pair. + * + * @param {Record} params + * @param {string} [delimiter = ';'] + * @param {Function} [transformFn] - transformation function to be applied to each param + * @returns {string} + */ +var toParamString = function (params, delimiter, transformFn) { + if (delimiter === void 0) { delimiter = ';'; } + if (transformFn === void 0) { transformFn = function (s) { return s; }; } + var paramString = []; + for (var key in params) { + if (params.hasOwnProperty(key) && params[key] !== undefined) { + paramString.push("".concat(key, "=").concat(transformFn(params[key]))); + } + } + return paramString.join(delimiter); +}; +/** + * Creates a query string from a flat key-value pair. + * + * @param {Record} params + * @returns {string} + */ +var toQueryString = function (params) { + // filter the record set to remove null values + var filteredParams = Object + .keys(params) + .filter(function (p) { return params[p] !== null; }) + .reduce(function (p, k) { + var _a; + return (__assign(__assign({}, p), (_a = {}, _a[k] = params[k], _a))); + }, {}); + return toParamString(filteredParams, '&', encodeURIComponent); +}; +/** + * Creates an ICS param string from a flat key-value pair. + * + * @param {Record} params + * @returns {string} + */ +var toIcsParamString = function (params) { + return toParamString(params, ';'); +}; +/** + * Renders a comma-separated string of mailto values. + * (e.g., 'John Doe ,Jane Doe ') + * + * @param {CalendarAttendee[]} attendees + * @returns {string[]} + */ +var toMailtoList = function (attendees) { + return attendees + .map(function (_a) { + var email = _a.email, name = _a.name; + return name + ? "".concat(name, " <").concat(email, ">") + : email; + }); +}; +/** + * Converts the given string to ProperCase. + * + * @param {string} s + * @returns {string} + */ +var toProperCase = function (s) { + return [ + s[0].toUpperCase(), + s.slice(-s.length + 1).toLowerCase() + ].join(''); +}; +var data = { + toParamString: toParamString, + toQueryString: toQueryString, + toIcsParamString: toIcsParamString, + toMailtoList: toMailtoList, + toProperCase: toProperCase +}; + +/** + * Removes line breaks from a string. Returns an empty string if falsy. + * + * @param {string} [str = ''] - string to sanitize + * @returns {string} + */ +var formatText = function (str) { + if (str === void 0) { str = ''; } + return str + .replace(/\\/g, '\\\\') + .replace(/\n/g, '\\n') + .replace(/[,;]/g, '\\$&'); +}; +/** + * Returns a random base 36 hash for iCal UID. + * + * @returns {string} + */ +var getUid = function () { + return Math.random().toString(36).substr(2); +}; +/** + * Returns the hostname for usage in `PRODID`. Returns `datebook` in Node.js. + * + * @returns {string} + */ +var getProdId = function () { + return typeof window !== 'undefined' + ? window.location.host + : 'datebook'; +}; +/** + * Converts the given recurrence options to RFC???? + * + * @param {CalendarRecurrence} recurrence + * @returns {string} + */ +var getRrule = function (recurrence) { + var _a, _b; + var rrule = { + FREQ: recurrence.frequency, + INTERVAL: (_a = recurrence.interval) === null || _a === void 0 ? void 0 : _a.toString(), + COUNT: (_b = recurrence.count) === null || _b === void 0 ? void 0 : _b.toString(), + WKST: recurrence.weekstart, + BYDAY: recurrence.weekdays, + BYMONTHDAY: recurrence.monthdays + }; + if (recurrence.end) { + rrule.UNTIL = time.formatDate(recurrence.end, FORMAT.FULL); + } + return data.toIcsParamString(rrule); +}; +var ics = { + formatText: formatText, + getUid: getUid, + getProdId: getProdId, + getRrule: getRrule +}; + +/** + * Generates a Google Calendar url. + */ +var GoogleCalendar = /** @class */ (function (_super) { + __extends(GoogleCalendar, _super); + function GoogleCalendar(opts) { + var _this = _super.call(this, opts) || this; + /** + * Sets the basic properties for the calendar instance. + */ + _this.setInitialParams = function () { + var timestampFormat = FORMAT.DATE; + if (!_this.isAllDay) { + timestampFormat += FORMAT.TIME; + } + var dates = [ + time.formatDate(_this.start, timestampFormat), + time.formatDate(_this.end, timestampFormat) + ].join('/'); + _this + .setParam('action', 'TEMPLATE') + .setParam('dates', dates) + .setParam('text', _this.title) + .setParam('details', _this.description) + .setParam('location', _this.location) + .setParam('allday', _this.isAllDay.toString()); + if (_this.recurrence) { + _this.setParam('recur', "RRULE:".concat(ics.getRrule(_this.recurrence))); + } + if (_this.attendees.length > 0) { + _this.setParam('add', data.toMailtoList(_this.attendees).join(',')); + } + }; + /** + * Generates the Google Calendar url. + * + * @returns {string} + */ + _this.render = function () { + var baseUrl = URL.GOOGLE; + var queryString = data.toQueryString(_this.params); + return "".concat(baseUrl, "?").concat(queryString); + }; + _this.setInitialParams(); + return _this; + } + return GoogleCalendar; +}(CalendarBase)); + +/** + * Generates a Yahoo! Calendar url. + * + * @remark Yahoo! Calendar's support for recurrence is limited to only the interval and frequency. + */ +var YahooCalendar = /** @class */ (function (_super) { + __extends(YahooCalendar, _super); + function YahooCalendar(opts) { + var _this = _super.call(this, opts) || this; + /** + * Sets the basic properties for the calendar instance. + */ + _this.setInitialParams = function () { + _this + .setParam('v', '60') // version number; must be 60 + .setParam('title', _this.title) + .setParam('desc', _this.description) + .setParam('in_loc', _this.location); + _this.setTimeParams(); + if (_this.attendees.length > 0) { + _this.setParam('inv_list', data.toMailtoList(_this.attendees).join(',')); + } + }; + /** + * Sets the start/end/allday parameters. + */ + _this.setTimeParams = function () { + if (_this.isAllDay) { + _this + .setParam('dur', 'allday') + .setParam('st', time.formatDateNoUtc(_this.start, FORMAT.DATE)); + } + else { + _this.setParam('st', time.formatDateNoUtc(_this.start, FORMAT.NO_UTC_FULL)); + if (time.getHoursDiff(_this.start.getTime(), _this.end.getTime()) > 99) { + // Yahoo only supports up to 99 hours, so we are forced to specify the end time instead of the duration + _this.setParam('et', time.formatDateNoUtc(_this.end, FORMAT.NO_UTC_FULL)); + } + else { + // we prefer specifying duration in lieu of end time, because apparently Yahoo's end time is buggy w.r.t. timezones + _this.setParam('dur', time.getDuration(_this.start.getTime(), _this.end.getTime())); + } + } + }; + /** + * Generates the Yahoo! Calendar data. + * + * @returns {string} + */ + _this.render = function () { + var baseUrl = URL.YAHOO; + var queryString = data.toQueryString(_this.params); + return "".concat(baseUrl, "?").concat(queryString); + }; + _this.setInitialParams(); + return _this; + } + return YahooCalendar; +}(CalendarBase)); + +/** + * Generates an Outlook Calendar url. + * + * @remark Outlook Calendar's query string params do not support recurrence. + */ +var OutlookCalendar = /** @class */ (function (_super) { + __extends(OutlookCalendar, _super); + function OutlookCalendar(opts) { + var _this = _super.call(this, opts) || this; + /** Base URL for the host service. */ + _this.baseUrl = URL.OUTLOOK; + /** + * Sets the basic properties for the calendar instance. + */ + _this.setInitialParams = function () { + var timestampFormat = FORMAT.OUTLOOK_DATE; + if (!_this.isAllDay) { + timestampFormat += FORMAT.OUTLOOK_TIME; + } + _this + .setParam('rru', 'addevent') + .setParam('path', '/calendar/action/compose') + .setParam('startdt', time.formatDate(_this.start, timestampFormat)) + .setParam('enddt', time.formatDate(_this.end, timestampFormat)) + .setParam('subject', _this.title) + .setParam('body', _this.description) + .setParam('location', _this.location) + .setParam('allday', _this.isAllDay.toString()); + if (_this.attendees.length > 0) { + _this.setParam('to', data.toMailtoList(_this.attendees).join(',')); + } + }; + /** + * Sets the host service type. The default host for Outlook is **`live`**. + * + * @param {string} host - `live` (for personal accounts) or `office` (for Office365) + * @returns {OutlookCalendar} + */ + _this.setHost = function (host) { + if (['live', 'office'].includes(host)) { + _this.baseUrl = URL.OUTLOOK.replace('{{host}}', host); + } + return _this; + }; + /** + * Generates the Outlook url. + * + * @returns {string} + */ + _this.render = function () { + var queryString = data.toQueryString(_this.params); + return "".concat(_this.baseUrl, "?").concat(queryString); + }; + _this.setInitialParams(); + _this.setHost('live'); + return _this; + } + return OutlookCalendar; +}(CalendarBase)); + +/** + * Renders ICS file content. + */ +var ICalendar = /** @class */ (function (_super) { + __extends(ICalendar, _super); + function ICalendar(opts) { + var _this = _super.call(this, opts) || this; + /** List of additional ICalendar events to add. */ + _this.additionalEvents = []; + /** List of VEVENT property-value entries */ + _this.properties = []; + /** Key-value pair of basic calendar properties. */ + _this.meta = {}; + /** + * Sets the basic properties for the calendar instance. + */ + _this.setInitialParams = function () { + _this + .setMeta('UID', ics.getUid()) + .setMeta('DTSTAMP', time.getTimeCreated()) + .addProperty('CLASS', 'PUBLIC') + .addProperty('DESCRIPTION', ics.formatText(_this.description)) + .addProperty('LOCATION', ics.formatText(_this.location)) + .addProperty('SUMMARY', ics.formatText(_this.title)) + .addProperty('TRANSP', 'TRANSPARENT'); + if (_this.isAllDay) { + // for all-day events, omit the time and just place dates + _this + .addProperty('DTSTART;VALUE=DATE', time.formatDateNoUtc(_this.start, FORMAT.DATE)) + .addProperty('DTEND;VALUE=DATE', time.formatDateNoUtc(time.incrementDate(_this.start, 1), FORMAT.DATE)); + } + else { + // otherwise, set the full start and end dates + _this + .addProperty('DTSTART', time.formatDate(_this.start, FORMAT.FULL)) + .addProperty('DTEND', time.formatDate(_this.end, FORMAT.FULL)); + } + if (_this.recurrence) { + _this.addProperty('RRULE', ics.getRrule(_this.recurrence)); + } + if (_this.attendees.length > 0) { + _this + .attendees + .forEach(function (_a) { + var email = _a.email, name = _a.name, _b = _a.icsOptions, icsOptions = _b === void 0 ? {} : _b; + var params = _this.getAttendeeParams(icsOptions, name); + var mailto = "MAILTO:".concat(email); + _this.addProperty(params, mailto); + }); + } + }; + /** + * Generates the ATTENDEE property param based on user-specified options and the attendee name. + * + * @param {ICSAttendeeOptions} options + * @param {string} name + * @returns {string} + */ + _this.getAttendeeParams = function (options, name) { + var params = {}; + if (name) + params['CN'] = name; + if (options.delegatedFrom) + params['DELEGATED-FROM'] = options.delegatedFrom; + if (options.partStat) + params['PARTSTAT'] = options.partStat; + if (options.role) + params['ROLE'] = options.role; + if (options.sentBy) + params['SENT-BY'] = options.sentBy; + params['RSVP'] = options.rsvp ? 'TRUE' : 'FALSE'; + var paramString = data.toParamString(params, ';'); + return "ATTENDEE;".concat(paramString); + }; + /** + * Generates a valid ICS alarm duration. + * + * @example getAlarmDuration({ minutes: 3, seconds: 2 }) -> PT3M2S + * @param {ICSDuration} duration + * @returns {string} + */ + _this.getAlarmDuration = function (duration) { + var features = [ + "".concat(duration.weeks, "W"), + "".concat(duration.days, "D"), + "".concat(duration.hours, "H"), + "".concat(duration.minutes, "M"), + "".concat(duration.seconds, "S") + ].filter(function (s) { return /^[0-9]+[A-Z]$/.exec(s); }); // exclude zero-duration features + features.unshift(duration.after ? 'PT' : '-PT'); + return features.join(''); + }; + /** + * Returns the iCalendar meta properties, formatted as VEVENT entry lines. + * + * @returns {string[]} + */ + _this.getMeta = function () { + return Object + .keys(_this.meta) + .map(function (key) { + return "".concat(key, ":").concat(_this.meta[key]); + }); + }; + /** + * Sets iCalendar meta properties, such as UID, DTSTAMP, etc. + * + * @param {string} key + * @param {string} value + * @returns {ICalendar} + */ + _this.setMeta = function (key, value) { + _this.meta[key] = value; + return _this; + }; + /** + * Adds the given event to the same `.ics` file instance. + * + * @param {ICalendar} event + * @returns {ICalendar} + */ + _this.addEvent = function (event) { + _this.additionalEvents.push(event); + return _this; + }; + /** + * Adds any additional desired iCalendar property having the given key-value pair to the instance. + * + * @param {Alarm} alarm + * @returns {ICalendar} + */ + _this.addProperty = function (key, value) { + if (typeof value === 'object') { + _this.properties.push("BEGIN:".concat(key)); + for (var k in value) { + _this.addProperty(k, value[k]); + } + _this.properties.push("END:".concat(key)); + } + else { + _this.properties.push("".concat(key, ":").concat(value.toString())); + } + return _this; + }; + /** + * Adds an alarm. Multiple different alarms may be added to a single instance. + * + * @param {Alarm} alarm + * @returns {ICalendar} + */ + _this.addAlarm = function (alarm) { + var value = { + ACTION: alarm.action + }; + if (alarm.description) + value.DESCRIPTION = ics.formatText(alarm.description); + if (alarm.summary) + value.SUMMARY = ics.formatText(alarm.summary); + if (alarm.duration) + value.DURATION = _this.getAlarmDuration(alarm.duration); + if (alarm.repeat) + value.REPEAT = alarm.repeat; + if (alarm.attach) { + var key = alarm.attach.params + ? "ATTACH;".concat(alarm.attach.params) + : 'ATTACH'; + value[key] = alarm.attach.url; + } + if (alarm.trigger instanceof Date) { + value['TRIGGER;VALUE=DATE-TIME'] = time.formatDate(alarm.trigger, FORMAT.FULL); + } + else { + value['TRIGGER'] = _this.getAlarmDuration(alarm.trigger); + } + return _this.addProperty('VALARM', value); + }; + /** + * Generates the iCalendar data. + * + * @returns {string} + */ + _this.render = function () { + var events = __spreadArray([ + _this + ], _this.additionalEvents, true); + var vEvents = events.reduce(function (properties, calendar) { return __spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray([], properties, true), [ + 'BEGIN:VEVENT' + ], false), calendar.properties, true), calendar.getMeta(), true), [ + 'END:VEVENT' + ], false); }, []); + return __spreadArray(__spreadArray([ + 'BEGIN:VCALENDAR', + 'VERSION:2.0' + ], vEvents, true), [ + "PRODID:".concat(ics.getProdId()), + 'END:VCALENDAR' + ], false).join('\n'); + }; + _this.setInitialParams(); + return _this; + } + return ICalendar; +}(CalendarBase)); + +export { CalendarBase, GoogleCalendar, ICalendar, OutlookCalendar, YahooCalendar }; +//# sourceMappingURL=datebook.min.mjs.map diff --git a/dist/datebook.min.mjs.map b/dist/datebook.min.mjs.map new file mode 100644 index 0000000..7ee047b --- /dev/null +++ b/dist/datebook.min.mjs.map @@ -0,0 +1 @@ +{"version":3,"file":"datebook.min.mjs","sources":["../../src/constants.ts","../../src/utils/time.ts","../../src/CalendarBase.ts","../node_modules/tslib/tslib.es6.js","../../src/utils/data.ts","../../src/utils/ics.ts","../../src/GoogleCalendar.ts","../../src/YahooCalendar.ts","../../src/OutlookCalendar.ts","../../src/ICalendar.ts"],"sourcesContent":["export const RECURRENCE = {\n FREQUENCY: {\n DAILY: 'DAILY',\n WEEKLY: 'WEEKLY',\n MONTHLY: 'MONTHLY',\n YEARLY: 'YEARLY'\n }\n}\n\nexport const FORMAT = {\n DATE: 'YYYYMMDD',\n TIME: 'ThhmmssZ',\n FULL: 'YYYYMMDDThhmmssZ',\n NO_UTC_FULL: 'YYYYMMDDThhmmss',\n OUTLOOK_DATE: 'YYYY-MM-DD',\n OUTLOOK_TIME: 'Thh:mm:ssZ',\n OUTLOOK_FULL: 'YYYY-MM-DDThh:mm:ssZ'\n}\n\nexport const URL = {\n YAHOO: 'https://calendar.yahoo.com/',\n GOOGLE: 'https://calendar.google.com/calendar/render',\n OUTLOOK: 'https://outlook.{{host}}.com/calendar/action/compose'\n}\n","import { RECURRENCE, FORMAT } from '../constants'\nimport CalendarRecurrence from '../types/CalendarRecurrence'\n\n/**\n * Adds a leading zero to a single-digit string and returns a two-digit string.\n *\n * @param {number | string} n\n * @returns {string}\n */\nconst addLeadingZero = (n: number | string = ''): string => {\n return `0${parseInt(n.toString(), 10)}`.slice(-2)\n}\n\n/**\n * Returns the duration between two given dates in hhmm format.\n *\n * @param {number} start\n * @param {number} end\n * @returns {string}\n */\nconst getDuration = (start: number, end: number): string => {\n const seconds = Math.floor((end - start) / 1000)\n const hours = Math.floor(seconds / 3600)\n const mins = ((seconds / 3600) % 1) * 60\n\n return `${addLeadingZero(hours)}${addLeadingZero(mins)}`\n}\n\n/**\n * Returns the number of hours between two given dates.\n *\n * @param {number} start\n * @param {number} end\n * @returns {number}\n */\nconst getHoursDiff = (start: number, end: number): number => {\n const seconds = Math.floor((end - start) / 1000)\n\n return Math.floor(seconds / 3600)\n}\n\n/**\n * Computes the number of days a recurrence will last.\n *\n * @param {CalendarRecurrence} recurrence\n * @returns {number}\n */\nconst getRecurrenceLengthDays = (recurrence: CalendarRecurrence): number => {\n const { frequency, interval } = recurrence\n const { FREQUENCY } = RECURRENCE\n\n if (interval) {\n switch (frequency) {\n case FREQUENCY.YEARLY:\n return interval * 365.25\n case FREQUENCY.MONTHLY:\n return interval * 30.42 // avg days in a year\n case FREQUENCY.WEEKLY:\n return interval * 7\n default:\n return interval // daily\n }\n }\n\n // if no frequency is specified, set an arbitrarily-long recurrence end\n return 365.25 * 100 // 100 years\n}\n\n/**\n * Formats the given JS Date() object to the given format.\n * Format defaults to: YYYYMMDDTHHMMss\n *\n * @param {Date} [d = new Date()]\n * @param {string} format\n * @returns {string}\n */\nconst formatDate = (d: Date = new Date(), format: string): string => {\n const dateValues: Record = {\n YYYY: d.getUTCFullYear(),\n MM: addLeadingZero(d.getUTCMonth() + 1),\n DD: addLeadingZero(d.getUTCDate()),\n hh: addLeadingZero(d.getUTCHours()),\n mm: addLeadingZero(d.getUTCMinutes()),\n ss: addLeadingZero(d.getUTCSeconds())\n }\n\n return Object\n .keys(dateValues)\n .reduce((date: string, key: string): string => {\n return date.replace(key, dateValues[key].toString())\n }, format)\n}\n\n\n/**\n * Formats the given JS Date() object to the given format, not using UTC\n * Format defaults to: YYYYMMDDTHHMMss\n *\n * @param {Date} [d = new Date()]\n * @param {string} format\n * @returns {string}\n */\nconst formatDateNoUtc = (d: Date = new Date(), format: string): string => {\n const dateValues: Record = {\n YYYY: d.getFullYear(),\n MM: addLeadingZero(d.getMonth() + 1),\n DD: addLeadingZero(d.getDate()),\n hh: addLeadingZero(d.getHours()),\n mm: addLeadingZero(d.getMinutes()),\n ss: addLeadingZero(d.getSeconds())\n }\n\n return Object\n .keys(dateValues)\n .reduce((date: string, key: string): string => {\n return date.replace(key, dateValues[key].toString())\n }, format)\n}\n\n/**\n * Returns the current timestamp.\n *\n * @returns {string}\n */\nconst getTimeCreated = (): string => {\n return formatDate(new Date(), FORMAT.FULL)\n}\n\n/**\n * Increments dates by the given number of days.\n * This will account for edge cases, such as leap years.\n *\n * @param {Date} dateInput - date to increment\n * @param {number} days - number of days\n * @returns {Date}\n */\nconst incrementDate = (dateInput: Date, days: number): Date => {\n const additionalTime = days * 86400000\n const newDate = new Date()\n\n newDate.setTime(dateInput.getTime() + additionalTime)\n\n return newDate\n}\n\nexport default {\n addLeadingZero,\n getDuration,\n getHoursDiff,\n getRecurrenceLengthDays,\n formatDate,\n formatDateNoUtc,\n getTimeCreated,\n incrementDate\n}\n","import ICalendarBase from './types/ICalendarBase'\nimport CalendarRecurrence from './types/CalendarRecurrence'\nimport CalendarOptions from './types/CalendarOptions'\nimport time from './utils/time'\nimport CalendarAttendee from './types/CalendarAttendee'\n\n/**\n * Base calendar class. This class can be extended to add new calendar services.\n */\nabstract class CalendarBase implements ICalendarBase {\n /** True if the event is one that spans the entire day. */\n protected isAllDay = false\n\n /** Event description. */\n protected description = ''\n\n /** Event title. */\n protected title = ''\n\n /** Event physical location. */\n protected location = ''\n\n /** Start time of the event. */\n protected start = new Date()\n\n /** End time of the event. */\n protected end = new Date()\n\n /** Event recurrence specification. See {@link CalendarRecurrence} */\n protected recurrence?: CalendarRecurrence\n\n /** Calendar service query string params. */\n protected params: Record = {}\n\n /** Array of event attendees. See {@link CalendarAttendee} */\n protected attendees: CalendarAttendee[] = []\n\n /**\n * Constructor.\n *\n * @param {CalendarOptions} options\n */\n constructor (options: CalendarOptions) {\n this.setText(options)\n this.setTimestamps(options)\n this.setAttendees(options)\n }\n\n /**\n * Sets the description, title and location.\n *\n * @param {CalendarOptions} options\n */\n protected setText = (options: CalendarOptions): void => {\n this.description = options.description || ''\n this.title = options.title || ''\n this.location = options.location || ''\n }\n\n /**\n * Sets the time and recurrence parameters.\n *\n * @param {CalendarOptions} options\n */\n protected setTimestamps = (options: CalendarOptions): void => {\n this.isAllDay = !options.end\n this.start = options.start\n\n // if no end date is specified, make the end date exactly 1 day from the start date\n this.end = options.end || time.incrementDate(this.start, 1)\n\n this.recurrence = options.recurrence\n }\n\n /**\n * Sets the attendees array if attendees are supplied.\n *\n * @param {CalendarOptions} options\n */\n protected setAttendees (options: CalendarOptions): void {\n this.attendees = Array.isArray(options.attendees) ? options.attendees : []\n }\n\n /**\n * Sets additional calendar service properties.\n * May be used to override existing query string params if necessary.\n *\n * @param {string} key\n * @param {string | null} value\n * @returns {CalendarBase}\n */\n public setParam = (key: string, value: string | null): this => {\n this.params[key] = value\n\n return this\n }\n\n /** Sets base query string/ICS params. */\n protected abstract setInitialParams (): void\n\n /** Renders the URL/ICS file data. */\n public abstract render (): string\n}\n\nexport default CalendarBase\n","/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n","import CalendarAttendee from '../types/CalendarAttendee'\n\n/**\n * Creates a param string from a flat key-value pair.\n *\n * @param {Record} params\n * @param {string} [delimiter = ';']\n * @param {Function} [transformFn] - transformation function to be applied to each param\n * @returns {string}\n */\nconst toParamString = (\n params: Record,\n delimiter = ';',\n transformFn: (s: string) => string = s => s\n): string => {\n const paramString = []\n\n for (const key in params) {\n if (params.hasOwnProperty(key) && params[key] !== undefined) {\n paramString.push(`${key}=${transformFn(params[key])}`)\n }\n }\n\n return paramString.join(delimiter)\n}\n\n/**\n * Creates a query string from a flat key-value pair.\n *\n * @param {Record} params\n * @returns {string}\n */\nconst toQueryString = (params: Record): string => {\n // filter the record set to remove null values\n const filteredParams = Object\n .keys(params)\n .filter(p => params[p] !== null)\n .reduce((p: Record, k: string) => ({\n ...p,\n [k]: params[k] as string\n }), {})\n\n return toParamString(filteredParams, '&', encodeURIComponent)\n}\n\n/**\n * Creates an ICS param string from a flat key-value pair.\n *\n * @param {Record} params\n * @returns {string}\n */\nconst toIcsParamString = (params: Record): string => {\n return toParamString(params, ';')\n}\n\n/**\n * Renders a comma-separated string of mailto values.\n * (e.g., 'John Doe ,Jane Doe ')\n *\n * @param {CalendarAttendee[]} attendees\n * @returns {string[]}\n */\nconst toMailtoList = (attendees: CalendarAttendee[]): string[] => {\n return attendees\n .map(({ email, name }) => {\n return name\n ? `${name} <${email}>`\n : email\n })\n}\n\n/**\n * Converts the given string to ProperCase.\n *\n * @param {string} s\n * @returns {string}\n */\nconst toProperCase = (s: string): string => {\n return [\n s[0].toUpperCase(),\n s.slice(-s.length + 1).toLowerCase()\n ].join('')\n}\n\nexport default {\n toParamString,\n toQueryString,\n toIcsParamString,\n toMailtoList,\n toProperCase\n}\n","import data from './data'\nimport time from './time'\nimport CalendarRecurrence from '../types/CalendarRecurrence'\nimport { FORMAT } from '../constants'\n\n/**\n * Removes line breaks from a string. Returns an empty string if falsy.\n *\n * @param {string} [str = ''] - string to sanitize\n * @returns {string}\n */\nconst formatText = (str = ''): string => {\n return str\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/\\n/g, '\\\\n')\n .replace(/[,;]/g, '\\\\$&')\n}\n\n/**\n * Returns a random base 36 hash for iCal UID.\n *\n * @returns {string}\n */\nconst getUid = (): string => {\n return Math.random().toString(36).substr(2)\n}\n\n/**\n * Returns the hostname for usage in `PRODID`. Returns `datebook` in Node.js.\n *\n * @returns {string}\n */\nconst getProdId = (): string => {\n return typeof window !== 'undefined'\n ? window.location.host\n : 'datebook'\n}\n\n/**\n * Converts the given recurrence options to RFC????\n *\n * @param {CalendarRecurrence} recurrence\n * @returns {string}\n */\nconst getRrule = (recurrence: CalendarRecurrence): string => {\n const rrule: Record = {\n FREQ: recurrence.frequency,\n INTERVAL: recurrence.interval?.toString(),\n COUNT: recurrence.count?.toString(),\n WKST: recurrence.weekstart,\n BYDAY: recurrence.weekdays,\n BYMONTHDAY: recurrence.monthdays\n }\n\n if (recurrence.end) {\n rrule.UNTIL = time.formatDate(recurrence.end, FORMAT.FULL)\n }\n\n return data.toIcsParamString(rrule)\n}\n\nexport default {\n formatText,\n getUid,\n getProdId,\n getRrule\n}\n","import CalendarBase from './CalendarBase'\nimport data from './utils/data'\nimport ics from './utils/ics'\nimport time from './utils/time'\nimport { FORMAT, URL } from './constants'\nimport CalendarOptions from './types/CalendarOptions'\n\n/**\n * Generates a Google Calendar url.\n */\nexport default class GoogleCalendar extends CalendarBase {\n constructor (opts: CalendarOptions) {\n super(opts)\n this.setInitialParams()\n }\n\n /**\n * Sets the basic properties for the calendar instance.\n */\n protected setInitialParams = (): void => {\n let timestampFormat = FORMAT.DATE\n\n if (!this.isAllDay) {\n timestampFormat += FORMAT.TIME\n }\n\n const dates = [\n time.formatDate(this.start, timestampFormat),\n time.formatDate(this.end, timestampFormat)\n ].join('/')\n\n this\n .setParam('action', 'TEMPLATE')\n .setParam('dates', dates)\n .setParam('text', this.title)\n .setParam('details', this.description)\n .setParam('location', this.location)\n .setParam('allday', this.isAllDay.toString())\n\n if (this.recurrence) {\n this.setParam('recur', `RRULE:${ics.getRrule(this.recurrence)}`)\n }\n\n if (this.attendees.length > 0) {\n this.setParam('add', data.toMailtoList(this.attendees).join(','))\n }\n }\n\n /**\n * Generates the Google Calendar url.\n *\n * @returns {string}\n */\n public render = (): string => {\n const baseUrl = URL.GOOGLE\n const queryString = data.toQueryString(this.params)\n\n return `${baseUrl}?${queryString}`\n }\n}\n","import CalendarBase from './CalendarBase'\nimport { URL, FORMAT } from './constants'\nimport data from './utils/data'\nimport time from './utils/time'\nimport CalendarOptions from './types/CalendarOptions'\n\n/**\n * Generates a Yahoo! Calendar url.\n *\n * @remark Yahoo! Calendar's support for recurrence is limited to only the interval and frequency.\n */\nexport default class YahooCalendar extends CalendarBase {\n constructor (opts: CalendarOptions) {\n super(opts)\n this.setInitialParams()\n }\n\n /**\n * Sets the basic properties for the calendar instance.\n */\n protected setInitialParams = (): void => {\n this\n .setParam('v', '60') // version number; must be 60\n .setParam('title', this.title)\n .setParam('desc', this.description)\n .setParam('in_loc', this.location)\n\n this.setTimeParams()\n\n if (this.attendees.length > 0) {\n this.setParam('inv_list', data.toMailtoList(this.attendees).join(','))\n }\n }\n\n /**\n * Sets the start/end/allday parameters.\n */\n private setTimeParams = (): void => {\n if (this.isAllDay) {\n this\n .setParam('dur', 'allday')\n .setParam('st', time.formatDateNoUtc(this.start, FORMAT.DATE))\n } else {\n this.setParam('st', time.formatDateNoUtc(this.start, FORMAT.NO_UTC_FULL))\n\n if (time.getHoursDiff(this.start.getTime(), this.end.getTime()) > 99) {\n // Yahoo only supports up to 99 hours, so we are forced to specify the end time instead of the duration\n this.setParam('et', time.formatDateNoUtc(this.end, FORMAT.NO_UTC_FULL))\n } else {\n // we prefer specifying duration in lieu of end time, because apparently Yahoo's end time is buggy w.r.t. timezones\n this.setParam('dur', time.getDuration(this.start.getTime(), this.end.getTime()))\n }\n }\n }\n\n /**\n * Generates the Yahoo! Calendar data.\n *\n * @returns {string}\n */\n public render = (): string => {\n const baseUrl = URL.YAHOO\n const queryString = data.toQueryString(this.params)\n\n return `${baseUrl}?${queryString}`\n }\n}\n","import CalendarBase from './CalendarBase'\nimport { FORMAT, URL } from './constants'\nimport data from './utils/data'\nimport time from './utils/time'\nimport CalendarOptions from './types/CalendarOptions'\n\n/**\n * Generates an Outlook Calendar url.\n *\n * @remark Outlook Calendar's query string params do not support recurrence.\n */\nexport default class OutlookCalendar extends CalendarBase {\n /** Base URL for the host service. */\n private baseUrl: string = URL.OUTLOOK\n\n constructor (opts: CalendarOptions) {\n super(opts)\n this.setInitialParams()\n this.setHost('live')\n }\n\n /**\n * Sets the basic properties for the calendar instance.\n */\n protected setInitialParams = (): void => {\n let timestampFormat = FORMAT.OUTLOOK_DATE\n\n if (!this.isAllDay) {\n timestampFormat += FORMAT.OUTLOOK_TIME\n }\n\n this\n .setParam('rru', 'addevent')\n .setParam('path', '/calendar/action/compose')\n .setParam('startdt', time.formatDate(this.start, timestampFormat))\n .setParam('enddt', time.formatDate(this.end, timestampFormat))\n .setParam('subject', this.title)\n .setParam('body', this.description)\n .setParam('location', this.location)\n .setParam('allday', this.isAllDay.toString())\n\n if (this.attendees.length > 0) {\n this.setParam('to', data.toMailtoList(this.attendees).join(','))\n }\n }\n\n /**\n * Sets the host service type. The default host for Outlook is **`live`**.\n *\n * @param {string} host - `live` (for personal accounts) or `office` (for Office365)\n * @returns {OutlookCalendar}\n */\n public setHost = (host: string): this => {\n if (['live', 'office'].includes(host)) {\n this.baseUrl = URL.OUTLOOK.replace('{{host}}', host)\n }\n\n return this\n }\n\n /**\n * Generates the Outlook url.\n *\n * @returns {string}\n */\n public render = (): string => {\n const queryString = data.toQueryString(this.params)\n\n return `${this.baseUrl}?${queryString}`\n }\n}\n","import CalendarBase from './CalendarBase'\nimport { FORMAT } from './constants'\nimport data from './utils/data'\nimport ics from './utils/ics'\nimport time from './utils/time'\nimport CalendarOptions from './types/CalendarOptions'\nimport ICSAlarm from './types/ICSAlarm'\nimport ICSAttendeeOptions from './types/ICSAttendeeOptions'\nimport ICSDuration from './types/ICSDuration'\nimport ICSPropertyValue from './types/ICSPropertyValue'\n\n/**\n * Renders ICS file content.\n */\nexport default class ICalendar extends CalendarBase {\n /** List of additional ICalendar events to add. */\n private additionalEvents: ICalendar[] = []\n\n /** List of VEVENT property-value entries */\n public properties: string[] = []\n\n /** Key-value pair of basic calendar properties. */\n private meta: Record = {}\n\n constructor (opts: CalendarOptions) {\n super(opts)\n this.setInitialParams()\n }\n\n /**\n * Sets the basic properties for the calendar instance.\n */\n protected setInitialParams = (): void => {\n this\n .setMeta('UID', ics.getUid())\n .setMeta('DTSTAMP', time.getTimeCreated())\n .addProperty('CLASS', 'PUBLIC')\n .addProperty('DESCRIPTION', ics.formatText(this.description))\n .addProperty('LOCATION', ics.formatText(this.location))\n .addProperty('SUMMARY', ics.formatText(this.title))\n .addProperty('TRANSP', 'TRANSPARENT')\n\n if (this.isAllDay) {\n // for all-day events, omit the time and just place dates\n this\n .addProperty('DTSTART;VALUE=DATE', time.formatDateNoUtc(this.start, FORMAT.DATE))\n .addProperty('DTEND;VALUE=DATE', time.formatDateNoUtc(time.incrementDate(this.start, 1), FORMAT.DATE))\n } else {\n // otherwise, set the full start and end dates\n this\n .addProperty('DTSTART', time.formatDate(this.start, FORMAT.FULL))\n .addProperty('DTEND', time.formatDate(this.end, FORMAT.FULL))\n }\n\n if (this.recurrence) {\n this.addProperty('RRULE', ics.getRrule(this.recurrence))\n }\n\n if (this.attendees.length > 0) {\n this\n .attendees\n .forEach(({ email, name, icsOptions = {} }) => {\n const params = this.getAttendeeParams(icsOptions, name)\n const mailto = `MAILTO:${email}`\n\n this.addProperty(params, mailto)\n })\n }\n }\n\n /**\n * Generates the ATTENDEE property param based on user-specified options and the attendee name.\n *\n * @param {ICSAttendeeOptions} options\n * @param {string} name\n * @returns {string}\n */\n private getAttendeeParams = (options: ICSAttendeeOptions, name?: string): string => {\n const params: Record = {}\n\n if (name) params['CN'] = name\n if (options.delegatedFrom) params['DELEGATED-FROM'] = options.delegatedFrom\n if (options.partStat) params['PARTSTAT'] = options.partStat\n if (options.role) params['ROLE'] = options.role\n if (options.sentBy) params['SENT-BY'] = options.sentBy\n\n params['RSVP'] = options.rsvp ? 'TRUE' : 'FALSE'\n\n const paramString = data.toParamString(params, ';')\n\n return `ATTENDEE;${paramString}`\n }\n\n /**\n * Generates a valid ICS alarm duration.\n *\n * @example getAlarmDuration({ minutes: 3, seconds: 2 }) -> PT3M2S\n * @param {ICSDuration} duration\n * @returns {string}\n */\n private getAlarmDuration = (duration: ICSDuration): string => {\n const features = [\n `${duration.weeks}W`,\n `${duration.days}D`,\n `${duration.hours}H`,\n `${duration.minutes}M`,\n `${duration.seconds}S`\n ].filter((s: string) => /^[0-9]+[A-Z]$/.exec(s)) // exclude zero-duration features\n\n features.unshift(duration.after ? 'PT' : '-PT')\n\n return features.join('')\n }\n\n /**\n * Returns the iCalendar meta properties, formatted as VEVENT entry lines.\n *\n * @returns {string[]}\n */\n public getMeta = (): string[] => {\n return Object\n .keys(this.meta)\n .map((key: string) => {\n return `${key}:${this.meta[key]}`\n })\n }\n\n /**\n * Sets iCalendar meta properties, such as UID, DTSTAMP, etc.\n *\n * @param {string} key\n * @param {string} value\n * @returns {ICalendar}\n */\n public setMeta = (key: string, value: string): this => {\n this.meta[key] = value\n\n return this\n }\n\n /**\n * Adds the given event to the same `.ics` file instance.\n *\n * @param {ICalendar} event\n * @returns {ICalendar}\n */\n public addEvent = (event: ICalendar): this => {\n this.additionalEvents.push(event)\n\n return this\n }\n\n /**\n * Adds any additional desired iCalendar property having the given key-value pair to the instance.\n *\n * @param {Alarm} alarm\n * @returns {ICalendar}\n */\n public addProperty = (key: string, value: ICSPropertyValue): this => {\n if (typeof value === 'object') {\n this.properties.push(`BEGIN:${key}`)\n\n for (const k in value) {\n this.addProperty(k, value[k])\n }\n\n this.properties.push(`END:${key}`)\n } else {\n this.properties.push(`${key}:${value.toString()}`)\n }\n\n return this\n }\n\n /**\n * Adds an alarm. Multiple different alarms may be added to a single instance.\n *\n * @param {Alarm} alarm\n * @returns {ICalendar}\n */\n public addAlarm = (alarm: ICSAlarm): this => {\n const value: ICSPropertyValue = {\n ACTION: alarm.action\n }\n\n if (alarm.description) value.DESCRIPTION = ics.formatText(alarm.description)\n if (alarm.summary) value.SUMMARY = ics.formatText(alarm.summary)\n if (alarm.duration) value.DURATION = this.getAlarmDuration(alarm.duration)\n if (alarm.repeat) value.REPEAT = alarm.repeat\n if (alarm.attach) {\n const key = alarm.attach.params\n ? `ATTACH;${alarm.attach.params}`\n : 'ATTACH'\n\n value[key] = alarm.attach.url\n }\n if (alarm.trigger instanceof Date) {\n value['TRIGGER;VALUE=DATE-TIME'] = time.formatDate(alarm.trigger, FORMAT.FULL)\n } else {\n value['TRIGGER'] = this.getAlarmDuration(alarm.trigger)\n }\n\n return this.addProperty('VALARM', value)\n }\n\n /**\n * Generates the iCalendar data.\n *\n * @returns {string}\n */\n public render = (): string => {\n const events = [\n this,\n ...this.additionalEvents\n ]\n\n const vEvents = events.reduce((properties: string[], calendar: ICalendar) => [\n ...properties,\n 'BEGIN:VEVENT',\n ...calendar.properties,\n ...calendar.getMeta(),\n 'END:VEVENT'\n ], [])\n\n return [\n 'BEGIN:VCALENDAR',\n 'VERSION:2.0',\n ...vEvents,\n `PRODID:${ics.getProdId()}`,\n 'END:VCALENDAR'\n ].join('\\n')\n }\n}\n"],"names":[],"mappings":"AAAO,IAAM,UAAU,GAAG;AACxB,IAAA,SAAS,EAAE;AACT,QAAA,KAAK,EAAE,OAAO;AACd,QAAA,MAAM,EAAE,QAAQ;AAChB,QAAA,OAAO,EAAE,SAAS;AAClB,QAAA,MAAM,EAAE,QAAQ;AACjB,KAAA;CACF,CAAA;AAEM,IAAM,MAAM,GAAG;AACpB,IAAA,IAAI,EAAE,UAAU;AAChB,IAAA,IAAI,EAAE,UAAU;AAChB,IAAA,IAAI,EAAE,kBAAkB;AACxB,IAAA,WAAW,EAAE,iBAAiB;AAC9B,IAAA,YAAY,EAAE,YAAY;AAC1B,IAAA,YAAY,EAAE,YAAY;AAC1B,IAAA,YAAY,EAAE,sBAAsB;CACrC,CAAA;AAEM,IAAM,GAAG,GAAG;AACjB,IAAA,KAAK,EAAE,6BAA6B;AACpC,IAAA,MAAM,EAAE,6CAA6C;AACrD,IAAA,OAAO,EAAE,sDAAsD;CAChE;;ACpBD;;;;;AAKG;AACH,IAAM,cAAc,GAAG,UAAC,CAAuB,EAAA;AAAvB,IAAA,IAAA,CAAA,KAAA,KAAA,CAAA,EAAA,EAAA,CAAuB,GAAA,EAAA,CAAA,EAAA;AAC7C,IAAA,OAAO,WAAI,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;AACnD,CAAC,CAAA;AAED;;;;;;AAMG;AACH,IAAM,WAAW,GAAG,UAAC,KAAa,EAAE,GAAW,EAAA;AAC7C,IAAA,IAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,KAAK,IAAI,IAAI,CAAC,CAAA;IAChD,IAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,CAAA;AACxC,IAAA,IAAM,IAAI,GAAG,CAAC,CAAC,OAAO,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,CAAA;IAExC,OAAO,EAAA,CAAA,MAAA,CAAG,cAAc,CAAC,KAAK,CAAC,CAAG,CAAA,MAAA,CAAA,cAAc,CAAC,IAAI,CAAC,CAAE,CAAA;AAC1D,CAAC,CAAA;AAED;;;;;;AAMG;AACH,IAAM,YAAY,GAAG,UAAC,KAAa,EAAE,GAAW,EAAA;AAC9C,IAAA,IAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,KAAK,IAAI,IAAI,CAAC,CAAA;IAEhD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,CAAA;AACnC,CAAC,CAAA;AAED;;;;;AAKG;AACH,IAAM,uBAAuB,GAAG,UAAC,UAA8B,EAAA;IACrD,IAAA,SAAS,GAAe,UAAU,CAAA,SAAzB,EAAE,QAAQ,GAAK,UAAU,CAAA,QAAf,CAAe;AAClC,IAAA,IAAA,SAAS,GAAK,UAAU,CAAA,SAAf,CAAe;AAEhC,IAAA,IAAI,QAAQ,EAAE;AACZ,QAAA,QAAQ,SAAS;YACf,KAAK,SAAS,CAAC,MAAM;gBACnB,OAAO,QAAQ,GAAG,MAAM,CAAA;YAC1B,KAAK,SAAS,CAAC,OAAO;AACpB,gBAAA,OAAO,QAAQ,GAAG,KAAK,CAAA;YACzB,KAAK,SAAS,CAAC,MAAM;gBACnB,OAAO,QAAQ,GAAG,CAAC,CAAA;AACrB,YAAA;gBACE,OAAO,QAAQ,CAAA;AAClB,SAAA;AACF,KAAA;;AAGD,IAAA,OAAO,MAAM,GAAG,GAAG,CAAA;AACrB,CAAC,CAAA;AAED;;;;;;;AAOG;AACH,IAAM,UAAU,GAAG,UAAC,CAAoB,EAAE,MAAc,EAAA;IAApC,IAAA,CAAA,KAAA,KAAA,CAAA,EAAA,EAAA,CAAc,GAAA,IAAA,IAAI,EAAE,CAAA,EAAA;AACtC,IAAA,IAAM,UAAU,GAAoC;AAClD,QAAA,IAAI,EAAE,CAAC,CAAC,cAAc,EAAE;QACxB,EAAE,EAAE,cAAc,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;AACvC,QAAA,EAAE,EAAE,cAAc,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC;AAClC,QAAA,EAAE,EAAE,cAAc,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;AACnC,QAAA,EAAE,EAAE,cAAc,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;AACrC,QAAA,EAAE,EAAE,cAAc,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;KACtC,CAAA;AAED,IAAA,OAAO,MAAM;SACV,IAAI,CAAC,UAAU,CAAC;AAChB,SAAA,MAAM,CAAC,UAAC,IAAY,EAAE,GAAW,EAAA;AAChC,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAA;KACrD,EAAE,MAAM,CAAC,CAAA;AACd,CAAC,CAAA;AAGD;;;;;;;AAOG;AACH,IAAM,eAAe,GAAG,UAAC,CAAoB,EAAE,MAAc,EAAA;IAApC,IAAA,CAAA,KAAA,KAAA,CAAA,EAAA,EAAA,CAAc,GAAA,IAAA,IAAI,EAAE,CAAA,EAAA;AAC3C,IAAA,IAAM,UAAU,GAAoC;AAClD,QAAA,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE;QACrB,EAAE,EAAE,cAAc,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;AACpC,QAAA,EAAE,EAAE,cAAc,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;AAC/B,QAAA,EAAE,EAAE,cAAc,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;AAChC,QAAA,EAAE,EAAE,cAAc,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC;AAClC,QAAA,EAAE,EAAE,cAAc,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC;KACnC,CAAA;AAED,IAAA,OAAO,MAAM;SACV,IAAI,CAAC,UAAU,CAAC;AAChB,SAAA,MAAM,CAAC,UAAC,IAAY,EAAE,GAAW,EAAA;AAChC,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAA;KACrD,EAAE,MAAM,CAAC,CAAA;AACd,CAAC,CAAA;AAED;;;;AAIG;AACH,IAAM,cAAc,GAAG,YAAA;IACrB,OAAO,UAAU,CAAC,IAAI,IAAI,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,CAAA;AAC5C,CAAC,CAAA;AAED;;;;;;;AAOG;AACH,IAAM,aAAa,GAAG,UAAC,SAAe,EAAE,IAAY,EAAA;AAClD,IAAA,IAAM,cAAc,GAAG,IAAI,GAAG,QAAQ,CAAA;AACtC,IAAA,IAAM,OAAO,GAAG,IAAI,IAAI,EAAE,CAAA;IAE1B,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,cAAc,CAAC,CAAA;AAErD,IAAA,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA;AAED,WAAe;AACb,IAAA,cAAc,EAAA,cAAA;AACd,IAAA,WAAW,EAAA,WAAA;AACX,IAAA,YAAY,EAAA,YAAA;AACZ,IAAA,uBAAuB,EAAA,uBAAA;AACvB,IAAA,UAAU,EAAA,UAAA;AACV,IAAA,eAAe,EAAA,eAAA;AACf,IAAA,cAAc,EAAA,cAAA;AACd,IAAA,aAAa,EAAA,aAAA;CACd;;ACpJD;;AAEG;AACH,IAAA,YAAA,kBAAA,YAAA;AA4BE;;;;AAIG;AACH,IAAA,SAAA,YAAA,CAAa,OAAwB,EAAA;QAArC,IAIC,KAAA,GAAA,IAAA,CAAA;;QAnCS,IAAQ,CAAA,QAAA,GAAG,KAAK,CAAA;;QAGhB,IAAW,CAAA,WAAA,GAAG,EAAE,CAAA;;QAGhB,IAAK,CAAA,KAAA,GAAG,EAAE,CAAA;;QAGV,IAAQ,CAAA,QAAA,GAAG,EAAE,CAAA;;AAGb,QAAA,IAAA,CAAA,KAAK,GAAG,IAAI,IAAI,EAAE,CAAA;;AAGlB,QAAA,IAAA,CAAA,GAAG,GAAG,IAAI,IAAI,EAAE,CAAA;;QAMhB,IAAM,CAAA,MAAA,GAAkC,EAAE,CAAA;;QAG1C,IAAS,CAAA,SAAA,GAAuB,EAAE,CAAA;AAa5C;;;;AAIG;QACO,IAAO,CAAA,OAAA,GAAG,UAAC,OAAwB,EAAA;YAC3C,KAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,EAAE,CAAA;YAC5C,KAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,EAAE,CAAA;YAChC,KAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAA;AACxC,SAAC,CAAA;AAED;;;;AAIG;QACO,IAAa,CAAA,aAAA,GAAG,UAAC,OAAwB,EAAA;AACjD,YAAA,KAAI,CAAC,QAAQ,GAAG,CAAC,OAAO,CAAC,GAAG,CAAA;AAC5B,YAAA,KAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAA;;AAG1B,YAAA,KAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,aAAa,CAAC,KAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA;AAE3D,YAAA,KAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAA;AACtC,SAAC,CAAA;AAWD;;;;;;;AAOG;AACI,QAAA,IAAA,CAAA,QAAQ,GAAG,UAAC,GAAW,EAAE,KAAoB,EAAA;AAClD,YAAA,KAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;AAExB,YAAA,OAAO,KAAI,CAAA;AACb,SAAC,CAAA;AApDC,QAAA,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;AACrB,QAAA,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAA;AAC3B,QAAA,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAA;KAC3B;AA4BD;;;;AAIG;IACO,YAAY,CAAA,SAAA,CAAA,YAAA,GAAtB,UAAwB,OAAwB,EAAA;QAC9C,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,SAAS,GAAG,EAAE,CAAA;KAC3E,CAAA;IAqBH,OAAC,YAAA,CAAA;AAAD,CAAC,EAAA;;ACtGD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,aAAa,GAAG,SAAS,CAAC,EAAE,CAAC,EAAE;AACnC,IAAI,aAAa,GAAG,MAAM,CAAC,cAAc;AACzC,SAAS,EAAE,SAAS,EAAE,EAAE,EAAE,YAAY,KAAK,IAAI,UAAU,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,EAAE,CAAC;AACpF,QAAQ,UAAU,CAAC,EAAE,CAAC,EAAE,EAAE,KAAK,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAC1G,IAAI,OAAO,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC/B,CAAC,CAAC;AACF;AACO,SAAS,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE;AAChC,IAAI,IAAI,OAAO,CAAC,KAAK,UAAU,IAAI,CAAC,KAAK,IAAI;AAC7C,QAAQ,MAAM,IAAI,SAAS,CAAC,sBAAsB,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,+BAA+B,CAAC,CAAC;AAClG,IAAI,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACxB,IAAI,SAAS,EAAE,GAAG,EAAE,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,EAAE;AAC3C,IAAI,CAAC,CAAC,SAAS,GAAG,CAAC,KAAK,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;AACzF,CAAC;AACD;AACO,IAAI,QAAQ,GAAG,WAAW;AACjC,IAAI,QAAQ,GAAG,MAAM,CAAC,MAAM,IAAI,SAAS,QAAQ,CAAC,CAAC,EAAE;AACrD,QAAQ,KAAK,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;AAC7D,YAAY,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;AAC7B,YAAY,KAAK,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACzF,SAAS;AACT,QAAQ,OAAO,CAAC,CAAC;AACjB,MAAK;AACL,IAAI,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;AAC3C,EAAC;AA+HD;AACO,SAAS,aAAa,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE;AAC9C,IAAI,IAAI,IAAI,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;AACzF,QAAQ,IAAI,EAAE,IAAI,EAAE,CAAC,IAAI,IAAI,CAAC,EAAE;AAChC,YAAY,IAAI,CAAC,EAAE,EAAE,EAAE,GAAG,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AACjE,YAAY,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;AAC5B,SAAS;AACT,KAAK;AACL,IAAI,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE,IAAI,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAC7D;;AC9KA;;;;;;;AAOG;AACH,IAAM,aAAa,GAAG,UACpB,MAA8B,EAC9B,SAAe,EACf,WAA2C,EAAA;AAD3C,IAAA,IAAA,SAAA,KAAA,KAAA,CAAA,EAAA,EAAA,SAAe,GAAA,GAAA,CAAA,EAAA;AACf,IAAA,IAAA,WAAA,KAAA,KAAA,CAAA,EAAA,EAAA,WAAqC,GAAA,UAAA,CAAC,IAAI,OAAA,CAAC,GAAA,CAAA,EAAA;IAE3C,IAAM,WAAW,GAAG,EAAE,CAAA;AAEtB,IAAA,KAAK,IAAM,GAAG,IAAI,MAAM,EAAE;AACxB,QAAA,IAAI,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE;AAC3D,YAAA,WAAW,CAAC,IAAI,CAAC,EAAA,CAAA,MAAA,CAAG,GAAG,EAAI,GAAA,CAAA,CAAA,MAAA,CAAA,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAE,CAAC,CAAA;AACvD,SAAA;AACF,KAAA;AAED,IAAA,OAAO,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;AACpC,CAAC,CAAA;AAED;;;;;AAKG;AACH,IAAM,aAAa,GAAG,UAAC,MAAqC,EAAA;;IAE1D,IAAM,cAAc,GAAG,MAAM;SAC1B,IAAI,CAAC,MAAM,CAAC;AACZ,SAAA,MAAM,CAAC,UAAA,CAAC,EAAA,EAAI,OAAA,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAA,EAAA,CAAC;AAC/B,SAAA,MAAM,CAAC,UAAC,CAAyB,EAAE,CAAS,EAAA;;QAAK,QAAA,QAAA,CAAA,QAAA,CAAA,EAAA,EAC7C,CAAC,CACH,GAAA,EAAA,GAAA,EAAA,EAAA,EAAA,CAAA,CAAC,IAAG,MAAM,CAAC,CAAC,CAAW,EACxB,EAAA,EAAA,EAAA;KAAA,EAAE,EAAE,CAAC,CAAA;IAET,OAAO,aAAa,CAAC,cAAc,EAAE,GAAG,EAAE,kBAAkB,CAAC,CAAA;AAC/D,CAAC,CAAA;AAED;;;;;AAKG;AACH,IAAM,gBAAgB,GAAG,UAAC,MAA8B,EAAA;AACtD,IAAA,OAAO,aAAa,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;AACnC,CAAC,CAAA;AAED;;;;;;AAMG;AACH,IAAM,YAAY,GAAG,UAAC,SAA6B,EAAA;AACjD,IAAA,OAAO,SAAS;SACb,GAAG,CAAC,UAAC,EAAe,EAAA;YAAb,KAAK,GAAA,EAAA,CAAA,KAAA,EAAE,IAAI,GAAA,EAAA,CAAA,IAAA,CAAA;AACjB,QAAA,OAAO,IAAI;AACT,cAAE,EAAA,CAAA,MAAA,CAAG,IAAI,EAAA,IAAA,CAAA,CAAA,MAAA,CAAK,KAAK,EAAG,GAAA,CAAA;cACpB,KAAK,CAAA;AACX,KAAC,CAAC,CAAA;AACN,CAAC,CAAA;AAED;;;;;AAKG;AACH,IAAM,YAAY,GAAG,UAAC,CAAS,EAAA;IAC7B,OAAO;AACL,QAAA,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE;AAClB,QAAA,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE;AACrC,KAAA,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;AACZ,CAAC,CAAA;AAED,WAAe;AACb,IAAA,aAAa,EAAA,aAAA;AACb,IAAA,aAAa,EAAA,aAAA;AACb,IAAA,gBAAgB,EAAA,gBAAA;AAChB,IAAA,YAAY,EAAA,YAAA;AACZ,IAAA,YAAY,EAAA,YAAA;CACb;;ACrFD;;;;;AAKG;AACH,IAAM,UAAU,GAAG,UAAC,GAAQ,EAAA;AAAR,IAAA,IAAA,GAAA,KAAA,KAAA,CAAA,EAAA,EAAA,GAAQ,GAAA,EAAA,CAAA,EAAA;AAC1B,IAAA,OAAO,GAAG;AACP,SAAA,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC;AACtB,SAAA,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;AACrB,SAAA,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;AAC7B,CAAC,CAAA;AAED;;;;AAIG;AACH,IAAM,MAAM,GAAG,YAAA;AACb,IAAA,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;AAC7C,CAAC,CAAA;AAED;;;;AAIG;AACH,IAAM,SAAS,GAAG,YAAA;IAChB,OAAO,OAAO,MAAM,KAAK,WAAW;AAClC,UAAE,MAAM,CAAC,QAAQ,CAAC,IAAI;UACpB,UAAU,CAAA;AAChB,CAAC,CAAA;AAED;;;;;AAKG;AACH,IAAM,QAAQ,GAAG,UAAC,UAA8B,EAAA;;AAC9C,IAAA,IAAM,KAAK,GAAwB;QACjC,IAAI,EAAE,UAAU,CAAC,SAAS;AAC1B,QAAA,QAAQ,EAAE,CAAA,EAAA,GAAA,UAAU,CAAC,QAAQ,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,QAAQ,EAAE;AACzC,QAAA,KAAK,EAAE,CAAA,EAAA,GAAA,UAAU,CAAC,KAAK,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,QAAQ,EAAE;QACnC,IAAI,EAAE,UAAU,CAAC,SAAS;QAC1B,KAAK,EAAE,UAAU,CAAC,QAAQ;QAC1B,UAAU,EAAE,UAAU,CAAC,SAAS;KACjC,CAAA;IAED,IAAI,UAAU,CAAC,GAAG,EAAE;AAClB,QAAA,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,CAAA;AAC3D,KAAA;AAED,IAAA,OAAO,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAA;AACrC,CAAC,CAAA;AAED,UAAe;AACb,IAAA,UAAU,EAAA,UAAA;AACV,IAAA,MAAM,EAAA,MAAA;AACN,IAAA,SAAS,EAAA,SAAA;AACT,IAAA,QAAQ,EAAA,QAAA;CACT;;AC3DD;;AAEG;AACH,IAAA,cAAA,kBAAA,UAAA,MAAA,EAAA;IAA4C,SAAY,CAAA,cAAA,EAAA,MAAA,CAAA,CAAA;AACtD,IAAA,SAAA,cAAA,CAAa,IAAqB,EAAA;QAAlC,IACE,KAAA,GAAA,MAAA,CAAA,IAAA,CAAA,IAAA,EAAM,IAAI,CAAC,IAEZ,IAAA,CAAA;AAED;;AAEG;AACO,QAAA,KAAA,CAAA,gBAAgB,GAAG,YAAA;AAC3B,YAAA,IAAI,eAAe,GAAG,MAAM,CAAC,IAAI,CAAA;AAEjC,YAAA,IAAI,CAAC,KAAI,CAAC,QAAQ,EAAE;AAClB,gBAAA,eAAe,IAAI,MAAM,CAAC,IAAI,CAAA;AAC/B,aAAA;AAED,YAAA,IAAM,KAAK,GAAG;gBACZ,IAAI,CAAC,UAAU,CAAC,KAAI,CAAC,KAAK,EAAE,eAAe,CAAC;gBAC5C,IAAI,CAAC,UAAU,CAAC,KAAI,CAAC,GAAG,EAAE,eAAe,CAAC;AAC3C,aAAA,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YAEX,KAAI;AACD,iBAAA,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC;AAC9B,iBAAA,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC;AACxB,iBAAA,QAAQ,CAAC,MAAM,EAAE,KAAI,CAAC,KAAK,CAAC;AAC5B,iBAAA,QAAQ,CAAC,SAAS,EAAE,KAAI,CAAC,WAAW,CAAC;AACrC,iBAAA,QAAQ,CAAC,UAAU,EAAE,KAAI,CAAC,QAAQ,CAAC;iBACnC,QAAQ,CAAC,QAAQ,EAAE,KAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAA;YAE/C,IAAI,KAAI,CAAC,UAAU,EAAE;AACnB,gBAAA,KAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,gBAAS,GAAG,CAAC,QAAQ,CAAC,KAAI,CAAC,UAAU,CAAC,CAAE,CAAC,CAAA;AACjE,aAAA;AAED,YAAA,IAAI,KAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;AAC7B,gBAAA,KAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,KAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;AAClE,aAAA;AACH,SAAC,CAAA;AAED;;;;AAIG;AACI,QAAA,KAAA,CAAA,MAAM,GAAG,YAAA;AACd,YAAA,IAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAA;YAC1B,IAAM,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,KAAI,CAAC,MAAM,CAAC,CAAA;AAEnD,YAAA,OAAO,EAAG,CAAA,MAAA,CAAA,OAAO,EAAI,GAAA,CAAA,CAAA,MAAA,CAAA,WAAW,CAAE,CAAA;AACpC,SAAC,CAAA;QA7CC,KAAI,CAAC,gBAAgB,EAAE,CAAA;;KACxB;IA6CH,OAAC,cAAA,CAAA;AAAD,CAjDA,CAA4C,YAAY,CAiDvD;;ACrDD;;;;AAIG;AACH,IAAA,aAAA,kBAAA,UAAA,MAAA,EAAA;IAA2C,SAAY,CAAA,aAAA,EAAA,MAAA,CAAA,CAAA;AACrD,IAAA,SAAA,aAAA,CAAa,IAAqB,EAAA;QAAlC,IACE,KAAA,GAAA,MAAA,CAAA,IAAA,CAAA,IAAA,EAAM,IAAI,CAAC,IAEZ,IAAA,CAAA;AAED;;AAEG;AACO,QAAA,KAAA,CAAA,gBAAgB,GAAG,YAAA;YAC3B,KAAI;AACD,iBAAA,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC;AACnB,iBAAA,QAAQ,CAAC,OAAO,EAAE,KAAI,CAAC,KAAK,CAAC;AAC7B,iBAAA,QAAQ,CAAC,MAAM,EAAE,KAAI,CAAC,WAAW,CAAC;AAClC,iBAAA,QAAQ,CAAC,QAAQ,EAAE,KAAI,CAAC,QAAQ,CAAC,CAAA;YAEpC,KAAI,CAAC,aAAa,EAAE,CAAA;AAEpB,YAAA,IAAI,KAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;AAC7B,gBAAA,KAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC,YAAY,CAAC,KAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;AACvE,aAAA;AACH,SAAC,CAAA;AAED;;AAEG;AACK,QAAA,KAAA,CAAA,aAAa,GAAG,YAAA;YACtB,IAAI,KAAI,CAAC,QAAQ,EAAE;gBACjB,KAAI;AACD,qBAAA,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;AACzB,qBAAA,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,eAAe,CAAC,KAAI,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAA;AACjE,aAAA;AAAM,iBAAA;AACL,gBAAA,KAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,eAAe,CAAC,KAAI,CAAC,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC,CAAA;gBAEzE,IAAI,IAAI,CAAC,YAAY,CAAC,KAAI,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,KAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;;AAEpE,oBAAA,KAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,eAAe,CAAC,KAAI,CAAC,GAAG,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC,CAAA;AACxE,iBAAA;AAAM,qBAAA;;oBAEL,KAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,KAAI,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,KAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;AACjF,iBAAA;AACF,aAAA;AACH,SAAC,CAAA;AAED;;;;AAIG;AACI,QAAA,KAAA,CAAA,MAAM,GAAG,YAAA;AACd,YAAA,IAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAA;YACzB,IAAM,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,KAAI,CAAC,MAAM,CAAC,CAAA;AAEnD,YAAA,OAAO,EAAG,CAAA,MAAA,CAAA,OAAO,EAAI,GAAA,CAAA,CAAA,MAAA,CAAA,WAAW,CAAE,CAAA;AACpC,SAAC,CAAA;QAnDC,KAAI,CAAC,gBAAgB,EAAE,CAAA;;KACxB;IAmDH,OAAC,aAAA,CAAA;AAAD,CAvDA,CAA2C,YAAY,CAuDtD;;AC5DD;;;;AAIG;AACH,IAAA,eAAA,kBAAA,UAAA,MAAA,EAAA;IAA6C,SAAY,CAAA,eAAA,EAAA,MAAA,CAAA,CAAA;AAIvD,IAAA,SAAA,eAAA,CAAa,IAAqB,EAAA;QAAlC,IACE,KAAA,GAAA,MAAA,CAAA,IAAA,CAAA,IAAA,EAAM,IAAI,CAAC,IAGZ,IAAA,CAAA;;AANO,QAAA,KAAA,CAAA,OAAO,GAAW,GAAG,CAAC,OAAO,CAAA;AAQrC;;AAEG;AACO,QAAA,KAAA,CAAA,gBAAgB,GAAG,YAAA;AAC3B,YAAA,IAAI,eAAe,GAAG,MAAM,CAAC,YAAY,CAAA;AAEzC,YAAA,IAAI,CAAC,KAAI,CAAC,QAAQ,EAAE;AAClB,gBAAA,eAAe,IAAI,MAAM,CAAC,YAAY,CAAA;AACvC,aAAA;YAED,KAAI;AACD,iBAAA,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;AAC3B,iBAAA,QAAQ,CAAC,MAAM,EAAE,0BAA0B,CAAC;AAC5C,iBAAA,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC,KAAI,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC;AACjE,iBAAA,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,KAAI,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;AAC7D,iBAAA,QAAQ,CAAC,SAAS,EAAE,KAAI,CAAC,KAAK,CAAC;AAC/B,iBAAA,QAAQ,CAAC,MAAM,EAAE,KAAI,CAAC,WAAW,CAAC;AAClC,iBAAA,QAAQ,CAAC,UAAU,EAAE,KAAI,CAAC,QAAQ,CAAC;iBACnC,QAAQ,CAAC,QAAQ,EAAE,KAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAA;AAE/C,YAAA,IAAI,KAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;AAC7B,gBAAA,KAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,KAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;AACjE,aAAA;AACH,SAAC,CAAA;AAED;;;;;AAKG;QACI,KAAO,CAAA,OAAA,GAAG,UAAC,IAAY,EAAA;YAC5B,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;AACrC,gBAAA,KAAI,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,CAAA;AACrD,aAAA;AAED,YAAA,OAAO,KAAI,CAAA;AACb,SAAC,CAAA;AAED;;;;AAIG;AACI,QAAA,KAAA,CAAA,MAAM,GAAG,YAAA;YACd,IAAM,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,KAAI,CAAC,MAAM,CAAC,CAAA;AAEnD,YAAA,OAAO,UAAG,KAAI,CAAC,OAAO,EAAI,GAAA,CAAA,CAAA,MAAA,CAAA,WAAW,CAAE,CAAA;AACzC,SAAC,CAAA;QApDC,KAAI,CAAC,gBAAgB,EAAE,CAAA;AACvB,QAAA,KAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;;KACrB;IAmDH,OAAC,eAAA,CAAA;AAAD,CA3DA,CAA6C,YAAY,CA2DxD;;AC3DD;;AAEG;AACH,IAAA,SAAA,kBAAA,UAAA,MAAA,EAAA;IAAuC,SAAY,CAAA,SAAA,EAAA,MAAA,CAAA,CAAA;AAUjD,IAAA,SAAA,SAAA,CAAa,IAAqB,EAAA;QAAlC,IACE,KAAA,GAAA,MAAA,CAAA,IAAA,CAAA,IAAA,EAAM,IAAI,CAAC,IAEZ,IAAA,CAAA;;QAXO,KAAgB,CAAA,gBAAA,GAAgB,EAAE,CAAA;;QAGnC,KAAU,CAAA,UAAA,GAAa,EAAE,CAAA;;QAGxB,KAAI,CAAA,IAAA,GAA2B,EAAE,CAAA;AAOzC;;AAEG;AACO,QAAA,KAAA,CAAA,gBAAgB,GAAG,YAAA;YAC3B,KAAI;AACD,iBAAA,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC;AAC5B,iBAAA,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC;AACzC,iBAAA,WAAW,CAAC,OAAO,EAAE,QAAQ,CAAC;iBAC9B,WAAW,CAAC,aAAa,EAAE,GAAG,CAAC,UAAU,CAAC,KAAI,CAAC,WAAW,CAAC,CAAC;iBAC5D,WAAW,CAAC,UAAU,EAAE,GAAG,CAAC,UAAU,CAAC,KAAI,CAAC,QAAQ,CAAC,CAAC;iBACtD,WAAW,CAAC,SAAS,EAAE,GAAG,CAAC,UAAU,CAAC,KAAI,CAAC,KAAK,CAAC,CAAC;AAClD,iBAAA,WAAW,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAA;YAEvC,IAAI,KAAI,CAAC,QAAQ,EAAE;;gBAEjB,KAAI;AACD,qBAAA,WAAW,CAAC,oBAAoB,EAAE,IAAI,CAAC,eAAe,CAAC,KAAI,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;qBAChF,WAAW,CAAC,kBAAkB,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,aAAa,CAAC,KAAI,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAA;AACzG,aAAA;AAAM,iBAAA;;gBAEL,KAAI;AACD,qBAAA,WAAW,CAAC,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC,KAAI,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;AAChE,qBAAA,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,KAAI,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAA;AAChE,aAAA;YAED,IAAI,KAAI,CAAC,UAAU,EAAE;AACnB,gBAAA,KAAI,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,CAAC,QAAQ,CAAC,KAAI,CAAC,UAAU,CAAC,CAAC,CAAA;AACzD,aAAA;AAED,YAAA,IAAI,KAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;gBAC7B,KAAI;qBACD,SAAS;qBACT,OAAO,CAAC,UAAC,EAAgC,EAAA;wBAA9B,KAAK,GAAA,EAAA,CAAA,KAAA,EAAE,IAAI,GAAA,EAAA,CAAA,IAAA,EAAE,kBAAe,EAAf,UAAU,GAAG,EAAA,KAAA,KAAA,CAAA,GAAA,EAAE,GAAA,EAAA,CAAA;oBACtC,IAAM,MAAM,GAAG,KAAI,CAAC,iBAAiB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAA;AACvD,oBAAA,IAAM,MAAM,GAAG,SAAU,CAAA,MAAA,CAAA,KAAK,CAAE,CAAA;AAEhC,oBAAA,KAAI,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AAClC,iBAAC,CAAC,CAAA;AACL,aAAA;AACH,SAAC,CAAA;AAED;;;;;;AAMG;AACK,QAAA,KAAA,CAAA,iBAAiB,GAAG,UAAC,OAA2B,EAAE,IAAa,EAAA;YACrE,IAAM,MAAM,GAA2B,EAAE,CAAA;AAEzC,YAAA,IAAI,IAAI;AAAE,gBAAA,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;YAC7B,IAAI,OAAO,CAAC,aAAa;AAAE,gBAAA,MAAM,CAAC,gBAAgB,CAAC,GAAG,OAAO,CAAC,aAAa,CAAA;YAC3E,IAAI,OAAO,CAAC,QAAQ;AAAE,gBAAA,MAAM,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAA;YAC3D,IAAI,OAAO,CAAC,IAAI;AAAE,gBAAA,MAAM,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAA;YAC/C,IAAI,OAAO,CAAC,MAAM;AAAE,gBAAA,MAAM,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,MAAM,CAAA;AAEtD,YAAA,MAAM,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,GAAG,MAAM,GAAG,OAAO,CAAA;YAEhD,IAAM,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;YAEnD,OAAO,WAAA,CAAA,MAAA,CAAY,WAAW,CAAE,CAAA;AAClC,SAAC,CAAA;AAED;;;;;;AAMG;QACK,KAAgB,CAAA,gBAAA,GAAG,UAAC,QAAqB,EAAA;AAC/C,YAAA,IAAM,QAAQ,GAAG;gBACf,EAAG,CAAA,MAAA,CAAA,QAAQ,CAAC,KAAK,EAAG,GAAA,CAAA;gBACpB,EAAG,CAAA,MAAA,CAAA,QAAQ,CAAC,IAAI,EAAG,GAAA,CAAA;gBACnB,EAAG,CAAA,MAAA,CAAA,QAAQ,CAAC,KAAK,EAAG,GAAA,CAAA;gBACpB,EAAG,CAAA,MAAA,CAAA,QAAQ,CAAC,OAAO,EAAG,GAAA,CAAA;gBACtB,EAAG,CAAA,MAAA,CAAA,QAAQ,CAAC,OAAO,EAAG,GAAA,CAAA;AACvB,aAAA,CAAC,MAAM,CAAC,UAAC,CAAS,EAAA,EAAK,OAAA,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA,EAAA,CAAC,CAAA;AAEhD,YAAA,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,GAAG,IAAI,GAAG,KAAK,CAAC,CAAA;AAE/C,YAAA,OAAO,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;AAC1B,SAAC,CAAA;AAED;;;;AAIG;AACI,QAAA,KAAA,CAAA,OAAO,GAAG,YAAA;AACf,YAAA,OAAO,MAAM;AACV,iBAAA,IAAI,CAAC,KAAI,CAAC,IAAI,CAAC;iBACf,GAAG,CAAC,UAAC,GAAW,EAAA;gBACf,OAAO,EAAA,CAAA,MAAA,CAAG,GAAG,EAAA,GAAA,CAAA,CAAA,MAAA,CAAI,KAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAE,CAAA;AACnC,aAAC,CAAC,CAAA;AACN,SAAC,CAAA;AAED;;;;;;AAMG;AACI,QAAA,KAAA,CAAA,OAAO,GAAG,UAAC,GAAW,EAAE,KAAa,EAAA;AAC1C,YAAA,KAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;AAEtB,YAAA,OAAO,KAAI,CAAA;AACb,SAAC,CAAA;AAED;;;;;AAKG;QACI,KAAQ,CAAA,QAAA,GAAG,UAAC,KAAgB,EAAA;AACjC,YAAA,KAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;AAEjC,YAAA,OAAO,KAAI,CAAA;AACb,SAAC,CAAA;AAED;;;;;AAKG;AACI,QAAA,KAAA,CAAA,WAAW,GAAG,UAAC,GAAW,EAAE,KAAuB,EAAA;AACxD,YAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;gBAC7B,KAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAS,CAAA,MAAA,CAAA,GAAG,CAAE,CAAC,CAAA;AAElC,gBAAA,KAAK,IAAM,CAAC,IAAI,KAAK,EAAE;oBACrB,KAAI,CAAC,WAAW,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;AAC9B,iBAAA;gBAED,KAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAO,CAAA,MAAA,CAAA,GAAG,CAAE,CAAC,CAAA;AACrC,aAAA;AAAM,iBAAA;AACL,gBAAA,KAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAG,CAAA,MAAA,CAAA,GAAG,EAAI,GAAA,CAAA,CAAA,MAAA,CAAA,KAAK,CAAC,QAAQ,EAAE,CAAE,CAAC,CAAA;AACnD,aAAA;AAED,YAAA,OAAO,KAAI,CAAA;AACb,SAAC,CAAA;AAED;;;;;AAKG;QACI,KAAQ,CAAA,QAAA,GAAG,UAAC,KAAe,EAAA;AAChC,YAAA,IAAM,KAAK,GAAqB;gBAC9B,MAAM,EAAE,KAAK,CAAC,MAAM;aACrB,CAAA;YAED,IAAI,KAAK,CAAC,WAAW;gBAAE,KAAK,CAAC,WAAW,GAAG,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,WAAW,CAAC,CAAA;YAC5E,IAAI,KAAK,CAAC,OAAO;gBAAE,KAAK,CAAC,OAAO,GAAG,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;YAChE,IAAI,KAAK,CAAC,QAAQ;gBAAE,KAAK,CAAC,QAAQ,GAAG,KAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;YAC1E,IAAI,KAAK,CAAC,MAAM;AAAE,gBAAA,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAA;YAC7C,IAAI,KAAK,CAAC,MAAM,EAAE;AAChB,gBAAA,IAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM;AAC7B,sBAAE,SAAU,CAAA,MAAA,CAAA,KAAK,CAAC,MAAM,CAAC,MAAM,CAAE;sBAC/B,QAAQ,CAAA;gBAEZ,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAA;AAC9B,aAAA;AACD,YAAA,IAAI,KAAK,CAAC,OAAO,YAAY,IAAI,EAAE;AACjC,gBAAA,KAAK,CAAC,yBAAyB,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,CAAA;AAC/E,aAAA;AAAM,iBAAA;AACL,gBAAA,KAAK,CAAC,SAAS,CAAC,GAAG,KAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;AACxD,aAAA;YAED,OAAO,KAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAA;AAC1C,SAAC,CAAA;AAED;;;;AAIG;AACI,QAAA,KAAA,CAAA,MAAM,GAAG,YAAA;AACd,YAAA,IAAM,MAAM,GAAA,aAAA,CAAA;gBACV,KAAI;eACD,KAAI,CAAC,gBAAgB,EAAA,IAAA,CACzB,CAAA;AAED,YAAA,IAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,UAAC,UAAoB,EAAE,QAAmB,EAAK,EAAA,OAAA,aAAA,CAAA,aAAA,CAAA,aAAA,CAAA,aAAA,CAAA,aAAA,CAAA,EAAA,EACxE,UAAU,EAAA,IAAA,CAAA,EAAA;gBACb,cAAc;AACX,aAAA,EAAA,KAAA,CAAA,EAAA,QAAQ,CAAC,UAAU,EAAA,IAAA,CAAA,EACnB,QAAQ,CAAC,OAAO,EAAE,EAAA,IAAA,CAAA,EAAA;gBACrB,YAAY;wBACb,EAAE,EAAE,CAAC,CAAA;YAEN,OAAO,aAAA,CAAA,aAAA,CAAA;gBACL,iBAAiB;gBACjB,aAAa;eACV,OAAO,EAAA,IAAA,CAAA,EAAA;AACV,gBAAA,SAAA,CAAA,MAAA,CAAU,GAAG,CAAC,SAAS,EAAE,CAAE;gBAC3B,eAAe;sBACf,IAAI,CAAC,IAAI,CAAC,CAAA;AACd,SAAC,CAAA;QA7MC,KAAI,CAAC,gBAAgB,EAAE,CAAA;;KACxB;IA6MH,OAAC,SAAA,CAAA;AAAD,CA1NA,CAAuC,YAAY,CA0NlD;;;;"} \ No newline at end of file diff --git a/dist/rollup.config.d.ts b/dist/rollup.config.d.ts new file mode 100644 index 0000000..3b629ea --- /dev/null +++ b/dist/rollup.config.d.ts @@ -0,0 +1,3 @@ +import { RollupOptions } from 'rollup'; +declare const options: RollupOptions[]; +export default options; diff --git a/dist/src/CalendarBase.d.ts b/dist/src/CalendarBase.d.ts new file mode 100644 index 0000000..65b59a5 --- /dev/null +++ b/dist/src/CalendarBase.d.ts @@ -0,0 +1,65 @@ +import ICalendarBase from './types/ICalendarBase'; +import CalendarRecurrence from './types/CalendarRecurrence'; +import CalendarOptions from './types/CalendarOptions'; +import CalendarAttendee from './types/CalendarAttendee'; +/** + * Base calendar class. This class can be extended to add new calendar services. + */ +declare abstract class CalendarBase implements ICalendarBase { + /** True if the event is one that spans the entire day. */ + protected isAllDay: boolean; + /** Event description. */ + protected description: string; + /** Event title. */ + protected title: string; + /** Event physical location. */ + protected location: string; + /** Start time of the event. */ + protected start: Date; + /** End time of the event. */ + protected end: Date; + /** Event recurrence specification. See {@link CalendarRecurrence} */ + protected recurrence?: CalendarRecurrence; + /** Calendar service query string params. */ + protected params: Record; + /** Array of event attendees. See {@link CalendarAttendee} */ + protected attendees: CalendarAttendee[]; + /** + * Constructor. + * + * @param {CalendarOptions} options + */ + constructor(options: CalendarOptions); + /** + * Sets the description, title and location. + * + * @param {CalendarOptions} options + */ + protected setText: (options: CalendarOptions) => void; + /** + * Sets the time and recurrence parameters. + * + * @param {CalendarOptions} options + */ + protected setTimestamps: (options: CalendarOptions) => void; + /** + * Sets the attendees array if attendees are supplied. + * + * @param {CalendarOptions} options + */ + protected setAttendees(options: CalendarOptions): void; + /** + * Sets additional calendar service properties. + * May be used to override existing query string params if necessary. + * + * @param {string} key + * @param {string | null} value + * @returns {CalendarBase} + */ + setParam: (key: string, value: string | null) => this; + /** Sets base query string/ICS params. */ + protected abstract setInitialParams(): void; + /** Renders the URL/ICS file data. */ + abstract render(): string; +} +export default CalendarBase; diff --git a/dist/src/GoogleCalendar.d.ts b/dist/src/GoogleCalendar.d.ts new file mode 100644 index 0000000..f35ff4f --- /dev/null +++ b/dist/src/GoogleCalendar.d.ts @@ -0,0 +1,18 @@ +import CalendarBase from './CalendarBase'; +import CalendarOptions from './types/CalendarOptions'; +/** + * Generates a Google Calendar url. + */ +export default class GoogleCalendar extends CalendarBase { + constructor(opts: CalendarOptions); + /** + * Sets the basic properties for the calendar instance. + */ + protected setInitialParams: () => void; + /** + * Generates the Google Calendar url. + * + * @returns {string} + */ + render: () => string; +} diff --git a/dist/src/ICalendar.d.ts b/dist/src/ICalendar.d.ts new file mode 100644 index 0000000..2633320 --- /dev/null +++ b/dist/src/ICalendar.d.ts @@ -0,0 +1,77 @@ +import CalendarBase from './CalendarBase'; +import CalendarOptions from './types/CalendarOptions'; +import ICSAlarm from './types/ICSAlarm'; +import ICSPropertyValue from './types/ICSPropertyValue'; +/** + * Renders ICS file content. + */ +export default class ICalendar extends CalendarBase { + /** List of additional ICalendar events to add. */ + private additionalEvents; + /** List of VEVENT property-value entries */ + properties: string[]; + /** Key-value pair of basic calendar properties. */ + private meta; + constructor(opts: CalendarOptions); + /** + * Sets the basic properties for the calendar instance. + */ + protected setInitialParams: () => void; + /** + * Generates the ATTENDEE property param based on user-specified options and the attendee name. + * + * @param {ICSAttendeeOptions} options + * @param {string} name + * @returns {string} + */ + private getAttendeeParams; + /** + * Generates a valid ICS alarm duration. + * + * @example getAlarmDuration({ minutes: 3, seconds: 2 }) -> PT3M2S + * @param {ICSDuration} duration + * @returns {string} + */ + private getAlarmDuration; + /** + * Returns the iCalendar meta properties, formatted as VEVENT entry lines. + * + * @returns {string[]} + */ + getMeta: () => string[]; + /** + * Sets iCalendar meta properties, such as UID, DTSTAMP, etc. + * + * @param {string} key + * @param {string} value + * @returns {ICalendar} + */ + setMeta: (key: string, value: string) => this; + /** + * Adds the given event to the same `.ics` file instance. + * + * @param {ICalendar} event + * @returns {ICalendar} + */ + addEvent: (event: ICalendar) => this; + /** + * Adds any additional desired iCalendar property having the given key-value pair to the instance. + * + * @param {Alarm} alarm + * @returns {ICalendar} + */ + addProperty: (key: string, value: ICSPropertyValue) => this; + /** + * Adds an alarm. Multiple different alarms may be added to a single instance. + * + * @param {Alarm} alarm + * @returns {ICalendar} + */ + addAlarm: (alarm: ICSAlarm) => this; + /** + * Generates the iCalendar data. + * + * @returns {string} + */ + render: () => string; +} diff --git a/dist/src/OutlookCalendar.d.ts b/dist/src/OutlookCalendar.d.ts new file mode 100644 index 0000000..2aadc9c --- /dev/null +++ b/dist/src/OutlookCalendar.d.ts @@ -0,0 +1,29 @@ +import CalendarBase from './CalendarBase'; +import CalendarOptions from './types/CalendarOptions'; +/** + * Generates an Outlook Calendar url. + * + * @remark Outlook Calendar's query string params do not support recurrence. + */ +export default class OutlookCalendar extends CalendarBase { + /** Base URL for the host service. */ + private baseUrl; + constructor(opts: CalendarOptions); + /** + * Sets the basic properties for the calendar instance. + */ + protected setInitialParams: () => void; + /** + * Sets the host service type. The default host for Outlook is **`live`**. + * + * @param {string} host - `live` (for personal accounts) or `office` (for Office365) + * @returns {OutlookCalendar} + */ + setHost: (host: string) => this; + /** + * Generates the Outlook url. + * + * @returns {string} + */ + render: () => string; +} diff --git a/dist/src/YahooCalendar.d.ts b/dist/src/YahooCalendar.d.ts new file mode 100644 index 0000000..4df5c5e --- /dev/null +++ b/dist/src/YahooCalendar.d.ts @@ -0,0 +1,24 @@ +import CalendarBase from './CalendarBase'; +import CalendarOptions from './types/CalendarOptions'; +/** + * Generates a Yahoo! Calendar url. + * + * @remark Yahoo! Calendar's support for recurrence is limited to only the interval and frequency. + */ +export default class YahooCalendar extends CalendarBase { + constructor(opts: CalendarOptions); + /** + * Sets the basic properties for the calendar instance. + */ + protected setInitialParams: () => void; + /** + * Sets the start/end/allday parameters. + */ + private setTimeParams; + /** + * Generates the Yahoo! Calendar data. + * + * @returns {string} + */ + render: () => string; +} diff --git a/dist/src/constants.d.ts b/dist/src/constants.d.ts new file mode 100644 index 0000000..c9fd1fb --- /dev/null +++ b/dist/src/constants.d.ts @@ -0,0 +1,22 @@ +export declare const RECURRENCE: { + FREQUENCY: { + DAILY: string; + WEEKLY: string; + MONTHLY: string; + YEARLY: string; + }; +}; +export declare const FORMAT: { + DATE: string; + TIME: string; + FULL: string; + NO_UTC_FULL: string; + OUTLOOK_DATE: string; + OUTLOOK_TIME: string; + OUTLOOK_FULL: string; +}; +export declare const URL: { + YAHOO: string; + GOOGLE: string; + OUTLOOK: string; +}; diff --git a/dist/src/index.d.ts b/dist/src/index.d.ts new file mode 100644 index 0000000..211dd1e --- /dev/null +++ b/dist/src/index.d.ts @@ -0,0 +1,11 @@ +export { default as CalendarBase } from './CalendarBase'; +export { default as GoogleCalendar } from './GoogleCalendar'; +export { default as YahooCalendar } from './YahooCalendar'; +export { default as OutlookCalendar } from './OutlookCalendar'; +export { default as ICalendar } from './ICalendar'; +export { default as CalendarOptions } from './types/CalendarOptions'; +export { default as CalendarRecurrence } from './types/CalendarRecurrence'; +export { default as ICSAlarm } from './types/ICSAlarm'; +export { default as ICSAttachment } from './types/ICSAttachment'; +export { default as ICSDuration } from './types/ICSDuration'; +export { default as ICSPropertyValue } from './types/ICSPropertyValue'; diff --git a/dist/src/types/CalendarAttendee.d.ts b/dist/src/types/CalendarAttendee.d.ts new file mode 100644 index 0000000..a56a428 --- /dev/null +++ b/dist/src/types/CalendarAttendee.d.ts @@ -0,0 +1,13 @@ +import ICSAttendeeOptions from './ICSAttendeeOptions'; +/** + * Basic Attendee Object + */ +type CalendarAttendee = { + /** The attendee's email address */ + email: string; + /** The attendee's name (optional) */ + name?: string; + /** Advanced options for use with ics format (optional). See {@link ICSAttendeeOptions}. */ + icsOptions?: ICSAttendeeOptions; +}; +export default CalendarAttendee; diff --git a/dist/src/types/CalendarOptions.d.ts b/dist/src/types/CalendarOptions.d.ts new file mode 100644 index 0000000..2a0b62f --- /dev/null +++ b/dist/src/types/CalendarOptions.d.ts @@ -0,0 +1,22 @@ +import CalendarRecurrence from './CalendarRecurrence'; +import CalendarAttendee from './CalendarAttendee'; +/** + * Basic config options. + */ +type CalendarOptions = { + /** The event description. */ + description?: string; + /** The event title (i.e., summary). */ + title?: string; + /** A summary description of the event location. */ + location?: string; + /** The event start timestamp. */ + start: Date; + /** The event end timestamp. For all-day events, this field should be omitted. */ + end?: Date; + /** The recurrence of an event is how often the event is supposed to occur. See {@link CalendarRecurrence}. */ + recurrence?: CalendarRecurrence; + /** An array of attendee objects, representing people who will be invited to the event (optional). See {@link CalendarAttendee}. */ + attendees?: Array; +}; +export default CalendarOptions; diff --git a/dist/src/types/CalendarRecurrence.d.ts b/dist/src/types/CalendarRecurrence.d.ts new file mode 100644 index 0000000..0ca6b62 --- /dev/null +++ b/dist/src/types/CalendarRecurrence.d.ts @@ -0,0 +1,22 @@ +/** + * Recurrence config options. + */ +type CalendarRecurrence = { + /** The Julian interval of how often this event should occur. */ + frequency?: string; + /** The amount of time that will occur between recurrences. The scale of the time depends on {@link CalendarRecurrence.frequency}. */ + interval?: number; + /** The maximum number of times the event should repeat. */ + count?: number; + /** The latest date that this event may occur on. */ + end?: Date; + /** The day of the week to denote when the the week starts on. */ + weekstart?: string; + /** The days of the week that the event should occur on. */ + weekdays?: string[]; + /** The days of the month that the event should occur on. */ + monthdays?: number[]; + /** The month number (1-12) of the annual recurrence. */ + month?: number; +}; +export default CalendarRecurrence; diff --git a/dist/src/types/ICSAlarm.d.ts b/dist/src/types/ICSAlarm.d.ts new file mode 100644 index 0000000..9511685 --- /dev/null +++ b/dist/src/types/ICSAlarm.d.ts @@ -0,0 +1,22 @@ +import ICSAttachment from './ICSAttachment'; +import ICSDuration from './ICSDuration'; +/** + * Event alarm/reminder configuration. + */ +type ICSAlarm = { + /** Determines how the alarm will behave. */ + action: string; + /** When to trigger the alarm. This can be an {@link ICSDuration} object representing the time to display before or after an event, or a valid Date reference. */ + trigger: ICSDuration | Date; + /** The full description for the alarm. */ + description?: string; + /** The short summary for the alarm. */ + summary?: string; + /** The number of times to repeat the alarm. */ + repeat?: number; + /** How long the alarm should be present for. */ + duration?: ICSDuration; + /** Optional file to attach to the alarm. See {@link https://www.kanzaki.com/docs/ical/attach.html} for more info. */ + attach?: ICSAttachment; +}; +export default ICSAlarm; diff --git a/dist/src/types/ICSAttachment.d.ts b/dist/src/types/ICSAttachment.d.ts new file mode 100644 index 0000000..5d3281d --- /dev/null +++ b/dist/src/types/ICSAttachment.d.ts @@ -0,0 +1,11 @@ +/** + * Optional file to attach to the alarm. + * See {@link https://www.kanzaki.com/docs/ical/attach.html} for more info. + */ +type ICSAttachment = { + /** iCalendar file attachment properties. */ + params?: string; + /** URL to the file attachment. */ + url: string; +}; +export default ICSAttachment; diff --git a/dist/src/types/ICSAttendeeOptions.d.ts b/dist/src/types/ICSAttendeeOptions.d.ts new file mode 100644 index 0000000..2c0de4b --- /dev/null +++ b/dist/src/types/ICSAttendeeOptions.d.ts @@ -0,0 +1,16 @@ +/** + * Advanced attendee options for use with the ICS format. + */ +type ICSAttendeeOptions = { + /** The participation status (RFC-2445 value) of the attendee. */ + partStat?: string; + /** The participation role (RFC-2445 value) of the attendee. */ + role?: string; + /** Whether or not the attendee is RSVP'd to the event. */ + rsvp?: boolean; + /** The delegatee of the attendee request. See {@link https://www.kanzaki.com/docs/ical/delegatedFrom.html} for more info. */ + delegatedFrom?: string; + /** The event sender. See {@link https://www.kanzaki.com/docs/ical/sentBy.html} for more info. */ + sentBy?: string; +}; +export default ICSAttendeeOptions; diff --git a/dist/src/types/ICSDuration.d.ts b/dist/src/types/ICSDuration.d.ts new file mode 100644 index 0000000..58b92c8 --- /dev/null +++ b/dist/src/types/ICSDuration.d.ts @@ -0,0 +1,19 @@ +/** + * Represents timespans before or after an iCalendar event date. + * They can be used to trigger alarms. + */ +type ICSDuration = { + /** If `true`, sets the duration to be after the event date. Otherwise, it defaults to before the date (a negative duration). */ + after?: boolean; + /** The number of weeks the duration spans. */ + weeks?: number; + /** The number of days the duration spans. */ + days?: number; + /** The number of hours the duration spans. */ + hours?: number; + /** The number of minutes the duration spans. */ + minutes?: number; + /** The number of seconds the duration spans. */ + seconds?: number; +}; +export default ICSDuration; diff --git a/dist/src/types/ICSPropertyValue.d.ts b/dist/src/types/ICSPropertyValue.d.ts new file mode 100644 index 0000000..663681b --- /dev/null +++ b/dist/src/types/ICSPropertyValue.d.ts @@ -0,0 +1,5 @@ +/** + * The property value for an iCalendar entry. + */ +type ICSPropertyValue = Record | string | number; +export default ICSPropertyValue; diff --git a/dist/src/types/ICalendarBase.d.ts b/dist/src/types/ICalendarBase.d.ts new file mode 100644 index 0000000..78794d2 --- /dev/null +++ b/dist/src/types/ICalendarBase.d.ts @@ -0,0 +1,8 @@ +/** + * CalendarBase properties + */ +interface ICalendarBase { + /** Renders the calendar URL or content. */ + render(): string; +} +export default ICalendarBase; diff --git a/dist/src/utils/data.d.ts b/dist/src/utils/data.d.ts new file mode 100644 index 0000000..6135974 --- /dev/null +++ b/dist/src/utils/data.d.ts @@ -0,0 +1,9 @@ +import CalendarAttendee from '../types/CalendarAttendee'; +declare const _default: { + toParamString: (params: Record, delimiter?: string, transformFn?: (s: string) => string) => string; + toQueryString: (params: Record) => string; + toIcsParamString: (params: Record) => string; + toMailtoList: (attendees: CalendarAttendee[]) => string[]; + toProperCase: (s: string) => string; +}; +export default _default; diff --git a/dist/src/utils/ics.d.ts b/dist/src/utils/ics.d.ts new file mode 100644 index 0000000..baf5006 --- /dev/null +++ b/dist/src/utils/ics.d.ts @@ -0,0 +1,8 @@ +import CalendarRecurrence from '../types/CalendarRecurrence'; +declare const _default: { + formatText: (str?: string) => string; + getUid: () => string; + getProdId: () => string; + getRrule: (recurrence: CalendarRecurrence) => string; +}; +export default _default; diff --git a/dist/src/utils/time.d.ts b/dist/src/utils/time.d.ts new file mode 100644 index 0000000..a56d31e --- /dev/null +++ b/dist/src/utils/time.d.ts @@ -0,0 +1,12 @@ +import CalendarRecurrence from '../types/CalendarRecurrence'; +declare const _default: { + addLeadingZero: (n?: string | number) => string; + getDuration: (start: number, end: number) => string; + getHoursDiff: (start: number, end: number) => number; + getRecurrenceLengthDays: (recurrence: CalendarRecurrence) => number; + formatDate: (d: Date | undefined, format: string) => string; + formatDateNoUtc: (d: Date | undefined, format: string) => string; + getTimeCreated: () => string; + incrementDate: (dateInput: Date, days: number) => Date; +}; +export default _default; diff --git a/docs/api/outlook.md b/docs/api/outlook.md index bbe8d52..f533b14 100644 --- a/docs/api/outlook.md +++ b/docs/api/outlook.md @@ -68,7 +68,7 @@ outlookCalendar.render() #### Result: ``` -https://outlook.live.com/calendar/0/deeplink/compose?path=%2Fcalendar%2Faction%2Fcompose&rru=addevent&startdt=2022-07-08T19%3A00%3A00&enddt=2022-07-08T23%3A00%3A00&subject=Happy%20Hour&body=Let's%20blow%20off%20some%20steam%20with%20a%20tall%20cold%20one!&location=The%20Bar%2C%20New%20York%2C%20NY&isAllDay=false +https://outlook.live.com/calendar/action/compose?path=%2Fcalendar%2Faction%2Fcompose&rru=addevent&startdt=2022-07-08T19%3A00%3A00&enddt=2022-07-08T23%3A00%3A00&subject=Happy%20Hour&body=Let's%20blow%20off%20some%20steam%20with%20a%20tall%20cold%20one!&location=The%20Bar%2C%20New%20York%2C%20NY&isAllDay=false ``` This will open a modal in Outlook Online calendar similar to the following: diff --git a/src/constants.ts b/src/constants.ts index ea976df..23d6f63 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -20,5 +20,5 @@ export const FORMAT = { export const URL = { YAHOO: 'https://calendar.yahoo.com/', GOOGLE: 'https://calendar.google.com/calendar/render', - OUTLOOK: 'https://outlook.{{host}}.com/calendar/0/deeplink/compose' + OUTLOOK: 'https://outlook.{{host}}.com/calendar/action/compose' }