@gobrand/tiempo 3.1.3 → 3.2.0

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 (151) hide show
  1. package/dist/addBusinessDays.d.ts +14 -4
  2. package/dist/addBusinessDays.d.ts.map +1 -1
  3. package/dist/addBusinessDays.js +2 -2
  4. package/dist/areIntervalsOverlapping.d.ts +60 -0
  5. package/dist/areIntervalsOverlapping.d.ts.map +1 -0
  6. package/dist/areIntervalsOverlapping.js +9 -0
  7. package/dist/areIntervalsOverlapping.js.map +1 -0
  8. package/dist/chunk-2JXI3CAL.js +22 -0
  9. package/dist/chunk-2JXI3CAL.js.map +1 -0
  10. package/dist/{chunk-BYPHFTFD.js → chunk-2LT2XOAL.js} +4 -82
  11. package/dist/chunk-2LT2XOAL.js.map +1 -0
  12. package/dist/chunk-3OOGJRXH.js +247 -0
  13. package/dist/chunk-3OOGJRXH.js.map +1 -0
  14. package/dist/chunk-42IFQS4W.js +16 -0
  15. package/dist/chunk-42IFQS4W.js.map +1 -0
  16. package/dist/{chunk-MXYAZTDE.js → chunk-4FQCY75E.js} +4 -4
  17. package/dist/chunk-4YCEFGZA.js +61 -0
  18. package/dist/chunk-4YCEFGZA.js.map +1 -0
  19. package/dist/chunk-6UBFKQIJ.js +20 -0
  20. package/dist/chunk-6UBFKQIJ.js.map +1 -0
  21. package/dist/chunk-7PH5BPMS.js +14 -0
  22. package/dist/chunk-7PH5BPMS.js.map +1 -0
  23. package/dist/chunk-C7QA4J6V.js +14 -0
  24. package/dist/chunk-C7QA4J6V.js.map +1 -0
  25. package/dist/chunk-DVZDJ5LM.js +33 -0
  26. package/dist/chunk-DVZDJ5LM.js.map +1 -0
  27. package/dist/{chunk-AOODDNHA.js → chunk-DYIISNVW.js} +14 -12
  28. package/dist/chunk-DYIISNVW.js.map +1 -0
  29. package/dist/{chunk-6QZUAJVF.js → chunk-GOJ45AG7.js} +2 -2
  30. package/dist/chunk-H43LMOCK.js +26 -0
  31. package/dist/chunk-H43LMOCK.js.map +1 -0
  32. package/dist/chunk-HH2HTC44.js +87 -0
  33. package/dist/chunk-HH2HTC44.js.map +1 -0
  34. package/dist/chunk-IDB3R3G5.js +21 -0
  35. package/dist/chunk-IDB3R3G5.js.map +1 -0
  36. package/dist/chunk-IIEHQPKE.js +36 -0
  37. package/dist/chunk-IIEHQPKE.js.map +1 -0
  38. package/dist/{chunk-OVBZ2NBB.js → chunk-K7SY2MAX.js} +10 -4
  39. package/dist/chunk-K7SY2MAX.js.map +1 -0
  40. package/dist/chunk-KZYWHHAQ.js +19 -0
  41. package/dist/chunk-KZYWHHAQ.js.map +1 -0
  42. package/dist/chunk-M2XB72L5.js +17 -0
  43. package/dist/chunk-M2XB72L5.js.map +1 -0
  44. package/dist/chunk-OMUK2MOH.js +19 -0
  45. package/dist/chunk-OMUK2MOH.js.map +1 -0
  46. package/dist/chunk-PLPGYCQQ.js +28 -0
  47. package/dist/chunk-PLPGYCQQ.js.map +1 -0
  48. package/dist/chunk-R6D3Y5NV.js +17 -0
  49. package/dist/chunk-R6D3Y5NV.js.map +1 -0
  50. package/dist/chunk-U6VFT2A5.js +14 -0
  51. package/dist/chunk-U6VFT2A5.js.map +1 -0
  52. package/dist/chunk-XMEPH226.js +21 -0
  53. package/dist/chunk-XMEPH226.js.map +1 -0
  54. package/dist/{chunk-NGS5UKDW.js → chunk-ZNRTNR2Q.js} +4 -4
  55. package/dist/differenceInBusinessDays.d.ts +7 -5
  56. package/dist/differenceInBusinessDays.d.ts.map +1 -1
  57. package/dist/differenceInBusinessDays.js +2 -2
  58. package/dist/differenceInCalendarDays.d.ts +35 -0
  59. package/dist/differenceInCalendarDays.d.ts.map +1 -0
  60. package/dist/differenceInCalendarDays.js +10 -0
  61. package/dist/differenceInCalendarDays.js.map +1 -0
  62. package/dist/differenceInCalendarMonths.d.ts +27 -0
  63. package/dist/differenceInCalendarMonths.d.ts.map +1 -0
  64. package/dist/differenceInCalendarMonths.js +10 -0
  65. package/dist/differenceInCalendarMonths.js.map +1 -0
  66. package/dist/differenceInCalendarQuarters.d.ts +26 -0
  67. package/dist/differenceInCalendarQuarters.d.ts.map +1 -0
  68. package/dist/differenceInCalendarQuarters.js +11 -0
  69. package/dist/differenceInCalendarQuarters.js.map +1 -0
  70. package/dist/differenceInCalendarWeeks.d.ts +29 -0
  71. package/dist/differenceInCalendarWeeks.d.ts.map +1 -0
  72. package/dist/differenceInCalendarWeeks.js +11 -0
  73. package/dist/differenceInCalendarWeeks.js.map +1 -0
  74. package/dist/differenceInCalendarYears.d.ts +27 -0
  75. package/dist/differenceInCalendarYears.d.ts.map +1 -0
  76. package/dist/differenceInCalendarYears.js +10 -0
  77. package/dist/differenceInCalendarYears.js.map +1 -0
  78. package/dist/eachWeekOfInterval.d.ts +7 -5
  79. package/dist/eachWeekOfInterval.d.ts.map +1 -1
  80. package/dist/eachWeekOfInterval.js +2 -1
  81. package/dist/endOfQuarter.js +2 -2
  82. package/dist/endOfWeek.d.ts +17 -7
  83. package/dist/endOfWeek.d.ts.map +1 -1
  84. package/dist/endOfWeek.js +2 -1
  85. package/dist/format.d.ts.map +1 -1
  86. package/dist/format.js +2 -1
  87. package/dist/index.d.ts +10 -0
  88. package/dist/index.d.ts.map +1 -1
  89. package/dist/index.js +117 -78
  90. package/dist/isSameWeek.d.ts +16 -7
  91. package/dist/isSameWeek.d.ts.map +1 -1
  92. package/dist/isSameWeek.js +2 -1
  93. package/dist/isWeekend.js +2 -2
  94. package/dist/isWithinInterval.d.ts +41 -6
  95. package/dist/isWithinInterval.d.ts.map +1 -1
  96. package/dist/isWithinInterval.js +3 -2
  97. package/dist/nextDay.d.ts +33 -0
  98. package/dist/nextDay.d.ts.map +1 -0
  99. package/dist/nextDay.js +10 -0
  100. package/dist/nextDay.js.map +1 -0
  101. package/dist/parse.d.ts +57 -0
  102. package/dist/parse.d.ts.map +1 -0
  103. package/dist/parse.js +9 -0
  104. package/dist/parse.js.map +1 -0
  105. package/dist/previousDay.d.ts +26 -0
  106. package/dist/previousDay.d.ts.map +1 -0
  107. package/dist/previousDay.js +10 -0
  108. package/dist/previousDay.js.map +1 -0
  109. package/dist/shared/businessDays.d.ts +15 -0
  110. package/dist/shared/businessDays.d.ts.map +1 -1
  111. package/dist/shared/businessDays.js +7 -3
  112. package/dist/shared/calendarDates.d.ts +9 -0
  113. package/dist/shared/calendarDates.d.ts.map +1 -0
  114. package/dist/shared/calendarDates.js +9 -0
  115. package/dist/shared/calendarDates.js.map +1 -0
  116. package/dist/shared/formatTokens.d.ts +8 -0
  117. package/dist/shared/formatTokens.d.ts.map +1 -0
  118. package/dist/shared/formatTokens.js +7 -0
  119. package/dist/shared/formatTokens.js.map +1 -0
  120. package/dist/shared/week.d.ts +26 -0
  121. package/dist/shared/week.d.ts.map +1 -0
  122. package/dist/shared/week.js +9 -0
  123. package/dist/shared/week.js.map +1 -0
  124. package/dist/startOfQuarter.js +2 -2
  125. package/dist/startOfWeek.d.ts +17 -7
  126. package/dist/startOfWeek.d.ts.map +1 -1
  127. package/dist/startOfWeek.js +2 -1
  128. package/dist/subBusinessDays.d.ts +6 -4
  129. package/dist/subBusinessDays.d.ts.map +1 -1
  130. package/dist/subBusinessDays.js +3 -3
  131. package/package.json +1 -1
  132. package/dist/chunk-2TISXHHK.js +0 -29
  133. package/dist/chunk-2TISXHHK.js.map +0 -1
  134. package/dist/chunk-4PS6BEAC.js +0 -16
  135. package/dist/chunk-4PS6BEAC.js.map +0 -1
  136. package/dist/chunk-57MHNRCU.js +0 -22
  137. package/dist/chunk-57MHNRCU.js.map +0 -1
  138. package/dist/chunk-AOODDNHA.js.map +0 -1
  139. package/dist/chunk-BYPHFTFD.js.map +0 -1
  140. package/dist/chunk-D3N7BT44.js +0 -22
  141. package/dist/chunk-D3N7BT44.js.map +0 -1
  142. package/dist/chunk-GCVX5QIX.js +0 -15
  143. package/dist/chunk-GCVX5QIX.js.map +0 -1
  144. package/dist/chunk-K7CLBBBM.js +0 -36
  145. package/dist/chunk-K7CLBBBM.js.map +0 -1
  146. package/dist/chunk-MLHFNZEA.js +0 -26
  147. package/dist/chunk-MLHFNZEA.js.map +0 -1
  148. package/dist/chunk-OVBZ2NBB.js.map +0 -1
  149. /package/dist/{chunk-MXYAZTDE.js.map → chunk-4FQCY75E.js.map} +0 -0
  150. /package/dist/{chunk-6QZUAJVF.js.map → chunk-GOJ45AG7.js.map} +0 -0
  151. /package/dist/{chunk-NGS5UKDW.js.map → chunk-ZNRTNR2Q.js.map} +0 -0
@@ -0,0 +1,61 @@
1
+ import {
2
+ normalizeTemporalInput
3
+ } from "./chunk-Q6QLOUXJ.js";
4
+ import {
5
+ Temporal,
6
+ isPlainDate
7
+ } from "./chunk-BSVOJYJ7.js";
8
+
9
+ // src/shared/businessDays.ts
10
+ function isWeekendDay(dayOfWeek) {
11
+ return dayOfWeek >= 6;
12
+ }
13
+ function addWeekdays(start, days) {
14
+ if (!Number.isInteger(days)) {
15
+ throw new RangeError("Business day counts must be integers");
16
+ }
17
+ const step = days < 0 ? -1 : 1;
18
+ const fullWeeks = Math.max(0, Math.trunc((Math.abs(days) - 1) / 5));
19
+ let result = fullWeeks === 0 ? start : start.add({ days: step * fullWeeks * 7 });
20
+ for (let remaining = Math.abs(days) - fullWeeks * 5; remaining > 0; ) {
21
+ result = result.add({ days: step });
22
+ if (!isWeekendDay(result.dayOfWeek)) remaining--;
23
+ }
24
+ return result;
25
+ }
26
+ function isoDate(input) {
27
+ const date = isPlainDate(input) ? input : normalizeTemporalInput(input).toPlainDate();
28
+ return Temporal.PlainDate.from(date.toString()).withCalendar("iso8601");
29
+ }
30
+ function addBusinessDaysSkipping(start, days, holidays) {
31
+ let result = addWeekdays(start, days);
32
+ const dates = weekdayHolidays(holidays);
33
+ if (dates.length === 0 || days === 0) return result;
34
+ const step = days < 0 ? -1 : 1;
35
+ for (let from = isoDate(start); ; ) {
36
+ const to = isoDate(result);
37
+ const skipped = dates.filter(
38
+ (date) => step > 0 ? Temporal.PlainDate.compare(date, from) > 0 && Temporal.PlainDate.compare(date, to) <= 0 : Temporal.PlainDate.compare(date, from) < 0 && Temporal.PlainDate.compare(date, to) >= 0
39
+ ).length;
40
+ if (skipped === 0) return result;
41
+ from = to;
42
+ result = addWeekdays(result, step * skipped);
43
+ }
44
+ }
45
+ function weekdayHolidays(holidays) {
46
+ const unique = /* @__PURE__ */ new Map();
47
+ for (const holiday of holidays) {
48
+ const date = isoDate(holiday);
49
+ if (!isWeekendDay(date.dayOfWeek)) unique.set(date.toString(), date);
50
+ }
51
+ return [...unique.values()];
52
+ }
53
+
54
+ export {
55
+ isWeekendDay,
56
+ addWeekdays,
57
+ isoDate,
58
+ addBusinessDaysSkipping,
59
+ weekdayHolidays
60
+ };
61
+ //# sourceMappingURL=chunk-4YCEFGZA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/shared/businessDays.ts"],"sourcesContent":["import { Temporal, isPlainDate } from './temporal';\nimport { normalizeTemporalInput } from './normalizeTemporalInput';\n\n/**\n * @internal\n * Saturday (6) and Sunday (7) in Temporal's Monday-based dayOfWeek.\n */\nexport function isWeekendDay(dayOfWeek: number): boolean {\n return dayOfWeek >= 6;\n}\n\n/**\n * @internal\n * Adds days counting only Monday–Friday. The result keeps the input's type,\n * time of day, and timezone.\n */\nexport function addWeekdays<T extends { dayOfWeek: number; add(duration: { days: number }): T }>(\n start: T,\n days: number\n): T {\n if (!Number.isInteger(days)) {\n throw new RangeError('Business day counts must be integers');\n }\n const step = days < 0 ? -1 : 1;\n // Any 7 consecutive days hold exactly 5 weekdays, so jump whole weeks. Keep\n // at least one business day to walk so a weekend landing is never returned.\n const fullWeeks = Math.max(0, Math.trunc((Math.abs(days) - 1) / 5));\n let result = fullWeeks === 0 ? start : start.add({ days: step * fullWeeks * 7 });\n for (let remaining = Math.abs(days) - fullWeeks * 5; remaining > 0;) {\n result = result.add({ days: step });\n if (!isWeekendDay(result.dayOfWeek)) remaining--;\n }\n return result;\n}\n\n/**\n * @internal\n * The calendar date of a value as an ISO PlainDate from this library's\n * Temporal implementation. Instant uses UTC; ZonedDateTime uses its timezone.\n */\nexport function isoDate(\n input: Temporal.Instant | Temporal.ZonedDateTime | Temporal.PlainDate\n): Temporal.PlainDate {\n const date = isPlainDate(input) ? input : normalizeTemporalInput(input).toPlainDate();\n return Temporal.PlainDate.from(date.toString()).withCalendar('iso8601');\n}\n\n/**\n * @internal\n * Adds days counting only Monday–Friday that are not holidays. Holidays are\n * matched by ISO date; those on weekends are already skipped.\n */\nexport function addBusinessDaysSkipping<\n T extends (Temporal.ZonedDateTime | Temporal.PlainDate) & {\n add(duration: { days: number }): T;\n }\n>(start: T, days: number, holidays: readonly Temporal.PlainDate[]): T {\n let result = addWeekdays<T>(start, days);\n const dates = weekdayHolidays(holidays);\n if (dates.length === 0 || days === 0) return result;\n\n // Each holiday passed over pushes the result one more business day along.\n // Repeat until a stretch passes no holiday, which also leaves the result off one.\n const step = days < 0 ? -1 : 1;\n for (let from = isoDate(start); ;) {\n const to = isoDate(result);\n const skipped = dates.filter((date) =>\n step > 0\n ? Temporal.PlainDate.compare(date, from) > 0 && Temporal.PlainDate.compare(date, to) <= 0\n : Temporal.PlainDate.compare(date, from) < 0 && Temporal.PlainDate.compare(date, to) >= 0\n ).length;\n if (skipped === 0) return result;\n from = to;\n result = addWeekdays<T>(result, step * skipped);\n }\n}\n\n/**\n * @internal\n * Distinct holidays that fall Monday–Friday, as ISO PlainDates.\n */\nexport function weekdayHolidays(holidays: readonly Temporal.PlainDate[]): Temporal.PlainDate[] {\n const unique = new Map<string, Temporal.PlainDate>();\n for (const holiday of holidays) {\n const date = isoDate(holiday);\n if (!isWeekendDay(date.dayOfWeek)) unique.set(date.toString(), date);\n }\n return [...unique.values()];\n}\n"],"mappings":";;;;;;;;;AAOO,SAAS,aAAa,WAA4B;AACvD,SAAO,aAAa;AACtB;AAOO,SAAS,YACd,OACA,MACG;AACH,MAAI,CAAC,OAAO,UAAU,IAAI,GAAG;AAC3B,UAAM,IAAI,WAAW,sCAAsC;AAAA,EAC7D;AACA,QAAM,OAAO,OAAO,IAAI,KAAK;AAG7B,QAAM,YAAY,KAAK,IAAI,GAAG,KAAK,OAAO,KAAK,IAAI,IAAI,IAAI,KAAK,CAAC,CAAC;AAClE,MAAI,SAAS,cAAc,IAAI,QAAQ,MAAM,IAAI,EAAE,MAAM,OAAO,YAAY,EAAE,CAAC;AAC/E,WAAS,YAAY,KAAK,IAAI,IAAI,IAAI,YAAY,GAAG,YAAY,KAAI;AACnE,aAAS,OAAO,IAAI,EAAE,MAAM,KAAK,CAAC;AAClC,QAAI,CAAC,aAAa,OAAO,SAAS,EAAG;AAAA,EACvC;AACA,SAAO;AACT;AAOO,SAAS,QACd,OACoB;AACpB,QAAM,OAAO,YAAY,KAAK,IAAI,QAAQ,uBAAuB,KAAK,EAAE,YAAY;AACpF,SAAO,SAAS,UAAU,KAAK,KAAK,SAAS,CAAC,EAAE,aAAa,SAAS;AACxE;AAOO,SAAS,wBAId,OAAU,MAAc,UAA4C;AACpE,MAAI,SAAS,YAAe,OAAO,IAAI;AACvC,QAAM,QAAQ,gBAAgB,QAAQ;AACtC,MAAI,MAAM,WAAW,KAAK,SAAS,EAAG,QAAO;AAI7C,QAAM,OAAO,OAAO,IAAI,KAAK;AAC7B,WAAS,OAAO,QAAQ,KAAK,OAAM;AACjC,UAAM,KAAK,QAAQ,MAAM;AACzB,UAAM,UAAU,MAAM;AAAA,MAAO,CAAC,SAC5B,OAAO,IACH,SAAS,UAAU,QAAQ,MAAM,IAAI,IAAI,KAAK,SAAS,UAAU,QAAQ,MAAM,EAAE,KAAK,IACtF,SAAS,UAAU,QAAQ,MAAM,IAAI,IAAI,KAAK,SAAS,UAAU,QAAQ,MAAM,EAAE,KAAK;AAAA,IAC5F,EAAE;AACF,QAAI,YAAY,EAAG,QAAO;AAC1B,WAAO;AACP,aAAS,YAAe,QAAQ,OAAO,OAAO;AAAA,EAChD;AACF;AAMO,SAAS,gBAAgB,UAA+D;AAC7F,QAAM,SAAS,oBAAI,IAAgC;AACnD,aAAW,WAAW,UAAU;AAC9B,UAAM,OAAO,QAAQ,OAAO;AAC5B,QAAI,CAAC,aAAa,KAAK,SAAS,EAAG,QAAO,IAAI,KAAK,SAAS,GAAG,IAAI;AAAA,EACrE;AACA,SAAO,CAAC,GAAG,OAAO,OAAO,CAAC;AAC5B;","names":[]}
@@ -0,0 +1,20 @@
1
+ import {
2
+ daysIntoWeek
3
+ } from "./chunk-M2XB72L5.js";
4
+ import {
5
+ normalizeTemporalInput
6
+ } from "./chunk-Q6QLOUXJ.js";
7
+
8
+ // src/isSameWeek.ts
9
+ function isSameWeek(date1, date2, options) {
10
+ const zoned1 = normalizeTemporalInput(date1);
11
+ const zoned2 = normalizeTemporalInput(date2);
12
+ const start1 = zoned1.toPlainDate().subtract({ days: daysIntoWeek(zoned1.dayOfWeek, options) });
13
+ const start2 = zoned2.toPlainDate().subtract({ days: daysIntoWeek(zoned2.dayOfWeek, options) });
14
+ return start1.toString() === start2.withCalendar(start1.calendarId).toString();
15
+ }
16
+
17
+ export {
18
+ isSameWeek
19
+ };
20
+ //# sourceMappingURL=chunk-6UBFKQIJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/isSameWeek.ts"],"sourcesContent":["import type { Temporal } from './shared/temporal';\nimport { normalizeTemporalInput } from './shared/normalizeTemporalInput';\nimport { daysIntoWeek, type WeekOptions } from './shared/week';\n\n/**\n * Returns true if both datetimes fall in the same week.\n * Weeks start on Monday (ISO 8601) unless `weekStartsOn` says otherwise.\n *\n * Instant inputs are converted to UTC. For ZonedDateTime inputs, their\n * timezone is preserved. Convert to a common timezone before calling if\n * you need to compare from a specific perspective.\n *\n * @param date1 - First datetime (Instant or ZonedDateTime)\n * @param date2 - Second datetime (Instant or ZonedDateTime)\n * @param options - `weekStartsOn`: 1 = Monday (default) … 7 = Sunday\n * @returns true if both dates are in the same week, false otherwise\n *\n * @example\n * ```ts\n * // Same timezone, same week (both in week 4 of 2025)\n * const monday = Temporal.ZonedDateTime.from('2025-01-20T08:00:00+00:00[UTC]'); // Monday, Week 4\n * const sunday = Temporal.ZonedDateTime.from('2025-01-26T23:59:59+00:00[UTC]'); // Sunday, Week 4\n *\n * isSameWeek(monday, sunday); // true\n * ```\n *\n * @example\n * ```ts\n * // Same timezone, different weeks\n * const week3 = Temporal.ZonedDateTime.from('2025-01-19T23:59:59+00:00[UTC]'); // Sunday, Week 3\n * const week4 = Temporal.ZonedDateTime.from('2025-01-20T00:00:00+00:00[UTC]'); // Monday, Week 4\n *\n * isSameWeek(week3, week4); // false\n * ```\n *\n * @example\n * ```ts\n * // Different timezones - compares their local calendar weeks\n * const ny = Temporal.ZonedDateTime.from('2025-01-26T23:00:00-05:00[America/New_York]');\n * const tokyo = Temporal.ZonedDateTime.from('2025-01-27T13:00:00+09:00[Asia/Tokyo]');\n *\n * // Same instant, different local weeks from each person's perspective\n * isSameWeek(ny, tokyo); // false (Week 4 Sun in NY, Week 5 Mon in Tokyo)\n *\n * // Convert to UTC to compare in UTC timezone\n * isSameWeek(ny.withTimeZone('UTC'), tokyo.withTimeZone('UTC')); // true (both Week 5 in UTC)\n *\n * // Convert to NY timezone to compare from NY perspective\n * isSameWeek(ny, tokyo.withTimeZone('America/New_York')); // true (both Week 4 in NY)\n * ```\n *\n * @example\n * ```ts\n * // Instant inputs are converted to UTC\n * const instant1 = Temporal.Instant.from('2025-01-20T00:00:00Z'); // Monday, Week 4\n * const instant2 = Temporal.Instant.from('2025-01-26T23:59:59Z'); // Sunday, Week 4\n *\n * isSameWeek(instant1, instant2); // true (both Week 4 2025 in UTC)\n * ```\n *\n * @example\n * ```ts\n * // ISO week years can differ from calendar years\n * // December 29, 2024 is in Week 52 of 2024\n * const dec29 = Temporal.ZonedDateTime.from('2024-12-29T12:00:00+00:00[UTC]');\n * // January 5, 2025 is in Week 1 of 2025\n * const jan5 = Temporal.ZonedDateTime.from('2025-01-05T12:00:00+00:00[UTC]');\n *\n * isSameWeek(dec29, jan5); // false (different ISO weeks)\n * ```\n *\n * @example\n * ```ts\n * // Weeks that start on Sunday\n * const saturday = Temporal.ZonedDateTime.from('2025-01-25T12:00:00+00:00[UTC]');\n * const sunday = Temporal.ZonedDateTime.from('2025-01-26T12:00:00+00:00[UTC]');\n *\n * isSameWeek(saturday, sunday); // true\n * isSameWeek(saturday, sunday, { weekStartsOn: 7 }); // false\n * ```\n */\nexport function isSameWeek(\n date1: Temporal.Instant | Temporal.ZonedDateTime,\n date2: Temporal.Instant | Temporal.ZonedDateTime,\n options?: WeekOptions\n): boolean {\n const zoned1 = normalizeTemporalInput(date1);\n const zoned2 = normalizeTemporalInput(date2);\n const start1 = zoned1.toPlainDate().subtract({ days: daysIntoWeek(zoned1.dayOfWeek, options) });\n const start2 = zoned2.toPlainDate().subtract({ days: daysIntoWeek(zoned2.dayOfWeek, options) });\n\n return start1.toString() === start2.withCalendar(start1.calendarId).toString();\n}\n"],"mappings":";;;;;;;;AAiFO,SAAS,WACd,OACA,OACA,SACS;AACT,QAAM,SAAS,uBAAuB,KAAK;AAC3C,QAAM,SAAS,uBAAuB,KAAK;AAC3C,QAAM,SAAS,OAAO,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,OAAO,WAAW,OAAO,EAAE,CAAC;AAC9F,QAAM,SAAS,OAAO,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,OAAO,WAAW,OAAO,EAAE,CAAC;AAE9F,SAAO,OAAO,SAAS,MAAM,OAAO,aAAa,OAAO,UAAU,EAAE,SAAS;AAC/E;","names":[]}
@@ -0,0 +1,14 @@
1
+ import {
2
+ calendarDates
3
+ } from "./chunk-H43LMOCK.js";
4
+
5
+ // src/differenceInCalendarDays.ts
6
+ function differenceInCalendarDays(laterDate, earlierDate) {
7
+ const [later, earlier] = calendarDates(laterDate, earlierDate);
8
+ return earlier.until(later, { largestUnit: "days" }).days;
9
+ }
10
+
11
+ export {
12
+ differenceInCalendarDays
13
+ };
14
+ //# sourceMappingURL=chunk-7PH5BPMS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/differenceInCalendarDays.ts"],"sourcesContent":["import type { Temporal } from './shared/temporal';\nimport { calendarDates } from './shared/calendarDates';\n\n/**\n * Returns the number of calendar days between two dates, ignoring the time of day.\n * Unlike differenceInDays, which counts complete 24-hour days, 23:00 to 01:00\n * the next morning is one calendar day.\n *\n * PlainDate inputs are compared as given. Instant inputs use their UTC date and\n * ZonedDateTime inputs use the date in their own timezone; convert both to one\n * timezone first to count from a single point of view. Mixing a PlainDate with\n * an Instant or ZonedDateTime throws a TypeError.\n *\n * @param laterDate - The later date\n * @param earlierDate - The earlier date\n * @returns Calendar days from earlierDate to laterDate; negative if laterDate is earlier\n *\n * @example\n * ```ts\n * const lateTonight = Temporal.ZonedDateTime.from('2025-01-20T23:00:00+01:00[Europe/Madrid]');\n * const earlyTomorrow = Temporal.ZonedDateTime.from('2025-01-21T01:00:00+01:00[Europe/Madrid]');\n *\n * differenceInCalendarDays(earlyTomorrow, lateTonight); // 1\n * differenceInDays(earlyTomorrow, lateTonight); // 0\n * ```\n *\n * @example\n * ```ts\n * const due = Temporal.PlainDate.from('2025-03-01');\n * const today = Temporal.PlainDate.from('2025-02-26');\n *\n * differenceInCalendarDays(due, today); // 3\n * ```\n */\nexport function differenceInCalendarDays(\n laterDate: Temporal.PlainDate,\n earlierDate: Temporal.PlainDate\n): number;\nexport function differenceInCalendarDays(\n laterDate: Temporal.Instant | Temporal.ZonedDateTime,\n earlierDate: Temporal.Instant | Temporal.ZonedDateTime\n): number;\nexport function differenceInCalendarDays(\n laterDate: Temporal.Instant | Temporal.ZonedDateTime | Temporal.PlainDate,\n earlierDate: Temporal.Instant | Temporal.ZonedDateTime | Temporal.PlainDate\n): number {\n const [later, earlier] = calendarDates(laterDate, earlierDate);\n return earlier.until(later, { largestUnit: 'days' }).days;\n}\n"],"mappings":";;;;;AA0CO,SAAS,yBACd,WACA,aACQ;AACR,QAAM,CAAC,OAAO,OAAO,IAAI,cAAc,WAAW,WAAW;AAC7D,SAAO,QAAQ,MAAM,OAAO,EAAE,aAAa,OAAO,CAAC,EAAE;AACvD;","names":[]}
@@ -0,0 +1,14 @@
1
+ import {
2
+ calendarDates
3
+ } from "./chunk-H43LMOCK.js";
4
+
5
+ // src/differenceInCalendarYears.ts
6
+ function differenceInCalendarYears(laterDate, earlierDate) {
7
+ const [later, earlier] = calendarDates(laterDate, earlierDate);
8
+ return later.year - earlier.year;
9
+ }
10
+
11
+ export {
12
+ differenceInCalendarYears
13
+ };
14
+ //# sourceMappingURL=chunk-C7QA4J6V.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/differenceInCalendarYears.ts"],"sourcesContent":["import type { Temporal } from './shared/temporal';\nimport { calendarDates } from './shared/calendarDates';\n\n/**\n * Returns the number of calendar years between two dates, ignoring the month and\n * day. Unlike differenceInYears, which counts complete years, December 31 to\n * January 1 is one calendar year.\n *\n * PlainDate inputs are compared as given. Instant inputs use their UTC date and\n * ZonedDateTime inputs use the date in their own timezone; convert both to one\n * timezone first to count from a single point of view. Mixing a PlainDate with\n * an Instant or ZonedDateTime throws a TypeError.\n *\n * @param laterDate - The later date\n * @param earlierDate - The earlier date\n * @returns Calendar years from earlierDate to laterDate; negative if laterDate is earlier\n *\n * @example\n * ```ts\n * const newYearsEve = Temporal.PlainDate.from('2024-12-31');\n * const newYearsDay = Temporal.PlainDate.from('2025-01-01');\n *\n * differenceInCalendarYears(newYearsDay, newYearsEve); // 1\n * differenceInYears(newYearsDay, newYearsEve); // 0\n * ```\n */\nexport function differenceInCalendarYears(\n laterDate: Temporal.PlainDate,\n earlierDate: Temporal.PlainDate\n): number;\nexport function differenceInCalendarYears(\n laterDate: Temporal.Instant | Temporal.ZonedDateTime,\n earlierDate: Temporal.Instant | Temporal.ZonedDateTime\n): number;\nexport function differenceInCalendarYears(\n laterDate: Temporal.Instant | Temporal.ZonedDateTime | Temporal.PlainDate,\n earlierDate: Temporal.Instant | Temporal.ZonedDateTime | Temporal.PlainDate\n): number {\n const [later, earlier] = calendarDates(laterDate, earlierDate);\n return later.year - earlier.year;\n}\n"],"mappings":";;;;;AAkCO,SAAS,0BACd,WACA,aACQ;AACR,QAAM,CAAC,OAAO,OAAO,IAAI,cAAc,WAAW,WAAW;AAC7D,SAAO,MAAM,OAAO,QAAQ;AAC9B;","names":[]}
@@ -0,0 +1,33 @@
1
+ import {
2
+ getEndOfDay
3
+ } from "./chunk-NMMMAMKP.js";
4
+ import {
5
+ plainDateToZonedDateTime
6
+ } from "./chunk-2AID4P2C.js";
7
+ import {
8
+ daysIntoWeek
9
+ } from "./chunk-M2XB72L5.js";
10
+ import {
11
+ normalizeTemporalInput
12
+ } from "./chunk-Q6QLOUXJ.js";
13
+ import {
14
+ isPlainDate
15
+ } from "./chunk-BSVOJYJ7.js";
16
+
17
+ // src/endOfWeek.ts
18
+ function endOfWeek(input, timezoneOrOptions, options) {
19
+ const timezone = typeof timezoneOrOptions === "string" ? timezoneOrOptions : void 0;
20
+ const weekOptions = typeof timezoneOrOptions === "string" ? options : timezoneOrOptions;
21
+ if (isPlainDate(input) && timezone === void 0) {
22
+ return input.add({ days: 6 - daysIntoWeek(input.dayOfWeek, weekOptions) });
23
+ }
24
+ const zonedDateTime = isPlainDate(input) ? plainDateToZonedDateTime(input, timezone) : normalizeTemporalInput(input);
25
+ return getEndOfDay(
26
+ zonedDateTime.add({ days: 6 - daysIntoWeek(zonedDateTime.dayOfWeek, weekOptions) })
27
+ );
28
+ }
29
+
30
+ export {
31
+ endOfWeek
32
+ };
33
+ //# sourceMappingURL=chunk-DVZDJ5LM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/endOfWeek.ts"],"sourcesContent":["import { type Temporal, isPlainDate } from './shared/temporal';\nimport type { Timezone } from './types';\nimport { getEndOfDay } from './shared/endOfDay';\nimport { normalizeTemporalInput } from './shared/normalizeTemporalInput';\nimport { plainDateToZonedDateTime } from './shared/plainDateToZonedDateTime';\nimport { daysIntoWeek, type WeekOptions } from './shared/week';\n\n/**\n * Returns the last boundary of the week.\n * Weeks start on Monday and end on Sunday (ISO 8601) unless `weekStartsOn` says otherwise.\n * PlainDate inputs stay in calendar space unless a timezone is provided.\n *\n * @param input - A Temporal.Instant (UTC), Temporal.ZonedDateTime, or Temporal.PlainDate\n * @param options - `weekStartsOn`: 1 = Monday (default) … 7 = Sunday\n * @returns The last day of the week at 23:59:59.999999999, or that date for PlainDate input\n *\n * @example\n * ```ts\n * // From Instant (always UTC)\n * const instant = Temporal.Instant.from('2025-01-20T12:00:00Z'); // Monday\n * const end = endOfWeek(instant);\n * // 2025-01-26T23:59:59.999999999+00:00[UTC] (next Sunday)\n * ```\n *\n * @example\n * ```ts\n * // From ZonedDateTime (uses its timezone)\n * const zoned = Temporal.ZonedDateTime.from('2025-01-22T15:30:00-05:00[America/New_York]'); // Wednesday\n * const end = endOfWeek(zoned);\n * // 2025-01-26T23:59:59.999999999-05:00[America/New_York] (next Sunday)\n * ```\n *\n * @example\n * ```ts\n * // From PlainDate (stays a date)\n * const date = Temporal.PlainDate.from('2025-01-22'); // Wednesday\n * const end = endOfWeek(date);\n * // 2025-01-26 (next Sunday)\n * ```\n *\n * @example\n * ```ts\n * // From PlainDate with a timezone (returns a ZonedDateTime)\n * const date = Temporal.PlainDate.from('2025-01-22'); // Wednesday\n * const end = endOfWeek(date, 'America/New_York');\n * // 2025-01-26T23:59:59.999999999-05:00[America/New_York] (next Sunday)\n * ```\n *\n * @example\n * ```ts\n * // Weeks that start on Sunday end on Saturday\n * const date = Temporal.PlainDate.from('2025-01-22'); // Wednesday\n * const end = endOfWeek(date, { weekStartsOn: 7 });\n * // 2025-01-25 (next Saturday)\n * ```\n */\nexport function endOfWeek(\n input: Temporal.Instant | Temporal.ZonedDateTime,\n options?: WeekOptions\n): Temporal.ZonedDateTime;\nexport function endOfWeek(input: Temporal.PlainDate, options?: WeekOptions): Temporal.PlainDate;\nexport function endOfWeek(\n input: Temporal.PlainDate,\n timezone: Timezone,\n options?: WeekOptions\n): Temporal.ZonedDateTime;\nexport function endOfWeek(\n input: Temporal.Instant | Temporal.ZonedDateTime | Temporal.PlainDate,\n timezoneOrOptions?: Timezone | WeekOptions,\n options?: WeekOptions\n): Temporal.ZonedDateTime | Temporal.PlainDate {\n const timezone = typeof timezoneOrOptions === 'string' ? timezoneOrOptions : undefined;\n const weekOptions = typeof timezoneOrOptions === 'string' ? options : timezoneOrOptions;\n\n if (isPlainDate(input) && timezone === undefined) {\n return input.add({ days: 6 - daysIntoWeek(input.dayOfWeek, weekOptions) });\n }\n\n const zonedDateTime = isPlainDate(input)\n ? plainDateToZonedDateTime(input, timezone!)\n : normalizeTemporalInput(input);\n\n return getEndOfDay(\n zonedDateTime.add({ days: 6 - daysIntoWeek(zonedDateTime.dayOfWeek, weekOptions) })\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAkEO,SAAS,UACd,OACA,mBACA,SAC6C;AAC7C,QAAM,WAAW,OAAO,sBAAsB,WAAW,oBAAoB;AAC7E,QAAM,cAAc,OAAO,sBAAsB,WAAW,UAAU;AAEtE,MAAI,YAAY,KAAK,KAAK,aAAa,QAAW;AAChD,WAAO,MAAM,IAAI,EAAE,MAAM,IAAI,aAAa,MAAM,WAAW,WAAW,EAAE,CAAC;AAAA,EAC3E;AAEA,QAAM,gBAAgB,YAAY,KAAK,IACnC,yBAAyB,OAAO,QAAS,IACzC,uBAAuB,KAAK;AAEhC,SAAO;AAAA,IACL,cAAc,IAAI,EAAE,MAAM,IAAI,aAAa,cAAc,WAAW,WAAW,EAAE,CAAC;AAAA,EACpF;AACF;","names":[]}
@@ -4,6 +4,9 @@ import {
4
4
  import {
5
5
  isPlainDateAfter
6
6
  } from "./chunk-ADPVFELS.js";
7
+ import {
8
+ daysIntoWeek
9
+ } from "./chunk-M2XB72L5.js";
7
10
  import {
8
11
  normalizeTemporalInput
9
12
  } from "./chunk-Q6QLOUXJ.js";
@@ -12,15 +15,17 @@ import {
12
15
  } from "./chunk-BSVOJYJ7.js";
13
16
 
14
17
  // src/eachWeekOfInterval.ts
15
- function eachWeekOfInterval(interval) {
18
+ function eachWeekOfInterval(interval, options) {
16
19
  if (isPlainDate(interval.start) || isPlainDate(interval.end)) {
17
20
  if (!isPlainDate(interval.start) || !isPlainDate(interval.end)) {
18
21
  throw new TypeError("PlainDate intervals require two PlainDate endpoints");
19
22
  }
20
23
  if (isPlainDateAfter(interval.start, interval.end)) return [];
21
24
  const end = interval.end.withCalendar(interval.start.calendarId);
22
- const last = end.subtract({ days: end.dayOfWeek - 1 });
23
- let current2 = interval.start.subtract({ days: interval.start.dayOfWeek - 1 });
25
+ const last = end.subtract({ days: daysIntoWeek(end.dayOfWeek, options) });
26
+ let current2 = interval.start.subtract({
27
+ days: daysIntoWeek(interval.start.dayOfWeek, options)
28
+ });
24
29
  const dates = [];
25
30
  while (isPlainDateBefore(current2, last)) {
26
31
  dates.push(current2);
@@ -32,15 +37,12 @@ function eachWeekOfInterval(interval) {
32
37
  const startZoned = normalizeTemporalInput(interval.start);
33
38
  const endZoned = normalizeTemporalInput(interval.end);
34
39
  if (startZoned.epochNanoseconds > endZoned.epochNanoseconds) return [];
35
- const timezone = startZoned.timeZoneId;
36
- const daysToSubtractStart = startZoned.dayOfWeek - 1;
37
- const startMonday = startZoned.subtract({ days: daysToSubtractStart }).startOfDay();
38
- const endInTimezone = endZoned.withTimeZone(timezone);
39
- const daysToSubtractEnd = endInTimezone.dayOfWeek - 1;
40
- const endMonday = endInTimezone.subtract({ days: daysToSubtractEnd }).startOfDay();
40
+ const startOfFirstWeek = startZoned.subtract({ days: daysIntoWeek(startZoned.dayOfWeek, options) }).startOfDay();
41
+ const endInTimezone = endZoned.withTimeZone(startZoned.timeZoneId);
42
+ const startOfLastWeek = endInTimezone.subtract({ days: daysIntoWeek(endInTimezone.dayOfWeek, options) }).startOfDay();
41
43
  const weeks = [];
42
- let current = startMonday;
43
- while (current.epochNanoseconds <= endMonday.epochNanoseconds) {
44
+ let current = startOfFirstWeek;
45
+ while (current.epochNanoseconds <= startOfLastWeek.epochNanoseconds) {
44
46
  weeks.push(current);
45
47
  current = current.add({ weeks: 1 });
46
48
  }
@@ -50,4 +52,4 @@ function eachWeekOfInterval(interval) {
50
52
  export {
51
53
  eachWeekOfInterval
52
54
  };
53
- //# sourceMappingURL=chunk-AOODDNHA.js.map
55
+ //# sourceMappingURL=chunk-DYIISNVW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/eachWeekOfInterval.ts"],"sourcesContent":["import { Temporal, isPlainDate } from './shared/temporal';\nimport { isPlainDateAfter } from './isPlainDateAfter';\nimport { isPlainDateBefore } from './isPlainDateBefore';\nimport { normalizeTemporalInput } from './shared/normalizeTemporalInput';\nimport { daysIntoWeek, type WeekOptions } from './shared/week';\n\n/**\n * PlainDate endpoints return date-only period starts in the start calendar.\n * Mixed date-only/timeline endpoints are rejected. Reversed endpoints return [].\n *\n * Returns an array of ZonedDateTime objects for each week within the interval.\n * Each element represents the first moment of the week (midnight on its first day).\n * Weeks start on Monday (ISO 8601) unless `weekStartsOn` says otherwise.\n * The interval is inclusive of both start and end weeks.\n *\n * For Instant inputs, UTC is used as the timezone.\n * For ZonedDateTime inputs, the timezone of the start date is preserved.\n *\n * @param interval - The interval with start and end datetimes\n * @param options - `weekStartsOn`: 1 = Monday (default) … 7 = Sunday\n * @returns Array of ZonedDateTime at the start of each week in the interval\n *\n * @example\n * ```ts\n * const start = Temporal.ZonedDateTime.from('2025-01-06T10:00:00+00:00[UTC]'); // Monday\n * const end = Temporal.ZonedDateTime.from('2025-01-22T14:00:00+00:00[UTC]'); // Wednesday\n *\n * const weeks = eachWeekOfInterval({ start, end });\n * // [\n * // 2025-01-06T00:00:00+00:00[UTC], // Week 2\n * // 2025-01-13T00:00:00+00:00[UTC], // Week 3\n * // 2025-01-20T00:00:00+00:00[UTC] // Week 4\n * // ]\n * ```\n *\n * @example\n * ```ts\n * // Mid-week start\n * const start = Temporal.ZonedDateTime.from('2025-01-08T10:00:00+00:00[UTC]'); // Wednesday\n * const end = Temporal.ZonedDateTime.from('2025-01-15T14:00:00+00:00[UTC]'); // Wednesday\n *\n * const weeks = eachWeekOfInterval({ start, end });\n * // [\n * // 2025-01-06T00:00:00+00:00[UTC], // Monday of week containing Jan 8\n * // 2025-01-13T00:00:00+00:00[UTC] // Monday of week containing Jan 15\n * // ]\n * ```\n *\n * @example\n * ```ts\n * // Cross-year boundary\n * const start = Temporal.ZonedDateTime.from('2024-12-25T00:00:00+00:00[UTC]');\n * const end = Temporal.ZonedDateTime.from('2025-01-08T00:00:00+00:00[UTC]');\n *\n * const weeks = eachWeekOfInterval({ start, end });\n * // [\n * // 2024-12-23T00:00:00+00:00[UTC], // Monday of week containing Dec 25\n * // 2024-12-30T00:00:00+00:00[UTC], // Monday of week containing Dec 30\n * // 2025-01-06T00:00:00+00:00[UTC] // Monday of week containing Jan 8\n * // ]\n * ```\n */\nexport function eachWeekOfInterval(\n interval: { start: Temporal.PlainDate; end: Temporal.PlainDate },\n options?: WeekOptions\n): Temporal.PlainDate[];\nexport function eachWeekOfInterval(\n interval: {\n start: Temporal.Instant | Temporal.ZonedDateTime;\n end: Temporal.Instant | Temporal.ZonedDateTime;\n },\n options?: WeekOptions\n): Temporal.ZonedDateTime[];\nexport function eachWeekOfInterval(\n interval: {\n start: Temporal.Instant | Temporal.ZonedDateTime | Temporal.PlainDate;\n end: Temporal.Instant | Temporal.ZonedDateTime | Temporal.PlainDate;\n },\n options?: WeekOptions\n): Temporal.ZonedDateTime[] | Temporal.PlainDate[] {\n if (isPlainDate(interval.start) || isPlainDate(interval.end)) {\n if (!isPlainDate(interval.start) || !isPlainDate(interval.end)) {\n throw new TypeError('PlainDate intervals require two PlainDate endpoints');\n }\n if (isPlainDateAfter(interval.start, interval.end)) return [];\n const end = interval.end.withCalendar(interval.start.calendarId);\n const last = end.subtract({ days: daysIntoWeek(end.dayOfWeek, options) });\n let current = interval.start.subtract({\n days: daysIntoWeek(interval.start.dayOfWeek, options)\n });\n const dates: Temporal.PlainDate[] = [];\n while (isPlainDateBefore(current, last)) {\n dates.push(current);\n current = current.add({ weeks: 1 });\n }\n dates.push(current);\n return dates;\n }\n const startZoned = normalizeTemporalInput(interval.start);\n const endZoned = normalizeTemporalInput(interval.end);\n if (startZoned.epochNanoseconds > endZoned.epochNanoseconds) return [];\n\n const startOfFirstWeek = startZoned\n .subtract({ days: daysIntoWeek(startZoned.dayOfWeek, options) })\n .startOfDay();\n const endInTimezone = endZoned.withTimeZone(startZoned.timeZoneId);\n const startOfLastWeek = endInTimezone\n .subtract({ days: daysIntoWeek(endInTimezone.dayOfWeek, options) })\n .startOfDay();\n\n const weeks: Temporal.ZonedDateTime[] = [];\n let current = startOfFirstWeek;\n\n while (current.epochNanoseconds <= startOfLastWeek.epochNanoseconds) {\n weeks.push(current);\n current = current.add({ weeks: 1 });\n }\n\n return weeks;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAyEO,SAAS,mBACd,UAIA,SACiD;AACjD,MAAI,YAAY,SAAS,KAAK,KAAK,YAAY,SAAS,GAAG,GAAG;AAC5D,QAAI,CAAC,YAAY,SAAS,KAAK,KAAK,CAAC,YAAY,SAAS,GAAG,GAAG;AAC9D,YAAM,IAAI,UAAU,qDAAqD;AAAA,IAC3E;AACA,QAAI,iBAAiB,SAAS,OAAO,SAAS,GAAG,EAAG,QAAO,CAAC;AAC5D,UAAM,MAAM,SAAS,IAAI,aAAa,SAAS,MAAM,UAAU;AAC/D,UAAM,OAAO,IAAI,SAAS,EAAE,MAAM,aAAa,IAAI,WAAW,OAAO,EAAE,CAAC;AACxE,QAAIA,WAAU,SAAS,MAAM,SAAS;AAAA,MACpC,MAAM,aAAa,SAAS,MAAM,WAAW,OAAO;AAAA,IACtD,CAAC;AACD,UAAM,QAA8B,CAAC;AACrC,WAAO,kBAAkBA,UAAS,IAAI,GAAG;AACvC,YAAM,KAAKA,QAAO;AAClB,MAAAA,WAAUA,SAAQ,IAAI,EAAE,OAAO,EAAE,CAAC;AAAA,IACpC;AACA,UAAM,KAAKA,QAAO;AAClB,WAAO;AAAA,EACT;AACA,QAAM,aAAa,uBAAuB,SAAS,KAAK;AACxD,QAAM,WAAW,uBAAuB,SAAS,GAAG;AACpD,MAAI,WAAW,mBAAmB,SAAS,iBAAkB,QAAO,CAAC;AAErE,QAAM,mBAAmB,WACtB,SAAS,EAAE,MAAM,aAAa,WAAW,WAAW,OAAO,EAAE,CAAC,EAC9D,WAAW;AACd,QAAM,gBAAgB,SAAS,aAAa,WAAW,UAAU;AACjE,QAAM,kBAAkB,cACrB,SAAS,EAAE,MAAM,aAAa,cAAc,WAAW,OAAO,EAAE,CAAC,EACjE,WAAW;AAEd,QAAM,QAAkC,CAAC;AACzC,MAAI,UAAU;AAEd,SAAO,QAAQ,oBAAoB,gBAAgB,kBAAkB;AACnE,UAAM,KAAK,OAAO;AAClB,cAAU,QAAQ,IAAI,EAAE,OAAO,EAAE,CAAC;AAAA,EACpC;AAEA,SAAO;AACT;","names":["current"]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  isWeekendDay
3
- } from "./chunk-K7CLBBBM.js";
3
+ } from "./chunk-4YCEFGZA.js";
4
4
  import {
5
5
  normalizeTemporalInput
6
6
  } from "./chunk-Q6QLOUXJ.js";
@@ -17,4 +17,4 @@ function isWeekend(input) {
17
17
  export {
18
18
  isWeekend
19
19
  };
20
- //# sourceMappingURL=chunk-6QZUAJVF.js.map
20
+ //# sourceMappingURL=chunk-GOJ45AG7.js.map
@@ -0,0 +1,26 @@
1
+ import {
2
+ normalizeTemporalInput
3
+ } from "./chunk-Q6QLOUXJ.js";
4
+ import {
5
+ Temporal,
6
+ isPlainDate
7
+ } from "./chunk-BSVOJYJ7.js";
8
+
9
+ // src/shared/calendarDates.ts
10
+ function calendarDates(laterDate, earlierDate) {
11
+ if (isPlainDate(laterDate) !== isPlainDate(earlierDate)) {
12
+ throw new TypeError("PlainDate differences require two PlainDate values");
13
+ }
14
+ const later = dateOf(laterDate);
15
+ const earlier = dateOf(earlierDate);
16
+ return [later.withCalendar(earlier.calendarId), earlier];
17
+ }
18
+ function dateOf(input) {
19
+ const date = isPlainDate(input) ? input : normalizeTemporalInput(input).toPlainDate();
20
+ return Temporal.PlainDate.from(date.toString());
21
+ }
22
+
23
+ export {
24
+ calendarDates
25
+ };
26
+ //# sourceMappingURL=chunk-H43LMOCK.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/shared/calendarDates.ts"],"sourcesContent":["import { Temporal, isPlainDate } from './temporal';\nimport { normalizeTemporalInput } from './normalizeTemporalInput';\n\n/**\n * @internal\n * The calendar dates behind a differenceInCalendar* pair: PlainDates as given,\n * Instants by their UTC date, ZonedDateTimes by the date in their own timezone.\n * Both come back in this implementation and in the earlier date's calendar.\n */\nexport function calendarDates(\n laterDate: Temporal.Instant | Temporal.ZonedDateTime | Temporal.PlainDate,\n earlierDate: Temporal.Instant | Temporal.ZonedDateTime | Temporal.PlainDate\n): [later: Temporal.PlainDate, earlier: Temporal.PlainDate] {\n if (isPlainDate(laterDate) !== isPlainDate(earlierDate)) {\n throw new TypeError('PlainDate differences require two PlainDate values');\n }\n const later = dateOf(laterDate);\n const earlier = dateOf(earlierDate);\n return [later.withCalendar(earlier.calendarId), earlier];\n}\n\nfunction dateOf(\n input: Temporal.Instant | Temporal.ZonedDateTime | Temporal.PlainDate\n): Temporal.PlainDate {\n const date = isPlainDate(input) ? input : normalizeTemporalInput(input).toPlainDate();\n // A canonical string brings dates from another Temporal implementation across.\n return Temporal.PlainDate.from(date.toString());\n}\n"],"mappings":";;;;;;;;;AASO,SAAS,cACd,WACA,aAC0D;AAC1D,MAAI,YAAY,SAAS,MAAM,YAAY,WAAW,GAAG;AACvD,UAAM,IAAI,UAAU,oDAAoD;AAAA,EAC1E;AACA,QAAM,QAAQ,OAAO,SAAS;AAC9B,QAAM,UAAU,OAAO,WAAW;AAClC,SAAO,CAAC,MAAM,aAAa,QAAQ,UAAU,GAAG,OAAO;AACzD;AAEA,SAAS,OACP,OACoB;AACpB,QAAM,OAAO,YAAY,KAAK,IAAI,QAAQ,uBAAuB,KAAK,EAAE,YAAY;AAEpF,SAAO,SAAS,UAAU,KAAK,KAAK,SAAS,CAAC;AAChD;","names":[]}
@@ -0,0 +1,87 @@
1
+ // src/shared/formatTokens.ts
2
+ function consumeToken(formatStr, start, char) {
3
+ if (char === "M" && start + 1 < formatStr.length && formatStr[start + 1] === "o") {
4
+ return "Mo";
5
+ }
6
+ if (char === "d" && start + 1 < formatStr.length && formatStr[start + 1] === "o") {
7
+ return "do";
8
+ }
9
+ let end = start;
10
+ while (end < formatStr.length && formatStr[end] === char) {
11
+ end++;
12
+ }
13
+ const count = end - start;
14
+ const validTokens = [
15
+ "GGGGG",
16
+ "GGGG",
17
+ "GGG",
18
+ "GG",
19
+ "G",
20
+ "yyyy",
21
+ "yyy",
22
+ "yy",
23
+ "y",
24
+ "QQQQQ",
25
+ "QQQQ",
26
+ "QQQ",
27
+ "QQ",
28
+ "Q",
29
+ "MMMMM",
30
+ "MMMM",
31
+ "MMM",
32
+ "MM",
33
+ "M",
34
+ "dd",
35
+ "d",
36
+ "EEEEEE",
37
+ "EEEEE",
38
+ "EEEE",
39
+ "EEE",
40
+ "EE",
41
+ "E",
42
+ "aaaaa",
43
+ "aaaa",
44
+ "aaa",
45
+ "aa",
46
+ "a",
47
+ "HH",
48
+ "H",
49
+ "hh",
50
+ "h",
51
+ "mm",
52
+ "m",
53
+ "ss",
54
+ "s",
55
+ "SSS",
56
+ "SS",
57
+ "S",
58
+ "XXXXX",
59
+ "XXXX",
60
+ "XXX",
61
+ "XX",
62
+ "X",
63
+ "xxxxx",
64
+ "xxxx",
65
+ "xxx",
66
+ "xx",
67
+ "x",
68
+ "zzzz",
69
+ "zzz",
70
+ "zz",
71
+ "z",
72
+ "T",
73
+ "t"
74
+ ];
75
+ for (let len = Math.min(count, 6); len > 0; len--) {
76
+ const candidate = char.repeat(len);
77
+ if (validTokens.includes(candidate)) {
78
+ return candidate;
79
+ }
80
+ }
81
+ return null;
82
+ }
83
+
84
+ export {
85
+ consumeToken
86
+ };
87
+ //# sourceMappingURL=chunk-HH2HTC44.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/shared/formatTokens.ts"],"sourcesContent":["/**\n * @internal\n * Reads the format token that starts at `start`, or null if `char` does not\n * start one. A run of one letter longer than any token splits into several,\n * longest first. Shared by format and parse so both read a pattern the same way.\n */\nexport function consumeToken(formatStr: string, start: number, char: string): string | null {\n // Special case for 'Mo' and 'do' - these end with 'o'\n if (char === 'M' && start + 1 < formatStr.length && formatStr[start + 1] === 'o') {\n return 'Mo';\n }\n if (char === 'd' && start + 1 < formatStr.length && formatStr[start + 1] === 'o') {\n return 'do';\n }\n\n // Count how many consecutive identical characters\n let end = start;\n while (end < formatStr.length && formatStr[end] === char) {\n end++;\n }\n const count = end - start;\n\n // Check if this is a valid token pattern\n const validTokens = [\n 'GGGGG',\n 'GGGG',\n 'GGG',\n 'GG',\n 'G',\n 'yyyy',\n 'yyy',\n 'yy',\n 'y',\n 'QQQQQ',\n 'QQQQ',\n 'QQQ',\n 'QQ',\n 'Q',\n 'MMMMM',\n 'MMMM',\n 'MMM',\n 'MM',\n 'M',\n 'dd',\n 'd',\n 'EEEEEE',\n 'EEEEE',\n 'EEEE',\n 'EEE',\n 'EE',\n 'E',\n 'aaaaa',\n 'aaaa',\n 'aaa',\n 'aa',\n 'a',\n 'HH',\n 'H',\n 'hh',\n 'h',\n 'mm',\n 'm',\n 'ss',\n 's',\n 'SSS',\n 'SS',\n 'S',\n 'XXXXX',\n 'XXXX',\n 'XXX',\n 'XX',\n 'X',\n 'xxxxx',\n 'xxxx',\n 'xxx',\n 'xx',\n 'x',\n 'zzzz',\n 'zzz',\n 'zz',\n 'z',\n 'T',\n 't'\n ];\n\n // Try to match from longest to shortest\n for (let len = Math.min(count, 6); len > 0; len--) {\n const candidate = char.repeat(len);\n if (validTokens.includes(candidate)) {\n return candidate;\n }\n }\n\n return null;\n}\n"],"mappings":";AAMO,SAAS,aAAa,WAAmB,OAAe,MAA6B;AAE1F,MAAI,SAAS,OAAO,QAAQ,IAAI,UAAU,UAAU,UAAU,QAAQ,CAAC,MAAM,KAAK;AAChF,WAAO;AAAA,EACT;AACA,MAAI,SAAS,OAAO,QAAQ,IAAI,UAAU,UAAU,UAAU,QAAQ,CAAC,MAAM,KAAK;AAChF,WAAO;AAAA,EACT;AAGA,MAAI,MAAM;AACV,SAAO,MAAM,UAAU,UAAU,UAAU,GAAG,MAAM,MAAM;AACxD;AAAA,EACF;AACA,QAAM,QAAQ,MAAM;AAGpB,QAAM,cAAc;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAGA,WAAS,MAAM,KAAK,IAAI,OAAO,CAAC,GAAG,MAAM,GAAG,OAAO;AACjD,UAAM,YAAY,KAAK,OAAO,GAAG;AACjC,QAAI,YAAY,SAAS,SAAS,GAAG;AACnC,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;","names":[]}
@@ -0,0 +1,21 @@
1
+ import {
2
+ assertDayOfWeek
3
+ } from "./chunk-M2XB72L5.js";
4
+ import {
5
+ normalizeTemporalInput
6
+ } from "./chunk-Q6QLOUXJ.js";
7
+ import {
8
+ isPlainDate
9
+ } from "./chunk-BSVOJYJ7.js";
10
+
11
+ // src/nextDay.ts
12
+ function nextDay(input, day) {
13
+ assertDayOfWeek(day, "day");
14
+ const value = isPlainDate(input) ? input : normalizeTemporalInput(input);
15
+ return value.add({ days: (day - value.dayOfWeek + 6) % 7 + 1 });
16
+ }
17
+
18
+ export {
19
+ nextDay
20
+ };
21
+ //# sourceMappingURL=chunk-IDB3R3G5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/nextDay.ts"],"sourcesContent":["import { type Temporal, isPlainDate } from './shared/temporal';\nimport { normalizeTemporalInput } from './shared/normalizeTemporalInput';\nimport { assertDayOfWeek, type DayOfWeek } from './shared/week';\n\n/**\n * Returns the next date that falls on the given day of the week, always after\n * the input: next Friday from a Friday is a week later.\n *\n * Days are numbered as Temporal numbers them: 1 = Monday … 7 = Sunday.\n * PlainDate inputs stay dates. Instant inputs are read in UTC and ZonedDateTime\n * inputs keep their timezone; both keep their wall-clock time.\n *\n * @param input - A Temporal.Instant (UTC), Temporal.ZonedDateTime, or Temporal.PlainDate\n * @param day - The day of the week to find, 1 = Monday … 7 = Sunday\n * @returns The next date on that day of the week\n *\n * @example\n * ```ts\n * const wednesday = Temporal.PlainDate.from('2025-01-22');\n *\n * nextDay(wednesday, 5).toString(); // \"2025-01-24\"\n * nextDay(wednesday, 3).toString(); // \"2025-01-29\"\n * ```\n *\n * @example\n * ```ts\n * // Keeps the wall-clock time across a DST change\n * const fridayEvening = Temporal.ZonedDateTime.from('2025-03-07T18:00:00-05:00[America/New_York]');\n *\n * nextDay(fridayEvening, 1).toString(); // \"2025-03-10T18:00:00-04:00[America/New_York]\"\n * ```\n */\nexport function nextDay(input: Temporal.PlainDate, day: DayOfWeek): Temporal.PlainDate;\nexport function nextDay(\n input: Temporal.Instant | Temporal.ZonedDateTime,\n day: DayOfWeek\n): Temporal.ZonedDateTime;\nexport function nextDay(\n input: Temporal.Instant | Temporal.ZonedDateTime | Temporal.PlainDate,\n day: DayOfWeek\n): Temporal.ZonedDateTime | Temporal.PlainDate {\n assertDayOfWeek(day, 'day');\n const value = isPlainDate(input) ? input : normalizeTemporalInput(input);\n return value.add({ days: ((day - value.dayOfWeek + 6) % 7) + 1 });\n}\n"],"mappings":";;;;;;;;;;;AAqCO,SAAS,QACd,OACA,KAC6C;AAC7C,kBAAgB,KAAK,KAAK;AAC1B,QAAM,QAAQ,YAAY,KAAK,IAAI,QAAQ,uBAAuB,KAAK;AACvE,SAAO,MAAM,IAAI,EAAE,OAAQ,MAAM,MAAM,YAAY,KAAK,IAAK,EAAE,CAAC;AAClE;","names":[]}
@@ -0,0 +1,36 @@
1
+ import {
2
+ isBefore
3
+ } from "./chunk-BMX7CIRD.js";
4
+ import {
5
+ isAfter
6
+ } from "./chunk-CDKIT7D3.js";
7
+ import {
8
+ compare
9
+ } from "./chunk-OMYVTYHI.js";
10
+ import {
11
+ normalizeTemporalInput
12
+ } from "./chunk-Q6QLOUXJ.js";
13
+ import {
14
+ isPlainDate,
15
+ isPlainTime
16
+ } from "./chunk-BSVOJYJ7.js";
17
+
18
+ // src/isWithinInterval.ts
19
+ function isWithinInterval(date, interval) {
20
+ const { start, end } = interval;
21
+ if ([date, start, end].some((value) => isPlainDate(value) || isPlainTime(value))) {
22
+ const afterStart = compare(date, start) >= 0;
23
+ const beforeEnd = compare(date, end) <= 0;
24
+ if (isPlainTime(start) && compare(start, end) > 0) return afterStart || beforeEnd;
25
+ return afterStart && beforeEnd;
26
+ }
27
+ const normalizedDate = normalizeTemporalInput(date);
28
+ const normalizedStart = normalizeTemporalInput(start);
29
+ const normalizedEnd = normalizeTemporalInput(end);
30
+ return !isBefore(normalizedDate, normalizedStart) && !isAfter(normalizedDate, normalizedEnd);
31
+ }
32
+
33
+ export {
34
+ isWithinInterval
35
+ };
36
+ //# sourceMappingURL=chunk-IIEHQPKE.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/isWithinInterval.ts"],"sourcesContent":["import { type Temporal, isPlainDate, isPlainTime } from './shared/temporal';\nimport { compare, type Comparable, type Timeline } from './shared/compare';\nimport { normalizeTemporalInput } from './shared/normalizeTemporalInput';\nimport { isBefore } from './shared/isBefore';\nimport { isAfter } from './shared/isAfter';\n\n/**\n * Returns true if the given value is within the interval (inclusive of start and end).\n *\n * Instants and ZonedDateTimes compare by the moment they represent, not by\n * calendar date/time. PlainDates compare by date. PlainTimes compare by\n * wall-clock time, and an interval whose start is later than its end wraps\n * past midnight: 22:00 to 02:00 contains 23:30 and 01:00. A reversed timeline\n * or PlainDate interval contains nothing.\n *\n * Mixing PlainDate, PlainTime, and timeline values throws a TypeError.\n *\n * @param date - The value to check\n * @param interval - The interval with start and end values of the same kind\n * @returns true if the value is within the interval, false otherwise\n *\n * @example\n * ```ts\n * const start = Temporal.ZonedDateTime.from('2025-01-01T00:00:00+00:00[UTC]');\n * const end = Temporal.ZonedDateTime.from('2025-01-07T00:00:00+00:00[UTC]');\n * const date = Temporal.ZonedDateTime.from('2025-01-03T00:00:00+00:00[UTC]');\n *\n * isWithinInterval(date, { start, end }); // true\n * ```\n *\n * @example\n * ```ts\n * // Date outside the interval\n * const start = Temporal.ZonedDateTime.from('2025-01-01T00:00:00+00:00[UTC]');\n * const end = Temporal.ZonedDateTime.from('2025-01-07T00:00:00+00:00[UTC]');\n * const date = Temporal.ZonedDateTime.from('2025-01-10T00:00:00+00:00[UTC]');\n *\n * isWithinInterval(date, { start, end }); // false\n * ```\n *\n * @example\n * ```ts\n * // Date equal to interval start (inclusive)\n * const start = Temporal.ZonedDateTime.from('2025-01-01T00:00:00+00:00[UTC]');\n * const end = Temporal.ZonedDateTime.from('2025-01-07T00:00:00+00:00[UTC]');\n *\n * isWithinInterval(start, { start, end }); // true\n * ```\n *\n * @example\n * ```ts\n * // Date equal to interval end (inclusive)\n * const start = Temporal.ZonedDateTime.from('2025-01-01T00:00:00+00:00[UTC]');\n * const end = Temporal.ZonedDateTime.from('2025-01-07T00:00:00+00:00[UTC]');\n *\n * isWithinInterval(end, { start, end }); // true\n * ```\n *\n * @example\n * ```ts\n * // Works with Instant too\n * const start = Temporal.Instant.from('2025-01-01T00:00:00Z');\n * const end = Temporal.Instant.from('2025-01-07T00:00:00Z');\n * const date = Temporal.Instant.from('2025-01-03T00:00:00Z');\n *\n * isWithinInterval(date, { start, end }); // true\n * ```\n *\n * @example\n * ```ts\n * // Different timezones - compares by instant\n * const start = Temporal.ZonedDateTime.from('2025-01-01T00:00:00-05:00[America/New_York]');\n * const end = Temporal.ZonedDateTime.from('2025-01-07T00:00:00+09:00[Asia/Tokyo]');\n * const date = Temporal.ZonedDateTime.from('2025-01-03T12:00:00+00:00[UTC]');\n *\n * isWithinInterval(date, { start, end }); // true\n * ```\n *\n * @example\n * ```ts\n * // Dates\n * const start = Temporal.PlainDate.from('2025-07-01');\n * const end = Temporal.PlainDate.from('2025-07-15');\n *\n * isWithinInterval(Temporal.PlainDate.from('2025-07-15'), { start, end }); // true\n * ```\n *\n * @example\n * ```ts\n * // Opening hours that run past midnight\n * const start = Temporal.PlainTime.from('22:00');\n * const end = Temporal.PlainTime.from('02:00');\n *\n * isWithinInterval(Temporal.PlainTime.from('23:30'), { start, end }); // true\n * isWithinInterval(Temporal.PlainTime.from('01:00'), { start, end }); // true\n * isWithinInterval(Temporal.PlainTime.from('12:00'), { start, end }); // false\n * ```\n */\nexport function isWithinInterval(\n date: Temporal.PlainDate,\n interval: { start: Temporal.PlainDate; end: Temporal.PlainDate }\n): boolean;\nexport function isWithinInterval(\n date: Temporal.PlainTime,\n interval: { start: Temporal.PlainTime; end: Temporal.PlainTime }\n): boolean;\nexport function isWithinInterval(\n date: Temporal.Instant | Temporal.ZonedDateTime,\n interval: {\n start: Temporal.Instant | Temporal.ZonedDateTime;\n end: Temporal.Instant | Temporal.ZonedDateTime;\n }\n): boolean;\nexport function isWithinInterval(\n date: Comparable,\n interval: { start: Comparable; end: Comparable }\n): boolean {\n const { start, end } = interval;\n if ([date, start, end].some((value) => isPlainDate(value) || isPlainTime(value))) {\n const afterStart = compare(date, start) >= 0;\n const beforeEnd = compare(date, end) <= 0;\n if (isPlainTime(start) && compare(start, end) > 0) return afterStart || beforeEnd;\n return afterStart && beforeEnd;\n }\n\n const normalizedDate = normalizeTemporalInput(date as Timeline);\n const normalizedStart = normalizeTemporalInput(start as Timeline);\n const normalizedEnd = normalizeTemporalInput(end as Timeline);\n\n return !isBefore(normalizedDate, normalizedStart) && !isAfter(normalizedDate, normalizedEnd);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAiHO,SAAS,iBACd,MACA,UACS;AACT,QAAM,EAAE,OAAO,IAAI,IAAI;AACvB,MAAI,CAAC,MAAM,OAAO,GAAG,EAAE,KAAK,CAAC,UAAU,YAAY,KAAK,KAAK,YAAY,KAAK,CAAC,GAAG;AAChF,UAAM,aAAa,QAAQ,MAAM,KAAK,KAAK;AAC3C,UAAM,YAAY,QAAQ,MAAM,GAAG,KAAK;AACxC,QAAI,YAAY,KAAK,KAAK,QAAQ,OAAO,GAAG,IAAI,EAAG,QAAO,cAAc;AACxE,WAAO,cAAc;AAAA,EACvB;AAEA,QAAM,iBAAiB,uBAAuB,IAAgB;AAC9D,QAAM,kBAAkB,uBAAuB,KAAiB;AAChE,QAAM,gBAAgB,uBAAuB,GAAe;AAE5D,SAAO,CAAC,SAAS,gBAAgB,eAAe,KAAK,CAAC,QAAQ,gBAAgB,aAAa;AAC7F;","names":[]}
@@ -1,13 +1,15 @@
1
1
  import {
2
2
  isWeekendDay,
3
- isoDate
4
- } from "./chunk-K7CLBBBM.js";
3
+ isoDate,
4
+ weekdayHolidays
5
+ } from "./chunk-4YCEFGZA.js";
5
6
  import {
7
+ Temporal,
6
8
  isPlainDate
7
9
  } from "./chunk-BSVOJYJ7.js";
8
10
 
9
11
  // src/differenceInBusinessDays.ts
10
- function differenceInBusinessDays(laterDate, earlierDate) {
12
+ function differenceInBusinessDays(laterDate, earlierDate, holidays = []) {
11
13
  if (isPlainDate(laterDate) !== isPlainDate(earlierDate)) {
12
14
  throw new TypeError("PlainDate differences require two PlainDate values");
13
15
  }
@@ -21,10 +23,14 @@ function differenceInBusinessDays(laterDate, earlierDate) {
21
23
  if (!isWeekendDay(day.dayOfWeek)) count++;
22
24
  day = day.add({ days: 1 });
23
25
  }
26
+ const end = from.add({ days: span });
27
+ count -= weekdayHolidays(holidays).filter(
28
+ (date) => Temporal.PlainDate.compare(date, from) >= 0 && Temporal.PlainDate.compare(date, end) < 0
29
+ ).length;
24
30
  return days < 0 && count !== 0 ? -count : count;
25
31
  }
26
32
 
27
33
  export {
28
34
  differenceInBusinessDays
29
35
  };
30
- //# sourceMappingURL=chunk-OVBZ2NBB.js.map
36
+ //# sourceMappingURL=chunk-K7SY2MAX.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/differenceInBusinessDays.ts"],"sourcesContent":["import { Temporal, isPlainDate } from './shared/temporal';\nimport { isWeekendDay, isoDate, weekdayHolidays } from './shared/businessDays';\n\n/**\n * Returns the number of business days (Monday–Friday) from earlierDate up to\n * laterDate: the earlier date counts, the later date does not. Dates in\n * `holidays` are not counted. Swapping the arguments negates the result.\n *\n * Only calendar dates matter; times of day are ignored. Instant inputs use\n * their UTC date and ZonedDateTime inputs use their own timezone's date.\n * Convert both to one timezone first to count from a single perspective.\n *\n * @param laterDate - The later date\n * @param earlierDate - The earlier date\n * @param holidays - Dates that are not business days, matched by date\n * @returns Business days between the dates (negative if laterDate is earlier)\n *\n * @example\n * ```ts\n * const friday = Temporal.PlainDate.from('2025-01-24');\n * const nextFriday = Temporal.PlainDate.from('2025-01-31');\n *\n * differenceInBusinessDays(nextFriday, friday); // 5\n * differenceInBusinessDays(friday, nextFriday); // -5\n * differenceInBusinessDays(nextFriday, friday, [Temporal.PlainDate.from('2025-01-27')]); // 4\n * ```\n */\nexport function differenceInBusinessDays(\n laterDate: Temporal.PlainDate,\n earlierDate: Temporal.PlainDate,\n holidays?: readonly Temporal.PlainDate[]\n): number;\nexport function differenceInBusinessDays(\n laterDate: Temporal.Instant | Temporal.ZonedDateTime,\n earlierDate: Temporal.Instant | Temporal.ZonedDateTime,\n holidays?: readonly Temporal.PlainDate[]\n): number;\nexport function differenceInBusinessDays(\n laterDate: Temporal.Instant | Temporal.ZonedDateTime | Temporal.PlainDate,\n earlierDate: Temporal.Instant | Temporal.ZonedDateTime | Temporal.PlainDate,\n holidays: readonly Temporal.PlainDate[] = []\n): number {\n if (isPlainDate(laterDate) !== isPlainDate(earlierDate)) {\n throw new TypeError('PlainDate differences require two PlainDate values');\n }\n const later = isoDate(laterDate);\n const earlier = isoDate(earlierDate);\n const days = earlier.until(later, { largestUnit: 'days' }).days;\n const [from, span] = days < 0 ? [later, -days] : [earlier, days];\n\n // Every full week holds five business days; walk the remainder.\n const fullWeeks = Math.trunc(span / 7);\n let count = fullWeeks * 5;\n for (let day = from.add({ days: fullWeeks * 7 }), i = fullWeeks * 7; i < span; i++) {\n if (!isWeekendDay(day.dayOfWeek)) count++;\n day = day.add({ days: 1 });\n }\n const end = from.add({ days: span });\n count -= weekdayHolidays(holidays).filter(\n (date) =>\n Temporal.PlainDate.compare(date, from) >= 0 && Temporal.PlainDate.compare(date, end) < 0\n ).length;\n return days < 0 && count !== 0 ? -count : count;\n}\n"],"mappings":";;;;;;;;;;;AAqCO,SAAS,yBACd,WACA,aACA,WAA0C,CAAC,GACnC;AACR,MAAI,YAAY,SAAS,MAAM,YAAY,WAAW,GAAG;AACvD,UAAM,IAAI,UAAU,oDAAoD;AAAA,EAC1E;AACA,QAAM,QAAQ,QAAQ,SAAS;AAC/B,QAAM,UAAU,QAAQ,WAAW;AACnC,QAAM,OAAO,QAAQ,MAAM,OAAO,EAAE,aAAa,OAAO,CAAC,EAAE;AAC3D,QAAM,CAAC,MAAM,IAAI,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,SAAS,IAAI;AAG/D,QAAM,YAAY,KAAK,MAAM,OAAO,CAAC;AACrC,MAAI,QAAQ,YAAY;AACxB,WAAS,MAAM,KAAK,IAAI,EAAE,MAAM,YAAY,EAAE,CAAC,GAAG,IAAI,YAAY,GAAG,IAAI,MAAM,KAAK;AAClF,QAAI,CAAC,aAAa,IAAI,SAAS,EAAG;AAClC,UAAM,IAAI,IAAI,EAAE,MAAM,EAAE,CAAC;AAAA,EAC3B;AACA,QAAM,MAAM,KAAK,IAAI,EAAE,MAAM,KAAK,CAAC;AACnC,WAAS,gBAAgB,QAAQ,EAAE;AAAA,IACjC,CAAC,SACC,SAAS,UAAU,QAAQ,MAAM,IAAI,KAAK,KAAK,SAAS,UAAU,QAAQ,MAAM,GAAG,IAAI;AAAA,EAC3F,EAAE;AACF,SAAO,OAAO,KAAK,UAAU,IAAI,CAAC,QAAQ;AAC5C;","names":[]}
@@ -0,0 +1,19 @@
1
+ import {
2
+ daysIntoWeek
3
+ } from "./chunk-M2XB72L5.js";
4
+ import {
5
+ calendarDates
6
+ } from "./chunk-H43LMOCK.js";
7
+
8
+ // src/differenceInCalendarWeeks.ts
9
+ function differenceInCalendarWeeks(laterDate, earlierDate, options) {
10
+ const [later, earlier] = calendarDates(laterDate, earlierDate);
11
+ const laterStart = later.subtract({ days: daysIntoWeek(later.dayOfWeek, options) });
12
+ const earlierStart = earlier.subtract({ days: daysIntoWeek(earlier.dayOfWeek, options) });
13
+ return earlierStart.until(laterStart, { largestUnit: "days" }).days / 7;
14
+ }
15
+
16
+ export {
17
+ differenceInCalendarWeeks
18
+ };
19
+ //# sourceMappingURL=chunk-KZYWHHAQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/differenceInCalendarWeeks.ts"],"sourcesContent":["import type { Temporal } from './shared/temporal';\nimport { calendarDates } from './shared/calendarDates';\nimport { daysIntoWeek, type WeekOptions } from './shared/week';\n\n/**\n * Returns the number of week boundaries crossed between two dates, ignoring the\n * day within the week. Weeks start on Monday (ISO 8601) unless `weekStartsOn`\n * says otherwise.\n *\n * PlainDate inputs are compared as given. Instant inputs use their UTC date and\n * ZonedDateTime inputs use the date in their own timezone; convert both to one\n * timezone first to count from a single point of view. Mixing a PlainDate with\n * an Instant or ZonedDateTime throws a TypeError.\n *\n * @param laterDate - The later date\n * @param earlierDate - The earlier date\n * @param options - `weekStartsOn`: 1 = Monday (default) … 7 = Sunday\n * @returns Calendar weeks from earlierDate to laterDate; negative if laterDate is earlier\n *\n * @example\n * ```ts\n * const sunday = Temporal.PlainDate.from('2025-01-26');\n * const monday = Temporal.PlainDate.from('2025-01-27');\n *\n * differenceInCalendarWeeks(monday, sunday); // 1\n * differenceInCalendarWeeks(monday, sunday, { weekStartsOn: 7 }); // 0\n * ```\n */\nexport function differenceInCalendarWeeks(\n laterDate: Temporal.PlainDate,\n earlierDate: Temporal.PlainDate,\n options?: WeekOptions\n): number;\nexport function differenceInCalendarWeeks(\n laterDate: Temporal.Instant | Temporal.ZonedDateTime,\n earlierDate: Temporal.Instant | Temporal.ZonedDateTime,\n options?: WeekOptions\n): number;\nexport function differenceInCalendarWeeks(\n laterDate: Temporal.Instant | Temporal.ZonedDateTime | Temporal.PlainDate,\n earlierDate: Temporal.Instant | Temporal.ZonedDateTime | Temporal.PlainDate,\n options?: WeekOptions\n): number {\n const [later, earlier] = calendarDates(laterDate, earlierDate);\n const laterStart = later.subtract({ days: daysIntoWeek(later.dayOfWeek, options) });\n const earlierStart = earlier.subtract({ days: daysIntoWeek(earlier.dayOfWeek, options) });\n return earlierStart.until(laterStart, { largestUnit: 'days' }).days / 7;\n}\n"],"mappings":";;;;;;;;AAsCO,SAAS,0BACd,WACA,aACA,SACQ;AACR,QAAM,CAAC,OAAO,OAAO,IAAI,cAAc,WAAW,WAAW;AAC7D,QAAM,aAAa,MAAM,SAAS,EAAE,MAAM,aAAa,MAAM,WAAW,OAAO,EAAE,CAAC;AAClF,QAAM,eAAe,QAAQ,SAAS,EAAE,MAAM,aAAa,QAAQ,WAAW,OAAO,EAAE,CAAC;AACxF,SAAO,aAAa,MAAM,YAAY,EAAE,aAAa,OAAO,CAAC,EAAE,OAAO;AACxE;","names":[]}
@@ -0,0 +1,17 @@
1
+ // src/shared/week.ts
2
+ function assertDayOfWeek(day, name) {
3
+ if (!Number.isInteger(day) || day < 1 || day > 7) {
4
+ throw new RangeError(`${name} must be 1 (Monday) through 7 (Sunday), got ${day}`);
5
+ }
6
+ }
7
+ function daysIntoWeek(dayOfWeek, options) {
8
+ const weekStartsOn = options?.weekStartsOn ?? 1;
9
+ assertDayOfWeek(weekStartsOn, "weekStartsOn");
10
+ return (dayOfWeek - weekStartsOn + 7) % 7;
11
+ }
12
+
13
+ export {
14
+ assertDayOfWeek,
15
+ daysIntoWeek
16
+ };
17
+ //# sourceMappingURL=chunk-M2XB72L5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/shared/week.ts"],"sourcesContent":["/**\n * Day of the week, numbered as Temporal numbers it: 1 = Monday … 7 = Sunday.\n */\nexport type DayOfWeek = 1 | 2 | 3 | 4 | 5 | 6 | 7;\n\n/**\n * Options for functions that need to know where a week begins.\n */\nexport interface WeekOptions {\n /**\n * The first day of the week: 1 = Monday … 7 = Sunday.\n * @default 1 (Monday, as in ISO 8601)\n */\n weekStartsOn?: DayOfWeek;\n}\n\n/**\n * @internal\n * Checks a day-of-week argument. date-fns numbers Sunday 0; Temporal numbers it 7,\n * so 0 is rejected rather than silently meaning something else.\n */\nexport function assertDayOfWeek(day: number, name: string): asserts day is DayOfWeek {\n if (!Number.isInteger(day) || day < 1 || day > 7) {\n throw new RangeError(`${name} must be 1 (Monday) through 7 (Sunday), got ${day}`);\n }\n}\n\n/**\n * @internal\n * Days from the start of the week to a given day of the week (0–6).\n */\nexport function daysIntoWeek(dayOfWeek: number, options: WeekOptions | undefined): number {\n const weekStartsOn = options?.weekStartsOn ?? 1;\n assertDayOfWeek(weekStartsOn, 'weekStartsOn');\n return (dayOfWeek - weekStartsOn + 7) % 7;\n}\n"],"mappings":";AAqBO,SAAS,gBAAgB,KAAa,MAAwC;AACnF,MAAI,CAAC,OAAO,UAAU,GAAG,KAAK,MAAM,KAAK,MAAM,GAAG;AAChD,UAAM,IAAI,WAAW,GAAG,IAAI,+CAA+C,GAAG,EAAE;AAAA,EAClF;AACF;AAMO,SAAS,aAAa,WAAmB,SAA0C;AACxF,QAAM,eAAe,SAAS,gBAAgB;AAC9C,kBAAgB,cAAc,cAAc;AAC5C,UAAQ,YAAY,eAAe,KAAK;AAC1C;","names":[]}
@@ -0,0 +1,19 @@
1
+ import {
2
+ quarterOfMonth
3
+ } from "./chunk-XS2HUADA.js";
4
+ import {
5
+ calendarDates
6
+ } from "./chunk-H43LMOCK.js";
7
+
8
+ // src/differenceInCalendarQuarters.ts
9
+ function differenceInCalendarQuarters(laterDate, earlierDate) {
10
+ const [later, earlier] = calendarDates(laterDate, earlierDate).map(
11
+ (date) => date.withCalendar("iso8601")
12
+ );
13
+ return (later.year - earlier.year) * 4 + quarterOfMonth(later.month) - quarterOfMonth(earlier.month);
14
+ }
15
+
16
+ export {
17
+ differenceInCalendarQuarters
18
+ };
19
+ //# sourceMappingURL=chunk-OMUK2MOH.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/differenceInCalendarQuarters.ts"],"sourcesContent":["import type { Temporal } from './shared/temporal';\nimport { calendarDates } from './shared/calendarDates';\nimport { quarterOfMonth } from './shared/quarter';\n\n/**\n * Returns the number of calendar quarters between two dates, ignoring the\n * position within the quarter. Quarters follow ISO months: Q1 is January–March.\n *\n * PlainDate inputs are compared as given. Instant inputs use their UTC date and\n * ZonedDateTime inputs use the date in their own timezone; convert both to one\n * timezone first to count from a single point of view. Mixing a PlainDate with\n * an Instant or ZonedDateTime throws a TypeError.\n *\n * @param laterDate - The later date\n * @param earlierDate - The earlier date\n * @returns Calendar quarters from earlierDate to laterDate; negative if laterDate is earlier\n *\n * @example\n * ```ts\n * const endOfQ1 = Temporal.PlainDate.from('2025-03-31');\n * const startOfQ2 = Temporal.PlainDate.from('2025-04-01');\n *\n * differenceInCalendarQuarters(startOfQ2, endOfQ1); // 1\n * differenceInQuarters(startOfQ2, endOfQ1); // 0\n * ```\n */\nexport function differenceInCalendarQuarters(\n laterDate: Temporal.PlainDate,\n earlierDate: Temporal.PlainDate\n): number;\nexport function differenceInCalendarQuarters(\n laterDate: Temporal.Instant | Temporal.ZonedDateTime,\n earlierDate: Temporal.Instant | Temporal.ZonedDateTime\n): number;\nexport function differenceInCalendarQuarters(\n laterDate: Temporal.Instant | Temporal.ZonedDateTime | Temporal.PlainDate,\n earlierDate: Temporal.Instant | Temporal.ZonedDateTime | Temporal.PlainDate\n): number {\n const [later, earlier] = calendarDates(laterDate, earlierDate).map((date) =>\n date.withCalendar('iso8601')\n ) as [Temporal.PlainDate, Temporal.PlainDate];\n return (\n (later.year - earlier.year) * 4 + quarterOfMonth(later.month) - quarterOfMonth(earlier.month)\n );\n}\n"],"mappings":";;;;;;;;AAkCO,SAAS,6BACd,WACA,aACQ;AACR,QAAM,CAAC,OAAO,OAAO,IAAI,cAAc,WAAW,WAAW,EAAE;AAAA,IAAI,CAAC,SAClE,KAAK,aAAa,SAAS;AAAA,EAC7B;AACA,UACG,MAAM,OAAO,QAAQ,QAAQ,IAAI,eAAe,MAAM,KAAK,IAAI,eAAe,QAAQ,KAAK;AAEhG;","names":[]}