@formkit/tempo 0.1.1 → 1.0.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 (147) hide show
  1. package/dist/addDay.d.ts +4 -3
  2. package/dist/addDay.mjs.map +1 -1
  3. package/dist/addHour.d.ts +4 -3
  4. package/dist/addHour.mjs.map +1 -1
  5. package/dist/addMillisecond.d.ts +10 -0
  6. package/dist/addMillisecond.mjs +11 -0
  7. package/dist/addMillisecond.mjs.map +1 -0
  8. package/dist/addMinute.d.ts +5 -4
  9. package/dist/addMinute.mjs.map +1 -1
  10. package/dist/addMonth.d.ts +5 -5
  11. package/dist/addMonth.mjs +1 -2
  12. package/dist/addMonth.mjs.map +1 -1
  13. package/dist/addSecond.d.ts +4 -3
  14. package/dist/addSecond.mjs.map +1 -1
  15. package/dist/addYear.d.ts +5 -5
  16. package/dist/addYear.mjs +1 -2
  17. package/dist/addYear.mjs.map +1 -1
  18. package/dist/ap.mjs +1 -2
  19. package/dist/ap.mjs.map +1 -1
  20. package/dist/applyOffset.d.ts +5 -5
  21. package/dist/applyOffset.mjs +5 -11
  22. package/dist/applyOffset.mjs.map +1 -1
  23. package/dist/bundle.d.ts +256 -115
  24. package/dist/bundle.mjs +158 -140
  25. package/dist/bundle.mjs.map +1 -1
  26. package/dist/common.d.ts +27 -7
  27. package/dist/common.mjs +47 -42
  28. package/dist/common.mjs.map +1 -1
  29. package/dist/date.d.ts +2 -2
  30. package/dist/date.mjs +1 -3
  31. package/dist/date.mjs.map +1 -1
  32. package/dist/dayEnd.d.ts +3 -3
  33. package/dist/dayEnd.mjs.map +1 -1
  34. package/dist/dayOfYear.d.ts +3 -3
  35. package/dist/dayOfYear.mjs.map +1 -1
  36. package/dist/dayStart.d.ts +3 -3
  37. package/dist/dayStart.mjs +1 -1
  38. package/dist/dayStart.mjs.map +1 -1
  39. package/dist/diffDays.d.ts +12 -5
  40. package/dist/diffDays.mjs +1 -0
  41. package/dist/diffDays.mjs.map +1 -1
  42. package/dist/diffHours.d.ts +12 -5
  43. package/dist/diffHours.mjs +1 -0
  44. package/dist/diffHours.mjs.map +1 -1
  45. package/dist/diffMilliseconds.d.ts +10 -4
  46. package/dist/diffMilliseconds.mjs.map +1 -1
  47. package/dist/diffMinutes.d.ts +11 -3
  48. package/dist/diffMinutes.mjs +5 -1
  49. package/dist/diffMinutes.mjs.map +1 -1
  50. package/dist/diffMonths.d.ts +10 -4
  51. package/dist/diffMonths.mjs.map +1 -1
  52. package/dist/diffSeconds.d.ts +12 -5
  53. package/dist/diffSeconds.mjs +5 -1
  54. package/dist/diffSeconds.mjs.map +1 -1
  55. package/dist/diffWeeks.d.ts +10 -3
  56. package/dist/diffWeeks.mjs.map +1 -1
  57. package/dist/diffYears.d.ts +10 -4
  58. package/dist/diffYears.mjs +4 -1
  59. package/dist/diffYears.mjs.map +1 -1
  60. package/dist/format.mjs +2 -3
  61. package/dist/format.mjs.map +1 -1
  62. package/dist/hourEnd.d.ts +3 -3
  63. package/dist/hourEnd.mjs.map +1 -1
  64. package/dist/hourStart.d.ts +3 -3
  65. package/dist/hourStart.mjs +1 -1
  66. package/dist/hourStart.mjs.map +1 -1
  67. package/dist/index.cjs +165 -143
  68. package/dist/index.cjs.map +1 -1
  69. package/dist/index.d.cts +256 -115
  70. package/dist/index.d.ts +5 -1
  71. package/dist/index.mjs +8 -0
  72. package/dist/index.mjs.map +1 -1
  73. package/dist/isAfter.d.ts +6 -6
  74. package/dist/isAfter.mjs.map +1 -1
  75. package/dist/isBefore.d.ts +5 -5
  76. package/dist/isBefore.mjs.map +1 -1
  77. package/dist/isEqual.d.ts +13 -4
  78. package/dist/isEqual.mjs.map +1 -1
  79. package/dist/isFuture.d.ts +10 -0
  80. package/dist/isFuture.mjs +9 -0
  81. package/dist/isFuture.mjs.map +1 -0
  82. package/dist/isPast.d.ts +10 -0
  83. package/dist/isPast.mjs +9 -0
  84. package/dist/isPast.mjs.map +1 -0
  85. package/dist/iso8601.d.ts +1 -1
  86. package/dist/iso8601.mjs +4 -7
  87. package/dist/iso8601.mjs.map +1 -1
  88. package/dist/minuteEnd.d.ts +3 -3
  89. package/dist/minuteEnd.mjs.map +1 -1
  90. package/dist/minuteStart.d.ts +3 -3
  91. package/dist/minuteStart.mjs +1 -1
  92. package/dist/minuteStart.mjs.map +1 -1
  93. package/dist/monthDays.d.ts +3 -3
  94. package/dist/monthDays.mjs.map +1 -1
  95. package/dist/monthEnd.d.ts +3 -3
  96. package/dist/monthEnd.mjs.map +1 -1
  97. package/dist/monthStart.d.ts +3 -3
  98. package/dist/monthStart.mjs +1 -1
  99. package/dist/monthStart.mjs.map +1 -1
  100. package/dist/nearestDay.d.ts +3 -3
  101. package/dist/nearestDay.mjs +2 -4
  102. package/dist/nearestDay.mjs.map +1 -1
  103. package/dist/offset.d.ts +5 -5
  104. package/dist/offset.mjs +3 -3
  105. package/dist/offset.mjs.map +1 -1
  106. package/dist/parse.mjs +33 -23
  107. package/dist/parse.mjs.map +1 -1
  108. package/dist/parts.mjs +14 -24
  109. package/dist/parts.mjs.map +1 -1
  110. package/dist/range.mjs +1 -2
  111. package/dist/range.mjs.map +1 -1
  112. package/dist/removeOffset.d.ts +4 -4
  113. package/dist/removeOffset.mjs.map +1 -1
  114. package/dist/sameDay.d.ts +8 -2
  115. package/dist/sameDay.mjs.map +1 -1
  116. package/dist/sameHour.d.ts +8 -2
  117. package/dist/sameHour.mjs.map +1 -1
  118. package/dist/sameMillisecond.d.ts +16 -0
  119. package/dist/sameMillisecond.mjs +11 -0
  120. package/dist/sameMillisecond.mjs.map +1 -0
  121. package/dist/sameMinute.d.ts +8 -2
  122. package/dist/sameMinute.mjs.map +1 -1
  123. package/dist/sameMonth.d.ts +16 -0
  124. package/dist/sameMonth.mjs +11 -0
  125. package/dist/sameMonth.mjs.map +1 -0
  126. package/dist/sameSecond.d.ts +8 -2
  127. package/dist/sameSecond.mjs.map +1 -1
  128. package/dist/sameYear.d.ts +8 -2
  129. package/dist/sameYear.mjs.map +1 -1
  130. package/dist/types.d.ts +15 -7
  131. package/dist/tzDate.d.ts +5 -3
  132. package/dist/tzDate.mjs.map +1 -1
  133. package/dist/weekEnd.d.ts +4 -4
  134. package/dist/weekEnd.mjs +1 -1
  135. package/dist/weekEnd.mjs.map +1 -1
  136. package/dist/weekStart.d.ts +4 -4
  137. package/dist/weekStart.mjs +2 -3
  138. package/dist/weekStart.mjs.map +1 -1
  139. package/dist/yearDays.d.ts +3 -3
  140. package/dist/yearDays.mjs.map +1 -1
  141. package/dist/yearEnd.d.ts +3 -3
  142. package/dist/yearEnd.mjs +1 -2
  143. package/dist/yearEnd.mjs.map +1 -1
  144. package/dist/yearStart.d.ts +3 -3
  145. package/dist/yearStart.mjs +2 -3
  146. package/dist/yearStart.mjs.map +1 -1
  147. package/package.json +32 -23
package/dist/bundle.mjs CHANGED
@@ -1,20 +1,17 @@
1
1
  // src/iso8601.ts
2
- 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})?$/;
2
+ 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})?)?$/;
3
3
  function iso8601(date2) {
4
4
  const matches = date2.match(iso8601Match);
5
5
  if (matches) {
6
6
  const month = Number(matches[2]);
7
- if (month < 1 || month > 12)
8
- return false;
7
+ if (month < 1 || month > 12) return false;
9
8
  if (typeof matches[3] !== void 0) {
10
9
  const date3 = Number(matches[3]);
11
- if (date3 < 1 || date3 > 31)
12
- return false;
10
+ if (date3 < 1 || date3 > 31) return false;
13
11
  }
14
12
  if (typeof matches[4] !== void 0) {
15
13
  const hours = Number(matches[4]);
16
- if (hours < 0 || hours > 23)
17
- return false;
14
+ if (hours < 0 || hours > 23) return false;
18
15
  }
19
16
  return true;
20
17
  }
@@ -34,9 +31,7 @@ function date(date2) {
34
31
  date2 = /* @__PURE__ */ new Date();
35
32
  }
36
33
  if (date2 instanceof Date) {
37
- const d = new Date(date2);
38
- d.setMilliseconds(0);
39
- return d;
34
+ return new Date(date2);
40
35
  }
41
36
  date2 = date2.trim();
42
37
  if (iso8601(date2)) {
@@ -71,8 +66,7 @@ function monthDays(inputDate) {
71
66
  function addMonth(inputDate, count = 1, dateOverflow = false) {
72
67
  const d = date(inputDate);
73
68
  const dayOfMonth = d.getDate();
74
- if (!dateOverflow)
75
- d.setDate(1);
69
+ if (!dateOverflow) d.setDate(1);
76
70
  d.setMonth(d.getMonth() + count);
77
71
  if (!dateOverflow) {
78
72
  const daysInMonth = monthDays(d);
@@ -85,8 +79,7 @@ function addMonth(inputDate, count = 1, dateOverflow = false) {
85
79
  function addYear(inputDate, count = 1, dateOverflow = false) {
86
80
  const d = date(inputDate);
87
81
  const dayOfMonth = d.getDate();
88
- if (!dateOverflow)
89
- d.setDate(1);
82
+ if (!dateOverflow) d.setDate(1);
90
83
  d.setFullYear(d.getFullYear() + count);
91
84
  if (!dateOverflow) {
92
85
  const daysInMonth = monthDays(d);
@@ -116,6 +109,13 @@ function addSecond(inputDate, count = 1) {
116
109
  return d;
117
110
  }
118
111
 
112
+ // src/addMillisecond.ts
113
+ function addMillisecond(inputDate, count = 1) {
114
+ const d = date(inputDate);
115
+ d.setMilliseconds(d.getMilliseconds() + count);
116
+ return d;
117
+ }
118
+
119
119
  // src/common.ts
120
120
  var specDate = "1999-03-04T02:05:01.000Z";
121
121
  var memoParts = /* @__PURE__ */ new Map();
@@ -148,6 +148,9 @@ var clock12 = [
148
148
  ["a", { dayPeriod: "narrow" }],
149
149
  ["A", { dayPeriod: "narrow" }]
150
150
  ];
151
+ var fractionalSeconds = [
152
+ ["SSS", { fractionalSecond: "3-digit" }]
153
+ ];
151
154
  var fixedLength = {
152
155
  DD: 2,
153
156
  HH: 2,
@@ -159,6 +162,12 @@ var fixedLength = {
159
162
  ss: 2
160
163
  };
161
164
  function fixedLengthByOffset(offsetString) {
165
+ if (/^[+-]\d{2}:\d{2}:\d{2}/.test(offsetString)) {
166
+ return 9;
167
+ }
168
+ if (/^[+-]\d{6}/.test(offsetString)) {
169
+ return 8;
170
+ }
162
171
  if (/^[+-]\d{2}:\d{2}/.test(offsetString)) {
163
172
  return 6;
164
173
  }
@@ -169,17 +178,12 @@ function fixedLengthByOffset(offsetString) {
169
178
  }
170
179
  var genitiveTokens = ["MMMM", "MMM", "dddd", "ddd"];
171
180
  var tokens = /* @__PURE__ */ new Map(
172
- /* @__PURE__ */ [...clockAgnostic, ...clock24, ...clock12].map((format2) => {
181
+ /* @__PURE__ */ [...clockAgnostic, ...clock24, ...clock12, ...fractionalSeconds].map((format2) => {
173
182
  return [format2[0], format2];
174
183
  })
175
184
  );
176
185
  var dayPeriodMap = /* @__PURE__ */ new Map();
177
- var styles = [
178
- "full",
179
- "long",
180
- "medium",
181
- "short"
182
- ];
186
+ var styles = ["full", "long", "medium", "short"];
183
187
  var two = (n) => String(n).padStart(2, "0");
184
188
  var four = (n) => String(n).padStart(2, "0");
185
189
  function normStr(part) {
@@ -192,8 +196,7 @@ function fill(inputDate, parts2, locale, genitive = false, offset2 = null) {
192
196
  const partMap = createPartMap(inputDate, parts2, locale, genitive);
193
197
  const d = date(inputDate);
194
198
  function value({ partName, partValue, token }) {
195
- if (partName === "literal")
196
- return partValue;
199
+ if (partName === "literal") return partValue;
197
200
  const value2 = partMap[partName];
198
201
  if (partName === "hour" && token === "H") {
199
202
  return value2.replace(/^0/, "") || "0";
@@ -205,6 +208,9 @@ function fill(inputDate, parts2, locale, genitive = false, offset2 = null) {
205
208
  const p = ap(d.getUTCHours() < 12 ? "am" : "pm", locale);
206
209
  return token === "A" ? p.toUpperCase() : p.toLowerCase();
207
210
  }
211
+ if (partName === "fractionalSecond") {
212
+ return String(d.getUTCMilliseconds()).padStart(3, "0");
213
+ }
208
214
  if (partName === "timeZoneName") {
209
215
  return offset2 != null ? offset2 : minsToOffset(-1 * d.getTimezoneOffset(), token);
210
216
  }
@@ -230,8 +236,7 @@ function createPartMap(inputDate, parts2, locale, genitive = false) {
230
236
  preciseLocale,
231
237
  requestedParts.reduce(
232
238
  (options, part) => {
233
- if (part.partName === "literal")
234
- return options;
239
+ if (part.partName === "literal") return options;
235
240
  if (genitive && genitiveTokens.includes(part.token)) {
236
241
  genitiveParts.push(part);
237
242
  }
@@ -258,9 +263,7 @@ function createPartMap(inputDate, parts2, locale, genitive = false) {
258
263
  }).formatToParts(d).map(normStr);
259
264
  break;
260
265
  }
261
- const genitiveFormattedPart = formattedParts.find(
262
- (p) => p.type === part.partName
263
- );
266
+ const genitiveFormattedPart = formattedParts.find((p) => p.type === part.partName);
264
267
  const index = valueParts.findIndex((p) => p.type === part.partName);
265
268
  if (genitiveFormattedPart && index > -1) {
266
269
  valueParts[index] = genitiveFormattedPart;
@@ -268,50 +271,48 @@ function createPartMap(inputDate, parts2, locale, genitive = false) {
268
271
  }
269
272
  }
270
273
  }
271
- if (hour12.length)
272
- addValues(hour12, true);
273
- if (hour24.length)
274
- addValues(hour24);
274
+ if (hour12.length) addValues(hour12, true);
275
+ if (hour24.length) addValues(hour24);
275
276
  return valueParts.reduce((map, part) => {
276
277
  map[part.type] = part.value;
277
278
  return map;
278
279
  }, {});
279
280
  }
280
- function minsToOffset(timeDiffInMins, token = "Z") {
281
- const hours = String(Math.floor(Math.abs(timeDiffInMins / 60))).padStart(
282
- 2,
283
- "0"
284
- );
285
- const mins = String(Math.abs(timeDiffInMins % 60)).padStart(2, "0");
286
- const sign = timeDiffInMins < 0 ? "-" : "+";
281
+ function secsToOffset(totalSecs, token = "Z") {
282
+ const sign = totalSecs < 0 ? "-" : "+";
283
+ const absSecs = Math.abs(totalSecs);
284
+ const hours = String(Math.floor(absSecs / 3600)).padStart(2, "0");
285
+ const mins = String(Math.floor(absSecs % 3600 / 60)).padStart(2, "0");
286
+ const secs = Math.round(absSecs % 60);
287
287
  if (token === "ZZ") {
288
- return `${sign}${hours}${mins}`;
288
+ return secs === 0 ? `${sign}${hours}${mins}` : `${sign}${hours}${mins}${String(secs).padStart(2, "0")}`;
289
289
  }
290
- return `${sign}${hours}:${mins}`;
290
+ return secs === 0 ? `${sign}${hours}:${mins}` : `${sign}${hours}:${mins}:${String(secs).padStart(2, "0")}`;
291
+ }
292
+ function minsToOffset(timeDiffInMins, token = "Z") {
293
+ return secsToOffset(timeDiffInMins * 60, token);
291
294
  }
292
- function offsetToMins(offset2, token) {
295
+ function offsetToSecs(offset2, token) {
293
296
  validOffset(offset2, token);
294
- const [_, sign, hours, mins] = offset2.match(
295
- /([+-])([0-3][0-9]):?([0-6][0-9])/
296
- );
297
- const offsetInMins = Number(hours) * 60 + Number(mins);
298
- return sign === "+" ? offsetInMins : -offsetInMins;
297
+ const match = offset2.match(/([+-])([0-3][0-9]):?([0-5][0-9])(?::?([0-5][0-9]))?/);
298
+ const [_, sign, hours, mins, secs = "0"] = match;
299
+ const totalSecs = Number(hours) * 3600 + Number(mins) * 60 + Number(secs);
300
+ return sign === "+" ? totalSecs : -totalSecs;
299
301
  }
300
302
  function validOffset(offset2, token = "Z") {
301
303
  const valid = ((token2) => {
302
304
  switch (token2) {
303
305
  case "Z":
304
- return /^([+-])[0-3][0-9]:[0-6][0-9]$/.test(offset2);
306
+ return /^([+-])[0-3][0-9]:[0-5][0-9](?::[0-5][0-9])?$/.test(offset2);
305
307
  case "ZZ":
306
- return /^([+-])[0-3][0-9][0-6][0-9]$/.test(offset2);
308
+ return /^([+-])[0-3][0-9][0-5][0-9](?:[0-5][0-9])?$/.test(offset2);
307
309
  }
308
310
  })(token);
309
- if (!valid)
310
- throw new Error(`Invalid offset: ${offset2}`);
311
+ if (!valid) throw new Error(`Invalid offset: ${offset2}`);
311
312
  return offset2;
312
313
  }
313
314
  function escapeTokens(str) {
314
- return clockAgnostic.concat(clock24).concat(clock12).sort((a, b) => a[0].length > b[0].length ? 1 : -1).reduce((target, part) => {
315
+ return clockAgnostic.concat(clock24).concat(clock12).concat(fractionalSeconds).sort((a, b) => a[0].length > b[0].length ? 1 : -1).reduce((target, part) => {
315
316
  return target.replace(part[0], `\\${part[0]}`);
316
317
  }, str);
317
318
  }
@@ -325,10 +326,8 @@ function validate(parts2) {
325
326
  throw new Error(`Numbers in format (${part.partValue}).`);
326
327
  }
327
328
  if (lastPart && lastPart.partName !== "literal" && part.partName !== "literal") {
328
- if (!(lastPart.token in fixedLength) && !(part.token in fixedLength) && !(isNumeric(lastPart) && part.token.toLowerCase() === "a")) {
329
- throw new Error(
330
- `Illegal adjacent tokens (${lastPart.token}, ${part.token})`
331
- );
329
+ if (!(lastPart.token in fixedLength) && !(part.token in fixedLength) && !(isNumeric(lastPart) && part.token.toLowerCase() === "a") && lastPart.token !== "SSS") {
330
+ throw new Error(`Illegal adjacent tokens (${lastPart.token}, ${part.token})`);
332
331
  }
333
332
  }
334
333
  lastPart = part;
@@ -345,8 +344,7 @@ function getOffsetFormat(format2) {
345
344
  // src/ap.ts
346
345
  function ap(ampm, locale) {
347
346
  const l = dayPeriodMap.get(locale);
348
- if (l && l[ampm])
349
- return l[ampm];
347
+ if (l && l[ampm]) return l[ampm];
350
348
  const specimen = new Date(specDate);
351
349
  specimen.setUTCHours(ampm === "am" ? 5 : 20);
352
350
  const subparts = new Intl.DateTimeFormat(locale, {
@@ -369,16 +367,10 @@ function ap(ampm, locale) {
369
367
  // src/applyOffset.ts
370
368
  function applyOffset(dateInput, offset2 = "+00:00") {
371
369
  const d = date(dateInput);
372
- const token = (() => {
373
- switch (fixedLengthByOffset(offset2)) {
374
- case 5:
375
- return "ZZ";
376
- case 6:
377
- return "Z";
378
- }
379
- })();
380
- const timeDiffInMins = offsetToMins(offset2, token);
381
- return new Date(d.getTime() + timeDiffInMins * 1e3 * 60);
370
+ const len = fixedLengthByOffset(offset2);
371
+ const token = len === 5 || len === 8 ? "ZZ" : "Z";
372
+ const timeDiffInSecs = offsetToSecs(offset2, token);
373
+ return new Date(d.getTime() + timeDiffInSecs * 1e3);
382
374
  }
383
375
 
384
376
  // src/deviceTZ.ts
@@ -412,8 +404,8 @@ function offset(utcTime, tzA = "UTC", tzB = "device", timeZoneToken = "Z") {
412
404
  const d = date(utcTime);
413
405
  const timeA = relativeTime(d, tzA);
414
406
  const timeB = relativeTime(d, tzB);
415
- const timeDiffInMins = (timeB.getTime() - timeA.getTime()) / 1e3 / 60;
416
- return minsToOffset(timeDiffInMins, timeZoneToken);
407
+ const timeDiffInSecs = Math.round((timeB.getTime() - timeA.getTime()) / 1e3);
408
+ return secsToOffset(timeDiffInSecs, timeZoneToken);
417
409
  }
418
410
 
419
411
  // src/tzDate.ts
@@ -440,7 +432,7 @@ function dayEnd(inputDate) {
440
432
  // src/dayStart.ts
441
433
  function dayStart(inputDate) {
442
434
  const d = date(inputDate);
443
- d.setHours(0, 0, 0);
435
+ d.setHours(0, 0, 0, 0);
444
436
  return d;
445
437
  }
446
438
 
@@ -452,13 +444,11 @@ function parts(format2, locale) {
452
444
  let f = format2;
453
445
  let match = 0;
454
446
  const testPattern = (pattern) => {
455
- if (!pattern[2])
456
- pattern[2] = new RegExp(`(.)?(${pattern[0]})`, "g");
447
+ if (!pattern[2]) pattern[2] = new RegExp(`(.)?(${pattern[0]})`, "g");
457
448
  if (pattern[2].test(f)) {
458
449
  let didAdd = 0;
459
450
  f = f.replace(pattern[2], (_, prefix, actualMatch) => {
460
- if (prefix === "\\")
461
- return actualMatch;
451
+ if (prefix === "\\") return actualMatch;
462
452
  return `${typeof prefix === "string" ? prefix : ""}{!${didAdd++ ? match : match++}!}`;
463
453
  });
464
454
  return !!didAdd;
@@ -485,7 +475,7 @@ function parts(format2, locale) {
485
475
  hour12
486
476
  };
487
477
  }
488
- const found24Patterns = clockAgnostic.filter(testPattern).concat(clock24.filter(testPattern)).map(createPart.bind(null, false));
478
+ const found24Patterns = clockAgnostic.filter(testPattern).concat(clock24.filter(testPattern)).concat(fractionalSeconds.filter(testPattern)).map(createPart.bind(null, false));
489
479
  const parts2 = validate2(
490
480
  found24Patterns.concat(
491
481
  clock12.filter(testPattern).map(createPart.bind(null, true))
@@ -514,10 +504,8 @@ function styleParts(format2, locale) {
514
504
  if (typeof format2 === "string") {
515
505
  options.dateStyle = format2;
516
506
  } else {
517
- if ("date" in format2)
518
- options.dateStyle = format2.date;
519
- if ("time" in format2)
520
- options.timeStyle = format2.time;
507
+ if ("date" in format2) options.dateStyle = format2.date;
508
+ if ("time" in format2) options.timeStyle = format2.time;
521
509
  }
522
510
  const formatter = new Intl.DateTimeFormat(locale, options);
523
511
  const segments = formatter.formatToParts(new Date(specDate)).map(normStr);
@@ -533,11 +521,9 @@ function styleParts(format2, locale) {
533
521
  part.type === "hour" ? hourType : void 0,
534
522
  options
535
523
  );
536
- if (formatPattern === void 0)
537
- return;
524
+ if (formatPattern === void 0) return;
538
525
  const partValue = formatPattern[1][partName];
539
- if (!partValue)
540
- return;
526
+ if (!partValue) return;
541
527
  if (!formatPattern[2])
542
528
  formatPattern[2] = new RegExp(`${formatPattern[0]}`, "g");
543
529
  return {
@@ -558,8 +544,7 @@ function guessPattern(partName, partValue, locale, hour, options) {
558
544
  case "year":
559
545
  return l === 2 ? tokens.get("YY") : tokens.get("YYYY");
560
546
  case "month":
561
- if (n)
562
- return l === 1 ? tokens.get("M") : tokens.get("MM");
547
+ if (n) return l === 1 ? tokens.get("M") : tokens.get("MM");
563
548
  style = partStyle(locale, partName, partValue);
564
549
  switch (style) {
565
550
  case "long":
@@ -580,8 +565,7 @@ function guessPattern(partName, partValue, locale, hour, options) {
580
565
  return tokens.get("dddd");
581
566
  }
582
567
  case "hour":
583
- if (hour === 12)
584
- return l === 1 ? tokens.get("h") : tokens.get("hh");
568
+ if (hour === 12) return l === 1 ? tokens.get("h") : tokens.get("hh");
585
569
  return l === 1 ? tokens.get("H") : tokens.get("HH");
586
570
  case "minute":
587
571
  return l === 1 ? tokens.get("m") : tokens.get("mm");
@@ -606,8 +590,7 @@ function partStyle(locale, part, value) {
606
590
  const formats2 = {};
607
591
  for (let i = 0; i < 12; i++) {
608
592
  date2.setMonth(0 + i);
609
- if (i in weekdays)
610
- date2.setDate(weekdays[i]);
593
+ if (i in weekdays) date2.setDate(weekdays[i]);
611
594
  date2.setUTCHours(8 + i);
612
595
  for (const style of partStyles) {
613
596
  const segments = new Intl.DateTimeFormat(
@@ -626,12 +609,10 @@ function partStyle(locale, part, value) {
626
609
  (part2) => part2.type === "month"
627
610
  );
628
611
  const index = segments.findIndex((part2) => part2.type === "month");
629
- if (index > -1 && genitiveMonth)
630
- segments[index] = genitiveMonth;
612
+ if (index > -1 && genitiveMonth) segments[index] = genitiveMonth;
631
613
  }
632
614
  segments.forEach((part2) => {
633
- if (part2.type === "literal")
634
- return;
615
+ if (part2.type === "literal") return;
635
616
  const type = part2.type;
636
617
  formats2[type] = Object.assign(formats2[type] || {}, {
637
618
  [part2.value]: style
@@ -673,8 +654,7 @@ function format(inputDateOrOptions, format2 = "long", locale = "device", genitiv
673
654
  tz
674
655
  } = inputDateOrOptions);
675
656
  }
676
- if (format2 === "ISO8601")
677
- return date(inputDateOrOptions).toISOString();
657
+ if (format2 === "ISO8601") return date(inputDateOrOptions).toISOString();
678
658
  if (tz) {
679
659
  forceOffset = offset(inputDateOrOptions, "utc", tz, getOffsetFormat(format2));
680
660
  }
@@ -690,7 +670,7 @@ function format(inputDateOrOptions, format2 = "long", locale = "device", genitiv
690
670
  }
691
671
  return fill(
692
672
  inputDateOrOptions,
693
- parts(format2, locale).filter(partFilter != null ? partFilter : () => true),
673
+ parts(format2, locale).filter(partFilter != null ? partFilter : (() => true)),
694
674
  locale,
695
675
  genitive,
696
676
  forceOffset
@@ -724,7 +704,7 @@ function hourEnd(inputDate) {
724
704
  // src/hourStart.ts
725
705
  function hourStart(inputDate) {
726
706
  const d = date(inputDate);
727
- d.setMinutes(0, 0);
707
+ d.setMinutes(0, 0, 0);
728
708
  return d;
729
709
  }
730
710
 
@@ -738,7 +718,7 @@ function minuteEnd(inputDate) {
738
718
  // src/minuteStart.ts
739
719
  function minuteStart(inputDate) {
740
720
  const d = date(inputDate);
741
- d.setSeconds(0);
721
+ d.setSeconds(0, 0);
742
722
  return d;
743
723
  }
744
724
 
@@ -746,7 +726,7 @@ function minuteStart(inputDate) {
746
726
  function monthStart(inputDate) {
747
727
  const d = date(inputDate);
748
728
  d.setDate(1);
749
- d.setHours(0, 0, 0);
729
+ d.setHours(0, 0, 0, 0);
750
730
  return d;
751
731
  }
752
732
 
@@ -782,13 +762,11 @@ function nearestDay(inputDate, search, constraint = 7) {
782
762
  for (let i = 0; i <= increments || i < decrements; i++) {
783
763
  if (i <= increments) {
784
764
  const next = addDay(d, i);
785
- if (search(next))
786
- return next;
765
+ if (search(next)) return next;
787
766
  }
788
767
  if (i && i <= decrements) {
789
768
  const prev = addDay(d, -i);
790
- if (search(prev))
791
- return prev;
769
+ if (search(prev)) return prev;
792
770
  }
793
771
  }
794
772
  return null;
@@ -797,8 +775,7 @@ function nearestDay(inputDate, search, constraint = 7) {
797
775
  // src/range.ts
798
776
  function range(token, locale = "en", genitive = false) {
799
777
  const r = (n, c) => Array(n).fill("").map((_, i) => `${c(i)}`);
800
- if (token === "M")
801
- return r(12, (i) => i + 1);
778
+ if (token === "M") return r(12, (i) => i + 1);
802
779
  if (token === "MM")
803
780
  return r(12, (i) => {
804
781
  const m = i + 1;
@@ -856,19 +833,16 @@ function parse(dateStrOrOptions, format2 = "ISO8601", locale = "device") {
856
833
  } else {
857
834
  dateStr = dateStrOrOptions;
858
835
  }
859
- if (!dateStr)
860
- throw new Error("parse() requires a date string.");
836
+ if (!dateStr) throw new Error("parse() requires a date string.");
861
837
  const invalid = () => {
862
838
  throw new Error(
863
839
  `Date (${dateStr}) does not match format (${formatStr(format2, locale)})`
864
840
  );
865
841
  };
866
- if (format2 === "ISO8601")
867
- return date(dateStr);
842
+ if (format2 === "ISO8601") return date(dateStr);
868
843
  const genitive = styles.includes(format2) || typeof format2 === "object";
869
844
  const formatParts = validate(parts(format2, locale).filter(partFilter));
870
- if (!formatParts.length)
871
- throw new Error("parse() requires a pattern.");
845
+ if (!formatParts.length) throw new Error("parse() requires a pattern.");
872
846
  let parsedParts;
873
847
  try {
874
848
  parsedParts = parseParts(dateStr, formatParts);
@@ -882,17 +856,19 @@ function parse(dateStrOrOptions, format2 = "ISO8601", locale = "device") {
882
856
  ["DD", now.getDate()],
883
857
  ["HH", 0],
884
858
  ["mm", 0],
885
- ["ss", 0]
859
+ ["ss", 0],
860
+ ["SSS", 0]
886
861
  ]);
887
862
  let a = null;
888
863
  let offset2 = "";
889
864
  parsedParts.forEach((part) => {
890
- if (part.partName === "literal")
891
- return;
892
- if (part.token === part.value)
893
- return invalid();
865
+ if (part.partName === "literal") return;
866
+ if (part.token === part.value) return invalid();
894
867
  const v = Number(part.value);
895
- if (parsed.has(part.token)) {
868
+ if (part.token === "SSS") {
869
+ const digits = part.value.padEnd(3, "0").slice(0, 3);
870
+ parsed.set("SSS", Number(digits));
871
+ } else if (parsed.has(part.token)) {
896
872
  parsed.set(part.token, v);
897
873
  } else if (part.token === "YY") {
898
874
  parsed.set("YYYY", fourDigitYear(part.value));
@@ -932,17 +908,24 @@ function parse(dateStrOrOptions, format2 = "ISO8601", locale = "device") {
932
908
  parsed.set("HH", 0);
933
909
  }
934
910
  parsed.set("MM", (parsed.get("MM") || 1) - 1);
935
- let [Y, M, D, h, m, s] = Array.from(parsed.values());
911
+ let [Y, M, D, h, m, s, ms] = Array.from(parsed.values());
936
912
  const maxDaysInMonth = monthDays(/* @__PURE__ */ new Date(`${four(Y)}-${two(M + 1)}-10`));
937
913
  if (maxDaysInMonth < D && dateOverflow === "throw")
938
914
  throw new Error(`Invalid date ${four(Y)}-${two(M + 1)}-${two(D)}`);
939
915
  D = dateOverflow === "backward" ? Math.min(D, maxDaysInMonth) : D;
940
- const isoString = `${four(Y)}-${two(M + 1)}-${two(D)}T${two(h)}:${two(
941
- m
942
- )}:${two(s)}${offset2}`;
916
+ const msStr = String(ms).padStart(3, "0");
917
+ if (offset2) {
918
+ const isoStringUtc = `${four(Y)}-${two(M + 1)}-${two(D)}T${two(h)}:${two(m)}:${two(s)}.${msStr}Z`;
919
+ const d2 = new Date(isoStringUtc);
920
+ if (!isFinite(+d2)) return invalid();
921
+ const len = fixedLengthByOffset(offset2);
922
+ const token = len === 5 || len === 8 ? "ZZ" : "Z";
923
+ const offsetSecs = offsetToSecs(offset2, token);
924
+ return new Date(d2.getTime() - offsetSecs * 1e3);
925
+ }
926
+ const isoString = `${four(Y)}-${two(M + 1)}-${two(D)}T${two(h)}:${two(m)}:${two(s)}.${msStr}`;
943
927
  const d = new Date(isoString);
944
- if (isFinite(+d))
945
- return d;
928
+ if (isFinite(+d)) return d;
946
929
  return invalid();
947
930
  }
948
931
  function parseParts(dateStr, formatParts) {
@@ -962,13 +945,18 @@ function parseParts(dateStr, formatParts) {
962
945
  len = current.partValue.length;
963
946
  } else if (current.partName === "timeZoneName") {
964
947
  len = fixedLengthByOffset(dateStr.substring(pos));
948
+ } else if (current.token === "SSS") {
949
+ let end = pos;
950
+ while (end < dateStr.length && /\d/.test(dateStr.charAt(end))) {
951
+ end++;
952
+ }
953
+ len = end - pos;
965
954
  } else if (current.token in fixedLength) {
966
955
  len = fixedLength[current.token];
967
956
  } else if (next) {
968
957
  if (next.partName === "literal") {
969
958
  len = dateStr.indexOf(next.partValue, pos) - pos;
970
- if (len < 0)
971
- throw new Error();
959
+ if (len < 0) throw new Error();
972
960
  } else if (next.partName === "dayPeriod") {
973
961
  for (let i2 = 1; i2 <= 4; i2++) {
974
962
  if (isNaN(Number(dateStr.charAt(pos + i2)))) {
@@ -978,8 +966,7 @@ function parseParts(dateStr, formatParts) {
978
966
  }
979
967
  } else {
980
968
  const nextChar = dateStr.substring(pos).search(/\d/);
981
- if (nextChar !== -1)
982
- len = pos + nextChar;
969
+ if (nextChar !== -1) len = pos + nextChar;
983
970
  }
984
971
  } else {
985
972
  len = dateStr.length;
@@ -1004,6 +991,13 @@ function sameSecond(inputDateA, inputDateB) {
1004
991
  return a.getSeconds() === b.getSeconds();
1005
992
  }
1006
993
 
994
+ // src/sameMillisecond.ts
995
+ function sameMillisecond(inputDateA, inputDateB) {
996
+ const a = date(inputDateA);
997
+ const b = date(inputDateB);
998
+ return a.getMilliseconds() === b.getMilliseconds();
999
+ }
1000
+
1007
1001
  // src/sameMinute.ts
1008
1002
  function sameMinute(inputDateA, inputDateB) {
1009
1003
  const a = date(inputDateA);
@@ -1029,10 +1023,9 @@ function sameYear(inputDateA, inputDateB) {
1029
1023
  function weekStart(inputDate, startOfWeekDay = 0) {
1030
1024
  const d = date(inputDate);
1031
1025
  let diff = startOfWeekDay - d.getDay();
1032
- if (diff > 0)
1033
- diff = diff - 7;
1026
+ if (diff > 0) diff = diff - 7;
1034
1027
  d.setDate(d.getDate() + diff);
1035
- d.setHours(0, 0, 0);
1028
+ d.setHours(0, 0, 0, 0);
1036
1029
  return d;
1037
1030
  }
1038
1031
 
@@ -1040,24 +1033,22 @@ function weekStart(inputDate, startOfWeekDay = 0) {
1040
1033
  function weekEnd(inputDate, startOfWeekDay = 0) {
1041
1034
  const d = weekStart(inputDate, startOfWeekDay);
1042
1035
  d.setDate(d.getDate() + 6);
1043
- d.setHours(23, 59, 59);
1036
+ d.setHours(23, 59, 59, 999);
1044
1037
  return d;
1045
1038
  }
1046
1039
 
1047
1040
  // src/yearStart.ts
1048
1041
  function yearStart(inputDate) {
1049
1042
  const d = date(inputDate);
1050
- d.setMonth(0);
1051
- d.setDate(1);
1052
- d.setHours(0, 0, 0);
1043
+ d.setMonth(0, 1);
1044
+ d.setHours(0, 0, 0, 0);
1053
1045
  return d;
1054
1046
  }
1055
1047
 
1056
1048
  // src/yearEnd.ts
1057
1049
  function yearEnd(inputDate) {
1058
1050
  const d = date(inputDate);
1059
- d.setMonth(11);
1060
- d.setDate(31);
1051
+ d.setMonth(11, 31);
1061
1052
  d.setHours(23, 59, 59, 999);
1062
1053
  return d;
1063
1054
  }
@@ -1083,6 +1074,16 @@ function isEqual(dateLeft, dateRight) {
1083
1074
  return +_dateLeft === +_dateRight;
1084
1075
  }
1085
1076
 
1077
+ // src/isPast.ts
1078
+ function isPast(inputDate) {
1079
+ return isBefore(inputDate);
1080
+ }
1081
+
1082
+ // src/isFuture.ts
1083
+ function isFuture(inputDate) {
1084
+ return isAfter(inputDate);
1085
+ }
1086
+
1086
1087
  // src/diffMilliseconds.ts
1087
1088
  function diffMilliseconds(dateA, dateB) {
1088
1089
  const left = date(dateA);
@@ -1098,17 +1099,26 @@ function diffRound(value, method = "trunc") {
1098
1099
 
1099
1100
  // src/diffSeconds.ts
1100
1101
  function diffSeconds(dateA, dateB, roundingMethod) {
1101
- return diffRound(diffMilliseconds(dateA, dateB) / 1e3, roundingMethod);
1102
+ return diffRound(
1103
+ // @ts-ignore
1104
+ diffMilliseconds(dateA, dateB) / 1e3,
1105
+ roundingMethod
1106
+ );
1102
1107
  }
1103
1108
 
1104
1109
  // src/diffMinutes.ts
1105
1110
  function diffMinutes(dateA, dateB, roundingMethod) {
1106
- return diffRound(diffMilliseconds(dateA, dateB) / 6e4, roundingMethod);
1111
+ return diffRound(
1112
+ //@ts-ignore
1113
+ diffMilliseconds(dateA, dateB) / 6e4,
1114
+ roundingMethod
1115
+ );
1107
1116
  }
1108
1117
 
1109
1118
  // src/diffHours.ts
1110
1119
  function diffHours(dateA, dateB, roundingMethod) {
1111
1120
  return diffRound(
1121
+ //@ts-ignore
1112
1122
  diffMilliseconds(dateA, dateB) / 36e5,
1113
1123
  // 1000 * 60 * 60
1114
1124
  roundingMethod
@@ -1118,6 +1128,7 @@ function diffHours(dateA, dateB, roundingMethod) {
1118
1128
  // src/diffDays.ts
1119
1129
  function diffDays(dateA, dateB, roundingMethod) {
1120
1130
  return diffRound(
1131
+ // @ts-ignore
1121
1132
  diffMilliseconds(dateA, dateB) / 864e5,
1122
1133
  // hour * 24
1123
1134
  roundingMethod
@@ -1155,12 +1166,16 @@ function diffMonths(dateA, dateB) {
1155
1166
 
1156
1167
  // src/diffYears.ts
1157
1168
  function diffYears(dateA, dateB) {
1158
- const r = Math.trunc(diffMonths(dateA, dateB) / 12);
1169
+ const r = Math.trunc(
1170
+ //@ts-ignore
1171
+ diffMonths(dateA, dateB) / 12
1172
+ );
1159
1173
  return r == 0 ? 0 : r;
1160
1174
  }
1161
1175
  export {
1162
1176
  addDay,
1163
1177
  addHour,
1178
+ addMillisecond,
1164
1179
  addMinute,
1165
1180
  addMonth,
1166
1181
  addSecond,
@@ -1187,6 +1202,8 @@ export {
1187
1202
  isAfter,
1188
1203
  isBefore,
1189
1204
  isEqual,
1205
+ isFuture,
1206
+ isPast,
1190
1207
  iso8601,
1191
1208
  minuteEnd,
1192
1209
  minuteStart,
@@ -1202,6 +1219,7 @@ export {
1202
1219
  removeOffset,
1203
1220
  sameDay,
1204
1221
  sameHour,
1222
+ sameMillisecond,
1205
1223
  sameMinute,
1206
1224
  sameSecond,
1207
1225
  sameYear,