UNPKG

5.99 kBJavaScriptView Raw
1import { __assign } from "tslib";
2import RRule from './rrule';
3import RRuleSet from './rruleset';
4import dateutil from './dateutil';
5import { includes, split } from './helpers';
6import { parseString, parseDtstart } from './parsestring';
7/**
8 * RRuleStr
9 * To parse a set of rrule strings
10 */
11var DEFAULT_OPTIONS = {
12 dtstart: null,
13 cache: false,
14 unfold: false,
15 forceset: false,
16 compatible: false,
17 tzid: null
18};
19export function parseInput(s, options) {
20 var rrulevals = [];
21 var rdatevals = [];
22 var exrulevals = [];
23 var exdatevals = [];
24 var _a = parseDtstart(s), dtstart = _a.dtstart, tzid = _a.tzid;
25 var lines = splitIntoLines(s, options.unfold);
26 lines.forEach(function (line) {
27 if (!line)
28 return;
29 var _a = breakDownLine(line), name = _a.name, parms = _a.parms, value = _a.value;
30 switch (name.toUpperCase()) {
31 case 'RRULE':
32 if (parms.length) {
33 throw new Error("unsupported RRULE parm: " + parms.join(','));
34 }
35 rrulevals.push(parseString(line));
36 break;
37 case 'RDATE':
38 var _b = /RDATE(?:;TZID=([^:=]+))?/i.exec(line), _ = _b[0], rdateTzid = _b[1];
39 if (rdateTzid && !tzid) {
40 tzid = rdateTzid;
41 }
42 rdatevals = rdatevals.concat(parseRDate(value, parms));
43 break;
44 case 'EXRULE':
45 if (parms.length) {
46 throw new Error("unsupported EXRULE parm: " + parms.join(','));
47 }
48 exrulevals.push(parseString(value));
49 break;
50 case 'EXDATE':
51 exdatevals = exdatevals.concat(parseRDate(value, parms));
52 break;
53 case 'DTSTART':
54 break;
55 default:
56 throw new Error('unsupported property: ' + name);
57 }
58 });
59 return {
60 dtstart: dtstart,
61 tzid: tzid,
62 rrulevals: rrulevals,
63 rdatevals: rdatevals,
64 exrulevals: exrulevals,
65 exdatevals: exdatevals
66 };
67}
68function buildRule(s, options) {
69 var _a = parseInput(s, options), rrulevals = _a.rrulevals, rdatevals = _a.rdatevals, exrulevals = _a.exrulevals, exdatevals = _a.exdatevals, dtstart = _a.dtstart, tzid = _a.tzid;
70 var noCache = options.cache === false;
71 if (options.compatible) {
72 options.forceset = true;
73 options.unfold = true;
74 }
75 if (options.forceset ||
76 rrulevals.length > 1 ||
77 rdatevals.length ||
78 exrulevals.length ||
79 exdatevals.length) {
80 var rset_1 = new RRuleSet(noCache);
81 rset_1.dtstart(dtstart);
82 rset_1.tzid(tzid || undefined);
83 rrulevals.forEach(function (val) {
84 rset_1.rrule(new RRule(groomRruleOptions(val, dtstart, tzid), noCache));
85 });
86 rdatevals.forEach(function (date) {
87 rset_1.rdate(date);
88 });
89 exrulevals.forEach(function (val) {
90 rset_1.exrule(new RRule(groomRruleOptions(val, dtstart, tzid), noCache));
91 });
92 exdatevals.forEach(function (date) {
93 rset_1.exdate(date);
94 });
95 if (options.compatible && options.dtstart)
96 rset_1.rdate(dtstart);
97 return rset_1;
98 }
99 var val = rrulevals[0] || {};
100 return new RRule(groomRruleOptions(val, val.dtstart || options.dtstart || dtstart, val.tzid || options.tzid || tzid), noCache);
101}
102export function rrulestr(s, options) {
103 if (options === void 0) { options = {}; }
104 return buildRule(s, initializeOptions(options));
105}
106function groomRruleOptions(val, dtstart, tzid) {
107 return __assign(__assign({}, val), { dtstart: dtstart,
108 tzid: tzid });
109}
110function initializeOptions(options) {
111 var invalid = [];
112 var keys = Object.keys(options);
113 var defaultKeys = Object.keys(DEFAULT_OPTIONS);
114 keys.forEach(function (key) {
115 if (!includes(defaultKeys, key))
116 invalid.push(key);
117 });
118 if (invalid.length) {
119 throw new Error('Invalid options: ' + invalid.join(', '));
120 }
121 return __assign(__assign({}, DEFAULT_OPTIONS), options);
122}
123function extractName(line) {
124 if (line.indexOf(':') === -1) {
125 return {
126 name: 'RRULE',
127 value: line
128 };
129 }
130 var _a = split(line, ':', 1), name = _a[0], value = _a[1];
131 return {
132 name: name,
133 value: value
134 };
135}
136function breakDownLine(line) {
137 var _a = extractName(line), name = _a.name, value = _a.value;
138 var parms = name.split(';');
139 if (!parms)
140 throw new Error('empty property name');
141 return {
142 name: parms[0].toUpperCase(),
143 parms: parms.slice(1),
144 value: value
145 };
146}
147function splitIntoLines(s, unfold) {
148 if (unfold === void 0) { unfold = false; }
149 s = s && s.trim();
150 if (!s)
151 throw new Error('Invalid empty string');
152 // More info about 'unfold' option
153 // Go head to http://www.ietf.org/rfc/rfc2445.txt
154 if (!unfold) {
155 return s.split(/\s/);
156 }
157 var lines = s.split('\n');
158 var i = 0;
159 while (i < lines.length) {
160 // TODO
161 var line = (lines[i] = lines[i].replace(/\s+$/g, ''));
162 if (!line) {
163 lines.splice(i, 1);
164 }
165 else if (i > 0 && line[0] === ' ') {
166 lines[i - 1] += line.slice(1);
167 lines.splice(i, 1);
168 }
169 else {
170 i += 1;
171 }
172 }
173 return lines;
174}
175function validateDateParm(parms) {
176 parms.forEach(function (parm) {
177 if (!/(VALUE=DATE(-TIME)?)|(TZID=)/.test(parm)) {
178 throw new Error('unsupported RDATE/EXDATE parm: ' + parm);
179 }
180 });
181}
182function parseRDate(rdateval, parms) {
183 validateDateParm(parms);
184 return rdateval
185 .split(',')
186 .map(function (datestr) { return dateutil.untilStringToDate(datestr); });
187}
188//# sourceMappingURL=rrulestr.js.map
\No newline at end of file