@bash-app/bash-common 30.354.0 → 30.355.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/__tests__/eventTimezoneIana.test.d.ts +2 -0
- package/dist/__tests__/eventTimezoneIana.test.d.ts.map +1 -0
- package/dist/__tests__/eventTimezoneIana.test.js +282 -0
- package/dist/__tests__/eventTimezoneIana.test.js.map +1 -0
- package/dist/utils/eventTimezoneIana.d.ts.map +1 -1
- package/dist/utils/eventTimezoneIana.js +15 -2
- package/dist/utils/eventTimezoneIana.js.map +1 -1
- package/dist/utils/luxonUtils.d.ts +7 -7
- package/dist/utils/luxonUtils.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/__tests__/eventTimezoneIana.test.ts +387 -0
- package/src/utils/eventTimezoneIana.ts +14 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eventTimezoneIana.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/eventTimezoneIana.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
import { getIanaTimezoneFromCoordinates, getIanaTimezoneFromUsStateCode, inferEventTimezoneIana, isValidIanaTimezone, resolveEventTimezoneIanaForDisplay, } from "../utils/eventTimezoneIana";
|
|
2
|
+
describe("eventTimezoneIana", () => {
|
|
3
|
+
describe("isValidIanaTimezone", () => {
|
|
4
|
+
describe("valid IANA timezones", () => {
|
|
5
|
+
it("accepts US mainland timezones", () => {
|
|
6
|
+
expect(isValidIanaTimezone("America/New_York")).toBe(true);
|
|
7
|
+
expect(isValidIanaTimezone("America/Chicago")).toBe(true);
|
|
8
|
+
expect(isValidIanaTimezone("America/Denver")).toBe(true);
|
|
9
|
+
expect(isValidIanaTimezone("America/Los_Angeles")).toBe(true);
|
|
10
|
+
});
|
|
11
|
+
it("accepts US special zones", () => {
|
|
12
|
+
expect(isValidIanaTimezone("America/Phoenix")).toBe(true); // Arizona (no DST)
|
|
13
|
+
expect(isValidIanaTimezone("America/Anchorage")).toBe(true); // Alaska
|
|
14
|
+
expect(isValidIanaTimezone("Pacific/Honolulu")).toBe(true); // Hawaii
|
|
15
|
+
expect(isValidIanaTimezone("America/Indiana/Indianapolis")).toBe(true);
|
|
16
|
+
});
|
|
17
|
+
it("accepts European timezones", () => {
|
|
18
|
+
expect(isValidIanaTimezone("Europe/London")).toBe(true);
|
|
19
|
+
expect(isValidIanaTimezone("Europe/Paris")).toBe(true);
|
|
20
|
+
expect(isValidIanaTimezone("Europe/Berlin")).toBe(true);
|
|
21
|
+
expect(isValidIanaTimezone("Europe/Rome")).toBe(true);
|
|
22
|
+
expect(isValidIanaTimezone("Europe/Madrid")).toBe(true);
|
|
23
|
+
});
|
|
24
|
+
it("accepts Asian timezones", () => {
|
|
25
|
+
expect(isValidIanaTimezone("Asia/Tokyo")).toBe(true);
|
|
26
|
+
expect(isValidIanaTimezone("Asia/Shanghai")).toBe(true);
|
|
27
|
+
expect(isValidIanaTimezone("Asia/Singapore")).toBe(true);
|
|
28
|
+
expect(isValidIanaTimezone("Asia/Dubai")).toBe(true);
|
|
29
|
+
expect(isValidIanaTimezone("Asia/Kolkata")).toBe(true);
|
|
30
|
+
});
|
|
31
|
+
it("accepts other major timezones", () => {
|
|
32
|
+
expect(isValidIanaTimezone("Australia/Sydney")).toBe(true);
|
|
33
|
+
expect(isValidIanaTimezone("America/Sao_Paulo")).toBe(true);
|
|
34
|
+
expect(isValidIanaTimezone("Africa/Johannesburg")).toBe(true);
|
|
35
|
+
expect(isValidIanaTimezone("UTC")).toBe(true);
|
|
36
|
+
});
|
|
37
|
+
it("accepts case variations (Intl is case-insensitive)", () => {
|
|
38
|
+
expect(isValidIanaTimezone("America/New_York")).toBe(true);
|
|
39
|
+
// Intl.DateTimeFormat is case-insensitive (unlike Luxon)
|
|
40
|
+
expect(isValidIanaTimezone("america/new_york")).toBe(true);
|
|
41
|
+
expect(isValidIanaTimezone("AMERICA/NEW_YORK")).toBe(true);
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
describe("invalid timezones", () => {
|
|
45
|
+
it("rejects timezone abbreviations (ambiguous, not IANA standard)", () => {
|
|
46
|
+
// These are explicitly rejected because they're ambiguous:
|
|
47
|
+
// EST could be US Eastern or Australian Eastern, etc.
|
|
48
|
+
expect(isValidIanaTimezone("EST")).toBe(false);
|
|
49
|
+
expect(isValidIanaTimezone("PST")).toBe(false);
|
|
50
|
+
expect(isValidIanaTimezone("CST")).toBe(false);
|
|
51
|
+
expect(isValidIanaTimezone("MST")).toBe(false);
|
|
52
|
+
expect(isValidIanaTimezone("EDT")).toBe(false);
|
|
53
|
+
expect(isValidIanaTimezone("PDT")).toBe(false);
|
|
54
|
+
expect(isValidIanaTimezone("AEST")).toBe(false);
|
|
55
|
+
expect(isValidIanaTimezone("JST")).toBe(false);
|
|
56
|
+
});
|
|
57
|
+
it("rejects made-up timezone names", () => {
|
|
58
|
+
expect(isValidIanaTimezone("Invalid/Zone")).toBe(false);
|
|
59
|
+
expect(isValidIanaTimezone("America/FakeCity")).toBe(false);
|
|
60
|
+
expect(isValidIanaTimezone("Not_A_Timezone")).toBe(false);
|
|
61
|
+
expect(isValidIanaTimezone("Random/Gibberish")).toBe(false);
|
|
62
|
+
});
|
|
63
|
+
it("rejects empty or whitespace strings", () => {
|
|
64
|
+
expect(isValidIanaTimezone("")).toBe(false);
|
|
65
|
+
expect(isValidIanaTimezone(" ")).toBe(false);
|
|
66
|
+
expect(isValidIanaTimezone("\t")).toBe(false);
|
|
67
|
+
expect(isValidIanaTimezone("\n")).toBe(false);
|
|
68
|
+
});
|
|
69
|
+
it("rejects null and undefined", () => {
|
|
70
|
+
expect(isValidIanaTimezone(null)).toBe(false);
|
|
71
|
+
expect(isValidIanaTimezone(undefined)).toBe(false);
|
|
72
|
+
});
|
|
73
|
+
it("rejects numeric GMT offsets", () => {
|
|
74
|
+
expect(isValidIanaTimezone("GMT+5")).toBe(false);
|
|
75
|
+
expect(isValidIanaTimezone("UTC-8")).toBe(false);
|
|
76
|
+
expect(isValidIanaTimezone("+05:00")).toBe(false);
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
describe("whitespace handling", () => {
|
|
80
|
+
it("trims leading/trailing whitespace", () => {
|
|
81
|
+
expect(isValidIanaTimezone(" America/New_York ")).toBe(true);
|
|
82
|
+
expect(isValidIanaTimezone("\tEurope/London\n")).toBe(true);
|
|
83
|
+
});
|
|
84
|
+
it("rejects zones with internal spaces", () => {
|
|
85
|
+
expect(isValidIanaTimezone("America/ New_York")).toBe(false);
|
|
86
|
+
expect(isValidIanaTimezone("America /New_York")).toBe(false);
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
describe("getIanaTimezoneFromUsStateCode", () => {
|
|
91
|
+
it("maps standard US state codes", () => {
|
|
92
|
+
expect(getIanaTimezoneFromUsStateCode("CA", "US")).toBe("America/Los_Angeles");
|
|
93
|
+
expect(getIanaTimezoneFromUsStateCode("NY", "US")).toBe("America/New_York");
|
|
94
|
+
expect(getIanaTimezoneFromUsStateCode("TX", "US")).toBe("America/Chicago");
|
|
95
|
+
expect(getIanaTimezoneFromUsStateCode("UT", "US")).toBe("America/Denver");
|
|
96
|
+
});
|
|
97
|
+
it("maps special zones", () => {
|
|
98
|
+
expect(getIanaTimezoneFromUsStateCode("AZ", "US")).toBe("America/Phoenix");
|
|
99
|
+
expect(getIanaTimezoneFromUsStateCode("AK", "US")).toBe("America/Anchorage");
|
|
100
|
+
expect(getIanaTimezoneFromUsStateCode("HI", "US")).toBe("Pacific/Honolulu");
|
|
101
|
+
expect(getIanaTimezoneFromUsStateCode("IN", "US")).toBe("America/Indiana/Indianapolis");
|
|
102
|
+
});
|
|
103
|
+
it("handles DC", () => {
|
|
104
|
+
expect(getIanaTimezoneFromUsStateCode("DC", "US")).toBe("America/New_York");
|
|
105
|
+
});
|
|
106
|
+
it("is case-insensitive for state codes", () => {
|
|
107
|
+
expect(getIanaTimezoneFromUsStateCode("ca", "US")).toBe("America/Los_Angeles");
|
|
108
|
+
expect(getIanaTimezoneFromUsStateCode("ny", "US")).toBe("America/New_York");
|
|
109
|
+
});
|
|
110
|
+
it("assumes US when country is null/undefined", () => {
|
|
111
|
+
expect(getIanaTimezoneFromUsStateCode("CA", null)).toBe("America/Los_Angeles");
|
|
112
|
+
expect(getIanaTimezoneFromUsStateCode("NY", undefined)).toBe("America/New_York");
|
|
113
|
+
});
|
|
114
|
+
it("accepts USA/United States variations", () => {
|
|
115
|
+
expect(getIanaTimezoneFromUsStateCode("CA", "USA")).toBe("America/Los_Angeles");
|
|
116
|
+
expect(getIanaTimezoneFromUsStateCode("NY", "United States")).toBe("America/New_York");
|
|
117
|
+
expect(getIanaTimezoneFromUsStateCode("TX", "United States of America")).toBe("America/Chicago");
|
|
118
|
+
});
|
|
119
|
+
it("returns null for non-US countries", () => {
|
|
120
|
+
expect(getIanaTimezoneFromUsStateCode("CA", "Canada")).toBeNull();
|
|
121
|
+
expect(getIanaTimezoneFromUsStateCode("NY", "Mexico")).toBeNull();
|
|
122
|
+
});
|
|
123
|
+
it("returns null for invalid state codes", () => {
|
|
124
|
+
expect(getIanaTimezoneFromUsStateCode("XX", "US")).toBeNull();
|
|
125
|
+
expect(getIanaTimezoneFromUsStateCode("ZZZ", "US")).toBeNull();
|
|
126
|
+
expect(getIanaTimezoneFromUsStateCode("California", "US")).toBeNull(); // Full name, not code
|
|
127
|
+
});
|
|
128
|
+
it("returns null for null/undefined/empty state", () => {
|
|
129
|
+
expect(getIanaTimezoneFromUsStateCode(null, "US")).toBeNull();
|
|
130
|
+
expect(getIanaTimezoneFromUsStateCode(undefined, "US")).toBeNull();
|
|
131
|
+
expect(getIanaTimezoneFromUsStateCode("", "US")).toBeNull();
|
|
132
|
+
expect(getIanaTimezoneFromUsStateCode(" ", "US")).toBeNull();
|
|
133
|
+
});
|
|
134
|
+
});
|
|
135
|
+
describe("getIanaTimezoneFromCoordinates", () => {
|
|
136
|
+
describe("US regions", () => {
|
|
137
|
+
it("resolves Eastern Time", () => {
|
|
138
|
+
// New York City
|
|
139
|
+
expect(getIanaTimezoneFromCoordinates(40.7128, -74.006)).toBe("America/New_York");
|
|
140
|
+
// Miami
|
|
141
|
+
expect(getIanaTimezoneFromCoordinates(25.7617, -80.1918)).toBe("America/New_York");
|
|
142
|
+
});
|
|
143
|
+
it("resolves Central Time", () => {
|
|
144
|
+
// Chicago
|
|
145
|
+
expect(getIanaTimezoneFromCoordinates(41.8781, -87.6298)).toBe("America/Chicago");
|
|
146
|
+
// Houston
|
|
147
|
+
expect(getIanaTimezoneFromCoordinates(29.7604, -95.3698)).toBe("America/Chicago");
|
|
148
|
+
});
|
|
149
|
+
it("resolves Mountain Time", () => {
|
|
150
|
+
// Denver
|
|
151
|
+
expect(getIanaTimezoneFromCoordinates(39.7392, -104.9903)).toBe("America/Denver");
|
|
152
|
+
// Salt Lake City
|
|
153
|
+
expect(getIanaTimezoneFromCoordinates(40.7608, -111.891)).toBe("America/Denver");
|
|
154
|
+
});
|
|
155
|
+
it("resolves Pacific Time", () => {
|
|
156
|
+
// Los Angeles
|
|
157
|
+
expect(getIanaTimezoneFromCoordinates(34.0522, -118.2437)).toBe("America/Los_Angeles");
|
|
158
|
+
// Seattle
|
|
159
|
+
expect(getIanaTimezoneFromCoordinates(47.6062, -122.3321)).toBe("America/Los_Angeles");
|
|
160
|
+
});
|
|
161
|
+
it("resolves special zones", () => {
|
|
162
|
+
// Phoenix (Arizona - no DST)
|
|
163
|
+
expect(getIanaTimezoneFromCoordinates(33.4484, -112.074)).toBe("America/Phoenix");
|
|
164
|
+
// Anchorage (Alaska)
|
|
165
|
+
expect(getIanaTimezoneFromCoordinates(61.2181, -149.9003)).toBe("America/Anchorage");
|
|
166
|
+
// Honolulu (Hawaii)
|
|
167
|
+
expect(getIanaTimezoneFromCoordinates(21.3099, -157.8581)).toBe("Pacific/Honolulu");
|
|
168
|
+
});
|
|
169
|
+
});
|
|
170
|
+
describe("international regions", () => {
|
|
171
|
+
it("resolves European zones", () => {
|
|
172
|
+
// London
|
|
173
|
+
expect(getIanaTimezoneFromCoordinates(51.5074, -0.1278)).toBe("Europe/London");
|
|
174
|
+
// Paris
|
|
175
|
+
expect(getIanaTimezoneFromCoordinates(48.8566, 2.3522)).toBe("Europe/Paris");
|
|
176
|
+
});
|
|
177
|
+
it("resolves Asian zones", () => {
|
|
178
|
+
// Tokyo
|
|
179
|
+
expect(getIanaTimezoneFromCoordinates(35.6762, 139.6503)).toBe("Asia/Tokyo");
|
|
180
|
+
});
|
|
181
|
+
});
|
|
182
|
+
it("returns null for missing coordinates", () => {
|
|
183
|
+
expect(getIanaTimezoneFromCoordinates(null, -74.006)).toBeNull();
|
|
184
|
+
expect(getIanaTimezoneFromCoordinates(40.7128, null)).toBeNull();
|
|
185
|
+
expect(getIanaTimezoneFromCoordinates(null, null)).toBeNull();
|
|
186
|
+
expect(getIanaTimezoneFromCoordinates(undefined, undefined)).toBeNull();
|
|
187
|
+
});
|
|
188
|
+
it("returns null for coordinates with no regional match", () => {
|
|
189
|
+
// Middle of the South Atlantic Ocean - truly remote
|
|
190
|
+
expect(getIanaTimezoneFromCoordinates(-30, -30)).toBeNull();
|
|
191
|
+
// Far southern ocean between Africa and Antarctica
|
|
192
|
+
expect(getIanaTimezoneFromCoordinates(-60, 40)).toBeNull();
|
|
193
|
+
});
|
|
194
|
+
});
|
|
195
|
+
describe("inferEventTimezoneIana", () => {
|
|
196
|
+
it("prefers coordinates over state code", () => {
|
|
197
|
+
// LA coords but NY state - coords should win
|
|
198
|
+
const result = inferEventTimezoneIana({
|
|
199
|
+
latitude: 34.0522,
|
|
200
|
+
longitude: -118.2437,
|
|
201
|
+
state: "NY",
|
|
202
|
+
country: "US",
|
|
203
|
+
});
|
|
204
|
+
expect(result).toBe("America/Los_Angeles");
|
|
205
|
+
});
|
|
206
|
+
it("falls back to state code when coordinates missing", () => {
|
|
207
|
+
const result = inferEventTimezoneIana({
|
|
208
|
+
state: "TX",
|
|
209
|
+
country: "US",
|
|
210
|
+
});
|
|
211
|
+
expect(result).toBe("America/Chicago");
|
|
212
|
+
});
|
|
213
|
+
it("falls back to location string hints", () => {
|
|
214
|
+
const result = inferEventTimezoneIana({
|
|
215
|
+
location: "Denver, CO",
|
|
216
|
+
});
|
|
217
|
+
expect(result).toBe("America/Denver");
|
|
218
|
+
});
|
|
219
|
+
it("returns UTC when nothing matches", () => {
|
|
220
|
+
const result = inferEventTimezoneIana({
|
|
221
|
+
city: "Unknown",
|
|
222
|
+
state: "XX",
|
|
223
|
+
country: "Unknown",
|
|
224
|
+
});
|
|
225
|
+
expect(result).toBe("UTC");
|
|
226
|
+
});
|
|
227
|
+
it("handles empty args", () => {
|
|
228
|
+
const result = inferEventTimezoneIana({});
|
|
229
|
+
expect(result).toBe("UTC");
|
|
230
|
+
});
|
|
231
|
+
});
|
|
232
|
+
describe("resolveEventTimezoneIanaForDisplay", () => {
|
|
233
|
+
it("prefers inferred timezone over stored", () => {
|
|
234
|
+
// NYC coords with wrong stored timezone
|
|
235
|
+
const result = resolveEventTimezoneIanaForDisplay({
|
|
236
|
+
latitude: 40.7128,
|
|
237
|
+
longitude: -74.006,
|
|
238
|
+
timezone: "America/Los_Angeles", // wrong
|
|
239
|
+
});
|
|
240
|
+
expect(result).toBe("America/New_York");
|
|
241
|
+
});
|
|
242
|
+
it("uses stored timezone when inference returns UTC", () => {
|
|
243
|
+
const result = resolveEventTimezoneIanaForDisplay({
|
|
244
|
+
timezone: "Europe/London",
|
|
245
|
+
city: "Unknown",
|
|
246
|
+
state: "XX",
|
|
247
|
+
});
|
|
248
|
+
expect(result).toBe("Europe/London");
|
|
249
|
+
});
|
|
250
|
+
it("validates stored timezone before using it", () => {
|
|
251
|
+
const result = resolveEventTimezoneIanaForDisplay({
|
|
252
|
+
timezone: "Invalid/Zone",
|
|
253
|
+
});
|
|
254
|
+
expect(result).toBe("UTC");
|
|
255
|
+
});
|
|
256
|
+
it("rejects timezone abbreviations in stored field", () => {
|
|
257
|
+
const result = resolveEventTimezoneIanaForDisplay({
|
|
258
|
+
timezone: "EST",
|
|
259
|
+
});
|
|
260
|
+
expect(result).toBe("UTC");
|
|
261
|
+
});
|
|
262
|
+
it("returns UTC when everything fails", () => {
|
|
263
|
+
const result = resolveEventTimezoneIanaForDisplay({
|
|
264
|
+
timezone: null,
|
|
265
|
+
city: "Unknown",
|
|
266
|
+
});
|
|
267
|
+
expect(result).toBe("UTC");
|
|
268
|
+
});
|
|
269
|
+
it("handles BashCard typical inputs", () => {
|
|
270
|
+
// Typical event with coords and timezone
|
|
271
|
+
const result = resolveEventTimezoneIanaForDisplay({
|
|
272
|
+
latitude: 40.7608,
|
|
273
|
+
longitude: -111.891,
|
|
274
|
+
timezone: "America/Denver",
|
|
275
|
+
city: "Salt Lake City",
|
|
276
|
+
state: "UT",
|
|
277
|
+
});
|
|
278
|
+
expect(result).toBe("America/Denver");
|
|
279
|
+
});
|
|
280
|
+
});
|
|
281
|
+
});
|
|
282
|
+
//# sourceMappingURL=eventTimezoneIana.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eventTimezoneIana.test.js","sourceRoot":"","sources":["../../src/__tests__/eventTimezoneIana.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eventTimezoneIana.d.ts","sourceRoot":"","sources":["../../src/utils/eventTimezoneIana.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"eventTimezoneIana.d.ts","sourceRoot":"","sources":["../../src/utils/eventTimezoneIana.ts"],"names":[],"mappings":"AAkEA;;;GAGG;AACH,wBAAgB,8BAA8B,CAC5C,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAChC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GACjC,MAAM,GAAG,IAAI,CAMf;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAiBhF;AAED;;;GAGG;AACH,wBAAgB,8BAA8B,CAC5C,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACnC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GACnC,MAAM,GAAG,IAAI,CAsGf;AAED;;;GAGG;AACH,wBAAgB,sCAAsC,CACpD,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAClC,MAAM,GAAG,IAAI,CAuEf;AAED,MAAM,MAAM,sBAAsB,GAAG;IACnC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB,CAAC;AAEF;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,sBAAsB,GAAG,MAAM,CAoB3E;AAED,MAAM,MAAM,kCAAkC,GAAG,sBAAsB,GAAG;IACxE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,kCAAkC,CAChD,IAAI,EAAE,kCAAkC,GACvC,MAAM,CAQR"}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { DateTime } from "luxon";
|
|
2
1
|
/** Primary IANA zone for each US state + DC (contiguous conventions; AZ/HI/AK use canonical zones). */
|
|
3
2
|
const US_STATE_CODE_TO_IANA = {
|
|
4
3
|
AL: "America/Chicago",
|
|
@@ -80,7 +79,20 @@ export function isValidIanaTimezone(timezone) {
|
|
|
80
79
|
const t = timezone?.trim();
|
|
81
80
|
if (!t)
|
|
82
81
|
return false;
|
|
83
|
-
|
|
82
|
+
// Reject ambiguous abbreviations (EST, PST, CST, etc.) - not IANA standard.
|
|
83
|
+
// These are ambiguous: EST could be US Eastern or Australian Eastern, etc.
|
|
84
|
+
// IANA zones follow "Region/City" format or special cases like "UTC".
|
|
85
|
+
const looksLikeAbbreviation = /^[A-Z]{2,5}T?$/.test(t);
|
|
86
|
+
if (looksLikeAbbreviation && t !== "UTC")
|
|
87
|
+
return false;
|
|
88
|
+
// Intl throws RangeError for unknown IANA ids — no luxon needed.
|
|
89
|
+
try {
|
|
90
|
+
Intl.DateTimeFormat(undefined, { timeZone: t });
|
|
91
|
+
return true;
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
84
96
|
}
|
|
85
97
|
/**
|
|
86
98
|
* Longitude/latitude → IANA for common regions. Returns null when coords are missing
|
|
@@ -279,3 +291,4 @@ export function resolveEventTimezoneIanaForDisplay(args) {
|
|
|
279
291
|
return stored;
|
|
280
292
|
return "UTC";
|
|
281
293
|
}
|
|
294
|
+
//# sourceMappingURL=eventTimezoneIana.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eventTimezoneIana.js","sourceRoot":"","sources":["../../src/utils/eventTimezoneIana.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"eventTimezoneIana.js","sourceRoot":"","sources":["../../src/utils/eventTimezoneIana.ts"],"names":[],"mappings":"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"}
|
|
@@ -21,19 +21,19 @@ export interface LuxonDateRangeN {
|
|
|
21
21
|
export declare function dayOfWeekGetIdx(dayOfWeek: DayOfWeek | DayOfWeekIdx): DayOfWeekIdx;
|
|
22
22
|
export declare function dayOfWeekFromIdx(dayOfWeek: DayOfWeek | DayOfWeekIdx): import(".prisma/client").$Enums.DayOfWeek;
|
|
23
23
|
export declare function dateTimeFromDayTime(dayOfWeek: DayOfWeek | DayOfWeekIdx, hour?: number, minute?: number, interpretAsTimezone?: string, timezoneToConvertTo?: string): DateTime;
|
|
24
|
-
export declare function dateTimeFromDate(date: string | Date, interpretAsTimezone?: string, timezoneToConvertTo?: string): DateTime<
|
|
24
|
+
export declare function dateTimeFromDate(date: string | Date, interpretAsTimezone?: string, timezoneToConvertTo?: string): DateTime<boolean>;
|
|
25
25
|
export type DateTimeTime = Pick<DateTime, "hour" | "minute">;
|
|
26
26
|
export type DateTimeDate = Pick<DateTime, "year" | "month" | "day">;
|
|
27
27
|
export declare function dateTimeToTimeComponents(dateTime: DateTime): DateTimeTime;
|
|
28
28
|
export declare function dateTimeToDateComponents(dateTime: DateTime): DateTimeDate;
|
|
29
29
|
export declare function dateTimeFromTime(time: string | Date, interpretAsTimezone?: string, timezoneToConvertTo?: string): DateTime | null;
|
|
30
30
|
export declare function dateTimeFromComponents(date: DateTime | Date | string | null | undefined, time: DateTime | Date | string | null | undefined, interpretAsTimezone?: string, timezoneToConvertTo?: string): DateTime | null;
|
|
31
|
-
export declare function dateTimeGetDateTimeTime(dateTime: DateTime): DateTime<
|
|
31
|
+
export declare function dateTimeGetDateTimeTime(dateTime: DateTime): DateTime<boolean>;
|
|
32
32
|
export declare function dateTimeSetTime(dateTime: DateTime, time?: DateTimeTime | DateTime): DateTime;
|
|
33
33
|
export declare function dateTimeSetDate(dateTime: DateTime, date?: DateTimeDate | DateTime): DateTime;
|
|
34
34
|
export declare function dateRangeGetDateTimeTIme(dateRange: LuxonDateRange): {
|
|
35
|
-
start: DateTime<
|
|
36
|
-
end: DateTime<
|
|
35
|
+
start: DateTime<boolean>;
|
|
36
|
+
end: DateTime<boolean>;
|
|
37
37
|
};
|
|
38
38
|
export declare function dateTimeFormat(dateTime?: DateTime | undefined | null): string;
|
|
39
39
|
export declare function dateTimeFormatExt(dateTime?: DateTime | undefined | null): string;
|
|
@@ -61,8 +61,8 @@ export type LuxonDayOfWeekHours = {
|
|
|
61
61
|
export declare function formatDayOfWeekHours(hours: LuxonDayOfWeekHours): string[];
|
|
62
62
|
export declare function mergeCrossDayHours(hours: LuxonDateRange[]): LuxonDateRange[];
|
|
63
63
|
export declare function dateTimeHoursByDay(hours: LuxonDateRange[]): LuxonDayOfWeekHours;
|
|
64
|
-
export declare function normalizeLuxonInterval(interval: Interval): Interval<
|
|
65
|
-
export declare function dateRangeIntervalFromWeekdayTime(dateRange: LuxonDateRange): Interval<
|
|
64
|
+
export declare function normalizeLuxonInterval(interval: Interval): Interval<boolean>;
|
|
65
|
+
export declare function dateRangeIntervalFromWeekdayTime(dateRange: LuxonDateRange): Interval<boolean>;
|
|
66
66
|
export declare function dateTimeGetOverlappingHoursCommonHelper(weekHours: LuxonDayOfWeekHours, inputInterval: Interval): LuxonDateRange | null;
|
|
67
67
|
export declare function dateTimeGetOverlappingHoursCommon(weekHours: LuxonDayOfWeekHours, inputHours: LuxonDateRange): LuxonDateRange | null;
|
|
68
68
|
export declare function dateTimeGetOverlappingHoursContinuousHelper(weekHours: LuxonDayOfWeekHours, inputInterval: Interval): LuxonDateRange[] | null;
|
|
@@ -100,7 +100,7 @@ export declare function dateTimeRangeCrossesMidnight(range: LuxonDateRange): boo
|
|
|
100
100
|
*/
|
|
101
101
|
export declare function splitRangeByInputTimes(range: LuxonDateRange): LuxonDateRange[];
|
|
102
102
|
export declare function dateTimeRangeFromDates(startDate: Date | string, endDate: Date | string, interpretAsTimezone?: string, timezoneToConvertTo?: string): LuxonDateRange;
|
|
103
|
-
export declare function dateTimeFromString(str: string): DateTime<
|
|
103
|
+
export declare function dateTimeFromString(str: string): DateTime<boolean>;
|
|
104
104
|
export declare function dateTimeToString(dateTime: DateTime): string | null;
|
|
105
105
|
export declare function dateRangesFormat(dateRanges: LuxonDateRange[]): string;
|
|
106
106
|
//# sourceMappingURL=luxonUtils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"luxonUtils.d.ts","sourceRoot":"","sources":["../../src/utils/luxonUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC3C,OAAO,EACL,YAAY,EAIb,MAAM,2BAA2B,CAAC;AAInC,eAAO,MAAM,8BAA8B,QAAQ,CAAC;AACpD,eAAO,MAAM,yBAAyB,QAAQ,CAAC;AAC/C,eAAO,MAAM,8BAA8B,QAAQ,CAAC;AACpD,eAAO,MAAM,uCAAuC,aAAa,CAAC;AAGlE,eAAO,MAAM,0BAA0B,MAAM,CAAC;AAC9C,eAAO,MAAM,uBAAuB,WAAW,CAAC;AAEhD,eAAO,MAAM,eAAe,OAAO,CAAC;AAEpC,eAAO,MAAM,oBAAoB,iBAAiB,CAAC;AACnD,eAAO,MAAM,0BAA0B,uBAAuB,CAAC;AAE/D,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,QAAQ,CAAC;IAChB,GAAG,EAAE,QAAQ,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,IAAI,CAAC;IACpC,GAAG,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,IAAI,CAAC;CACnC;AAED,wBAAgB,eAAe,CAAC,SAAS,EAAE,SAAS,GAAG,YAAY,gBAQlE;AAED,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,SAAS,GAAG,YAAY,6CAQnE;AAED,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,SAAS,GAAG,YAAY,EACnC,IAAI,GAAE,MAAU,EAChB,MAAM,GAAE,MAAU,EAClB,mBAAmB,CAAC,EAAE,MAAM,EAC5B,mBAAmB,CAAC,EAAE,MAAM,GAC3B,QAAQ,CAqBV;AAED,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,GAAG,IAAI,EACnB,mBAAmB,CAAC,EAAE,MAAM,EAC5B,mBAAmB,CAAC,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"luxonUtils.d.ts","sourceRoot":"","sources":["../../src/utils/luxonUtils.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -0,0 +1,387 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getIanaTimezoneFromCoordinates,
|
|
3
|
+
getIanaTimezoneFromUsStateCode,
|
|
4
|
+
inferEventTimezoneIana,
|
|
5
|
+
isValidIanaTimezone,
|
|
6
|
+
resolveEventTimezoneIanaForDisplay,
|
|
7
|
+
} from "../utils/eventTimezoneIana";
|
|
8
|
+
|
|
9
|
+
describe("eventTimezoneIana", () => {
|
|
10
|
+
describe("isValidIanaTimezone", () => {
|
|
11
|
+
describe("valid IANA timezones", () => {
|
|
12
|
+
it("accepts US mainland timezones", () => {
|
|
13
|
+
expect(isValidIanaTimezone("America/New_York")).toBe(true);
|
|
14
|
+
expect(isValidIanaTimezone("America/Chicago")).toBe(true);
|
|
15
|
+
expect(isValidIanaTimezone("America/Denver")).toBe(true);
|
|
16
|
+
expect(isValidIanaTimezone("America/Los_Angeles")).toBe(true);
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
it("accepts US special zones", () => {
|
|
20
|
+
expect(isValidIanaTimezone("America/Phoenix")).toBe(true); // Arizona (no DST)
|
|
21
|
+
expect(isValidIanaTimezone("America/Anchorage")).toBe(true); // Alaska
|
|
22
|
+
expect(isValidIanaTimezone("Pacific/Honolulu")).toBe(true); // Hawaii
|
|
23
|
+
expect(isValidIanaTimezone("America/Indiana/Indianapolis")).toBe(true);
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
it("accepts European timezones", () => {
|
|
27
|
+
expect(isValidIanaTimezone("Europe/London")).toBe(true);
|
|
28
|
+
expect(isValidIanaTimezone("Europe/Paris")).toBe(true);
|
|
29
|
+
expect(isValidIanaTimezone("Europe/Berlin")).toBe(true);
|
|
30
|
+
expect(isValidIanaTimezone("Europe/Rome")).toBe(true);
|
|
31
|
+
expect(isValidIanaTimezone("Europe/Madrid")).toBe(true);
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
it("accepts Asian timezones", () => {
|
|
35
|
+
expect(isValidIanaTimezone("Asia/Tokyo")).toBe(true);
|
|
36
|
+
expect(isValidIanaTimezone("Asia/Shanghai")).toBe(true);
|
|
37
|
+
expect(isValidIanaTimezone("Asia/Singapore")).toBe(true);
|
|
38
|
+
expect(isValidIanaTimezone("Asia/Dubai")).toBe(true);
|
|
39
|
+
expect(isValidIanaTimezone("Asia/Kolkata")).toBe(true);
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
it("accepts other major timezones", () => {
|
|
43
|
+
expect(isValidIanaTimezone("Australia/Sydney")).toBe(true);
|
|
44
|
+
expect(isValidIanaTimezone("America/Sao_Paulo")).toBe(true);
|
|
45
|
+
expect(isValidIanaTimezone("Africa/Johannesburg")).toBe(true);
|
|
46
|
+
expect(isValidIanaTimezone("UTC")).toBe(true);
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
it("accepts case variations (Intl is case-insensitive)", () => {
|
|
50
|
+
expect(isValidIanaTimezone("America/New_York")).toBe(true);
|
|
51
|
+
// Intl.DateTimeFormat is case-insensitive (unlike Luxon)
|
|
52
|
+
expect(isValidIanaTimezone("america/new_york")).toBe(true);
|
|
53
|
+
expect(isValidIanaTimezone("AMERICA/NEW_YORK")).toBe(true);
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
describe("invalid timezones", () => {
|
|
58
|
+
it("rejects timezone abbreviations (ambiguous, not IANA standard)", () => {
|
|
59
|
+
// These are explicitly rejected because they're ambiguous:
|
|
60
|
+
// EST could be US Eastern or Australian Eastern, etc.
|
|
61
|
+
expect(isValidIanaTimezone("EST")).toBe(false);
|
|
62
|
+
expect(isValidIanaTimezone("PST")).toBe(false);
|
|
63
|
+
expect(isValidIanaTimezone("CST")).toBe(false);
|
|
64
|
+
expect(isValidIanaTimezone("MST")).toBe(false);
|
|
65
|
+
expect(isValidIanaTimezone("EDT")).toBe(false);
|
|
66
|
+
expect(isValidIanaTimezone("PDT")).toBe(false);
|
|
67
|
+
expect(isValidIanaTimezone("AEST")).toBe(false);
|
|
68
|
+
expect(isValidIanaTimezone("JST")).toBe(false);
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
it("rejects made-up timezone names", () => {
|
|
72
|
+
expect(isValidIanaTimezone("Invalid/Zone")).toBe(false);
|
|
73
|
+
expect(isValidIanaTimezone("America/FakeCity")).toBe(false);
|
|
74
|
+
expect(isValidIanaTimezone("Not_A_Timezone")).toBe(false);
|
|
75
|
+
expect(isValidIanaTimezone("Random/Gibberish")).toBe(false);
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
it("rejects empty or whitespace strings", () => {
|
|
79
|
+
expect(isValidIanaTimezone("")).toBe(false);
|
|
80
|
+
expect(isValidIanaTimezone(" ")).toBe(false);
|
|
81
|
+
expect(isValidIanaTimezone("\t")).toBe(false);
|
|
82
|
+
expect(isValidIanaTimezone("\n")).toBe(false);
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
it("rejects null and undefined", () => {
|
|
86
|
+
expect(isValidIanaTimezone(null)).toBe(false);
|
|
87
|
+
expect(isValidIanaTimezone(undefined)).toBe(false);
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
it("rejects numeric GMT offsets", () => {
|
|
91
|
+
expect(isValidIanaTimezone("GMT+5")).toBe(false);
|
|
92
|
+
expect(isValidIanaTimezone("UTC-8")).toBe(false);
|
|
93
|
+
expect(isValidIanaTimezone("+05:00")).toBe(false);
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
describe("whitespace handling", () => {
|
|
98
|
+
it("trims leading/trailing whitespace", () => {
|
|
99
|
+
expect(isValidIanaTimezone(" America/New_York ")).toBe(true);
|
|
100
|
+
expect(isValidIanaTimezone("\tEurope/London\n")).toBe(true);
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
it("rejects zones with internal spaces", () => {
|
|
104
|
+
expect(isValidIanaTimezone("America/ New_York")).toBe(false);
|
|
105
|
+
expect(isValidIanaTimezone("America /New_York")).toBe(false);
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
describe("getIanaTimezoneFromUsStateCode", () => {
|
|
111
|
+
it("maps standard US state codes", () => {
|
|
112
|
+
expect(getIanaTimezoneFromUsStateCode("CA", "US")).toBe(
|
|
113
|
+
"America/Los_Angeles"
|
|
114
|
+
);
|
|
115
|
+
expect(getIanaTimezoneFromUsStateCode("NY", "US")).toBe(
|
|
116
|
+
"America/New_York"
|
|
117
|
+
);
|
|
118
|
+
expect(getIanaTimezoneFromUsStateCode("TX", "US")).toBe(
|
|
119
|
+
"America/Chicago"
|
|
120
|
+
);
|
|
121
|
+
expect(getIanaTimezoneFromUsStateCode("UT", "US")).toBe("America/Denver");
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
it("maps special zones", () => {
|
|
125
|
+
expect(getIanaTimezoneFromUsStateCode("AZ", "US")).toBe(
|
|
126
|
+
"America/Phoenix"
|
|
127
|
+
);
|
|
128
|
+
expect(getIanaTimezoneFromUsStateCode("AK", "US")).toBe(
|
|
129
|
+
"America/Anchorage"
|
|
130
|
+
);
|
|
131
|
+
expect(getIanaTimezoneFromUsStateCode("HI", "US")).toBe(
|
|
132
|
+
"Pacific/Honolulu"
|
|
133
|
+
);
|
|
134
|
+
expect(getIanaTimezoneFromUsStateCode("IN", "US")).toBe(
|
|
135
|
+
"America/Indiana/Indianapolis"
|
|
136
|
+
);
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
it("handles DC", () => {
|
|
140
|
+
expect(getIanaTimezoneFromUsStateCode("DC", "US")).toBe(
|
|
141
|
+
"America/New_York"
|
|
142
|
+
);
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
it("is case-insensitive for state codes", () => {
|
|
146
|
+
expect(getIanaTimezoneFromUsStateCode("ca", "US")).toBe(
|
|
147
|
+
"America/Los_Angeles"
|
|
148
|
+
);
|
|
149
|
+
expect(getIanaTimezoneFromUsStateCode("ny", "US")).toBe(
|
|
150
|
+
"America/New_York"
|
|
151
|
+
);
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
it("assumes US when country is null/undefined", () => {
|
|
155
|
+
expect(getIanaTimezoneFromUsStateCode("CA", null)).toBe(
|
|
156
|
+
"America/Los_Angeles"
|
|
157
|
+
);
|
|
158
|
+
expect(getIanaTimezoneFromUsStateCode("NY", undefined)).toBe(
|
|
159
|
+
"America/New_York"
|
|
160
|
+
);
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
it("accepts USA/United States variations", () => {
|
|
164
|
+
expect(getIanaTimezoneFromUsStateCode("CA", "USA")).toBe(
|
|
165
|
+
"America/Los_Angeles"
|
|
166
|
+
);
|
|
167
|
+
expect(getIanaTimezoneFromUsStateCode("NY", "United States")).toBe(
|
|
168
|
+
"America/New_York"
|
|
169
|
+
);
|
|
170
|
+
expect(
|
|
171
|
+
getIanaTimezoneFromUsStateCode("TX", "United States of America")
|
|
172
|
+
).toBe("America/Chicago");
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
it("returns null for non-US countries", () => {
|
|
176
|
+
expect(getIanaTimezoneFromUsStateCode("CA", "Canada")).toBeNull();
|
|
177
|
+
expect(getIanaTimezoneFromUsStateCode("NY", "Mexico")).toBeNull();
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
it("returns null for invalid state codes", () => {
|
|
181
|
+
expect(getIanaTimezoneFromUsStateCode("XX", "US")).toBeNull();
|
|
182
|
+
expect(getIanaTimezoneFromUsStateCode("ZZZ", "US")).toBeNull();
|
|
183
|
+
expect(getIanaTimezoneFromUsStateCode("California", "US")).toBeNull(); // Full name, not code
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
it("returns null for null/undefined/empty state", () => {
|
|
187
|
+
expect(getIanaTimezoneFromUsStateCode(null, "US")).toBeNull();
|
|
188
|
+
expect(getIanaTimezoneFromUsStateCode(undefined, "US")).toBeNull();
|
|
189
|
+
expect(getIanaTimezoneFromUsStateCode("", "US")).toBeNull();
|
|
190
|
+
expect(getIanaTimezoneFromUsStateCode(" ", "US")).toBeNull();
|
|
191
|
+
});
|
|
192
|
+
});
|
|
193
|
+
|
|
194
|
+
describe("getIanaTimezoneFromCoordinates", () => {
|
|
195
|
+
describe("US regions", () => {
|
|
196
|
+
it("resolves Eastern Time", () => {
|
|
197
|
+
// New York City
|
|
198
|
+
expect(getIanaTimezoneFromCoordinates(40.7128, -74.006)).toBe(
|
|
199
|
+
"America/New_York"
|
|
200
|
+
);
|
|
201
|
+
// Miami
|
|
202
|
+
expect(getIanaTimezoneFromCoordinates(25.7617, -80.1918)).toBe(
|
|
203
|
+
"America/New_York"
|
|
204
|
+
);
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
it("resolves Central Time", () => {
|
|
208
|
+
// Chicago
|
|
209
|
+
expect(getIanaTimezoneFromCoordinates(41.8781, -87.6298)).toBe(
|
|
210
|
+
"America/Chicago"
|
|
211
|
+
);
|
|
212
|
+
// Houston
|
|
213
|
+
expect(getIanaTimezoneFromCoordinates(29.7604, -95.3698)).toBe(
|
|
214
|
+
"America/Chicago"
|
|
215
|
+
);
|
|
216
|
+
});
|
|
217
|
+
|
|
218
|
+
it("resolves Mountain Time", () => {
|
|
219
|
+
// Denver
|
|
220
|
+
expect(getIanaTimezoneFromCoordinates(39.7392, -104.9903)).toBe(
|
|
221
|
+
"America/Denver"
|
|
222
|
+
);
|
|
223
|
+
// Salt Lake City
|
|
224
|
+
expect(getIanaTimezoneFromCoordinates(40.7608, -111.891)).toBe(
|
|
225
|
+
"America/Denver"
|
|
226
|
+
);
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
it("resolves Pacific Time", () => {
|
|
230
|
+
// Los Angeles
|
|
231
|
+
expect(getIanaTimezoneFromCoordinates(34.0522, -118.2437)).toBe(
|
|
232
|
+
"America/Los_Angeles"
|
|
233
|
+
);
|
|
234
|
+
// Seattle
|
|
235
|
+
expect(getIanaTimezoneFromCoordinates(47.6062, -122.3321)).toBe(
|
|
236
|
+
"America/Los_Angeles"
|
|
237
|
+
);
|
|
238
|
+
});
|
|
239
|
+
|
|
240
|
+
it("resolves special zones", () => {
|
|
241
|
+
// Phoenix (Arizona - no DST)
|
|
242
|
+
expect(getIanaTimezoneFromCoordinates(33.4484, -112.074)).toBe(
|
|
243
|
+
"America/Phoenix"
|
|
244
|
+
);
|
|
245
|
+
// Anchorage (Alaska)
|
|
246
|
+
expect(getIanaTimezoneFromCoordinates(61.2181, -149.9003)).toBe(
|
|
247
|
+
"America/Anchorage"
|
|
248
|
+
);
|
|
249
|
+
// Honolulu (Hawaii)
|
|
250
|
+
expect(getIanaTimezoneFromCoordinates(21.3099, -157.8581)).toBe(
|
|
251
|
+
"Pacific/Honolulu"
|
|
252
|
+
);
|
|
253
|
+
});
|
|
254
|
+
});
|
|
255
|
+
|
|
256
|
+
describe("international regions", () => {
|
|
257
|
+
it("resolves European zones", () => {
|
|
258
|
+
// London
|
|
259
|
+
expect(getIanaTimezoneFromCoordinates(51.5074, -0.1278)).toBe(
|
|
260
|
+
"Europe/London"
|
|
261
|
+
);
|
|
262
|
+
// Paris
|
|
263
|
+
expect(getIanaTimezoneFromCoordinates(48.8566, 2.3522)).toBe(
|
|
264
|
+
"Europe/Paris"
|
|
265
|
+
);
|
|
266
|
+
});
|
|
267
|
+
|
|
268
|
+
it("resolves Asian zones", () => {
|
|
269
|
+
// Tokyo
|
|
270
|
+
expect(getIanaTimezoneFromCoordinates(35.6762, 139.6503)).toBe(
|
|
271
|
+
"Asia/Tokyo"
|
|
272
|
+
);
|
|
273
|
+
});
|
|
274
|
+
});
|
|
275
|
+
|
|
276
|
+
it("returns null for missing coordinates", () => {
|
|
277
|
+
expect(getIanaTimezoneFromCoordinates(null, -74.006)).toBeNull();
|
|
278
|
+
expect(getIanaTimezoneFromCoordinates(40.7128, null)).toBeNull();
|
|
279
|
+
expect(getIanaTimezoneFromCoordinates(null, null)).toBeNull();
|
|
280
|
+
expect(getIanaTimezoneFromCoordinates(undefined, undefined)).toBeNull();
|
|
281
|
+
});
|
|
282
|
+
|
|
283
|
+
it("returns null for coordinates with no regional match", () => {
|
|
284
|
+
// Middle of the South Atlantic Ocean - truly remote
|
|
285
|
+
expect(getIanaTimezoneFromCoordinates(-30, -30)).toBeNull();
|
|
286
|
+
// Far southern ocean between Africa and Antarctica
|
|
287
|
+
expect(getIanaTimezoneFromCoordinates(-60, 40)).toBeNull();
|
|
288
|
+
});
|
|
289
|
+
});
|
|
290
|
+
|
|
291
|
+
describe("inferEventTimezoneIana", () => {
|
|
292
|
+
it("prefers coordinates over state code", () => {
|
|
293
|
+
// LA coords but NY state - coords should win
|
|
294
|
+
const result = inferEventTimezoneIana({
|
|
295
|
+
latitude: 34.0522,
|
|
296
|
+
longitude: -118.2437,
|
|
297
|
+
state: "NY",
|
|
298
|
+
country: "US",
|
|
299
|
+
});
|
|
300
|
+
expect(result).toBe("America/Los_Angeles");
|
|
301
|
+
});
|
|
302
|
+
|
|
303
|
+
it("falls back to state code when coordinates missing", () => {
|
|
304
|
+
const result = inferEventTimezoneIana({
|
|
305
|
+
state: "TX",
|
|
306
|
+
country: "US",
|
|
307
|
+
});
|
|
308
|
+
expect(result).toBe("America/Chicago");
|
|
309
|
+
});
|
|
310
|
+
|
|
311
|
+
it("falls back to location string hints", () => {
|
|
312
|
+
const result = inferEventTimezoneIana({
|
|
313
|
+
location: "Denver, CO",
|
|
314
|
+
});
|
|
315
|
+
expect(result).toBe("America/Denver");
|
|
316
|
+
});
|
|
317
|
+
|
|
318
|
+
it("returns UTC when nothing matches", () => {
|
|
319
|
+
const result = inferEventTimezoneIana({
|
|
320
|
+
city: "Unknown",
|
|
321
|
+
state: "XX",
|
|
322
|
+
country: "Unknown",
|
|
323
|
+
});
|
|
324
|
+
expect(result).toBe("UTC");
|
|
325
|
+
});
|
|
326
|
+
|
|
327
|
+
it("handles empty args", () => {
|
|
328
|
+
const result = inferEventTimezoneIana({});
|
|
329
|
+
expect(result).toBe("UTC");
|
|
330
|
+
});
|
|
331
|
+
});
|
|
332
|
+
|
|
333
|
+
describe("resolveEventTimezoneIanaForDisplay", () => {
|
|
334
|
+
it("prefers inferred timezone over stored", () => {
|
|
335
|
+
// NYC coords with wrong stored timezone
|
|
336
|
+
const result = resolveEventTimezoneIanaForDisplay({
|
|
337
|
+
latitude: 40.7128,
|
|
338
|
+
longitude: -74.006,
|
|
339
|
+
timezone: "America/Los_Angeles", // wrong
|
|
340
|
+
});
|
|
341
|
+
expect(result).toBe("America/New_York");
|
|
342
|
+
});
|
|
343
|
+
|
|
344
|
+
it("uses stored timezone when inference returns UTC", () => {
|
|
345
|
+
const result = resolveEventTimezoneIanaForDisplay({
|
|
346
|
+
timezone: "Europe/London",
|
|
347
|
+
city: "Unknown",
|
|
348
|
+
state: "XX",
|
|
349
|
+
});
|
|
350
|
+
expect(result).toBe("Europe/London");
|
|
351
|
+
});
|
|
352
|
+
|
|
353
|
+
it("validates stored timezone before using it", () => {
|
|
354
|
+
const result = resolveEventTimezoneIanaForDisplay({
|
|
355
|
+
timezone: "Invalid/Zone",
|
|
356
|
+
});
|
|
357
|
+
expect(result).toBe("UTC");
|
|
358
|
+
});
|
|
359
|
+
|
|
360
|
+
it("rejects timezone abbreviations in stored field", () => {
|
|
361
|
+
const result = resolveEventTimezoneIanaForDisplay({
|
|
362
|
+
timezone: "EST",
|
|
363
|
+
});
|
|
364
|
+
expect(result).toBe("UTC");
|
|
365
|
+
});
|
|
366
|
+
|
|
367
|
+
it("returns UTC when everything fails", () => {
|
|
368
|
+
const result = resolveEventTimezoneIanaForDisplay({
|
|
369
|
+
timezone: null,
|
|
370
|
+
city: "Unknown",
|
|
371
|
+
});
|
|
372
|
+
expect(result).toBe("UTC");
|
|
373
|
+
});
|
|
374
|
+
|
|
375
|
+
it("handles BashCard typical inputs", () => {
|
|
376
|
+
// Typical event with coords and timezone
|
|
377
|
+
const result = resolveEventTimezoneIanaForDisplay({
|
|
378
|
+
latitude: 40.7608,
|
|
379
|
+
longitude: -111.891,
|
|
380
|
+
timezone: "America/Denver",
|
|
381
|
+
city: "Salt Lake City",
|
|
382
|
+
state: "UT",
|
|
383
|
+
});
|
|
384
|
+
expect(result).toBe("America/Denver");
|
|
385
|
+
});
|
|
386
|
+
});
|
|
387
|
+
});
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import { DateTime } from "luxon";
|
|
2
|
-
|
|
3
1
|
/** Primary IANA zone for each US state + DC (contiguous conventions; AZ/HI/AK use canonical zones). */
|
|
4
2
|
const US_STATE_CODE_TO_IANA: Record<string, string> = {
|
|
5
3
|
AL: "America/Chicago",
|
|
@@ -84,7 +82,20 @@ export function getIanaTimezoneFromUsStateCode(
|
|
|
84
82
|
export function isValidIanaTimezone(timezone: string | null | undefined): boolean {
|
|
85
83
|
const t = timezone?.trim();
|
|
86
84
|
if (!t) return false;
|
|
87
|
-
|
|
85
|
+
|
|
86
|
+
// Reject ambiguous abbreviations (EST, PST, CST, etc.) - not IANA standard.
|
|
87
|
+
// These are ambiguous: EST could be US Eastern or Australian Eastern, etc.
|
|
88
|
+
// IANA zones follow "Region/City" format or special cases like "UTC".
|
|
89
|
+
const looksLikeAbbreviation = /^[A-Z]{2,5}T?$/.test(t);
|
|
90
|
+
if (looksLikeAbbreviation && t !== "UTC") return false;
|
|
91
|
+
|
|
92
|
+
// Intl throws RangeError for unknown IANA ids — no luxon needed.
|
|
93
|
+
try {
|
|
94
|
+
Intl.DateTimeFormat(undefined, { timeZone: t });
|
|
95
|
+
return true;
|
|
96
|
+
} catch {
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
88
99
|
}
|
|
89
100
|
|
|
90
101
|
/**
|