ical-generator 9.0.1-develop.9 → 10.0.0-develop.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +5 -5
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +7 -7
- package/dist/index.js.map +1 -1
- package/package.json +18 -18
- package/src/alarm.ts +1 -1
- package/src/attendee.ts +2 -8
- package/src/event.ts +1 -1
- package/src/tools.ts +3 -0
- package/src/types.ts +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/types.ts","../src/tools.ts","../src/attendee.ts","../src/alarm.ts","../src/category.ts","../src/event.ts","../src/calendar.ts"],"sourcesContent":["/**\n * ical-generator entrypoint\n */\n\n'use strict';\n\nimport ICalCalendar, { type ICalCalendarData } from './calendar.ts';\n\n/**\n * Create a new, empty calendar and returns it.\n *\n * ```javascript\n * import ical from 'ical-generator';\n *\n * // or use require:\n * // const { default: ical } = require('ical-generator');\n *\n * const cal = ical();\n * ```\n *\n * You can pass options to setup your calendar or use setters to do this.\n *\n * ```javascript\n * import ical from 'ical-generator';\n *\n * // or use require:\n * // const { default: ical } = require('ical-generator');\n * const cal = ical({domain: 'sebbo.net'});\n *\n * // is the same as\n *\n * const cal = ical().domain('sebbo.net');\n *\n * // is the same as\n *\n * const cal = ical();\n * cal.domain('sebbo.net');\n * ```\n *\n * @param data Calendar data\n */\nfunction ical(data?: ICalCalendarData): ICalCalendar {\n return new ICalCalendar(data);\n}\n\nexport default ical;\n\nexport {\n default as ICalAlarm,\n type ICalAlarmBaseData,\n type ICalAlarmData,\n type ICalAlarmJSONData,\n ICalAlarmRelatesTo,\n type ICalAlarmRepeatData,\n type ICalAlarmTriggerAfterData,\n type ICalAlarmTriggerBeforeData,\n type ICalAlarmTriggerData,\n ICalAlarmType,\n type ICalAlarmTypeValue,\n type ICalAttachment,\n} from './alarm.ts';\n\nexport {\n default as ICalAttendee,\n type ICalAttendeeData,\n type ICalAttendeeJSONData,\n ICalAttendeeRole,\n type ICalAttendeeScheduleAgent,\n ICalAttendeeStatus,\n ICalAttendeeType,\n} from './attendee.ts';\n\nexport {\n default as ICalCalendar,\n type ICalCalendarData,\n type ICalCalendarJSONData,\n ICalCalendarMethod,\n type ICalCalendarProdIdData,\n} from './calendar.ts';\n\nexport {\n default as ICalCategory,\n type ICalCategoryData,\n type ICalCategoryJSONData,\n} from './category.ts';\n\nexport {\n default as ICalEvent,\n ICalEventBusyStatus,\n ICalEventClass,\n type ICalEventData,\n type ICalEventJSONData,\n type ICalEventJSONRepeatingData,\n ICalEventStatus,\n ICalEventTransparency,\n} from './event.ts';\n\nexport { escape, foldLines, formatDate, formatDateTZ } from './tools.ts';\n\nexport {\n type ICalDateTimeValue,\n type ICalDayJsStub,\n type ICalDescription,\n ICalEventRepeatingFreq,\n type ICalGeo,\n type ICalLocation,\n type ICalLocationWithoutTitle,\n type ICalLocationWithTitle,\n type ICalLuxonDateTimeStub,\n type ICalMomentDurationStub,\n type ICalMomentStub,\n type ICalMomentTimezoneStub,\n type ICalOrganizer,\n type ICalRepeatingOptions,\n type ICalRRuleStub,\n type ICalTimezone,\n type ICalTZDateStub,\n ICalWeekday,\n} from './types.ts';\n","export enum ICalEventRepeatingFreq {\n DAILY = 'DAILY',\n HOURLY = 'HOURLY',\n MINUTELY = 'MINUTELY',\n MONTHLY = 'MONTHLY',\n SECONDLY = 'SECONDLY',\n WEEKLY = 'WEEKLY',\n YEARLY = 'YEARLY',\n}\n\nexport enum ICalWeekday {\n FR = 'FR',\n MO = 'MO',\n SA = 'SA',\n SU = 'SU',\n TH = 'TH',\n TU = 'TU',\n WE = 'WE',\n}\n\n/**\n * ical-generator supports [native Date](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date),\n * [moment.js](https://momentjs.com/) (and [moment-timezone](https://momentjs.com/timezone/), [Day.js](https://day.js.org/en/) and\n * [Luxon](https://moment.github.io/luxon/)'s [DateTime](https://moment.github.io/luxon/docs/class/src/datetime.js~DateTime.html)\n * objects. You can also pass a string which is then passed to javascript's Date internally.\n */\nexport type ICalDateTimeValue =\n | Date\n | ICalDayJsStub\n | ICalLuxonDateTimeStub\n | ICalMomentStub\n | ICalMomentTimezoneStub\n | string;\n\nexport interface ICalDayJsStub {\n format(format?: string): string;\n isValid(): boolean;\n toDate(): Date;\n toJSON(): string;\n tz(zone?: string): ICalDayJsStub;\n utc(): ICalDayJsStub;\n}\n\nexport interface ICalDescription {\n html?: string;\n plain: string;\n}\n\nexport interface ICalGeo {\n lat: number;\n lon: number;\n}\n\nexport type ICalLocation = ICalLocationWithoutTitle | ICalLocationWithTitle;\n\nexport interface ICalLocationWithoutTitle {\n geo: ICalGeo;\n}\n\nexport interface ICalLocationWithTitle {\n address?: string;\n geo?: ICalGeo;\n radius?: number;\n title: string;\n}\n\nexport interface ICalLuxonDateTimeStub {\n get isValid(): boolean;\n setZone(zone?: string): ICalLuxonDateTimeStub;\n toFormat(fmt: string): string;\n toJSDate(): Date;\n toJSON(): null | string;\n zone: { type: string };\n}\n\nexport interface ICalMomentDurationStub {\n asSeconds(): number;\n}\n\nexport interface ICalMomentStub {\n clone(): ICalMomentStub;\n format(format?: string): string;\n isValid(): boolean;\n toDate(): Date;\n toJSON(): string;\n utc(): ICalMomentStub;\n}\n\nexport interface ICalMomentTimezoneStub extends ICalMomentStub {\n clone(): ICalMomentTimezoneStub;\n tz(): string | undefined;\n tz(timezone: string): ICalMomentTimezoneStub;\n utc(): ICalMomentTimezoneStub;\n}\n\nexport interface ICalOrganizer {\n email?: string;\n mailto?: string;\n name: string;\n sentBy?: string;\n}\n\nexport interface ICalRepeatingOptions {\n byDay?: ICalWeekday | ICalWeekday[];\n byMonth?: number | number[];\n byMonthDay?: number | number[];\n bySetPos?: number | number[];\n count?: number;\n exclude?: ICalDateTimeValue | ICalDateTimeValue[];\n freq: ICalEventRepeatingFreq;\n interval?: number;\n startOfWeek?: ICalWeekday;\n until?: ICalDateTimeValue;\n}\n\nexport interface ICalRRuleStub {\n between(\n after: Date,\n before: Date,\n inc?: boolean,\n iterator?: (d: Date, len: number) => boolean,\n ): Date[];\n toString(): string;\n}\n\nexport interface ICalTimezone {\n generator?: (timezone: string) => null | string;\n name: null | string;\n}\n\nexport interface ICalTZDateStub extends Date {\n timeZone?: string;\n withTimeZone(timezone?: null | string): ICalTZDateStub;\n}\n","'use strict';\n\nimport {\n type ICalDateTimeValue,\n type ICalDayJsStub,\n type ICalLuxonDateTimeStub,\n type ICalMomentDurationStub,\n type ICalMomentStub,\n type ICalMomentTimezoneStub,\n type ICalOrganizer,\n type ICalRRuleStub,\n type ICalTZDateStub,\n} from './types.ts';\n\nexport function addOrGetCustomAttributes(\n data: { x: [string, string][] },\n keyOrArray:\n | [string, string][]\n | Record<string, string>\n | { key: string; value: string }[],\n): void;\n\nexport function addOrGetCustomAttributes(\n data: { x: [string, string][] },\n keyOrArray: string,\n value: string,\n): void;\n\nexport function addOrGetCustomAttributes(data: {\n x: [string, string][];\n}): { key: string; value: string }[];\n\nexport function addOrGetCustomAttributes(\n data: { x: [string, string][] },\n keyOrArray?:\n | [string, string][]\n | Record<string, string>\n | string\n | undefined\n | { key: string; value: string }[],\n value?: string | undefined,\n): void | { key: string; value: string }[] {\n if (Array.isArray(keyOrArray)) {\n data.x = keyOrArray.map(\n (o: [string, string] | { key: string; value: string }) => {\n if (Array.isArray(o)) {\n return o;\n }\n if (typeof o.key !== 'string' || typeof o.value !== 'string') {\n throw new Error('Either key or value is not a string!');\n }\n if (o.key.substr(0, 2) !== 'X-') {\n throw new Error('Key has to start with `X-`!');\n }\n\n return [o.key, o.value] as [string, string];\n },\n );\n } else if (typeof keyOrArray === 'object') {\n data.x = Object.entries(keyOrArray).map(([key, value]) => {\n if (typeof key !== 'string' || typeof value !== 'string') {\n throw new Error('Either key or value is not a string!');\n }\n if (key.substr(0, 2) !== 'X-') {\n throw new Error('Key has to start with `X-`!');\n }\n\n return [key, value];\n });\n } else if (typeof keyOrArray === 'string' && typeof value === 'string') {\n if (keyOrArray.substr(0, 2) !== 'X-') {\n throw new Error('Key has to start with `X-`!');\n }\n\n data.x.push([keyOrArray, value]);\n } else {\n return data.x.map((a) => ({\n key: a[0],\n value: a[1],\n }));\n }\n}\n\n/**\n * Checks if the given input is a valid date and\n * returns the internal representation (= moment object)\n */\nexport function checkDate(\n value: ICalDateTimeValue,\n attribute: string,\n): ICalDateTimeValue {\n // Date & String\n if (\n (value instanceof Date && isNaN(value.getTime())) ||\n (typeof value === 'string' && isNaN(new Date(value).getTime()))\n ) {\n throw new Error(`\\`${attribute}\\` has to be a valid date!`);\n }\n if (value instanceof Date || typeof value === 'string') {\n return value;\n }\n\n // Luxon\n if (isLuxonDate(value) && value.isValid === true) {\n return value;\n }\n\n // Moment / Moment Timezone\n if ((isMoment(value) || isDayjs(value)) && value.isValid()) {\n return value;\n }\n\n throw new Error(`\\`${attribute}\\` has to be a valid date!`);\n}\n/**\n * Checks if the given string `value` is a\n * valid one for the type `type`\n */\nexport function checkEnum(\n type: Record<string, string>,\n value: unknown,\n): unknown {\n const allowedValues = Object.values(type);\n const valueStr = String(value).toUpperCase();\n\n if (!valueStr || !allowedValues.includes(valueStr)) {\n throw new Error(\n `Input must be one of the following: ${allowedValues.join(', ')}`,\n );\n }\n\n return valueStr;\n}\n/**\n * Check the given string or ICalOrganizer. Parses\n * the string for name and email address if possible.\n *\n * @param attribute Attribute name for error messages\n * @param value Value to parse name/email from\n */\nexport function checkNameAndMail(\n attribute: string,\n value: ICalOrganizer | string,\n): ICalOrganizer {\n let result: ICalOrganizer | null = null;\n\n if (typeof value === 'string') {\n const match = value.match(/^(.+) ?<([^>]+)>$/);\n if (match) {\n result = {\n email: match[2].trim(),\n name: match[1].trim(),\n };\n } else if (value.includes('@')) {\n result = {\n email: value.trim(),\n name: value.trim(),\n };\n }\n } else if (typeof value === 'object') {\n result = {\n email: value.email,\n mailto: value.mailto,\n name: value.name,\n sentBy: value.sentBy,\n };\n }\n\n if (!result && typeof value === 'string') {\n throw new Error(\n '`' +\n attribute +\n \"` isn't formated correctly. See https://sebbo2002.github.io/ical-generator/develop/\" +\n 'reference/interfaces/ICalOrganizer.html',\n );\n } else if (!result) {\n throw new Error(\n '`' +\n attribute +\n '` needs to be a valid formed string or an object. See https://sebbo2002.github.io/' +\n 'ical-generator/develop/reference/interfaces/ICalOrganizer.html',\n );\n }\n\n if (!result.name) {\n throw new Error('`' + attribute + '.name` is empty!');\n }\n\n return result;\n}\n/**\n * Escapes special characters in the given string\n */\nexport function escape(str: string | unknown, inQuotes: boolean): string {\n return String(str)\n .replace(inQuotes ? /[\\\\\"]/g : /[\\\\;,]/g, function (match) {\n return '\\\\' + match;\n })\n .replace(/(?:\\r\\n|\\r|\\n)/g, '\\\\n');\n}\n\n/**\n * Trim line length of given string\n */\nexport function foldLines(input: string): string {\n return input\n .split('\\r\\n')\n .map(function (line) {\n let result = '';\n let c = 0;\n for (let i = 0; i < line.length; i++) {\n let ch = line.charAt(i);\n\n // surrogate pair, see https://mathiasbynens.be/notes/javascript-encoding#surrogate-pairs\n if (ch >= '\\ud800' && ch <= '\\udbff') {\n ch += line.charAt(++i);\n }\n\n // TextEncoder is available in browsers and node.js >= 11.0.0\n const charsize = new TextEncoder().encode(ch).length;\n c += charsize;\n if (c > 74) {\n result += '\\r\\n ';\n c = charsize;\n }\n\n result += ch;\n }\n return result;\n })\n .join('\\r\\n');\n}\n\n/**\n * Converts a valid date/time object supported by this library to a string.\n */\nexport function formatDate(\n timezone: null | string,\n d: ICalDateTimeValue,\n dateonly?: boolean,\n floating?: boolean,\n): string {\n if (timezone?.startsWith('/')) {\n timezone = timezone.substr(1);\n }\n\n if (typeof d === 'string' || d instanceof Date) {\n // TZDate is an extension of the native Date object.\n // @see https://github.com/date-fns/tz for more information.\n const m = isTZDate(d) ? d.withTimeZone(timezone) : new Date(d);\n\n // (!dateonly && !floating) || !timezone => utc\n let s =\n m.getUTCFullYear() +\n String(m.getUTCMonth() + 1).padStart(2, '0') +\n m.getUTCDate().toString().padStart(2, '0');\n\n // (dateonly || floating) && timezone => tz\n if (timezone) {\n s =\n m.getFullYear() +\n String(m.getMonth() + 1).padStart(2, '0') +\n m.getDate().toString().padStart(2, '0');\n }\n\n if (dateonly) {\n return s;\n }\n\n if (timezone) {\n s +=\n 'T' +\n m.getHours().toString().padStart(2, '0') +\n m.getMinutes().toString().padStart(2, '0') +\n m.getSeconds().toString().padStart(2, '0');\n\n return s;\n }\n\n s +=\n 'T' +\n m.getUTCHours().toString().padStart(2, '0') +\n m.getUTCMinutes().toString().padStart(2, '0') +\n m.getUTCSeconds().toString().padStart(2, '0') +\n (floating ? '' : 'Z');\n\n return s;\n } else if (isMoment(d)) {\n // @see https://momentjs.com/timezone/docs/#/using-timezones/parsing-in-zone/\n const m = timezone\n ? isMomentTZ(d) && !d.tz()\n ? d.clone().tz(timezone)\n : d\n : floating || (dateonly && isMomentTZ(d) && d.tz())\n ? d\n : d.utc();\n\n return (\n m.format('YYYYMMDD') +\n (!dateonly\n ? 'T' + m.format('HHmmss') + (floating || timezone ? '' : 'Z')\n : '')\n );\n } else if (isLuxonDate(d)) {\n const m = timezone\n ? d.setZone(timezone)\n : floating || (dateonly && d.zone.type !== 'system')\n ? d\n : d.setZone('utc');\n\n return (\n m.toFormat('yyyyLLdd') +\n (!dateonly\n ? 'T' + m.toFormat('HHmmss') + (floating || timezone ? '' : 'Z')\n : '')\n );\n } else {\n // @see https://day.js.org/docs/en/plugin/utc\n\n let m = d;\n if (timezone) {\n m = typeof d.tz === 'function' ? d.tz(timezone) : d;\n } else if (floating) {\n // m = d;\n } else if (typeof d.utc === 'function') {\n m = d.utc();\n } else {\n throw new Error(\n 'Unable to convert dayjs object to UTC value: UTC plugin is not available!',\n );\n }\n\n return (\n m.format('YYYYMMDD') +\n (!dateonly\n ? 'T' + m.format('HHmmss') + (floating || timezone ? '' : 'Z')\n : '')\n );\n }\n}\n\n/**\n * Converts a valid date/time object supported by this library to a string.\n * For information about this format, see RFC 5545, section 3.3.5\n * https://tools.ietf.org/html/rfc5545#section-3.3.5\n */\nexport function formatDateTZ(\n timezone: null | string,\n property: string,\n date: Date | ICalDateTimeValue | string,\n eventData?: { floating?: boolean | null; timezone?: null | string },\n): string {\n let tzParam = '';\n let floating = eventData?.floating || false;\n\n if (eventData?.timezone) {\n tzParam = ';TZID=' + eventData.timezone;\n\n // This isn't a 'floating' event because it has a timezone;\n // but we use it to omit the 'Z' UTC specifier in formatDate()\n floating = true;\n }\n\n return (\n property + tzParam + ':' + formatDate(timezone, date, false, floating)\n );\n}\n\nexport function generateCustomAttributes(data: {\n x: [string, string][];\n}): string {\n const str = data.x\n .map(([key, value]) => key.toUpperCase() + ':' + escape(value, false))\n .join('\\r\\n');\n return str.length ? str + '\\r\\n' : '';\n}\n\nexport function isDayjs(value: ICalDateTimeValue): value is ICalDayJsStub {\n return (\n typeof value === 'object' &&\n value !== null &&\n !(value instanceof Date) &&\n !isMoment(value) &&\n !isLuxonDate(value)\n );\n}\n\nexport function isLuxonDate(\n value: ICalDateTimeValue,\n): value is ICalLuxonDateTimeStub {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'toJSDate' in value &&\n typeof value.toJSDate === 'function'\n );\n}\nexport function isMoment(value: ICalDateTimeValue): value is ICalMomentStub {\n // @ts-expect-error _isAMomentObject is a private property\n return value != null && value._isAMomentObject != null;\n}\nexport function isMomentDuration(\n value: unknown,\n): value is ICalMomentDurationStub {\n return (\n value !== null &&\n typeof value === 'object' &&\n 'asSeconds' in value &&\n typeof value.asSeconds === 'function'\n );\n}\nexport function isMomentTZ(\n value: ICalDateTimeValue,\n): value is ICalMomentTimezoneStub {\n return isMoment(value) && 'tz' in value && typeof value.tz === 'function';\n}\n\nexport function isRRule(value: unknown): value is ICalRRuleStub {\n return (\n value !== null &&\n typeof value === 'object' &&\n 'between' in value &&\n typeof value.between === 'function' &&\n typeof value.toString === 'function'\n );\n}\n\nexport function isTZDate(value: ICalDateTimeValue): value is ICalTZDateStub {\n return (\n value instanceof Date &&\n 'internal' in value &&\n value.internal instanceof Date &&\n 'withTimeZone' in value &&\n typeof value.withTimeZone === 'function' &&\n 'tzComponents' in value &&\n typeof value.tzComponents === 'function'\n );\n}\n\nexport function toDate(value: ICalDateTimeValue): Date {\n if (typeof value === 'string' || value instanceof Date) {\n return new Date(value);\n }\n\n if (isLuxonDate(value)) {\n return value.toJSDate();\n }\n\n return value.toDate();\n}\n\nexport function toDurationString(seconds: number): string {\n let string = '';\n\n // < 0\n if (seconds < 0) {\n string = '-';\n seconds *= -1;\n }\n\n string += 'P';\n\n // DAYS\n if (seconds >= 86400) {\n string += Math.floor(seconds / 86400) + 'D';\n seconds %= 86400;\n }\n if (!seconds && string.length > 1) {\n return string;\n }\n\n string += 'T';\n\n // HOURS\n if (seconds >= 3600) {\n string += Math.floor(seconds / 3600) + 'H';\n seconds %= 3600;\n }\n\n // MINUTES\n if (seconds >= 60) {\n string += Math.floor(seconds / 60) + 'M';\n seconds %= 60;\n }\n\n // SECONDS\n if (seconds > 0) {\n string += seconds + 'S';\n } else if (string.length <= 2) {\n string += '0S';\n }\n\n return string;\n}\n\nexport function toJSON(\n value: ICalDateTimeValue | null | undefined,\n): null | string | undefined {\n if (!value) {\n return null;\n }\n if (typeof value === 'string') {\n return value;\n }\n\n return value.toJSON();\n}\n","'use strict';\n\nimport type ICalAlarm from './alarm.ts';\nimport type ICalEvent from './event.ts';\n\nimport {\n addOrGetCustomAttributes,\n checkEnum,\n checkNameAndMail,\n escape,\n} from './tools.ts';\n\nexport enum ICalAttendeeRole {\n CHAIR = 'CHAIR',\n NON = 'NON-PARTICIPANT',\n OPT = 'OPT-PARTICIPANT',\n REQ = 'REQ-PARTICIPANT',\n}\n\n// ref: https://datatracker.ietf.org/doc/html/rfc6638#section-7.1\nexport enum ICalAttendeeScheduleAgent {\n CLIENT = 'CLIENT',\n NONE = 'NONE',\n SERVER = 'SERVER',\n}\n\nexport enum ICalAttendeeStatus {\n ACCEPTED = 'ACCEPTED',\n DECLINED = 'DECLINED',\n DELEGATED = 'DELEGATED',\n NEEDSACTION = 'NEEDS-ACTION',\n TENTATIVE = 'TENTATIVE',\n}\n\n// ref: https://tools.ietf.org/html/rfc2445#section-4.2.3\nexport enum ICalAttendeeType {\n GROUP = 'GROUP',\n INDIVIDUAL = 'INDIVIDUAL',\n RESOURCE = 'RESOURCE',\n ROOM = 'ROOM',\n UNKNOWN = 'UNKNOWN',\n}\nexport interface ICalAttendeeData {\n delegatedFrom?: ICalAttendee | ICalAttendeeData | null | string;\n delegatedTo?: ICalAttendee | ICalAttendeeData | null | string;\n delegatesFrom?: ICalAttendee | ICalAttendeeData | null | string;\n delegatesTo?: ICalAttendee | ICalAttendeeData | null | string;\n email: string;\n mailto?: null | string;\n name?: null | string;\n role?: ICalAttendeeRole;\n rsvp?: boolean | null;\n scheduleAgent?: ICalAttendeeScheduleAgent | ICalXName | null;\n sentBy?: null | string;\n status?: ICalAttendeeStatus | null;\n type?: ICalAttendeeType | null;\n x?:\n | [string, string][]\n | Record<string, string>\n | { key: string; value: string }[];\n}\n\nexport interface ICalAttendeeJSONData {\n delegatedFrom: null | string;\n delegatedTo: null | string;\n email: string;\n mailto: null | string;\n name: null | string;\n role: ICalAttendeeRole;\n rsvp: boolean | null;\n sentBy: null | string;\n status: ICalAttendeeStatus | null;\n type: ICalAttendeeType | null;\n x: { key: string; value: string }[];\n}\n\nexport type ICalXName = `X-${string}`;\n\ninterface ICalInternalAttendeeData {\n delegatedFrom: ICalAttendee | null;\n delegatedTo: ICalAttendee | null;\n email: string;\n mailto: null | string;\n name: null | string;\n role: ICalAttendeeRole;\n rsvp: boolean | null;\n scheduleAgent: ICalAttendeeScheduleAgent | ICalXName | null;\n sentBy: null | string;\n status: ICalAttendeeStatus | null;\n type: ICalAttendeeType | null;\n x: [string, string][];\n}\n\n/**\n * Usually you get an {@link ICalAttendee} object like this:\n *\n * ```javascript\n * import ical from 'ical-generator';\n * const calendar = ical();\n * const event = calendar.createEvent();\n * const attendee = event.createAttendee({ email: 'mail@example.com' });\n * ```\n *\n * You can also use the {@link ICalAttendee} object directly:\n *\n * ```javascript\n * import ical, {ICalAttendee} from 'ical-generator';\n * const attendee = new ICalAttendee({ email: 'mail@example.com' });\n * event.attendees([attendee]);\n * ```\n */\nexport default class ICalAttendee {\n private readonly data: ICalInternalAttendeeData;\n private readonly parent: ICalAlarm | ICalEvent;\n\n /**\n * Constructor of {@link ICalAttendee}. The event reference is\n * required to query the calendar's timezone when required.\n *\n * @param data Attendee Data\n * @param parent Reference to ICalEvent object\n */\n constructor(data: ICalAttendeeData, parent: ICalAlarm | ICalEvent) {\n this.data = {\n delegatedFrom: null,\n delegatedTo: null,\n email: '',\n mailto: null,\n name: null,\n role: ICalAttendeeRole.REQ,\n rsvp: null,\n scheduleAgent: null,\n sentBy: null,\n status: null,\n type: null,\n x: [],\n };\n this.parent = parent;\n if (!this.parent) {\n throw new Error('`event` option required!');\n }\n if (!data.email) {\n throw new Error('No value for `email` in ICalAttendee given!');\n }\n\n if (data.name !== undefined) this.name(data.name);\n if (data.email !== undefined) this.email(data.email);\n if (data.mailto !== undefined) this.mailto(data.mailto);\n if (data.sentBy !== undefined) this.sentBy(data.sentBy);\n if (data.status !== undefined) this.status(data.status);\n if (data.role !== undefined) this.role(data.role);\n if (data.rsvp !== undefined) this.rsvp(data.rsvp);\n if (data.type !== undefined) this.type(data.type);\n if (data.delegatedTo !== undefined) this.delegatedTo(data.delegatedTo);\n if (data.delegatedFrom !== undefined)\n this.delegatedFrom(data.delegatedFrom);\n if (data.delegatesTo) this.delegatesTo(data.delegatesTo);\n if (data.delegatesFrom) this.delegatesFrom(data.delegatesFrom);\n if (data.scheduleAgent !== undefined)\n this.scheduleAgent(data.scheduleAgent);\n if (data.x !== undefined) this.x(data.x);\n }\n\n /**\n * Get the attendee's delegated-from field\n * @since 0.2.0\n */\n delegatedFrom(): ICalAttendee | null;\n /**\n * Set the attendee's delegated-from field\n *\n * Creates a new Attendee if the passed object is not already a\n * {@link ICalAttendee} object. Will set the `delegatedTo` and\n * `delegatedFrom` attributes.\n *\n * @param delegatedFrom\n */\n delegatedFrom(\n delegatedFrom: ICalAttendee | ICalAttendeeData | null | string,\n ): this;\n delegatedFrom(\n delegatedFrom?: ICalAttendee | ICalAttendeeData | null | string,\n ): ICalAttendee | null | this {\n if (delegatedFrom === undefined) {\n return this.data.delegatedFrom;\n }\n\n if (!delegatedFrom) {\n this.data.delegatedFrom = null;\n } else if (typeof delegatedFrom === 'string') {\n this.data.delegatedFrom = new ICalAttendee(\n {\n email: delegatedFrom,\n ...checkNameAndMail('delegatedFrom', delegatedFrom),\n },\n this.parent,\n );\n } else if (delegatedFrom instanceof ICalAttendee) {\n this.data.delegatedFrom = delegatedFrom;\n } else {\n this.data.delegatedFrom = new ICalAttendee(\n delegatedFrom,\n this.parent,\n );\n }\n\n return this;\n }\n\n /**\n * Get the attendee's delegated-to value.\n * @since 0.2.0\n */\n delegatedTo(): ICalAttendee | null;\n /**\n * Set the attendee's delegated-to field.\n *\n * Creates a new Attendee if the passed object is not already a\n * {@link ICalAttendee} object. Will set the `delegatedTo` and\n * `delegatedFrom` attributes.\n *\n * Will also set the `status` to `DELEGATED`, if attribute is set.\n *\n * ```javascript\n * const cal = ical();\n * const event = cal.createEvent();\n * const attendee = cal.createAttendee();\n *\n * attendee.delegatesTo({email: 'foo@bar.com', name: 'Foo'});\n ```\n *\n * @since 0.2.0\n */\n delegatedTo(\n delegatedTo: ICalAttendee | ICalAttendeeData | null | string,\n ): this;\n delegatedTo(\n delegatedTo?: ICalAttendee | ICalAttendeeData | null | string,\n ): ICalAttendee | null | this {\n if (delegatedTo === undefined) {\n return this.data.delegatedTo;\n }\n if (!delegatedTo) {\n this.data.delegatedTo = null;\n if (this.data.status === ICalAttendeeStatus.DELEGATED) {\n this.data.status = null;\n }\n return this;\n }\n\n if (typeof delegatedTo === 'string') {\n this.data.delegatedTo = new ICalAttendee(\n {\n email: delegatedTo,\n ...checkNameAndMail('delegatedTo', delegatedTo),\n },\n this.parent,\n );\n } else if (delegatedTo instanceof ICalAttendee) {\n this.data.delegatedTo = delegatedTo;\n } else {\n this.data.delegatedTo = new ICalAttendee(delegatedTo, this.parent);\n }\n\n this.data.status = ICalAttendeeStatus.DELEGATED;\n return this;\n }\n\n /**\n * Create a new attendee this attendee delegates from and returns\n * this new attendee. Creates a new attendee if the passed object\n * is not already an {@link ICalAttendee}.\n *\n * ```javascript\n * const cal = ical();\n * const event = cal.createEvent();\n * const attendee = cal.createAttendee();\n *\n * attendee.delegatesFrom({email: 'foo@bar.com', name: 'Foo'});\n * ```\n *\n * @since 0.2.0\n */\n delegatesFrom(\n options: ICalAttendee | ICalAttendeeData | string,\n ): ICalAttendee {\n const a =\n options instanceof ICalAttendee\n ? options\n : this.parent.createAttendee(options);\n this.delegatedFrom(a);\n a.delegatedTo(this);\n return a;\n }\n\n /**\n * Create a new attendee this attendee delegates to and returns\n * this new attendee. Creates a new attendee if the passed object\n * is not already an {@link ICalAttendee}.\n *\n * ```javascript\n * const cal = ical();\n * const event = cal.createEvent();\n * const attendee = cal.createAttendee();\n *\n * attendee.delegatesTo({email: 'foo@bar.com', name: 'Foo'});\n * ```\n *\n * @since 0.2.0\n */\n delegatesTo(\n options: ICalAttendee | ICalAttendeeData | string,\n ): ICalAttendee {\n const a =\n options instanceof ICalAttendee\n ? options\n : this.parent.createAttendee(options);\n this.delegatedTo(a);\n a.delegatedFrom(this);\n return a;\n }\n /**\n * Get the attendee's email address\n * @since 0.2.0\n */\n email(): string;\n /**\n * Set the attendee's email address\n * @since 0.2.0\n */\n email(email: string): this;\n email(email?: string): string | this {\n if (!email) {\n return this.data.email;\n }\n\n this.data.email = email;\n return this;\n }\n /**\n * Get the attendee's email address\n * @since 1.3.0\n */\n mailto(): null | string;\n /**\n * Set the attendee's email address\n * @since 1.3.0\n */\n mailto(mailto: null | string): this;\n mailto(mailto?: null | string): null | string | this {\n if (mailto === undefined) {\n return this.data.mailto;\n }\n\n this.data.mailto = mailto || null;\n return this;\n }\n /**\n * Get the attendee's name\n * @since 0.2.0\n */\n name(): null | string;\n /**\n * Set the attendee's name\n * @since 0.2.0\n */\n name(name: null | string): this;\n name(name?: null | string): null | string | this {\n if (name === undefined) {\n return this.data.name;\n }\n\n this.data.name = name || null;\n return this;\n }\n /**\n * Get attendee's role\n * @since 0.2.0\n */\n role(): ICalAttendeeRole;\n /**\n * Set the attendee's role, defaults to `REQ` / `REQ-PARTICIPANT`.\n * Checkout {@link ICalAttendeeRole} for available roles.\n *\n * @since 0.2.0\n */\n role(role: ICalAttendeeRole): this;\n role(role?: ICalAttendeeRole): ICalAttendeeRole | this {\n if (role === undefined) {\n return this.data.role;\n }\n\n this.data.role = checkEnum(ICalAttendeeRole, role) as ICalAttendeeRole;\n return this;\n }\n /**\n * Get attendee's RSVP expectation\n * @since 0.2.1\n */\n rsvp(): boolean | null;\n /**\n * Set the attendee's RSVP expectation\n * @since 0.2.1\n */\n rsvp(rsvp: boolean | null): this;\n rsvp(rsvp?: boolean | null): boolean | null | this {\n if (rsvp === undefined) {\n return this.data.rsvp;\n }\n if (rsvp === null) {\n this.data.rsvp = null;\n return this;\n }\n\n this.data.rsvp = Boolean(rsvp);\n return this;\n }\n /**\n * Get attendee's schedule agent\n * @since 9.0.0\n */\n scheduleAgent(): ICalAttendeeScheduleAgent | ICalXName;\n /**\n * Set attendee's schedule agent\n * See {@link ICalAttendeeScheduleAgent} for available values.\n * You can also use custom X-* values.\n *\n * @since 9.0.0\n */\n scheduleAgent(\n scheduleAgent: ICalAttendeeScheduleAgent | ICalXName | null,\n ): this;\n scheduleAgent(\n scheduleAgent?: ICalAttendeeScheduleAgent | ICalXName | null,\n ): ICalAttendeeScheduleAgent | ICalXName | null | this {\n if (scheduleAgent === undefined) {\n return this.data.scheduleAgent;\n }\n if (!scheduleAgent) {\n this.data.scheduleAgent = null;\n return this;\n }\n\n if (\n typeof scheduleAgent == 'string' &&\n scheduleAgent.toUpperCase().startsWith('X-')\n ) {\n this.data.scheduleAgent = scheduleAgent as string as ICalXName;\n return this;\n }\n\n this.data.scheduleAgent = checkEnum(\n ICalAttendeeScheduleAgent,\n scheduleAgent,\n ) as ICalAttendeeScheduleAgent;\n return this;\n }\n /**\n * Get the acting user's email adress\n * @since 3.3.0\n */\n sentBy(): null | string;\n /**\n * Set the acting user's email adress\n * @since 3.3.0\n */\n sentBy(email: null | string): this;\n sentBy(email?: null | string): null | string | this {\n if (!email) {\n return this.data.sentBy;\n }\n\n this.data.sentBy = email;\n return this;\n }\n /**\n * Get attendee's status\n * @since 0.2.0\n */\n status(): ICalAttendeeStatus | null;\n /**\n * Set the attendee's status. See {@link ICalAttendeeStatus}\n * for available status options.\n *\n * @since 0.2.0\n */\n status(status: ICalAttendeeStatus | null): this;\n status(\n status?: ICalAttendeeStatus | null,\n ): ICalAttendeeStatus | null | this {\n if (status === undefined) {\n return this.data.status;\n }\n if (!status) {\n this.data.status = null;\n return this;\n }\n\n this.data.status = checkEnum(\n ICalAttendeeStatus,\n status,\n ) as ICalAttendeeStatus;\n return this;\n }\n /**\n * Return a shallow copy of the attendee's options for JSON stringification.\n * Can be used for persistence.\n *\n * @since 0.2.4\n */\n toJSON(): ICalAttendeeJSONData {\n return Object.assign({}, this.data, {\n delegatedFrom: this.data.delegatedFrom?.email() || null,\n delegatedTo: this.data.delegatedTo?.email() || null,\n x: this.x(),\n });\n }\n /**\n * Return generated attendee as a string.\n *\n * ```javascript\n * console.log(attendee.toString()); // → ATTENDEE;ROLE=…\n * ```\n */\n toString(): string {\n let g = 'ATTENDEE';\n\n if (!this.data.email) {\n throw new Error('No value for `email` in ICalAttendee given!');\n }\n\n // ROLE\n g += ';ROLE=' + this.data.role;\n\n // TYPE\n if (this.data.type) {\n g += ';CUTYPE=' + this.data.type;\n }\n\n // PARTSTAT\n if (this.data.status) {\n g += ';PARTSTAT=' + this.data.status;\n }\n\n // RSVP\n if (this.data.rsvp !== null) {\n g += ';RSVP=' + this.data.rsvp.toString().toUpperCase();\n }\n\n // SENT-BY\n if (this.data.sentBy !== null) {\n g += ';SENT-BY=\"mailto:' + this.data.sentBy + '\"';\n }\n\n // DELEGATED-TO\n if (this.data.delegatedTo) {\n g += ';DELEGATED-TO=\"' + this.data.delegatedTo.email() + '\"';\n }\n\n // DELEGATED-FROM\n if (this.data.delegatedFrom) {\n g += ';DELEGATED-FROM=\"' + this.data.delegatedFrom.email() + '\"';\n }\n\n // CN / Name\n if (this.data.name) {\n g += ';CN=\"' + escape(this.data.name, true) + '\"';\n }\n\n // EMAIL\n if (this.data.email && this.data.mailto) {\n g += ';EMAIL=' + escape(this.data.email, false);\n }\n\n // SCHEDULE-AGENT\n if (this.data.scheduleAgent) {\n g += ';SCHEDULE-AGENT=' + this.data.scheduleAgent;\n }\n\n // CUSTOM X ATTRIBUTES\n if (this.data.x.length) {\n g +=\n ';' +\n this.data.x\n .map(\n ([key, value]) =>\n key.toUpperCase() + '=' + escape(value, false),\n )\n .join(';');\n }\n\n g +=\n ':MAILTO:' +\n escape(this.data.mailto || this.data.email, false) +\n '\\r\\n';\n\n return g;\n }\n\n /**\n * Get attendee's type (a.k.a. CUTYPE)\n * @since 0.2.3\n */\n type(): ICalAttendeeType;\n /**\n * Set attendee's type (a.k.a. CUTYPE).\n * See {@link ICalAttendeeType} for available status options.\n *\n * @since 0.2.3\n */\n type(type: ICalAttendeeType | null): this;\n type(type?: ICalAttendeeType | null): ICalAttendeeType | null | this {\n if (type === undefined) {\n return this.data.type;\n }\n if (!type) {\n this.data.type = null;\n return this;\n }\n\n this.data.type = checkEnum(ICalAttendeeType, type) as ICalAttendeeType;\n return this;\n }\n /**\n * Set X-* attributes. Woun't filter double attributes,\n * which are also added by another method (e.g. status),\n * so these attributes may be inserted twice.\n *\n * ```javascript\n * attendee.x([\n * {\n * key: \"X-MY-CUSTOM-ATTR\",\n * value: \"1337!\"\n * }\n * ]);\n *\n * attendee.x([\n * [\"X-MY-CUSTOM-ATTR\", \"1337!\"]\n * ]);\n *\n * attendee.x({\n * \"X-MY-CUSTOM-ATTR\": \"1337!\"\n * });\n * ```\n *\n * @since 1.9.0\n */\n x(\n keyOrArray:\n | [string, string][]\n | Record<string, string>\n | { key: string; value: string }[],\n ): this;\n /**\n * Set a X-* attribute. Woun't filter double attributes,\n * which are also added by another method (e.g. status),\n * so these attributes may be inserted twice.\n *\n * ```javascript\n * attendee.x(\"X-MY-CUSTOM-ATTR\", \"1337!\");\n * ```\n *\n * @since 1.9.0\n */\n x(keyOrArray: string, value: string): this;\n /**\n * Get all custom X-* attributes.\n * @since 1.9.0\n */\n x(): { key: string; value: string }[];\n x(\n keyOrArray?:\n | [string, string][]\n | Record<string, string>\n | string\n | { key: string; value: string }[],\n value?: string,\n ): this | void | { key: string; value: string }[] {\n if (keyOrArray === undefined) {\n return addOrGetCustomAttributes(this.data);\n }\n\n if (typeof keyOrArray === 'string' && typeof value === 'string') {\n addOrGetCustomAttributes(this.data, keyOrArray, value);\n } else if (typeof keyOrArray === 'object') {\n addOrGetCustomAttributes(this.data, keyOrArray);\n } else {\n throw new Error('Either key or value is not a string!');\n }\n\n return this;\n }\n}\n","'use strict';\n\nimport type ICalEvent from './event.ts';\n\nimport ICalAttendee, { type ICalAttendeeData } from './attendee.ts';\nimport {\n addOrGetCustomAttributes,\n checkDate,\n checkNameAndMail,\n escape,\n formatDate,\n generateCustomAttributes,\n toDurationString,\n toJSON,\n} from './tools.ts';\nimport { type ICalDateTimeValue } from './types.ts';\n\nexport enum ICalAlarmType {\n audio = 'audio',\n display = 'display',\n email = 'email',\n}\n\nexport const ICalAlarmRelatesTo = {\n end: 'END',\n start: 'START',\n} as const;\n\nexport interface ICalAlarmBaseData {\n attach?: ICalAttachment | null | string;\n attendees?: ICalAttendee[] | ICalAttendeeData[];\n description?: null | string;\n relatesTo?: ICalAlarmRelatesTo | null;\n repeat?: ICalAlarmRepeatData | null;\n summary?: null | string;\n type?: ICalAlarmType;\n x?:\n | [string, string][]\n | Record<string, string>\n | { key: string; value: string }[];\n}\n\nexport type ICalAlarmData =\n | ICalAlarmBaseData\n | ICalAlarmTriggerAfterData\n | ICalAlarmTriggerBeforeData\n | ICalAlarmTriggerData;\n\nexport interface ICalAlarmJSONData {\n attach: ICalAttachment | null;\n attendees: ICalAttendee[];\n description: null | string;\n interval: null | number;\n relatesTo: ICalAlarmRelatesTo | null;\n repeat: ICalAlarmRepeatData | null;\n summary: null | string;\n trigger: number | string;\n type: ICalAlarmType;\n x: { key: string; value: string }[];\n}\n\nexport type ICalAlarmRelatesTo =\n (typeof ICalAlarmRelatesTo)[keyof typeof ICalAlarmRelatesTo];\n\nexport interface ICalAlarmRepeatData {\n interval: number;\n times: number;\n}\nexport type ICalAlarmTriggerAfterData = ICalAlarmBaseData & {\n triggerAfter: ICalDateTimeValue | number;\n};\nexport type ICalAlarmTriggerBeforeData = ICalAlarmBaseData & {\n triggerBefore: ICalDateTimeValue | number;\n};\n\nexport type ICalAlarmTriggerData = ICalAlarmBaseData & {\n trigger: ICalDateTimeValue | number;\n};\n\nexport type ICalAlarmTypeValue = keyof ICalAlarmType;\n\nexport interface ICalAttachment {\n mime: null | string;\n uri: string;\n}\n\ninterface ICalInternalAlarmData {\n attach: ICalAttachment | null;\n attendees: ICalAttendee[];\n description: null | string;\n interval: null | number;\n relatesTo: ICalAlarmRelatesTo | null;\n repeat: ICalAlarmRepeatData | null;\n summary: null | string;\n trigger: ICalDateTimeValue | number;\n type: ICalAlarmType;\n x: [string, string][];\n}\n\n/**\n * Usually you get an {@link ICalAlarm} object like this:\n *\n * ```javascript\n * import ical from 'ical-generator';\n * const calendar = ical();\n * const event = calendar.createEvent();\n * const alarm = event.createAlarm();\n * ```\n *\n * You can also use the {@link ICalAlarm} object directly:\n *\n * ```javascript\n * import ical, {ICalAlarm} from 'ical-generator';\n * const alarm = new ICalAlarm();\n * event.alarms([alarm]);\n * ```\n */\nexport default class ICalAlarm {\n private readonly data: ICalInternalAlarmData;\n private readonly event: ICalEvent;\n\n /**\n * Constructor of {@link ICalAttendee}. The event reference is required\n * to query the calendar's timezone and summary when required.\n *\n * @param data Alarm Data\n * @param event Reference to ICalEvent object\n */\n constructor(data: ICalAlarmData, event: ICalEvent) {\n this.data = {\n attach: null,\n attendees: [],\n description: null,\n interval: null,\n relatesTo: null,\n repeat: null,\n summary: null,\n trigger: -600,\n type: ICalAlarmType.display,\n x: [],\n };\n\n this.event = event;\n if (!event) {\n throw new Error('`event` option required!');\n }\n\n if (data.type !== undefined) this.type(data.type);\n if ('trigger' in data && data.trigger !== undefined)\n this.trigger(data.trigger);\n if ('triggerBefore' in data && data.triggerBefore !== undefined)\n this.triggerBefore(data.triggerBefore);\n if ('triggerAfter' in data && data.triggerAfter !== undefined)\n this.triggerAfter(data.triggerAfter);\n if (data.repeat) this.repeat(data.repeat);\n if (data.attach !== undefined) this.attach(data.attach);\n if (data.description !== undefined) this.description(data.description);\n if (data.summary !== undefined) this.summary(data.summary);\n if (data.attendees !== undefined) this.attendees(data.attendees);\n if (data.x !== undefined) this.x(data.x);\n }\n\n /**\n * Get Attachment\n * @since 0.2.1\n */\n attach(): null | { mime: null | string; uri: string };\n /**\n * Set Alarm attachment. Used to set the alarm sound\n * if alarm type is audio. Defaults to \"Basso\".\n *\n * ```javascript\n * const cal = ical();\n * const event = cal.createEvent();\n *\n * event.createAlarm({\n * attach: 'https://example.com/notification.aud'\n * });\n *\n * // OR\n *\n * event.createAlarm({\n * attach: {\n * uri: 'https://example.com/notification.aud',\n * mime: 'audio/basic'\n * }\n * });\n * ```\n *\n * @since 0.2.1\n */\n attach(\n attachment: null | string | { mime?: null | string; uri: string },\n ): this;\n attach(\n attachment?: null | string | { mime?: null | string; uri: string },\n ): null | this | { mime: null | string; uri: string } {\n if (attachment === undefined) {\n return this.data.attach;\n }\n if (!attachment) {\n this.data.attach = null;\n return this;\n }\n\n let _attach = null;\n if (typeof attachment === 'string') {\n _attach = {\n mime: null,\n uri: attachment,\n };\n } else if (typeof attachment === 'object') {\n _attach = {\n mime: attachment.mime || null,\n uri: attachment.uri,\n };\n } else {\n throw new Error(\n '`attachment` needs to be a valid formed string or an object. See https://sebbo2002.github.io/' +\n 'ical-generator/develop/reference/classes/ICalAlarm.html#attach',\n );\n }\n\n if (!_attach.uri) {\n throw new Error('`attach.uri` is empty!');\n }\n\n this.data.attach = {\n mime: _attach.mime,\n uri: _attach.uri,\n };\n return this;\n }\n\n /**\n * Get all attendees\n * @since 7.0.0\n */\n attendees(): ICalAttendee[];\n /**\n * Add multiple attendees to your event\n *\n * @since 7.0.0\n */\n attendees(attendees: (ICalAttendee | ICalAttendeeData | string)[]): this;\n attendees(\n attendees?: (ICalAttendee | ICalAttendeeData | string)[],\n ): ICalAttendee[] | this {\n if (!attendees) {\n return this.data.attendees;\n }\n\n attendees.forEach((attendee) => this.createAttendee(attendee));\n return this;\n }\n\n /**\n * Creates a new {@link ICalAttendee} and returns it. Use options to prefill\n * the attendee's attributes. Calling this method without options will create\n * an empty attendee.\n *\n * @since 7.0.0\n */\n createAttendee(\n data: ICalAttendee | ICalAttendeeData | string,\n ): ICalAttendee {\n if (data instanceof ICalAttendee) {\n this.data.attendees.push(data);\n return data;\n }\n if (typeof data === 'string') {\n data = { email: data, ...checkNameAndMail('data', data) };\n }\n\n const attendee = new ICalAttendee(data, this);\n this.data.attendees.push(attendee);\n return attendee;\n }\n\n /**\n * Get the alarm description. Used to set the alarm message\n * if alarm type is `display`. If the alarm type is `email`, it's\n * used to set the email body. Defaults to the event's summary.\n *\n * @since 0.2.1\n */\n description(): null | string;\n /**\n * Set the alarm description. Used to set the alarm message\n * if alarm type is `display`. If the alarm type is `email`, it's\n * used to set the email body. Defaults to the event's summary.\n *\n * @since 0.2.1\n */\n description(description: null | string): this;\n description(description?: null | string): null | string | this {\n if (description === undefined) {\n return this.data.description;\n }\n if (!description) {\n this.data.description = null;\n return this;\n }\n\n this.data.description = description;\n return this;\n }\n\n /**\n * Get to which time alarm trigger relates to.\n * Can be either `START` or `END`. If the value is\n * `START` the alarm is triggerd relative to the event start time.\n * If the value is `END` the alarm is triggerd relative to the event end time\n *\n * @since 4.0.1\n */\n relatesTo(): ICalAlarmRelatesTo | null;\n /**\n * Use this method to set to which time alarm trigger relates to.\n * Works only if trigger is a `number`\n *\n * ```javascript\n * const cal = ical();\n * const event = cal.createEvent();\n * const alarm = cal.createAlarm();\n *\n * alarm.trigger(600); // -> 10 minutes before event starts\n *\n * alarm.relatesTo('START'); // -> 10 minutes before event starts\n * alarm.relatesTo('END'); // -> 10 minutes before event ends\n *\n * alarm.trigger(-600); // -> 10 minutes after event starts\n *\n * alarm.relatesTo('START'); // -> 10 minutes after event starts\n * alarm.relatesTo('END'); // -> 10 minutes after event ends\n * ```\n * @since 4.0.1\n */\n relatesTo(relatesTo: ICalAlarmRelatesTo | null): this;\n relatesTo(\n relatesTo?: ICalAlarmRelatesTo | null,\n ): ICalAlarmRelatesTo | null | this {\n if (relatesTo === undefined) {\n return this.data.relatesTo;\n }\n if (!relatesTo) {\n this.data.relatesTo = null;\n return this;\n }\n\n if (!Object.values(ICalAlarmRelatesTo).includes(relatesTo)) {\n throw new Error(\n '`relatesTo` is not correct, must be either `START` or `END`!',\n );\n }\n\n this.data.relatesTo = relatesTo;\n return this;\n }\n\n /**\n * Get Alarm Repetitions\n * @since 0.2.1\n */\n repeat(): ICalAlarmRepeatData | null;\n /**\n * Set Alarm Repetitions. Use this to repeat the alarm.\n *\n * ```javascript\n * const cal = ical();\n * const event = cal.createEvent();\n *\n * // repeat the alarm 4 times every 5 minutes…\n * cal.createAlarm({\n * repeat: {\n * times: 4,\n * interval: 300\n * }\n * });\n * ```\n *\n * @since 0.2.1\n */\n repeat(repeat: ICalAlarmRepeatData | null): this;\n repeat(\n repeat?: ICalAlarmRepeatData | null,\n ): ICalAlarmRepeatData | null | this {\n if (repeat === undefined) {\n return this.data.repeat;\n }\n if (!repeat) {\n this.data.repeat = null;\n return this;\n }\n\n if (typeof repeat !== 'object') {\n throw new Error('`repeat` is not correct, must be an object!');\n }\n if (typeof repeat.times !== 'number' || !isFinite(repeat.times)) {\n throw new Error('`repeat.times` is not correct, must be numeric!');\n }\n if (typeof repeat.interval !== 'number' || !isFinite(repeat.interval)) {\n throw new Error(\n '`repeat.interval` is not correct, must be numeric!',\n );\n }\n\n this.data.repeat = repeat;\n return this;\n }\n\n /**\n * Get the alarm summary. Used to set the email subject\n * if alarm type is `email`. Defaults to the event's summary.\n *\n * @since 7.0.0\n */\n summary(): null | string;\n /**\n * Set the alarm summary. Used to set the email subject\n * if alarm type is display. Defaults to the event's summary.\n *\n * @since 0.2.1\n */\n summary(summary: null | string): this;\n summary(summary?: null | string): null | string | this {\n if (summary === undefined) {\n return this.data.summary;\n }\n if (!summary) {\n this.data.summary = null;\n return this;\n }\n\n this.data.summary = summary;\n return this;\n }\n\n /**\n * Return a shallow copy of the alarm's options for JSON stringification.\n * Third party objects like moment.js values are stringified as well. Can\n * be used for persistence.\n *\n * @since 0.2.4\n */\n toJSON(): ICalAlarmJSONData {\n const trigger = this.trigger();\n return Object.assign({}, this.data, {\n trigger: typeof trigger === 'number' ? trigger : toJSON(trigger),\n x: this.x(),\n });\n }\n /**\n * Return generated event as a string.\n *\n * ```javascript\n * const alarm = event.createAlarm();\n * console.log(alarm.toString()); // → BEGIN:VALARM…\n * ```\n */\n toString(): string {\n let g = 'BEGIN:VALARM\\r\\n';\n\n // ACTION\n g += 'ACTION:' + this.data.type.toUpperCase() + '\\r\\n';\n\n if (\n typeof this.data.trigger === 'number' &&\n this.data.relatesTo === null\n ) {\n if (this.data.trigger > 0) {\n g +=\n 'TRIGGER;RELATED=END:' +\n toDurationString(this.data.trigger) +\n '\\r\\n';\n } else {\n g += 'TRIGGER:' + toDurationString(this.data.trigger) + '\\r\\n';\n }\n } else if (typeof this.data.trigger === 'number') {\n g +=\n 'TRIGGER;RELATED=' +\n this.data.relatesTo?.toUpperCase() +\n ':' +\n toDurationString(this.data.trigger) +\n '\\r\\n';\n } else {\n g +=\n 'TRIGGER;VALUE=DATE-TIME:' +\n formatDate(this.event.timezone(), this.data.trigger) +\n '\\r\\n';\n }\n\n // REPEAT\n if (this.data.repeat) {\n if (!this.data.repeat.times) {\n throw new Error(\n 'No value for `repeat.times` in ICalAlarm given, but required for `interval`!',\n );\n }\n if (!this.data.repeat.interval) {\n throw new Error(\n 'No value for `repeat.interval` in ICalAlarm given, but required for `repeat`!',\n );\n }\n\n g += 'REPEAT:' + this.data.repeat.times + '\\r\\n';\n g +=\n 'DURATION:' +\n toDurationString(this.data.repeat.interval) +\n '\\r\\n';\n }\n\n // ATTACH\n if (\n this.data.type === 'audio' &&\n this.data.attach &&\n this.data.attach.mime\n ) {\n g +=\n 'ATTACH;FMTTYPE=' +\n escape(this.data.attach.mime, false) +\n ':' +\n escape(this.data.attach.uri, false) +\n '\\r\\n';\n } else if (this.data.type === 'audio' && this.data.attach) {\n g +=\n 'ATTACH;VALUE=URI:' +\n escape(this.data.attach.uri, false) +\n '\\r\\n';\n } else if (this.data.type === 'audio') {\n g += 'ATTACH;VALUE=URI:Basso\\r\\n';\n }\n\n // DESCRIPTION\n if (this.data.type !== 'audio' && this.data.description) {\n g += 'DESCRIPTION:' + escape(this.data.description, false) + '\\r\\n';\n } else if (this.data.type !== 'audio') {\n g += 'DESCRIPTION:' + escape(this.event.summary(), false) + '\\r\\n';\n }\n\n // SUMMARY\n if (this.data.type === 'email' && this.data.summary) {\n g += 'SUMMARY:' + escape(this.data.summary, false) + '\\r\\n';\n } else if (this.data.type === 'email') {\n g += 'SUMMARY:' + escape(this.event.summary(), false) + '\\r\\n';\n }\n\n // ATTENDEES\n if (this.data.type === 'email') {\n this.data.attendees.forEach((attendee) => {\n g += attendee.toString();\n });\n }\n\n // CUSTOM X ATTRIBUTES\n g += generateCustomAttributes(this.data);\n\n g += 'END:VALARM\\r\\n';\n return g;\n }\n\n /**\n * Get the trigger time for the alarm. Can either\n * be a date and time value ({@link ICalDateTimeValue}) or\n * a number, which will represent the seconds between\n * alarm and event start. The number is negative, if the\n * alarm is triggered after the event started.\n *\n * @since 0.2.1\n */\n trigger(): ICalDateTimeValue | number;\n /**\n * Use this method to set the alarm time.\n *\n * ```javascript\n * const cal = ical();\n * const event = cal.createEvent();\n * const alarm = cal.createAlarm();\n *\n * alarm.trigger(600); // -> 10 minutes before event starts\n * alarm.trigger(new Date()); // -> now\n * ```\n *\n * You can use any supported date object, see\n * [readme](https://github.com/sebbo2002/ical-generator#-date-time--timezones)\n * for details about supported values and timezone handling.\n *\n * @since 0.2.1\n */\n trigger(trigger: Date | ICalDateTimeValue | number): this;\n trigger(\n trigger?: Date | ICalDateTimeValue | number,\n ): ICalDateTimeValue | number | this {\n // Getter\n if (trigger === undefined && typeof this.data.trigger === 'number') {\n return -1 * this.data.trigger;\n }\n if (trigger === undefined) {\n return this.data.trigger;\n }\n\n // Setter\n if (typeof trigger === 'number' && isFinite(trigger)) {\n this.data.trigger = -1 * trigger;\n } else if (!trigger || typeof trigger === 'number') {\n throw new Error(\n '`trigger` is not correct, must be a finite number or a supported date!',\n );\n } else {\n this.data.trigger = checkDate(trigger, 'trigger');\n }\n\n return this;\n }\n\n /**\n * Get the trigger time for the alarm. Can either\n * be a date and time value ({@link ICalDateTimeValue}) or\n * a number, which will represent the seconds between\n * alarm and event start. The number is negative, if the\n * alarm is triggered before the event started.\n *\n * @since 0.2.1\n */\n triggerAfter(): ICalDateTimeValue | number;\n /**\n * Use this method to set the alarm time. Unlike `trigger`, this time\n * the alarm takes place after the event has started.\n *\n * ```javascript\n * const cal = ical();\n * const event = cal.createEvent();\n * const alarm = cal.createAlarm();\n *\n * alarm.trigger(600); // -> 10 minutes after event starts\n * ```\n *\n * You can use any supported date object, see\n * [readme](https://github.com/sebbo2002/ical-generator#-date-time--timezones)\n * for details about supported values and timezone handling.\n *\n * @since 0.2.1\n */\n triggerAfter(trigger: ICalDateTimeValue | number): this;\n triggerAfter(\n trigger?: ICalDateTimeValue | number,\n ): ICalDateTimeValue | number | this {\n if (trigger === undefined) {\n return this.data.trigger;\n }\n\n return this.trigger(\n typeof trigger === 'number' ? -1 * trigger : trigger,\n );\n }\n\n /**\n * Get the trigger time for the alarm. Can either\n * be a date and time value ({@link ICalDateTimeValue}) or\n * a number, which will represent the seconds between\n * alarm and event start. The number is negative, if the\n * alarm is triggered after the event started.\n *\n * @since 0.2.1\n * @see {@link trigger}\n * @see {@link triggerAfter}\n */\n triggerBefore(trigger: ICalDateTimeValue | number): this;\n /**\n * Use this method to set the alarm time.\n *\n * ```javascript\n * const cal = ical();\n * const event = cal.createEvent();\n * const alarm = cal.createAlarm();\n *\n * alarm.trigger(600); // -> 10 minutes before event starts\n * alarm.trigger(new Date()); // -> now\n * ```\n *\n * You can use any supported date object, see\n * [readme](https://github.com/sebbo2002/ical-generator#-date-time--timezones)\n * for details about supported values and timezone handling.\n *\n * @since 0.2.1\n * @see {@link trigger}\n * @see {@link triggerAfter}\n */\n triggerBefore(): ICalDateTimeValue | number;\n triggerBefore(\n trigger?: ICalDateTimeValue | number,\n ): ICalDateTimeValue | number | this {\n if (trigger === undefined) {\n return this.trigger();\n }\n\n return this.trigger(trigger);\n }\n /**\n * Get the alarm type\n * @since 0.2.1\n */\n type(type: ICalAlarmType): this;\n /**\n * Set the alarm type. See {@link ICalAlarmType}\n * for available status options.\n * @since 0.2.1\n */\n type(): ICalAlarmType;\n type(type?: ICalAlarmType): ICalAlarmType | this {\n if (type === undefined) {\n return this.data.type;\n }\n if (!type || !Object.keys(ICalAlarmType).includes(type)) {\n throw new Error(\n '`type` is not correct, must be either `display` or `audio`!',\n );\n }\n\n this.data.type = type;\n return this;\n }\n\n /**\n * Set X-* attributes. Woun't filter double attributes,\n * which are also added by another method (e.g. type),\n * so these attributes may be inserted twice.\n *\n * ```javascript\n * alarm.x([\n * {\n * key: \"X-MY-CUSTOM-ATTR\",\n * value: \"1337!\"\n * }\n * ]);\n *\n * alarm.x([\n * [\"X-MY-CUSTOM-ATTR\", \"1337!\"]\n * ]);\n *\n * alarm.x({\n * \"X-MY-CUSTOM-ATTR\": \"1337!\"\n * });\n * ```\n *\n * @since 1.9.0\n */\n x(\n keyOrArray:\n | [string, string][]\n | Record<string, string>\n | { key: string; value: string }[],\n ): this;\n /**\n * Set a X-* attribute. Woun't filter double attributes,\n * which are also added by another method (e.g. type),\n * so these attributes may be inserted twice.\n *\n * ```javascript\n * alarm.x(\"X-MY-CUSTOM-ATTR\", \"1337!\");\n * ```\n *\n * @since 1.9.0\n */\n x(keyOrArray: string, value: string): this;\n /**\n * Get all custom X-* attributes.\n * @since 1.9.0\n */\n x(): { key: string; value: string }[];\n x(\n keyOrArray?:\n | [string, string][]\n | Record<string, string>\n | string\n | { key: string; value: string }[],\n value?: string,\n ): this | void | { key: string; value: string }[] {\n if (keyOrArray === undefined) {\n return addOrGetCustomAttributes(this.data);\n }\n\n if (typeof keyOrArray === 'string' && typeof value === 'string') {\n addOrGetCustomAttributes(this.data, keyOrArray, value);\n } else if (typeof keyOrArray === 'object') {\n addOrGetCustomAttributes(this.data, keyOrArray);\n } else {\n throw new Error('Either key or value is not a string!');\n }\n\n return this;\n }\n}\n","'use strict';\n\nimport { escape } from './tools.ts';\n\nexport interface ICalCategoryData {\n name: string;\n}\n\nexport type ICalCategoryInternalData = ICalCategoryJSONData;\n\nexport interface ICalCategoryJSONData {\n name: string;\n}\n\n/**\n * Usually you get an {@link ICalCategory} object like this:\n *\n * ```javascript\n * import ical from 'ical-generator';\n * const calendar = ical();\n * const event = calendar.createEvent();\n * const category = event.createCategory();\n * ```\n *\n * You can also use the {@link ICalCategory} object directly:\n *\n * ```javascript\n * import ical, {ICalCategory} from 'ical-generator';\n * const category = new ICalCategory();\n * event.categories([category]);\n * ```\n */\nexport default class ICalCategory {\n private readonly data: ICalCategoryInternalData;\n\n /**\n * Constructor of {@link ICalCategory}.\n * @param data Category Data\n */\n constructor(data: ICalCategoryData) {\n this.data = {\n name: '',\n };\n\n if (!data.name) {\n throw new Error('No value for `name` in ICalCategory given!');\n }\n\n this.name(data.name);\n }\n\n /**\n * Get the category name\n * @since 0.3.0\n */\n name(): string;\n /**\n * Set the category name\n * @since 0.3.0\n */\n name(name: string): this;\n name(name?: string): string | this {\n if (name === undefined) {\n return this.data.name;\n }\n\n this.data.name = name;\n return this;\n }\n\n /**\n * Return a shallow copy of the category's options for JSON stringification.\n * Can be used for persistence.\n *\n * @since 0.2.4\n */\n toJSON(): ICalCategoryInternalData {\n return Object.assign({}, this.data);\n }\n\n /**\n * Return generated category name as a string.\n *\n * ```javascript\n * console.log(category.toString());\n * ```\n */\n toString(): string {\n // CN / Name\n return escape(this.data.name, false);\n }\n}\n","'use strict';\n\nimport ICalAlarm, { type ICalAlarmData } from './alarm.ts';\nimport ICalAttendee, { type ICalAttendeeData } from './attendee.ts';\nimport ICalCalendar from './calendar.ts';\nimport ICalCategory, { type ICalCategoryData } from './category.ts';\nimport {\n addOrGetCustomAttributes,\n checkDate,\n checkEnum,\n checkNameAndMail,\n escape,\n formatDate,\n formatDateTZ,\n generateCustomAttributes,\n isRRule,\n toDate,\n toJSON,\n} from './tools.ts';\nimport {\n type ICalDateTimeValue,\n type ICalDescription,\n ICalEventRepeatingFreq,\n type ICalLocation,\n type ICalOrganizer,\n type ICalRepeatingOptions,\n type ICalRRuleStub,\n ICalWeekday,\n} from './types.ts';\n\nexport enum ICalEventBusyStatus {\n BUSY = 'BUSY',\n FREE = 'FREE',\n OOF = 'OOF',\n TENTATIVE = 'TENTATIVE',\n}\n\nexport enum ICalEventClass {\n CONFIDENTIAL = 'CONFIDENTIAL',\n PRIVATE = 'PRIVATE',\n PUBLIC = 'PUBLIC',\n}\n\nexport enum ICalEventStatus {\n CANCELLED = 'CANCELLED',\n CONFIRMED = 'CONFIRMED',\n TENTATIVE = 'TENTATIVE',\n}\n\nexport enum ICalEventTransparency {\n OPAQUE = 'OPAQUE',\n TRANSPARENT = 'TRANSPARENT',\n}\n\nexport interface ICalEventData {\n alarms?: ICalAlarm[] | ICalAlarmData[];\n allDay?: boolean;\n attachments?: string[];\n attendees?: ICalAttendee[] | ICalAttendeeData[];\n busystatus?: ICalEventBusyStatus | null;\n categories?: ICalCategory[] | ICalCategoryData[];\n class?: ICalEventClass | null;\n created?: ICalDateTimeValue | null;\n description?: ICalDescription | null | string;\n end?: ICalDateTimeValue | null;\n floating?: boolean;\n id?: null | number | string;\n lastModified?: ICalDateTimeValue | null;\n location?: ICalLocation | null | string;\n organizer?: ICalOrganizer | null | string;\n priority?: null | number;\n recurrenceId?: ICalDateTimeValue | null;\n repeating?: ICalRepeatingOptions | ICalRRuleStub | null | string;\n sequence?: number;\n stamp?: ICalDateTimeValue;\n start: ICalDateTimeValue;\n status?: ICalEventStatus | null;\n summary?: string;\n timezone?: null | string;\n transparency?: ICalEventTransparency | null;\n url?: null | string;\n x?:\n | [string, string][]\n | Record<string, string>\n | { key: string; value: string }[];\n}\n\nexport interface ICalEventJSONData {\n alarms: ICalAlarm[];\n allDay: boolean;\n attachments: string[];\n attendees: ICalAttendee[];\n busystatus: ICalEventBusyStatus | null;\n categories: ICalCategory[];\n created: null | string;\n description: ICalDescription | null;\n end: null | string;\n floating: boolean;\n id: string;\n lastModified: null | string;\n location: ICalLocation | null;\n organizer: ICalOrganizer | null;\n priority?: null | number;\n recurrenceId: null | string;\n repeating: ICalEventJSONRepeatingData | null | string;\n sequence: number;\n stamp: string;\n start: string;\n status: ICalEventStatus | null;\n summary: string;\n timezone: null | string;\n transparency: ICalEventTransparency | null;\n url: null | string;\n x: { key: string; value: string }[];\n}\n\nexport interface ICalEventJSONRepeatingData {\n byDay?: ICalWeekday[];\n byMonth?: number[];\n byMonthDay?: number[];\n bySetPos?: number[];\n count?: number;\n exclude?: ICalDateTimeValue[];\n freq: ICalEventRepeatingFreq;\n interval?: number;\n startOfWeek?: ICalWeekday;\n until?: ICalDateTimeValue;\n}\n\ninterface ICalEventInternalData {\n alarms: ICalAlarm[];\n allDay: boolean;\n attachments: string[];\n attendees: ICalAttendee[];\n busystatus: ICalEventBusyStatus | null;\n categories: ICalCategory[];\n class: ICalEventClass | null;\n created: ICalDateTimeValue | null;\n description: ICalDescription | null;\n end: ICalDateTimeValue | null;\n floating: boolean;\n id: string;\n lastModified: ICalDateTimeValue | null;\n location: ICalLocation | null;\n organizer: ICalOrganizer | null;\n priority: null | number;\n recurrenceId: ICalDateTimeValue | null;\n repeating: ICalEventJSONRepeatingData | ICalRRuleStub | null | string;\n sequence: number;\n stamp: ICalDateTimeValue;\n start: ICalDateTimeValue;\n status: ICalEventStatus | null;\n summary: string;\n timezone: null | string;\n transparency: ICalEventTransparency | null;\n url: null | string;\n x: [string, string][];\n}\n\n/**\n * Usually you get an {@link ICalEvent} object like this:\n * ```javascript\n * import ical from 'ical-generator';\n * const calendar = ical();\n * const event = calendar.createEvent();\n * ```\n */\nexport default class ICalEvent {\n private readonly calendar: ICalCalendar;\n private readonly data: ICalEventInternalData;\n\n /**\n * Constructor of [[`ICalEvent`]. The calendar reference is\n * required to query the calendar's timezone when required.\n *\n * @param data Calendar Event Data\n * @param calendar Reference to ICalCalendar object\n */\n constructor(data: ICalEventData, calendar: ICalCalendar) {\n this.data = {\n alarms: [],\n allDay: false,\n attachments: [],\n attendees: [],\n busystatus: null,\n categories: [],\n class: null,\n created: null,\n description: null,\n end: null,\n floating: false,\n id: crypto.randomUUID(),\n lastModified: null,\n location: null,\n organizer: null,\n priority: null,\n recurrenceId: null,\n repeating: null,\n sequence: 0,\n stamp: new Date(),\n start: new Date(),\n status: null,\n summary: '',\n timezone: null,\n transparency: null,\n url: null,\n x: [],\n };\n\n this.calendar = calendar;\n if (!calendar) {\n throw new Error('`calendar` option required!');\n }\n\n if (data.id) this.id(data.id);\n if (data.sequence !== undefined) this.sequence(data.sequence);\n if (data.start) this.start(data.start);\n if (data.end !== undefined) this.end(data.end);\n if (data.recurrenceId !== undefined)\n this.recurrenceId(data.recurrenceId);\n if (data.timezone !== undefined) this.timezone(data.timezone);\n if (data.stamp !== undefined) this.stamp(data.stamp);\n if (data.allDay !== undefined) this.allDay(data.allDay);\n if (data.floating !== undefined) this.floating(data.floating);\n if (data.repeating !== undefined) this.repeating(data.repeating);\n if (data.summary !== undefined) this.summary(data.summary);\n if (data.location !== undefined) this.location(data.location);\n if (data.description !== undefined) this.description(data.description);\n if (data.organizer !== undefined) this.organizer(data.organizer);\n if (data.attendees !== undefined) this.attendees(data.attendees);\n if (data.alarms !== undefined) this.alarms(data.alarms);\n if (data.categories !== undefined) this.categories(data.categories);\n if (data.status !== undefined) this.status(data.status);\n if (data.busystatus !== undefined) this.busystatus(data.busystatus);\n if (data.priority !== undefined) this.priority(data.priority);\n if (data.url !== undefined) this.url(data.url);\n if (data.attachments !== undefined) this.attachments(data.attachments);\n if (data.transparency !== undefined)\n this.transparency(data.transparency);\n if (data.created !== undefined) this.created(data.created);\n if (data.lastModified !== undefined)\n this.lastModified(data.lastModified);\n if (data.class !== undefined) this.class(data.class);\n if (data.x !== undefined) this.x(data.x);\n }\n\n /**\n * Get all alarms\n * @since 0.2.0\n */\n alarms(): ICalAlarm[];\n /**\n * Add one or multiple alarms\n *\n * ```javascript\n * const event = ical().createEvent();\n *\n * cal.alarms([\n * {type: ICalAlarmType.display, trigger: 600},\n * {type: ICalAlarmType.audio, trigger: 300}\n * ]);\n *\n * cal.alarms(); // --> [ICalAlarm, ICalAlarm]\n ```\n *\n * @since 0.2.0\n */\n alarms(alarms: ICalAlarm[] | ICalAlarmData[]): this;\n alarms(alarms?: ICalAlarm[] | ICalAlarmData[]): ICalAlarm[] | this {\n if (!alarms) {\n return this.data.alarms;\n }\n\n alarms.forEach((alarm: ICalAlarm | ICalAlarmData) =>\n this.createAlarm(alarm),\n );\n return this;\n }\n\n /**\n * Get the event's allDay flag\n * @since 0.2.0\n */\n allDay(): boolean;\n /**\n * Set the event's allDay flag.\n *\n * ```javascript\n * event.allDay(true); // → appointment is for the whole day\n * ```\n *\n * ```typescript\n * import ical from 'ical-generator';\n *\n * const cal = ical();\n *\n * cal.createEvent({\n * start: new Date('2020-01-01'),\n * summary: 'Very Important Day',\n * allDay: true\n * });\n *\n * cal.toString();\n * ```\n *\n * ```text\n * BEGIN:VCALENDAR\n * VERSION:2.0\n * PRODID:-//sebbo.net//ical-generator//EN\n * BEGIN:VEVENT\n * UID:1964fe8d-32c5-4f2a-bd62-7d9d7de5992b\n * SEQUENCE:0\n * DTSTAMP:20240212T191956Z\n * DTSTART;VALUE=DATE:20200101\n * X-MICROSOFT-CDO-ALLDAYEVENT:TRUE\n * X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE\n * SUMMARY:Very Important Day\n * END:VEVENT\n * END:VCALENDAR\n * ```\n *\n * @since 0.2.0\n */\n allDay(allDay: boolean): this;\n allDay(allDay?: boolean): boolean | this {\n if (allDay === undefined) {\n return this.data.allDay;\n }\n\n this.data.allDay = Boolean(allDay);\n return this;\n }\n\n /**\n * Get all attachment urls\n * @since 3.2.0-develop.1\n */\n attachments(): string[];\n /**\n * Add one or multiple alarms\n *\n * ```javascript\n * const event = ical().createEvent();\n *\n * cal.attachments([\n * 'https://files.sebbo.net/calendar/attachments/foo',\n * 'https://files.sebbo.net/calendar/attachments/bar'\n * ]);\n *\n * cal.attachments(); // --> [string, string]\n ```\n *\n * 3.2.0-develop.1\n */\n attachments(attachments: string[]): this;\n attachments(attachments?: string[]): string[] | this {\n if (!attachments) {\n return this.data.attachments;\n }\n\n attachments.forEach((attachment: string) =>\n this.createAttachment(attachment),\n );\n return this;\n }\n\n /**\n * Get all attendees\n * @since 0.2.0\n */\n attendees(): ICalAttendee[];\n /**\n * Add multiple attendees to your event\n *\n * ```javascript\n * const event = ical().createEvent();\n *\n * cal.attendees([\n * {email: 'a@example.com', name: 'Person A'},\n * {email: 'b@example.com', name: 'Person B'}\n * ]);\n *\n * cal.attendees(); // --> [ICalAttendee, ICalAttendee]\n * ```\n *\n * @since 0.2.0\n */\n attendees(attendees: (ICalAttendee | ICalAttendeeData | string)[]): this;\n attendees(\n attendees?: (ICalAttendee | ICalAttendeeData | string)[],\n ): ICalAttendee[] | this {\n if (!attendees) {\n return this.data.attendees;\n }\n\n attendees.forEach((attendee) => this.createAttendee(attendee));\n return this;\n }\n\n /**\n * Get the event's busy status\n * @since 1.0.2\n */\n busystatus(): ICalEventBusyStatus | null;\n /**\n * Set the event's busy status. Will add the\n * [`X-MICROSOFT-CDO-BUSYSTATUS`](https://docs.microsoft.com/en-us/openspecs/exchange_server_protocols/ms-oxcical/cd68eae7-ed65-4dd3-8ea7-ad585c76c736)\n * attribute to your event.\n *\n * ```javascript\n * import ical, {ICalEventBusyStatus} from 'ical-generator';\n * event.busystatus(ICalEventBusyStatus.BUSY);\n * ```\n *\n * @since 1.0.2\n */\n busystatus(busystatus: ICalEventBusyStatus | null): this;\n busystatus(\n busystatus?: ICalEventBusyStatus | null,\n ): ICalEventBusyStatus | null | this {\n if (busystatus === undefined) {\n return this.data.busystatus;\n }\n if (busystatus === null) {\n this.data.busystatus = null;\n return this;\n }\n\n this.data.busystatus = checkEnum(\n ICalEventBusyStatus,\n busystatus,\n ) as ICalEventBusyStatus;\n return this;\n }\n\n /**\n * Get all categories\n * @since 0.3.0\n */\n categories(): ICalCategory[];\n /**\n * Add categories to the event or return all selected categories.\n *\n * ```javascript\n * const event = ical().createEvent();\n *\n * cal.categories([\n * {name: 'APPOINTMENT'},\n * {name: 'MEETING'}\n * ]);\n *\n * cal.categories(); // --> [ICalCategory, ICalCategory]\n * ```\n *\n * @since 0.3.0\n */\n categories(categories: (ICalCategory | ICalCategoryData)[]): this;\n categories(\n categories?: (ICalCategory | ICalCategoryData)[],\n ): ICalCategory[] | this {\n if (!categories) {\n return this.data.categories;\n }\n\n categories.forEach((category) => this.createCategory(category));\n return this;\n }\n /**\n * Get the event's class\n * @since 2.0.0\n */\n class(): ICalEventClass | null;\n /**\n * Set the event's class\n *\n * ```javascript\n * import ical, { ICalEventClass } from 'ical-generator';\n * event.class(ICalEventClass.PRIVATE);\n * ```\n *\n * @since 2.0.0\n */\n class(class_: ICalEventClass | null): this;\n class(class_?: ICalEventClass | null): ICalEventClass | null | this {\n if (class_ === undefined) {\n return this.data.class;\n }\n if (class_ === null) {\n this.data.class = null;\n return this;\n }\n\n this.data.class = checkEnum(ICalEventClass, class_) as ICalEventClass;\n return this;\n }\n /**\n * Creates a new {@link ICalAlarm} and returns it. Use options to prefill\n * the alarm's attributes. Calling this method without options will create\n * an empty alarm.\n *\n * ```javascript\n * const cal = ical();\n * const event = cal.createEvent();\n * const alarm = event.createAlarm({type: ICalAlarmType.display, trigger: 300});\n *\n * // add another alarm\n * event.createAlarm({\n * type: ICalAlarmType.audio,\n * trigger: 300, // 5min before event\n * });\n * ```\n *\n * @since 0.2.1\n */\n createAlarm(data: ICalAlarm | ICalAlarmData): ICalAlarm {\n const alarm =\n data instanceof ICalAlarm ? data : new ICalAlarm(data, this);\n this.data.alarms.push(alarm);\n return alarm;\n }\n\n /**\n * Adds an attachment to the event by adding the file URL to the calendar.\n *\n * `ical-generator` only supports external attachments. File attachments that\n * are directly included in the file are not supported, because otherwise the\n * calendar file could easily become unfavourably large.\n *\n * ```javascript\n * const cal = ical();\n * const event = cal.createEvent();\n * event.createAttachment('https://files.sebbo.net/calendar/attachments/foo');\n * ```\n *\n * @since 3.2.0-develop.1\n */\n createAttachment(url: string): this {\n this.data.attachments.push(url);\n return this;\n }\n\n /**\n * Creates a new {@link ICalAttendee} and returns it. Use options to prefill\n * the attendee's attributes. Calling this method without options will create\n * an empty attendee.\n *\n * ```javascript\n * import ical from 'ical-generator';\n *\n * const cal = ical();\n * const event = cal.createEvent({\n * start: new Date()\n * });\n *\n * event.createAttendee({email: 'hui@example.com', name: 'Hui'});\n *\n * // add another attendee\n * event.createAttendee('Buh <buh@example.net>');\n * ```\n *\n * ```text\n * BEGIN:VCALENDAR\n * VERSION:2.0\n * PRODID:-//sebbo.net//ical-generator//EN\n * BEGIN:VEVENT\n * UID:b4944f07-98e4-4581-ac80-2589bb20273d\n * SEQUENCE:0\n * DTSTAMP:20240212T194232Z\n * DTSTART:20240212T194232Z\n * SUMMARY:\n * ATTENDEE;ROLE=REQ-PARTICIPANT;CN=\"Hui\":MAILTO:hui@example.com\n * ATTENDEE;ROLE=REQ-PARTICIPANT;CN=\"Buh\":MAILTO:buh@example.net\n * END:VEVENT\n * END:VCALENDAR\n * ```\n *\n * As with the organizer, you can also add an explicit `mailto` address.\n *\n * ```javascript\n * event.createAttendee({email: 'hui@example.com', name: 'Hui', mailto: 'another@mailto.com'});\n *\n * // overwrite an attendee's mailto address\n * attendee.mailto('another@mailto.net');\n * ```\n *\n * @since 0.2.0\n */\n createAttendee(\n data: ICalAttendee | ICalAttendeeData | string,\n ): ICalAttendee {\n if (data instanceof ICalAttendee) {\n this.data.attendees.push(data);\n return data;\n }\n if (typeof data === 'string') {\n data = { email: data, ...checkNameAndMail('data', data) };\n }\n\n const attendee = new ICalAttendee(data, this);\n this.data.attendees.push(attendee);\n return attendee;\n }\n /**\n * Creates a new {@link ICalCategory} and returns it. Use options to prefill the category's attributes.\n * Calling this method without options will create an empty category.\n *\n * ```javascript\n * const cal = ical();\n * const event = cal.createEvent();\n * const category = event.createCategory({name: 'APPOINTMENT'});\n *\n * // add another category\n * event.createCategory({\n * name: 'MEETING'\n * });\n * ```\n *\n * @since 0.3.0\n */\n createCategory(data: ICalCategory | ICalCategoryData): ICalCategory {\n const category =\n data instanceof ICalCategory ? data : new ICalCategory(data);\n this.data.categories.push(category);\n return category;\n }\n\n /**\n * Get the event's creation date\n * @since 0.3.0\n */\n created(): ICalDateTimeValue | null;\n /**\n * Set the event's creation date\n * @since 0.3.0\n */\n created(created: ICalDateTimeValue | null): this;\n created(\n created?: ICalDateTimeValue | null,\n ): ICalDateTimeValue | null | this {\n if (created === undefined) {\n return this.data.created;\n }\n if (created === null) {\n this.data.created = null;\n return this;\n }\n\n this.data.created = checkDate(created, 'created');\n return this;\n }\n\n /**\n * Get the event's description as an {@link ICalDescription} object.\n * @since 0.2.0\n */\n description(): ICalDescription | null;\n /**\n * Set the events description by passing a plaintext string or\n * an object containing both a plaintext and a html description.\n * Only a few calendar apps support html descriptions and like in\n * emails, supported HTML tags and styling is limited.\n *\n * ```javascript\n * event.description({\n * plain: 'Hello World!',\n * html: '<p>Hello World!</p>'\n * });\n * ```\n *\n * ```text\n * DESCRIPTION:Hello World!\n * X-ALT-DESC;FMTTYPE=text/html:<p>Hello World!</p>\n * ```\n *\n * @since 0.2.0\n */\n description(description: ICalDescription | null | string): this;\n description(\n description?: ICalDescription | null | string,\n ): ICalDescription | null | this {\n if (description === undefined) {\n return this.data.description;\n }\n if (description === null) {\n this.data.description = null;\n return this;\n }\n\n if (typeof description === 'string') {\n this.data.description = { plain: description };\n } else {\n this.data.description = description;\n }\n return this;\n }\n\n /**\n * Get the event end time which is currently\n * set. Can be any supported date object.\n *\n * @since 0.2.0\n */\n end(): ICalDateTimeValue | null;\n /**\n * Set the appointment date of end. You can use any supported date object, see\n * [readme](https://github.com/sebbo2002/ical-generator#-date-time--timezones)\n * for details about supported values and timezone handling.\n *\n * @since 0.2.0\n */\n end(end: ICalDateTimeValue | null): this;\n end(end?: ICalDateTimeValue | null): ICalDateTimeValue | null | this {\n if (end === undefined) {\n this.swapStartAndEndIfRequired();\n return this.data.end;\n }\n if (end === null) {\n this.data.end = null;\n return this;\n }\n\n this.data.end = checkDate(end, 'end');\n return this;\n }\n\n /**\n * Get the event's floating flag.\n * @since 0.2.0\n */\n floating(): boolean;\n floating(floating: boolean): this;\n /**\n * Set the event's floating flag. This unsets the event's timezone.\n * Events whose floating flag is set to true always take place at the\n * same time, regardless of the time zone.\n *\n * ```typescript\n * import ical from 'ical-generator';\n *\n * const cal = ical();\n *\n * cal.createEvent({\n * start: new Date('2020-01-01T20:00:00Z'),\n * summary: 'Always at 20:00 in every <Timezone',\n * floating: true\n * });\n *\n * cal.toString();\n * ```\n *\n * ```text\n * BEGIN:VCALENDAR\n * VERSION:2.0\n * PRODID:-//sebbo.net//ical-generator//EN\n * BEGIN:VEVENT\n * UID:5d7278f9-ada3-40ef-83d1-23c29ce0a763\n * SEQUENCE:0\n * DTSTAMP:20240212T192214Z\n * DTSTART:20200101T200000\n * SUMMARY:Always at 20:00 in every <Timezone\n * END:VEVENT\n * END:VCALENDAR\n * ```\n *\n * @since 0.2.0\n */\n floating(floating?: boolean): boolean | this {\n if (floating === undefined) {\n return this.data.floating;\n }\n\n this.data.floating = Boolean(floating);\n if (this.data.floating) {\n this.data.timezone = null;\n }\n\n return this;\n }\n\n /**\n * Get the event's ID\n * @since 0.2.0\n */\n id(): string;\n /**\n * Use this method to set the event's ID.\n * If not set, a UUID will be generated randomly.\n *\n * @param id Event ID you want to set\n */\n id(id: number | string): this;\n id(id?: number | string): string | this {\n if (id === undefined) {\n return this.data.id;\n }\n\n this.data.id = String(id);\n return this;\n }\n\n /**\n * Get the event's last modification date\n * @since 0.3.0\n */\n lastModified(): ICalDateTimeValue | null;\n /**\n * Set the event's last modification date\n * @since 0.3.0\n */\n lastModified(lastModified: ICalDateTimeValue | null): this;\n lastModified(\n lastModified?: ICalDateTimeValue | null,\n ): ICalDateTimeValue | null | this {\n if (lastModified === undefined) {\n return this.data.lastModified;\n }\n if (lastModified === null) {\n this.data.lastModified = null;\n return this;\n }\n\n this.data.lastModified = checkDate(lastModified, 'lastModified');\n return this;\n }\n\n /**\n * Get the event's location\n * @since 0.2.0\n */\n location(): ICalLocation | null;\n /**\n * Set the event's location by passing a string (minimum) or\n * an {@link ICalLocationWithTitle} object which will also fill the iCal\n * `GEO` attribute and Apple's `X-APPLE-STRUCTURED-LOCATION`.\n *\n * ```javascript\n * event.location({\n * title: 'Apple Store Kurfürstendamm',\n * address: 'Kurfürstendamm 26, 10719 Berlin, Deutschland',\n * radius: 141.1751386318387,\n * geo: {\n * lat: 52.503630,\n * lon: 13.328650\n * }\n * });\n * ```\n *\n * ```text\n * LOCATION:Apple Store Kurfürstendamm\\nKurfürstendamm 26\\, 10719 Berlin\\,\n * Deutschland\n * X-APPLE-STRUCTURED-LOCATION;VALUE=URI;X-ADDRESS=Kurfürstendamm 26\\, 10719\n * Berlin\\, Deutschland;X-APPLE-RADIUS=141.1751386318387;X-TITLE=Apple Store\n * Kurfürstendamm:geo:52.50363,13.32865\n * GEO:52.50363;13.32865\n * ```\n *\n * Since v6.1.0 you can also pass a {@link ICalLocationWithoutTitle} object to pass\n * the geolocation only. This will only fill the iCal `GEO` attribute.\n *\n * ```javascript\n * event.location({\n * geo: {\n * lat: 52.503630,\n * lon: 13.328650\n * }\n * });\n * ```\n *\n * ```text\n * GEO:52.50363;13.32865\n * ```\n *\n * @since 0.2.0\n */\n location(location: ICalLocation | null | string): this;\n location(\n location?: ICalLocation | null | string,\n ): ICalLocation | null | this {\n if (location === undefined) {\n return this.data.location;\n }\n if (typeof location === 'string') {\n this.data.location = {\n title: location,\n };\n return this;\n }\n if (\n location &&\n (('title' in location && !location.title) ||\n (location?.geo &&\n (typeof location.geo.lat !== 'number' ||\n !isFinite(location.geo.lat) ||\n typeof location.geo.lon !== 'number' ||\n !isFinite(location.geo.lon))) ||\n (!('title' in location) && !location?.geo))\n ) {\n throw new Error(\n \"`location` isn't formatted correctly. See https://sebbo2002.github.io/ical-generator/\" +\n 'develop/reference/classes/ICalEvent.html#location',\n );\n }\n\n this.data.location = location || null;\n return this;\n }\n\n /**\n * Get the event's organizer\n * @since 0.2.0\n */\n organizer(): ICalOrganizer | null;\n /**\n * Set the event's organizer\n *\n * ```javascript\n * event.organizer({\n * name: 'Organizer\\'s Name',\n * email: 'organizer@example.com'\n * });\n *\n * // OR\n *\n * event.organizer('Organizer\\'s Name <organizer@example.com>');\n * ```\n *\n * You can also add an explicit `mailto` email address or or the sentBy address.\n *\n * ```javascript\n * event.organizer({\n * name: 'Organizer\\'s Name',\n * email: 'organizer@example.com',\n * mailto: 'explicit@mailto.com',\n * sentBy: 'substitute@example.com'\n * })\n * ```\n *\n * @since 0.2.0\n */\n organizer(organizer: ICalOrganizer | null | string): this;\n organizer(\n organizer?: ICalOrganizer | null | string,\n ): ICalOrganizer | null | this {\n if (organizer === undefined) {\n return this.data.organizer;\n }\n if (organizer === null) {\n this.data.organizer = null;\n return this;\n }\n\n this.data.organizer = checkNameAndMail('organizer', organizer);\n return this;\n }\n\n /**\n * Get the event's priority. A value of 1 represents\n * the highest priority, 9 the lowest. 0 specifies an undefined\n * priority.\n *\n * @since v2.0.0-develop.7\n */\n priority(): null | number;\n /**\n * Set the event's priority. A value of 1 represents\n * the highest priority, 9 the lowest. 0 specifies an undefined\n * priority.\n *\n * @since v2.0.0-develop.7\n */\n priority(priority: null | number): this;\n priority(priority?: null | number): null | number | this {\n if (priority === undefined) {\n return this.data.priority;\n }\n if (priority === null) {\n this.data.priority = null;\n return this;\n }\n\n if (priority < 0 || priority > 9) {\n throw new Error(\n '`priority` is invalid, musst be 0 ≤ priority ≤ 9.',\n );\n }\n\n this.data.priority = Math.round(priority);\n return this;\n }\n\n /**\n * Get the event's recurrence id\n * @since 0.2.0\n */\n recurrenceId(): ICalDateTimeValue | null;\n /**\n * Set the event's recurrence id. You can use any supported date object, see\n * [readme](https://github.com/sebbo2002/ical-generator#-date-time--timezones)\n * for details about supported values and timezone handling.\n *\n * @since 0.2.0\n */\n recurrenceId(recurrenceId: ICalDateTimeValue | null): this;\n recurrenceId(\n recurrenceId?: ICalDateTimeValue | null,\n ): ICalDateTimeValue | null | this {\n if (recurrenceId === undefined) {\n return this.data.recurrenceId;\n }\n if (recurrenceId === null) {\n this.data.recurrenceId = null;\n return this;\n }\n\n this.data.recurrenceId = checkDate(recurrenceId, 'recurrenceId');\n return this;\n }\n /**\n * Get the event's repeating options\n * @since 0.2.0\n */\n repeating(): ICalEventJSONRepeatingData | ICalRRuleStub | null | string;\n /**\n * Set the event's repeating options by passing an {@link ICalRepeatingOptions} object.\n *\n * ```javascript\n * event.repeating({\n * freq: 'MONTHLY', // required\n * count: 5,\n * interval: 2,\n * until: new Date('Jan 01 2014 00:00:00 UTC'),\n * byDay: ['su', 'mo'], // repeat only sunday and monday\n * byMonth: [1, 2], // repeat only in january and february,\n * byMonthDay: [1, 15], // repeat only on the 1st and 15th\n * bySetPos: 3, // repeat every 3rd sunday (will take the first element of the byDay array)\n * exclude: [new Date('Dec 25 2013 00:00:00 UTC')], // exclude these dates\n * excludeTimezone: 'Europe/Berlin', // timezone of exclude\n * wkst: 'SU' // Start the week on Sunday, default is Monday\n * });\n * ```\n *\n * **Example:**\n *\n *```typescript\n * import ical, { ICalEventRepeatingFreq } from 'ical-generator';\n *\n * const cal = ical();\n *\n * const event = cal.createEvent({\n * start: new Date('2020-01-01T20:00:00Z'),\n * summary: 'Repeating Event'\n * });\n * event.repeating({\n * freq: ICalEventRepeatingFreq.WEEKLY,\n * count: 4\n * });\n *\n * cal.toString();\n * ```\n *\n * ```text\n * BEGIN:VCALENDAR\n * VERSION:2.0\n * PRODID:-//sebbo.net//ical-generator//EN\n * BEGIN:VEVENT\n * UID:b80e6a68-c2cd-48f5-b94d-cecc7ce83871\n * SEQUENCE:0\n * DTSTAMP:20240212T193646Z\n * DTSTART:20200101T200000Z\n * RRULE:FREQ=WEEKLY;COUNT=4\n * SUMMARY:Repeating Event\n * END:VEVENT\n * END:VCALENDAR\n * ```\n *\n * @since 0.2.0\n */\n repeating(repeating: ICalRepeatingOptions | null): this;\n /**\n * Set the event's repeating options by passing an [RRule object](https://github.com/jakubroztocil/rrule).\n * @since 2.0.0-develop.5\n *\n * ```typescript\n * import ical from 'ical-generator';\n * import { datetime, RRule } from 'rrule';\n *\n * const cal = ical();\n *\n * const event = cal.createEvent({\n * start: new Date('2020-01-01T20:00:00Z'),\n * summary: 'Repeating Event'\n * });\n *\n * const rule = new RRule({\n * freq: RRule.WEEKLY,\n * interval: 5,\n * byweekday: [RRule.MO, RRule.FR],\n * dtstart: datetime(2012, 2, 1, 10, 30),\n * until: datetime(2012, 12, 31)\n * })\n * event.repeating(rule);\n *\n * cal.toString();\n * ```\n *\n * ```text\n * BEGIN:VCALENDAR\n * VERSION:2.0\n * PRODID:-//sebbo.net//ical-generator//EN\n * BEGIN:VEVENT\n * UID:36585e40-8fa8-460d-af0c-88b6f434030b\n * SEQUENCE:0\n * DTSTAMP:20240212T193827Z\n * DTSTART:20200101T200000Z\n * RRULE:FREQ=WEEKLY;INTERVAL=5;BYDAY=MO,FR;UNTIL=20121231T000000Z\n * SUMMARY:Repeating Event\n * END:VEVENT\n * END:VCALENDAR\n * ```\n */\n repeating(repeating: ICalRRuleStub | null): this;\n /**\n * Set the events repeating options by passing a string which is inserted in the ical file.\n * @since 2.0.0-develop.5\n */\n repeating(repeating: null | string): this;\n /**\n * @internal\n */\n repeating(\n repeating: ICalRepeatingOptions | ICalRRuleStub | null | string,\n ): this;\n repeating(\n repeating?: ICalRepeatingOptions | ICalRRuleStub | null | string,\n ): ICalEventJSONRepeatingData | ICalRRuleStub | null | string | this {\n if (repeating === undefined) {\n return this.data.repeating;\n }\n if (!repeating) {\n this.data.repeating = null;\n return this;\n }\n if (isRRule(repeating) || typeof repeating === 'string') {\n this.data.repeating = repeating;\n return this;\n }\n\n this.data.repeating = {\n freq: checkEnum(\n ICalEventRepeatingFreq,\n repeating.freq,\n ) as ICalEventRepeatingFreq,\n };\n\n if (repeating.count) {\n if (!isFinite(repeating.count)) {\n throw new Error('`repeating.count` must be a finite number!');\n }\n\n this.data.repeating.count = repeating.count;\n }\n\n if (repeating.interval) {\n if (!isFinite(repeating.interval)) {\n throw new Error(\n '`repeating.interval` must be a finite number!',\n );\n }\n\n this.data.repeating.interval = repeating.interval;\n }\n\n if (repeating.until !== undefined) {\n this.data.repeating.until = checkDate(\n repeating.until,\n 'repeating.until',\n );\n }\n\n if (repeating.byDay) {\n const byDayArray = Array.isArray(repeating.byDay)\n ? repeating.byDay\n : [repeating.byDay];\n this.data.repeating.byDay = byDayArray.map(\n (day) => checkEnum(ICalWeekday, day) as ICalWeekday,\n );\n }\n\n if (repeating.byMonth) {\n const byMonthArray = Array.isArray(repeating.byMonth)\n ? repeating.byMonth\n : [repeating.byMonth];\n this.data.repeating.byMonth = byMonthArray.map((month) => {\n if (typeof month !== 'number' || month < 1 || month > 12) {\n throw new Error(\n '`repeating.byMonth` contains invalid value `' +\n month +\n '`!',\n );\n }\n\n return month;\n });\n }\n\n if (repeating.byMonthDay) {\n const byMonthDayArray = Array.isArray(repeating.byMonthDay)\n ? repeating.byMonthDay\n : [repeating.byMonthDay];\n\n this.data.repeating.byMonthDay = byMonthDayArray.map((monthDay) => {\n if (\n typeof monthDay !== 'number' ||\n monthDay < -31 ||\n monthDay > 31 ||\n monthDay === 0\n ) {\n throw new Error(\n '`repeating.byMonthDay` contains invalid value `' +\n monthDay +\n '`!',\n );\n }\n\n return monthDay;\n });\n }\n\n if (repeating.bySetPos) {\n if (!this.data.repeating.byDay) {\n throw '`repeating.bySetPos` must be used along with `repeating.byDay`!';\n }\n const bySetPosArray = Array.isArray(repeating.bySetPos)\n ? repeating.bySetPos\n : [repeating.bySetPos];\n this.data.repeating.bySetPos = bySetPosArray.map((bySetPos) => {\n if (\n typeof bySetPos !== 'number' ||\n bySetPos < -366 ||\n bySetPos > 366 ||\n bySetPos === 0\n ) {\n throw (\n '`repeating.bySetPos` contains invalid value `' +\n bySetPos +\n '`!'\n );\n }\n return bySetPos;\n });\n }\n\n if (repeating.exclude) {\n const excludeArray = Array.isArray(repeating.exclude)\n ? repeating.exclude\n : [repeating.exclude];\n this.data.repeating.exclude = excludeArray.map((exclude, i) => {\n return checkDate(exclude, `repeating.exclude[${i}]`);\n });\n }\n\n if (repeating.startOfWeek) {\n this.data.repeating.startOfWeek = checkEnum(\n ICalWeekday,\n repeating.startOfWeek,\n ) as ICalWeekday;\n }\n\n return this;\n }\n\n /**\n * Get the event's SEQUENCE number. Use this method to get the event's\n * revision sequence number of the calendar component within a sequence of revisions.\n *\n * @since 0.2.6\n */\n sequence(): number;\n /**\n * Set the event's SEQUENCE number. For a new event, this should be zero.\n * Each time the organizer makes a significant revision, the sequence\n * number should be incremented.\n *\n * @param sequence Sequence number or null to unset it\n */\n sequence(sequence: number): this;\n sequence(sequence?: number): number | this {\n if (sequence === undefined) {\n return this.data.sequence;\n }\n\n const s = parseInt(String(sequence), 10);\n if (isNaN(s)) {\n throw new Error('`sequence` must be a number!');\n }\n\n this.data.sequence = sequence;\n return this;\n }\n\n /**\n * Get the event's timestamp\n * @since 0.2.0\n * @see {@link timestamp}\n */\n stamp(): ICalDateTimeValue;\n /**\n * Set the appointment date of creation. Defaults to the current time and date (`new Date()`). You can use\n * any supported date object, see [readme](https://github.com/sebbo2002/ical-generator#-date-time--timezones)\n * for details about supported values and timezone handling.\n *\n * @since 0.2.0\n * @see {@link timestamp}\n */\n stamp(stamp: ICalDateTimeValue): this;\n stamp(stamp?: ICalDateTimeValue): ICalDateTimeValue | this {\n if (stamp === undefined) {\n return this.data.stamp;\n }\n\n this.data.stamp = checkDate(stamp, 'stamp');\n return this;\n }\n\n /**\n * Get the event start time which is currently\n * set. Can be any supported date object.\n *\n * @since 0.2.0\n */\n start(): ICalDateTimeValue;\n /**\n * Set the appointment date of beginning, which is required for all events.\n * You can use any supported date object, see\n * [Readme](https://github.com/sebbo2002/ical-generator#-date-time--timezones)\n * for details about supported values and timezone handling.\n *\n * ```typescript\n * import ical from 'ical-generator';\n *\n * const cal = ical();\n *\n * const event = cal.createEvent({\n * start: new Date('2020-01-01')\n * });\n *\n * // overwrites old start date\n * event.start(new Date('2024-02-01'));\n *\n * cal.toString();\n * ```\n *\n * ```text\n * BEGIN:VCALENDAR\n * VERSION:2.0\n * PRODID:-//sebbo.net//ical-generator//EN\n * BEGIN:VEVENT\n * UID:7e2aee64-b07a-4256-9b3e-e9eaa452bac8\n * SEQUENCE:0\n * DTSTAMP:20240212T190915Z\n * DTSTART:20240201T000000Z\n * SUMMARY:\n * END:VEVENT\n * END:VCALENDAR\n * ```\n *\n * @since 0.2.0\n */\n start(start: ICalDateTimeValue): this;\n start(start?: ICalDateTimeValue): ICalDateTimeValue | this {\n if (start === undefined) {\n this.swapStartAndEndIfRequired();\n return this.data.start;\n }\n\n this.data.start = checkDate(start, 'start');\n return this;\n }\n\n /**\n * Get the event's status\n * @since 0.2.0\n */\n status(): ICalEventStatus | null;\n /**\n * Set the event's status\n *\n * ```javascript\n * import ical, {ICalEventStatus} from 'ical-generator';\n * event.status(ICalEventStatus.CONFIRMED);\n * ```\n *\n * @since 0.2.0\n */\n status(status: ICalEventStatus | null): this;\n status(status?: ICalEventStatus | null): ICalEventStatus | null | this {\n if (status === undefined) {\n return this.data.status;\n }\n if (status === null) {\n this.data.status = null;\n return this;\n }\n\n this.data.status = checkEnum(\n ICalEventStatus,\n status,\n ) as ICalEventStatus;\n return this;\n }\n\n /**\n * Get the event's summary\n * @since 0.2.0\n */\n summary(): string;\n /**\n * Set the event's summary.\n * Defaults to an empty string if nothing is set.\n *\n * @since 0.2.0\n */\n summary(summary: string): this;\n summary(summary?: string): string | this {\n if (summary === undefined) {\n return this.data.summary;\n }\n\n this.data.summary = summary ? String(summary) : '';\n return this;\n }\n\n /**\n * Get the event's timestamp\n * @since 0.2.0\n * @see {@link stamp}\n */\n timestamp(): ICalDateTimeValue;\n /**\n * Set the appointment date of creation. Defaults to the current time and date (`new Date()`). You can use\n * any supported date object, see [readme](https://github.com/sebbo2002/ical-generator#-date-time--timezones)\n * for details about supported values and timezone handling.\n *\n * @since 0.2.0\n * @see {@link stamp}\n */\n timestamp(stamp: ICalDateTimeValue): this;\n timestamp(stamp?: ICalDateTimeValue): ICalDateTimeValue | this {\n if (stamp === undefined) {\n return this.stamp();\n }\n\n return this.stamp(stamp);\n }\n /**\n * Get the event's timezone.\n * @since 0.2.6\n */\n timezone(): null | string;\n /**\n * Sets the time zone to be used for this event. If a time zone has been\n * defined in both the event and the calendar, the time zone of the event\n * is used.\n *\n * Please note that if the time zone is set, ical-generator assumes\n * that all times are already in the correct time zone. Alternatively,\n * a `moment-timezone` or a Luxon object can be passed with `setZone`,\n * ical-generator will then set the time zone itself.\n *\n * This and the 'floating' flag (see below) are mutually exclusive, and setting a timezone will unset the\n * 'floating' flag. If neither 'timezone' nor 'floating' are set, the date will be output with in UTC format\n * (see [date-time form #2 in section 3.3.5 of RFC 554](https://tools.ietf.org/html/rfc5545#section-3.3.5)).\n *\n * See [Readme](https://github.com/sebbo2002/ical-generator#-date-time--timezones) for details about\n * supported values and timezone handling.\n *\n * ```javascript\n * event.timezone('America/New_York');\n * ```\n *\n * @see https://github.com/sebbo2002/ical-generator#-date-time--timezones\n * @since 0.2.6\n */\n timezone(timezone: null | string): this;\n timezone(timezone?: null | string): null | string | this {\n if (timezone === undefined && this.data.timezone !== null) {\n return this.data.timezone;\n }\n if (timezone === undefined) {\n return this.calendar.timezone();\n }\n\n this.data.timezone =\n timezone && timezone !== 'UTC' ? timezone.toString() : null;\n if (this.data.timezone) {\n this.data.floating = false;\n }\n\n return this;\n }\n /**\n * Return a shallow copy of the events's options for JSON stringification.\n * Third party objects like moment.js values or RRule objects are stringified\n * as well. Can be used for persistence.\n *\n * ```javascript\n * const event = ical().createEvent();\n * const json = JSON.stringify(event);\n *\n * // later: restore event data\n * const calendar = ical().createEvent(JSON.parse(json));\n * ```\n *\n * @since 0.2.4\n */\n toJSON(): ICalEventJSONData {\n let repeating: ICalEventJSONRepeatingData | null | string = null;\n if (\n isRRule(this.data.repeating) ||\n typeof this.data.repeating === 'string'\n ) {\n repeating = this.data.repeating.toString();\n } else if (this.data.repeating) {\n repeating = Object.assign({}, this.data.repeating, {\n exclude: this.data.repeating.exclude?.map((d) => toJSON(d)),\n until: toJSON(this.data.repeating.until) || undefined,\n });\n }\n\n this.swapStartAndEndIfRequired();\n return Object.assign({}, this.data, {\n created: toJSON(this.data.created) || null,\n end: toJSON(this.data.end) || null,\n lastModified: toJSON(this.data.lastModified) || null,\n recurrenceId: toJSON(this.data.recurrenceId) || null,\n repeating,\n stamp: toJSON(this.data.stamp) || null,\n start: toJSON(this.data.start) || null,\n x: this.x(),\n });\n }\n\n /**\n * Return generated event as a string.\n *\n * ```javascript\n * const event = ical().createEvent();\n * console.log(event.toString()); // → BEGIN:VEVENT…\n * ```\n */\n toString(): string {\n let g = '';\n\n // DATE & TIME\n g += 'BEGIN:VEVENT\\r\\n';\n g += 'UID:' + this.data.id + '\\r\\n';\n\n // SEQUENCE\n g += 'SEQUENCE:' + this.data.sequence + '\\r\\n';\n\n this.swapStartAndEndIfRequired();\n g +=\n 'DTSTAMP:' +\n formatDate(this.calendar.timezone(), this.data.stamp) +\n '\\r\\n';\n if (this.data.allDay) {\n g +=\n 'DTSTART;VALUE=DATE:' +\n formatDate(this.timezone(), this.data.start, true) +\n '\\r\\n';\n if (this.data.end) {\n g +=\n 'DTEND;VALUE=DATE:' +\n formatDate(this.timezone(), this.data.end, true) +\n '\\r\\n';\n }\n\n g += 'X-MICROSOFT-CDO-ALLDAYEVENT:TRUE\\r\\n';\n g += 'X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE\\r\\n';\n } else {\n g +=\n formatDateTZ(\n this.timezone(),\n 'DTSTART',\n this.data.start,\n this.data,\n ) + '\\r\\n';\n if (this.data.end) {\n g +=\n formatDateTZ(\n this.timezone(),\n 'DTEND',\n this.data.end,\n this.data,\n ) + '\\r\\n';\n }\n }\n\n // REPEATING\n if (\n isRRule(this.data.repeating) ||\n typeof this.data.repeating === 'string'\n ) {\n let repeating = this.data.repeating\n .toString()\n .replace(/\\r\\n/g, '\\n')\n .split('\\n')\n .filter((l) => l && !l.startsWith('DTSTART:'))\n .join('\\r\\n');\n\n if (\n !repeating.includes('\\r\\n') &&\n !repeating.startsWith('RRULE:')\n ) {\n repeating = 'RRULE:' + repeating;\n }\n\n g += repeating.trim() + '\\r\\n';\n } else if (this.data.repeating) {\n g += 'RRULE:FREQ=' + this.data.repeating.freq;\n\n if (this.data.repeating.count) {\n g += ';COUNT=' + this.data.repeating.count;\n }\n\n if (this.data.repeating.interval) {\n g += ';INTERVAL=' + this.data.repeating.interval;\n }\n\n if (this.data.repeating.until) {\n g +=\n ';UNTIL=' +\n formatDate(\n this.calendar.timezone(),\n this.data.repeating.until,\n false,\n this.floating(),\n );\n }\n\n if (this.data.repeating.byDay) {\n g += ';BYDAY=' + this.data.repeating.byDay.join(',');\n }\n\n if (this.data.repeating.byMonth) {\n g += ';BYMONTH=' + this.data.repeating.byMonth.join(',');\n }\n\n if (this.data.repeating.byMonthDay) {\n g += ';BYMONTHDAY=' + this.data.repeating.byMonthDay.join(',');\n }\n\n if (this.data.repeating.bySetPos) {\n g += ';BYSETPOS=' + this.data.repeating.bySetPos.join(',');\n }\n\n if (this.data.repeating.startOfWeek) {\n g += ';WKST=' + this.data.repeating.startOfWeek;\n }\n\n g += '\\r\\n';\n\n // REPEATING EXCLUSION\n if (this.data.repeating.exclude) {\n if (this.data.allDay) {\n g +=\n 'EXDATE;VALUE=DATE:' +\n this.data.repeating.exclude\n .map((excludedDate) => {\n return formatDate(\n this.calendar.timezone(),\n excludedDate,\n true,\n );\n })\n .join(',') +\n '\\r\\n';\n } else {\n g += 'EXDATE';\n if (this.timezone()) {\n g +=\n ';TZID=' +\n this.timezone() +\n ':' +\n this.data.repeating.exclude\n .map((excludedDate) => {\n // This isn't a 'floating' event because it has a timezone;\n // but we use it to omit the 'Z' UTC specifier in formatDate()\n return formatDate(\n this.timezone(),\n excludedDate,\n false,\n true,\n );\n })\n .join(',') +\n '\\r\\n';\n } else {\n g +=\n ':' +\n this.data.repeating.exclude\n .map((excludedDate) => {\n return formatDate(\n this.timezone(),\n excludedDate,\n false,\n this.floating(),\n );\n })\n .join(',') +\n '\\r\\n';\n }\n }\n }\n }\n\n // RECURRENCE\n if (this.data.recurrenceId) {\n g +=\n formatDateTZ(\n this.timezone(),\n 'RECURRENCE-ID',\n this.data.recurrenceId,\n this.data,\n ) + '\\r\\n';\n }\n\n // SUMMARY\n g += 'SUMMARY:' + escape(this.data.summary, false) + '\\r\\n';\n\n // TRANSPARENCY\n if (this.data.transparency) {\n g += 'TRANSP:' + escape(this.data.transparency, false) + '\\r\\n';\n }\n\n // LOCATION\n if (\n this.data.location &&\n 'title' in this.data.location &&\n this.data.location.title\n ) {\n g +=\n 'LOCATION:' +\n escape(\n this.data.location.title +\n (this.data.location.address\n ? '\\n' + this.data.location.address\n : ''),\n false,\n ) +\n '\\r\\n';\n\n if (this.data.location.radius && this.data.location.geo) {\n g +=\n 'X-APPLE-STRUCTURED-LOCATION;VALUE=URI;' +\n (this.data.location.address\n ? 'X-ADDRESS=' +\n escape(this.data.location.address, false) +\n ';'\n : '') +\n 'X-APPLE-RADIUS=' +\n escape(this.data.location.radius, false) +\n ';' +\n 'X-TITLE=' +\n escape(this.data.location.title, false) +\n ':geo:' +\n escape(this.data.location.geo?.lat, false) +\n ',' +\n escape(this.data.location.geo?.lon, false) +\n '\\r\\n';\n }\n }\n\n // GEO\n if (this.data.location?.geo?.lat && this.data.location.geo.lon) {\n g +=\n 'GEO:' +\n escape(this.data.location.geo.lat, false) +\n ';' +\n escape(this.data.location.geo.lon, false) +\n '\\r\\n';\n }\n\n // DESCRIPTION\n if (this.data.description) {\n g +=\n 'DESCRIPTION:' +\n escape(this.data.description.plain, false) +\n '\\r\\n';\n\n // HTML DESCRIPTION\n if (this.data.description.html) {\n g +=\n 'X-ALT-DESC;FMTTYPE=text/html:' +\n escape(this.data.description.html, false) +\n '\\r\\n';\n }\n }\n\n // ORGANIZER\n if (this.data.organizer) {\n g +=\n 'ORGANIZER;CN=\"' + escape(this.data.organizer.name, true) + '\"';\n\n if (this.data.organizer.sentBy) {\n g +=\n ';SENT-BY=\"mailto:' +\n escape(this.data.organizer.sentBy, true) +\n '\"';\n }\n if (this.data.organizer.email && this.data.organizer.mailto) {\n g += ';EMAIL=' + escape(this.data.organizer.email, false);\n }\n\n g += ':';\n if (this.data.organizer.email) {\n g +=\n 'mailto:' +\n escape(\n this.data.organizer.mailto || this.data.organizer.email,\n false,\n );\n }\n\n g += '\\r\\n';\n }\n\n // ATTENDEES\n this.data.attendees.forEach(function (attendee) {\n g += attendee.toString();\n });\n\n // ALARMS\n this.data.alarms.forEach(function (alarm) {\n g += alarm.toString();\n });\n\n // CATEGORIES\n if (this.data.categories.length > 0) {\n g +=\n 'CATEGORIES:' +\n this.data.categories\n .map((category) => category.toString())\n .join() +\n '\\r\\n';\n }\n\n // URL\n if (this.data.url) {\n g += 'URL;VALUE=URI:' + escape(this.data.url, false) + '\\r\\n';\n }\n\n // ATTACHMENT\n if (this.data.attachments.length > 0) {\n this.data.attachments.forEach((url) => {\n g += 'ATTACH:' + escape(url, false) + '\\r\\n';\n });\n }\n\n // STATUS\n if (this.data.status) {\n g += 'STATUS:' + this.data.status.toUpperCase() + '\\r\\n';\n }\n\n // BUSYSTATUS\n if (this.data.busystatus) {\n g +=\n 'X-MICROSOFT-CDO-BUSYSTATUS:' +\n this.data.busystatus.toUpperCase() +\n '\\r\\n';\n }\n\n // PRIORITY\n if (this.data.priority !== null) {\n g += 'PRIORITY:' + this.data.priority + '\\r\\n';\n }\n\n // CUSTOM X ATTRIBUTES\n g += generateCustomAttributes(this.data);\n\n // CREATED\n if (this.data.created) {\n g +=\n 'CREATED:' +\n formatDate(this.calendar.timezone(), this.data.created) +\n '\\r\\n';\n }\n\n // LAST-MODIFIED\n if (this.data.lastModified) {\n g +=\n 'LAST-MODIFIED:' +\n formatDate(this.calendar.timezone(), this.data.lastModified) +\n '\\r\\n';\n }\n\n if (this.data.class) {\n g += 'CLASS:' + this.data.class.toUpperCase() + '\\r\\n';\n }\n\n g += 'END:VEVENT\\r\\n';\n return g;\n }\n\n /**\n * Get the event's transparency\n * @since 1.7.3\n */\n transparency(): ICalEventTransparency | null;\n /**\n * Set the event's transparency\n *\n * Set the field to `OPAQUE` if the person or resource is no longer\n * available due to this event. If the calendar entry has no influence\n * on availability, you can set the field to `TRANSPARENT`. This value\n * is mostly used to find out if a person has time on a certain date or\n * not (see `TRANSP` in iCal specification).\n *\n * ```javascript\n * import ical, {ICalEventTransparency} from 'ical-generator';\n * event.transparency(ICalEventTransparency.OPAQUE);\n * ```\n *\n * @since 1.7.3\n */\n transparency(transparency: ICalEventTransparency | null): this;\n transparency(\n transparency?: ICalEventTransparency | null,\n ): ICalEventTransparency | null | this {\n if (transparency === undefined) {\n return this.data.transparency;\n }\n if (!transparency) {\n this.data.transparency = null;\n return this;\n }\n\n this.data.transparency = checkEnum(\n ICalEventTransparency,\n transparency,\n ) as ICalEventTransparency;\n return this;\n }\n\n /**\n * Get the event's ID\n * @since 0.2.0\n * @see {@link id}\n */\n uid(): string;\n /**\n * Use this method to set the event's ID.\n * If not set, a UUID will be generated randomly.\n *\n * @param id Event ID you want to set\n */\n uid(id: number | string): this;\n uid(id?: number | string): string | this {\n return id === undefined ? this.id() : this.id(id);\n }\n\n /**\n * Get the event's URL\n * @since 0.2.0\n */\n url(): null | string;\n /**\n * Set the event's URL\n * @since 0.2.0\n */\n url(url: null | string): this;\n url(url?: null | string): null | string | this {\n if (url === undefined) {\n return this.data.url;\n }\n\n this.data.url = url ? String(url) : null;\n return this;\n }\n\n /**\n * Set X-* attributes. Woun't filter double attributes,\n * which are also added by another method (e.g. summary),\n * so these attributes may be inserted twice.\n *\n * ```javascript\n * event.x([\n * {\n * key: \"X-MY-CUSTOM-ATTR\",\n * value: \"1337!\"\n * }\n * ]);\n *\n * event.x([\n * [\"X-MY-CUSTOM-ATTR\", \"1337!\"]\n * ]);\n *\n * event.x({\n * \"X-MY-CUSTOM-ATTR\": \"1337!\"\n * });\n * ```\n *\n * @since 1.9.0\n */\n x(\n keyOrArray:\n | [string, string][]\n | Record<string, string>\n | { key: string; value: string }[],\n ): this;\n /**\n * Set a X-* attribute. Woun't filter double attributes,\n * which are also added by another method (e.g. summary),\n * so these attributes may be inserted twice.\n *\n * ```javascript\n * event.x(\"X-MY-CUSTOM-ATTR\", \"1337!\");\n * ```\n *\n * @since 1.9.0\n */\n x(keyOrArray: string, value: string): this;\n /**\n * Get all custom X-* attributes.\n * @since 1.9.0\n */\n x(): { key: string; value: string }[];\n x(\n keyOrArray?:\n | [string, string][]\n | Record<string, string>\n | string\n | { key: string; value: string }[],\n value?: string,\n ): this | void | { key: string; value: string }[] {\n if (keyOrArray === undefined) {\n return addOrGetCustomAttributes(this.data);\n }\n\n if (typeof keyOrArray === 'string' && typeof value === 'string') {\n addOrGetCustomAttributes(this.data, keyOrArray, value);\n }\n if (typeof keyOrArray === 'object') {\n addOrGetCustomAttributes(this.data, keyOrArray);\n }\n\n return this;\n }\n\n /**\n * Checks if the start date is after the end date and swaps them if necessary.\n * @private\n */\n private swapStartAndEndIfRequired(): void {\n if (\n this.data.start &&\n this.data.end &&\n toDate(this.data.start).getTime() > toDate(this.data.end).getTime()\n ) {\n const t = this.data.start;\n this.data.start = this.data.end;\n this.data.end = t;\n }\n }\n}\n","'use strict';\n\nimport ICalEvent, {\n type ICalEventData,\n type ICalEventJSONData,\n} from './event.ts';\nimport {\n addOrGetCustomAttributes,\n checkEnum,\n foldLines,\n generateCustomAttributes,\n isMomentDuration,\n toDurationString,\n} from './tools.ts';\nimport { type ICalMomentDurationStub, type ICalTimezone } from './types.ts';\n\nexport enum ICalCalendarMethod {\n ADD = 'ADD',\n CANCEL = 'CANCEL',\n COUNTER = 'COUNTER',\n DECLINECOUNTER = 'DECLINECOUNTER',\n PUBLISH = 'PUBLISH',\n REFRESH = 'REFRESH',\n REPLY = 'REPLY',\n REQUEST = 'REQUEST',\n}\n\nexport interface ICalCalendarData {\n description?: null | string;\n events?: (ICalEvent | ICalEventData)[];\n method?: ICalCalendarMethod | null;\n name?: null | string;\n prodId?: ICalCalendarProdIdData | string;\n scale?: null | string;\n source?: null | string;\n timezone?: ICalTimezone | null | string;\n ttl?: ICalMomentDurationStub | null | number;\n url?: null | string;\n x?:\n | [string, string][]\n | Record<string, string>\n | { key: string; value: string }[];\n}\n\nexport interface ICalCalendarJSONData {\n description: null | string;\n events: ICalEventJSONData[];\n method: ICalCalendarMethod | null;\n name: null | string;\n prodId: string;\n scale: null | string;\n source: null | string;\n timezone: null | string;\n ttl: null | number;\n url: null | string;\n x: { key: string; value: string }[];\n}\n\nexport interface ICalCalendarProdIdData {\n company: string;\n language?: string;\n product: string;\n}\n\ninterface ICalCalendarInternalData {\n description: null | string;\n events: ICalEvent[];\n method: ICalCalendarMethod | null;\n name: null | string;\n prodId: string;\n scale: null | string;\n source: null | string;\n timezone: ICalTimezone | null;\n ttl: null | number;\n url: null | string;\n x: [string, string][];\n}\n\n/**\n * Usually you get an {@link ICalCalendar} object like this:\n * ```javascript\n * import ical from 'ical-generator';\n * const calendar = ical();\n * ```\n *\n * But you can also use the constructor directly like this:\n * ```javascript\n * import {ICalCalendar} from 'ical-generator';\n * const calendar = new ICalCalendar();\n * ```\n */\nexport default class ICalCalendar {\n private readonly data: ICalCalendarInternalData;\n\n /**\n * You can pass options to set up your calendar or use setters to do this.\n *\n * ```javascript\n * * import ical from 'ical-generator';\n *\n * // or use require:\n * // const { default: ical } = require('ical-generator');\n *\n *\n * const cal = ical({name: 'my first iCal'});\n *\n * // is the same as\n *\n * const cal = ical().name('my first iCal');\n *\n * // is the same as\n *\n * const cal = ical();\n * cal.name('sebbo.net');\n * ```\n *\n * `cal.toString()` would then produce the following string:\n * ```text\n * BEGIN:VCALENDAR\n * VERSION:2.0\n * PRODID:-//sebbo.net//ical-generator//EN\n * NAME:sebbo.net\n * X-WR-CALNAME:sebbo.net\n * END:VCALENDAR\n * ```\n *\n * @param data Calendar data\n */\n constructor(data: ICalCalendarData = {}) {\n this.data = {\n description: null,\n events: [],\n method: null,\n name: null,\n prodId: '//sebbo.net//ical-generator//EN',\n scale: null,\n source: null,\n timezone: null,\n ttl: null,\n url: null,\n x: [],\n };\n\n if (data.prodId !== undefined) this.prodId(data.prodId);\n if (data.method !== undefined) this.method(data.method);\n if (data.name !== undefined) this.name(data.name);\n if (data.description !== undefined) this.description(data.description);\n if (data.timezone !== undefined) this.timezone(data.timezone);\n if (data.source !== undefined) this.source(data.source);\n if (data.url !== undefined) this.url(data.url);\n if (data.scale !== undefined) this.scale(data.scale);\n if (data.ttl !== undefined) this.ttl(data.ttl);\n if (data.events !== undefined) this.events(data.events);\n if (data.x !== undefined) this.x(data.x);\n }\n\n /**\n * Remove all events from the calendar without\n * touching any other data like name or prodId.\n *\n * @since 2.0.0-develop.1\n */\n clear(): this {\n this.data.events = [];\n return this;\n }\n\n /**\n * Creates a new {@link ICalEvent} and returns it. Use options to prefill the event's attributes.\n * Calling this method without options will create an empty event.\n *\n * ```javascript\n * import ical from 'ical-generator';\n *\n * // or use require:\n * // const { default: ical } = require('ical-generator');\n *\n * const cal = ical();\n * const event = cal.createEvent({summary: 'My Event'});\n *\n * // overwrite event summary\n * event.summary('Your Event');\n * ```\n *\n * @since 0.2.0\n */\n createEvent(data: ICalEvent | ICalEventData): ICalEvent {\n const event =\n data instanceof ICalEvent ? data : new ICalEvent(data, this);\n this.data.events.push(event);\n return event;\n }\n /**\n * Get your feed's description\n * @since 0.2.7\n */\n description(): null | string;\n /**\n * Set your feed's description\n * @since 0.2.7\n */\n description(description: null | string): this;\n description(description?: null | string): null | string | this {\n if (description === undefined) {\n return this.data.description;\n }\n\n this.data.description = description ? String(description) : null;\n return this;\n }\n /**\n * Returns all events of this calendar.\n *\n * ```javascript\n * const cal = ical();\n *\n * cal.events([\n * {\n * start: new Date(),\n * end: new Date(new Date().getTime() + 3600000),\n * summary: 'Example Event',\n * description: 'It works ;)',\n * url: 'http://sebbo.net/'\n * }\n * ]);\n *\n * cal.events(); // --> [ICalEvent]\n * ```\n *\n * @since 0.2.0\n */\n events(): ICalEvent[];\n /**\n * Add multiple events to your calendar.\n *\n * ```javascript\n * const cal = ical();\n *\n * cal.events([\n * {\n * start: new Date(),\n * end: new Date(new Date().getTime() + 3600000),\n * summary: 'Example Event',\n * description: 'It works ;)',\n * url: 'http://sebbo.net/'\n * }\n * ]);\n *\n * cal.events(); // --> [ICalEvent]\n * ```\n *\n * @since 0.2.0\n */\n events(events: (ICalEvent | ICalEventData)[]): this;\n events(events?: (ICalEvent | ICalEventData)[]): ICalEvent[] | this {\n if (!events) {\n return this.data.events;\n }\n\n events.forEach((e: ICalEvent | ICalEventData) => this.createEvent(e));\n return this;\n }\n /**\n * Get the number of events added to your calendar\n */\n length(): number {\n return this.data.events.length;\n }\n\n /**\n * Get the feed method attribute.\n * See {@link ICalCalendarMethod} for possible results.\n *\n * @since 0.2.8\n */\n method(): ICalCalendarMethod | null;\n /**\n * Set the feed method attribute.\n * See {@link ICalCalendarMethod} for available options.\n *\n * #### Typescript Example\n * ```typescript\n * import {ICalCalendarMethod} from 'ical-generator';\n *\n * // METHOD:PUBLISH\n * calendar.method(ICalCalendarMethod.PUBLISH);\n * ```\n *\n * @since 0.2.8\n */\n method(method: ICalCalendarMethod | null): this;\n method(\n method?: ICalCalendarMethod | null,\n ): ICalCalendarMethod | null | this {\n if (method === undefined) {\n return this.data.method;\n }\n if (!method) {\n this.data.method = null;\n return this;\n }\n\n this.data.method = checkEnum(\n ICalCalendarMethod,\n method,\n ) as ICalCalendarMethod;\n return this;\n }\n\n /**\n * Get your feed's name\n * @since 0.2.0\n */\n name(): null | string;\n /**\n * Set your feed's name. Is used to fill `NAME`\n * and `X-WR-CALNAME` in your iCal file.\n *\n * ```typescript\n * import ical from 'ical-generator';\n *\n * const cal = ical();\n * cal.name('Next Arrivals');\n *\n * cal.toString();\n * ```\n *\n * ```text\n * BEGIN:VCALENDAR\n * VERSION:2.0\n * PRODID:-//sebbo.net//ical-generator//EN\n * NAME:Next Arrivals\n * X-WR-CALNAME:Next Arrivals\n * END:VCALENDAR\n * ```\n *\n * @since 0.2.0\n */\n name(name: null | string): this;\n name(name?: null | string): null | string | this {\n if (name === undefined) {\n return this.data.name;\n }\n\n this.data.name = name ? String(name) : null;\n return this;\n }\n /**\n * Get your feed's prodid. Will always return a string.\n * @since 0.2.0\n */\n prodId(): string;\n /**\n * Set your feed's prodid. `prodid` can be either a\n * string like `//sebbo.net//ical-generator//EN` or a\n * valid {@link ICalCalendarProdIdData} object. `language`\n * is optional and defaults to `EN`.\n *\n * ```javascript\n * cal.prodId({\n * company: 'My Company',\n * product: 'My Product',\n * language: 'EN' // optional, defaults to EN\n * });\n * ```\n *\n * `cal.toString()` would then produce the following string:\n * ```text\n * PRODID:-//My Company//My Product//EN\n * ```\n *\n * @since 0.2.0\n */\n prodId(prodId: ICalCalendarProdIdData | string): this;\n prodId(prodId?: ICalCalendarProdIdData | string): string | this {\n if (!prodId) {\n return this.data.prodId;\n }\n\n if (typeof prodId === 'string') {\n this.data.prodId = prodId;\n return this;\n }\n\n if (typeof prodId !== 'object') {\n throw new Error('`prodid` needs to be a string or an object!');\n }\n\n if (!prodId.company) {\n throw new Error('`prodid.company` is a mandatory item!');\n }\n if (!prodId.product) {\n throw new Error('`prodid.product` is a mandatory item!');\n }\n\n const language = (prodId.language || 'EN').toUpperCase();\n this.data.prodId =\n '//' + prodId.company + '//' + prodId.product + '//' + language;\n return this;\n }\n /**\n * Get current value of the `CALSCALE` attribute. It will\n * return `null` if no value was set. The iCal standard\n * specifies this as `GREGORIAN` if no value is present.\n *\n * @since 1.8.0\n */\n scale(): null | string;\n /**\n * Use this method to set your feed's `CALSCALE` attribute. There is no\n * default value for this property and it will not appear in your iCal\n * file unless set. The iCal standard specifies this as `GREGORIAN` if\n * no value is present.\n *\n * ```javascript\n * cal.scale('gregorian');\n * ```\n *\n * @since 1.8.0\n */\n scale(scale: null | string): this;\n scale(scale?: null | string): null | string | this {\n if (scale === undefined) {\n return this.data.scale;\n }\n\n if (scale === null) {\n this.data.scale = null;\n } else {\n this.data.scale = scale.toUpperCase();\n }\n\n return this;\n }\n /**\n * Get current value of the `SOURCE` attribute.\n * @since 2.2.0-develop.1\n */\n source(): null | string;\n /**\n * Use this method to set your feed's `SOURCE` attribute.\n * This tells the client where to refresh your feed.\n *\n * ```javascript\n * cal.source('http://example.com/my/original_source.ical');\n * ```\n *\n * ```text\n * SOURCE;VALUE=URI:http://example.com/my/original_source.ical\n * ```\n *\n * @since 2.2.0-develop.1\n */\n source(source: null | string): this;\n source(source?: null | string): null | string | this {\n if (source === undefined) {\n return this.data.source;\n }\n\n this.data.source = source || null;\n return this;\n }\n /**\n * Get the current calendar timezone\n * @since 0.2.0\n */\n timezone(): null | string;\n /**\n * Use this method to set your feed's timezone. Is used\n * to fill `TIMEZONE-ID` and `X-WR-TIMEZONE` in your iCal export.\n * Please not that all date values are treaded differently, if\n * a timezone was set. See {@link formatDate} for details. If no\n * time zone is specified, all information is output as UTC.\n *\n * ```javascript\n * cal.timezone('America/New_York');\n * ```\n *\n * @see https://github.com/sebbo2002/ical-generator#-date-time--timezones\n * @since 0.2.0\n */\n timezone(timezone: null | string): this;\n /**\n * Sets the time zone to be used in this calendar file for all times of all\n * events. Please note that if the time zone is set, ical-generator assumes\n * that all times are already in the correct time zone. Alternatively, a\n * `moment-timezone` or a Luxon object can be passed with `setZone`,\n * ical-generator will then set the time zone itself.\n *\n * For the best support of time zones, a VTimezone entry in the calendar is\n * recommended, which informs the client about the corresponding time zones\n * (daylight saving time, deviation from UTC, etc.). `ical-generator` itself\n * does not have a time zone database, so an external generator is needed here.\n *\n * A VTimezone generator is a function that takes a time zone as a string and\n * returns a VTimezone component according to the ical standard. For example,\n * ical-timezones can be used for this:\n *\n * ```typescript\n * import ical from 'ical-generator';\n * import {getVtimezoneComponent} from '@touch4it/ical-timezones';\n *\n * const cal = ical();\n * cal.timezone({\n * name: 'FOO',\n * generator: getVtimezoneComponent\n * });\n * cal.createEvent({\n * start: new Date(),\n * timezone: 'Europe/London'\n * });\n * ```\n *\n * @see https://github.com/sebbo2002/ical-generator#-date-time--timezones\n * @since 2.0.0\n */\n timezone(timezone: ICalTimezone | null | string): this;\n timezone(timezone?: ICalTimezone | null | string): null | string | this {\n if (timezone === undefined) {\n return this.data.timezone?.name || null;\n }\n\n if (timezone === 'UTC') {\n this.data.timezone = null;\n } else if (typeof timezone === 'string') {\n this.data.timezone = { name: timezone };\n } else if (timezone === null) {\n this.data.timezone = null;\n } else {\n this.data.timezone = timezone;\n }\n\n return this;\n }\n\n /**\n * Return a shallow copy of the calendar's options for JSON stringification.\n * Third party objects like moment.js values or RRule objects are stringified\n * as well. Can be used for persistence.\n *\n * ```javascript\n * const cal = ical();\n * const json = JSON.stringify(cal);\n *\n * // later: restore calendar data\n * cal = ical(JSON.parse(json));\n * ```\n *\n * @since 0.2.4\n */\n toJSON(): ICalCalendarJSONData {\n return Object.assign({}, this.data, {\n events: this.data.events.map((event) => event.toJSON()),\n timezone: this.timezone(),\n x: this.x(),\n });\n }\n\n /**\n * Return generated calendar as a string.\n *\n * ```javascript\n * const cal = ical();\n * console.log(cal.toString()); // → BEGIN:VCALENDAR…\n * ```\n */\n toString(): string {\n let g = '';\n\n // VCALENDAR and VERSION\n g = 'BEGIN:VCALENDAR\\r\\nVERSION:2.0\\r\\n';\n\n // PRODID\n g += 'PRODID:-' + this.data.prodId + '\\r\\n';\n\n // URL\n if (this.data.url) {\n g += 'URL:' + this.data.url + '\\r\\n';\n }\n\n // SOURCE\n if (this.data.source) {\n g += 'SOURCE;VALUE=URI:' + this.data.source + '\\r\\n';\n }\n\n // CALSCALE\n if (this.data.scale) {\n g += 'CALSCALE:' + this.data.scale + '\\r\\n';\n }\n\n // METHOD\n if (this.data.method) {\n g += 'METHOD:' + this.data.method + '\\r\\n';\n }\n\n // NAME\n if (this.data.name) {\n g += 'NAME:' + this.data.name + '\\r\\n';\n g += 'X-WR-CALNAME:' + this.data.name + '\\r\\n';\n }\n\n // Description\n if (this.data.description) {\n g += 'X-WR-CALDESC:' + this.data.description + '\\r\\n';\n }\n\n // Timezone\n if (this.data.timezone?.generator) {\n const timezones = [\n ...new Set([\n this.timezone(),\n ...this.data.events.map((event) => event.timezone()),\n ]),\n ].filter((tz) => tz !== null && !tz.startsWith('/')) as string[];\n\n timezones.forEach((tz) => {\n if (!this.data.timezone?.generator) {\n return;\n }\n\n const s = this.data.timezone.generator(tz);\n if (!s) {\n return;\n }\n\n g +=\n s.replace(/\\r\\n/g, '\\n').replace(/\\n/g, '\\r\\n').trim() +\n '\\r\\n';\n });\n }\n if (this.data.timezone?.name) {\n g += 'TIMEZONE-ID:' + this.data.timezone.name + '\\r\\n';\n g += 'X-WR-TIMEZONE:' + this.data.timezone.name + '\\r\\n';\n }\n\n // TTL\n if (this.data.ttl) {\n g +=\n 'REFRESH-INTERVAL;VALUE=DURATION:' +\n toDurationString(this.data.ttl) +\n '\\r\\n';\n g += 'X-PUBLISHED-TTL:' + toDurationString(this.data.ttl) + '\\r\\n';\n }\n\n // Events\n this.data.events.forEach((event) => (g += event.toString()));\n\n // CUSTOM X ATTRIBUTES\n g += generateCustomAttributes(this.data);\n\n g += 'END:VCALENDAR';\n\n return foldLines(g);\n }\n\n /**\n * Get the current ttl duration in seconds\n * @since 0.2.5\n */\n ttl(): null | number;\n /**\n * Use this method to set your feed's time to live\n * (in seconds). Is used to fill `REFRESH-INTERVAL` and\n * `X-PUBLISHED-TTL` in your iCal.\n *\n * ```javascript\n * const cal = ical().ttl(60 * 60 * 24); // 1 day\n * ```\n *\n * You can also pass a moment.js duration object. Zero, null\n * or negative numbers will reset the `ttl` attribute.\n *\n * @since 0.2.5\n */\n ttl(ttl: ICalMomentDurationStub | null | number): this;\n ttl(ttl?: ICalMomentDurationStub | null | number): null | number | this {\n if (ttl === undefined) {\n return this.data.ttl;\n }\n\n if (isMomentDuration(ttl)) {\n this.data.ttl = ttl.asSeconds();\n } else if (ttl && ttl > 0) {\n this.data.ttl = ttl;\n } else {\n this.data.ttl = null;\n }\n\n return this;\n }\n\n /**\n * Get your feed's URL\n * @since 0.2.5\n */\n url(): null | string;\n /**\n * Set your feed's URL\n *\n * ```javascript\n * calendar.url('http://example.com/my/feed.ical');\n * ```\n *\n * @since 0.2.5\n */\n url(url: null | string): this;\n url(url?: null | string): null | string | this {\n if (url === undefined) {\n return this.data.url;\n }\n\n this.data.url = url || null;\n return this;\n }\n /**\n * Set X-* attributes. Woun't filter double attributes,\n * which are also added by another method (e.g. busystatus),\n * so these attributes may be inserted twice.\n *\n * ```javascript\n * calendar.x([\n * {\n * key: \"X-MY-CUSTOM-ATTR\",\n * value: \"1337!\"\n * }\n * ]);\n *\n * calendar.x([\n * [\"X-MY-CUSTOM-ATTR\", \"1337!\"]\n * ]);\n *\n * calendar.x({\n * \"X-MY-CUSTOM-ATTR\": \"1337!\"\n * });\n * ```\n *\n * ```text\n * BEGIN:VCALENDAR\n * VERSION:2.0\n * PRODID:-//sebbo.net//ical-generator//EN\n * X-MY-CUSTOM-ATTR:1337!\n * END:VCALENDAR\n * ```\n *\n * @since 1.9.0\n */\n x(\n keyOrArray:\n | [string, string][]\n | Record<string, string>\n | { key: string; value: string }[],\n ): this;\n /**\n * Set a X-* attribute. Woun't filter double attributes,\n * which are also added by another method (e.g. busystatus),\n * so these attributes may be inserted twice.\n *\n * ```javascript\n * calendar.x(\"X-MY-CUSTOM-ATTR\", \"1337!\");\n * ```\n *\n * ```text\n * BEGIN:VCALENDAR\n * VERSION:2.0\n * PRODID:-//sebbo.net//ical-generator//EN\n * X-MY-CUSTOM-ATTR:1337!\n * END:VCALENDAR\n * ```\n *\n * @since 1.9.0\n */\n x(keyOrArray: string, value: string): this;\n /**\n * Get all custom X-* attributes.\n * @since 1.9.0\n */\n x(): { key: string; value: string }[];\n x(\n keyOrArray?:\n | [string, string][]\n | Record<string, string>\n | string\n | { key: string; value: string }[],\n value?: string,\n ): this | void | { key: string; value: string }[] {\n if (keyOrArray === undefined) {\n return addOrGetCustomAttributes(this.data);\n }\n\n if (typeof keyOrArray === 'string' && typeof value === 'string') {\n addOrGetCustomAttributes(this.data, keyOrArray, value);\n } else if (typeof keyOrArray === 'object') {\n addOrGetCustomAttributes(this.data, keyOrArray);\n } else {\n throw new Error('Either key or value is not a string!');\n }\n\n return this;\n }\n}\n"],"mappings":"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","names":["index_exports","__export","ICalAlarm","ICalAlarmRelatesTo","ICalAlarmType","ICalAttendee","ICalAttendeeRole","ICalAttendeeStatus","ICalAttendeeType","ICalCalendar","ICalCalendarMethod","ICalCategory","ICalEvent","ICalEventBusyStatus","ICalEventClass","ICalEventRepeatingFreq","ICalEventStatus","ICalEventTransparency","ICalWeekday","index_default","escape","foldLines","formatDate","formatDateTZ","__toCommonJS","ICalEventRepeatingFreq","ICalWeekday","addOrGetCustomAttributes","data","keyOrArray","value","o","key","a","checkDate","attribute","isLuxonDate","isMoment","isDayjs","checkEnum","type","allowedValues","valueStr","checkNameAndMail","result","match","escape","str","inQuotes","foldLines","input","line","c","ch","charsize","formatDate","timezone","d","dateonly","floating","m","isTZDate","isMomentTZ","formatDateTZ","property","date","eventData","tzParam","generateCustomAttributes","isMomentDuration","isRRule","toDate","toDurationString","seconds","string","toJSON","ICalAttendeeRole","ICalAttendeeScheduleAgent","ICalAttendeeStatus","ICalAttendeeType","ICalAttendee","_ICalAttendee","data","parent","delegatedFrom","checkNameAndMail","delegatedTo","options","a","email","mailto","name","role","checkEnum","rsvp","scheduleAgent","status","g","escape","key","value","type","keyOrArray","addOrGetCustomAttributes","ICalAlarmType","ICalAlarmRelatesTo","ICalAlarm","data","event","attachment","_attach","attendees","attendee","ICalAttendee","checkNameAndMail","description","relatesTo","repeat","summary","trigger","toJSON","g","toDurationString","formatDate","escape","generateCustomAttributes","checkDate","type","keyOrArray","value","addOrGetCustomAttributes","ICalCategory","data","name","escape","ICalEventBusyStatus","ICalEventClass","ICalEventStatus","ICalEventTransparency","ICalEvent","data","calendar","alarms","alarm","allDay","attachments","attachment","attendees","attendee","busystatus","checkEnum","categories","category","class_","ICalAlarm","url","ICalAttendee","checkNameAndMail","ICalCategory","created","checkDate","description","end","floating","id","lastModified","location","organizer","priority","recurrenceId","repeating","isRRule","ICalEventRepeatingFreq","byDayArray","day","ICalWeekday","byMonthArray","month","byMonthDayArray","monthDay","bySetPosArray","bySetPos","excludeArray","exclude","sequence","s","stamp","start","status","summary","timezone","d","toJSON","g","formatDate","formatDateTZ","l","excludedDate","escape","generateCustomAttributes","transparency","keyOrArray","value","addOrGetCustomAttributes","toDate","ICalCalendarMethod","ICalCalendar","data","event","ICalEvent","description","events","method","checkEnum","name","prodId","language","scale","source","timezone","g","tz","s","toDurationString","generateCustomAttributes","foldLines","ttl","isMomentDuration","url","keyOrArray","value","addOrGetCustomAttributes","ical","data","ICalCalendar","index_default"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/types.ts","../src/tools.ts","../src/attendee.ts","../src/alarm.ts","../src/category.ts","../src/event.ts","../src/calendar.ts"],"sourcesContent":["/**\n * ical-generator entrypoint\n */\n\n'use strict';\n\nimport ICalCalendar, { type ICalCalendarData } from './calendar.ts';\n\n/**\n * Create a new, empty calendar and returns it.\n *\n * ```javascript\n * import ical from 'ical-generator';\n *\n * // or use require:\n * // const { default: ical } = require('ical-generator');\n *\n * const cal = ical();\n * ```\n *\n * You can pass options to setup your calendar or use setters to do this.\n *\n * ```javascript\n * import ical from 'ical-generator';\n *\n * // or use require:\n * // const { default: ical } = require('ical-generator');\n * const cal = ical({domain: 'sebbo.net'});\n *\n * // is the same as\n *\n * const cal = ical().domain('sebbo.net');\n *\n * // is the same as\n *\n * const cal = ical();\n * cal.domain('sebbo.net');\n * ```\n *\n * @param data Calendar data\n */\nfunction ical(data?: ICalCalendarData): ICalCalendar {\n return new ICalCalendar(data);\n}\n\nexport default ical;\n\nexport {\n default as ICalAlarm,\n type ICalAlarmBaseData,\n type ICalAlarmData,\n type ICalAlarmJSONData,\n ICalAlarmRelatesTo,\n type ICalAlarmRepeatData,\n type ICalAlarmTriggerAfterData,\n type ICalAlarmTriggerBeforeData,\n type ICalAlarmTriggerData,\n ICalAlarmType,\n type ICalAlarmTypeValue,\n type ICalAttachment,\n} from './alarm.ts';\n\nexport {\n default as ICalAttendee,\n type ICalAttendeeData,\n type ICalAttendeeJSONData,\n ICalAttendeeRole,\n type ICalAttendeeScheduleAgent,\n ICalAttendeeStatus,\n ICalAttendeeType,\n} from './attendee.ts';\n\nexport {\n default as ICalCalendar,\n type ICalCalendarData,\n type ICalCalendarJSONData,\n ICalCalendarMethod,\n type ICalCalendarProdIdData,\n} from './calendar.ts';\n\nexport {\n default as ICalCategory,\n type ICalCategoryData,\n type ICalCategoryJSONData,\n} from './category.ts';\n\nexport {\n default as ICalEvent,\n ICalEventBusyStatus,\n ICalEventClass,\n type ICalEventData,\n type ICalEventJSONData,\n type ICalEventJSONRepeatingData,\n ICalEventStatus,\n ICalEventTransparency,\n} from './event.ts';\n\nexport { escape, foldLines, formatDate, formatDateTZ } from './tools.ts';\n\nexport {\n type ICalDateTimeValue,\n type ICalDayJsStub,\n type ICalDescription,\n ICalEventRepeatingFreq,\n type ICalGeo,\n type ICalLocation,\n type ICalLocationWithoutTitle,\n type ICalLocationWithTitle,\n type ICalLuxonDateTimeStub,\n type ICalMomentDurationStub,\n type ICalMomentStub,\n type ICalMomentTimezoneStub,\n type ICalOrganizer,\n type ICalRepeatingOptions,\n type ICalRRuleStub,\n type ICalTimezone,\n type ICalTZDateStub,\n ICalWeekday,\n} from './types.ts';\n","export enum ICalEventRepeatingFreq {\n DAILY = 'DAILY',\n HOURLY = 'HOURLY',\n MINUTELY = 'MINUTELY',\n MONTHLY = 'MONTHLY',\n SECONDLY = 'SECONDLY',\n WEEKLY = 'WEEKLY',\n YEARLY = 'YEARLY',\n}\n\nexport enum ICalWeekday {\n FR = 'FR',\n MO = 'MO',\n SA = 'SA',\n SU = 'SU',\n TH = 'TH',\n TU = 'TU',\n WE = 'WE',\n}\n\n/**\n * ical-generator supports [native Date](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date),\n * [moment.js](https://momentjs.com/) (and [moment-timezone](https://momentjs.com/timezone/), [Day.js](https://day.js.org/en/) and\n * [Luxon](https://moment.github.io/luxon/)'s [DateTime](https://moment.github.io/luxon/docs/class/src/datetime.js~DateTime.html)\n * objects. You can also pass a string which is then passed to javascript's Date internally.\n */\nexport type ICalDateTimeValue =\n | Date\n | ICalDayJsStub\n | ICalLuxonDateTimeStub\n | ICalMomentStub\n | ICalMomentTimezoneStub\n | string;\n\nexport interface ICalDayJsStub {\n format(format?: string): string;\n isValid(): boolean;\n toDate(): Date;\n toJSON(): string;\n tz(zone?: string): ICalDayJsStub;\n utc(): ICalDayJsStub;\n}\n\nexport interface ICalDescription {\n html?: string;\n plain: string;\n}\n\nexport interface ICalGeo {\n lat: number;\n lon: number;\n}\n\nexport type ICalLocation = ICalLocationWithoutTitle | ICalLocationWithTitle;\n\nexport interface ICalLocationWithoutTitle {\n geo: ICalGeo;\n}\n\nexport interface ICalLocationWithTitle {\n address?: string;\n geo?: ICalGeo;\n radius?: number;\n title: string;\n}\n\nexport interface ICalLuxonDateTimeStub {\n get isValid(): boolean;\n setZone(zone?: string): ICalLuxonDateTimeStub;\n toFormat(fmt: string): string;\n toJSDate(): Date;\n toJSON(): null | string;\n zone: { type: string };\n}\n\nexport interface ICalMomentDurationStub {\n asSeconds(): number;\n}\n\nexport interface ICalMomentStub {\n clone(): ICalMomentStub;\n format(format?: string): string;\n isValid(): boolean;\n toDate(): Date;\n toJSON(): string;\n utc(): ICalMomentStub;\n}\n\nexport interface ICalMomentTimezoneStub extends ICalMomentStub {\n clone(): ICalMomentTimezoneStub;\n tz(): string | undefined;\n tz(timezone: string): ICalMomentTimezoneStub;\n utc(): ICalMomentTimezoneStub;\n}\n\nexport interface ICalOrganizer {\n email: string;\n mailto?: string;\n name: string;\n sentBy?: string;\n}\n\nexport interface ICalRepeatingOptions {\n byDay?: ICalWeekday | ICalWeekday[];\n byMonth?: number | number[];\n byMonthDay?: number | number[];\n bySetPos?: number | number[];\n count?: number;\n exclude?: ICalDateTimeValue | ICalDateTimeValue[];\n freq: ICalEventRepeatingFreq;\n interval?: number;\n startOfWeek?: ICalWeekday;\n until?: ICalDateTimeValue;\n}\n\nexport interface ICalRRuleStub {\n between(\n after: Date,\n before: Date,\n inc?: boolean,\n iterator?: (d: Date, len: number) => boolean,\n ): Date[];\n toString(): string;\n}\n\nexport interface ICalTimezone {\n generator?: (timezone: string) => null | string;\n name: null | string;\n}\n\nexport interface ICalTZDateStub extends Date {\n timeZone?: string;\n withTimeZone(timezone?: null | string): ICalTZDateStub;\n}\n","'use strict';\n\nimport {\n type ICalDateTimeValue,\n type ICalDayJsStub,\n type ICalLuxonDateTimeStub,\n type ICalMomentDurationStub,\n type ICalMomentStub,\n type ICalMomentTimezoneStub,\n type ICalOrganizer,\n type ICalRRuleStub,\n type ICalTZDateStub,\n} from './types.ts';\n\nexport function addOrGetCustomAttributes(\n data: { x: [string, string][] },\n keyOrArray:\n | [string, string][]\n | Record<string, string>\n | { key: string; value: string }[],\n): void;\n\nexport function addOrGetCustomAttributes(\n data: { x: [string, string][] },\n keyOrArray: string,\n value: string,\n): void;\n\nexport function addOrGetCustomAttributes(data: {\n x: [string, string][];\n}): { key: string; value: string }[];\n\nexport function addOrGetCustomAttributes(\n data: { x: [string, string][] },\n keyOrArray?:\n | [string, string][]\n | Record<string, string>\n | string\n | undefined\n | { key: string; value: string }[],\n value?: string | undefined,\n): void | { key: string; value: string }[] {\n if (Array.isArray(keyOrArray)) {\n data.x = keyOrArray.map(\n (o: [string, string] | { key: string; value: string }) => {\n if (Array.isArray(o)) {\n return o;\n }\n if (typeof o.key !== 'string' || typeof o.value !== 'string') {\n throw new Error('Either key or value is not a string!');\n }\n if (o.key.substr(0, 2) !== 'X-') {\n throw new Error('Key has to start with `X-`!');\n }\n\n return [o.key, o.value] as [string, string];\n },\n );\n } else if (typeof keyOrArray === 'object') {\n data.x = Object.entries(keyOrArray).map(([key, value]) => {\n if (typeof key !== 'string' || typeof value !== 'string') {\n throw new Error('Either key or value is not a string!');\n }\n if (key.substr(0, 2) !== 'X-') {\n throw new Error('Key has to start with `X-`!');\n }\n\n return [key, value];\n });\n } else if (typeof keyOrArray === 'string' && typeof value === 'string') {\n if (keyOrArray.substr(0, 2) !== 'X-') {\n throw new Error('Key has to start with `X-`!');\n }\n\n data.x.push([keyOrArray, value]);\n } else {\n return data.x.map((a) => ({\n key: a[0],\n value: a[1],\n }));\n }\n}\n\n/**\n * Checks if the given input is a valid date and\n * returns the internal representation (= moment object)\n */\nexport function checkDate(\n value: ICalDateTimeValue,\n attribute: string,\n): ICalDateTimeValue {\n // Date & String\n if (\n (value instanceof Date && isNaN(value.getTime())) ||\n (typeof value === 'string' && isNaN(new Date(value).getTime()))\n ) {\n throw new Error(`\\`${attribute}\\` has to be a valid date!`);\n }\n if (value instanceof Date || typeof value === 'string') {\n return value;\n }\n\n // Luxon\n if (isLuxonDate(value) && value.isValid === true) {\n return value;\n }\n\n // Moment / Moment Timezone\n if ((isMoment(value) || isDayjs(value)) && value.isValid()) {\n return value;\n }\n\n throw new Error(`\\`${attribute}\\` has to be a valid date!`);\n}\n/**\n * Checks if the given string `value` is a\n * valid one for the type `type`\n */\nexport function checkEnum(\n type: Record<string, string>,\n value: unknown,\n): unknown {\n const allowedValues = Object.values(type);\n const valueStr = String(value).toUpperCase();\n\n if (!valueStr || !allowedValues.includes(valueStr)) {\n throw new Error(\n `Input must be one of the following: ${allowedValues.join(', ')}`,\n );\n }\n\n return valueStr;\n}\n/**\n * Check the given string or ICalOrganizer. Parses\n * the string for name and email address if possible.\n *\n * @param attribute Attribute name for error messages\n * @param value Value to parse name/email from\n */\nexport function checkNameAndMail(\n attribute: string,\n value: ICalOrganizer | string,\n): ICalOrganizer {\n let result: ICalOrganizer | null = null;\n\n if (typeof value === 'string') {\n const match = value.match(/^(.+) ?<([^>]+)>$/);\n if (match) {\n result = {\n email: match[2].trim(),\n name: match[1].trim(),\n };\n } else if (value.includes('@')) {\n result = {\n email: value.trim(),\n name: value.trim(),\n };\n }\n } else if (typeof value === 'object') {\n result = {\n email: value.email,\n mailto: value.mailto,\n name: value.name,\n sentBy: value.sentBy,\n };\n }\n\n if (!result && typeof value === 'string') {\n throw new Error(\n '`' +\n attribute +\n \"` isn't formated correctly. See https://sebbo2002.github.io/ical-generator/develop/\" +\n 'reference/interfaces/ICalOrganizer.html',\n );\n } else if (!result) {\n throw new Error(\n '`' +\n attribute +\n '` needs to be a valid formed string or an object. See https://sebbo2002.github.io/' +\n 'ical-generator/develop/reference/interfaces/ICalOrganizer.html',\n );\n }\n\n if (!result.name) {\n throw new Error('`' + attribute + '.name` is empty!');\n }\n if (!result.email) {\n throw new Error('`' + attribute + '.email` is empty!');\n }\n\n return result;\n}\n/**\n * Escapes special characters in the given string\n */\nexport function escape(str: string | unknown, inQuotes: boolean): string {\n return String(str)\n .replace(inQuotes ? /[\\\\\"]/g : /[\\\\;,]/g, function (match) {\n return '\\\\' + match;\n })\n .replace(/(?:\\r\\n|\\r|\\n)/g, '\\\\n');\n}\n\n/**\n * Trim line length of given string\n */\nexport function foldLines(input: string): string {\n return input\n .split('\\r\\n')\n .map(function (line) {\n let result = '';\n let c = 0;\n for (let i = 0; i < line.length; i++) {\n let ch = line.charAt(i);\n\n // surrogate pair, see https://mathiasbynens.be/notes/javascript-encoding#surrogate-pairs\n if (ch >= '\\ud800' && ch <= '\\udbff') {\n ch += line.charAt(++i);\n }\n\n // TextEncoder is available in browsers and node.js >= 11.0.0\n const charsize = new TextEncoder().encode(ch).length;\n c += charsize;\n if (c > 74) {\n result += '\\r\\n ';\n c = charsize;\n }\n\n result += ch;\n }\n return result;\n })\n .join('\\r\\n');\n}\n\n/**\n * Converts a valid date/time object supported by this library to a string.\n */\nexport function formatDate(\n timezone: null | string,\n d: ICalDateTimeValue,\n dateonly?: boolean,\n floating?: boolean,\n): string {\n if (timezone?.startsWith('/')) {\n timezone = timezone.substr(1);\n }\n\n if (typeof d === 'string' || d instanceof Date) {\n // TZDate is an extension of the native Date object.\n // @see https://github.com/date-fns/tz for more information.\n const m = isTZDate(d) ? d.withTimeZone(timezone) : new Date(d);\n\n // (!dateonly && !floating) || !timezone => utc\n let s =\n m.getUTCFullYear() +\n String(m.getUTCMonth() + 1).padStart(2, '0') +\n m.getUTCDate().toString().padStart(2, '0');\n\n // (dateonly || floating) && timezone => tz\n if (timezone) {\n s =\n m.getFullYear() +\n String(m.getMonth() + 1).padStart(2, '0') +\n m.getDate().toString().padStart(2, '0');\n }\n\n if (dateonly) {\n return s;\n }\n\n if (timezone) {\n s +=\n 'T' +\n m.getHours().toString().padStart(2, '0') +\n m.getMinutes().toString().padStart(2, '0') +\n m.getSeconds().toString().padStart(2, '0');\n\n return s;\n }\n\n s +=\n 'T' +\n m.getUTCHours().toString().padStart(2, '0') +\n m.getUTCMinutes().toString().padStart(2, '0') +\n m.getUTCSeconds().toString().padStart(2, '0') +\n (floating ? '' : 'Z');\n\n return s;\n } else if (isMoment(d)) {\n // @see https://momentjs.com/timezone/docs/#/using-timezones/parsing-in-zone/\n const m = timezone\n ? isMomentTZ(d) && !d.tz()\n ? d.clone().tz(timezone)\n : d\n : floating || (dateonly && isMomentTZ(d) && d.tz())\n ? d\n : d.utc();\n\n return (\n m.format('YYYYMMDD') +\n (!dateonly\n ? 'T' + m.format('HHmmss') + (floating || timezone ? '' : 'Z')\n : '')\n );\n } else if (isLuxonDate(d)) {\n const m = timezone\n ? d.setZone(timezone)\n : floating || (dateonly && d.zone.type !== 'system')\n ? d\n : d.setZone('utc');\n\n return (\n m.toFormat('yyyyLLdd') +\n (!dateonly\n ? 'T' + m.toFormat('HHmmss') + (floating || timezone ? '' : 'Z')\n : '')\n );\n } else {\n // @see https://day.js.org/docs/en/plugin/utc\n\n let m = d;\n if (timezone) {\n m = typeof d.tz === 'function' ? d.tz(timezone) : d;\n } else if (floating) {\n // m = d;\n } else if (typeof d.utc === 'function') {\n m = d.utc();\n } else {\n throw new Error(\n 'Unable to convert dayjs object to UTC value: UTC plugin is not available!',\n );\n }\n\n return (\n m.format('YYYYMMDD') +\n (!dateonly\n ? 'T' + m.format('HHmmss') + (floating || timezone ? '' : 'Z')\n : '')\n );\n }\n}\n\n/**\n * Converts a valid date/time object supported by this library to a string.\n * For information about this format, see RFC 5545, section 3.3.5\n * https://tools.ietf.org/html/rfc5545#section-3.3.5\n */\nexport function formatDateTZ(\n timezone: null | string,\n property: string,\n date: Date | ICalDateTimeValue | string,\n eventData?: { floating?: boolean | null; timezone?: null | string },\n): string {\n let tzParam = '';\n let floating = eventData?.floating || false;\n\n if (eventData?.timezone) {\n tzParam = ';TZID=' + eventData.timezone;\n\n // This isn't a 'floating' event because it has a timezone;\n // but we use it to omit the 'Z' UTC specifier in formatDate()\n floating = true;\n }\n\n return (\n property + tzParam + ':' + formatDate(timezone, date, false, floating)\n );\n}\n\nexport function generateCustomAttributes(data: {\n x: [string, string][];\n}): string {\n const str = data.x\n .map(([key, value]) => key.toUpperCase() + ':' + escape(value, false))\n .join('\\r\\n');\n return str.length ? str + '\\r\\n' : '';\n}\n\nexport function isDayjs(value: ICalDateTimeValue): value is ICalDayJsStub {\n return (\n typeof value === 'object' &&\n value !== null &&\n !(value instanceof Date) &&\n !isMoment(value) &&\n !isLuxonDate(value)\n );\n}\n\nexport function isLuxonDate(\n value: ICalDateTimeValue,\n): value is ICalLuxonDateTimeStub {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'toJSDate' in value &&\n typeof value.toJSDate === 'function'\n );\n}\nexport function isMoment(value: ICalDateTimeValue): value is ICalMomentStub {\n // @ts-expect-error _isAMomentObject is a private property\n return value != null && value._isAMomentObject != null;\n}\nexport function isMomentDuration(\n value: unknown,\n): value is ICalMomentDurationStub {\n return (\n value !== null &&\n typeof value === 'object' &&\n 'asSeconds' in value &&\n typeof value.asSeconds === 'function'\n );\n}\nexport function isMomentTZ(\n value: ICalDateTimeValue,\n): value is ICalMomentTimezoneStub {\n return isMoment(value) && 'tz' in value && typeof value.tz === 'function';\n}\n\nexport function isRRule(value: unknown): value is ICalRRuleStub {\n return (\n value !== null &&\n typeof value === 'object' &&\n 'between' in value &&\n typeof value.between === 'function' &&\n typeof value.toString === 'function'\n );\n}\n\nexport function isTZDate(value: ICalDateTimeValue): value is ICalTZDateStub {\n return (\n value instanceof Date &&\n 'internal' in value &&\n value.internal instanceof Date &&\n 'withTimeZone' in value &&\n typeof value.withTimeZone === 'function' &&\n 'tzComponents' in value &&\n typeof value.tzComponents === 'function'\n );\n}\n\nexport function toDate(value: ICalDateTimeValue): Date {\n if (typeof value === 'string' || value instanceof Date) {\n return new Date(value);\n }\n\n if (isLuxonDate(value)) {\n return value.toJSDate();\n }\n\n return value.toDate();\n}\n\nexport function toDurationString(seconds: number): string {\n let string = '';\n\n // < 0\n if (seconds < 0) {\n string = '-';\n seconds *= -1;\n }\n\n string += 'P';\n\n // DAYS\n if (seconds >= 86400) {\n string += Math.floor(seconds / 86400) + 'D';\n seconds %= 86400;\n }\n if (!seconds && string.length > 1) {\n return string;\n }\n\n string += 'T';\n\n // HOURS\n if (seconds >= 3600) {\n string += Math.floor(seconds / 3600) + 'H';\n seconds %= 3600;\n }\n\n // MINUTES\n if (seconds >= 60) {\n string += Math.floor(seconds / 60) + 'M';\n seconds %= 60;\n }\n\n // SECONDS\n if (seconds > 0) {\n string += seconds + 'S';\n } else if (string.length <= 2) {\n string += '0S';\n }\n\n return string;\n}\n\nexport function toJSON(\n value: ICalDateTimeValue | null | undefined,\n): null | string | undefined {\n if (!value) {\n return null;\n }\n if (typeof value === 'string') {\n return value;\n }\n\n return value.toJSON();\n}\n","'use strict';\n\nimport type ICalAlarm from './alarm.ts';\nimport type ICalEvent from './event.ts';\n\nimport {\n addOrGetCustomAttributes,\n checkEnum,\n checkNameAndMail,\n escape,\n} from './tools.ts';\n\nexport enum ICalAttendeeRole {\n CHAIR = 'CHAIR',\n NON = 'NON-PARTICIPANT',\n OPT = 'OPT-PARTICIPANT',\n REQ = 'REQ-PARTICIPANT',\n}\n\n// ref: https://datatracker.ietf.org/doc/html/rfc6638#section-7.1\nexport enum ICalAttendeeScheduleAgent {\n CLIENT = 'CLIENT',\n NONE = 'NONE',\n SERVER = 'SERVER',\n}\n\nexport enum ICalAttendeeStatus {\n ACCEPTED = 'ACCEPTED',\n DECLINED = 'DECLINED',\n DELEGATED = 'DELEGATED',\n NEEDSACTION = 'NEEDS-ACTION',\n TENTATIVE = 'TENTATIVE',\n}\n\n// ref: https://tools.ietf.org/html/rfc2445#section-4.2.3\nexport enum ICalAttendeeType {\n GROUP = 'GROUP',\n INDIVIDUAL = 'INDIVIDUAL',\n RESOURCE = 'RESOURCE',\n ROOM = 'ROOM',\n UNKNOWN = 'UNKNOWN',\n}\nexport interface ICalAttendeeData {\n delegatedFrom?: ICalAttendee | ICalAttendeeData | null | string;\n delegatedTo?: ICalAttendee | ICalAttendeeData | null | string;\n delegatesFrom?: ICalAttendee | ICalAttendeeData | null | string;\n delegatesTo?: ICalAttendee | ICalAttendeeData | null | string;\n email: string;\n mailto?: null | string;\n name?: null | string;\n role?: ICalAttendeeRole;\n rsvp?: boolean | null;\n scheduleAgent?: ICalAttendeeScheduleAgent | ICalXName | null;\n sentBy?: null | string;\n status?: ICalAttendeeStatus | null;\n type?: ICalAttendeeType | null;\n x?:\n | [string, string][]\n | Record<string, string>\n | { key: string; value: string }[];\n}\n\nexport interface ICalAttendeeJSONData {\n delegatedFrom: null | string;\n delegatedTo: null | string;\n email: string;\n mailto: null | string;\n name: null | string;\n role: ICalAttendeeRole;\n rsvp: boolean | null;\n sentBy: null | string;\n status: ICalAttendeeStatus | null;\n type: ICalAttendeeType | null;\n x: { key: string; value: string }[];\n}\n\nexport type ICalXName = `X-${string}`;\n\ninterface ICalInternalAttendeeData {\n delegatedFrom: ICalAttendee | null;\n delegatedTo: ICalAttendee | null;\n email: string;\n mailto: null | string;\n name: null | string;\n role: ICalAttendeeRole;\n rsvp: boolean | null;\n scheduleAgent: ICalAttendeeScheduleAgent | ICalXName | null;\n sentBy: null | string;\n status: ICalAttendeeStatus | null;\n type: ICalAttendeeType | null;\n x: [string, string][];\n}\n\n/**\n * Usually you get an {@link ICalAttendee} object like this:\n *\n * ```javascript\n * import ical from 'ical-generator';\n * const calendar = ical();\n * const event = calendar.createEvent();\n * const attendee = event.createAttendee({ email: 'mail@example.com' });\n * ```\n *\n * You can also use the {@link ICalAttendee} object directly:\n *\n * ```javascript\n * import ical, {ICalAttendee} from 'ical-generator';\n * const attendee = new ICalAttendee({ email: 'mail@example.com' });\n * event.attendees([attendee]);\n * ```\n */\nexport default class ICalAttendee {\n private readonly data: ICalInternalAttendeeData;\n private readonly parent: ICalAlarm | ICalEvent;\n\n /**\n * Constructor of {@link ICalAttendee}. The event reference is\n * required to query the calendar's timezone when required.\n *\n * @param data Attendee Data\n * @param parent Reference to ICalEvent object\n */\n constructor(data: ICalAttendeeData, parent: ICalAlarm | ICalEvent) {\n this.data = {\n delegatedFrom: null,\n delegatedTo: null,\n email: '',\n mailto: null,\n name: null,\n role: ICalAttendeeRole.REQ,\n rsvp: null,\n scheduleAgent: null,\n sentBy: null,\n status: null,\n type: null,\n x: [],\n };\n this.parent = parent;\n if (!this.parent) {\n throw new Error('`event` option required!');\n }\n if (!data.email) {\n throw new Error('No value for `email` in ICalAttendee given!');\n }\n\n if (data.name !== undefined) this.name(data.name);\n if (data.email !== undefined) this.email(data.email);\n if (data.mailto !== undefined) this.mailto(data.mailto);\n if (data.sentBy !== undefined) this.sentBy(data.sentBy);\n if (data.status !== undefined) this.status(data.status);\n if (data.role !== undefined) this.role(data.role);\n if (data.rsvp !== undefined) this.rsvp(data.rsvp);\n if (data.type !== undefined) this.type(data.type);\n if (data.delegatedTo !== undefined) this.delegatedTo(data.delegatedTo);\n if (data.delegatedFrom !== undefined)\n this.delegatedFrom(data.delegatedFrom);\n if (data.delegatesTo) this.delegatesTo(data.delegatesTo);\n if (data.delegatesFrom) this.delegatesFrom(data.delegatesFrom);\n if (data.scheduleAgent !== undefined)\n this.scheduleAgent(data.scheduleAgent);\n if (data.x !== undefined) this.x(data.x);\n }\n\n /**\n * Get the attendee's delegated-from field\n * @since 0.2.0\n */\n delegatedFrom(): ICalAttendee | null;\n /**\n * Set the attendee's delegated-from field\n *\n * Creates a new Attendee if the passed object is not already a\n * {@link ICalAttendee} object. Will set the `delegatedTo` and\n * `delegatedFrom` attributes.\n *\n * @param delegatedFrom\n */\n delegatedFrom(\n delegatedFrom: ICalAttendee | ICalAttendeeData | null | string,\n ): this;\n delegatedFrom(\n delegatedFrom?: ICalAttendee | ICalAttendeeData | null | string,\n ): ICalAttendee | null | this {\n if (delegatedFrom === undefined) {\n return this.data.delegatedFrom;\n }\n\n if (!delegatedFrom) {\n this.data.delegatedFrom = null;\n } else if (typeof delegatedFrom === 'string') {\n this.data.delegatedFrom = new ICalAttendee(\n checkNameAndMail('delegatedFrom', delegatedFrom),\n this.parent,\n );\n } else if (delegatedFrom instanceof ICalAttendee) {\n this.data.delegatedFrom = delegatedFrom;\n } else {\n this.data.delegatedFrom = new ICalAttendee(\n delegatedFrom,\n this.parent,\n );\n }\n\n return this;\n }\n\n /**\n * Get the attendee's delegated-to value.\n * @since 0.2.0\n */\n delegatedTo(): ICalAttendee | null;\n /**\n * Set the attendee's delegated-to field.\n *\n * Creates a new Attendee if the passed object is not already a\n * {@link ICalAttendee} object. Will set the `delegatedTo` and\n * `delegatedFrom` attributes.\n *\n * Will also set the `status` to `DELEGATED`, if attribute is set.\n *\n * ```javascript\n * const cal = ical();\n * const event = cal.createEvent();\n * const attendee = cal.createAttendee();\n *\n * attendee.delegatesTo({email: 'foo@bar.com', name: 'Foo'});\n ```\n *\n * @since 0.2.0\n */\n delegatedTo(\n delegatedTo: ICalAttendee | ICalAttendeeData | null | string,\n ): this;\n delegatedTo(\n delegatedTo?: ICalAttendee | ICalAttendeeData | null | string,\n ): ICalAttendee | null | this {\n if (delegatedTo === undefined) {\n return this.data.delegatedTo;\n }\n if (!delegatedTo) {\n this.data.delegatedTo = null;\n if (this.data.status === ICalAttendeeStatus.DELEGATED) {\n this.data.status = null;\n }\n return this;\n }\n\n if (typeof delegatedTo === 'string') {\n this.data.delegatedTo = new ICalAttendee(\n checkNameAndMail('delegatedTo', delegatedTo),\n this.parent,\n );\n } else if (delegatedTo instanceof ICalAttendee) {\n this.data.delegatedTo = delegatedTo;\n } else {\n this.data.delegatedTo = new ICalAttendee(delegatedTo, this.parent);\n }\n\n this.data.status = ICalAttendeeStatus.DELEGATED;\n return this;\n }\n\n /**\n * Create a new attendee this attendee delegates from and returns\n * this new attendee. Creates a new attendee if the passed object\n * is not already an {@link ICalAttendee}.\n *\n * ```javascript\n * const cal = ical();\n * const event = cal.createEvent();\n * const attendee = cal.createAttendee();\n *\n * attendee.delegatesFrom({email: 'foo@bar.com', name: 'Foo'});\n * ```\n *\n * @since 0.2.0\n */\n delegatesFrom(\n options: ICalAttendee | ICalAttendeeData | string,\n ): ICalAttendee {\n const a =\n options instanceof ICalAttendee\n ? options\n : this.parent.createAttendee(options);\n this.delegatedFrom(a);\n a.delegatedTo(this);\n return a;\n }\n\n /**\n * Create a new attendee this attendee delegates to and returns\n * this new attendee. Creates a new attendee if the passed object\n * is not already an {@link ICalAttendee}.\n *\n * ```javascript\n * const cal = ical();\n * const event = cal.createEvent();\n * const attendee = cal.createAttendee();\n *\n * attendee.delegatesTo({email: 'foo@bar.com', name: 'Foo'});\n * ```\n *\n * @since 0.2.0\n */\n delegatesTo(\n options: ICalAttendee | ICalAttendeeData | string,\n ): ICalAttendee {\n const a =\n options instanceof ICalAttendee\n ? options\n : this.parent.createAttendee(options);\n this.delegatedTo(a);\n a.delegatedFrom(this);\n return a;\n }\n /**\n * Get the attendee's email address\n * @since 0.2.0\n */\n email(): string;\n /**\n * Set the attendee's email address\n * @since 0.2.0\n */\n email(email: string): this;\n email(email?: string): string | this {\n if (!email) {\n return this.data.email;\n }\n\n this.data.email = email;\n return this;\n }\n /**\n * Get the attendee's email address\n * @since 1.3.0\n */\n mailto(): null | string;\n /**\n * Set the attendee's email address\n * @since 1.3.0\n */\n mailto(mailto: null | string): this;\n mailto(mailto?: null | string): null | string | this {\n if (mailto === undefined) {\n return this.data.mailto;\n }\n\n this.data.mailto = mailto || null;\n return this;\n }\n /**\n * Get the attendee's name\n * @since 0.2.0\n */\n name(): null | string;\n /**\n * Set the attendee's name\n * @since 0.2.0\n */\n name(name: null | string): this;\n name(name?: null | string): null | string | this {\n if (name === undefined) {\n return this.data.name;\n }\n\n this.data.name = name || null;\n return this;\n }\n /**\n * Get attendee's role\n * @since 0.2.0\n */\n role(): ICalAttendeeRole;\n /**\n * Set the attendee's role, defaults to `REQ` / `REQ-PARTICIPANT`.\n * Checkout {@link ICalAttendeeRole} for available roles.\n *\n * @since 0.2.0\n */\n role(role: ICalAttendeeRole): this;\n role(role?: ICalAttendeeRole): ICalAttendeeRole | this {\n if (role === undefined) {\n return this.data.role;\n }\n\n this.data.role = checkEnum(ICalAttendeeRole, role) as ICalAttendeeRole;\n return this;\n }\n /**\n * Get attendee's RSVP expectation\n * @since 0.2.1\n */\n rsvp(): boolean | null;\n /**\n * Set the attendee's RSVP expectation\n * @since 0.2.1\n */\n rsvp(rsvp: boolean | null): this;\n rsvp(rsvp?: boolean | null): boolean | null | this {\n if (rsvp === undefined) {\n return this.data.rsvp;\n }\n if (rsvp === null) {\n this.data.rsvp = null;\n return this;\n }\n\n this.data.rsvp = Boolean(rsvp);\n return this;\n }\n /**\n * Get attendee's schedule agent\n * @since 9.0.0\n */\n scheduleAgent(): ICalAttendeeScheduleAgent | ICalXName;\n /**\n * Set attendee's schedule agent\n * See {@link ICalAttendeeScheduleAgent} for available values.\n * You can also use custom X-* values.\n *\n * @since 9.0.0\n */\n scheduleAgent(\n scheduleAgent: ICalAttendeeScheduleAgent | ICalXName | null,\n ): this;\n scheduleAgent(\n scheduleAgent?: ICalAttendeeScheduleAgent | ICalXName | null,\n ): ICalAttendeeScheduleAgent | ICalXName | null | this {\n if (scheduleAgent === undefined) {\n return this.data.scheduleAgent;\n }\n if (!scheduleAgent) {\n this.data.scheduleAgent = null;\n return this;\n }\n\n if (\n typeof scheduleAgent == 'string' &&\n scheduleAgent.toUpperCase().startsWith('X-')\n ) {\n this.data.scheduleAgent = scheduleAgent as string as ICalXName;\n return this;\n }\n\n this.data.scheduleAgent = checkEnum(\n ICalAttendeeScheduleAgent,\n scheduleAgent,\n ) as ICalAttendeeScheduleAgent;\n return this;\n }\n /**\n * Get the acting user's email adress\n * @since 3.3.0\n */\n sentBy(): null | string;\n /**\n * Set the acting user's email adress\n * @since 3.3.0\n */\n sentBy(email: null | string): this;\n sentBy(email?: null | string): null | string | this {\n if (!email) {\n return this.data.sentBy;\n }\n\n this.data.sentBy = email;\n return this;\n }\n /**\n * Get attendee's status\n * @since 0.2.0\n */\n status(): ICalAttendeeStatus | null;\n /**\n * Set the attendee's status. See {@link ICalAttendeeStatus}\n * for available status options.\n *\n * @since 0.2.0\n */\n status(status: ICalAttendeeStatus | null): this;\n status(\n status?: ICalAttendeeStatus | null,\n ): ICalAttendeeStatus | null | this {\n if (status === undefined) {\n return this.data.status;\n }\n if (!status) {\n this.data.status = null;\n return this;\n }\n\n this.data.status = checkEnum(\n ICalAttendeeStatus,\n status,\n ) as ICalAttendeeStatus;\n return this;\n }\n /**\n * Return a shallow copy of the attendee's options for JSON stringification.\n * Can be used for persistence.\n *\n * @since 0.2.4\n */\n toJSON(): ICalAttendeeJSONData {\n return Object.assign({}, this.data, {\n delegatedFrom: this.data.delegatedFrom?.email() || null,\n delegatedTo: this.data.delegatedTo?.email() || null,\n x: this.x(),\n });\n }\n /**\n * Return generated attendee as a string.\n *\n * ```javascript\n * console.log(attendee.toString()); // → ATTENDEE;ROLE=…\n * ```\n */\n toString(): string {\n let g = 'ATTENDEE';\n\n if (!this.data.email) {\n throw new Error('No value for `email` in ICalAttendee given!');\n }\n\n // ROLE\n g += ';ROLE=' + this.data.role;\n\n // TYPE\n if (this.data.type) {\n g += ';CUTYPE=' + this.data.type;\n }\n\n // PARTSTAT\n if (this.data.status) {\n g += ';PARTSTAT=' + this.data.status;\n }\n\n // RSVP\n if (this.data.rsvp !== null) {\n g += ';RSVP=' + this.data.rsvp.toString().toUpperCase();\n }\n\n // SENT-BY\n if (this.data.sentBy !== null) {\n g += ';SENT-BY=\"mailto:' + this.data.sentBy + '\"';\n }\n\n // DELEGATED-TO\n if (this.data.delegatedTo) {\n g += ';DELEGATED-TO=\"' + this.data.delegatedTo.email() + '\"';\n }\n\n // DELEGATED-FROM\n if (this.data.delegatedFrom) {\n g += ';DELEGATED-FROM=\"' + this.data.delegatedFrom.email() + '\"';\n }\n\n // CN / Name\n if (this.data.name) {\n g += ';CN=\"' + escape(this.data.name, true) + '\"';\n }\n\n // EMAIL\n if (this.data.email && this.data.mailto) {\n g += ';EMAIL=' + escape(this.data.email, false);\n }\n\n // SCHEDULE-AGENT\n if (this.data.scheduleAgent) {\n g += ';SCHEDULE-AGENT=' + this.data.scheduleAgent;\n }\n\n // CUSTOM X ATTRIBUTES\n if (this.data.x.length) {\n g +=\n ';' +\n this.data.x\n .map(\n ([key, value]) =>\n key.toUpperCase() + '=' + escape(value, false),\n )\n .join(';');\n }\n\n g +=\n ':MAILTO:' +\n escape(this.data.mailto || this.data.email, false) +\n '\\r\\n';\n\n return g;\n }\n\n /**\n * Get attendee's type (a.k.a. CUTYPE)\n * @since 0.2.3\n */\n type(): ICalAttendeeType;\n /**\n * Set attendee's type (a.k.a. CUTYPE).\n * See {@link ICalAttendeeType} for available status options.\n *\n * @since 0.2.3\n */\n type(type: ICalAttendeeType | null): this;\n type(type?: ICalAttendeeType | null): ICalAttendeeType | null | this {\n if (type === undefined) {\n return this.data.type;\n }\n if (!type) {\n this.data.type = null;\n return this;\n }\n\n this.data.type = checkEnum(ICalAttendeeType, type) as ICalAttendeeType;\n return this;\n }\n /**\n * Set X-* attributes. Woun't filter double attributes,\n * which are also added by another method (e.g. status),\n * so these attributes may be inserted twice.\n *\n * ```javascript\n * attendee.x([\n * {\n * key: \"X-MY-CUSTOM-ATTR\",\n * value: \"1337!\"\n * }\n * ]);\n *\n * attendee.x([\n * [\"X-MY-CUSTOM-ATTR\", \"1337!\"]\n * ]);\n *\n * attendee.x({\n * \"X-MY-CUSTOM-ATTR\": \"1337!\"\n * });\n * ```\n *\n * @since 1.9.0\n */\n x(\n keyOrArray:\n | [string, string][]\n | Record<string, string>\n | { key: string; value: string }[],\n ): this;\n /**\n * Set a X-* attribute. Woun't filter double attributes,\n * which are also added by another method (e.g. status),\n * so these attributes may be inserted twice.\n *\n * ```javascript\n * attendee.x(\"X-MY-CUSTOM-ATTR\", \"1337!\");\n * ```\n *\n * @since 1.9.0\n */\n x(keyOrArray: string, value: string): this;\n /**\n * Get all custom X-* attributes.\n * @since 1.9.0\n */\n x(): { key: string; value: string }[];\n x(\n keyOrArray?:\n | [string, string][]\n | Record<string, string>\n | string\n | { key: string; value: string }[],\n value?: string,\n ): this | void | { key: string; value: string }[] {\n if (keyOrArray === undefined) {\n return addOrGetCustomAttributes(this.data);\n }\n\n if (typeof keyOrArray === 'string' && typeof value === 'string') {\n addOrGetCustomAttributes(this.data, keyOrArray, value);\n } else if (typeof keyOrArray === 'object') {\n addOrGetCustomAttributes(this.data, keyOrArray);\n } else {\n throw new Error('Either key or value is not a string!');\n }\n\n return this;\n }\n}\n","'use strict';\n\nimport type ICalEvent from './event.ts';\n\nimport ICalAttendee, { type ICalAttendeeData } from './attendee.ts';\nimport {\n addOrGetCustomAttributes,\n checkDate,\n checkNameAndMail,\n escape,\n formatDate,\n generateCustomAttributes,\n toDurationString,\n toJSON,\n} from './tools.ts';\nimport { type ICalDateTimeValue } from './types.ts';\n\nexport enum ICalAlarmType {\n audio = 'audio',\n display = 'display',\n email = 'email',\n}\n\nexport const ICalAlarmRelatesTo = {\n end: 'END',\n start: 'START',\n} as const;\n\nexport interface ICalAlarmBaseData {\n attach?: ICalAttachment | null | string;\n attendees?: ICalAttendee[] | ICalAttendeeData[];\n description?: null | string;\n relatesTo?: ICalAlarmRelatesTo | null;\n repeat?: ICalAlarmRepeatData | null;\n summary?: null | string;\n type?: ICalAlarmType;\n x?:\n | [string, string][]\n | Record<string, string>\n | { key: string; value: string }[];\n}\n\nexport type ICalAlarmData =\n | ICalAlarmBaseData\n | ICalAlarmTriggerAfterData\n | ICalAlarmTriggerBeforeData\n | ICalAlarmTriggerData;\n\nexport interface ICalAlarmJSONData {\n attach: ICalAttachment | null;\n attendees: ICalAttendee[];\n description: null | string;\n interval: null | number;\n relatesTo: ICalAlarmRelatesTo | null;\n repeat: ICalAlarmRepeatData | null;\n summary: null | string;\n trigger: number | string;\n type: ICalAlarmType;\n x: { key: string; value: string }[];\n}\n\nexport type ICalAlarmRelatesTo =\n (typeof ICalAlarmRelatesTo)[keyof typeof ICalAlarmRelatesTo];\n\nexport interface ICalAlarmRepeatData {\n interval: number;\n times: number;\n}\nexport type ICalAlarmTriggerAfterData = ICalAlarmBaseData & {\n triggerAfter: ICalDateTimeValue | number;\n};\nexport type ICalAlarmTriggerBeforeData = ICalAlarmBaseData & {\n triggerBefore: ICalDateTimeValue | number;\n};\n\nexport type ICalAlarmTriggerData = ICalAlarmBaseData & {\n trigger: ICalDateTimeValue | number;\n};\n\nexport type ICalAlarmTypeValue = keyof ICalAlarmType;\n\nexport interface ICalAttachment {\n mime: null | string;\n uri: string;\n}\n\ninterface ICalInternalAlarmData {\n attach: ICalAttachment | null;\n attendees: ICalAttendee[];\n description: null | string;\n interval: null | number;\n relatesTo: ICalAlarmRelatesTo | null;\n repeat: ICalAlarmRepeatData | null;\n summary: null | string;\n trigger: ICalDateTimeValue | number;\n type: ICalAlarmType;\n x: [string, string][];\n}\n\n/**\n * Usually you get an {@link ICalAlarm} object like this:\n *\n * ```javascript\n * import ical from 'ical-generator';\n * const calendar = ical();\n * const event = calendar.createEvent();\n * const alarm = event.createAlarm();\n * ```\n *\n * You can also use the {@link ICalAlarm} object directly:\n *\n * ```javascript\n * import ical, {ICalAlarm} from 'ical-generator';\n * const alarm = new ICalAlarm();\n * event.alarms([alarm]);\n * ```\n */\nexport default class ICalAlarm {\n private readonly data: ICalInternalAlarmData;\n private readonly event: ICalEvent;\n\n /**\n * Constructor of {@link ICalAttendee}. The event reference is required\n * to query the calendar's timezone and summary when required.\n *\n * @param data Alarm Data\n * @param event Reference to ICalEvent object\n */\n constructor(data: ICalAlarmData, event: ICalEvent) {\n this.data = {\n attach: null,\n attendees: [],\n description: null,\n interval: null,\n relatesTo: null,\n repeat: null,\n summary: null,\n trigger: -600,\n type: ICalAlarmType.display,\n x: [],\n };\n\n this.event = event;\n if (!event) {\n throw new Error('`event` option required!');\n }\n\n if (data.type !== undefined) this.type(data.type);\n if ('trigger' in data && data.trigger !== undefined)\n this.trigger(data.trigger);\n if ('triggerBefore' in data && data.triggerBefore !== undefined)\n this.triggerBefore(data.triggerBefore);\n if ('triggerAfter' in data && data.triggerAfter !== undefined)\n this.triggerAfter(data.triggerAfter);\n if (data.repeat) this.repeat(data.repeat);\n if (data.attach !== undefined) this.attach(data.attach);\n if (data.description !== undefined) this.description(data.description);\n if (data.summary !== undefined) this.summary(data.summary);\n if (data.attendees !== undefined) this.attendees(data.attendees);\n if (data.x !== undefined) this.x(data.x);\n }\n\n /**\n * Get Attachment\n * @since 0.2.1\n */\n attach(): null | { mime: null | string; uri: string };\n /**\n * Set Alarm attachment. Used to set the alarm sound\n * if alarm type is audio. Defaults to \"Basso\".\n *\n * ```javascript\n * const cal = ical();\n * const event = cal.createEvent();\n *\n * event.createAlarm({\n * attach: 'https://example.com/notification.aud'\n * });\n *\n * // OR\n *\n * event.createAlarm({\n * attach: {\n * uri: 'https://example.com/notification.aud',\n * mime: 'audio/basic'\n * }\n * });\n * ```\n *\n * @since 0.2.1\n */\n attach(\n attachment: null | string | { mime?: null | string; uri: string },\n ): this;\n attach(\n attachment?: null | string | { mime?: null | string; uri: string },\n ): null | this | { mime: null | string; uri: string } {\n if (attachment === undefined) {\n return this.data.attach;\n }\n if (!attachment) {\n this.data.attach = null;\n return this;\n }\n\n let _attach = null;\n if (typeof attachment === 'string') {\n _attach = {\n mime: null,\n uri: attachment,\n };\n } else if (typeof attachment === 'object') {\n _attach = {\n mime: attachment.mime || null,\n uri: attachment.uri,\n };\n } else {\n throw new Error(\n '`attachment` needs to be a valid formed string or an object. See https://sebbo2002.github.io/' +\n 'ical-generator/develop/reference/classes/ICalAlarm.html#attach',\n );\n }\n\n if (!_attach.uri) {\n throw new Error('`attach.uri` is empty!');\n }\n\n this.data.attach = {\n mime: _attach.mime,\n uri: _attach.uri,\n };\n return this;\n }\n\n /**\n * Get all attendees\n * @since 7.0.0\n */\n attendees(): ICalAttendee[];\n /**\n * Add multiple attendees to your event\n *\n * @since 7.0.0\n */\n attendees(attendees: (ICalAttendee | ICalAttendeeData | string)[]): this;\n attendees(\n attendees?: (ICalAttendee | ICalAttendeeData | string)[],\n ): ICalAttendee[] | this {\n if (!attendees) {\n return this.data.attendees;\n }\n\n attendees.forEach((attendee) => this.createAttendee(attendee));\n return this;\n }\n\n /**\n * Creates a new {@link ICalAttendee} and returns it. Use options to prefill\n * the attendee's attributes. Calling this method without options will create\n * an empty attendee.\n *\n * @since 7.0.0\n */\n createAttendee(\n data: ICalAttendee | ICalAttendeeData | string,\n ): ICalAttendee {\n if (data instanceof ICalAttendee) {\n this.data.attendees.push(data);\n return data;\n }\n if (typeof data === 'string') {\n data = checkNameAndMail('data', data);\n }\n\n const attendee = new ICalAttendee(data, this);\n this.data.attendees.push(attendee);\n return attendee;\n }\n\n /**\n * Get the alarm description. Used to set the alarm message\n * if alarm type is `display`. If the alarm type is `email`, it's\n * used to set the email body. Defaults to the event's summary.\n *\n * @since 0.2.1\n */\n description(): null | string;\n /**\n * Set the alarm description. Used to set the alarm message\n * if alarm type is `display`. If the alarm type is `email`, it's\n * used to set the email body. Defaults to the event's summary.\n *\n * @since 0.2.1\n */\n description(description: null | string): this;\n description(description?: null | string): null | string | this {\n if (description === undefined) {\n return this.data.description;\n }\n if (!description) {\n this.data.description = null;\n return this;\n }\n\n this.data.description = description;\n return this;\n }\n\n /**\n * Get to which time alarm trigger relates to.\n * Can be either `START` or `END`. If the value is\n * `START` the alarm is triggerd relative to the event start time.\n * If the value is `END` the alarm is triggerd relative to the event end time\n *\n * @since 4.0.1\n */\n relatesTo(): ICalAlarmRelatesTo | null;\n /**\n * Use this method to set to which time alarm trigger relates to.\n * Works only if trigger is a `number`\n *\n * ```javascript\n * const cal = ical();\n * const event = cal.createEvent();\n * const alarm = cal.createAlarm();\n *\n * alarm.trigger(600); // -> 10 minutes before event starts\n *\n * alarm.relatesTo('START'); // -> 10 minutes before event starts\n * alarm.relatesTo('END'); // -> 10 minutes before event ends\n *\n * alarm.trigger(-600); // -> 10 minutes after event starts\n *\n * alarm.relatesTo('START'); // -> 10 minutes after event starts\n * alarm.relatesTo('END'); // -> 10 minutes after event ends\n * ```\n * @since 4.0.1\n */\n relatesTo(relatesTo: ICalAlarmRelatesTo | null): this;\n relatesTo(\n relatesTo?: ICalAlarmRelatesTo | null,\n ): ICalAlarmRelatesTo | null | this {\n if (relatesTo === undefined) {\n return this.data.relatesTo;\n }\n if (!relatesTo) {\n this.data.relatesTo = null;\n return this;\n }\n\n if (!Object.values(ICalAlarmRelatesTo).includes(relatesTo)) {\n throw new Error(\n '`relatesTo` is not correct, must be either `START` or `END`!',\n );\n }\n\n this.data.relatesTo = relatesTo;\n return this;\n }\n\n /**\n * Get Alarm Repetitions\n * @since 0.2.1\n */\n repeat(): ICalAlarmRepeatData | null;\n /**\n * Set Alarm Repetitions. Use this to repeat the alarm.\n *\n * ```javascript\n * const cal = ical();\n * const event = cal.createEvent();\n *\n * // repeat the alarm 4 times every 5 minutes…\n * cal.createAlarm({\n * repeat: {\n * times: 4,\n * interval: 300\n * }\n * });\n * ```\n *\n * @since 0.2.1\n */\n repeat(repeat: ICalAlarmRepeatData | null): this;\n repeat(\n repeat?: ICalAlarmRepeatData | null,\n ): ICalAlarmRepeatData | null | this {\n if (repeat === undefined) {\n return this.data.repeat;\n }\n if (!repeat) {\n this.data.repeat = null;\n return this;\n }\n\n if (typeof repeat !== 'object') {\n throw new Error('`repeat` is not correct, must be an object!');\n }\n if (typeof repeat.times !== 'number' || !isFinite(repeat.times)) {\n throw new Error('`repeat.times` is not correct, must be numeric!');\n }\n if (typeof repeat.interval !== 'number' || !isFinite(repeat.interval)) {\n throw new Error(\n '`repeat.interval` is not correct, must be numeric!',\n );\n }\n\n this.data.repeat = repeat;\n return this;\n }\n\n /**\n * Get the alarm summary. Used to set the email subject\n * if alarm type is `email`. Defaults to the event's summary.\n *\n * @since 7.0.0\n */\n summary(): null | string;\n /**\n * Set the alarm summary. Used to set the email subject\n * if alarm type is display. Defaults to the event's summary.\n *\n * @since 0.2.1\n */\n summary(summary: null | string): this;\n summary(summary?: null | string): null | string | this {\n if (summary === undefined) {\n return this.data.summary;\n }\n if (!summary) {\n this.data.summary = null;\n return this;\n }\n\n this.data.summary = summary;\n return this;\n }\n\n /**\n * Return a shallow copy of the alarm's options for JSON stringification.\n * Third party objects like moment.js values are stringified as well. Can\n * be used for persistence.\n *\n * @since 0.2.4\n */\n toJSON(): ICalAlarmJSONData {\n const trigger = this.trigger();\n return Object.assign({}, this.data, {\n trigger: typeof trigger === 'number' ? trigger : toJSON(trigger),\n x: this.x(),\n });\n }\n /**\n * Return generated event as a string.\n *\n * ```javascript\n * const alarm = event.createAlarm();\n * console.log(alarm.toString()); // → BEGIN:VALARM…\n * ```\n */\n toString(): string {\n let g = 'BEGIN:VALARM\\r\\n';\n\n // ACTION\n g += 'ACTION:' + this.data.type.toUpperCase() + '\\r\\n';\n\n if (\n typeof this.data.trigger === 'number' &&\n this.data.relatesTo === null\n ) {\n if (this.data.trigger > 0) {\n g +=\n 'TRIGGER;RELATED=END:' +\n toDurationString(this.data.trigger) +\n '\\r\\n';\n } else {\n g += 'TRIGGER:' + toDurationString(this.data.trigger) + '\\r\\n';\n }\n } else if (typeof this.data.trigger === 'number') {\n g +=\n 'TRIGGER;RELATED=' +\n this.data.relatesTo?.toUpperCase() +\n ':' +\n toDurationString(this.data.trigger) +\n '\\r\\n';\n } else {\n g +=\n 'TRIGGER;VALUE=DATE-TIME:' +\n formatDate(this.event.timezone(), this.data.trigger) +\n '\\r\\n';\n }\n\n // REPEAT\n if (this.data.repeat) {\n if (!this.data.repeat.times) {\n throw new Error(\n 'No value for `repeat.times` in ICalAlarm given, but required for `interval`!',\n );\n }\n if (!this.data.repeat.interval) {\n throw new Error(\n 'No value for `repeat.interval` in ICalAlarm given, but required for `repeat`!',\n );\n }\n\n g += 'REPEAT:' + this.data.repeat.times + '\\r\\n';\n g +=\n 'DURATION:' +\n toDurationString(this.data.repeat.interval) +\n '\\r\\n';\n }\n\n // ATTACH\n if (\n this.data.type === 'audio' &&\n this.data.attach &&\n this.data.attach.mime\n ) {\n g +=\n 'ATTACH;FMTTYPE=' +\n escape(this.data.attach.mime, false) +\n ':' +\n escape(this.data.attach.uri, false) +\n '\\r\\n';\n } else if (this.data.type === 'audio' && this.data.attach) {\n g +=\n 'ATTACH;VALUE=URI:' +\n escape(this.data.attach.uri, false) +\n '\\r\\n';\n } else if (this.data.type === 'audio') {\n g += 'ATTACH;VALUE=URI:Basso\\r\\n';\n }\n\n // DESCRIPTION\n if (this.data.type !== 'audio' && this.data.description) {\n g += 'DESCRIPTION:' + escape(this.data.description, false) + '\\r\\n';\n } else if (this.data.type !== 'audio') {\n g += 'DESCRIPTION:' + escape(this.event.summary(), false) + '\\r\\n';\n }\n\n // SUMMARY\n if (this.data.type === 'email' && this.data.summary) {\n g += 'SUMMARY:' + escape(this.data.summary, false) + '\\r\\n';\n } else if (this.data.type === 'email') {\n g += 'SUMMARY:' + escape(this.event.summary(), false) + '\\r\\n';\n }\n\n // ATTENDEES\n if (this.data.type === 'email') {\n this.data.attendees.forEach((attendee) => {\n g += attendee.toString();\n });\n }\n\n // CUSTOM X ATTRIBUTES\n g += generateCustomAttributes(this.data);\n\n g += 'END:VALARM\\r\\n';\n return g;\n }\n\n /**\n * Get the trigger time for the alarm. Can either\n * be a date and time value ({@link ICalDateTimeValue}) or\n * a number, which will represent the seconds between\n * alarm and event start. The number is negative, if the\n * alarm is triggered after the event started.\n *\n * @since 0.2.1\n */\n trigger(): ICalDateTimeValue | number;\n /**\n * Use this method to set the alarm time.\n *\n * ```javascript\n * const cal = ical();\n * const event = cal.createEvent();\n * const alarm = cal.createAlarm();\n *\n * alarm.trigger(600); // -> 10 minutes before event starts\n * alarm.trigger(new Date()); // -> now\n * ```\n *\n * You can use any supported date object, see\n * [readme](https://github.com/sebbo2002/ical-generator#-date-time--timezones)\n * for details about supported values and timezone handling.\n *\n * @since 0.2.1\n */\n trigger(trigger: Date | ICalDateTimeValue | number): this;\n trigger(\n trigger?: Date | ICalDateTimeValue | number,\n ): ICalDateTimeValue | number | this {\n // Getter\n if (trigger === undefined && typeof this.data.trigger === 'number') {\n return -1 * this.data.trigger;\n }\n if (trigger === undefined) {\n return this.data.trigger;\n }\n\n // Setter\n if (typeof trigger === 'number' && isFinite(trigger)) {\n this.data.trigger = -1 * trigger;\n } else if (!trigger || typeof trigger === 'number') {\n throw new Error(\n '`trigger` is not correct, must be a finite number or a supported date!',\n );\n } else {\n this.data.trigger = checkDate(trigger, 'trigger');\n }\n\n return this;\n }\n\n /**\n * Get the trigger time for the alarm. Can either\n * be a date and time value ({@link ICalDateTimeValue}) or\n * a number, which will represent the seconds between\n * alarm and event start. The number is negative, if the\n * alarm is triggered before the event started.\n *\n * @since 0.2.1\n */\n triggerAfter(): ICalDateTimeValue | number;\n /**\n * Use this method to set the alarm time. Unlike `trigger`, this time\n * the alarm takes place after the event has started.\n *\n * ```javascript\n * const cal = ical();\n * const event = cal.createEvent();\n * const alarm = cal.createAlarm();\n *\n * alarm.trigger(600); // -> 10 minutes after event starts\n * ```\n *\n * You can use any supported date object, see\n * [readme](https://github.com/sebbo2002/ical-generator#-date-time--timezones)\n * for details about supported values and timezone handling.\n *\n * @since 0.2.1\n */\n triggerAfter(trigger: ICalDateTimeValue | number): this;\n triggerAfter(\n trigger?: ICalDateTimeValue | number,\n ): ICalDateTimeValue | number | this {\n if (trigger === undefined) {\n return this.data.trigger;\n }\n\n return this.trigger(\n typeof trigger === 'number' ? -1 * trigger : trigger,\n );\n }\n\n /**\n * Get the trigger time for the alarm. Can either\n * be a date and time value ({@link ICalDateTimeValue}) or\n * a number, which will represent the seconds between\n * alarm and event start. The number is negative, if the\n * alarm is triggered after the event started.\n *\n * @since 0.2.1\n * @see {@link trigger}\n * @see {@link triggerAfter}\n */\n triggerBefore(trigger: ICalDateTimeValue | number): this;\n /**\n * Use this method to set the alarm time.\n *\n * ```javascript\n * const cal = ical();\n * const event = cal.createEvent();\n * const alarm = cal.createAlarm();\n *\n * alarm.trigger(600); // -> 10 minutes before event starts\n * alarm.trigger(new Date()); // -> now\n * ```\n *\n * You can use any supported date object, see\n * [readme](https://github.com/sebbo2002/ical-generator#-date-time--timezones)\n * for details about supported values and timezone handling.\n *\n * @since 0.2.1\n * @see {@link trigger}\n * @see {@link triggerAfter}\n */\n triggerBefore(): ICalDateTimeValue | number;\n triggerBefore(\n trigger?: ICalDateTimeValue | number,\n ): ICalDateTimeValue | number | this {\n if (trigger === undefined) {\n return this.trigger();\n }\n\n return this.trigger(trigger);\n }\n /**\n * Get the alarm type\n * @since 0.2.1\n */\n type(type: ICalAlarmType): this;\n /**\n * Set the alarm type. See {@link ICalAlarmType}\n * for available status options.\n * @since 0.2.1\n */\n type(): ICalAlarmType;\n type(type?: ICalAlarmType): ICalAlarmType | this {\n if (type === undefined) {\n return this.data.type;\n }\n if (!type || !Object.keys(ICalAlarmType).includes(type)) {\n throw new Error(\n '`type` is not correct, must be either `display` or `audio`!',\n );\n }\n\n this.data.type = type;\n return this;\n }\n\n /**\n * Set X-* attributes. Woun't filter double attributes,\n * which are also added by another method (e.g. type),\n * so these attributes may be inserted twice.\n *\n * ```javascript\n * alarm.x([\n * {\n * key: \"X-MY-CUSTOM-ATTR\",\n * value: \"1337!\"\n * }\n * ]);\n *\n * alarm.x([\n * [\"X-MY-CUSTOM-ATTR\", \"1337!\"]\n * ]);\n *\n * alarm.x({\n * \"X-MY-CUSTOM-ATTR\": \"1337!\"\n * });\n * ```\n *\n * @since 1.9.0\n */\n x(\n keyOrArray:\n | [string, string][]\n | Record<string, string>\n | { key: string; value: string }[],\n ): this;\n /**\n * Set a X-* attribute. Woun't filter double attributes,\n * which are also added by another method (e.g. type),\n * so these attributes may be inserted twice.\n *\n * ```javascript\n * alarm.x(\"X-MY-CUSTOM-ATTR\", \"1337!\");\n * ```\n *\n * @since 1.9.0\n */\n x(keyOrArray: string, value: string): this;\n /**\n * Get all custom X-* attributes.\n * @since 1.9.0\n */\n x(): { key: string; value: string }[];\n x(\n keyOrArray?:\n | [string, string][]\n | Record<string, string>\n | string\n | { key: string; value: string }[],\n value?: string,\n ): this | void | { key: string; value: string }[] {\n if (keyOrArray === undefined) {\n return addOrGetCustomAttributes(this.data);\n }\n\n if (typeof keyOrArray === 'string' && typeof value === 'string') {\n addOrGetCustomAttributes(this.data, keyOrArray, value);\n } else if (typeof keyOrArray === 'object') {\n addOrGetCustomAttributes(this.data, keyOrArray);\n } else {\n throw new Error('Either key or value is not a string!');\n }\n\n return this;\n }\n}\n","'use strict';\n\nimport { escape } from './tools.ts';\n\nexport interface ICalCategoryData {\n name: string;\n}\n\nexport type ICalCategoryInternalData = ICalCategoryJSONData;\n\nexport interface ICalCategoryJSONData {\n name: string;\n}\n\n/**\n * Usually you get an {@link ICalCategory} object like this:\n *\n * ```javascript\n * import ical from 'ical-generator';\n * const calendar = ical();\n * const event = calendar.createEvent();\n * const category = event.createCategory();\n * ```\n *\n * You can also use the {@link ICalCategory} object directly:\n *\n * ```javascript\n * import ical, {ICalCategory} from 'ical-generator';\n * const category = new ICalCategory();\n * event.categories([category]);\n * ```\n */\nexport default class ICalCategory {\n private readonly data: ICalCategoryInternalData;\n\n /**\n * Constructor of {@link ICalCategory}.\n * @param data Category Data\n */\n constructor(data: ICalCategoryData) {\n this.data = {\n name: '',\n };\n\n if (!data.name) {\n throw new Error('No value for `name` in ICalCategory given!');\n }\n\n this.name(data.name);\n }\n\n /**\n * Get the category name\n * @since 0.3.0\n */\n name(): string;\n /**\n * Set the category name\n * @since 0.3.0\n */\n name(name: string): this;\n name(name?: string): string | this {\n if (name === undefined) {\n return this.data.name;\n }\n\n this.data.name = name;\n return this;\n }\n\n /**\n * Return a shallow copy of the category's options for JSON stringification.\n * Can be used for persistence.\n *\n * @since 0.2.4\n */\n toJSON(): ICalCategoryInternalData {\n return Object.assign({}, this.data);\n }\n\n /**\n * Return generated category name as a string.\n *\n * ```javascript\n * console.log(category.toString());\n * ```\n */\n toString(): string {\n // CN / Name\n return escape(this.data.name, false);\n }\n}\n","'use strict';\n\nimport ICalAlarm, { type ICalAlarmData } from './alarm.ts';\nimport ICalAttendee, { type ICalAttendeeData } from './attendee.ts';\nimport ICalCalendar from './calendar.ts';\nimport ICalCategory, { type ICalCategoryData } from './category.ts';\nimport {\n addOrGetCustomAttributes,\n checkDate,\n checkEnum,\n checkNameAndMail,\n escape,\n formatDate,\n formatDateTZ,\n generateCustomAttributes,\n isRRule,\n toDate,\n toJSON,\n} from './tools.ts';\nimport {\n type ICalDateTimeValue,\n type ICalDescription,\n ICalEventRepeatingFreq,\n type ICalLocation,\n type ICalOrganizer,\n type ICalRepeatingOptions,\n type ICalRRuleStub,\n ICalWeekday,\n} from './types.ts';\n\nexport enum ICalEventBusyStatus {\n BUSY = 'BUSY',\n FREE = 'FREE',\n OOF = 'OOF',\n TENTATIVE = 'TENTATIVE',\n}\n\nexport enum ICalEventClass {\n CONFIDENTIAL = 'CONFIDENTIAL',\n PRIVATE = 'PRIVATE',\n PUBLIC = 'PUBLIC',\n}\n\nexport enum ICalEventStatus {\n CANCELLED = 'CANCELLED',\n CONFIRMED = 'CONFIRMED',\n TENTATIVE = 'TENTATIVE',\n}\n\nexport enum ICalEventTransparency {\n OPAQUE = 'OPAQUE',\n TRANSPARENT = 'TRANSPARENT',\n}\n\nexport interface ICalEventData {\n alarms?: ICalAlarm[] | ICalAlarmData[];\n allDay?: boolean;\n attachments?: string[];\n attendees?: ICalAttendee[] | ICalAttendeeData[];\n busystatus?: ICalEventBusyStatus | null;\n categories?: ICalCategory[] | ICalCategoryData[];\n class?: ICalEventClass | null;\n created?: ICalDateTimeValue | null;\n description?: ICalDescription | null | string;\n end?: ICalDateTimeValue | null;\n floating?: boolean;\n id?: null | number | string;\n lastModified?: ICalDateTimeValue | null;\n location?: ICalLocation | null | string;\n organizer?: ICalOrganizer | null | string;\n priority?: null | number;\n recurrenceId?: ICalDateTimeValue | null;\n repeating?: ICalRepeatingOptions | ICalRRuleStub | null | string;\n sequence?: number;\n stamp?: ICalDateTimeValue;\n start: ICalDateTimeValue;\n status?: ICalEventStatus | null;\n summary?: string;\n timezone?: null | string;\n transparency?: ICalEventTransparency | null;\n url?: null | string;\n x?:\n | [string, string][]\n | Record<string, string>\n | { key: string; value: string }[];\n}\n\nexport interface ICalEventJSONData {\n alarms: ICalAlarm[];\n allDay: boolean;\n attachments: string[];\n attendees: ICalAttendee[];\n busystatus: ICalEventBusyStatus | null;\n categories: ICalCategory[];\n created: null | string;\n description: ICalDescription | null;\n end: null | string;\n floating: boolean;\n id: string;\n lastModified: null | string;\n location: ICalLocation | null;\n organizer: ICalOrganizer | null;\n priority?: null | number;\n recurrenceId: null | string;\n repeating: ICalEventJSONRepeatingData | null | string;\n sequence: number;\n stamp: string;\n start: string;\n status: ICalEventStatus | null;\n summary: string;\n timezone: null | string;\n transparency: ICalEventTransparency | null;\n url: null | string;\n x: { key: string; value: string }[];\n}\n\nexport interface ICalEventJSONRepeatingData {\n byDay?: ICalWeekday[];\n byMonth?: number[];\n byMonthDay?: number[];\n bySetPos?: number[];\n count?: number;\n exclude?: ICalDateTimeValue[];\n freq: ICalEventRepeatingFreq;\n interval?: number;\n startOfWeek?: ICalWeekday;\n until?: ICalDateTimeValue;\n}\n\ninterface ICalEventInternalData {\n alarms: ICalAlarm[];\n allDay: boolean;\n attachments: string[];\n attendees: ICalAttendee[];\n busystatus: ICalEventBusyStatus | null;\n categories: ICalCategory[];\n class: ICalEventClass | null;\n created: ICalDateTimeValue | null;\n description: ICalDescription | null;\n end: ICalDateTimeValue | null;\n floating: boolean;\n id: string;\n lastModified: ICalDateTimeValue | null;\n location: ICalLocation | null;\n organizer: ICalOrganizer | null;\n priority: null | number;\n recurrenceId: ICalDateTimeValue | null;\n repeating: ICalEventJSONRepeatingData | ICalRRuleStub | null | string;\n sequence: number;\n stamp: ICalDateTimeValue;\n start: ICalDateTimeValue;\n status: ICalEventStatus | null;\n summary: string;\n timezone: null | string;\n transparency: ICalEventTransparency | null;\n url: null | string;\n x: [string, string][];\n}\n\n/**\n * Usually you get an {@link ICalEvent} object like this:\n * ```javascript\n * import ical from 'ical-generator';\n * const calendar = ical();\n * const event = calendar.createEvent();\n * ```\n */\nexport default class ICalEvent {\n private readonly calendar: ICalCalendar;\n private readonly data: ICalEventInternalData;\n\n /**\n * Constructor of [[`ICalEvent`]. The calendar reference is\n * required to query the calendar's timezone when required.\n *\n * @param data Calendar Event Data\n * @param calendar Reference to ICalCalendar object\n */\n constructor(data: ICalEventData, calendar: ICalCalendar) {\n this.data = {\n alarms: [],\n allDay: false,\n attachments: [],\n attendees: [],\n busystatus: null,\n categories: [],\n class: null,\n created: null,\n description: null,\n end: null,\n floating: false,\n id: crypto.randomUUID(),\n lastModified: null,\n location: null,\n organizer: null,\n priority: null,\n recurrenceId: null,\n repeating: null,\n sequence: 0,\n stamp: new Date(),\n start: new Date(),\n status: null,\n summary: '',\n timezone: null,\n transparency: null,\n url: null,\n x: [],\n };\n\n this.calendar = calendar;\n if (!calendar) {\n throw new Error('`calendar` option required!');\n }\n\n if (data.id) this.id(data.id);\n if (data.sequence !== undefined) this.sequence(data.sequence);\n if (data.start) this.start(data.start);\n if (data.end !== undefined) this.end(data.end);\n if (data.recurrenceId !== undefined)\n this.recurrenceId(data.recurrenceId);\n if (data.timezone !== undefined) this.timezone(data.timezone);\n if (data.stamp !== undefined) this.stamp(data.stamp);\n if (data.allDay !== undefined) this.allDay(data.allDay);\n if (data.floating !== undefined) this.floating(data.floating);\n if (data.repeating !== undefined) this.repeating(data.repeating);\n if (data.summary !== undefined) this.summary(data.summary);\n if (data.location !== undefined) this.location(data.location);\n if (data.description !== undefined) this.description(data.description);\n if (data.organizer !== undefined) this.organizer(data.organizer);\n if (data.attendees !== undefined) this.attendees(data.attendees);\n if (data.alarms !== undefined) this.alarms(data.alarms);\n if (data.categories !== undefined) this.categories(data.categories);\n if (data.status !== undefined) this.status(data.status);\n if (data.busystatus !== undefined) this.busystatus(data.busystatus);\n if (data.priority !== undefined) this.priority(data.priority);\n if (data.url !== undefined) this.url(data.url);\n if (data.attachments !== undefined) this.attachments(data.attachments);\n if (data.transparency !== undefined)\n this.transparency(data.transparency);\n if (data.created !== undefined) this.created(data.created);\n if (data.lastModified !== undefined)\n this.lastModified(data.lastModified);\n if (data.class !== undefined) this.class(data.class);\n if (data.x !== undefined) this.x(data.x);\n }\n\n /**\n * Get all alarms\n * @since 0.2.0\n */\n alarms(): ICalAlarm[];\n /**\n * Add one or multiple alarms\n *\n * ```javascript\n * const event = ical().createEvent();\n *\n * cal.alarms([\n * {type: ICalAlarmType.display, trigger: 600},\n * {type: ICalAlarmType.audio, trigger: 300}\n * ]);\n *\n * cal.alarms(); // --> [ICalAlarm, ICalAlarm]\n ```\n *\n * @since 0.2.0\n */\n alarms(alarms: ICalAlarm[] | ICalAlarmData[]): this;\n alarms(alarms?: ICalAlarm[] | ICalAlarmData[]): ICalAlarm[] | this {\n if (!alarms) {\n return this.data.alarms;\n }\n\n alarms.forEach((alarm: ICalAlarm | ICalAlarmData) =>\n this.createAlarm(alarm),\n );\n return this;\n }\n\n /**\n * Get the event's allDay flag\n * @since 0.2.0\n */\n allDay(): boolean;\n /**\n * Set the event's allDay flag.\n *\n * ```javascript\n * event.allDay(true); // → appointment is for the whole day\n * ```\n *\n * ```typescript\n * import ical from 'ical-generator';\n *\n * const cal = ical();\n *\n * cal.createEvent({\n * start: new Date('2020-01-01'),\n * summary: 'Very Important Day',\n * allDay: true\n * });\n *\n * cal.toString();\n * ```\n *\n * ```text\n * BEGIN:VCALENDAR\n * VERSION:2.0\n * PRODID:-//sebbo.net//ical-generator//EN\n * BEGIN:VEVENT\n * UID:1964fe8d-32c5-4f2a-bd62-7d9d7de5992b\n * SEQUENCE:0\n * DTSTAMP:20240212T191956Z\n * DTSTART;VALUE=DATE:20200101\n * X-MICROSOFT-CDO-ALLDAYEVENT:TRUE\n * X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE\n * SUMMARY:Very Important Day\n * END:VEVENT\n * END:VCALENDAR\n * ```\n *\n * @since 0.2.0\n */\n allDay(allDay: boolean): this;\n allDay(allDay?: boolean): boolean | this {\n if (allDay === undefined) {\n return this.data.allDay;\n }\n\n this.data.allDay = Boolean(allDay);\n return this;\n }\n\n /**\n * Get all attachment urls\n * @since 3.2.0-develop.1\n */\n attachments(): string[];\n /**\n * Add one or multiple alarms\n *\n * ```javascript\n * const event = ical().createEvent();\n *\n * cal.attachments([\n * 'https://files.sebbo.net/calendar/attachments/foo',\n * 'https://files.sebbo.net/calendar/attachments/bar'\n * ]);\n *\n * cal.attachments(); // --> [string, string]\n ```\n *\n * 3.2.0-develop.1\n */\n attachments(attachments: string[]): this;\n attachments(attachments?: string[]): string[] | this {\n if (!attachments) {\n return this.data.attachments;\n }\n\n attachments.forEach((attachment: string) =>\n this.createAttachment(attachment),\n );\n return this;\n }\n\n /**\n * Get all attendees\n * @since 0.2.0\n */\n attendees(): ICalAttendee[];\n /**\n * Add multiple attendees to your event\n *\n * ```javascript\n * const event = ical().createEvent();\n *\n * cal.attendees([\n * {email: 'a@example.com', name: 'Person A'},\n * {email: 'b@example.com', name: 'Person B'}\n * ]);\n *\n * cal.attendees(); // --> [ICalAttendee, ICalAttendee]\n * ```\n *\n * @since 0.2.0\n */\n attendees(attendees: (ICalAttendee | ICalAttendeeData | string)[]): this;\n attendees(\n attendees?: (ICalAttendee | ICalAttendeeData | string)[],\n ): ICalAttendee[] | this {\n if (!attendees) {\n return this.data.attendees;\n }\n\n attendees.forEach((attendee) => this.createAttendee(attendee));\n return this;\n }\n\n /**\n * Get the event's busy status\n * @since 1.0.2\n */\n busystatus(): ICalEventBusyStatus | null;\n /**\n * Set the event's busy status. Will add the\n * [`X-MICROSOFT-CDO-BUSYSTATUS`](https://docs.microsoft.com/en-us/openspecs/exchange_server_protocols/ms-oxcical/cd68eae7-ed65-4dd3-8ea7-ad585c76c736)\n * attribute to your event.\n *\n * ```javascript\n * import ical, {ICalEventBusyStatus} from 'ical-generator';\n * event.busystatus(ICalEventBusyStatus.BUSY);\n * ```\n *\n * @since 1.0.2\n */\n busystatus(busystatus: ICalEventBusyStatus | null): this;\n busystatus(\n busystatus?: ICalEventBusyStatus | null,\n ): ICalEventBusyStatus | null | this {\n if (busystatus === undefined) {\n return this.data.busystatus;\n }\n if (busystatus === null) {\n this.data.busystatus = null;\n return this;\n }\n\n this.data.busystatus = checkEnum(\n ICalEventBusyStatus,\n busystatus,\n ) as ICalEventBusyStatus;\n return this;\n }\n\n /**\n * Get all categories\n * @since 0.3.0\n */\n categories(): ICalCategory[];\n /**\n * Add categories to the event or return all selected categories.\n *\n * ```javascript\n * const event = ical().createEvent();\n *\n * cal.categories([\n * {name: 'APPOINTMENT'},\n * {name: 'MEETING'}\n * ]);\n *\n * cal.categories(); // --> [ICalCategory, ICalCategory]\n * ```\n *\n * @since 0.3.0\n */\n categories(categories: (ICalCategory | ICalCategoryData)[]): this;\n categories(\n categories?: (ICalCategory | ICalCategoryData)[],\n ): ICalCategory[] | this {\n if (!categories) {\n return this.data.categories;\n }\n\n categories.forEach((category) => this.createCategory(category));\n return this;\n }\n /**\n * Get the event's class\n * @since 2.0.0\n */\n class(): ICalEventClass | null;\n /**\n * Set the event's class\n *\n * ```javascript\n * import ical, { ICalEventClass } from 'ical-generator';\n * event.class(ICalEventClass.PRIVATE);\n * ```\n *\n * @since 2.0.0\n */\n class(class_: ICalEventClass | null): this;\n class(class_?: ICalEventClass | null): ICalEventClass | null | this {\n if (class_ === undefined) {\n return this.data.class;\n }\n if (class_ === null) {\n this.data.class = null;\n return this;\n }\n\n this.data.class = checkEnum(ICalEventClass, class_) as ICalEventClass;\n return this;\n }\n /**\n * Creates a new {@link ICalAlarm} and returns it. Use options to prefill\n * the alarm's attributes. Calling this method without options will create\n * an empty alarm.\n *\n * ```javascript\n * const cal = ical();\n * const event = cal.createEvent();\n * const alarm = event.createAlarm({type: ICalAlarmType.display, trigger: 300});\n *\n * // add another alarm\n * event.createAlarm({\n * type: ICalAlarmType.audio,\n * trigger: 300, // 5min before event\n * });\n * ```\n *\n * @since 0.2.1\n */\n createAlarm(data: ICalAlarm | ICalAlarmData): ICalAlarm {\n const alarm =\n data instanceof ICalAlarm ? data : new ICalAlarm(data, this);\n this.data.alarms.push(alarm);\n return alarm;\n }\n\n /**\n * Adds an attachment to the event by adding the file URL to the calendar.\n *\n * `ical-generator` only supports external attachments. File attachments that\n * are directly included in the file are not supported, because otherwise the\n * calendar file could easily become unfavourably large.\n *\n * ```javascript\n * const cal = ical();\n * const event = cal.createEvent();\n * event.createAttachment('https://files.sebbo.net/calendar/attachments/foo');\n * ```\n *\n * @since 3.2.0-develop.1\n */\n createAttachment(url: string): this {\n this.data.attachments.push(url);\n return this;\n }\n\n /**\n * Creates a new {@link ICalAttendee} and returns it. Use options to prefill\n * the attendee's attributes. Calling this method without options will create\n * an empty attendee.\n *\n * ```javascript\n * import ical from 'ical-generator';\n *\n * const cal = ical();\n * const event = cal.createEvent({\n * start: new Date()\n * });\n *\n * event.createAttendee({email: 'hui@example.com', name: 'Hui'});\n *\n * // add another attendee\n * event.createAttendee('Buh <buh@example.net>');\n * ```\n *\n * ```text\n * BEGIN:VCALENDAR\n * VERSION:2.0\n * PRODID:-//sebbo.net//ical-generator//EN\n * BEGIN:VEVENT\n * UID:b4944f07-98e4-4581-ac80-2589bb20273d\n * SEQUENCE:0\n * DTSTAMP:20240212T194232Z\n * DTSTART:20240212T194232Z\n * SUMMARY:\n * ATTENDEE;ROLE=REQ-PARTICIPANT;CN=\"Hui\":MAILTO:hui@example.com\n * ATTENDEE;ROLE=REQ-PARTICIPANT;CN=\"Buh\":MAILTO:buh@example.net\n * END:VEVENT\n * END:VCALENDAR\n * ```\n *\n * As with the organizer, you can also add an explicit `mailto` address.\n *\n * ```javascript\n * event.createAttendee({email: 'hui@example.com', name: 'Hui', mailto: 'another@mailto.com'});\n *\n * // overwrite an attendee's mailto address\n * attendee.mailto('another@mailto.net');\n * ```\n *\n * @since 0.2.0\n */\n createAttendee(\n data: ICalAttendee | ICalAttendeeData | string,\n ): ICalAttendee {\n if (data instanceof ICalAttendee) {\n this.data.attendees.push(data);\n return data;\n }\n if (typeof data === 'string') {\n data = checkNameAndMail('data', data);\n }\n\n const attendee = new ICalAttendee(data, this);\n this.data.attendees.push(attendee);\n return attendee;\n }\n /**\n * Creates a new {@link ICalCategory} and returns it. Use options to prefill the category's attributes.\n * Calling this method without options will create an empty category.\n *\n * ```javascript\n * const cal = ical();\n * const event = cal.createEvent();\n * const category = event.createCategory({name: 'APPOINTMENT'});\n *\n * // add another category\n * event.createCategory({\n * name: 'MEETING'\n * });\n * ```\n *\n * @since 0.3.0\n */\n createCategory(data: ICalCategory | ICalCategoryData): ICalCategory {\n const category =\n data instanceof ICalCategory ? data : new ICalCategory(data);\n this.data.categories.push(category);\n return category;\n }\n\n /**\n * Get the event's creation date\n * @since 0.3.0\n */\n created(): ICalDateTimeValue | null;\n /**\n * Set the event's creation date\n * @since 0.3.0\n */\n created(created: ICalDateTimeValue | null): this;\n created(\n created?: ICalDateTimeValue | null,\n ): ICalDateTimeValue | null | this {\n if (created === undefined) {\n return this.data.created;\n }\n if (created === null) {\n this.data.created = null;\n return this;\n }\n\n this.data.created = checkDate(created, 'created');\n return this;\n }\n\n /**\n * Get the event's description as an {@link ICalDescription} object.\n * @since 0.2.0\n */\n description(): ICalDescription | null;\n /**\n * Set the events description by passing a plaintext string or\n * an object containing both a plaintext and a html description.\n * Only a few calendar apps support html descriptions and like in\n * emails, supported HTML tags and styling is limited.\n *\n * ```javascript\n * event.description({\n * plain: 'Hello World!',\n * html: '<p>Hello World!</p>'\n * });\n * ```\n *\n * ```text\n * DESCRIPTION:Hello World!\n * X-ALT-DESC;FMTTYPE=text/html:<p>Hello World!</p>\n * ```\n *\n * @since 0.2.0\n */\n description(description: ICalDescription | null | string): this;\n description(\n description?: ICalDescription | null | string,\n ): ICalDescription | null | this {\n if (description === undefined) {\n return this.data.description;\n }\n if (description === null) {\n this.data.description = null;\n return this;\n }\n\n if (typeof description === 'string') {\n this.data.description = { plain: description };\n } else {\n this.data.description = description;\n }\n return this;\n }\n\n /**\n * Get the event end time which is currently\n * set. Can be any supported date object.\n *\n * @since 0.2.0\n */\n end(): ICalDateTimeValue | null;\n /**\n * Set the appointment date of end. You can use any supported date object, see\n * [readme](https://github.com/sebbo2002/ical-generator#-date-time--timezones)\n * for details about supported values and timezone handling.\n *\n * @since 0.2.0\n */\n end(end: ICalDateTimeValue | null): this;\n end(end?: ICalDateTimeValue | null): ICalDateTimeValue | null | this {\n if (end === undefined) {\n this.swapStartAndEndIfRequired();\n return this.data.end;\n }\n if (end === null) {\n this.data.end = null;\n return this;\n }\n\n this.data.end = checkDate(end, 'end');\n return this;\n }\n\n /**\n * Get the event's floating flag.\n * @since 0.2.0\n */\n floating(): boolean;\n floating(floating: boolean): this;\n /**\n * Set the event's floating flag. This unsets the event's timezone.\n * Events whose floating flag is set to true always take place at the\n * same time, regardless of the time zone.\n *\n * ```typescript\n * import ical from 'ical-generator';\n *\n * const cal = ical();\n *\n * cal.createEvent({\n * start: new Date('2020-01-01T20:00:00Z'),\n * summary: 'Always at 20:00 in every <Timezone',\n * floating: true\n * });\n *\n * cal.toString();\n * ```\n *\n * ```text\n * BEGIN:VCALENDAR\n * VERSION:2.0\n * PRODID:-//sebbo.net//ical-generator//EN\n * BEGIN:VEVENT\n * UID:5d7278f9-ada3-40ef-83d1-23c29ce0a763\n * SEQUENCE:0\n * DTSTAMP:20240212T192214Z\n * DTSTART:20200101T200000\n * SUMMARY:Always at 20:00 in every <Timezone\n * END:VEVENT\n * END:VCALENDAR\n * ```\n *\n * @since 0.2.0\n */\n floating(floating?: boolean): boolean | this {\n if (floating === undefined) {\n return this.data.floating;\n }\n\n this.data.floating = Boolean(floating);\n if (this.data.floating) {\n this.data.timezone = null;\n }\n\n return this;\n }\n\n /**\n * Get the event's ID\n * @since 0.2.0\n */\n id(): string;\n /**\n * Use this method to set the event's ID.\n * If not set, a UUID will be generated randomly.\n *\n * @param id Event ID you want to set\n */\n id(id: number | string): this;\n id(id?: number | string): string | this {\n if (id === undefined) {\n return this.data.id;\n }\n\n this.data.id = String(id);\n return this;\n }\n\n /**\n * Get the event's last modification date\n * @since 0.3.0\n */\n lastModified(): ICalDateTimeValue | null;\n /**\n * Set the event's last modification date\n * @since 0.3.0\n */\n lastModified(lastModified: ICalDateTimeValue | null): this;\n lastModified(\n lastModified?: ICalDateTimeValue | null,\n ): ICalDateTimeValue | null | this {\n if (lastModified === undefined) {\n return this.data.lastModified;\n }\n if (lastModified === null) {\n this.data.lastModified = null;\n return this;\n }\n\n this.data.lastModified = checkDate(lastModified, 'lastModified');\n return this;\n }\n\n /**\n * Get the event's location\n * @since 0.2.0\n */\n location(): ICalLocation | null;\n /**\n * Set the event's location by passing a string (minimum) or\n * an {@link ICalLocationWithTitle} object which will also fill the iCal\n * `GEO` attribute and Apple's `X-APPLE-STRUCTURED-LOCATION`.\n *\n * ```javascript\n * event.location({\n * title: 'Apple Store Kurfürstendamm',\n * address: 'Kurfürstendamm 26, 10719 Berlin, Deutschland',\n * radius: 141.1751386318387,\n * geo: {\n * lat: 52.503630,\n * lon: 13.328650\n * }\n * });\n * ```\n *\n * ```text\n * LOCATION:Apple Store Kurfürstendamm\\nKurfürstendamm 26\\, 10719 Berlin\\,\n * Deutschland\n * X-APPLE-STRUCTURED-LOCATION;VALUE=URI;X-ADDRESS=Kurfürstendamm 26\\, 10719\n * Berlin\\, Deutschland;X-APPLE-RADIUS=141.1751386318387;X-TITLE=Apple Store\n * Kurfürstendamm:geo:52.50363,13.32865\n * GEO:52.50363;13.32865\n * ```\n *\n * Since v6.1.0 you can also pass a {@link ICalLocationWithoutTitle} object to pass\n * the geolocation only. This will only fill the iCal `GEO` attribute.\n *\n * ```javascript\n * event.location({\n * geo: {\n * lat: 52.503630,\n * lon: 13.328650\n * }\n * });\n * ```\n *\n * ```text\n * GEO:52.50363;13.32865\n * ```\n *\n * @since 0.2.0\n */\n location(location: ICalLocation | null | string): this;\n location(\n location?: ICalLocation | null | string,\n ): ICalLocation | null | this {\n if (location === undefined) {\n return this.data.location;\n }\n if (typeof location === 'string') {\n this.data.location = {\n title: location,\n };\n return this;\n }\n if (\n location &&\n (('title' in location && !location.title) ||\n (location?.geo &&\n (typeof location.geo.lat !== 'number' ||\n !isFinite(location.geo.lat) ||\n typeof location.geo.lon !== 'number' ||\n !isFinite(location.geo.lon))) ||\n (!('title' in location) && !location?.geo))\n ) {\n throw new Error(\n \"`location` isn't formatted correctly. See https://sebbo2002.github.io/ical-generator/\" +\n 'develop/reference/classes/ICalEvent.html#location',\n );\n }\n\n this.data.location = location || null;\n return this;\n }\n\n /**\n * Get the event's organizer\n * @since 0.2.0\n */\n organizer(): ICalOrganizer | null;\n /**\n * Set the event's organizer\n *\n * ```javascript\n * event.organizer({\n * name: 'Organizer\\'s Name',\n * email: 'organizer@example.com'\n * });\n *\n * // OR\n *\n * event.organizer('Organizer\\'s Name <organizer@example.com>');\n * ```\n *\n * You can also add an explicit `mailto` email address or or the sentBy address.\n *\n * ```javascript\n * event.organizer({\n * name: 'Organizer\\'s Name',\n * email: 'organizer@example.com',\n * mailto: 'explicit@mailto.com',\n * sentBy: 'substitute@example.com'\n * })\n * ```\n *\n * @since 0.2.0\n */\n organizer(organizer: ICalOrganizer | null | string): this;\n organizer(\n organizer?: ICalOrganizer | null | string,\n ): ICalOrganizer | null | this {\n if (organizer === undefined) {\n return this.data.organizer;\n }\n if (organizer === null) {\n this.data.organizer = null;\n return this;\n }\n\n this.data.organizer = checkNameAndMail('organizer', organizer);\n return this;\n }\n\n /**\n * Get the event's priority. A value of 1 represents\n * the highest priority, 9 the lowest. 0 specifies an undefined\n * priority.\n *\n * @since v2.0.0-develop.7\n */\n priority(): null | number;\n /**\n * Set the event's priority. A value of 1 represents\n * the highest priority, 9 the lowest. 0 specifies an undefined\n * priority.\n *\n * @since v2.0.0-develop.7\n */\n priority(priority: null | number): this;\n priority(priority?: null | number): null | number | this {\n if (priority === undefined) {\n return this.data.priority;\n }\n if (priority === null) {\n this.data.priority = null;\n return this;\n }\n\n if (priority < 0 || priority > 9) {\n throw new Error(\n '`priority` is invalid, musst be 0 ≤ priority ≤ 9.',\n );\n }\n\n this.data.priority = Math.round(priority);\n return this;\n }\n\n /**\n * Get the event's recurrence id\n * @since 0.2.0\n */\n recurrenceId(): ICalDateTimeValue | null;\n /**\n * Set the event's recurrence id. You can use any supported date object, see\n * [readme](https://github.com/sebbo2002/ical-generator#-date-time--timezones)\n * for details about supported values and timezone handling.\n *\n * @since 0.2.0\n */\n recurrenceId(recurrenceId: ICalDateTimeValue | null): this;\n recurrenceId(\n recurrenceId?: ICalDateTimeValue | null,\n ): ICalDateTimeValue | null | this {\n if (recurrenceId === undefined) {\n return this.data.recurrenceId;\n }\n if (recurrenceId === null) {\n this.data.recurrenceId = null;\n return this;\n }\n\n this.data.recurrenceId = checkDate(recurrenceId, 'recurrenceId');\n return this;\n }\n /**\n * Get the event's repeating options\n * @since 0.2.0\n */\n repeating(): ICalEventJSONRepeatingData | ICalRRuleStub | null | string;\n /**\n * Set the event's repeating options by passing an {@link ICalRepeatingOptions} object.\n *\n * ```javascript\n * event.repeating({\n * freq: 'MONTHLY', // required\n * count: 5,\n * interval: 2,\n * until: new Date('Jan 01 2014 00:00:00 UTC'),\n * byDay: ['su', 'mo'], // repeat only sunday and monday\n * byMonth: [1, 2], // repeat only in january and february,\n * byMonthDay: [1, 15], // repeat only on the 1st and 15th\n * bySetPos: 3, // repeat every 3rd sunday (will take the first element of the byDay array)\n * exclude: [new Date('Dec 25 2013 00:00:00 UTC')], // exclude these dates\n * excludeTimezone: 'Europe/Berlin', // timezone of exclude\n * wkst: 'SU' // Start the week on Sunday, default is Monday\n * });\n * ```\n *\n * **Example:**\n *\n *```typescript\n * import ical, { ICalEventRepeatingFreq } from 'ical-generator';\n *\n * const cal = ical();\n *\n * const event = cal.createEvent({\n * start: new Date('2020-01-01T20:00:00Z'),\n * summary: 'Repeating Event'\n * });\n * event.repeating({\n * freq: ICalEventRepeatingFreq.WEEKLY,\n * count: 4\n * });\n *\n * cal.toString();\n * ```\n *\n * ```text\n * BEGIN:VCALENDAR\n * VERSION:2.0\n * PRODID:-//sebbo.net//ical-generator//EN\n * BEGIN:VEVENT\n * UID:b80e6a68-c2cd-48f5-b94d-cecc7ce83871\n * SEQUENCE:0\n * DTSTAMP:20240212T193646Z\n * DTSTART:20200101T200000Z\n * RRULE:FREQ=WEEKLY;COUNT=4\n * SUMMARY:Repeating Event\n * END:VEVENT\n * END:VCALENDAR\n * ```\n *\n * @since 0.2.0\n */\n repeating(repeating: ICalRepeatingOptions | null): this;\n /**\n * Set the event's repeating options by passing an [RRule object](https://github.com/jakubroztocil/rrule).\n * @since 2.0.0-develop.5\n *\n * ```typescript\n * import ical from 'ical-generator';\n * import { datetime, RRule } from 'rrule';\n *\n * const cal = ical();\n *\n * const event = cal.createEvent({\n * start: new Date('2020-01-01T20:00:00Z'),\n * summary: 'Repeating Event'\n * });\n *\n * const rule = new RRule({\n * freq: RRule.WEEKLY,\n * interval: 5,\n * byweekday: [RRule.MO, RRule.FR],\n * dtstart: datetime(2012, 2, 1, 10, 30),\n * until: datetime(2012, 12, 31)\n * })\n * event.repeating(rule);\n *\n * cal.toString();\n * ```\n *\n * ```text\n * BEGIN:VCALENDAR\n * VERSION:2.0\n * PRODID:-//sebbo.net//ical-generator//EN\n * BEGIN:VEVENT\n * UID:36585e40-8fa8-460d-af0c-88b6f434030b\n * SEQUENCE:0\n * DTSTAMP:20240212T193827Z\n * DTSTART:20200101T200000Z\n * RRULE:FREQ=WEEKLY;INTERVAL=5;BYDAY=MO,FR;UNTIL=20121231T000000Z\n * SUMMARY:Repeating Event\n * END:VEVENT\n * END:VCALENDAR\n * ```\n */\n repeating(repeating: ICalRRuleStub | null): this;\n /**\n * Set the events repeating options by passing a string which is inserted in the ical file.\n * @since 2.0.0-develop.5\n */\n repeating(repeating: null | string): this;\n /**\n * @internal\n */\n repeating(\n repeating: ICalRepeatingOptions | ICalRRuleStub | null | string,\n ): this;\n repeating(\n repeating?: ICalRepeatingOptions | ICalRRuleStub | null | string,\n ): ICalEventJSONRepeatingData | ICalRRuleStub | null | string | this {\n if (repeating === undefined) {\n return this.data.repeating;\n }\n if (!repeating) {\n this.data.repeating = null;\n return this;\n }\n if (isRRule(repeating) || typeof repeating === 'string') {\n this.data.repeating = repeating;\n return this;\n }\n\n this.data.repeating = {\n freq: checkEnum(\n ICalEventRepeatingFreq,\n repeating.freq,\n ) as ICalEventRepeatingFreq,\n };\n\n if (repeating.count) {\n if (!isFinite(repeating.count)) {\n throw new Error('`repeating.count` must be a finite number!');\n }\n\n this.data.repeating.count = repeating.count;\n }\n\n if (repeating.interval) {\n if (!isFinite(repeating.interval)) {\n throw new Error(\n '`repeating.interval` must be a finite number!',\n );\n }\n\n this.data.repeating.interval = repeating.interval;\n }\n\n if (repeating.until !== undefined) {\n this.data.repeating.until = checkDate(\n repeating.until,\n 'repeating.until',\n );\n }\n\n if (repeating.byDay) {\n const byDayArray = Array.isArray(repeating.byDay)\n ? repeating.byDay\n : [repeating.byDay];\n this.data.repeating.byDay = byDayArray.map(\n (day) => checkEnum(ICalWeekday, day) as ICalWeekday,\n );\n }\n\n if (repeating.byMonth) {\n const byMonthArray = Array.isArray(repeating.byMonth)\n ? repeating.byMonth\n : [repeating.byMonth];\n this.data.repeating.byMonth = byMonthArray.map((month) => {\n if (typeof month !== 'number' || month < 1 || month > 12) {\n throw new Error(\n '`repeating.byMonth` contains invalid value `' +\n month +\n '`!',\n );\n }\n\n return month;\n });\n }\n\n if (repeating.byMonthDay) {\n const byMonthDayArray = Array.isArray(repeating.byMonthDay)\n ? repeating.byMonthDay\n : [repeating.byMonthDay];\n\n this.data.repeating.byMonthDay = byMonthDayArray.map((monthDay) => {\n if (\n typeof monthDay !== 'number' ||\n monthDay < -31 ||\n monthDay > 31 ||\n monthDay === 0\n ) {\n throw new Error(\n '`repeating.byMonthDay` contains invalid value `' +\n monthDay +\n '`!',\n );\n }\n\n return monthDay;\n });\n }\n\n if (repeating.bySetPos) {\n if (!this.data.repeating.byDay) {\n throw '`repeating.bySetPos` must be used along with `repeating.byDay`!';\n }\n const bySetPosArray = Array.isArray(repeating.bySetPos)\n ? repeating.bySetPos\n : [repeating.bySetPos];\n this.data.repeating.bySetPos = bySetPosArray.map((bySetPos) => {\n if (\n typeof bySetPos !== 'number' ||\n bySetPos < -366 ||\n bySetPos > 366 ||\n bySetPos === 0\n ) {\n throw (\n '`repeating.bySetPos` contains invalid value `' +\n bySetPos +\n '`!'\n );\n }\n return bySetPos;\n });\n }\n\n if (repeating.exclude) {\n const excludeArray = Array.isArray(repeating.exclude)\n ? repeating.exclude\n : [repeating.exclude];\n this.data.repeating.exclude = excludeArray.map((exclude, i) => {\n return checkDate(exclude, `repeating.exclude[${i}]`);\n });\n }\n\n if (repeating.startOfWeek) {\n this.data.repeating.startOfWeek = checkEnum(\n ICalWeekday,\n repeating.startOfWeek,\n ) as ICalWeekday;\n }\n\n return this;\n }\n\n /**\n * Get the event's SEQUENCE number. Use this method to get the event's\n * revision sequence number of the calendar component within a sequence of revisions.\n *\n * @since 0.2.6\n */\n sequence(): number;\n /**\n * Set the event's SEQUENCE number. For a new event, this should be zero.\n * Each time the organizer makes a significant revision, the sequence\n * number should be incremented.\n *\n * @param sequence Sequence number or null to unset it\n */\n sequence(sequence: number): this;\n sequence(sequence?: number): number | this {\n if (sequence === undefined) {\n return this.data.sequence;\n }\n\n const s = parseInt(String(sequence), 10);\n if (isNaN(s)) {\n throw new Error('`sequence` must be a number!');\n }\n\n this.data.sequence = sequence;\n return this;\n }\n\n /**\n * Get the event's timestamp\n * @since 0.2.0\n * @see {@link timestamp}\n */\n stamp(): ICalDateTimeValue;\n /**\n * Set the appointment date of creation. Defaults to the current time and date (`new Date()`). You can use\n * any supported date object, see [readme](https://github.com/sebbo2002/ical-generator#-date-time--timezones)\n * for details about supported values and timezone handling.\n *\n * @since 0.2.0\n * @see {@link timestamp}\n */\n stamp(stamp: ICalDateTimeValue): this;\n stamp(stamp?: ICalDateTimeValue): ICalDateTimeValue | this {\n if (stamp === undefined) {\n return this.data.stamp;\n }\n\n this.data.stamp = checkDate(stamp, 'stamp');\n return this;\n }\n\n /**\n * Get the event start time which is currently\n * set. Can be any supported date object.\n *\n * @since 0.2.0\n */\n start(): ICalDateTimeValue;\n /**\n * Set the appointment date of beginning, which is required for all events.\n * You can use any supported date object, see\n * [Readme](https://github.com/sebbo2002/ical-generator#-date-time--timezones)\n * for details about supported values and timezone handling.\n *\n * ```typescript\n * import ical from 'ical-generator';\n *\n * const cal = ical();\n *\n * const event = cal.createEvent({\n * start: new Date('2020-01-01')\n * });\n *\n * // overwrites old start date\n * event.start(new Date('2024-02-01'));\n *\n * cal.toString();\n * ```\n *\n * ```text\n * BEGIN:VCALENDAR\n * VERSION:2.0\n * PRODID:-//sebbo.net//ical-generator//EN\n * BEGIN:VEVENT\n * UID:7e2aee64-b07a-4256-9b3e-e9eaa452bac8\n * SEQUENCE:0\n * DTSTAMP:20240212T190915Z\n * DTSTART:20240201T000000Z\n * SUMMARY:\n * END:VEVENT\n * END:VCALENDAR\n * ```\n *\n * @since 0.2.0\n */\n start(start: ICalDateTimeValue): this;\n start(start?: ICalDateTimeValue): ICalDateTimeValue | this {\n if (start === undefined) {\n this.swapStartAndEndIfRequired();\n return this.data.start;\n }\n\n this.data.start = checkDate(start, 'start');\n return this;\n }\n\n /**\n * Get the event's status\n * @since 0.2.0\n */\n status(): ICalEventStatus | null;\n /**\n * Set the event's status\n *\n * ```javascript\n * import ical, {ICalEventStatus} from 'ical-generator';\n * event.status(ICalEventStatus.CONFIRMED);\n * ```\n *\n * @since 0.2.0\n */\n status(status: ICalEventStatus | null): this;\n status(status?: ICalEventStatus | null): ICalEventStatus | null | this {\n if (status === undefined) {\n return this.data.status;\n }\n if (status === null) {\n this.data.status = null;\n return this;\n }\n\n this.data.status = checkEnum(\n ICalEventStatus,\n status,\n ) as ICalEventStatus;\n return this;\n }\n\n /**\n * Get the event's summary\n * @since 0.2.0\n */\n summary(): string;\n /**\n * Set the event's summary.\n * Defaults to an empty string if nothing is set.\n *\n * @since 0.2.0\n */\n summary(summary: string): this;\n summary(summary?: string): string | this {\n if (summary === undefined) {\n return this.data.summary;\n }\n\n this.data.summary = summary ? String(summary) : '';\n return this;\n }\n\n /**\n * Get the event's timestamp\n * @since 0.2.0\n * @see {@link stamp}\n */\n timestamp(): ICalDateTimeValue;\n /**\n * Set the appointment date of creation. Defaults to the current time and date (`new Date()`). You can use\n * any supported date object, see [readme](https://github.com/sebbo2002/ical-generator#-date-time--timezones)\n * for details about supported values and timezone handling.\n *\n * @since 0.2.0\n * @see {@link stamp}\n */\n timestamp(stamp: ICalDateTimeValue): this;\n timestamp(stamp?: ICalDateTimeValue): ICalDateTimeValue | this {\n if (stamp === undefined) {\n return this.stamp();\n }\n\n return this.stamp(stamp);\n }\n /**\n * Get the event's timezone.\n * @since 0.2.6\n */\n timezone(): null | string;\n /**\n * Sets the time zone to be used for this event. If a time zone has been\n * defined in both the event and the calendar, the time zone of the event\n * is used.\n *\n * Please note that if the time zone is set, ical-generator assumes\n * that all times are already in the correct time zone. Alternatively,\n * a `moment-timezone` or a Luxon object can be passed with `setZone`,\n * ical-generator will then set the time zone itself.\n *\n * This and the 'floating' flag (see below) are mutually exclusive, and setting a timezone will unset the\n * 'floating' flag. If neither 'timezone' nor 'floating' are set, the date will be output with in UTC format\n * (see [date-time form #2 in section 3.3.5 of RFC 554](https://tools.ietf.org/html/rfc5545#section-3.3.5)).\n *\n * See [Readme](https://github.com/sebbo2002/ical-generator#-date-time--timezones) for details about\n * supported values and timezone handling.\n *\n * ```javascript\n * event.timezone('America/New_York');\n * ```\n *\n * @see https://github.com/sebbo2002/ical-generator#-date-time--timezones\n * @since 0.2.6\n */\n timezone(timezone: null | string): this;\n timezone(timezone?: null | string): null | string | this {\n if (timezone === undefined && this.data.timezone !== null) {\n return this.data.timezone;\n }\n if (timezone === undefined) {\n return this.calendar.timezone();\n }\n\n this.data.timezone =\n timezone && timezone !== 'UTC' ? timezone.toString() : null;\n if (this.data.timezone) {\n this.data.floating = false;\n }\n\n return this;\n }\n /**\n * Return a shallow copy of the events's options for JSON stringification.\n * Third party objects like moment.js values or RRule objects are stringified\n * as well. Can be used for persistence.\n *\n * ```javascript\n * const event = ical().createEvent();\n * const json = JSON.stringify(event);\n *\n * // later: restore event data\n * const calendar = ical().createEvent(JSON.parse(json));\n * ```\n *\n * @since 0.2.4\n */\n toJSON(): ICalEventJSONData {\n let repeating: ICalEventJSONRepeatingData | null | string = null;\n if (\n isRRule(this.data.repeating) ||\n typeof this.data.repeating === 'string'\n ) {\n repeating = this.data.repeating.toString();\n } else if (this.data.repeating) {\n repeating = Object.assign({}, this.data.repeating, {\n exclude: this.data.repeating.exclude?.map((d) => toJSON(d)),\n until: toJSON(this.data.repeating.until) || undefined,\n });\n }\n\n this.swapStartAndEndIfRequired();\n return Object.assign({}, this.data, {\n created: toJSON(this.data.created) || null,\n end: toJSON(this.data.end) || null,\n lastModified: toJSON(this.data.lastModified) || null,\n recurrenceId: toJSON(this.data.recurrenceId) || null,\n repeating,\n stamp: toJSON(this.data.stamp) || null,\n start: toJSON(this.data.start) || null,\n x: this.x(),\n });\n }\n\n /**\n * Return generated event as a string.\n *\n * ```javascript\n * const event = ical().createEvent();\n * console.log(event.toString()); // → BEGIN:VEVENT…\n * ```\n */\n toString(): string {\n let g = '';\n\n // DATE & TIME\n g += 'BEGIN:VEVENT\\r\\n';\n g += 'UID:' + this.data.id + '\\r\\n';\n\n // SEQUENCE\n g += 'SEQUENCE:' + this.data.sequence + '\\r\\n';\n\n this.swapStartAndEndIfRequired();\n g +=\n 'DTSTAMP:' +\n formatDate(this.calendar.timezone(), this.data.stamp) +\n '\\r\\n';\n if (this.data.allDay) {\n g +=\n 'DTSTART;VALUE=DATE:' +\n formatDate(this.timezone(), this.data.start, true) +\n '\\r\\n';\n if (this.data.end) {\n g +=\n 'DTEND;VALUE=DATE:' +\n formatDate(this.timezone(), this.data.end, true) +\n '\\r\\n';\n }\n\n g += 'X-MICROSOFT-CDO-ALLDAYEVENT:TRUE\\r\\n';\n g += 'X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE\\r\\n';\n } else {\n g +=\n formatDateTZ(\n this.timezone(),\n 'DTSTART',\n this.data.start,\n this.data,\n ) + '\\r\\n';\n if (this.data.end) {\n g +=\n formatDateTZ(\n this.timezone(),\n 'DTEND',\n this.data.end,\n this.data,\n ) + '\\r\\n';\n }\n }\n\n // REPEATING\n if (\n isRRule(this.data.repeating) ||\n typeof this.data.repeating === 'string'\n ) {\n let repeating = this.data.repeating\n .toString()\n .replace(/\\r\\n/g, '\\n')\n .split('\\n')\n .filter((l) => l && !l.startsWith('DTSTART:'))\n .join('\\r\\n');\n\n if (\n !repeating.includes('\\r\\n') &&\n !repeating.startsWith('RRULE:')\n ) {\n repeating = 'RRULE:' + repeating;\n }\n\n g += repeating.trim() + '\\r\\n';\n } else if (this.data.repeating) {\n g += 'RRULE:FREQ=' + this.data.repeating.freq;\n\n if (this.data.repeating.count) {\n g += ';COUNT=' + this.data.repeating.count;\n }\n\n if (this.data.repeating.interval) {\n g += ';INTERVAL=' + this.data.repeating.interval;\n }\n\n if (this.data.repeating.until) {\n g +=\n ';UNTIL=' +\n formatDate(\n this.calendar.timezone(),\n this.data.repeating.until,\n false,\n this.floating(),\n );\n }\n\n if (this.data.repeating.byDay) {\n g += ';BYDAY=' + this.data.repeating.byDay.join(',');\n }\n\n if (this.data.repeating.byMonth) {\n g += ';BYMONTH=' + this.data.repeating.byMonth.join(',');\n }\n\n if (this.data.repeating.byMonthDay) {\n g += ';BYMONTHDAY=' + this.data.repeating.byMonthDay.join(',');\n }\n\n if (this.data.repeating.bySetPos) {\n g += ';BYSETPOS=' + this.data.repeating.bySetPos.join(',');\n }\n\n if (this.data.repeating.startOfWeek) {\n g += ';WKST=' + this.data.repeating.startOfWeek;\n }\n\n g += '\\r\\n';\n\n // REPEATING EXCLUSION\n if (this.data.repeating.exclude) {\n if (this.data.allDay) {\n g +=\n 'EXDATE;VALUE=DATE:' +\n this.data.repeating.exclude\n .map((excludedDate) => {\n return formatDate(\n this.calendar.timezone(),\n excludedDate,\n true,\n );\n })\n .join(',') +\n '\\r\\n';\n } else {\n g += 'EXDATE';\n if (this.timezone()) {\n g +=\n ';TZID=' +\n this.timezone() +\n ':' +\n this.data.repeating.exclude\n .map((excludedDate) => {\n // This isn't a 'floating' event because it has a timezone;\n // but we use it to omit the 'Z' UTC specifier in formatDate()\n return formatDate(\n this.timezone(),\n excludedDate,\n false,\n true,\n );\n })\n .join(',') +\n '\\r\\n';\n } else {\n g +=\n ':' +\n this.data.repeating.exclude\n .map((excludedDate) => {\n return formatDate(\n this.timezone(),\n excludedDate,\n false,\n this.floating(),\n );\n })\n .join(',') +\n '\\r\\n';\n }\n }\n }\n }\n\n // RECURRENCE\n if (this.data.recurrenceId) {\n g +=\n formatDateTZ(\n this.timezone(),\n 'RECURRENCE-ID',\n this.data.recurrenceId,\n this.data,\n ) + '\\r\\n';\n }\n\n // SUMMARY\n g += 'SUMMARY:' + escape(this.data.summary, false) + '\\r\\n';\n\n // TRANSPARENCY\n if (this.data.transparency) {\n g += 'TRANSP:' + escape(this.data.transparency, false) + '\\r\\n';\n }\n\n // LOCATION\n if (\n this.data.location &&\n 'title' in this.data.location &&\n this.data.location.title\n ) {\n g +=\n 'LOCATION:' +\n escape(\n this.data.location.title +\n (this.data.location.address\n ? '\\n' + this.data.location.address\n : ''),\n false,\n ) +\n '\\r\\n';\n\n if (this.data.location.radius && this.data.location.geo) {\n g +=\n 'X-APPLE-STRUCTURED-LOCATION;VALUE=URI;' +\n (this.data.location.address\n ? 'X-ADDRESS=' +\n escape(this.data.location.address, false) +\n ';'\n : '') +\n 'X-APPLE-RADIUS=' +\n escape(this.data.location.radius, false) +\n ';' +\n 'X-TITLE=' +\n escape(this.data.location.title, false) +\n ':geo:' +\n escape(this.data.location.geo?.lat, false) +\n ',' +\n escape(this.data.location.geo?.lon, false) +\n '\\r\\n';\n }\n }\n\n // GEO\n if (this.data.location?.geo?.lat && this.data.location.geo.lon) {\n g +=\n 'GEO:' +\n escape(this.data.location.geo.lat, false) +\n ';' +\n escape(this.data.location.geo.lon, false) +\n '\\r\\n';\n }\n\n // DESCRIPTION\n if (this.data.description) {\n g +=\n 'DESCRIPTION:' +\n escape(this.data.description.plain, false) +\n '\\r\\n';\n\n // HTML DESCRIPTION\n if (this.data.description.html) {\n g +=\n 'X-ALT-DESC;FMTTYPE=text/html:' +\n escape(this.data.description.html, false) +\n '\\r\\n';\n }\n }\n\n // ORGANIZER\n if (this.data.organizer) {\n g +=\n 'ORGANIZER;CN=\"' + escape(this.data.organizer.name, true) + '\"';\n\n if (this.data.organizer.sentBy) {\n g +=\n ';SENT-BY=\"mailto:' +\n escape(this.data.organizer.sentBy, true) +\n '\"';\n }\n if (this.data.organizer.email && this.data.organizer.mailto) {\n g += ';EMAIL=' + escape(this.data.organizer.email, false);\n }\n\n g += ':';\n if (this.data.organizer.email) {\n g +=\n 'mailto:' +\n escape(\n this.data.organizer.mailto || this.data.organizer.email,\n false,\n );\n }\n\n g += '\\r\\n';\n }\n\n // ATTENDEES\n this.data.attendees.forEach(function (attendee) {\n g += attendee.toString();\n });\n\n // ALARMS\n this.data.alarms.forEach(function (alarm) {\n g += alarm.toString();\n });\n\n // CATEGORIES\n if (this.data.categories.length > 0) {\n g +=\n 'CATEGORIES:' +\n this.data.categories\n .map((category) => category.toString())\n .join() +\n '\\r\\n';\n }\n\n // URL\n if (this.data.url) {\n g += 'URL;VALUE=URI:' + escape(this.data.url, false) + '\\r\\n';\n }\n\n // ATTACHMENT\n if (this.data.attachments.length > 0) {\n this.data.attachments.forEach((url) => {\n g += 'ATTACH:' + escape(url, false) + '\\r\\n';\n });\n }\n\n // STATUS\n if (this.data.status) {\n g += 'STATUS:' + this.data.status.toUpperCase() + '\\r\\n';\n }\n\n // BUSYSTATUS\n if (this.data.busystatus) {\n g +=\n 'X-MICROSOFT-CDO-BUSYSTATUS:' +\n this.data.busystatus.toUpperCase() +\n '\\r\\n';\n }\n\n // PRIORITY\n if (this.data.priority !== null) {\n g += 'PRIORITY:' + this.data.priority + '\\r\\n';\n }\n\n // CUSTOM X ATTRIBUTES\n g += generateCustomAttributes(this.data);\n\n // CREATED\n if (this.data.created) {\n g +=\n 'CREATED:' +\n formatDate(this.calendar.timezone(), this.data.created) +\n '\\r\\n';\n }\n\n // LAST-MODIFIED\n if (this.data.lastModified) {\n g +=\n 'LAST-MODIFIED:' +\n formatDate(this.calendar.timezone(), this.data.lastModified) +\n '\\r\\n';\n }\n\n if (this.data.class) {\n g += 'CLASS:' + this.data.class.toUpperCase() + '\\r\\n';\n }\n\n g += 'END:VEVENT\\r\\n';\n return g;\n }\n\n /**\n * Get the event's transparency\n * @since 1.7.3\n */\n transparency(): ICalEventTransparency | null;\n /**\n * Set the event's transparency\n *\n * Set the field to `OPAQUE` if the person or resource is no longer\n * available due to this event. If the calendar entry has no influence\n * on availability, you can set the field to `TRANSPARENT`. This value\n * is mostly used to find out if a person has time on a certain date or\n * not (see `TRANSP` in iCal specification).\n *\n * ```javascript\n * import ical, {ICalEventTransparency} from 'ical-generator';\n * event.transparency(ICalEventTransparency.OPAQUE);\n * ```\n *\n * @since 1.7.3\n */\n transparency(transparency: ICalEventTransparency | null): this;\n transparency(\n transparency?: ICalEventTransparency | null,\n ): ICalEventTransparency | null | this {\n if (transparency === undefined) {\n return this.data.transparency;\n }\n if (!transparency) {\n this.data.transparency = null;\n return this;\n }\n\n this.data.transparency = checkEnum(\n ICalEventTransparency,\n transparency,\n ) as ICalEventTransparency;\n return this;\n }\n\n /**\n * Get the event's ID\n * @since 0.2.0\n * @see {@link id}\n */\n uid(): string;\n /**\n * Use this method to set the event's ID.\n * If not set, a UUID will be generated randomly.\n *\n * @param id Event ID you want to set\n */\n uid(id: number | string): this;\n uid(id?: number | string): string | this {\n return id === undefined ? this.id() : this.id(id);\n }\n\n /**\n * Get the event's URL\n * @since 0.2.0\n */\n url(): null | string;\n /**\n * Set the event's URL\n * @since 0.2.0\n */\n url(url: null | string): this;\n url(url?: null | string): null | string | this {\n if (url === undefined) {\n return this.data.url;\n }\n\n this.data.url = url ? String(url) : null;\n return this;\n }\n\n /**\n * Set X-* attributes. Woun't filter double attributes,\n * which are also added by another method (e.g. summary),\n * so these attributes may be inserted twice.\n *\n * ```javascript\n * event.x([\n * {\n * key: \"X-MY-CUSTOM-ATTR\",\n * value: \"1337!\"\n * }\n * ]);\n *\n * event.x([\n * [\"X-MY-CUSTOM-ATTR\", \"1337!\"]\n * ]);\n *\n * event.x({\n * \"X-MY-CUSTOM-ATTR\": \"1337!\"\n * });\n * ```\n *\n * @since 1.9.0\n */\n x(\n keyOrArray:\n | [string, string][]\n | Record<string, string>\n | { key: string; value: string }[],\n ): this;\n /**\n * Set a X-* attribute. Woun't filter double attributes,\n * which are also added by another method (e.g. summary),\n * so these attributes may be inserted twice.\n *\n * ```javascript\n * event.x(\"X-MY-CUSTOM-ATTR\", \"1337!\");\n * ```\n *\n * @since 1.9.0\n */\n x(keyOrArray: string, value: string): this;\n /**\n * Get all custom X-* attributes.\n * @since 1.9.0\n */\n x(): { key: string; value: string }[];\n x(\n keyOrArray?:\n | [string, string][]\n | Record<string, string>\n | string\n | { key: string; value: string }[],\n value?: string,\n ): this | void | { key: string; value: string }[] {\n if (keyOrArray === undefined) {\n return addOrGetCustomAttributes(this.data);\n }\n\n if (typeof keyOrArray === 'string' && typeof value === 'string') {\n addOrGetCustomAttributes(this.data, keyOrArray, value);\n }\n if (typeof keyOrArray === 'object') {\n addOrGetCustomAttributes(this.data, keyOrArray);\n }\n\n return this;\n }\n\n /**\n * Checks if the start date is after the end date and swaps them if necessary.\n * @private\n */\n private swapStartAndEndIfRequired(): void {\n if (\n this.data.start &&\n this.data.end &&\n toDate(this.data.start).getTime() > toDate(this.data.end).getTime()\n ) {\n const t = this.data.start;\n this.data.start = this.data.end;\n this.data.end = t;\n }\n }\n}\n","'use strict';\n\nimport ICalEvent, {\n type ICalEventData,\n type ICalEventJSONData,\n} from './event.ts';\nimport {\n addOrGetCustomAttributes,\n checkEnum,\n foldLines,\n generateCustomAttributes,\n isMomentDuration,\n toDurationString,\n} from './tools.ts';\nimport { type ICalMomentDurationStub, type ICalTimezone } from './types.ts';\n\nexport enum ICalCalendarMethod {\n ADD = 'ADD',\n CANCEL = 'CANCEL',\n COUNTER = 'COUNTER',\n DECLINECOUNTER = 'DECLINECOUNTER',\n PUBLISH = 'PUBLISH',\n REFRESH = 'REFRESH',\n REPLY = 'REPLY',\n REQUEST = 'REQUEST',\n}\n\nexport interface ICalCalendarData {\n description?: null | string;\n events?: (ICalEvent | ICalEventData)[];\n method?: ICalCalendarMethod | null;\n name?: null | string;\n prodId?: ICalCalendarProdIdData | string;\n scale?: null | string;\n source?: null | string;\n timezone?: ICalTimezone | null | string;\n ttl?: ICalMomentDurationStub | null | number;\n url?: null | string;\n x?:\n | [string, string][]\n | Record<string, string>\n | { key: string; value: string }[];\n}\n\nexport interface ICalCalendarJSONData {\n description: null | string;\n events: ICalEventJSONData[];\n method: ICalCalendarMethod | null;\n name: null | string;\n prodId: string;\n scale: null | string;\n source: null | string;\n timezone: null | string;\n ttl: null | number;\n url: null | string;\n x: { key: string; value: string }[];\n}\n\nexport interface ICalCalendarProdIdData {\n company: string;\n language?: string;\n product: string;\n}\n\ninterface ICalCalendarInternalData {\n description: null | string;\n events: ICalEvent[];\n method: ICalCalendarMethod | null;\n name: null | string;\n prodId: string;\n scale: null | string;\n source: null | string;\n timezone: ICalTimezone | null;\n ttl: null | number;\n url: null | string;\n x: [string, string][];\n}\n\n/**\n * Usually you get an {@link ICalCalendar} object like this:\n * ```javascript\n * import ical from 'ical-generator';\n * const calendar = ical();\n * ```\n *\n * But you can also use the constructor directly like this:\n * ```javascript\n * import {ICalCalendar} from 'ical-generator';\n * const calendar = new ICalCalendar();\n * ```\n */\nexport default class ICalCalendar {\n private readonly data: ICalCalendarInternalData;\n\n /**\n * You can pass options to set up your calendar or use setters to do this.\n *\n * ```javascript\n * * import ical from 'ical-generator';\n *\n * // or use require:\n * // const { default: ical } = require('ical-generator');\n *\n *\n * const cal = ical({name: 'my first iCal'});\n *\n * // is the same as\n *\n * const cal = ical().name('my first iCal');\n *\n * // is the same as\n *\n * const cal = ical();\n * cal.name('sebbo.net');\n * ```\n *\n * `cal.toString()` would then produce the following string:\n * ```text\n * BEGIN:VCALENDAR\n * VERSION:2.0\n * PRODID:-//sebbo.net//ical-generator//EN\n * NAME:sebbo.net\n * X-WR-CALNAME:sebbo.net\n * END:VCALENDAR\n * ```\n *\n * @param data Calendar data\n */\n constructor(data: ICalCalendarData = {}) {\n this.data = {\n description: null,\n events: [],\n method: null,\n name: null,\n prodId: '//sebbo.net//ical-generator//EN',\n scale: null,\n source: null,\n timezone: null,\n ttl: null,\n url: null,\n x: [],\n };\n\n if (data.prodId !== undefined) this.prodId(data.prodId);\n if (data.method !== undefined) this.method(data.method);\n if (data.name !== undefined) this.name(data.name);\n if (data.description !== undefined) this.description(data.description);\n if (data.timezone !== undefined) this.timezone(data.timezone);\n if (data.source !== undefined) this.source(data.source);\n if (data.url !== undefined) this.url(data.url);\n if (data.scale !== undefined) this.scale(data.scale);\n if (data.ttl !== undefined) this.ttl(data.ttl);\n if (data.events !== undefined) this.events(data.events);\n if (data.x !== undefined) this.x(data.x);\n }\n\n /**\n * Remove all events from the calendar without\n * touching any other data like name or prodId.\n *\n * @since 2.0.0-develop.1\n */\n clear(): this {\n this.data.events = [];\n return this;\n }\n\n /**\n * Creates a new {@link ICalEvent} and returns it. Use options to prefill the event's attributes.\n * Calling this method without options will create an empty event.\n *\n * ```javascript\n * import ical from 'ical-generator';\n *\n * // or use require:\n * // const { default: ical } = require('ical-generator');\n *\n * const cal = ical();\n * const event = cal.createEvent({summary: 'My Event'});\n *\n * // overwrite event summary\n * event.summary('Your Event');\n * ```\n *\n * @since 0.2.0\n */\n createEvent(data: ICalEvent | ICalEventData): ICalEvent {\n const event =\n data instanceof ICalEvent ? data : new ICalEvent(data, this);\n this.data.events.push(event);\n return event;\n }\n /**\n * Get your feed's description\n * @since 0.2.7\n */\n description(): null | string;\n /**\n * Set your feed's description\n * @since 0.2.7\n */\n description(description: null | string): this;\n description(description?: null | string): null | string | this {\n if (description === undefined) {\n return this.data.description;\n }\n\n this.data.description = description ? String(description) : null;\n return this;\n }\n /**\n * Returns all events of this calendar.\n *\n * ```javascript\n * const cal = ical();\n *\n * cal.events([\n * {\n * start: new Date(),\n * end: new Date(new Date().getTime() + 3600000),\n * summary: 'Example Event',\n * description: 'It works ;)',\n * url: 'http://sebbo.net/'\n * }\n * ]);\n *\n * cal.events(); // --> [ICalEvent]\n * ```\n *\n * @since 0.2.0\n */\n events(): ICalEvent[];\n /**\n * Add multiple events to your calendar.\n *\n * ```javascript\n * const cal = ical();\n *\n * cal.events([\n * {\n * start: new Date(),\n * end: new Date(new Date().getTime() + 3600000),\n * summary: 'Example Event',\n * description: 'It works ;)',\n * url: 'http://sebbo.net/'\n * }\n * ]);\n *\n * cal.events(); // --> [ICalEvent]\n * ```\n *\n * @since 0.2.0\n */\n events(events: (ICalEvent | ICalEventData)[]): this;\n events(events?: (ICalEvent | ICalEventData)[]): ICalEvent[] | this {\n if (!events) {\n return this.data.events;\n }\n\n events.forEach((e: ICalEvent | ICalEventData) => this.createEvent(e));\n return this;\n }\n /**\n * Get the number of events added to your calendar\n */\n length(): number {\n return this.data.events.length;\n }\n\n /**\n * Get the feed method attribute.\n * See {@link ICalCalendarMethod} for possible results.\n *\n * @since 0.2.8\n */\n method(): ICalCalendarMethod | null;\n /**\n * Set the feed method attribute.\n * See {@link ICalCalendarMethod} for available options.\n *\n * #### Typescript Example\n * ```typescript\n * import {ICalCalendarMethod} from 'ical-generator';\n *\n * // METHOD:PUBLISH\n * calendar.method(ICalCalendarMethod.PUBLISH);\n * ```\n *\n * @since 0.2.8\n */\n method(method: ICalCalendarMethod | null): this;\n method(\n method?: ICalCalendarMethod | null,\n ): ICalCalendarMethod | null | this {\n if (method === undefined) {\n return this.data.method;\n }\n if (!method) {\n this.data.method = null;\n return this;\n }\n\n this.data.method = checkEnum(\n ICalCalendarMethod,\n method,\n ) as ICalCalendarMethod;\n return this;\n }\n\n /**\n * Get your feed's name\n * @since 0.2.0\n */\n name(): null | string;\n /**\n * Set your feed's name. Is used to fill `NAME`\n * and `X-WR-CALNAME` in your iCal file.\n *\n * ```typescript\n * import ical from 'ical-generator';\n *\n * const cal = ical();\n * cal.name('Next Arrivals');\n *\n * cal.toString();\n * ```\n *\n * ```text\n * BEGIN:VCALENDAR\n * VERSION:2.0\n * PRODID:-//sebbo.net//ical-generator//EN\n * NAME:Next Arrivals\n * X-WR-CALNAME:Next Arrivals\n * END:VCALENDAR\n * ```\n *\n * @since 0.2.0\n */\n name(name: null | string): this;\n name(name?: null | string): null | string | this {\n if (name === undefined) {\n return this.data.name;\n }\n\n this.data.name = name ? String(name) : null;\n return this;\n }\n /**\n * Get your feed's prodid. Will always return a string.\n * @since 0.2.0\n */\n prodId(): string;\n /**\n * Set your feed's prodid. `prodid` can be either a\n * string like `//sebbo.net//ical-generator//EN` or a\n * valid {@link ICalCalendarProdIdData} object. `language`\n * is optional and defaults to `EN`.\n *\n * ```javascript\n * cal.prodId({\n * company: 'My Company',\n * product: 'My Product',\n * language: 'EN' // optional, defaults to EN\n * });\n * ```\n *\n * `cal.toString()` would then produce the following string:\n * ```text\n * PRODID:-//My Company//My Product//EN\n * ```\n *\n * @since 0.2.0\n */\n prodId(prodId: ICalCalendarProdIdData | string): this;\n prodId(prodId?: ICalCalendarProdIdData | string): string | this {\n if (!prodId) {\n return this.data.prodId;\n }\n\n if (typeof prodId === 'string') {\n this.data.prodId = prodId;\n return this;\n }\n\n if (typeof prodId !== 'object') {\n throw new Error('`prodid` needs to be a string or an object!');\n }\n\n if (!prodId.company) {\n throw new Error('`prodid.company` is a mandatory item!');\n }\n if (!prodId.product) {\n throw new Error('`prodid.product` is a mandatory item!');\n }\n\n const language = (prodId.language || 'EN').toUpperCase();\n this.data.prodId =\n '//' + prodId.company + '//' + prodId.product + '//' + language;\n return this;\n }\n /**\n * Get current value of the `CALSCALE` attribute. It will\n * return `null` if no value was set. The iCal standard\n * specifies this as `GREGORIAN` if no value is present.\n *\n * @since 1.8.0\n */\n scale(): null | string;\n /**\n * Use this method to set your feed's `CALSCALE` attribute. There is no\n * default value for this property and it will not appear in your iCal\n * file unless set. The iCal standard specifies this as `GREGORIAN` if\n * no value is present.\n *\n * ```javascript\n * cal.scale('gregorian');\n * ```\n *\n * @since 1.8.0\n */\n scale(scale: null | string): this;\n scale(scale?: null | string): null | string | this {\n if (scale === undefined) {\n return this.data.scale;\n }\n\n if (scale === null) {\n this.data.scale = null;\n } else {\n this.data.scale = scale.toUpperCase();\n }\n\n return this;\n }\n /**\n * Get current value of the `SOURCE` attribute.\n * @since 2.2.0-develop.1\n */\n source(): null | string;\n /**\n * Use this method to set your feed's `SOURCE` attribute.\n * This tells the client where to refresh your feed.\n *\n * ```javascript\n * cal.source('http://example.com/my/original_source.ical');\n * ```\n *\n * ```text\n * SOURCE;VALUE=URI:http://example.com/my/original_source.ical\n * ```\n *\n * @since 2.2.0-develop.1\n */\n source(source: null | string): this;\n source(source?: null | string): null | string | this {\n if (source === undefined) {\n return this.data.source;\n }\n\n this.data.source = source || null;\n return this;\n }\n /**\n * Get the current calendar timezone\n * @since 0.2.0\n */\n timezone(): null | string;\n /**\n * Use this method to set your feed's timezone. Is used\n * to fill `TIMEZONE-ID` and `X-WR-TIMEZONE` in your iCal export.\n * Please not that all date values are treaded differently, if\n * a timezone was set. See {@link formatDate} for details. If no\n * time zone is specified, all information is output as UTC.\n *\n * ```javascript\n * cal.timezone('America/New_York');\n * ```\n *\n * @see https://github.com/sebbo2002/ical-generator#-date-time--timezones\n * @since 0.2.0\n */\n timezone(timezone: null | string): this;\n /**\n * Sets the time zone to be used in this calendar file for all times of all\n * events. Please note that if the time zone is set, ical-generator assumes\n * that all times are already in the correct time zone. Alternatively, a\n * `moment-timezone` or a Luxon object can be passed with `setZone`,\n * ical-generator will then set the time zone itself.\n *\n * For the best support of time zones, a VTimezone entry in the calendar is\n * recommended, which informs the client about the corresponding time zones\n * (daylight saving time, deviation from UTC, etc.). `ical-generator` itself\n * does not have a time zone database, so an external generator is needed here.\n *\n * A VTimezone generator is a function that takes a time zone as a string and\n * returns a VTimezone component according to the ical standard. For example,\n * ical-timezones can be used for this:\n *\n * ```typescript\n * import ical from 'ical-generator';\n * import {getVtimezoneComponent} from '@touch4it/ical-timezones';\n *\n * const cal = ical();\n * cal.timezone({\n * name: 'FOO',\n * generator: getVtimezoneComponent\n * });\n * cal.createEvent({\n * start: new Date(),\n * timezone: 'Europe/London'\n * });\n * ```\n *\n * @see https://github.com/sebbo2002/ical-generator#-date-time--timezones\n * @since 2.0.0\n */\n timezone(timezone: ICalTimezone | null | string): this;\n timezone(timezone?: ICalTimezone | null | string): null | string | this {\n if (timezone === undefined) {\n return this.data.timezone?.name || null;\n }\n\n if (timezone === 'UTC') {\n this.data.timezone = null;\n } else if (typeof timezone === 'string') {\n this.data.timezone = { name: timezone };\n } else if (timezone === null) {\n this.data.timezone = null;\n } else {\n this.data.timezone = timezone;\n }\n\n return this;\n }\n\n /**\n * Return a shallow copy of the calendar's options for JSON stringification.\n * Third party objects like moment.js values or RRule objects are stringified\n * as well. Can be used for persistence.\n *\n * ```javascript\n * const cal = ical();\n * const json = JSON.stringify(cal);\n *\n * // later: restore calendar data\n * cal = ical(JSON.parse(json));\n * ```\n *\n * @since 0.2.4\n */\n toJSON(): ICalCalendarJSONData {\n return Object.assign({}, this.data, {\n events: this.data.events.map((event) => event.toJSON()),\n timezone: this.timezone(),\n x: this.x(),\n });\n }\n\n /**\n * Return generated calendar as a string.\n *\n * ```javascript\n * const cal = ical();\n * console.log(cal.toString()); // → BEGIN:VCALENDAR…\n * ```\n */\n toString(): string {\n let g = '';\n\n // VCALENDAR and VERSION\n g = 'BEGIN:VCALENDAR\\r\\nVERSION:2.0\\r\\n';\n\n // PRODID\n g += 'PRODID:-' + this.data.prodId + '\\r\\n';\n\n // URL\n if (this.data.url) {\n g += 'URL:' + this.data.url + '\\r\\n';\n }\n\n // SOURCE\n if (this.data.source) {\n g += 'SOURCE;VALUE=URI:' + this.data.source + '\\r\\n';\n }\n\n // CALSCALE\n if (this.data.scale) {\n g += 'CALSCALE:' + this.data.scale + '\\r\\n';\n }\n\n // METHOD\n if (this.data.method) {\n g += 'METHOD:' + this.data.method + '\\r\\n';\n }\n\n // NAME\n if (this.data.name) {\n g += 'NAME:' + this.data.name + '\\r\\n';\n g += 'X-WR-CALNAME:' + this.data.name + '\\r\\n';\n }\n\n // Description\n if (this.data.description) {\n g += 'X-WR-CALDESC:' + this.data.description + '\\r\\n';\n }\n\n // Timezone\n if (this.data.timezone?.generator) {\n const timezones = [\n ...new Set([\n this.timezone(),\n ...this.data.events.map((event) => event.timezone()),\n ]),\n ].filter((tz) => tz !== null && !tz.startsWith('/')) as string[];\n\n timezones.forEach((tz) => {\n if (!this.data.timezone?.generator) {\n return;\n }\n\n const s = this.data.timezone.generator(tz);\n if (!s) {\n return;\n }\n\n g +=\n s.replace(/\\r\\n/g, '\\n').replace(/\\n/g, '\\r\\n').trim() +\n '\\r\\n';\n });\n }\n if (this.data.timezone?.name) {\n g += 'TIMEZONE-ID:' + this.data.timezone.name + '\\r\\n';\n g += 'X-WR-TIMEZONE:' + this.data.timezone.name + '\\r\\n';\n }\n\n // TTL\n if (this.data.ttl) {\n g +=\n 'REFRESH-INTERVAL;VALUE=DURATION:' +\n toDurationString(this.data.ttl) +\n '\\r\\n';\n g += 'X-PUBLISHED-TTL:' + toDurationString(this.data.ttl) + '\\r\\n';\n }\n\n // Events\n this.data.events.forEach((event) => (g += event.toString()));\n\n // CUSTOM X ATTRIBUTES\n g += generateCustomAttributes(this.data);\n\n g += 'END:VCALENDAR';\n\n return foldLines(g);\n }\n\n /**\n * Get the current ttl duration in seconds\n * @since 0.2.5\n */\n ttl(): null | number;\n /**\n * Use this method to set your feed's time to live\n * (in seconds). Is used to fill `REFRESH-INTERVAL` and\n * `X-PUBLISHED-TTL` in your iCal.\n *\n * ```javascript\n * const cal = ical().ttl(60 * 60 * 24); // 1 day\n * ```\n *\n * You can also pass a moment.js duration object. Zero, null\n * or negative numbers will reset the `ttl` attribute.\n *\n * @since 0.2.5\n */\n ttl(ttl: ICalMomentDurationStub | null | number): this;\n ttl(ttl?: ICalMomentDurationStub | null | number): null | number | this {\n if (ttl === undefined) {\n return this.data.ttl;\n }\n\n if (isMomentDuration(ttl)) {\n this.data.ttl = ttl.asSeconds();\n } else if (ttl && ttl > 0) {\n this.data.ttl = ttl;\n } else {\n this.data.ttl = null;\n }\n\n return this;\n }\n\n /**\n * Get your feed's URL\n * @since 0.2.5\n */\n url(): null | string;\n /**\n * Set your feed's URL\n *\n * ```javascript\n * calendar.url('http://example.com/my/feed.ical');\n * ```\n *\n * @since 0.2.5\n */\n url(url: null | string): this;\n url(url?: null | string): null | string | this {\n if (url === undefined) {\n return this.data.url;\n }\n\n this.data.url = url || null;\n return this;\n }\n /**\n * Set X-* attributes. Woun't filter double attributes,\n * which are also added by another method (e.g. busystatus),\n * so these attributes may be inserted twice.\n *\n * ```javascript\n * calendar.x([\n * {\n * key: \"X-MY-CUSTOM-ATTR\",\n * value: \"1337!\"\n * }\n * ]);\n *\n * calendar.x([\n * [\"X-MY-CUSTOM-ATTR\", \"1337!\"]\n * ]);\n *\n * calendar.x({\n * \"X-MY-CUSTOM-ATTR\": \"1337!\"\n * });\n * ```\n *\n * ```text\n * BEGIN:VCALENDAR\n * VERSION:2.0\n * PRODID:-//sebbo.net//ical-generator//EN\n * X-MY-CUSTOM-ATTR:1337!\n * END:VCALENDAR\n * ```\n *\n * @since 1.9.0\n */\n x(\n keyOrArray:\n | [string, string][]\n | Record<string, string>\n | { key: string; value: string }[],\n ): this;\n /**\n * Set a X-* attribute. Woun't filter double attributes,\n * which are also added by another method (e.g. busystatus),\n * so these attributes may be inserted twice.\n *\n * ```javascript\n * calendar.x(\"X-MY-CUSTOM-ATTR\", \"1337!\");\n * ```\n *\n * ```text\n * BEGIN:VCALENDAR\n * VERSION:2.0\n * PRODID:-//sebbo.net//ical-generator//EN\n * X-MY-CUSTOM-ATTR:1337!\n * END:VCALENDAR\n * ```\n *\n * @since 1.9.0\n */\n x(keyOrArray: string, value: string): this;\n /**\n * Get all custom X-* attributes.\n * @since 1.9.0\n */\n x(): { key: string; value: string }[];\n x(\n keyOrArray?:\n | [string, string][]\n | Record<string, string>\n | string\n | { key: string; value: string }[],\n value?: string,\n ): this | void | { key: string; value: string }[] {\n if (keyOrArray === undefined) {\n return addOrGetCustomAttributes(this.data);\n }\n\n if (typeof keyOrArray === 'string' && typeof value === 'string') {\n addOrGetCustomAttributes(this.data, keyOrArray, value);\n } else if (typeof keyOrArray === 'object') {\n addOrGetCustomAttributes(this.data, keyOrArray);\n } else {\n throw new Error('Either key or value is not a string!');\n }\n\n return this;\n }\n}\n"],"mappings":"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","names":["index_exports","__export","ICalAlarm","ICalAlarmRelatesTo","ICalAlarmType","ICalAttendee","ICalAttendeeRole","ICalAttendeeStatus","ICalAttendeeType","ICalCalendar","ICalCalendarMethod","ICalCategory","ICalEvent","ICalEventBusyStatus","ICalEventClass","ICalEventRepeatingFreq","ICalEventStatus","ICalEventTransparency","ICalWeekday","index_default","escape","foldLines","formatDate","formatDateTZ","__toCommonJS","ICalEventRepeatingFreq","ICalWeekday","addOrGetCustomAttributes","data","keyOrArray","value","o","key","a","checkDate","attribute","isLuxonDate","isMoment","isDayjs","checkEnum","type","allowedValues","valueStr","checkNameAndMail","result","match","escape","str","inQuotes","foldLines","input","line","c","ch","charsize","formatDate","timezone","d","dateonly","floating","m","isTZDate","isMomentTZ","formatDateTZ","property","date","eventData","tzParam","generateCustomAttributes","isMomentDuration","isRRule","toDate","toDurationString","seconds","string","toJSON","ICalAttendeeRole","ICalAttendeeScheduleAgent","ICalAttendeeStatus","ICalAttendeeType","ICalAttendee","_ICalAttendee","data","parent","delegatedFrom","checkNameAndMail","delegatedTo","options","a","email","mailto","name","role","checkEnum","rsvp","scheduleAgent","status","g","escape","key","value","type","keyOrArray","addOrGetCustomAttributes","ICalAlarmType","ICalAlarmRelatesTo","ICalAlarm","data","event","attachment","_attach","attendees","attendee","ICalAttendee","checkNameAndMail","description","relatesTo","repeat","summary","trigger","toJSON","g","toDurationString","formatDate","escape","generateCustomAttributes","checkDate","type","keyOrArray","value","addOrGetCustomAttributes","ICalCategory","data","name","escape","ICalEventBusyStatus","ICalEventClass","ICalEventStatus","ICalEventTransparency","ICalEvent","data","calendar","alarms","alarm","allDay","attachments","attachment","attendees","attendee","busystatus","checkEnum","categories","category","class_","ICalAlarm","url","ICalAttendee","checkNameAndMail","ICalCategory","created","checkDate","description","end","floating","id","lastModified","location","organizer","priority","recurrenceId","repeating","isRRule","ICalEventRepeatingFreq","byDayArray","day","ICalWeekday","byMonthArray","month","byMonthDayArray","monthDay","bySetPosArray","bySetPos","excludeArray","exclude","sequence","s","stamp","start","status","summary","timezone","d","toJSON","g","formatDate","formatDateTZ","l","excludedDate","escape","generateCustomAttributes","transparency","keyOrArray","value","addOrGetCustomAttributes","toDate","ICalCalendarMethod","ICalCalendar","data","event","ICalEvent","description","events","method","checkEnum","name","prodId","language","scale","source","timezone","g","tz","s","toDurationString","generateCustomAttributes","foldLines","ttl","isMomentDuration","url","keyOrArray","value","addOrGetCustomAttributes","ical","data","ICalCalendar","index_default"]}
|