diff options
Diffstat (limited to 'doc/rfc/rfc9555.txt')
-rw-r--r-- | doc/rfc/rfc9555.txt | 2862 |
1 files changed, 2862 insertions, 0 deletions
diff --git a/doc/rfc/rfc9555.txt b/doc/rfc/rfc9555.txt new file mode 100644 index 0000000..b1ac525 --- /dev/null +++ b/doc/rfc/rfc9555.txt @@ -0,0 +1,2862 @@ + + + + +Internet Engineering Task Force (IETF) M. Loffredo +Request for Comments: 9555 IIT-CNR/Registro.it +Updates: 6350 R. Stepanek +Category: Standards Track Fastmail +ISSN: 2070-1721 May 2024 + + + JSContact: Converting from and to vCard + +Abstract + + This document defines how to convert contact information between the + JSContact and vCard data formats. It defines conversion rules for + every JSContact and vCard element registered at IANA at the time of + publication. It also defines new JSContact properties as well as + vCard properties and parameters, to support converting arbitrary or + unknown JSContact and vCard elements. + +Status of This Memo + + This is an Internet Standards Track document. + + This document is a product of the Internet Engineering Task Force + (IETF). It represents the consensus of the IETF community. It has + received public review and has been approved for publication by the + Internet Engineering Steering Group (IESG). Further information on + Internet Standards is available in Section 2 of RFC 7841. + + Information about the current status of this document, any errata, + and how to provide feedback on it may be obtained at + https://www.rfc-editor.org/info/rfc9555. + +Copyright Notice + + Copyright (c) 2024 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. + + This document may contain material from IETF Documents or IETF + Contributions published or made publicly available before November + 10, 2008. The person(s) controlling the copyright in some of this + material may not have granted the IETF Trust the right to allow + modifications of such material outside the IETF Standards Process. + Without obtaining an adequate license from the person(s) controlling + the copyright in such materials, this document may not be modified + outside the IETF Standards Process, and derivative works of it may + not be created outside the IETF Standards Process, except to format + it for publication as an RFC or to translate it into languages other + than English. + +Table of Contents + + 1. Introduction + 1.1. Motivation + 1.2. Notational Conventions + 1.3. ABNF Notations + 2. Converting vCard to JSContact + 2.1. General Rules + 2.1.1. The Card uid Property + 2.1.2. Choosing Identifiers + 2.2. vCard Value Data Types + 2.2.1. BOOLEAN + 2.2.2. DATE, TIME, DATE-TIME, DATE-AND-OR-TIME, and TIMESTAMP + 2.2.3. INTEGER + 2.2.4. FLOAT + 2.2.5. LANGUAGE-TAG + 2.2.6. TEXT + 2.2.7. URI + 2.2.8. UTC-OFFSET + 2.3. vCard Parameters + 2.3.1. ALTID + 2.3.2. AUTHOR + 2.3.3. AUTHOR-NAME + 2.3.4. CALSCALE + 2.3.5. CC + 2.3.6. CREATED + 2.3.7. DERIVED + 2.3.8. GEO + 2.3.9. GROUP + 2.3.10. INDEX + 2.3.11. LANGUAGE + 2.3.12. LABEL + 2.3.13. LEVEL + 2.3.14. MEDIATYPE + 2.3.15. PHONETIC + 2.3.16. PID + 2.3.17. PREF + 2.3.18. PROP-ID + 2.3.19. SCRIPT + 2.3.20. SERVICE-TYPE + 2.3.21. SORT-AS + 2.3.22. TYPE + 2.3.23. TZ + 2.3.24. USERNAME + 2.3.25. VALUE + 2.4. General Properties + 2.4.1. BEGIN and END + 2.4.2. KIND + 2.4.3. SOURCE + 2.4.4. XML + 2.5. Identification Properties + 2.5.1. ANNIVERSARY, BDAY, BIRTHPLACE, DEATHDATE, and + DEATHPLACE + 2.5.2. FN + 2.5.3. GENDER + 2.5.4. GRAMGENDER and PRONOUNS + 2.5.5. N + 2.5.6. NICKNAME + 2.5.7. PHOTO + 2.6. Delivery Addressing Properties + 2.6.1. ADR + 2.7. Communications Properties + 2.7.1. EMAIL + 2.7.2. IMPP + 2.7.3. LANG + 2.7.4. LANGUAGE + 2.7.5. SOCIALPROFILE + 2.7.6. TEL + 2.8. Geographical Properties + 2.8.1. GEO + 2.8.2. TZ + 2.8.3. Combining Geographical Properties + 2.9. Organizational Properties + 2.9.1. CONTACT-URI + 2.9.2. LOGO + 2.9.3. MEMBER + 2.9.4. ORG + 2.9.5. RELATED + 2.9.6. TITLE and ROLE + 2.10. Personal Information Properties + 2.10.1. EXPERTISE + 2.10.2. HOBBY + 2.10.3. INTEREST + 2.10.4. ORG-DIRECTORY + 2.11. Explanatory Properties + 2.11.1. CATEGORIES + 2.11.2. CLIENTPIDMAP + 2.11.3. CREATED + 2.11.4. NOTE + 2.11.5. PRODID + 2.11.6. REV + 2.11.7. SOUND + 2.11.8. UID + 2.11.9. URL + 2.11.10. VERSION + 2.11.11. X-ABLabel + 2.12. Security Properties + 2.12.1. KEY + 2.13. Calendar Properties + 2.13.1. CALADRURI + 2.13.2. CALURI + 2.13.3. FBURL + 2.14. Extended Properties and Parameters + 2.15. New JSContact Properties + 2.15.1. vCardProps + 2.15.2. vCardParams + 2.15.3. vCardName + 3. Converting JSContact to vCard + 3.1. Conversion Rules + 3.1.1. Converting Unknown Properties + 3.2. New vCard Properties + 3.2.1. JSPROP + 3.3. New vCard Parameters + 3.3.1. JSCOMPS + 3.3.2. JSPTR + 4. Security Considerations + 5. IANA Considerations + 5.1. New vCard Property + 5.2. New vCard Parameter + 5.3. New JSContact Properties + 5.4. New JSContact Type + 6. References + 6.1. Normative References + 6.2. Informative References + Appendix A. Reverse Rules of Converting a vCard to a JSContact + Card + Acknowledgements + Authors' Addresses + +1. Introduction + +1.1. Motivation + + The JSContact data model and format [RFC9553] aims to be an + alternative to the widely used vCard standard [RFC6350] and jCard + format [RFC7095]. + + While applications might prefer JSContact to exchange contact card + data with other systems, they are likely to interoperate with + services and clients that only support vCard or jCard. Similarly, + existing contact data providers and consumers already using vCard or + jCard might also want to represent their contact data in JSContact. + + To achieve this, this document defines standard rules to convert + contact data between JSContact and vCard (and consequently jCard). + +1.2. 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. + +1.3. ABNF Notations + + The ABNF definitions in this document use the notations of [RFC5234]. + ABNF rules not defined in this document are defined in either + [RFC5234] (such as the ABNF for CRLF, WSP, DQUOTE, VCHAR, ALPHA, and + DIGIT) or [RFC6350]. + +2. Converting vCard to JSContact + + This section contains the conversion rules from the vCard to the + JSContact Card. It follows the same structure as vCard v4 [RFC6350]. + Properties and parameters of vCard extension RFCs, including those + described in "vCard Format Extension for JSContact" [RFC9554], have + been added to the appropriate subsections. + +2.1. General Rules + +2.1.1. The Card uid Property + + The UID property (Section 6.7.6 of [RFC6350]) in vCard is optional, + but the Card object's uid property (Section 2.1.9 of [RFC9553]) is + mandatory. Implementations that convert a vCard without a UID + property MUST generate a unique identifier as value for the uid + property. This value SHOULD be the same when converting the same + vCard multiple times, but how to achieve this is implementation- + specific. + +2.1.2. Choosing Identifiers + + Multivalued properties in JSContact are typically represented as a + JSON object where the object keys are of the Id type (Section 1.4.1 + of [RFC9553]) and the object values are the converted vCard property. + In the absence of the PROP-ID parameter (see Section 2.3.18), + implementations are free to choose any identifier as key for such + entries. Whatever identifier generation scheme implementations use, + they MUST generate values that are valid according to the definition + of the Id type in [RFC9553]. For example, this could be an + incrementing number across all identifier keys in the Card object or + only unique within one JSON object. + +2.2. vCard Value Data Types + +2.2.1. BOOLEAN + + The BOOLEAN type (Section 4.4 of [RFC6350]) converts to the JSContact + Boolean type (Section 1.3.2 of [RFC9553]). + +2.2.2. DATE, TIME, DATE-TIME, DATE-AND-OR-TIME, and TIMESTAMP + + The TIMESTAMP type (Section 4.3.5 of [RFC6350]) converts to the + UTCDateTime type (Section 1.4.5 of [RFC9553]), except for + anniversaries. For anniversaries, it converts to the Timestamp type + (Section 2.8.1 of [RFC9553]). + + The DATE type (Section 4.3.1 of [RFC6350]) converts to a PartialDate + object (Section 2.8.1 of [RFC9553]) when used for an anniversary, + unless the DATE value only contains a month or a day (but not both). + + The following temporal types do not convert to a JSContact datetime + type. Instead, vCard properties or parameters having such value + types convert as defined in Section 2.15. + + * TIME (Section 4.3.2 of [RFC6350]) + + * DATE-TIME (Section 4.3.3 of [RFC6350]) + + * DATE-AND-OR-TIME (Section 4.3.4 of [RFC6350]) + + * DATE type values that only define a month or day (but not both) + +2.2.3. INTEGER + + The INTEGER type (Section 4.5 of [RFC6350]) converts to the JSContact + Int and UnsignedInt types (Section 1.4.2 of [RFC9553]). + +2.2.4. FLOAT + + The FLOAT type (Section 4.6 of [RFC6350]) converts to the JSContact + Number type (Section 1.3.2 of [RFC9553]). + +2.2.5. LANGUAGE-TAG + + The LANGUAGE-TAG type (Section 4.8 of [RFC6350]) converts to the + JSContact String type (Section 1.3.2 of [RFC9553]). The value MUST + be a language tag as defined in [RFC5646]. + +2.2.6. TEXT + + The TEXT type (Section 4.1 of [RFC6350]) converts to the JSContact + String type (Section 1.3.2 of [RFC9553]). + +2.2.7. URI + + The URI type (Section 4.2 of [RFC6350]) converts to the JSContact + String type (Section 1.3.2 of [RFC9553]). The value MUST be a URI as + defined in Section 3 of [RFC3986] + +2.2.8. UTC-OFFSET + + The UTC-OFFSET type (Section 4.7 of [RFC6350]) either converts to a + String value containing an IANA Time Zone Database entry name (see + Section 2.8.2) or does not convert to any JSContact type. For the + latter, vCard properties or parameters having such values convert as + defined in Section 2.15. + +2.3. vCard Parameters + + This section contains the conversion rules for vCard parameters. A + rule typically applies only for specific vCard properties. To + convert a vCard parameter on an arbitrary vCard property, see + Section 2.15.2. + +2.3.1. ALTID + + The ALTID parameter (Section 5.4 of [RFC6350]) does not convert to an + IANA-registered property in JSContact, but several conversion rules + make use of this parameter to combine multiple vCard properties into + a single JSContact object instance. For an example of this, see + Section 2.6.1. To preserve the verbatim value of the ALTID + parameter, set the JSContact properties defined in Section 2.15. + +2.3.2. AUTHOR + + The AUTHOR parameter (Section 4.1 of [RFC9554]) on a NOTE property + converts to the Author object's uri property (Section 2.8.3 of + [RFC9553]). That Author object is set as the value of the Note + object's author property (Section 2.8.3 of [RFC9553]). + +2.3.3. AUTHOR-NAME + + The AUTHOR-NAME parameter (Section 4.2 of [RFC9554]) on a NOTE + property converts to the Author object's name property (Section 2.8.3 + of [RFC9553]). That Author object is set as the value of the Note + object's author property. + +2.3.4. CALSCALE + + The CALSCALE parameter (Section 5.8 of [RFC6350]) set on a BDAY, + DEATHDATE, or ANNIVERSARY property converts to the PartialDate + object's calendarScale property (Section 2.8.1 of [RFC9553]). + +2.3.5. CC + + The CC parameter (Section 3.1 of [RFC8605]) on an ADR property + converts to the Address object's countryCode property + (Section 2.5.1.1 of [RFC9553]). + +2.3.6. CREATED + + The CREATED parameter (Section 4.3 of [RFC9554]) on a NOTE property + converts to the Note object's created property (Section 2.8.3 of + [RFC9553]). + +2.3.7. DERIVED + + The DERIVED parameter (Section 4.4 of [RFC9554]) does not convert to + JSContact. If the DERIVED parameter is set to "true" on a vCard + property, then implementations MAY choose not to convert that + property. + +2.3.8. GEO + + The GEO parameter (Section 5.10 of [RFC6350]) set on an ADR property + converts to the Address object's coordinates property + (Section 2.5.1.1 of [RFC9553]). + +2.3.9. GROUP + + The GROUP parameter (Section 7.1 of [RFC7095]) does not convert to + JSContact. It exclusively is for use in jCard and MUST NOT be set in + a vCard. + + Preserving the exact group name when converting from vCard to + JSContact and back to vCard is not necessary. Any group identifiers + will do, as long as the resulting vCard groups its properties equally + to the original vCard. Implementations that still wish to preserve + the exact property group name of a vCard property MAY set the jCard + "group" parameter in the JSContact properties vCardProps or + vCardParams as defined in Section 2.15. + + item1.TEL;VALUE=uri:tel:+1-555-555-5555 + "phones": { + "p1": { + "number": "tel:+1-555-555-5555", + "vCardParams" : { + "group" : "item1" + } + } + } + + Figure 1: Example of How to Preserve the Group Name in + vCardParams during Conversion + + item2.X-FOO:bar + "vCardProps": [ + ["x-foo", { + "group": "item2" + }, "unknown", "bar"] + ] + + Figure 2: Example of How to Preserve the Group Name in vCardProps + during Conversion + +2.3.10. INDEX + + The INDEX parameter (Section 3.1 of [RFC6715]) set on the EXPERTISE, + HOBBY, INTEREST, and ORG-DIRECTORY properties converts to the + PersonalInfo (Section 2.8.4 of [RFC9553]) and Directory + (Section 2.6.2 of [RFC9553]) objects' listAs property. + +2.3.11. LANGUAGE + + The LANGUAGE parameter (Section 5.1 of [RFC6350]) converts to an + entry in the Card object's localizations property (Section 2.7.1 of + [RFC9553]) for that vCard property on which this parameter is set on. + The value of the LANGUAGE parameter defines the language tag key in + the localizations property. + + This specification does not define a single standard conversion rule + for how to convert the property values. Instead, building the + localizations value is implementation-specific. + + Two options to populate the localizations property are: + + * One Patch per Property: For each vCard property with a LANGUAGE + parameter, set the complete path in the PatchObject to the + JSContact property that the vCard property converts to. The value + of the patch is the converted property value. This is simple to + process and adequate if the vCard only contains a few properties + with the LANGUAGE parameter. + + * Bundle Patches by Parent: If a PatchObject contains multiple paths + that have the same parent paths, then it might be possible to + combine these patches into one patch that patches the parent + property. This is possible if the property in the Card is patched + in its entirety. + + Generally, localizations only localize properties that are present in + the non-localized version of this Card. Figure 3 illustrates this. + + FN;LANGUAGE=EN:John Doe + TITLE;ALTID=1;LANGUAGE=EN:Boss + TITLE;ALTID=1;LANGUAGE=fr:Patron + "language": "en", + "name": { + "full": "John Doe" + }, + "titles": { + "t1": { + "name": "Boss" + } + }, + "localizations": { + "fr": { + "titles/t1/name": "Patron" + } + } + + Figure 3: LANGUAGE Conversion Example: One Dominant Language + + As a special case, if one or more vCard properties of the same type + do not have the LANGUAGE parameter set, add them to the non-localized + Card. Convert any with LANGUAGE parameters to the localizations + property. Figure 4 illustrates this. + + FN:John Doe + TITLE;ALTID=1:Boss + TITLE;ALTID=1;LANGUAGE=fr:Patron + "name": { + "full": "John Doe" + }, + "titles": { + "t1": { + "name": "Boss" + } + }, + "localizations": { + "fr": { + "titles/t1/name": "Patron" + } + } + + Figure 4: LANGUAGE Conversion Example: Property without Language + +2.3.12. LABEL + + The LABEL parameter (Section 6.3.1 of [RFC6350]) on an ADR property + converts to the Address object's full property (Section 2.5.1.1 of + [RFC9553]). + +2.3.13. LEVEL + + The LEVEL parameter (Section 3.2 of [RFC6715]) converts to the + PersonalInfo object's level property (Section 2.8.4 of [RFC9553]). + If this parameter is set on the EXPERTISE property, then its values + convert as follows: + + * "beginner" converts to "low"; + * "average" converts to "medium"; and + * "expert" converts to "high". + + In all other cases, the values convert verbatim, but lowercase MUST + be used for the JSContact value. + +2.3.14. MEDIATYPE + + The MEDIATYPE parameter (Section 5.7 of [RFC6350]) converts to the + Resource object's mediaType property (Section 1.4.4 of [RFC9553]). + +2.3.15. PHONETIC + + The PHONETIC parameter (Section 4.6 of [RFC9554]) converts to the + Name (Section 2.2.1 of [RFC9553]) and Address (Section 2.5.1 of + [RFC9553]) objects' phoneticSystem property unless the parameter + value is "script", in which case the phoneticSystem property is not + set. + + The value of the SCRIPT parameter converts to the phoneticScript + property (see Section 2.3.19). + + The related N or ADR property is defined by the vCard ALTID + parameter. The conversion rules for the N (Section 2.5.5) and ADR + (Section 2.6.1) properties define how the vCard components convert to + JSContact. + + The component values of the property on which the PHONETIC parameter + is set convert to the respective NameComponent or AddressComponent + objects' phonetic properties. + + If more than one property has the PHONETIC parameter set and relates + to the same property, then they convert to the Card object's + localizations property according to their LANGUAGE parameter values + as outlined in Section 2.3.11. + + LANGUAGE=zh-Hant + N;ALTID=1;LANGUAGE=zh-Hant:孫;中山;文,逸仙;; + N;ALTID=1;PHONETIC=jyut; + SCRIPT=Latn;LANGUAGE=yue:syun1;zung1saan1;man4,jat6sin1;; + "language": "zh-Hant", + "name": { + "components": [ + { "kind": "surname", "value": "孫" }, + { "kind": "given", "value": "中山" }, + { "kind": "given2", "value": "文" }, + { "kind": "given2", "value": "逸仙" } + ] + }, + "localizations": { + "yue": { + "name/phoneticSystem": "jyut", + "name/phoneticScript": "Latn", + "name/components/0/phonetic": "syun1", + "name/components/1/phonetic": "zung1saan1", + "name/components/2/phonetic": "man4", + "name/components/3/phonetic": "jat6sin1" + } + } + + Figure 5: PHONETIC Conversion Example + +2.3.16. PID + + The PID parameter (Section 5.5 of [RFC6350]) converts to the + vCardParams property; see Section 2.15.2. + +2.3.17. PREF + + The PREF parameter (Section 5.3 of [RFC6350]) converts to the pref + property of the derived JSContact object. + +2.3.18. PROP-ID + + The PROP-ID parameter (Section 4.7 of [RFC9554]) converts to the Id- + typed key of the derived JSContact object. + + TEL;PROP-ID=PHONE-A;VALUE=uri;PREF=1;TYPE="voice,home" + :tel:+1-555-555-5555;ext=5555 + TEL;PROP-ID=PHONE-B;VALUE=uri;TYPE=home + :tel:+33-01-23-45-67 + "phones": { + "PHONE-A": { + "contexts": { "private": true }, + "features": { "voice": true }, + "number": "tel:+1-555-555-5555;ext=5555", + "pref": 1 + }, + "PHONE-B": { + "contexts": { "private": true }, + "number": "tel:+33-01-23-45-67" + } + } + + Figure 6: PROP-ID Conversion Example + +2.3.19. SCRIPT + + The SCRIPT parameter (Section 4.8 of [RFC9554]) converts to the Name + (Section 2.2.1 of [RFC9553]) or Address (Section 2.5.1 of [RFC9553]) + objects' phoneticScript property. + + Also see Section 2.3.15. + +2.3.20. SERVICE-TYPE + + The SERVICE-TYPE parameter (Section 4.9 of [RFC9554]) converts to the + OnlineService object's service property (Section 2.3.2 of [RFC9553]). + +2.3.21. SORT-AS + + The SORT-AS parameter (Section 5.9 of [RFC6350]) converts to the + Name, Organization, and OrgUnit objects' sortAs properties. + +2.3.22. TYPE + + The TYPE parameter (Section 5.6 of [RFC6350]) converts to either the + contexts property or the kind property, as defined in later sections. + If not otherwise specified, the vCard "home" and "work" parameter + values convert to the JSContact "private" and "work" contexts, + respectively. + +2.3.23. TZ + + The TZ parameter (Section 5.11 of [RFC6350]) on an ADR property + converts to the Address object's timeZone property (Section 2.5.1.1 + of [RFC9553]). Also see the conversion of the TZ property in + Section 2.8.2. + +2.3.24. USERNAME + + The USERNAME parameter (Section 4.10 of [RFC9554]) converts to the + OnlineService object's user property (Section 2.3.2 of [RFC9553]). + +2.3.25. VALUE + + The VALUE parameter (Section 5.2 of [RFC6350]) does not convert to an + IANA-registered property in JSContact. To preserve properties with + experimental values, see Sections 2.15.1 and 2.15.2. + +2.4. General Properties + +2.4.1. BEGIN and END + + The BEGIN and END properties do not convert to IANA-registered + properties in JSContact. + +2.4.2. KIND + + The KIND property (Section 6.1.4 of [RFC6350]) converts to the kind + property (Figure 7). Allowed values are those described in + Section 6.1.4 of [RFC6350] and extended with the values declared in + [RFC6473] and [RFC6869]. + + KIND:individual + "kind": "individual" + + Figure 7: KIND Conversion Example + +2.4.3. SOURCE + + The SOURCE property (Section 6.1.3 of [RFC6350]) converts to a + Directory object (Section 2.6.2 of [RFC9553]) in the Card object's + directories property (Figure 8). The Directory object's kind + property is set to "entry". The uri property is set to the SOURCE + property value. + + The PREF and MEDIATYPE parameters convert according to the rules + defined in Section 2.3. + + SOURCE:https://dir.example.com/addrbook/jdoe/Jean%20Dupont.vcf + "directories": { + "ENTRY-1": { + "kind": "entry", + "uri": "https://dir.example.com/addrbook/jdoe/Jean%20Dupont.vcf" + } + } + + Figure 8: SOURCE Conversion Example + +2.4.4. XML + + The XML property (Section 6.1.5 of [RFC6350]) converts to the + vCardProps property; see Section 2.15.1. + +2.5. Identification Properties + +2.5.1. ANNIVERSARY, BDAY, BIRTHPLACE, DEATHDATE, and DEATHPLACE + + The following properties all convert to Anniversary objects in the + Card object's anniversaries property (Figure 9): + + * ANNIVERSARY (Section 6.2.6 of [RFC6350]) + * BDAY (Section 6.2.5 of [RFC6350]) + * BIRTHPLACE (Section 2.1 of [RFC6474]) + * DEATHDATE (Section 2.3 of [RFC6474]) + * DEATHPLACE (Section 2.2 of [RFC6474]) + + BDAY and BIRTHPLACE convert to an Anniversary object (Section 2.8.1 + of [RFC9553]) having the date and place properties set. The kind + property is set to "birth". + + DEATHDATE and DEATHPLACE convert to an Anniversary object having the + date and place properties set. The Anniversary object's kind + property is set to "death". + + ANNIVERSARY converts to the Anniversary object's date property. The + Anniversary object's kind property is set to "wedding". + + If the BIRTHPLACE or DEATHPLACE property value is of type URI using + the "geo:" URI scheme, then it converts to the Address object's + coordinates property. If the value type is TEXT, then it converts to + the Address object's full property. Otherwise, it converts to the + vCardProps property; see Section 2.15.1. + + The ALTID and LANGUAGE parameters of both the BIRTHPLACE and + DEATHPLACE properties convert according to the rules defined in + Section 2.3. + + BDAY:19531015T231000Z + BIRTHPLACE: + 123 Main Street\nAny Town, CA 91921-1234\nU.S.A. + DEATHDATE:19960415 + DEATHPLACE: + 5 Court Street\nNew England, ND 58647\nU.S.A. + ANNIVERSARY:19860201 + "anniversaries": { + "ANNIVERSARY-1" : { + "kind": "birth", + "date": { + "@type": "Timestamp", + "utc": "1953-10-15T23:10:00Z" + }, + "place": { + "full": + "123 Main Street\nAny Town, CA 91921-1234\nU.S.A." + } + }, + "ANNIVERSARY-2" : { + "kind": "death", + "date": { + "year": 1996, + "month": 4, + "year": 15 + }, + "place": { + "full": "5 Court Street\nNew England, ND 58647\nU.S.A." + } + }, + "ANNIVERSARY-3" : { + "kind": "wedding", + "date": { + "year": 1986, + "month": 2, + "day": 1 + } + } + } + + Figure 9: ANNIVERSARY, BDAY, BIRTHPLACE, DEATHDATE, and + DEATHPLACE Conversion Example + +2.5.2. FN + + The FN property (Section 6.2.1 of [RFC6350]) converts to the Name + object's full property (Figure 10). If the LANGUAGE parameter is + set, then the FN property converts as outlined in Section 2.3.11. In + the unexpected case where the vCard contains more than one FN + property without the LANGUAGE parameter, convert the FN property that + has the least parameters. If multiple such FN properties are + present, choose any of them. All other FN properties convert to the + vCardProps (Section 2.15.1) property. + + FN:John Q. Public, Esq. + "name": { + "full": "John Q. Public, Esq." + } + + Figure 10: FN Conversion Example + +2.5.3. GENDER + + The GENDER property (Section 6.2.7 of [RFC6350]) does not convert to + an IANA-registered property in JSContact. To convert this property, + see Section 2.15.1. Alternatively, the Card object's speakToAs + property defines how to address and refer to an individual + represented by the Card, as do the newly defined vCard GRAMGENDER and + PRONOUNS properties of [RFC9554]. + +2.5.4. GRAMGENDER and PRONOUNS + + The GRAMGENDER property (Section 3.2 of [RFC9554]) converts to the + SpeakToAs object's grammaticalGender property (Figure 11). + + The PRONOUNS property (Section 3.4 of [RFC9554]) converts to the + SpeakToAs object's pronouns property (Figure 11). + + GRAMGENDER:NEUTER + PRONOUNS;PREF=2:they/them + PRONOUNS;PREF=1:xe/xir + "speakToAs": { + "grammaticalGender": "neuter", + "pronouns": { + "PRONOUNS-1": { + "pronouns": "they/them", + "pref": 2 + }, + "PRONOUNS-2": { + "pronouns": "xe/xir", + "pref": 1 + } + } + } + + Figure 11: GRAMGENDER and PRONOUNS Conversion Example + +2.5.5. N + + The N property (Section 6.2.2 of [RFC6350]) converts to a Name object + (Section 2.2.1 of [RFC9553]) in the Card object's name property. + Each component in the N property structured value converts to a + NameComponent in the Name object's components property. The + following table shows this relation: + + +============+===============+==============================+ + | N | NameComponent | Remarks | + | component | kind | | + +============+===============+==============================+ + | Family | surname | To vCard: add any "surname2" | + | name | | NameComponent to the Family | + | | | name component, after all | + | | | "surname" values. | + | | | From vCard: ignore any value | + | | | that also occurs in the | + | | | Secondary surname component. | + +------------+---------------+------------------------------+ + | Given name | given | | + +------------+---------------+------------------------------+ + | Additional | given2 | | + | name | | | + +------------+---------------+------------------------------+ + | Honorific | title | | + | prefix | | | + +------------+---------------+------------------------------+ + | Honorific | credential | To vCard: add any | + | suffix | | "generation" NameComponent | + | | | to the Honorific suffix | + | | | component. | + | | | From vCard: ignore any value | + | | | that also occurs in the | + | | | Generation component. | + +------------+---------------+------------------------------+ + | Secondary | surname2 | | + | surname | | | + +------------+---------------+------------------------------+ + | Generation | generation | | + +------------+---------------+------------------------------+ + + Table 1: N Components Conversion + + If the JSCOMPS (Section 3.3.1) parameter is set, then the Name + object's isOrdered property value is "true", and the defaultSeparator + property and any "separator" NameComponent objects are set according + to the parameter value. The order in the components property MUST + adhere to the order of the JSCOMPS parameter value. + + If the JSCOMPS parameter is not set, then the Name object's isOrdered + property value is "false", and the defaultSeparator property MUST NOT + be set. The order in the components property MUST follow the order + of values in the N structured value when read from left to right. + + If the SORT-AS parameter is set, then its structured value converts + to the Name object's sortAs property according to Table 1. An empty + or non-existent component value indicates that no sort is defined for + this kind. + + N;SORT-AS="Stevenson,John Philip": + Stevenson;John;Philip,Paul;Dr.;Jr.,M.D.,A.C.P.;;Jr. + "name": { + "components":[ + { "kind": "surname", "value": "Stevenson" }, + { "kind": "given", "value": "John" }, + { "kind": "given2", "value": "Philip" }, + { "kind": "given2", "value": "Paul" }, + { "kind": "title", "value": "Dr." }, + { "kind": "credential", "value": "M.D." }, + { "kind": "credential", "value": "A.C.P." }, + { "kind": "generation", "value": "Jr." } + ], + "sortAs": { + "surname": "Stevenson", + "given": "John Philip" + } + } + + Figure 12: N Conversion Example + + See Section 3.3.1 for examples of using the JSCOMPS parameter for + vCard-structured property values. + +2.5.6. NICKNAME + + The NICKNAME property (Section 6.2.3 of [RFC6350]) converts to a + Nickname object (Section 2.2.2 of [RFC9553]) in the Card object's + nicknames property (Figure 13). The name property is set to the + NICKNAME property value. + + The PREF and TYPE parameters convert according to the rules defined + in Section 2.3. + + NICKNAME:Johnny + "nicknames": { + "NICK-1": { + "name": "Johnny" + } + } + + Figure 13: NICKNAME Conversion Example + +2.5.7. PHOTO + + The PHOTO property (Section 6.2.4 of [RFC6350]) converts to a Media + object (Section 2.6.4 of [RFC9553]) in the Card object's media + property (Figure 14). The Media object's kind property is set to + "photo" and the uri property is set to the PHOTO value. + + The PREF and MEDIATYPE parameters convert according to the rules + defined in Section 2.3. + + PHOTO:https://www.example.com/pub/photos/jqpublic.gif + "media": { + "PHOTO-1": { + "kind": "photo", + "uri": "https://www.example.com/pub/photos/jqpublic.gif" + } + } + + Figure 14: PHOTO Conversion Example + +2.6. Delivery Addressing Properties + +2.6.1. ADR + + The ADR property (Section 6.3.1 of [RFC6350]) converts to an Address + object (Section 2.5.1.1 of [RFC9553]) in the Card object's addresses + property. Each component in the ADR-structured property value + converts to an AddressComponent in the Address object's components + property. + + [RFC9554] defines new components for the ADR property. + Implementations SHOULD set these new components, even if all their + values are the empty string. + + The following table shows how the ADR component and AddressComponent + kind relate: + + +=============+==================+===============================+ + | ADR | AddressComponent | Remarks | + | component | kind | | + +=============+==================+===============================+ + | post office | postOfficeBox | [RFC6350] recommends that | + | box | | this component not be set, | + | | | but this is now disputable | + | | | given the new components. | + | | | Instead, set this component | + | | | and use the new ADR value | + | | | format defined in [RFC9554]. | + +-------------+------------------+-------------------------------+ + | extended | apartment | To vCard: set the values of | + | address | | the following components: | + | | | | + | | | * room | + | | | | + | | | * floor | + | | | | + | | | * apartment | + | | | | + | | | * building | + | | | | + | | | From vCard: ignore if the ADR | + | | | structured value is of the | + | | | format defined in [RFC9554]. | + | | | Otherwise, convert to | + | | | "apartment". | + +-------------+------------------+-------------------------------+ + | street | name | To vCard: set the values of | + | address | | the following components: | + | | | | + | | | * number | + | | | | + | | | * name | + | | | | + | | | * block | + | | | | + | | | * direction | + | | | | + | | | * landmark | + | | | | + | | | * subdistrict | + | | | | + | | | * district | + | | | | + | | | From vCard: ignore if the ADR | + | | | structured value is of the | + | | | format defined in [RFC9554]. | + | | | Otherwise, convert to "name". | + +-------------+------------------+-------------------------------+ + | locality | locality | | + +-------------+------------------+-------------------------------+ + | region | region | | + +-------------+------------------+-------------------------------+ + | postal code | postcode | | + +-------------+------------------+-------------------------------+ + | apartment | apartment | Defined in [RFC9554]. | + +-------------+------------------+-------------------------------+ + | block | block | Defined in [RFC9554]. | + +-------------+------------------+-------------------------------+ + | building | building | Defined in [RFC9554]. | + +-------------+------------------+-------------------------------+ + | direction | direction | Defined in [RFC9554]. | + +-------------+------------------+-------------------------------+ + | district | district | Defined in [RFC9554]. | + +-------------+------------------+-------------------------------+ + | floor | floor | Defined in [RFC9554]. | + +-------------+------------------+-------------------------------+ + | landmark | landmark | Defined in [RFC9554]. | + +-------------+------------------+-------------------------------+ + | room | room | Defined in [RFC9554]. | + +-------------+------------------+-------------------------------+ + | street | number | Defined in [RFC9554]. | + | number | | | + +-------------+------------------+-------------------------------+ + | subdistrict | subdistrict | Defined in [RFC9554]. | + +-------------+------------------+-------------------------------+ + + Table 2: ADR Components Conversion + + If the JSCOMPS (Section 3.3.1) parameter is set, then the Address + object's isOrdered property value is "true", and the defaultSeparator + property and any separator name components are set according to the + parameter value. The order in the components property MUST adhere to + the order of the JSCOMPS parameter value. + + If the JSCOMPS parameter is not set, then the Address object's + isOrdered property value is "false", and the defaultSeparator + property MUST NOT be set. The order in the components property MUST + follow the order of values in the ADR structured value when read from + left to right. + + The LABEL parameter converts to the Address object's full + property. + + The GEO parameter converts to the Address object's coordinates + property. + + The TZ parameter converts to the Address object's timeZone + property. + + The CC parameter converts to the Address object's countryCode + property. + + The PREF and TYPE parameters convert according to the rules defined + in Section 2.3. The ADR-specific values of the TYPE parameter + defined in Sections 5.1 and 5.2 of [RFC9554] convert to the + corresponding entries of the contexts property as defined in + Section 2.5.1 of [RFC9553]. + + The ALTID and LANGUAGE parameters convert according to the rules + defined in Section 2.3. Each possible language-dependent alternative + converts to an entry of the PatchObject where the key references the + full property. + + ADR;TYPE=work;CC=US: + ;;54321 Oak St;Reston;VA;20190;USA;;;;54321;Oak St;;;;;; + "addresses": { + "ADDR-1" : { + "contexts": { "work": true }, + "components": [ + { "kind": "number", "value": "54321" }, + { "kind": "name", "value": "Oak St" }, + { "kind": "locality", "value": "Reston" }, + { "kind": "region", "value": "VA" }, + { "kind": "postcode", "value": "20190" }, + { "kind": "country", "value": "USA" } + ], + "countryCode": "US" + } + } + + Figure 15: ADR Conversion Example + + See Section 3.3.1 for examples of using the JSCOMPS parameter for + vCard-structured property values. + +2.7. Communications Properties + +2.7.1. EMAIL + + The EMAIL property (Section 6.4.2 of [RFC6350]) converts to an + EmailAddress object (Section 2.3.1 of [RFC9553]) in the Card object's + emails property (Figure 16). The EmailAddress object's address + property is set to the EMAIL value. + + The PREF and TYPE parameters convert according to the rules defined + in Section 2.3. + + EMAIL;TYPE=work:jqpublic@xyz.example.com + EMAIL;PREF=1:jane_doe@example.com + "emails": { + "EMAIL-1": { + "contexts": { "work": true }, + "address": "jqpublic@xyz.example.com" + }, + "EMAIL-2": { + "address": "jane_doe@example.com", + "pref": 1 + } + } + + Figure 16: EMAIL Conversion Example + +2.7.2. IMPP + + The IMPP property (Section 6.4.3 of [RFC6350]) converts to an + OnlineService object (Section 2.3.2 of [RFC9553]) in the Card + object's onlineServices property (Figure 17). The vCardName property + is set to "impp", and the uri property is set to the IMPP value. + + The SERVICE-TYPE, USERNAME, PREF, and TYPE parameters convert + according to the rules defined in Section 2.3. + + IMPP;PREF=1:xmpp:alice@example.com + "onlineServices": { + "OS-1": { + "uri": "xmpp:alice@example.com", + "pref": 1, + "vCardName": "impp" + } + } + + Figure 17: IMPP Conversion Example + +2.7.3. LANG + + The LANG property (Section 6.4.4 of [RFC6350]) converts to a + LanguagePref object (Section 2.3.4 of [RFC9553]) in the Card object's + preferredLanguages property (Figure 18). The LANG property value + converts to the LanguagePref object's language property value. + + The PREF and TYPE parameters convert according to the rules defined + in Section 2.3. + + LANG;TYPE=work;PREF=1:en + LANG;TYPE=work;PREF=2:fr + LANG;TYPE=home:fr + "preferredLanguages": { + "LANG-1": { + "language": "en", + "contexts": { "work": true }, + "pref": 1 + }, + "LANG-2": { + "language": "fr", + "contexts": { "work": true }, + "pref": 2 + }, + "LANG-3": { + "language": "fr", + "contexts": { "private": true } + } + } + + Figure 18: LANG Conversion Example + +2.7.4. LANGUAGE + + The LANGUAGE property (Section 3.3 of [RFC9554]) converts to the Card + object's language property (Figure 19). + + LANGUAGE:de-AT + "language": "de-AT" + + Figure 19: LANGUAGE Conversion Example + +2.7.5. SOCIALPROFILE + + The SOCIALPROFILE property (Section 3.5 of [RFC9554]) converts to an + OnlineService object (Section 2.3.2 of [RFC9553]) in the Card + object's onlineServices property (Figure 20). The vCardName property + is set to "socialprofile", or it can be omitted. If the + SOCIALPROFILE property value is of type URI, then the OnlineService + object's uri property is set; otherwise, the user property is set. + + The SERVICE-TYPE, USERNAME, PREF, and TYPE parameters convert + according to the rules defined in Section 2.3. + + SOCIALPROFILE;SERVICE-TYPE=Mastodon:https://example.com/@foo + "onlineServices": { + ... + "OS-1": { + "service": "Mastodon", + "uri": "https://example.com/@foo" + } + } + + Figure 20: SOCIALPROFILE Conversion Example + +2.7.6. TEL + + The TEL property (Section 6.4.1 of [RFC6350]) converts to a Phone + object (Section 2.3.3 of [RFC9553]) in the Card object's phones + property (Figure 21). + + The TEL-specific values of the TYPE parameter convert to the features + property keys as outlined in Table 3. Note that Section 6.4.1 of + [RFC6350] defines the default type to be "voice", but the default + Phone features property is absent by default. Accordingly, an + implementation SHOULD only set the Phone object's features property + if the TEL property actually has a TEL-specific TYPE parameter set. + + +=============+===============+ + | TYPE value | Phone feature | + +=============+===============+ + | cell | mobile | + +-------------+---------------+ + | fax | fax | + +-------------+---------------+ + | main-number | main-number | + +-------------+---------------+ + | pager | pager | + +-------------+---------------+ + | text | text | + +-------------+---------------+ + | textphone | textphone | + +-------------+---------------+ + | video | video | + +-------------+---------------+ + | voice | voice | + +-------------+---------------+ + + Table 3: TEL TYPE Conversion + + The value of the TEL property converts to the Phone object's number + property. + + The PREF and TYPE parameters convert according to the rules defined + in Section 2.3. + + TEL;VALUE=uri;PREF=1;TYPE="voice,home":tel:+1-555-555-5555;ext=5555 + TEL;VALUE=uri;TYPE=home:tel:+33-01-23-45-67 + "phones": { + "PHONE-1": { + "contexts": { "private": true }, + "features": { "voice": true }, + "number": "tel:+1-555-555-5555;ext=5555", + "pref": 1 + }, + "PHONE-2": { + "contexts": { "private": true }, + "number": "tel:+33-01-23-45-67" + } + } + + Figure 21: TEL Conversion Example + +2.8. Geographical Properties + +2.8.1. GEO + + The GEO property (Section 6.5.2 of [RFC6350]) converts to the Address + object's coordinates property (Section 2.5.1 of [RFC9553]). Also see + Section 2.8.3 to determine which Address object instance to convert + to. + +2.8.2. TZ + + The TZ property (Section 6.5.1 of [RFC6350]) converts an Address + object (Section 2.5.1 of [RFC9553]) in the Card object's addresses + property. + + A value of type TEXT converts to the Address object's timeZone + property. + + A value of type UTC-OFFSET converts to the Address object's timeZone + property if the offset has zero minutes and the hour offset is + between -12 and +14, both inclusively. Note that: + + * If the hour offset is zero, use the time zone name "Etc/UTC". + + * Otherwise, construct the time zone name with "Etc/GMT" suffixed + with the string representation of the reversed sign hour offset, + including the sign but excluding leading zeros and minutes. For + example, the UTC offset value "-0500" converts to "Etc/GMT+5". + + For such property values, also see Section 2.8.3 to determine which + Address object instance to convert to. + + Any other value of type UTC-OFFSET or URI does not convert to an + IANA-registered property in JSContact. To convert such property, see + Section 2.15.1. + +2.8.3. Combining Geographical Properties + + In vCard, the properties ADR, GEO, and TZ occur independently of each + other. In JSContact, they all convert to properties of an Address + object. It is implementation-specific if these vCard properties + convert to _separate_ address instances in JSContact or if some or + all of them convert to the _same_ address. That being said, + implementations MUST convert the properties to the _same_ address for + the following cases: + + * The GROUP parameter values of the properties match. + + * The GROUP parameters are not set, but they are set on any other + ADR, GEO, and TZ properties. + +2.9. Organizational Properties + +2.9.1. CONTACT-URI + + The CONTACT-URI property (Section 2.1 of [RFC8605]) converts to a + Link object (Section 2.6.3 of [RFC9553]) in the Card object's links + property (Figure 22). The Link object's kind property is set to + "contact" and the uri property is set to the CONTACT-URI property + value. + + The PREF and TYPE parameters convert according to the rules defined + in Section 2.3. + + CONTACT-URI;PREF=1:mailto:contact@example.com + "links": { + "CONTACT-1": { + "kind": "contact", + "uri": "mailto:contact@example.com", + "pref": 1 + } + } + + Figure 22: CONTACT-URI Conversion Example + +2.9.2. LOGO + + The LOGO property (Section 6.6.3 of [RFC6350]) converts to a Media + object (Section 2.6.4 of [RFC9553]) in the Card object's media + property (Figure 23). The Media object's kind property is set to + "logo" and the uri property is set to the LOGO property value. + + The PREF and TYPE parameters convert according to the rules defined + in Section 2.3. + + LOGO:https://www.example.com/pub/logos/abccorp.jpg + "media": { + "LOGO-1": { + "kind": "logo", + "uri": "https://www.example.com/pub/logos/abccorp.jpg" + } + } + + Figure 23: LOGO Conversion Example + +2.9.3. MEMBER + + The MEMBER property (Section 6.6.5 of [RFC6350]) converts to the Card + object's members property (Figure 24). Each MEMBER property value is + a key in the members property. The PREF parameter (Section 5.3 of + [RFC6350]) does not convert to JSContact. + + KIND:group + FN:The Doe family + MEMBER:urn:uuid:03a0e51f-d1aa-4385-8a53-e29025acd8af + MEMBER:urn:uuid:b8767877-b4a1-4c70-9acc-505d3819e519 + "kind": "group", + "name": { + "full": "The Doe family" + }, + "uid": "urn:uuid:ab4310aa-fa43-11e9-8f0b-362b9e155667", + "members": { + "urn:uuid:03a0e51f-d1aa-4385-8a53-e29025acd8af": true, + "urn:uuid:b8767877-b4a1-4c70-9acc-505d3819e519": true + } + + Figure 24: Group Example + +2.9.4. ORG + + The ORG property (Section 6.6.4 of [RFC6350]) converts to an + Organization object (Section 2.2.3 of [RFC9553]) in the Card object's + organizations property (Figure 25). The Organization object's name + property is set to the ORG property organizational name component. + The Organization object's units property is an array of OrgUnit + objects that each contain an organizational unit name component value + of the ORG property value. + + Implementations MAY allow representation of organizational units + without the organizational name. In this case, the first component + of the ORG value MUST be an empty string (e.g., ORG:;DepartmentA). + + The ALTID and LANGUAGE parameters convert according to the rules + defined in Section 2.3. + + The first item of the comma-separated SORT-AS parameter value + converts to the sortAs property of the Organization object. The + subsequent items convert to the sortAs property of the corresponding + OrgUnit object. + + The TYPE parameter converts according to the rules defined in + Section 2.3. + + ORG;SORT-AS="ABC":ABC\, Inc.;North American Division;Marketing + "organizations": { + "ORG-1": { + "name": "ABC, Inc.", + "units":[ + { "name": "North American Division" }, + { "name": "Marketing" } + ], + "sortAs": "ABC" + } + } + + Figure 25: ORG Conversion Example + +2.9.5. RELATED + + The RELATED property (Section 6.6.6 of [RFC6350]) converts to the + Card object's relatedTo property (Figure 26). The property value + converts to the key in the relatedTo property. The TYPE parameters + convert to the Relation object's relation property (Section 2.1.8 of + [RFC9553]). Any other parameters convert as defined in + Section 2.15.2. + + RELATED;TYPE=friend:urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6 + RELATED;TYPE=contact:https://example.com/directory/john.vcf + RELATED;VALUE=text:Please contact my deputy John for any inquiries. + "relatedTo" : { + "urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6" : { + "relation" : { + "friend" : true + } + }, + "https://example.com/directory/john.vcf" : { + "relation" : { + "contact" : true + } + }, + "Please contact my deputy John for any inquiries." : { + "relation" : { } + } + } + + Figure 26: RELATED Conversion Example + +2.9.6. TITLE and ROLE + + The TITLE (Section 6.6.1 of [RFC6350]) and ROLE (Section 6.6.2 of + [RFC6350]) properties convert to a Title object (Section 2.2.5 of + [RFC9553]) in the Card object's titles property (Figure 27). The + Title object's kind property is set to "title" or "role" for the + TITLE and ROLE vCard properties, respectively. The name property is + set to the vCard property value. + + The value of the organizationId property can be derived if the TITLE + or ROLE property is a member of a vCard property group and if exactly + one other ORG property is also a part of that group. + + The ALTID and LANGUAGE parameters convert according to the rules + defined in Section 2.3. + + TITLE:Research Scientist + group1.ROLE:Project Leader + group1.ORG:ABC, Inc. + "titles": { + "TITLE-1": { + "kind": "title", + "name": "Research Scientist" + }, + "TITLE-2": { + "kind": "role", + "name": "Project Leader", + "organizationId": "ORG-1" + } + }, + "organizations": { + "ORG-1": { + "name": "ABC, Inc." + } + } + + Figure 27: TITLE and ROLE Conversion Example + +2.10. Personal Information Properties + +2.10.1. EXPERTISE + + The EXPERTISE property (Section 2.1 of [RFC6715]) converts to a + PersonalInfo object (Section 2.8.4 of [RFC9553]) in the Card object's + personalInfo property (Figure 28). The PersonalInfo object's kind + property is set to "expertise". + + The INDEX and LEVEL parameters convert according to the rules defined + in Section 2.3. + + EXPERTISE;LEVEL=beginner;INDEX=2:Chinese literature + EXPERTISE;INDEX=1;LEVEL=expert:chemistry + "personalInfo": { + "PERSINFO-1" : { + "kind": "expertise", + "value": "Chinese literature", + "level": "low", + "listAs": 2 + }, + "PERSINFO-2" : { + "kind": "expertise", + "value": "chemistry", + "level": "high", + "listAs": 1 + } + } + + Figure 28: EXPERTISE Conversion Example + +2.10.2. HOBBY + + The HOBBY property (Section 2.2 of [RFC6715]) converts to a + PersonalInfo object (Section 2.8.4 of [RFC9553]) in the Card object's + personalInfo property (Figure 29). The PersonalInfo object's kind + property is set to "hobby". + + The INDEX and LEVEL parameters convert according to the rules defined + in Section 2.3. + + HOBBY;INDEX=1;LEVEL=high:reading + HOBBY;INDEX=2;LEVEL=high:sewing + "personalInfo": { + "PERSINFO-1" : { + "kind": "hobby", + "value": "reading", + "level": "high", + "listAs": 1 + }, + "PERSINFO-2" : { + "kind": "hobby", + "value": "sewing", + "level": "high", + "listAs": 2 + } + } + + Figure 29: HOBBY Conversion Example + +2.10.3. INTEREST + + The INTEREST property (Section 2.3 of [RFC6715]) converts to a + PersonalInfo object (Section 2.8.4 of [RFC9553]) in the Card object's + personalInfo property (Figure 30). The PersonalInfo object's kind + property is set to "interest". + + The INDEX and LEVEL parameters convert according to the rules defined + in Section 2.3. + + INTEREST;INDEX=1;LEVEL=medium:r&b music + INTEREST;INDEX=2;LEVEL=high:rock&roll music + "personalInfo": { + "PERSINFO-1" : { + "kind": "interest", + "value": "r&b music", + "level": "medium", + "listAs": 1 + }, + "PERSINFO-2" : { + "kind": "interest", + "value": "rock&roll music", + "level": "high", + "listAs": 2 + } + } + + Figure 30: INTEREST Conversion Example + +2.10.4. ORG-DIRECTORY + + The ORG-DIRECTORY property (Section 2.4 of [RFC6715]) [RFC6715] + converts to a Directory object (Section 2.6.2 of [RFC9553]) in the + Card object's directories property (Figure 31). The Directory + object's kind property is set to "directory". The uri property is + set to the ORG-DIRECTORY property value. + + The INDEX, PREF, and TYPE parameters convert according to the rules + defined in Section 2.3. + + ORG-DIRECTORY;INDEX=1:https://directory.mycompany.example.com + ORG-DIRECTORY;PREF=1:ldap://ldap.tech.example/o=Tech,ou=Engineering + "directories": { + "DIRECTORY-1": { + "kind": "directory", + "uri": "https://directory.mycompany.example.com", + "listAs": 1 + }, + "DIRECTORY-2": { + "kind": "directory", + "uri": "ldap://ldap.tech.example/o=Tech,ou=Engineering", + "pref": 1 + } + } + + Figure 31: ORG-DIRECTORY Conversion Example + +2.11. Explanatory Properties + +2.11.1. CATEGORIES + + The CATEGORIES property (Section 6.7.1 of [RFC6350]) converts to a + set of entries of the Card object's keywords property (Figure 32). + The keys are the comma-separated text values of the CATEGORIES + property. + + In this case, the PREF parameter does not have a JSContact + counterpart; however, the implementors MAY insert the entries by + order of preference. + + CATEGORIES:internet,IETF,Industry,Information Technology + "keywords": { + "internet": true, + "IETF": true, + "Industry": true, + "Information Technology": true + } + + Figure 32: CATEGORIES Conversion Example + +2.11.2. CLIENTPIDMAP + + The CLIENTPIDMAP property (Section 6.7.7 of [RFC6350]) converts to + the vCardProps (Section 2.15.1) property. + +2.11.3. CREATED + + The CREATED property (Section 3.1 of [RFC9554]) converts to the Card + object's created property (Figure 33). + + CREATED:19940930T143510Z + "created": "1994-09-30T14:35:10Z" + + Figure 33: CREATED Conversion Example + +2.11.4. NOTE + + The NOTE property (Section 6.7.2 of [RFC6350]) converts to a Note + object (Section 2.8.3 of [RFC9553]) in the Card object's notes + property (Figure 34). + + The ALTID and LANGUAGE parameters convert according to the rules + defined in Section 2.3. + + NOTE;CREATED=20221123T150132Z;AUTHOR-NAME="John": + Office hours are from 0800 to 1715 EST\, Mon-Fri. + "notes": { + "NOTE-1" : { + "note": "Office hours are from 0800 to 1715 EST, Mon-Fri.", + "created": "2022-11-23T15:01:32Z", + "author": { + "name": "John" + } + } + } + + Figure 34: NOTE Conversion Example + +2.11.5. PRODID + + The PRODID property (Section 6.7.3 of [RFC6350]) converts to the Card + object's prodId property (Figure 35). + + PRODID:ACME Contacts App version 1.23.5 + "prodId": "ACME Contacts App version 1.23.5" + + Figure 35: PRODID Conversion Example + +2.11.6. REV + + The REV property (Section 6.7.4 of [RFC6350]) converts to the Card + object's updated property (Figure 36). + + REV:19951031T222710Z + "updated": "1995-10-31T22:27:10Z" + + Figure 36: REV Conversion Example + +2.11.7. SOUND + + The SOUND property (Section 6.7.5 of [RFC6350]) converts to a Media + object (Section 2.6.4 of [RFC9553]) in the Card object's media + property (Figure 37). The Media object's kind property is set to + "sound" and the uri property is set to the SOUND value. + + The PREF and TYPE parameters convert according to the rules defined + in Section 2.3. + + SOUND:CID:JOHNQPUBLIC.19960229T080000.xyzMail@example.com + "media": { + ... + "SOUND-1": { + "kind": "sound", + "uri": "CID:JOHNQPUBLIC.19960229T080000.xyzMail@example.com" + } + } + + Figure 37: SOUND Conversion Example + +2.11.8. UID + + The UID property (Section 6.7.6 of [RFC6350]) converts to the Card + object's uid property (Figure 38). + + UID:urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6 + "uid": "urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6" + + Figure 38: UID Conversion Example + +2.11.9. URL + + The URL property (Section 6.7.8 of [RFC6350]) converts to a Link + object (Section 2.6.3 of [RFC9553]) in the Card object's links + property (Figure 39). The Link object's uri property is set to the + URL value. + + The PREF and TYPE parameters convert according to the rules defined + in Section 2.3. + + URL:https://example.org/restaurant.french/~chezchic.html + "links": { + "LINK-1": { + "uri": "https://example.org/restaurant.french/~chezchic.html" + } + } + + Figure 39: URL Conversion Example + +2.11.10. VERSION + + The VERSION property (Section 6.7.9 of [RFC6350]) converts to the + vCardProps (Section 2.15.1) property. + +2.11.11. X-ABLabel + + The X-ABLabel property is experimental but widely in use in existing + vCard data. It converts to the label property of a JSContact object. + The X-ABLabel property is preceded by a vCard property group name, + and the label converts to the JSContact object, which was converted + from a vCard property of the same group. + + The group name is not preserved; implementations are free to choose + any unique group name when converting back to vCard. For an example + on how to preserve the group name, see Section 2.3.9. + + item1.TEL;VALUE=uri:tel:+1-555-555-5555 + item1.X-ABLabel:foo + "phones": { + "p1": { + "number": "tel:+1-555-555-5555", + "label": "foo" + } + } + + Figure 40: X-ABLabel Conversion Example + +2.12. Security Properties + +2.12.1. KEY + + The KEY property (Section 6.8.1 of [RFC6350]) converts to a CryptoKey + object (Section 2.6.1 of [RFC9553]) in the Card object's cryptoKeys + property (Figure 41). The CryptoKey object's uri property is set to + the KEY property value. + + The PREF and TYPE parameters convert according to the rules defined + in Section 2.3. + + KEY:https://www.example.com/keys/jdoe.cer + "cryptoKeys": { + "KEY-1": { + "uri": "https://www.example.com/keys/jdoe.cer" + } + } + + Figure 41: KEY Conversion Example + +2.13. Calendar Properties + +2.13.1. CALADRURI + + The CALADRURI property (Section 6.9.2 of [RFC6350]) converts to a + SchedulingAddress object (Section 2.4.2 of [RFC9553]) in the Card + object's schedulingAddresses property (Figure 42). The + SchedulingAddress object's uri property is set to the CALADRURI + value. + + The PREF parameter (Section 5.3 of [RFC6350]) converts according to + the rules defined in Section 2.3. + + CALADRURI;PREF=1:mailto:janedoe@example.com + CALADRURI:https://example.com/calendar/jdoe + "schedulingAddresses": { + "SCHEDULING-1": { + "uri": "mailto:janedoe@example.com", + "pref": 1 + }, + "SCHEDULING-2": { + "uri": "https://example.com/calendar/jdoe" + } + } + + Figure 42: CALADRURI Conversion Example + +2.13.2. CALURI + + The CALURI property (Section 6.9.3 of [RFC6350]) converts to a + Calendar object (Section 2.4.1 of [RFC9553]) in the Card object's + calendars property (Figure 43). The Calendar object's kind property + is set to "calendar" and the uri property is set to the CALURI value. + + The PREF and TYPE parameters convert according to the rules defined + in Section 2.3. + + CALURI;PREF=1:https://cal.example.com/calA + CALURI;MEDIATYPE=text/calendar:https://ftp.example.com/calA.ics + "calendars": { + "CAL-1": { + "kind": "calendar", + "uri": "https://cal.example.com/calA", + "pref": 1 + }, + "CAL-2": { + "kind": "calendar", + "uri": "https://ftp.example.com/calA.ics", + "mediaType": "text/calendar" + } + } + + Figure 43: CALURI Conversion Example + +2.13.3. FBURL + + The FBURL property (Section 6.9.1 of [RFC6350]) converts to a + Calendar object (Section 2.4.1 of [RFC9553]) in the Card object's + calendars property (Figure 44). The Calendar object's kind property + is set to "freeBusy" and the uri property is set to the FBURL value. + + The PREF and TYPE parameters convert according to the rules defined + in Section 2.3. + + FBURL;PREF=1:https://www.example.com/busy/janedoe + FBURL;MEDIATYPE=text/calendar:https://example.com/busy/project-a.ifb + "calendars": { + "FBURL-1": { + "kind": "freeBusy", + "uri": "https://www.example.com/busy/janedoe", + "pref": 1 + }, + "FBURL-2": { + "kind": "freeBusy", + "uri": "https://example.com/busy/project-a.ifb", + "mediaType": "text/calendar" + } + } + + Figure 44: FBURL Conversion Example + +2.14. Extended Properties and Parameters + + Extended properties and parameters convert as specified in + Section 2.15. + +2.15. New JSContact Properties + + vCards may contain properties or parameters for which no IANA- + registered JSContact property is defined. For example, a vCard may + contain properties and parameters of which the semantics or purposes + are unknown to the implementation; see Section 6.10 of [RFC6350]. + + This section defines JSContact properties by which such vCard + properties and parameters MAY be represented in JSContact. + Implementations MAY choose to convert differently if they deem that + more appropriate. + +2.15.1. vCardProps + + vCardProps: JCardProp[] (optional). Contains vCard properties that + are set in the vCard represented by this JSContact object. The + JCardProp type denotes a jCard-encoded vCard property as defined + in Section 3.3 of [RFC7095]. + + Example: This illustrates how to convert a vCard extension property: + + item1.X-FOO;X-BAR=Hello:World! + "vCardProps": [ + ["x-foo", { + "x-bar": "Hello", + "group": "item1" + }, "unknown", "World!"] + ] + + Figure 45: JSContact vCardProps Example + +2.15.2. vCardParams + + vCardParams: String[String|String[]] (optional). Contains vCard + parameters that are set on the vCard property represented by this + JSContact object. The value MUST be a JSON object containing + vCard property parameters as defined in Section 3.3 of [RFC7095]. + Each entry represents a parameter of the vCard property that + converts to the JSContact object. + + Example: This illustrates how to convert a vCard extension + parameter: + + EMAIL;X-FOO=Bar:jane_doe@example.com + "emails": { + "email1": { + "address": "jane_doe@example.com", + "vCardParams": { + "x-foo": "Bar" + } + } + } + + Figure 46: JSContact vCardParams Example + +2.15.3. vCardName + + vCardName: String (optional). Contains the name of the vCard element + that is represented by this JSContact object. For example, this + allows to preserve the name of a vCard property when multiple + vCard properties convert the same JSContact type. The case- + insensitive value MUST be valid according to the "name" ABNF + defined in Section 3.3 of [RFC6350]. + + Example: Both vCard IMPP and SOCIALPROFILE convert to an + OnlineService object (Section 2.3.2 of [RFC9553]) in JSContact. + The vCardName property value indicates that the vCard source + element was IMPP as follows: + + IMPP:xmpp:alice@example.com + "onlineServices": { + "os1": { + "uri": "xmpp:alice@example.com", + "vCardName": "impp" + }, + } + + Figure 47: JSContact vCardName Example + +3. Converting JSContact to vCard + +3.1. Conversion Rules + + A Card object converts to vCard by applying the reverse rules of + converting vCard to JSContact. In addition to those listed in + Appendix A, the following rules apply: + + * Multivalued JSContact properties convert to separate instances of + their equivalent vCard property, and each of the PROP-ID + parameters MUST be set to the Id-typed key of the converted value + (see Section 2.3.18). + + * The full property of the name property in JSContact is optional, + but the FN property is mandatory in vCard. The following rules + apply: + + - If the Name object's full property is set, then implementations + MUST use its value for the vCard FN property. + + - If the Name object's full property is not set, then + implementations SHOULD derive the full name from the Name + object's components property values. If the isOrdered property + is "true", then this can be done by concatenating the name + component values. Otherwise, or alternatively, an + implementation can choose any other heuristic to generate the + full name from its components such as [CLDRPersonName]. + Implementations MUST set the DERIVED parameter on the FN + property. + + - Otherwise, the FN property MUST be set to the empty value. + + * Vendor-specific and unknown properties convert to vCard as + outlined in Section 3.1.1. + +3.1.1. Converting Unknown Properties + + JSContact objects may contain properties for which no IANA-registered + vCard property is defined. For example, a JSContact object may + contain vendor-specific properties of which the semantics or purpose + are unknown. + + This specification defines the new JSPROP (Section 3.2.1) vCard + property and JSPTR (Section 3.3.2) vCard parameter by which such + JSContact properties MAY be represented in vCard. Implementations + MAY choose to convert differently if they deem that more appropriate. + +3.2. New vCard Properties + +3.2.1. JSPROP + + Property name: JSPROP + + Purpose: Represents a JSContact property in vCard. + + Value type: TEXT; also see "Format definition" below for value + restrictions. + + Conformance: Can be specified multiple times in a vCard. + + Property parameters: The JSPTR parameter MUST be set for this + property. Other IANA-registered and experimental property + parameters can be specified on this property. + + Description: This property converts an arbitrary JSContact property + from and to vCard. The vCard property value is the JSON-encoded + value of the JSContact property, represented as a TEXT value. The + format of the JSON value MUST be compact, e.g., without + insignificant whitespace as defined in Section 2 of [RFC8259]. + The value of the JSPTR parameter points to the JSContact property + within the Card. + + The root of the JSON pointer is always the Card object that this + vCard converts to, irrespective if the JSON pointer starts with + the SOLIDUS (U+002F) character. The pointer MUST NOT reference + into an array. + + All JSPROP properties in a vCard together form a PatchObject as + defined in [RFC9553]. 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 vCard to JSContact, the PatchObject MUST only be applied + after all other vCard properties have already been converted. The + PatchObject MUST be valid, including the restriction that an + invalid PatchObject MUST NOT be applied. + + Format definition: This property is defined by the following + notation: + + jsprop = "JSPROP" jsprop-param ":" TEXT + + jsprop-param = *( + ; The following are REQUIRED and MUST NOT + ; occur more than once + ( ";" jsptr-param ) / ; see next section + ( ";" "VALUE" "=" "TEXT") + ; + ; The following is OPTIONAL + ; and MAY occur more than once. + ; + (";" other-param) + ; + ) + + Example(s): This illustrates how to convert a property at the top + level in a Card object that is unknown to the implementation. + + "someUnknownProperty": true + JSPROP;JSPTR="someUnknownProperty":true + + Figure 48: Unknown Property Example + + This illustrates how to convert a vendor-specific property at the + top level of a Card object. Note the required use of quoted + string for the JSPTR value, which allows the path to include the + COLON (U+003A) character. + + "example.com:foo": { + "bar": 1234 + } + JSPROP;JSPTR="example.com:foo":{"bar":1234} + + Figure 49: Vendor-Specific Property Conversion Example + + This illustrates how to convert a vendor-specific property at a + nested level in a Card object using a path relative to the Card + object. Although not recommended, the property name includes the + SOLIDUS (U+002F) character, which requires escaping in the JSON + pointer. + + "phones": { + "phone1": { + "number": "tel:+33-01-23-45-67", + "example.com:foo/bar": "tux hux" + } + } + TEL:tel:+33-01-23-45-67 + JSPROP;JSPTR="phones/phone1/example.com:foo~1bar": + "tux hux" + + Figure 50: Nested Vendor-Specific Property Example with a Path + Relative to Card + +3.3. New vCard Parameters + +3.3.1. JSCOMPS + + Parameter name: JSCOMPS + + Purpose: Defines the order and separators for the elements of a + structured property value. + + Description: The JSCOMPS parameter value facilitates converting name + and address components between JSContact and vCard. It preserves + the order of the components of the JSContact property and contains + the verbatim values of separator components. + + If this parameter is set and its value is valid (see later), then + implementations MUST set the isOrdered property of the Name or + Address object to "true". Otherwise, they MUST set the isOrdered + property value to "false". + + The JSCOMPS parameter value is a structured type value. Its value + MUST be quoted. The parameter value consists of a sequence of + entries, separated by the SEMICOLON character (U+003B). The first + entry defines the value of the defaultSeparator property. If it + is the empty string, then no default separator is defined. + Otherwise, the first entry MUST be a separator entry. All + following entries processed in order result in an ordered list of + JSContact components and MUST be one of the following two kinds: + + 1. A positional. This refers to a component value in the vCard + structured value. A position consists of the numeric index of + a component in the structured value, optionally followed by a + COMMA (U+002C) character and the non-zero index of a value + within that component. The zero index selects the first + component or value, respectively. The second index is zero by + default, in which case it MUST be omitted (as well as the + leading COMMA). + + The resulting JSContact component is formed by determining its + kind by the position in the vCard structured value. The + component value is the verbatim value of the vCard component. + Figures 51 and 52 illustrate this by example. + + 2. A separator. This contains the verbatim value of a separator + component. It starts with the LATIN SMALL LETTER S (U+0073) + character, followed by the COMMA (U+002C) character, followed + by zero or more "param-value" characters (see Section 3.3 of + [RFC6350]), where the COMMA (U+002C) and SEMICOLON (U+003B) + characters MUST be escaped according to the rules defined in + Section 3.4 of [RFC6350]. Figure 53 illustrates this by + example. + + The resulting JSContact component is formed by setting its + kind to "separator" and its value to the verbatim value of the + entry. + + A JSCOMPS parameter value is valid if and only if: + + * All indexes in the positional entries refer to an existing + component value in the vCard property value. + + * The count of positional entries equals the count of + deduplicated component values. Deduplication is required + because some values may occur in both their designated and + backwards-compatible components in the vCard property value: + + - A value that occurs in both the N property secondary surname + component and the family name component only counts once. + + - A value that occurs in both the N property generation + component and the honorific suffix component only counts + once. + + - A value in the ADR property street address component does + not count if the ADR property value contains a value in one + of the new components defined in [RFC9554]. + + - All other values count once each. + + Format definition: + jscomps-param = "JSCOMPS" "=" DQUOTE [jscomps-entry-sep ] ";" + jscomps-entrylist DQUOTE + + jscomps-entrylist = jscomps-entry *(";" jscomps-entry) + jscomps-entry = jscomps-entry-pos / jscomps-entry-sep + jscomps-entry-pos = 1*DIGIT [ "," 1*DIGIT ] + jscomps-entry-sep = "s" "," jscomps-entry-verb + jscomps-entry-verb = *QSAFE-CHAR ; encode according to RFC 6868 + + Example(s): The following example demonstrates the use of positional + entries for the name "Jane Doe". The given name is ordered before + the surname. No secondary index is required for either positional + because both are zero. + + "name": { + "components": [ + { "kind": "given", "value": "Jane" }, + { "kind": "surname", "value": "Doe" } + ], + "isOrdered": true + } + N;JSCOMPS=";1;0":Doe;Jane;;;;;; + FN;DERIVED=TRUE:Jane Doe + + Figure 51: Example of a Secondary Positional Index + + The following example demonstrates a secondary positional index. + The "Jr." generation marker only counts once because it occurs in + both the designated generation component and the backwards- + compatible honorific suffixes component. + + "name": { + "components": [ + { "kind": "given", "value": "John" }, + { "kind": "given2", "value": "Philip" }, + { "kind": "given2", "value": "Paul" }, + { "kind": "surname", "value": "Stevenson" }, + { "kind": "generation", "value": "Jr." }, + { "kind": "credential", "value": "M.D." } + ], + "isOrdered": true + } + N;JSCOMPS=";1;2;2,1;0;6;4,1": + Stevenson;John;Philip,Paul;;Jr.,M.D.;;Jr. + + Figure 52: Example of Positional Entries + + The following example demonstrates the use of separator entries + for the (shortened for brevity) address "54321 Oak St, Reston". + The first entry defines the default separator to be ", ". The + second and fourth positional entries are separated with the + separator value " ". For backwards compatibility, the street + address component of the ADR property contains both the street + number and name, but it is not referred to in the JSCOMPS + parameter and does not contribute to the count of values. + + "addresses": { + "a1": { + "components": [ + { "kind": "number", "value": "54321" }, + { "kind": "separator", "value": " " }, + { "kind": "name", "value": "Oak St" }, + { "kind": "locality", "value": "Reston" } + ], + "defaultSeparator": ", ", + "isOrdered": true + } + } + ADR;JSCOMPS="s,\, ;11;s, ;10;3": + ;;54321 Oak St;Reston;;;;;;;Oak St;54321;;;;;; + + Figure 53: Example of Separator Entries + +3.3.2. JSPTR + + Parameter name: JSPTR + + Purpose: This parameter is set on a JSPROP (Section 3.2.1) property. + Its value is a JSON pointer [RFC6901] that points to the JSContact + property that has the value of the JSPROP property. + + Description: This parameter has a single value that MUST be a valid + JSON pointer as defined in [RFC6901]. Note that the value MUST be + quoted according to the "param-value" ABNF in [RFC6350]. + + Format definition: + jsptr-param = "JSPTR" "=" param-value + ; also see param-value in RFC 6350, Section 3.3 + + Example(s): This illustrates a simple example. For further + examples, see Section 3.2.1. + + JSPROP;JSPTR="example.com:foo":"bar" + +4. Security Considerations + + This specification defines how to convert between the JSContact and + vCard formats. The security considerations for parsing and + formatting such data apply and are outlined in Section 4 of [RFC9553] + and Section 9 of [RFC6350]. + +5. IANA Considerations + +5.1. New vCard Property + + IANA has added the following entry to the "vCard Properties" + registry, as defined in Section 10.3.1 of [RFC6350]. + + +===========+==========+=========================+ + | Namespace | Property | Reference | + +===========+==========+=========================+ + | | JSPROP | RFC 9555, Section 3.2.1 | + +-----------+----------+-------------------------+ + + Table 4: New vCard Property + +5.2. New vCard Parameter + + IANA has added the following entry to the "vCard Parameters" + registry, as defined in Section 10.3.2 of [RFC6350]. + + +===========+===========+=========================+ + | Namespace | Parameter | Reference | + +===========+===========+=========================+ + | | JSPTR | RFC 9555, Section 3.3.2 | + +-----------+-----------+-------------------------+ + + Table 5: New vCard Parameter + +5.3. New JSContact Properties + + IANA has added the following entries to the "JSContact Properties" + registry. Note that the Since Version is 1.0, the Until Version is + not set, and the Change Controller is IETF for all of these + properties. + + +===========+=======================+=========+========+===========+ + |Property |Property Type |Property |Intended|Reference/ | + |Name | |Context |Usage |Description| + +===========+=======================+=========+========+===========+ + |vCardName |String |Any |common |RFC 9555, | + | | |JSContact| |Section | + | | |object | |2.15.3 | + +-----------+-----------------------+---------+--------+-----------+ + |vCardParams|String[String|String[]]|Any |common |RFC 9555, | + | | |JSContact| |Section | + | | |object | |2.15.2 | + +-----------+-----------------------+---------+--------+-----------+ + |vCardProps |JCardProp[] |Card |common |RFC 9555, | + | | | | |Section | + | | | | |2.15.1 | + +-----------+-----------------------+---------+--------+-----------+ + + Table 6: JSContact Properties Registry + +5.4. New JSContact Type + + IANA has added the following entry to the "JSContact Types" registry. + Note that the Since Version is 1.0, the Until Version is not set, and + the Change Controller is IETF for this type. + + +===========+================+==========================+ + | Type Name | Intended Usage | Reference/Description | + +===========+================+==========================+ + | JCardProp | common | RFC 9555, Section 2.15.1 | + +-----------+----------------+--------------------------+ + + Table 7: JSContact Types Registry + +6. References + +6.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, + <https://www.rfc-editor.org/info/rfc2119>. + + [RFC3986] Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform + Resource Identifier (URI): Generic Syntax", STD 66, + RFC 3986, DOI 10.17487/RFC3986, January 2005, + <https://www.rfc-editor.org/info/rfc3986>. + + [RFC5234] Crocker, D., Ed. and P. Overell, "Augmented BNF for Syntax + Specifications: ABNF", STD 68, RFC 5234, + DOI 10.17487/RFC5234, January 2008, + <https://www.rfc-editor.org/info/rfc5234>. + + [RFC5646] Phillips, A., Ed. and M. Davis, Ed., "Tags for Identifying + Languages", BCP 47, RFC 5646, DOI 10.17487/RFC5646, + September 2009, <https://www.rfc-editor.org/info/rfc5646>. + + [RFC6350] Perreault, S., "vCard Format Specification", RFC 6350, + DOI 10.17487/RFC6350, August 2011, + <https://www.rfc-editor.org/info/rfc6350>. + + [RFC6473] Saint-Andre, P., "vCard KIND:application", RFC 6473, + DOI 10.17487/RFC6473, December 2011, + <https://www.rfc-editor.org/info/rfc6473>. + + [RFC6474] Li, K. and B. Leiba, "vCard Format Extensions: Place of + Birth, Place and Date of Death", RFC 6474, + DOI 10.17487/RFC6474, December 2011, + <https://www.rfc-editor.org/info/rfc6474>. + + [RFC6715] Cauchie, D., Leiba, B., and K. Li, "vCard Format + Extensions: Representing vCard Extensions Defined by the + Open Mobile Alliance (OMA) Converged Address Book (CAB) + Group", RFC 6715, DOI 10.17487/RFC6715, August 2012, + <https://www.rfc-editor.org/info/rfc6715>. + + [RFC6869] Salgueiro, G., Clarke, J., and P. Saint-Andre, "vCard + KIND:device", RFC 6869, DOI 10.17487/RFC6869, February + 2013, <https://www.rfc-editor.org/info/rfc6869>. + + [RFC6901] Bryan, P., Ed., Zyp, K., and M. Nottingham, Ed., + "JavaScript Object Notation (JSON) Pointer", RFC 6901, + DOI 10.17487/RFC6901, April 2013, + <https://www.rfc-editor.org/info/rfc6901>. + + [RFC7095] Kewisch, P., "jCard: The JSON Format for vCard", RFC 7095, + DOI 10.17487/RFC7095, January 2014, + <https://www.rfc-editor.org/info/rfc7095>. + + [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC + 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, + May 2017, <https://www.rfc-editor.org/info/rfc8174>. + + [RFC8259] Bray, T., Ed., "The JavaScript Object Notation (JSON) Data + Interchange Format", STD 90, RFC 8259, + DOI 10.17487/RFC8259, December 2017, + <https://www.rfc-editor.org/info/rfc8259>. + + [RFC9553] Stepanek, R. and M. Loffredo, "JSContact: A JSON + Representation of Contact Data", RFC 9553, + DOI 10.17487/RFC9553, May 2024, + <https://www.rfc-editor.org/info/rfc9553>. + + [RFC9554] Stepanek, R. and M. Loffredo, "vCard Format Extensions for + JSContact", RFC 9554, DOI 10.17487/RFC9554, May 2024, + <https://www.rfc-editor.org/info/rfc9554>. + +6.2. Informative References + + [CLDRPersonName] + Davis, M., Edberg, P., Gillam, R., Kolisnychenko, A., + McKenna, M., and other CLDR committee members, "Unicode + Locale Data Markup Language (LDML) Part 8: Person Names", + Unicode Technical Standard #35, Version 44.1, July 2023, + <https://www.unicode.org/reports/tr35/ + tr35-personNames.html>. + + [RFC8605] Hollenbeck, S. and R. Carney, "vCard Format Extensions: + ICANN Extensions for the Registration Data Access Protocol + (RDAP)", RFC 8605, DOI 10.17487/RFC8605, May 2019, + <https://www.rfc-editor.org/info/rfc8605>. + + [vOBJECT] Tse, R., Tam, P., and M. Douglass, "vObject + Internationalization", Work in Progress, Internet-Draft, + draft-calconnect-vobject-i18n-00, 8 June 2018, + <https://datatracker.ietf.org/doc/html/draft-calconnect- + vobject-i18n-00>. + +Appendix A. Reverse Rules of Converting a vCard to a JSContact Card + + Table 8 lists the relevant document sections for each JSContact type + and property. + + +===================+=====================+=====================+ + | JSContact Type | Property Name | Relevant Section(s) | + +===================+=====================+=====================+ + | Address | @type | not applicable | + +-------------------+---------------------+---------------------+ + | Address | components | Sections 2.6.1 and | + | | | 3.3.1 | + +-------------------+---------------------+---------------------+ + | Address | contexts | Section 2.3.22 | + +-------------------+---------------------+---------------------+ + | Address | coordinates | Sections 2.3.8 and | + | | | 2.8.1 | + +-------------------+---------------------+---------------------+ + | Address | country | Section 2.6.1 | + +-------------------+---------------------+---------------------+ + | Address | countryCode | Section 2.6.1 | + +-------------------+---------------------+---------------------+ + | Address | defaultSeparator | Sections 2.6.1 and | + | | | 3.3.1 | + +-------------------+---------------------+---------------------+ + | Address | full | Section 2.6.1 | + +-------------------+---------------------+---------------------+ + | Address | isOrdered | Sections 2.6.1 and | + | | | 3.3.1 | + +-------------------+---------------------+---------------------+ + | Address | locality | Section 2.6.1 | + +-------------------+---------------------+---------------------+ + | Address | phoneticScript | Sections 2.3.15 and | + | | | 2.3.19 | + +-------------------+---------------------+---------------------+ + | Address | phoneticSystem | Section 2.3.15 | + +-------------------+---------------------+---------------------+ + | Address | postcode | Section 2.6.1 | + +-------------------+---------------------+---------------------+ + | Address | pref | Section 2.3.17 | + +-------------------+---------------------+---------------------+ + | Address | region | Section 2.6.1 | + +-------------------+---------------------+---------------------+ + | Address | timeZone | Sections 2.3.23 and | + | | | 2.8.2 | + +-------------------+---------------------+---------------------+ + | AddressComponent | phonetic | Section 2.3.15 | + +-------------------+---------------------+---------------------+ + | Anniversary | @type | not applicable | + +-------------------+---------------------+---------------------+ + | Anniversary | date | Section 2.5.1 | + +-------------------+---------------------+---------------------+ + | Anniversary | kind | Section 2.5.1 | + +-------------------+---------------------+---------------------+ + | Anniversary | place | Section 2.5.1 | + +-------------------+---------------------+---------------------+ + | Author | @type | not applicable | + +-------------------+---------------------+---------------------+ + | Author | name | Section 2.3.3 | + +-------------------+---------------------+---------------------+ + | Author | uri | Section 2.3.2 | + +-------------------+---------------------+---------------------+ + | Calendar | @type | not applicable | + +-------------------+---------------------+---------------------+ + | Calendar | contexts | Section 2.3.22 | + +-------------------+---------------------+---------------------+ + | Calendar | kind | Sections 2.13.2 and | + | | | 2.13.3 | + +-------------------+---------------------+---------------------+ + | Calendar | label | Section 2.11.11 | + +-------------------+---------------------+---------------------+ + | Calendar | mediaType | Section 2.3.14 | + +-------------------+---------------------+---------------------+ + | Calendar | pref | Section 2.3.17 | + +-------------------+---------------------+---------------------+ + | Calendar | uri | Sections 2.13.2 and | + | | | 2.13.3 | + +-------------------+---------------------+---------------------+ + | Card | @type | not applicable | + +-------------------+---------------------+---------------------+ + | Card | @version | not applicable | + +-------------------+---------------------+---------------------+ + | Card | addresses | Section 2.6.1 | + +-------------------+---------------------+---------------------+ + | Card | anniversaries | Section 2.5.1 | + +-------------------+---------------------+---------------------+ + | Card | calendars | Sections 2.13.2 and | + | | | 2.13.3 | + +-------------------+---------------------+---------------------+ + | Card | created | Section 2.11.3 | + +-------------------+---------------------+---------------------+ + | Card | directories | Sections 2.4.3 and | + | | | 2.10.4 | + +-------------------+---------------------+---------------------+ + | Card | emails | Section 2.7.1 | + +-------------------+---------------------+---------------------+ + | Card | keywords | Section 2.11.1 | + +-------------------+---------------------+---------------------+ + | Card | kind | Section 2.4.2 | + +-------------------+---------------------+---------------------+ + | Card | language | Section 2.7.4 | + +-------------------+---------------------+---------------------+ + | Card | links | Sections 2.9.1 and | + | | | 2.11.9 | + +-------------------+---------------------+---------------------+ + | Card | localizations | Section 2.3.11 | + +-------------------+---------------------+---------------------+ + | Card | media | Sections 2.5.7, | + | | | 2.9.2, and 2.11.7 | + +-------------------+---------------------+---------------------+ + | Card | members | Section 2.9.3 | + +-------------------+---------------------+---------------------+ + | Card | name | Section 2.5.5 | + +-------------------+---------------------+---------------------+ + | Card | nicknames | Section 2.5.6 | + +-------------------+---------------------+---------------------+ + | Card | notes | Section 2.11.4 | + +-------------------+---------------------+---------------------+ + | Card | onlineServices | Section 2.7.2 | + +-------------------+---------------------+---------------------+ + | Card | organizations | Section 2.9.4 | + +-------------------+---------------------+---------------------+ + | Card | personalInfo | Sections 2.10.1, | + | | | 2.10.2, and 2.10.3 | + +-------------------+---------------------+---------------------+ + | Card | phones | Section 2.7.6 | + +-------------------+---------------------+---------------------+ + | Card | preferredLanguages | Section 2.7.3 | + +-------------------+---------------------+---------------------+ + | Card | prodId | Section 2.11.5 | + +-------------------+---------------------+---------------------+ + | Card | relatedTo | Section 2.9.5 | + +-------------------+---------------------+---------------------+ + | Card | schedulingAddresses | Section 2.13.1 | + +-------------------+---------------------+---------------------+ + | Card | speakToAs | Section 2.5.4 | + +-------------------+---------------------+---------------------+ + | Card | titles | Section 2.9.6 | + +-------------------+---------------------+---------------------+ + | Card | uid | Section 2.11.8 | + +-------------------+---------------------+---------------------+ + | Card | updated | Section 2.11.6 | + +-------------------+---------------------+---------------------+ + | CryptoKey | @type | not applicable | + +-------------------+---------------------+---------------------+ + | CryptoKey | contexts | Section 2.3.22 | + +-------------------+---------------------+---------------------+ + | CryptoKey | kind | not applicable | + +-------------------+---------------------+---------------------+ + | CryptoKey | label | Section 2.11.11 | + +-------------------+---------------------+---------------------+ + | CryptoKey | mediaType | Section 2.3.14 | + +-------------------+---------------------+---------------------+ + | CryptoKey | pref | Section 2.3.17 | + +-------------------+---------------------+---------------------+ + | CryptoKey | uri | Section 2.12.1 | + +-------------------+---------------------+---------------------+ + | Directory | @type | not applicable | + +-------------------+---------------------+---------------------+ + | Directory | contexts | Section 2.3.22 | + +-------------------+---------------------+---------------------+ + | Directory | kind | Sections 2.4.3 and | + | | | 2.10.4 | + +-------------------+---------------------+---------------------+ + | Directory | label | Section 2.11.11 | + +-------------------+---------------------+---------------------+ + | Directory | listAs | Section 2.3.10 | + +-------------------+---------------------+---------------------+ + | Directory | mediaType | Section 2.3.14 | + +-------------------+---------------------+---------------------+ + | Directory | pref | Section 2.3.17 | + +-------------------+---------------------+---------------------+ + | Directory | uri | Sections 2.4.3 and | + | | | 2.10.4 | + +-------------------+---------------------+---------------------+ + | EmailAddress | @type | not applicable | + +-------------------+---------------------+---------------------+ + | EmailAddress | address | Section 2.7.1 | + +-------------------+---------------------+---------------------+ + | EmailAddress | contexts | Section 2.3.22 | + +-------------------+---------------------+---------------------+ + | EmailAddress | label | Section 2.11.11 | + +-------------------+---------------------+---------------------+ + | EmailAddress | pref | Section 2.3.17 | + +-------------------+---------------------+---------------------+ + | LanguagePref | @type | not applicable | + +-------------------+---------------------+---------------------+ + | LanguagePref | contexts | Section 2.3.22 | + +-------------------+---------------------+---------------------+ + | LanguagePref | pref | Section 2.3.17 | + +-------------------+---------------------+---------------------+ + | Link | @type | not applicable | + +-------------------+---------------------+---------------------+ + | Link | contexts | Section 2.3.22 | + +-------------------+---------------------+---------------------+ + | Link | kind | Section 2.9.1 | + +-------------------+---------------------+---------------------+ + | Link | label | Section 2.11.11 | + +-------------------+---------------------+---------------------+ + | Link | mediaType | Section 2.3.14 | + +-------------------+---------------------+---------------------+ + | Link | pref | Section 2.3.17 | + +-------------------+---------------------+---------------------+ + | Link | uri | Sections 2.9.1 and | + | | | 2.11.9 | + +-------------------+---------------------+---------------------+ + | Media | @type | not applicable | + +-------------------+---------------------+---------------------+ + | Media | contexts | Section 2.3.22 | + +-------------------+---------------------+---------------------+ + | Media | kind | Sections 2.5.7, | + | | | 2.9.2, and 2.11.7 | + +-------------------+---------------------+---------------------+ + | Media | label | Section 2.11.11 | + +-------------------+---------------------+---------------------+ + | Media | mediaType | Section 2.3.14 | + +-------------------+---------------------+---------------------+ + | Media | pref | Section 2.3.17 | + +-------------------+---------------------+---------------------+ + | Media | uri | Sections 2.5.7, | + | | | 2.9.2, and 2.11.7 | + +-------------------+---------------------+---------------------+ + | Name | @type | not applicable | + +-------------------+---------------------+---------------------+ + | Name | components | Sections 2.5.5 and | + | | | 3.3.1 | + +-------------------+---------------------+---------------------+ + | Name | defaultSeparator | Sections 2.5.5 and | + | | | 3.3.1 | + +-------------------+---------------------+---------------------+ + | Name | full | Section 2.5.2 | + +-------------------+---------------------+---------------------+ + | Name | phoneticScript | Sections 2.3.15 and | + | | | 2.3.19 | + +-------------------+---------------------+---------------------+ + | Name | phoneticSystem | Section 2.3.15 | + +-------------------+---------------------+---------------------+ + | Name | isOrdered | Sections 2.5.5 and | + | | | 3.3.1 | + +-------------------+---------------------+---------------------+ + | Name | sortAs | Section 2.3.21 | + +-------------------+---------------------+---------------------+ + | NameComponent | @type | not applicable | + +-------------------+---------------------+---------------------+ + | NameComponent | kind | Section 2.5.5 | + +-------------------+---------------------+---------------------+ + | NameComponent | phonetic | Section 2.3.15 | + +-------------------+---------------------+---------------------+ + | NameComponent | value | Section 2.5.5 | + +-------------------+---------------------+---------------------+ + | Nickname | @type | not applicable | + +-------------------+---------------------+---------------------+ + | Nickname | contexts | Section 2.3.22 | + +-------------------+---------------------+---------------------+ + | Nickname | name | Section 2.5.5 | + +-------------------+---------------------+---------------------+ + | Nickname | pref | Section 2.3.17 | + +-------------------+---------------------+---------------------+ + | Note | @type | not applicable | + +-------------------+---------------------+---------------------+ + | Note | author | Sections 2.3.2 and | + | | | 2.3.3 | + +-------------------+---------------------+---------------------+ + | Note | created | Section 2.3.6 | + +-------------------+---------------------+---------------------+ + | Note | note | Section 2.11.4 | + +-------------------+---------------------+---------------------+ + | OnlineService | @type | not applicable | + +-------------------+---------------------+---------------------+ + | OnlineService | contexts | Section 2.3.22 | + +-------------------+---------------------+---------------------+ + | OnlineService | label | Section 2.11.11 | + +-------------------+---------------------+---------------------+ + | OnlineService | pref | Section 2.3.17 | + +-------------------+---------------------+---------------------+ + | OnlineService | service | Section 2.3.20 | + +-------------------+---------------------+---------------------+ + | OnlineService | uri | Sections 2.7.2 and | + | | | 2.7.5 | + +-------------------+---------------------+---------------------+ + | OnlineService | user | Section 2.3.24 | + +-------------------+---------------------+---------------------+ + | OrgUnit | @type | not applicable | + +-------------------+---------------------+---------------------+ + | OrgUnit | name | Section 2.9.4 | + +-------------------+---------------------+---------------------+ + | OrgUnit | sortAs | Section 2.3.21 | + +-------------------+---------------------+---------------------+ + | Organization | @type | not applicable | + +-------------------+---------------------+---------------------+ + | Organization | contexts | Section 2.3.22 | + +-------------------+---------------------+---------------------+ + | Organization | name | Section 2.9.4 | + +-------------------+---------------------+---------------------+ + | Organization | sortAs | Section 2.3.21 | + +-------------------+---------------------+---------------------+ + | Organization | units | Section 2.9.4 | + +-------------------+---------------------+---------------------+ + | PartialDate | @type | not applicable | + +-------------------+---------------------+---------------------+ + | PartialDate | calendarScale | Section 2.3.4 | + +-------------------+---------------------+---------------------+ + | PartialDate | day | Section 2.2.2 | + +-------------------+---------------------+---------------------+ + | PartialDate | month | Section 2.2.2 | + +-------------------+---------------------+---------------------+ + | PartialDate | year | Section 2.2.2 | + +-------------------+---------------------+---------------------+ + | PatchObject | @type | not applicable | + +-------------------+---------------------+---------------------+ + | PersonalInfo | @type | not applicable | + +-------------------+---------------------+---------------------+ + | PersonalInfo | kind | Sections 2.10.1, | + | | | 2.10.2, and 2.10.3 | + +-------------------+---------------------+---------------------+ + | PersonalInfo | listAs | Section 2.3.10 | + +-------------------+---------------------+---------------------+ + | PersonalInfo | level | Section 2.3.13 | + +-------------------+---------------------+---------------------+ + | PersonalInfo | value | Sections 2.10.1, | + | | | 2.10.2, and 2.10.3 | + +-------------------+---------------------+---------------------+ + | Phone | @type | not applicable | + +-------------------+---------------------+---------------------+ + | Phone | contexts | Section 2.3.22 | + +-------------------+---------------------+---------------------+ + | Phone | features | Section 2.7.6 | + +-------------------+---------------------+---------------------+ + | Phone | label | Section 2.11.11 | + +-------------------+---------------------+---------------------+ + | Phone | number | Section 2.7.6 | + +-------------------+---------------------+---------------------+ + | Phone | pref | Section 2.3.17 | + +-------------------+---------------------+---------------------+ + | Pronouns | @type | not applicable | + +-------------------+---------------------+---------------------+ + | Pronouns | contexts | Section 2.3.22 | + +-------------------+---------------------+---------------------+ + | Pronouns | pref | Section 2.3.17 | + +-------------------+---------------------+---------------------+ + | Pronouns | pronouns | Section 2.5.4 | + +-------------------+---------------------+---------------------+ + | Relation | @type | not applicable | + +-------------------+---------------------+---------------------+ + | Relation | relation | Section 2.9.5 | + +-------------------+---------------------+---------------------+ + | Resource | @type | not applicable | + +-------------------+---------------------+---------------------+ + | SchedulingAddress | @type | not applicable | + +-------------------+---------------------+---------------------+ + | SchedulingAddress | contexts | Section 2.3.22 | + +-------------------+---------------------+---------------------+ + | SchedulingAddress | label | Section 2.11.11 | + +-------------------+---------------------+---------------------+ + | SchedulingAddress | pref | Section 2.3.17 | + +-------------------+---------------------+---------------------+ + | SchedulingAddress | uri | Section 2.13.1 | + +-------------------+---------------------+---------------------+ + | SpeakToAs | @type | not applicable | + +-------------------+---------------------+---------------------+ + | SpeakToAs | grammaticalGender | Section 2.5.4 | + +-------------------+---------------------+---------------------+ + | SpeakToAs | pronouns | Section 2.5.4 | + +-------------------+---------------------+---------------------+ + | AddressComponent | @type | not applicable | + +-------------------+---------------------+---------------------+ + | AddressComponent | kind | Section 2.6.1 | + +-------------------+---------------------+---------------------+ + | AddressComponent | value | Section 2.6.1 | + +-------------------+---------------------+---------------------+ + | Timestamp | @type | not applicable | + +-------------------+---------------------+---------------------+ + | Timestamp | utc | Section 2.2.2 | + +-------------------+---------------------+---------------------+ + | Title | @type | not applicable | + +-------------------+---------------------+---------------------+ + | Title | kind | Section 2.9.6 | + +-------------------+---------------------+---------------------+ + | Title | name | Section 2.9.6 | + +-------------------+---------------------+---------------------+ + | Title | organizationId | Section 2.9.6 | + +-------------------+---------------------+---------------------+ + + Table 8: Conversion Rules for JSContact Types and Properties + +Acknowledgements + + The definition and examples of the PHONETIC (Section 2.3.15) and + SCRIPT (Section 2.3.19) parameters are based on the initial draft + version of [vOBJECT]. + +Authors' Addresses + + Mario Loffredo + IIT-CNR/Registro.it + Via Moruzzi, 1 + 56124 Pisa + Italy + Email: mario.loffredo@iit.cnr.it + URI: https://www.iit.cnr.it + + + Robert Stepanek + Fastmail + PO Box 234 + Collins St. West + Melbourne VIC 8007 + Australia + Email: rsto@fastmailteam.com + URI: https://www.fastmail.com |