@atlastodo/shared 0.0.0-stage → 0.1.11-rc.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +661 -0
- package/dist/activity.d.ts +23 -0
- package/dist/avatarColor.d.ts +15 -0
- package/dist/boardMove.d.ts +14 -0
- package/dist/bugReport.d.ts +47 -0
- package/dist/calendar.d.ts +23 -0
- package/dist/comments.d.ts +14 -0
- package/dist/countdown.d.ts +14 -0
- package/dist/cursor.d.ts +6 -0
- package/dist/dataTransfer.d.ts +19 -0
- package/dist/duplicateProject.d.ts +19 -0
- package/dist/duplicateSection.d.ts +15 -0
- package/dist/filterQuery.d.ts +64 -0
- package/dist/focus.d.ts +17 -0
- package/dist/format.d.ts +30 -0
- package/dist/fuzzy.d.ts +14 -0
- package/dist/grouping.d.ts +24 -0
- package/dist/habitGroups.d.ts +46 -0
- package/dist/habitSchedule.d.ts +4 -0
- package/dist/habits.d.ts +115 -0
- package/dist/hotkeys.d.ts +50 -0
- package/dist/i18n.d.ts +14796 -0
- package/dist/ids.d.ts +7 -0
- package/dist/importTicktick.d.ts +34 -0
- package/dist/importTodoist.d.ts +60 -0
- package/dist/index.d.ts +62 -0
- package/dist/index.js +21446 -0
- package/dist/members.d.ts +26 -0
- package/dist/planDay.d.ts +31 -0
- package/dist/pomodoro.d.ts +49 -0
- package/dist/priority.d.ts +2 -0
- package/dist/projectMapper.d.ts +15 -0
- package/dist/projectStyle.d.ts +14 -0
- package/dist/projectTree.d.ts +40 -0
- package/dist/quickAddLexicons.d.ts +64 -0
- package/dist/quickAddLexiconsWire.d.ts +11 -0
- package/dist/quickAddParse.d.ts +44 -0
- package/dist/quickSchedule.d.ts +9 -0
- package/dist/rank.d.ts +9 -0
- package/dist/recurrence.d.ts +60 -0
- package/dist/regions.d.ts +6 -0
- package/dist/reminderSchedule.d.ts +42 -0
- package/dist/reminders.d.ts +28 -0
- package/dist/reorder.d.ts +21 -0
- package/dist/sectionMapper.d.ts +8 -0
- package/dist/sectionOps.d.ts +5 -0
- package/dist/serverUrl.d.ts +12 -0
- package/dist/smartLists.d.ts +11 -0
- package/dist/stats.d.ts +28 -0
- package/dist/swipe.d.ts +29 -0
- package/dist/taskClipboard.d.ts +19 -0
- package/dist/taskListTree.d.ts +33 -0
- package/dist/taskMapper.d.ts +3 -0
- package/dist/taskOps.d.ts +49 -0
- package/dist/taskSearch.d.ts +11 -0
- package/dist/taskTree.d.ts +53 -0
- package/dist/theme.d.ts +14 -0
- package/dist/toast.d.ts +26 -0
- package/dist/trash.d.ts +24 -0
- package/dist/views.d.ts +8 -0
- package/dist/zonedTime.d.ts +30 -0
- package/package.json +55 -4
- package/test-vectors/filter_vectors.json +1613 -0
- package/test-vectors/quick_add_vectors.json +1656 -0
- package/test-vectors/recurrence_vectors.json +779 -0
- package/test-vectors/task_rules_vectors.json +729 -0
- package/README.md +0 -3
|
@@ -0,0 +1,779 @@
|
|
|
1
|
+
{
|
|
2
|
+
"_comment": "Golden vectors for the recurrence engine. The engine is civil (wall-clock): each vector gives `anchor`/`from`/`expected` both as Unix ms and as the wall-clock time they show in `tz` (`*_local`, ISO without offset). The test runs nextOccurrence(rule, anchor, from, tz) on the instants and the civil engine on the locals. `expected` is null when the rule is invalid or the next occurrence falls outside the JS Date range (|ms| > 8.64e15); `expected_local` is null only when the rule is invalid. `parse` lists rules the parser must accept or reject. Asserted by packages/shared/src/recurrence.test.ts.",
|
|
3
|
+
"vectors": [
|
|
4
|
+
{
|
|
5
|
+
"name": "daily every 1, on schedule",
|
|
6
|
+
"rule": "FREQ=DAILY",
|
|
7
|
+
"tz": "UTC",
|
|
8
|
+
"anchor": 1672531200000,
|
|
9
|
+
"anchor_local": "2023-01-01T00:00:00",
|
|
10
|
+
"from": 1672531200000,
|
|
11
|
+
"from_local": "2023-01-01T00:00:00",
|
|
12
|
+
"expected": 1672617600000,
|
|
13
|
+
"expected_local": "2023-01-02T00:00:00"
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"name": "daily every 2, on schedule",
|
|
17
|
+
"rule": "FREQ=DAILY;INTERVAL=2",
|
|
18
|
+
"tz": "UTC",
|
|
19
|
+
"anchor": 1672531200000,
|
|
20
|
+
"anchor_local": "2023-01-01T00:00:00",
|
|
21
|
+
"from": 1672531200000,
|
|
22
|
+
"from_local": "2023-01-01T00:00:00",
|
|
23
|
+
"expected": 1672704000000,
|
|
24
|
+
"expected_local": "2023-01-03T00:00:00"
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"name": "daily preserves time of day (09:00Z)",
|
|
28
|
+
"rule": "FREQ=DAILY",
|
|
29
|
+
"tz": "UTC",
|
|
30
|
+
"anchor": 1672563600000,
|
|
31
|
+
"anchor_local": "2023-01-01T09:00:00",
|
|
32
|
+
"from": 1672563600000,
|
|
33
|
+
"from_local": "2023-01-01T09:00:00",
|
|
34
|
+
"expected": 1672650000000,
|
|
35
|
+
"expected_local": "2023-01-02T09:00:00"
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
"name": "daily every 3, after completion re-anchors to completion day",
|
|
39
|
+
"rule": "FREQ=DAILY;INTERVAL=3;MODE=COMPLETION",
|
|
40
|
+
"tz": "UTC",
|
|
41
|
+
"anchor": 1672531200000,
|
|
42
|
+
"anchor_local": "2023-01-01T00:00:00",
|
|
43
|
+
"from": 1672876800000,
|
|
44
|
+
"from_local": "2023-01-05T00:00:00",
|
|
45
|
+
"expected": 1673136000000,
|
|
46
|
+
"expected_local": "2023-01-08T00:00:00"
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
"name": "daily every 2, after completion completed 10 days late (due Jan 1, completed Jan 11)",
|
|
50
|
+
"rule": "FREQ=DAILY;INTERVAL=2;MODE=COMPLETION",
|
|
51
|
+
"tz": "UTC",
|
|
52
|
+
"anchor": 1672531200000,
|
|
53
|
+
"anchor_local": "2023-01-01T00:00:00",
|
|
54
|
+
"from": 1673395200000,
|
|
55
|
+
"from_local": "2023-01-11T00:00:00",
|
|
56
|
+
"expected": 1673568000000,
|
|
57
|
+
"expected_local": "2023-01-13T00:00:00"
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
"name": "daily every 2, after completion completed a day early (due Jan 10, completed Jan 9)",
|
|
61
|
+
"rule": "FREQ=DAILY;INTERVAL=2;MODE=COMPLETION",
|
|
62
|
+
"tz": "UTC",
|
|
63
|
+
"anchor": 1673308800000,
|
|
64
|
+
"anchor_local": "2023-01-10T00:00:00",
|
|
65
|
+
"from": 1673222400000,
|
|
66
|
+
"from_local": "2023-01-09T00:00:00",
|
|
67
|
+
"expected": 1673395200000,
|
|
68
|
+
"expected_local": "2023-01-11T00:00:00"
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
"name": "daily after completion keeps the anchor's time of day (due 09:00Z, completed Jan 5 15:00Z)",
|
|
72
|
+
"rule": "FREQ=DAILY;MODE=COMPLETION",
|
|
73
|
+
"tz": "UTC",
|
|
74
|
+
"anchor": 1672563600000,
|
|
75
|
+
"anchor_local": "2023-01-01T09:00:00",
|
|
76
|
+
"from": 1672930800000,
|
|
77
|
+
"from_local": "2023-01-05T15:00:00",
|
|
78
|
+
"expected": 1672995600000,
|
|
79
|
+
"expected_local": "2023-01-06T09:00:00"
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
"name": "weekly every 1, after completion counts from the completion day (completed Fri Jan 6)",
|
|
83
|
+
"rule": "FREQ=WEEKLY;MODE=COMPLETION",
|
|
84
|
+
"tz": "UTC",
|
|
85
|
+
"anchor": 1672617600000,
|
|
86
|
+
"anchor_local": "2023-01-02T00:00:00",
|
|
87
|
+
"from": 1672963200000,
|
|
88
|
+
"from_local": "2023-01-06T00:00:00",
|
|
89
|
+
"expected": 1673568000000,
|
|
90
|
+
"expected_local": "2023-01-13T00:00:00"
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
"name": "weekly byday, after completion picks the next rule weekday after the completion day (completed Thu Jan 5)",
|
|
94
|
+
"rule": "FREQ=WEEKLY;BYDAY=MO,WE;MODE=COMPLETION",
|
|
95
|
+
"tz": "UTC",
|
|
96
|
+
"anchor": 1672617600000,
|
|
97
|
+
"anchor_local": "2023-01-02T00:00:00",
|
|
98
|
+
"from": 1672876800000,
|
|
99
|
+
"from_local": "2023-01-05T00:00:00",
|
|
100
|
+
"expected": 1673222400000,
|
|
101
|
+
"expected_local": "2023-01-09T00:00:00"
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
"name": "weekly every 2 byday, after completion still counts interval weeks from the anchor's week (completed Wed Jan 11)",
|
|
105
|
+
"rule": "FREQ=WEEKLY;INTERVAL=2;BYDAY=MO;MODE=COMPLETION",
|
|
106
|
+
"tz": "UTC",
|
|
107
|
+
"anchor": 1672617600000,
|
|
108
|
+
"anchor_local": "2023-01-02T00:00:00",
|
|
109
|
+
"from": 1673395200000,
|
|
110
|
+
"from_local": "2023-01-11T00:00:00",
|
|
111
|
+
"expected": 1673827200000,
|
|
112
|
+
"expected_local": "2023-01-16T00:00:00"
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
"name": "monthly after completion clamps to month end (completed Jan 31 -> Feb 28)",
|
|
116
|
+
"rule": "FREQ=MONTHLY;MODE=COMPLETION",
|
|
117
|
+
"tz": "UTC",
|
|
118
|
+
"anchor": 1675123200000,
|
|
119
|
+
"anchor_local": "2023-01-31T00:00:00",
|
|
120
|
+
"from": 1675166400000,
|
|
121
|
+
"from_local": "2023-01-31T12:00:00",
|
|
122
|
+
"expected": 1677542400000,
|
|
123
|
+
"expected_local": "2023-02-28T00:00:00"
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
"name": "yearly after completion clamps leap day (completed Feb 29 2024 -> Feb 28 2025)",
|
|
127
|
+
"rule": "FREQ=YEARLY;MODE=COMPLETION",
|
|
128
|
+
"tz": "UTC",
|
|
129
|
+
"anchor": 1709164800000,
|
|
130
|
+
"anchor_local": "2024-02-29T00:00:00",
|
|
131
|
+
"from": 1709186400000,
|
|
132
|
+
"from_local": "2024-02-29T06:00:00",
|
|
133
|
+
"expected": 1740700800000,
|
|
134
|
+
"expected_local": "2025-02-28T00:00:00"
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
"name": "UTC: after completion on 2023-03-12 (a US DST day) is plain calendar-day math, since UTC has no DST",
|
|
138
|
+
"rule": "FREQ=DAILY;MODE=COMPLETION",
|
|
139
|
+
"tz": "UTC",
|
|
140
|
+
"anchor": 1678608000000,
|
|
141
|
+
"anchor_local": "2023-03-12T08:00:00",
|
|
142
|
+
"from": 1678651200000,
|
|
143
|
+
"from_local": "2023-03-12T20:00:00",
|
|
144
|
+
"expected": 1678694400000,
|
|
145
|
+
"expected_local": "2023-03-13T08:00:00"
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
"name": "explicit MODE=SCHEDULE behaves like the default and ignores the completion reference",
|
|
149
|
+
"rule": "FREQ=DAILY;MODE=SCHEDULE",
|
|
150
|
+
"tz": "UTC",
|
|
151
|
+
"anchor": 1672531200000,
|
|
152
|
+
"anchor_local": "2023-01-01T00:00:00",
|
|
153
|
+
"from": 1000000000000,
|
|
154
|
+
"from_local": "2001-09-09T01:46:40",
|
|
155
|
+
"expected": 1672617600000,
|
|
156
|
+
"expected_local": "2023-01-02T00:00:00"
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
"name": "weekly every 1, no byday",
|
|
160
|
+
"rule": "FREQ=WEEKLY",
|
|
161
|
+
"tz": "UTC",
|
|
162
|
+
"anchor": 1672531200000,
|
|
163
|
+
"anchor_local": "2023-01-01T00:00:00",
|
|
164
|
+
"from": 1672531200000,
|
|
165
|
+
"from_local": "2023-01-01T00:00:00",
|
|
166
|
+
"expected": 1673136000000,
|
|
167
|
+
"expected_local": "2023-01-08T00:00:00"
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
"name": "weekly every 2, no byday",
|
|
171
|
+
"rule": "FREQ=WEEKLY;INTERVAL=2",
|
|
172
|
+
"tz": "UTC",
|
|
173
|
+
"anchor": 1672531200000,
|
|
174
|
+
"anchor_local": "2023-01-01T00:00:00",
|
|
175
|
+
"from": 1672531200000,
|
|
176
|
+
"from_local": "2023-01-01T00:00:00",
|
|
177
|
+
"expected": 1673740800000,
|
|
178
|
+
"expected_local": "2023-01-15T00:00:00"
|
|
179
|
+
},
|
|
180
|
+
{
|
|
181
|
+
"name": "weekly byday Mon/Wed/Fri from Monday -> Wednesday",
|
|
182
|
+
"rule": "FREQ=WEEKLY;BYDAY=MO,WE,FR",
|
|
183
|
+
"tz": "UTC",
|
|
184
|
+
"anchor": 1672617600000,
|
|
185
|
+
"anchor_local": "2023-01-02T00:00:00",
|
|
186
|
+
"from": 1672617600000,
|
|
187
|
+
"from_local": "2023-01-02T00:00:00",
|
|
188
|
+
"expected": 1672790400000,
|
|
189
|
+
"expected_local": "2023-01-04T00:00:00"
|
|
190
|
+
},
|
|
191
|
+
{
|
|
192
|
+
"name": "monthly every 1",
|
|
193
|
+
"rule": "FREQ=MONTHLY",
|
|
194
|
+
"tz": "UTC",
|
|
195
|
+
"anchor": 1673740800000,
|
|
196
|
+
"anchor_local": "2023-01-15T00:00:00",
|
|
197
|
+
"from": 1673740800000,
|
|
198
|
+
"from_local": "2023-01-15T00:00:00",
|
|
199
|
+
"expected": 1676419200000,
|
|
200
|
+
"expected_local": "2023-02-15T00:00:00"
|
|
201
|
+
},
|
|
202
|
+
{
|
|
203
|
+
"name": "monthly clamps to month end (Jan 31 -> Feb 28)",
|
|
204
|
+
"rule": "FREQ=MONTHLY",
|
|
205
|
+
"tz": "UTC",
|
|
206
|
+
"anchor": 1675123200000,
|
|
207
|
+
"anchor_local": "2023-01-31T00:00:00",
|
|
208
|
+
"from": 1675123200000,
|
|
209
|
+
"from_local": "2023-01-31T00:00:00",
|
|
210
|
+
"expected": 1677542400000,
|
|
211
|
+
"expected_local": "2023-02-28T00:00:00"
|
|
212
|
+
},
|
|
213
|
+
{
|
|
214
|
+
"name": "yearly every 1",
|
|
215
|
+
"rule": "FREQ=YEARLY",
|
|
216
|
+
"tz": "UTC",
|
|
217
|
+
"anchor": 1672531200000,
|
|
218
|
+
"anchor_local": "2023-01-01T00:00:00",
|
|
219
|
+
"from": 1672531200000,
|
|
220
|
+
"from_local": "2023-01-01T00:00:00",
|
|
221
|
+
"expected": 1704067200000,
|
|
222
|
+
"expected_local": "2024-01-01T00:00:00"
|
|
223
|
+
},
|
|
224
|
+
{
|
|
225
|
+
"name": "yearly clamps leap day (Feb 29 2024 -> Feb 28 2025)",
|
|
226
|
+
"rule": "FREQ=YEARLY",
|
|
227
|
+
"tz": "UTC",
|
|
228
|
+
"anchor": 1709164800000,
|
|
229
|
+
"anchor_local": "2024-02-29T00:00:00",
|
|
230
|
+
"from": 1709164800000,
|
|
231
|
+
"from_local": "2024-02-29T00:00:00",
|
|
232
|
+
"expected": 1740700800000,
|
|
233
|
+
"expected_local": "2025-02-28T00:00:00"
|
|
234
|
+
},
|
|
235
|
+
{
|
|
236
|
+
"name": "yearly leap-day anchor clamps in a common year (Feb 29 2024 -> Feb 28 2025)",
|
|
237
|
+
"rule": "FREQ=YEARLY;BYMONTHDAY=29",
|
|
238
|
+
"tz": "UTC",
|
|
239
|
+
"anchor": 1709197200000,
|
|
240
|
+
"anchor_local": "2024-02-29T09:00:00",
|
|
241
|
+
"from": 1709197200000,
|
|
242
|
+
"from_local": "2024-02-29T09:00:00",
|
|
243
|
+
"expected": 1740733200000,
|
|
244
|
+
"expected_local": "2025-02-28T09:00:00"
|
|
245
|
+
},
|
|
246
|
+
{
|
|
247
|
+
"name": "yearly leap-day anchor returns to Feb 29 in a leap year (Feb 28 2027 -> Feb 29 2028)",
|
|
248
|
+
"rule": "FREQ=YEARLY;BYMONTHDAY=29",
|
|
249
|
+
"tz": "UTC",
|
|
250
|
+
"anchor": 1803805200000,
|
|
251
|
+
"anchor_local": "2027-02-28T09:00:00",
|
|
252
|
+
"from": 1803805200000,
|
|
253
|
+
"from_local": "2027-02-28T09:00:00",
|
|
254
|
+
"expected": 1835427600000,
|
|
255
|
+
"expected_local": "2028-02-29T09:00:00"
|
|
256
|
+
},
|
|
257
|
+
{
|
|
258
|
+
"name": "yearly leap-day anchor is ignored outside February (Mar 5 2025 -> Mar 5 2026)",
|
|
259
|
+
"rule": "FREQ=YEARLY;BYMONTHDAY=29",
|
|
260
|
+
"tz": "UTC",
|
|
261
|
+
"anchor": 1741165200000,
|
|
262
|
+
"anchor_local": "2025-03-05T09:00:00",
|
|
263
|
+
"from": 1741165200000,
|
|
264
|
+
"from_local": "2025-03-05T09:00:00",
|
|
265
|
+
"expected": 1772701200000,
|
|
266
|
+
"expected_local": "2026-03-05T09:00:00"
|
|
267
|
+
},
|
|
268
|
+
{
|
|
269
|
+
"name": "invalid rule yields no occurrence",
|
|
270
|
+
"rule": "FREQ=BOGUS",
|
|
271
|
+
"tz": "UTC",
|
|
272
|
+
"anchor": 1,
|
|
273
|
+
"anchor_local": "1970-01-01T00:00:00.001",
|
|
274
|
+
"from": 1,
|
|
275
|
+
"from_local": "1970-01-01T00:00:00.001",
|
|
276
|
+
"expected": null,
|
|
277
|
+
"expected_local": null
|
|
278
|
+
},
|
|
279
|
+
{
|
|
280
|
+
"name": "invalid MODE yields no occurrence",
|
|
281
|
+
"rule": "FREQ=DAILY;MODE=BOGUS",
|
|
282
|
+
"tz": "UTC",
|
|
283
|
+
"anchor": 1672531200000,
|
|
284
|
+
"anchor_local": "2023-01-01T00:00:00",
|
|
285
|
+
"from": 1672531200000,
|
|
286
|
+
"from_local": "2023-01-01T00:00:00",
|
|
287
|
+
"expected": null,
|
|
288
|
+
"expected_local": null
|
|
289
|
+
},
|
|
290
|
+
{
|
|
291
|
+
"name": "empty rule yields no occurrence",
|
|
292
|
+
"rule": "",
|
|
293
|
+
"tz": "UTC",
|
|
294
|
+
"anchor": 1,
|
|
295
|
+
"anchor_local": "1970-01-01T00:00:00.001",
|
|
296
|
+
"from": 1,
|
|
297
|
+
"from_local": "1970-01-01T00:00:00.001",
|
|
298
|
+
"expected": null,
|
|
299
|
+
"expected_local": null
|
|
300
|
+
},
|
|
301
|
+
{
|
|
302
|
+
"name": "weekly every 1000 on Mon steps a thousand weeks without scanning them",
|
|
303
|
+
"rule": "FREQ=WEEKLY;INTERVAL=1000;BYDAY=MO",
|
|
304
|
+
"tz": "UTC",
|
|
305
|
+
"anchor": 1672617600000,
|
|
306
|
+
"anchor_local": "2023-01-02T00:00:00",
|
|
307
|
+
"from": 1672617600000,
|
|
308
|
+
"from_local": "2023-01-02T00:00:00",
|
|
309
|
+
"expected": 2277417600000,
|
|
310
|
+
"expected_local": "2042-03-03T00:00:00"
|
|
311
|
+
},
|
|
312
|
+
{
|
|
313
|
+
"name": "weekly every 3 on Tue/Thu after completion lands in the next interval week (completed Fri Jan 20)",
|
|
314
|
+
"rule": "FREQ=WEEKLY;INTERVAL=3;BYDAY=TU,TH;MODE=COMPLETION",
|
|
315
|
+
"tz": "UTC",
|
|
316
|
+
"anchor": 1672617600000,
|
|
317
|
+
"anchor_local": "2023-01-02T00:00:00",
|
|
318
|
+
"from": 1674226800000,
|
|
319
|
+
"from_local": "2023-01-20T15:00:00",
|
|
320
|
+
"expected": 1674518400000,
|
|
321
|
+
"expected_local": "2023-01-24T00:00:00"
|
|
322
|
+
},
|
|
323
|
+
{
|
|
324
|
+
"name": "weekly every 2 on Wed after completion completed before the anchor week waits for the anchor week",
|
|
325
|
+
"rule": "FREQ=WEEKLY;INTERVAL=2;BYDAY=WE;MODE=COMPLETION",
|
|
326
|
+
"tz": "UTC",
|
|
327
|
+
"anchor": 1673827200000,
|
|
328
|
+
"anchor_local": "2023-01-16T00:00:00",
|
|
329
|
+
"from": 1672704000000,
|
|
330
|
+
"from_local": "2023-01-03T00:00:00",
|
|
331
|
+
"expected": 1674000000000,
|
|
332
|
+
"expected_local": "2023-01-18T00:00:00"
|
|
333
|
+
},
|
|
334
|
+
{
|
|
335
|
+
"name": "INTERVAL above 1000 yields no occurrence",
|
|
336
|
+
"rule": "FREQ=WEEKLY;INTERVAL=4294967295;BYDAY=MO",
|
|
337
|
+
"tz": "UTC",
|
|
338
|
+
"anchor": 1672617600000,
|
|
339
|
+
"anchor_local": "2023-01-02T00:00:00",
|
|
340
|
+
"from": 1672617600000,
|
|
341
|
+
"from_local": "2023-01-02T00:00:00",
|
|
342
|
+
"expected": null,
|
|
343
|
+
"expected_local": null
|
|
344
|
+
},
|
|
345
|
+
{
|
|
346
|
+
"name": "a next occurrence past the end of the Date range yields none (the civil date still exists)",
|
|
347
|
+
"rule": "FREQ=DAILY",
|
|
348
|
+
"tz": "UTC",
|
|
349
|
+
"anchor": 8640000000000000,
|
|
350
|
+
"anchor_local": "275760-09-13T00:00:00",
|
|
351
|
+
"from": 8640000000000000,
|
|
352
|
+
"from_local": "275760-09-13T00:00:00",
|
|
353
|
+
"expected": null,
|
|
354
|
+
"expected_local": "275760-09-14T00:00:00"
|
|
355
|
+
},
|
|
356
|
+
{
|
|
357
|
+
"name": "Copenhagen: daily all-day Sat 2026-03-28 23:59 -> Sun 03-29 23:59 across spring-forward (no skipped Sunday, stays all-day)",
|
|
358
|
+
"rule": "FREQ=DAILY",
|
|
359
|
+
"tz": "Europe/Copenhagen",
|
|
360
|
+
"anchor": 1774738740000,
|
|
361
|
+
"anchor_local": "2026-03-28T23:59:00",
|
|
362
|
+
"from": 1774738740000,
|
|
363
|
+
"from_local": "2026-03-28T23:59:00",
|
|
364
|
+
"expected": 1774821540000,
|
|
365
|
+
"expected_local": "2026-03-29T23:59:00"
|
|
366
|
+
},
|
|
367
|
+
{
|
|
368
|
+
"name": "Copenhagen: daily all-day Sat 2026-10-24 23:59 -> Sun 10-25 23:59 across fall-back",
|
|
369
|
+
"rule": "FREQ=DAILY",
|
|
370
|
+
"tz": "Europe/Copenhagen",
|
|
371
|
+
"anchor": 1792879140000,
|
|
372
|
+
"anchor_local": "2026-10-24T23:59:00",
|
|
373
|
+
"from": 1792879140000,
|
|
374
|
+
"from_local": "2026-10-24T23:59:00",
|
|
375
|
+
"expected": 1792969140000,
|
|
376
|
+
"expected_local": "2026-10-25T23:59:00"
|
|
377
|
+
},
|
|
378
|
+
{
|
|
379
|
+
"name": "New York: BYDAY=MO,WE all-day Mon 2026-01-05 -> Wed 01-07 (the local weekday, not the UTC one)",
|
|
380
|
+
"rule": "FREQ=WEEKLY;BYDAY=MO,WE",
|
|
381
|
+
"tz": "America/New_York",
|
|
382
|
+
"anchor": 1767675540000,
|
|
383
|
+
"anchor_local": "2026-01-05T23:59:00",
|
|
384
|
+
"from": 1767675540000,
|
|
385
|
+
"from_local": "2026-01-05T23:59:00",
|
|
386
|
+
"expected": 1767848340000,
|
|
387
|
+
"expected_local": "2026-01-07T23:59:00"
|
|
388
|
+
},
|
|
389
|
+
{
|
|
390
|
+
"name": "New York: every 2 weeks on Mon counts interval weeks from the local anchor week (Mon 2026-01-05 -> 01-19)",
|
|
391
|
+
"rule": "FREQ=WEEKLY;INTERVAL=2;BYDAY=MO",
|
|
392
|
+
"tz": "America/New_York",
|
|
393
|
+
"anchor": 1767675540000,
|
|
394
|
+
"anchor_local": "2026-01-05T23:59:00",
|
|
395
|
+
"from": 1767675540000,
|
|
396
|
+
"from_local": "2026-01-05T23:59:00",
|
|
397
|
+
"expected": 1768885140000,
|
|
398
|
+
"expected_local": "2026-01-19T23:59:00"
|
|
399
|
+
},
|
|
400
|
+
{
|
|
401
|
+
"name": "New York: daily after completion, all-day due 2026-01-10 completed 01-11 10:00 -> 01-12 (not the completion day itself)",
|
|
402
|
+
"rule": "FREQ=DAILY;MODE=COMPLETION",
|
|
403
|
+
"tz": "America/New_York",
|
|
404
|
+
"anchor": 1768107540000,
|
|
405
|
+
"anchor_local": "2026-01-10T23:59:00",
|
|
406
|
+
"from": 1768143600000,
|
|
407
|
+
"from_local": "2026-01-11T10:00:00",
|
|
408
|
+
"expected": 1768280340000,
|
|
409
|
+
"expected_local": "2026-01-12T23:59:00"
|
|
410
|
+
},
|
|
411
|
+
{
|
|
412
|
+
"name": "New York: monthly all-day 2026-04-30 -> 05-30 (not 05-31)",
|
|
413
|
+
"rule": "FREQ=MONTHLY",
|
|
414
|
+
"tz": "America/New_York",
|
|
415
|
+
"anchor": 1777607940000,
|
|
416
|
+
"anchor_local": "2026-04-30T23:59:00",
|
|
417
|
+
"from": 1777607940000,
|
|
418
|
+
"from_local": "2026-04-30T23:59:00",
|
|
419
|
+
"expected": 1780199940000,
|
|
420
|
+
"expected_local": "2026-05-30T23:59:00"
|
|
421
|
+
},
|
|
422
|
+
{
|
|
423
|
+
"name": "New York: monthly all-day clamps Jan 31 -> Feb 28 on the local calendar",
|
|
424
|
+
"rule": "FREQ=MONTHLY",
|
|
425
|
+
"tz": "America/New_York",
|
|
426
|
+
"anchor": 1769921940000,
|
|
427
|
+
"anchor_local": "2026-01-31T23:59:00",
|
|
428
|
+
"from": 1769921940000,
|
|
429
|
+
"from_local": "2026-01-31T23:59:00",
|
|
430
|
+
"expected": 1772341140000,
|
|
431
|
+
"expected_local": "2026-02-28T23:59:00"
|
|
432
|
+
},
|
|
433
|
+
{
|
|
434
|
+
"name": "New York: yearly all-day leap day 2024-02-29 -> 2025-02-28",
|
|
435
|
+
"rule": "FREQ=YEARLY",
|
|
436
|
+
"tz": "America/New_York",
|
|
437
|
+
"anchor": 1709269140000,
|
|
438
|
+
"anchor_local": "2024-02-29T23:59:00",
|
|
439
|
+
"from": 1709269140000,
|
|
440
|
+
"from_local": "2024-02-29T23:59:00",
|
|
441
|
+
"expected": 1740805140000,
|
|
442
|
+
"expected_local": "2025-02-28T23:59:00"
|
|
443
|
+
},
|
|
444
|
+
{
|
|
445
|
+
"name": "New York: daily all-day 2023-03-11 -> 03-12 across the US spring-forward (a 23-hour step)",
|
|
446
|
+
"rule": "FREQ=DAILY",
|
|
447
|
+
"tz": "America/New_York",
|
|
448
|
+
"anchor": 1678597140000,
|
|
449
|
+
"anchor_local": "2023-03-11T23:59:00",
|
|
450
|
+
"from": 1678597140000,
|
|
451
|
+
"from_local": "2023-03-11T23:59:00",
|
|
452
|
+
"expected": 1678679940000,
|
|
453
|
+
"expected_local": "2023-03-12T23:59:00"
|
|
454
|
+
},
|
|
455
|
+
{
|
|
456
|
+
"name": "Copenhagen: timed after completion takes the local completion day (due 09:00, completed 00:30 local = the previous UTC day)",
|
|
457
|
+
"rule": "FREQ=DAILY;MODE=COMPLETION",
|
|
458
|
+
"tz": "Europe/Copenhagen",
|
|
459
|
+
"anchor": 1780297200000,
|
|
460
|
+
"anchor_local": "2026-06-01T09:00:00",
|
|
461
|
+
"from": 1780612200000,
|
|
462
|
+
"from_local": "2026-06-05T00:30:00",
|
|
463
|
+
"expected": 1780729200000,
|
|
464
|
+
"expected_local": "2026-06-06T09:00:00"
|
|
465
|
+
},
|
|
466
|
+
{
|
|
467
|
+
"name": "Copenhagen: weekly after completion keeps the wall-clock time across spring-forward (due 08:00 Mon 03-23, completed Fri 03-27)",
|
|
468
|
+
"rule": "FREQ=WEEKLY;MODE=COMPLETION",
|
|
469
|
+
"tz": "Europe/Copenhagen",
|
|
470
|
+
"anchor": 1774249200000,
|
|
471
|
+
"anchor_local": "2026-03-23T08:00:00",
|
|
472
|
+
"from": 1774630800000,
|
|
473
|
+
"from_local": "2026-03-27T18:00:00",
|
|
474
|
+
"expected": 1775196000000,
|
|
475
|
+
"expected_local": "2026-04-03T08:00:00"
|
|
476
|
+
},
|
|
477
|
+
{
|
|
478
|
+
"name": "Tokyo: BYDAY=MO,FR from Mon 2026-01-05 08:00 (still Sunday in UTC) -> Fri 01-09 08:00",
|
|
479
|
+
"rule": "FREQ=WEEKLY;BYDAY=MO,FR",
|
|
480
|
+
"tz": "Asia/Tokyo",
|
|
481
|
+
"anchor": 1767567600000,
|
|
482
|
+
"anchor_local": "2026-01-05T08:00:00",
|
|
483
|
+
"from": 1767567600000,
|
|
484
|
+
"from_local": "2026-01-05T08:00:00",
|
|
485
|
+
"expected": 1767913200000,
|
|
486
|
+
"expected_local": "2026-01-09T08:00:00"
|
|
487
|
+
},
|
|
488
|
+
{
|
|
489
|
+
"name": "monthly on day 31 clamps Jan 31 -> Feb 28",
|
|
490
|
+
"rule": "FREQ=MONTHLY;BYMONTHDAY=31",
|
|
491
|
+
"tz": "UTC",
|
|
492
|
+
"anchor": 1675123200000,
|
|
493
|
+
"anchor_local": "2023-01-31T00:00:00",
|
|
494
|
+
"from": 1675123200000,
|
|
495
|
+
"from_local": "2023-01-31T00:00:00",
|
|
496
|
+
"expected": 1677542400000,
|
|
497
|
+
"expected_local": "2023-02-28T00:00:00"
|
|
498
|
+
},
|
|
499
|
+
{
|
|
500
|
+
"name": "monthly on day 31 returns to the 31st after February (Feb 28 -> Mar 31)",
|
|
501
|
+
"rule": "FREQ=MONTHLY;BYMONTHDAY=31",
|
|
502
|
+
"tz": "UTC",
|
|
503
|
+
"anchor": 1677542400000,
|
|
504
|
+
"anchor_local": "2023-02-28T00:00:00",
|
|
505
|
+
"from": 1677542400000,
|
|
506
|
+
"from_local": "2023-02-28T00:00:00",
|
|
507
|
+
"expected": 1680220800000,
|
|
508
|
+
"expected_local": "2023-03-31T00:00:00"
|
|
509
|
+
},
|
|
510
|
+
{
|
|
511
|
+
"name": "monthly on day 31 takes Feb 29 in a leap year (Jan 31 -> Feb 29 2024)",
|
|
512
|
+
"rule": "FREQ=MONTHLY;BYMONTHDAY=31",
|
|
513
|
+
"tz": "UTC",
|
|
514
|
+
"anchor": 1706659200000,
|
|
515
|
+
"anchor_local": "2024-01-31T00:00:00",
|
|
516
|
+
"from": 1706659200000,
|
|
517
|
+
"from_local": "2024-01-31T00:00:00",
|
|
518
|
+
"expected": 1709164800000,
|
|
519
|
+
"expected_local": "2024-02-29T00:00:00"
|
|
520
|
+
},
|
|
521
|
+
{
|
|
522
|
+
"name": "monthly on day 31 after a 30-day month (Apr 30 -> May 31)",
|
|
523
|
+
"rule": "FREQ=MONTHLY;BYMONTHDAY=31",
|
|
524
|
+
"tz": "UTC",
|
|
525
|
+
"anchor": 1682812800000,
|
|
526
|
+
"anchor_local": "2023-04-30T00:00:00",
|
|
527
|
+
"from": 1682812800000,
|
|
528
|
+
"from_local": "2023-04-30T00:00:00",
|
|
529
|
+
"expected": 1685491200000,
|
|
530
|
+
"expected_local": "2023-05-31T00:00:00"
|
|
531
|
+
},
|
|
532
|
+
{
|
|
533
|
+
"name": "monthly on day 30 after February (Feb 28 -> Mar 30)",
|
|
534
|
+
"rule": "FREQ=MONTHLY;BYMONTHDAY=30",
|
|
535
|
+
"tz": "UTC",
|
|
536
|
+
"anchor": 1677542400000,
|
|
537
|
+
"anchor_local": "2023-02-28T00:00:00",
|
|
538
|
+
"from": 1677542400000,
|
|
539
|
+
"from_local": "2023-02-28T00:00:00",
|
|
540
|
+
"expected": 1680134400000,
|
|
541
|
+
"expected_local": "2023-03-30T00:00:00"
|
|
542
|
+
},
|
|
543
|
+
{
|
|
544
|
+
"name": "every 2 months on day 31 across a year end (Dec 31 -> Feb 28)",
|
|
545
|
+
"rule": "FREQ=MONTHLY;INTERVAL=2;BYMONTHDAY=31",
|
|
546
|
+
"tz": "UTC",
|
|
547
|
+
"anchor": 1672444800000,
|
|
548
|
+
"anchor_local": "2022-12-31T00:00:00",
|
|
549
|
+
"from": 1672444800000,
|
|
550
|
+
"from_local": "2022-12-31T00:00:00",
|
|
551
|
+
"expected": 1677542400000,
|
|
552
|
+
"expected_local": "2023-02-28T00:00:00"
|
|
553
|
+
},
|
|
554
|
+
{
|
|
555
|
+
"name": "every 2 months on day 31 after February (Feb 28 -> Apr 30)",
|
|
556
|
+
"rule": "FREQ=MONTHLY;INTERVAL=2;BYMONTHDAY=31",
|
|
557
|
+
"tz": "UTC",
|
|
558
|
+
"anchor": 1677542400000,
|
|
559
|
+
"anchor_local": "2023-02-28T00:00:00",
|
|
560
|
+
"from": 1677542400000,
|
|
561
|
+
"from_local": "2023-02-28T00:00:00",
|
|
562
|
+
"expected": 1682812800000,
|
|
563
|
+
"expected_local": "2023-04-30T00:00:00"
|
|
564
|
+
},
|
|
565
|
+
{
|
|
566
|
+
"name": "monthly on day 15 from a rescheduled occurrence (Jan 20 -> Feb 15)",
|
|
567
|
+
"rule": "FREQ=MONTHLY;BYMONTHDAY=15",
|
|
568
|
+
"tz": "UTC",
|
|
569
|
+
"anchor": 1674207000000,
|
|
570
|
+
"anchor_local": "2023-01-20T09:30:00",
|
|
571
|
+
"from": 1674207000000,
|
|
572
|
+
"from_local": "2023-01-20T09:30:00",
|
|
573
|
+
"expected": 1676453400000,
|
|
574
|
+
"expected_local": "2023-02-15T09:30:00"
|
|
575
|
+
},
|
|
576
|
+
{
|
|
577
|
+
"name": "monthly on day 31 after completion ignores the day and counts from the completion day (completed Feb 10 -> Mar 10)",
|
|
578
|
+
"rule": "FREQ=MONTHLY;BYMONTHDAY=31;MODE=COMPLETION",
|
|
579
|
+
"tz": "UTC",
|
|
580
|
+
"anchor": 1675123200000,
|
|
581
|
+
"anchor_local": "2023-01-31T00:00:00",
|
|
582
|
+
"from": 1676030400000,
|
|
583
|
+
"from_local": "2023-02-10T12:00:00",
|
|
584
|
+
"expected": 1678406400000,
|
|
585
|
+
"expected_local": "2023-03-10T00:00:00"
|
|
586
|
+
},
|
|
587
|
+
{
|
|
588
|
+
"name": "monthly without BYMONTHDAY (stored before it existed) still keeps the previous day (Feb 28 -> Mar 28)",
|
|
589
|
+
"rule": "FREQ=MONTHLY",
|
|
590
|
+
"tz": "UTC",
|
|
591
|
+
"anchor": 1677542400000,
|
|
592
|
+
"anchor_local": "2023-02-28T00:00:00",
|
|
593
|
+
"from": 1677542400000,
|
|
594
|
+
"from_local": "2023-02-28T00:00:00",
|
|
595
|
+
"expected": 1679961600000,
|
|
596
|
+
"expected_local": "2023-03-28T00:00:00"
|
|
597
|
+
},
|
|
598
|
+
{
|
|
599
|
+
"name": "New York: monthly on day 31 all-day Feb 28 -> Mar 31 on the local calendar",
|
|
600
|
+
"rule": "FREQ=MONTHLY;BYMONTHDAY=31",
|
|
601
|
+
"tz": "America/New_York",
|
|
602
|
+
"anchor": 1772341140000,
|
|
603
|
+
"anchor_local": "2026-02-28T23:59:00",
|
|
604
|
+
"from": 1772341140000,
|
|
605
|
+
"from_local": "2026-02-28T23:59:00",
|
|
606
|
+
"expected": 1775015940000,
|
|
607
|
+
"expected_local": "2026-03-31T23:59:00"
|
|
608
|
+
},
|
|
609
|
+
{
|
|
610
|
+
"name": "Copenhagen: monthly on day 31 at 09:00 Mar 31 -> Apr 30 09:00 (after spring-forward)",
|
|
611
|
+
"rule": "FREQ=MONTHLY;BYMONTHDAY=31",
|
|
612
|
+
"tz": "Europe/Copenhagen",
|
|
613
|
+
"anchor": 1774940400000,
|
|
614
|
+
"anchor_local": "2026-03-31T09:00:00",
|
|
615
|
+
"from": 1774940400000,
|
|
616
|
+
"from_local": "2026-03-31T09:00:00",
|
|
617
|
+
"expected": 1777532400000,
|
|
618
|
+
"expected_local": "2026-04-30T09:00:00"
|
|
619
|
+
}
|
|
620
|
+
],
|
|
621
|
+
"parse": [
|
|
622
|
+
{
|
|
623
|
+
"rule": "FREQ=DAILY;INTERVAL=1000",
|
|
624
|
+
"valid": true
|
|
625
|
+
},
|
|
626
|
+
{
|
|
627
|
+
"rule": "FREQ=DAILY;INTERVAL=1001",
|
|
628
|
+
"valid": false
|
|
629
|
+
},
|
|
630
|
+
{
|
|
631
|
+
"rule": "FREQ=DAILY;INTERVAL=007",
|
|
632
|
+
"valid": true
|
|
633
|
+
},
|
|
634
|
+
{
|
|
635
|
+
"rule": "FREQ=DAILY;INTERVAL=0",
|
|
636
|
+
"valid": false
|
|
637
|
+
},
|
|
638
|
+
{
|
|
639
|
+
"rule": "FREQ=DAILY;INTERVAL=+5",
|
|
640
|
+
"valid": false
|
|
641
|
+
},
|
|
642
|
+
{
|
|
643
|
+
"rule": "FREQ=DAILY;INTERVAL=-1",
|
|
644
|
+
"valid": false
|
|
645
|
+
},
|
|
646
|
+
{
|
|
647
|
+
"rule": "FREQ=DAILY;INTERVAL=1.5",
|
|
648
|
+
"valid": false
|
|
649
|
+
},
|
|
650
|
+
{
|
|
651
|
+
"rule": "FREQ=DAILY;INTERVAL=",
|
|
652
|
+
"valid": false
|
|
653
|
+
},
|
|
654
|
+
{
|
|
655
|
+
"rule": "FREQ=DAILY;INTERVAL=4294967296",
|
|
656
|
+
"valid": false
|
|
657
|
+
},
|
|
658
|
+
{
|
|
659
|
+
"rule": "FREQ=DAILY;INTERVAL=99999999999999999999999",
|
|
660
|
+
"valid": false
|
|
661
|
+
},
|
|
662
|
+
{
|
|
663
|
+
"rule": "FREQ=DAILY;INTERVAL=\u0663",
|
|
664
|
+
"valid": false
|
|
665
|
+
},
|
|
666
|
+
{
|
|
667
|
+
"rule": "freq=weekly;interval=2;byday=mo,we;mode=completion",
|
|
668
|
+
"valid": true
|
|
669
|
+
},
|
|
670
|
+
{
|
|
671
|
+
"rule": " FREQ = DAILY ; INTERVAL = 2 ",
|
|
672
|
+
"valid": true
|
|
673
|
+
},
|
|
674
|
+
{
|
|
675
|
+
"rule": "freq=da\u0131ly",
|
|
676
|
+
"valid": false
|
|
677
|
+
},
|
|
678
|
+
{
|
|
679
|
+
"rule": "FREQ=WEEKLY;BYDAY=\u017fu",
|
|
680
|
+
"valid": false
|
|
681
|
+
},
|
|
682
|
+
{
|
|
683
|
+
"rule": "FREQ=DAILY;MODE=\u017fchedule",
|
|
684
|
+
"valid": false
|
|
685
|
+
},
|
|
686
|
+
{
|
|
687
|
+
"rule": "\ufeffFREQ=DAILY",
|
|
688
|
+
"valid": false
|
|
689
|
+
},
|
|
690
|
+
{
|
|
691
|
+
"rule": "\u000bFREQ=DAILY",
|
|
692
|
+
"valid": false
|
|
693
|
+
},
|
|
694
|
+
{
|
|
695
|
+
"rule": "FREQ=DAILY;\u00a0INTERVAL=2",
|
|
696
|
+
"valid": false
|
|
697
|
+
},
|
|
698
|
+
{
|
|
699
|
+
"rule": "FREQ=DAILY\u0085",
|
|
700
|
+
"valid": false
|
|
701
|
+
},
|
|
702
|
+
{
|
|
703
|
+
"rule": "FREQ=WEEKLY;BYDAY=MO,,WE,",
|
|
704
|
+
"valid": true
|
|
705
|
+
},
|
|
706
|
+
{
|
|
707
|
+
"rule": "FREQ=DAILY;;",
|
|
708
|
+
"valid": true
|
|
709
|
+
},
|
|
710
|
+
{
|
|
711
|
+
"rule": "FREQ=DAILY;INTERVAL",
|
|
712
|
+
"valid": false
|
|
713
|
+
},
|
|
714
|
+
{
|
|
715
|
+
"rule": "FREQ=MONTHLY;BYMONTHDAY=31",
|
|
716
|
+
"valid": true
|
|
717
|
+
},
|
|
718
|
+
{
|
|
719
|
+
"rule": "FREQ=MONTHLY;BYMONTHDAY=1",
|
|
720
|
+
"valid": true
|
|
721
|
+
},
|
|
722
|
+
{
|
|
723
|
+
"rule": "BYMONTHDAY=15;FREQ=MONTHLY",
|
|
724
|
+
"valid": true
|
|
725
|
+
},
|
|
726
|
+
{
|
|
727
|
+
"rule": "freq=monthly;bymonthday=07;mode=completion",
|
|
728
|
+
"valid": true
|
|
729
|
+
},
|
|
730
|
+
{
|
|
731
|
+
"rule": "FREQ=MONTHLY;BYMONTHDAY=0",
|
|
732
|
+
"valid": false
|
|
733
|
+
},
|
|
734
|
+
{
|
|
735
|
+
"rule": "FREQ=MONTHLY;BYMONTHDAY=32",
|
|
736
|
+
"valid": false
|
|
737
|
+
},
|
|
738
|
+
{
|
|
739
|
+
"rule": "FREQ=MONTHLY;BYMONTHDAY=-1",
|
|
740
|
+
"valid": false
|
|
741
|
+
},
|
|
742
|
+
{
|
|
743
|
+
"rule": "FREQ=MONTHLY;BYMONTHDAY=+5",
|
|
744
|
+
"valid": false
|
|
745
|
+
},
|
|
746
|
+
{
|
|
747
|
+
"rule": "FREQ=MONTHLY;BYMONTHDAY=1,15",
|
|
748
|
+
"valid": false
|
|
749
|
+
},
|
|
750
|
+
{
|
|
751
|
+
"rule": "FREQ=MONTHLY;BYMONTHDAY=",
|
|
752
|
+
"valid": false
|
|
753
|
+
},
|
|
754
|
+
{
|
|
755
|
+
"rule": "FREQ=MONTHLY;BYMONTHDAY=4294967327",
|
|
756
|
+
"valid": false
|
|
757
|
+
},
|
|
758
|
+
{
|
|
759
|
+
"rule": "FREQ=MONTHLY;BYMONTHDAY=\u0663",
|
|
760
|
+
"valid": false
|
|
761
|
+
},
|
|
762
|
+
{
|
|
763
|
+
"rule": "FREQ=DAILY;BYMONTHDAY=15",
|
|
764
|
+
"valid": false
|
|
765
|
+
},
|
|
766
|
+
{
|
|
767
|
+
"rule": "FREQ=WEEKLY;BYMONTHDAY=15",
|
|
768
|
+
"valid": false
|
|
769
|
+
},
|
|
770
|
+
{
|
|
771
|
+
"rule": "FREQ=YEARLY;BYMONTHDAY=29",
|
|
772
|
+
"valid": true
|
|
773
|
+
},
|
|
774
|
+
{
|
|
775
|
+
"rule": "FREQ=YEARLY;BYMONTHDAY=28",
|
|
776
|
+
"valid": false
|
|
777
|
+
}
|
|
778
|
+
]
|
|
779
|
+
}
|