temporal-fmt 0.9.0 → 0.9.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 (105) hide show
  1. package/dist/calendarUtils.cjs +4 -259
  2. package/dist/calendarUtils.cjs.map +1 -1
  3. package/dist/calendarUtils.js +1 -33
  4. package/dist/chunk-2JHEV7ZF.js +7 -0
  5. package/dist/chunk-2JHEV7ZF.js.map +1 -0
  6. package/dist/chunk-3MZLTVP3.js +2 -0
  7. package/dist/{chunk-MXXYIMFJ.js.map → chunk-3MZLTVP3.js.map} +1 -1
  8. package/dist/chunk-4JWGUR4O.js +11 -0
  9. package/dist/{chunk-AXQLUIDY.js.map → chunk-4JWGUR4O.js.map} +1 -1
  10. package/dist/chunk-5U5WJ465.js +36 -0
  11. package/dist/chunk-5U5WJ465.js.map +1 -0
  12. package/dist/chunk-C5YESWFT.js +2 -0
  13. package/dist/chunk-C5YESWFT.js.map +1 -0
  14. package/dist/chunk-C6ZZ62ET.js +2 -0
  15. package/dist/{chunk-YS52LOMJ.js.map → chunk-C6ZZ62ET.js.map} +1 -1
  16. package/dist/chunk-EHLRZULM.js +5 -0
  17. package/dist/{chunk-4ZBGVYLR.js.map → chunk-EHLRZULM.js.map} +1 -1
  18. package/dist/chunk-F4RGUDA3.js +2 -0
  19. package/dist/chunk-F4RGUDA3.js.map +1 -0
  20. package/dist/chunk-J2AQNXF2.js +2 -0
  21. package/dist/{chunk-GRJQHQLW.js.map → chunk-J2AQNXF2.js.map} +1 -1
  22. package/dist/chunk-NBXF7V5B.js +2 -0
  23. package/dist/chunk-NBXF7V5B.js.map +1 -0
  24. package/dist/chunk-R52YOKI3.js +7 -0
  25. package/dist/{chunk-M33NSC4E.js.map → chunk-R52YOKI3.js.map} +1 -1
  26. package/dist/chunk-UJR6DHXY.js +2 -0
  27. package/dist/chunk-UJR6DHXY.js.map +1 -0
  28. package/dist/chunk-VQXUMFB2.js +21 -0
  29. package/dist/{chunk-VHSZL3P3.js.map → chunk-VQXUMFB2.js.map} +1 -1
  30. package/dist/chunk-XH46JNPK.js +2 -0
  31. package/dist/chunk-XH46JNPK.js.map +1 -0
  32. package/dist/chunk-YB6YAG7E.js +35 -0
  33. package/dist/chunk-YB6YAG7E.js.map +1 -0
  34. package/dist/chunk-ZGMTY52O.js +2 -0
  35. package/dist/chunk-ZGMTY52O.js.map +1 -0
  36. package/dist/duration.cjs +9 -624
  37. package/dist/duration.cjs.map +1 -1
  38. package/dist/duration.js +1 -29
  39. package/dist/format.cjs +18 -769
  40. package/dist/format.cjs.map +1 -1
  41. package/dist/format.js +1 -20
  42. package/dist/formatDuration.d.cts +6 -0
  43. package/dist/formatDuration.d.ts +6 -0
  44. package/dist/index.cjs +146 -6672
  45. package/dist/index.cjs.map +1 -1
  46. package/dist/index.js +58 -3004
  47. package/dist/index.js.map +1 -1
  48. package/dist/interval.cjs +18 -952
  49. package/dist/interval.cjs.map +1 -1
  50. package/dist/interval.js +1 -41
  51. package/dist/localeRegistry.cjs +15 -328
  52. package/dist/localeRegistry.cjs.map +1 -1
  53. package/dist/localeRegistry.js +1 -11
  54. package/dist/localeVocab.d.cts +3 -0
  55. package/dist/localeVocab.d.ts +3 -0
  56. package/dist/parse.cjs +53 -1637
  57. package/dist/parse.cjs.map +1 -1
  58. package/dist/parse.js +1 -20
  59. package/dist/parsePattern.d.cts +1 -0
  60. package/dist/parsePattern.d.ts +1 -0
  61. package/dist/pattern.d.cts +1 -0
  62. package/dist/pattern.d.ts +1 -0
  63. package/dist/recurrence.cjs +20 -450
  64. package/dist/recurrence.cjs.map +1 -1
  65. package/dist/recurrence.js +1 -20
  66. package/dist/relativeTime.cjs +24 -177
  67. package/dist/relativeTime.cjs.map +1 -1
  68. package/dist/relativeTime.js +1 -14
  69. package/dist/rounding.d.cts +1 -0
  70. package/dist/rounding.d.ts +1 -0
  71. package/dist/serialization.d.cts +1 -1
  72. package/dist/serialization.d.ts +1 -1
  73. package/dist/timezone.cjs +20 -387
  74. package/dist/timezone.cjs.map +1 -1
  75. package/dist/timezone.js +1 -26
  76. package/dist/typeGuards.d.cts +9 -9
  77. package/dist/typeGuards.d.ts +9 -9
  78. package/package.json +4 -2
  79. package/dist/chunk-4ZBGVYLR.js +0 -182
  80. package/dist/chunk-AXQLUIDY.js +0 -183
  81. package/dist/chunk-CKVHXFX7.js +0 -902
  82. package/dist/chunk-CKVHXFX7.js.map +0 -1
  83. package/dist/chunk-CSUIKL73.js +0 -215
  84. package/dist/chunk-CSUIKL73.js.map +0 -1
  85. package/dist/chunk-EDUFSRWJ.js +0 -9
  86. package/dist/chunk-EDUFSRWJ.js.map +0 -1
  87. package/dist/chunk-FQA4XJME.js +0 -57
  88. package/dist/chunk-FQA4XJME.js.map +0 -1
  89. package/dist/chunk-FTMLZ4EN.js +0 -196
  90. package/dist/chunk-FTMLZ4EN.js.map +0 -1
  91. package/dist/chunk-GRJQHQLW.js +0 -170
  92. package/dist/chunk-JCIMP43G.js +0 -602
  93. package/dist/chunk-JCIMP43G.js.map +0 -1
  94. package/dist/chunk-KDYK72Z2.js +0 -75
  95. package/dist/chunk-KDYK72Z2.js.map +0 -1
  96. package/dist/chunk-M33NSC4E.js +0 -169
  97. package/dist/chunk-MXXYIMFJ.js +0 -29
  98. package/dist/chunk-NFKQ3EXC.js +0 -188
  99. package/dist/chunk-NFKQ3EXC.js.map +0 -1
  100. package/dist/chunk-O6GVMBLW.js +0 -403
  101. package/dist/chunk-O6GVMBLW.js.map +0 -1
  102. package/dist/chunk-VHSZL3P3.js +0 -242
  103. package/dist/chunk-VSUCBUTC.js +0 -295
  104. package/dist/chunk-VSUCBUTC.js.map +0 -1
  105. package/dist/chunk-YS52LOMJ.js +0 -51
@@ -1,196 +0,0 @@
1
- import {
2
- format,
3
- formatToParts
4
- } from "./chunk-AXQLUIDY.js";
5
- import {
6
- compare
7
- } from "./chunk-NFKQ3EXC.js";
8
- import {
9
- asDateFieldView
10
- } from "./chunk-4ZBGVYLR.js";
11
-
12
- // src/interval.ts
13
- function interval(start, end, bounds = "closed") {
14
- const cmp = compare(start, end);
15
- if (cmp > 0) {
16
- throw new Error(
17
- `temporal-fmt: interval start must be \u2264 end (got start > end). Pass them in chronological order.`
18
- );
19
- }
20
- return { start, end, bounds };
21
- }
22
- function contains(iv, value) {
23
- const startCmp = compare(value, iv.start);
24
- const endCmp = compare(value, iv.end);
25
- const afterStart = iv.bounds === "open" || iv.bounds === "half-open-end" ? startCmp > 0 : startCmp >= 0;
26
- const beforeEnd = iv.bounds === "open" || iv.bounds === "half-open-start" ? endCmp < 0 : endCmp <= 0;
27
- return afterStart && beforeEnd;
28
- }
29
- function overlaps(a, b) {
30
- return intersects(a, b);
31
- }
32
- function intersects(a, b) {
33
- if (compare(a.end, b.start) < 0) return false;
34
- if (compare(a.start, b.end) > 0) return false;
35
- return true;
36
- }
37
- function isBefore(a, b) {
38
- return compare(a.end, b.start) < 0;
39
- }
40
- function isAfter(a, b) {
41
- return compare(a.start, b.end) > 0;
42
- }
43
- function intersection(a, b) {
44
- if (!intersects(a, b)) return null;
45
- const start = compare(a.start, b.start) >= 0 ? a.start : b.start;
46
- const end = compare(a.end, b.end) <= 0 ? a.end : b.end;
47
- const startBoundsOpen = a.bounds === "open" || a.bounds === "half-open-end" || (b.bounds === "open" || b.bounds === "half-open-end");
48
- const endBoundsOpen = a.bounds === "open" || a.bounds === "half-open-start" || (b.bounds === "open" || b.bounds === "half-open-start");
49
- const bounds = startBoundsOpen && endBoundsOpen ? "open" : startBoundsOpen ? "half-open-end" : endBoundsOpen ? "half-open-start" : "closed";
50
- return { start, end, bounds };
51
- }
52
- function union(a, b) {
53
- if (!intersects(a, b)) return null;
54
- const start = compare(a.start, b.start) <= 0 ? a.start : b.start;
55
- const end = compare(a.end, b.end) >= 0 ? a.end : b.end;
56
- const startBoundsOpen = (a.bounds === "open" || a.bounds === "half-open-end") && (b.bounds === "open" || b.bounds === "half-open-end");
57
- const endBoundsOpen = (a.bounds === "open" || a.bounds === "half-open-start") && (b.bounds === "open" || b.bounds === "half-open-start");
58
- const bounds = startBoundsOpen && endBoundsOpen ? "open" : startBoundsOpen ? "half-open-end" : endBoundsOpen ? "half-open-start" : "closed";
59
- return { start, end, bounds };
60
- }
61
- function difference(a, b) {
62
- if (!intersects(a, b)) return [a];
63
- const result = [];
64
- if (compare(a.start, b.start) < 0) {
65
- result.push({ start: a.start, end: b.start, bounds: flipEndBounds(a.bounds, "half-open-end") });
66
- }
67
- if (compare(a.end, b.end) > 0) {
68
- result.push({ start: b.end, end: a.end, bounds: flipEndBounds("half-open-start", a.bounds) });
69
- }
70
- return result;
71
- }
72
- function flipEndBounds(startBounds, endBounds) {
73
- if (startBounds === "open" || endBounds === "open") return "open";
74
- if (startBounds === "half-open-end") return "half-open-end";
75
- if (endBounds === "half-open-start") return "half-open-start";
76
- return "closed";
77
- }
78
- var subtract = difference;
79
- function mergeIntervals(intervals) {
80
- if (intervals.length === 0) return [];
81
- const sorted = [...intervals].sort((a, b) => compare(a.start, b.start));
82
- const result = [sorted[0]];
83
- for (let i = 1; i < sorted.length; i++) {
84
- const current = sorted[i];
85
- const last = result[result.length - 1];
86
- if (intersects(last, current) || compare(last.end, current.start) === 0) {
87
- if (compare(current.end, last.end) > 0) {
88
- last.end = current.end;
89
- }
90
- } else {
91
- result.push(current);
92
- }
93
- }
94
- return result;
95
- }
96
- function splitInterval(iv, n) {
97
- if (n <= 0) throw new Error(`temporal-fmt: splitInterval requires n > 0 (got ${n}).`);
98
- if (n === 1) return [iv];
99
- const startFields = asDateFieldView(iv.start);
100
- const endFields = asDateFieldView(iv.end);
101
- const startMs = toMs(startFields);
102
- const endMs = toMs(endFields);
103
- const step = (endMs - startMs) / n;
104
- const result = [];
105
- for (let i = 0; i < n; i++) {
106
- const sliceStart = startMs + i * step;
107
- const sliceEnd = i === n - 1 ? endMs : sliceStart + step;
108
- result.push({
109
- start: fromMs(sliceStart, startFields),
110
- end: fromMs(sliceEnd, endFields),
111
- bounds: i === 0 ? iv.bounds : "half-open-start"
112
- });
113
- }
114
- return result;
115
- }
116
- function toMs(v) {
117
- const y = v.year, m = v.month, d = v.day;
118
- const y2 = m <= 2 ? y - 1 : y;
119
- const era = Math.floor((y2 >= 0 ? y2 : y2 - 399) / 400);
120
- const yoe = y2 - era * 400;
121
- const m2 = m > 2 ? m - 3 : m + 9;
122
- const doy = Math.floor((153 * m2 + 2) / 5) + d - 1;
123
- const doe = yoe * 365 + Math.floor(yoe / 4) - Math.floor(yoe / 100) + doy;
124
- const days = era * 146097 + doe - 719468;
125
- return days * 864e5 + (v.hour ?? 0) * 36e5 + (v.minute ?? 0) * 6e4 + (v.second ?? 0) * 1e3 + (v.millisecond ?? 0);
126
- }
127
- function fromMs(ms, base) {
128
- const MS_PER_DAY = 864e5;
129
- const dayOverflow = Math.floor(ms / MS_PER_DAY);
130
- let withinDay = ms % MS_PER_DAY;
131
- if (withinDay < 0) withinDay += MS_PER_DAY;
132
- const hour = Math.floor(withinDay / 36e5);
133
- const minute = Math.floor(withinDay % 36e5 / 6e4);
134
- const second = Math.floor(withinDay % 6e4 / 1e3);
135
- const millisecond = withinDay % 1e3;
136
- const newMs = dayOverflow * MS_PER_DAY;
137
- const d = new Date(newMs);
138
- return {
139
- ...base,
140
- year: d.getUTCFullYear(),
141
- month: d.getUTCMonth() + 1,
142
- day: d.getUTCDate(),
143
- hour,
144
- minute,
145
- second,
146
- millisecond
147
- };
148
- }
149
- function formatRange(iv, formatStr, options = {}) {
150
- try {
151
- const fmt = new Intl.DateTimeFormat(options.locale ?? "en-US", {});
152
- const startDate = toJSDate(iv.start);
153
- const endDate = toJSDate(iv.end);
154
- return fmt.formatRange(startDate, endDate);
155
- } catch {
156
- const startStr = format(iv.start, formatStr, options);
157
- const endStr = format(iv.end, formatStr, options);
158
- return `${startStr} \u2013 ${endStr}`;
159
- }
160
- }
161
- function formatRangeToParts(iv, formatStr, options = {}) {
162
- const startParts = formatToParts(iv.start, formatStr, options);
163
- const endParts = formatToParts(iv.end, formatStr, options);
164
- const result = [...startParts];
165
- result.push({ type: "literal", value: " \u2013 " });
166
- result.push(...endParts);
167
- return result;
168
- }
169
- function toJSDate(value) {
170
- const v = value;
171
- if (typeof v?.toInstant === "function") {
172
- return new Date(v.toInstant().epochMilliseconds);
173
- }
174
- if (typeof v?.year === "number" && typeof v?.month === "number" && typeof v?.day === "number") {
175
- return new Date(Date.UTC(v.year, v.month - 1, v.day, v.hour ?? 0, v.minute ?? 0, v.second ?? 0, v.millisecond ?? 0));
176
- }
177
- throw new Error(`temporal-fmt: formatRange() expected Temporal values with year/month/day, got ${typeof value}.`);
178
- }
179
-
180
- export {
181
- interval,
182
- contains,
183
- overlaps,
184
- intersects,
185
- isBefore,
186
- isAfter,
187
- intersection,
188
- union,
189
- difference,
190
- subtract,
191
- mergeIntervals,
192
- splitInterval,
193
- formatRange,
194
- formatRangeToParts
195
- };
196
- //# sourceMappingURL=chunk-FTMLZ4EN.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/interval.ts"],"sourcesContent":["// Intervals / ranges. An interval is a pair of\n// (start, end) Temporal values with bounds semantics: open, closed,\n// or half-open. Operations: contains, overlaps, intersects, isBefore,\n// isAfter, intersection, union, difference, subtract, mergeIntervals,\n// splitInterval. Plus formatRange / formatRangeToParts with intelligent\n// collapsing.\n//\n// All operations are field-based (no instanceof), matching the rest of\n// the library. Internally uses the comparison helpers from comparison.ts\n// to order endpoints.\n\nimport { compare } from './comparison.js';\nimport { format, formatToParts, type FormattedPart } from './format.js';\nimport { asDateFieldView, type DateFieldView } from './calendarUtils.js';\nimport type { FormatOptions } from './tokens.js';\n\nexport type IntervalBounds = 'open' | 'closed' | 'half-open-start' | 'half-open-end';\n\nexport interface Interval {\n start: unknown;\n end: unknown;\n bounds: IntervalBounds;\n}\n\nexport function interval(start: unknown, end: unknown, bounds: IntervalBounds = 'closed'): Interval {\n // Validate that start ≤ end, otherwise the interval is malformed.\n const cmp = compare(start, end);\n if (cmp > 0) {\n throw new Error(\n `temporal-fmt: interval start must be ≤ end (got start > end). Pass them in chronological order.`\n );\n }\n return { start, end, bounds };\n}\n\n// Inclusive containment check accounting for bounds semantics.\n// - 'closed': [start, end] — both endpoints included\n// - 'open': (start, end) — neither endpoint included\n// - 'half-open-start': (start, end] — start excluded, end included\n// - 'half-open-end': [start, end) — start included, end excluded\nexport function contains(iv: Interval, value: unknown): boolean {\n const startCmp = compare(value, iv.start);\n const endCmp = compare(value, iv.end);\n const afterStart = iv.bounds === 'open' || iv.bounds === 'half-open-end'\n ? startCmp > 0\n : startCmp >= 0;\n const beforeEnd = iv.bounds === 'open' || iv.bounds === 'half-open-start'\n ? endCmp < 0\n : endCmp <= 0;\n return afterStart && beforeEnd;\n}\n\n// Two intervals overlap iff their ranges intersect, regardless of bounds.\n// intersects() is the boolean form; intersection() returns the actual\n// overlap interval.\nexport function overlaps(a: Interval, b: Interval): boolean {\n return intersects(a, b);\n}\n\nexport function intersects(a: Interval, b: Interval): boolean {\n // a is entirely before b: a.end < b.start\n if (compare(a.end, b.start) < 0) return false;\n // a is entirely after b: a.start > b.end\n if (compare(a.start, b.end) > 0) return false;\n // Touching endpoints with both-closed bounds counts as overlap;\n // open bounds would not. To keep it simple, touching counts.\n return true;\n}\n\nexport function isBefore(a: Interval, b: Interval): boolean {\n return compare(a.end, b.start) < 0;\n}\n\nexport function isAfter(a: Interval, b: Interval): boolean {\n return compare(a.start, b.end) > 0;\n}\n\n// Returns the intersection of two intervals, or null if they don't\n// overlap. The result's bounds are the more restrictive of the two\n// inputs (closed ∩ open = open, etc.).\nexport function intersection(a: Interval, b: Interval): Interval | null {\n if (!intersects(a, b)) return null;\n const start = compare(a.start, b.start) >= 0 ? a.start : b.start;\n const end = compare(a.end, b.end) <= 0 ? a.end : b.end;\n // Compute resulting bounds: take the more restrictive at each endpoint.\n // If a.start === b.start, the more restrictive of (a.bounds, b.bounds)\n // at that endpoint wins.\n const startBoundsOpen = (a.bounds === 'open' || a.bounds === 'half-open-end')\n || (b.bounds === 'open' || b.bounds === 'half-open-end');\n const endBoundsOpen = (a.bounds === 'open' || a.bounds === 'half-open-start')\n || (b.bounds === 'open' || b.bounds === 'half-open-start');\n const bounds: IntervalBounds = startBoundsOpen && endBoundsOpen ? 'open'\n : startBoundsOpen ? 'half-open-end'\n : endBoundsOpen ? 'half-open-start'\n : 'closed';\n return { start, end, bounds };\n}\n\n// Returns the union of two intervals (the smallest interval containing\n// both), or null if they don't overlap (caller should use mergeIntervals\n// for that case).\nexport function union(a: Interval, b: Interval): Interval | null {\n if (!intersects(a, b)) return null;\n const start = compare(a.start, b.start) <= 0 ? a.start : b.start;\n const end = compare(a.end, b.end) >= 0 ? a.end : b.end;\n // Union's bounds are the less restrictive at each endpoint.\n const startBoundsOpen = (a.bounds === 'open' || a.bounds === 'half-open-end')\n && (b.bounds === 'open' || b.bounds === 'half-open-end');\n const endBoundsOpen = (a.bounds === 'open' || a.bounds === 'half-open-start')\n && (b.bounds === 'open' || b.bounds === 'half-open-start');\n const bounds: IntervalBounds = startBoundsOpen && endBoundsOpen ? 'open'\n : startBoundsOpen ? 'half-open-end'\n : endBoundsOpen ? 'half-open-start'\n : 'closed';\n return { start, end, bounds };\n}\n\n// Returns the part of `a` that is not in `b`. May produce 0, 1, or 2\n// intervals depending on the overlap shape.\nexport function difference(a: Interval, b: Interval): Interval[] {\n if (!intersects(a, b)) return [a];\n const result: Interval[] = [];\n // Part of `a` before `b` starts.\n if (compare(a.start, b.start) < 0) {\n result.push({ start: a.start, end: b.start, bounds: flipEndBounds(a.bounds, 'half-open-end') });\n }\n // Part of `a` after `b` ends.\n if (compare(a.end, b.end) > 0) {\n result.push({ start: b.end, end: a.end, bounds: flipEndBounds('half-open-start', a.bounds) });\n }\n return result;\n}\n\nfunction flipEndBounds(startBounds: IntervalBounds, endBounds: IntervalBounds): IntervalBounds {\n // When cutting `a` at b.start or b.end, the cut boundary is open\n // (excluded) on the b side. Closed on the a side.\n // This helper computes the resulting bounds for the two pieces.\n // For simplicity, return 'half-open' variants; callers needing exact\n // closed-bound semantics should use subtraction() instead.\n if (startBounds === 'open' || endBounds === 'open') return 'open';\n if (startBounds === 'half-open-end') return 'half-open-end';\n if (endBounds === 'half-open-start') return 'half-open-start';\n return 'closed';\n}\n\n// Alias for difference() — \"subtract\" reads more naturally at some\n// call sites than \"difference\" does.\nexport const subtract = difference;\n\n// Merges a list of intervals, combining overlapping ones. Returns a\n// sorted list of disjoint intervals.\nexport function mergeIntervals(intervals: Interval[]): Interval[] {\n if (intervals.length === 0) return [];\n const sorted = [...intervals].sort((a, b) => compare(a.start, b.start));\n const result: Interval[] = [sorted[0]!];\n for (let i = 1; i < sorted.length; i++) {\n const current = sorted[i]!;\n const last = result[result.length - 1]!;\n if (intersects(last, current) || compare(last.end, current.start) === 0) {\n // Merge into last.\n if (compare(current.end, last.end) > 0) {\n last.end = current.end;\n }\n } else {\n result.push(current);\n }\n }\n return result;\n}\n\n// Splits an interval into N equal sub-intervals. Throws if N ≤ 0.\n// Equality is by ms-distance between start and end — for date ranges\n// this approximates \"equal time slices\", which is the most useful\n// interpretation. For calendar-bound splits (e.g. \"split this month\n// into weeks\"), callers should use recurrence() instead.\nexport function splitInterval(iv: Interval, n: number): Interval[] {\n if (n <= 0) throw new Error(`temporal-fmt: splitInterval requires n > 0 (got ${n}).`);\n if (n === 1) return [iv];\n const startFields = asDateFieldView(iv.start) as DateFieldView & { hour?: number; minute?: number; second?: number; millisecond?: number };\n const endFields = asDateFieldView(iv.end) as DateFieldView & { hour?: number; minute?: number; second?: number; millisecond?: number };\n const startMs = toMs(startFields);\n const endMs = toMs(endFields);\n const step = (endMs - startMs) / n;\n const result: Interval[] = [];\n for (let i = 0; i < n; i++) {\n const sliceStart = startMs + i * step;\n const sliceEnd = i === n - 1 ? endMs : sliceStart + step;\n result.push({\n start: fromMs(sliceStart, startFields),\n end: fromMs(sliceEnd, endFields),\n bounds: i === 0 ? iv.bounds : 'half-open-start',\n });\n }\n return result;\n}\n\nfunction toMs(v: DateFieldView & { hour?: number; minute?: number; second?: number; millisecond?: number }): number {\n // Reuse the same day-count math arithmetic.ts uses, inlined.\n const y = v.year!, m = v.month!, d = v.day!;\n const y2 = m <= 2 ? y - 1 : y;\n const era = Math.floor((y2 >= 0 ? y2 : y2 - 399) / 400);\n const yoe = y2 - era * 400;\n const m2 = m > 2 ? m - 3 : m + 9;\n const doy = Math.floor((153 * m2 + 2) / 5) + d - 1;\n const doe = yoe * 365 + Math.floor(yoe / 4) - Math.floor(yoe / 100) + doy;\n const days = era * 146097 + doe - 719468;\n return days * 86_400_000\n + (v.hour ?? 0) * 3_600_000\n + (v.minute ?? 0) * 60_000\n + (v.second ?? 0) * 1_000\n + (v.millisecond ?? 0);\n}\n\nfunction fromMs(ms: number, base: DateFieldView & { hour?: number; minute?: number; second?: number; millisecond?: number }): DateFieldView {\n const MS_PER_DAY = 86_400_000;\n const dayOverflow = Math.floor(ms / MS_PER_DAY);\n let withinDay = ms % MS_PER_DAY;\n if (withinDay < 0) withinDay += MS_PER_DAY;\n const hour = Math.floor(withinDay / 3_600_000);\n const minute = Math.floor((withinDay % 3_600_000) / 60_000);\n const second = Math.floor((withinDay % 60_000) / 1_000);\n const millisecond = withinDay % 1_000;\n // `ms` (and therefore `dayOverflow`) is already an absolute epoch-ms /\n // epoch-day value — toMs() computed it via Howard Hinnant's algorithm\n // from scratch, not as an offset from `base`. So the date only needs\n // reconstructing from the Unix epoch itself; `base` is just a template\n // for whatever extra (non-date) fields get spread into the result.\n // (Previously this added dayOverflow on top of base's own epoch-ms,\n // double-counting base's offset and landing tens of thousands of days\n // away from the intended date for any non-epoch base.)\n const newMs = dayOverflow * MS_PER_DAY;\n const d = new Date(newMs);\n return {\n ...base,\n year: d.getUTCFullYear(),\n month: d.getUTCMonth() + 1,\n day: d.getUTCDate(),\n hour,\n minute,\n second,\n millisecond,\n };\n}\n\n// Formats an interval as a single string, collapsing shared fields.\n// E.g. \"August 4 – August 6, 2026\" rather than \"August 4, 2026 – August 6, 2026\".\n// Uses Intl.DateTimeFormat's formatRange when available (most engines),\n// falling back to format(start, fmt) + '–' + format(end, fmt) when not.\n\nexport function formatRange(\n iv: Interval,\n formatStr: string,\n options: FormatOptions = {},\n): string {\n try {\n // Intl.DateTimeFormat.formatRange is the standard mechanism.\n // It handles the field-collapse logic natively (locale-dependent).\n const fmt = new Intl.DateTimeFormat(options.locale ?? 'en-US', {});\n // Cast the interval endpoints to Date for the Intl call. Both\n // endpoints must be Temporal values that can convert to a Date;\n // for non-ZonedDateTime values we synthesize a Date via the field\n // shape (year/month/day/hour/...).\n const startDate = toJSDate(iv.start);\n const endDate = toJSDate(iv.end);\n return fmt.formatRange(startDate, endDate);\n } catch {\n // Fallback: format each side separately and join with \"–\".\n const startStr = format(iv.start as Parameters<typeof format>[0], formatStr, options);\n const endStr = format(iv.end as Parameters<typeof format>[0], formatStr, options);\n return `${startStr} – ${endStr}`;\n }\n}\n\nexport function formatRangeToParts(\n iv: Interval,\n formatStr: string,\n options: FormatOptions = {},\n): FormattedPart[] {\n // Best-effort: returns formatToParts for the start, then a literal\n // \" – \" part, then formatToParts for the end. Doesn't currently\n // expose Intl.DateTimeFormat.formatRangeToParts's collapsed shape —\n // that would require mapping Intl's part types back to temporal-fmt's\n // token strings, which is locale-dependent and not stable across\n // engines.\n const startParts = formatToParts(iv.start as Parameters<typeof formatToParts>[0], formatStr, options);\n const endParts = formatToParts(iv.end as Parameters<typeof formatToParts>[0], formatStr, options);\n const result: FormattedPart[] = [...startParts];\n result.push({ type: 'literal', value: ' – ' });\n result.push(...endParts);\n return result;\n}\n\nfunction toJSDate(value: unknown): Date {\n const v = value as { year?: number; month?: number; day?: number; hour?: number; minute?: number; second?: number; millisecond?: number; toInstant?: () => { epochMilliseconds: number } };\n if (typeof v?.toInstant === 'function') {\n return new Date(v.toInstant().epochMilliseconds);\n }\n if (typeof v?.year === 'number' && typeof v?.month === 'number' && typeof v?.day === 'number') {\n return new Date(Date.UTC(v.year, v.month - 1, v.day, v.hour ?? 0, v.minute ?? 0, v.second ?? 0, v.millisecond ?? 0));\n }\n throw new Error(`temporal-fmt: formatRange() expected Temporal values with year/month/day, got ${typeof value}.`);\n}"],"mappings":"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","names":[]}
@@ -1,170 +0,0 @@
1
- import {
2
- getTemporal
3
- } from "./chunk-MXXYIMFJ.js";
4
- import {
5
- add
6
- } from "./chunk-VHSZL3P3.js";
7
-
8
- // src/timezone.ts
9
- function resolveZoned(fields, timeZone, options = {}) {
10
- const temporal = getTemporal();
11
- const disambiguation = options.disambiguation ?? "compatible";
12
- const overflow = options.overflow ?? "constrain";
13
- const fromOptions = {
14
- overflow,
15
- disambiguation,
16
- offset: options.offset ?? "prefer"
17
- };
18
- try {
19
- return temporal.ZonedDateTime.from(
20
- {
21
- year: fields.year,
22
- month: fields.month,
23
- day: fields.day,
24
- hour: fields.hour ?? 0,
25
- minute: fields.minute ?? 0,
26
- second: fields.second ?? 0,
27
- millisecond: fields.millisecond ?? 0,
28
- microsecond: fields.microsecond ?? 0,
29
- nanosecond: fields.nanosecond ?? 0,
30
- timeZone
31
- },
32
- fromOptions
33
- );
34
- } catch (err) {
35
- const msg = err.message;
36
- if (/no such (wall-clock )?time/i.test(msg) && disambiguation === "reject") {
37
- throw new Error(
38
- `temporal-fmt: "${timeZone}" has no such wall-clock time on ${fields.year}-${fields.month}-${fields.day}T${fields.hour ?? 0}:${fields.minute ?? 0} \u2014 it falls in a DST gap. Pass { disambiguation: 'compatible' | 'earlier' | 'later' } to pick an instant.`
39
- );
40
- }
41
- throw err;
42
- }
43
- }
44
- function getTimeZone(value) {
45
- const v = value;
46
- if (typeof v?.timeZoneId !== "string") {
47
- throw new Error(`temporal-fmt: getTimeZone() expected a ZonedDateTime, got ${typeof value}.`);
48
- }
49
- return v.timeZoneId;
50
- }
51
- function getOffset(value) {
52
- const v = value;
53
- if (typeof v?.offset !== "string") {
54
- throw new Error(`temporal-fmt: getOffset() expected a ZonedDateTime, got ${typeof value}.`);
55
- }
56
- return v.offset;
57
- }
58
- function getOffsetNanoseconds(value) {
59
- const v = value;
60
- if (typeof v?.offsetNanoseconds === "number") return v.offsetNanoseconds;
61
- if (typeof v?.offset === "string") {
62
- const m = v.offset.match(/^([+-])(\d{2}):(\d{2})$/);
63
- if (!m) throw new Error(`temporal-fmt: getOffsetNanoseconds() couldn't parse offset "${v.offset}".`);
64
- const sign = m[1] === "-" ? -1 : 1;
65
- return sign * (Number(m[2]) * 3600 + Number(m[3]) * 60) * 1e9;
66
- }
67
- throw new Error(`temporal-fmt: getOffsetNanoseconds() expected a ZonedDateTime, got ${typeof value}.`);
68
- }
69
- function isDST(value) {
70
- const v = value;
71
- if (typeof v?.timeZoneId !== "string" || typeof v?.offset !== "string" || typeof v?.year !== "number") {
72
- throw new Error(`temporal-fmt: isDST() expected a ZonedDateTime, got ${typeof value}.`);
73
- }
74
- const temporal = getTemporal();
75
- try {
76
- const jan = temporal.ZonedDateTime.from(
77
- { year: v.year, month: 1, day: 1, hour: 12, timeZone: v.timeZoneId },
78
- { disambiguation: "compatible" }
79
- );
80
- return jan.offset !== v.offset;
81
- } catch {
82
- return false;
83
- }
84
- }
85
- function getNextTransition(value) {
86
- return findTransition(value, 1);
87
- }
88
- function getPreviousTransition(value) {
89
- return findTransition(value, -1);
90
- }
91
- function findTransition(value, direction) {
92
- const v = value;
93
- if (typeof v?.timeZoneId !== "string") {
94
- throw new Error(`temporal-fmt: ${direction > 0 ? "getNextTransition" : "getPreviousTransition"}() expected a ZonedDateTime, got ${typeof value}.`);
95
- }
96
- const temporal = getTemporal();
97
- const timeZone = v.timeZoneId;
98
- let candidateFields = add(value, direction, "days");
99
- const startOffset = v.offset;
100
- for (let i = 0; i < 365 * 2; i++) {
101
- const cf = candidateFields;
102
- const candidateZdt = temporal.ZonedDateTime.from(
103
- { ...cf, timeZone },
104
- { disambiguation: "compatible" }
105
- );
106
- if (candidateZdt.offset !== startOffset) {
107
- return candidateZdt;
108
- }
109
- candidateFields = add(candidateFields, direction, "days");
110
- }
111
- return void 0;
112
- }
113
- function getTransitions(start, end) {
114
- const result = [];
115
- const startV = start;
116
- if (typeof startV?.timeZoneId !== "string") {
117
- throw new Error(`temporal-fmt: getTransitions() expected a ZonedDateTime for start, got ${typeof start}.`);
118
- }
119
- const endV = end;
120
- const temporal = getTemporal();
121
- const timeZone = startV.timeZoneId;
122
- let cursorFields = add(start, 1, "days");
123
- let lastOffset = startV.offset;
124
- for (let i = 0; i < 365 * 5; i++) {
125
- const cf = cursorFields;
126
- const cursorZdt = temporal.ZonedDateTime.from(
127
- { ...cf, timeZone },
128
- { disambiguation: "compatible" }
129
- );
130
- if (cursorZdt.offset !== lastOffset) {
131
- if (cursorZdt.year > endV.year || cursorZdt.year === endV.year && (cursorZdt.month > endV.month || cursorZdt.month === endV.month && cursorZdt.day > endV.day)) break;
132
- result.push(cursorZdt);
133
- lastOffset = cursorZdt.offset;
134
- }
135
- cursorFields = add(cursorFields, 1, "days");
136
- }
137
- return result;
138
- }
139
- function possibleInstantsFor(fields, timeZone) {
140
- const temporal = getTemporal();
141
- const earlier = temporal.ZonedDateTime.from(
142
- { ...fields, timeZone },
143
- { disambiguation: "earlier", offset: "ignore" }
144
- );
145
- const later = temporal.ZonedDateTime.from(
146
- { ...fields, timeZone },
147
- { disambiguation: "later", offset: "ignore" }
148
- );
149
- const matchesRequestedWallClock = (z) => z.year === fields.year && z.month === fields.month && z.day === fields.day && z.hour === fields.hour && z.minute === fields.minute && z.second === fields.second && z.millisecond === fields.millisecond;
150
- if (!matchesRequestedWallClock(earlier) || !matchesRequestedWallClock(later)) {
151
- return [];
152
- }
153
- if (earlier.toInstant().epochNanoseconds === later.toInstant().epochNanoseconds) {
154
- return [earlier];
155
- }
156
- return [earlier, later];
157
- }
158
-
159
- export {
160
- resolveZoned,
161
- getTimeZone,
162
- getOffset,
163
- getOffsetNanoseconds,
164
- isDST,
165
- getNextTransition,
166
- getPreviousTransition,
167
- getTransitions,
168
- possibleInstantsFor
169
- };
170
- //# sourceMappingURL=chunk-GRJQHQLW.js.map