Calendaring extensions R. Stepanek Internet-Draft Fastmail Intended status: Standards Track 19 March 2025 Expires: 20 September 2025 JSCalendar: Converting from and to iCalendar draft-ietf-calext-jscalendar-icalendar-11 Abstract This document defines how to convert calendaring information between the JSCalendar and iCalendar data formats. It considers every JSCalendar and iCalendar element registered at IANA at the time of publication. It defines conversion rules for all elements that are common to both formats, as well as how convert arbitrary or unknown JSCalendar and iCalendar elements. Status of This Memo This Internet-Draft is submitted in full conformance with the provisions of BCP 78 and BCP 79. Internet-Drafts are working documents of the Internet Engineering Task Force (IETF). Note that other groups may also distribute working documents as Internet-Drafts. The list of current Internet- Drafts is at https://datatracker.ietf.org/drafts/current/. Internet-Drafts are draft documents valid for a maximum of six months and may be updated, replaced, or obsoleted by other documents at any time. It is inappropriate to use Internet-Drafts as reference material or to cite them other than as "work in progress." This Internet-Draft will expire on 20 September 2025. Copyright Notice Copyright (c) 2025 IETF Trust and the persons identified as the document authors. All rights reserved. This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (https://trustee.ietf.org/ license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components extracted from this document must include Revised BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Revised BSD License. Stepanek Expires 20 September 2025 [Page 1] Internet-Draft JSCalendar March 2025 Table of Contents 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 4 1.1. Notational Conventions . . . . . . . . . . . . . . . . . 4 1.2. Scope and Goals . . . . . . . . . . . . . . . . . . . . . 4 1.3. How to Read the Examples . . . . . . . . . . . . . . . . 5 1.3.1. iCalendar Examples . . . . . . . . . . . . . . . . . 5 1.3.2. JSCalendar Examples . . . . . . . . . . . . . . . . . 7 1.4. Lossy versus Lossless Conversion . . . . . . . . . . . . 8 2. Converting iCalendar to JSCalendar . . . . . . . . . . . . . 9 2.1. General rules . . . . . . . . . . . . . . . . . . . . . . 9 2.1.1. iCalendar Objects . . . . . . . . . . . . . . . . . . 9 2.1.2. Recurring Components . . . . . . . . . . . . . . . . 11 2.1.3. JSCalendar Ids . . . . . . . . . . . . . . . . . . . 14 2.1.4. Timezone identifiers . . . . . . . . . . . . . . . . 14 2.1.5. DATE and DATE-TIME . . . . . . . . . . . . . . . . . 15 2.2. Components . . . . . . . . . . . . . . . . . . . . . . . 15 2.2.1. PARTICIPANT . . . . . . . . . . . . . . . . . . . . . 15 2.2.2. VALARM . . . . . . . . . . . . . . . . . . . . . . . 17 2.2.3. VEVENT . . . . . . . . . . . . . . . . . . . . . . . 19 2.2.4. VLOCATION . . . . . . . . . . . . . . . . . . . . . . 23 2.2.5. VTIMEZONE . . . . . . . . . . . . . . . . . . . . . . 25 2.2.6. VTODO . . . . . . . . . . . . . . . . . . . . . . . . 29 2.3. Properties . . . . . . . . . . . . . . . . . . . . . . . 33 2.3.1. ACKNOWLEDGED . . . . . . . . . . . . . . . . . . . . 33 2.3.2. ACTION . . . . . . . . . . . . . . . . . . . . . . . 33 2.3.3. ATTACH . . . . . . . . . . . . . . . . . . . . . . . 35 2.3.4. ATTENDEE . . . . . . . . . . . . . . . . . . . . . . 36 2.3.5. CALENDAR-ADDRESS . . . . . . . . . . . . . . . . . . 42 2.3.6. CATEGORIES . . . . . . . . . . . . . . . . . . . . . 42 2.3.7. CLASS . . . . . . . . . . . . . . . . . . . . . . . . 43 2.3.8. COLOR . . . . . . . . . . . . . . . . . . . . . . . . 43 2.3.9. COMMENT . . . . . . . . . . . . . . . . . . . . . . . 44 2.3.10. CONCEPT . . . . . . . . . . . . . . . . . . . . . . . 45 2.3.11. CONFERENCE . . . . . . . . . . . . . . . . . . . . . 46 2.3.12. CREATED . . . . . . . . . . . . . . . . . . . . . . . 47 2.3.13. DESCRIPTION . . . . . . . . . . . . . . . . . . . . . 47 2.3.14. DTEND . . . . . . . . . . . . . . . . . . . . . . . . 48 2.3.15. DTSTAMP . . . . . . . . . . . . . . . . . . . . . . . 49 2.3.16. DTSTART . . . . . . . . . . . . . . . . . . . . . . . 50 2.3.17. DUE . . . . . . . . . . . . . . . . . . . . . . . . . 51 2.3.18. DURATION . . . . . . . . . . . . . . . . . . . . . . 53 2.3.19. ESTIMATED-DURATION . . . . . . . . . . . . . . . . . 53 2.3.20. EXDATE . . . . . . . . . . . . . . . . . . . . . . . 54 2.3.21. EXRULE . . . . . . . . . . . . . . . . . . . . . . . 54 2.3.22. GEO . . . . . . . . . . . . . . . . . . . . . . . . . 55 2.3.23. IMAGE . . . . . . . . . . . . . . . . . . . . . . . . 56 2.3.24. LAST-MODIFIED . . . . . . . . . . . . . . . . . . . . 57 Stepanek Expires 20 September 2025 [Page 2] Internet-Draft JSCalendar March 2025 2.3.25. LOCATION . . . . . . . . . . . . . . . . . . . . . . 57 2.3.26. LOCATION-TYPE . . . . . . . . . . . . . . . . . . . . 58 2.3.27. METHOD . . . . . . . . . . . . . . . . . . . . . . . 59 2.3.28. NAME . . . . . . . . . . . . . . . . . . . . . . . . 59 2.3.29. ORGANIZER . . . . . . . . . . . . . . . . . . . . . . 60 2.3.30. PARTICIPANT-TYPE . . . . . . . . . . . . . . . . . . 63 2.3.31. PERCENT-COMPLETE . . . . . . . . . . . . . . . . . . 64 2.3.32. PRIORITY . . . . . . . . . . . . . . . . . . . . . . 65 2.3.33. PRODID . . . . . . . . . . . . . . . . . . . . . . . 66 2.3.34. RDATE . . . . . . . . . . . . . . . . . . . . . . . . 66 2.3.35. RECURRENCE-ID . . . . . . . . . . . . . . . . . . . . 67 2.3.36. RELATED-TO . . . . . . . . . . . . . . . . . . . . . 67 2.3.37. REQUEST-STATUS . . . . . . . . . . . . . . . . . . . 70 2.3.38. RRULE . . . . . . . . . . . . . . . . . . . . . . . . 70 2.3.39. SEQUENCE . . . . . . . . . . . . . . . . . . . . . . 72 2.3.40. STATUS . . . . . . . . . . . . . . . . . . . . . . . 73 2.3.41. SOURCE . . . . . . . . . . . . . . . . . . . . . . . 73 2.3.42. STRUCTURED-DATA . . . . . . . . . . . . . . . . . . . 74 2.3.43. STYLED-DESCRIPTION . . . . . . . . . . . . . . . . . 75 2.3.44. SUMMARY . . . . . . . . . . . . . . . . . . . . . . . 76 2.3.45. TRANSP . . . . . . . . . . . . . . . . . . . . . . . 76 2.3.46. TRIGGER . . . . . . . . . . . . . . . . . . . . . . . 77 2.3.47. TZID . . . . . . . . . . . . . . . . . . . . . . . . 78 2.3.48. TZID-ALIAS-OF . . . . . . . . . . . . . . . . . . . . 79 2.3.49. TZNAME . . . . . . . . . . . . . . . . . . . . . . . 79 2.3.50. TZOFFSETFROM . . . . . . . . . . . . . . . . . . . . 79 2.3.51. TZOFFSETTO . . . . . . . . . . . . . . . . . . . . . 79 2.3.52. TZUNTIL . . . . . . . . . . . . . . . . . . . . . . . 79 2.3.53. TZURL . . . . . . . . . . . . . . . . . . . . . . . . 79 2.3.54. UID . . . . . . . . . . . . . . . . . . . . . . . . . 80 2.3.55. URL . . . . . . . . . . . . . . . . . . . . . . . . . 80 3. Converting JSCalendar to iCalendar . . . . . . . . . . . . . 81 3.1. Alert . . . . . . . . . . . . . . . . . . . . . . . . . . 81 3.2. Event and Task . . . . . . . . . . . . . . . . . . . . . 81 3.3. Group . . . . . . . . . . . . . . . . . . . . . . . . . . 86 3.4. Link . . . . . . . . . . . . . . . . . . . . . . . . . . 88 3.5. Location . . . . . . . . . . . . . . . . . . . . . . . . 89 3.6. Participant . . . . . . . . . . . . . . . . . . . . . . . 91 3.7. TimeZone . . . . . . . . . . . . . . . . . . . . . . . . 95 3.8. VirtualLocation . . . . . . . . . . . . . . . . . . . . . 96 4. Updates to iCalendar . . . . . . . . . . . . . . . . . . . . 97 4.1. New Properties . . . . . . . . . . . . . . . . . . . . . 97 4.1.1. JSKEY . . . . . . . . . . . . . . . . . . . . . . . . 97 4.1.2. JSPROP . . . . . . . . . . . . . . . . . . . . . . . 98 4.2. New Parameters . . . . . . . . . . . . . . . . . . . . . 101 4.2.1. JSKEY . . . . . . . . . . . . . . . . . . . . . . . . 101 4.2.2. JSPTR . . . . . . . . . . . . . . . . . . . . . . . . 102 5. Updates to JSCalendar . . . . . . . . . . . . . . . . . . . . 102 Stepanek Expires 20 September 2025 [Page 3] Internet-Draft JSCalendar March 2025 5.1. New Properties . . . . . . . . . . . . . . . . . . . . . 102 5.1.1. iCalComponent . . . . . . . . . . . . . . . . . . . . 102 5.1.2. iCalProperty . . . . . . . . . . . . . . . . . . . . 105 6. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 106 7. References . . . . . . . . . . . . . . . . . . . . . . . . . 106 7.1. Normative References . . . . . . . . . . . . . . . . . . 106 7.2. Informative References . . . . . . . . . . . . . . . . . 108 Appendix A. Discrepancies between iCalendar and JSCalendar . . . 109 A.1. Unsupported iCalendar Elements . . . . . . . . . . . . . 109 A.1.1. Components . . . . . . . . . . . . . . . . . . . . . 109 A.1.2. Properties by Component . . . . . . . . . . . . . . . 110 A.1.3. Subcomponents by Component . . . . . . . . . . . . . 112 A.1.4. Properties by Value Type . . . . . . . . . . . . . . 112 A.1.5. Parameters by Property . . . . . . . . . . . . . . . 112 A.2. Unsupported JSCalendar Properties . . . . . . . . . . . . 115 A.2.1. Event and Task . . . . . . . . . . . . . . . . . . . 115 A.2.2. Group . . . . . . . . . . . . . . . . . . . . . . . . 115 A.2.3. Link . . . . . . . . . . . . . . . . . . . . . . . . 115 A.2.4. Location . . . . . . . . . . . . . . . . . . . . . . 115 A.2.5. Participant . . . . . . . . . . . . . . . . . . . . . 115 A.2.6. Task . . . . . . . . . . . . . . . . . . . . . . . . 116 A.2.7. VirtualLocation . . . . . . . . . . . . . . . . . . . 116 Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 116 1. Introduction 1.1. Notational Conventions The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all capitals, as shown here. The ABNF definitions in this document use the notations of [RFC5234]. ABNF rules not defined in this document either are defined in [RFC5234] or [RFC5545]. 1.2. Scope and Goals This document outlines how to convert calendaring information between the iCalendar and JSCalendar data formats. It describes which elements are common to both, but also highlights where the two formats differ. For each common element, it defines a conversion rule and includes an example of how to convert that element. All iCalendar and JSCalendar elements currently registered at IANA are in scope, but not all of these elements are common to both formats. Stepanek Expires 20 September 2025 [Page 4] Internet-Draft JSCalendar March 2025 For elements that have no counterpart in the other format, it is the goal of this document to define how to preserve them during conversion, but in general it is not the goal to achieve this by defining new standard elements. Instead, this document defines special-purpose properties to preserve arbitrary elements. These conversion-specific properties are defined in Section 4.1.2 for iCalendar, and Sections 5.1.1 and 5.1.2 for JSCalendar. Appendix A further outlines the discrepancies between the two formats. 1.3. How to Read the Examples Later sections contain examples that illustrate how to convert between the iCalendar and JSCalendar data formats. The notation of these examples is such that their main points should be clear to the reader, but their contents can also be parsed for automated testing. The following sections define the notation for such examples. 1.3.1. iCalendar Examples An iCalendar example contains either an extract or a complete representation of iCalendar data. It always represents an iCalendar object, even if the example only depicts non-VCALENDAR components or properties. The following rules apply: * An example that only contains iCalendar properties implicitly represents a VEVENT component that is part of a VCALENDAR component. * An example that only contains one or more non-VCALENDAR components implicitly represents a VCALENDAR component that contains them. * An example that only contains a VCALENDAR component but no contained components implicitly represents a VCALENDAR component that contains a VEVENT component. * Implicit components (those without a BEGIN and END, or omitted completely) are assumed to contain all mandatory properties with some value, but the actual value is irrelevant for the example. Figure 1 contains three examples, all of which represent the same iCalendar data. In the first example, both the VEVENT component and VCALENDAR component are implicit. In the second example, only the VCALENDAR component and its mandatory properties are implicit. The third example depicts a complete VCALENDAR component, nothing is implicit. SUMMARY:hello Stepanek Expires 20 September 2025 [Page 5] Internet-Draft JSCalendar March 2025 BEGIN:VEVENT DTSTAMP:20060102T030405Z DTSTART:20060102T030405Z SUMMARY:hello UID:CC0A494A-6E07-4827-8294-0752DD1ECFA4 END:VEVENT BEGIN:VCALENDAR PRODID:-//FOO//bar//EN VERSION:2.0 BEGIN:VEVENT DTSTAMP:20060102T030405Z DTSTART:20060102T030405Z SUMMARY:hello UID:CC0A494A-6E07-4827-8294-0752DD1ECFA4 END:VEVENT END:VCALENDAR Figure 1: Examples for implicit and explicit iCalendar component notation A line containing just the value ... stands for any other properties that might be present in a component but are irrelevant for this example. This includes mandatory properties as described for implicit components. The line ... at the end of the example additionally stands for any END content lines to complete components that started with BEGIN content lines, and any of their missing mandatory properties. Figure 2 illustrates this as an alternative representation for the examples of Figure 1. BEGIN:VCALENDAR BEGIN:VEVENT SUMMARY:hello ... Figure 2: Example for additional properties and component ENDs represented by ... A line starting with a single space represents the continuation of a folded content line (Section 3.1 of [RFC5545]). Figure 3 illustrates this. SUMMARY:he llo Figure 3: Example for a folded content line Stepanek Expires 20 September 2025 [Page 6] Internet-Draft JSCalendar March 2025 1.3.2. JSCalendar Examples A JSCalendar example always represents a Group object, even if the example only depicts one of the Group entries or properties. JSCalendar objects are depicted either explicitly or implicitly. An explicit JSCalendar object starts and ends with braces. An implicit JSCalendar object omits braces, it only consists of JSON name/value pairs, separated by comma. An implicit JSCalendar object is assumed to be of type Event, unless it contains the @type property with a different value. It is assumed to contain all mandatory properties with some value; if they are not depicted, their actual value is irrelevant for the main point of the example. Figure 4 illustrates this with multiple examples, all of which represent the same JSCalendar data. The first example contains an implicit JSCalendar object of type Event. The second example contains an implicit JSCalendar object with a @type property. The third example contains an explicit Event object but the Group object containing it is omitted. The fourth example contains the full Group object, nothing is omitted. "title": "hello" "@type": "Event", "title": "hello" { "@type": "Event", "title": "hello", "start": "2006-01-02T03:04:05", "timeZone": "Etc/UTC", "uid": "CC0A494A-6E07-4827-8294-0752DD1ECFA4", "updated": "2006-01-02T03:04:05Z" } { "@type": "Group", "entries": [ { "@type": "Event", "title": "hello", "start": "2006-01-02T03:04:05", "timeZone": "Etc/UTC", "uid": "CC0A494A-6E07-4827-8294-0752DD1ECFA4", "updated": "2006-01-02T03:04:05Z" } ] } Stepanek Expires 20 September 2025 [Page 7] Internet-Draft JSCalendar March 2025 Figure 4: Examples for implicit and explicit JSCalendar object notation A property with name "..." and value "" stands for additional properties that might be present in a JSCalendar object, but which are irrelevant for this example. This includes mandatory properties. Figure 5 illustrates this as an alternative representation for the examples of Figure 4. { "@type": "Event", "title": "hello", "...": "" } Figure 5: Example for additional properties represented by ... 1.4. Lossy versus Lossless Conversion This document outlines how to convert iCalendar elements to JSCalendar elements, and the other way round. Many of these can be represented by standard elements in both formats, meaning that they are registered in the iCalendar and JSCalendar IANA registries and differ from the special-purpose elements introduced in Section 4 and Section 5. Still, a number of elements in either format have no standard counterpart in the other. When converting between between iCalendar and JSCalendar, implementations MAY choose to only convert elements that have standard element in the target format, or aim to preserve as many elements as possible. When to choose between lossy and lossless conversion is implementation-specific. For example: * For lossy conversion, an implementation that internally stores calendar data in JSCalendar format might only want to convert to a subset of iCalendar elements for iMIP scheduling [RFC6047]. In this case, it might not make use any of the conversion-specific iCalendar properties introduced in Section 4. * For lossless conversion, an implementation that internally stores calendar data in iCalendar format might want to convert without loss to JSCalendar when updating calendar events with JMAP [I-D.ietf-jmap-calendars]. For that, it can use the conversion- specific properties defined in Section 5. All the examples in this document illustrate lossless conversion, if not explicitly stated otherwise in the example. Stepanek Expires 20 September 2025 [Page 8] Internet-Draft JSCalendar March 2025 2. Converting iCalendar to JSCalendar 2.1. General rules 2.1.1. iCalendar Objects Section 3.4 of [RFC5545] allows for an iCalendar stream to contain one or more iCalendar objects. In contrast, this specification only defines conversion for streams consisting of a single iCalendar object. Converting streams of multiple iCalendar objects is implementation-specific. All following sections of this document use the terms "iCalendar object" and "VCALENDAR component" interchangeably. The VCALENDAR component [RFC5545] (Section 3.4) converts to a Group object [RFC8984] (Section 2.3). Its properties convert as follows: +===============+============+==================+=========+======+ | Name | Reference | Group property | See | Note | +===============+============+==================+=========+======+ | CATEGORIES | [RFC5545], | keywords | Section | | | | Section | | 2.3.6 | | | | 3.8.1.2 | | | | +---------------+------------+------------------+---------+------+ | COLOR | [RFC7986], | color | Section | | | | Section | | 2.3.8 | | | | 5.9 | | | | +---------------+------------+------------------+---------+------+ | CONCEPT | [RFC9253], | categories | Section | | | | Section | | 2.3.10 | | | | 8.1 | | | | +---------------+------------+------------------+---------+------+ | CREATED | [RFC5545], | created | Section | | | | Section | | 2.3.12 | | | | 3.8.7.1 | | | | +---------------+------------+------------------+---------+------+ | DESCRIPTION | [RFC5545], | description | Section | | | | Section | | 2.3.13 | | | | 3.8.1.5 | | | | +---------------+------------+------------------+---------+------+ | LAST-MODIFIED | [RFC5545], | updated | Section | | | | Section | | 2.3.24 | | | | 3.8.7.3 | | | | +---------------+------------+------------------+---------+------+ | METHOD | [RFC5545], | entries/*/method | Section | | | | Section | | 2.3.27 | | | | 3.7.2 | | | | +---------------+------------+------------------+---------+------+ Stepanek Expires 20 September 2025 [Page 9] Internet-Draft JSCalendar March 2025 | NAME | [RFC7986], | title | Section | | | | Section | | 2.3.28 | | | | 5.1 | | | | +---------------+------------+------------------+---------+------+ | PRODID | [RFC5545], | prodId, | Section | | | | Section | entries/*/prodId | 2.3.33 | | | | 3.7.3 | | | | +---------------+------------+------------------+---------+------+ | SOURCE | [RFC7986], | source | Section | | | | Section | | 2.3.41 | | | | 5.8 | | | | +---------------+------------+------------------+---------+------+ | UID | [RFC5545], | uid | Section | | | | Section | | 2.3.54 | | | | 3.8.4.7 | | | | +---------------+------------+------------------+---------+------+ | URL | [RFC5545], | links | Section | | | | Section | | 2.3.55 | | | | 3.8.4.6 | | | | +---------------+------------+------------------+---------+------+ Table 1: Properties of the VCALENDAR component Its components convert as follows: +===========+===============+================+=========+======+ | Name | Reference | Group property | See | Note | +===========+===============+================+=========+======+ | VEVENT | [RFC5545], | entries | Section | | | | Section 3.6.1 | | 2.2.3 | | +-----------+---------------+----------------+---------+------+ | VTIMEZONE | [RFC5545], | timeZones | Section | | | | Section 3.6.5 | | 2.2.5 | | +-----------+---------------+----------------+---------+------+ | VTODO | [RFC5545], | entries | Section | | | | Section 3.6.2 | | 2.2.6 | | +-----------+---------------+----------------+---------+------+ Table 2: Components of the VCALENDAR component Other properties or components MAY be converted to the "iCalComponent" property (Section 5.1.1) of the Group object. The order of elements in the "entries" property is implementation- specific, e.g. entries need not be in the same order as their source components in the iCalendar object. Stepanek Expires 20 September 2025 [Page 10] Internet-Draft JSCalendar March 2025 The following example illustrates how to convert the VCALENDAR component: BEGIN:VCALENDAR UID:41aa02b6-42d0-4f45-8cb4-8b5075be2e14 BEGIN:VEVENT ... { "...": "", "@type": "Group", "entries": [ { "...": "", "@type": "Event" } ], "uid": "41aa02b6-42d0-4f45-8cb4-8b5075be2e14" } Figure 6: Converting the VCALENDAR component 2.1.2. Recurring Components Components in an iCalendar object generally convert to distinct JSCalendar objects. For example, two VEVENT components with different UID property values in the same iCalendar object convert to two separate Event objects in the Group object's entries. As an exception to this rule, this does not apply to recurrence overrides, defined as follows. A VEVENT (or VTODO) component is a recurrence override if it has the RECURRENCE-ID property set, and the iCalendar object contains a VEVENT (or VTODO) component that does not have the RECURRENCE-ID but the RRULE property set, and the UID property values of the two components are equal. The component without the RECURRENCE-ID property is in that case referred to as the "main component". The main component converts to an entry in the Group object's entries property. The recurrence override converts to the "recurrenceOverrides" property of the converted main component. Its RECURRENCE-ID property value converts to the key in the "recurrenceOverrides" property. The value of the "recurrenceOverrides" property at that key is a PatchObject that transform the converted main component into the converted recurrence override. The recurrenceId and recurrenceIdTimeZone properties MUST NOT be set in the PatchObject. Stepanek Expires 20 September 2025 [Page 11] Internet-Draft JSCalendar March 2025 The following example illustrates how to convert a main component and its recurrence override: BEGIN:VCALENDAR BEGIN:VEVENT UID:F4257E1D-5461-4EF6-840F-9DFC653EB559 RRULE:FREQ=DAILY DTSTART;TZID=Europe/Berlin:20240101T140000 ... END:VEVENT BEGIN:VEVENT UID:F4257E1D-5461-4EF6-840F-9DFC653EB559 RECURRENCE-ID;TZID=Europe/Berlin:20240202T140000 DTSTART;TZID=Europe/Berlin:20240202T160000 ... END:VEVENT END:VCALENDAR { "...": "", "@type": "Group", "entries": [ { "...": "", "@type": "Event", "recurrenceOverrides": { "2024-02-02T14:00:00": { "start": "2024-02-02T16:00:00" } }, "recurrenceRules": [ { "@type": "RecurrenceRule", "frequency": "daily" } ], "start": "2024-01-01T14:00:00", "timeZone": "Europe/Berlin", "uid": "F4257E1D-5461-4EF6-840F-9DFC653EB559" } ] } Figure 7: Converting VEVENT recurrence overrides Stepanek Expires 20 September 2025 [Page 12] Internet-Draft JSCalendar March 2025 A VEVENT (or VTODO) component is a stand-alone recurrence instance if it has the RECURRENCE-ID property set and the iCalendar object does not contain its related main component. Each stand-alone recurrence instance converts to a distinct Event (or Task) object in the Group object's entries property. The recurrenceId property MUST be set, the "recurrenceIdTimeZone" property MUST be set if not "null". The following example illustrates how to convert stand-alone recurrence instances: BEGIN:VCALENDAR BEGIN:VEVENT UID:F4257E1D-5461-4EF6-840F-9DFC653EB559 RECURRENCE-ID;TZID=Europe/Berlin:20240202T140000 DTSTART;TZID=Europe/Berlin:20240202T160000 ... END:VEVENT BEGIN:VEVENT UID:F4257E1D-5461-4EF6-840F-9DFC653EB559 RECURRENCE-ID;TZID=Europe/Berlin:20240103T140000 DTSTART;TZID=Europe/Berlin:20240103T170000 ... END:VEVENT END:VCALENDAR { "...": "", "@type": "Group", "entries": [ { "...": "", "@type": "Event", "recurrenceId": "2024-02-02T14:00:00", "recurrenceIdTimeZone": "Europe/Berlin", "start": "2024-02-02T16:00:00", "timeZone": "Europe/Berlin", "uid": "F4257E1D-5461-4EF6-840F-9DFC653EB559" }, { "...": "", "@type": "Event", "recurrenceId": "2024-01-03T14:00:00", "recurrenceIdTimeZone": "Europe/Berlin", "start": "2024-01-03T17:00:00", "timeZone": "Europe/Berlin", "uid": "F4257E1D-5461-4EF6-840F-9DFC653EB559" } ] } Stepanek Expires 20 September 2025 [Page 13] Internet-Draft JSCalendar March 2025 Figure 8: Converting VEVENT recurrence instances 2.1.3. JSCalendar Ids JSCalendar generally uses JSON objects to represent a collection of same-typed values. The keys are of type Id [RFC8984] (Section 1.4.1), the values are JSCalendar object types. If an iCalendar element converts to a value in such a collection, then an implementation needs to choose an identifier as key. This document defines the new JSKEY (Section 4.2.1) parameter and JSKEY property (Section 4.1.1), which allow to set a JSCalendar Id value when converting from JSCalendar to iCalendar. If they are set on a property or the component, then its value MUST be used as key when converting that element from iCalendar to JSCalendar. If no such parameter or property is set, then an implementation is free to choose any identifier, as long the following requirements are met: * The identifier MUST be a valid Id value. * The identifiers for the exact same iCalendar element MUST stay the same, irrespective of the order in which components, properties and parameters are processed. 2.1.4. Timezone identifiers Converting temporal properties such as DTSTART, DTEND, and RECURRENCE-ID requires to not only determine the date and time of the property value, but also the timezone it references. If the property value data type is DATE [RFC5545] (Section 3.3.4) or DATE-TIME in FORM #1: DATE WITH LOCAL TIME [RFC5545] (Section 3.3.5) then the timezone identifier is the JSON null value in JSCalendar. If the property value data type is DATE-TIME in FORM #2: DATE WITH UTC TIME [RFC5545] (Section 3.3.5) then the timezone identifier is the string "Etc/UTC" in JSCalendar. If the property value data type is DATE-TIME in FORM #3: DATE WITH LOCAL TIME AND TIME ZONE REFERENCE [RFC5545] (Section 3.3.5) then the timezone identifier is determined by the TZID parameter value: If the TZID parameter value is equal to a name in the IANA Time Zone Database [TZDB] then the timezone identifier is that verbatim name. If the TZID parameter value is unequal to an IANA timezone name then implementations MAY determine the name of an IANA timezone which has the same timezone rules over the timespan of the calendar object. Stepanek Expires 20 September 2025 [Page 14] Internet-Draft JSCalendar March 2025 Otherwise, the non-IANA timezone identifier is represented in JSCalendar as a string starting with the / (SLASH) character, followed by the TZID parameter value. The corresponding VTIMEZONE MUST be converted to the "timeZones" property with the prefixed identifier as key. See Figure 13 for an example. 2.1.5. DATE and DATE-TIME iCalendar provides the DATE and DATE-TIME value types to distinguish date-only from date-time values. JSCalendar only supports date-time values. A property value of type DATE-TIME converts to either a LocalDateTime or UTCDateTime, depending on the JSCalendar property definition. A DATE value type converts to a LocalDateTime with zero time. 2.2. Components 2.2.1. PARTICIPANT The PARTICIPANT component [RFC9073] (Section 7.1) converts to a Participant object [RFC8984] (Section 4.4.6). Its properties convert as follows: +================+==========+====================+=======+=========+ |Name |Reference |Participant property|See |Note | +================+==========+====================+=======+=========+ |ATTACH |[RFC5545],|links |Section| | | |Section | |2.3.3 | | | |3.8.1.1 | | | | +----------------+----------+--------------------+-------+---------+ |CALENDAR-ADDRESS|[RFC9073],|calendarAddress |Section| | | |Section | |2.3.5 | | | |6.4 | | | | +----------------+----------+--------------------+-------+---------+ |COMMENT |[RFC5545],|participationComment|Section|Only one | | |Section | |2.3.9 |comment | | |3.8.1.4 | | |supported| +----------------+----------+--------------------+-------+---------+ |DESCRIPTION |[RFC5545],|description |Section| | | |Section | |2.3.13 | | | |3.8.1.5 | | | | +----------------+----------+--------------------+-------+---------+ |DTSTAMP |[RFC5545],|scheduleUpdated |Section| | | |Section | |2.3.15 | | | |3.8.7.2 | | | | +----------------+----------+--------------------+-------+---------+ |GEO |[RFC5545],|locations |Section| | | |Section | |2.3.22 | | Stepanek Expires 20 September 2025 [Page 15] Internet-Draft JSCalendar March 2025 | |3.8.1.6 | | | | +----------------+----------+--------------------+-------+---------+ |PARTICIPANT-TYPE|[RFC9073],|roles |Section| | | |Section | |2.3.30 | | | |6.2 | | | | +----------------+----------+--------------------+-------+---------+ |SEQUENCE |[RFC5545],|scheduleSequence |Section| | | |Section | |2.3.39 | | | |3.8.7.4 | | | | +----------------+----------+--------------------+-------+---------+ |STRUCTURED-DATA |[RFC9073],|links |Section| | | |Section | |2.3.42 | | | |6.6 | | | | +----------------+----------+--------------------+-------+---------+ |SUMMARY |[RFC5545],|name |Section| | | |Section | |2.3.44 | | | |3.8.1.12 | | | | +----------------+----------+--------------------+-------+---------+ |URL |[RFC5545],|links |Section| | | |Section | |2.3.55 | | | |3.8.4.6 | | | | +----------------+----------+--------------------+-------+---------+ Table 3: Properties of the PARTICIPANT component Other properties or components MAY be converted to the "iCalComponent" property (Section 5.1.1) of the Participant object. This includes mandatory properties such as UID [RFC5545] (Section 3.8.4.7). The following example illustrates how to convert the PARTICIPANT component: BEGIN:VEVENT BEGIN:PARTICIPANT UID:47AD2E1C-49D4-45DF-BD83-8398ACC7D8E2 STRUCTURED-DATA;VALUE=URI: http://dir.example.com/vcard/contacts/contact1.vcf PARTICIPANT-TYPE:CONTACT DESCRIPTION:A contact END:PARTICIPANT ... Stepanek Expires 20 September 2025 [Page 16] Internet-Draft JSCalendar March 2025 { "...": "", "@type": "Event", "participants": { "p32": { "@type": "Participant", "description": "A contact", "iCalComponent": { "@type": "ICalComponent", "name": "participant", "properties": [ [ "uid", {}, "text", "47AD2E1C-49D4-45DF-BD83-8398ACC7D8E2" ] ] }, "links": { "l4": { "@type": "Link", "href": "http://dir.example.com/vcard/contacts/contact1.vcf", "iCalProperty": { "@type": "ICalProperty", "name": "structured-data", "valueType": "uri" } } }, "roles": { "contact": true } } } } Figure 9: Converting the PARTICIPANT component 2.2.2. VALARM The VALARM component [RFC5545] (Section 3.6.6) converts to an Alert object [RFC8984] (Section 4.5.2). Its properties convert as follows: Stepanek Expires 20 September 2025 [Page 17] Internet-Draft JSCalendar March 2025 +==============+============+==============+=========+===========+ | Name | Reference | Alert | See | Note | | | | property | | | +==============+============+==============+=========+===========+ | ACKNOWLEDGED | [RFC9074], | acknowledged | Section | | | | Section | | 2.3.1 | | | | 6.1 | | | | +--------------+------------+--------------+---------+-----------+ | ACTION | [RFC5545], | action | Section | Only if | | | Section | | 2.3.2 | ACTION is | | | 3.8.6.1 | | | EMAIL or | | | | | | DISPLAY. | +--------------+------------+--------------+---------+-----------+ | RELATED-TO | [RFC5545], | relatedTo | Section | | | | Section | | 2.3.36 | | | | 3.8.4.5 | | | | +--------------+------------+--------------+---------+-----------+ | TRIGGER | [RFC5545], | trigger | Section | | | | Section | | 2.3.46 | | | | 3.8.6.3 | | | | +--------------+------------+--------------+---------+-----------+ Table 4: Properties of the VALARM component Other properties or components MAY be converted to the "iCalComponent" property (Section 5.1.1) of the Alert object. This includes mandatory properties such as ATTENDEE [RFC5545] (Section 3.8.4.1), DESCRIPTION [RFC5545] (Section 3.8.1.5), or SUMMARY [RFC5545] (Section 3.8.1.12). The following example illustrates how to convert the VALARM component: BEGIN:VEVENT BEGIN:VALARM TRIGGER:-PT30M ACTION:DISPLAY DESCRIPTION:Breakfast meeting END:VALARM ... Stepanek Expires 20 September 2025 [Page 18] Internet-Draft JSCalendar March 2025 { "...": "", "@type": "Event", "alerts": { "a8": { "@type": "Alert", "iCalComponent": { "@type": "ICalComponent", "name": "valarm", "properties": [ [ "description", {}, "text", "Breakfast meeting" ] ] }, "trigger": { "@type": "OffsetTrigger", "offset": "-PT30M" }, "action": "display" } } } Figure 10: Converting the VALARM component 2.2.3. VEVENT The VEVENT component [RFC5545] (Section 3.6.1) converts to a Event object [RFC8984] (Section 2.1). Its properties convert as follows: +===========+==========+===================================+=======+====+ |Name |Reference |Event property |See |Note| +===========+==========+===================================+=======+====+ |ATTACH |[RFC5545],|links |Section| | | |Section | |2.3.3 | | | |3.8.1.1 | | | | +-----------+----------+-----------------------------------+-------+----+ |ATTENDEE |[RFC5545],|participants |Section| | | |Section | |2.3.4 | | | |3.8.4.1 | | | | +-----------+----------+-----------------------------------+-------+----+ |CATEGORIES |[RFC5545],|keywords |Section| | | |Section | |2.3.6 | | | |3.8.1.2 | | | | Stepanek Expires 20 September 2025 [Page 19] Internet-Draft JSCalendar March 2025 +-----------+----------+-----------------------------------+-------+----+ |CLASS |[RFC5545],|privacy |Section| | | |Section | |2.3.7 | | | |3.8.1.3 | | | | +-----------+----------+-----------------------------------+-------+----+ |COLOR |[RFC7986],|color |Section| | | |Section | |2.3.8 | | | |5.9 | | | | +-----------+----------+-----------------------------------+-------+----+ |COMMENT |[RFC5545],|participants/*/participationComment|Section| | | |Section | |2.3.9 | | | |3.8.1.4 | | | | +-----------+----------+-----------------------------------+-------+----+ |CONCEPT |[RFC9253],|categories |Section| | | |Section | |2.3.10 | | | |8.1 | | | | +-----------+----------+-----------------------------------+-------+----+ |CONFERENCE |[RFC7986],|virtualLocations |Section| | | |Section | |2.3.11 | | | |5.11 | | | | +-----------+----------+-----------------------------------+-------+----+ |CREATED |[RFC5545],|created |Section| | | |Section | |2.3.12 | | | |3.8.7.1 | | | | +-----------+----------+-----------------------------------+-------+----+ |DESCRIPTION|[RFC5545],|description |Section| | | |Section | |2.3.13 | | | |3.8.1.5 | | | | +-----------+----------+-----------------------------------+-------+----+ |DTEND |[RFC5545],|duration |Section| | | |Section | |2.3.14 | | | |3.8.2.2 | | | | +-----------+----------+-----------------------------------+-------+----+ |DTSTAMP |[RFC5545],|updated, scheduleUpdated |Section| | | |Section | |2.3.15 | | | |3.8.7.2 | | | | +-----------+----------+-----------------------------------+-------+----+ |DTSTART |[RFC5545],|start |Section| | | |Section | |2.3.16 | | | |3.8.2.4 | | | | +-----------+----------+-----------------------------------+-------+----+ |DURATION |[RFC5545],|duration |Section| | | |Section | |2.3.18 | | | |3.8.2.5 | | | | +-----------+----------+-----------------------------------+-------+----+ |EXDATE |[RFC5545],|recurrenceOverrides |Section| | | |Section | |2.3.20 | | | |3.8.5.1 | | | | Stepanek Expires 20 September 2025 [Page 20] Internet-Draft JSCalendar March 2025 +-----------+----------+-----------------------------------+-------+----+ |EXRULE |[RFC2445],|excludedRecurrenceRules |Section| | | |Section | |2.3.21 | | | |4.8.5.2 | | | | +-----------+----------+-----------------------------------+-------+----+ |GEO |[RFC5545],|locations |Section| | | |Section | |2.3.22 | | | |3.8.1.6 | | | | +-----------+----------+-----------------------------------+-------+----+ |IMAGE |[RFC7986],|links |Section| | | |Section | |2.3.23 | | | |5.10 | | | | +-----------+----------+-----------------------------------+-------+----+ |LAST- |[RFC5545],|updated |Section| | |MODIFIED |Section | |2.3.24 | | | |3.8.7.3 | | | | +-----------+----------+-----------------------------------+-------+----+ |LOCATION |[RFC5545],|locations |Section| | | |Section | |2.3.25 | | | |3.8.1.7 | | | | +-----------+----------+-----------------------------------+-------+----+ |ORGANIZER |[RFC5545],|replyTo |Section| | | |Section | |2.3.29 | | | |3.8.4.3 | | | | +-----------+----------+-----------------------------------+-------+----+ |PRIORITY |[RFC5545],|priority |Section| | | |Section | |2.3.32 | | | |3.8.1.9 | | | | +-----------+----------+-----------------------------------+-------+----+ |RDATE |[RFC5545],|recurrenceOverrides |Section| | | |Section | |2.3.34 | | | |3.8.5.2 | | | | +-----------+----------+-----------------------------------+-------+----+ |RECURRENCE-|[RFC5545],|recurrenceId |Section| | |ID |Section | |2.3.35 | | | |3.8.4.4 | | | | +-----------+----------+-----------------------------------+-------+----+ |RELATED-TO |[RFC5545],|relatedTo |Section| | | |Section | |2.3.36 | | | |3.8.4.5 | | | | +-----------+----------+-----------------------------------+-------+----+ |REQUEST- |[RFC5545],|requestStatus |Section| | |STATUS |Section | |2.3.37 | | | |3.8.8.3 | | | | +-----------+----------+-----------------------------------+-------+----+ |RRULE |[RFC5545],|recurrenceRules |Section| | | |Section | |2.3.38 | | | |3.8.5.3 | | | | Stepanek Expires 20 September 2025 [Page 21] Internet-Draft JSCalendar March 2025 +-----------+----------+-----------------------------------+-------+----+ |SEQUENCE |[RFC5545],|sequence |Section| | | |Section | |2.3.39 | | | |3.8.7.4 | | | | +-----------+----------+-----------------------------------+-------+----+ |STATUS |[RFC5545],|status |Section| | | |Section | |2.3.40 | | | |3.8.1.11 | | | | +-----------+----------+-----------------------------------+-------+----+ |STRUCTURED-|[RFC9073],|links |Section| | |DATA |Section | |2.3.42 | | | |6.6 | | | | +-----------+----------+-----------------------------------+-------+----+ |STYLED- |[RFC9073],|description |Section| | |DESCRIPTION|Section | |2.3.43 | | | |6.5 | | | | +-----------+----------+-----------------------------------+-------+----+ |SUMMARY |[RFC5545],|title |Section| | | |Section | |2.3.44 | | | |3.8.1.12 | | | | +-----------+----------+-----------------------------------+-------+----+ |TRANSP |[RFC5545],|freeBusyStatus |Section| | | |Section | |2.3.45 | | | |3.8.2.7 | | | | +-----------+----------+-----------------------------------+-------+----+ |UID |[RFC5545],|uid |Section| | | |Section | |2.3.54 | | | |3.8.4.7 | | | | +-----------+----------+-----------------------------------+-------+----+ |URL |[RFC5545],|links |Section| | | |Section | |2.3.55 | | | |3.8.4.6 | | | | +-----------+----------+-----------------------------------+-------+----+ Table 5: Properties of the VEVENT component Its components convert as follows: +========+===============+================+=========+======+ | Name | Reference | Event property | See | Note | +========+===============+================+=========+======+ | VALARM | [RFC5545], | alerts | Section | | | | Section 3.6.6 | | 2.2.2 | | +--------+---------------+----------------+---------+------+ Table 6: Components of the VEVENT component Stepanek Expires 20 September 2025 [Page 22] Internet-Draft JSCalendar March 2025 Other properties or components MAY be converted to the "iCalComponent" property (Section 5.1.1) of the Event object. VEVENT components with different UID property values in the same iCalendar object convert to different entries in the Group. They sort in the same order as in the VCALENDAR component. The following example illustrates how to convert the VEVENT component: BEGIN:VCALENDAR BEGIN:VEVENT UID:DE935D01-3DF7-4201-B61A-D77D05C8B21A DTSTART:20060102T030405Z ... END:VEVENT BEGIN:VEVENT UID:60BE3D6E-6383-473A-BCF1-3C43EA1FA571 ... END:VEVENT END:VCALENDAR { "...": "", "@type": "Group", "entries": [ { "@type": "Event", "start": "2006-01-02T03:04:05", "timeZone": "Etc/UTC", "uid": "DE935D01-3DF7-4201-B61A-D77D05C8B21A", "...": "" }, { "@type": "Event", "uid": "60BE3D6E-6383-473A-BCF1-3C43EA1FA571", "...": "" } ] } Figure 11: Converting the VEVENT component 2.2.4. VLOCATION The VLOCATION component [RFC9073] (Section 7.2) converts to a Location object [RFC8984] (Section 4.2.5). Its properties convert as follows: Stepanek Expires 20 September 2025 [Page 23] Internet-Draft JSCalendar March 2025 +=================+============+===============+=========+======+ | Name | Reference | Location | See | Note | | | | property | | | +=================+============+===============+=========+======+ | ATTACH | [RFC5545], | links | Section | | | | Section | | 2.3.3 | | | | 3.8.1.1 | | | | +-----------------+------------+---------------+---------+------+ | DESCRIPTION | [RFC5545], | description | Section | | | | Section | | 2.3.13 | | | | 3.8.1.5 | | | | +-----------------+------------+---------------+---------+------+ | GEO | [RFC5545], | coordinates | Section | | | | Section | | 2.3.22 | | | | 3.8.1.6 | | | | +-----------------+------------+---------------+---------+------+ | IMAGE | [RFC7986], | links | Section | | | | Section | | 2.3.23 | | | | 5.10 | | | | +-----------------+------------+---------------+---------+------+ | LOCATION-TYPE | [RFC9073], | locationTypes | Section | | | | Section | | 2.3.26 | | | | 6.1 | | | | +-----------------+------------+---------------+---------+------+ | NAME | [RFC7986], | name | Section | | | | Section | | 2.3.28 | | | | 5.1 | | | | +-----------------+------------+---------------+---------+------+ | STRUCTURED-DATA | [RFC9073], | links | Section | | | | Section | | 2.3.42 | | | | 6.6 | | | | +-----------------+------------+---------------+---------+------+ Table 7: Properties of the VLOCATION component Other properties or components MAY be converted to the "iCalComponent" property (Section 5.1.1) of the Location object. This includes mandatory properties such as UID [RFC5545] (Section 3.8.4.7). The following example illustrates how to convert the VLOCATION component: Stepanek Expires 20 September 2025 [Page 24] Internet-Draft JSCalendar March 2025 BEGIN:VLOCATION UID:4954DC22-5BD6-4E98-844D-0302982F54AC NAME:The venue STRUCTURED-DATA;VALUE=URI: http://dir.example.com/venues/big-hall.vcf END:VLOCATION "locations": { "e4": { "@type": "Location", "name": "The venue", "links": { "21": { "@type": "Link", "href": "http://dir.example.com/venues/big-hall.vcf", "...": "" } }, "iCalComponent": { "@type": "ICalComponent", "name": "vlocation", "properties": [ [ "uid", {}, "text", "4954DC22-5BD6-4E98-844D-0302982F54AC" ] ] } } } Figure 12: Converting the VLOCATION component 2.2.5. VTIMEZONE The VTIMEZONE component [RFC5545] (Section 3.6.5) converts to a TimeZone object [RFC8984] (Section 4.7.2). Its properties convert as follows: Stepanek Expires 20 September 2025 [Page 25] Internet-Draft JSCalendar March 2025 +===============+=================+============+=========+======+ | Name | Reference | TimeZone | See | Note | | | | property | | | +===============+=================+============+=========+======+ | LAST-MODIFIED | [RFC5545], | updated | Section | | | | Section 3.8.7.3 | | 2.3.24 | | +---------------+-----------------+------------+---------+------+ | TZID | [RFC5545], | tzId | Section | | | | Section 3.8.3.1 | | 2.3.47 | | +---------------+-----------------+------------+---------+------+ | TZID-ALIAS-OF | [RFC7808], | aliases | Section | | | | Section 7.2 | | 2.3.48 | | +---------------+-----------------+------------+---------+------+ | TZUNTIL | [RFC7808], | validUntil | Section | | | | Section 7.1 | | 2.3.52 | | +---------------+-----------------+------------+---------+------+ | TZURL | [RFC5545], | url | Section | | | | Section 3.8.3.5 | | 2.3.53 | | +---------------+-----------------+------------+---------+------+ Table 8: Properties of the VTIMEZONE component Its components convert as follows: +==========+===============+===================+=========+======+ | Name | Reference | TimeZone property | See | Note | +==========+===============+===================+=========+======+ | DAYLIGHT | [RFC5545], | daylight | In this | | | | Section 3.6.5 | | section | | +----------+---------------+-------------------+---------+------+ | STANDARD | [RFC5545], | standard | In this | | | | Section 3.6.5 | | section | | +----------+---------------+-------------------+---------+------+ Table 9: Components of the VTIMEZONE component Other properties or components MAY be converted to the "iCalComponent" property (Section 5.1.1) of the TimeZone object. The DAYLIGHT component [RFC5545] (Section 3.6.5) and STANDARD component [RFC5545] (Section 3.6.5) convert to a TimeZoneRule object [RFC8984] (Section 4.7.2). Their properties convert as follows: Stepanek Expires 20 September 2025 [Page 26] Internet-Draft JSCalendar March 2025 +==============+============+=====================+=========+======+ | Name | Reference | TimeZoneRule | See | Note | | | | property | | | +==============+============+=====================+=========+======+ | COMMENT | [RFC5545], | comments | Section | | | | Section | | 2.3.9 | | | | 3.8.1.4 | | | | +--------------+------------+---------------------+---------+------+ | DTSTART | [RFC5545], | start | Section | | | | Section | | 2.3.16 | | | | 3.8.2.4 | | | | +--------------+------------+---------------------+---------+------+ | RDATE | [RFC5545], | recurrenceOverrides | Section | | | | Section | | 2.3.34 | | | | 3.8.5.2 | | | | +--------------+------------+---------------------+---------+------+ | RRULE | [RFC5545], | recurrenceRules | Section | | | | Section | | 2.3.38 | | | | 3.8.5.3 | | | | +--------------+------------+---------------------+---------+------+ | TZNAME | [RFC5545], | names | Section | | | | Section | | 2.3.49 | | | | 3.8.3.2 | | | | +--------------+------------+---------------------+---------+------+ | TZOFFSETFROM | [RFC5545], | offsetFrom | Section | | | | Section | | 2.3.50 | | | | 3.8.3.3 | | | | +--------------+------------+---------------------+---------+------+ | TZOFFSETTO | [RFC5545], | offsetTo | Section | | | | Section | | 2.3.51 | | | | 3.8.3.4 | | | | +--------------+------------+---------------------+---------+------+ Table 10: Properties of the DAYLIGHT or STANDARD component Other properties or components MAY be converted to the "iCalComponent" property (Section 5.1.1) of the TimeZoneRule object. The following example illustrates how to convert the VTIMEZONE component: Stepanek Expires 20 September 2025 [Page 27] Internet-Draft JSCalendar March 2025 BEGIN:VCALENDAR BEGIN:VTIMEZONE TZID:CustomTz TZID-ALIAS-OF:Puerto_Rico TZID-ALIAS-OF:America/Anguilla LAST-MODIFIED:20240909T122233Z TZUNTIL:20080709T000000Z TZURL:https://example.com/tz/CustomTz.ics BEGIN:DAYLIGHT TZNAME:AWT TZOFFSETFROM:-0400 TZOFFSETTO:-0300 DTSTART:19420503T000000 END:DAYLIGHT BEGIN:DAYLIGHT TZNAME:APT TZOFFSETFROM:-0300 TZOFFSETTO:-0300 DTSTART:19450814T200000 END:DAYLIGHT BEGIN:STANDARD TZNAME:AST TZOFFSETFROM:-0300 TZOFFSETTO:-0400 DTSTART:19450930T020000 END:STANDARD END:VTIMEZONE BEGIN:VEVENT DTSTART;TZID=CustomTz:20080708T130000 ... { "...": "", "@type": "Group", "entries": [ { "...": "", "@type": "Event", "start": "2008-07-08T13:00:00", "timeZone": "/CustomTz" } ], "timeZones": { "/CustomTz": { "@type": "TimeZone", "aliases": { "Puerto_Rico": true, "America/Anguilla": true }, Stepanek Expires 20 September 2025 [Page 28] Internet-Draft JSCalendar March 2025 "validUntil": "2008-07-09T00:00:00Z", "daylight": [ { "@type": "TimeZoneRule", "offsetFrom": "-0400", "offsetTo": "-0300", "start": "1942-05-03T00:00:00", "names": { "AWT": true } }, { "@type": "TimeZoneRule", "offsetFrom": "-0300", "offsetTo": "-0300", "start": "1945-08-14T20:00:00", "names": { "APT": true } } ], "standard": [ { "@type": "TimeZoneRule", "offsetFrom": "-0300", "offsetTo": "-0400", "start": "1945-09-30T02:00:00", "names": { "AST": true } } ], "tzId": "CustomTz", "updated": "2024-09-09T12:22:33Z", "url": "https://example.com/tz/CustomTz.ics" } } } Figure 13: Converting the VTIMEZONE component 2.2.6. VTODO The VTODO component [RFC5545] (Section 3.6.2) converts to a Task object [RFC8984] (Section 2.2). Its properties convert as follows: Stepanek Expires 20 September 2025 [Page 29] Internet-Draft JSCalendar March 2025 +===========+=============================+===================================+=======+====+ |Name |Reference |Task property |See |Note| +===========+=============================+===================================+=======+====+ |ATTACH |[RFC5545], Section 3.8.1.1 |links |Section| | | | | |2.3.3 | | +-----------+-----------------------------+-----------------------------------+-------+----+ |ATTENDEE |[RFC5545], Section 3.8.4.1 |participants |Section| | | | | |2.3.4 | | +-----------+-----------------------------+-----------------------------------+-------+----+ |CATEGORIES |[RFC5545], Section 3.8.1.2 |keywords |Section| | | | | |2.3.6 | | +-----------+-----------------------------+-----------------------------------+-------+----+ |CLASS |[RFC5545], Section 3.8.1.3 |privacy |Section| | | | | |2.3.7 | | +-----------+-----------------------------+-----------------------------------+-------+----+ |COLOR |[RFC7986], Section 5.9 |color |Section| | | | | |2.3.8 | | +-----------+-----------------------------+-----------------------------------+-------+----+ |COMMENT |[RFC5545], Section 3.8.1.4 |participants/*/participationComment|Section| | | | | |2.3.9 | | +-----------+-----------------------------+-----------------------------------+-------+----+ |CONCEPT |[RFC9253], Section 8.1 |categories |Section| | | | | |2.3.10 | | +-----------+-----------------------------+-----------------------------------+-------+----+ |CONFERENCE |[RFC7986], Section 5.11 |virtualLocations |Section| | | | | |2.3.11 | | +-----------+-----------------------------+-----------------------------------+-------+----+ |CREATED |[RFC5545], Section 3.8.7.1 |created |Section| | | | | |2.3.12 | | +-----------+-----------------------------+-----------------------------------+-------+----+ |DESCRIPTION|[RFC5545], Section 3.8.1.5 |description |Section| | | | | |2.3.13 | | +-----------+-----------------------------+-----------------------------------+-------+----+ |DTSTAMP |[RFC5545], Section 3.8.7.2 |updated, scheduleUpdated |Section| | | | | |2.3.15 | | +-----------+-----------------------------+-----------------------------------+-------+----+ |DTSTART |[RFC5545], Section 3.8.2.4 |start |Section| | | | | |2.3.16 | | +-----------+-----------------------------+-----------------------------------+-------+----+ |DUE |[RFC5545], Section 3.8.2.3 |due |Section| | | | | |2.3.17 | | +-----------+-----------------------------+-----------------------------------+-------+----+ |DURATION |[RFC5545], Section 3.8.2.5 |duration |Section| | | | | |2.3.18 | | +-----------+-----------------------------+-----------------------------------+-------+----+ |ESTIMATED- |[I-D.ietf-calext-ical-tasks],|estimatedDuration |Section| | |DURATION |Section 12.1 | |2.3.19 | | +-----------+-----------------------------+-----------------------------------+-------+----+ Stepanek Expires 20 September 2025 [Page 30] Internet-Draft JSCalendar March 2025 |EXDATE |[RFC5545], Section 3.8.5.1 |recurrenceOverrides |Section| | | | | |2.3.20 | | +-----------+-----------------------------+-----------------------------------+-------+----+ |EXRULE |[RFC2445], Section 4.8.5.2 |excludedRecurrenceRules |Section| | | | | |2.3.21 | | +-----------+-----------------------------+-----------------------------------+-------+----+ |GEO |[RFC5545], Section 3.8.1.6 |locations |Section| | | | | |2.3.22 | | +-----------+-----------------------------+-----------------------------------+-------+----+ |IMAGE |[RFC7986], Section 5.10 |links |Section| | | | | |2.3.23 | | +-----------+-----------------------------+-----------------------------------+-------+----+ |LAST- |[RFC5545], Section 3.8.7.3 |updated |Section| | |MODIFIED | | |2.3.24 | | +-----------+-----------------------------+-----------------------------------+-------+----+ |LOCATION |[RFC5545], Section 3.8.1.7 |locations |Section| | | | | |2.3.25 | | +-----------+-----------------------------+-----------------------------------+-------+----+ |ORGANIZER |[RFC5545], Section 3.8.4.3 |replyTo |Section| | | | | |2.3.29 | | +-----------+-----------------------------+-----------------------------------+-------+----+ |PERCENT- |[RFC5545], Section 3.8.1.8 |percentComplete |Section| | |COMPLETE | | |2.3.31 | | +-----------+-----------------------------+-----------------------------------+-------+----+ |PRIORITY |[RFC5545], Section 3.8.1.9 |priority |Section| | | | | |2.3.32 | | +-----------+-----------------------------+-----------------------------------+-------+----+ |RDATE |[RFC5545], Section 3.8.5.2 |recurrenceOverrides |Section| | | | | |2.3.34 | | +-----------+-----------------------------+-----------------------------------+-------+----+ |RECURRENCE-|[RFC5545], Section 3.8.4.4 |recurrenceId |Section| | |ID | | |2.3.35 | | +-----------+-----------------------------+-----------------------------------+-------+----+ |RELATED-TO |[RFC5545], Section 3.8.4.5 |relatedTo |Section| | | | | |2.3.36 | | +-----------+-----------------------------+-----------------------------------+-------+----+ |REQUEST- |[RFC5545], Section 3.8.8.3 |requestStatus |Section| | |STATUS | | |2.3.37 | | +-----------+-----------------------------+-----------------------------------+-------+----+ |RRULE |[RFC5545], Section 3.8.5.3 |recurrenceRules |Section| | | | | |2.3.38 | | +-----------+-----------------------------+-----------------------------------+-------+----+ |SEQUENCE |[RFC5545], Section 3.8.7.4 |sequence |Section| | | | | |2.3.39 | | +-----------+-----------------------------+-----------------------------------+-------+----+ |STRUCTURED-|[RFC9073], Section 6.6 |links |Section| | |DATA | | |2.3.42 | | +-----------+-----------------------------+-----------------------------------+-------+----+ Stepanek Expires 20 September 2025 [Page 31] Internet-Draft JSCalendar March 2025 |STYLED- |[RFC9073], Section 6.5 |description |Section| | |DESCRIPTION| | |2.3.43 | | +-----------+-----------------------------+-----------------------------------+-------+----+ |SUMMARY |[RFC5545], Section 3.8.1.12 |title |Section| | | | | |2.3.44 | | +-----------+-----------------------------+-----------------------------------+-------+----+ |TRANSP |[RFC5545], Section 3.8.2.7 |freeBusyStatus |Section| | | | | |2.3.45 | | +-----------+-----------------------------+-----------------------------------+-------+----+ |UID |[RFC5545], Section 3.8.4.7 |uid |Section| | | | | |2.3.54 | | +-----------+-----------------------------+-----------------------------------+-------+----+ |URL |[RFC5545], Section 3.8.4.6 |links |Section| | | | | |2.3.55 | | +-----------+-----------------------------+-----------------------------------+-------+----+ Table 11: Properties of the VTODO component Its components convert as follows: +========+===============+===============+=========+======+ | Name | Reference | Task property | See | Note | +========+===============+===============+=========+======+ | VALARM | [RFC5545], | alerts | Section | | | | Section 3.6.6 | | 2.2.2 | | +--------+---------------+---------------+---------+------+ Table 12: Components of the VTODO component Other properties or components MAY be converted to the "iCalComponent" property (Section 5.1.1) of the Task object. VTODO components with different UID property values in the same iCalendar object convert to different entries in the Group. They sort in the same order as in the VCALENDAR component. The following example illustrates how to convert the VTODO component: BEGIN:VCALENDAR BEGIN:VTODO UID:83C80482-806D-41C4-8029-E438F793005D DUE:20060102T030405Z ... Stepanek Expires 20 September 2025 [Page 32] Internet-Draft JSCalendar March 2025 { "...": "", "@type": "Group", "entries": [ { "...": "", "@type": "Task", "due": "2006-01-02T03:04:05", "timeZone": "Etc/UTC", "uid": "83C80482-806D-41C4-8029-E438F793005D" } ] } Figure 14: Converting the VTODO component 2.3. Properties 2.3.1. ACKNOWLEDGED The ACKNOWLEDGED property [RFC9074] (Section 6.1) in a VALARM component converts to the "acknowledged" property [RFC8984] (Section 4.5.2) of the Alert object. The following example illustrates how to convert the ACKNOWLEDGED property: BEGIN:VEVENT BEGIN:VALARM ACKNOWLEDGED:20241002T114703Z ... "alerts": { "a": { "@type": "Alert", "acknowledged": "2024-10-02T11:47:03Z", "...": "" } } Figure 15: Converting the ACKNOWLEDGED property 2.3.2. ACTION The ACTION property [RFC5545] (Section 3.8.6.1) in a VALARM component converts to the "action" property [RFC8984] (Section 4.5.2) of the Alert object. Its values convert as follows: Stepanek Expires 20 September 2025 [Page 33] Internet-Draft JSCalendar March 2025 +=================+==================+ | iCalendar value | JSCalendar value | +=================+==================+ | DISPLAY | display | +-----------------+------------------+ | EMAIL | email | +-----------------+------------------+ Table 13: Values of the ACTION property An ACTION property with value AUDIO or any other not listed in Table 13 does not convert to the "action" property. Instead, the property converts to the iCalComponent/properties property (Section 5.1.1) of the Alert. The following examples illustrate how to convert the ACTION property: BEGIN:VEVENT BEGIN:VALARM ACTION:DISPLAY ... "alerts": { "a": { "@type": "Alert", "action": "display", "...": "" } } Figure 16: Converting the ACTION property for value DISPLAY BEGIN:VEVENT BEGIN:VALARM ACTION:AUDIO ... Stepanek Expires 20 September 2025 [Page 34] Internet-Draft JSCalendar March 2025 "alerts": { "a": { "@type": "Alert", "iCalComponent": { "@type": "ICalComponent", "name": "valarm", "properties": [ [ "action", {}, "text", "AUDIO" ] ] }, "...": "" } } Figure 17: Converting the ACTION property for value AUDIO 2.3.3. ATTACH The ATTACH property [RFC5545] (Section 3.8.1.1) in a VEVENT, VTODO, PARTICIPANT, or VLOCATION component converts to a Link object [RFC8984] (Section 1.4.11). The converted object is set in the "links" property of the Event, Task, Participant, or Location object. The property value converts to the "href" property of the Link object. A value of type URI converts as-is. A value of type BINARY converts to a URI in the "data" URL scheme ([RFC2397]. If the FMTTYPE parameter is set on the ATTACH property, then the parameter value MUST be set in the "mediatype" part of the data URL. The ATTACH property parameters convert as follows: +=========+==========================+===============+=============+ | Name | Reference | Link Property | Note | +=========+==========================+===============+=============+ | FMTTYPE | [RFC5545], Section 3.2.8 | contentType | | +---------+--------------------------+---------------+-------------+ | LINKREL | [RFC9253], Section 6.1 | rel | See remarks | | | | | below | +---------+--------------------------+---------------+-------------+ | SIZE | [RFC8607], Section 4.1 | size | | +---------+--------------------------+---------------+-------------+ Table 14: Parameters of the ATTACH property Stepanek Expires 20 September 2025 [Page 35] Internet-Draft JSCalendar March 2025 Remarks: * The LINKREL parameter value is defined to be either an URI or an "iana-token" [RFC5545] (Section 3.1). Only parameter values of form "iana-token" convert to the "rel" property of the Link object. The following examples illustrate how to convert the ATTACH property: ATTACH:https://example.com/foo.pdf "links": { "a": { "@type": "Link", "href": "https://example.com/foo.pdf" } } Figure 18: Converting the ATTACH property with URI value ATTACH;ENCODING=BASE64;VALUE=BINARY;FMTTYPE=image/png:iVBORw 0KGgoAAAANSUhEUgAAAAEAAAABAQAAAAA3bvkkAAAAAmJLR0QAAd2KE6QAA AAKSURBVAjXY2gAAACCAIHdQ2r0AAAAAElFTkSuQmCC "links": { "a": { "@type": "Link", "href": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQAAAAA3bvkkAAAAAmJLR0QAAd2KE6QAAAAKSURBVAjXY2gAAACCAIHdQ2r0AAAAAElFTkSuQmCC", "contentType": "image/png", "...": "" } } Figure 19: Converting the ATTACH property with BINARY value 2.3.4. ATTENDEE The ATTENDEE property [RFC5545] (Section 3.8.4.1) in a VEVENT or VTODO component converts to a Participant object [RFC8984] (Section 4.4.6). The converted object is set in the "participants" property of the Event or Task object. The property value converts to both the calendarAddress and sendTo properties of the Participant object. If the CAL-ADDRESS value is in the "mailto" scheme, then it converts to the "imip" method in the "sendTo" property, otherwise it converts to the "other" method. An ATTENDEE property and a PARTICIPANT component in the same iCalendar component convert to the same Participant object, if their converted calendarAddress property values are equal after URI Stepanek Expires 20 September 2025 [Page 36] Internet-Draft JSCalendar March 2025 normalization [RFC3986] (Section 6). How to deal with conflicting values when converting other Participant properties is implementation-specific. The ATTENDEE property parameters convert as follows: +=====================+================+=====================+======+ | Name | Reference | Participant | Note | | | | Property | | +=====================+================+=====================+======+ | CN | [RFC5545], | name | | | | Section 3.2.2 | | | +---------------------+----------------+---------------------+------+ | CUTYPE | [RFC5545], | kind | | | | Section 3.2.3 | | | +---------------------+----------------+---------------------+------+ | DELEGATED-FROM | [RFC5545], | delegatedFrom | | | | Section 3.2.4 | | | +---------------------+----------------+---------------------+------+ | DELEGATED-TO | [RFC5545], | delegatedTo | | | | Section 3.2.5 | | | +---------------------+----------------+---------------------+------+ | DIR | [RFC5545], | links | | | | Section 3.2.6 | | | +---------------------+----------------+---------------------+------+ | EMAIL | [RFC7986], | email | | | | Section 6.2 | | | +---------------------+----------------+---------------------+------+ | MEMBER | [RFC5545], | memberOf | | | | Section | | | | | 3.2.11 | | | +---------------------+----------------+---------------------+------+ | PARTSTAT | [RFC5545], | participationStatus | | | | Section | | | | | 3.2.12 | | | +---------------------+----------------+---------------------+------+ | ROLE | [RFC5545], | roles | | | | Section | | | | | 3.2.16 | | | +---------------------+----------------+---------------------+------+ | RSVP | [RFC5545], | expectReply | | | | Section | | | | | 3.2.17 | | | +---------------------+----------------+---------------------+------+ | SCHEDULE-AGENT | [RFC6638], | scheduleAgent | | | | Section 7.1 | | | +---------------------+----------------+---------------------+------+ | SCHEDULE-FORCE-SEND | [RFC6638], | scheduleForceSend | | Stepanek Expires 20 September 2025 [Page 37] Internet-Draft JSCalendar March 2025 | | Section 7.2 | | | +---------------------+----------------+---------------------+------+ | SCHEDULE-STATUS | [RFC6638], | scheduleStatus | | | | Section 7.3 | | | +---------------------+----------------+---------------------+------+ Table 15: Parameters of the ATTENDEE property If no ROLE parameter is set, then the "attendee" role in the "roles" property MUST be set. Every calendar address value of the DELEGATED-FROM, DELEGATED-TO, or MEMBER parameters converts to the identifier of a Participant object. This identifier is determined by finding that Participant object in the "participants" property, which has a calendarAddress property value matching the parameter value. If no such Participant object exists after all properties and components have been converted, then a new Participant object having that calendarAddress property value is created. If multiple Participant objects match, then choosing the Participant identifier is implementation-specific. The PARTSTAT of an ATTENDEE property in a VTODO component converts not only to the "participationStatus" property of the Participant object, but also to its progress property if the PARTSTAT parameter value is specific for VTODO components: Stepanek Expires 20 September 2025 [Page 38] Internet-Draft JSCalendar March 2025 +=========+=============================+===================+=========+ |PARTSTAT |Reference |participationStatus|progress | +=========+=============================+===================+=========+ |NEEDS- |[RFC5545], Section 3.2.12 |needs-action | | |ACTION | | | | +---------+-----------------------------+-------------------+---------+ |ACCEPTED |[RFC5545], Section 3.2.12 |accepted | | +---------+-----------------------------+-------------------+---------+ |DECLINED |[RFC5545], Section 3.2.12 |declined | | +---------+-----------------------------+-------------------+---------+ |TENTATIVE|[RFC5545], Section 3.2.12 |tentative | | +---------+-----------------------------+-------------------+---------+ |DELEGATED|[RFC5545], Section 3.2.12 |delegated | | +---------+-----------------------------+-------------------+---------+ |COMPLETED|[RFC5545], Section 3.2.12 |accepted |completed| +---------+-----------------------------+-------------------+---------+ |IN- |[RFC5545], Section 3.2.12 |accepted |in- | |PROCESS | | |process | +---------+-----------------------------+-------------------+---------+ |FAILED |[I-D.ietf-calext-ical-tasks],|accepted |failed | | |Section 11.1 | | | +---------+-----------------------------+-------------------+---------+ Table 16: Converting the PARTSTAT parameter in a VTODO component to Participant properties The following examples illustrate how to convert the ATTENDEE property: ATTENDEE;RSVP=TRUE;PARTSTAT=TENTATIVE;CN=Henry Cabot:mailto:hcabot@example.com ORGANIZER:mailto:organizer@example.com Stepanek Expires 20 September 2025 [Page 39] Internet-Draft JSCalendar March 2025 "participants": { "p3": { "@type": "Participant", "calendarAddress": "mailto:hcabot@example.com", "name": "Henry Cabot", "participationStatus": "tentative", "roles": { "attendee": true }, "sendTo": { "imip": "mailto:hcabot@example.com" }, "expectReply": true }, "o4": { "@type": "Participant", "calendarAddress": "mailto:organizer@example.com", "roles": { "owner": true } } }, "replyTo": { "imip": "mailto:organizer@example.com" } Figure 20: Converting the ATTENDEE property BEGIN:PARTICIPANT CALENDAR-ADDRESS:mailto:foo@example.com DTSTAMP:20230723T125201Z ... END:PARTICIPANT ATTENDEE;RSVP=TRUE;PARTSTAT=TENTATIVE:mailto:foo@example.com ORGANIZER:mailto:bar@example.com Stepanek Expires 20 September 2025 [Page 40] Internet-Draft JSCalendar March 2025 "participants": { "23": { "@type": "Participant", "calendarAddress": "mailto:foo@example.com", "sendTo": { "imip": "mailto:foo@example.com" }, "participationStatus": "tentative", "scheduleUpdated": "2023-07-23T12:52:01Z", "expectReply": true, "...": "" }, "o4": { "calendarAddress": "mailto:bar@example.com", "...": "" } } Figure 21: Converting the ATTENDEE property and PARTICIPANT component BEGIN:VTODO ATTENDEE;RSVP=TRUE;PARTSTAT=COMPLETED:mailto:foo@example.com ORGANIZER:mailto:organizer@example.com ... "@type": "Task", "participants": { "1": { "@type": "Participant", "calendarAddress": "mailto:foo@example.com", "participationStatus": "accepted", "progress": "completed", "sendTo": { "imip": "mailto:foo@example.com" }, "expectReply": true, "...": "" }, "o": { "@type": "Participant", "calendarAddress": "mailto:organizer@example.com", "...": "" } }, "replyTo": { "imip": "mailto:organizer@example.com" } Stepanek Expires 20 September 2025 [Page 41] Internet-Draft JSCalendar March 2025 Figure 22: Converting the ATTENDEE property with a VTODO-specific participation status 2.3.5. CALENDAR-ADDRESS The CALENDAR-ADDRESS property [RFC9073] (Section 6.4) in a PARTICIPANT component converts to the "calendarAddress" property [I-D.ietf-jmap-calendars] (Section 5.1.1) of the Participant object. The following example illustrates how to convert the CALENDAR-ADDRESS property: BEGIN:PARTICIPANT CALENDAR-ADDRESS:mailto:foo@example.com ... "participants": { "a2": { "@type": "Participant", "calendarAddress": "mailto:foo@example.com", "...": "" } } Figure 23: Converting the CALENDAR-ADDRESS property 2.3.6. CATEGORIES The CATEGORIES property [RFC5545] (Section 3.8.1.2) in a VEVENT, VTODO, or VCALENDAR component converts to the "keywords" property [RFC8984] (Section 4.2.9) of the Event, Task, or Group object. The list of category values converts to a set of keywords. The values convert case-sensitively. All CATEGORIES properties in the same iCalendar component convert to the "keywords" property in the JSCalendar object. The following example illustrates how to convert the CATEGORIES property: CATEGORIES:APPOINTMENT,EDUCATION CATEGORIES:meeting "keywords": { "APPOINTMENT": true, "EDUCATION": true, "meeting": true } Figure 24: Converting the CATEGORIES property Stepanek Expires 20 September 2025 [Page 42] Internet-Draft JSCalendar March 2025 2.3.7. CLASS The CLASS property [RFC5545] (Section 3.8.1.3) in a VEVENT or VTODO component converts to the "privacy" property [RFC8984] (Section 4.4.3) of the Event or Task object. Its values convert as follows: +=================+==================+ | iCalendar value | JSCalendar value | +=================+==================+ | PUBLIC | public | +-----------------+------------------+ | PRIVATE | private | +-----------------+------------------+ | CONFIDENTIAL | secret | +-----------------+------------------+ Table 17: Values of the CLASS property Any other value does not convert to the "class" property. Instead, the property converts to the iCalComponent/properties property (Section 5.1.1) of the JSCalendar object. The following example illustrates how to convert the CLASS property: CLASS:PRIVATE "privacy": "private" Figure 25: Converting the CLASS property 2.3.8. COLOR The COLOR property [RFC7986] (Section 5.9) in a VEVENT, VTODO, or VCALENDAR component converts to the "color" property [RFC8984] (Section 4.2.11) of the Event, Task, or Group object. Its value converts verbatim. The following examples illustrate how to convert the COLOR property: COLOR:maroon "color": "maroon" Figure 26: Converting the COLOR property with color name COLOR:#ffa07a "color": "#ffa07a" Stepanek Expires 20 September 2025 [Page 43] Internet-Draft JSCalendar March 2025 Figure 27: Converting the COLOR property with numeric value 2.3.9. COMMENT The COMMENT property [RFC5545] (Section 3.8.1.4) in a DAYLIGHT or STANDARD component converts to the "comments" property [RFC8984] (Section 4.7.2) of the TimeZoneRule object. The COMMENT property [RFC5545] (Section 3.8.1.4) in a PARTICIPANT component converts to the "participationComment" property [RFC8984] (Section 4.4.6). The COMMENT property [RFC5545] (Section 3.8.1.4) in an iTIP-scheduled [RFC5546] VEVENT or VTODO component converts to the "participationComment" property [RFC8984] (Section 4.4.6) of that Participant object, which represents the source of this scheduling message, if any. It otherwise converts to the iCalComponent/ properties property (Section 5.1.1) of the Event or Task object. Multiple COMMENT properties in a DAYLIGHT or STANDARD component convert in any order to the multi-valued "comments" property. Converting multiple COMMENT properties to the single-valued participationComment property is implementation-specific. The following examples illustrate how to convert the COMMENT property: BEGIN:VCALENDAR BEGIN:VTIMEZONE TZID:NonIana BEGIN:DAYLIGHT TZOFFSETFROM:-0400 TZOFFSETTO:-0300 DTSTART:20010503T000000 COMMENT:take note of this COMMENT:and this END:DAYLIGHT END:VTIMEZONE ... Stepanek Expires 20 September 2025 [Page 44] Internet-Draft JSCalendar March 2025 { "@type": "Group", "timeZones": { "/NonIana": { "@type": "TimeZone", "daylight": [ { "@type": "TimeZoneRule", "comments": [ "take note of this", "and this" ], "...": "" } ], "...": "" } }, "...": "" } Figure 28: Converting the COMMENT property in a DAYLIGHT component BEGIN:PARTICIPANT UID:127ABD62-D07A-4F39-AA62-530E37A8DF78 COMMENT:I'll think about it ... "participants": { "g2": { "@type": "Participant", "participationComment": "I'll think about it", "...": "" } } Figure 29: Converting the COMMENT property in a PARTICIPANT component 2.3.10. CONCEPT The CONCEPT property [RFC9253] (Section 8.1) in a VEVENT, VTODO, or VCALENDAR component converts to the "categories" property [RFC8984] (Section 4.2.10) of the Event, Task, or Group object. The list of URI values converts to a set of URIs. Multiple occurrences of the CONCEPT property in the same iCalendar component convert to the same categories property in the JSCalendar object. Stepanek Expires 20 September 2025 [Page 45] Internet-Draft JSCalendar March 2025 The following example illustrates how to convert the CONCEPT property: CONCEPT:https://example.com/event-types/arts/music CONCEPT:https://example.com/event-types/arts/literature "categories": { "https://example.com/event-types/arts/music": true, "https://example.com/event-types/arts/literature": true } Figure 30: Converting the CONCEPT property 2.3.11. CONFERENCE The CONFERENCE property [RFC7986] (Section 5.11) in a VEVENT or VTODO component converts to a VirtualLocation object [RFC8984] (Section 4.2.6). The converted object is set in the "virtualLocations" property of the Event or Task object. The property value converts to the "uri" property of the VirtualLocation object. Its parameters convert as follows: +=========+========================+==========+======+ | Name | Reference | Property | Note | +=========+========================+==========+======+ | FEATURE | [RFC7986], Section 6.3 | features | | +---------+------------------------+----------+------+ | LABEL | [RFC7986], Section 6.4 | name | | +---------+------------------------+----------+------+ Table 18: Parameters of the CONFERENCE property The following example illustrates how to convert the CONFERENCE property: CONFERENCE;VALUE=URI;FEATURE=AUDIO,VIDEO; LABEL=Attendee dial-in:https://chat.example.com/audio?id=123456 Stepanek Expires 20 September 2025 [Page 46] Internet-Draft JSCalendar March 2025 "virtualLocations": { "b2": { "@type": "VirtualLocation", "name": "Attendee dial-in", "uri": "https://chat.example.com/audio?id=123456", "features": { "audio": true, "video": true } } } Figure 31: Converting the CONFERENCE property 2.3.12. CREATED The CREATED property [RFC5545] (Section 3.8.7.1) in a VEVENT, VTODO, or VCALENDAR component converts to the "created" property [RFC8984] (Section 4.1.5) of the Event, Task, or Group object. The following example illustrates how to convert the CREATED property: CREATED:20240329T133000Z "created": "2024-03-29T13:30:00Z" Figure 32: Converting the CREATED property 2.3.13. DESCRIPTION The DESCRIPTION property [RFC5545] (Section 3.8.1.5) in a VEVENT, VTODO, VCALENDAR, VLOCATION, or PARTICIPANT component converts to the "description" property [RFC8984] (Section 4.2.2) of the Event, Task, Group, Location, Link, or Participant object, unless its DERIVED parameter value is TRUE. If the DERIVED parameter value is TRUE, then the property does not convert to the "description" property. Instead, a non-derived STYLED-DESCRIPTION property is expected to contain the description. Implementations MAY preserve the property in the "iCalComponent" property (Section 5.1.1). The following example illustrates how to convert the DESCRIPTION property: DESCRIPTION:The pancakes there are delicious\; they are fluffy and sweet. "description": "The pancakes there are delicious; they are fluffy and sweet." Stepanek Expires 20 September 2025 [Page 47] Internet-Draft JSCalendar March 2025 Figure 33: Converting the DESCRIPTION property 2.3.14. DTEND The DTEND property [RFC5545] (Section 3.8.2.2) in a VEVENT component converts to the "duration" property [RFC8984] (Section 5.1.2) of the Event object. The duration is the timespan between the points in time of the DTSTART and DTEND property values when converted to UTC time. If the timezone identifier (Section 2.1.4) of the DTEND property differs from that of the DTSTART property, then the DTEND property also converts to a Location object. The timezone identifier converts to the "timeZone" property of the Location object. The relativeTo property of the Location is set to "end". The Location object is set in the "locations" property of the Event object. Implementations MAY preserve the fact that the duration got determined by the DTEND property. How to do this depends on the timezone identifiers of the DTSTART and DTEND properties. If the identifiers are equal, then implementations MUST set the "iCalComponent" property (Section 5.1.1) in the Event object and there add an entry for the path "duration" in the "convertedProperties" property. If instead the timezone identifiers are not equal, then implementations MUST set the "iCalProperty" property (Section 5.1.2) of the Location object. In both cases, the value MUST be an ICalProperty object with the "name" property set to "dtend". The following examples illustrate how to convert the DTEND property: DTSTART;TZID=Australia/Melbourne:20241002T130000 DTEND;TZID=Australia/Melbourne:20241002T140000 "start": "2024-10-02T13:00:00", "timeZone": "Australia/Melbourne", "duration": "PT1H", "iCalComponent": { "@type": "ICalComponent", "name": "vevent", "convertedProperties": { "duration": { "@type": "ICalProperty", "name": "dtend" } } } Stepanek Expires 20 September 2025 [Page 48] Internet-Draft JSCalendar March 2025 Figure 34: Converting the DTEND property with same timezone DTSTART;TZID=Europe/Berlin:20241017T130000 DTEND;TZID=Asia/Bangkok:20241018T040000 "start": "2024-10-17T13:00:00", "timeZone": "Europe/Berlin", "duration": "PT10H", "locations": { "l5": { "@type": "Location", "timeZone": "Asia/Bangkok", "relativeTo": "end", "iCalProperty": { "@type": "ICalProperty", "name": "dtend" } } } Figure 35: Converting the DTEND property with different timezone DTSTART;VALUE=DATE:20240102 DTEND;VALUE=DATE:20240107 "start": "2024-01-02T00:00:00", "timeZone": null, "duration": "P5D", "showWithoutTime": true Figure 36: Converting the DTEND property with DATE value type 2.3.15. DTSTAMP The DTSTAMP property [RFC5545] (Section 3.8.7.2) in a VEVENT or VTODO component converts to the "updated" property [RFC8984] (Section 4.1.6) of the Event or Task object. An Event or Task object which has the "method" property set might represent an iTIP reply of one of the participants in the object. In this case the value of the DTSTAMP property also converts to the "scheduleUpdated" property [RFC8984] (Section 4.4.6) of that Participant object, which represents the participant from which the iTIP reply originated. The DTSTAMP property in a PARTICIPANT component converts to the "scheduleUpdated" property [RFC8984] (Section 4.4.6) of the Participant object. Stepanek Expires 20 September 2025 [Page 49] Internet-Draft JSCalendar March 2025 The following examples illustrate how to convert the DTSTAMP property: BEGIN:VCALENDAR METHOD:REPLY BEGIN:VEVENT DTSTAMP:20240304T132000Z ... { "@type": "Group", "entries": [ { "@type": "Event", "method": "reply", "updated": "2024-03-04T13:20:00Z", "...": "" } ], "...": "" } Figure 37: Converting the DTSTAMP property in a VEVENT component BEGIN:VEVENT BEGIN:PARTICIPANT DTSTAMP:20240304T132000Z ... "participants": { "f4": { "@type": "Participant", "scheduleUpdated": "2024-03-04T13:20:00Z", "...": "" } } Figure 38: Converting the DTSTAMP property in a PARTICIPANT component 2.3.16. DTSTART The DTSTART property [RFC5545] (Section 3.8.2.4) in a VEVENT, VTODO, DAYLIGHT or STANDARD component converts to the "start" property [RFC8984] (Section 4.7.2) of the Event, Task, or TimeZoneRule object. See Section 2.1.5 how to convert DATE and DATE-TIME values. Stepanek Expires 20 September 2025 [Page 50] Internet-Draft JSCalendar March 2025 For VEVENT and VTODO components, the timezone identifier (Section 2.1.4) of the DTSTART property converts to the "timeZone" property of the Event or Task object. In addition, if the value type of the DTSTART property is DATE, then the value of the "showWithoutTime" property [RFC8984] (Section 4.2.4) is "true". The following examples illustrate how to convert the DTSTART property for the VEVENT and VTODO components. See Section 2.2.5 for examples how to convert the DTSTART property for the DAYLIGHT and STANDARD components. DTSTART;TZID=Europe/Berlin:20240921T105302 "start": "2024-09-21T10:53:02", "timeZone": "Europe/Berlin", "showWithoutTime": false Figure 39: Converting the DTSTART property with TZID parameter DTSTART:20240921T105302Z "start": "2024-09-21T10:53:02", "timeZone": "Etc/UTC", "showWithoutTime": false Figure 40: Converting the DTSTART property with UTC time DTSTART:20240921T105302 "start": "2024-09-21T10:53:02", "timeZone": null, "showWithoutTime": false Figure 41: Converting the DTSTART property with floating time DTSTART;VALUE=DATE:20240921 "start": "2024-09-21T00:00:00", "timeZone": null, "showWithoutTime": true Figure 42: Converting the DTSTART property with value type DATE 2.3.17. DUE The DUE property [RFC5545] (Section 3.8.2.3) in a VTODO component converts to the "due" property [RFC8984] (Section 5.2.1) of the Task object. See Section 2.1.5 how to convert DATE and DATE-TIME values. Stepanek Expires 20 September 2025 [Page 51] Internet-Draft JSCalendar March 2025 If the VTODO component does not contain a DTSTART property, then the timezone identifier (Section 2.1.4) of the DUE property converts to the "timeZone" property of the Task object. If instead the VTODO component contains both the DUE and DTSTART properties, then the timezone identifier of the DUE property does not convert to a standard JSCalendar element. The value of the "due" property MUST denote the date and time relative to the timezone of the DTSTART property. If the value type of the DUE property is DATE, then the value of the "showWithoutTime" property [RFC8984] (Section 4.2.4) is "true". The following examples illustrate how to convert the DUE property: BEGIN:VTODO DUE;TZID=Europe/Berlin:20240921T105302 "@type": "Task", "due": "2024-09-21T10:53:02", "timeZone": "Europe/Berlin", "showWithoutTime": false Figure 43: Converting the DUE property with TZID parameter BEGIN:VTODO DUE:20240921T105302Z "@type": "Task", "due": "2024-09-21T10:53:02", "timeZone": "Etc/UTC", "showWithoutTime": false Figure 44: Converting the DUE property with UTC time BEGIN:VTODO DUE:20240921T105302 "@type": "Task", "due": "2024-09-21T10:53:02", "timeZone": null, "showWithoutTime": false Figure 45: Converting the DUE property with floating time BEGIN:VTODO DUE;VALUE=DATE:20240921 "@type": "Task", "due": "2024-09-21T00:00:00", "timeZone": null, "showWithoutTime": true Stepanek Expires 20 September 2025 [Page 52] Internet-Draft JSCalendar March 2025 Figure 46: Converting the DUE property with value type DATE BEGIN:VTODO DTSTART;VALUE=DATE:20250220 DUE;VALUE=DATE:20250221 "@type": "Task", "start": "2025-02-20T00:00:00", "due": "2025-02-21T00:00:00", "showWithoutTime": true Figure 47: Converting the DUE property with value type DATE in combination with DTSTART 2.3.18. DURATION The DURATION property [RFC5545] (Section 3.8.2.5) in a VEVENT or VTODO component converts to the "duration" property [RFC8984] (Section 5.1.2) of the Event or Task object. The following example illustrates how to convert the DURATION property: DURATION:PT1H "duration": "PT1H" Figure 48: Converting the DURATION 2.3.19. ESTIMATED-DURATION The ESTIMATED-DURATION property [I-D.ietf-calext-ical-tasks] (Section 12.1) in a VTODO component converts to the "estimatedDuration" property [RFC8984] (Section 5.2.3) of the Task object. The following example illustrates how to convert the ESTIMATED- DURATION property: BEGIN:VTODO ESTIMATED-DURATION:P2D "@type": "Task", "estimatedDuration": "P2D" Figure 49: Converting the ESTIMATED-DURATION Stepanek Expires 20 September 2025 [Page 53] Internet-Draft JSCalendar March 2025 2.3.20. EXDATE The EXDATE property [RFC5545] (Section 3.8.5.1) in a VEVENT or VTODO component converts to a PatchObject value [RFC8984] (Section 1.4.9). The converted object is set in the "recurrenceOverrides" property of the Event or Task object. The property value converts to the key in the "recurrenceOverrides" property value. See Section 2.1.5 how to convert DATE and DATE-TIME values. The date-time MUST be relative to the timezone identified by the "timeZone" property of the Event or Task. The PatchObject value MUST set the "excluded" property to "true" and MUST NOT set any other property. The following example illustrates how to convert the EXDATE property: DTSTART:20230101T130000Z RRULE:FREQ=MONTHLY EXDATE:20230801T130000Z "start": "2023-01-01T13:00:00", "timeZone": "Etc/UTC", "recurrenceRules": [ { "@type": "RecurrenceRule", "frequency": "monthly" } ], "recurrenceOverrides": { "2023-08-01T13:00:00": { "excluded": true } } Figure 50: Converting the EXDATE property 2.3.21. EXRULE The EXRULE property [RFC2445] (Section 4.8.5.2) in a VEVENT or VTODO component converts to a RecurrenceRule object [RFC8984] (Section 4.3.3). The converted object is set in the "excludedRecurrenceRules" property of the Event or Task. See Section 2.3.38 for an example how to convert a recurrence rule. Stepanek Expires 20 September 2025 [Page 54] Internet-Draft JSCalendar March 2025 2.3.22. GEO The GEO property [RFC5545] (Section 3.8.1.6) in a VEVENT, VTODO, or PARTICIPANT component converts to a Location object [RFC8984] (Section 4.2.5). The converted object is set in the "locations" property of the Event, Task, or Participant object. The GEO property [RFC5545] (Section 3.8.1.6) in a VLOCATION component converts to the "coordinates" property [RFC8984] (Section 4.2.5) of the Location object. The pair of FLOAT values converts to a URI with the "geo" scheme [RFC5870]. The first FLOAT value converts to the "coord-a" part of the URI, the second FLOAT value to the "coord-b" part. A preceding plus sign (+) of the FLOAT value MUST be omitted, a preceding minus sign (-) MUST be preserved. The optional "coord-c" part of the URI MUST be omitted. The following examples illustrate how to convert the GEO property: GEO:+45.5;-93.3 "locations": { "d4": { "@type": "Location", "coordinates": "geo:45.5,-93.3" } } Figure 51: Converting the GEO property in a VEVENT BEGIN:VEVENT BEGIN:VLOCATION NAME:Eiffel Tower GEO:48.858222;2.2945 ... "locations": { "2": { "@type": "Location", "name": "Eiffel Tower", "coordinates": "geo:48.858222,2.2945" } } Figure 52: Converting the GEO property in a VLOCATION Stepanek Expires 20 September 2025 [Page 55] Internet-Draft JSCalendar March 2025 2.3.23. IMAGE The IMAGE property [RFC7986] (Section 5.10) in a VEVENT, VTODO, or VLOCATION component converts to a Link object [RFC8984] (Section 1.4.11). The converted object is set in the "links" property of the Event, Task, Location, or Participant object. The property value converts to the "href" property of the Link object. A value of type URI converts as-is. See Section 2.3.3 how to convert a BINARY value. If the DISPLAY parameter is set, then the "rel" property of the Link object MUST be set to "icon". Its parameters convert as follows: +=========+==========================+=============+=============+ | Name | Reference | Property | Note | +=========+==========================+=============+=============+ | DISPLAY | [RFC7986], Section 6.1 | display | | +---------+--------------------------+-------------+-------------+ | FMTTYPE | [RFC5545], Section 3.2.8 | contentType | | +---------+--------------------------+-------------+-------------+ | LINKREL | [RFC9253], Section 6.1 | rel | See remarks | | | | | below | +---------+--------------------------+-------------+-------------+ | SIZE | [RFC8607], Section 4.1 | size | | +---------+--------------------------+-------------+-------------+ Table 19: Parameters of the IMAGE property Remarks: * The LINKREL parameter value is defined to be either an URI or an "iana-token" [RFC5545] (Section 3.1). Only parameter values of form "iana-token" convert to the "rel" property of the Link object. Implementations MAY preserve the fact that the Link object got converted from an IMAGE property. To do so, they MUST set the iCalProperty (Section 5.1.2) on the Link object. The following example illustrates how to convert the IMAGE property: IMAGE;VALUE=URI;DISPLAY=BADGE;FMTTYPE=image/png: https://example.com/images/party.png Stepanek Expires 20 September 2025 [Page 56] Internet-Draft JSCalendar March 2025 "links": { "4": { "@type": "Link", "href": "https://example.com/images/party.png", "display": "badge", "rel": "icon", "contentType": "image/png", "iCalProperty": { "@type": "ICalProperty", "name": "image" } } } Figure 53: Converting the IMAGE property 2.3.24. LAST-MODIFIED The LAST-MODIFIED property [RFC5545] (Section 3.8.7.3) in a VCALENDAR or VTIMEZONE component converts to the "updated" property [RFC8984] (Section 4.1.6) of the Group or TimeZone object. The LAST-MODIFIED property [RFC5545] (Section 3.8.7.3) in a VEVENT or VTODO component does _not_ convert to the "updated" property [RFC8984] (Section 4.1.6) of the Event or Task object. Implementations MAY instead preserve the LAST-MODIFIED property in the "iCalComponent" property. The following example illustrates how to convert the LAST-MODIFIED property: BEGIN:VCALENDAR LAST-MODIFIED:20240914T231257Z ... "@type": "Group", "updated": "2024-09-14T23:12:57Z" Figure 54: Converting the IMAGE property 2.3.25. LOCATION The LOCATION property [RFC5545] (Section 3.8.1.7) in a VEVENT or VTODO component converts to a Location object [RFC8984] (Section 4.2.5), unless its DERIVED parameter value is TRUE. The converted object is set in the "locations" property of the Event or Task. Stepanek Expires 20 September 2025 [Page 57] Internet-Draft JSCalendar March 2025 The property value converts to the "title" property of the Location object. If the DERIVED parameter value is TRUE, then the property does not convert to a Location object. Instead, a VLOCATION component is expected to represent the location. Implementations MAY preserve the property in the "iCalComponent" property (Section 5.1.1). The following example illustrates how to convert the LOCATION property: LOCATION:Conference Room - F123\, Bldg. 002 "locations": { "f45": { "@type": "Location", "title": "Conference Room - F123, Bldg. 002" } } Figure 55: Converting the LOCATION property 2.3.26. LOCATION-TYPE The LOCATION-TYPE property [RFC9073] (Section 6.1) in a VLOCATION component converts to the "locationTypes" property [RFC8984] (Section 4.2.5) of the Location object. The list of location type values converts to a set of location types. The values convert case-sensitively. All LOCATION-TYPE properties in the same VLOCATION convert to the "locationTypes" property in the Location object. The following example illustrates how to convert the LOCATION-TYPE property: BEGIN:VEVENT BEGIN:VLOCATION LOCATION-TYPE:hotel,restaurant LOCATION-TYPE:bar ... Stepanek Expires 20 September 2025 [Page 58] Internet-Draft JSCalendar March 2025 "locations": { "1": { "@type": "Location", "locationTypes": { "bar": true, "hotel": true, "restaurant": true }, "...": "" } } Figure 56: Converting the LOCATION property 2.3.27. METHOD The METHOD property [RFC5545] (Section 3.7.2) in a VCALENDAR component converts to the "method" property [RFC8984] (Section 4.1.8) of all Event or Task objects that are listed in the Group object's entries property. The property value converts in lowercase. The following example illustrates how to convert the METHOD property: BEGIN:VCALENDAR METHOD:REQUEST BEGIN:VEVENT ... { "@type": "Group", "entries": [ { "@type": "Event", "method": "request", "...": "" } ], "...": "" } Figure 57: Converting the METHOD property 2.3.28. NAME The NAME property [RFC7986] (Section 5.1) in a VLOCATION component converts to the "name" property of the Location [RFC8984] (Section 4.2.5) or Participant [RFC8984] (Section 4.4.6) object. Stepanek Expires 20 September 2025 [Page 59] Internet-Draft JSCalendar March 2025 The NAME property [RFC7986] (Section 5.1) in a VCALENDAR component converts to the "title" property [RFC8984] (Section 4.2.1) of the Group object. The following examples illustrate how to convert the NAME property: BEGIN:VCALENDAR NAME:Company Vacation Days ... { "@type": "Group", "title": "Company Vacation Days", "...": "" } Figure 58: Converting the NAME property in a VCALENDAR component BEGIN:VEVENT BEGIN:VLOCATION NAME:Room B ... END:VLOCATION ... "locations": { "1": { "@type": "Location", "name": "Room B", "...": "" } } Figure 59: Converting the NAME property in the VLOCATION component 2.3.29. ORGANIZER The ORGANIZER property [RFC5545] (Section 3.8.4.3) in a VEVENT or VTODO component converts to the "replyTo" property [RFC8984] (Section 4.4.4) of the Event or Task object. In addition, it converts to a Participant object in the "participants" property [RFC8984] (Section 4.4.6). If the CAL-ADDRESS property value is in the "mailto" scheme, then it converts to the "imip" method in the "replyTo" property, otherwise it converts to the "other" method. The property value also converts to the "calendarAddress" property of the Participant object. The "owner" role is set in the "roles" property of the Participant. In contrast to the ATTENDEE property, the property value does not convert to the "sendTo" property of the Participant object. Stepanek Expires 20 September 2025 [Page 60] Internet-Draft JSCalendar March 2025 An ORGANIZER property, an ATTENDEE property, and a PARTICIPANT component in the same iCalendar component all convert to the same Participant object, if their converted calendarAddress property values are equal after URI normalization [RFC3986] (Section 6). How to deal with conflicting property values is implementation-specific. Implementations MAY preserve arbitrary parameters of the ORGANIZER property, in which case they MUST convert these to the "replyTo" entry in the "convertedProperties" property of the Event or Task object's "iCalComponent" property (Section 5.1.1). The ORGANIZER property parameters convert as follows: +======+==========================+==========+======+ | Name | Reference | Property | Note | +======+==========================+==========+======+ | CN | [RFC5545], Section 3.2.2 | name | | +------+--------------------------+----------+------+ | DIR | [RFC5545], Section 3.2.6 | links | | +------+--------------------------+----------+------+ Table 20: Parameters of the ORGANIZER property The following examples illustrate how to convert the ORGANIZER property: ORGANIZER:mailto:foo@example.com ATTENDEE;RSVP=TRUE;PARTSTAT=NEEDS-ACTION:mailto:bar@example.com Stepanek Expires 20 September 2025 [Page 61] Internet-Draft JSCalendar March 2025 "replyTo": { "imip": "mailto:foo@example.com" }, "participants": { "a": { "@type": "Participant", "calendarAddress": "mailto:foo@example.com", "roles": { "owner": true } }, "b": { "@type": "Participant", "calendarAddress": "mailto:bar@example.com", "expectReply": true, "sendTo": { "imip": "mailto:bar@example.com" }, "...": "" } } Figure 60: Converting an ORGANIZER property ORGANIZER:mailto:foo@example.com ATTENDEE;RSVP=FALSE;PARTSTAT=ACCEPTED;CN=Jane Doe:mailto:foo@example.com ... ATTENDEE;RSVP=TRUE;PARTSTAT=NEEDS-ACTION:mailto:bar@example.com Stepanek Expires 20 September 2025 [Page 62] Internet-Draft JSCalendar March 2025 "replyTo": { "imip": "mailto:foo@example.com" }, "participants": { "a": { "@type": "Participant", "calendarAddress": "mailto:foo@example.com", "name": "Jane Doe", "participationStatus": "accepted", "roles": { "attendee": true, "owner": true }, "expectReply": false, "sendTo": { "imip": "mailto:foo@example.com" } }, "b": { "@type": "Participant", "calendarAddress": "mailto:bar@example.com", "sendTo": { "imip": "mailto:bar@example.com" }, "expectReply": true, "...": "" } } Figure 61: Converting an ORGANIZER and ATTENDEE property 2.3.30. PARTICIPANT-TYPE The PARTICIPANT-TYPE property [RFC9073] (Section 6.2) in a PARTICIPANT component converts to the "roles" property [RFC8984] (Section 4.4.6) of the Participant object. The property value converts in lowercase. The following example illustrates how to convert the PARTICIPANT-TYPE property: Stepanek Expires 20 September 2025 [Page 63] Internet-Draft JSCalendar March 2025 BEGIN:PARTICIPANT PARTICIPANT-TYPE:CONTACT CALENDAR-ADDRESS:mailto:foo@example.com ... END:PARTICIPANT ATTENDEE;RSVP=YES;PARTSTAT=NEEDS-ACTION:mailto:foo@example.com ORGANIZER:mailto:bar@example.com "participants": { "a": { "@type": "Participant", "calendarAddress": "mailto:foo@example.com", "roles": { "attendee": true, "contact": true }, "sendTo": { "imip": "mailto:foo@example.com" }, "...": "" }, "b": { "@type": "Participant", "calendarAddress": "mailto:bar@example.com", "...": "" } } Figure 62: Converting the PARTICIPANT-TYPE property 2.3.31. PERCENT-COMPLETE The PERCENT-COMPLETE property [RFC5545] (Section 3.8.1.8) in a VTODO component converts to the "percentComplete" property [RFC8984] (Section 5.2.4) of the Task object. A Task object which has the "method" property set might represent an iTIP reply of one of the participants in the object. In this case the value of the "percentComplete" property in the Task also converts to the percentComplete [RFC8984] (Section 4.4.6) of that Participant object, which represents the participant from which the iTIP reply originated. The PERCENT-COMPLETE property in a PARTICIPANT component converts to the "percentComplete" property [RFC8984] (Section 4.4.6) of the Participant object. The following examples illustrate how to convert the PERCENT-COMPLETE property: Stepanek Expires 20 September 2025 [Page 64] Internet-Draft JSCalendar March 2025 BEGIN:VCALENDAR METHOD:REPLY BEGIN:VTODO PERCENT-COMPLETE:53 ... { "@type": "Group", "entries": [ { "@type": "Task", "method": "reply", "percentComplete": 53, "...": "" } ], "...": "" } Figure 63: Converting the PERCENT-COMPLETE property in a VEVENT component BEGIN:VTODO BEGIN:PARTICIPANT PERCENT-COMPLETE:78 ... "@type": "Task", "participants": { "f4": { "@type": "Participant", "percentComplete": 78, "...": "" } } Figure 64: Converting the PERCENT-COMPLETE property in a PARTICIPANT component 2.3.32. PRIORITY The PRIORITY property [RFC5545] (Section 3.8.1.9) in a VEVENT or VTODO component converts to the "priority" property [RFC8984] (Section 4.4.1) of the Event or Task object. The following example illustrates how to convert the PRIORITY property: PRIORITY:3 "priority": 3 Stepanek Expires 20 September 2025 [Page 65] Internet-Draft JSCalendar March 2025 Figure 65: Converting the PRIORITY property 2.3.33. PRODID The PRODID property [RFC5545] (Section 3.7.3) in a VCALENDAR component converts to the "prodId" property [RFC8984] (Section 4.1.4) of the Group object, and to the "prodId" property of all Event or Task objects that are listed in the Group object's entries property. The property value converts verbatim. The following example illustrates how to convert the PRODID property: BEGIN:VCALENDAR PRODID:-//BAZ//bam//EN BEGIN:VEVENT ... { "@type": "Group", "prodId": "-//BAZ//bam//EN", "entries": [ { "@type": "Event", "prodId": "-//BAZ//bam//EN", "...": "" } ], "...": "" } Figure 66: Converting the PRODID property 2.3.34. RDATE A RDATE property [RFC5545] (Section 3.8.5.2) of type DATE or DATE- TIME in a VEVENT, VTODO, DAYLIGHT or STANDARD component converts to a PatchObject value [RFC8984] (Section 1.4.9). The converted object is set in the "recurrenceOverrides" property of the Event, Task, or TimeZoneRule object. The property value converts to the key in the "recurrenceOverrides" property value. See Section 2.1.5 how to convert DATE and DATE-TIME values. For Event Task objects, the date-time MUST be relative to the timezone identified by the "timeZone" property, for TimeZoneRule objects the date-time is relative to the UTC offset specified in the "offsetFrom" property. The PatchObject value MUST be an empty JSON object. Stepanek Expires 20 September 2025 [Page 66] Internet-Draft JSCalendar March 2025 An RDATE property of value type PERIOD does not convert to a standard JSCalendar element. Implementations MAY convert it to the "iCalComponent" property (Section 5.1.1) of the Event, Task, or TimeZoneRule object. The following example illustrates how to convert the RDATE property: DTSTART:20230101T130000Z RRULE:FREQ=MONTHLY RDATE:20230805T170000Z "start": "2023-01-01T13:00:00", "timeZone": "Etc/UTC", "recurrenceRules": [ { "@type": "RecurrenceRule", "frequency": "monthly" } ], "recurrenceOverrides": { "2023-08-05T17:00:00": {} } Figure 67: Converting the RDATE property 2.3.35. RECURRENCE-ID The RECURRENCE-ID property [RFC5545] (Section 3.8.4.4) in a VEVENT or VTODO component converts to the "recurrenceId" property [RFC8984] (Section 4.3.1) of the Event or Task object. The timezone identifier (Section 2.1.4) of the RECURRENCE-ID property converts to the "recurrenceIdTimeZone" property. See Section 2.1.5 how to convert DATE and DATE-TIME values. The RANGE parameter [RFC5545] (Section 3.2.13) does not convert to a standard JSCalendar element. Implementations MAY preserve it in the iCalComponent (Section 5.1.1) property. See Section 2.1.2 for further requirements and examples. 2.3.36. RELATED-TO The RELATED-TO property [RFC5545] (Section 3.8.4.5) in a VEVENT, VTODO, or VALARM component converts to a Relation object [RFC8984] (Section 1.4.10). The converted object is set in the "relatedTo" property of the Event or Task object [RFC8984] (Section 4.1.3), or the Alert object [RFC8984] (Section 4.5.2). Stepanek Expires 20 September 2025 [Page 67] Internet-Draft JSCalendar March 2025 The property value in a VEVENT or VTODO converts as-is to the key of the Relation object in the "relatedTo" property. The property value in a VALARM converts to the same value as the key of that Alert object, which represents the VALARM component having that property value set in the UID property. Any RELTYPE parameters convert to the "relations" property in that Relation object. The parameter values convert in lowercase. The GAP parameter [RFC9253] (Section 6.2) does not convert to a standard JSCalendar element. Implementations MAY convert it to the "iCalProperty" property (Section 5.1.2) of the Relation object. The following examples illustrate how to convert the RELATED-TO property: BEGIN:VEVENT RELATED-TO;RELTYPE=PARENT:4E05861C-A0C9-46AC-9A66-760FC1E0E167 RELATED-TO:4120A9B1-1133-4AC0-9185-C4C8396048ED ... "relatedTo": { "4E05861C-A0C9-46AC-9A66-760FC1E0E167": { "@type": "Relation", "relation": { "parent": true } }, "4120A9B1-1133-4AC0-9185-C4C8396048ED": { "@type": "Relation" } } Figure 68: Converting the RELATED-TO property in a VEVENT Stepanek Expires 20 September 2025 [Page 68] Internet-Draft JSCalendar March 2025 BEGIN:VEVENT ... BEGIN:VALARM UID:8297C37D-BA2D-4476-91AE-C1EAA364F8E1 TRIGGER:-PT15M DESCRIPTION:Event reminder ACTION:DISPLAY ACKNOWLEDGED:20210302T151514Z END:VALARM ... BEGIN:VALARM UID:DE7B5C34-83FF-47FE-BE9E-FF41AE6DD097 TRIGGER;VALUE=DATE-TIME:20210302T152000Z RELATED-TO;RELTYPE=SNOOZE:8297C37D-BA2D-4476-91AE-C1EAA364F8E1 DESCRIPTION:Event reminder ACTION:DISPLAY END:VALARM ... "alerts": { "1": { "@type": "Alert", "trigger": { "@type": "OffsetTrigger", "offset": "-PT15M" }, "...": "" }, "2": { "@type": "Alert", "trigger": { "@type": "AbsoluteTrigger", "when": "2021-03-02T15:20:00Z" }, "relatedTo": { "1": { "@type": "Relation", "relation": { "snooze": true } } }, "...": "" } } Figure 69: Converting the RELATED-TO property in a VALARM Stepanek Expires 20 September 2025 [Page 69] Internet-Draft JSCalendar March 2025 2.3.37. REQUEST-STATUS The REQUEST-STATUS property [RFC5545] (Section 3.8.8.3) in a VEVENT or VTODO component converts to the "requestStatus" property [RFC8984] (Section 4.4.7) of the Event or Task object. The following example illustrates how to convert the REQUEST-STATUS property: 2.3.37.1. Example: Converting the REQUEST-STATUS property REQUEST-STATUS:2.0;Success "requestStatus": "2.0;Success" Figure 70: Converting the REQUEST-STATUS property 2.3.38. RRULE The RRULE property [RFC5545] (Section 3.8.5.3) in a VEVENT, VTODO, DAYLIGHT or STANDARD component converts to a RecurrenceRule object [RFC8984] (Section 4.3.3). The converted object is set in the "recurrenceRules" property of the Event, Task, or TimeZoneRule object. The RECUR value data type converts to a RecurrenceRule object as follows: Stepanek Expires 20 September 2025 [Page 70] Internet-Draft JSCalendar March 2025 +==================+=========================+ | RRULE field | RecurrenceRule property | +==================+=========================+ | FREQ | frequency | +------------------+-------------------------+ | UNTIL | until | +------------------+-------------------------+ | COUNT | count | +------------------+-------------------------+ | INTERVAL | interval | +------------------+-------------------------+ | BYSECOND | bySecond | +------------------+-------------------------+ | BYMINUTE | byMinute | +------------------+-------------------------+ | BYHOUR | byHour | +------------------+-------------------------+ | BYDAY | byDay | +------------------+-------------------------+ | BYMONTHDAY | byMonthDay | +------------------+-------------------------+ | BYYEARDAY | byYearDay | +------------------+-------------------------+ | BYWEEKNO | byWeekNo | +------------------+-------------------------+ | BYMONTH | byMonth | +------------------+-------------------------+ | BYSETPOS | bySetPosition | +------------------+-------------------------+ | WKST | firstDayOfWeek | +------------------+-------------------------+ | RSCALE [RFC7529] | rscale | +------------------+-------------------------+ | SKIP [RFC7529] | skip | +------------------+-------------------------+ Table 21: Converting the RECUR value type to a RecurrenceRule object The string values of the FREQ, WKST, RSCALE convert to lowercase. The UNTIL part in a VEVENT or VTODO converts to a LocalDateTime value relative to the timezone of the Event or Task, or to floating time for the TimeZoneRule object. The following example illustrates how to convert the RRULE property: Stepanek Expires 20 September 2025 [Page 71] Internet-Draft JSCalendar March 2025 DTSTART;TZID=Europe/Berlin:20240101T010000 RRULE:FREQ=YEARLY ;INTERVAL=2 ;BYMONTH=1 ;BYDAY=SU ;BYHOUR=8,9 ;BYMINUTE=30 ;UNTIL=20240930T120000Z "recurrenceRules": [ { "@type": "RecurrenceRule", "frequency": "yearly", "interval": 2, "byMonth": [ "1" ], "byDay": [ { "@type": "NDay", "day": "su" } ], "byHour": [ 8, 9 ], "byMinute": [ 30 ], "until": "2024-09-30T14:00:00" } ], "start": "2024-01-01T01:00:00", "timeZone": "Europe/Berlin" Figure 71: Example for converting the RRULE property 2.3.39. SEQUENCE The SEQUENCE property [RFC5545] (Section 3.8.7.4) in a VEVENT or VTODO component converts to the "sequence" property [RFC8984] (Section 4.1.7) of the Event or Task object. The SEQUENCE property in a PARTICIPANT component converts to the "scheduleSequence" property [RFC8984] (Section 4.4.6) of the Participant object. The following example illustrates how to convert the SEQUENCE property: Stepanek Expires 20 September 2025 [Page 72] Internet-Draft JSCalendar March 2025 SEQUENCE:3 "sequence": 3 Figure 72: Example for converting the SEQUENCE property 2.3.40. STATUS The STATUS property [RFC5545] (Section 3.8.1.11) in a VEVENT component converts to the "status" property [RFC8984] (Section 5.1.3) of the Event object. The STATUS property in a VTODO component converts to the "progress" property [RFC8984] (Section 5.2.5) of the Task object. The property value converts in lowercase. The following examples illustrate how to convert the STATUS property: STATUS:TENTATIVE "status": "tentative" Figure 73: Example for converting the STATUS property in a VEVENT component BEGIN:VTODO STATUS:IN-PROCESS ... { "@type": "Task", "progress": "in-process", "...": "" } Figure 74: Example for converting the STATUS property in a VTODO component 2.3.41. SOURCE The SOURCE property [RFC7986] (Section 5.8) in a VCALENDAR component converts to the "source" property [RFC8984] (Section 5.3.2) of the Group object. The following example illustrates how to convert the SOURCE property: BEGIN:VCALENDAR SOURCE;VALUE=URI:https://example.com/holidays.ics ... Stepanek Expires 20 September 2025 [Page 73] Internet-Draft JSCalendar March 2025 { "@type": "Group", "source": "https://example.com/holidays.ics", "...": "" } Figure 75: Example for converting the SOURCE property 2.3.42. STRUCTURED-DATA A STRUCTURED-DATA property [RFC9073] (Section 6.6) of type URI or BINARY in a VEVENT, VTODO, VCALENDAR, PARTICIPANT, or VLOCATION component converts to a Link object [RFC8984] (Section 1.4.11). The converted object is set in the "links" property of the Event, Task, Group, Participant, or Location object. The property value converts to the "href" property of the Link object. A value of type URI converts as-is. See Section 2.3.3 how to convert a BINARY value. Its parameters convert as follows: +=========+==========================+=============+======+ | Name | Reference | Property | Note | +=========+==========================+=============+======+ | FMTTYPE | [RFC5545], Section 3.2.8 | contentType | | +---------+--------------------------+-------------+------+ Table 22: Parameters of the STRUCTURED-DATA property Implementations MAY preserve the fact that the Link object got converted from a STRUCTURED-DATA property. To do so, they MUST set the iCalProperty (Section 5.1.2) on the Link object. The following example illustrates how to convert the STRUCTURED-DATA property: STRUCTURED-DATA;FMTTYPE=application/ld+json; SCHEMA="https://schema.org/FlightReservation"; ENCODING=BASE64;VALUE=BINARY:InRydW5jYXRlZC4uLiIK Stepanek Expires 20 September 2025 [Page 74] Internet-Draft JSCalendar March 2025 "links": { "l1": { "@type": "Link", "contentType": "application/ld+json", "href": "data:application/ld+json;base64,InRydW5jYXRlZC4uLiIK", "iCalProperty": { "@type": "ICalProperty", "name": "structured-data", "parameters": { "schema": "https://schema.org/FlightReservation" }, "valueType": "binary" } } } Figure 76: Converting the STRUCTURED-DATA property 2.3.43. STYLED-DESCRIPTION The STYLED-DESCRIPTION property [RFC9073] (Section 6.5) in a VEVENT or VTODO component converts to the "description" property [RFC8984] (Section 4.2.2) of the Event or Task object under the following conditions: * The property value type MUST be TEXT. * The FMTTYPE parameter either MUST NOT be set, or its value MUST be a media type [RFC6838] with top-level type "text". * Its DERIVED parameter value MUST NOT be TRUE. If the value is TRUE, then another property in the same component is expected to contain its description. If these conditions are not met, implementations MAY preserve the property in the "iCalComponent" property (Section 5.1.1). Its parameters convert as follows: +=========+===============+========================+======+ | Name | Reference | Property | Note | +=========+===============+========================+======+ | FMTTYPE | [RFC5545], | descriptionContentType | | | | Section 3.2.8 | | | +---------+---------------+------------------------+------+ Table 23: Parameters of the STYLED-DESCRIPTION property Stepanek Expires 20 September 2025 [Page 75] Internet-Draft JSCalendar March 2025 The following example illustrates how to convert the STYLED- DESCRIPTION property: STYLED-DESCRIPTION;VALUE=TEXT;FMTTYPE=text/html:
hello\,world "description": "hello,world", "descriptionContentType": "text/html" Figure 77: Converting the STYLED-DESCRIPTION property 2.3.44. SUMMARY The SUMMARY property [RFC5545] (Section 3.8.1.12) in a VEVENT or VTODO component converts to the "title" property [RFC8984] (Section 4.2.1) of the Event or Task object. The SUMMARY property [RFC5545] (Section 3.8.1.12) in a PARTICIPANT component converts to the "name" property [RFC8984] (Section 4.2.5). The following examples illustrate how to convert the SUMMARY property: SUMMARY:Birthday Party "title": "Birthday Party" Figure 78: Converting the SUMMARY property in a VEVENT BEGIN:VEVENT BEGIN:PARTICIPANT SUMMARY:John ... "participants": { "1": { "@type": "Participant", "name": "John", "...": "" } } Figure 79: Converting the SUMMARY property in a PARTICIPANT 2.3.45. TRANSP The TRANSP property [RFC5545] (Section 3.8.2.7) in a VEVENT or VTODO component converts to the "freeBusyStatus" property [RFC8984] (Section 4.4.2) of the Event or Task object. Its values convert as follows: Stepanek Expires 20 September 2025 [Page 76] Internet-Draft JSCalendar March 2025 +=================+==================+ | iCalendar value | JSCalendar value | +=================+==================+ | OPAQUE | busy | +-----------------+------------------+ | TRANSPARENT | free | +-----------------+------------------+ Table 24: Values of the TRANSP property The following example illustrates how to convert the TRANSP property: TRANSP:TRANSPARENT "freeBusyStatus": "free" Figure 80: Converting the TRANSP property 2.3.46. TRIGGER The TRIGGER property [RFC5545] (Section 3.8.6.3) in a VALARM component converts to either an AbsoluteTrigger or OffsetTrigger object. The converted object is set in the "trigger" property [RFC8984] (Section 4.5.2) of the Alert object. A property of value type DURATION converts an OffsetTrigger object. The property value converts to its offset property. A value of type DATE-TIME converts to an AbsoluteTrigger object. The property value converts to its when property. Its parameters convert as follows: +=========+===========================+============+================+ | Name | Reference | Property | Note | +=========+===========================+============+================+ | RELATED | [RFC5545], | relativeTo | If | | | Section 3.2.14 | | VALUE=DURATION | +---------+---------------------------+------------+----------------+ Table 25: Parameters of the TRIGGER property The following examples illustrate how to convert the TRIGGER property: Stepanek Expires 20 September 2025 [Page 77] Internet-Draft JSCalendar March 2025 BEGIN:VEVENT ... BEGIN:VALARM TRIGGER;RELATED=END:PT5M ... "alerts": { "2d": { "@type": "Alert", "trigger": { "@type": "OffsetTrigger", "offset": "PT5M", "relativeTo": "end" }, "...": "" } } Figure 81: Converting the TRIGGER property to an OffsetTrigger BEGIN:VEVENT ... BEGIN:VALARM TRIGGER;VALUE=DATE-TIME:20250302T010203Z ... "alerts": { "14": { "@type": "Alert", "trigger": { "@type": "AbsoluteTrigger", "when": "2025-03-02T01:02:03Z" }, "...": "" } } Figure 82: Converting the TRIGGER property to an AbsoluteTrigger 2.3.47. TZID The TZID property [RFC5545] (Section 3.8.3.1) in a VTIMEZONE component converts to the "tzId" property [RFC8984] (Section 4.7.2) of the TimeZone object. See Figure 13 for an example. Stepanek Expires 20 September 2025 [Page 78] Internet-Draft JSCalendar March 2025 2.3.48. TZID-ALIAS-OF The TZID-ALIAS-OF property [RFC7808] (Section 7.2) in a VTIMEZONE component converts to an entry in the "aliases" property [RFC8984] (Section 4.7.2) of the TimeZone object. See Figure 13 for an example. 2.3.49. TZNAME The TZNAME property [RFC5545] (Section 3.8.3.2) in a DAYLIGHT or STANDARD component converts to an entry in the "names" property [RFC8984] (Section 4.7.2) of the TimeZoneRule object. See Figure 13 for an example. 2.3.50. TZOFFSETFROM The TZOFFSETFROM property [RFC5545] (Section 3.8.3.3) in a DAYLIGHT or STANDARD component converts to the "offsetFrom" property [RFC8984] (Section 4.7.2) of the TimeZoneRule object. See Figure 13 for an example. 2.3.51. TZOFFSETTO The TZOFFSETTO property [RFC5545] (Section 3.8.3.4) in a DAYLIGHT or STANDARD component converts to the "offsetTo" property [RFC8984] (Section 4.7.2) of the TimeZoneRule object. See Figure 13 for an example. 2.3.52. TZUNTIL The TZUNTIL property [RFC7808] (Section 7.1) in a VTIMEZONE component converts to the "validUntil" property [RFC8984] (Section 4.7.2) of the TimeZone object. See Section 2.1.5 how to convert DATE and DATE-TIME values. See Figure 13 for an example. 2.3.53. TZURL The TZURL property [RFC5545] (Section 3.8.3.5) in a VTIMEZONE component converts to the "url" property [RFC8984] (Section 4.7.2) of the TimeZone object. Stepanek Expires 20 September 2025 [Page 79] Internet-Draft JSCalendar March 2025 See Figure 13 for an example. 2.3.54. UID The UID property [RFC5545] (Section 3.8.4.7) in a VEVENT, VTODO, or VCALENDAR component converts to the "uid" property [RFC8984] (Section 4.1.2) of the Event, Task, or Group object. The following example illustrates how to convert the UID property: UID:5ACEA86F-40CF-47EE-9CCA-7C85588A589F "uid": "5ACEA86F-40CF-47EE-9CCA-7C85588A589F" Figure 83: Converting the UID property 2.3.55. URL The URL property [RFC5545] (Section 3.8.4.6) in a VEVENT, VTODO, VCALENDAR, or PARTICIPANT component converts to a Link object [RFC8984] (Section 1.4.11). The converted object is set in the "links" property of the Event, Task, Group, or Participant object. The property value converts to the "href" property of the Link object. Implementations MAY preserve the fact that the Link object got converted from a URL property. To do so, they MUST set the iCalProperty (Section 5.1.2) on the Link object. The following example illustrates how to convert the URL property: URL:https://example.com/calendar/birthdays.ics "links": { "3": { "@type": "Link", "href": "https://example.com/calendar/birthdays.ics", "iCalProperty": { "@type": "ICalProperty", "name": "url" } } } Figure 84: Converting the IMAGE property Stepanek Expires 20 September 2025 [Page 80] Internet-Draft JSCalendar March 2025 3. Converting JSCalendar to iCalendar 3.1. Alert The Alert object [RFC8984] (Section 4.5.2) converts to a VALARM component (Section 2.2.2). Its properties convert as follows: +==============+===============+==============+===================+ | Name | Reference | Property (or | See | | | | other) | | +==============+===============+==============+===================+ | acknowledged | [RFC8984], | ACKNOWLEDGED | Section 2.3.1 | | | Section 4.5.2 | | | +--------------+---------------+--------------+-------------------+ | action | [RFC8984], | ACTION | Section 2.3.2 | | | Section 4.5.2 | | | +--------------+---------------+--------------+-------------------+ | relatedTo | [RFC8984], | RELATED-TO | Section 2.3.36, | | | Section 4.1.3 | | and remarks below | +--------------+---------------+--------------+-------------------+ | trigger | [RFC8984], | TRIGGER | Section 2.3.46 | | | Section 4.5.2 | | | +--------------+---------------+--------------+-------------------+ Table 26: Properties of the Alert object Remarks: * The value of the RELATED-TO property is the UID property value of that VALARM component, to which the related Alert object converts to. Consequently, the UID property for such a VALARM MUST be set, otherwise the UID property MAY be set. Other properties MAY be converted to JSPROP properties (Section 4.1.2) in the VALARM component. 3.2. Event and Task The Event object [RFC8984] (Section 2.1) converts to a VEVENT component (Section 2.2.3), the Task object [RFC8984] (Section 2.2) converts to a VTODO component (Section 2.2.6). The following table defines how to convert properties that are common to both the Event and Task object types. Table 28 and Table 29 later in this section define how to convert properties specific to either Event or Task objects. Stepanek Expires 20 September 2025 [Page 81] Internet-Draft JSCalendar March 2025 +=======================+==========+============+===================+ |Name |Reference |Property (or|See | | | |other) | | +=======================+==========+============+===================+ |alerts |[RFC8984],|VALARM |Alert object | | |Section |(component) |(Section 3.1) | | |4.5.2 | | | +-----------------------+----------+------------+-------------------+ |categories |[RFC8984],|CONCEPT |Section 2.3.10 | | |Section | | | | |4.2.10 | | | +-----------------------+----------+------------+-------------------+ |color |[RFC8984],|COLOR |Section 2.3.8 | | |Section | | | | |4.2.11 | | | +-----------------------+----------+------------+-------------------+ |created |[RFC8984],|CREATED |Section 2.3.12 | | |Section | | | | |4.1.5 | | | +-----------------------+----------+------------+-------------------+ |description |[RFC8984],|DESCRIPTION,|Section 2.3.13, | | |Section |or STYLED- |Section 2.3.43, and| | |4.2.2 |DESCRIPTION |remarks below | +-----------------------+----------+------------+-------------------+ |descriptionContentType |[RFC8984],|FMTTYPE |Section 2.3.43, and| | |Section |(parameter) |remarks below | | |4.2.3 |of STYLED- | | | | |DESCRIPTION | | +-----------------------+----------+------------+-------------------+ |excluded |[RFC8984],| |Section 2.3.20, and| | |Section | |remarks about | | |4.3.6 | |recurrenceOverrides| | | | |below | +-----------------------+----------+------------+-------------------+ |excludedRecurrenceRules|[RFC8984],|EXRULE |Section 2.3.21 | | |Section | | | | |4.3.4 | | | +-----------------------+----------+------------+-------------------+ |freeBusyStatus |[RFC8984],|TRANSP |Section 2.3.45 | | |Section | | | | |4.4.2 | | | +-----------------------+----------+------------+-------------------+ |keywords |[RFC8984],|CATEGORIES |Section 2.3.6 | | |Section | | | | |4.2.9 | | | +-----------------------+----------+------------+-------------------+ |links |[RFC8984],|ATTACH, or |Link object | | |Section |other |(Section 3.4) | Stepanek Expires 20 September 2025 [Page 82] Internet-Draft JSCalendar March 2025 | |4.2.7 | | | +-----------------------+----------+------------+-------------------+ |locations |[RFC8984],|LOCATION, |Location object | | |Section |GEO, or |(Section 3.5) | | |4.2.5 |VLOCATION | | | | |(component) | | +-----------------------+----------+------------+-------------------+ |method |[RFC8984],|METHOD of |Section 2.3.27, and| | |Section |iCalendar |Group object | | |4.1.8 |object |(Section 3.3) | +-----------------------+----------+------------+-------------------+ |participants |[RFC8984],|ATTENDEE, or|Participant object | | |Section |PARTICIPANT |(Section 3.6) | | |4.4.6 |(component) | | +-----------------------+----------+------------+-------------------+ |priority |[RFC8984],|PRIORITY |Section 2.3.32 | | |Section | | | | |4.4.1 | | | +-----------------------+----------+------------+-------------------+ |privacy |[RFC8984],|CLASS |Section 2.3.7 | | |Section | | | | |4.4.3 | | | +-----------------------+----------+------------+-------------------+ |prodId |[RFC8984],|PRODID of |Section 2.3.33, and| | |Section |iCalendar |Group object | | |4.1.4 |object |(Section 3.3) | +-----------------------+----------+------------+-------------------+ |recurrenceId |[RFC8984],|RECURRENCE- |Section 2.3.35 | | |Section |ID | | | |4.3.1 | | | +-----------------------+----------+------------+-------------------+ |recurrenceIdTimeZone |[RFC8984],|TZID |Section 2.3.35 | | |Section |(parameter) | | | |4.3.2 |of | | | | |RECURRENCE- | | | | |ID | | +-----------------------+----------+------------+-------------------+ |recurrenceOverrides |[RFC8984],|RDATE, |Section 2.1.2, and | | |Section |EXDATE or |remarks below | | |4.3.5 |recurrence | | | | |override | | | | |component | | +-----------------------+----------+------------+-------------------+ |recurrenceRules |[RFC8984],|RRULE |Section 2.3.38 | | |Section | | | | |4.3.3 | | | +-----------------------+----------+------------+-------------------+ |relatedTo |[RFC8984],|RELATED-TO |Section 2.3.36 | Stepanek Expires 20 September 2025 [Page 83] Internet-Draft JSCalendar March 2025 | |Section | | | | |4.1.3 | | | +-----------------------+----------+------------+-------------------+ |replyTo |[RFC8984],|ORGANIZER, |Section 2.3.29, | | |Section |or JSPROP |Section 4.1.2, and | | |4.4.4 | |remarks below | +-----------------------+----------+------------+-------------------+ |requestStatus |[RFC8984],|REQUEST- |Section 2.3.37 | | |Section |STATUS | | | |4.4.7 | | | +-----------------------+----------+------------+-------------------+ |sequence |[RFC8984],|SEQUENCE |Section 2.3.39 | | |Section | | | | |4.1.7 | | | +-----------------------+----------+------------+-------------------+ |start |[RFC8984],|DTSTART |Section 2.3.16 | | |Section | | | | |4.7.2 | | | +-----------------------+----------+------------+-------------------+ |timeZone |[RFC8984],|TZID |Section 2.3.16, | | |Section |(parameter) |Section 2.3.17 | | |4.7.1 |of DTSTART | | | | |and DUE | | +-----------------------+----------+------------+-------------------+ |timeZones |[RFC8984],|VTIMEZONE |TimeZone object | | |Section |(component) |(Section 3.7) | | |4.7.2 |of iCalendar| | | | |object | | +-----------------------+----------+------------+-------------------+ |title |[RFC8984],|SUMMARY |Section 2.3.44 | | |Section | | | | |4.2.1 | | | +-----------------------+----------+------------+-------------------+ |uid |[RFC8984],|UID |Section 2.3.54 | | |Section | | | | |4.1.2 | | | +-----------------------+----------+------------+-------------------+ |updated |[RFC8984],|DTSTAMP, and|Section 2.3.15, | | |Section |LAST- |Section 2.3.24 | | |4.1.6 |MODIFIED | | +-----------------------+----------+------------+-------------------+ |virtualLocations |[RFC8984],|CONFERENCE |Section 2.3.11 | | |Section | | | | |4.2.6 | | | +-----------------------+----------+------------+-------------------+ Table 27: Properties of the Event and Task object Stepanek Expires 20 September 2025 [Page 84] Internet-Draft JSCalendar March 2025 Remarks: * The descriptionContentType property value determines if the "description" property converts to the DESCRIPTION or STYLED- DESCRIPTION property. A description of content type "text/plain" converts to the DESCRIPTION property. Any other description converts to the STYLED-DESCRIPTION property, in which case a plain text version of the rich-text description MAY be set additionally in the DESCRIPTION property, having its DERIVED parameter set to "TRUE". How to derive plain text from rich-text is implementation-specific. * The entries in the "recurrenceOverrides" property convert depending on the contents of the PatchObject value. A PatchObject that sets the "excluded" property to "true" converts to an EXDATE property for the date-time of that recurrence instance. An empty PatchObject converts to an RDATE property. Any other PatchObject converts to a recurrence override component in the embedding VCALENDAR component. * The replyTo property converts to the ORGANIZER or the JSPROP (Section 4.1.2) property, or both. The "web" scheduling method never converts to the ORGANIZER property. Any other scheduling methods in the replyTo property convert to the ORGANIZER property value as follows: - If there is only a single scheduling method, then convert its URI value. - If there are multiple scheduling methods and one of their URI values match a Participant object's calendarAddress property value, use that URI. - Otherwise, choose the URI of any scheduling method. The "imip" scheduling method typically is a good choice. Implementations MAY convert any scheduling methods that did not convert to the ORGANIZER property to the JSPROP property instead. Each scheduling method converts to a separate JSPROP property. Implementations that want to preserve the the scheduling method name of the URI that converted to the ORGANIZER property, MAY convert that scheduling method to both the ORGANIZER and tis JSPROP property. Typically, this is not necessary, e.g. a URI in the "mailto" scheme implies the "imip" scheduling method. Properties specific to the Event object type convert to iCalendar properties as follows: Stepanek Expires 20 September 2025 [Page 85] Internet-Draft JSCalendar March 2025 +==========+===============+=====================+=================+ | Name | Reference | Property (or other) | See | +==========+===============+=====================+=================+ | duration | [RFC8984], | DURATION, or DTEND | Section 2.3.18, | | | Section 5.1.2 | | Section 2.3.14 | +----------+---------------+---------------------+-----------------+ | status | [RFC8984], | STATUS | Section 2.3.40 | | | Section 5.1.3 | | | +----------+---------------+---------------------+-----------------+ Table 28: Properties of the Event object Properties specific to the Task object type convert to iCalendar properties as follows: +===================+===============+=====================+=========+ | Name | Reference | Property (or | See | | | | other) | | +===================+===============+=====================+=========+ | due | [RFC8984], | DUE | Section | | | Section 5.2.1 | | 2.3.17 | +-------------------+---------------+---------------------+---------+ | estimatedDuration | [RFC8984], | ESTIMATED-DURATION | Section | | | Section 5.2.3 | | 2.3.19 | +-------------------+---------------+---------------------+---------+ | percentComplete | [RFC8984], | PERCENT-COMPLETE | Section | | | Section 5.2.4 | | 2.3.31 | +-------------------+---------------+---------------------+---------+ | progress | [RFC8984], | STATUS | Section | | | Section 5.2.5 | | 2.3.40 | +-------------------+---------------+---------------------+---------+ Table 29: Properties of the Task object Other properties MAY be converted to JSPROP properties (Section 4.1.2) in the VEVENT or VTODO component. 3.3. Group The Group object [RFC8984] (Section 2.3) converts to a VCALENDAR component (Section 2.1.1). Its properties convert as follows: +============+============+===============+=======================+ | Name | Reference | Property (or | See | | | | other) | | +============+============+===============+=======================+ | categories | [RFC8984], | CONCEPT | Section 2.3.10 | | | Section | | | Stepanek Expires 20 September 2025 [Page 86] Internet-Draft JSCalendar March 2025 | | 4.2.10 | | | +------------+------------+---------------+-----------------------+ | color | [RFC8984], | COLOR | Section 2.3.8 | | | Section | | | | | 4.2.11 | | | +------------+------------+---------------+-----------------------+ | created | [RFC8984], | CREATED | Section 2.3.12 | | | Section | | | | | 4.1.5 | | | +------------+------------+---------------+-----------------------+ | entries | [RFC8984], | VEVENT or | Event and Task object | | | Section | VTODO | (Section 3.2), and | | | 5.3.1 | (component) | remarks below | +------------+------------+---------------+-----------------------+ | keywords | [RFC8984], | CATEGORIES | Section 2.3.6 | | | Section | | | | | 4.2.9 | | | +------------+------------+---------------+-----------------------+ | links | [RFC8984], | ATTACH, or | Link object | | | Section | other | (Section 3.4) | | | 4.2.7 | | | +------------+------------+---------------+-----------------------+ | prodId | [RFC8984], | PRODID | Section 2.3.33, and | | | Section | | remarks below | | | 4.1.4 | | | +------------+------------+---------------+-----------------------+ | source | [RFC8984], | SOURCE | Section 2.3.41 | | | Section | | | | | 5.3.2 | | | +------------+------------+---------------+-----------------------+ | title | [RFC8984], | NAME | Section 2.3.28 | | | Section | | | | | 4.2.1 | | | +------------+------------+---------------+-----------------------+ | uid | [RFC8984], | UID | Section 2.3.54 | | | Section | | | | | 4.1.2 | | | +------------+------------+---------------+-----------------------+ | updated | [RFC8984], | LAST-MODIFIED | Section 2.3.24 | | | Section | | | | | 4.1.6 | | | +------------+------------+---------------+-----------------------+ Table 30: Properties of the Group object Remarks: Stepanek Expires 20 September 2025 [Page 87] Internet-Draft JSCalendar March 2025 * The prodId property value of the Group object is expected to be equal to the "prodId" property value of all the Group entries. They all convert to the same, single PRODID property in the VCALENDAR component. How to convert unequal prodId property values is implementation-specific. * The method property value in all the Group entries is expected to be equal. How to convert entries with unequal method property values is implementation-specific. Other properties MAY be converted to JSPROP properties (Section 4.1.2) in the VCALENDAR component. 3.4. Link The Link object [RFC8984] (Section 1.4.11) converts either an ATTACH property (Section 2.3.3), an IMAGE property (Section 2.3.23), a STRUCTURED-DATA property (Section 2.3.42), or an URL property (Section 2.3.55). Which iCalendar property to choose is implementation-specific. As a guideline: * Choose the iCalendar property name indicated in the Link object's iCalProperty (Section 5.1.2) property, if set. * Choose IMAGE, if the "display" property is set or the "rel" property value is "icon". * Choose URL, if only the "href" property is set and its value links to a dynamic rendition of the calendar object. * Choose ATTACH otherwise. The href property converts to the "iCalendar" property value. The other Link properties convert as follows: Stepanek Expires 20 September 2025 [Page 88] Internet-Draft JSCalendar March 2025 +=============+================+============+================+ | Name | Reference | Parameter | See | | | | (or other) | | +=============+================+============+================+ | contentType | [RFC8984], | FMTTYPE | Section 2.3.3 | | | Section 1.4.11 | | | +-------------+----------------+------------+----------------+ | display | [RFC8984], | DISPLAY | Section 2.3.23 | | | Section 1.4.11 | | | +-------------+----------------+------------+----------------+ | rel | [RFC8984], | LINKREL | Section 6.1 of | | | Section 1.4.11 | | [RFC9253], and | | | | | remarks below | +-------------+----------------+------------+----------------+ | size | [RFC8984], | SIZE | Section 2.3.3 | | | Section 1.4.11 | | | +-------------+----------------+------------+----------------+ Table 31: Properties of the Link object Remarks: * The LINKREL parameter MUST be omitted if the Link object converts to an IMAGE property and the "rel" property value is "icon". Other properties MAY be converted to JSPROP properties (Section 4.1.2) in the same component to which the Link object converts to as a property. 3.5. Location The Location object [RFC8984] (Section 4.2.5) converts to either a LOCATION (Section 2.3.25), GEO (Section 2.3.22), or DTEND (Section 2.3.22) property, or it converts to a VLOCATION component (Section 2.2.4). Which iCalendar element to choose is implementation-specific. As a guideline: * Choose LOCATION, if only the "title" property is set and the iCalendar component does not already contain a LOCATION property. The title property converts to the LOCATION property value. * Choose GEO, if only the "coordinates" property is set, the "geo-path" [RFC5870] (Section 3.3) of its URI value only contains "coord-a" (latitude) and "coord-b" (longitude), and the iCalendar component does not already contain a GEO property. The coordinates property converts to the GEO property value. Stepanek Expires 20 September 2025 [Page 89] Internet-Draft JSCalendar March 2025 * Choose DTEND, if the embedding object is an Event, only the timeZone and the relativeTo properties are set, the "relativeTo" property value is "end" and the iCalendar component does not already contain a DTEND property. The timeZone property converts to the TZID parameter of the DTEND property. The duration of the embedding Event object determines the DTEND property value. * Choose the VLOCATION component otherwise. Implementations MAY convert one of the Location objects that convert to a VLOCATION also to the LOCATION property; converting the title or description property to the LOCATION property value is a reasonable choice. The DERIVED parameter MUST be set on the LOCATION property. The properties convert to a VLOCATION component as follows: +===============+===============+===============+===================+ | Name | Reference | Property (or | See | | | | other) | | +===============+===============+===============+===================+ | coordinates | [RFC8984], | GEO | Section | | | Section 4.2.5 | | 2.3.22, and | | | | | remarks below | +---------------+---------------+---------------+-------------------+ | description | [RFC8984], | DESCRIPTION | Section | | | Section 4.2.2 | | 2.3.13 | +---------------+---------------+---------------+-------------------+ | links | [RFC8984], | ATTACH, or | Link object | | | Section 4.2.7 | other | (Section 3.4) | +---------------+---------------+---------------+-------------------+ | locationTypes | [RFC8984], | LOCATION-TYPE | Section | | | Section 4.2.5 | | 2.3.26 | +---------------+---------------+---------------+-------------------+ | name | [RFC8984], | NAME | Section | | | Section 4.2.5 | | 2.3.28 | +---------------+---------------+---------------+-------------------+ Table 32: Properties of the Location object Remarks: * The "coordinates" property converts to the GEO property if the "geo-path" [RFC5870] (Section 3.3) of its URI value only contains "coord-a" (latitude) and "coord-b" (longitude). Otherwise implementations MAY convert it to the JSPROP property (Section 4.1.2). Stepanek Expires 20 September 2025 [Page 90] Internet-Draft JSCalendar March 2025 Other properties MAY be converted to JSPROP properties (Section 4.1.2) in the VLOCATION component, or the component which the Location converts to as a property. 3.6. Participant The Participant object [RFC8984] (Section 4.4.6) converts to both an ATTENDEE property (Section 2.3.4) and a PARTICIPANT component (Section 2.2.1): * It converts to an ATTENDEE property if the sendTo [RFC8984] (Section 4.4.6) property is set. The calendarAddress property converts to the ATTENDEE property value, if set; otherwise one of the scheduling methods in the "sendTo" property converts to the ATTENDEE property value. Typically, the "imip" scheduling method is a good choice. * It converts to a PARTICIPANT component if any of the Participant properties in Table 34 are set. If the Participant object also converts to an ATTENDEE property, then the CALENDAR-ADDRESS property value of the PARTICIPANT component MUST match the ATTENDEE property value. Implementations MAY convert any scheduling methods in the sendTo property that did not convert to the ATTENDEE property to the JSPROP property instead. Each scheduling method converts to a separate JSPROP property. Implementations that want to preserve the the scheduling method name of the URI that converted to the ATTENDEE property, MAY convert that scheduling method to both the ATTENDEE and the JSPROP property. Typically, this is not necessary, e.g. a URI in the "mailto" scheme implies the "imip" scheduling method. The following Participant properties convert to the ATTENDEE property. How to convert these properties if the Participant does not convert to an ATTENDEE is implementation-specific. +=====================+============+=====================+=========+ | Name | Reference | Parameter (or | See | | | | other) | | +=====================+============+=====================+=========+ | delegatedFrom | [RFC8984], | DELEGATED-FROM | Section | | | Section | | 2.3.4 | | | 4.4.6 | | | +---------------------+------------+---------------------+---------+ | delegatedTo | [RFC8984], | DELEGATED-TO | Section | | | Section | | 2.3.4 | | | 4.4.6 | | | +---------------------+------------+---------------------+---------+ Stepanek Expires 20 September 2025 [Page 91] Internet-Draft JSCalendar March 2025 | email | [RFC8984], | EMAIL | Section | | | Section | | 2.3.4 | | | 4.4.6 | | | +---------------------+------------+---------------------+---------+ | expectReply | [RFC8984], | RSVP | Section | | | Section | | 2.3.4 | | | 4.4.6 | | | +---------------------+------------+---------------------+---------+ | kind | [RFC8984], | CUTYPE | Section | | | Section | | 2.3.4 | | | 4.4.6 | | | +---------------------+------------+---------------------+---------+ | memberOf | [RFC8984], | MEMBER | Section | | | Section | | 2.3.4 | | | 4.4.6 | | | +---------------------+------------+---------------------+---------+ | name | [RFC8984], | CN | Section | | | Section | | 2.3.4 | | | 4.2.5 | | | +---------------------+------------+---------------------+---------+ | participationStatus | [RFC8984], | PARTSTAT | Section | | | Section | | 2.3.4 | | | 4.4.6 | | | +---------------------+------------+---------------------+---------+ | progress | [RFC8984], | PARTSTAT | Section | | | Section | | 2.3.4, | | | 5.2.5 | | and | | | | | remarks | | | | | below | +---------------------+------------+---------------------+---------+ | roles | [RFC8984], | ROLE, or | Section | | | Section | PARTICIPANT-TYPE | 2.3.4, | | | 4.4.6 | property of the | Section | | | | PARTICIPANT | 2.3.30, | | | | component | and | | | | | remarks | | | | | below | +---------------------+------------+---------------------+---------+ | scheduleAgent | [RFC8984], | SCHEDULE-AGENT | Section | | | Section | | 2.3.4 | | | 4.4.6 | | | +---------------------+------------+---------------------+---------+ | scheduleForceSend | [RFC8984], | SCHEDULE-FORCE-SEND | Section | | | Section | | 2.3.4 | | | 4.4.6 | | | +---------------------+------------+---------------------+---------+ | scheduleStatus | [RFC8984], | SCHEDULE-STATUS | Section | | | Section | | 2.3.4 | Stepanek Expires 20 September 2025 [Page 92] Internet-Draft JSCalendar March 2025 | | 4.4.6 | | | +---------------------+------------+---------------------+---------+ | sendTo | [RFC8984], | ATTENDEE or JSPROP | Section | | | Section | | 2.3.4, | | | 4.4.6 | | Section | | | | | 4.1.2, | | | | | and the | | | | | start | | | | | of this | | | | | section | +---------------------+------------+---------------------+---------+ Table 33: Properties of the Participant object that convert to the ATTENDEE property Remarks: * The "optional" role converts to the "OPT-PARTICIPANT" ROLE parameter value, the "chair" role to "CHAIR", "informational" to "NON-PARTICIPANT". The "attendee" role does not convert to the ROLE parameter: it either is implied if the Participant object converts to an ATTENDEE, otherwise implementations MAY preserve it using the JSPROP (Section 4.1.2) property. The "owner" role does not convert to any standard iCalendar element: it either is implied if the property value of the ATTENDEE is equal to the value of the ORGANIZER property in the same component, otherwise implementations MAY preserve it using the JSPROP (Section 4.1.2) property. All other roles require a PARTICIPANT component and convert to the PARTICIPANT-TYPE property in that component. * The progress property converts to the PARTSTAT parameter as outlined in Table 16. The following Participant properties convert to the PARTICIPANT component: Stepanek Expires 20 September 2025 [Page 93] Internet-Draft JSCalendar March 2025 +======================+============+==================+==========+ | Name | Reference | Property (or | See | | | | other) | | +======================+============+==================+==========+ | description | [RFC8984], | DESCRIPTION | Section | | | Section | | 2.3.13 | | | 4.2.2 | | | +----------------------+------------+------------------+----------+ | links | [RFC8984], | ATTACH, or other | Link | | | Section | | object | | | 4.2.7 | | (Section | | | | | 3.4) | +----------------------+------------+------------------+----------+ | name | [RFC8984], | NAME | Section | | | Section | | 2.3.28 | | | 4.2.5 | | | +----------------------+------------+------------------+----------+ | participationComment | [RFC8984], | COMMENT | Section | | | Section | | 2.3.9 | | | 4.4.6 | | | +----------------------+------------+------------------+----------+ | percentComplete | [RFC8984], | PERCENT-COMPLETE | Section | | | Section | | 2.3.31 | | | 5.2.4 | | | +----------------------+------------+------------------+----------+ | roles | [RFC8984], | PARTICIPANT-TYPE | Section | | | Section | | 2.3.30 | | | 4.4.6 | | | +----------------------+------------+------------------+----------+ | scheduleSequence | [RFC8984], | SEQUENCE | Section | | | Section | | 2.3.39 | | | 4.4.6 | | | +----------------------+------------+------------------+----------+ | scheduleUpdated | [RFC8984], | DTSTAMP | Section | | | Section | | 2.3.15 | | | 4.4.6 | | | +----------------------+------------+------------------+----------+ Table 34: Properties of the Participant object that convert to the PARTICIPANT component Other properties MAY be converted to JSPROP properties (Section 4.1.2) in the PARTICIPANT component, or the component which the Participant converts to as a property. Stepanek Expires 20 September 2025 [Page 94] Internet-Draft JSCalendar March 2025 3.7. TimeZone The TimeZone object [RFC8984] (Section 4.7.2) converts to a VTIMEZONE component (Section 2.2.5). Its properties convert as follows: +============+===============+=====================+==============+ | Name | Reference | Property (or other) | See | +============+===============+=====================+==============+ | aliases | [RFC8984], | TZID-ALIAS-OF | Section | | | Section 4.7.2 | | 2.3.48 | +------------+---------------+---------------------+--------------+ | daylight | [RFC8984], | DAYLIGHT | TimeZoneRule | | | Section 4.7.2 | (component) | below | +------------+---------------+---------------------+--------------+ | standard | [RFC8984], | STANDARD | TimeZoneRule | | | Section 4.7.2 | (component) | below | +------------+---------------+---------------------+--------------+ | tzId | [RFC8984], | TZID | Section | | | Section 4.7.2 | | 2.3.47 | +------------+---------------+---------------------+--------------+ | url | [RFC8984], | TZURL | Section | | | Section 4.7.2 | | 2.3.53 | +------------+---------------+---------------------+--------------+ | validUntil | [RFC8984], | TZUNTIL | Section | | | Section 4.7.2 | | 2.3.52 | +------------+---------------+---------------------+--------------+ Table 35: Properties of the TimeZone object Other properties MAY be converted to JSPROP properties (Section 4.1.2) in the VTIMEZONE component. The TimeZoneRule object [RFC8984] (Section 4.7.2) converts to a DAYLIGHT or STANDARD component (Section 2.2.5). Its properties convert as follows: Stepanek Expires 20 September 2025 [Page 95] Internet-Draft JSCalendar March 2025 +=====================+===============+==============+=========+ | Name | Reference | Property (or | See | | | | other) | | +=====================+===============+==============+=========+ | comments | [RFC8984], | COMMENT | Section | | | Section 4.7.2 | | 2.3.9 | +---------------------+---------------+--------------+---------+ | names | [RFC8984], | TZNAME | Section | | | Section 4.7.2 | | 2.3.49 | +---------------------+---------------+--------------+---------+ | offsetFrom | [RFC8984], | TZOFFSETFROM | Section | | | Section 4.7.2 | | 2.3.50 | +---------------------+---------------+--------------+---------+ | offsetTo | [RFC8984], | TZOFFSETTO | Section | | | Section 4.7.2 | | 2.3.51 | +---------------------+---------------+--------------+---------+ | recurrenceOverrides | [RFC8984], | RDATE | Section | | | Section 4.3.5 | | 2.3.34 | +---------------------+---------------+--------------+---------+ | recurrenceRules | [RFC8984], | RRULE | Section | | | Section 4.3.3 | | 2.3.38 | +---------------------+---------------+--------------+---------+ | start | [RFC8984], | DTSTART | Section | | | Section 4.7.2 | | 2.3.16 | +---------------------+---------------+--------------+---------+ Table 36: Properties of the TimeZoneRule object Other properties MAY be converted to JSPROP properties (Section 4.1.2) in the STANDARD or DAYLIGHT component. 3.8. VirtualLocation The VirtualLocation object [RFC8984] (Section 4.2.6) converts to a CONFERENCE property (Section 2.3.11). The uri property converts to the CONFERENCE property value. Its other properties convert as follows: Stepanek Expires 20 September 2025 [Page 96] Internet-Draft JSCalendar March 2025 +==========+===============+======================+=========+ | Name | Reference | Parameter (or other) | See | +==========+===============+======================+=========+ | features | [RFC8984], | FEATURE | Section | | | Section 4.2.6 | | 2.3.11 | +----------+---------------+----------------------+---------+ | name | [RFC8984], | LABEL | Section | | | Section 4.2.5 | | 2.3.11 | +----------+---------------+----------------------+---------+ Table 37: Properties of the VirtualLocation object Other properties MAY be converted to JSPROP properties (Section 4.1.2) in the component to which the VirtualLocation converts to as a property. 4. Updates to iCalendar 4.1. New Properties 4.1.1. JSKEY Property Name: JSKEY Purpose: This property preserves the key of a JSCalendar object value in iCalendar. Value type: TEXT; also see "Format Definition" below for value restrictions. Property Parameters: IANA and non-standard property parameters can be specified on this property. Conformance: This property can be specified at most once in any calendar component. Description: This property specifies the JSON object key of the JSCalendar object to which an iCalendar component converts to. For example, this property set in a VALARM component within a VEVENT component defines the key of the Alert object value in the Event object's "alerts" property (see Figure 85). Stepanek Expires 20 September 2025 [Page 97] Internet-Draft JSCalendar March 2025 The value of the JSKEY property MUST be a valid key according to the definition of the JSCalendar property to which the component converts to. Typically, this requires the value to be a valid Id [RFC8984] (Section 1.4.1), but e.g. a VTIMEZONE component converting to the "timeZones" property requires the value to be a valid TimeZoneId [RFC8984] (Section 4.7.2). Format Definition: This property is defined by the following notation: jskey-prop = "JSKEY" *(";" other-param) ":" TEXT CRLF Example(s): The following example illustrates how to convert the JSKEY property set in a VALARM component. BEGIN:VEVENT ... BEGIN:VALARM JSKEY:myalert1 ... END:VALARM "@type": "Event", "alerts": { "myalert1": { "@type": "Alert", "...": "" } } Figure 85: Converting the JSKEY property of a VALARM component 4.1.2. JSPROP Property Name: JSPROP Purpose: This property represents a JSCalendar property in iCalendar. Value type: TEXT; also see "Format Definition" below for value restrictions. Property Parameters: The JSPTR parameter (Section 4.2.2) MUST be specified on this property. Other IANA and non-standard property parameters can be specified on this property. Stepanek Expires 20 September 2025 [Page 98] Internet-Draft JSCalendar March 2025 Conformance: This property can be specified multiple times in any calendar component. Description: This property converts an arbitrary JSCalendar property from and to iCalendar. The iCalendar property value is the JSON-encoded value of the JSCalendar property, represented as a TEXT value. The JSON value MUST NOT contain insignificant whitespace as defined in Section 2 of [RFC8259]. The value of the JSPTR parameter points to the JSCalendar property within the JSCalendar object. The root of the JSON pointer is always the JSCalendar object to which the calendar component converts to, even if the JSON pointer starts with the SOLIDUS (U+002F) character. The pointer MUST NOT reference into an array. All JSPROP properties in a calendar component together form a PatchObject as defined in [RFC8984]. For each JSPROP property, the value of its JSPTR parameter corresponds to a key in the PatchObject, the value of the JSPROP property corresponds to the value for that key. When converting from iCalendar to JSCalendar, the PatchObject MUST only be applied after all other iCalendar properties have been converted. The PatchObject MUST be valid, an invalid PatchObject MUST be ignored. Format Definition: This property is defined by the following notation: jsprop = "JSPROP" jsprop-param ":" TEXT CRLF jsprop-param = *( ; The following are MANDATORY and MUST NOT ; occur more than once ( ";" jsptr-param ) ; ; The following is OPTIONAL ; and MAY occur more than once. ; (";" other-param) ; ) Example(s): The following example illustrates how to convert a JSPROP property with a JSON boolean value Stepanek Expires 20 September 2025 [Page 99] Internet-Draft JSCalendar March 2025 JSPROP;JSPTR="example.com:foo":true "example.com:foo": true Figure 86: Converting the JSPROP property with a JSON boolean value The following example illustrates how to convert a JSPROP property with a JSON object value JSPROP;JSPTR="example.com:foo":{"bar":1234\,"baz":"bam"} "example.com:foo": { "bar": 1234, "baz": "bam" } Figure 87: Converting the JSPROP property with a JSON object value The following example illustrates how to convert a JSPROP property that points to a property within a JSCalendar Alert. The JSON pointer in the JSPTR parameter is relative to the Alert object. BEGIN:VEVENT ... BEGIN:VALARM JSPROP;JSPTR="example.com:foo":"bar" ... END:VALARM "@type": "Event", "alerts": { "a1": { "@type": "Alert", "example.com:foo": "bar", "...": "" } } Figure 88: Converting the JSPROP property within a VALARM component The following example illustrates how to convert a JSPROP property that points to a property within a JSCalendar Link. The JSON pointer in the JSPTR parameter is relative to the Event object because the Link object converts to an iCalendar property. The JSKEY parameter (Section 4.2.1) on the ATTACH property ensures that the JSON path remains valid during conversion. Stepanek Expires 20 September 2025 [Page 100] Internet-Draft JSCalendar March 2025 BEGIN:VEVENT ... ATTACH;JSKEY=mylink1:https://www.rfc-editor.org/rfc/rfc8984.html JSPROP;JSPTR="mylink1/example.com:foo":"bar" ... "@type": "Event", "links": { "mylink1": { "@type": "Link", "example.com:foo": "bar", "...": "" } } Figure 89: Converting the JSPROP property within a VALARM component 4.2. New Parameters 4.2.1. JSKEY Parameter Name: JSKEY Format Definition: jskey-param = "JSKEY" "=" param-value Description: This parameter specifies the JSON object key of the JSCalendar object to which an iCalendar property converts to. For example, this parameter set on an ATTACH property within a VEVENT component defines the key of the Link object value in the Event object's "links" property (see below for an example). The value of the JSKEY parameter MUST be a valid key according to the definition of the JSCalendar property to which the property that this parameter is set on converts to. Typically, this requires the value to be a valid Id [RFC8984] (Section 1.4.1). Example(s): ATTACH;JSKEY=mylink1:https://example.com "links": { "mylink1": { "@type": "Link", "href": "https://example.com" } } Stepanek Expires 20 September 2025 [Page 101] Internet-Draft JSCalendar March 2025 Figure 90: Converting the JSKEY parameter on an ATTACH property 4.2.2. JSPTR Parameter Name: JSPTR Format Definition: jsptr-param = "JSPTR" "=" quoted-string Description: This parameter is specified on a JSPROP (Section 4.1.2) property. Its value is a JSON pointer [RFC6901] that points to a JSCalendar property. Description: This parameter has a single value that MUST be a valid JSON pointer as defined in [RFC6901]. The value MUST be quoted to preserve its case-sensitivity and it MUST NOT contain the DQUOTE character. See Section 3.2 of [RFC5545] for how to format parameter values. Example(s): JSPROP;JSPTR="example.com:foo":"bar" For further examples, see Section 4.1.2. 5. Updates to JSCalendar 5.1. New Properties 5.1.1. iCalComponent Name: iCalComponent Context: Any JSCalendar object Type: ICalComponent (optional) Description This contains information about an iCalendar component that got converted to JSCalendar. It allows for preserving the name of the iCalendar component and some or all of its properties and subcomponents. Stepanek Expires 20 September 2025 [Page 102] Internet-Draft JSCalendar March 2025 An ICalComponent object has the following properties: @type: String (mandatory) This specifies the type of this object. This MUST be ICalComponent. name: String (mandatory) This is the name of the iCalendar component in lowercase. components: *[][] (optional) This contains subcomponents of the iCalendar component which did not convert to standard JSCalendar elements. The value MUST be a list of iCalendar components formatted in jCal as defined in Section 3.3 of [RFC7265]. convertedProperties: String[ICalProperty] (optional) This contains conversion-related information about the component's properties that got partially or fully converted to JSCalendar. Each key defines the path to a property of the JSCalendar object on which the "iCalComponent" property is set on. The value for each key contains information about the "iCalendar" property which converted to the "object" property located at that key (see Section 5.1.2). The key MUST be a valid key of a PatchObject as defined in Section 1.4.9 of [RFC8984]. The key MUST NOT point into a nested property, unless there is no way to otherwise preserve the "iCalendar" property elements. For example, if a VEVENT contains an ATTENDEE property, then any iCalendar information about the ATTENDEE property MUST be set in the "iCalProperty" property of the converted Participant object (see Section 2.3.4). In contrast, information about a RDATE property contained in a VEVENT would be located by a key pointing into the recurrenceOverrides property of the Event object (see Section 2.3.34). properties: *[][] (optional) This contains properties of the iCalendar component which did not convert to standard JSCalendar elements. The value MUST be a list of iCalendar properties formatted in jCal as defined in Section 3.4 of [RFC7265]. The example in Figure 91 describes how to convert unknown iCalendar elements to the "iCalComponent" property. The "X-FOO" parameter set on the SUMMARY property illustrates how to preserve an unknown iCalendar parameter on a property that does convert to a standard JSCalendar element. The "X-BAR" property and "X-BAZ" component illustrate how to convert entirely unknown iCalendar elements. Stepanek Expires 20 September 2025 [Page 103] Internet-Draft JSCalendar March 2025 BEGIN:VEVENT SUMMARY;X-FOO=bar:test ... X-BAR:bam ... BEGIN:X-BAZ UID:507A08F9-81D8-4D16-9480-D6D75E977943 END:X-BAZ ... { "@type": "Event", "title": "test", "iCalComponent": { "@type": "ICalComponent", "name": "vevent", "convertedProperties": { "title": { "@type": "ICalProperty", "name": "summary", "parameters": { "x-foo": "bar" } } }, "properties": [ [ "x-bar", {}, "unknown", "bam" ] ], "components": [ [ "x-baz", [ [ "uid", {}, "text", "507A08F9-81D8-4D16-9480-D6D75E977943" ] ], [] ] ] } } Stepanek Expires 20 September 2025 [Page 104] Internet-Draft JSCalendar March 2025 Figure 91: Converting unknown iCalendar elements to the iCalComponent property 5.1.2. iCalProperty Name: iCalProperty Context: Any JSCalendar object Type: ICalProperty (optional) Description: This contains conversion-related information about an iCalendar property that got partially or fully converted to a JSCalendar object. It allows for preserving the name of the "iCalendar" property and some or all of its parameters. An ICalProperty object has the following properties: @type: String (mandatory) This specifies the type of this object. This MUST be ICalProperty. name: String (mandatory) This is the name of the "iCalendar" property in lowercase. valueType: String (optional) This is the name of the "iCalendar" property value type in lowercase. parameters: String[String] (optional) This contains parameters of the "iCalendar" property. The value MUST comply with iCalendar parameters formatted in jCal as defined in Section 3.5 of [RFC7265]. The example in Figure 92 describes how to convert an unknown parameter to the "iCalProperty" property. The ATTACH property converts to a Link object. To preserve the unknown "X-FOO" parameter, the "iCalProperty" property is set on the Link object. ATTACH;X-FOO=bar:https://example.com/example.jpg Stepanek Expires 20 September 2025 [Page 105] Internet-Draft JSCalendar March 2025 "links": { "l1": { "@type": "Link", "href": "https://example.com/example.jpg", "iCalProperty": { "@type": "ICalProperty", "name": "attach", "parameters": { "x-foo": "bar" } } } } Figure 92: Converting the STRUCTURED-DATA property 6. IANA Considerations 7. References 7.1. Normative References [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", BCP 14, RFC 2119, DOI 10.17487/RFC2119, March 1997,