1 | import { __assign } from "tslib";
|
2 | import { freqIsDailyOrGreater } from './types';
|
3 | import { includes, notEmpty, isPresent, isNumber, isArray, isWeekdayStr } from './helpers';
|
4 | import RRule, { defaultKeys, DEFAULT_OPTIONS } from './rrule';
|
5 | import dateutil from './dateutil';
|
6 | import { Weekday } from './weekday';
|
7 | import { Time } from './datetime';
|
8 | export function initializeOptions(options) {
|
9 | var invalid = [];
|
10 | var keys = Object.keys(options);
|
11 |
|
12 | for (var _i = 0, keys_1 = keys; _i < keys_1.length; _i++) {
|
13 | var key = keys_1[_i];
|
14 | if (!includes(defaultKeys, key))
|
15 | invalid.push(key);
|
16 | if (dateutil.isDate(options[key]) && !dateutil.isValidDate(options[key]))
|
17 | invalid.push(key);
|
18 | }
|
19 | if (invalid.length) {
|
20 | throw new Error('Invalid options: ' + invalid.join(', '));
|
21 | }
|
22 | return __assign({}, options);
|
23 | }
|
24 | export function parseOptions(options) {
|
25 | var opts = __assign(__assign({}, DEFAULT_OPTIONS), initializeOptions(options));
|
26 | if (isPresent(opts.byeaster))
|
27 | opts.freq = RRule.YEARLY;
|
28 | if (!(isPresent(opts.freq) && RRule.FREQUENCIES[opts.freq])) {
|
29 | throw new Error("Invalid frequency: " + opts.freq + " " + options.freq);
|
30 | }
|
31 | if (!opts.dtstart)
|
32 | opts.dtstart = new Date(new Date().setMilliseconds(0));
|
33 | if (!isPresent(opts.wkst)) {
|
34 | opts.wkst = RRule.MO.weekday;
|
35 | }
|
36 | else if (isNumber(opts.wkst)) {
|
37 |
|
38 | }
|
39 | else {
|
40 | opts.wkst = opts.wkst.weekday;
|
41 | }
|
42 | if (isPresent(opts.bysetpos)) {
|
43 | if (isNumber(opts.bysetpos))
|
44 | opts.bysetpos = [opts.bysetpos];
|
45 | for (var i = 0; i < opts.bysetpos.length; i++) {
|
46 | var v = opts.bysetpos[i];
|
47 | if (v === 0 || !(v >= -366 && v <= 366)) {
|
48 | throw new Error('bysetpos must be between 1 and 366,' + ' or between -366 and -1');
|
49 | }
|
50 | }
|
51 | }
|
52 | if (!(Boolean(opts.byweekno) ||
|
53 | notEmpty(opts.byweekno) ||
|
54 | notEmpty(opts.byyearday) ||
|
55 | Boolean(opts.bymonthday) ||
|
56 | notEmpty(opts.bymonthday) ||
|
57 | isPresent(opts.byweekday) ||
|
58 | isPresent(opts.byeaster))) {
|
59 | switch (opts.freq) {
|
60 | case RRule.YEARLY:
|
61 | if (!opts.bymonth)
|
62 | opts.bymonth = opts.dtstart.getUTCMonth() + 1;
|
63 | opts.bymonthday = opts.dtstart.getUTCDate();
|
64 | break;
|
65 | case RRule.MONTHLY:
|
66 | opts.bymonthday = opts.dtstart.getUTCDate();
|
67 | break;
|
68 | case RRule.WEEKLY:
|
69 | opts.byweekday = [dateutil.getWeekday(opts.dtstart)];
|
70 | break;
|
71 | }
|
72 | }
|
73 |
|
74 | if (isPresent(opts.bymonth) && !isArray(opts.bymonth)) {
|
75 | opts.bymonth = [opts.bymonth];
|
76 | }
|
77 |
|
78 | if (isPresent(opts.byyearday) &&
|
79 | !isArray(opts.byyearday) &&
|
80 | isNumber(opts.byyearday)) {
|
81 | opts.byyearday = [opts.byyearday];
|
82 | }
|
83 |
|
84 | if (!isPresent(opts.bymonthday)) {
|
85 | opts.bymonthday = [];
|
86 | opts.bynmonthday = [];
|
87 | }
|
88 | else if (isArray(opts.bymonthday)) {
|
89 | var bymonthday = [];
|
90 | var bynmonthday = [];
|
91 | for (var i = 0; i < opts.bymonthday.length; i++) {
|
92 | var v = opts.bymonthday[i];
|
93 | if (v > 0) {
|
94 | bymonthday.push(v);
|
95 | }
|
96 | else if (v < 0) {
|
97 | bynmonthday.push(v);
|
98 | }
|
99 | }
|
100 | opts.bymonthday = bymonthday;
|
101 | opts.bynmonthday = bynmonthday;
|
102 | }
|
103 | else if (opts.bymonthday < 0) {
|
104 | opts.bynmonthday = [opts.bymonthday];
|
105 | opts.bymonthday = [];
|
106 | }
|
107 | else {
|
108 | opts.bynmonthday = [];
|
109 | opts.bymonthday = [opts.bymonthday];
|
110 | }
|
111 |
|
112 | if (isPresent(opts.byweekno) && !isArray(opts.byweekno)) {
|
113 | opts.byweekno = [opts.byweekno];
|
114 | }
|
115 |
|
116 | if (!isPresent(opts.byweekday)) {
|
117 | opts.bynweekday = null;
|
118 | }
|
119 | else if (isNumber(opts.byweekday)) {
|
120 | opts.byweekday = [opts.byweekday];
|
121 | opts.bynweekday = null;
|
122 | }
|
123 | else if (isWeekdayStr(opts.byweekday)) {
|
124 | opts.byweekday = [Weekday.fromStr(opts.byweekday).weekday];
|
125 | opts.bynweekday = null;
|
126 | }
|
127 | else if (opts.byweekday instanceof Weekday) {
|
128 | if (!opts.byweekday.n || opts.freq > RRule.MONTHLY) {
|
129 | opts.byweekday = [opts.byweekday.weekday];
|
130 | opts.bynweekday = null;
|
131 | }
|
132 | else {
|
133 | opts.bynweekday = [[opts.byweekday.weekday, opts.byweekday.n]];
|
134 | opts.byweekday = null;
|
135 | }
|
136 | }
|
137 | else {
|
138 | var byweekday = [];
|
139 | var bynweekday = [];
|
140 | for (var i = 0; i < opts.byweekday.length; i++) {
|
141 | var wday = opts.byweekday[i];
|
142 | if (isNumber(wday)) {
|
143 | byweekday.push(wday);
|
144 | continue;
|
145 | }
|
146 | else if (isWeekdayStr(wday)) {
|
147 | byweekday.push(Weekday.fromStr(wday).weekday);
|
148 | continue;
|
149 | }
|
150 | if (!wday.n || opts.freq > RRule.MONTHLY) {
|
151 | byweekday.push(wday.weekday);
|
152 | }
|
153 | else {
|
154 | bynweekday.push([wday.weekday, wday.n]);
|
155 | }
|
156 | }
|
157 | opts.byweekday = notEmpty(byweekday) ? byweekday : null;
|
158 | opts.bynweekday = notEmpty(bynweekday) ? bynweekday : null;
|
159 | }
|
160 |
|
161 | if (!isPresent(opts.byhour)) {
|
162 | opts.byhour =
|
163 | opts.freq < RRule.HOURLY ? [opts.dtstart.getUTCHours()] : null;
|
164 | }
|
165 | else if (isNumber(opts.byhour)) {
|
166 | opts.byhour = [opts.byhour];
|
167 | }
|
168 |
|
169 | if (!isPresent(opts.byminute)) {
|
170 | opts.byminute =
|
171 | opts.freq < RRule.MINUTELY ? [opts.dtstart.getUTCMinutes()] : null;
|
172 | }
|
173 | else if (isNumber(opts.byminute)) {
|
174 | opts.byminute = [opts.byminute];
|
175 | }
|
176 |
|
177 | if (!isPresent(opts.bysecond)) {
|
178 | opts.bysecond =
|
179 | opts.freq < RRule.SECONDLY ? [opts.dtstart.getUTCSeconds()] : null;
|
180 | }
|
181 | else if (isNumber(opts.bysecond)) {
|
182 | opts.bysecond = [opts.bysecond];
|
183 | }
|
184 | return { parsedOptions: opts };
|
185 | }
|
186 | export function buildTimeset(opts) {
|
187 | var millisecondModulo = opts.dtstart.getTime() % 1000;
|
188 | if (!freqIsDailyOrGreater(opts.freq)) {
|
189 | return [];
|
190 | }
|
191 | var timeset = [];
|
192 | opts.byhour.forEach(function (hour) {
|
193 | opts.byminute.forEach(function (minute) {
|
194 | opts.bysecond.forEach(function (second) {
|
195 | timeset.push(new Time(hour, minute, second, millisecondModulo));
|
196 | });
|
197 | });
|
198 | });
|
199 | return timeset;
|
200 | }
|
201 |
|
\ | No newline at end of file |