@gobrand/tiempo 2.1.1 → 2.1.2

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 +125 -4
  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
@@ -0,0 +1,34 @@
1
+ import type { Temporal } from '@js-temporal/polyfill';
2
+ /**
3
+ * Returns a ZonedDateTime representing the first moment of the month (day 1 at midnight).
4
+ *
5
+ * @param input - A Temporal.Instant (UTC) or Temporal.ZonedDateTime
6
+ * @returns ZonedDateTime at the 1st day of the month at 00:00:00.000000000
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * // From Instant (always UTC)
11
+ * const instant = Temporal.Instant.from('2025-01-15T12:00:00Z');
12
+ * const start = startOfMonth(instant);
13
+ * // 2025-01-01T00:00:00Z[UTC]
14
+ * ```
15
+ *
16
+ * @example
17
+ * ```ts
18
+ * // From ZonedDateTime (uses its timezone)
19
+ * const zoned = Temporal.ZonedDateTime.from('2025-01-15T15:30:00-05:00[America/New_York]');
20
+ * const start = startOfMonth(zoned);
21
+ * // 2025-01-01T00:00:00-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-15T12:00:00Z');
28
+ * const nyTime = instant.toZonedDateTimeISO('America/New_York');
29
+ * const start = startOfMonth(nyTime);
30
+ * // 2025-01-01T00:00:00-05:00[America/New_York]
31
+ * ```
32
+ */
33
+ export declare function startOfMonth(input: Temporal.Instant | Temporal.ZonedDateTime): Temporal.ZonedDateTime;
34
+ //# sourceMappingURL=startOfMonth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"startOfMonth.d.ts","sourceRoot":"","sources":["../src/startOfMonth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAGtD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,QAAQ,CAAC,OAAO,GAAG,QAAQ,CAAC,aAAa,GAC/C,QAAQ,CAAC,aAAa,CAOxB"}
@@ -0,0 +1,8 @@
1
+ import {
2
+ startOfMonth
3
+ } from "./chunk-TU2UNOOW.js";
4
+ import "./chunk-MJSZNWCV.js";
5
+ export {
6
+ startOfMonth
7
+ };
8
+ //# sourceMappingURL=startOfMonth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=startOfMonth.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"startOfMonth.test.d.ts","sourceRoot":"","sources":["../src/startOfMonth.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,35 @@
1
+ import type { Temporal } from '@js-temporal/polyfill';
2
+ /**
3
+ * Returns a ZonedDateTime representing the first moment of the week (Monday at midnight).
4
+ * Uses ISO 8601 week definition: weeks start on Monday.
5
+ *
6
+ * @param input - A Temporal.Instant (UTC) or Temporal.ZonedDateTime
7
+ * @returns ZonedDateTime at Monday 00:00:00.000000000
8
+ *
9
+ * @example
10
+ * ```ts
11
+ * // From Instant (always UTC)
12
+ * const instant = Temporal.Instant.from('2025-01-20T12:00:00Z'); // Monday
13
+ * const start = startOfWeek(instant);
14
+ * // 2025-01-20T00:00:00Z[UTC] (same day, it's already Monday)
15
+ * ```
16
+ *
17
+ * @example
18
+ * ```ts
19
+ * // From ZonedDateTime (uses its timezone)
20
+ * const zoned = Temporal.ZonedDateTime.from('2025-01-22T15:30:00-05:00[America/New_York]'); // Wednesday
21
+ * const start = startOfWeek(zoned);
22
+ * // 2025-01-20T00:00:00-05:00[America/New_York] (previous Monday)
23
+ * ```
24
+ *
25
+ * @example
26
+ * ```ts
27
+ * // Need a different timezone? Convert first
28
+ * const instant = Temporal.Instant.from('2025-01-22T12:00:00Z');
29
+ * const nyTime = instant.toZonedDateTimeISO('America/New_York');
30
+ * const start = startOfWeek(nyTime);
31
+ * // 2025-01-20T00:00:00-05:00[America/New_York]
32
+ * ```
33
+ */
34
+ export declare function startOfWeek(input: Temporal.Instant | Temporal.ZonedDateTime): Temporal.ZonedDateTime;
35
+ //# sourceMappingURL=startOfWeek.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"startOfWeek.d.ts","sourceRoot":"","sources":["../src/startOfWeek.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAGtD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,QAAQ,CAAC,OAAO,GAAG,QAAQ,CAAC,aAAa,GAC/C,QAAQ,CAAC,aAAa,CAaxB"}
@@ -0,0 +1,8 @@
1
+ import {
2
+ startOfWeek
3
+ } from "./chunk-2WMXB7QL.js";
4
+ import "./chunk-MJSZNWCV.js";
5
+ export {
6
+ startOfWeek
7
+ };
8
+ //# sourceMappingURL=startOfWeek.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=startOfWeek.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"startOfWeek.test.d.ts","sourceRoot":"","sources":["../src/startOfWeek.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,34 @@
1
+ import type { Temporal } from '@js-temporal/polyfill';
2
+ /**
3
+ * Returns a ZonedDateTime representing the first moment of the year (January 1 at midnight).
4
+ *
5
+ * @param input - A Temporal.Instant (UTC) or Temporal.ZonedDateTime
6
+ * @returns ZonedDateTime at January 1st at 00:00:00.000000000
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * // From Instant (always UTC)
11
+ * const instant = Temporal.Instant.from('2025-06-15T12:00:00Z');
12
+ * const start = startOfYear(instant);
13
+ * // 2025-01-01T00:00:00Z[UTC]
14
+ * ```
15
+ *
16
+ * @example
17
+ * ```ts
18
+ * // From ZonedDateTime (uses its timezone)
19
+ * const zoned = Temporal.ZonedDateTime.from('2025-06-15T15:30:00-05:00[America/New_York]');
20
+ * const start = startOfYear(zoned);
21
+ * // 2025-01-01T00:00:00-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-06-15T12:00:00Z');
28
+ * const nyTime = instant.toZonedDateTimeISO('America/New_York');
29
+ * const start = startOfYear(nyTime);
30
+ * // 2025-01-01T00:00:00-05:00[America/New_York]
31
+ * ```
32
+ */
33
+ export declare function startOfYear(input: Temporal.Instant | Temporal.ZonedDateTime): Temporal.ZonedDateTime;
34
+ //# sourceMappingURL=startOfYear.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"startOfYear.d.ts","sourceRoot":"","sources":["../src/startOfYear.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAGtD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,QAAQ,CAAC,OAAO,GAAG,QAAQ,CAAC,aAAa,GAC/C,QAAQ,CAAC,aAAa,CAOxB"}
@@ -0,0 +1,8 @@
1
+ import {
2
+ startOfYear
3
+ } from "./chunk-YR2UCUIT.js";
4
+ import "./chunk-MJSZNWCV.js";
5
+ export {
6
+ startOfYear
7
+ };
8
+ //# sourceMappingURL=startOfYear.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=startOfYear.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"startOfYear.test.d.ts","sourceRoot":"","sources":["../src/startOfYear.test.ts"],"names":[],"mappings":""}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gobrand/tiempo",
3
- "version": "2.1.1",
3
+ "version": "2.1.2",
4
4
  "description": "Lightweight utility functions for converting between UTC and timezone-aware datetimes using the Temporal API",
5
5
  "private": false,
6
6
  "publishConfig": {
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/format.ts"],"sourcesContent":["import { Temporal } from '@js-temporal/polyfill';\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 Instant to ZonedDateTime if needed\n let zonedDateTime: Temporal.ZonedDateTime;\n if (input instanceof Temporal.Instant) {\n const tz = timeZone || 'UTC';\n zonedDateTime = input.toZonedDateTimeISO(tz);\n } else {\n zonedDateTime = timeZone\n ? input.toInstant().toZonedDateTimeISO(timeZone)\n : 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":";AAAA,SAAS,gBAAgB;AA6BlB,SAAS,OACd,OACA,WACA,UAAyB,CAAC,GAClB;AACR,QAAM,EAAE,SAAS,SAAS,SAAS,IAAI;AAGvC,MAAI;AACJ,MAAI,iBAAiB,SAAS,SAAS;AACrC,UAAM,KAAK,YAAY;AACvB,oBAAgB,MAAM,mBAAmB,EAAE;AAAA,EAC7C,OAAO;AACL,oBAAgB,WACZ,MAAM,UAAU,EAAE,mBAAmB,QAAQ,IAC7C;AAAA,EACN;AAEA,MAAI,SAAS;AACb,MAAI,IAAI;AACR,QAAM,MAAM,UAAU;AAEtB,SAAO,IAAI,KAAK;AACd,UAAM,OAAO,UAAU,CAAC;AACxB,QAAI,CAAC,KAAM;AAGX,QAAI,SAAS,KAAK;AAEhB,UAAI,IAAI,IAAI,OAAO,UAAU,IAAI,CAAC,MAAM,KAAK;AAC3C,kBAAU;AACV,aAAK;AACL;AAAA,MACF;AAEA;AACA,aAAO,IAAI,KAAK;AACd,YAAI,UAAU,CAAC,MAAM,KAAK;AAExB,cAAI,IAAI,IAAI,OAAO,UAAU,IAAI,CAAC,MAAM,KAAK;AAC3C,sBAAU;AACV,iBAAK;AAAA,UACP,OAAO;AAEL;AACA;AAAA,UACF;AAAA,QACF,OAAO;AACL,oBAAU,UAAU,CAAC;AACrB;AAAA,QACF;AAAA,MACF;AACA;AAAA,IACF;AAGA,UAAM,QAAQ,aAAa,WAAW,GAAG,IAAI;AAC7C,QAAI,UAAU,MAAM;AAClB,gBAAU,YAAY,OAAO,eAAe,MAAM;AAClD,WAAK,MAAM;AAAA,IACb,OAAO;AACL,gBAAU;AACV;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,aAAa,WAAmB,OAAe,MAA6B;AAEnF,MAAI,SAAS,OAAO,QAAQ,IAAI,UAAU,UAAU,UAAU,QAAQ,CAAC,MAAM,KAAK;AAChF,WAAO;AAAA,EACT;AACA,MAAI,SAAS,OAAO,QAAQ,IAAI,UAAU,UAAU,UAAU,QAAQ,CAAC,MAAM,KAAK;AAChF,WAAO;AAAA,EACT;AAGA,MAAI,MAAM;AACV,SAAO,MAAM,UAAU,UAAU,UAAU,GAAG,MAAM,MAAM;AACxD;AAAA,EACF;AACA,QAAM,QAAQ,MAAM;AAGpB,QAAM,cAAc;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAGA,WAAS,MAAM,KAAK,IAAI,OAAO,CAAC,GAAG,MAAM,GAAG,OAAO;AACjD,UAAM,YAAY,KAAK,OAAO,GAAG;AACjC,QAAI,YAAY,SAAS,SAAS,GAAG;AACnC,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,YAAY,OAAe,eAAuC,QAAwB;AACjG,UAAQ,OAAO;AAAA;AAAA,IAEb,KAAK;AACH,aAAO,WAAW,eAAe,OAAO,UAAU,MAAM;AAAA,IAC1D,KAAK;AACH,aAAO,WAAW,eAAe,OAAO,QAAQ,MAAM;AAAA,IACxD,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO,WAAW,eAAe,OAAO,SAAS,MAAM;AAAA;AAAA,IAGzD,KAAK;AACH,aAAO,cAAc,KAAK,SAAS,EAAE,SAAS,GAAG,GAAG;AAAA,IACtD,KAAK;AACH,aAAO,cAAc,KAAK,SAAS,EAAE,SAAS,GAAG,GAAG;AAAA,IACtD,KAAK;AACH,cAAQ,cAAc,OAAO,KAAK,SAAS,EAAE,SAAS,GAAG,GAAG;AAAA,IAC9D,KAAK;AACH,aAAO,cAAc,KAAK,SAAS;AAAA;AAAA,IAGrC,KAAK;AACH,aAAO,KAAK,KAAK,cAAc,QAAQ,CAAC,EAAE,SAAS;AAAA,IACrD,KAAK,QAAQ;AACX,YAAM,UAAU,KAAK,KAAK,cAAc,QAAQ,CAAC;AACjD,aAAO,GAAG,OAAO,GAAG,iBAAiB,OAAO,CAAC;AAAA,IAC/C;AAAA,IACA,KAAK;AACH,aAAO,IAAI,KAAK,KAAK,cAAc,QAAQ,CAAC,CAAC;AAAA,IAC/C,KAAK;AACH,aAAO,KAAK,KAAK,cAAc,QAAQ,CAAC,EACrC,SAAS,EACT,SAAS,GAAG,GAAG;AAAA,IACpB,KAAK;AACH,aAAO,KAAK,KAAK,cAAc,QAAQ,CAAC,EAAE,SAAS;AAAA;AAAA,IAGrD,KAAK;AACH,aAAO,WAAW,eAAe,SAAS,UAAU,MAAM;AAAA,IAC5D,KAAK;AACH,aAAO,WAAW,eAAe,SAAS,QAAQ,MAAM;AAAA,IAC1D,KAAK;AACH,aAAO,WAAW,eAAe,SAAS,SAAS,MAAM;AAAA,IAC3D,KAAK;AACH,aAAO,cAAc,MAAM,SAAS,EAAE,SAAS,GAAG,GAAG;AAAA,IACvD,KAAK;AACH,aAAO,GAAG,cAAc,KAAK,GAAG,iBAAiB,cAAc,KAAK,CAAC;AAAA,IACvE,KAAK;AACH,aAAO,cAAc,MAAM,SAAS;AAAA;AAAA,IAGtC,KAAK;AACH,aAAO,GAAG,cAAc,GAAG,GAAG,iBAAiB,cAAc,GAAG,CAAC;AAAA,IACnE,KAAK;AACH,aAAO,cAAc,IAAI,SAAS,EAAE,SAAS,GAAG,GAAG;AAAA,IACrD,KAAK;AACH,aAAO,cAAc,IAAI,SAAS;AAAA;AAAA,IAGpC,KAAK;AACH,aAAO,WAAW,eAAe,WAAW,SAAS,MAAM,EAAE,MAAM,GAAG,CAAC;AAAA,IACzE,KAAK;AACH,aAAO,WAAW,eAAe,WAAW,UAAU,MAAM;AAAA,IAC9D,KAAK;AACH,aAAO,WAAW,eAAe,WAAW,QAAQ,MAAM;AAAA,IAC5D,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO,WAAW,eAAe,WAAW,SAAS,MAAM;AAAA;AAAA,IAG7D,KAAK,SAAS;AACZ,YAAM,SAAS,WAAW,eAAe,aAAa,UAAU,MAAM,EAAE,YAAY;AACpF,aAAO,OAAO,OAAO,CAAC;AAAA,IACxB;AAAA,IACA,KAAK,QAAQ;AACX,YAAM,SAAS,WAAW,eAAe,aAAa,SAAS,MAAM;AACrE,aAAO,WAAW,OAAO,SAAS;AAAA,IACpC;AAAA,IACA,KAAK;AACH,aAAO,WAAW,eAAe,aAAa,SAAS,MAAM,EAAE,YAAY;AAAA,IAC7E,KAAK;AAAA,IACL,KAAK;AACH,aAAO,WAAW,eAAe,aAAa,SAAS,MAAM;AAAA;AAAA,IAG/D,KAAK;AACH,aAAO,cAAc,KAAK,SAAS,EAAE,SAAS,GAAG,GAAG;AAAA,IACtD,KAAK;AACH,aAAO,cAAc,KAAK,SAAS;AAAA;AAAA,IAGrC,KAAK,MAAM;AACT,YAAM,SAAS,cAAc,OAAO,MAAM;AAC1C,aAAO,OAAO,SAAS,EAAE,SAAS,GAAG,GAAG;AAAA,IAC1C;AAAA,IACA,KAAK,KAAK;AACR,YAAM,SAAS,cAAc,OAAO,MAAM;AAC1C,aAAO,OAAO,SAAS;AAAA,IACzB;AAAA;AAAA,IAGA,KAAK;AACH,aAAO,cAAc,OAAO,SAAS,EAAE,SAAS,GAAG,GAAG;AAAA,IACxD,KAAK;AACH,aAAO,cAAc,OAAO,SAAS;AAAA;AAAA,IAGvC,KAAK;AACH,aAAO,cAAc,OAAO,SAAS,EAAE,SAAS,GAAG,GAAG;AAAA,IACxD,KAAK;AACH,aAAO,cAAc,OAAO,SAAS;AAAA;AAAA,IAGvC,KAAK;AACH,aAAO,cAAc,YAAY,SAAS,EAAE,SAAS,GAAG,GAAG;AAAA,IAC7D,KAAK;AACH,aAAO,KAAK,MAAM,cAAc,cAAc,EAAE,EAC7C,SAAS,EACT,SAAS,GAAG,GAAG;AAAA,IACpB,KAAK;AACH,aAAO,KAAK,MAAM,cAAc,cAAc,GAAG,EAAE,SAAS;AAAA;AAAA,IAG9D,KAAK,SAAS;AACZ,YAAM,SAAS,kBAAkB,aAAa;AAC9C,aAAO,WAAW,WAAW,MAAM;AAAA,IACrC;AAAA,IACA,KAAK,QAAQ;AACX,YAAM,SAAS,kBAAkB,aAAa,EAAE,QAAQ,KAAK,EAAE;AAC/D,aAAO,WAAW,UAAU,MAAM;AAAA,IACpC;AAAA,IACA,KAAK,OAAO;AACV,YAAM,SAAS,kBAAkB,aAAa;AAC9C,aAAO,WAAW,WAAW,MAAM;AAAA,IACrC;AAAA,IACA,KAAK,MAAM;AACT,YAAM,SAAS,kBAAkB,aAAa,EAAE,QAAQ,KAAK,EAAE;AAC/D,aAAO,WAAW,UAAU,MAAM;AAAA,IACpC;AAAA,IACA,KAAK,KAAK;AACR,YAAM,SAAS,kBAAkB,aAAa;AAC9C,UAAI,WAAW,SAAU,QAAO;AAChC,YAAM,CAAC,KAAK,IAAI,OAAO,MAAM,GAAG;AAChC,aAAO,SAAS;AAAA,IAClB;AAAA,IACA,KAAK;AACH,aAAO,kBAAkB,aAAa;AAAA,IACxC,KAAK;AACH,aAAO,kBAAkB,aAAa,EAAE,QAAQ,KAAK,EAAE;AAAA,IACzD,KAAK;AACH,aAAO,kBAAkB,aAAa;AAAA,IACxC,KAAK;AACH,aAAO,kBAAkB,aAAa,EAAE,QAAQ,KAAK,EAAE;AAAA,IACzD,KAAK,KAAK;AACR,YAAM,SAAS,kBAAkB,aAAa;AAC9C,YAAM,CAAC,KAAK,IAAI,OAAO,MAAM,GAAG;AAChC,aAAO,SAAS;AAAA,IAClB;AAAA,IACA,KAAK;AACH,aAAO,WAAW,eAAe,gBAAgB,QAAQ,MAAM;AAAA,IACjE,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO,WAAW,eAAe,gBAAgB,SAAS,MAAM;AAAA;AAAA,IAGlE,KAAK;AACH,aAAO,cAAc,kBAAkB,SAAS;AAAA,IAClD,KAAK;AACH,aAAO,KAAK,MAAM,cAAc,oBAAoB,GAAI,EAAE,SAAS;AAAA,IAErE;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,WACP,eACA,MACA,OACA,QACQ;AACR,QAAM,UAAsC,CAAC;AAE7C,MAAI,SAAS,aAAa;AAExB,YAAQ,OAAO;AACf,YAAQ,SAAS;AAAA,EACnB,OAAO;AACL,YAAQ,IAAI,IAAI;AAAA,EAClB;AAEA,QAAM,YAAY,cAAc,eAAe,QAAQ,OAAO;AAE9D,MAAI,SAAS,aAAa;AAExB,UAAM,QAAQ,UAAU,MAAM,iCAAiC;AAC/D,WAAO,QAAQ,MAAM,CAAC,IAAI,UAAU,MAAM,GAAG,EAAE,IAAI,KAAK;AAAA,EAC1D;AAEA,SAAO;AACT;AAEA,SAAS,iBAAiB,KAAqB;AAC7C,QAAM,IAAI,MAAM;AAChB,QAAM,IAAI,MAAM;AAChB,MAAI,MAAM,KAAK,MAAM,GAAI,QAAO;AAChC,MAAI,MAAM,KAAK,MAAM,GAAI,QAAO;AAChC,MAAI,MAAM,KAAK,MAAM,GAAI,QAAO;AAChC,SAAO;AACT;AAEA,SAAS,kBAAkB,eAA+C;AACxE,QAAM,WAAW,cAAc;AAC/B,QAAM,gBAAgB,YAAY,KAAK;AACvC,QAAM,OAAO,iBAAiB,IAAI,MAAM;AACxC,QAAM,aAAa,KAAK,IAAI,aAAa;AACzC,QAAM,QAAQ,KAAK,MAAM,aAAa,EAAE;AACxC,QAAM,UAAU,aAAa;AAC7B,SAAO,GAAG,IAAI,GAAG,MAAM,SAAS,EAAE,SAAS,GAAG,GAAG,CAAC,IAAI,QAAQ,SAAS,EAAE,SAAS,GAAG,GAAG,CAAC;AAC3F;","names":[]}