@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/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")}`;
372
+ }
373
+ function minsToOffset(timeDiffInMins, token = "Z") {
374
+ return secsToOffset(timeDiffInMins * 60, token);
368
375
  }
369
- function offsetToMins(offset2, token) {
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,8 +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 = (timeB.getTime() - timeA.getTime()) / 1e3 / 60;
493
- return minsToOffset(timeDiffInMins, timeZoneToken);
488
+ const timeDiffInSecs = Math.round((timeB.getTime() - timeA.getTime()) / 1e3);
489
+ return secsToOffset(timeDiffInSecs, timeZoneToken);
494
490
  }
495
491
 
496
492
  // src/tzDate.ts
@@ -517,7 +513,7 @@ function dayEnd(inputDate) {
517
513
  // src/dayStart.ts
518
514
  function dayStart(inputDate) {
519
515
  const d = date(inputDate);
520
- d.setHours(0, 0, 0);
516
+ d.setHours(0, 0, 0, 0);
521
517
  return d;
522
518
  }
523
519
 
@@ -529,13 +525,11 @@ function parts(format2, locale) {
529
525
  let f = format2;
530
526
  let match = 0;
531
527
  const testPattern = (pattern) => {
532
- if (!pattern[2])
533
- pattern[2] = new RegExp(`(.)?(${pattern[0]})`, "g");
528
+ if (!pattern[2]) pattern[2] = new RegExp(`(.)?(${pattern[0]})`, "g");
534
529
  if (pattern[2].test(f)) {
535
530
  let didAdd = 0;
536
531
  f = f.replace(pattern[2], (_, prefix, actualMatch) => {
537
- if (prefix === "\\")
538
- return actualMatch;
532
+ if (prefix === "\\") return actualMatch;
539
533
  return `${typeof prefix === "string" ? prefix : ""}{!${didAdd++ ? match : match++}!}`;
540
534
  });
541
535
  return !!didAdd;
@@ -562,7 +556,7 @@ function parts(format2, locale) {
562
556
  hour12
563
557
  };
564
558
  }
565
- 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));
566
560
  const parts2 = validate2(
567
561
  found24Patterns.concat(
568
562
  clock12.filter(testPattern).map(createPart.bind(null, true))
@@ -591,10 +585,8 @@ function styleParts(format2, locale) {
591
585
  if (typeof format2 === "string") {
592
586
  options.dateStyle = format2;
593
587
  } else {
594
- if ("date" in format2)
595
- options.dateStyle = format2.date;
596
- if ("time" in format2)
597
- options.timeStyle = format2.time;
588
+ if ("date" in format2) options.dateStyle = format2.date;
589
+ if ("time" in format2) options.timeStyle = format2.time;
598
590
  }
599
591
  const formatter = new Intl.DateTimeFormat(locale, options);
600
592
  const segments = formatter.formatToParts(new Date(specDate)).map(normStr);
@@ -610,11 +602,9 @@ function styleParts(format2, locale) {
610
602
  part.type === "hour" ? hourType : void 0,
611
603
  options
612
604
  );
613
- if (formatPattern === void 0)
614
- return;
605
+ if (formatPattern === void 0) return;
615
606
  const partValue = formatPattern[1][partName];
616
- if (!partValue)
617
- return;
607
+ if (!partValue) return;
618
608
  if (!formatPattern[2])
619
609
  formatPattern[2] = new RegExp(`${formatPattern[0]}`, "g");
620
610
  return {
@@ -635,8 +625,7 @@ function guessPattern(partName, partValue, locale, hour, options) {
635
625
  case "year":
636
626
  return l === 2 ? tokens.get("YY") : tokens.get("YYYY");
637
627
  case "month":
638
- if (n)
639
- return l === 1 ? tokens.get("M") : tokens.get("MM");
628
+ if (n) return l === 1 ? tokens.get("M") : tokens.get("MM");
640
629
  style = partStyle(locale, partName, partValue);
641
630
  switch (style) {
642
631
  case "long":
@@ -657,8 +646,7 @@ function guessPattern(partName, partValue, locale, hour, options) {
657
646
  return tokens.get("dddd");
658
647
  }
659
648
  case "hour":
660
- if (hour === 12)
661
- return l === 1 ? tokens.get("h") : tokens.get("hh");
649
+ if (hour === 12) return l === 1 ? tokens.get("h") : tokens.get("hh");
662
650
  return l === 1 ? tokens.get("H") : tokens.get("HH");
663
651
  case "minute":
664
652
  return l === 1 ? tokens.get("m") : tokens.get("mm");
@@ -683,8 +671,7 @@ function partStyle(locale, part, value) {
683
671
  const formats2 = {};
684
672
  for (let i = 0; i < 12; i++) {
685
673
  date2.setMonth(0 + i);
686
- if (i in weekdays)
687
- date2.setDate(weekdays[i]);
674
+ if (i in weekdays) date2.setDate(weekdays[i]);
688
675
  date2.setUTCHours(8 + i);
689
676
  for (const style of partStyles) {
690
677
  const segments = new Intl.DateTimeFormat(
@@ -703,12 +690,10 @@ function partStyle(locale, part, value) {
703
690
  (part2) => part2.type === "month"
704
691
  );
705
692
  const index = segments.findIndex((part2) => part2.type === "month");
706
- if (index > -1 && genitiveMonth)
707
- segments[index] = genitiveMonth;
693
+ if (index > -1 && genitiveMonth) segments[index] = genitiveMonth;
708
694
  }
709
695
  segments.forEach((part2) => {
710
- if (part2.type === "literal")
711
- return;
696
+ if (part2.type === "literal") return;
712
697
  const type = part2.type;
713
698
  formats2[type] = Object.assign(formats2[type] || {}, {
714
699
  [part2.value]: style
@@ -750,8 +735,7 @@ function format(inputDateOrOptions, format2 = "long", locale = "device", genitiv
750
735
  tz
751
736
  } = inputDateOrOptions);
752
737
  }
753
- if (format2 === "ISO8601")
754
- return date(inputDateOrOptions).toISOString();
738
+ if (format2 === "ISO8601") return date(inputDateOrOptions).toISOString();
755
739
  if (tz) {
756
740
  forceOffset = offset(inputDateOrOptions, "utc", tz, getOffsetFormat(format2));
757
741
  }
@@ -767,7 +751,7 @@ function format(inputDateOrOptions, format2 = "long", locale = "device", genitiv
767
751
  }
768
752
  return fill(
769
753
  inputDateOrOptions,
770
- parts(format2, locale).filter(partFilter != null ? partFilter : () => true),
754
+ parts(format2, locale).filter(partFilter != null ? partFilter : (() => true)),
771
755
  locale,
772
756
  genitive,
773
757
  forceOffset
@@ -801,7 +785,7 @@ function hourEnd(inputDate) {
801
785
  // src/hourStart.ts
802
786
  function hourStart(inputDate) {
803
787
  const d = date(inputDate);
804
- d.setMinutes(0, 0);
788
+ d.setMinutes(0, 0, 0);
805
789
  return d;
806
790
  }
807
791
 
@@ -815,7 +799,7 @@ function minuteEnd(inputDate) {
815
799
  // src/minuteStart.ts
816
800
  function minuteStart(inputDate) {
817
801
  const d = date(inputDate);
818
- d.setSeconds(0);
802
+ d.setSeconds(0, 0);
819
803
  return d;
820
804
  }
821
805
 
@@ -823,7 +807,7 @@ function minuteStart(inputDate) {
823
807
  function monthStart(inputDate) {
824
808
  const d = date(inputDate);
825
809
  d.setDate(1);
826
- d.setHours(0, 0, 0);
810
+ d.setHours(0, 0, 0, 0);
827
811
  return d;
828
812
  }
829
813
 
@@ -859,13 +843,11 @@ function nearestDay(inputDate, search, constraint = 7) {
859
843
  for (let i = 0; i <= increments || i < decrements; i++) {
860
844
  if (i <= increments) {
861
845
  const next = addDay(d, i);
862
- if (search(next))
863
- return next;
846
+ if (search(next)) return next;
864
847
  }
865
848
  if (i && i <= decrements) {
866
849
  const prev = addDay(d, -i);
867
- if (search(prev))
868
- return prev;
850
+ if (search(prev)) return prev;
869
851
  }
870
852
  }
871
853
  return null;
@@ -874,8 +856,7 @@ function nearestDay(inputDate, search, constraint = 7) {
874
856
  // src/range.ts
875
857
  function range(token, locale = "en", genitive = false) {
876
858
  const r = (n, c) => Array(n).fill("").map((_, i) => `${c(i)}`);
877
- if (token === "M")
878
- return r(12, (i) => i + 1);
859
+ if (token === "M") return r(12, (i) => i + 1);
879
860
  if (token === "MM")
880
861
  return r(12, (i) => {
881
862
  const m = i + 1;
@@ -933,19 +914,16 @@ function parse(dateStrOrOptions, format2 = "ISO8601", locale = "device") {
933
914
  } else {
934
915
  dateStr = dateStrOrOptions;
935
916
  }
936
- if (!dateStr)
937
- throw new Error("parse() requires a date string.");
917
+ if (!dateStr) throw new Error("parse() requires a date string.");
938
918
  const invalid = () => {
939
919
  throw new Error(
940
920
  `Date (${dateStr}) does not match format (${formatStr(format2, locale)})`
941
921
  );
942
922
  };
943
- if (format2 === "ISO8601")
944
- return date(dateStr);
923
+ if (format2 === "ISO8601") return date(dateStr);
945
924
  const genitive = styles.includes(format2) || typeof format2 === "object";
946
925
  const formatParts = validate(parts(format2, locale).filter(partFilter));
947
- if (!formatParts.length)
948
- throw new Error("parse() requires a pattern.");
926
+ if (!formatParts.length) throw new Error("parse() requires a pattern.");
949
927
  let parsedParts;
950
928
  try {
951
929
  parsedParts = parseParts(dateStr, formatParts);
@@ -959,17 +937,19 @@ function parse(dateStrOrOptions, format2 = "ISO8601", locale = "device") {
959
937
  ["DD", now.getDate()],
960
938
  ["HH", 0],
961
939
  ["mm", 0],
962
- ["ss", 0]
940
+ ["ss", 0],
941
+ ["SSS", 0]
963
942
  ]);
964
943
  let a = null;
965
944
  let offset2 = "";
966
945
  parsedParts.forEach((part) => {
967
- if (part.partName === "literal")
968
- return;
969
- if (part.token === part.value)
970
- return invalid();
946
+ if (part.partName === "literal") return;
947
+ if (part.token === part.value) return invalid();
971
948
  const v = Number(part.value);
972
- 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)) {
973
953
  parsed.set(part.token, v);
974
954
  } else if (part.token === "YY") {
975
955
  parsed.set("YYYY", fourDigitYear(part.value));
@@ -1009,17 +989,24 @@ function parse(dateStrOrOptions, format2 = "ISO8601", locale = "device") {
1009
989
  parsed.set("HH", 0);
1010
990
  }
1011
991
  parsed.set("MM", (parsed.get("MM") || 1) - 1);
1012
- let [Y, M, D, h, m, s] = Array.from(parsed.values());
992
+ let [Y, M, D, h, m, s, ms] = Array.from(parsed.values());
1013
993
  const maxDaysInMonth = monthDays(/* @__PURE__ */ new Date(`${four(Y)}-${two(M + 1)}-10`));
1014
994
  if (maxDaysInMonth < D && dateOverflow === "throw")
1015
995
  throw new Error(`Invalid date ${four(Y)}-${two(M + 1)}-${two(D)}`);
1016
996
  D = dateOverflow === "backward" ? Math.min(D, maxDaysInMonth) : D;
1017
- const isoString = `${four(Y)}-${two(M + 1)}-${two(D)}T${two(h)}:${two(
1018
- m
1019
- )}:${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}`;
1020
1008
  const d = new Date(isoString);
1021
- if (isFinite(+d))
1022
- return d;
1009
+ if (isFinite(+d)) return d;
1023
1010
  return invalid();
1024
1011
  }
1025
1012
  function parseParts(dateStr, formatParts) {
@@ -1039,13 +1026,18 @@ function parseParts(dateStr, formatParts) {
1039
1026
  len = current.partValue.length;
1040
1027
  } else if (current.partName === "timeZoneName") {
1041
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;
1042
1035
  } else if (current.token in fixedLength) {
1043
1036
  len = fixedLength[current.token];
1044
1037
  } else if (next) {
1045
1038
  if (next.partName === "literal") {
1046
1039
  len = dateStr.indexOf(next.partValue, pos) - pos;
1047
- if (len < 0)
1048
- throw new Error();
1040
+ if (len < 0) throw new Error();
1049
1041
  } else if (next.partName === "dayPeriod") {
1050
1042
  for (let i2 = 1; i2 <= 4; i2++) {
1051
1043
  if (isNaN(Number(dateStr.charAt(pos + i2)))) {
@@ -1055,8 +1047,7 @@ function parseParts(dateStr, formatParts) {
1055
1047
  }
1056
1048
  } else {
1057
1049
  const nextChar = dateStr.substring(pos).search(/\d/);
1058
- if (nextChar !== -1)
1059
- len = pos + nextChar;
1050
+ if (nextChar !== -1) len = pos + nextChar;
1060
1051
  }
1061
1052
  } else {
1062
1053
  len = dateStr.length;
@@ -1081,6 +1072,13 @@ function sameSecond(inputDateA, inputDateB) {
1081
1072
  return a.getSeconds() === b.getSeconds();
1082
1073
  }
1083
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
+
1084
1082
  // src/sameMinute.ts
1085
1083
  function sameMinute(inputDateA, inputDateB) {
1086
1084
  const a = date(inputDateA);
@@ -1106,10 +1104,9 @@ function sameYear(inputDateA, inputDateB) {
1106
1104
  function weekStart(inputDate, startOfWeekDay = 0) {
1107
1105
  const d = date(inputDate);
1108
1106
  let diff = startOfWeekDay - d.getDay();
1109
- if (diff > 0)
1110
- diff = diff - 7;
1107
+ if (diff > 0) diff = diff - 7;
1111
1108
  d.setDate(d.getDate() + diff);
1112
- d.setHours(0, 0, 0);
1109
+ d.setHours(0, 0, 0, 0);
1113
1110
  return d;
1114
1111
  }
1115
1112
 
@@ -1117,24 +1114,22 @@ function weekStart(inputDate, startOfWeekDay = 0) {
1117
1114
  function weekEnd(inputDate, startOfWeekDay = 0) {
1118
1115
  const d = weekStart(inputDate, startOfWeekDay);
1119
1116
  d.setDate(d.getDate() + 6);
1120
- d.setHours(23, 59, 59);
1117
+ d.setHours(23, 59, 59, 999);
1121
1118
  return d;
1122
1119
  }
1123
1120
 
1124
1121
  // src/yearStart.ts
1125
1122
  function yearStart(inputDate) {
1126
1123
  const d = date(inputDate);
1127
- d.setMonth(0);
1128
- d.setDate(1);
1129
- d.setHours(0, 0, 0);
1124
+ d.setMonth(0, 1);
1125
+ d.setHours(0, 0, 0, 0);
1130
1126
  return d;
1131
1127
  }
1132
1128
 
1133
1129
  // src/yearEnd.ts
1134
1130
  function yearEnd(inputDate) {
1135
1131
  const d = date(inputDate);
1136
- d.setMonth(11);
1137
- d.setDate(31);
1132
+ d.setMonth(11, 31);
1138
1133
  d.setHours(23, 59, 59, 999);
1139
1134
  return d;
1140
1135
  }
@@ -1160,6 +1155,16 @@ function isEqual(dateLeft, dateRight) {
1160
1155
  return +_dateLeft === +_dateRight;
1161
1156
  }
1162
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
+
1163
1168
  // src/diffMilliseconds.ts
1164
1169
  function diffMilliseconds(dateA, dateB) {
1165
1170
  const left = date(dateA);
@@ -1175,17 +1180,26 @@ function diffRound(value, method = "trunc") {
1175
1180
 
1176
1181
  // src/diffSeconds.ts
1177
1182
  function diffSeconds(dateA, dateB, roundingMethod) {
1178
- return diffRound(diffMilliseconds(dateA, dateB) / 1e3, roundingMethod);
1183
+ return diffRound(
1184
+ // @ts-ignore
1185
+ diffMilliseconds(dateA, dateB) / 1e3,
1186
+ roundingMethod
1187
+ );
1179
1188
  }
1180
1189
 
1181
1190
  // src/diffMinutes.ts
1182
1191
  function diffMinutes(dateA, dateB, roundingMethod) {
1183
- return diffRound(diffMilliseconds(dateA, dateB) / 6e4, roundingMethod);
1192
+ return diffRound(
1193
+ //@ts-ignore
1194
+ diffMilliseconds(dateA, dateB) / 6e4,
1195
+ roundingMethod
1196
+ );
1184
1197
  }
1185
1198
 
1186
1199
  // src/diffHours.ts
1187
1200
  function diffHours(dateA, dateB, roundingMethod) {
1188
1201
  return diffRound(
1202
+ //@ts-ignore
1189
1203
  diffMilliseconds(dateA, dateB) / 36e5,
1190
1204
  // 1000 * 60 * 60
1191
1205
  roundingMethod
@@ -1195,6 +1209,7 @@ function diffHours(dateA, dateB, roundingMethod) {
1195
1209
  // src/diffDays.ts
1196
1210
  function diffDays(dateA, dateB, roundingMethod) {
1197
1211
  return diffRound(
1212
+ // @ts-ignore
1198
1213
  diffMilliseconds(dateA, dateB) / 864e5,
1199
1214
  // hour * 24
1200
1215
  roundingMethod
@@ -1232,13 +1247,17 @@ function diffMonths(dateA, dateB) {
1232
1247
 
1233
1248
  // src/diffYears.ts
1234
1249
  function diffYears(dateA, dateB) {
1235
- const r = Math.trunc(diffMonths(dateA, dateB) / 12);
1250
+ const r = Math.trunc(
1251
+ //@ts-ignore
1252
+ diffMonths(dateA, dateB) / 12
1253
+ );
1236
1254
  return r == 0 ? 0 : r;
1237
1255
  }
1238
1256
  // Annotate the CommonJS export names for ESM import in node:
1239
1257
  0 && (module.exports = {
1240
1258
  addDay,
1241
1259
  addHour,
1260
+ addMillisecond,
1242
1261
  addMinute,
1243
1262
  addMonth,
1244
1263
  addSecond,
@@ -1265,6 +1284,8 @@ function diffYears(dateA, dateB) {
1265
1284
  isAfter,
1266
1285
  isBefore,
1267
1286
  isEqual,
1287
+ isFuture,
1288
+ isPast,
1268
1289
  iso8601,
1269
1290
  minuteEnd,
1270
1291
  minuteStart,
@@ -1280,6 +1301,7 @@ function diffYears(dateA, dateB) {
1280
1301
  removeOffset,
1281
1302
  sameDay,
1282
1303
  sameHour,
1304
+ sameMillisecond,
1283
1305
  sameMinute,
1284
1306
  sameSecond,
1285
1307
  sameYear,