UNPKG

rrule

Version:

JavaScript library for working with recurrence rules for calendar dates.

206 lines 6.55 kB
var __assign = (this && this.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; import RRule from './rrule'; import RRuleSet from './rruleset'; import dateutil from './dateutil'; import { includes, split } from './helpers'; import { parseString, parseDtstart } from './parsestring'; /** * RRuleStr * To parse a set of rrule strings */ var DEFAULT_OPTIONS = { dtstart: null, cache: false, unfold: false, forceset: false, compatible: false, tzid: null }; export function parseInput(s, options) { var rrulevals = []; var rdatevals = []; var exrulevals = []; var exdatevals = []; var _a = parseDtstart(s), dtstart = _a.dtstart, tzid = _a.tzid; var lines = splitIntoLines(s, options.unfold); lines.forEach(function (line) { if (!line) return; var _a = breakDownLine(line), name = _a.name, parms = _a.parms, value = _a.value; switch (name.toUpperCase()) { case 'RRULE': if (parms.length) { throw new Error("unsupported RRULE parm: " + parms.join(',')); } rrulevals.push(parseString(line)); break; case 'RDATE': var _b = /RDATE(?:;TZID=([^:=]+))?/i.exec(line), _ = _b[0], rdateTzid = _b[1]; if (rdateTzid && !tzid) { tzid = rdateTzid; } rdatevals = rdatevals.concat(parseRDate(value, parms)); break; case 'EXRULE': if (parms.length) { throw new Error("unsupported EXRULE parm: " + parms.join(',')); } exrulevals.push(parseString(value)); break; case 'EXDATE': exdatevals = exdatevals.concat(parseRDate(value, parms)); break; case 'DTSTART': break; default: throw new Error('unsupported property: ' + name); } }); return { // @ts-ignore dtstart: dtstart, // @ts-ignore tzid: tzid, rrulevals: rrulevals, rdatevals: rdatevals, exrulevals: exrulevals, exdatevals: exdatevals }; } function buildRule(s, options) { var _a = parseInput(s, options), rrulevals = _a.rrulevals, rdatevals = _a.rdatevals, exrulevals = _a.exrulevals, exdatevals = _a.exdatevals, dtstart = _a.dtstart, tzid = _a.tzid; var noCache = options.cache === false; if (options.compatible) { options.forceset = true; options.unfold = true; } if (options.forceset || rrulevals.length > 1 || rdatevals.length || exrulevals.length || exdatevals.length) { var rset_1 = new RRuleSet(noCache); rset_1.tzid(tzid || undefined); rrulevals.forEach(function (val) { rset_1.rrule(new RRule(groomRruleOptions(val, dtstart, tzid), noCache)); }); rdatevals.forEach(function (date) { rset_1.rdate(date); }); exrulevals.forEach(function (val) { rset_1.exrule(new RRule(groomRruleOptions(val, dtstart, tzid), noCache)); }); exdatevals.forEach(function (date) { rset_1.exdate(date); }); // @ts-ignore if (options.compatible && options.dtstart) rset_1.rdate(dtstart); return rset_1; } var val = rrulevals[0]; return new RRule(groomRruleOptions(val, val.dtstart || options.dtstart || dtstart, val.tzid || options.tzid || tzid), noCache); } export function rrulestr(s, options) { if (options === void 0) { options = {}; } return buildRule(s, initializeOptions(options)); } function groomRruleOptions(val, dtstart, tzid) { return __assign({}, val, { dtstart: dtstart, tzid: tzid }); } function initializeOptions(options) { var invalid = []; var keys = Object.keys(options); var defaultKeys = Object.keys(DEFAULT_OPTIONS); keys.forEach(function (key) { if (!includes(defaultKeys, key)) invalid.push(key); }); if (invalid.length) { throw new Error('Invalid options: ' + invalid.join(', ')); } var initializedOptions = __assign({}, options); // Merge in default options defaultKeys.forEach(function (key) { if (!includes(keys, key)) initializedOptions[key] = DEFAULT_OPTIONS[key]; }); return initializedOptions; } function extractName(line) { if (line.indexOf(':') === -1) { return { name: 'RRULE', value: line }; } var _a = split(line, ':', 1), name = _a[0], value = _a[1]; return { name: name, value: value }; } function breakDownLine(line) { var _a = extractName(line), name = _a.name, value = _a.value; var parms = name.split(';'); if (!parms) throw new Error('empty property name'); return { name: parms[0].toUpperCase(), parms: parms.slice(1), value: value }; } function splitIntoLines(s, unfold) { if (unfold === void 0) { unfold = false; } s = s && s.trim(); if (!s) throw new Error('Invalid empty string'); // More info about 'unfold' option // Go head to http://www.ietf.org/rfc/rfc2445.txt if (!unfold) { return s.split(/\s/); } var lines = s.split('\n'); var i = 0; while (i < lines.length) { // TODO var line = (lines[i] = lines[i].replace(/\s+$/g, '')); if (!line) { lines.splice(i, 1); } else if (i > 0 && line[0] === ' ') { lines[i - 1] += line.slice(1); lines.splice(i, 1); } else { i += 1; } } return lines; } function validateDateParm(parms) { parms.forEach(function (parm) { if (!/(VALUE=DATE(-TIME)?)|(TZID=)/.test(parm)) { throw new Error('unsupported RDATE/EXDATE parm: ' + parm); } }); } function parseRDate(rdateval, parms) { validateDateParm(parms); return rdateval .split(',') .map(function (datestr) { return dateutil.untilStringToDate(datestr); }); } //# sourceMappingURL=rrulestr.js.map