@formkit/tempo 0.1.2 → 1.1.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 (178) hide show
  1. package/README.md +22 -1
  2. package/dist/add.d.ts +11 -0
  3. package/dist/add.mjs +50 -0
  4. package/dist/add.mjs.map +1 -0
  5. package/dist/addDay.d.ts +4 -3
  6. package/dist/addDay.mjs.map +1 -1
  7. package/dist/addHour.d.ts +4 -3
  8. package/dist/addHour.mjs.map +1 -1
  9. package/dist/addMillisecond.d.ts +10 -0
  10. package/dist/addMillisecond.mjs +11 -0
  11. package/dist/addMillisecond.mjs.map +1 -0
  12. package/dist/addMinute.d.ts +5 -4
  13. package/dist/addMinute.mjs.map +1 -1
  14. package/dist/addMonth.d.ts +5 -5
  15. package/dist/addMonth.mjs +2 -12
  16. package/dist/addMonth.mjs.map +1 -1
  17. package/dist/addSecond.d.ts +4 -3
  18. package/dist/addSecond.mjs.map +1 -1
  19. package/dist/addYear.d.ts +5 -5
  20. package/dist/addYear.mjs +6 -12
  21. package/dist/addYear.mjs.map +1 -1
  22. package/dist/ap.mjs +1 -2
  23. package/dist/ap.mjs.map +1 -1
  24. package/dist/applyOffset.d.ts +5 -5
  25. package/dist/applyOffset.mjs +5 -11
  26. package/dist/applyOffset.mjs.map +1 -1
  27. package/dist/bundle.d.ts +365 -115
  28. package/dist/bundle.mjs +364 -180
  29. package/dist/bundle.mjs.map +1 -1
  30. package/dist/common.d.ts +27 -7
  31. package/dist/common.mjs +47 -42
  32. package/dist/common.mjs.map +1 -1
  33. package/dist/date.d.ts +2 -2
  34. package/dist/date.mjs +1 -3
  35. package/dist/date.mjs.map +1 -1
  36. package/dist/dayEnd.d.ts +3 -3
  37. package/dist/dayEnd.mjs.map +1 -1
  38. package/dist/dayOfYear.d.ts +3 -3
  39. package/dist/dayOfYear.mjs.map +1 -1
  40. package/dist/dayStart.d.ts +3 -3
  41. package/dist/dayStart.mjs +1 -1
  42. package/dist/dayStart.mjs.map +1 -1
  43. package/dist/diff.d.ts +38 -0
  44. package/dist/diff.mjs +86 -0
  45. package/dist/diff.mjs.map +1 -0
  46. package/dist/diffDays.d.ts +12 -5
  47. package/dist/diffDays.mjs +1 -0
  48. package/dist/diffDays.mjs.map +1 -1
  49. package/dist/diffHours.d.ts +12 -5
  50. package/dist/diffHours.mjs +1 -0
  51. package/dist/diffHours.mjs.map +1 -1
  52. package/dist/diffMilliseconds.d.ts +10 -4
  53. package/dist/diffMilliseconds.mjs.map +1 -1
  54. package/dist/diffMinutes.d.ts +11 -3
  55. package/dist/diffMinutes.mjs +5 -1
  56. package/dist/diffMinutes.mjs.map +1 -1
  57. package/dist/diffMonths.d.ts +10 -4
  58. package/dist/diffMonths.mjs.map +1 -1
  59. package/dist/diffSeconds.d.ts +12 -5
  60. package/dist/diffSeconds.mjs +5 -1
  61. package/dist/diffSeconds.mjs.map +1 -1
  62. package/dist/diffWeeks.d.ts +10 -3
  63. package/dist/diffWeeks.mjs.map +1 -1
  64. package/dist/diffYears.d.ts +10 -4
  65. package/dist/diffYears.mjs +4 -1
  66. package/dist/diffYears.mjs.map +1 -1
  67. package/dist/format.mjs +2 -3
  68. package/dist/format.mjs.map +1 -1
  69. package/dist/handleDateOverflow.d.ts +12 -0
  70. package/dist/handleDateOverflow.mjs +18 -0
  71. package/dist/handleDateOverflow.mjs.map +1 -0
  72. package/dist/hourEnd.d.ts +3 -3
  73. package/dist/hourEnd.mjs.map +1 -1
  74. package/dist/hourStart.d.ts +3 -3
  75. package/dist/hourStart.mjs +1 -1
  76. package/dist/hourStart.mjs.map +1 -1
  77. package/dist/index.cjs +380 -183
  78. package/dist/index.cjs.map +1 -1
  79. package/dist/index.d.cts +365 -115
  80. package/dist/index.d.ts +14 -1
  81. package/dist/index.mjs +26 -0
  82. package/dist/index.mjs.map +1 -1
  83. package/dist/isAfter.d.ts +6 -6
  84. package/dist/isAfter.mjs.map +1 -1
  85. package/dist/isBefore.d.ts +5 -5
  86. package/dist/isBefore.mjs.map +1 -1
  87. package/dist/isEqual.d.ts +13 -4
  88. package/dist/isEqual.mjs.map +1 -1
  89. package/dist/isFuture.d.ts +10 -0
  90. package/dist/isFuture.mjs +9 -0
  91. package/dist/isFuture.mjs.map +1 -0
  92. package/dist/isPast.d.ts +10 -0
  93. package/dist/isPast.mjs +9 -0
  94. package/dist/isPast.mjs.map +1 -0
  95. package/dist/iso8601.d.ts +1 -1
  96. package/dist/iso8601.mjs +4 -7
  97. package/dist/iso8601.mjs.map +1 -1
  98. package/dist/minuteEnd.d.ts +3 -3
  99. package/dist/minuteEnd.mjs.map +1 -1
  100. package/dist/minuteStart.d.ts +3 -3
  101. package/dist/minuteStart.mjs +1 -1
  102. package/dist/minuteStart.mjs.map +1 -1
  103. package/dist/monthDays.d.ts +3 -3
  104. package/dist/monthDays.mjs.map +1 -1
  105. package/dist/monthEnd.d.ts +3 -3
  106. package/dist/monthEnd.mjs.map +1 -1
  107. package/dist/monthStart.d.ts +3 -3
  108. package/dist/monthStart.mjs +1 -1
  109. package/dist/monthStart.mjs.map +1 -1
  110. package/dist/nearestDay.d.ts +3 -3
  111. package/dist/nearestDay.mjs +2 -4
  112. package/dist/nearestDay.mjs.map +1 -1
  113. package/dist/offset.d.ts +5 -5
  114. package/dist/offset.mjs +16 -16
  115. package/dist/offset.mjs.map +1 -1
  116. package/dist/parse.mjs +33 -23
  117. package/dist/parse.mjs.map +1 -1
  118. package/dist/parts.mjs +14 -24
  119. package/dist/parts.mjs.map +1 -1
  120. package/dist/range.mjs +1 -2
  121. package/dist/range.mjs.map +1 -1
  122. package/dist/removeOffset.d.ts +4 -4
  123. package/dist/removeOffset.mjs.map +1 -1
  124. package/dist/sameDay.d.ts +8 -2
  125. package/dist/sameDay.mjs.map +1 -1
  126. package/dist/sameHour.d.ts +8 -2
  127. package/dist/sameHour.mjs.map +1 -1
  128. package/dist/sameMillisecond.d.ts +16 -0
  129. package/dist/sameMillisecond.mjs +11 -0
  130. package/dist/sameMillisecond.mjs.map +1 -0
  131. package/dist/sameMinute.d.ts +8 -2
  132. package/dist/sameMinute.mjs.map +1 -1
  133. package/dist/sameMonth.d.ts +16 -0
  134. package/dist/sameMonth.mjs +11 -0
  135. package/dist/sameMonth.mjs.map +1 -0
  136. package/dist/sameSecond.d.ts +8 -2
  137. package/dist/sameSecond.mjs.map +1 -1
  138. package/dist/sameYear.d.ts +8 -2
  139. package/dist/sameYear.mjs.map +1 -1
  140. package/dist/setDayOfMonth.d.ts +11 -0
  141. package/dist/setDayOfMonth.mjs +16 -0
  142. package/dist/setDayOfMonth.mjs.map +1 -0
  143. package/dist/setHour.d.ts +10 -0
  144. package/dist/setHour.mjs +11 -0
  145. package/dist/setHour.mjs.map +1 -0
  146. package/dist/setMilliseconds.d.ts +10 -0
  147. package/dist/setMilliseconds.mjs +11 -0
  148. package/dist/setMilliseconds.mjs.map +1 -0
  149. package/dist/setMinutes.d.ts +10 -0
  150. package/dist/setMinutes.mjs +11 -0
  151. package/dist/setMinutes.mjs.map +1 -0
  152. package/dist/setMonth.d.ts +11 -0
  153. package/dist/setMonth.mjs +9 -0
  154. package/dist/setMonth.mjs.map +1 -0
  155. package/dist/setSeconds.d.ts +10 -0
  156. package/dist/setSeconds.mjs +11 -0
  157. package/dist/setSeconds.mjs.map +1 -0
  158. package/dist/setYear.d.ts +11 -0
  159. package/dist/setYear.mjs +9 -0
  160. package/dist/setYear.mjs.map +1 -0
  161. package/dist/types.d.ts +29 -7
  162. package/dist/tzDate.d.ts +5 -3
  163. package/dist/tzDate.mjs.map +1 -1
  164. package/dist/weekEnd.d.ts +4 -4
  165. package/dist/weekEnd.mjs +1 -1
  166. package/dist/weekEnd.mjs.map +1 -1
  167. package/dist/weekStart.d.ts +4 -4
  168. package/dist/weekStart.mjs +2 -3
  169. package/dist/weekStart.mjs.map +1 -1
  170. package/dist/yearDays.d.ts +3 -3
  171. package/dist/yearDays.mjs.map +1 -1
  172. package/dist/yearEnd.d.ts +3 -3
  173. package/dist/yearEnd.mjs +1 -2
  174. package/dist/yearEnd.mjs.map +1 -1
  175. package/dist/yearStart.d.ts +3 -3
  176. package/dist/yearStart.mjs +2 -3
  177. package/dist/yearStart.mjs.map +1 -1
  178. package/package.json +32 -23
package/dist/index.cjs CHANGED
@@ -18,10 +18,12 @@ var __copyProps = (to, from, except, desc) => {
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
19
 
20
20
  // src/index.ts
21
- var src_exports = {};
22
- __export(src_exports, {
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ add: () => add,
23
24
  addDay: () => addDay,
24
25
  addHour: () => addHour,
26
+ addMillisecond: () => addMillisecond,
25
27
  addMinute: () => addMinute,
26
28
  addMonth: () => addMonth,
27
29
  addSecond: () => addSecond,
@@ -32,6 +34,7 @@ __export(src_exports, {
32
34
  dayEnd: () => dayEnd,
33
35
  dayOfYear: () => dayOfYear,
34
36
  dayStart: () => dayStart,
37
+ diff: () => diff,
35
38
  diffDays: () => diffDays,
36
39
  diffHours: () => diffHours,
37
40
  diffMilliseconds: () => diffMilliseconds,
@@ -48,6 +51,8 @@ __export(src_exports, {
48
51
  isAfter: () => isAfter,
49
52
  isBefore: () => isBefore,
50
53
  isEqual: () => isEqual,
54
+ isFuture: () => isFuture,
55
+ isPast: () => isPast,
51
56
  iso8601: () => iso8601,
52
57
  minuteEnd: () => minuteEnd,
53
58
  minuteStart: () => minuteStart,
@@ -63,9 +68,17 @@ __export(src_exports, {
63
68
  removeOffset: () => removeOffset,
64
69
  sameDay: () => sameDay,
65
70
  sameHour: () => sameHour,
71
+ sameMillisecond: () => sameMillisecond,
66
72
  sameMinute: () => sameMinute,
67
73
  sameSecond: () => sameSecond,
68
74
  sameYear: () => sameYear,
75
+ setDayOfMonth: () => setDayOfMonth,
76
+ setHour: () => setHour,
77
+ setMilliseconds: () => setMilliseconds,
78
+ setMinutes: () => setMinutes,
79
+ setMonth: () => setMonth,
80
+ setSeconds: () => setSeconds,
81
+ setYear: () => setYear,
69
82
  tzDate: () => tzDate,
70
83
  weekEnd: () => weekEnd,
71
84
  weekStart: () => weekStart,
@@ -73,25 +86,22 @@ __export(src_exports, {
73
86
  yearEnd: () => yearEnd,
74
87
  yearStart: () => yearStart
75
88
  });
76
- module.exports = __toCommonJS(src_exports);
89
+ module.exports = __toCommonJS(index_exports);
77
90
 
78
91
  // src/iso8601.ts
79
- var iso8601Match = /^([0-9]{4})-([0-1][0-9])(?:-([0-3][0-9]))?(?:[T ]?([0-2][0-9])(?::([0-5][0-9]))?(?::([0-5][0-9]))?)?(?:\.[0-9]+)?(Z|(?:\+|\-)[0-9]{2}:?[0-9]{2})?$/;
92
+ var iso8601Match = /^([0-9]{4})-([0-1][0-9])(?:-([0-3][0-9]))?(?:[T ]?([0-2][0-9])(?::([0-5][0-9]))?(?::([0-5][0-9]))?)?(?:\.[0-9]+)?(Z|(?:\+|\-)[0-9]{2}:?[0-9]{2}(?::?[0-9]{2})?)?$/;
80
93
  function iso8601(date2) {
81
94
  const matches = date2.match(iso8601Match);
82
95
  if (matches) {
83
96
  const month = Number(matches[2]);
84
- if (month < 1 || month > 12)
85
- return false;
97
+ if (month < 1 || month > 12) return false;
86
98
  if (typeof matches[3] !== void 0) {
87
99
  const date3 = Number(matches[3]);
88
- if (date3 < 1 || date3 > 31)
89
- return false;
100
+ if (date3 < 1 || date3 > 31) return false;
90
101
  }
91
102
  if (typeof matches[4] !== void 0) {
92
103
  const hours = Number(matches[4]);
93
- if (hours < 0 || hours > 23)
94
- return false;
104
+ if (hours < 0 || hours > 23) return false;
95
105
  }
96
106
  return true;
97
107
  }
@@ -111,9 +121,7 @@ function date(date2) {
111
121
  date2 = /* @__PURE__ */ new Date();
112
122
  }
113
123
  if (date2 instanceof Date) {
114
- const d = new Date(date2);
115
- d.setMilliseconds(0);
116
- return d;
124
+ return new Date(date2);
117
125
  }
118
126
  date2 = date2.trim();
119
127
  if (iso8601(date2)) {
@@ -129,6 +137,27 @@ function addDay(inputDate, count = 1) {
129
137
  return d;
130
138
  }
131
139
 
140
+ // src/addHour.ts
141
+ function addHour(inputDate, count = 1) {
142
+ const d = date(inputDate);
143
+ d.setHours(d.getHours() + count);
144
+ return d;
145
+ }
146
+
147
+ // src/addMillisecond.ts
148
+ function addMillisecond(inputDate, count = 1) {
149
+ const d = date(inputDate);
150
+ d.setMilliseconds(d.getMilliseconds() + count);
151
+ return d;
152
+ }
153
+
154
+ // src/addMinute.ts
155
+ function addMinute(inputDate, count = 1) {
156
+ const d = date(inputDate);
157
+ d.setMinutes(d.getMinutes() + count);
158
+ return d;
159
+ }
160
+
132
161
  // src/monthEnd.ts
133
162
  function monthEnd(inputDate) {
134
163
  const d = date(inputDate);
@@ -144,13 +173,12 @@ function monthDays(inputDate) {
144
173
  return d.getDate();
145
174
  }
146
175
 
147
- // src/addMonth.ts
148
- function addMonth(inputDate, count = 1, dateOverflow = false) {
176
+ // src/handleDateOverflow.ts
177
+ function handleOverflow(inputDate, action, dateOverflow = false) {
149
178
  const d = date(inputDate);
150
179
  const dayOfMonth = d.getDate();
151
- if (!dateOverflow)
152
- d.setDate(1);
153
- d.setMonth(d.getMonth() + count);
180
+ if (!dateOverflow) d.setDate(1);
181
+ action(d);
154
182
  if (!dateOverflow) {
155
183
  const daysInMonth = monthDays(d);
156
184
  d.setDate(daysInMonth < dayOfMonth ? daysInMonth : dayOfMonth);
@@ -158,38 +186,63 @@ function addMonth(inputDate, count = 1, dateOverflow = false) {
158
186
  return d;
159
187
  }
160
188
 
161
- // src/addYear.ts
162
- function addYear(inputDate, count = 1, dateOverflow = false) {
163
- const d = date(inputDate);
164
- const dayOfMonth = d.getDate();
165
- if (!dateOverflow)
166
- d.setDate(1);
167
- d.setFullYear(d.getFullYear() + count);
168
- if (!dateOverflow) {
169
- const daysInMonth = monthDays(d);
170
- d.setDate(daysInMonth < dayOfMonth ? daysInMonth : dayOfMonth);
171
- }
172
- return d;
189
+ // src/addMonth.ts
190
+ function addMonth(inputDate, count = 1, dateOverflow = false) {
191
+ return handleOverflow(inputDate, (d) => d.setMonth(d.getMonth() + count), dateOverflow);
173
192
  }
174
193
 
175
- // src/addHour.ts
176
- function addHour(inputDate, count = 1) {
194
+ // src/addSecond.ts
195
+ function addSecond(inputDate, count = 1) {
177
196
  const d = date(inputDate);
178
- d.setHours(d.getHours() + count);
197
+ d.setSeconds(d.getSeconds() + count);
179
198
  return d;
180
199
  }
181
200
 
182
- // src/addMinute.ts
183
- function addMinute(inputDate, count = 1) {
184
- const d = date(inputDate);
185
- d.setMinutes(d.getMinutes() + count);
186
- return d;
201
+ // src/addYear.ts
202
+ function addYear(inputDate, count = 1, dateOverflow = false) {
203
+ return handleOverflow(
204
+ inputDate,
205
+ (d) => d.setFullYear(d.getFullYear() + count),
206
+ dateOverflow
207
+ );
187
208
  }
188
209
 
189
- // src/addSecond.ts
190
- function addSecond(inputDate, count = 1) {
191
- const d = date(inputDate);
192
- d.setSeconds(d.getSeconds() + count);
210
+ // src/add.ts
211
+ function add(inputDate, duration, dateOverflow = false) {
212
+ var _a, _b;
213
+ let d = date(inputDate);
214
+ const applyFixedUnits = () => {
215
+ if (duration.weeks) {
216
+ d = addDay(d, duration.weeks * 7);
217
+ }
218
+ if (duration.days) {
219
+ d = addDay(d, duration.days);
220
+ }
221
+ if (duration.hours) {
222
+ d = addHour(d, duration.hours);
223
+ }
224
+ if (duration.minutes) {
225
+ d = addMinute(d, duration.minutes);
226
+ }
227
+ if (duration.seconds) {
228
+ d = addSecond(d, duration.seconds);
229
+ }
230
+ if (duration.milliseconds) {
231
+ d = addMillisecond(d, duration.milliseconds);
232
+ }
233
+ };
234
+ const applyCalendarUnits = () => {
235
+ if (duration.months) {
236
+ d = addMonth(d, duration.months, dateOverflow);
237
+ }
238
+ if (duration.years) {
239
+ d = addYear(d, duration.years, dateOverflow);
240
+ }
241
+ };
242
+ const calendarFirst = ((_a = duration.months) != null ? _a : 0) < 0 || ((_b = duration.years) != null ? _b : 0) < 0;
243
+ if (calendarFirst) applyCalendarUnits();
244
+ applyFixedUnits();
245
+ if (!calendarFirst) applyCalendarUnits();
193
246
  return d;
194
247
  }
195
248
 
@@ -225,6 +278,9 @@ var clock12 = [
225
278
  ["a", { dayPeriod: "narrow" }],
226
279
  ["A", { dayPeriod: "narrow" }]
227
280
  ];
281
+ var fractionalSeconds = [
282
+ ["SSS", { fractionalSecond: "3-digit" }]
283
+ ];
228
284
  var fixedLength = {
229
285
  DD: 2,
230
286
  HH: 2,
@@ -236,6 +292,12 @@ var fixedLength = {
236
292
  ss: 2
237
293
  };
238
294
  function fixedLengthByOffset(offsetString) {
295
+ if (/^[+-]\d{2}:\d{2}:\d{2}/.test(offsetString)) {
296
+ return 9;
297
+ }
298
+ if (/^[+-]\d{6}/.test(offsetString)) {
299
+ return 8;
300
+ }
239
301
  if (/^[+-]\d{2}:\d{2}/.test(offsetString)) {
240
302
  return 6;
241
303
  }
@@ -246,17 +308,12 @@ function fixedLengthByOffset(offsetString) {
246
308
  }
247
309
  var genitiveTokens = ["MMMM", "MMM", "dddd", "ddd"];
248
310
  var tokens = /* @__PURE__ */ new Map(
249
- /* @__PURE__ */ [...clockAgnostic, ...clock24, ...clock12].map((format2) => {
311
+ /* @__PURE__ */ [...clockAgnostic, ...clock24, ...clock12, ...fractionalSeconds].map((format2) => {
250
312
  return [format2[0], format2];
251
313
  })
252
314
  );
253
315
  var dayPeriodMap = /* @__PURE__ */ new Map();
254
- var styles = [
255
- "full",
256
- "long",
257
- "medium",
258
- "short"
259
- ];
316
+ var styles = ["full", "long", "medium", "short"];
260
317
  var two = (n) => String(n).padStart(2, "0");
261
318
  var four = (n) => String(n).padStart(2, "0");
262
319
  function normStr(part) {
@@ -269,8 +326,7 @@ function fill(inputDate, parts2, locale, genitive = false, offset2 = null) {
269
326
  const partMap = createPartMap(inputDate, parts2, locale, genitive);
270
327
  const d = date(inputDate);
271
328
  function value({ partName, partValue, token }) {
272
- if (partName === "literal")
273
- return partValue;
329
+ if (partName === "literal") return partValue;
274
330
  const value2 = partMap[partName];
275
331
  if (partName === "hour" && token === "H") {
276
332
  return value2.replace(/^0/, "") || "0";
@@ -282,6 +338,9 @@ function fill(inputDate, parts2, locale, genitive = false, offset2 = null) {
282
338
  const p = ap(d.getUTCHours() < 12 ? "am" : "pm", locale);
283
339
  return token === "A" ? p.toUpperCase() : p.toLowerCase();
284
340
  }
341
+ if (partName === "fractionalSecond") {
342
+ return String(d.getUTCMilliseconds()).padStart(3, "0");
343
+ }
285
344
  if (partName === "timeZoneName") {
286
345
  return offset2 != null ? offset2 : minsToOffset(-1 * d.getTimezoneOffset(), token);
287
346
  }
@@ -307,8 +366,7 @@ function createPartMap(inputDate, parts2, locale, genitive = false) {
307
366
  preciseLocale,
308
367
  requestedParts.reduce(
309
368
  (options, part) => {
310
- if (part.partName === "literal")
311
- return options;
369
+ if (part.partName === "literal") return options;
312
370
  if (genitive && genitiveTokens.includes(part.token)) {
313
371
  genitiveParts.push(part);
314
372
  }
@@ -335,9 +393,7 @@ function createPartMap(inputDate, parts2, locale, genitive = false) {
335
393
  }).formatToParts(d).map(normStr);
336
394
  break;
337
395
  }
338
- const genitiveFormattedPart = formattedParts.find(
339
- (p) => p.type === part.partName
340
- );
396
+ const genitiveFormattedPart = formattedParts.find((p) => p.type === part.partName);
341
397
  const index = valueParts.findIndex((p) => p.type === part.partName);
342
398
  if (genitiveFormattedPart && index > -1) {
343
399
  valueParts[index] = genitiveFormattedPart;
@@ -345,50 +401,48 @@ function createPartMap(inputDate, parts2, locale, genitive = false) {
345
401
  }
346
402
  }
347
403
  }
348
- if (hour12.length)
349
- addValues(hour12, true);
350
- if (hour24.length)
351
- addValues(hour24);
404
+ if (hour12.length) addValues(hour12, true);
405
+ if (hour24.length) addValues(hour24);
352
406
  return valueParts.reduce((map, part) => {
353
407
  map[part.type] = part.value;
354
408
  return map;
355
409
  }, {});
356
410
  }
357
- function minsToOffset(timeDiffInMins, token = "Z") {
358
- const hours = String(Math.floor(Math.abs(timeDiffInMins / 60))).padStart(
359
- 2,
360
- "0"
361
- );
362
- const mins = String(Math.abs(timeDiffInMins % 60)).padStart(2, "0");
363
- const sign = timeDiffInMins < 0 ? "-" : "+";
411
+ function secsToOffset(totalSecs, token = "Z") {
412
+ const sign = totalSecs < 0 ? "-" : "+";
413
+ const absSecs = Math.abs(totalSecs);
414
+ const hours = String(Math.floor(absSecs / 3600)).padStart(2, "0");
415
+ const mins = String(Math.floor(absSecs % 3600 / 60)).padStart(2, "0");
416
+ const secs = Math.round(absSecs % 60);
364
417
  if (token === "ZZ") {
365
- return `${sign}${hours}${mins}`;
418
+ return secs === 0 ? `${sign}${hours}${mins}` : `${sign}${hours}${mins}${String(secs).padStart(2, "0")}`;
366
419
  }
367
- return `${sign}${hours}:${mins}`;
420
+ return secs === 0 ? `${sign}${hours}:${mins}` : `${sign}${hours}:${mins}:${String(secs).padStart(2, "0")}`;
421
+ }
422
+ function minsToOffset(timeDiffInMins, token = "Z") {
423
+ return secsToOffset(timeDiffInMins * 60, token);
368
424
  }
369
- function offsetToMins(offset2, token) {
425
+ function offsetToSecs(offset2, token) {
370
426
  validOffset(offset2, token);
371
- const [_, sign, hours, mins] = offset2.match(
372
- /([+-])([0-3][0-9]):?([0-6][0-9])/
373
- );
374
- const offsetInMins = Number(hours) * 60 + Number(mins);
375
- return sign === "+" ? offsetInMins : -offsetInMins;
427
+ const match = offset2.match(/([+-])([0-3][0-9]):?([0-5][0-9])(?::?([0-5][0-9]))?/);
428
+ const [_, sign, hours, mins, secs = "0"] = match;
429
+ const totalSecs = Number(hours) * 3600 + Number(mins) * 60 + Number(secs);
430
+ return sign === "+" ? totalSecs : -totalSecs;
376
431
  }
377
432
  function validOffset(offset2, token = "Z") {
378
433
  const valid = ((token2) => {
379
434
  switch (token2) {
380
435
  case "Z":
381
- return /^([+-])[0-3][0-9]:[0-6][0-9]$/.test(offset2);
436
+ return /^([+-])[0-3][0-9]:[0-5][0-9](?::[0-5][0-9])?$/.test(offset2);
382
437
  case "ZZ":
383
- return /^([+-])[0-3][0-9][0-6][0-9]$/.test(offset2);
438
+ return /^([+-])[0-3][0-9][0-5][0-9](?:[0-5][0-9])?$/.test(offset2);
384
439
  }
385
440
  })(token);
386
- if (!valid)
387
- throw new Error(`Invalid offset: ${offset2}`);
441
+ if (!valid) throw new Error(`Invalid offset: ${offset2}`);
388
442
  return offset2;
389
443
  }
390
444
  function escapeTokens(str) {
391
- return clockAgnostic.concat(clock24).concat(clock12).sort((a, b) => a[0].length > b[0].length ? 1 : -1).reduce((target, part) => {
445
+ return clockAgnostic.concat(clock24).concat(clock12).concat(fractionalSeconds).sort((a, b) => a[0].length > b[0].length ? 1 : -1).reduce((target, part) => {
392
446
  return target.replace(part[0], `\\${part[0]}`);
393
447
  }, str);
394
448
  }
@@ -402,10 +456,8 @@ function validate(parts2) {
402
456
  throw new Error(`Numbers in format (${part.partValue}).`);
403
457
  }
404
458
  if (lastPart && lastPart.partName !== "literal" && part.partName !== "literal") {
405
- if (!(lastPart.token in fixedLength) && !(part.token in fixedLength) && !(isNumeric(lastPart) && part.token.toLowerCase() === "a")) {
406
- throw new Error(
407
- `Illegal adjacent tokens (${lastPart.token}, ${part.token})`
408
- );
459
+ if (!(lastPart.token in fixedLength) && !(part.token in fixedLength) && !(isNumeric(lastPart) && part.token.toLowerCase() === "a") && lastPart.token !== "SSS") {
460
+ throw new Error(`Illegal adjacent tokens (${lastPart.token}, ${part.token})`);
409
461
  }
410
462
  }
411
463
  lastPart = part;
@@ -422,8 +474,7 @@ function getOffsetFormat(format2) {
422
474
  // src/ap.ts
423
475
  function ap(ampm, locale) {
424
476
  const l = dayPeriodMap.get(locale);
425
- if (l && l[ampm])
426
- return l[ampm];
477
+ if (l && l[ampm]) return l[ampm];
427
478
  const specimen = new Date(specDate);
428
479
  specimen.setUTCHours(ampm === "am" ? 5 : 20);
429
480
  const subparts = new Intl.DateTimeFormat(locale, {
@@ -446,16 +497,10 @@ function ap(ampm, locale) {
446
497
  // src/applyOffset.ts
447
498
  function applyOffset(dateInput, offset2 = "+00:00") {
448
499
  const d = date(dateInput);
449
- const token = (() => {
450
- switch (fixedLengthByOffset(offset2)) {
451
- case 5:
452
- return "ZZ";
453
- case 6:
454
- return "Z";
455
- }
456
- })();
457
- const timeDiffInMins = offsetToMins(offset2, token);
458
- return new Date(d.getTime() + timeDiffInMins * 1e3 * 60);
500
+ const len = fixedLengthByOffset(offset2);
501
+ const token = len === 5 || len === 8 ? "ZZ" : "Z";
502
+ const timeDiffInSecs = offsetToSecs(offset2, token);
503
+ return new Date(d.getTime() + timeDiffInSecs * 1e3);
459
504
  }
460
505
 
461
506
  // src/deviceTZ.ts
@@ -466,22 +511,24 @@ function deviceTZ() {
466
511
  // src/offset.ts
467
512
  function relativeTime(d, timeZone) {
468
513
  const utcParts = new Intl.DateTimeFormat("en-US", {
514
+ era: "short",
469
515
  year: "numeric",
470
- month: "2-digit",
471
- day: "2-digit",
472
- hour: "2-digit",
473
- minute: "2-digit",
474
- second: "2-digit",
516
+ month: "numeric",
517
+ day: "numeric",
518
+ hour: "numeric",
519
+ minute: "numeric",
520
+ second: "numeric",
475
521
  timeZone,
476
522
  hourCycle: "h23"
477
- }).formatToParts(d).map(normStr);
478
- const parts2 = {};
523
+ }).formatToParts(d);
524
+ const p = {};
479
525
  utcParts.forEach((part) => {
480
- parts2[part.type] = part.value;
526
+ if (part.type !== "literal") p[part.type] = part.value;
481
527
  });
482
- return /* @__PURE__ */ new Date(
483
- `${parts2.year}-${parts2.month}-${parts2.day}T${parts2.hour}:${parts2.minute}:${parts2.second}Z`
484
- );
528
+ const year = p.era === "BC" ? 1 - Number(p.year) : Number(p.year);
529
+ const result = new Date(Date.UTC(0, 0, 1, Number(p.hour), Number(p.minute), Number(p.second)));
530
+ result.setUTCFullYear(year, Number(p.month) - 1, Number(p.day));
531
+ return result;
485
532
  }
486
533
  function offset(utcTime, tzA = "UTC", tzB = "device", timeZoneToken = "Z") {
487
534
  var _a;
@@ -489,10 +536,8 @@ function offset(utcTime, tzA = "UTC", tzB = "device", timeZoneToken = "Z") {
489
536
  const d = date(utcTime);
490
537
  const timeA = relativeTime(d, tzA);
491
538
  const timeB = relativeTime(d, tzB);
492
- const timeDiffInMins = Math.round(
493
- (timeB.getTime() - timeA.getTime()) / 1e3 / 60
494
- );
495
- return minsToOffset(timeDiffInMins, timeZoneToken);
539
+ const timeDiffInSecs = Math.round((timeB.getTime() - timeA.getTime()) / 1e3);
540
+ return secsToOffset(timeDiffInSecs, timeZoneToken);
496
541
  }
497
542
 
498
543
  // src/tzDate.ts
@@ -519,7 +564,7 @@ function dayEnd(inputDate) {
519
564
  // src/dayStart.ts
520
565
  function dayStart(inputDate) {
521
566
  const d = date(inputDate);
522
- d.setHours(0, 0, 0);
567
+ d.setHours(0, 0, 0, 0);
523
568
  return d;
524
569
  }
525
570
 
@@ -531,13 +576,11 @@ function parts(format2, locale) {
531
576
  let f = format2;
532
577
  let match = 0;
533
578
  const testPattern = (pattern) => {
534
- if (!pattern[2])
535
- pattern[2] = new RegExp(`(.)?(${pattern[0]})`, "g");
579
+ if (!pattern[2]) pattern[2] = new RegExp(`(.)?(${pattern[0]})`, "g");
536
580
  if (pattern[2].test(f)) {
537
581
  let didAdd = 0;
538
582
  f = f.replace(pattern[2], (_, prefix, actualMatch) => {
539
- if (prefix === "\\")
540
- return actualMatch;
583
+ if (prefix === "\\") return actualMatch;
541
584
  return `${typeof prefix === "string" ? prefix : ""}{!${didAdd++ ? match : match++}!}`;
542
585
  });
543
586
  return !!didAdd;
@@ -564,7 +607,7 @@ function parts(format2, locale) {
564
607
  hour12
565
608
  };
566
609
  }
567
- const found24Patterns = clockAgnostic.filter(testPattern).concat(clock24.filter(testPattern)).map(createPart.bind(null, false));
610
+ const found24Patterns = clockAgnostic.filter(testPattern).concat(clock24.filter(testPattern)).concat(fractionalSeconds.filter(testPattern)).map(createPart.bind(null, false));
568
611
  const parts2 = validate2(
569
612
  found24Patterns.concat(
570
613
  clock12.filter(testPattern).map(createPart.bind(null, true))
@@ -593,10 +636,8 @@ function styleParts(format2, locale) {
593
636
  if (typeof format2 === "string") {
594
637
  options.dateStyle = format2;
595
638
  } else {
596
- if ("date" in format2)
597
- options.dateStyle = format2.date;
598
- if ("time" in format2)
599
- options.timeStyle = format2.time;
639
+ if ("date" in format2) options.dateStyle = format2.date;
640
+ if ("time" in format2) options.timeStyle = format2.time;
600
641
  }
601
642
  const formatter = new Intl.DateTimeFormat(locale, options);
602
643
  const segments = formatter.formatToParts(new Date(specDate)).map(normStr);
@@ -612,11 +653,9 @@ function styleParts(format2, locale) {
612
653
  part.type === "hour" ? hourType : void 0,
613
654
  options
614
655
  );
615
- if (formatPattern === void 0)
616
- return;
656
+ if (formatPattern === void 0) return;
617
657
  const partValue = formatPattern[1][partName];
618
- if (!partValue)
619
- return;
658
+ if (!partValue) return;
620
659
  if (!formatPattern[2])
621
660
  formatPattern[2] = new RegExp(`${formatPattern[0]}`, "g");
622
661
  return {
@@ -637,8 +676,7 @@ function guessPattern(partName, partValue, locale, hour, options) {
637
676
  case "year":
638
677
  return l === 2 ? tokens.get("YY") : tokens.get("YYYY");
639
678
  case "month":
640
- if (n)
641
- return l === 1 ? tokens.get("M") : tokens.get("MM");
679
+ if (n) return l === 1 ? tokens.get("M") : tokens.get("MM");
642
680
  style = partStyle(locale, partName, partValue);
643
681
  switch (style) {
644
682
  case "long":
@@ -659,8 +697,7 @@ function guessPattern(partName, partValue, locale, hour, options) {
659
697
  return tokens.get("dddd");
660
698
  }
661
699
  case "hour":
662
- if (hour === 12)
663
- return l === 1 ? tokens.get("h") : tokens.get("hh");
700
+ if (hour === 12) return l === 1 ? tokens.get("h") : tokens.get("hh");
664
701
  return l === 1 ? tokens.get("H") : tokens.get("HH");
665
702
  case "minute":
666
703
  return l === 1 ? tokens.get("m") : tokens.get("mm");
@@ -685,8 +722,7 @@ function partStyle(locale, part, value) {
685
722
  const formats2 = {};
686
723
  for (let i = 0; i < 12; i++) {
687
724
  date2.setMonth(0 + i);
688
- if (i in weekdays)
689
- date2.setDate(weekdays[i]);
725
+ if (i in weekdays) date2.setDate(weekdays[i]);
690
726
  date2.setUTCHours(8 + i);
691
727
  for (const style of partStyles) {
692
728
  const segments = new Intl.DateTimeFormat(
@@ -705,12 +741,10 @@ function partStyle(locale, part, value) {
705
741
  (part2) => part2.type === "month"
706
742
  );
707
743
  const index = segments.findIndex((part2) => part2.type === "month");
708
- if (index > -1 && genitiveMonth)
709
- segments[index] = genitiveMonth;
744
+ if (index > -1 && genitiveMonth) segments[index] = genitiveMonth;
710
745
  }
711
746
  segments.forEach((part2) => {
712
- if (part2.type === "literal")
713
- return;
747
+ if (part2.type === "literal") return;
714
748
  const type = part2.type;
715
749
  formats2[type] = Object.assign(formats2[type] || {}, {
716
750
  [part2.value]: style
@@ -752,8 +786,7 @@ function format(inputDateOrOptions, format2 = "long", locale = "device", genitiv
752
786
  tz
753
787
  } = inputDateOrOptions);
754
788
  }
755
- if (format2 === "ISO8601")
756
- return date(inputDateOrOptions).toISOString();
789
+ if (format2 === "ISO8601") return date(inputDateOrOptions).toISOString();
757
790
  if (tz) {
758
791
  forceOffset = offset(inputDateOrOptions, "utc", tz, getOffsetFormat(format2));
759
792
  }
@@ -769,7 +802,7 @@ function format(inputDateOrOptions, format2 = "long", locale = "device", genitiv
769
802
  }
770
803
  return fill(
771
804
  inputDateOrOptions,
772
- parts(format2, locale).filter(partFilter != null ? partFilter : () => true),
805
+ parts(format2, locale).filter(partFilter != null ? partFilter : (() => true)),
773
806
  locale,
774
807
  genitive,
775
808
  forceOffset
@@ -803,7 +836,7 @@ function hourEnd(inputDate) {
803
836
  // src/hourStart.ts
804
837
  function hourStart(inputDate) {
805
838
  const d = date(inputDate);
806
- d.setMinutes(0, 0);
839
+ d.setMinutes(0, 0, 0);
807
840
  return d;
808
841
  }
809
842
 
@@ -817,7 +850,7 @@ function minuteEnd(inputDate) {
817
850
  // src/minuteStart.ts
818
851
  function minuteStart(inputDate) {
819
852
  const d = date(inputDate);
820
- d.setSeconds(0);
853
+ d.setSeconds(0, 0);
821
854
  return d;
822
855
  }
823
856
 
@@ -825,7 +858,7 @@ function minuteStart(inputDate) {
825
858
  function monthStart(inputDate) {
826
859
  const d = date(inputDate);
827
860
  d.setDate(1);
828
- d.setHours(0, 0, 0);
861
+ d.setHours(0, 0, 0, 0);
829
862
  return d;
830
863
  }
831
864
 
@@ -861,13 +894,11 @@ function nearestDay(inputDate, search, constraint = 7) {
861
894
  for (let i = 0; i <= increments || i < decrements; i++) {
862
895
  if (i <= increments) {
863
896
  const next = addDay(d, i);
864
- if (search(next))
865
- return next;
897
+ if (search(next)) return next;
866
898
  }
867
899
  if (i && i <= decrements) {
868
900
  const prev = addDay(d, -i);
869
- if (search(prev))
870
- return prev;
901
+ if (search(prev)) return prev;
871
902
  }
872
903
  }
873
904
  return null;
@@ -876,8 +907,7 @@ function nearestDay(inputDate, search, constraint = 7) {
876
907
  // src/range.ts
877
908
  function range(token, locale = "en", genitive = false) {
878
909
  const r = (n, c) => Array(n).fill("").map((_, i) => `${c(i)}`);
879
- if (token === "M")
880
- return r(12, (i) => i + 1);
910
+ if (token === "M") return r(12, (i) => i + 1);
881
911
  if (token === "MM")
882
912
  return r(12, (i) => {
883
913
  const m = i + 1;
@@ -935,19 +965,16 @@ function parse(dateStrOrOptions, format2 = "ISO8601", locale = "device") {
935
965
  } else {
936
966
  dateStr = dateStrOrOptions;
937
967
  }
938
- if (!dateStr)
939
- throw new Error("parse() requires a date string.");
968
+ if (!dateStr) throw new Error("parse() requires a date string.");
940
969
  const invalid = () => {
941
970
  throw new Error(
942
971
  `Date (${dateStr}) does not match format (${formatStr(format2, locale)})`
943
972
  );
944
973
  };
945
- if (format2 === "ISO8601")
946
- return date(dateStr);
974
+ if (format2 === "ISO8601") return date(dateStr);
947
975
  const genitive = styles.includes(format2) || typeof format2 === "object";
948
976
  const formatParts = validate(parts(format2, locale).filter(partFilter));
949
- if (!formatParts.length)
950
- throw new Error("parse() requires a pattern.");
977
+ if (!formatParts.length) throw new Error("parse() requires a pattern.");
951
978
  let parsedParts;
952
979
  try {
953
980
  parsedParts = parseParts(dateStr, formatParts);
@@ -961,17 +988,19 @@ function parse(dateStrOrOptions, format2 = "ISO8601", locale = "device") {
961
988
  ["DD", now.getDate()],
962
989
  ["HH", 0],
963
990
  ["mm", 0],
964
- ["ss", 0]
991
+ ["ss", 0],
992
+ ["SSS", 0]
965
993
  ]);
966
994
  let a = null;
967
995
  let offset2 = "";
968
996
  parsedParts.forEach((part) => {
969
- if (part.partName === "literal")
970
- return;
971
- if (part.token === part.value)
972
- return invalid();
997
+ if (part.partName === "literal") return;
998
+ if (part.token === part.value) return invalid();
973
999
  const v = Number(part.value);
974
- if (parsed.has(part.token)) {
1000
+ if (part.token === "SSS") {
1001
+ const digits = part.value.padEnd(3, "0").slice(0, 3);
1002
+ parsed.set("SSS", Number(digits));
1003
+ } else if (parsed.has(part.token)) {
975
1004
  parsed.set(part.token, v);
976
1005
  } else if (part.token === "YY") {
977
1006
  parsed.set("YYYY", fourDigitYear(part.value));
@@ -1011,17 +1040,24 @@ function parse(dateStrOrOptions, format2 = "ISO8601", locale = "device") {
1011
1040
  parsed.set("HH", 0);
1012
1041
  }
1013
1042
  parsed.set("MM", (parsed.get("MM") || 1) - 1);
1014
- let [Y, M, D, h, m, s] = Array.from(parsed.values());
1043
+ let [Y, M, D, h, m, s, ms] = Array.from(parsed.values());
1015
1044
  const maxDaysInMonth = monthDays(/* @__PURE__ */ new Date(`${four(Y)}-${two(M + 1)}-10`));
1016
1045
  if (maxDaysInMonth < D && dateOverflow === "throw")
1017
1046
  throw new Error(`Invalid date ${four(Y)}-${two(M + 1)}-${two(D)}`);
1018
1047
  D = dateOverflow === "backward" ? Math.min(D, maxDaysInMonth) : D;
1019
- const isoString = `${four(Y)}-${two(M + 1)}-${two(D)}T${two(h)}:${two(
1020
- m
1021
- )}:${two(s)}${offset2}`;
1048
+ const msStr = String(ms).padStart(3, "0");
1049
+ if (offset2) {
1050
+ const isoStringUtc = `${four(Y)}-${two(M + 1)}-${two(D)}T${two(h)}:${two(m)}:${two(s)}.${msStr}Z`;
1051
+ const d2 = new Date(isoStringUtc);
1052
+ if (!isFinite(+d2)) return invalid();
1053
+ const len = fixedLengthByOffset(offset2);
1054
+ const token = len === 5 || len === 8 ? "ZZ" : "Z";
1055
+ const offsetSecs = offsetToSecs(offset2, token);
1056
+ return new Date(d2.getTime() - offsetSecs * 1e3);
1057
+ }
1058
+ const isoString = `${four(Y)}-${two(M + 1)}-${two(D)}T${two(h)}:${two(m)}:${two(s)}.${msStr}`;
1022
1059
  const d = new Date(isoString);
1023
- if (isFinite(+d))
1024
- return d;
1060
+ if (isFinite(+d)) return d;
1025
1061
  return invalid();
1026
1062
  }
1027
1063
  function parseParts(dateStr, formatParts) {
@@ -1041,13 +1077,18 @@ function parseParts(dateStr, formatParts) {
1041
1077
  len = current.partValue.length;
1042
1078
  } else if (current.partName === "timeZoneName") {
1043
1079
  len = fixedLengthByOffset(dateStr.substring(pos));
1080
+ } else if (current.token === "SSS") {
1081
+ let end = pos;
1082
+ while (end < dateStr.length && /\d/.test(dateStr.charAt(end))) {
1083
+ end++;
1084
+ }
1085
+ len = end - pos;
1044
1086
  } else if (current.token in fixedLength) {
1045
1087
  len = fixedLength[current.token];
1046
1088
  } else if (next) {
1047
1089
  if (next.partName === "literal") {
1048
1090
  len = dateStr.indexOf(next.partValue, pos) - pos;
1049
- if (len < 0)
1050
- throw new Error();
1091
+ if (len < 0) throw new Error();
1051
1092
  } else if (next.partName === "dayPeriod") {
1052
1093
  for (let i2 = 1; i2 <= 4; i2++) {
1053
1094
  if (isNaN(Number(dateStr.charAt(pos + i2)))) {
@@ -1057,8 +1098,7 @@ function parseParts(dateStr, formatParts) {
1057
1098
  }
1058
1099
  } else {
1059
1100
  const nextChar = dateStr.substring(pos).search(/\d/);
1060
- if (nextChar !== -1)
1061
- len = pos + nextChar;
1101
+ if (nextChar !== -1) len = pos + nextChar;
1062
1102
  }
1063
1103
  } else {
1064
1104
  len = dateStr.length;
@@ -1083,6 +1123,13 @@ function sameSecond(inputDateA, inputDateB) {
1083
1123
  return a.getSeconds() === b.getSeconds();
1084
1124
  }
1085
1125
 
1126
+ // src/sameMillisecond.ts
1127
+ function sameMillisecond(inputDateA, inputDateB) {
1128
+ const a = date(inputDateA);
1129
+ const b = date(inputDateB);
1130
+ return a.getMilliseconds() === b.getMilliseconds();
1131
+ }
1132
+
1086
1133
  // src/sameMinute.ts
1087
1134
  function sameMinute(inputDateA, inputDateB) {
1088
1135
  const a = date(inputDateA);
@@ -1104,14 +1151,62 @@ function sameYear(inputDateA, inputDateB) {
1104
1151
  return a.getFullYear() === b.getFullYear();
1105
1152
  }
1106
1153
 
1154
+ // src/setMilliseconds.ts
1155
+ function setMilliseconds(inputDate, ms) {
1156
+ const d = date(inputDate);
1157
+ d.setMilliseconds(ms);
1158
+ return d;
1159
+ }
1160
+
1161
+ // src/setSeconds.ts
1162
+ function setSeconds(inputDate, second) {
1163
+ const d = date(inputDate);
1164
+ d.setSeconds(second);
1165
+ return d;
1166
+ }
1167
+
1168
+ // src/setMinutes.ts
1169
+ function setMinutes(inputDate, minute) {
1170
+ const d = date(inputDate);
1171
+ d.setMinutes(minute);
1172
+ return d;
1173
+ }
1174
+
1175
+ // src/setHour.ts
1176
+ function setHour(inputDate, hour) {
1177
+ const d = date(inputDate);
1178
+ d.setHours(hour);
1179
+ return d;
1180
+ }
1181
+
1182
+ // src/setDayOfMonth.ts
1183
+ function setDayOfMonth(inputDate, day, dateOverflow = false) {
1184
+ const d = date(inputDate);
1185
+ const daysInMonth = monthDays(d);
1186
+ if (!dateOverflow) {
1187
+ day = day > daysInMonth ? daysInMonth : day;
1188
+ }
1189
+ d.setDate(day);
1190
+ return d;
1191
+ }
1192
+
1193
+ // src/setMonth.ts
1194
+ function setMonth(inputDate, month, dateOverflow = false) {
1195
+ return handleOverflow(inputDate, (d) => d.setMonth(month), dateOverflow);
1196
+ }
1197
+
1198
+ // src/setYear.ts
1199
+ function setYear(inputDate, year, dateOverflow = false) {
1200
+ return handleOverflow(inputDate, (d) => d.setFullYear(year), dateOverflow);
1201
+ }
1202
+
1107
1203
  // src/weekStart.ts
1108
1204
  function weekStart(inputDate, startOfWeekDay = 0) {
1109
1205
  const d = date(inputDate);
1110
- let diff = startOfWeekDay - d.getDay();
1111
- if (diff > 0)
1112
- diff = diff - 7;
1113
- d.setDate(d.getDate() + diff);
1114
- d.setHours(0, 0, 0);
1206
+ let diff2 = startOfWeekDay - d.getDay();
1207
+ if (diff2 > 0) diff2 = diff2 - 7;
1208
+ d.setDate(d.getDate() + diff2);
1209
+ d.setHours(0, 0, 0, 0);
1115
1210
  return d;
1116
1211
  }
1117
1212
 
@@ -1119,24 +1214,22 @@ function weekStart(inputDate, startOfWeekDay = 0) {
1119
1214
  function weekEnd(inputDate, startOfWeekDay = 0) {
1120
1215
  const d = weekStart(inputDate, startOfWeekDay);
1121
1216
  d.setDate(d.getDate() + 6);
1122
- d.setHours(23, 59, 59);
1217
+ d.setHours(23, 59, 59, 999);
1123
1218
  return d;
1124
1219
  }
1125
1220
 
1126
1221
  // src/yearStart.ts
1127
1222
  function yearStart(inputDate) {
1128
1223
  const d = date(inputDate);
1129
- d.setMonth(0);
1130
- d.setDate(1);
1131
- d.setHours(0, 0, 0);
1224
+ d.setMonth(0, 1);
1225
+ d.setHours(0, 0, 0, 0);
1132
1226
  return d;
1133
1227
  }
1134
1228
 
1135
1229
  // src/yearEnd.ts
1136
1230
  function yearEnd(inputDate) {
1137
1231
  const d = date(inputDate);
1138
- d.setMonth(11);
1139
- d.setDate(31);
1232
+ d.setMonth(11, 31);
1140
1233
  d.setHours(23, 59, 59, 999);
1141
1234
  return d;
1142
1235
  }
@@ -1162,6 +1255,16 @@ function isEqual(dateLeft, dateRight) {
1162
1255
  return +_dateLeft === +_dateRight;
1163
1256
  }
1164
1257
 
1258
+ // src/isPast.ts
1259
+ function isPast(inputDate) {
1260
+ return isBefore(inputDate);
1261
+ }
1262
+
1263
+ // src/isFuture.ts
1264
+ function isFuture(inputDate) {
1265
+ return isAfter(inputDate);
1266
+ }
1267
+
1165
1268
  // src/diffMilliseconds.ts
1166
1269
  function diffMilliseconds(dateA, dateB) {
1167
1270
  const left = date(dateA);
@@ -1177,17 +1280,26 @@ function diffRound(value, method = "trunc") {
1177
1280
 
1178
1281
  // src/diffSeconds.ts
1179
1282
  function diffSeconds(dateA, dateB, roundingMethod) {
1180
- return diffRound(diffMilliseconds(dateA, dateB) / 1e3, roundingMethod);
1283
+ return diffRound(
1284
+ // @ts-ignore
1285
+ diffMilliseconds(dateA, dateB) / 1e3,
1286
+ roundingMethod
1287
+ );
1181
1288
  }
1182
1289
 
1183
1290
  // src/diffMinutes.ts
1184
1291
  function diffMinutes(dateA, dateB, roundingMethod) {
1185
- return diffRound(diffMilliseconds(dateA, dateB) / 6e4, roundingMethod);
1292
+ return diffRound(
1293
+ //@ts-ignore
1294
+ diffMilliseconds(dateA, dateB) / 6e4,
1295
+ roundingMethod
1296
+ );
1186
1297
  }
1187
1298
 
1188
1299
  // src/diffHours.ts
1189
1300
  function diffHours(dateA, dateB, roundingMethod) {
1190
1301
  return diffRound(
1302
+ //@ts-ignore
1191
1303
  diffMilliseconds(dateA, dateB) / 36e5,
1192
1304
  // 1000 * 60 * 60
1193
1305
  roundingMethod
@@ -1197,6 +1309,7 @@ function diffHours(dateA, dateB, roundingMethod) {
1197
1309
  // src/diffDays.ts
1198
1310
  function diffDays(dateA, dateB, roundingMethod) {
1199
1311
  return diffRound(
1312
+ // @ts-ignore
1200
1313
  diffMilliseconds(dateA, dateB) / 864e5,
1201
1314
  // hour * 24
1202
1315
  roundingMethod
@@ -1234,13 +1347,86 @@ function diffMonths(dateA, dateB) {
1234
1347
 
1235
1348
  // src/diffYears.ts
1236
1349
  function diffYears(dateA, dateB) {
1237
- const r = Math.trunc(diffMonths(dateA, dateB) / 12);
1350
+ const r = Math.trunc(
1351
+ //@ts-ignore
1352
+ diffMonths(dateA, dateB) / 12
1353
+ );
1238
1354
  return r == 0 ? 0 : r;
1239
1355
  }
1356
+
1357
+ // src/diff.ts
1358
+ function negateDuration(duration) {
1359
+ const negated = {};
1360
+ for (const unit of Object.keys(duration)) {
1361
+ negated[unit] = -duration[unit];
1362
+ }
1363
+ return negated;
1364
+ }
1365
+ function calendarDiff(current, target, diffUnit, addUnit) {
1366
+ let amount = diffUnit(current, target);
1367
+ let next = addUnit(current, -amount);
1368
+ while (amount > 0 && next < target) {
1369
+ amount--;
1370
+ next = addUnit(current, -amount);
1371
+ }
1372
+ return [amount, next];
1373
+ }
1374
+ function diff(dateA, dateB, options) {
1375
+ let a = date(dateA);
1376
+ let b = date(dateB);
1377
+ if (a < b) {
1378
+ const duration2 = diff(b, a, options);
1379
+ return (options == null ? void 0 : options.abs) ? duration2 : negateDuration(duration2);
1380
+ }
1381
+ const skip = new Set(options == null ? void 0 : options.skip);
1382
+ const duration = {};
1383
+ if (!skip.has("years")) {
1384
+ const [years, next] = calendarDiff(a, b, diffYears, addYear);
1385
+ a = next;
1386
+ if (years) duration.years = years;
1387
+ }
1388
+ if (!skip.has("months")) {
1389
+ const [months, next] = calendarDiff(a, b, diffMonths, addMonth);
1390
+ a = next;
1391
+ if (months) duration.months = months;
1392
+ }
1393
+ if (!skip.has("weeks")) {
1394
+ const weeks = diffWeeks(a, b);
1395
+ a = addDay(a, -(weeks * 7));
1396
+ if (weeks) duration.weeks = weeks;
1397
+ }
1398
+ if (!skip.has("days")) {
1399
+ const days = diffDays(a, b);
1400
+ a = addDay(a, -days);
1401
+ if (days) duration.days = days;
1402
+ }
1403
+ if (!skip.has("hours")) {
1404
+ const hours = diffHours(a, b);
1405
+ a = addHour(a, -hours);
1406
+ if (hours) duration.hours = hours;
1407
+ }
1408
+ if (!skip.has("minutes")) {
1409
+ const minutes = diffMinutes(a, b);
1410
+ a = addMinute(a, -minutes);
1411
+ if (minutes) duration.minutes = minutes;
1412
+ }
1413
+ if (!skip.has("seconds")) {
1414
+ const seconds = diffSeconds(a, b);
1415
+ a = addSecond(a, -seconds);
1416
+ if (seconds) duration.seconds = seconds;
1417
+ }
1418
+ if (!skip.has("milliseconds")) {
1419
+ const ms = diffMilliseconds(a, b);
1420
+ if (ms) duration.milliseconds = ms;
1421
+ }
1422
+ return duration;
1423
+ }
1240
1424
  // Annotate the CommonJS export names for ESM import in node:
1241
1425
  0 && (module.exports = {
1426
+ add,
1242
1427
  addDay,
1243
1428
  addHour,
1429
+ addMillisecond,
1244
1430
  addMinute,
1245
1431
  addMonth,
1246
1432
  addSecond,
@@ -1251,6 +1437,7 @@ function diffYears(dateA, dateB) {
1251
1437
  dayEnd,
1252
1438
  dayOfYear,
1253
1439
  dayStart,
1440
+ diff,
1254
1441
  diffDays,
1255
1442
  diffHours,
1256
1443
  diffMilliseconds,
@@ -1267,6 +1454,8 @@ function diffYears(dateA, dateB) {
1267
1454
  isAfter,
1268
1455
  isBefore,
1269
1456
  isEqual,
1457
+ isFuture,
1458
+ isPast,
1270
1459
  iso8601,
1271
1460
  minuteEnd,
1272
1461
  minuteStart,
@@ -1282,9 +1471,17 @@ function diffYears(dateA, dateB) {
1282
1471
  removeOffset,
1283
1472
  sameDay,
1284
1473
  sameHour,
1474
+ sameMillisecond,
1285
1475
  sameMinute,
1286
1476
  sameSecond,
1287
1477
  sameYear,
1478
+ setDayOfMonth,
1479
+ setHour,
1480
+ setMilliseconds,
1481
+ setMinutes,
1482
+ setMonth,
1483
+ setSeconds,
1484
+ setYear,
1288
1485
  tzDate,
1289
1486
  weekEnd,
1290
1487
  weekStart,