{"id":17191737,"url":"https://github.com/iammatis/ikalendar","last_synced_at":"2025-08-02T11:09:52.026Z","repository":{"id":36245566,"uuid":"221412098","full_name":"iammatis/iKalendar","owner":"iammatis","description":"iCalendar format builder and parser","archived":false,"fork":false,"pushed_at":"2023-10-19T05:21:44.000Z","size":664,"stargazers_count":6,"open_issues_count":7,"forks_count":3,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-07-04T10:43:56.812Z","etag":null,"topics":["builder","ical","icalendar","icalendar-format","parser","rfc-5455"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"isc","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/iammatis.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2019-11-13T08:41:52.000Z","updated_at":"2024-05-01T14:34:36.000Z","dependencies_parsed_at":"2025-04-13T20:09:13.596Z","dependency_job_id":"a60c9582-bfe9-4461-b930-908f878d4ae0","html_url":"https://github.com/iammatis/iKalendar","commit_stats":null,"previous_names":[],"tags_count":20,"template":false,"template_full_name":null,"purl":"pkg:github/iammatis/iKalendar","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iammatis%2FiKalendar","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iammatis%2FiKalendar/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iammatis%2FiKalendar/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iammatis%2FiKalendar/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/iammatis","download_url":"https://codeload.github.com/iammatis/iKalendar/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iammatis%2FiKalendar/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":268378811,"owners_count":24240896,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-02T02:00:12.353Z","response_time":74,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["builder","ical","icalendar","icalendar-format","parser","rfc-5455"],"created_at":"2024-10-15T01:27:14.605Z","updated_at":"2025-08-02T11:09:52.000Z","avatar_url":"https://github.com/iammatis.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# iKalendar\n\n[![NPM](https://nodei.co/npm/ikalendar.png?compact=true)](https://nodei.co/npm/ikalendar/)\n\n[![Build Status](https://travis-ci.org/iammatis/iKalendar.svg?branch=master)](https://travis-ci.org/iammatis/iKalendar)\n\n**IMPORTANT: This is an early stage release and project structure can change greatly!**\n\nParser and builder for iCalendar ([RFC 5545](https://tools.ietf.org/html/rfc5545)) data format\n\n## Table of Contents\n\n- [Install](#install)\n- [Usage](#usage)\n    - [Builder](#builder)\n    - [Parser](#parser)\n- [Types](#types)\n- [License](#license)\n- [Credits](#credits)\n\n## Install\n\n```\nnpm instal ikalendar\n```\n\n## Usage\n\n\n### Builder\n```typescript\nimport { Builder, Calendar } from 'ikalendar'\n\nconst calendar: Calendar = {\n    version: '2.0',\n    prodId: 'Awesome project prodId',\n    events: [\n        {\n            start: '20101231T083000Z',\n            uid: 'uid1@example.com'\n        }\n    ]\n}\n\nconst builder = new Builder(calendar)\nbuilder.build()\n\n// Returns:\n// \n// BEGIN:VCALENDAR\n// VERSION:2.0\n// PRODID:Awesome project prodId\n// BEGIN:VEVENT\n// DTSTAMP:20101231T083000Z\n// UID:uid1@example.com\n// END:VEVENT\n// END:VCALENDAR\n```\n\n### Parser\n```typescript\nimport { Parser } from 'ikalendar'\n\nconst str = `BEGIN:VCALENDAR\nVERSION:2.0\nPRODID:Awesome project prodId\nBEGIN:VEVENT\nDTSTAMP:20101231T083000Z\nUID:uid1@example.com\nEND:VEVENT\nEND:VCALENDAR\n`\n\nconst parser = new Parser()\nparser.parse(str)\n\n// Returns:\n// \n// {\n//     version: '2.0',\n//     prodId: 'Awesome project prodId',\n//     events: [\n//         {\n//             start: '20101231T083000Z',\n//             uid: 'uid1@example.com'\n//         }\n//     ]\n// }\n```\n\n## Components\n\n**iKalendar** can generate `event`, `alarm` and `timezone` component.\n\n### Timezone\n\nTimezone component can be generated two ways:\n\n1. By supplying all the necessary timezone information\n\n```javascript\nconst builder = new Builder({\n    version: '2.0',\n    prodId: '-//RDU Software//NONSGML HandCal//EN',\n    timezone: {\n        tzId: 'America/New_York',\n        tzUrl: 'http://tzurl.org/zoneinfo-outlook/America/New_York',\n        standard: [\n            {\n                start: '19701101T020000',\n                offsetFrom: '-0400',\n                offsetTo: '-0500',\n                tzName: 'EST',\n                rrule: new RRule({\n                    freq: RRule.YEARLY,\n                    bymonth: 11,\n                    byweekday: [ RRule.SU.nth(1) ]\n                })\n            }\n        ],\n        daylight: [\n            {\n                start: '19700308T020000',\n                offsetFrom: '-0500',\n                offsetTo: '-0400',\n                tzName: 'EDT',\n                rrule: new RRule({\n                    freq: RRule.YEARLY,\n                    bymonth: 3,\n                    byweekday: [ RRule.SU.nth(2) ]\n                })\n            }\n        ],\n        xProps: [\n            {\n                name: 'LIC-LOCATION',\n                value: 'America/New_York'\n            }\n        ]\n    },\n    events: [\n        {\n            uid: 'guid-1.example.com',\n            description: 'Project XYZ Review Meeting',\n            summary: 'XYZ Project Review',\n            categories: [ 'MEETING' ],\n            class: 'PUBLIC',\n            dtStamp: '19980309T231000Z',\n            created: '19980309T130000Z',\n            start: { value: '19980312T083000', tzId: 'America/New_York' },\n            end: { value: '19980312T093000', tzId: 'America/New_York' }\n        }\n    ]\n})\n```\n\n2. By mentioning `tzId` in the event `start` attribute and not supplying any timezone information\n```javascript\nconst builder = new Builder({\n    version: '2.0',\n    prodId: '-//RDU Software//NONSGML HandCal//EN',\n    events: [\n        {\n            uid: 'guid-1.example.com',\n            description: 'Project XYZ Review Meeting',\n            summary: 'XYZ Project Review',\n            categories: [ 'MEETING' ],\n            class: 'PUBLIC',\n            dtStamp: '19980309T231000Z',\n            created: '19980309T130000Z',\n            start: { value: '19980312T083000', tzId: 'America/New_York' },\n            end: { value: '19980312T093000', tzId: 'America/New_York' }\n        }\n    ]\n})\n```\n\nBoth will generate the same output:\n```\nBEGIN:VCALENDAR\nVERSION:2.0\nPRODID:-//RDU Software//NONSGML HandCal//EN\nBEGIN:VTIMEZONE\nTZID:America/New_York\nTZURL:http://tzurl.org/zoneinfo-outlook/America/New_York\nX-LIC-LOCATION:America/New_York\nBEGIN:DAYLIGHT\nTZOFFSETFROM:-0500\nTZOFFSETTO:-0400\nTZNAME:EDT\nDTSTART:19700308T020000\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\nEND:DAYLIGHT\nBEGIN:STANDARD\nTZOFFSETFROM:-0400\nTZOFFSETTO:-0500\nTZNAME:EST\nDTSTART:19701101T020000\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\nEND:STANDARD\nEND:VTIMEZONE\nBEGIN:VEVENT\nDTSTAMP:19980309T231000Z\nUID:guid-1.example.com\nDTSTART;TZID=America/New_York:19980312T083000\nCLASS:PUBLIC\nCREATED:19980309T130000Z\nSUMMARY:XYZ Project Review\nDESCRIPTION:Project XYZ Review Meeting\nDTEND;TZID=America/New_York:19980312T093000\nCATEGORIES:MEETING\nEND:VEVENT\nEND:VCALENDAR\n```\n\n## Types\n\n### Date\n\niCal format supports multiple different [Date](https://tools.ietf.org/html/rfc5545#section-3.3.4)/[Date-Time](https://tools.ietf.org/html/rfc5545#section-3.3.5) formats, iKalendar (for now) expects you to to supply it with valid iCalendar format. It won't take care of any kind of parsing or formatting. \n\nI'll use `DTSTART` property for this example. You can create this property multiple ways:\n\n1. Plain string:\n    ```js\n    start:'19980118T230000'\n    // DTSTART:19980118T230000\n    ```\n2. Object ([ComplexDate](https://github.com/iammatis/iKalendar/blob/master/src/types/general.ts#L45)) with following attributes: \n    ```ts\n    type ComplexDate = {\n        type?: 'DATE-TIME' | 'DATE'\n        tzId?: string\n        value: string\n    }\n    ```\n    * Passing `tzId`\n    ```js\n    start:{value: '19980118T025436', tzId: 'America/Los_Angeles'}\n    // DTSTART;TZID=America/Los_Angeles:20200217T025436\n    ```\n    * You can also specify `type: 'DATE'`\n    ```js\n    start:{value: '19980118', type: 'DATE'}\n    // DTSTART:19980118\n    ```\n    * Or use all three attributes:\n    ```js\n    start:{value: '19980301T090000', type: 'DATE-TIME', tzId: 'Europe/Bratislava'}\n    // DTSTART;VALUE=DATE-TIME;TZID=Europe/Bratislava:19980301T090000\n    ```\n\n## Credits\n\nThis library uses regex used in [iCalendar Ruby library](https://github.com/icalendar/icalendar).\n\n## License\n\nThis project is licensed under the ISC License - see the [LICENSE.md](LICENSE.md) file for details\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fiammatis%2Fikalendar","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fiammatis%2Fikalendar","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fiammatis%2Fikalendar/lists"}