@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/index.cjs CHANGED
@@ -18,10 +18,11 @@ 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
23
  addDay: () => addDay,
24
24
  addHour: () => addHour,
25
+ addMillisecond: () => addMillisecond,
25
26
  addMinute: () => addMinute,
26
27
  addMonth: () => addMonth,
27
28
  addSecond: () => addSecond,
@@ -48,6 +49,8 @@ __export(src_exports, {
48
49
  isAfter: () => isAfter,
49
50
  isBefore: () => isBefore,
50
51
  isEqual: () => isEqual,
52
+ isFuture: () => isFuture,
53
+ isPast: () => isPast,
51
54
  iso8601: () => iso8601,
52
55
  minuteEnd: () => minuteEnd,
53
56
  minuteStart: () => minuteStart,
@@ -63,6 +66,7 @@ __export(src_exports, {
63
66
  removeOffset: () => removeOffset,
64
67
  sameDay: () => sameDay,
65
68
  sameHour: () => sameHour,
69
+ sameMillisecond: () => sameMillisecond,
66
70
  sameMinute: () => sameMinute,
67
71
  sameSecond: () => sameSecond,
68
72
  sameYear: () => sameYear,
@@ -73,25 +77,22 @@ __export(src_exports, {
73
77
  yearEnd: () => yearEnd,
74
78
  yearStart: () => yearStart
75
79
  });
76
- module.exports = __toCommonJS(src_exports);
80
+ module.exports = __toCommonJS(index_exports);
77
81
 
78
82
  // 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})?$/;
83
+ 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
84
  function iso8601(date2) {
81
85
  const matches = date2.match(iso8601Match);
82
86
  if (matches) {
83
87
  const month = Number(matches[2]);
84
- if (month < 1 || month > 12)
85
- return false;
88
+ if (month < 1 || month > 12) return false;
86
89
  if (typeof matches[3] !== void 0) {
87
90
  const date3 = Number(matches[3]);
88
- if (date3 < 1 || date3 > 31)
89
- return false;
91
+ if (date3 < 1 || date3 > 31) return false;
90
92
  }
91
93
  if (typeof matches[4] !== void 0) {
92
94
  const hours = Number(matches[4]);
93
- if (hours < 0 || hours > 23)
94
- return false;
95
+ if (hours < 0 || hours > 23) return false;
95
96
  }
96
97
  return true;
97
98
  }
@@ -111,9 +112,7 @@ function date(date2) {
111
112
  date2 = /* @__PURE__ */ new Date();
112
113
  }
113
114
  if (date2 instanceof Date) {
114
- const d = new Date(date2);
115
- d.setMilliseconds(0);
116
- return d;
115
+ return new Date(date2);
117
116
  }
118
117
  date2 = date2.trim();
119
118
  if (iso8601(date2)) {
@@ -148,8 +147,7 @@ function monthDays(inputDate) {
148
147
  function addMonth(inputDate, count = 1, dateOverflow = false) {
149
148
  const d = date(inputDate);
150
149
  const dayOfMonth = d.getDate();
151
- if (!dateOverflow)
152
- d.setDate(1);
150
+ if (!dateOverflow) d.setDate(1);
153
151
  d.setMonth(d.getMonth() + count);
154
152
  if (!dateOverflow) {
155
153
  const daysInMonth = monthDays(d);
@@ -162,8 +160,7 @@ function addMonth(inputDate, count = 1, dateOverflow = false) {
162
160
  function addYear(inputDate, count = 1, dateOverflow = false) {
163
161
  const d = date(inputDate);
164
162
  const dayOfMonth = d.getDate();
165
- if (!dateOverflow)
166
- d.setDate(1);
163
+ if (!dateOverflow) d.setDate(1);
167
164
  d.setFullYear(d.getFullYear() + count);
168
165
  if (!dateOverflow) {
169
166
  const daysInMonth = monthDays(d);
@@ -193,6 +190,13 @@ function addSecond(inputDate, count = 1) {
193
190
  return d;
194
191
  }
195
192
 
193
+ // src/addMillisecond.ts
194
+ function addMillisecond(inputDate, count = 1) {
195
+ const d = date(inputDate);
196
+ d.setMilliseconds(d.getMilliseconds() + count);
197
+ return d;
198
+ }
199
+
196
200
  // src/common.ts
197
201
  var specDate = "1999-03-04T02:05:01.000Z";
198
202
  var memoParts = /* @__PURE__ */ new Map();
@@ -225,6 +229,9 @@ var clock12 = [
225
229
  ["a", { dayPeriod: "narrow" }],
226
230
  ["A", { dayPeriod: "narrow" }]
227
231
  ];
232
+ var fractionalSeconds = [
233
+ ["SSS", { fractionalSecond: "3-digit" }]
234
+ ];
228
235
  var fixedLength = {
229
236
  DD: 2,
230
237
  HH: 2,
@@ -236,6 +243,12 @@ var fixedLength = {
236
243
  ss: 2
237
244
  };
238
245
  function fixedLengthByOffset(offsetString) {
246
+ if (/^[+-]\d{2}:\d{2}:\d{2}/.test(offsetString)) {
247
+ return 9;
248
+ }
249
+ if (/^[+-]\d{6}/.test(offsetString)) {
250
+ return 8;
251
+ }
239
252
  if (/^[+-]\d{2}:\d{2}/.test(offsetString)) {
240
253
  return 6;
241
254
  }
@@ -246,17 +259,12 @@ function fixedLengthByOffset(offsetString) {
246
259
  }
247
260
  var genitiveTokens = ["MMMM", "MMM", "dddd", "ddd"];
248
261
  var tokens = /* @__PURE__ */ new Map(
249
- /* @__PURE__ */ [...clockAgnostic, ...clock24, ...clock12].map((format2) => {
262
+ /* @__PURE__ */ [...clockAgnostic, ...clock24, ...clock12, ...fractionalSeconds].map((format2) => {
250
263
  return [format2[0], format2];
251
264
  })
252
265
  );
253
266
  var dayPeriodMap = /* @__PURE__ */ new Map();
254
- var styles = [
255
- "full",
256
- "long",
257
- "medium",
258
- "short"
259
- ];
267
+ var styles = ["full", "long", "medium", "short"];
260
268
  var two = (n) => String(n).padStart(2, "0");
261
269
  var four = (n) => String(n).padStart(2, "0");
262
270
  function normStr(part) {
@@ -269,8 +277,7 @@ function fill(inputDate, parts2, locale, genitive = false, offset2 = null) {
269
277
  const partMap = createPartMap(inputDate, parts2, locale, genitive);
270
278
  const d = date(inputDate);
271
279
  function value({ partName, partValue, token }) {
272
- if (partName === "literal")
273
- return partValue;
280
+ if (partName === "literal") return partValue;
274
281
  const value2 = partMap[partName];
275
282
  if (partName === "hour" && token === "H") {
276
283
  return value2.replace(/^0/, "") || "0";
@@ -282,6 +289,9 @@ function fill(inputDate, parts2, locale, genitive = false, offset2 = null) {
282
289
  const p = ap(d.getUTCHours() < 12 ? "am" : "pm", locale);
283
290
  return token === "A" ? p.toUpperCase() : p.toLowerCase();
284
291
  }
292
+ if (partName === "fractionalSecond") {
293
+ return String(d.getUTCMilliseconds()).padStart(3, "0");
294
+ }
285
295
  if (partName === "timeZoneName") {
286
296
  return offset2 != null ? offset2 : minsToOffset(-1 * d.getTimezoneOffset(), token);
287
297
  }
@@ -307,8 +317,7 @@ function createPartMap(inputDate, parts2, locale, genitive = false) {
307
317
  preciseLocale,
308
318
  requestedParts.reduce(
309
319
  (options, part) => {
310
- if (part.partName === "literal")
311
- return options;
320
+ if (part.partName === "literal") return options;
312
321
  if (genitive && genitiveTokens.includes(part.token)) {
313
322
  genitiveParts.push(part);
314
323
  }
@@ -335,9 +344,7 @@ function createPartMap(inputDate, parts2, locale, genitive = false) {
335
344
  }).formatToParts(d).map(normStr);
336
345
  break;
337
346
  }
338
- const genitiveFormattedPart = formattedParts.find(
339
- (p) => p.type === part.partName
340
- );
347
+ const genitiveFormattedPart = formattedParts.find((p) => p.type === part.partName);
341
348
  const index = valueParts.findIndex((p) => p.type === part.partName);
342
349
  if (genitiveFormattedPart && index > -1) {
343
350
  valueParts[index] = genitiveFormattedPart;
@@ -345,50 +352,48 @@ function createPartMap(inputDate, parts2, locale, genitive = false) {
345
352
  }
346
353
  }
347
354
  }
348
- if (hour12.length)
349
- addValues(hour12, true);
350
- if (hour24.length)
351
- addValues(hour24);
355
+ if (hour12.length) addValues(hour12, true);
356
+ if (hour24.length) addValues(hour24);
352
357
  return valueParts.reduce((map, part) => {
353
358
  map[part.type] = part.value;
354
359
  return map;
355
360
  }, {});
356
361
  }
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 ? "-" : "+";
362
+ function secsToOffset(totalSecs, token = "Z") {
363
+ const sign = totalSecs < 0 ? "-" : "+";
364
+ const absSecs = Math.abs(totalSecs);
365
+ const hours = String(Math.floor(absSecs / 3600)).padStart(2, "0");
366
+ const mins = String(Math.floor(absSecs % 3600 / 60)).padStart(2, "0");
367
+ const secs = Math.round(absSecs % 60);
364
368
  if (token === "ZZ") {
365
- return `${sign}${hours}${mins}`;
369
+ return secs === 0 ? `${sign}${hours}${mins}` : `${sign}${hours}${mins}${String(secs).padStart(2, "0")}`;
366
370
  }
367
- return `${sign}${hours}:${mins}`;
371
+ return secs === 0 ? `${sign}${hours}:${mins}` : `${sign}${hours}:${mins}:${String(secs).padStart(2, "0")}`;
368
372
  }
369
- function offsetToMins(offset2, token) {
373
+ function minsToOffset(timeDiffInMins, token = "Z") {
374
+ return secsToOffset(timeDiffInMins * 60, token);
375
+ }
376
+ function offsetToSecs(offset2, token) {
370
377
  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;
378
+ const match = offset2.match(/([+-])([0-3][0-9]):?([0-5][0-9])(?::?([0-5][0-9]))?/);
379
+ const [_, sign, hours, mins, secs = "0"] = match;
380
+ const totalSecs = Number(hours) * 3600 + Number(mins) * 60 + Number(secs);
381
+ return sign === "+" ? totalSecs : -totalSecs;
376
382
  }
377
383
  function validOffset(offset2, token = "Z") {
378
384
  const valid = ((token2) => {
379
385
  switch (token2) {
380
386
  case "Z":
381
- return /^([+-])[0-3][0-9]:[0-6][0-9]$/.test(offset2);
387
+ return /^([+-])[0-3][0-9]:[0-5][0-9](?::[0-5][0-9])?$/.test(offset2);
382
388
  case "ZZ":
383
- return /^([+-])[0-3][0-9][0-6][0-9]$/.test(offset2);
389
+ return /^([+-])[0-3][0-9][0-5][0-9](?:[0-5][0-9])?$/.test(offset2);
384
390
  }
385
391
  })(token);
386
- if (!valid)
387
- throw new Error(`Invalid offset: ${offset2}`);
392
+ if (!valid) throw new Error(`Invalid offset: ${offset2}`);
388
393
  return offset2;
389
394
  }
390
395
  function escapeTokens(str) {
391
- return clockAgnostic.concat(clock24).concat(clock12).sort((a, b) => a[0].length > b[0].length ? 1 : -1).reduce((target, part) => {
396
+ return clockAgnostic.concat(clock24).concat(clock12).concat(fractionalSeconds).sort((a, b) => a[0].length > b[0].length ? 1 : -1).reduce((target, part) => {
392
397
  return target.replace(part[0], `\\${part[0]}`);
393
398
  }, str);
394
399
  }
@@ -402,10 +407,8 @@ function validate(parts2) {
402
407
  throw new Error(`Numbers in format (${part.partValue}).`);
403
408
  }
404
409
  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
- );
410
+ if (!(lastPart.token in fixedLength) && !(part.token in fixedLength) && !(isNumeric(lastPart) && part.token.toLowerCase() === "a") && lastPart.token !== "SSS") {
411
+ throw new Error(`Illegal adjacent tokens (${lastPart.token}, ${part.token})`);
409
412
  }
410
413
  }
411
414
  lastPart = part;
@@ -422,8 +425,7 @@ function getOffsetFormat(format2) {
422
425
  // src/ap.ts
423
426
  function ap(ampm, locale) {
424
427
  const l = dayPeriodMap.get(locale);
425
- if (l && l[ampm])
426
- return l[ampm];
428
+ if (l && l[ampm]) return l[ampm];
427
429
  const specimen = new Date(specDate);
428
430
  specimen.setUTCHours(ampm === "am" ? 5 : 20);
429
431
  const subparts = new Intl.DateTimeFormat(locale, {
@@ -446,16 +448,10 @@ function ap(ampm, locale) {
446
448
  // src/applyOffset.ts
447
449
  function applyOffset(dateInput, offset2 = "+00:00") {
448
450
  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);
451
+ const len = fixedLengthByOffset(offset2);
452
+ const token = len === 5 || len === 8 ? "ZZ" : "Z";
453
+ const timeDiffInSecs = offsetToSecs(offset2, token);
454
+ return new Date(d.getTime() + timeDiffInSecs * 1e3);
459
455
  }
460
456
 
461
457
  // src/deviceTZ.ts
@@ -489,10 +485,8 @@ function offset(utcTime, tzA = "UTC", tzB = "device", timeZoneToken = "Z") {
489
485
  const d = date(utcTime);
490
486
  const timeA = relativeTime(d, tzA);
491
487
  const timeB = relativeTime(d, tzB);
492
- const timeDiffInMins = Math.round(
493
- (timeB.getTime() - timeA.getTime()) / 1e3 / 60
494
- );
495
- return minsToOffset(timeDiffInMins, timeZoneToken);
488
+ const timeDiffInSecs = Math.round((timeB.getTime() - timeA.getTime()) / 1e3);
489
+ return secsToOffset(timeDiffInSecs, timeZoneToken);
496
490
  }
497
491
 
498
492
  // src/tzDate.ts
@@ -519,7 +513,7 @@ function dayEnd(inputDate) {
519
513
  // src/dayStart.ts
520
514
  function dayStart(inputDate) {
521
515
  const d = date(inputDate);
522
- d.setHours(0, 0, 0);
516
+ d.setHours(0, 0, 0, 0);
523
517
  return d;
524
518
  }
525
519
 
@@ -531,13 +525,11 @@ function parts(format2, locale) {
531
525
  let f = format2;
532
526
  let match = 0;
533
527
  const testPattern = (pattern) => {
534
- if (!pattern[2])
535
- pattern[2] = new RegExp(`(.)?(${pattern[0]})`, "g");
528
+ if (!pattern[2]) pattern[2] = new RegExp(`(.)?(${pattern[0]})`, "g");
536
529
  if (pattern[2].test(f)) {
537
530
  let didAdd = 0;
538
531
  f = f.replace(pattern[2], (_, prefix, actualMatch) => {
539
- if (prefix === "\\")
540
- return actualMatch;
532
+ if (prefix === "\\") return actualMatch;
541
533
  return `${typeof prefix === "string" ? prefix : ""}{!${didAdd++ ? match : match++}!}`;
542
534
  });
543
535
  return !!didAdd;
@@ -564,7 +556,7 @@ function parts(format2, locale) {
564
556
  hour12
565
557
  };
566
558
  }
567
- const found24Patterns = clockAgnostic.filter(testPattern).concat(clock24.filter(testPattern)).map(createPart.bind(null, false));
559
+ const found24Patterns = clockAgnostic.filter(testPattern).concat(clock24.filter(testPattern)).concat(fractionalSeconds.filter(testPattern)).map(createPart.bind(null, false));
568
560
  const parts2 = validate2(
569
561
  found24Patterns.concat(
570
562
  clock12.filter(testPattern).map(createPart.bind(null, true))
@@ -593,10 +585,8 @@ function styleParts(format2, locale) {
593
585
  if (typeof format2 === "string") {
594
586
  options.dateStyle = format2;
595
587
  } else {
596
- if ("date" in format2)
597
- options.dateStyle = format2.date;
598
- if ("time" in format2)
599
- options.timeStyle = format2.time;
588
+ if ("date" in format2) options.dateStyle = format2.date;
589
+ if ("time" in format2) options.timeStyle = format2.time;
600
590
  }
601
591
  const formatter = new Intl.DateTimeFormat(locale, options);
602
592
  const segments = formatter.formatToParts(new Date(specDate)).map(normStr);
@@ -612,11 +602,9 @@ function styleParts(format2, locale) {
612
602
  part.type === "hour" ? hourType : void 0,
613
603
  options
614
604
  );
615
- if (formatPattern === void 0)
616
- return;
605
+ if (formatPattern === void 0) return;
617
606
  const partValue = formatPattern[1][partName];
618
- if (!partValue)
619
- return;
607
+ if (!partValue) return;
620
608
  if (!formatPattern[2])
621
609
  formatPattern[2] = new RegExp(`${formatPattern[0]}`, "g");
622
610
  return {
@@ -637,8 +625,7 @@ function guessPattern(partName, partValue, locale, hour, options) {
637
625
  case "year":
638
626
  return l === 2 ? tokens.get("YY") : tokens.get("YYYY");
639
627
  case "month":
640
- if (n)
641
- return l === 1 ? tokens.get("M") : tokens.get("MM");
628
+ if (n) return l === 1 ? tokens.get("M") : tokens.get("MM");
642
629
  style = partStyle(locale, partName, partValue);
643
630
  switch (style) {
644
631
  case "long":
@@ -659,8 +646,7 @@ function guessPattern(partName, partValue, locale, hour, options) {
659
646
  return tokens.get("dddd");
660
647
  }
661
648
  case "hour":
662
- if (hour === 12)
663
- return l === 1 ? tokens.get("h") : tokens.get("hh");
649
+ if (hour === 12) return l === 1 ? tokens.get("h") : tokens.get("hh");
664
650
  return l === 1 ? tokens.get("H") : tokens.get("HH");
665
651
  case "minute":
666
652
  return l === 1 ? tokens.get("m") : tokens.get("mm");
@@ -685,8 +671,7 @@ function partStyle(locale, part, value) {
685
671
  const formats2 = {};
686
672
  for (let i = 0; i < 12; i++) {
687
673
  date2.setMonth(0 + i);
688
- if (i in weekdays)
689
- date2.setDate(weekdays[i]);
674
+ if (i in weekdays) date2.setDate(weekdays[i]);
690
675
  date2.setUTCHours(8 + i);
691
676
  for (const style of partStyles) {
692
677
  const segments = new Intl.DateTimeFormat(
@@ -705,12 +690,10 @@ function partStyle(locale, part, value) {
705
690
  (part2) => part2.type === "month"
706
691
  );
707
692
  const index = segments.findIndex((part2) => part2.type === "month");
708
- if (index > -1 && genitiveMonth)
709
- segments[index] = genitiveMonth;
693
+ if (index > -1 && genitiveMonth) segments[index] = genitiveMonth;
710
694
  }
711
695
  segments.forEach((part2) => {
712
- if (part2.type === "literal")
713
- return;
696
+ if (part2.type === "literal") return;
714
697
  const type = part2.type;
715
698
  formats2[type] = Object.assign(formats2[type] || {}, {
716
699
  [part2.value]: style
@@ -752,8 +735,7 @@ function format(inputDateOrOptions, format2 = "long", locale = "device", genitiv
752
735
  tz
753
736
  } = inputDateOrOptions);
754
737
  }
755
- if (format2 === "ISO8601")
756
- return date(inputDateOrOptions).toISOString();
738
+ if (format2 === "ISO8601") return date(inputDateOrOptions).toISOString();
757
739
  if (tz) {
758
740
  forceOffset = offset(inputDateOrOptions, "utc", tz, getOffsetFormat(format2));
759
741
  }
@@ -769,7 +751,7 @@ function format(inputDateOrOptions, format2 = "long", locale = "device", genitiv
769
751
  }
770
752
  return fill(
771
753
  inputDateOrOptions,
772
- parts(format2, locale).filter(partFilter != null ? partFilter : () => true),
754
+ parts(format2, locale).filter(partFilter != null ? partFilter : (() => true)),
773
755
  locale,
774
756
  genitive,
775
757
  forceOffset
@@ -803,7 +785,7 @@ function hourEnd(inputDate) {
803
785
  // src/hourStart.ts
804
786
  function hourStart(inputDate) {
805
787
  const d = date(inputDate);
806
- d.setMinutes(0, 0);
788
+ d.setMinutes(0, 0, 0);
807
789
  return d;
808
790
  }
809
791
 
@@ -817,7 +799,7 @@ function minuteEnd(inputDate) {
817
799
  // src/minuteStart.ts
818
800
  function minuteStart(inputDate) {
819
801
  const d = date(inputDate);
820
- d.setSeconds(0);
802
+ d.setSeconds(0, 0);
821
803
  return d;
822
804
  }
823
805
 
@@ -825,7 +807,7 @@ function minuteStart(inputDate) {
825
807
  function monthStart(inputDate) {
826
808
  const d = date(inputDate);
827
809
  d.setDate(1);
828
- d.setHours(0, 0, 0);
810
+ d.setHours(0, 0, 0, 0);
829
811
  return d;
830
812
  }
831
813
 
@@ -861,13 +843,11 @@ function nearestDay(inputDate, search, constraint = 7) {
861
843
  for (let i = 0; i <= increments || i < decrements; i++) {
862
844
  if (i <= increments) {
863
845
  const next = addDay(d, i);
864
- if (search(next))
865
- return next;
846
+ if (search(next)) return next;
866
847
  }
867
848
  if (i && i <= decrements) {
868
849
  const prev = addDay(d, -i);
869
- if (search(prev))
870
- return prev;
850
+ if (search(prev)) return prev;
871
851
  }
872
852
  }
873
853
  return null;
@@ -876,8 +856,7 @@ function nearestDay(inputDate, search, constraint = 7) {
876
856
  // src/range.ts
877
857
  function range(token, locale = "en", genitive = false) {
878
858
  const r = (n, c) => Array(n).fill("").map((_, i) => `${c(i)}`);
879
- if (token === "M")
880
- return r(12, (i) => i + 1);
859
+ if (token === "M") return r(12, (i) => i + 1);
881
860
  if (token === "MM")
882
861
  return r(12, (i) => {
883
862
  const m = i + 1;
@@ -935,19 +914,16 @@ function parse(dateStrOrOptions, format2 = "ISO8601", locale = "device") {
935
914
  } else {
936
915
  dateStr = dateStrOrOptions;
937
916
  }
938
- if (!dateStr)
939
- throw new Error("parse() requires a date string.");
917
+ if (!dateStr) throw new Error("parse() requires a date string.");
940
918
  const invalid = () => {
941
919
  throw new Error(
942
920
  `Date (${dateStr}) does not match format (${formatStr(format2, locale)})`
943
921
  );
944
922
  };
945
- if (format2 === "ISO8601")
946
- return date(dateStr);
923
+ if (format2 === "ISO8601") return date(dateStr);
947
924
  const genitive = styles.includes(format2) || typeof format2 === "object";
948
925
  const formatParts = validate(parts(format2, locale).filter(partFilter));
949
- if (!formatParts.length)
950
- throw new Error("parse() requires a pattern.");
926
+ if (!formatParts.length) throw new Error("parse() requires a pattern.");
951
927
  let parsedParts;
952
928
  try {
953
929
  parsedParts = parseParts(dateStr, formatParts);
@@ -961,17 +937,19 @@ function parse(dateStrOrOptions, format2 = "ISO8601", locale = "device") {
961
937
  ["DD", now.getDate()],
962
938
  ["HH", 0],
963
939
  ["mm", 0],
964
- ["ss", 0]
940
+ ["ss", 0],
941
+ ["SSS", 0]
965
942
  ]);
966
943
  let a = null;
967
944
  let offset2 = "";
968
945
  parsedParts.forEach((part) => {
969
- if (part.partName === "literal")
970
- return;
971
- if (part.token === part.value)
972
- return invalid();
946
+ if (part.partName === "literal") return;
947
+ if (part.token === part.value) return invalid();
973
948
  const v = Number(part.value);
974
- if (parsed.has(part.token)) {
949
+ if (part.token === "SSS") {
950
+ const digits = part.value.padEnd(3, "0").slice(0, 3);
951
+ parsed.set("SSS", Number(digits));
952
+ } else if (parsed.has(part.token)) {
975
953
  parsed.set(part.token, v);
976
954
  } else if (part.token === "YY") {
977
955
  parsed.set("YYYY", fourDigitYear(part.value));
@@ -1011,17 +989,24 @@ function parse(dateStrOrOptions, format2 = "ISO8601", locale = "device") {
1011
989
  parsed.set("HH", 0);
1012
990
  }
1013
991
  parsed.set("MM", (parsed.get("MM") || 1) - 1);
1014
- let [Y, M, D, h, m, s] = Array.from(parsed.values());
992
+ let [Y, M, D, h, m, s, ms] = Array.from(parsed.values());
1015
993
  const maxDaysInMonth = monthDays(/* @__PURE__ */ new Date(`${four(Y)}-${two(M + 1)}-10`));
1016
994
  if (maxDaysInMonth < D && dateOverflow === "throw")
1017
995
  throw new Error(`Invalid date ${four(Y)}-${two(M + 1)}-${two(D)}`);
1018
996
  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}`;
997
+ const msStr = String(ms).padStart(3, "0");
998
+ if (offset2) {
999
+ const isoStringUtc = `${four(Y)}-${two(M + 1)}-${two(D)}T${two(h)}:${two(m)}:${two(s)}.${msStr}Z`;
1000
+ const d2 = new Date(isoStringUtc);
1001
+ if (!isFinite(+d2)) return invalid();
1002
+ const len = fixedLengthByOffset(offset2);
1003
+ const token = len === 5 || len === 8 ? "ZZ" : "Z";
1004
+ const offsetSecs = offsetToSecs(offset2, token);
1005
+ return new Date(d2.getTime() - offsetSecs * 1e3);
1006
+ }
1007
+ const isoString = `${four(Y)}-${two(M + 1)}-${two(D)}T${two(h)}:${two(m)}:${two(s)}.${msStr}`;
1022
1008
  const d = new Date(isoString);
1023
- if (isFinite(+d))
1024
- return d;
1009
+ if (isFinite(+d)) return d;
1025
1010
  return invalid();
1026
1011
  }
1027
1012
  function parseParts(dateStr, formatParts) {
@@ -1041,13 +1026,18 @@ function parseParts(dateStr, formatParts) {
1041
1026
  len = current.partValue.length;
1042
1027
  } else if (current.partName === "timeZoneName") {
1043
1028
  len = fixedLengthByOffset(dateStr.substring(pos));
1029
+ } else if (current.token === "SSS") {
1030
+ let end = pos;
1031
+ while (end < dateStr.length && /\d/.test(dateStr.charAt(end))) {
1032
+ end++;
1033
+ }
1034
+ len = end - pos;
1044
1035
  } else if (current.token in fixedLength) {
1045
1036
  len = fixedLength[current.token];
1046
1037
  } else if (next) {
1047
1038
  if (next.partName === "literal") {
1048
1039
  len = dateStr.indexOf(next.partValue, pos) - pos;
1049
- if (len < 0)
1050
- throw new Error();
1040
+ if (len < 0) throw new Error();
1051
1041
  } else if (next.partName === "dayPeriod") {
1052
1042
  for (let i2 = 1; i2 <= 4; i2++) {
1053
1043
  if (isNaN(Number(dateStr.charAt(pos + i2)))) {
@@ -1057,8 +1047,7 @@ function parseParts(dateStr, formatParts) {
1057
1047
  }
1058
1048
  } else {
1059
1049
  const nextChar = dateStr.substring(pos).search(/\d/);
1060
- if (nextChar !== -1)
1061
- len = pos + nextChar;
1050
+ if (nextChar !== -1) len = pos + nextChar;
1062
1051
  }
1063
1052
  } else {
1064
1053
  len = dateStr.length;
@@ -1083,6 +1072,13 @@ function sameSecond(inputDateA, inputDateB) {
1083
1072
  return a.getSeconds() === b.getSeconds();
1084
1073
  }
1085
1074
 
1075
+ // src/sameMillisecond.ts
1076
+ function sameMillisecond(inputDateA, inputDateB) {
1077
+ const a = date(inputDateA);
1078
+ const b = date(inputDateB);
1079
+ return a.getMilliseconds() === b.getMilliseconds();
1080
+ }
1081
+
1086
1082
  // src/sameMinute.ts
1087
1083
  function sameMinute(inputDateA, inputDateB) {
1088
1084
  const a = date(inputDateA);
@@ -1108,10 +1104,9 @@ function sameYear(inputDateA, inputDateB) {
1108
1104
  function weekStart(inputDate, startOfWeekDay = 0) {
1109
1105
  const d = date(inputDate);
1110
1106
  let diff = startOfWeekDay - d.getDay();
1111
- if (diff > 0)
1112
- diff = diff - 7;
1107
+ if (diff > 0) diff = diff - 7;
1113
1108
  d.setDate(d.getDate() + diff);
1114
- d.setHours(0, 0, 0);
1109
+ d.setHours(0, 0, 0, 0);
1115
1110
  return d;
1116
1111
  }
1117
1112
 
@@ -1119,24 +1114,22 @@ function weekStart(inputDate, startOfWeekDay = 0) {
1119
1114
  function weekEnd(inputDate, startOfWeekDay = 0) {
1120
1115
  const d = weekStart(inputDate, startOfWeekDay);
1121
1116
  d.setDate(d.getDate() + 6);
1122
- d.setHours(23, 59, 59);
1117
+ d.setHours(23, 59, 59, 999);
1123
1118
  return d;
1124
1119
  }
1125
1120
 
1126
1121
  // src/yearStart.ts
1127
1122
  function yearStart(inputDate) {
1128
1123
  const d = date(inputDate);
1129
- d.setMonth(0);
1130
- d.setDate(1);
1131
- d.setHours(0, 0, 0);
1124
+ d.setMonth(0, 1);
1125
+ d.setHours(0, 0, 0, 0);
1132
1126
  return d;
1133
1127
  }
1134
1128
 
1135
1129
  // src/yearEnd.ts
1136
1130
  function yearEnd(inputDate) {
1137
1131
  const d = date(inputDate);
1138
- d.setMonth(11);
1139
- d.setDate(31);
1132
+ d.setMonth(11, 31);
1140
1133
  d.setHours(23, 59, 59, 999);
1141
1134
  return d;
1142
1135
  }
@@ -1162,6 +1155,16 @@ function isEqual(dateLeft, dateRight) {
1162
1155
  return +_dateLeft === +_dateRight;
1163
1156
  }
1164
1157
 
1158
+ // src/isPast.ts
1159
+ function isPast(inputDate) {
1160
+ return isBefore(inputDate);
1161
+ }
1162
+
1163
+ // src/isFuture.ts
1164
+ function isFuture(inputDate) {
1165
+ return isAfter(inputDate);
1166
+ }
1167
+
1165
1168
  // src/diffMilliseconds.ts
1166
1169
  function diffMilliseconds(dateA, dateB) {
1167
1170
  const left = date(dateA);
@@ -1177,17 +1180,26 @@ function diffRound(value, method = "trunc") {
1177
1180
 
1178
1181
  // src/diffSeconds.ts
1179
1182
  function diffSeconds(dateA, dateB, roundingMethod) {
1180
- return diffRound(diffMilliseconds(dateA, dateB) / 1e3, roundingMethod);
1183
+ return diffRound(
1184
+ // @ts-ignore
1185
+ diffMilliseconds(dateA, dateB) / 1e3,
1186
+ roundingMethod
1187
+ );
1181
1188
  }
1182
1189
 
1183
1190
  // src/diffMinutes.ts
1184
1191
  function diffMinutes(dateA, dateB, roundingMethod) {
1185
- return diffRound(diffMilliseconds(dateA, dateB) / 6e4, roundingMethod);
1192
+ return diffRound(
1193
+ //@ts-ignore
1194
+ diffMilliseconds(dateA, dateB) / 6e4,
1195
+ roundingMethod
1196
+ );
1186
1197
  }
1187
1198
 
1188
1199
  // src/diffHours.ts
1189
1200
  function diffHours(dateA, dateB, roundingMethod) {
1190
1201
  return diffRound(
1202
+ //@ts-ignore
1191
1203
  diffMilliseconds(dateA, dateB) / 36e5,
1192
1204
  // 1000 * 60 * 60
1193
1205
  roundingMethod
@@ -1197,6 +1209,7 @@ function diffHours(dateA, dateB, roundingMethod) {
1197
1209
  // src/diffDays.ts
1198
1210
  function diffDays(dateA, dateB, roundingMethod) {
1199
1211
  return diffRound(
1212
+ // @ts-ignore
1200
1213
  diffMilliseconds(dateA, dateB) / 864e5,
1201
1214
  // hour * 24
1202
1215
  roundingMethod
@@ -1234,13 +1247,17 @@ function diffMonths(dateA, dateB) {
1234
1247
 
1235
1248
  // src/diffYears.ts
1236
1249
  function diffYears(dateA, dateB) {
1237
- const r = Math.trunc(diffMonths(dateA, dateB) / 12);
1250
+ const r = Math.trunc(
1251
+ //@ts-ignore
1252
+ diffMonths(dateA, dateB) / 12
1253
+ );
1238
1254
  return r == 0 ? 0 : r;
1239
1255
  }
1240
1256
  // Annotate the CommonJS export names for ESM import in node:
1241
1257
  0 && (module.exports = {
1242
1258
  addDay,
1243
1259
  addHour,
1260
+ addMillisecond,
1244
1261
  addMinute,
1245
1262
  addMonth,
1246
1263
  addSecond,
@@ -1267,6 +1284,8 @@ function diffYears(dateA, dateB) {
1267
1284
  isAfter,
1268
1285
  isBefore,
1269
1286
  isEqual,
1287
+ isFuture,
1288
+ isPast,
1270
1289
  iso8601,
1271
1290
  minuteEnd,
1272
1291
  minuteStart,
@@ -1282,6 +1301,7 @@ function diffYears(dateA, dateB) {
1282
1301
  removeOffset,
1283
1302
  sameDay,
1284
1303
  sameHour,
1304
+ sameMillisecond,
1285
1305
  sameMinute,
1286
1306
  sameSecond,
1287
1307
  sameYear,