@gobrand/tiempo 2.1.1 → 2.1.3

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 (110) hide show
  1. package/README.md +135 -11
  2. package/dist/{chunk-5FRUAUH2.js → chunk-2G5RJGPR.js} +9 -5
  3. package/dist/chunk-2G5RJGPR.js.map +1 -0
  4. package/dist/chunk-2WMXB7QL.js +17 -0
  5. package/dist/chunk-2WMXB7QL.js.map +1 -0
  6. package/dist/chunk-AVGNRINZ.js +9 -0
  7. package/dist/chunk-AVGNRINZ.js.map +1 -0
  8. package/dist/chunk-BBNNR2QH.js +16 -0
  9. package/dist/chunk-BBNNR2QH.js.map +1 -0
  10. package/dist/chunk-CUMB4776.js +18 -0
  11. package/dist/chunk-CUMB4776.js.map +1 -0
  12. package/dist/chunk-GM6RNAYE.js +19 -0
  13. package/dist/chunk-GM6RNAYE.js.map +1 -0
  14. package/dist/chunk-IPJUERCK.js +16 -0
  15. package/dist/chunk-IPJUERCK.js.map +1 -0
  16. package/dist/chunk-MJSZNWCV.js +10 -0
  17. package/dist/chunk-MJSZNWCV.js.map +1 -0
  18. package/dist/chunk-RW3C2677.js +16 -0
  19. package/dist/chunk-RW3C2677.js.map +1 -0
  20. package/dist/chunk-TU2UNOOW.js +15 -0
  21. package/dist/chunk-TU2UNOOW.js.map +1 -0
  22. package/dist/chunk-TW5EV3DH.js +14 -0
  23. package/dist/chunk-TW5EV3DH.js.map +1 -0
  24. package/dist/chunk-XDVUGTUV.js +20 -0
  25. package/dist/chunk-XDVUGTUV.js.map +1 -0
  26. package/dist/chunk-XVJJR7H6.js +20 -0
  27. package/dist/chunk-XVJJR7H6.js.map +1 -0
  28. package/dist/chunk-YR2UCUIT.js +15 -0
  29. package/dist/chunk-YR2UCUIT.js.map +1 -0
  30. package/dist/endOfDay.d.ts +34 -0
  31. package/dist/endOfDay.d.ts.map +1 -0
  32. package/dist/endOfDay.js +9 -0
  33. package/dist/endOfDay.js.map +1 -0
  34. package/dist/endOfDay.test.d.ts +2 -0
  35. package/dist/endOfDay.test.d.ts.map +1 -0
  36. package/dist/endOfMonth.d.ts +34 -0
  37. package/dist/endOfMonth.d.ts.map +1 -0
  38. package/dist/endOfMonth.js +9 -0
  39. package/dist/endOfMonth.js.map +1 -0
  40. package/dist/endOfMonth.test.d.ts +2 -0
  41. package/dist/endOfMonth.test.d.ts.map +1 -0
  42. package/dist/endOfWeek.d.ts +35 -0
  43. package/dist/endOfWeek.d.ts.map +1 -0
  44. package/dist/endOfWeek.js +9 -0
  45. package/dist/endOfWeek.js.map +1 -0
  46. package/dist/endOfWeek.test.d.ts +2 -0
  47. package/dist/endOfWeek.test.d.ts.map +1 -0
  48. package/dist/endOfYear.d.ts +34 -0
  49. package/dist/endOfYear.d.ts.map +1 -0
  50. package/dist/endOfYear.js +9 -0
  51. package/dist/endOfYear.js.map +1 -0
  52. package/dist/endOfYear.test.d.ts +2 -0
  53. package/dist/endOfYear.test.d.ts.map +1 -0
  54. package/dist/format.d.ts.map +1 -1
  55. package/dist/format.js +2 -1
  56. package/dist/index.d.ts +11 -0
  57. package/dist/index.d.ts.map +1 -1
  58. package/dist/index.js +50 -4
  59. package/dist/isAfter.d.ts +40 -0
  60. package/dist/isAfter.d.ts.map +1 -0
  61. package/dist/isAfter.js +8 -0
  62. package/dist/isAfter.js.map +1 -0
  63. package/dist/isAfter.test.d.ts +2 -0
  64. package/dist/isAfter.test.d.ts.map +1 -0
  65. package/dist/isBefore.d.ts +40 -0
  66. package/dist/isBefore.d.ts.map +1 -0
  67. package/dist/isBefore.js +8 -0
  68. package/dist/isBefore.js.map +1 -0
  69. package/dist/isBefore.test.d.ts +2 -0
  70. package/dist/isBefore.test.d.ts.map +1 -0
  71. package/dist/isSameDay.d.ts +58 -0
  72. package/dist/isSameDay.d.ts.map +1 -0
  73. package/dist/isSameDay.js +8 -0
  74. package/dist/isSameDay.js.map +1 -0
  75. package/dist/isSameDay.test.d.ts +2 -0
  76. package/dist/isSameDay.test.d.ts.map +1 -0
  77. package/dist/shared/endOfDay.d.ts +7 -0
  78. package/dist/shared/endOfDay.d.ts.map +1 -0
  79. package/dist/shared/endOfDay.js +7 -0
  80. package/dist/shared/endOfDay.js.map +1 -0
  81. package/dist/shared/normalizeTemporalInput.d.ts +8 -0
  82. package/dist/shared/normalizeTemporalInput.d.ts.map +1 -0
  83. package/dist/shared/normalizeTemporalInput.js +7 -0
  84. package/dist/shared/normalizeTemporalInput.js.map +1 -0
  85. package/dist/startOfDay.d.ts +34 -0
  86. package/dist/startOfDay.d.ts.map +1 -0
  87. package/dist/startOfDay.js +8 -0
  88. package/dist/startOfDay.js.map +1 -0
  89. package/dist/startOfDay.test.d.ts +2 -0
  90. package/dist/startOfDay.test.d.ts.map +1 -0
  91. package/dist/startOfMonth.d.ts +34 -0
  92. package/dist/startOfMonth.d.ts.map +1 -0
  93. package/dist/startOfMonth.js +8 -0
  94. package/dist/startOfMonth.js.map +1 -0
  95. package/dist/startOfMonth.test.d.ts +2 -0
  96. package/dist/startOfMonth.test.d.ts.map +1 -0
  97. package/dist/startOfWeek.d.ts +35 -0
  98. package/dist/startOfWeek.d.ts.map +1 -0
  99. package/dist/startOfWeek.js +8 -0
  100. package/dist/startOfWeek.js.map +1 -0
  101. package/dist/startOfWeek.test.d.ts +2 -0
  102. package/dist/startOfWeek.test.d.ts.map +1 -0
  103. package/dist/startOfYear.d.ts +34 -0
  104. package/dist/startOfYear.d.ts.map +1 -0
  105. package/dist/startOfYear.js +8 -0
  106. package/dist/startOfYear.js.map +1 -0
  107. package/dist/startOfYear.test.d.ts +2 -0
  108. package/dist/startOfYear.test.d.ts.map +1 -0
  109. package/package.json +1 -1
  110. package/dist/chunk-5FRUAUH2.js.map +0 -1
package/README.md CHANGED
@@ -42,7 +42,9 @@ console.log(utc); // "2025-01-20T20:00:00Z"
42
42
 
43
43
  ## API
44
44
 
45
- ### `toZonedTime(input, timezone)`
45
+ ### Core Conversions
46
+
47
+ #### `toZonedTime(input, timezone)`
46
48
 
47
49
  Convert a UTC ISO string, Instant, or ZonedDateTime to a ZonedDateTime in the specified timezone.
48
50
 
@@ -70,7 +72,7 @@ const nyTime = Temporal.ZonedDateTime.from("2025-01-20T15:00:00-05:00[America/Ne
70
72
  const tokyoTime = toZonedTime(nyTime, "Asia/Tokyo");
71
73
  ```
72
74
 
73
- ### `toUtc(input)`
75
+ #### `toUtc(input)`
74
76
 
75
77
  Convert a UTC ISO string or ZonedDateTime to a Temporal.Instant (UTC).
76
78
 
@@ -92,7 +94,7 @@ const instant2 = toUtc(zoned);
92
94
  // Both represent the same UTC moment: 2025-01-20T20:00:00Z
93
95
  ```
94
96
 
95
- ### `toUtcString(input)`
97
+ #### `toUtcString(input)`
96
98
 
97
99
  Convert a Temporal.Instant or ZonedDateTime to a UTC ISO 8601 string.
98
100
 
@@ -116,7 +118,9 @@ const iso2 = toUtcString(instant);
116
118
  console.log(iso2); // "2025-01-20T20:00:00Z"
117
119
  ```
118
120
 
119
- ### `format(input, formatStr, options?)`
121
+ ### Formatting
122
+
123
+ #### `format(input, formatStr, options?)`
120
124
 
121
125
  Format a Temporal.Instant or ZonedDateTime using date-fns-like format tokens.
122
126
 
@@ -167,24 +171,144 @@ format(instant, "yyyy-MM-dd HH:mm", { timeZone: "America/New_York" }); // "2025-
167
171
  format(instant, "yyyy-MM-dd HH:mm", { timeZone: "Asia/Tokyo" }); // "2025-01-21 05:30"
168
172
  ```
169
173
 
170
- ## Complete Workflow Example
174
+ ### Start/End Utilities
175
+
176
+ #### `startOfDay(input)` / `endOfDay(input)`
177
+
178
+ Get the start or end of the day for a given datetime.
171
179
 
172
180
  ```typescript
173
- import { toZonedTime, toUtcString } from '@gobrand/tiempo';
181
+ import { startOfDay, endOfDay } from '@gobrand/tiempo';
182
+
183
+ const zoned = Temporal.ZonedDateTime.from('2025-01-20T15:30:00-05:00[America/New_York]');
184
+
185
+ startOfDay(zoned); // 2025-01-20T00:00:00-05:00[America/New_York]
186
+ endOfDay(zoned); // 2025-01-20T23:59:59.999999999-05:00[America/New_York]
187
+ ```
188
+
189
+ #### `startOfWeek(input)` / `endOfWeek(input)`
190
+
191
+ Get the start or end of the week. Uses ISO 8601 week definition (Monday to Sunday).
192
+
193
+ ```typescript
194
+ import { startOfWeek, endOfWeek } from '@gobrand/tiempo';
195
+
196
+ const zoned = Temporal.ZonedDateTime.from('2025-01-20T15:30:00-05:00[America/New_York]'); // Monday
197
+
198
+ startOfWeek(zoned); // 2025-01-20T00:00:00-05:00[America/New_York] (Monday)
199
+ endOfWeek(zoned); // 2025-01-26T23:59:59.999999999-05:00[America/New_York] (Sunday)
200
+ ```
201
+
202
+ #### `startOfMonth(input)` / `endOfMonth(input)`
203
+
204
+ Get the start or end of the month.
205
+
206
+ ```typescript
207
+ import { startOfMonth, endOfMonth } from '@gobrand/tiempo';
208
+
209
+ const zoned = Temporal.ZonedDateTime.from('2025-01-20T15:30:00-05:00[America/New_York]');
210
+
211
+ startOfMonth(zoned); // 2025-01-01T00:00:00-05:00[America/New_York]
212
+ endOfMonth(zoned); // 2025-01-31T23:59:59.999999999-05:00[America/New_York]
213
+ ```
214
+
215
+ #### `startOfYear(input)` / `endOfYear(input)`
216
+
217
+ Get the start or end of the year.
218
+
219
+ ```typescript
220
+ import { startOfYear, endOfYear } from '@gobrand/tiempo';
221
+
222
+ const zoned = Temporal.ZonedDateTime.from('2025-01-20T15:30:00-05:00[America/New_York]');
223
+
224
+ startOfYear(zoned); // 2025-01-01T00:00:00-05:00[America/New_York]
225
+ endOfYear(zoned); // 2025-12-31T23:59:59.999999999-05:00[America/New_York]
226
+ ```
227
+
228
+ ### Comparison Utilities
174
229
 
175
- // 1. Receive UTC datetime from backend
230
+ #### `isBefore(date1, date2)`
231
+
232
+ Check if the first datetime is before the second. Compares the underlying instant in time.
233
+
234
+ ```typescript
235
+ import { isBefore } from '@gobrand/tiempo';
236
+
237
+ const earlier = Temporal.ZonedDateTime.from('2025-01-20T10:00:00-05:00[America/New_York]');
238
+ const later = Temporal.ZonedDateTime.from('2025-01-20T15:00:00-05:00[America/New_York]');
239
+
240
+ isBefore(earlier, later); // true
241
+ isBefore(later, earlier); // false
242
+ ```
243
+
244
+ #### `isAfter(date1, date2)`
245
+
246
+ Check if the first datetime is after the second. Compares the underlying instant in time.
247
+
248
+ ```typescript
249
+ import { isAfter } from '@gobrand/tiempo';
250
+
251
+ const earlier = Temporal.ZonedDateTime.from('2025-01-20T10:00:00-05:00[America/New_York]');
252
+ const later = Temporal.ZonedDateTime.from('2025-01-20T15:00:00-05:00[America/New_York]');
253
+
254
+ isAfter(later, earlier); // true
255
+ isAfter(earlier, later); // false
256
+ ```
257
+
258
+ #### `isSameDay(date1, date2)`
259
+
260
+ Check if two datetimes fall on the same calendar day. Compares year, month, and day fields directly.
261
+
262
+ **Important:** For ZonedDateTime inputs with different timezones, each date is compared in its own timezone. Convert to a common timezone first if you need a specific perspective.
263
+
264
+ ```typescript
265
+ import { isSameDay } from '@gobrand/tiempo';
266
+
267
+ // Same timezone, same day
268
+ const morning = Temporal.ZonedDateTime.from('2025-01-20T08:00:00Z[UTC]');
269
+ const evening = Temporal.ZonedDateTime.from('2025-01-20T23:00:00Z[UTC]');
270
+ isSameDay(morning, evening); // true
271
+
272
+ // Different timezones - compares in their respective timezones
273
+ const ny = Temporal.ZonedDateTime.from('2025-01-20T23:00:00-05:00[America/New_York]');
274
+ const tokyo = Temporal.ZonedDateTime.from('2025-01-21T13:00:00+09:00[Asia/Tokyo]');
275
+ isSameDay(ny, tokyo); // false (Jan 20 in NY, Jan 21 in Tokyo)
276
+
277
+ // Convert to UTC to compare in UTC timezone
278
+ isSameDay(ny.withTimeZone('UTC'), tokyo.withTimeZone('UTC')); // true (both Jan 21 in UTC)
279
+
280
+ // Instant inputs are automatically converted to UTC
281
+ const instant1 = Temporal.Instant.from('2025-01-20T10:00:00Z');
282
+ const instant2 = Temporal.Instant.from('2025-01-20T23:00:00Z');
283
+ isSameDay(instant1, instant2); // true (both Jan 20 in UTC)
284
+ ```
285
+
286
+ ## Real World Example
287
+
288
+ This example demonstrates the complete workflow of working with datetimes in a frontend application: receiving a UTC ISO 8601 string from your backend, converting it to a Temporal object in the user's timezone, formatting it for display, manipulating it based on user input, and sending it back to your backend as a UTC ISO 8601 string.
289
+
290
+ ```typescript
291
+ import { toZonedTime, toUtcString, format } from '@gobrand/tiempo';
292
+
293
+ // 1. Receive UTC ISO 8601 string from backend
176
294
  const scheduledAtUTC = "2025-01-20T20:00:00.000Z";
177
295
 
178
- // 2. Convert to user's timezone for display/editing
296
+ // 2. Convert to user's timezone (Temporal.ZonedDateTime)
179
297
  const userTimezone = "America/New_York";
180
298
  const zonedDateTime = toZonedTime(scheduledAtUTC, userTimezone);
181
299
 
182
- console.log(`Scheduled for: ${zonedDateTime.hour}:00`); // "Scheduled for: 15:00"
300
+ // 3. Format for display in the UI
301
+ const displayTime = format(zonedDateTime, "EEEE, MMMM do 'at' h:mm a");
302
+ console.log(displayTime); // "Monday, January 20th at 3:00 PM"
183
303
 
184
- // 3. User modifies the time
304
+ // 4. User reschedules to 4:00 PM their time
185
305
  const updatedZoned = zonedDateTime.with({ hour: 16 });
186
306
 
187
- // 4. Convert back to UTC for sending to backend
307
+ // 5. Format the updated time for confirmation
308
+ const confirmTime = format(updatedZoned, "h:mm a");
309
+ console.log(`Rescheduled to ${confirmTime}`); // "Rescheduled to 4:00 PM"
310
+
311
+ // 6. Convert back to UTC ISO 8601 string for backend
188
312
  const updatedUTC = toUtcString(updatedZoned);
189
313
  console.log(updatedUTC); // "2025-01-20T21:00:00Z"
190
314
  ```
@@ -1,13 +1,17 @@
1
+ import {
2
+ normalizeTemporalInput
3
+ } from "./chunk-MJSZNWCV.js";
4
+
1
5
  // src/format.ts
2
6
  import { Temporal } from "@js-temporal/polyfill";
3
7
  function format(input, formatStr, options = {}) {
4
8
  const { locale = "en-US", timeZone } = options;
5
9
  let zonedDateTime;
6
- if (input instanceof Temporal.Instant) {
7
- const tz = timeZone || "UTC";
8
- zonedDateTime = input.toZonedDateTimeISO(tz);
10
+ if (timeZone) {
11
+ const instant = input instanceof Temporal.Instant ? input : input.toInstant();
12
+ zonedDateTime = instant.toZonedDateTimeISO(timeZone);
9
13
  } else {
10
- zonedDateTime = timeZone ? input.toInstant().toZonedDateTimeISO(timeZone) : input;
14
+ zonedDateTime = normalizeTemporalInput(input);
11
15
  }
12
16
  let result = "";
13
17
  let i = 0;
@@ -326,4 +330,4 @@ function getTimezoneOffset(zonedDateTime) {
326
330
  export {
327
331
  format
328
332
  };
329
- //# sourceMappingURL=chunk-5FRUAUH2.js.map
333
+ //# sourceMappingURL=chunk-2G5RJGPR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/format.ts"],"sourcesContent":["import { Temporal } from '@js-temporal/polyfill';\nimport { normalizeTemporalInput } from './shared/normalizeTemporalInput';\n\nexport interface FormatOptions {\n locale?: string;\n timeZone?: string;\n}\n\n/**\n * Format a Temporal.Instant or ZonedDateTime using date-fns-like format tokens.\n * Uses Intl.DateTimeFormat under the hood via Temporal's toLocaleString() for zero dependencies.\n *\n * @param input - A Temporal.Instant or Temporal.ZonedDateTime to format\n * @param formatStr - Format string using date-fns tokens (e.g., \"yyyy-MM-dd HH:mm:ss\")\n * @param options - Optional configuration for locale and timezone\n * @returns Formatted date string\n *\n * @example\n * ```typescript\n * const zoned = Temporal.ZonedDateTime.from(\"2025-01-20T15:00:00-05:00[America/New_York]\");\n *\n * format(zoned, \"yyyy-MM-dd\"); // \"2025-01-20\"\n * format(zoned, \"MMMM d, yyyy\"); // \"January 20, 2025\"\n * format(zoned, \"h:mm a\"); // \"3:00 PM\"\n * format(zoned, \"EEEE, MMMM do, yyyy 'at' h:mm a\"); // \"Monday, January 20th, 2025 at 3:00 PM\"\n *\n * // With locale\n * format(zoned, \"MMMM d, yyyy\", { locale: \"es-ES\" }); // \"enero 20, 2025\"\n * ```\n */\nexport function format(\n input: Temporal.Instant | Temporal.ZonedDateTime,\n formatStr: string,\n options: FormatOptions = {}\n): string {\n const { locale = 'en-US', timeZone } = options;\n\n // Convert to ZonedDateTime, applying custom timezone if provided\n let zonedDateTime: Temporal.ZonedDateTime;\n if (timeZone) {\n // If custom timezone specified, convert via Instant\n const instant = input instanceof Temporal.Instant ? input : input.toInstant();\n zonedDateTime = instant.toZonedDateTimeISO(timeZone);\n } else {\n // No custom timezone: normalize to ZonedDateTime (Instant -> UTC, ZonedDateTime -> keep as-is)\n zonedDateTime = normalizeTemporalInput(input);\n }\n\n let result = '';\n let i = 0;\n const len = formatStr.length;\n\n while (i < len) {\n const char = formatStr[i];\n if (!char) break;\n\n // Handle escaped text\n if (char === \"'\") {\n // Check for double single quote (not inside a string, just '')\n if (i + 1 < len && formatStr[i + 1] === \"'\") {\n result += \"'\";\n i += 2;\n continue;\n }\n // Find closing quote, handling '' inside the string\n i++;\n while (i < len) {\n if (formatStr[i] === \"'\") {\n // Check if it's a doubled quote ''\n if (i + 1 < len && formatStr[i + 1] === \"'\") {\n result += \"'\";\n i += 2;\n } else {\n // End of quoted string\n i++;\n break;\n }\n } else {\n result += formatStr[i];\n i++;\n }\n }\n continue;\n }\n\n // Check for tokens by looking ahead\n const token = consumeToken(formatStr, i, char);\n if (token !== null) {\n result += formatToken(token, zonedDateTime, locale);\n i += token.length;\n } else {\n result += char;\n i++;\n }\n }\n\n return result;\n}\n\nfunction consumeToken(formatStr: string, start: number, char: string): string | null {\n // Special case for 'Mo' and 'do' - these end with 'o'\n if (char === 'M' && start + 1 < formatStr.length && formatStr[start + 1] === 'o') {\n return 'Mo';\n }\n if (char === 'd' && start + 1 < formatStr.length && formatStr[start + 1] === 'o') {\n return 'do';\n }\n\n // Count how many consecutive identical characters\n let end = start;\n while (end < formatStr.length && formatStr[end] === char) {\n end++;\n }\n const count = end - start;\n\n // Check if this is a valid token pattern\n const validTokens = [\n 'GGGGG',\n 'GGGG',\n 'GGG',\n 'GG',\n 'G',\n 'yyyy',\n 'yyy',\n 'yy',\n 'y',\n 'QQQQQ',\n 'QQQQ',\n 'QQQ',\n 'QQ',\n 'Q',\n 'MMMMM',\n 'MMMM',\n 'MMM',\n 'MM',\n 'M',\n 'dd',\n 'd',\n 'EEEEEE',\n 'EEEEE',\n 'EEEE',\n 'EEE',\n 'EE',\n 'E',\n 'aaaaa',\n 'aaaa',\n 'aaa',\n 'aa',\n 'a',\n 'HH',\n 'H',\n 'hh',\n 'h',\n 'mm',\n 'm',\n 'ss',\n 's',\n 'SSS',\n 'SS',\n 'S',\n 'XXXXX',\n 'XXXX',\n 'XXX',\n 'XX',\n 'X',\n 'xxxxx',\n 'xxxx',\n 'xxx',\n 'xx',\n 'x',\n 'zzzz',\n 'zzz',\n 'zz',\n 'z',\n 'T',\n 't',\n ];\n\n // Try to match from longest to shortest\n for (let len = Math.min(count, 6); len > 0; len--) {\n const candidate = char.repeat(len);\n if (validTokens.includes(candidate)) {\n return candidate;\n }\n }\n\n return null;\n}\n\nfunction formatToken(token: string, zonedDateTime: Temporal.ZonedDateTime, locale: string): string {\n switch (token) {\n // Era\n case 'GGGGG':\n return formatPart(zonedDateTime, 'era', 'narrow', locale);\n case 'GGGG':\n return formatPart(zonedDateTime, 'era', 'long', locale);\n case 'GGG':\n case 'GG':\n case 'G':\n return formatPart(zonedDateTime, 'era', 'short', locale);\n\n // Year\n case 'yyyy':\n return zonedDateTime.year.toString().padStart(4, '0');\n case 'yyy':\n return zonedDateTime.year.toString().padStart(3, '0');\n case 'yy':\n return (zonedDateTime.year % 100).toString().padStart(2, '0');\n case 'y':\n return zonedDateTime.year.toString();\n\n // Quarter\n case 'QQQQQ':\n return Math.ceil(zonedDateTime.month / 3).toString();\n case 'QQQQ': {\n const quarter = Math.ceil(zonedDateTime.month / 3);\n return `${quarter}${getOrdinalSuffix(quarter)} quarter`;\n }\n case 'QQQ':\n return `Q${Math.ceil(zonedDateTime.month / 3)}`;\n case 'QQ':\n return Math.ceil(zonedDateTime.month / 3)\n .toString()\n .padStart(2, '0');\n case 'Q':\n return Math.ceil(zonedDateTime.month / 3).toString();\n\n // Month\n case 'MMMMM':\n return formatPart(zonedDateTime, 'month', 'narrow', locale);\n case 'MMMM':\n return formatPart(zonedDateTime, 'month', 'long', locale);\n case 'MMM':\n return formatPart(zonedDateTime, 'month', 'short', locale);\n case 'MM':\n return zonedDateTime.month.toString().padStart(2, '0');\n case 'Mo':\n return `${zonedDateTime.month}${getOrdinalSuffix(zonedDateTime.month)}`;\n case 'M':\n return zonedDateTime.month.toString();\n\n // Day of month\n case 'do':\n return `${zonedDateTime.day}${getOrdinalSuffix(zonedDateTime.day)}`;\n case 'dd':\n return zonedDateTime.day.toString().padStart(2, '0');\n case 'd':\n return zonedDateTime.day.toString();\n\n // Day of week\n case 'EEEEEE':\n return formatPart(zonedDateTime, 'weekday', 'short', locale).slice(0, 2);\n case 'EEEEE':\n return formatPart(zonedDateTime, 'weekday', 'narrow', locale);\n case 'EEEE':\n return formatPart(zonedDateTime, 'weekday', 'long', locale);\n case 'EEE':\n case 'EE':\n case 'E':\n return formatPart(zonedDateTime, 'weekday', 'short', locale);\n\n // AM/PM\n case 'aaaaa': {\n const period = formatPart(zonedDateTime, 'dayPeriod', 'narrow', locale).toLowerCase();\n return period.charAt(0);\n }\n case 'aaaa': {\n const period = formatPart(zonedDateTime, 'dayPeriod', 'short', locale);\n return period === 'AM' ? 'a.m.' : 'p.m.';\n }\n case 'aaa':\n return formatPart(zonedDateTime, 'dayPeriod', 'short', locale).toLowerCase();\n case 'aa':\n case 'a':\n return formatPart(zonedDateTime, 'dayPeriod', 'short', locale);\n\n // Hour [0-23]\n case 'HH':\n return zonedDateTime.hour.toString().padStart(2, '0');\n case 'H':\n return zonedDateTime.hour.toString();\n\n // Hour [1-12]\n case 'hh': {\n const hour12 = zonedDateTime.hour % 12 || 12;\n return hour12.toString().padStart(2, '0');\n }\n case 'h': {\n const hour12 = zonedDateTime.hour % 12 || 12;\n return hour12.toString();\n }\n\n // Minute\n case 'mm':\n return zonedDateTime.minute.toString().padStart(2, '0');\n case 'm':\n return zonedDateTime.minute.toString();\n\n // Second\n case 'ss':\n return zonedDateTime.second.toString().padStart(2, '0');\n case 's':\n return zonedDateTime.second.toString();\n\n // Fractional seconds\n case 'SSS':\n return zonedDateTime.millisecond.toString().padStart(3, '0');\n case 'SS':\n return Math.floor(zonedDateTime.millisecond / 10)\n .toString()\n .padStart(2, '0');\n case 'S':\n return Math.floor(zonedDateTime.millisecond / 100).toString();\n\n // Timezone\n case 'XXXXX': {\n const offset = getTimezoneOffset(zonedDateTime);\n return offset === '+00:00' ? 'Z' : offset;\n }\n case 'XXXX': {\n const offset = getTimezoneOffset(zonedDateTime).replace(':', '');\n return offset === '+0000' ? 'Z' : offset;\n }\n case 'XXX': {\n const offset = getTimezoneOffset(zonedDateTime);\n return offset === '+00:00' ? 'Z' : offset;\n }\n case 'XX': {\n const offset = getTimezoneOffset(zonedDateTime).replace(':', '');\n return offset === '+0000' ? 'Z' : offset;\n }\n case 'X': {\n const offset = getTimezoneOffset(zonedDateTime);\n if (offset === '+00:00') return 'Z';\n const [hours] = offset.split(':');\n return hours || '+00';\n }\n case 'xxxxx':\n return getTimezoneOffset(zonedDateTime);\n case 'xxxx':\n return getTimezoneOffset(zonedDateTime).replace(':', '');\n case 'xxx':\n return getTimezoneOffset(zonedDateTime);\n case 'xx':\n return getTimezoneOffset(zonedDateTime).replace(':', '');\n case 'x': {\n const offset = getTimezoneOffset(zonedDateTime);\n const [hours] = offset.split(':');\n return hours || '+00';\n }\n case 'zzzz':\n return formatPart(zonedDateTime, 'timeZoneName', 'long', locale);\n case 'zzz':\n case 'zz':\n case 'z':\n return formatPart(zonedDateTime, 'timeZoneName', 'short', locale);\n\n // Timestamps\n case 'T':\n return zonedDateTime.epochMilliseconds.toString();\n case 't':\n return Math.floor(zonedDateTime.epochMilliseconds / 1000).toString();\n\n default:\n return token;\n }\n}\n\nfunction formatPart(\n zonedDateTime: Temporal.ZonedDateTime,\n part: 'era' | 'year' | 'month' | 'weekday' | 'day' | 'dayPeriod' | 'hour' | 'minute' | 'second' | 'timeZoneName',\n style: 'narrow' | 'short' | 'long' | 'numeric' | '2-digit',\n locale: string\n): string {\n const options: Intl.DateTimeFormatOptions = {};\n\n if (part === 'dayPeriod') {\n // dayPeriod needs hour to be present\n options.hour = 'numeric';\n options.hour12 = true;\n } else {\n options[part] = style as any;\n }\n\n const formatted = zonedDateTime.toLocaleString(locale, options);\n\n if (part === 'dayPeriod') {\n // Extract just the AM/PM part\n const match = formatted.match(/\\b(AM|PM|am|pm|a\\.m\\.|p\\.m\\.)\\b/);\n return match ? match[0] : formatted.split(' ').pop() || '';\n }\n\n return formatted;\n}\n\nfunction getOrdinalSuffix(num: number): string {\n const j = num % 10;\n const k = num % 100;\n if (j === 1 && k !== 11) return 'st';\n if (j === 2 && k !== 12) return 'nd';\n if (j === 3 && k !== 13) return 'rd';\n return 'th';\n}\n\nfunction getTimezoneOffset(zonedDateTime: Temporal.ZonedDateTime): string {\n const offsetNs = zonedDateTime.offsetNanoseconds;\n const offsetMinutes = offsetNs / (60 * 1e9);\n const sign = offsetMinutes >= 0 ? '+' : '-';\n const absMinutes = Math.abs(offsetMinutes);\n const hours = Math.floor(absMinutes / 60);\n const minutes = absMinutes % 60;\n return `${sign}${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}`;\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,17 @@
1
+ import {
2
+ normalizeTemporalInput
3
+ } from "./chunk-MJSZNWCV.js";
4
+
5
+ // src/startOfWeek.ts
6
+ function startOfWeek(input) {
7
+ const zonedDateTime = normalizeTemporalInput(input);
8
+ const dayOfWeek = zonedDateTime.dayOfWeek;
9
+ const daysToSubtract = dayOfWeek - 1;
10
+ const monday = zonedDateTime.subtract({ days: daysToSubtract });
11
+ return monday.startOfDay();
12
+ }
13
+
14
+ export {
15
+ startOfWeek
16
+ };
17
+ //# sourceMappingURL=chunk-2WMXB7QL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/startOfWeek.ts"],"sourcesContent":["import type { Temporal } from '@js-temporal/polyfill';\nimport { normalizeTemporalInput } from './shared/normalizeTemporalInput';\n\n/**\n * Returns a ZonedDateTime representing the first moment of the week (Monday at midnight).\n * Uses ISO 8601 week definition: weeks start on Monday.\n *\n * @param input - A Temporal.Instant (UTC) or Temporal.ZonedDateTime\n * @returns ZonedDateTime at Monday 00:00:00.000000000\n *\n * @example\n * ```ts\n * // From Instant (always UTC)\n * const instant = Temporal.Instant.from('2025-01-20T12:00:00Z'); // Monday\n * const start = startOfWeek(instant);\n * // 2025-01-20T00:00:00Z[UTC] (same day, it's already Monday)\n * ```\n *\n * @example\n * ```ts\n * // From ZonedDateTime (uses its timezone)\n * const zoned = Temporal.ZonedDateTime.from('2025-01-22T15:30:00-05:00[America/New_York]'); // Wednesday\n * const start = startOfWeek(zoned);\n * // 2025-01-20T00:00:00-05:00[America/New_York] (previous Monday)\n * ```\n *\n * @example\n * ```ts\n * // Need a different timezone? Convert first\n * const instant = Temporal.Instant.from('2025-01-22T12:00:00Z');\n * const nyTime = instant.toZonedDateTimeISO('America/New_York');\n * const start = startOfWeek(nyTime);\n * // 2025-01-20T00:00:00-05:00[America/New_York]\n * ```\n */\nexport function startOfWeek(\n input: Temporal.Instant | Temporal.ZonedDateTime\n): Temporal.ZonedDateTime {\n const zonedDateTime = normalizeTemporalInput(input);\n\n // Get the day of week (1 = Monday, 7 = Sunday in ISO 8601)\n const dayOfWeek = zonedDateTime.dayOfWeek;\n\n // Calculate days to subtract to get to Monday\n const daysToSubtract = dayOfWeek - 1;\n\n // Go to Monday, then get start of that day\n const monday = zonedDateTime.subtract({ days: daysToSubtract });\n\n return monday.startOfDay();\n}\n"],"mappings":";;;;;AAmCO,SAAS,YACd,OACwB;AACxB,QAAM,gBAAgB,uBAAuB,KAAK;AAGlD,QAAM,YAAY,cAAc;AAGhC,QAAM,iBAAiB,YAAY;AAGnC,QAAM,SAAS,cAAc,SAAS,EAAE,MAAM,eAAe,CAAC;AAE9D,SAAO,OAAO,WAAW;AAC3B;","names":[]}
@@ -0,0 +1,9 @@
1
+ // src/shared/endOfDay.ts
2
+ function getEndOfDay(zonedDateTime) {
3
+ return zonedDateTime.startOfDay().add({ days: 1 }).subtract({ nanoseconds: 1 });
4
+ }
5
+
6
+ export {
7
+ getEndOfDay
8
+ };
9
+ //# sourceMappingURL=chunk-AVGNRINZ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/shared/endOfDay.ts"],"sourcesContent":["import type { Temporal } from '@js-temporal/polyfill';\n\n/**\n * Internal helper: Returns the last nanosecond of a given ZonedDateTime's day.\n * Used by endOfDay() and endOfWeek() to ensure consistent DST-safe behavior.\n */\nexport function getEndOfDay(\n zonedDateTime: Temporal.ZonedDateTime\n): Temporal.ZonedDateTime {\n return zonedDateTime\n .startOfDay()\n .add({ days: 1 })\n .subtract({ nanoseconds: 1 });\n}\n"],"mappings":";AAMO,SAAS,YACd,eACwB;AACxB,SAAO,cACJ,WAAW,EACX,IAAI,EAAE,MAAM,EAAE,CAAC,EACf,SAAS,EAAE,aAAa,EAAE,CAAC;AAChC;","names":[]}
@@ -0,0 +1,16 @@
1
+ import {
2
+ normalizeTemporalInput
3
+ } from "./chunk-MJSZNWCV.js";
4
+
5
+ // src/isAfter.ts
6
+ import { Temporal } from "@js-temporal/polyfill";
7
+ function isAfter(date1, date2) {
8
+ const zoned1 = normalizeTemporalInput(date1);
9
+ const zoned2 = normalizeTemporalInput(date2);
10
+ return Temporal.ZonedDateTime.compare(zoned1, zoned2) > 0;
11
+ }
12
+
13
+ export {
14
+ isAfter
15
+ };
16
+ //# sourceMappingURL=chunk-BBNNR2QH.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/isAfter.ts"],"sourcesContent":["import { Temporal } from '@js-temporal/polyfill';\nimport { normalizeTemporalInput } from './shared/normalizeTemporalInput';\n\n/**\n * Returns true if the first datetime is after the second datetime.\n * Compares by the underlying instant (epoch time), not by calendar date/time.\n *\n * @param date1 - First datetime (Instant or ZonedDateTime)\n * @param date2 - Second datetime (Instant or ZonedDateTime)\n * @returns true if date1 is after date2, false otherwise\n *\n * @example\n * ```ts\n * const earlier = Temporal.ZonedDateTime.from('2025-01-20T10:00:00-05:00[America/New_York]');\n * const later = Temporal.ZonedDateTime.from('2025-01-20T16:00:00-05:00[America/New_York]');\n *\n * isAfter(later, earlier); // true\n * isAfter(earlier, later); // false\n * isAfter(earlier, earlier); // false\n * ```\n *\n * @example\n * ```ts\n * // Works with Instant too\n * const instant1 = Temporal.Instant.from('2025-01-20T15:00:00Z');\n * const instant2 = Temporal.Instant.from('2025-01-20T16:00:00Z');\n *\n * isAfter(instant2, instant1); // true\n * ```\n *\n * @example\n * ```ts\n * // Different timezones - compares by instant\n * const ny = Temporal.ZonedDateTime.from('2025-01-20T10:00:00-05:00[America/New_York]');\n * const tokyo = Temporal.ZonedDateTime.from('2025-01-21T00:00:00+09:00[Asia/Tokyo]');\n *\n * isAfter(tokyo, ny); // false\n * // NY 10:00 is 15:00 UTC, Tokyo 00:00 is 15:00 UTC the previous day (same instant)\n * ```\n */\nexport function isAfter(\n date1: Temporal.Instant | Temporal.ZonedDateTime,\n date2: Temporal.Instant | Temporal.ZonedDateTime\n): boolean {\n const zoned1 = normalizeTemporalInput(date1);\n const zoned2 = normalizeTemporalInput(date2);\n\n return Temporal.ZonedDateTime.compare(zoned1, zoned2) > 0;\n}\n"],"mappings":";;;;;AAAA,SAAS,gBAAgB;AAwClB,SAAS,QACd,OACA,OACS;AACT,QAAM,SAAS,uBAAuB,KAAK;AAC3C,QAAM,SAAS,uBAAuB,KAAK;AAE3C,SAAO,SAAS,cAAc,QAAQ,QAAQ,MAAM,IAAI;AAC1D;","names":[]}
@@ -0,0 +1,18 @@
1
+ import {
2
+ getEndOfDay
3
+ } from "./chunk-AVGNRINZ.js";
4
+ import {
5
+ normalizeTemporalInput
6
+ } from "./chunk-MJSZNWCV.js";
7
+
8
+ // src/endOfDay.ts
9
+ import "@js-temporal/polyfill";
10
+ function endOfDay(input) {
11
+ const zonedDateTime = normalizeTemporalInput(input);
12
+ return getEndOfDay(zonedDateTime);
13
+ }
14
+
15
+ export {
16
+ endOfDay
17
+ };
18
+ //# sourceMappingURL=chunk-CUMB4776.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/endOfDay.ts"],"sourcesContent":["import { Temporal } from '@js-temporal/polyfill';\nimport { getEndOfDay } from './shared/endOfDay';\nimport { normalizeTemporalInput } from './shared/normalizeTemporalInput';\n\n/**\n * Returns a ZonedDateTime representing the last nanosecond of the day.\n *\n * @param input - A Temporal.Instant (UTC) or Temporal.ZonedDateTime\n * @returns ZonedDateTime at 23:59:59.999999999\n *\n * @example\n * ```ts\n * // From Instant (always UTC)\n * const instant = Temporal.Instant.from('2025-01-20T12:00:00Z');\n * const end = endOfDay(instant);\n * // 2025-01-20T23:59:59.999999999Z[UTC]\n * ```\n *\n * @example\n * ```ts\n * // From ZonedDateTime (uses its timezone)\n * const zoned = Temporal.ZonedDateTime.from('2025-01-20T15:30:00-05:00[America/New_York]');\n * const end = endOfDay(zoned);\n * // 2025-01-20T23:59:59.999999999-05:00[America/New_York]\n * ```\n *\n * @example\n * ```ts\n * // Need a different timezone? Convert first\n * const instant = Temporal.Instant.from('2025-01-20T12:00:00Z');\n * const nyTime = instant.toZonedDateTimeISO('America/New_York');\n * const end = endOfDay(nyTime);\n * // 2025-01-20T23:59:59.999999999-05:00[America/New_York]\n * ```\n */\nexport function endOfDay(\n input: Temporal.Instant | Temporal.ZonedDateTime\n): Temporal.ZonedDateTime {\n const zonedDateTime = normalizeTemporalInput(input);\n\n return getEndOfDay(zonedDateTime);\n}\n"],"mappings":";;;;;;;;AAAA,OAAyB;AAmClB,SAAS,SACd,OACwB;AACxB,QAAM,gBAAgB,uBAAuB,KAAK;AAElD,SAAO,YAAY,aAAa;AAClC;","names":[]}
@@ -0,0 +1,19 @@
1
+ import {
2
+ getEndOfDay
3
+ } from "./chunk-AVGNRINZ.js";
4
+ import {
5
+ normalizeTemporalInput
6
+ } from "./chunk-MJSZNWCV.js";
7
+
8
+ // src/endOfMonth.ts
9
+ function endOfMonth(input) {
10
+ const zonedDateTime = normalizeTemporalInput(input);
11
+ const daysInMonth = zonedDateTime.daysInMonth;
12
+ const lastDay = zonedDateTime.with({ day: daysInMonth });
13
+ return getEndOfDay(lastDay);
14
+ }
15
+
16
+ export {
17
+ endOfMonth
18
+ };
19
+ //# sourceMappingURL=chunk-GM6RNAYE.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/endOfMonth.ts"],"sourcesContent":["import type { Temporal } from '@js-temporal/polyfill';\nimport { getEndOfDay } from './shared/endOfDay';\nimport { normalizeTemporalInput } from './shared/normalizeTemporalInput';\n\n/**\n * Returns a ZonedDateTime representing the last moment of the month (last day at 23:59:59.999999999).\n *\n * @param input - A Temporal.Instant (UTC) or Temporal.ZonedDateTime\n * @returns ZonedDateTime at the last day of the month at 23:59:59.999999999\n *\n * @example\n * ```ts\n * // From Instant (always UTC)\n * const instant = Temporal.Instant.from('2025-01-15T12:00:00Z');\n * const end = endOfMonth(instant);\n * // 2025-01-31T23:59:59.999999999Z[UTC]\n * ```\n *\n * @example\n * ```ts\n * // From ZonedDateTime (uses its timezone)\n * const zoned = Temporal.ZonedDateTime.from('2025-02-15T15:30:00-05:00[America/New_York]');\n * const end = endOfMonth(zoned);\n * // 2025-02-28T23:59:59.999999999-05:00[America/New_York]\n * ```\n *\n * @example\n * ```ts\n * // Need a different timezone? Convert first\n * const instant = Temporal.Instant.from('2025-01-15T12:00:00Z');\n * const nyTime = instant.toZonedDateTimeISO('America/New_York');\n * const end = endOfMonth(nyTime);\n * // 2025-01-31T23:59:59.999999999-05:00[America/New_York]\n * ```\n */\nexport function endOfMonth(\n input: Temporal.Instant | Temporal.ZonedDateTime\n): Temporal.ZonedDateTime {\n const zonedDateTime = normalizeTemporalInput(input);\n\n // Get the number of days in this month\n const daysInMonth = zonedDateTime.daysInMonth;\n\n // Set day to last day of month, then get end of that day\n const lastDay = zonedDateTime.with({ day: daysInMonth });\n\n return getEndOfDay(lastDay);\n}\n"],"mappings":";;;;;;;;AAmCO,SAAS,WACd,OACwB;AACxB,QAAM,gBAAgB,uBAAuB,KAAK;AAGlD,QAAM,cAAc,cAAc;AAGlC,QAAM,UAAU,cAAc,KAAK,EAAE,KAAK,YAAY,CAAC;AAEvD,SAAO,YAAY,OAAO;AAC5B;","names":[]}
@@ -0,0 +1,16 @@
1
+ import {
2
+ normalizeTemporalInput
3
+ } from "./chunk-MJSZNWCV.js";
4
+
5
+ // src/isBefore.ts
6
+ import { Temporal } from "@js-temporal/polyfill";
7
+ function isBefore(date1, date2) {
8
+ const zoned1 = normalizeTemporalInput(date1);
9
+ const zoned2 = normalizeTemporalInput(date2);
10
+ return Temporal.ZonedDateTime.compare(zoned1, zoned2) < 0;
11
+ }
12
+
13
+ export {
14
+ isBefore
15
+ };
16
+ //# sourceMappingURL=chunk-IPJUERCK.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/isBefore.ts"],"sourcesContent":["import { Temporal } from '@js-temporal/polyfill';\nimport { normalizeTemporalInput } from './shared/normalizeTemporalInput';\n\n/**\n * Returns true if the first datetime is before the second datetime.\n * Compares by the underlying instant (epoch time), not by calendar date/time.\n *\n * @param date1 - First datetime (Instant or ZonedDateTime)\n * @param date2 - Second datetime (Instant or ZonedDateTime)\n * @returns true if date1 is before date2, false otherwise\n *\n * @example\n * ```ts\n * const earlier = Temporal.ZonedDateTime.from('2025-01-20T10:00:00-05:00[America/New_York]');\n * const later = Temporal.ZonedDateTime.from('2025-01-20T16:00:00-05:00[America/New_York]');\n *\n * isBefore(earlier, later); // true\n * isBefore(later, earlier); // false\n * isBefore(earlier, earlier); // false\n * ```\n *\n * @example\n * ```ts\n * // Works with Instant too\n * const instant1 = Temporal.Instant.from('2025-01-20T15:00:00Z');\n * const instant2 = Temporal.Instant.from('2025-01-20T16:00:00Z');\n *\n * isBefore(instant1, instant2); // true\n * ```\n *\n * @example\n * ```ts\n * // Different timezones - compares by instant\n * const ny = Temporal.ZonedDateTime.from('2025-01-20T10:00:00-05:00[America/New_York]');\n * const tokyo = Temporal.ZonedDateTime.from('2025-01-21T00:00:00+09:00[Asia/Tokyo]');\n *\n * isBefore(ny, tokyo); // true\n * // NY 10:00 is 15:00 UTC, Tokyo 00:00 is 15:00 UTC the previous day\n * ```\n */\nexport function isBefore(\n date1: Temporal.Instant | Temporal.ZonedDateTime,\n date2: Temporal.Instant | Temporal.ZonedDateTime\n): boolean {\n const zoned1 = normalizeTemporalInput(date1);\n const zoned2 = normalizeTemporalInput(date2);\n\n return Temporal.ZonedDateTime.compare(zoned1, zoned2) < 0;\n}\n"],"mappings":";;;;;AAAA,SAAS,gBAAgB;AAwClB,SAAS,SACd,OACA,OACS;AACT,QAAM,SAAS,uBAAuB,KAAK;AAC3C,QAAM,SAAS,uBAAuB,KAAK;AAE3C,SAAO,SAAS,cAAc,QAAQ,QAAQ,MAAM,IAAI;AAC1D;","names":[]}
@@ -0,0 +1,10 @@
1
+ // src/shared/normalizeTemporalInput.ts
2
+ import { Temporal } from "@js-temporal/polyfill";
3
+ function normalizeTemporalInput(input) {
4
+ return input instanceof Temporal.Instant ? input.toZonedDateTimeISO("UTC") : input;
5
+ }
6
+
7
+ export {
8
+ normalizeTemporalInput
9
+ };
10
+ //# sourceMappingURL=chunk-MJSZNWCV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/shared/normalizeTemporalInput.ts"],"sourcesContent":["import { Temporal } from '@js-temporal/polyfill';\n\n/**\n * @internal\n * Normalizes input to ZonedDateTime. Converts Instant to UTC, or returns existing ZonedDateTime.\n * This is an internal helper - do not use directly.\n */\nexport function normalizeTemporalInput(\n input: Temporal.Instant | Temporal.ZonedDateTime\n): Temporal.ZonedDateTime {\n return input instanceof Temporal.Instant\n ? input.toZonedDateTimeISO('UTC')\n : input;\n}\n"],"mappings":";AAAA,SAAS,gBAAgB;AAOlB,SAAS,uBACd,OACwB;AACxB,SAAO,iBAAiB,SAAS,UAC7B,MAAM,mBAAmB,KAAK,IAC9B;AACN;","names":[]}
@@ -0,0 +1,16 @@
1
+ import {
2
+ normalizeTemporalInput
3
+ } from "./chunk-MJSZNWCV.js";
4
+
5
+ // src/isSameDay.ts
6
+ import "@js-temporal/polyfill";
7
+ function isSameDay(date1, date2) {
8
+ const zoned1 = normalizeTemporalInput(date1);
9
+ const zoned2 = normalizeTemporalInput(date2);
10
+ return zoned1.year === zoned2.year && zoned1.month === zoned2.month && zoned1.day === zoned2.day;
11
+ }
12
+
13
+ export {
14
+ isSameDay
15
+ };
16
+ //# sourceMappingURL=chunk-RW3C2677.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/isSameDay.ts"],"sourcesContent":["import { Temporal } from '@js-temporal/polyfill';\nimport { normalizeTemporalInput } from './shared/normalizeTemporalInput';\n\n/**\n * Returns true if both datetimes fall on the same calendar day.\n * Compares the year, month, and day fields directly.\n *\n * Instant inputs are converted to UTC. For ZonedDateTime inputs, their\n * timezone is preserved. Convert to a common timezone before calling if\n * you need to compare from a specific perspective.\n *\n * @param date1 - First datetime (Instant or ZonedDateTime)\n * @param date2 - Second datetime (Instant or ZonedDateTime)\n * @returns true if both dates are on the same calendar day, false otherwise\n *\n * @example\n * ```ts\n * // Same timezone, same day\n * const morning = Temporal.ZonedDateTime.from('2025-01-20T08:00:00Z[UTC]');\n * const evening = Temporal.ZonedDateTime.from('2025-01-20T23:00:00Z[UTC]');\n *\n * isSameDay(morning, evening); // true\n * ```\n *\n * @example\n * ```ts\n * // Same timezone, different days\n * const today = Temporal.ZonedDateTime.from('2025-01-20T23:59:59Z[UTC]');\n * const tomorrow = Temporal.ZonedDateTime.from('2025-01-21T00:00:00Z[UTC]');\n *\n * isSameDay(today, tomorrow); // false\n * ```\n *\n * @example\n * ```ts\n * // Different timezones - compares their local calendar days\n * const ny = Temporal.ZonedDateTime.from('2025-01-20T23:00:00-05:00[America/New_York]');\n * const tokyo = Temporal.ZonedDateTime.from('2025-01-21T13:00:00+09:00[Asia/Tokyo]');\n *\n * // Same instant, different calendar days from each person's perspective\n * isSameDay(ny, tokyo); // false (Jan 20 in NY, Jan 21 in Tokyo)\n *\n * // Convert to UTC to compare in UTC timezone\n * isSameDay(ny.withTimeZone('UTC'), tokyo.withTimeZone('UTC')); // true (both Jan 21 in UTC)\n *\n * // Convert to NY timezone to compare from NY perspective\n * isSameDay(ny, tokyo.withTimeZone('America/New_York')); // true (both Jan 20 in NY)\n * ```\n *\n * @example\n * ```ts\n * // Instant inputs are converted to UTC\n * const instant1 = Temporal.Instant.from('2025-01-20T10:00:00Z');\n * const instant2 = Temporal.Instant.from('2025-01-20T23:00:00Z');\n *\n * isSameDay(instant1, instant2); // true (both Jan 20 in UTC)\n * ```\n */\nexport function isSameDay(\n date1: Temporal.Instant | Temporal.ZonedDateTime,\n date2: Temporal.Instant | Temporal.ZonedDateTime\n): boolean {\n const zoned1 = normalizeTemporalInput(date1);\n const zoned2 = normalizeTemporalInput(date2);\n\n return (\n zoned1.year === zoned2.year &&\n zoned1.month === zoned2.month &&\n zoned1.day === zoned2.day\n );\n}\n"],"mappings":";;;;;AAAA,OAAyB;AA0DlB,SAAS,UACd,OACA,OACS;AACT,QAAM,SAAS,uBAAuB,KAAK;AAC3C,QAAM,SAAS,uBAAuB,KAAK;AAE3C,SACE,OAAO,SAAS,OAAO,QACvB,OAAO,UAAU,OAAO,SACxB,OAAO,QAAQ,OAAO;AAE1B;","names":[]}
@@ -0,0 +1,15 @@
1
+ import {
2
+ normalizeTemporalInput
3
+ } from "./chunk-MJSZNWCV.js";
4
+
5
+ // src/startOfMonth.ts
6
+ function startOfMonth(input) {
7
+ const zonedDateTime = normalizeTemporalInput(input);
8
+ const firstDay = zonedDateTime.with({ day: 1 });
9
+ return firstDay.startOfDay();
10
+ }
11
+
12
+ export {
13
+ startOfMonth
14
+ };
15
+ //# sourceMappingURL=chunk-TU2UNOOW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/startOfMonth.ts"],"sourcesContent":["import type { Temporal } from '@js-temporal/polyfill';\nimport { normalizeTemporalInput } from './shared/normalizeTemporalInput';\n\n/**\n * Returns a ZonedDateTime representing the first moment of the month (day 1 at midnight).\n *\n * @param input - A Temporal.Instant (UTC) or Temporal.ZonedDateTime\n * @returns ZonedDateTime at the 1st day of the month at 00:00:00.000000000\n *\n * @example\n * ```ts\n * // From Instant (always UTC)\n * const instant = Temporal.Instant.from('2025-01-15T12:00:00Z');\n * const start = startOfMonth(instant);\n * // 2025-01-01T00:00:00Z[UTC]\n * ```\n *\n * @example\n * ```ts\n * // From ZonedDateTime (uses its timezone)\n * const zoned = Temporal.ZonedDateTime.from('2025-01-15T15:30:00-05:00[America/New_York]');\n * const start = startOfMonth(zoned);\n * // 2025-01-01T00:00:00-05:00[America/New_York]\n * ```\n *\n * @example\n * ```ts\n * // Need a different timezone? Convert first\n * const instant = Temporal.Instant.from('2025-01-15T12:00:00Z');\n * const nyTime = instant.toZonedDateTimeISO('America/New_York');\n * const start = startOfMonth(nyTime);\n * // 2025-01-01T00:00:00-05:00[America/New_York]\n * ```\n */\nexport function startOfMonth(\n input: Temporal.Instant | Temporal.ZonedDateTime\n): Temporal.ZonedDateTime {\n const zonedDateTime = normalizeTemporalInput(input);\n\n // Set day to 1, then get start of that day\n const firstDay = zonedDateTime.with({ day: 1 });\n\n return firstDay.startOfDay();\n}\n"],"mappings":";;;;;AAkCO,SAAS,aACd,OACwB;AACxB,QAAM,gBAAgB,uBAAuB,KAAK;AAGlD,QAAM,WAAW,cAAc,KAAK,EAAE,KAAK,EAAE,CAAC;AAE9C,SAAO,SAAS,WAAW;AAC7B;","names":[]}
@@ -0,0 +1,14 @@
1
+ import {
2
+ normalizeTemporalInput
3
+ } from "./chunk-MJSZNWCV.js";
4
+
5
+ // src/startOfDay.ts
6
+ function startOfDay(input) {
7
+ const zonedDateTime = normalizeTemporalInput(input);
8
+ return zonedDateTime.startOfDay();
9
+ }
10
+
11
+ export {
12
+ startOfDay
13
+ };
14
+ //# sourceMappingURL=chunk-TW5EV3DH.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/startOfDay.ts"],"sourcesContent":["import type { Temporal } from '@js-temporal/polyfill';\nimport { normalizeTemporalInput } from './shared/normalizeTemporalInput';\n\n/**\n * Returns a ZonedDateTime representing the first moment of the day (midnight).\n *\n * @param input - A Temporal.Instant (UTC) or Temporal.ZonedDateTime\n * @returns ZonedDateTime at 00:00:00.000000000\n *\n * @example\n * ```ts\n * // From Instant (always UTC)\n * const instant = Temporal.Instant.from('2025-01-20T12:00:00Z');\n * const start = startOfDay(instant);\n * // 2025-01-20T00:00:00Z[UTC]\n * ```\n *\n * @example\n * ```ts\n * // From ZonedDateTime (uses its timezone)\n * const zoned = Temporal.ZonedDateTime.from('2025-01-20T15:30:00-05:00[America/New_York]');\n * const start = startOfDay(zoned);\n * // 2025-01-20T00:00:00-05:00[America/New_York]\n * ```\n *\n * @example\n * ```ts\n * // Need a different timezone? Convert first\n * const instant = Temporal.Instant.from('2025-01-20T12:00:00Z');\n * const nyTime = instant.toZonedDateTimeISO('America/New_York');\n * const start = startOfDay(nyTime);\n * // 2025-01-20T00:00:00-05:00[America/New_York]\n * ```\n */\nexport function startOfDay(\n input: Temporal.Instant | Temporal.ZonedDateTime\n): Temporal.ZonedDateTime {\n const zonedDateTime = normalizeTemporalInput(input);\n\n return zonedDateTime.startOfDay();\n}\n"],"mappings":";;;;;AAkCO,SAAS,WACd,OACwB;AACxB,QAAM,gBAAgB,uBAAuB,KAAK;AAElD,SAAO,cAAc,WAAW;AAClC;","names":[]}
@@ -0,0 +1,20 @@
1
+ import {
2
+ getEndOfDay
3
+ } from "./chunk-AVGNRINZ.js";
4
+ import {
5
+ normalizeTemporalInput
6
+ } from "./chunk-MJSZNWCV.js";
7
+
8
+ // src/endOfYear.ts
9
+ function endOfYear(input) {
10
+ const zonedDateTime = normalizeTemporalInput(input);
11
+ const monthsInYear = zonedDateTime.monthsInYear;
12
+ const lastMonth = zonedDateTime.with({ month: monthsInYear });
13
+ const lastDay = lastMonth.with({ day: lastMonth.daysInMonth });
14
+ return getEndOfDay(lastDay);
15
+ }
16
+
17
+ export {
18
+ endOfYear
19
+ };
20
+ //# sourceMappingURL=chunk-XDVUGTUV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/endOfYear.ts"],"sourcesContent":["import type { Temporal } from '@js-temporal/polyfill';\nimport { getEndOfDay } from './shared/endOfDay';\nimport { normalizeTemporalInput } from './shared/normalizeTemporalInput';\n\n/**\n * Returns a ZonedDateTime representing the last moment of the year (last day at 23:59:59.999999999).\n *\n * @param input - A Temporal.Instant (UTC) or Temporal.ZonedDateTime\n * @returns ZonedDateTime at the last day of the year at 23:59:59.999999999\n *\n * @example\n * ```ts\n * // From Instant (always UTC)\n * const instant = Temporal.Instant.from('2025-06-15T12:00:00Z');\n * const end = endOfYear(instant);\n * // 2025-12-31T23:59:59.999999999Z[UTC]\n * ```\n *\n * @example\n * ```ts\n * // From ZonedDateTime (uses its timezone)\n * const zoned = Temporal.ZonedDateTime.from('2025-06-15T15:30:00-05:00[America/New_York]');\n * const end = endOfYear(zoned);\n * // 2025-12-31T23:59:59.999999999-05:00[America/New_York]\n * ```\n *\n * @example\n * ```ts\n * // Need a different timezone? Convert first\n * const instant = Temporal.Instant.from('2025-06-15T12:00:00Z');\n * const nyTime = instant.toZonedDateTimeISO('America/New_York');\n * const end = endOfYear(nyTime);\n * // 2025-12-31T23:59:59.999999999-05:00[America/New_York]\n * ```\n */\nexport function endOfYear(\n input: Temporal.Instant | Temporal.ZonedDateTime\n): Temporal.ZonedDateTime {\n const zonedDateTime = normalizeTemporalInput(input);\n\n // Get the number of months in this year\n const monthsInYear = zonedDateTime.monthsInYear;\n\n // Set to last month, then get last day of that month\n const lastMonth = zonedDateTime.with({ month: monthsInYear });\n const lastDay = lastMonth.with({ day: lastMonth.daysInMonth });\n\n return getEndOfDay(lastDay);\n}\n"],"mappings":";;;;;;;;AAmCO,SAAS,UACd,OACwB;AACxB,QAAM,gBAAgB,uBAAuB,KAAK;AAGlD,QAAM,eAAe,cAAc;AAGnC,QAAM,YAAY,cAAc,KAAK,EAAE,OAAO,aAAa,CAAC;AAC5D,QAAM,UAAU,UAAU,KAAK,EAAE,KAAK,UAAU,YAAY,CAAC;AAE7D,SAAO,YAAY,OAAO;AAC5B;","names":[]}
@@ -0,0 +1,20 @@
1
+ import {
2
+ getEndOfDay
3
+ } from "./chunk-AVGNRINZ.js";
4
+ import {
5
+ normalizeTemporalInput
6
+ } from "./chunk-MJSZNWCV.js";
7
+
8
+ // src/endOfWeek.ts
9
+ function endOfWeek(input) {
10
+ const zonedDateTime = normalizeTemporalInput(input);
11
+ const dayOfWeek = zonedDateTime.dayOfWeek;
12
+ const daysToAdd = 7 - dayOfWeek;
13
+ const sunday = zonedDateTime.add({ days: daysToAdd });
14
+ return getEndOfDay(sunday);
15
+ }
16
+
17
+ export {
18
+ endOfWeek
19
+ };
20
+ //# sourceMappingURL=chunk-XVJJR7H6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/endOfWeek.ts"],"sourcesContent":["import type { Temporal } from '@js-temporal/polyfill';\nimport { getEndOfDay } from './shared/endOfDay';\nimport { normalizeTemporalInput } from './shared/normalizeTemporalInput';\n\n/**\n * Returns a ZonedDateTime representing the last moment of the week (Sunday at 23:59:59.999999999).\n * Uses ISO 8601 week definition: weeks end on Sunday.\n *\n * @param input - A Temporal.Instant (UTC) or Temporal.ZonedDateTime\n * @returns ZonedDateTime at Sunday 23:59:59.999999999\n *\n * @example\n * ```ts\n * // From Instant (always UTC)\n * const instant = Temporal.Instant.from('2025-01-20T12:00:00Z'); // Monday\n * const end = endOfWeek(instant);\n * // 2025-01-26T23:59:59.999999999Z[UTC] (next Sunday)\n * ```\n *\n * @example\n * ```ts\n * // From ZonedDateTime (uses its timezone)\n * const zoned = Temporal.ZonedDateTime.from('2025-01-22T15:30:00-05:00[America/New_York]'); // Wednesday\n * const end = endOfWeek(zoned);\n * // 2025-01-26T23:59:59.999999999-05:00[America/New_York] (next Sunday)\n * ```\n *\n * @example\n * ```ts\n * // Need a different timezone? Convert first\n * const instant = Temporal.Instant.from('2025-01-22T12:00:00Z');\n * const nyTime = instant.toZonedDateTimeISO('America/New_York');\n * const end = endOfWeek(nyTime);\n * // 2025-01-26T23:59:59.999999999-05:00[America/New_York]\n * ```\n */\nexport function endOfWeek(\n input: Temporal.Instant | Temporal.ZonedDateTime\n): Temporal.ZonedDateTime {\n const zonedDateTime = normalizeTemporalInput(input);\n\n // Get the day of week (1 = Monday, 7 = Sunday in ISO 8601)\n const dayOfWeek = zonedDateTime.dayOfWeek;\n\n // Calculate days to add to get to Sunday\n const daysToAdd = 7 - dayOfWeek;\n\n // Go to Sunday, then get end of that day\n const sunday = zonedDateTime.add({ days: daysToAdd });\n\n return getEndOfDay(sunday);\n}\n"],"mappings":";;;;;;;;AAoCO,SAAS,UACd,OACwB;AACxB,QAAM,gBAAgB,uBAAuB,KAAK;AAGlD,QAAM,YAAY,cAAc;AAGhC,QAAM,YAAY,IAAI;AAGtB,QAAM,SAAS,cAAc,IAAI,EAAE,MAAM,UAAU,CAAC;AAEpD,SAAO,YAAY,MAAM;AAC3B;","names":[]}
@@ -0,0 +1,15 @@
1
+ import {
2
+ normalizeTemporalInput
3
+ } from "./chunk-MJSZNWCV.js";
4
+
5
+ // src/startOfYear.ts
6
+ function startOfYear(input) {
7
+ const zonedDateTime = normalizeTemporalInput(input);
8
+ const firstDay = zonedDateTime.with({ month: 1, day: 1 });
9
+ return firstDay.startOfDay();
10
+ }
11
+
12
+ export {
13
+ startOfYear
14
+ };
15
+ //# sourceMappingURL=chunk-YR2UCUIT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/startOfYear.ts"],"sourcesContent":["import type { Temporal } from '@js-temporal/polyfill';\nimport { normalizeTemporalInput } from './shared/normalizeTemporalInput';\n\n/**\n * Returns a ZonedDateTime representing the first moment of the year (January 1 at midnight).\n *\n * @param input - A Temporal.Instant (UTC) or Temporal.ZonedDateTime\n * @returns ZonedDateTime at January 1st at 00:00:00.000000000\n *\n * @example\n * ```ts\n * // From Instant (always UTC)\n * const instant = Temporal.Instant.from('2025-06-15T12:00:00Z');\n * const start = startOfYear(instant);\n * // 2025-01-01T00:00:00Z[UTC]\n * ```\n *\n * @example\n * ```ts\n * // From ZonedDateTime (uses its timezone)\n * const zoned = Temporal.ZonedDateTime.from('2025-06-15T15:30:00-05:00[America/New_York]');\n * const start = startOfYear(zoned);\n * // 2025-01-01T00:00:00-05:00[America/New_York]\n * ```\n *\n * @example\n * ```ts\n * // Need a different timezone? Convert first\n * const instant = Temporal.Instant.from('2025-06-15T12:00:00Z');\n * const nyTime = instant.toZonedDateTimeISO('America/New_York');\n * const start = startOfYear(nyTime);\n * // 2025-01-01T00:00:00-05:00[America/New_York]\n * ```\n */\nexport function startOfYear(\n input: Temporal.Instant | Temporal.ZonedDateTime\n): Temporal.ZonedDateTime {\n const zonedDateTime = normalizeTemporalInput(input);\n\n // Set to January 1st, then get start of that day\n const firstDay = zonedDateTime.with({ month: 1, day: 1 });\n\n return firstDay.startOfDay();\n}\n"],"mappings":";;;;;AAkCO,SAAS,YACd,OACwB;AACxB,QAAM,gBAAgB,uBAAuB,KAAK;AAGlD,QAAM,WAAW,cAAc,KAAK,EAAE,OAAO,GAAG,KAAK,EAAE,CAAC;AAExD,SAAO,SAAS,WAAW;AAC7B;","names":[]}
@@ -0,0 +1,34 @@
1
+ import { Temporal } from '@js-temporal/polyfill';
2
+ /**
3
+ * Returns a ZonedDateTime representing the last nanosecond of the day.
4
+ *
5
+ * @param input - A Temporal.Instant (UTC) or Temporal.ZonedDateTime
6
+ * @returns ZonedDateTime at 23:59:59.999999999
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * // From Instant (always UTC)
11
+ * const instant = Temporal.Instant.from('2025-01-20T12:00:00Z');
12
+ * const end = endOfDay(instant);
13
+ * // 2025-01-20T23:59:59.999999999Z[UTC]
14
+ * ```
15
+ *
16
+ * @example
17
+ * ```ts
18
+ * // From ZonedDateTime (uses its timezone)
19
+ * const zoned = Temporal.ZonedDateTime.from('2025-01-20T15:30:00-05:00[America/New_York]');
20
+ * const end = endOfDay(zoned);
21
+ * // 2025-01-20T23:59:59.999999999-05:00[America/New_York]
22
+ * ```
23
+ *
24
+ * @example
25
+ * ```ts
26
+ * // Need a different timezone? Convert first
27
+ * const instant = Temporal.Instant.from('2025-01-20T12:00:00Z');
28
+ * const nyTime = instant.toZonedDateTimeISO('America/New_York');
29
+ * const end = endOfDay(nyTime);
30
+ * // 2025-01-20T23:59:59.999999999-05:00[America/New_York]
31
+ * ```
32
+ */
33
+ export declare function endOfDay(input: Temporal.Instant | Temporal.ZonedDateTime): Temporal.ZonedDateTime;
34
+ //# sourceMappingURL=endOfDay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"endOfDay.d.ts","sourceRoot":"","sources":["../src/endOfDay.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAIjD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAgB,QAAQ,CACtB,KAAK,EAAE,QAAQ,CAAC,OAAO,GAAG,QAAQ,CAAC,aAAa,GAC/C,QAAQ,CAAC,aAAa,CAIxB"}
@@ -0,0 +1,9 @@
1
+ import {
2
+ endOfDay
3
+ } from "./chunk-CUMB4776.js";
4
+ import "./chunk-AVGNRINZ.js";
5
+ import "./chunk-MJSZNWCV.js";
6
+ export {
7
+ endOfDay
8
+ };
9
+ //# sourceMappingURL=endOfDay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}