Internet-Draft | JSCalendar | May 2025 |
Stepanek | Expires 22 November 2025 | [Page] |
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.¶
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 22 November 2025.¶
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.¶
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].¶
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.¶
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.¶
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.¶
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:¶
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
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
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 ...
...
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
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" } ] }
A property with name "..."
and value ""
stands for additional properties that might be present in a JSCalendar object but are irrelevant for this example, including mandatory properties. The "..."
property requires the "@type"
property to be set. Figure 5 illustrates this as an alternative representation for the examples of Figure 4.¶
{ "@type": "Event", "title": "hello", "...": "" }
...
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:¶
All the examples in this document illustrate lossless conversion, if not explicitly stated otherwise in the example.¶
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 [jscalendarbis] (Section 2.3). Its properties convert as follows:¶
Name | Reference | Group property | See | Note |
---|---|---|---|---|
ATTACH | [RFC5545], Section 3.8.1.1 | links | Section 2.3.3 | |
CATEGORIES | [RFC5545], Section 3.8.1.2 | keywords | Section 2.3.6 | |
COLOR | [RFC7986], Section 5.9 | color | Section 2.3.8 | |
CONCEPT | [RFC9253], Section 8.1 | categories | Section 2.3.9 | |
CREATED | [RFC5545], Section 3.8.7.1 | created | Section 2.3.12 | |
DESCRIPTION | [RFC5545], Section 3.8.1.5 | description | Section 2.3.13 | |
IMAGE | [RFC7986], Section 5.10 | links | Section 2.3.22 | |
LAST-MODIFIED | [RFC5545], Section 3.8.7.3 | updated | Section 2.3.23 | |
LINK | [RFC9253], Section 8.2 | links | Section 2.3.24 | |
METHOD | [RFC5545], Section 3.7.2 | entries/*/method | Section 2.3.27 | |
NAME | [RFC7986], Section 5.1 | title | Section 2.3.28 | |
PRODID | [RFC5545], Section 3.7.3 | prodId, entries/*/prodId | Section 2.3.32 | |
SOURCE | [RFC7986], Section 5.8 | source | Section 2.3.40 | |
UID | [RFC5545], Section 3.8.4.7 | uid | Section 2.3.45 |
Its components convert as follows:¶
Name | Reference | Group property | See | Note |
---|---|---|---|---|
VEVENT | [RFC5545], Section 3.6.1 | entries | Section 2.2.4 | |
VTODO | [RFC5545], Section 3.6.2 | entries | Section 2.2.6 |
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.¶
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", "...": "" }
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.¶
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" } }, "recurrenceRule": { "@type": "RecurrenceRule", "frequency": "daily" }, "start": "2024-01-01T14:00:00", "timeZone": "Europe/Berlin", "uid": "F4257E1D-5461-4EF6-840F-9DFC653EB559" } ], "...": "" }
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" } ], "...": "" }
JSCalendar generally uses JSON objects to represent a collection of same-typed values. The keys are of type Id [jscalendarbis] (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 JSID (Section 4.2.1) parameter and JSID 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:¶
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 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 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 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. Otherwise, how to convert the TZID parameter value is implementation-specific: software libraries such as the International Components for Unicode support converting Microsoft time zone names to IANA time zone identifiers. Alternatively, finding an IANA time zone for which the time zone offset changes match those of the custom time zone over the span of the event or task is typically possible.¶
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.¶
The PARTICIPANT component [RFC9073] (Section 7.1) converts to a Participant object [jscalendarbis] (Section 4.4.6). Its properties convert as follows:¶
Name | Reference | Participant property | See | Note |
---|---|---|---|---|
ATTACH | [RFC5545], Section 3.8.1.1 | links | Section 2.3.3 | |
CALENDAR-ADDRESS | [RFC9073], Section 6.4 | calendarAddress | Section 2.3.5 | |
DESCRIPTION | [RFC5545], Section 3.8.1.5 | description | Section 2.3.13 | |
LINK | [RFC9253], Section 8.2 | links | Section 2.3.24 | |
STYLED-DESCRIPTION | [RFC9073], Section 6.5 | description | Section 2.3.41 | |
SUMMARY | [RFC5545], Section 3.8.1.12 | name | Section 2.3.42 |
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:PARTICIPANT UID:47AD2E1C-49D4-45DF-BD83-8398ACC7D8E2 DESCRIPTION:A participant ... END:PARTICIPANT
"participants": { "p32": { "@type": "Participant", "description": "A participant", "iCalComponent": { "@type": "ICalComponent", "name": "participant", "properties": [ [ "uid", {}, "text", "47AD2E1C-49D4-45DF-BD83-8398ACC7D8E2" ] ] } } }
The VALARM component [RFC5545] (Section 3.6.6) converts to an Alert object [jscalendarbis] (Section 4.5.2). Its properties convert as follows:¶
Name | Reference | Alert property | See | Note |
---|---|---|---|---|
ACKNOWLEDGED | [RFC9074], Section 6.1 | acknowledged | Section 2.3.1 | |
ACTION | [RFC5545], Section 3.8.6.1 | action | Section 2.3.2 | Only if ACTION is EMAIL or DISPLAY. |
RELATED-TO | [RFC5545], Section 3.8.4.5 | relatedTo | Section 2.3.35 | |
TRIGGER | [RFC5545], Section 3.8.6.3 | trigger | Section 2.3.44 |
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:VALARM TRIGGER:-PT30M ACTION:DISPLAY DESCRIPTION:Breakfast meeting END:VALARM
"alerts": { "a8": { "@type": "Alert", "iCalComponent": { "@type": "ICalComponent", "name": "valarm", "properties": [ [ "description", {}, "text", "Breakfast meeting" ] ] }, "trigger": { "@type": "OffsetTrigger", "offset": "-PT30M" }, "action": "display" } }
The VCONFERENCE component [icaljscalexts] (Section 6.1) converts to a VirtualLocation object [jscalendarbis] (Section 4.2.7). It MUST convert to the same VirtualLocation to which its related CONFERENCE property (Section 2.3.10) converts. If no related CONFERENCE property is set in the calendar component, then implementations MUST NOT convert the VCONFERENCE component.¶
Its properties convert as follows:¶
Name | Reference | Location property | See | Note |
---|---|---|---|---|
DESCRIPTION | [RFC5545], Section 3.8.1.5 | description | Section 2.3.13 | |
STYLED-DESCRIPTION | [RFC9073], Section 6.5 | description | Section 2.3.41 |
Other properties or components MAY be converted to the "iCalComponent" property (Section 5.1.1) of the VirtualLocation object.¶
The following example illustrates how to convert the VCONFERENCE component:¶
BEGIN:VCONFERENCE URI;VALUE=URI:https://chat.example.com/x?id=123456 STYLED-DESCRIPTION;VALUE=TEXT;FMTTYPE=text/html:<body>Click <a href="https://ch at.example.com/client">here</a> to download the client...</body> ... END:VCONFERENCE CONFERENCE;VALUE=URI;FEATURE=AUDIO,VIDEO; LABEL=Team meeting:https://chat.example.com/x?id=123456
"virtualLocations": { "1": { "@type": "VirtualLocation", "name": "Team meeting", "description": "<body>Click <a href=\"https://chat.example.com/client\">here</a> to download the client...</body>", "descriptionContentType": "text/html", "uri": "https://chat.example.com/x?id=123456", "features": { "audio": true, "video": true } } }
The VEVENT component [RFC5545] (Section 3.6.1) converts to a Event object [jscalendarbis] (Section 2.1). Its properties convert as follows:¶
Its components convert as follows:¶
Name | Reference | Event property | See | Note |
---|---|---|---|---|
VALARM | [RFC5545], Section 3.6.6 | alerts | Section 2.2.2 | |
VCONFERENCE | [icaljscalexts], Section 5.1 | virtualLocations | Section 2.2.3 |
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", "...": "" } ] }
The VLOCATION component [RFC9073] (Section 7.2) converts to a Location object [jscalendarbis] (Section 4.2.5). Its properties convert as follows:¶
Name | Reference | Location property | See | Note |
---|---|---|---|---|
ATTACH | [RFC5545], Section 3.8.1.1 | links | Section 2.3.3 | |
COORDINATES | [icaljscalexts], Section 4.1 | coordinates | Section 2.3.11 | |
DESCRIPTION | [RFC5545], Section 3.8.1.5 | description | Section 2.3.13 | |
GEO | [RFC5545], Section 3.8.1.6 | coordinates | Section 2.3.21 | |
IMAGE | [RFC7986], Section 5.10 | links | Section 2.3.22 | |
LINK | [RFC9253], Section 8.2 | links | Section 2.3.24 | |
LOCATION-TYPE | [RFC9073], Section 6.1 | locationTypes | Section 2.3.26 | |
NAME | [RFC7986], Section 5.1 | name | Section 2.3.28 | |
STYLED-DESCRIPTION | [RFC9073], Section 6.5 | description | Section 2.3.41 |
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:¶
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", "iCalComponent": { "@type": "ICalComponent", "name": "vlocation", "properties": [ [ "structured-data", {}, "uri", "http://dir.example.com/venues/big-hall.vcf" ], [ "uid", {}, "text", "4954DC22-5BD6-4E98-844D-0302982F54AC" ] ] } } }
The VTODO component [RFC5545] (Section 3.6.2) converts to a Task object [jscalendarbis] (Section 2.2). Its properties convert as follows:¶
Its components convert as follows:¶
Name | Reference | Task property | See | Note |
---|---|---|---|---|
VALARM | [RFC5545], Section 3.6.6 | alerts | Section 2.2.2 | |
VCONFERENCE | [icaljscalexts], Section 5.1 | virtualLocations | Section 2.2.3 |
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 ...
{ "...": "", "@type": "Group", "entries": [ { "...": "", "@type": "Task", "due": "2006-01-02T03:04:05", "timeZone": "Etc/UTC", "uid": "83C80482-806D-41C4-8029-E438F793005D" } ] }
The ACKNOWLEDGED property [RFC9074] (Section 6.1) in a VALARM component converts to the "acknowledged" property [jscalendarbis] (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", "...": "" } }
The ACTION property [RFC5545] (Section 3.8.6.1) in a VALARM component converts to the "action" property [jscalendarbis] (Section 4.5.2) of the Alert object.¶
Its values convert as follows:¶
iCalendar value | JSCalendar value |
---|---|
DISPLAY | display |
An ACTION property with value AUDIO or any other not listed in Table 11 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", "...": "" } }
BEGIN:VEVENT BEGIN:VALARM ACTION:AUDIO ...
"alerts": { "a": { "@type": "Alert", "iCalComponent": { "@type": "ICalComponent", "name": "valarm", "properties": [ [ "action", {}, "text", "AUDIO" ] ] }, "...": "" } }
The ATTACH property [RFC5545] (Section 3.8.1.1) in a VEVENT, VTODO, PARTICIPANT, VLOCATION, or VCALENDAR component converts to a Link object [jscalendarbis] (Section 1.4.11). The converted object is set in the "links" property of the Event, Task, Participant, Location, or Group 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 | |
LABEL | [RFC7986], Section 6.4 | title | |
LINKREL | [RFC9253], Section 6.1 | rel | See remarks below |
SIZE | [RFC8607], Section 4.1 | size |
Remarks:¶
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" } }
ATTACH;ENCODING=BASE64;VALUE=BINARY;FMTTYPE=image/png:iVBORw 0KGgoAAAANSUhEUgAAAAEAAAABAQAAAAA3bvkkAAAAAmJLR0QAAd2KE6QAA AAKSURBVAjXY2gAAACCAIHdQ2r0AAAAAElFTkSuQmCC
"links": { "a": { "@type": "Link", "href": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQAAAAA3bvkkAAAAAmJLR0QAAd2KE6QAAAAKSURBVAjXY2gAAACCAIHdQ2r0AAAAAElFTkSuQmCC", "contentType": "image/png", "...": "" } }
The ATTENDEE property [RFC5545] (Section 3.8.4.1) in a VEVENT or VTODO component converts to a Participant object [jscalendarbis] (Section 4.4.6). The converted object is set in the "participants" property of the Event or Task object. The property value converts to the calendarAddress property of the Participant object.¶
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. How to deal with conflicting values is implementation-specific.¶
The ATTENDEE property parameters convert as follows:¶
Name | Reference | Participant Property | Note |
---|---|---|---|
CN | [RFC5545], Section 3.2.2 | name | |
CUTYPE | [RFC5545], Section 3.2.3 | kind | |
DELEGATED-FROM | [RFC5545], Section 3.2.4 | delegatedFrom | |
DELEGATED-TO | [RFC5545], Section 3.2.5 | delegatedTo | |
[RFC7986], Section 6.2 | |||
MEMBER | [RFC5545], Section 3.2.11 | memberOf | |
PARTSTAT | [RFC5545], Section 3.2.12 | participationStatus | |
ROLE | [RFC5545], Section 3.2.16 | roles | |
RSVP | [RFC5545], Section 3.2.17 | expectReply | |
SENT-BY | [RFC5545], Section 3.2.18 | sentBy |
If no ROLE parameter is set, then the "attendee" role in the "roles" property MUST be set.¶
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:¶
PARTSTAT | Reference | participationStatus | progress |
---|---|---|---|
NEEDS-ACTION | [RFC5545], Section 3.2.12 | needs-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-PROCESS | [RFC5545], Section 3.2.12 | accepted | in-process |
FAILED | [ical-tasks], Section 11.1 | accepted | failed |
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
"participants": { "p3": { "@type": "Participant", "calendarAddress": "mailto:hcabot@example.com", "name": "Henry Cabot", "participationStatus": "tentative", "roles": { "attendee": true }, "expectReply": true }, "o4": { "@type": "Participant", "calendarAddress": "mailto:organizer@example.com", "roles": { "owner": true } } }, "organizerCalendarAddress": "mailto:organizer@example.com"
BEGIN:PARTICIPANT CALENDAR-ADDRESS:mailto:foo@example.com DESCRIPTION:some description ... END:PARTICIPANT ATTENDEE;RSVP=TRUE;PARTSTAT=TENTATIVE:mailto:foo@example.com ORGANIZER:mailto:organizer@example.com
"participants": { "23": { "@type": "Participant", "calendarAddress": "mailto:foo@example.com", "participationStatus": "tentative", "expectReply": true, "description": "some description", "...": "" }, "o4": { "@type": "Participant", "calendarAddress": "mailto:organizer@example.com", "...": "" } }, "organizerCalendarAddress": "mailto:organizer@example.com"
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", "expectReply": true, "...": "" }, "o": { "@type": "Participant", "calendarAddress": "mailto:organizer@example.com", "...": "" } }, "organizerCalendarAddress": "mailto:organizer@example.com"
The CALENDAR-ADDRESS property [RFC9073] (Section 6.4) in a PARTICIPANT component converts to the "calendarAddress" property [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", "...": "" } }
The CATEGORIES property [RFC5545] (Section 3.8.1.2) in a VEVENT, VTODO, or VCALENDAR component converts to the "keywords" property [jscalendarbis] (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 }
The CLASS property [RFC5545] (Section 3.8.1.3) in a VEVENT or VTODO component converts to the "privacy" property [jscalendarbis] (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 |
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"
The COLOR property [RFC7986] (Section 5.9) in a VEVENT, VTODO, or VCALENDAR component converts to the "color" property [jscalendarbis] (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"
COLOR:#ffa07a
"color": "#ffa07a"
The CONCEPT property [RFC9253] (Section 8.1) in a VEVENT, VTODO, or VCALENDAR component converts to the "categories" property [jscalendarbis] (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.¶
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 }
The CONFERENCE property [RFC7986] (Section 5.11) in a VEVENT or VTODO component converts to a VirtualLocation object [jscalendarbis] (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.¶
The CONFERENCE property and a VCONFERENCE component convert to the same VirtualLocation, if the CONFERENCE property value matches the URI property value of the VCONFERENCE component. Also see Section 2.2.3.¶
Its parameters convert as follows:¶
Name | Reference | Property | Note |
---|---|---|---|
FEATURE | [RFC7986], Section 6.3 | features | |
LABEL | [RFC7986], Section 6.4 | name |
The following example illustrates how to convert the CONFERENCE property:¶
CONFERENCE;VALUE=URI;FEATURE=AUDIO,VIDEO; LABEL="Web video chat, access code=76543" :https://chat.example.com/audio?id=123456
"virtualLocations": { "b2": { "@type": "VirtualLocation", "name": "Web video chat, access code=76543", "uri": "https://chat.example.com/audio?id=123456", "features": { "audio": true, "video": true } } }
The COORDINATES property [icaljscalexts] (Section 4.1) in a VLOCATION component converts to the "coordinates" property [jscalendarbis] (Section 4.2.5) of the Location object.¶
The following example illustrates how to convert the COORDINATES property:¶
BEGIN:VEVENT GEO;DERIVED=TRUE:48.198634;16.371648 BEGIN:VLOCATION COORDINATES;VALUE=URI:geo:48.198634,16.371648;crs=wgs84;u=40 ...
"locations": { "1": { "@type": "Location", "coordinates": "geo:48.198634,16.371648;crs=wgs84;u=40", "...": "" } }
The CREATED property [RFC5545] (Section 3.8.7.1) in a VEVENT, VTODO, or VCALENDAR component converts to the "created" property [jscalendarbis] (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"
The DESCRIPTION property [RFC5545] (Section 3.8.1.5) in a VEVENT, VTODO, VCALENDAR, VLOCATION, or PARTICIPANT component converts to the "description" property [jscalendarbis] (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).¶
If the LANGUAGE parameter is set and the DESCRIPTION property is set in a VEVENT or VTODO component, then the parameter value converts to the "locale" property of the Event or Task object, unless the SUMMARY property in the same component has the LANGUAGE parameter set.¶
If the LANGUAGE parameter is set and the DESCRIPTION property is set in a VCALENDAR component, then the parameter value converts to the "locale" property of the Group object, unless the NAME property in the same component has the LANGUAGE parameter set.¶
The following example illustrates how to convert the DESCRIPTION property:¶
DESCRIPTION:Their pancakes are delicious\; they are fluffy and sweet.
"description": "Their pancakes are delicious; they are fluffy and sweet."
The DTEND property [RFC5545] (Section 3.8.2.2) in a VEVENT component converts to the "duration" property [jscalendarbis] (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 it converts to the "endTimeZone" property of the Event.¶
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 time zone identifiers are not equal, then the presence of the "endTimeZone" property implies that it converted from the DTEND property. If the time zone identifiers are equal, then implementations MAY 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. 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=Europe/Berlin:20241017T130000 DTEND;TZID=Asia/Bangkok:20241018T040000
"start": "2024-10-17T13:00:00", "timeZone": "Europe/Berlin", "duration": "PT10H", "endTimeZone": "Asia/Bangkok"
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" } } }
DTSTART;VALUE=DATE:20240102 DTEND;VALUE=DATE:20240107
"start": "2024-01-02T00:00:00", "timeZone": null, "duration": "P5D", "showWithoutTime": true, "iCalComponent": { "@type": "ICalComponent", "name": "vevent", "convertedProperties": { "duration": { "@type": "ICalProperty", "name": "dtend" } } }
The DTSTAMP property [RFC5545] (Section 3.8.7.2) in a VEVENT or VTODO component converts to the "updated" property [jscalendarbis] (Section 4.1.6) of the Event or Task object.¶
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", "...": "" } ], "...": "" }
The DTSTART property [RFC5545] (Section 3.8.2.4) in a VEVENT or VTODO component converts to the "start" property [jscalendarbis] (Section 4.7.2) of the Event or Task object.¶
See Section 2.1.5 how to convert DATE and DATE-TIME values.¶
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 [jscalendarbis] (Section 4.2.4) is "true".¶
The following examples illustrate how to convert the DTSTART property for the VEVENT and VTODO components.¶
DTSTART;TZID=Europe/Berlin:20240921T105302
"start": "2024-09-21T10:53:02", "timeZone": "Europe/Berlin", "showWithoutTime": false
DTSTART:20240921T105302Z
"start": "2024-09-21T10:53:02", "timeZone": "Etc/UTC", "showWithoutTime": false
DTSTART:20240921T105302
"start": "2024-09-21T10:53:02", "timeZone": null, "showWithoutTime": false
DTSTART;VALUE=DATE:20240921
"start": "2024-09-21T00:00:00", "timeZone": null, "showWithoutTime": true
The DUE property [RFC5545] (Section 3.8.2.3) in a VTODO component converts to the "due" property [jscalendarbis] (Section 5.2.1) of the Task object.¶
See Section 2.1.5 how to convert DATE and DATE-TIME values.¶
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 it contains both the DUE and DTSTART properties and the timezone identifier of the DUE property differs from that of the DTSTART property, then the "due" date-time property value MUST be relative to the time zone of DTSTART.¶
If the value type of the DUE property is DATE, then the value of the "showWithoutTime" property [jscalendarbis] (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
BEGIN:VTODO DUE:20240921T105302Z
"@type": "Task", "due": "2024-09-21T10:53:02", "timeZone": "Etc/UTC", "showWithoutTime": false
BEGIN:VTODO DUE:20240921T105302
"@type": "Task", "due": "2024-09-21T10:53:02", "timeZone": null, "showWithoutTime": false
BEGIN:VTODO DUE;VALUE=DATE:20240921
"@type": "Task", "due": "2024-09-21T00:00:00", "timeZone": null, "showWithoutTime": true
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
The DURATION property [RFC5545] (Section 3.8.2.5) in a VEVENT or VTODO component converts to the "duration" property [jscalendarbis] (Section 5.1.2) of the Event or Task object.¶
The following example illustrates how to convert the DURATION property:¶
DURATION:PT1H
"duration": "PT1H"
The ESTIMATED-DURATION property [ical-tasks] (Section 12.1) in a VTODO component converts to the "estimatedDuration" property [jscalendarbis] (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"
The EXDATE property [RFC5545] (Section 3.8.5.1) in a VEVENT or VTODO component converts to a PatchObject value [jscalendarbis] (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" member 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", "recurrenceRule": { "@type": "RecurrenceRule", "frequency": "monthly" }, "recurrenceOverrides": { "2023-08-01T13:00:00": { "excluded": true } }
A GEO property with the DERIVED parameter value "TRUE" does not convert to JSCalendar. For non-derived GEO properties, the following rules apply:¶
The GEO property [RFC5545] (Section 3.8.1.6) in a VEVENT or VTODO component converts to a Location object [jscalendarbis] (Section 4.2.5). If the VEVENT or VTODO component also contains the LOCATION property (Section 2.3.25), then the GEO and LOCATION properties convert to the same Location object. The converted object is set in the "locations" property of the Event or Task object.¶
The GEO property [RFC5545] (Section 3.8.1.6) in a PARTICIPANT component converts to a Location object [jscalendarbis] (Section 4.2.5). The converted object is set in the "locations" property of the Participant object.¶
The GEO property [RFC5545] (Section 3.8.1.6) in a VLOCATION component converts to the "coordinates" property [jscalendarbis] (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.¶
Implementations MAY preserve the fact that the Location "coordinates" property converted from a GEO property. How to do so depends on how the GEO property converted to a Location object:¶
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", "iCalProperty": { "@type": "ICalProperty", "name": "geo" }, "...": "" } }
LOCATION:Taj Mahal GEO:27.175;78.041944
"locations": { "2": { "@type": "Location", "name": "Taj Mahal", "coordinates": "geo:27.175,78.041944", "...": "" } }
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", "iCalComponent": { "@type": "ICalComponent", "name": "vlocation", "convertedProperties": { "coordinates": { "@type": "ICalProperty", "name": "geo" } } } } }
The IMAGE property [RFC7986] (Section 5.10) in a VEVENT, VTODO, VLOCATION, PARTICIPANT, or VCALENDAR component converts to a Link object [jscalendarbis] (Section 1.4.11). The converted object is set in the "links" property of the Event, Task, Location, Participant, or Group 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 | |
LABEL | [RFC7986], Section 6.4 | title | |
LINKREL | [RFC9253], Section 6.1 | rel | |
SIZE | [RFC8607], Section 4.1 | size |
The following example illustrates how to convert the IMAGE property:¶
IMAGE;VALUE=URI;DISPLAY=BADGE;LABEL=An image;FMTTYPE=image/png: https://example.com/images/party.png
"links": { "4": { "@type": "Link", "href": "https://example.com/images/party.png", "display": { "badge": true }, "rel": "icon", "contentType": "image/png", "title": "An image" } }
The LAST-MODIFIED property [RFC5545] (Section 3.8.7.3) in a VCALENDAR component converts to the "updated" property [jscalendarbis] (Section 4.1.6) of the Group object.¶
The LAST-MODIFIED property [RFC5545] (Section 3.8.7.3) in a VEVENT or VTODO component does not convert to the "updated" property [jscalendarbis] (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"
A LINK property [RFC9253] (Section 8.2) with value type URI in a VEVENT, VTODO, PARTICIPANT, VLOCATION, or VCALENDAR component converts to a Link object [jscalendarbis] (Section 1.4.11). The converted object is set in the "links" property of the Event, Task, Participant, Location, or Group object.¶
The property value converts to the "href" property of the Link object.¶
The LINK property parameters convert as follows:¶
Name | Reference | Link Property | Note |
---|---|---|---|
FMTTYPE | [RFC5545], Section 3.2.8 | contentType | |
LABEL | [RFC7986], Section 6.4 | title | |
LINKREL | [RFC9253], Section 6.1 | rel | See remarks below |
Remarks:¶
A LINK property with any other value type does not convert to a standard JSCalendar element. Implementations MAY convert it to the "iCalComponent" property (Section 5.1.1).¶
The following example illustrates how to convert the LINK property:¶
LINK;LINKREL=source;LABEL=Venue;VALUE=URI: https://example.com/events
"links": { "a": { "@type": "Link", "href": "https://example.com/events", "title": "Venue", "rel": "source" } }
The LOCATION property [RFC5545] (Section 3.8.1.7) in a VEVENT or VTODO component converts to a Location object [jscalendarbis] (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. 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 convert to a Location object.¶
If the calendar component contains multiple VLOCATION components, then the LOCATION property also converts to the "mainLocationId" property of the Event or Task object. If the LOCATION property is not derived, then the identifier of its Location object is set in the "mainLocationId". If instead the LOCATION property is derived and its property value matches the NAME property value of a VLOCATION component, then the "mainLocationId" property value matches the identifier of the Location object to which that VLOCATION component converts to.¶
The following example illustrates how to convert the LOCATION property:¶
LOCATION:Conference Room - F123\, Bldg. 002
"locations": { "f45": { "@type": "Location", "name": "Conference Room - F123, Bldg. 002", "...": "" } }
The following example illustrates how to convert the LOCATION property and multiple VLOCATION components:¶
LOCATION;DERIVED=TRUE:Fred's Bar BEGIN:VLOCATION JSID:1 NAME:Fred's Bar LOCATION-TYPE:bar ... END:VLOCATION BEGIN:VLOCATION JSID:2 NAME:XYZ Parking LOCATION-TYPE:parking GEO:40.71427;-74.00597 ... END:VLOCATION
"locations": { "1": { "@type": "Location", "name": "Fred's Bar", "...": "" }, "2": { "@type": "Location", "name": "XYZ Parking", "...": "" } }, "mainLocationId": "1"
The LOCATION-TYPE property [RFC9073] (Section 6.1) in a VLOCATION component converts to the "locationTypes" property [jscalendarbis] (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 ...
"locations": { "1": { "@type": "Location", "locationTypes": { "bar": true, "hotel": true, "restaurant": true }, "...": "" } }
The METHOD property [RFC5545] (Section 3.7.2) in a VCALENDAR component converts to the "method" property [jscalendarbis] (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", "...": "" } ], "...": "" }
The NAME property [RFC7986] (Section 5.1) in a VLOCATION component converts to the "name" property of the Location [jscalendarbis] (Section 4.2.5) or Participant [jscalendarbis] (Section 4.4.6) object.¶
The NAME property [RFC7986] (Section 5.1) in a VCALENDAR component converts to the "title" property [jscalendarbis] (Section 4.2.1) of the Group object. If the LANGUAGE parameter is set, then the parameter value converts to the "locale" property [jscalendarbis] (Section 4.2.9) of the same object.¶
The following examples illustrate how to convert the NAME property:¶
BEGIN:VCALENDAR NAME;LANGUAGE=de:Feiertage Deutschland 2025 ...
{ "@type": "Group", "title": "Feiertage Deutschland 2025", "locale": "de", "...": "" }
BEGIN:VEVENT BEGIN:VLOCATION NAME:Room B ... END:VLOCATION ...
"locations": { "1": { "@type": "Location", "name": "Room B", "iCalComponent": { "@type": "ICalComponent", "name": "vlocation" } } }
The ORGANIZER property [RFC5545] (Section 3.8.4.3) in a VEVENT or VTODO component converts to the "organizerCalendarAddress" property [jscalendarbis] (Section 4.4.4) of the Event or Task object and to a Participant object in the "participants" property [jscalendarbis] (Section 4.4.6). The ORGANIZER property value converts to the "calendarAddress" property of the Participant, the "owner" role is set in Participant "roles" property.¶
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. How to deal with conflicting property values is implementation-specific.¶
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 |
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
"organizerCalendarAddress": "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, "...": "" } }
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
"organizerCalendarAddress": "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 }, "b": { "@type": "Participant", "calendarAddress": "mailto:bar@example.com", "expectReply": true, "...": "" } }
The PERCENT-COMPLETE property [RFC5545] (Section 3.8.1.8) in a VTODO component converts to the "percentComplete" property [jscalendarbis] (Section 5.2.4) of the Task object.¶
The following examples illustrate how to convert the PERCENT-COMPLETE property:¶
BEGIN:VCALENDAR BEGIN:VTODO PERCENT-COMPLETE:53 ...
{ "@type": "Group", "entries": [ { "@type": "Task", "percentComplete": 53, "...": "" } ], "...": "" }
The PRIORITY property [RFC5545] (Section 3.8.1.9) in a VEVENT or VTODO component converts to the "priority" property [jscalendarbis] (Section 4.4.1) of the Event or Task object.¶
The following example illustrates how to convert the PRIORITY property:¶
PRIORITY:3
"priority": 3
The PRODID property [RFC5545] (Section 3.7.3) in a VCALENDAR component converts to the "prodId" property [jscalendarbis] (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", "...": "" } ], "...": "" }
A RDATE property [RFC5545] (Section 3.8.5.2) with value type DATE or DATE-TIME in a VEVENT or VTODO component converts to a PatchObject value [jscalendarbis] (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 object. The PatchObject value MUST be an empty JSON object.¶
A RDATE property with 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 or Task 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", "recurrenceRule": { "@type": "RecurrenceRule", "frequency": "monthly" }, "recurrenceOverrides": { "2023-08-05T17:00:00": {} }
The RECURRENCE-ID property [RFC5545] (Section 3.8.4.4) in a VEVENT or VTODO component converts to the "recurrenceId" property [jscalendarbis] (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.¶
The RRULE property [RFC5545] (Section 3.8.5.3) in a VEVENT or VTODO component converts to a RecurrenceRule object [jscalendarbis] (Section 4.3.3). The converted object is set in the "recurrenceRule" property of the Event or Task object.¶
The RECUR value type converts to a RecurrenceRule object as follows:¶
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 |
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 object.¶
The following example illustrates how to convert the RRULE property:¶
DTSTART;TZID=Europe/Berlin:20240101T010000 RRULE:FREQ=YEARLY ;INTERVAL=2 ;BYMONTH=1 ;BYDAY=SU ;BYHOUR=8,9 ;BYMINUTE=30 ;UNTIL=20240930T120000Z
"recurrenceRule": { "@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"
The SEQUENCE property [RFC5545] (Section 3.8.7.4) in a VEVENT or VTODO component converts to the "sequence" property [jscalendarbis] (Section 4.1.7) of the Event or Task object.¶
The following example illustrates how to convert the SEQUENCE property:¶
SEQUENCE:3
"sequence": 3
The SHOW-WITHOUT-TIME property [icaljscalexts] (Section 4.2) in a VEVENT or VTODO component converts to the "showWithoutTime" property [jscalendarbis] (Section 4.2.4) of the Event or Task object. As outlined in the definition of the SHOW-WITHOUT-TIME property, the property MUST be ignored if the temporal value type of the VEVENT or VTODO component is DATE, or if the property value is "FALSE".¶
The following example illustrates how to convert the SHOW-WITHOUT-TIME property:¶
DTSTART;TZID=America/Chicago:20250521T080000 DURATION:PT12H SHOW-WITHOUT-TIME;VALUE=BOOLEAN:TRUE
"start": "2025-05-21T08:00:00", "timeZone": "America/Chicago", "duration": "PT12H", "showWithoutTime": true
The STATUS property [RFC5545] (Section 3.8.1.11) in a VEVENT component converts to the "status" property [jscalendarbis] (Section 5.1.3) of the Event object. The STATUS property in a VTODO component converts to the "progress" property [jscalendarbis] (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"
BEGIN:VTODO STATUS:IN-PROCESS ...
{ "@type": "Task", "progress": "in-process", "...": "" }
The SOURCE property [RFC7986] (Section 5.8) in a VCALENDAR component converts to the "source" property [jscalendarbis] (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 ...
{ "@type": "Group", "source": "https://example.com/holidays.ics", "...": "" }
The STYLED-DESCRIPTION property [RFC9073] (Section 6.5) in a PARTICIPANT, VLOCATION, VEVENT or VTODO component converts to the "description" property [jscalendarbis] (Section 4.2.2) of the Participant, Location, Event or Task object under the following conditions:¶
If these conditions are not met, implementations MAY preserve the property in the "iCalComponent" property (Section 5.1.1).¶
If the LANGUAGE parameter is set and the STYLED-DESCRIPTION property is set in a VEVENT or VTODO component, then the parameter value converts to the "locale" property of the Event or Task object, unless the SUMMARY or DESCRIPTION properties in the same component have the LANGUAGE parameter set.¶
Its parameters convert as follows:¶
Name | Reference | Property | Note |
---|---|---|---|
FMTTYPE | [RFC5545], Section 3.2.8 | descriptionContentType |
The following example illustrates how to convert the STYLED-DESCRIPTION property:¶
STYLED-DESCRIPTION;VALUE=TEXT;FMTTYPE=text/html: <!DOCTYPE html><html><body>hello\,<b>world</b></body></html>
"description": "<!DOCTYPE html><html><body>hello,<b>world</b></body></html>", "descriptionContentType": "text/html"
The SUMMARY property [RFC5545] (Section 3.8.1.12) in a VEVENT or VTODO component converts to the "title" property [jscalendarbis] (Section 4.2.1) of the Event or Task object. If the LANGUAGE parameter is set, then the parameter value converts to the "locale" property [jscalendarbis] (Section 4.2.9) of the same object.¶
The SUMMARY property [RFC5545] (Section 3.8.1.12) in a PARTICIPANT component converts to the "name" property [jscalendarbis] (Section 4.2.5).¶
The following examples illustrate how to convert the SUMMARY property:¶
SUMMARY:Birthday Party
"title": "Birthday Party"
SUMMARY;LANGUAGE=fr:Fête d'anniversaire
"title": "Fête d'anniversaire", "locale": "fr"
BEGIN:VEVENT BEGIN:PARTICIPANT SUMMARY:John ...
"participants": { "1": { "@type": "Participant", "name": "John", "...": "" } }
The TRANSP property [RFC5545] (Section 3.8.2.7) in a VEVENT or VTODO component converts to the "freeBusyStatus" property [jscalendarbis] (Section 4.4.2) of the Event or Task object.¶
Its values convert as follows:¶
iCalendar value | JSCalendar value |
---|---|
OPAQUE | busy |
TRANSPARENT | free |
The following example illustrates how to convert the TRANSP property:¶
TRANSP:TRANSPARENT
"freeBusyStatus": "free"
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 [jscalendarbis] (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], Section 3.2.14 | relativeTo | If VALUE=DURATION |
The following examples illustrate how to convert the TRIGGER property:¶
BEGIN:VEVENT ... BEGIN:VALARM TRIGGER;RELATED=END:PT5M ...
"alerts": { "2d": { "@type": "Alert", "trigger": { "@type": "OffsetTrigger", "offset": "PT5M", "relativeTo": "end" }, "...": "" } }
BEGIN:VEVENT ... BEGIN:VALARM TRIGGER;VALUE=DATE-TIME:20250302T010203Z ...
"alerts": { "14": { "@type": "Alert", "trigger": { "@type": "AbsoluteTrigger", "when": "2025-03-02T01:02:03Z" }, "...": "" } }
The UID property [RFC5545] (Section 3.8.4.7) in a VEVENT, VTODO, or VCALENDAR component converts to the "uid" property [jscalendarbis] (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"
The Alert object [jscalendarbis] (Section 4.5.2) converts to a VALARM component (Section 2.2.2). Its properties convert as follows:¶
Name | Reference | Property (or other) | See |
---|---|---|---|
acknowledged | [jscalendarbis], Section 4.5.2 | ACKNOWLEDGED | Section 2.3.1 |
action | [jscalendarbis], Section 4.5.2 | ACTION | Section 2.3.2 |
relatedTo | [jscalendarbis], Section 4.1.3 | RELATED-TO |
Section 2.3.35, and remarks below¶ |
trigger | [jscalendarbis], Section 4.5.2 | TRIGGER | Section 2.3.44 |
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.¶
The Event object [jscalendarbis] (Section 2.1) converts to a VEVENT component (Section 2.2.4), the Task object [jscalendarbis] (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 26 and Table 27 later in this section define how to convert properties specific to either Event or Task objects.¶
Name | Reference | Property (or other) | See |
---|---|---|---|
alerts | [jscalendarbis], Section 4.5.2 | VALARM (component) | Alert object (Section 3.1) |
categories | [jscalendarbis], Section 4.2.10 | CONCEPT | Section 2.3.9 |
color | [jscalendarbis], Section 4.2.11 | COLOR | Section 2.3.8 |
created | [jscalendarbis], Section 4.1.5 | CREATED | Section 2.3.12 |
description | [jscalendarbis], Section 4.2.2 | DESCRIPTION, or STYLED-DESCRIPTION |
Section 2.3.13, Section 2.3.41, and remarks below¶ |
descriptionContentType | [jscalendarbis], Section 4.2.3 | FMTTYPE (parameter) of STYLED-DESCRIPTION |
Section 2.3.41, and remarks below¶ |
freeBusyStatus | [jscalendarbis], Section 4.4.2 | TRANSP | |
keywords | [jscalendarbis], Section 4.2.9 | CATEGORIES | |
links | [jscalendarbis], Section 4.2.7 | ATTACH, or other | |
locale | [jscalendarbis], Section 4.2.9 | LANGUAGE (parameter) of either SUMMARY, or DESCRIPTION, or STYLED-DESCRIPTION (in order of preference) | |
locations | [jscalendarbis], Section 4.2.5 | LOCATION, GEO, or VLOCATION (component) | |
mainLocationId | [jscalendarbis], Section 4.2.6 | LOCATION | |
method | [jscalendarbis], Section 4.1.8 | METHOD of iCalendar object | |
organizerCalendarAddress | [jscalendarbis], Section 4.4.4 | ORGANIZER | |
participants | [jscalendarbis], Section 4.4.6 | ATTENDEE, or PARTICIPANT (component) | |
priority | [jscalendarbis], Section 4.4.1 | PRIORITY | |
privacy | [jscalendarbis], Section 4.4.3 | CLASS | |
prodId | [jscalendarbis], Section 4.1.4 | PRODID of iCalendar object | |
recurrenceId | [jscalendarbis], Section 4.3.1 | RECURRENCE-ID | |
recurrenceIdTimeZone | [jscalendarbis], Section 4.3.2 | TZID (parameter) of RECURRENCE-ID | |
recurrenceOverrides | [jscalendarbis], Section 4.3.5 | RDATE, EXDATE or recurrence override component | Section 2.1.2, and remarks below |
recurrenceRule | [jscalendarbis], Section 4.3.3 | RRULE | |
relatedTo | [jscalendarbis], Section 4.1.3 | RELATED-TO | |
sequence | [jscalendarbis], Section 4.1.7 | SEQUENCE | |
showWithoutTime | [jscalendarbis], Section 4.2.4 | SHOW-WITHOUT-TIME |
Section 2.3.38, and remarks below¶ |
start | [jscalendarbis], Section 4.7.2 | DTSTART | |
timeZone | [jscalendarbis], Section 4.7.1 | TZID (parameter) of DTSTART and DUE | |
title | [jscalendarbis], Section 4.2.1 | SUMMARY | |
uid | [jscalendarbis], Section 4.1.2 | UID | |
updated | [jscalendarbis], Section 4.1.6 | DTSTAMP, and LAST-MODIFIED | |
virtualLocations | [jscalendarbis], Section 4.2.6 | CONFERENCE |
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" member 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 "showWithoutTime" only converts to the SHOW-WITHOUT-TIME property under the following conditions: the property value is "true" and either the "timeZone" property value is not null or the time component is non-zero in the "start", "due" or "duration" property values.¶
Properties specific to the Event object type convert to iCalendar properties as follows:¶
Name | Reference | Property (or other) | See |
---|---|---|---|
duration | [jscalendarbis], Section 5.1.2 | DURATION, or DTEND | |
endTimeZone | [jscalendarbis], Section 5.1.3 | TZID parameter of DTEND | |
status | [jscalendarbis], Section 5.1.3 | STATUS |
Properties specific to the Task object type convert to iCalendar properties as follows:¶
Name | Reference | Property (or other) | See |
---|---|---|---|
due | [jscalendarbis], Section 5.2.1 | DUE | |
estimatedDuration | [jscalendarbis], Section 5.2.3 | ESTIMATED-DURATION | |
percentComplete | [jscalendarbis], Section 5.2.4 | PERCENT-COMPLETE | |
progress | [jscalendarbis], Section 5.2.5 | STATUS |
Other properties MAY be converted to JSPROP properties (Section 4.1.2) in the VEVENT or VTODO component.¶
The Group object [jscalendarbis] (Section 2.3) converts to a VCALENDAR component (Section 2.1.1). Its properties convert as follows:¶
Name | Reference | Property (or other) | See |
---|---|---|---|
categories | [jscalendarbis], Section 4.2.10 | CONCEPT | |
color | [jscalendarbis], Section 4.2.11 | COLOR | |
created | [jscalendarbis], Section 4.1.5 | CREATED | |
entries | [jscalendarbis], Section 5.3.1 | VEVENT or VTODO (component) |
Event and Task object (Section 3.2), and remarks below¶ |
keywords | [jscalendarbis], Section 4.2.9 | CATEGORIES | |
links | [jscalendarbis], Section 4.2.7 | ATTACH, or other | |
locale | [jscalendarbis], Section 4.2.9 | LANGUAGE (parameter) of either NAME, or DESCRIPTION (in order of preference) | |
prodId | [jscalendarbis], Section 4.1.4 | PRODID |
Section 2.3.32, and remarks below¶ |
source | [jscalendarbis], Section 5.3.2 | SOURCE | |
title | [jscalendarbis], Section 4.2.1 | NAME | |
uid | [jscalendarbis], Section 4.1.2 | UID | |
updated | [jscalendarbis], Section 4.1.6 | LAST-MODIFIED |
Remarks:¶
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.¶
The Link object [jscalendarbis] (Section 1.4.11) converts either an ATTACH property (Section 2.3.3) or an IMAGE property (Section 2.3.22). Which iCalendar property to choose is implementation-specific. As a guideline:¶
The href property converts to the "iCalendar" property value. The other Link properties convert as follows:¶
Name | Reference | Parameter (or other) | See |
---|---|---|---|
contentType | [jscalendarbis], Section 1.4.11 | FMTTYPE | Section 2.3.3 |
display | [jscalendarbis], Section 1.4.11 | DISPLAY | Section 2.3.22, and remarks below |
rel | [jscalendarbis], Section 1.4.11 | LINKREL | Section 6.1 of [RFC9253], and remarks below |
size | [jscalendarbis], Section 1.4.11 | SIZE | Section 2.3.3 |
title | [RFC7986], Section 6.4 | LABEL | Section 2.3.3 |
Remarks:¶
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.¶
The Location object [jscalendarbis] (Section 4.2.5) converts to either a LOCATION (Section 2.3.25), GEO (Section 2.3.21), or DTEND (Section 2.3.21) property, or it converts to a VLOCATION component (Section 2.2.5). Which iCalendar element to choose is implementation-specific. As a guideline:¶
Implementations MAY convert one of the Location objects to both a VLOCATION component and the LOCATION and GEO properties of the component that contains the VLOCATION component. In this case, the DERIVED parameter MUST be set on the LOCATION and GEO properties with value "TRUE".¶
The properties convert to a VLOCATION component as follows:¶
Name | Reference | Property (or other) | See |
---|---|---|---|
coordinates | [jscalendarbis], Section 4.2.5 | COORDINATES | Section 2.3.11, Section 2.3.21 |
description | [jscalendarbis], Section 4.2.5 | DESCRIPTION, or STYLED-DESCRIPTION | |
descriptionContentType | [jscalendarbis], Section 4.2.5 | FMTTYPE (parameter) of STYLED-DESCRIPTION | |
links | [jscalendarbis], Section 4.2.7 | ATTACH, or other | |
locationTypes | [jscalendarbis], Section 4.2.5 | LOCATION-TYPE | Section 2.3.26 |
name | [jscalendarbis], Section 4.2.5 | NAME | Section 2.3.28 |
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.¶
The Participant object [jscalendarbis] (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 calendarAddress [jscalendarbis] (Section 4.4.6) property is set.¶
It converts to a PARTICIPANT component if any of the Participant properties in Table 32 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.¶
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 other) | See |
---|---|---|---|
calendarAddress | [jscalendarbis], Section 4.4.6 | ATTENDEE | Section 2.3.4 |
delegatedFrom | [jscalendarbis], Section 4.4.6 | DELEGATED-FROM | Section 2.3.4 |
delegatedTo | [jscalendarbis], Section 4.4.6 | DELEGATED-TO | Section 2.3.4 |
[jscalendarbis], Section 4.4.6 | Section 2.3.4 | ||
expectReply | [jscalendarbis], Section 4.4.6 | RSVP | Section 2.3.4 |
kind | [jscalendarbis], Section 4.4.6 | CUTYPE | Section 2.3.4 |
memberOf | [jscalendarbis], Section 4.4.6 | MEMBER | Section 2.3.4 |
name | [jscalendarbis], Section 4.2.5 | CN | Section 2.3.4 |
participationStatus | [jscalendarbis], Section 4.4.6 | PARTSTAT | Section 2.3.4 |
progress | [jscalendarbis], Section 5.2.5 | PARTSTAT | Section 2.3.4, and remarks below |
roles | [jscalendarbis], Section 4.4.6 | ROLE | Section 2.3.4 |
sentBy | [jscalendarbis], Section 4.4.6 | SENT-BY | Section 2.3.4 |
Remarks:¶
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.¶
The progress property converts to the PARTSTAT parameter as outlined in Table 14.¶
The following Participant properties convert to the PARTICIPANT component:¶
Name | Reference | Property (or other) | See |
---|---|---|---|
description | [jscalendarbis], Section 4.4.5 | DESCRIPTION, or STYLED-DESCRIPTION |
Section 2.3.13, Section 2.3.41, and remarks below¶ |
descriptionContentType | [jscalendarbis], Section 4.4.5 | FMTTYPE (parameter) of STYLED-DESCRIPTION | |
links | [jscalendarbis], Section 4.2.7 | ATTACH, or other | |
name | [jscalendarbis], Section 4.2.5 | NAME | |
percentComplete | [jscalendarbis], Section 5.2.4 | PERCENT-COMPLETE |
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.¶
The VirtualLocation object [jscalendarbis] (Section 4.2.6) converts to a CONFERENCE property (Section 2.3.10). If the "description" property is set, then it also converts to a VCONFERENCE component (Section 2.2.3).¶
The "uri" property converts to the CONFERENCE property value. If the VirtualLocation object converts to a VCONFERENCE component, then the "uri" property also converts to the URI property of the VCONFERENCE component.¶
The following properties convert to parameters of the CONFERENCE property:¶
Name | Reference | Parameter (or other) | See |
---|---|---|---|
features | [jscalendarbis], Section 4.2.6 | FEATURE | Section 2.3.10 |
name | [jscalendarbis], Section 4.2.5 | LABEL | Section 2.3.10 |
The following properties convert to properties of the VCONFERENCE component:¶
Name | Reference | Property (or other) | See |
---|---|---|---|
description | [jscalendarbis], Section 4.2.7 | DESCRIPTION, or STYLED-DESCRIPTION | Section 2.3.13, Section 2.3.41 |
descriptionContenType | [jscalendarbis], Section 4.2.7 | FMTTYPE (parameter) of STYLED-DESCRIPTION | Section 2.3.41 |
Other properties MAY be converted to JSPROP properties (Section 4.1.2) of the VCONFERENCE component.¶
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 83).¶
The value of the JSID property MUST be a valid object key according to the definition of the JSCalendar property to which the component converts to.¶
This property is defined by the following notation:¶
jsid-prop = "JSID" *(";" other-param) ":" TEXT CRLF¶
The following example illustrates how to convert the JSID property set in a VALARM component.¶
BEGIN:VEVENT ... BEGIN:VALARM JSID:myalert1 ... END:VALARM
"@type": "Event", "alerts": { "myalert1": { "@type": "Alert", "...": "" } }
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 be the null value, and it SHOULD 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 [jscalendarbis] (Section 1.4.9): the JSPTR parameter of a JSPROP property corresponds to a key in the PatchObject, the property value corresponds to the JSON value for that key. When converting from iCalendar to JSCalendar, the PatchObject MUST only be applied after all other iCalendar elements of the component have been converted. Only new properties are allowed to be set, a JSON pointer in the PatchObject that points to an existing property MUST be ignored.¶
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) ; )¶
The following example illustrates how to convert a JSPROP property with a JSON boolean value¶
JSPROP;JSPTR="example.com:foo":true
"example.com:foo": true
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" }
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", "...": "" } }
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 JSID parameter (Section 4.2.1) on the ATTACH property ensures that the JSON path remains valid during conversion.¶
BEGIN:VEVENT ... ATTACH;JSID=mylink1:https://www.rfc-editor.org/rfc/rfc8984.html JSPROP;JSPTR="links/mylink1/example.com:foo":"bar" ...
"@type": "Event", "links": { "mylink1": { "@type": "Link", "example.com:foo": "bar", "...": "" } }
jsid-param = "JSID" "=" param-value¶
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 JSID 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 [jscalendarbis] (Section 1.4.1).¶
ATTACH;JSID=mylink1:https://example.com
"links": { "mylink1": { "@type": "Link", "href": "https://example.com" } }
jsptr-param = "JSPTR" "=" quoted-string¶
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.¶
JSPROP;JSPTR="example.com:foo":"bar"¶
For further examples, see Section 4.1.2.¶
ICalComponent
(optional)¶
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.¶
An ICalComponent object has the following properties:¶
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 [jscalendarbis]. 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.33).¶
The example in Figure 89 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.¶
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" ] ], [] ] ] }, "...": "" }
ICalProperty
(optional)¶
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:¶
The example in Figure 90 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
"links": { "l1": { "@type": "Link", "href": "https://example.com/example.jpg", "iCalProperty": { "@type": "ICalProperty", "name": "attach", "parameters": { "x-foo": "bar" } } } }
This section highlights iCalendar and JSCalendar elements for which no conversion rule to a standard element is defined in this document. This is informational and only complete at the time of publication of this document.¶
Implementations MAY choose to convert the following elements, for example using the properties defined in Section 4 and Section 5, or they might convert them to some vendor-specific extension properties. Later RFC documents might also define new standard elements and register them at IANA, either extending this list of inconvertible elements, or rather reduce it by introducing a standard element to convert to.¶
The following components do not convert to a standard element in JSCalendar:¶
The following components are defined to contain the listed properties. But these properties do not convert to a standard JSCalendar element.¶
The following components are defined to contain the listed subcomponents. But these subcomponents do not convert to a standard JSCalendar element.¶
The following properties convert to a standard JSCalendar element for some other value type, but they do not for the listed value types.¶
The following properties are defined to contain the listed parameters. But these parameters do not convert to a standard JSCalendar element.¶