Skip to content

ICal generator/updater/parser with Timezone/DST, Alams, Organizers, Events, etc. support.

License

Notifications You must be signed in to change notification settings

CatGuardian/node-ical-toolkit

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

41 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

#ICal Toolkit NodeJS ICal generator/updater/parser with Timezone/DST, Alams, Organizers, Events, etc. support.

100% JavaScript implementation.

NPM

Ical generator supports the following:

  • VTIMEZONE - TIMEZONE/DST info. We have inbuilt timezone database, you just specify TimeZone ID and rest module will take care.
  • Alarms
  • Attendees info and state per event.
  • Organizers
  • Multiple events
  • Full day and repeating events
  • URL property
  • Simple intuitive interface.

##Install

> npm install ical-toolkit

##Builder Quick documentation, but covers all and will get you going quick!

####Values to use: Here are the constants you can use:

#####Attendee Role

"REQ-PARTICIPANT"; Indicates a participant whose
                 ; participation is required

"OPT-PARTICIPANT" ; Indicates a participant whose
                  ; participation is optional

"NON-PARTICIPANT" ; Indicates a participant who is
                  ; copied for information purposes only

#####Attendee Status

"NEEDS-ACTION"        ; Event needs action
"ACCEPTED"            ; Event accepted
"DECLINED"            ; Event declined
"TENTATIVE"           ; Event tentatively accepted
"DELEGATED"           ; Event delegated

#####Methods

      'PUBLISH',
      'REQUEST',
      'REPLY',
      'ADD',
      'CANCEL',
      'REFRESH',
      'COUNTER',
      'DECLINECOUNTER'

#####Repeating Freq for event

      'SECONDLY',
      'MINUTELY',
      'HOURLY',
      'DAILY',
      'WEEKLY',
      'MONTHLY',
      'YEARLY'

#####Statuses for event

      'CONFIRMED',
      'TENTATIVE',
      'CANCELLED'

###Demo code, shows all.

var icalToolkit = require('ical-toolkit');

//Create a builder
var builder = icalToolkit.createIcsFileBuilder();

/*
 * Settings (All Default values shown below. It is optional to specify)
 * */
builder.spacers = true; //Add space in ICS file, better human reading. Default: true
builder.NEWLINE_CHAR = '\r\n'; //Newline char to use.
builder.throwError = false; //If true throws errors, else returns error when you do .toString() to generate the file contents.
builder.ignoreTZIDMismatch = true; //If TZID is invalid, ignore or not to ignore!


/**
 * Build ICS
 * */

//Name of calander 'X-WR-CALNAME' tag.
builder.calname = 'Yo Cal';

//Cal timezone 'X-WR-TIMEZONE' tag. Optional. We recommend it to be same as tzid.
builder.timezone = 'america/new_york';

//Time Zone ID. This will automatically add VTIMEZONE info.
builder.tzid = 'america/new_york';

//Method
builder.method = 'REQUEST';

//Add events
builder.events.push({

  //Event start time, Required: type Date()
  start: new Date(),

  //Event end time, Required: type Date()
  end: new Date(),

  //transp. Will add TRANSP:OPAQUE to block calendar.
  transp: 'OPAQUE',

  //Event summary, Required: type String
  summary: 'Test Event',

  //All Optionals Below

  //Alarms, array in minutes
  alarms: [15, 10, 5],

  //Optional: If you need to add some of your own tags
  additionalTags: {
    'SOMETAG': 'SOME VALUE'
  },

  //Event identifier, Optional, default auto generated
  uid: null,

  //Optional, The sequence number in update, Default: 0
  sequence: null,

  //Optional if repeating event
  repeating: {
    freq: 'DAILY',
    count: 10,
    interval: 10,
    until: new Date()
  },

  //Optional if all day event
  allDay: true,

  //Creation timestamp, Optional.
  stamp: new Date(),

  //Optional, floating time.
  floating: false,

  //Location of event, optional.
  location: 'Home',

  //Optional description of event.
  description: 'Testing it!',

  //Optional Organizer info
  organizer: {
    name: 'Kushal Likhi',
    email: 'test@mail',
    sentBy: '[email protected]' //OPTIONAL email address of the person who is acting on behalf of organizer.
  },

  //Optional attendees info
  attendees: [
    {
      name: 'A1', //Required
      email: '[email protected]', //Required
      status: 'TENTATIVE', //Optional
      role: 'REQ-PARTICIPANT', //Optional
      rsvp: true //Optional, adds 'RSVP=TRUE' , tells the application that organiser needs a RSVP response.
    },
    {
      name: 'A2',
      email: '[email protected]'
    }
  ]

  //What to do on addition
  method: 'PUBLISH',

  //Status of event
  status: 'CONFIRMED',

  //Url for event on core application, Optional.
  url: 'http://google.com'
});

//Optional tags on VCALENDAR level if you intent to add. Optional field
builder.additionalTags = {
  'SOMETAG': 'SOME VALUE'
};


//Try to build
var icsFileContent = builder.toString();

//Check if there was an error (Only required if yu configured to return error, else error will be thrown.)
if (icsFileContent instanceof Error) {
  console.log('Returned Error, you can also configure to throw errors!');
  //handle error
}

//Here isteh ics file content.
console.log(icsFileContent);

####Output####

BEGIN:VCALENDAR
VERSION:2.0
CALSCALE:GREGORIAN
X-WR-CALNAME:Yo Cal
METHOD:REQUEST
PRODID:node-ical-toolkit
X-WR-TIMEZONE:asia/kalcutta

BEGIN:VTIMEZONE
TZID:America/New_York
X-LIC-LOCATION:America/New_York

BEGIN:DAYLIGHT
TZOFFSETFROM:-0500
TZOFFSETTO:-0400
TZNAME:EDT
DTSTART:19700308T020000
RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
END:DAYLIGHT


BEGIN:STANDARD
TZOFFSETFROM:-0400
TZOFFSETTO:-0500
TZNAME:EST
DTSTART:19701101T020000
RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
END:STANDARD

END:VTIMEZONE


BEGIN:VEVENT
UID:f0e532a3
DTSTAMP:20150707T070727Z
TRANSP:OPAQUE
DTSTART;VALUE=DATE:20150707
DTEND;VALUE=DATE:20150707
SUMMARY:Test Event
SEQUENCE:0
LOCATION:Home
DESCRIPTION:Testing it!
URL;VALUE=URI:http://google.com
STATUS:CONFIRMED
ORGANIZER;SENT-BY="MAILTO:[email protected]":CN="Kushal Likhi":mailto:test@mail
ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=TENTATIVE;RSVP=TRUE;CN=A1:MAILTO:[email protected]
ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;CN=A2:MAILTO:[email protected]

BEGIN:VALARM
TRIGGER:-PT15M
ACTION:DISPLAY
END:VALARM


BEGIN:VALARM
TRIGGER:-PT10M
ACTION:DISPLAY
END:VALARM


BEGIN:VALARM
TRIGGER:-PT5M
ACTION:DISPLAY
END:VALARM

RRULE:FREQ=DAILY;COUNT=10;INTERVAL=10;UNTIL=20150707T070727Z
SOMETAG:SOME VALUE
END:VEVENT

SOMETAG:SOME VALUE
END:VCALENDAR

##Parser## Parse the ics files to JSON structures

    it('should parse the content sync', function (done) {
      var json = icalToolkit.parseToJSON(icsContent);
      assert(json);
      assert(!(json instanceof Error));
      assert(json.VCALENDAR);
      done();
    });

    it('should parse the content async', function (done) {
      icalToolkit.parseToJSON(icsContent, function (err, json) {
        if (err) throw err;
        assert(json);
        assert(!(json instanceof Error));
        assert(json.VCALENDAR);
        done();
      });
    });

    it('should parse the file', function (done) {
      icalToolkit.parseFileToJSON(sampleFilePAth, function (err, json) {
        if (err) throw err;
        assert(json);
        assert(!(json instanceof Error));
        assert(json.VCALENDAR);
        done();
      });
    });

    it('should parse the file sync', function (done) {
      var json = icalToolkit.parseFileToJSONSync(sampleFilePAth);
      assert(json);
      assert(!(json instanceof Error));
      assert(json.VCALENDAR);
      done();
    });

TODO

  1. get test cases on 'json.VCALENDAR' working again
  2. support Organizer:SENTBY
  3. support VALARM element
  4. support VJOURNAL element

Please contribute test cases

Related Projects

moment-timezone

About

ICal generator/updater/parser with Timezone/DST, Alams, Organizers, Events, etc. support.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • JavaScript 100.0%