@formkit/tempo 0.1.2 → 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 -142
  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 -145
  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 -5
  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
291
  }
292
- function offsetToMins(offset2, token) {
292
+ function minsToOffset(timeDiffInMins, token = "Z") {
293
+ return secsToOffset(timeDiffInMins * 60, token);
294
+ }
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,10 +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 = Math.round(
416
- (timeB.getTime() - timeA.getTime()) / 1e3 / 60
417
- );
418
- return minsToOffset(timeDiffInMins, timeZoneToken);
407
+ const timeDiffInSecs = Math.round((timeB.getTime() - timeA.getTime()) / 1e3);
408
+ return secsToOffset(timeDiffInSecs, timeZoneToken);
419
409
  }
420
410
 
421
411
  // src/tzDate.ts
@@ -442,7 +432,7 @@ function dayEnd(inputDate) {
442
432
  // src/dayStart.ts
443
433
  function dayStart(inputDate) {
444
434
  const d = date(inputDate);
445
- d.setHours(0, 0, 0);
435
+ d.setHours(0, 0, 0, 0);
446
436
  return d;
447
437
  }
448
438
 
@@ -454,13 +444,11 @@ function parts(format2, locale) {
454
444
  let f = format2;
455
445
  let match = 0;
456
446
  const testPattern = (pattern) => {
457
- if (!pattern[2])
458
- pattern[2] = new RegExp(`(.)?(${pattern[0]})`, "g");
447
+ if (!pattern[2]) pattern[2] = new RegExp(`(.)?(${pattern[0]})`, "g");
459
448
  if (pattern[2].test(f)) {
460
449
  let didAdd = 0;
461
450
  f = f.replace(pattern[2], (_, prefix, actualMatch) => {
462
- if (prefix === "\\")
463
- return actualMatch;
451
+ if (prefix === "\\") return actualMatch;
464
452
  return `${typeof prefix === "string" ? prefix : ""}{!${didAdd++ ? match : match++}!}`;
465
453
  });
466
454
  return !!didAdd;
@@ -487,7 +475,7 @@ function parts(format2, locale) {
487
475
  hour12
488
476
  };
489
477
  }
490
- 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));
491
479
  const parts2 = validate2(
492
480
  found24Patterns.concat(
493
481
  clock12.filter(testPattern).map(createPart.bind(null, true))
@@ -516,10 +504,8 @@ function styleParts(format2, locale) {
516
504
  if (typeof format2 === "string") {
517
505
  options.dateStyle = format2;
518
506
  } else {
519
- if ("date" in format2)
520
- options.dateStyle = format2.date;
521
- if ("time" in format2)
522
- options.timeStyle = format2.time;
507
+ if ("date" in format2) options.dateStyle = format2.date;
508
+ if ("time" in format2) options.timeStyle = format2.time;
523
509
  }
524
510
  const formatter = new Intl.DateTimeFormat(locale, options);
525
511
  const segments = formatter.formatToParts(new Date(specDate)).map(normStr);
@@ -535,11 +521,9 @@ function styleParts(format2, locale) {
535
521
  part.type === "hour" ? hourType : void 0,
536
522
  options
537
523
  );
538
- if (formatPattern === void 0)
539
- return;
524
+ if (formatPattern === void 0) return;
540
525
  const partValue = formatPattern[1][partName];
541
- if (!partValue)
542
- return;
526
+ if (!partValue) return;
543
527
  if (!formatPattern[2])
544
528
  formatPattern[2] = new RegExp(`${formatPattern[0]}`, "g");
545
529
  return {
@@ -560,8 +544,7 @@ function guessPattern(partName, partValue, locale, hour, options) {
560
544
  case "year":
561
545
  return l === 2 ? tokens.get("YY") : tokens.get("YYYY");
562
546
  case "month":
563
- if (n)
564
- return l === 1 ? tokens.get("M") : tokens.get("MM");
547
+ if (n) return l === 1 ? tokens.get("M") : tokens.get("MM");
565
548
  style = partStyle(locale, partName, partValue);
566
549
  switch (style) {
567
550
  case "long":
@@ -582,8 +565,7 @@ function guessPattern(partName, partValue, locale, hour, options) {
582
565
  return tokens.get("dddd");
583
566
  }
584
567
  case "hour":
585
- if (hour === 12)
586
- return l === 1 ? tokens.get("h") : tokens.get("hh");
568
+ if (hour === 12) return l === 1 ? tokens.get("h") : tokens.get("hh");
587
569
  return l === 1 ? tokens.get("H") : tokens.get("HH");
588
570
  case "minute":
589
571
  return l === 1 ? tokens.get("m") : tokens.get("mm");
@@ -608,8 +590,7 @@ function partStyle(locale, part, value) {
608
590
  const formats2 = {};
609
591
  for (let i = 0; i < 12; i++) {
610
592
  date2.setMonth(0 + i);
611
- if (i in weekdays)
612
- date2.setDate(weekdays[i]);
593
+ if (i in weekdays) date2.setDate(weekdays[i]);
613
594
  date2.setUTCHours(8 + i);
614
595
  for (const style of partStyles) {
615
596
  const segments = new Intl.DateTimeFormat(
@@ -628,12 +609,10 @@ function partStyle(locale, part, value) {
628
609
  (part2) => part2.type === "month"
629
610
  );
630
611
  const index = segments.findIndex((part2) => part2.type === "month");
631
- if (index > -1 && genitiveMonth)
632
- segments[index] = genitiveMonth;
612
+ if (index > -1 && genitiveMonth) segments[index] = genitiveMonth;
633
613
  }
634
614
  segments.forEach((part2) => {
635
- if (part2.type === "literal")
636
- return;
615
+ if (part2.type === "literal") return;
637
616
  const type = part2.type;
638
617
  formats2[type] = Object.assign(formats2[type] || {}, {
639
618
  [part2.value]: style
@@ -675,8 +654,7 @@ function format(inputDateOrOptions, format2 = "long", locale = "device", genitiv
675
654
  tz
676
655
  } = inputDateOrOptions);
677
656
  }
678
- if (format2 === "ISO8601")
679
- return date(inputDateOrOptions).toISOString();
657
+ if (format2 === "ISO8601") return date(inputDateOrOptions).toISOString();
680
658
  if (tz) {
681
659
  forceOffset = offset(inputDateOrOptions, "utc", tz, getOffsetFormat(format2));
682
660
  }
@@ -692,7 +670,7 @@ function format(inputDateOrOptions, format2 = "long", locale = "device", genitiv
692
670
  }
693
671
  return fill(
694
672
  inputDateOrOptions,
695
- parts(format2, locale).filter(partFilter != null ? partFilter : () => true),
673
+ parts(format2, locale).filter(partFilter != null ? partFilter : (() => true)),
696
674
  locale,
697
675
  genitive,
698
676
  forceOffset
@@ -726,7 +704,7 @@ function hourEnd(inputDate) {
726
704
  // src/hourStart.ts
727
705
  function hourStart(inputDate) {
728
706
  const d = date(inputDate);
729
- d.setMinutes(0, 0);
707
+ d.setMinutes(0, 0, 0);
730
708
  return d;
731
709
  }
732
710
 
@@ -740,7 +718,7 @@ function minuteEnd(inputDate) {
740
718
  // src/minuteStart.ts
741
719
  function minuteStart(inputDate) {
742
720
  const d = date(inputDate);
743
- d.setSeconds(0);
721
+ d.setSeconds(0, 0);
744
722
  return d;
745
723
  }
746
724
 
@@ -748,7 +726,7 @@ function minuteStart(inputDate) {
748
726
  function monthStart(inputDate) {
749
727
  const d = date(inputDate);
750
728
  d.setDate(1);
751
- d.setHours(0, 0, 0);
729
+ d.setHours(0, 0, 0, 0);
752
730
  return d;
753
731
  }
754
732
 
@@ -784,13 +762,11 @@ function nearestDay(inputDate, search, constraint = 7) {
784
762
  for (let i = 0; i <= increments || i < decrements; i++) {
785
763
  if (i <= increments) {
786
764
  const next = addDay(d, i);
787
- if (search(next))
788
- return next;
765
+ if (search(next)) return next;
789
766
  }
790
767
  if (i && i <= decrements) {
791
768
  const prev = addDay(d, -i);
792
- if (search(prev))
793
- return prev;
769
+ if (search(prev)) return prev;
794
770
  }
795
771
  }
796
772
  return null;
@@ -799,8 +775,7 @@ function nearestDay(inputDate, search, constraint = 7) {
799
775
  // src/range.ts
800
776
  function range(token, locale = "en", genitive = false) {
801
777
  const r = (n, c) => Array(n).fill("").map((_, i) => `${c(i)}`);
802
- if (token === "M")
803
- return r(12, (i) => i + 1);
778
+ if (token === "M") return r(12, (i) => i + 1);
804
779
  if (token === "MM")
805
780
  return r(12, (i) => {
806
781
  const m = i + 1;
@@ -858,19 +833,16 @@ function parse(dateStrOrOptions, format2 = "ISO8601", locale = "device") {
858
833
  } else {
859
834
  dateStr = dateStrOrOptions;
860
835
  }
861
- if (!dateStr)
862
- throw new Error("parse() requires a date string.");
836
+ if (!dateStr) throw new Error("parse() requires a date string.");
863
837
  const invalid = () => {
864
838
  throw new Error(
865
839
  `Date (${dateStr}) does not match format (${formatStr(format2, locale)})`
866
840
  );
867
841
  };
868
- if (format2 === "ISO8601")
869
- return date(dateStr);
842
+ if (format2 === "ISO8601") return date(dateStr);
870
843
  const genitive = styles.includes(format2) || typeof format2 === "object";
871
844
  const formatParts = validate(parts(format2, locale).filter(partFilter));
872
- if (!formatParts.length)
873
- throw new Error("parse() requires a pattern.");
845
+ if (!formatParts.length) throw new Error("parse() requires a pattern.");
874
846
  let parsedParts;
875
847
  try {
876
848
  parsedParts = parseParts(dateStr, formatParts);
@@ -884,17 +856,19 @@ function parse(dateStrOrOptions, format2 = "ISO8601", locale = "device") {
884
856
  ["DD", now.getDate()],
885
857
  ["HH", 0],
886
858
  ["mm", 0],
887
- ["ss", 0]
859
+ ["ss", 0],
860
+ ["SSS", 0]
888
861
  ]);
889
862
  let a = null;
890
863
  let offset2 = "";
891
864
  parsedParts.forEach((part) => {
892
- if (part.partName === "literal")
893
- return;
894
- if (part.token === part.value)
895
- return invalid();
865
+ if (part.partName === "literal") return;
866
+ if (part.token === part.value) return invalid();
896
867
  const v = Number(part.value);
897
- 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)) {
898
872
  parsed.set(part.token, v);
899
873
  } else if (part.token === "YY") {
900
874
  parsed.set("YYYY", fourDigitYear(part.value));
@@ -934,17 +908,24 @@ function parse(dateStrOrOptions, format2 = "ISO8601", locale = "device") {
934
908
  parsed.set("HH", 0);
935
909
  }
936
910
  parsed.set("MM", (parsed.get("MM") || 1) - 1);
937
- let [Y, M, D, h, m, s] = Array.from(parsed.values());
911
+ let [Y, M, D, h, m, s, ms] = Array.from(parsed.values());
938
912
  const maxDaysInMonth = monthDays(/* @__PURE__ */ new Date(`${four(Y)}-${two(M + 1)}-10`));
939
913
  if (maxDaysInMonth < D && dateOverflow === "throw")
940
914
  throw new Error(`Invalid date ${four(Y)}-${two(M + 1)}-${two(D)}`);
941
915
  D = dateOverflow === "backward" ? Math.min(D, maxDaysInMonth) : D;
942
- const isoString = `${four(Y)}-${two(M + 1)}-${two(D)}T${two(h)}:${two(
943
- m
944
- )}:${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}`;
945
927
  const d = new Date(isoString);
946
- if (isFinite(+d))
947
- return d;
928
+ if (isFinite(+d)) return d;
948
929
  return invalid();
949
930
  }
950
931
  function parseParts(dateStr, formatParts) {
@@ -964,13 +945,18 @@ function parseParts(dateStr, formatParts) {
964
945
  len = current.partValue.length;
965
946
  } else if (current.partName === "timeZoneName") {
966
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;
967
954
  } else if (current.token in fixedLength) {
968
955
  len = fixedLength[current.token];
969
956
  } else if (next) {
970
957
  if (next.partName === "literal") {
971
958
  len = dateStr.indexOf(next.partValue, pos) - pos;
972
- if (len < 0)
973
- throw new Error();
959
+ if (len < 0) throw new Error();
974
960
  } else if (next.partName === "dayPeriod") {
975
961
  for (let i2 = 1; i2 <= 4; i2++) {
976
962
  if (isNaN(Number(dateStr.charAt(pos + i2)))) {
@@ -980,8 +966,7 @@ function parseParts(dateStr, formatParts) {
980
966
  }
981
967
  } else {
982
968
  const nextChar = dateStr.substring(pos).search(/\d/);
983
- if (nextChar !== -1)
984
- len = pos + nextChar;
969
+ if (nextChar !== -1) len = pos + nextChar;
985
970
  }
986
971
  } else {
987
972
  len = dateStr.length;
@@ -1006,6 +991,13 @@ function sameSecond(inputDateA, inputDateB) {
1006
991
  return a.getSeconds() === b.getSeconds();
1007
992
  }
1008
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
+
1009
1001
  // src/sameMinute.ts
1010
1002
  function sameMinute(inputDateA, inputDateB) {
1011
1003
  const a = date(inputDateA);
@@ -1031,10 +1023,9 @@ function sameYear(inputDateA, inputDateB) {
1031
1023
  function weekStart(inputDate, startOfWeekDay = 0) {
1032
1024
  const d = date(inputDate);
1033
1025
  let diff = startOfWeekDay - d.getDay();
1034
- if (diff > 0)
1035
- diff = diff - 7;
1026
+ if (diff > 0) diff = diff - 7;
1036
1027
  d.setDate(d.getDate() + diff);
1037
- d.setHours(0, 0, 0);
1028
+ d.setHours(0, 0, 0, 0);
1038
1029
  return d;
1039
1030
  }
1040
1031
 
@@ -1042,24 +1033,22 @@ function weekStart(inputDate, startOfWeekDay = 0) {
1042
1033
  function weekEnd(inputDate, startOfWeekDay = 0) {
1043
1034
  const d = weekStart(inputDate, startOfWeekDay);
1044
1035
  d.setDate(d.getDate() + 6);
1045
- d.setHours(23, 59, 59);
1036
+ d.setHours(23, 59, 59, 999);
1046
1037
  return d;
1047
1038
  }
1048
1039
 
1049
1040
  // src/yearStart.ts
1050
1041
  function yearStart(inputDate) {
1051
1042
  const d = date(inputDate);
1052
- d.setMonth(0);
1053
- d.setDate(1);
1054
- d.setHours(0, 0, 0);
1043
+ d.setMonth(0, 1);
1044
+ d.setHours(0, 0, 0, 0);
1055
1045
  return d;
1056
1046
  }
1057
1047
 
1058
1048
  // src/yearEnd.ts
1059
1049
  function yearEnd(inputDate) {
1060
1050
  const d = date(inputDate);
1061
- d.setMonth(11);
1062
- d.setDate(31);
1051
+ d.setMonth(11, 31);
1063
1052
  d.setHours(23, 59, 59, 999);
1064
1053
  return d;
1065
1054
  }
@@ -1085,6 +1074,16 @@ function isEqual(dateLeft, dateRight) {
1085
1074
  return +_dateLeft === +_dateRight;
1086
1075
  }
1087
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
+
1088
1087
  // src/diffMilliseconds.ts
1089
1088
  function diffMilliseconds(dateA, dateB) {
1090
1089
  const left = date(dateA);
@@ -1100,17 +1099,26 @@ function diffRound(value, method = "trunc") {
1100
1099
 
1101
1100
  // src/diffSeconds.ts
1102
1101
  function diffSeconds(dateA, dateB, roundingMethod) {
1103
- return diffRound(diffMilliseconds(dateA, dateB) / 1e3, roundingMethod);
1102
+ return diffRound(
1103
+ // @ts-ignore
1104
+ diffMilliseconds(dateA, dateB) / 1e3,
1105
+ roundingMethod
1106
+ );
1104
1107
  }
1105
1108
 
1106
1109
  // src/diffMinutes.ts
1107
1110
  function diffMinutes(dateA, dateB, roundingMethod) {
1108
- return diffRound(diffMilliseconds(dateA, dateB) / 6e4, roundingMethod);
1111
+ return diffRound(
1112
+ //@ts-ignore
1113
+ diffMilliseconds(dateA, dateB) / 6e4,
1114
+ roundingMethod
1115
+ );
1109
1116
  }
1110
1117
 
1111
1118
  // src/diffHours.ts
1112
1119
  function diffHours(dateA, dateB, roundingMethod) {
1113
1120
  return diffRound(
1121
+ //@ts-ignore
1114
1122
  diffMilliseconds(dateA, dateB) / 36e5,
1115
1123
  // 1000 * 60 * 60
1116
1124
  roundingMethod
@@ -1120,6 +1128,7 @@ function diffHours(dateA, dateB, roundingMethod) {
1120
1128
  // src/diffDays.ts
1121
1129
  function diffDays(dateA, dateB, roundingMethod) {
1122
1130
  return diffRound(
1131
+ // @ts-ignore
1123
1132
  diffMilliseconds(dateA, dateB) / 864e5,
1124
1133
  // hour * 24
1125
1134
  roundingMethod
@@ -1157,12 +1166,16 @@ function diffMonths(dateA, dateB) {
1157
1166
 
1158
1167
  // src/diffYears.ts
1159
1168
  function diffYears(dateA, dateB) {
1160
- const r = Math.trunc(diffMonths(dateA, dateB) / 12);
1169
+ const r = Math.trunc(
1170
+ //@ts-ignore
1171
+ diffMonths(dateA, dateB) / 12
1172
+ );
1161
1173
  return r == 0 ? 0 : r;
1162
1174
  }
1163
1175
  export {
1164
1176
  addDay,
1165
1177
  addHour,
1178
+ addMillisecond,
1166
1179
  addMinute,
1167
1180
  addMonth,
1168
1181
  addSecond,
@@ -1189,6 +1202,8 @@ export {
1189
1202
  isAfter,
1190
1203
  isBefore,
1191
1204
  isEqual,
1205
+ isFuture,
1206
+ isPast,
1192
1207
  iso8601,
1193
1208
  minuteEnd,
1194
1209
  minuteStart,
@@ -1204,6 +1219,7 @@ export {
1204
1219
  removeOffset,
1205
1220
  sameDay,
1206
1221
  sameHour,
1222
+ sameMillisecond,
1207
1223
  sameMinute,
1208
1224
  sameSecond,
1209
1225
  sameYear,