1 | import { __assign } from "tslib";
|
2 | import RRule from './rrule';
|
3 | import RRuleSet from './rruleset';
|
4 | import dateutil from './dateutil';
|
5 | import { includes, split } from './helpers';
|
6 | import { parseString, parseDtstart } from './parsestring';
|
7 |
|
8 |
|
9 |
|
10 |
|
11 | var DEFAULT_OPTIONS = {
|
12 | dtstart: null,
|
13 | cache: false,
|
14 | unfold: false,
|
15 | forceset: false,
|
16 | compatible: false,
|
17 | tzid: null
|
18 | };
|
19 | export 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 | }
|
68 | function 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 | }
|
102 | export function rrulestr(s, options) {
|
103 | if (options === void 0) { options = {}; }
|
104 | return buildRule(s, initializeOptions(options));
|
105 | }
|
106 | function groomRruleOptions(val, dtstart, tzid) {
|
107 | return __assign(__assign({}, val), { dtstart: dtstart,
|
108 | tzid: tzid });
|
109 | }
|
110 | function 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 | }
|
123 | function 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 | }
|
136 | function 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 | }
|
147 | function 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 |
|
153 |
|
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 |
|
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 | }
|
175 | function 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 | }
|
182 | function parseRDate(rdateval, parms) {
|
183 | validateDateParm(parms);
|
184 | return rdateval
|
185 | .split(',')
|
186 | .map(function (datestr) { return dateutil.untilStringToDate(datestr); });
|
187 | }
|
188 |
|
\ | No newline at end of file |