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 | }
|
20 | if (invalid.length) {
|
21 | throw new Error('Invalid options: ' + invalid.join(', '));
|
22 | }
|
23 | return __assign({}, options);
|
24 | }
|
25 | export function parseOptions(options) {
|
26 | var opts = __assign(__assign({}, DEFAULT_OPTIONS), initializeOptions(options));
|
27 | if (isPresent(opts.byeaster))
|
28 | opts.freq = RRule.YEARLY;
|
29 | if (!(isPresent(opts.freq) && RRule.FREQUENCIES[opts.freq])) {
|
30 | throw new Error("Invalid frequency: ".concat(opts.freq, " ").concat(options.freq));
|
31 | }
|
32 | if (!opts.dtstart)
|
33 | opts.dtstart = new Date(new Date().setMilliseconds(0));
|
34 | if (!isPresent(opts.wkst)) {
|
35 | opts.wkst = RRule.MO.weekday;
|
36 | }
|
37 | else if (isNumber(opts.wkst)) {
|
38 |
|
39 | }
|
40 | else {
|
41 | opts.wkst = opts.wkst.weekday;
|
42 | }
|
43 | if (isPresent(opts.bysetpos)) {
|
44 | if (isNumber(opts.bysetpos))
|
45 | opts.bysetpos = [opts.bysetpos];
|
46 | for (var i = 0; i < opts.bysetpos.length; i++) {
|
47 | var v = opts.bysetpos[i];
|
48 | if (v === 0 || !(v >= -366 && v <= 366)) {
|
49 | throw new Error('bysetpos must be between 1 and 366,' + ' or between -366 and -1');
|
50 | }
|
51 | }
|
52 | }
|
53 | if (!(Boolean(opts.byweekno) ||
|
54 | notEmpty(opts.byweekno) ||
|
55 | notEmpty(opts.byyearday) ||
|
56 | Boolean(opts.bymonthday) ||
|
57 | notEmpty(opts.bymonthday) ||
|
58 | isPresent(opts.byweekday) ||
|
59 | isPresent(opts.byeaster))) {
|
60 | switch (opts.freq) {
|
61 | case RRule.YEARLY:
|
62 | if (!opts.bymonth)
|
63 | opts.bymonth = opts.dtstart.getUTCMonth() + 1;
|
64 | opts.bymonthday = opts.dtstart.getUTCDate();
|
65 | break;
|
66 | case RRule.MONTHLY:
|
67 | opts.bymonthday = opts.dtstart.getUTCDate();
|
68 | break;
|
69 | case RRule.WEEKLY:
|
70 | opts.byweekday = [dateutil.getWeekday(opts.dtstart)];
|
71 | break;
|
72 | }
|
73 | }
|
74 |
|
75 | if (isPresent(opts.bymonth) && !isArray(opts.bymonth)) {
|
76 | opts.bymonth = [opts.bymonth];
|
77 | }
|
78 |
|
79 | if (isPresent(opts.byyearday) &&
|
80 | !isArray(opts.byyearday) &&
|
81 | isNumber(opts.byyearday)) {
|
82 | opts.byyearday = [opts.byyearday];
|
83 | }
|
84 |
|
85 | if (!isPresent(opts.bymonthday)) {
|
86 | opts.bymonthday = [];
|
87 | opts.bynmonthday = [];
|
88 | }
|
89 | else if (isArray(opts.bymonthday)) {
|
90 | var bymonthday = [];
|
91 | var bynmonthday = [];
|
92 | for (var i = 0; i < opts.bymonthday.length; i++) {
|
93 | var v = opts.bymonthday[i];
|
94 | if (v > 0) {
|
95 | bymonthday.push(v);
|
96 | }
|
97 | else if (v < 0) {
|
98 | bynmonthday.push(v);
|
99 | }
|
100 | }
|
101 | opts.bymonthday = bymonthday;
|
102 | opts.bynmonthday = bynmonthday;
|
103 | }
|
104 | else if (opts.bymonthday < 0) {
|
105 | opts.bynmonthday = [opts.bymonthday];
|
106 | opts.bymonthday = [];
|
107 | }
|
108 | else {
|
109 | opts.bynmonthday = [];
|
110 | opts.bymonthday = [opts.bymonthday];
|
111 | }
|
112 |
|
113 | if (isPresent(opts.byweekno) && !isArray(opts.byweekno)) {
|
114 | opts.byweekno = [opts.byweekno];
|
115 | }
|
116 |
|
117 | if (!isPresent(opts.byweekday)) {
|
118 | opts.bynweekday = null;
|
119 | }
|
120 | else if (isNumber(opts.byweekday)) {
|
121 | opts.byweekday = [opts.byweekday];
|
122 | opts.bynweekday = null;
|
123 | }
|
124 | else if (isWeekdayStr(opts.byweekday)) {
|
125 | opts.byweekday = [Weekday.fromStr(opts.byweekday).weekday];
|
126 | opts.bynweekday = null;
|
127 | }
|
128 | else if (opts.byweekday instanceof Weekday) {
|
129 | if (!opts.byweekday.n || opts.freq > RRule.MONTHLY) {
|
130 | opts.byweekday = [opts.byweekday.weekday];
|
131 | opts.bynweekday = null;
|
132 | }
|
133 | else {
|
134 | opts.bynweekday = [[opts.byweekday.weekday, opts.byweekday.n]];
|
135 | opts.byweekday = null;
|
136 | }
|
137 | }
|
138 | else {
|
139 | var byweekday = [];
|
140 | var bynweekday = [];
|
141 | for (var i = 0; i < opts.byweekday.length; i++) {
|
142 | var wday = opts.byweekday[i];
|
143 | if (isNumber(wday)) {
|
144 | byweekday.push(wday);
|
145 | continue;
|
146 | }
|
147 | else if (isWeekdayStr(wday)) {
|
148 | byweekday.push(Weekday.fromStr(wday).weekday);
|
149 | continue;
|
150 | }
|
151 | if (!wday.n || opts.freq > RRule.MONTHLY) {
|
152 | byweekday.push(wday.weekday);
|
153 | }
|
154 | else {
|
155 | bynweekday.push([wday.weekday, wday.n]);
|
156 | }
|
157 | }
|
158 | opts.byweekday = notEmpty(byweekday) ? byweekday : null;
|
159 | opts.bynweekday = notEmpty(bynweekday) ? bynweekday : null;
|
160 | }
|
161 |
|
162 | if (!isPresent(opts.byhour)) {
|
163 | opts.byhour = 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 |