@zag-js/date-utils 0.10.5 → 0.11.1

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.
Files changed (72) hide show
  1. package/dist/index.d.mts +145 -0
  2. package/dist/index.d.ts +145 -20
  3. package/dist/index.js +744 -74
  4. package/dist/index.js.map +1 -0
  5. package/dist/index.mjs +687 -19
  6. package/dist/index.mjs.map +1 -0
  7. package/package.json +2 -2
  8. package/src/parse-date.ts +12 -9
  9. package/dist/align.d.ts +0 -4
  10. package/dist/align.js +0 -29
  11. package/dist/align.mjs +0 -24
  12. package/dist/assertion.d.ts +0 -10
  13. package/dist/assertion.js +0 -47
  14. package/dist/assertion.mjs +0 -36
  15. package/dist/constrain.d.ts +0 -6
  16. package/dist/constrain.js +0 -66
  17. package/dist/constrain.mjs +0 -58
  18. package/dist/duration.d.ts +0 -8
  19. package/dist/duration.js +0 -23
  20. package/dist/duration.mjs +0 -18
  21. package/dist/format-date.d.ts +0 -6
  22. package/dist/format-date.js +0 -57
  23. package/dist/format-date.mjs +0 -53
  24. package/dist/format-range.d.ts +0 -2
  25. package/dist/format-range.js +0 -28
  26. package/dist/format-range.mjs +0 -24
  27. package/dist/format-selected-date.d.ts +0 -2
  28. package/dist/format-selected-date.js +0 -19
  29. package/dist/format-selected-date.mjs +0 -15
  30. package/dist/format-visible-range.d.ts +0 -2
  31. package/dist/format-visible-range.js +0 -26
  32. package/dist/format-visible-range.mjs +0 -22
  33. package/dist/get-day-formatter.d.ts +0 -2
  34. package/dist/get-day-formatter.js +0 -20
  35. package/dist/get-day-formatter.mjs +0 -16
  36. package/dist/get-decade-range.d.ts +0 -1
  37. package/dist/get-decade-range.js +0 -15
  38. package/dist/get-decade-range.mjs +0 -11
  39. package/dist/get-era-format.d.ts +0 -2
  40. package/dist/get-era-format.js +0 -9
  41. package/dist/get-era-format.mjs +0 -5
  42. package/dist/get-month-days.d.ts +0 -3
  43. package/dist/get-month-days.js +0 -29
  44. package/dist/get-month-days.mjs +0 -24
  45. package/dist/get-month-formatter.d.ts +0 -2
  46. package/dist/get-month-formatter.js +0 -19
  47. package/dist/get-month-formatter.mjs +0 -15
  48. package/dist/get-month-names.d.ts +0 -1
  49. package/dist/get-month-names.js +0 -15
  50. package/dist/get-month-names.mjs +0 -11
  51. package/dist/get-start-of-week.d.ts +0 -2
  52. package/dist/get-start-of-week.js +0 -13
  53. package/dist/get-start-of-week.mjs +0 -9
  54. package/dist/get-week-days.d.ts +0 -7
  55. package/dist/get-week-days.js +0 -15
  56. package/dist/get-week-days.mjs +0 -11
  57. package/dist/get-weekday-formats.d.ts +0 -7
  58. package/dist/get-weekday-formats.js +0 -22
  59. package/dist/get-weekday-formats.mjs +0 -18
  60. package/dist/get-year-range.d.ts +0 -5
  61. package/dist/get-year-range.js +0 -13
  62. package/dist/get-year-range.mjs +0 -9
  63. package/dist/mutation.d.ts +0 -10
  64. package/dist/mutation.js +0 -51
  65. package/dist/mutation.mjs +0 -40
  66. package/dist/pagination.d.ts +0 -49
  67. package/dist/pagination.js +0 -191
  68. package/dist/pagination.mjs +0 -179
  69. package/dist/parse-date.d.ts +0 -2
  70. package/dist/parse-date.js +0 -44
  71. package/dist/parse-date.mjs +0 -40
  72. package/dist/types.d.ts +0 -18
package/dist/index.mjs CHANGED
@@ -1,19 +1,687 @@
1
- export { alignDate, alignStartDate } from './align.mjs';
2
- export { isDateDisabled, isDateEqual, isDateInvalid, isDateOutsideVisibleRange, isDateUnavailable, isNextVisibleRangeInvalid, isPreviousVisibleRangeInvalid, isTodayDate } from './assertion.mjs';
3
- export { alignCenter, alignEnd, alignStart, constrainStart, constrainValue } from './constrain.mjs';
4
- export { getEndDate, getUnitDuration } from './duration.mjs';
5
- export { formatDate } from './format-date.mjs';
6
- export { formatRange } from './format-range.mjs';
7
- export { formatSelectedDate } from './format-selected-date.mjs';
8
- export { formatVisibleRange } from './format-visible-range.mjs';
9
- export { getDayFormatter } from './get-day-formatter.mjs';
10
- export { getDecadeRange } from './get-decade-range.mjs';
11
- export { getDaysInWeek, getMonthDays } from './get-month-days.mjs';
12
- export { getMonthFormatter } from './get-month-formatter.mjs';
13
- export { getMonthNames } from './get-month-names.mjs';
14
- export { getWeekDays } from './get-week-days.mjs';
15
- export { getWeekdayFormats } from './get-weekday-formats.mjs';
16
- export { getYearsRange } from './get-year-range.mjs';
17
- export { getNextDay, getPreviousAvailableDate, getPreviousDay, getTodayDate, setCalendar, setDate, setMonth, setYear } from './mutation.mjs';
18
- export { getAdjustedDateFn, getNextPage, getNextRow, getNextSection, getPreviousPage, getPreviousRow, getPreviousSection, getSectionEnd, getSectionStart } from './pagination.mjs';
19
- export { parseDateString } from './parse-date.mjs';
1
+ // src/constrain.ts
2
+ import {
3
+ maxDate,
4
+ minDate,
5
+ startOfMonth,
6
+ startOfWeek,
7
+ startOfYear,
8
+ toCalendarDate
9
+ } from "@internationalized/date";
10
+ function alignCenter(date, duration, locale, min, max) {
11
+ let halfDuration = {};
12
+ for (let key in duration) {
13
+ halfDuration[key] = Math.floor(duration[key] / 2);
14
+ if (halfDuration[key] > 0 && duration[key] % 2 === 0) {
15
+ halfDuration[key]--;
16
+ }
17
+ }
18
+ let aligned = alignStart(date, duration, locale).subtract(halfDuration);
19
+ return constrainStart(date, aligned, duration, locale, min, max);
20
+ }
21
+ function alignStart(date, duration, locale, min, max) {
22
+ let aligned = date;
23
+ if (duration.years) {
24
+ aligned = startOfYear(date);
25
+ } else if (duration.months) {
26
+ aligned = startOfMonth(date);
27
+ } else if (duration.weeks) {
28
+ aligned = startOfWeek(date, locale);
29
+ }
30
+ return constrainStart(date, aligned, duration, locale, min, max);
31
+ }
32
+ function alignEnd(date, duration, locale, min, max) {
33
+ let d = { ...duration };
34
+ if (d.days) {
35
+ d.days--;
36
+ } else if (d.weeks) {
37
+ d.weeks--;
38
+ } else if (d.months) {
39
+ d.months--;
40
+ } else if (d.years) {
41
+ d.years--;
42
+ }
43
+ let aligned = alignStart(date, duration, locale).subtract(d);
44
+ return constrainStart(date, aligned, duration, locale, min, max);
45
+ }
46
+ function constrainStart(date, aligned, duration, locale, min, max) {
47
+ if (min && date.compare(min) >= 0) {
48
+ aligned = maxDate(aligned, alignStart(toCalendarDate(min), duration, locale));
49
+ }
50
+ if (max && date.compare(max) <= 0) {
51
+ aligned = minDate(aligned, alignEnd(toCalendarDate(max), duration, locale));
52
+ }
53
+ return aligned;
54
+ }
55
+ function constrainValue(date, minValue, maxValue) {
56
+ if (minValue) {
57
+ date = maxDate(date, toCalendarDate(minValue));
58
+ }
59
+ if (maxValue) {
60
+ date = minDate(date, toCalendarDate(maxValue));
61
+ }
62
+ return date;
63
+ }
64
+
65
+ // src/align.ts
66
+ function alignDate(date, alignment, duration, locale, min, max) {
67
+ switch (alignment) {
68
+ case "start":
69
+ return alignStart(date, duration, locale, min, max);
70
+ case "end":
71
+ return alignEnd(date, duration, locale, min, max);
72
+ case "center":
73
+ default:
74
+ return alignCenter(date, duration, locale, min, max);
75
+ }
76
+ }
77
+ function alignStartDate(date, startDate, endDate, duration, locale, min, max) {
78
+ if (date.compare(startDate) < 0) {
79
+ return alignEnd(date, duration, locale, min, max);
80
+ }
81
+ if (date.compare(endDate) > 0) {
82
+ return alignStart(date, duration, locale, min, max);
83
+ }
84
+ return startDate;
85
+ }
86
+
87
+ // src/assertion.ts
88
+ import { isSameDay, isToday } from "@internationalized/date";
89
+ function isTodayDate(date, timeZone) {
90
+ return isToday(date, timeZone);
91
+ }
92
+ function isDateEqual(dateA, dateB) {
93
+ return dateB != null && isSameDay(dateA, dateB);
94
+ }
95
+ function isDateInvalid(date, minValue, maxValue) {
96
+ return minValue != null && date.compare(minValue) < 0 || maxValue != null && date.compare(maxValue) > 0;
97
+ }
98
+ function isDateDisabled(date, startDate, endDate, minValue, maxValue) {
99
+ return date.compare(startDate) < 0 || date.compare(endDate) > 0 || isDateInvalid(date, minValue, maxValue);
100
+ }
101
+ function isDateUnavailable(date, isUnavailable, locale, minValue, maxValue) {
102
+ if (!date) {
103
+ return false;
104
+ }
105
+ if (isUnavailable?.(date, locale)) {
106
+ return true;
107
+ }
108
+ return isDateInvalid(date, minValue, maxValue);
109
+ }
110
+ function isDateOutsideVisibleRange(date, startDate, endDate) {
111
+ return date.compare(startDate) < 0 || date.compare(endDate) > 0;
112
+ }
113
+ function isPreviousVisibleRangeInvalid(startDate, minValue, maxValue) {
114
+ const prevDate = startDate.subtract({ days: 1 });
115
+ return isSameDay(prevDate, startDate) || isDateInvalid(prevDate, minValue, maxValue);
116
+ }
117
+ function isNextVisibleRangeInvalid(endDate, minValue, maxValue) {
118
+ const nextDate = endDate.add({ days: 1 });
119
+ return isSameDay(nextDate, endDate) || isDateInvalid(nextDate, minValue, maxValue);
120
+ }
121
+
122
+ // src/duration.ts
123
+ function getUnitDuration(duration) {
124
+ let d = { ...duration };
125
+ for (let key in d) {
126
+ d[key] = 1;
127
+ }
128
+ return d;
129
+ }
130
+ function getEndDate(startDate, duration) {
131
+ let d = { ...duration };
132
+ if (d.days) {
133
+ d.days--;
134
+ } else {
135
+ d.days = -1;
136
+ }
137
+ return startDate.add(d);
138
+ }
139
+
140
+ // src/format-date.ts
141
+ import { toCalendarDateTime } from "@internationalized/date";
142
+ function createRegEx(sign) {
143
+ let symbols = "\\s|\\.|-|/|\\\\|,|\\$|\\!|\\?|:|;";
144
+ return new RegExp("(^|>|" + symbols + ")(" + sign + ")($|<|" + symbols + ")", "g");
145
+ }
146
+ function formatDate(value, formatString, locale, timeZone = "UTC") {
147
+ const datetime = toCalendarDateTime(value);
148
+ const date = datetime.toDate(timeZone);
149
+ const formats = {
150
+ // Time in ms
151
+ T: date.getTime(),
152
+ // Minutes
153
+ m: date.toLocaleString(locale, { minute: "numeric" }),
154
+ mm: date.toLocaleString(locale, { minute: "2-digit" }),
155
+ // Seconds
156
+ s: date.toLocaleString(locale, { second: "numeric" }),
157
+ ss: date.toLocaleString(locale, { second: "2-digit" }),
158
+ // Hours
159
+ h: date.toLocaleString(locale, { hour: "numeric", hour12: true }),
160
+ hh: date.toLocaleString(locale, { hour: "2-digit", hour12: true }),
161
+ H: date.toLocaleString(locale, { hour: "numeric", hour12: false }),
162
+ HH: date.toLocaleString(locale, { hour: "2-digit", hour12: false }),
163
+ // Day period
164
+ aa: date.toLocaleString(locale, { hour: "numeric", hour12: true }).toLowerCase(),
165
+ AA: date.toLocaleString(locale, { hour: "numeric", hour12: true }).toUpperCase(),
166
+ // Day of week
167
+ E: date.toLocaleString(locale, { weekday: "short" }),
168
+ EE: date.toLocaleString(locale, { weekday: "short" }),
169
+ EEE: date.toLocaleString(locale, { weekday: "short" }),
170
+ EEEE: date.toLocaleString(locale, { weekday: "long" }),
171
+ // Date of month
172
+ d: datetime.day,
173
+ dd: date.toLocaleString(locale, { day: "2-digit" }),
174
+ // Months
175
+ M: datetime.month + 1,
176
+ MM: date.toLocaleString(locale, { month: "2-digit" }),
177
+ MMM: date.toLocaleString(locale, { month: "short" }),
178
+ MMMM: date.toLocaleString(locale, { month: "long" }),
179
+ // Years
180
+ yy: date.toLocaleString(locale, { year: "2-digit" }),
181
+ yyyy: date.toLocaleString(locale, { year: "numeric" }),
182
+ YY: date.toLocaleString(locale, { year: "2-digit" }),
183
+ YYYY: date.toLocaleString(locale, { year: "numeric" })
184
+ };
185
+ let result = formatString;
186
+ for (const key in formats) {
187
+ result = result.replace(createRegEx(key), "$1" + formats[key] + "$3");
188
+ }
189
+ return result;
190
+ }
191
+
192
+ // src/format-range.ts
193
+ function formatRange(startDate, endDate, formatter, toString, timeZone) {
194
+ let parts = formatter.formatRangeToParts(startDate.toDate(timeZone), endDate.toDate(timeZone));
195
+ let separatorIndex = -1;
196
+ for (let i = 0; i < parts.length; i++) {
197
+ let part = parts[i];
198
+ if (part.source === "shared" && part.type === "literal") {
199
+ separatorIndex = i;
200
+ } else if (part.source === "endRange") {
201
+ break;
202
+ }
203
+ }
204
+ let start = "";
205
+ let end = "";
206
+ for (let i = 0; i < parts.length; i++) {
207
+ if (i < separatorIndex) {
208
+ start += parts[i].value;
209
+ } else if (i > separatorIndex) {
210
+ end += parts[i].value;
211
+ }
212
+ }
213
+ return toString(start, end);
214
+ }
215
+
216
+ // src/format-selected-date.ts
217
+ import { isSameDay as isSameDay2 } from "@internationalized/date";
218
+
219
+ // src/get-day-formatter.ts
220
+ import { DateFormatter, toCalendarDateTime as toCalendarDateTime2, today } from "@internationalized/date";
221
+
222
+ // src/get-era-format.ts
223
+ function getEraFormat(date) {
224
+ return date?.calendar.identifier === "gregory" && date.era === "BC" ? "short" : void 0;
225
+ }
226
+
227
+ // src/get-day-formatter.ts
228
+ function getDayFormatter(locale, timeZone) {
229
+ const date = toCalendarDateTime2(today(timeZone));
230
+ return new DateFormatter(locale, {
231
+ weekday: "long",
232
+ month: "long",
233
+ year: "numeric",
234
+ day: "numeric",
235
+ era: getEraFormat(date),
236
+ timeZone
237
+ });
238
+ }
239
+
240
+ // src/format-selected-date.ts
241
+ function formatSelectedDate(startDate, endDate, locale, timeZone) {
242
+ let start = startDate;
243
+ let end = endDate ?? startDate;
244
+ let formatter = getDayFormatter(locale, timeZone);
245
+ if (isSameDay2(start, end)) {
246
+ return formatter.format(start.toDate(timeZone));
247
+ }
248
+ return formatRange(start, end, formatter, (start2, end2) => `${start2} \u2013 ${end2}`, timeZone);
249
+ }
250
+
251
+ // src/format-visible-range.ts
252
+ import { endOfMonth, isSameDay as isSameDay3, startOfMonth as startOfMonth2 } from "@internationalized/date";
253
+
254
+ // src/get-month-formatter.ts
255
+ import { today as today2, toCalendarDate as toCalendarDate2, DateFormatter as DateFormatter2 } from "@internationalized/date";
256
+ function getMonthFormatter(locale, timeZone) {
257
+ const date = toCalendarDate2(today2(timeZone));
258
+ return new DateFormatter2(locale, {
259
+ month: "long",
260
+ year: "numeric",
261
+ era: getEraFormat(date),
262
+ calendar: date?.calendar.identifier,
263
+ timeZone
264
+ });
265
+ }
266
+
267
+ // src/format-visible-range.ts
268
+ function formatVisibleRange(startDate, endDate, locale, timeZone) {
269
+ const start = startDate;
270
+ const end = endDate ?? startDate;
271
+ const dayFormatter = getDayFormatter(locale, timeZone);
272
+ if (!isSameDay3(start, startOfMonth2(start))) {
273
+ return dayFormatter.formatRange(start.toDate(timeZone), end.toDate(timeZone));
274
+ }
275
+ const monthFormatter = getMonthFormatter(locale, timeZone);
276
+ if (isSameDay3(end, endOfMonth(start))) {
277
+ return monthFormatter.format(start.toDate(timeZone));
278
+ }
279
+ if (isSameDay3(end, endOfMonth(end))) {
280
+ return monthFormatter.formatRange(start.toDate(timeZone), end.toDate(timeZone));
281
+ }
282
+ return "";
283
+ }
284
+
285
+ // src/get-decade-range.ts
286
+ function getDecadeRange(year) {
287
+ const computedYear = year - year % 10 - 1;
288
+ const years = [];
289
+ for (let i = 0; i < 12; i += 1) {
290
+ const value = computedYear + i;
291
+ years.push(value);
292
+ }
293
+ return years;
294
+ }
295
+
296
+ // src/get-month-days.ts
297
+ import { getWeeksInMonth, isSameDay as isSameDay4 } from "@internationalized/date";
298
+
299
+ // src/get-start-of-week.ts
300
+ import { getDayOfWeek } from "@internationalized/date";
301
+ function getStartOfWeek(date, locale, firstDayOfWeek = 0) {
302
+ const day = getDayOfWeek(date, locale);
303
+ const diff = (day - firstDayOfWeek + 7) % 7;
304
+ return date.subtract({ days: diff });
305
+ }
306
+
307
+ // src/get-month-days.ts
308
+ function getDaysInWeek(weekIndex, from, locale, firstDayOfWeek) {
309
+ const weekDate = from.add({ weeks: weekIndex });
310
+ const dates = [];
311
+ let date = getStartOfWeek(weekDate, locale, firstDayOfWeek);
312
+ while (dates.length < 7) {
313
+ dates.push(date);
314
+ let nextDate = date.add({ days: 1 });
315
+ if (isSameDay4(date, nextDate)) {
316
+ break;
317
+ }
318
+ date = nextDate;
319
+ }
320
+ return dates;
321
+ }
322
+ function getMonthDays(from, locale, numOfWeeks, firstDayOfWeek) {
323
+ const monthWeeks = getWeeksInMonth(from, locale);
324
+ const weeks = [...new Array(numOfWeeks ?? monthWeeks).keys()];
325
+ return weeks.map((week) => getDaysInWeek(week, from, locale, firstDayOfWeek));
326
+ }
327
+
328
+ // src/get-month-names.ts
329
+ function getMonthNames(locale, format = "long") {
330
+ const date = new Date(2021, 0, 1);
331
+ const monthNames = [];
332
+ for (let i = 0; i < 12; i++) {
333
+ monthNames.push(date.toLocaleString(locale, { month: format }));
334
+ date.setMonth(date.getMonth() + 1);
335
+ }
336
+ return monthNames;
337
+ }
338
+
339
+ // src/get-weekday-formats.ts
340
+ import { DateFormatter as DateFormatter3 } from "@internationalized/date";
341
+ function getWeekdayFormats(locale, timeZone) {
342
+ const longFormat = new DateFormatter3(locale, { weekday: "long", timeZone });
343
+ const shortFormat = new DateFormatter3(locale, { weekday: "short", timeZone });
344
+ const narrowFormat = new DateFormatter3(locale, { weekday: "narrow", timeZone });
345
+ return (value) => {
346
+ const date = value instanceof Date ? value : value.toDate(timeZone);
347
+ return {
348
+ value,
349
+ short: shortFormat.format(date),
350
+ long: longFormat.format(date),
351
+ narrow: narrowFormat.format(date)
352
+ };
353
+ };
354
+ }
355
+
356
+ // src/get-week-days.ts
357
+ function getWeekDays(date, startOfWeekProp, timeZone, locale) {
358
+ const firstDayOfWeek = getStartOfWeek(date, locale, startOfWeekProp);
359
+ const weeks = [...new Array(7).keys()];
360
+ const format = getWeekdayFormats(locale, timeZone);
361
+ return weeks.map((index) => format(firstDayOfWeek.add({ days: index })));
362
+ }
363
+
364
+ // src/get-year-range.ts
365
+ function getYearsRange(range) {
366
+ const years = [];
367
+ for (let year = range.from; year <= range.to; year += 1) {
368
+ years.push(year);
369
+ }
370
+ return years;
371
+ }
372
+
373
+ // src/mutation.ts
374
+ import {
375
+ getLocalTimeZone,
376
+ toCalendar,
377
+ toCalendarDateTime as toCalendarDateTime3,
378
+ today as today3
379
+ } from "@internationalized/date";
380
+ function getTodayDate(timeZone) {
381
+ return today3(timeZone ?? getLocalTimeZone());
382
+ }
383
+ function getNextDay(date) {
384
+ return date.add({ days: 1 });
385
+ }
386
+ function getPreviousDay(date) {
387
+ return date.subtract({ days: 1 });
388
+ }
389
+ function setMonth(date, month) {
390
+ return date.set({ month });
391
+ }
392
+ function setYear(date, year) {
393
+ return date.set({ year });
394
+ }
395
+ function setCalendar(date, calendar) {
396
+ return toCalendar(toCalendarDateTime3(date), calendar);
397
+ }
398
+ function setDate(date, startDate, isDateUnavailable2, locale, minValue, maxValue) {
399
+ let result;
400
+ result = constrainValue(date, minValue, maxValue);
401
+ result = getPreviousAvailableDate(date, startDate, locale, isDateUnavailable2);
402
+ return result;
403
+ }
404
+ function getPreviousAvailableDate(date, minValue, locale, isDateUnavailable2) {
405
+ if (!isDateUnavailable2) {
406
+ return date;
407
+ }
408
+ while (date.compare(minValue) >= 0 && isDateUnavailable2(date, locale)) {
409
+ date = date.subtract({ days: 1 });
410
+ }
411
+ if (date.compare(minValue) >= 0) {
412
+ return date;
413
+ }
414
+ }
415
+
416
+ // src/pagination.ts
417
+ import {
418
+ endOfMonth as endOfMonth2,
419
+ endOfWeek,
420
+ startOfMonth as startOfMonth3,
421
+ startOfWeek as startOfWeek2
422
+ } from "@internationalized/date";
423
+ function getAdjustedDateFn(visibleDuration, locale, minValue, maxValue) {
424
+ return function getDate(options) {
425
+ const { startDate, focusedDate } = options;
426
+ const endDate = getEndDate(startDate, visibleDuration);
427
+ if (isDateInvalid(focusedDate, minValue, maxValue)) {
428
+ return {
429
+ startDate,
430
+ focusedDate: constrainValue(focusedDate, minValue, maxValue),
431
+ endDate
432
+ };
433
+ }
434
+ if (focusedDate.compare(startDate) < 0) {
435
+ return {
436
+ startDate: alignEnd(focusedDate, visibleDuration, locale, minValue, maxValue),
437
+ endDate,
438
+ focusedDate: constrainValue(focusedDate, minValue, maxValue)
439
+ };
440
+ }
441
+ if (focusedDate.compare(endDate) > 0) {
442
+ return {
443
+ startDate: alignStart(focusedDate, visibleDuration, locale, minValue, maxValue),
444
+ endDate,
445
+ focusedDate: constrainValue(focusedDate, minValue, maxValue)
446
+ };
447
+ }
448
+ return {
449
+ startDate,
450
+ endDate,
451
+ focusedDate: constrainValue(focusedDate, minValue, maxValue)
452
+ };
453
+ };
454
+ }
455
+ function getNextPage(focusedDate, startDate, visibleDuration, locale, minValue, maxValue) {
456
+ const adjust = getAdjustedDateFn(visibleDuration, locale, minValue, maxValue);
457
+ const start = startDate.add(visibleDuration);
458
+ return adjust({
459
+ focusedDate: focusedDate.add(visibleDuration),
460
+ startDate: alignStart(
461
+ constrainStart(focusedDate, start, visibleDuration, locale, minValue, maxValue),
462
+ visibleDuration,
463
+ locale
464
+ )
465
+ });
466
+ }
467
+ function getPreviousPage(focusedDate, startDate, visibleDuration, locale, minValue, maxValue) {
468
+ const adjust = getAdjustedDateFn(visibleDuration, locale, minValue, maxValue);
469
+ let start = startDate.subtract(visibleDuration);
470
+ return adjust({
471
+ focusedDate: focusedDate.subtract(visibleDuration),
472
+ startDate: alignStart(
473
+ constrainStart(focusedDate, start, visibleDuration, locale, minValue, maxValue),
474
+ visibleDuration,
475
+ locale
476
+ )
477
+ });
478
+ }
479
+ function getNextRow(focusedDate, startDate, visibleDuration, locale, minValue, maxValue) {
480
+ const adjust = getAdjustedDateFn(visibleDuration, locale, minValue, maxValue);
481
+ if (visibleDuration.days) {
482
+ return getNextPage(focusedDate, startDate, visibleDuration, locale, minValue, maxValue);
483
+ }
484
+ if (visibleDuration.weeks || visibleDuration.months || visibleDuration.years) {
485
+ return adjust({
486
+ focusedDate: focusedDate.add({ weeks: 1 }),
487
+ startDate
488
+ });
489
+ }
490
+ }
491
+ function getPreviousRow(focusedDate, startDate, visibleDuration, locale, minValue, maxValue) {
492
+ const adjust = getAdjustedDateFn(visibleDuration, locale, minValue, maxValue);
493
+ if (visibleDuration.days) {
494
+ return getPreviousPage(focusedDate, startDate, visibleDuration, locale, minValue, maxValue);
495
+ }
496
+ if (visibleDuration.weeks || visibleDuration.months || visibleDuration.years) {
497
+ return adjust({
498
+ focusedDate: focusedDate.subtract({ weeks: 1 }),
499
+ startDate
500
+ });
501
+ }
502
+ }
503
+ function getSectionStart(focusedDate, startDate, visibleDuration, locale, minValue, maxValue) {
504
+ const adjust = getAdjustedDateFn(visibleDuration, locale, minValue, maxValue);
505
+ if (visibleDuration.days) {
506
+ return adjust({
507
+ focusedDate: startDate,
508
+ startDate
509
+ });
510
+ }
511
+ if (visibleDuration.weeks) {
512
+ return adjust({
513
+ focusedDate: startOfWeek2(focusedDate, locale),
514
+ startDate
515
+ });
516
+ }
517
+ if (visibleDuration.months || visibleDuration.years) {
518
+ return adjust({
519
+ focusedDate: startOfMonth3(focusedDate),
520
+ startDate
521
+ });
522
+ }
523
+ }
524
+ function getSectionEnd(focusedDate, startDate, visibleDuration, locale, minValue, maxValue) {
525
+ const adjust = getAdjustedDateFn(visibleDuration, locale, minValue, maxValue);
526
+ const endDate = getEndDate(startDate, visibleDuration);
527
+ if (visibleDuration.days) {
528
+ return adjust({
529
+ focusedDate: endDate,
530
+ startDate
531
+ });
532
+ }
533
+ if (visibleDuration.weeks) {
534
+ return adjust({
535
+ //@ts-expect-error - endOfWeek is loosely typed
536
+ focusedDate: endOfWeek(focusedDate, locale),
537
+ startDate
538
+ });
539
+ }
540
+ if (visibleDuration.months || visibleDuration.years) {
541
+ return adjust({
542
+ focusedDate: endOfMonth2(focusedDate),
543
+ startDate
544
+ });
545
+ }
546
+ }
547
+ function getNextSection(focusedDate, startDate, larger, visibleDuration, locale, minValue, maxValue) {
548
+ const adjust = getAdjustedDateFn(visibleDuration, locale, minValue, maxValue);
549
+ if (!larger && !visibleDuration.days) {
550
+ return adjust({
551
+ focusedDate: focusedDate.add(getUnitDuration(visibleDuration)),
552
+ startDate
553
+ });
554
+ }
555
+ if (visibleDuration.days) {
556
+ return getNextPage(focusedDate, startDate, visibleDuration, locale, minValue, maxValue);
557
+ }
558
+ if (visibleDuration.weeks) {
559
+ return adjust({
560
+ focusedDate: focusedDate.add({ months: 1 }),
561
+ startDate
562
+ });
563
+ }
564
+ if (visibleDuration.months || visibleDuration.years) {
565
+ return adjust({
566
+ focusedDate: focusedDate.add({ years: 1 }),
567
+ startDate
568
+ });
569
+ }
570
+ }
571
+ function getPreviousSection(focusedDate, startDate, larger, visibleDuration, locale, minValue, maxValue) {
572
+ const adjust = getAdjustedDateFn(visibleDuration, locale, minValue, maxValue);
573
+ if (!larger && !visibleDuration.days) {
574
+ return adjust({
575
+ focusedDate: focusedDate.subtract(getUnitDuration(visibleDuration)),
576
+ startDate
577
+ });
578
+ }
579
+ if (visibleDuration.days) {
580
+ return getPreviousPage(focusedDate, startDate, visibleDuration, locale, minValue, maxValue);
581
+ }
582
+ if (visibleDuration.weeks) {
583
+ return adjust({
584
+ focusedDate: focusedDate.subtract({ months: 1 }),
585
+ startDate
586
+ });
587
+ }
588
+ if (visibleDuration.months || visibleDuration.years) {
589
+ return adjust({
590
+ focusedDate: focusedDate.subtract({ years: 1 }),
591
+ startDate
592
+ });
593
+ }
594
+ }
595
+
596
+ // src/parse-date.ts
597
+ import { CalendarDateTime, DateFormatter as DateFormatter4 } from "@internationalized/date";
598
+ function parseDateString(date, locale, timeZone) {
599
+ const regex = createRegex(locale, timeZone);
600
+ const { year, month, day } = extract(regex, date) ?? {};
601
+ if (year != null && year.length === 4 && month != null && +month <= 12 && day != null && +day <= 31) {
602
+ return new CalendarDateTime(+year, +month, +day);
603
+ }
604
+ const time = Date.parse(date);
605
+ if (!isNaN(time)) {
606
+ const date2 = new Date(time);
607
+ return new CalendarDateTime(date2.getFullYear(), date2.getMonth() + 1, date2.getDate());
608
+ }
609
+ }
610
+ function createRegex(locale, timeZone) {
611
+ const formatter = new DateFormatter4(locale, { day: "numeric", month: "numeric", year: "numeric", timeZone });
612
+ const parts = formatter.formatToParts(new Date(2e3, 11, 25));
613
+ return parts.map(({ type, value }) => type === "literal" ? value : `((?!=<${type}>)\\d+)`).join("");
614
+ }
615
+ function extract(pattern, str) {
616
+ const matches = str.match(pattern);
617
+ return pattern.toString().match(/<(.+?)>/g)?.map((group) => {
618
+ const groupMatches = group.match(/<(.+)>/);
619
+ if (!groupMatches || groupMatches.length <= 0) {
620
+ return null;
621
+ }
622
+ return group.match(/<(.+)>/)?.[1];
623
+ }).reduce(
624
+ (acc, curr, index) => {
625
+ if (!curr)
626
+ return acc;
627
+ if (matches && matches.length > index) {
628
+ acc[curr] = matches[index + 1];
629
+ } else {
630
+ acc[curr] = null;
631
+ }
632
+ return acc;
633
+ },
634
+ {}
635
+ );
636
+ }
637
+ export {
638
+ alignCenter,
639
+ alignDate,
640
+ alignEnd,
641
+ alignStart,
642
+ alignStartDate,
643
+ constrainStart,
644
+ constrainValue,
645
+ formatDate,
646
+ formatRange,
647
+ formatSelectedDate,
648
+ formatVisibleRange,
649
+ getAdjustedDateFn,
650
+ getDayFormatter,
651
+ getDaysInWeek,
652
+ getDecadeRange,
653
+ getEndDate,
654
+ getMonthDays,
655
+ getMonthFormatter,
656
+ getMonthNames,
657
+ getNextDay,
658
+ getNextPage,
659
+ getNextRow,
660
+ getNextSection,
661
+ getPreviousAvailableDate,
662
+ getPreviousDay,
663
+ getPreviousPage,
664
+ getPreviousRow,
665
+ getPreviousSection,
666
+ getSectionEnd,
667
+ getSectionStart,
668
+ getTodayDate,
669
+ getUnitDuration,
670
+ getWeekDays,
671
+ getWeekdayFormats,
672
+ getYearsRange,
673
+ isDateDisabled,
674
+ isDateEqual,
675
+ isDateInvalid,
676
+ isDateOutsideVisibleRange,
677
+ isDateUnavailable,
678
+ isNextVisibleRangeInvalid,
679
+ isPreviousVisibleRangeInvalid,
680
+ isTodayDate,
681
+ parseDateString,
682
+ setCalendar,
683
+ setDate,
684
+ setMonth,
685
+ setYear
686
+ };
687
+ //# sourceMappingURL=index.mjs.map